-#LyX 1.6.0 created this file. For more info see http://www.lyx.org/
-\lyxformat 345
+#LyX 2.3 created this file. For more info see http://www.lyx.org/
+\lyxformat 544
\begin_document
\begin_header
-\use_default_options false
-\textclass literate-article
+\save_transient_properties true
+\origin /systemlyxdir/examples/
+\textclass article
\begin_preamble
%
% This relaxes the noweb constraint that chunks are
\def\nwendcode{\endtrivlist \endgroup}
\let\nwdocspar=\smallbreak
\end_preamble
+\use_default_options false
+\begin_modules
+noweb
+\end_modules
+\maintain_unincluded_children false
\language english
+\language_package default
\inputencoding default
-\font_roman default
-\font_sans default
-\font_typewriter default
+\fontencoding global
+\font_roman "default" "default"
+\font_sans "default" "default"
+\font_typewriter "default" "default"
+\font_math "auto" "auto"
\font_default_family default
+\use_non_tex_fonts false
\font_sc false
\font_osf false
-\font_sf_scale 100
-\font_tt_scale 100
+\font_sf_scale 100 100
+\font_tt_scale 100 100
+\use_microtype false
+\use_dash_ligatures false
\graphics default
+\default_output_format default
+\output_sync 0
+\bibtex_command default
+\index_command default
\paperfontsize default
\spacing single
\use_hyperref false
\papersize default
\use_geometry false
-\use_amsmath 0
-\use_esint 0
+\use_package amsmath 1
+\use_package amssymb 1
+\use_package cancel 1
+\use_package esint 1
+\use_package mathdots 1
+\use_package mathtools 1
+\use_package mhchem 1
+\use_package stackrel 1
+\use_package stmaryrd 1
+\use_package undertilde 1
\cite_engine basic
+\cite_engine_type default
+\biblio_style plain
\use_bibtopic false
+\use_indices false
\paperorientation portrait
+\suppress_date false
+\justification true
+\use_refstyle 0
+\use_minted 0
+\index Index
+\shortcut idx
+\color #008000
+\end_index
\secnumdepth 3
\tocdepth 3
\paragraph_separation indent
-\defskip medskip
-\quotes_language english
+\paragraph_indentation default
+\is_math_indent 0
+\math_numbering_side default
+\quotes_style english
+\dynamic_quotes 0
\papercolumns 1
\papersides 1
\paperpagestyle default
\tracking_changes false
\output_changes false
-\author ""
+\html_math_output 0
+\html_css_as_file 0
+\html_be_strict false
\end_header
\begin_body
\begin_layout Abstract
This document describes and implements a perl script for importing noweb
- files into LyX
+ files into \SpecialChar LyX
+
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-Since version 1.0.1, LyX now supports Literate Programming using
+Since version 1.0.1, \SpecialChar LyX
+ now supports Literate Programming using
\noun on
noweb
\noun default
.
- This addition to LyX made it very pleasant to write programs in the literate
+ This addition to \SpecialChar LyX
+ made it very pleasant to write programs in the literate
style (like this one).
In addition to being able to write new literate programs, it would be quite
useful if old
\noun on
noweb
\noun default
- code could be imported into LyX in some fashion.
+ code could be imported into \SpecialChar LyX
+ in some fashion.
That's where this program comes in.
\end_layout
\noun on
noweb
\noun default
- file to LyX.
+ file to \SpecialChar LyX
+.
+\end_layout
+
+\begin_layout Standard
+\begin_inset Flex Chunk
+status open
+
+\begin_layout Plain Layout
+
+\begin_inset Argument 1
+status open
+
+\begin_layout Plain Layout
+
+noweb2lyx.in
\end_layout
-\begin_layout Scrap
-<<noweb2lyx.in>>=
-\begin_inset Newline newline
\end_inset
#!@PERL@
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
#
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
# Copyright (C) 1999 Kayvan A.
Sylvan <kayvan@sylvan.com>
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
# You are free to use and modify this code under the terms of
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
# the GNU General Public Licence version 2 or later.
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
#
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
# Written with assistance from:
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
# Edmar Wienskoski Jr.
<edmar-w-jr@technologist.com>
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
# Amir Karger <karger@post.harvard.edu>
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
#
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
# $Id: noweb2lyx.lyx,v 1.5 2005/07/18 09:42:27 jamatos Exp $
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
#
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
# NOTE: This file was automatically generated from noweb2lyx.lyx using noweb.
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
#
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
<<Setup variables from user supplied args>>
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
<<Subroutines>>
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
<<Convert noweb to LyX>>
-\begin_inset Newline newline
+\end_layout
+
\end_inset
-@
+
\end_layout
\begin_layout Section
\begin_layout LyX-Code
@ Here is some documentation.
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Standard
+\begin_inset ERT
+status open
+
+\begin_layout Plain Layout
We can do arbitrary LaTeX code here.
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
[...
blah blah blah ...]
\end_layout
+\end_inset
+
+
+\end_layout
+
\begin_layout Standard
Code chunks look like this:
\end_layout
\end_layout
\begin_layout Standard
-When first tackling this problem, I spoke with members of the LyX team that
- knew about the literate programming extensions and reLyX (the LaTeX importing
- code).
+When first tackling this problem, I spoke with members of the \SpecialChar LyX
+ team that
+ knew about the literate programming extensions and re\SpecialChar LyX
+ (the \SpecialChar LaTeX
+ importing code).
\end_layout
\begin_layout Standard
-One of the first ideas was to extend the reLyX code to understand the
+One of the first ideas was to extend the re\SpecialChar LyX
+ code to understand the
\noun on
noweb
\noun default
\end_inset
.
- On the other hand, it turns out that reLyX contains a very useful literal
+ On the other hand, it turns out that re\SpecialChar LyX
+ contains a very useful literal
quoting mechanism.
If the input file contains the construct
\end_layout
\begin_layout LyX-Code
\backslash
-begin{reLyXskip}
+begin{re\SpecialChar LyX
+skip}
\begin_inset Newline newline
\end_inset
{...
- LaTeX stuff ...}
+ \SpecialChar LaTeX
+ stuff ...}
\begin_inset Newline newline
\end_inset
\backslash
-end{reLyXskip}
+end{re\SpecialChar LyX
+skip}
\end_layout
\begin_layout Standard
-then reLyX will copy the surrounded code to the output file verbatim.
+then re\SpecialChar LyX
+ will copy the surrounded code to the output file verbatim.
Given this, the first part of the translation is easy; we simply have to
copy the code chunks into an intermediate file that surrounds them with
\family typewriter
\backslash
-begin{reLyXskip}
+begin{re\SpecialChar LyX
+skip}
\family default
and
\family typewriter
\backslash
-end{reLyXskip}
+end{re\SpecialChar LyX
+skip}
\family default
.
\end_layout
\begin_layout Standard
-Once reLyX is done with the input file, the problem is reduced to changing
- the code chunks from LyX's LaTeX layout to the Scrap layout.
+Once re\SpecialChar LyX
+ is done with the input file, the problem is reduced to changing
+ the code chunks from \SpecialChar LyX
+'s \SpecialChar LaTeX
+ layout to the Chunk layout.
\end_layout
\begin_layout Standard
\noun default
.
We want to be able to run it as a simple pre-processor and post-processor
- from within reLyX.
+ from within re\SpecialChar LyX
+.
We can accomplish this by setting the flags
\family roman
\series medium
outline for our code:
\end_layout
-\begin_layout Scrap
-<<Convert noweb to LyX>>=
-\begin_inset Newline newline
+\begin_layout Standard
+\begin_inset Flex Chunk
+status open
+
+\begin_layout Plain Layout
+
+\begin_inset Argument 1
+status open
+
+\begin_layout Plain Layout
+
+Convert noweb to \SpecialChar LyX
+
+\end_layout
+
\end_inset
if (!$post_only) {
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
<<Transform noweb for reLyX>>
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
}
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
if ((!$pre_only) && (!$post_only)) {
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
<<Run reLyX on intermediate file>>
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
}
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
if (!$pre_only) {
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
<<Fix up LyX file>>
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
}
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
<<Clean up>>
-\begin_inset Newline newline
+\end_layout
+
\end_inset
-@
+
\end_layout
\begin_layout Section
-Making a file that reLyX can process
+Making a file that re\SpecialChar LyX
+ can process
\end_layout
\begin_layout Standard
In this section, we present the code that performs the task of creating
- the intermediate file that reLyX can process, using the algorithm that
- we just outlined.
+ the intermediate file that re\SpecialChar LyX
+ can process, using the algorithm that we
+ just outlined.
This algorithm is outlined in the code that follows:
\end_layout
-\begin_layout Scrap
+\begin_layout Standard
+\begin_inset Flex Chunk
+status open
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
<<Transform noweb for reLyX>>=
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
<<Setup INPUT and OUTPUT>>
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
inputline: while(<INPUT>)
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
{
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
if (/^
\backslash
\backslash
>
\backslash
->=/) { # Beginning of a noweb scrap
-\begin_inset Newline newline
-\end_inset
+>=/) { # Beginning of a noweb chunk
+\end_layout
+
+\begin_layout Plain Layout
<<Read in and output the noweb code chunk>>
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
} elsif (/^@
\backslash
s+(.*)/) { # Beginning of a documentation chunk
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
print OUTPUT $1; # We do not need the ``@'' part
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
} elsif (/
\backslash
]
\backslash
]/) { # noweb quoted code
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
<<Perform special input quoting of [[var]]>>
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
} else {
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
print OUTPUT; # Just let the line pass through
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
}
-\begin_inset Newline newline
-\end_inset
+\end_layout
-}
-\begin_inset Newline newline
-\end_inset
+\begin_layout Plain Layout
+
+}
+\end_layout
+
+\begin_layout Plain Layout
<<Close INPUT and OUTPUT>>
-\begin_inset Newline newline
+\end_layout
+
\end_inset
-@
+
\end_layout
\begin_layout Standard
In the code above, we do some pre-processing of the noweb ``[[...]]'' construct.
- This avoids some problems with reLyX confusing lists composed of ``[[...]]''
+ This avoids some problems with re\SpecialChar LyX
+ confusing lists composed of ``[[...]]''
constructs.
\end_layout
-\begin_layout Scrap
+\begin_layout Standard
+\begin_inset ERT
+status open
+
+\begin_layout Plain Layout
+
<<Perform special input quoting of [[var]]>>=
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
s/
\backslash
[.+?
\backslash
]{2,}/{$&}/g;
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
print OUTPUT;
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
@
\end_layout
+\end_inset
+
+
+\end_layout
+
\begin_layout Standard
While reading in the
\family roman
\noun on
noweb
\noun default
- code chunk, we transform it into a form that is usable by reLyX.
+ code chunk, we transform it into a form that is usable by re\SpecialChar LyX
+.
\end_layout
-\begin_layout Scrap
-<<Read in and output the noweb code chunk>>=
-\begin_inset Newline newline
-\end_inset
+\begin_layout Standard
+\begin_inset Flex Chunk
+status open
-<<Save the beginning of the scrap to savedScrap>>
-\begin_inset Newline newline
-\end_inset
+\begin_layout Plain Layout
+
+\begin_inset Argument 1
+status open
+
+\begin_layout Plain Layout
+
+Read in and output the noweb code chunk
+\end_layout
-<<Concatenate the rest of the scrap>>
-\begin_inset Newline newline
\end_inset
-<<print out the scrap in a reLyXskip block>>
-\begin_inset Newline newline
+<<Save the beginning of the chunk to savedchunk>>
+\end_layout
+
+\begin_layout Plain Layout
+
+<<Concatenate the rest of the chunk>>
+\end_layout
+
+\begin_layout Plain Layout
+
+<<print out the chunk in a reLyXskip block>>
+\end_layout
+
\end_inset
-@
+
\end_layout
\begin_layout Subsection
\color inherit
to read and write files.
In the code fragment above, we need to read from the input file and write
- to a file that will be later transformed by reLyX.
+ to a file that will be later transformed by re\SpecialChar LyX
+.
If we are being called only to pre-process the input file, then there is
no need to create a temporary file.
\end_layout
-\begin_layout Scrap
-<<Setup INPUT and OUTPUT>>=
-\begin_inset Newline newline
+\begin_layout Standard
+\begin_inset Flex Chunk
+status open
+
+\begin_layout Plain Layout
+
+\begin_inset Argument 1
+status open
+
+\begin_layout Plain Layout
+
+Setup INPUT and OUTPUT
+\end_layout
+
\end_inset
if ($pre_only) {
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
&setup_files($input_file, $output_file);
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
} else {
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
$relyx_file = "temp$$";
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
&setup_files($input_file, $relyx_file);
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
}
-\begin_inset Newline newline
+\end_layout
+
\end_inset
-@
+
\end_layout
\begin_layout Standard
, which we define below:
\end_layout
-\begin_layout Scrap
+\begin_layout Standard
+\begin_inset ERT
+status open
+
+\begin_layout Plain Layout
+
<<Subroutines>>=
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
sub setup_files {
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
my($in, $out) = @_;
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
open(INPUT, "<$in") || die "Cannot read $in: $!
\backslash
n";
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
open(OUTPUT, ">$out") || die "Cannot write $out: $!
\backslash
n";
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
}
-\begin_inset Newline newline
+\end_layout
+
+\begin_layout Plain Layout
+
+@ %def setup_files
+\end_layout
+
\end_inset
-@ %def setup_files
+
\end_layout
\begin_layout Subsection
\noun on
noweb
\noun default
- scrap
+ chunk
\end_layout
\begin_layout Standard
-After we see the beginning of the scrap, we need to read in and save the
- rest of the scrap for output.
+After we see the beginning of the chunk, we need to read in and save the
+ rest of the chunk for output.
\end_layout
-\begin_layout Scrap
-<<Save the beginning of the scrap to savedScrap>>=
-\begin_inset Newline newline
-\end_inset
+\begin_layout Standard
+\begin_inset Flex Chunk
+status open
+
+\begin_layout Plain Layout
+
+\begin_inset Argument 1
+status open
+
+\begin_layout Plain Layout
+
+Save the beginning of the chunk to savedchunk
+\end_layout
-$savedScrap = $_;
-\begin_inset Newline newline
\end_inset
+$savedchunk = $_;
+\end_layout
+
+\begin_layout Plain Layout
+
$endLine = "";
-\begin_inset Newline newline
+\end_layout
+
\end_inset
-@
+
\end_layout
-\begin_layout Scrap
-<<Concatenate the rest of the scrap>>=
-\begin_inset Newline newline
-\end_inset
+\begin_layout Standard
+\begin_inset ERT
+status open
-scrapline: while (<INPUT>) {
-\begin_inset Newline newline
-\end_inset
+\begin_layout Plain Layout
+
+<<Concatenate the rest of the chunk>>=
+\end_layout
+
+\begin_layout Plain Layout
+
+chunkline: while (<INPUT>) {
+\end_layout
- last scrapline if /^@
+\begin_layout Plain Layout
+
+ last chunkline if /^@
\backslash
s+/;
-\begin_inset Newline newline
-\end_inset
+\end_layout
- $savedScrap .= $_;
-\begin_inset Newline newline
-\end_inset
+\begin_layout Plain Layout
+
+ $savedchunk .= $_;
+\end_layout
+
+\begin_layout Plain Layout
};
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
switch: {
-\begin_inset Newline newline
-\end_inset
+\end_layout
- if (/^@
+\begin_layout Plain Layout
+
+ if (/^@
\backslash
-s+$/) {$savedScrap .= $_; last switch; }
-\begin_inset Newline newline
-\end_inset
+s+$/) {$savedchunk .= $_; last switch; }
+\end_layout
+
+\begin_layout Plain Layout
- if (/^@
+ if (/^@
\backslash
-s+%def.*$/) {$savedScrap .= $_; last switch; }
-\begin_inset Newline newline
-\end_inset
+s+%def.*$/) {$savedchunk .= $_; last switch; }
+\end_layout
+
+\begin_layout Plain Layout
- if (/^@
+ if (/^@
\backslash
-s+(.*)$/) {$savedScrap .= "@
+s+(.*)$/) {$savedchunk .= "@
\backslash
n"; $endLine = "$1
\backslash
n"; }
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
}
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
@
\end_layout
+\end_inset
+
+
+\end_layout
+
\begin_layout Subsection
-Printing out the scrap
+Printing out the chunk
\end_layout
\begin_layout Standard
The final piece of the first pass of the conversion is done by this code.
\end_layout
-\begin_layout Scrap
-<<print out the scrap in a reLyXskip block>>=
-\begin_inset Newline newline
+\begin_layout Standard
+\begin_inset Flex Chunk
+status open
+
+\begin_layout Plain Layout
+
+\begin_inset Argument 1
+status open
+
+\begin_layout Plain Layout
+
+print out the chunk in a re\SpecialChar LyX
+skip block
+\end_layout
+
\end_inset
print OUTPUT "
begin{reLyXskip}
\backslash
n";
-\begin_inset Newline newline
-\end_inset
+\end_layout
-print OUTPUT $savedScrap;
-\begin_inset Newline newline
-\end_inset
+\begin_layout Plain Layout
+
+print OUTPUT $savedchunk;
+\end_layout
+
+\begin_layout Plain Layout
print OUTPUT "
\backslash
n
\backslash
n";
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
print OUTPUT "$endLine";
-\begin_inset Newline newline
+\end_layout
+
\end_inset
-@
+
\end_layout
\begin_layout Standard
files.
\end_layout
-\begin_layout Scrap
-<<Close INPUT and OUTPUT>>=
-\begin_inset Newline newline
-\end_inset
+\begin_layout Standard
+\begin_inset Flex Chunk
+status open
+
+\begin_layout Plain Layout
+
+\begin_inset Argument 1
+status open
+
+\begin_layout Plain Layout
+
+Close INPUT and OUTPUT
+\end_layout
-close(INPUT);
-\begin_inset Newline newline
\end_inset
+close(INPUT);
+\end_layout
+
+\begin_layout Plain Layout
+
close(OUTPUT);
-\begin_inset Newline newline
+\end_layout
+
\end_inset
-@
+
\end_layout
\begin_layout Section
-Running reLyX
+Running re\SpecialChar LyX
+
\end_layout
\begin_layout Standard
-In this section, we describe and implement the code that runs reLyX on the
+In this section, we describe and implement the code that runs re\SpecialChar LyX
+ on the
intermediate file
\family roman
\series medium
\end_layout
\begin_layout Standard
-In order to run reLyX, we need to know the article class of the input document
+In order to run re\SpecialChar LyX
+, we need to know the article class of the input document
(to choose the corresponding literate document layout).
For this, we need to parse the intermediate file.
\end_layout
-\begin_layout Scrap
-<<Run reLyX on intermediate file>>=
-\begin_inset Newline newline
+\begin_layout Standard
+\begin_inset Flex Chunk
+status open
+
+\begin_layout Plain Layout
+
+\begin_inset Argument 1
+status open
+
+\begin_layout Plain Layout
+
+Run re\SpecialChar LyX
+ on intermediate file
+\end_layout
+
\end_inset
<<Parse for document class>>
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
<<Run reLyX with document class>>
-\begin_inset Newline newline
+\end_layout
+
\end_inset
-@
+
\end_layout
\begin_layout Standard
\emph on
noweb2lyx.nw
\emph default
- file that is generated by LyX
+ file that is generated by \SpecialChar LyX
+
\begin_inset Foot
status collapsed
\begin_layout Plain Layout
-reLyX searches for
+re\SpecialChar LyX
+ searches for
\backslash
\backslash
\noun on
noweb2lyx
\noun default
- on itself and a produce a quite reasonable LyX file.
+ on itself and a produce a quite reasonable \SpecialChar LyX
+ file.
+\end_layout
+
+\begin_layout Standard
+\begin_inset Flex Chunk
+status open
+
+\begin_layout Plain Layout
+
+\begin_inset Argument 1
+status open
+
+\begin_layout Plain Layout
+
+Parse for document class
\end_layout
-\begin_layout Scrap
-<<Parse for document class>>=
-\begin_inset Newline newline
\end_inset
open(INPUT, "<$relyx_file") ||
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
die "Cannot read $relyx_file: $!
\backslash
n";
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
$class = "article"; # default if none found
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
parse: while(<INPUT>) {
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
if (/
\backslash
\backslash
docu[m]entclass{(.*)}/) {
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
$class = $1;
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
last parse;
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
}
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
}
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
close(INPUT);
-\begin_inset Newline newline
+\end_layout
+
\end_inset
-@
+
\end_layout
\begin_layout Subsection
-Running reLyX with the corresponding literate document layout
+Running re\SpecialChar LyX
+ with the corresponding literate document layout
\end_layout
\begin_layout Standard
Now that we know what the document class ought to be, we do:
\end_layout
-\begin_layout Scrap
+\begin_layout Standard
+\begin_inset ERT
+status open
+
+\begin_layout Plain Layout
+
<<Run reLyX with document class>>=
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
$doc_class = "literate-" .
$class;
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
die "reLyX returned non-zero: $!
\backslash
n"
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
if (system("reLyX -c $doc_class $relyx_file"));
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
@
\end_layout
+\end_inset
+
+
+\end_layout
+
\begin_layout Standard
-reLyX performs the main bulk of the translation work.
+re\SpecialChar LyX
+ performs the main bulk of the translation work.
Note that if the ``literate-
\emph on
class
\emph default
-'' document layout is not found, then reLyX will fail with an error.
+'' document layout is not found, then re\SpecialChar LyX
+ will fail with an error.
In that case, you may need to modify your
\noun on
noweb
\end_layout
\begin_layout Section
-Fixing the reLyX output
+Fixing the re\SpecialChar LyX
+ output
\end_layout
\begin_layout Standard
-We need to perform some post-processing of what reLyX produces in order
- to have the best output for our literate document.
+We need to perform some post-processing of what re\SpecialChar LyX
+ produces in order to
+ have the best output for our literate document.
The outline of the post-processing steps are:
\end_layout
-\begin_layout Scrap
-<<Fix up LyX file>>=
-\begin_inset Newline newline
+\begin_layout Standard
+\begin_inset Flex Chunk
+status open
+
+\begin_layout Plain Layout
+
+\begin_inset Argument 1
+status open
+
+\begin_layout Plain Layout
+
+Fix up \SpecialChar LyX
+ file
+\end_layout
+
\end_inset
<<Setup INPUT and OUTPUT for the final output>>
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
line: while(<INPUT>)
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
{
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
<<Fix code chunks in latex layout>>
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
<<Fix [[var]] noweb construct>>
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
print OUTPUT; # default
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
}
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
<<Close INPUT and OUTPUT>>
-\begin_inset Newline newline
+\end_layout
+
\end_inset
-@
+
\end_layout
\begin_layout Standard
\color inherit
is sufficient to restart the loop.
We can use this construct to do some relatively complex parsing of the
- reLyX generated file.
+ re\SpecialChar LyX
+ generated file.
\end_layout
\begin_layout Subsection
is taken care of by this code:
\end_layout
-\begin_layout Scrap
-<<Setup INPUT and OUTPUT for the final output>>=
-\begin_inset Newline newline
+\begin_layout Standard
+\begin_inset Flex Chunk
+status open
+
+\begin_layout Plain Layout
+
+\begin_inset Argument 1
+status open
+
+\begin_layout Plain Layout
+
+Setup INPUT and OUTPUT for the final output
+\end_layout
+
\end_inset
if ($post_only) {
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
&setup_files("$input_file", "$output_file");
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
} else {
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
&setup_files("$relyx_file.lyx", "$output_file");
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
}
-\begin_inset Newline newline
+\end_layout
+
\end_inset
-@
+
\end_layout
\begin_layout Subsection
-Making sure the code chunks are in the Scrap layout
+Making sure the code chunks are in the Chunk layout
\end_layout
\begin_layout Standard
Now, as we outlined before, the final step is transforming the code-chunks
- which have been put into a LaTeX layout by LyX into the scrap layout.
+ which have been put into a \SpecialChar LaTeX
+ layout by \SpecialChar LyX
+ into the Chunk layout.
+\end_layout
+
+\begin_layout Standard
+\begin_inset Flex Chunk
+status open
+
+\begin_layout Plain Layout
+
+\begin_inset Argument 1
+status open
+
+\begin_layout Plain Layout
+
+Fix code chunks in latex layout
\end_layout
-\begin_layout Scrap
-<<Fix code chunks in latex layout>>=
-\begin_inset Newline newline
\end_inset
if (/
\backslash
latex latex/) { # Beginning of some latex code
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
if (($line = <INPUT>) =~ /^
\backslash
-s*<</) { # code scrap
-\begin_inset Newline newline
-\end_inset
+s*<</) { # code chunk
+\end_layout
- <<Transform this chunk into layout scrap>>
-\begin_inset Newline newline
-\end_inset
+\begin_layout Plain Layout
+
+ <<Transform this chunk into layout chunk>>
+\end_layout
+
+\begin_layout Plain Layout
} else {
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
# print the
\backslash
latex latex line + next line
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
print OUTPUT "$_$line";
-\begin_inset Newline newline
-\end_inset
+\end_layout
- }
-\begin_inset Newline newline
-\end_inset
+\begin_layout Plain Layout
+
+ }
+\end_layout
+
+\begin_layout Plain Layout
next line;
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
}
-\begin_inset Newline newline
+\end_layout
+
\end_inset
-@
+
\end_layout
\begin_layout Standard
When we are sure that we are in a code chunk, we must read in the rest of
- the code chunk and output a scrap layout for it:
+ the code chunk and output a chunk layout for it:
\end_layout
-\begin_layout Scrap
-<<Transform this chunk into layout scrap>>=
-\begin_inset Newline newline
-\end_inset
+\begin_layout Standard
+\begin_inset ERT
+status open
+
+\begin_layout Plain Layout
+
+<<Transform this chunk into layout chunk>>=
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
-$savedScrap = "
+\begin_layout Plain Layout
+
+$savedchunk = "
\backslash
\backslash
-layout Scrap
+layout Chunk
\backslash
n
\backslash
n$line";
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
codeline: while (<INPUT>) {
-\begin_inset Newline newline
-\end_inset
+\end_layout
- $savedScrap .= $_;
-\begin_inset Newline newline
-\end_inset
+\begin_layout Plain Layout
+
+ $savedchunk .= $_;
+\end_layout
- last codeline if /^@
+\begin_layout Plain Layout
+
+ last codeline if /^@
\backslash
s+/;
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
};
-\begin_inset Newline newline
-\end_inset
+\end_layout
-print OUTPUT $savedScrap;
-\begin_inset Newline newline
-\end_inset
+\begin_layout Plain Layout
+
+print OUTPUT $savedchunk;
+\end_layout
+
+\begin_layout Plain Layout
<<Slurp up to the end of the latex layout>>
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
@
\end_layout
+\end_inset
+
+
+\end_layout
+
\begin_layout Standard
Okay, now we just need to eat the rest of the latex layout.
There should only be a few different types of lines for us to match:
\end_layout
-\begin_layout Scrap
-<<Slurp up to the end of the latex layout>>=
-\begin_inset Newline newline
+\begin_layout Standard
+\begin_inset Flex Chunk
+status open
+
+\begin_layout Plain Layout
+
+\begin_inset Argument 1
+status open
+
+\begin_layout Plain Layout
+
+Slurp up to the end of the latex layout
+\end_layout
+
\end_inset
slurp: while (<INPUT>) {
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
last slurp if /
\backslash
\backslash
latex /;
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
next slurp if /
\backslash
\backslash
newline/;
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
next slurp if /^
\backslash
s*$/;
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
warn "confused by line: $_";
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
}
-\begin_inset Newline newline
+\end_layout
+
\end_inset
-@
+
\end_layout
\begin_layout Subsection
\noun on
noweb
\noun default
- syntax means putting the ``[[quoted-code]]'' in a LaTeX layout in the LyX
+ syntax means putting the ``[[quoted-code]]'' in a \SpecialChar LaTeX
+ layout in the \SpecialChar LyX
file.
- Otherwise, LyX will backslash-quote the brackets, creating ugly output.
+ Otherwise, \SpecialChar LyX
+ will backslash-quote the brackets, creating ugly output.
The quoted-code is transformed by
\noun on
noweb
\noun default
- when it generates the final LaTeX code.
+ when it generates the final \SpecialChar LaTeX
+ code.
+\end_layout
+
+\begin_layout Standard
+\begin_inset Flex Chunk
+status open
+
+\begin_layout Plain Layout
+
+\begin_inset Argument 1
+status open
+
+\begin_layout Plain Layout
+
+Fix [[var]] noweb construct
\end_layout
-\begin_layout Scrap
-<<Fix [[var]] noweb construct>>=
-\begin_inset Newline newline
\end_inset
if (/
]
\backslash
]/) { # special code for [[var]]
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
s/
\backslash
latex default
\backslash
n/g;
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
print OUTPUT;
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
next line;
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
}
-\begin_inset Newline newline
+\end_layout
+
\end_inset
-@
+
\end_layout
\begin_layout Section
The cleanup code is very simple:
\end_layout
-\begin_layout Scrap
-<<Clean up>>=
-\begin_inset Newline newline
+\begin_layout Standard
+\begin_inset Flex Chunk
+status open
+
+\begin_layout Plain Layout
+
+\begin_inset Argument 1
+status open
+
+\begin_layout Plain Layout
+
+Clean up
+\end_layout
+
\end_inset
system("rm -f $relyx_file*") unless ($post_only || $pre_only);
-\begin_inset Newline newline
+\end_layout
+
\end_inset
-@
+
\end_layout
\begin_layout Section
noweb2lyx
\noun default
script understands two arguments, input-file and output-file.
- It is also set up to be used internally by reLyX to pre-process or postprocess
+ It is also set up to be used internally by re\SpecialChar LyX
+ to pre-process or postprocess
files in the import pipeline.
\end_layout
-\begin_layout Scrap
+\begin_layout Standard
+\begin_inset ERT
+status open
+
+\begin_layout Plain Layout
+
<<Setup variables from user supplied args>>=
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
&usage() if ($#ARGV < 1); # zero or one argument
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
if ($ARGV[0] eq "-pre") {
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
&usage unless ($#ARGV == 2);
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
$input_file = $ARGV[1]; $output_file = $ARGV[2]; $pre_only = 1;
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
} elsif ($ARGV[0] eq "-post") {
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
&usage unless ($#ARGV == 2);
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
$input_file = $ARGV[1]; $output_file = $ARGV[2]; $post_only = 1;
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
} else {
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
&usage unless ($#ARGV == 1);
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
$input_file = $ARGV[0]; $output_file = $ARGV[1];
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
$pre_only = 0; $post_only = 0;
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
}
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
@ %def input_file output_file pre_only post_only
\end_layout
-\begin_layout Scrap
+\begin_layout Plain Layout
+
<<Subroutines>>=
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
sub usage() {
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
print "Usage: noweb2lyx [-pre | -post] input-file output-file
-\begin_inset Newline newline
-\end_inset
+\end_layout
+\begin_layout Plain Layout
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
If -pre is specified, only pre-processes the input-file for reLyX.
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
Similarly, in the case of -post, post-processes reLyX output.
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
In case of bugs, Email Kayvan Sylvan <kayvan
\backslash
@sylvan.com>.
\backslash
n";
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
exit;
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
}
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
@ %def usage
\end_layout
+\end_inset
+
+
+\end_layout
+
\begin_layout Section
Generating the
\noun on
\end_layout
\begin_layout Standard
-The noweb2lyx script can be tangled from LyX if you set
+The noweb2lyx script can be tangled from \SpecialChar LyX
+ if you set
\family typewriter
\backslash
build_command
\family default
- to call a generic script that always extracts a scrap named
+ to call a generic script that always extracts a chunk named
\family typewriter
build-script
\family default
\begin_inset Newline newline
\end_inset
-notangle -Rbuild-script $1 | sh
+notangle -Rbuild-script $1 | env NOWEB_SOURCE=$1 NOWEB_OUTPUT_DIR=$2 sh
+\end_layout
+
+\begin_layout Standard
+\begin_inset Flex Chunk
+status open
+
+\begin_layout Plain Layout
+
+\begin_inset Argument 1
+status open
+
+\begin_layout Plain Layout
+
+build-script
\end_layout
-\begin_layout Scrap
-<<build-script>>=
-\begin_inset Newline newline
\end_inset
PREFIX=/usr
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
notangle -Rnoweb2lyx.in noweb2lyx.nw > noweb2lyx.in
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
sed -e "s=@PERL@=$PREFIX/bin/perl=" noweb2lyx.in > noweb2lyx
-\begin_inset Newline newline
-\end_inset
+\end_layout
+
+\begin_layout Plain Layout
chmod +x noweb2lyx
-\begin_inset Newline newline
+\end_layout
+
\end_inset
-@
+
\end_layout
\begin_layout Standard