summaryrefslogtreecommitdiff
path: root/support/lgrind/lgrind.dtx
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/lgrind/lgrind.dtx
Initial commit
Diffstat (limited to 'support/lgrind/lgrind.dtx')
-rw-r--r--support/lgrind/lgrind.dtx1174
1 files changed, 1174 insertions, 0 deletions
diff --git a/support/lgrind/lgrind.dtx b/support/lgrind/lgrind.dtx
new file mode 100644
index 0000000000..999bd0e408
--- /dev/null
+++ b/support/lgrind/lgrind.dtx
@@ -0,0 +1,1174 @@
+% \iffalse
+%
+% This is LGrind.DTX. This was written by:
+%
+% - Van Jacobson, Lawrence Berkeley Laboratory (based on
+% vgrind by Dave Presotto & William Joy of UC Berkeley),
+% the original written for \TeX.
+% - Jerry Leichter of Yale University, modifications for \LaTeX.
+% - George V. Reilly of Brown University, renamed to lgrind
+% - Michael Piefel, Humboldt-University Berlin, for \LaTeXe
+% and a thousand little changes
+%
+% \fi
+% \iffalse
+%% Based on Van Jacobson's ``tgrindmac'', a macro package for TeX.
+%% Modified, 1987 by Jerry Leichter. Put '@' in all internal names.
+%% Modified, 1991 by George Reilly. Changed name from tgrind to lgrind.
+%% Modified, 1995 by Michael Piefel. Made it work with \LaTeXe.
+%% -1999 Hundreds of bells and whistles. No changelog here.
+%
+%<*dtx>
+\ProvidesFile{lgrind.dtx}
+ [2002/01/28 v3.67 LGrind environment and supporting stuff]
+%</dtx>
+%<package>\NeedsTeXFormat{LaTeX2e}[1996/06/01]
+%<package>\ProvidesPackage{lgrind}
+%<package> [2002/01/28 v3.67 LGrind environment and supporting stuff]
+%<*driver>
+\NeedsTeXFormat{LaTeX2e}[1996/06/01]
+\documentclass{ltxdoc}
+\CodelineIndex
+\RecordChanges
+\DocInput{lgrind.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \newcommand{\LG}{\textsf{LGrind}}
+% \newcommand{\NFSS}{\textsf{NFSS}}
+% \frenchspacing
+%
+% \GetFileInfo{lgrind.dtx}
+% \begin{document}
+% \title{The \LG{} package\thanks{This file
+% has version number \fileversion, last
+% revised \filedate.}}
+% \author{Various Artists}
+% \date{\filedate}
+% \maketitle
+%
+% \CheckSum{679}
+%
+% \begin{abstract}
+% The \LG{} package is a pretty printer for source
+% code. It evolved from vgrind, supported \TeX{} (tgrind) and
+% \LaTeX{} and now finally \LaTeXe, in particular \NFSS.
+% \end{abstract}
+%
+% \changes{v1.0}{1985/02/10}{Written}
+% \changes{v2.0}{1991/09/06}{Upgrade to \LaTeX2.09}
+% \changes{v3.0}{1995/09/24}{Upgrade to \LaTeXe}
+%
+% \section{Introduction}
+% \subsection{What is it?}
+% The \LG{} package consists of three files:
+% \begin{itemize}
+% \item \texttt{lgrind} or \texttt{lgrind.exe} is the executable. It will
+% convert an \LaTeX-File with embedded listings or a source code file
+% into a lot of macro-calls.
+% \item \texttt{lgrind.sty} provides the environments and macros to make
+% the produced mess readable.
+% \item \texttt{lgrindef} contains the information
+% needed to tell keywords from comments, comments from strings \dots
+% \end{itemize}
+%
+% \subsection{Who is to blame?}
+% \LG{} is not the work of a single one. The program is based on
+% \textsf{vgrind} by Dave Presotto \& William Joy of UC Berkeley.
+%
+% Van Jacobson wrote \textsf{tgrind} for \TeX. Jerry Leichter
+% of Yale University modified it for \LaTeX. George V. Reilly of
+% Brown University changed the name to lgrind and added the
+% program-text-within-comments and @-within-\LaTeX{} features,
+% and finally
+% Michael Piefel of the Humboldt-University Berlin converted it to
+% work under \LaTeXe, i.\,e. with \NFSS, and improved the documentation.
+%
+% However, there have been many contributors who supported the development; in
+% particular the range of supported languages is mainly due to them.
+% Unfortunately I do not know all of them, but my thanks go to everybody.
+% A special Thank You to
+% Torsten Sch\"utze for his OS/2 support and many and various hints.
+%
+% \section{\LG{} -- grind nice program listings}
+%
+% \begin{tabbing}
+% \texttt{lgrind} \= \texttt{[-s] [-e] [-i] [-o \meta{file}] [-n] [-c] [-t }\meta{width}
+% \texttt{] [-h }\meta{header}\texttt{]} \\
+% \>\texttt{[-v }\meta{varfile}\texttt{] [-d[!] }\meta{description file}\texttt{]}
+% \texttt{[-l}\meta{language}\texttt{] [}\meta{name}\texttt{\textbar-]}
+% \end{tabbing}
+%
+% \LG{} processes its input file(s) and writes the result to standard
+% output. This output can be saved for later editing, inclusion in a
+% larger document, etc.
+%
+% The options are:
+%
+% \makebox[2em][l]{-e} process a \LaTeX-file for embedded text.
+%
+% \makebox[2em][l]{-i} process for inclusion in a \LaTeX-document.
+%
+% \makebox[2em][l]{-} take input from standard input.
+%
+% \changes{v3.5}{1998/05/23}{Output redirection (-o) implemented.}
+% \makebox[2em][l]{-o} redirect output.
+%
+% \makebox[2em][l]{-n} don't boldface keywords.
+%
+% \makebox[2em][l]{-a} don't treat @, etc. specially in \LaTeX.
+%
+% \makebox[2em][l]{-c} don't treat @, etc. specially in comments.
+%
+% \makebox[2em][l]{-t} change tab width (default 8).
+%
+% \makebox[2em][l]{-h} specifies text to go on the left side of every output
+% page (default is none).
+%
+% \makebox[2em][l]{-v} take variable substitution strings from file.
+%
+% \makebox[2em][l]{-d} specifies the language definitions file.
+%
+% \changes{v3.3}{1996/08/23}{"lgrindef" position can be changed permanently}
+% \makebox[2em][l]{-d!} same as -d, except the change is permanent (modifies
+% executable)
+%
+% \makebox[2em][l]{-l} specifies the language to use.
+%
+% \makebox[2em][l]{-s} shows a list of currently known languages.
+%
+% The standard for \LG{} is to take its input from the file given on the
+% command line and write on standard output. You can change this behaviour with
+% the options - and -o, respectively. Please note that as soon as a file is
+% detected on the command line (either its name or a -) it is processed with the
+% options then in effect, thus
+% allowing to give multiple files on one line with possibly multiple targets.
+%
+% If neither -e nor -i are specified, a complete \LaTeX-file is produced. When
+% no language is given on the command line, \LG{} tries to figure out the
+% language via the extension of the file. A table of extensions and their
+% languages is in the definition file. If the extension is unknown, C is chosen
+% as a default.
+%
+% When \LG{} is started without any parameters, it will show a short help screen.
+% The same happens when the appropriate option is given, but this is
+% implementation dependent (usually what is common for the operation system, the
+% default for DOS is |-?| and for Unix |--help|).
+%
+% The position of the \texttt{lgrindef}-file is determined by giving it on the
+% command line (highest priority), by defining an environment variable
+% \texttt{LGRINDEF}, and by the position fixed in \LG{}s executable. The latter
+% can be changed by using -d! and then using the newly created file as the new
+% \LG{}.
+% \changes{v3.5}{1998/05/30}{Now testing for \texttt{LGRINDEF} environment variable.}
+%
+% The languages which are currently known are stored in the language definition
+% file; their number increases more or less rapidly. At the time of writing the
+% languages in the table below are part of the distribution.
+%
+% \begin{table}\begin{minipage}{0.8\linewidth}
+% \let\thefootnote\thempfootnote
+% \newcommand{\fnm}[1]{\textsuperscript{\itshape#1}}
+% \begin{tabbing}
+% \hspace*{2em} \= \hspace{9em} \= \hspace{9em} \= \\
+% \> Ada \> \LaTeX\footnote{John Leis, University of Southern Queensland, leis@usq.edu.au.}
+% \> RATFOR \\
+% \> Asm \> LDL \> RLaB\footnote{Jim Green, National Physical Laboratory, jjg1@cise.npl.co.uk} \\
+% \> Asm68 \> Lex \> Russell \\
+% \> BASIC\fnm{a} \> Linda \> SAS\footnote{Michael Friendly, friendly@hotspur.psych.yorku.ca} \\
+% \> Batch\fnm{b} \> Lisp (Emacs) \> Scheme\footnote{Neale Pickett, npickett@watchguard.com} \\
+% \> C \> MASM\fnm{a} \> sh \\
+% \> C++ \> MATLAB\fnm{a} \> SICStus\fnm{b} \\
+% \> csh \> ML\fnm{d} \> src \\
+% \> FORTRAN \> Mercury \> SQL \\
+% \> Gnuplot\footnote{Denis Petrovic, Denis.Petrovic@public.srce.hr}
+% \> model \> Tcl/Tk\footnote{Alexander Bednarz, Forsch.-zentrum J\"ulich, A.Bednarz@kfa-juelich.de} \\
+% \> Icon \> Modula2 \> VisualBasic\fnm{a} \\
+% \> IDL\footnote{Diego Berrueta, diego@berrueta.net}
+% \> Pascal \> VMSasm \\
+% \> ISP \> PERL \> yacc \\
+% \> Java \> PostScript \> \\
+% \> Kimwitu++ \> PROLOG \>
+% \end{tabbing}\par
+% \let\footnoterule\relax
+% \end{minipage}\end{table}
+% \changes{v3.67}{2002/01/28}{Added Scheme and ML language definitions}
+% \subsection{Operation modes}
+% There are three modes of operation: stand-alone, include and embedded.
+%
+% Use |lgrind -ly bary.y > bary.tex| (or |lgrind -o bary.tex bary.y|) to
+% produce a stand-alone \LaTeX-file from, say, a Yacc file. This results in a
+% document which is formatted using Piet van Oostrum's \textsf{fancyhdr.sty} to
+% make the headers and footers. BTW: You really should have this package. It's
+% marvellous. But of course you can change the layout to your likings by
+% editing the \texttt{lgrindef}-file.
+%
+% To include a C-file named \texttt{foo.c} into your \LaTeX-document, first
+% give the command: |lgrind -i -lc foo.c > foo.tex| This will generate
+% \texttt{foo.tex}, which will have the pretty-printed version of
+% \texttt{foo.c}. Then include \texttt{lgrind.sty} as you include any other
+% package, namely with |\usepackage{lgrind}| at the beginning of your
+% \LaTeX-document. Having done this, within the document you can include
+% \texttt{foo.tex} using |\lagrind| and |\lgrindfile| described in the next section.
+%
+% Finally, for the embedded (and probably most powerful) mode, when you have a
+% \LaTeX-file with embedded program listings, you can preprocess it with a command like:
+% |lgrind -e pretty-sources.lg > even-prettier-sources.tex|
+% and get a new \LaTeX-file which you then feed into \LaTeX. Commands you can
+% use within embedded texts are described below.
+%
+% \section{Preparing documents}
+%
+% \subsection{Using the \LG.sty-file}
+% The \LG{} package is included via the |\usepackage| command. You have to include it
+% in your document preamble when you want to include listings and when using embedded
+% mode. It is done automatically for stand-alone listings.
+% Currently the following options are supported:
+% \begin{description}
+% \changes{v3.5}{1998/05/23}{Procedure names added to index in addition to
+% printing them in the margin.}
+% \item[procnames] prints the names of starting and, if nested
+% procedures are allowed, continued procedures in the margin. Don't make the
+% margin too small, or don't make the names too long \dots
+% \item[noprocindex] do not put found procedure beginnings in the index
+% \item[noindent] cancels the indentation. Useful for long listings or listings
+% within their own sections.
+% \item[fussy] lets \LaTeX\ print all overfull hboxes. The default is to suppress
+% this for about a tenth of an inch.
+% \item[norules] lets \LG{} suppress the surrounding rules for included material
+% (using |\lagrind| and |\lgrindfile|).
+% \item[nolineno] doesn't print line numbers.\footnote{To be exact, prints line
+% numbers every 50,000 lines. But source code should never get so long in a
+% single file~-- that's over 3 MByte! If you really want no numbers,
+% set $\backslash$\texttt{LGnuminterval} to zero; then you won't get procedure
+% names, either.}
+% \item[lineno5] prints line numbers every 5 lines. The default is 10.
+% \item[leftno] print line numbers in the left margin. Default is the right.
+% \end{description}
+%
+% \subsection{Stand-alone and included listings}
+% After processing a source code file with \LG{} without the -e or -i
+% options you get a \LaTeX-file which can be directly compiled.
+%
+% When using -i \LG{} will produce a file which can be included with the
+% following macros:
+%
+% \DescribeMacro{\lgrindfile}
+% The first is |\lgrindfile{|\meta{file}|}|, which will simply include
+% the file \meta{file} at that point of text, and will draw horizontal
+% lines before and after the listing.
+%
+% \DescribeMacro{\lagrind}
+% The macro
+% |\lagrind[|\meta{float}|]{|\meta{file}|}{|\meta{caption}|}{|\meta{label}|}|
+% will put the listing also within a figure environment, using the \meta{float}
+% options (h, t, b or p), \meta{caption} and \meta{label} you gave. The starred
+% form of |\lagrind| will also use the starred |figure*|.
+%
+% Note that floats cannot be longer than one page, so you should only use
+% |\lagrind| for short fragments, longer pieces should use |\lgrindfile| (which
+% is non-floating).
+%
+% \DeleteShortVerb{\|}\MakeShortVerb{\"}\MakePercentIgnore
+% \subsection{Embedded programs within a \LaTeX-file}
+% You don't have to process every single source file with \LG{}, only to
+% include it in your document. Within the text of your \LaTeX-file, you can
+% mark groups of lines as program code, either text- or display-style to
+% be specific. You can use several commands for controlling the inclusion
+% of source code into your \LaTeX-file.
+%
+% Write your text, don't forget to include \LG.sty. Use the following
+% commands. You can `debug' your text without including the lengthy
+% listings. As a last step (but one), you process your file with \LG{}
+% and its option -e, which will provide you with your final \LaTeX{}
+% source file.
+%
+% The commands are similar to the math environments. \DescribeEnv{\%( \%)}
+% With "%(" and "%)" you obtain code in text style, i.\,e. in the same line.
+% \DescribeEnv{@ @}Surrounding the text with "@" is a shorthand.
+% \begin{verbatim}
+% The expression
+% %(
+% a + 3
+% %)
+% produces 10.\end{verbatim}
+% produces the same as "The expression @a + 3@ produces 10." The output
+% will have `a + 3' set as a program.
+%
+% \DescribeEnv{\%[ \%]}As with math, the square bracket equivalent produces
+% display style listings, i.\,e. indented text on an own line.
+%
+% \DescribeEnv{\%*} As long listings tend not to fit on one page, there will
+% be page breaks inserted. Since page breaks can considerably affect readability
+% there will be none at all unless you insert lines consisting of just "%*".
+% Pages will end here and only here, but not necessarily here. (That is, you
+% allow (or recommend) a page break. It will be taken if needed.)
+% \changes{v3.3}{1996/09/02}{Allow page breaks in embedded listings}
+%
+% \DescribeEnv{\%=} You can insert your own code by using a line starting with
+% "%=" in the program text. Whatever you enter after that is left in the output,
+% exactly as you typed it. It will be executed in a strange environment, so
+% doing anything fancy is very tricky. \DescribeMacro{\Line} A macro, "\Line",
+% is provided to help you do simple things. For example,
+% \begin{verbatim}
+% %[
+% %=\Line{________\vdots}
+% a = 1;
+% %]\end{verbatim}
+% produces:
+%
+% \hspace*{4em}\vdots
+%
+% \hspace*{4em}\textit{a}\textsf{ = 1;}
+%
+% (Within the program text, \_ is active and expands to a
+% fixed-width space. A whole bunch of macros are also defined. If you
+% understand how \LG{} sets lines up, you can replace the 8 \_'s
+% with a call to "\Tab"---but I'll let you hang yourself on that one.)
+%
+% \DescribeEnv{\%<}The "%<"\meta{file} command includes \meta{file} as a
+% program listing in your document. Before inclusion it will be pretty
+% printed. This is the almost the same as \LG ing the \meta{file}
+% separately and with -i and including it via "\lgrindfile", only that
+% it's simpler for you. \DescribeEnv{\%!} With "%!"\meta{command} the
+% input is taken from a shell command.
+%
+% While you can specify the language used on the command line, this does
+% not suffice for mixed-language programs (or projects). The command
+% \DescribeEnv{\%\#}"%#"\meta{language} provides you a means to change
+% the language on the fly wherever you want.
+%
+% \DescribeEnv{\%@}The shorthand "@" is very useful, and since "@" is not usable
+% in normal \LaTeX{} text there is no conflict. If, however, you use "@" in your
+% text (after "\makeatletter") the result produced by \LG{} is not satisfactory.
+% To disable the shorthand you can use a command line option, or locally "%@-".
+% Using "%@+" will switch it on again.
+%
+% Important rules:
+% \begin{itemize}
+% \item "%" and the following character must be the first two characters on
+% the line to be recognized.
+% \item
+% Put \emph{nothing} on the line after the "%" and the key character.
+% If you do that, \LG{} will provide a default environment that will
+% produce an "\hbox" for "%( )%", and a "\vbox" for "%[ %]".
+% If you put stuff on the line, \LG{} assumes you want to control
+% the format completely. Doing this requires understanding \emph{exactly}
+% what the code \LG{} produces is doing. (Sometimes I'm not sure I do!)
+% \item
+% "%)" and "%]" are simply ignored outside
+% of a code group, but any extra "%(" or "%[" produces a
+% warning, so a missing "%)" or "%]" is usually caught.
+% \item
+% Remember that the code between "%("/"%[" and "%)"/"%]" is put into a
+% single box. Expect the usual problems with long boxes! Use "%*" if needed.
+% \end{itemize}
+%
+% \subsection{Formatting your source code}
+% Well, \LG{} uses a different font for comments. This has as a consequence
+% that functions you refer to are typeset differently in the program and
+% in the comments, which is unsatisfactory. And, wouldn't it be great to
+% use \LaTeX{} commands to produce e.\,g. `\copyright'?
+%
+% The \texttt{lgrindef}-file defines environments for exactly these
+% purposes. They are usually defined as follows, but of course it is possible
+% to use other strings if the standard collides with the syntax of the
+% language in question.
+%
+% \DescribeEnv{\%\% \%\%}Text which is surrounded by "%%" is directly
+% passed to \LaTeX, a pair of curled braces around it. So the copyright
+% symbol would be produced with "%%\copyright%%".
+% \DescribeEnv{\%\$ \$\%}The "%$"\meta{text}"$%" works much the same,
+% except that \meta{text} is set in math mode.
+%
+% When \LG{} discovers a line that contains \emph{only} a comment beginning
+% right at the start of the line and ending at the very end (no spaces), containing
+% \emph{only} \LaTeX{} text as in the environment described above, the line
+% will be copied verbatim into the resulting \LaTeX{} document, with a newline
+% appended. This allows (e.\,g., in C):
+% \begin{verbatim}
+% /*%%\section{Main program}%%*/
+% int main()
+% {
+% //%%\subsection{Variables}%%
+% int a;\end{verbatim}
+% \changes{v3.6}{1999/05/28}{Complete \LaTeX{} lines allowed}
+%
+% The underscore which is normally the subscripting operator in math mode is
+% used internally in \LG{}. You can still use the command "\sb" instead (and
+% "\sp" for superscripts).\label{underscore}
+%
+% \DescribeEnv{\%| |\%}In "%|"\meta{text}"|%" a kind of verbatim
+% environment is provided. \meta{Text} is typeset in typewriter.
+%
+% \DescribeEnv{@ @}Program text within a comment is surrounded by "@". The text
+% is processed exactly as if it wasn't a comment. To produce an at-sign
+% you have to use "@@".
+%
+% \subsection{Greater control\dots}
+% Many things are controllable by re-defining various macros. You can
+% change what fonts \LG{} will use for various kinds of things, how
+% much it indents the output, whether it adds line numbers, and if so at
+% what interval it prints them and whether it sticks them on the left or
+% right, and so on. This stuff is all described below in the code section,
+% though probably not very well. The default settings produce output
+% that looks reasonable to me, though I can't say I'm ecstatic about it.
+% Doing a \emph{really} good job would require defining some special fonts.
+%
+% Nonetheless as an example my own private font setup. After having defined a
+% font family called ttp (for typewriter proportional), using Boton (a
+% commercial font which has a nice `code look' to it), I define:
+%
+% \begin{verbatim}
+% \def\CMfont{\ttpfamily\itshape}
+% \def\KWfont{\ttpfamily\bfseries}
+% \def\VRfont{\ttpfamily}
+% \def\BGfont{\ttpfamily}
+% \end{verbatim}
+%
+% You can put these redefinitions in the preamble of your \LaTeX-file when
+% using embedded and included mode; for stand-alone listings you have to put
+% them into the \texttt{lgrindef}-file. This will change fonts for all modes.
+%
+% \subsection{Error messages}
+% The output of \LG{} always contains exactly one output line for each input
+% line. Hence, you can look up line numbers in \TeX{} error messages in your
+% original file, rather than in the \LG ed (LGround?) file. (Of course, if
+% the problem is in the \LG{} output\dots)
+%
+% \subsection{Variable substitution}
+% \LG{} usually prints variables exactly the way they appear in the source
+% code. However, very often one uses names for variables which really denote
+% symbols and have special formatting, only that the input alphabet of the
+% target language does of course not allow anything fancier than plain ASCII.
+%
+% I find myself using greek variables very often, because they are used in the
+% problem domain. So there is a `delta' which really should be `$\delta$',
+% there is a `gamma\_1' for `$\gamma\sb1$' and so forth. LG{} allows you to
+% change those names back to what you desire by use of a variable substution
+% file (using option -v).
+%
+% This file is very simple, and so is its parser. There is one substitution per
+% line, giving the original name, an equality sign, and the text replacing the
+% original:
+% \begin{verbatim}
+% delta=$\delta$
+% gamma_1=$\gamma\sb1$
+% \end{verbatim}
+% You can do everything you want to here. Remember that \emph{usually} variable
+% names are set upright and not in math mode. Therefore don't forget the
+% dollar-sign, and use "\sb" instead of "_" (see section \ref{underscore}).
+%
+% \section{The \texttt{lgrindef}-file}
+% The \texttt{lgrindef}-file is \LG's language definition data base.
+% It is here where \LG{} learns what are keywords, what comments, where
+% are functions, how to distinguish plain comments from \LaTeX-commands etc.
+%
+% The first field is just the language name (and any variants
+% of it). Thus the C language could be specified to \LG{} as `c' or `C'.
+%
+% \subsection{Capabilities}
+% Capabilities are of two types: Boolean capabilities which indicate that
+% the language has some particular feature and string capabilities which
+% give a regular expression or keyword list.
+%
+% Entries may continue onto multiple lines by giving a "\" as the last
+% character of a line. Lines starting with "#" are comments.
+%
+% The following table names and describes each capability.
+% \bgroup\renewcommand{\descriptionlabel}[1]{\hspace{\labelsep}\makebox[1.5em][l]{\textsf{#1}}}
+% \begin{description}
+% \item[ab] Regular expression for the start of an alternate form comment
+% \item[ae] Regular expression for the end of an alternate form comment
+% \item[bb] Regular expression for the start of a block
+% \item[be] Regular expression for the end of a lexical block
+% \item[cb] Regular expression for the start of a comment
+% \item[ce] Regular expression for the end of a comment
+% \item[cf] (Boolean) Use specialized routine for detecting C functions
+% \changes{v3.1}{1995/11/12}{C functions are now detected much more reliably}
+% \item[id] String giving characters other than letters and digits
+% that may legally occur in identifiers (default `\_')
+% \item[kw] A list of keywords separated by spaces
+% \item[lb] Regular expression for the start of a character constant
+% \item[le] Regular expression for the end of a character constant
+% \item[mb] Regular expression for the start of \TeX{} math within a comment
+% \item[me] Regular expression for the end of \TeX{} math within a comment
+% \item[np] Regular expression for a line that does \emph{not} contain
+% the start of a procedure (e.\,g. prototypes)
+% \item[oc] (Boolean) Present means upper and lower case are equivalent
+% \item[pb] Regular expression for start of a procedure
+% \item[pl] (Boolean) Procedure definitions are constrained to the lexical
+% level matched by the `px' capability
+% \item[px] A match for this regular expression indicates that procedure
+% definitions may occur at the next lexical level. Useful for lisp-like
+% languages in which procedure definitions occur as subexpressions of defuns.
+% \item[rb] Regular expression for the start of block outside the actual
+% code.\footnote{I included this especially for the \texttt{objects} and
+% \texttt{records} in Pascal and Modula-2. They \emph{end} (with the "<"be">"
+% expression), but shouldn't have any influence on the surrounding procedure.
+% When defining \texttt{record} as normal block start, its \texttt{end} ends
+% the procedure. Workaround: Make \texttt{record} itself a procedure start.
+% But that prints a continuation mark when \textsf{procnames} is on.}
+% \changes{v3.1}{1995/11/12}{Pascal objects now treated properly}
+% \item[sb] Regular expression for the start of a string
+% \item[se] Regular expression for the end of a string
+% \item[tb] Regular expression for the start of \TeX{} text within a comment
+% \item[tc] (String) Use the named language entry as a continuation of the
+% current one
+% \item[te] Regular expression for the end of \TeX{} text within a comment
+% \item[tl] (Boolean) Present means procedures are only defined at the top
+% lexical level
+% \item[vb] Regular expression for the start of typewriter text within a
+% comment
+% \item[ve] Regular expression for the end of typewriter text within a comment
+% \item[zb] Regular expression for the start of program text within a comment
+% \item[ze] Regular expression for the end of program text within a comment
+% \end{description}
+% \egroup
+%
+% \subsection{Regular Expressions}
+% \texttt{lgrindef} uses regular expressions similar to those of
+% \textsf{ex} and \textsf{lex}. The characters `"^"', `"$"', `"|"', `:',
+%%stopzone % VIM syncing
+% and `"\"' are reserved characters and must be `quoted' with a preceding
+% "\" if they are to be included as normal characters.
+%
+% The meta-symbols and their meanings are:
+% \begin{description}
+% \item[\$] The end of a line
+% \item[\^] The beginning of a line
+% \item[$\backslash$d] A delimiter (space, tab, newline, start of line)
+% \item[$\backslash$a] Matches any string of symbols (like `.*' in lex)
+% \item[$\backslash$p] Matches any identifier. In a procedure definition
+% (the `pb' capability) the string that matches this symbol is used
+% as the procedure name.
+% \item[( )] Grouping
+% \item[$|$] Alternation
+% \item[?] Last item is optional
+% \item[$\backslash$e] Preceding any string means that the string will not
+% match an input string if the input string is preceded by an escape character
+% ("\"). This is typically used for languages (like C) that can include the
+% string delimiter in a string by escaping it.
+% \end{description}
+%
+% Unlike other regular expressions in the system, these match words and
+% not characters. Hence something like `(tramp"|"steamer)flies?'
+% would match `tramp', `steamer', `trampflies', or `steamerflies'.
+% Contrary to some forms of regular expressions, \texttt{lgrindef}
+% alternation binds very tightly. Grouping parentheses are likely to
+% be necessary in expressions involving alternation.
+%
+% \subsection{Keyword List}
+% The keyword list is just a list of keywords in the language separated
+% by spaces. If the `oc' boolean is specified, indicating that upper
+% and lower case are equivalent, then all the keywords should be specified
+% in lower case.
+%
+% \subsection{Configuration options}
+% \changes{v3.1}{1995/11/07}{The \LaTeX-text put into the files
+% can be configured}
+% In addition to the language definitions the \texttt{lgrindef}-file
+% contains various configuration data. When the entries do not exist,
+% default values are used:
+% \begin{description}
+% \item[firstpreamble] is the (\LaTeX-)text that comes at the beginning of
+% an stand-alone file created by \LG{} from source code (it must contain
+% "\begin{document}" somewhere).
+% \item[postamble] is the (\LaTeX-)text that comes at the end of
+% an stand-alone file (and must contain "\end{document}"). This is the place to
+% put a "\printindex" if you wish so (don't forget "\usepackage{makeidx}" and
+% "\makeindex" in the preamble).
+% \item[filepreamble] is inserted before every processed source file in a
+% stand-alone \LaTeX-file. In these two preambles you can use "\f", which
+% will be substituted by the current input file (e.\,g. to put it into the
+% header).
+% \item[configuration] follows the opening of the \texttt{lgrind}-environment.
+% This is used for redefining the macros used within it, e.\,g. the fonts
+% or the width of a space (the "\@ts" unit).
+% \item[chartab] is a list of characters that will be substituted by a
+% \LaTeX-string. This is useful when you do (or can) not use any of the fancy
+% methods to persuade \LaTeX{} into using your extended ASCII-characters.
+% The format is a two digit hex number (the ASCII- (or whatever) value of the
+% character), an equal sign, and the according \LaTeX{}-string, ended with a
+% colon. You have to escape certain characters (like the backslash). So if
+% you, e.\,g., have IBM ASCII code page 437 input and use the
+% \textsf{german}-package, you can have your \"a using \verb+84="a+. Note
+% that the substituting string must contain more than one character;
+% otherwise it will be ignored. To print a `b' instead of an `a' you can
+% use \verb+61={b}+.
+% \end{description}
+%
+% \StopEventually{\PrintChanges\PrintIndex}
+%
+% \section{The Implementation of \LG.sty}
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+% \setlength{\parindent}{0pt}
+%
+% \begin{macro}{\LGnuminterval}\begin{macro}{\lc@unt}\begin{macro}{\ln@xt}
+% The counter "\LGnuminterval" represents the line numbering interval.
+% Its default is 10, it is set by two options and can be changed everywhere
+% you want to. "\lc@unt" counts the current line, "\ln@xt" contains the next
+% line to get numbered.
+% \begin{macrocode}
+\newcount\lc@unt
+\newcount\ln@xt
+\newcount\LGnuminterval
+\LGnuminterval=10
+\DeclareOption{nolineno}{\LGnuminterval=50000}
+\DeclareOption{lineno5}{\LGnuminterval=5}
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}
+%
+% \begin{macro}{\LGleftnum}
+% Line numbers are usually on the right. By setting "LGleftnum" to true
+% or false this behaviour can be altered.
+% \begin{macrocode}
+\newif\ifLGleftnum
+\DeclareOption{leftno}{\LGleftnumtrue}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\LGindent}
+% "\LGindent" is the indentation for all display style listing lines.
+% \begin{macrocode}
+\newskip\LGindent
+\LGindent=1.6667\parindent
+\DeclareOption{noindent}{\LGindent=0pt}
+% \end{macrocode}
+% \end{macro}
+%
+% \changes{v3.4}{1997/02/05}{Rules around included material can be suppressed.
+% New option norules.}
+% \begin{macro}{\LGnorules}
+% Normally \LG{} puts rules around everything that is included (via "\lagrind"
+% and "\lgrindfile"), this can be changed with an option.
+% \begin{macrocode}
+\newif\ifLGnorules
+\DeclareOption{norules}{\LGnorulestrue}
+% \end{macrocode}
+% \end{macro}
+%
+% \changes{v3.4}{1997/01/30}{Prevent slightly overfull hboxes. New option fussy.}
+% \begin{macro}{\LGsloppy}
+% "\LGsloppy" is the amount that a horizontal box may be overfull without getting
+% a warning from \LaTeX. This is useful since there are often many boxes which are
+% overfull by only a few points, and this does not really show since listings are
+% very ragged.
+% \begin{macrocode}
+\newlength{\LGsloppy}
+\setlength{\LGsloppy}{7.2pt}
+\DeclareOption{fussy}{\LGsloppy=0pt}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Proc}\begin{macro}{\ProcCont}
+% There's a "\Proc{"\meta{ProcName}"}" at the start of each procedure. If
+% the language allows nested procedures (e.\,g. Pascal), there
+% will be a "\ProcCont{"\meta{ProcName}"}" at the end of each inner procedure.
+% (In this case, \meta{ProcName} is the name of the outer procedure. I.\,e.,
+% "\ProcCont" marks the continuation of \meta{ProcName}).
+%
+% \begin{macro}{\DefaultProc}
+% \changes{v3.0}{1995/09/24}{Reintroduced procedure names in the margins}
+% \begin{macro}{\DefaultProcCont}
+% Default is not to do anything with the name. Optionally the names are
+% printed in the same margin as the line numbers. The name is put into a
+% box which will be output whenever it is not empty.
+%
+% \begin{macrocode}
+\newcommand{\DefaultProc}{\@gobble}
+\newcommand{\DefaultProcCont}{\@gobble}
+\DeclareOption{procnames}{
+\renewcommand{\DefaultProc}[1]{\renewcommand{\Procname}{#1}%
+\global\setbox\procbox=\hbox{\PNsize #1}}
+\renewcommand{\DefaultProcCont}[1]{\renewcommand\Procname{#1}
+\global\setbox\procbox=\hbox{\PNsize\dots #1}}}
+\newbox\procbox
+\newcommand{\Procname}{}
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}\end{macro}
+%
+% \begin{macro}{\ifLGnoprocindex}
+% \changes{v3.6}{1999/05/27}{Added option to suppress indexing of functions}
+% \begin{macrocode}
+\newif\ifLGnoprocindex
+\DeclareOption{noprocindex}{\LGnoprocindextrue}
+% \end{macrocode}
+% \end{macro}
+%
+% End of initialization, execute any options.
+% \begin{macrocode}
+\ProcessOptions
+% \end{macrocode}
+% \changes{v3.0}{1995/09/28}{Added package options}
+%
+% \begin{macro}{\BGfont}\begin{macro}{\CMfont}\begin{macro}{\NOfont}
+% \changes{v3.1}{1995/11/12}{Numbers can now have an own style (i.\,e. font)}
+% \begin{macro}{\KWfont}\begin{macro}{\STfont}\begin{macro}{\TTfont}
+% \begin{macro}{\VRfont}\begin{macro}{\PNsize}\begin{macro}{\LGsize}
+% \begin{macro}{\LGfsize}
+% These are the fonts and sizes for background (everything that doesn't fit
+% elsewhere), comments, numbers, keywords, strings, verbatim text, variables,
+% the procedure names
+% in the margins, displayed code ("%[ ]%"), and included code ("\lgrindfile"
+% and "\lagrind"), respectively. Note that the suffixes `font' and `size'
+% have been chosen solely for the author's intention; you can do anything
+% you want, e.\,g. "\tiny" comments. You have to use, however, font changes
+% which don't require an argument.
+% \begin{macrocode}
+\def\BGfont{\sffamily}
+\def\CMfont{\rmfamily\itshape}
+\def\NOfont{\sffamily}
+\def\KWfont{\rmfamily\bfseries}
+\def\STfont{\ttfamily}
+\def\TTfont{\ttfamily\upshape}
+\def\VRfont{\rmfamily}
+\def\PNsize{\BGfont\small}
+\def\LGsize{\small}
+\def\LGfsize{\footnotesize}
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}
+% \end{macro}\end{macro}\end{macro}
+% \end{macro}\end{macro}\end{macro}
+% \end{macro}
+%
+% \begin{macro}{\ifLGinline}\begin{macro}{\ifLGd@fault}
+% \begin{macro}{\LGbegin}\begin{macro}{\LGend}
+% The flag "LGinline" is true for in-line code. "\LGbegin" and "\LGend" are
+% default commands to open and close a code example and use it to perform
+% certain ops depending whether we're in-line or display style."\LGend" is
+% a no-op unless "\LGbegin" (where "LGd@fault" is set true) was executed,
+% so you can provide explicit open
+% code on the "%[" or "%(" line without providing any special code on the
+% matching "%]" or "%)" line.
+% \begin{macrocode}
+\newif\ifLGinline
+\newif\ifLGd@fault
+\def\LGbegin{\ifLGinline$\hbox\else$$\vbox\fi\bgroup\LGd@faulttrue}
+\def\LGend{\ifLGd@fault\egroup\ifLGinline$\else$$\fi\LGd@faultfalse\fi}
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}\end{macro}
+%%stopzone % VIM syncing
+%
+% \begin{macro}{\ifc@omment}\begin{macro}{\ifstr@ng}
+% These two conditions indicate if we are setting a comment or maybe
+% a string constant, respectively.
+% \begin{macrocode}
+\newif\ifc@mment
+\newif\ifstr@ng
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+% \begin{macro}{\ifright@}
+% To get decent quotes (opening and closing) within comments, we remember
+% whether the next one is going to be `{}``'{} or, if true, `{}'''{}.
+% \begin{macrocode}
+\newif\ifright@
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ls@far}\begin{macro}{\tb@x}\begin{macro}{\TBw@d}
+% These three are all for the sake of tabbing. "\ls@far" stores the
+% ``line so far''. The tabwidth goes in "\TBw@d", whilst "\tb@x" is
+% merely a temporary variable for "\Tab" and setting "\@ts".
+% \begin{macrocode}
+\newbox\ls@far
+\newbox\tb@x
+\newdimen\TBw@d
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}
+%
+% The underscore marks a point where the pre-processor wants a fixed-width
+% space (of width "\@ts").
+% \begin{macrocode}
+\newdimen\@ts
+{\catcode`\_=\active \gdef\@setunder{\let_=\sp@ce}}
+% \end{macrocode}
+%
+% \begin{macro}{\lgrindhead}
+% \begin{macro}{\lgrindfilename}\begin{macro}{\lgrindfilesize}
+% \begin{macro}{\lgrindmodyear}\begin{macro}{\lgrindmodmonth}
+% \begin{macro}{\lgrindmodday}\begin{macro}{\lgrindmodtime}
+% We pollute the global namspace once more with these macros, for when they
+% are used in the headers or footers, their values must still be known.
+% Therefore they cannot be local to the "lgrind" environment.
+% \begin{macrocode}
+\newcommand{\lgrindhead}{}
+\newcommand{\lgrindfilename}{}\newcommand{\lgrindfilesize}{}
+\newcommand{\lgrindmodyear}{}\newcommand{\lgrindmodmonth}{}
+\newcommand{\lgrindmodday}{}\newcommand{\lgrindmodtime}{}
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}\end{macro}
+% \end{macro}\end{macro}\end{macro}
+%
+% \begin{environment}{lgrind}
+% This is the environment that eventually defines all necessary macros for
+% formatting. All \LG ed text goes into such an environment, no matter if
+% directly so or from within another one. It takes one optional argument,
+% the line number.
+% \begin{macrocode}
+\newenvironment{lgrind}[1][1]{%
+% \end{macrocode}
+%
+% \begin{macro}{\Line}
+% The "\Line" macro is provided for use with "%=" in embedded listings.
+% It's just there to hide the actual structure of this, for nobody
+% \emph{really} wants to know anyway.
+% \begin{macrocode}
+\def\Line##1{\L{\LB{##1}}}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Head}\begin{macro}{\File}
+% \changes{v3.3}{1996/09/11}{given a meaningful definition}
+% The next are primarily meant for stand-alone listings. "\Head" and
+% "\File" are inserted by \LG, they define macros that contain
+% a user-specified string (the header option -h), the name, size
+% and modification time of the processed file. These can then be
+% used e.\,g. in the headers and footers.
+% \begin{macrocode}
+\newcommand{\Head}[1]{\gdef\lgrindhead{##1}}%
+\newcommand{\File}[6]{\gdef\lgrindfilename{##1}\message{(LGround: ##1)}%
+ \gdef\lgrindmodyear{##2}\gdef\lgrindmodmonth{##3}%
+ \gdef\lgrindmodday{##4}\gdef\lgrindmodtime{##5}%
+ \gdef\lgrindfilesize{##6}}%
+% \end{macrocode}
+% \end{macro}\end{macro}
+% The "\Proc"s now get what
+% was specified for them in the options section.
+% \begin{macrocode}
+\let\Proc=\DefaultProc%
+\let\ProcCont=\DefaultProcCont%
+\ifLGnoprocindex%
+ \let\index\@gobble%
+\fi%
+% \end{macrocode}
+%
+% We set a "\hfuzz" to prevent some of the lesser overfull hbox warnings.
+% \begin{macrocode}
+\hfuzz=\LGsloppy%
+% \end{macrocode}
+%
+% \begin{macro}{\NewPage}
+% Each formfeed in the input is replaced by a "\NewPage" macro. If
+% you really want a page break here, define this as "\vfill\eject".
+% \begin{macrocode}
+\def\NewPage{\filbreak\bigskip}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\L}
+% Each line of displayed program text is enclosed by a "\L{"\dots"}". We
+% turn each line into an hbox. Firstly we look whether we are in-line.
+% Every "\LGnuminterval" lines we output a
+% small line number in past the margin.
+% \begin{macrocode}
+\ifLGinline%
+ \def\L##1{\setbox\ls@far\null{\CF\strut##1}\ignorespaces}%
+% \end{macrocode}
+% \begin{macro}{\r@ghtlno}\begin{macro}{\l@ftlno}
+% Things get more difficult for display style listings. Here we set
+% "\r@ghtlno" and "\l@ftlno" to no-ops, only to redefine them shortly
+% after.
+% \begin{macrocode}
+\else%
+ \let\r@ghtlno\relax\let\l@ftlno\relax%
+ \ifnum\LGnuminterval>\z@%
+ \ifLGleftnum%
+% \end{macrocode}
+% If there was a procedure name somewhere, "\procbox" is not empty and
+% thus ready to be printed. Otherwise we test "\lc@unt" against "\ln@ext"
+% to determine whether or not to print a line number.
+% \begin{macrocode}
+ \def\l@ftlno{\ifnum\lc@unt>\ln@xt%
+ \global\advance\ln@xt by\LGnuminterval%
+ \llap{{\normalfont\scriptsize\the\lc@unt\quad}}\fi}%
+ \def\r@ghtlno{\rlap{\enspace\box\procbox}}%
+% \end{macrocode}
+% And once again when the line number is meant to be on the right.
+% \begin{macrocode}
+ \else%
+ \def\r@ghtlno{\ifnum\lc@unt>\ln@xt%
+ \global\advance\ln@xt by\LGnuminterval%
+ \rlap{{\normalfont\scriptsize\enspace\the\lc@unt%
+ \enspace\box\procbox}}%
+ \else\rlap{\enspace\box\procbox}\fi}%
+ \fi%
+ \fi%
+% \end{macrocode}
+% \end{macro}\end{macro}
+% "\lc@unt" is incremented and everything is squeezed into a "\hbox".
+% \begin{macrocode}
+ \def\L##1{\@@par\setbox\ls@far=\null\strut%
+ \global\advance\lc@unt by1%
+ \hbox to \linewidth{\hskip\LGindent\l@ftlno ##1\egroup%
+ \hfil\r@ghtlno}%
+ \ignorespaces}%
+\fi%
+% \end{macrocode}
+% \end{macro}
+%
+% The initialization of "\lc@unt" and "\ln@xt". Every "lgrind"-environment
+% starts over unless given a line number as argument.
+% \begin{macrocode}
+\lc@unt=#1\advance\lc@unt by-1%
+\ln@xt=\LGnuminterval\advance\ln@xt by-1%
+\loop\ifnum\lc@unt>\ln@xt\advance\ln@xt by\LGnuminterval\repeat%
+% \end{macrocode}
+%
+% \begin{macro}{\LB}\begin{macro}{\Tab}
+% The following weirdness is to deal with tabs. ``Pieces'' of a line
+% between tabs are output as "\LB{"\dots"}". E.\,g., a line with a tab at
+% column 16 would be output as "\LB{xxx}\Tab{16}\LB{yyy}". (Actually, to
+% reduce the number of characters in the ".tex" file the "\Tab" macro
+% supplies the 2nd \& subsequent "\LB"s.) We accumulate the "\LB" stuff in
+% an "\hbox". When we see a "\Tab", we grab this hbox (using "\lastbox")
+% and turn it into a box that extends to the tab position. We stash this
+% box in "\ls@far" \& stick it on in front of the next piece of the line.
+% (There must be a better way of doing tabs but I'm not enough of a \TeX
+% wizard to come up with it. Suggestions would be appreciated. Oh, well,
+% this comment's been in here for a decade. I don't believe in Santa Claus.)
+% \begin{macrocode}
+\def\LB{\hbox\bgroup\bgroup\box\ls@far\CF\let\next=}%
+\def\Tab##1{\egroup\setbox\tb@x=\lastbox\TBw@d=\wd\tb@x%
+ \advance\TBw@d by 1\@ts\ifdim\TBw@d>##1\@ts%
+ \setbox\ls@far=\hbox{\box\ls@far \box\tb@x \sp@ce}\else%
+ \setbox\ls@far=\hbox to ##1\@ts{\box\ls@far \box\tb@x \hfil}\fi\LB}%
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+% A normal space is too thin for code listings. We make spaces \& tabs
+% be in "\@ts" units, which for displays are 80 \% the width of a ``0'' in the
+% typewriter font. For inline stuff, on the other hand, we prefer a
+% somewhat smaller space -- actually, the same size as normal inter-word
+% spaces -- to help make the included stuff look like a unit.
+% \begin{macrocode}
+\ifLGinline\def\sp@ce{{\hskip .3333em}}%
+\else \setbox\tb@x=\hbox{\texttt{0}}%
+ \@ts=0.8\wd\tb@x \def\sp@ce{{\hskip 1\@ts}}\fi%
+\catcode`\_=\active \@setunder%
+% \end{macrocode}
+%
+% \begin{macro}{\CF}\begin{macro}{\N}\begin{macro}{\K}\begin{macro}{\V}
+% \begin{macro}{\ic@r}
+% \begin{macro}{\C}\begin{macro}{\CE}\begin{macro}{\S}\begin{macro}{\SE}
+% Font changing. Since we are usually changing the font inside of a "\LB"
+% macro, we remember the current font in "\CF" \& stick a "\CF" at the
+% start of each new box. Also, the characters ``\texttt{\char'042}'' and
+% ``"'"'' behave differently in comments than in code, and others behave
+% differently in strings than in code.
+%
+% "\N" is for numbers, "\K" marks keywords, "\V" variables, "\C" and "\CE"
+% surround comments, "\S" and "\SE" strings.
+% "\ic@r" inserts an optional "\/".
+% \begin{macrocode}
+\def\CF{\ifc@mment\CMfont\else\ifstr@ng\STfont\fi\fi}%
+\def\N##1{{\NOfont ##1}\global\futurelet\next\ic@r}%
+\def\K##1{{\KWfont ##1}\global\futurelet\next\ic@r}%
+\def\V##1{{\VRfont ##1}\global\futurelet\next\ic@r}%
+\def\ic@r{\let\@tempa\/\ifx.\next\let\@tempa\relax%
+ \else\ifx,\next\let\@tempa\relax\fi\fi\@tempa}%
+\def\C{\egroup\bgroup\CMfont \global\c@mmenttrue \global\right@false}%
+\def\CE{\egroup\bgroup \global\c@mmentfalse}%
+\def\S{\egroup\bgroup\STfont \global\str@ngtrue}%
+\def\SE{\egroup\bgroup \global\str@ngfalse}%
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}\end{macro}\end{macro}
+% \end{macro}\end{macro}\end{macro}\end{macro}
+%
+% \begin{macro}{\,}\begin{macro}{\!}
+% We need positive and negative thinspaces in both text and math modes, so
+% we re-define "\," and "\!" here. The definition for "\," isn't really
+% needed for \LaTeX, but we try to be more complete. Note that in \LaTeX{}
+% terms, the new definition isn't robust, like the old~-- but nothing we
+% produce here is likely to be robust --~or \emph{needs} to be!~-- anyway!
+% \begin{macrocode}
+\def\,{\relax \ifmmode\mskip\thinmuskip \else\thinspace \fi}%
+\def\!{\relax \ifmmode\mskip-\thinmuskip \else\negthinspace \fi}%
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+% Special characters. "\CH" chooses its first option alone in math mode;
+% its second option in a string; and its third option, enclosed in "$"s,
+%%stopzone % VIM syncing
+% otherwise. (At the moment, nothing is ever set in math mode, but you
+% never know \dots)
+% \begin{macrocode}
+\def\CH##1##2##3{\relax\ifmmode ##1\relax%
+\else\ifstr@ng ##2\relax\else$##3$\fi\fi }%
+\def\|{\CH|||}% not necessary for T1
+\def\<{\CH<<<}% dto.
+\def\>{\CH>>>}% dto.
+\def\-{\CH---}% minus sign nicer than hyphen
+\def\_{\ifstr@ng {\char'137}\else%
+ \leavevmode \kern.06em \vbox{\hrule width.35em}%
+ \ifdim\fontdimen\@ne\font=\z@ \kern.06em \fi\fi }%
+\def\#{{\STfont\char'043}}%
+\def\2{\CH\backslash {\char'134}\backslash }% % \
+\def\3{\ifc@mment\ifright@ ''\global\right@false%
+ \else``\global\right@true \fi%
+ \else{\texttt{\char'042}}\fi}% % "
+\def\5{{\texttt{\char'136}}}% % ^
+% \end{macrocode}
+%
+% Finally we don't want any indentation other than our own. We allow \LaTeX{}
+% to stretch our listings a bit. Then we open a group, select the background
+% font and (fanfare!) are ready to begin.
+% \begin{macrocode}
+\parindent\z@\parskip\z@ plus 1pt%
+\bgroup\BGfont%
+}
+% \end{macrocode}
+%
+% This is the end of the "lgrind" environment. Rather short (in comparison!)
+% \begin{macrocode}
+{\egroup\@@par} % end of environment lgrind
+% \end{macrocode}
+% \end{environment}
+%
+% The following are generated as part of opening and closing included
+% code sequences.
+% \begin{macrocode}
+\def\lgrinde{\ifLGinline\else\LGsize\fi\begin{lgrind}}
+\def\endlgrinde{\end{lgrind}}
+% \end{macrocode}
+%
+% \begin{macro}{\lagrind}
+% The "lagrind" environment is one of two for including files. It puts
+% its argument inside a "figure" environment. It can be used without or
+% with a star (first line), and with or without the usual floating
+% arguments (second and third).
+% \begin{macrocode}
+\def\lagrind{\@ifstar{\@slagrind}{\@lagrind}}
+
+\def\@lagrind{\@ifnextchar[{\@@lagrind}{\@@lagrind[t]}}
+\def\@slagrind{\@ifnextchar[{\@@slagrind}{\@@slagrind[t]}}
+% \end{macrocode}
+%
+% \begin{macro}{\@@lagrind}
+% The unstarred version. Everything is pretty obvious, we open a "figure",
+% put in a "minipage", input the file in question, make caption and label
+% and that's it.
+% \begin{macrocode}
+\def\@@lagrind[#1]#2#3#4{%
+ \begin{figure}[#1]
+\ifLGnorules\else\hrule\fi
+\vskip .5\baselineskip
+\begin{minipage}\columnwidth\LGsize\LGindent\z@
+ \begin{lgrind}
+\input #2\relax
+ \end{lgrind}
+\end{minipage}
+\vskip .5\baselineskip plus .5\baselineskip
+\ifLGnorules\else\hrule\fi\vskip .5\baselineskip
+\begingroup
+ \setbox\z@=\hbox{#4}%
+ \ifdim\wd\z@>\z@
+\caption{#3}%
+\label{#4}%
+ \else
+\captcont{#3}%
+ \fi
+\endgroup
+\vskip 2pt
+ \end{figure}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@slagrind}
+% D\'ej\`a vu? The starred version got an asterisk attached to "figure".
+% \begin{macrocode}
+\def\@@slagrind[#1]#2#3#4{%
+ \begin{figure*}[#1]
+\ifLGnorules\else\hrule\fi
+\vskip .5\baselineskip
+\begin{minipage}\linewidth\LGsize\LGindent\z@
+ \begin{lgrind}
+\input #2\relax
+ \end{lgrind}
+\end{minipage}
+\vskip .5\baselineskip plus .5\baselineskip
+\ifLGnorules\else\hrule\fi\vskip .5\baselineskip
+\begingroup
+ \setbox\z@=\hbox{#4}%
+ \ifdim\wd\z@>\z@
+\caption{#3}%
+\label{#4}%
+ \else
+\captcont{#3}%
+ \fi
+\endgroup
+\vskip 2pt
+ \end{figure*}
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\lgrindfile}
+% This is similar. We draw lines above and below, no "figure". But it can
+% get longer than one page.
+% \begin{macrocode}
+\def\lgrindfile#1{%
+ \par\addvspace{0.1in}
+ \ifLGnorules\else\hrule\fi
+ \vskip .5\baselineskip
+ \begingroup\LGfsize\LGindent\z@
+\begin{lgrind}
+ \input #1\relax
+\end{lgrind}
+ \endgroup
+ \vskip .5\baselineskip
+ \ifLGnorules\else\hrule\vspace{0.1in}\fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% And now \dots
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+% That's it. Thank you for reading up to here.
+%
+% Michael Piefel
+%
+% \vspace{2ex}
+% \hrule
+%
+% \Finale
+%
+% \iffalse
+%<*example>
+\documentclass{report}
+\usepackage{lgrind}
+
+\begin{document}
+
+\chapter{Introduction}
+This is a \LaTeX file with embedded code. Process it with \textsf{LGrind}
+and its option -e.
+
+\appendix
+\chapter{lgrind.c}
+%<example>%< lgrind.c
+
+\chapter{regexp.c}
+\section{Header}
+%<example>%< regexp.h
+\section{Code}
+%<example>%< regexp.c
+
+\chapter{lgrindef.c}
+\section{Header}
+%<example>%< lgrindef.h
+\section{Code}
+%<example>%< lgrindef.c
+
+\end{document}
+%</example>
+% \fi
+\endinput