Update LuaTeX testfiles for ^@ change
[latex2e.git] / trunk / base / docstrip.dtx
blob6470f754394b30bb3d678f6885dbcaf3d81eb013
1 % \iffalse meta-comment
3 % Copyright 1993-2017
4 % The LaTeX3 Project and any individual authors listed elsewhere
5 % in this file.
7 % This file is part of the LaTeX base system.
8 % -------------------------------------------
10 % It may be distributed and/or modified under the
11 % conditions of the LaTeX Project Public License, either version 1.3c
12 % of this license or (at your option) any later version.
13 % The latest version of this license is in
14 %    http://www.latex-project.org/lppl.txt
15 % and version 1.3c or later is part of all distributions of LaTeX
16 % version 2005/12/01 or later.
18 % This file has the LPPL maintenance status "maintained".
20 % The list of all files belonging to the LaTeX base distribution is
21 % given in the file `manifest.txt'. See also `legal.txt' for additional
22 % information.
24 % The list of derived (unpacked) files belonging to the distribution
25 % and covered by LPPL is defined by the unpacking scripts (with
26 % extension .ins) which are part of the distribution.
28 % \fi
29 \catcode`\{=1
30 \catcode`\}=2
31 \def\filename{docstrip.dtx}
32 \def\fileversion{2.5e}
33 \def\filedate{2014/09/29}
34 \def\docdate {2017/03/13}
37 %\iffalse
39 %% The docstrip program for use with TeX.
40 %% Copyright (C) 1989-1991 Frank Mittelbach
41 %% Copyright (C) 1992-1995 Johannes Braams, Denys Duchier,
42 %%                         Frank Mittelbach
43 %% Copyright (C) 1995 Marcin Woli\'nski
44 %% Copyright (C) 1996-1997 Mark Wooding, Marcin Woli\'nski
45 %% Copyright (C) 1998-2003 LaTeX3 project and the above authors
46 %% All rights are reserved.
49 % \fi
51 % \changes{2.0b}{1991/05/29}{Added bugfix from Denys}
52 % \changes{2.0c}{1991/05/29}{Allow almost all characters in guard (DD)}
53 % \changes{2.0d}{1991/05/31}{Started merging in some of Franks code}
54 % \changes{2.0j}{1992/03/05}{Wrote introduction}
55 % \changes{2.0m}{1992/04/21}{Renamed all macros that deal with the
56 %                           parsing of boolean expressions}
57 % \changes{2.0m}{1992/04/25}{Removed dependency from ltugboat,
58 %                          incorporated driver file into source.}
59 % \changes{2.0m}{1992/04/25}{Added some missing percents; corrected some
60 %                          typos}
61 % \changes{2.0m-DL}{1992/05/08}{Various small corrections to English and
62 %                           typos}
63 % \changes{2.0q}{1992/07/01}{Changed all dates to yy/mm/dd for better
64 %                          sorting}
65 % \changes{2.2a}{1993/12/02}{Update for LaTeX2e}
66 % \changes{2.2c}{1993/12/17}{Renamed texsys.tex to texsys.cfg.}
67 % \changes{2.3a}{1995/08/17}{Swapped Primary with Secondary since
68 %                         expressions are generally described bottom-up}
69 % \changes{2.3b}{1995/08/22}{Completely changed expressions parser}
70 % \changes{2.3b}{1995/08/23}{Removed mechanism for checking if  previous
71 %                    one-line guard is same as current (\cs{testOption},
72 %                    \cs{closeOption})---this is not a common
73 %                    case and testing complicates things unnecessarily}
74 % \changes{2.3c}{1995/08/24}{When file is multiply listed in \cs{file}
75 %                         clause it \emph{is} multiply read}
76 % \changes{2.3c}{1995/09/04}{Changed   some   dirty  tricks  to  be
77 %                         less/more dirty---all uses of \cs{afterfi}}
78 % \changes{2.3e}{1995/09/25}{Directories support}
79 % \changes{2.3e}{1995/10/24}{added \cs{makepathname} to support
80 %                         systems with bizzare pathnames}
81 % \changes{2.3e}{1995/10/25}{batch files work by \cs{input}}
82 % \changes{2.3e}{1996/10/02}{Introduced ``open lists''}
83 % \changes{2.4a}{1996/06/06}{Add stream limits (MDW)}
84 % \changes{2.4c}{1996/06/11}{Add initex support (DPC)}
86 % \DoNotIndex{\#,\$,\%,\&,\@,\\,\{,\},\^,\_,\~,\ }
87 % \DoNotIndex{\@ne}
88 % \DoNotIndex{\advance,\begingroup,\catcode,\closein,\closeout}
89 % \DoNotIndex{\day,\def,\edef,\else,\empty,\endgroup,\errmessage}
90 % \DoNotIndex{\expandafter,\fi,\futurelet,\gdef,\global,\if,\ifeof}
91 % \DoNotIndex{\ifx,\immediate,\let,\loop,\m@ne,\message,\month}
92 % \DoNotIndex{\newcount}
93 % \DoNotIndex{\newif,\newlinechar,\newread,\newtoks,\newwrite}
94 % \DoNotIndex{\noexpand,\openin,\openout,\par,\read,\relax,\repeat}
95 % \DoNotIndex{\space,\the,\undefined,\write,\xdef,\year,\z@}
97 % ^^A some definitions for this documentation
99 % \newcommand{\ds}{\textsf{DocStrip}} ^^A maybe?
100 % \newcommand{\bsl}{\protect\bslash}
101 % \newcommand{\note}[1]{\marginpar{\textbf{#1}}}
102 % \newcommand{\netaddress}[1]{\texttt{#1}}
104 % ^^A override the default in doc.sty
105 % \makeatletter
106 % \renewenvironment{theglossary}{%
107 %    \glossary@prologue%
108 %    \GlossaryParms \let\item\@idxitem \ignorespaces}%
109 %   {}
110 % \makeatother
113 % \changes{2.1c}{1993/02/25}{Added a setting for StandardModuleDepth}
114 % \setcounter{StandardModuleDepth}{1}
116 % \title{The \ds{} program%
117 %         \thanks{This file has version number \fileversion,
118 %                 last revised \filedate,
119 %                 documentation dated \docdate.}}
121 % \changes{2.1b}{1993/02/23}{modified mailaddress of Johannes}
122 % \changes{2.4i}{1998/01/18}{removed mail addresses as it is hopeless
123 %                            to keep them uptodate}
124 % \author{%
125 %   Frank Mittelbach
126 %  \and
127 %   Denys Duchier
128 %  \and
129 %   Johannes Braams
130 %  \and
131 %   Marcin Woli\'nski
132 %  \and
133 %   Mark Wooding
134 % }
136 % \date{Printed \today}
138 % \MaintainedByLaTeXTeam{latex}
139 % \maketitle
141 % \begin{abstract}
142 %    This document describes the implementation of the \ds{} program.
143 %    The original version of this program was developed by Frank
144 %    Mittelbach to accompany his \texttt{doc.sty} which enables literate
145 %    programming in \LaTeX\@. Denys Duchier rewrote it to run either
146 %    with \TeX\ or with \LaTeX, and to allow full boolean expressions in
147 %    conditional guards instead of just comma-separated lists.
148 %    Johannes Braams re-united the two implementations, documented and
149 %    debugged the code.
151 %    In September 1995 Marcin Woli\'nski changed many parts of the
152 %    program to make use of \TeX's ability to write to multiple files
153 %    at the same time to avoid re-reading sources.  The performance
154 %    improvement of version~2.3 came at a price of compatibility with
155 %    some more obscure operating systems which limit the number of
156 %    files a process can keep open. This was corrected in September
157 %    1996 by Mark Wooding and his changes were ``creatively merged''
158 %    by Marcin Woli\'nski who made at the same time changes in batch
159 %    files processing, handling of preambles and introduced ``verbatim
160 %    mode''. After all that, David Carlisle merged the new version into
161 %    the \LaTeX\ sources, and made a few other changes, principally
162 %    making \ds{} work under initex, and removing the need for
163 %    batch files to say \verb|\def\batchfile{...}|.
164 % \end{abstract}
166 % \section{Introduction}
168 % \subsection{Why the \ds{} program?} When Frank Mittelbach created
169 %    the \texttt{doc} package, he invented a way to combine \TeX\ code
170 %    and its documentation. From then on it was more or less possible
171 %    to do literate programming in \TeX.
173 %    This way of writing \TeX\ programs obviously has great
174 %    advantages, especially when the program becomes larger than a
175 %    couple of macros.  There is one drawback however, and that is
176 %    that such programs may take longer than expected to run because
177 %    \TeX\ is an interpreter and has to decide for each line of the
178 %    program file what it has to do with it. Therefore, \TeX\ programs
179 %    may be sped up by removing all comments from them.
181 %    By removing the comments from a \TeX\ program a new problem is
182 %    introduced. We now have two versions of the program and both of
183 %    them {\em have\/} to be maintained. Therefore it would be nice to
184 %    have a possibility to remove the comments automatically, instead
185 %    of doing it by hand. So we need a program to remove comments from
186 %    \TeX\ programs. This could be programmed in any high level
187 %    language, but maybe not everybody has the right compiler to
188 %    compile the program.  Everybody who wants to remove comments from
189 %    \TeX\ programs has \TeX\@.  Therefore the \ds{} program is
190 %    implemented entirely in \TeX.
192 % \subsection{Functions of the \ds{} program}
194 %    Having created the \ds{} program to remove comment lines from
195 %    \TeX\ programs\footnote{Note that only comment lines, that is
196 %    lines that start with a single \texttt{\%} character, are removed;
197 %    all other comments stay in the code.} it became feasible to do more
198 %    than just strip comments.\\ Wouldn't it be nice to have a way to
199 %    include parts of the code only when some condition is set true?
200 %    Wouldn't it be as nice to have the possibility to split the
201 %    source of a \TeX\ program into several smaller files and combine
202 %    them later into one `executable'?\\ Both these wishes have been
203 %    implemented in the \ds{} program.
205 % \section{How to use the \ds{} program}
206 %    A number of ways exist to use the \ds{} program:
207 %    \begin{enumerate}
208 % \item The usual way to use \ds{} is to write a \emph{batch file}
209 %        in such a way that it can be directly processed by \TeX{}.
210 %       The batch file should contain the commands described below for
211 %       controlling the \ds{} program.
212 %    This allows you to set up a distribution where you can instruct
213 %        the user to simply run
214 %      \begin{quote}
215 %        \texttt{TEX} \meta{batch file}
216 %      \end{quote}
217 %        to generate the executable versions of your files from the
218 %        distribution sources.
219 %        Most of the \LaTeX\  distribution is packaged this way.
220 %        To produce such a batch file include a statement in your
221 %         `batch file' that
222 %        instructs \TeX\ to read \texttt{docstrip.tex}.
223 %        The beginning of such a file would look like:
224 %\begin{verbatim}
225 %    \input docstrip
226 %    ...
227 %\end{verbatim}
228 %    By convention the batch file should have extension |.ins|. But
229 %    these days \ds{} in fact work with any extension.
231 %    \item Alternatively you can instruct \TeX\ to read the file
232 %        \texttt{docstrip.tex} and to see what happens. \TeX\ will ask
233 %        you a few questions about the file you would like to be
234 %        processed. When you have answered these questions it does
235 %        its job and strips the comments from your \TeX\ code.
236 %    \end{enumerate}
238 % \section{Configuring \ds}
239 % \subsection{Selecting output directories}
240 % \changes{2.3e}{1996/09/19}{Added documentation}
241 %    Inspired by a desire to simplify reinstallations of \LaTeXe{} and
242 %    to support operating systems which have an upper limit on the
243 %    number of files allowed in a directory, \ds\ now allows
244 %    installation scripts to specify output directories for files it
245 %    creates. We suggest using TDS (\TeX\ directory structure) names
246 %    of directories relative to \texttt{texmf} here. However these
247 %    names should be thought of as a labels rather than actual names
248 %    of directories. They get translated to actual system-dependent
249 %    pathnames according to commands contained in a configuration file
250 %    named \texttt{docstrip.cfg}.
252 %    The configuration file is read by \ds{} just before it starts to
253 %    process any batch file commands.
255 %    If this file is not present \ds{} uses some default settings which
256 %    ensure that files are only written to the current directory.
257 %    However by use of this configuration file, a site maintainer can
258 %    `enable' features of \ds{} that allow files to be written to
259 %    alternative directories.
261 % \DescribeMacro{\usedir}
262 %    Using this macro package author can tell where a file should be
263 %    installed. All |\file|s generated in the scope of that
264 %    declaration are written to a directory specified by its one
265 %    argument. For example in \LaTeXe{} installation following
266 %    declarations are used:
267 %\begin{verbatim}
268 %    \usedir{tex/latex/base}
269 %    \usedir{makeindex}
270 %\end{verbatim}
271 %    And standard packages use
272 %\begin{verbatim}
273 %    \usedir{tex/latex/tools}
274 %    \usedir{tex/latex/babel}
275 %\end{verbatim}
276 %    etc.
278 % \DescribeMacro{\showdirectory}
279 %    Used to display directory names in messages. If some label is not
280 %    defined it expands to |UNDEFINED (label is ...)| otherwise to a
281 %    directory name. It is probably a good idea for every installation
282 %    script to display at startup list of all directories that would
283 %    be used and asking user to confirm that.
285 %    The above macros are used by package/installation script
286 %    author. The following macros are used in a configuration file,
287 %    |docstrip.cfg|, by a system administrator to
288 %    describe her/his local directory structure.
290 % \DescribeMacro{\BaseDirectory} This macro is administrator's way of
291 %    saying ``yes, I want to use that directories support of
292 %    yours''. \ds{} will write only to current directory unless your
293 %    config has a call to this macro. (This means \ds{} won't write to
294 %    random directories unless you tell it to, which is nice.) Using
295 %    this macro you can specify a base directory for \TeX-related
296 %    stuff. E.g., for many Unix systems that would be
297 %\begin{verbatim}
298 %    \BaseDirectory{/usr/local/lib/texmf}
299 %\end{verbatim}
300 %    and for standard em\TeX{} installation
301 %\begin{verbatim}
302 %    \BaseDirectory{c:/emtex}
303 %\end{verbatim}
305 % \DescribeMacro{\DeclareDir}
306 %    Having specified the base directory you should tell \ds{} how to
307 %    interpret labels used in |\usedir| commands. This is done with
308 %    |\DeclareDir| with two arguments. The first is the label and the
309 %    second is actual name of directory relative to base
310 %    directory. For example to teach \ds{} using standard em\TeX{}
311 %    directories one would say:
312 %\begin{verbatim}
313 %    \BaseDirectory{c:/emtex}
314 %    \DeclareDir{tex/latex/base}{texinput/latex2e}
315 %    \DeclareDir{tex/latex/tools}{texinput/tools}
316 %    \DeclareDir{makeindex}{idxstyle}
317 %\end{verbatim}
318 %    This will cause base latex files and font descriptions to be
319 %    written to directory |c:\emtex\texinput\latex2e|, files of the 
320 %    \texttt{tools} package to be written to |c:\emtex\texinput\tools| 
321 %    and makeindex files to |c:\emtex\idxstyle|.
323 %    Sometimes it is desirable to put some files outside of the base
324 %    directory. For that reason |\DeclareDir| has a star form
325 %    specifying absolute pathname. For example one could say
326 %\begin{verbatim}
327 %    \DeclareDir*{makeindex}{d:/tools/texindex/styles}
328 %\end{verbatim}
330 %    \DescribeMacro{\UseTDS}
331 %    Users of systems conforming to TDS may well ask here ``do I
332 %    really need to put a dozen of lines like
333 %\begin{verbatim}
334 %    \DeclareDir{tex/latex/base}{tex/latex/base}
335 %\end{verbatim}
336 %    in my config file''. The answer is |\UseTDS|. This macro causes
337 %    \ds{} to use labels themselves for any directory you haven't
338 %    overridden with |\DeclareDir|. The default behaviour is to raise
339 %    an error on undefined labels because some users may want to know
340 %    exactly where files go and not to allow \ds{} to write to random
341 %    places. However I (MW) think this is pretty cool and my
342 %    config says just (I'm running te\TeX{} under Linux)
343 %\begin{verbatim}
344 %    \BaseDirectory{/usr/local/teTeX/texmf}
345 %    \UseTDS
346 %\end{verbatim}
348 %    The important thing to note here is that it is impossible to create
349 %    a new directory from inside \TeX{}. So however you configure
350 %    \ds, you need to create all needed directories before running
351 %    the installation.  Authors may want to begin
352 %    every installation script by displaying a list of directories
353 %    that will be used and asking user if he's sure all of them
354 %    exist.
356 %    Since file name syntax is OS specific \ds{} tries to guess it
357 %    from the current directory syntax. It should succeed for Unix,
358 %    MSDOS, Macintosh and VMS. However \ds{} will only initially
359 %    know the current directory syntax if it is used with \LaTeX.
360 %    If used with plain\TeX\ or initex it will not have this
361 %    information\footnote{Except when processing the main
362 %    \texttt{unpack.ins} batch file for the \LaTeX\ distribution, which
363 %    takes special measures so that initex can learn the directory
364 %    syntax.}.
365 %    If you often use \ds{} with formats other than \LaTeX\ you should
366 %    \emph{start} the file |docstrip.cfg| with a definition of
367 %    |\WriteToDir|.  E.g.,
368 %   |\def\WriteToDir{./}| on MSDOS/Unix,
369 %   |\def\WriteToDir{:}| on Macintosh,
370 %   |\def\WriteToDir{[]}| on VMS.
372 %    If your system requires something
373 %    completely different you can define in |docstrip.cfg| macros
374 %    |\dirsep| and |\makepathname|. Check for their definition in the
375 %    implementation part. If you want some substantially different
376 %    scheme of translating |\usedir| labels into directory names try
377 %    redefining macro |\usedir|.
379 % \subsection{Setting maximum numbers of streams}
381 % \DescribeMacro{\maxfiles}
382 %    In support of some of the more obscure operating systems, there's
383 %    a limit on the number of files a program can have open.  This can
384 %    be expressed to \ds\ through the |\maxfiles| macro.  If the number
385 %    of streams \ds\ is allowed to open is $n$, your configuration file
386 %    can say |\maxfiles{|$n$|}|, and \ds\ won't try to open more files
387 %    than this.  Note that this limit won't include files which are
388 %    already open.  There'll usually be two of these: the installation
389 %    script which you started, and the file |docstrip.tex| which it
390 %    included; you must bear these in mind yourself.  \ds\ assumes
391 %    that it can open at least four files before it hits some kind of
392 %    maximum: if this isn't the case, you have real problems.
394 % \DescribeMacro{\maxoutfiles}
395 %    Maybe instead of having a limit on the number of files \TeX\ can
396 %    have open, there's a limit on the number of files it can write
397 %    to (e.g., \TeX\ itself imposes a limit of 16~files being written
398 %    at a time).  This can be expressed by saying |\maxoutfiles{|$m$|}|
399 %    in a configuration file.  You must be able to have at least one
400 %    output file open at a time; otherwise \ds\ can't do anything at
401 %    all.
403 %    Both these options would typically be put in the |docstrip.cfg|
404 %    file.
407 % \section{The user interface}
409 % \subsection{The main program}
410 % \DescribeMacro{\processbatchFile} The `main program' starts with
411 %    trying to process a batch file, this is accomplished by calling
412 %    the macro |\processbatchFile|. It counts the number of batch
413 %    files it processes, so that when the number of files processed is
414 %    still zero after the call to |\processbatchFile| appropriate
415 %    action can be taken.
417 % \DescribeMacro{\interactive} When no batch files have been processed
418 %    the macro |\interactive| is called. It prompts the user for
419 %    information. First the extensions of the input and output files
420 %    is determined. Then a question about optional code is asked and
421 %    finally the user can give a list of files that have to be
422 %    processed.
424 % \DescribeMacro{\ReportTotals} When the \texttt{stats} option is
425 %    included in the \ds{}-program it keeps a record of the number of
426 %    files and lines that are processed.  Also the number of comments
427 %    removed and passed as well as the number of code lines that were
428 %    passed to the output are accounted. The macro |\ReportTotals|
429 %    shows a summary of this information.
431 % \subsection{Batchfile commands}
433 %    The commands described in this section are available to build a
434 %    batch file for \TeX.
436 % \DescribeMacro{\input}
437 % All \ds{} batch files should start with the line: |\input docstrip|
439 % Do not use the  \LaTeX\ syntax |\input{docstrip}| as batch files may
440 % be used with plain~\TeX\ or ini\TeX.
441 % You may find that old batch files always have a line
442 % |\def\batchfile{|\meta{filename}|}|
443 % just before the input.
444 % Such usage is still supported but is now discouraged, as it causes
445 % \TeX\ to re-input the same file, using up one of its limited number
446 % of input streams.
448 % \DescribeMacro{\endbatchfile}
449 % All batch files should end with this command. Any lines after this
450 % in the file are ignored. In old files that start
451 % |\def\batchfile{|\ldots\ this command is optional, but is a good
452 % idea anyway. If this command is omitted from a batchfile then
453 % normally \TeX\ will go to its interactive |*| prompt, so you may
454 % stop \ds{} by typing |\endbatchfile| to this prompt.
456 % \DescribeMacro{\generate}
457 % \DescribeMacro{\file}
458 % \DescribeMacro{\from}
459 %    The main reason for constructing a \ds{} command file is to
460 %    describe what files should be generated, from what sources and
461 %    what optional (`guarded') pieces of code should be included. The
462 %    macro |\generate| is used to give \TeX\ this information. Its
463 %    syntax is:
464 %    \begin{quote}
465 %    |\generate{|[|\file{|\meta{output}|}{|[|\from{|^^A
466 %                    \meta{input}|}{|\meta{optionlist}|}|]*|}|]*|}|
467 %    \end{quote}
468 %    The \meta{output} and \meta{input} are normal file specifications
469 %    as are appropriate for your computer system. The
470 %    \meta{optionlist} is a comma separated list of `options' that
471 %    specify which optional code fragments in \meta{input} should be
472 %    included in \meta{output}. Argument to |\generate| may contain
473 %    some local declarations (e.g., the |\use...| commands described
474 %    below) that will apply to all |\file|s after them. Argument to
475 %    |\generate| is executed inside a group, so all local declarations
476 %    are undone when |\generate| concludes.
478 %    It is possible to specify multiple input files, each with its own
479 %    \meta{optionlist}. This is indicated by the notation [\ldots]*.
480 %    Moreover there can be many |\file| specifications in one
481 %    |\generate| clause. This means that all these \meta{output} files
482 %    should be generated while reading each of \meta{input} files
483 %    once. Input files are read in order of first appearance in this
484 %    clause. E.g.
485 %\begin{verbatim}
486 %    \generate{\file{p1.sty}{\from{s1.dtx}{foo,bar}}
487 %              \file{p2.sty}{\from{s2.dtx}{baz}
488 %                            \from{s3.dtx}{baz}}
489 %              \file{p3.sty}{\from{s1.dtx}{zip}
490 %                            \from{s2.dtx}{zip}}
491 %             }
492 %\end{verbatim}
493 %    will cause \ds{} to read files \texttt{s1.dtx}, \texttt{s2.dtx},
494 %    \texttt{s3.dtx} (in that order) and produce files
495 %    \texttt{p1.sty}, \texttt{p2.sty}, \texttt{p3.sty}.
497 %    The restriction to at most 16 output streams open in a while
498 %     does not mean that you can produce at most 16 files with one
499 %    |\generate|. In the example above only 2 streams are needed,
500 %    since while \texttt{s1.dtx} is processed only \texttt{p1.sty} and
501 %    \texttt{p3.sty} are being generated; while reading
502 %    \texttt{s2.dtx} only \texttt{p2.sty} and \texttt{p3.sty}; and
503 %    while reading \texttt{s3.dtx} file \texttt{p2.sty} . However
504 %    example below needs 3 streams:
505 %\begin{verbatim}
506 %    \generate{\file{p1.sty}{\from{s1.dtx}{foo,bar}}
507 %              \file{p2.sty}{\from{s2.dtx}{baz}
508 %                            \from{s3.dtx}{baz}}
509 %              \file{p3.sty}{\from{s1.dtx}{zip}
510 %                            \from{s3.dtx}{zip}}
511 %             }
512 %\end{verbatim}
513 %    Although while reading \texttt{s2.dtx} file \texttt{p3.sty} is
514 %    not written it must remain open since some parts of
515 %    \texttt{s3.dtx} will go to it later.
517 %    Sometimes it is not possible to create a file by reading  all
518 %    sources once. Consider the following example:
519 %\begin{verbatim}
520 %    \generate{\file{p1.sty}{\from{s1.dtx}{head}
521 %                            \from{s2.dtx}{foo}
522 %                            \from{s1.dtx}{tail}}
523 %              \file{s1.drv}{\from{s1.dtx}{driver}}
524 %             }
525 %\end{verbatim}
526 %    To generate \texttt{p1.sty} file \texttt{s1.dtx} must be read
527 %    twice: first time with option \texttt{head}, then file
528 %    \texttt{s2.dtx} is read and then \texttt{s1.dtx} again this time
529 %    with option \texttt{tail}.  \ds{} handles this case correctly: if
530 %    inside one |\file| declaration there are multiple |\from|es with
531 %    the same input file this file \emph{is} read multiple times.
533 %    If the order of |\from|s specified in one of your |\file|
534 %    specifications does not match the order of input files
535 %    established by previous |\file|s, \ds{} will raise an error and
536 %    abort. Then you may either read one of next sections or give up
537 %    and put that file in separate |\generate| (but then sources will
538 %    be read again just for that file).
540 %    \paragraph{For impatient.} Try following algorithm: Find
541 %    file that is generated from largest number of sources, start
542 %    writing |\generate| clause with this file and its sources in
543 %    proper order. Take other files that are to be generated and add
544 %    them checking if they don't contradict order of sources for the
545 %    first one. If this doesn't work read next sections.
547 %    \paragraph{For mathematicians.} Relation ``file $A$ must  be
548 %    read before file $B$'' is a partial order on the set of all your
549 %    source files.  Each |\from| clause adds a chain to this order.
550 %    What you have to do is to perform a topological sort i.e. to
551 %    extend partial order to linear one.  When you have done it just
552 %    list your source files in |\generate| in such a way that order of
553 %    their first appearance in the clause matches linear order. If
554 %    this cannot be achieved read next paragraph. (Maybe future
555 %    versions of \ds{} will perform this sort automatically, so all
556 %    these troubles will disappear.)
558 %    \paragraph{For that who must know that all.} There  is  a
559 %    diverse case when it's not possible to achieve proper order of
560 %    reading source files. Suppose you have to generate two files,
561 %    first from \texttt{s1.dtx} and \texttt{s3.dtx} (in that order)
562 %    and second from \texttt{s2.dtx} and \texttt{s3.dtx}.  Whatever
563 %    way you specify this the files will be read in either as
564 %    \texttt{s1 s3 s2} or \texttt{s2 s3 s1}. The key to solution is
565 %    magical macro |\needed| that marks a file as needed to be input
566 %    but not directing any output from it to current |\file|. In our
567 %    example proper specification is:
568 %\begin{verbatim}
569 %    \generate{\file{p1.sty}{\from{s1.dtx}{foo}
570 %                            \needed{s2.dtx}
571 %                            \from{s3.dtx}{bar}}
572 %              \file{p2.sty}{\from{s2.dtx}{zip}
573 %                            \from{s3.dtx}{zap}}
574 %             }
575 %\end{verbatim}
578 %  \DescribeMacro{\askforoverwritetrue}
579 %  \DescribeMacro{\askforoverwritefalse}
580 %    These macros specify what should happen if a file that is to be
581 %    generated already exists. If |\askforoverwritetrue| is active
582 %    (the default) the user is asked whether the file should be
583 %    overwritten. If however |\askforoverwritefalse| was issued
584 %    existing files will be overwritten silently.  These switches are
585 %    local and can be issued in any place in the file even inside
586 %    |\generate| clause (between |\file|s however).
588 %  \DescribeMacro{\askonceonly}
589 %  You might not want to set |\askforoverwritefalse| in a batch file
590 %  as that says that it us always all right to overwrite other people's
591 %  files. However for large installations, such as the base \LaTeX\
592 %  distribution,  being asked individually about hundreds of files
593 %  is not very helpful either. A batchfile may therefore specify
594 %  |\askonceonly|. This means that after the first time the batchfile
595 %  asks the user a question, the user is given an option of to change
596 %  the behaviour so that `yes' will be automatically assumed for all
597 %  future questions. This applies to any use of the \ds{} command
598 %  |\Ask| including, but not restricted to, the file overwrite
599 %  questions controlled by |\askforoverwritetrue|.
601 % \DescribeMacro{\preamble}
602 % \DescribeMacro{\endpreamble}
603 % \DescribeMacro{\postamble}
604 % \DescribeMacro{\endpostamble}
605 %    It is possible to add a number of lines to the output of the
606 %    \ds{} program. The information you want to add to the start of
607 %    the output file should be listed between the |\preamble| and
608 %    |\endpreamble| commands; the lines you want to add to the end of
609 %    the output file should be listed between the |\postamble| and
610 %    |\endpostamble| commands. Everything that \ds{} finds for both
611 %    the pre- and postamble it writes to the output file, but preceded
612 %    with value of |\MetaPrefix| (default is two \%-characters). If
613 %    you include a |^^J| character in one of these lines, everything
614 %    that follows it on the same line is written to a new line in the
615 %    output file.  This `feature' can be used to add a |\typeout| or
616 %    |\message| to the stripped file.
618 % \DescribeMacro{\declarepreamble}
619 % \DescribeMacro{\declarepostamble}
620 % \DescribeMacro{\usepreamble}
621 % \DescribeMacro{\usepostamble}
622 % \DescribeMacro{\nopreamble}
623 % \DescribeMacro{\nopostamble}
624 %    Sometimes it is desirable to have different preambles for different
625 %    files  of  a  larger  package  (e.g.,  because  some  of them are
626 %    customisable  configuration  files and they should be marked as
627 %    such). In such a case one can say |\declarepreamble\somename|,
628 %    then type in his/her preamble, end it with |\endpreamble|,
629 %    and  later  on  |\usepreamble\somename|  to  switch   to   this
630 %    preamble.
631 %    If no preamble  should be used you can deploy the |\nopreamble|
632 %    command. This command is equivalent to saying  |\usepreamble\empty|.
633 %    The  same  mechanism works for postambles, |\use...|
634 %    declarations are local and can appear inside |\generate|.
636 %    Commands   |\preamble|   and   |\postamble| define and  activate
637 %    pre(post)ambles named |\defaultpreamble| and |\defaultpostamble|.
639 % \DescribeMacro{\batchinput}
640 %    The batch file commands can be put into several batch files which
641 %    are then executed from a master batch file. This is, for example,
642 %    useful if a distribution consists of several distinct parts. You
643 %    can then write individual batch files for every part and in
644 %    addition a master file that simply calls the batch files for the
645 %    parts.  For this, call the individual batch files from the master
646 %    file with the command |\batchinput{|\meta{file}|}|. Don't use
647 %    |\input| for this purpose, this command
648 %    should be used only for calling the \ds{} program as explained
649 %    above and is ignored when used for any other purpose.
651 % \DescribeMacro{\ifToplevel}
652 %    When batch files are nested you may want to suppress certain
653 %    commands in the lower-level batch files such as terminal
654 %    messages. For this purpose you can use the |\ifToplevel| command
655 %    which executes its argument only if the current batch file is the
656 %    outermost one. Make sure that you put the opening brace of the
657 %    argument into the same line as the command itself, otherwise the
658 %    \ds{} program will get confused.
660 % \DescribeMacro{\showprogress}
661 % \DescribeMacro{\keepsilent}
662 %    When the option \texttt{stats} is included in \ds{} it can
663 %    write message to the terminal as each line of the input file(s) is
664 %    processed. This message consists of a single character, indicating
665 %    kind of that particular line. We use the
666 %    following characters:
667 %    \begin{itemize}
668 % \item[\texttt{\%}] Whenever an input line is a comment
669 %        \texttt{\%}-character is written to the terminal.
670 % \item[\texttt{.}] Whenever a code line is encountered
671 %        a \texttt{.}-character is written on the terminal.
672 % \item[\texttt{/}] When a number of empty lines appear in a row in the
673 %        input file, at most one of them is retained. The \ds{}
674 %        program signals the removal of an empty line with the
675 %        \texttt{/}-character.
676 % \item[\texttt{<}] When a `guard line' is found in the input and it
677 %        starts a block of optionally included code, this is signalled
678 %        on the terminal by showing the \texttt{<}-character, together
679 %        with the boolean expression of the guard.
680 % \item[\texttt{>}] The end of a conditionally included block of code is
681 %        indicated by showing the \texttt{>}-character.
682 %    \end{itemize}
683 %    This feature is turned on by default when the option
684 %    \texttt{stats} is included, otherwise it is turned off. The
685 %    feature can be toggled with the commands |\showprogress| and
686 %    |\keepsilent|.
689 %  \subsubsection{Supporting old interface}
691 % \DescribeMacro{\generateFile}
692 %    Here is the old syntax for specifying  what  files  are  to  be
693 %    generated. It allows specification of just one output file.
694 %    \begin{quote}
695 %    |\generateFile{|\meta{output}|}{|\meta{ask}|}{|[|\from{|^^A
696 %                    \meta{input}|}{|\meta{optionlist}|}|]*|}|
697 %    \end{quote}
698 %    The meaning of \meta{output}, \meta{input} and
699 %    \meta{optionslist} is just as for |\generate|.  With
700 %    \meta{ask} you can instruct \TeX\ to either silently overwrite a
701 %    previously existing file (|f|) or to issue a warning and ask you
702 %    if it should overwrite the existing file (|t|) (it overrides the
703 %    |\askforoverwrite| setting).
705 % \DescribeMacro{\include}
706 % \DescribeMacro{\processFile}
707 %    The earlier version of the \ds{} program supported a
708 %    different kind of command to tell \TeX\ what to do. This command
709 %    is less powerful than |\generateFile|; it can be used when
710 %    \meta{output} is created from one \meta{input}. The syntax is:
711 %    \begin{quote}
712 %    |\include{|\meta{optionlist}|}|
714 %    |\processFile{|\meta{name}|}{|\meta{inext}^^A
715 %                              |}{|\meta{outext}^^A
716 %                              |}{|\meta{ask}|}|
717 %    \end{quote}
718 %    This command is based on environments where filenames are
719 %    constructed of two parts, the name and the extension, separated
720 %    with a dot. The syntax of this command assumes that the
721 %    \meta{input} and \meta{output} share the same name and only
722 %    differ in their extension. This command is retained to be
723 %    backwards compatible with the older version of \ds{}, but its use
724 %    is not encouraged.
726 % \section{Conditional inclusion of code}
728 %    When you use the \ds{} program to strip comments out of
729 %    \TeX\ macro files you have the possibility to make more than one
730 %    stripped macro file from one documented file. This is achieved by
731 %    the support for optional code. The optional code is marked
732 %    in the documented file with a `guard'.
734 %    A guard is a boolean expression that is enclosed in |<| and |>|.
735 %    It also {\em has\/} to follow the |%| at the beginning of the line.
736 %    For example:
737 %\begin{verbatim}
738 %    ...
739 %    %<bool>\TeX code
740 %    ...
741 %\end{verbatim}
742 %    In this example the line of code will be included in \meta{output}
743 %    if the option \texttt{bool} is present in the \meta{optionlist} of
744 %    the |\generateFile| command.
746 %    The syntax for the boolean expressions is:
748 %\DeleteShortVerb\|
749 %    \begin{tabular}{lcl}
750 %    \meta{Expression} & $::=$ & \meta{Secondary}
751 %                            [\{\texttt{|}, \texttt{,}\}
752 %                            \meta{Secondary}]*\\
753 %    \meta{Secondary}    & $::=$ &
754 %                        \meta{Primary} [\texttt{\&}
755 %                         \meta{Primary}]*\\
756 %    \meta{Primary}  & $::=$ &
757 %                        \meta{Terminal} $|$ \texttt{!}\meta{Primary}
758 %                        $|$ \texttt{(}\meta{Expression}\texttt{)}\\
759 %    \end{tabular}
761 %    The \texttt{|} stands for disjunction, the \texttt{\&} stands for
762 %    conjunction and the \texttt{!}\ stands for negation. The
763 %    \meta{Terminal} is any sequence of letters and evaluates to
764 %    \meta{true} iff\footnote{iff stands for `if and only if'} it
765 %    occurs in the list of options that have to be included.
766 %\MakeShortVerb\|
768 %    Two kinds of optional code are supported: one can either have
769 %    optional code that `fits' on one line of text, like the example
770 %    above, or one can have blocks of optional code.
772 %    To distinguish both kinds of optional code the `guard modifier'
773 %    has been introduced. The `guard modifier' is one character that
774 %    immediately follows the |<| of the guard. It can be either |*|
775 %    for the beginning of a block of code, or |/| for the end of a
776 %    block of code\footnote{To be compatible with the earlier version
777 %    of \ds{} also \texttt{+} and \texttt{-} are supported as `guard
778 %    modifiers'.  However, there is an incompatibility with the
779 %    earlier version since a line with a \texttt{+}-modified guard is
780 %    not included inside a block with a guard that evaluates to false,
781 %    in contrast to the previous behaviour.}.  The beginning and
782 %    ending guards for a block of code have to be on a line by
783 %    themselves.
785 %    When a block of code is {\em not\/} included, any guards that occur
786 %    within that block are {\em not\/} evaluated.
788 % \section{Those other languages}
789 %    Since \TeX\ is an open system some of \TeX\ packages include
790 %    non-\TeX\ files. Some authors use \ds\ to generate PostScript
791 %    headers, shell scripts or programs in other languages. For them
792 %    the comments-stripping activity of \ds\ may cause some
793 %    trouble. This section describes how to produce non-\TeX\ files
794 %    with \ds\ effectively.
796 % \subsection{Stuff \ds\ puts in every file}
797 %    First problem when producing files in ``other'' languages is that
798 %    \ds\ adds some bits to the beginning and end of every generated
799 %    file that may not fit with the syntax of the language in
800 %    question. So we'll study carefully what exactly goes where.
802 %    The whole text put on beginning of file is kept in a macro defined
803 %    by |\declarepreamble|. Every line of input presented to
804 %    |\declarepreamble| is prepended with current value of
805 %    |\MetaPrefix|. Standard \ds\ header is inserted before your text,
806 %    and macros |\inFileName|, |\outFileName| and |\ReferenceLines|
807 %    are used as placeholders for information which will be filled in
808 %    later (specifically for each output file). Don't try to redefine
809 %    these macros. After
810 %\begin{verbatim}
811 %    \declarepreamble\foo
812 %    ____________________________
813 %    Package FOO for use with TeX
814 %    \endpreamble
815 %\end{verbatim}
816 %    macro |\foo| is defined as
817 %\begin{verbatim}
818 %    %%^^J
819 %    %% This is file `\outFileName ',^^J
820 %    %% generated with the docstrip utility.^^J
821 %    \ReferenceLines^^J
822 %    %% ____________________________^^J
823 %    %% Package FOO for use with TeX.
824 %\end{verbatim}
825 %    You can play with it freely or even define it from scratch. To
826 %    embed the preamble in Adobe structured comments just use |\edef|:
827 %\begin{verbatim}
828 %    \edef\foo{\perCent!PS-Adobe-3.0^^J%
829 %              \DoubleperCent\space Title: \outFileName^^J%
830 %              \foo^^J%
831 %              \DoubleperCent\space EndComments}
832 %\end{verbatim}
833 %    After that use |\usepreamble\foo| to select your new preamble.
834 %    Everything above works as well for postambles.
836 %    You may also prevent \ds\ from adding anything to your file, and
837 %    put any language specific invocations directly in your code:
838 %\begin{verbatim}
839 %    \generate{\usepreamble\empty
840 %              \usepostamble\empty
841 %              \file{foo.ps}{\from{mypackage.dtx}{ps}}}
842 %\end{verbatim}
843 %    or alternatively |\nopreamble| and |\nopostamble|.
845 % \subsection{Meta comments}
846 %    You can change the prefix used for putting meta comments to
847 %    output files by redefining |\MetaPrefix|. Its default value is
848 %    |\DoubleperCent|. The preamble uses value of |\MetaPrefix|
849 %    current at time of |\declarepreamble| while meta comments in the
850 %    source file use value current at time of |\generate|. Note that
851 %    this means that you cannot produce concurrently two files using
852 %    different |\MetaPrefix|es.
854 % \subsection{Verbatim mode}
855 %    If your programming language uses some construct that can
856 %    interferes badly with \ds\ (e.g., percent in column one) you may
857 %    need a way for preventing it from being stripped off. For that
858 %    purpose \ds\ features `verbatim mode'.
860 %    A `Guard expression' of the form |%<<|\meta{END-TAG} marks
861 %    the start of a section that will be copied verbatim upto a line
862 %    containing only a percent in column 1 followed by \meta{END-TAG}.
863 %    You can select any \meta{END-TAG} you want, but note that spaces
864 %     count here. Example:
865 %\begin{verbatim}
866 %    %<*myblock>
867 %    some stupid()
868 %       #computer<program>
869 %    %<<COMMENT
870 %    % These two lines are copied verbatim (including percents
871 %    %% even if \MetaPrefix is something different than %%).
872 %    %COMMENT
873 %       using*strange@programming<language>
874 %    %</myblock>
875 %\end{verbatim}
876 %    And the output is (when stripped with \texttt{myblock} defined):
877 %\begin{verbatim}
878 %    some stupid()
879 %       #computer<program>
880 %    % These two lines are copied verbatim (including percents
881 %    %% even if \MetaPrefix is something different than %%).
882 %       using*strange@programming<language>
883 %\end{verbatim}
885 %\StopEventually{%
886 %^^A \section{Conclusion}
887 %  \PrintIndex
888 %  \PrintChanges
889 %^^A \makesignature
890 % }
892 % \section{Producing the documentation}
894 %    We provide a short driver file that can be extracted by the
895 %    \ds{} program using the conditional `\textsf{driver}'.  To
896 %    allow the use of \texttt{docstrip.dtx} as a program at Ini\TeX{}
897 %    time (e.g., to strip
898 %    off its own comments) we need to add a bit of primitive code.
899 %    With this extra checking it is still possible to process this
900 %    file with \LaTeXe{} to typeset the documentation.
901 % \changes{2.1b}{1993/02/23}{Added fontdefinitions for doc to the driver
902 %                          file, in order to get the layout of the code
903 %                          right; also added the layout definitions
904 %                          that are in effect in \texttt{doc.drv}}
905 % \changes{2.1c}{1993/02/23}{Remove definitions for fonts again}
906 % \changes{2.2f}{1994/02/26}{Allow direct processing of source}
907 %    \begin{macrocode}
908 %<*driver>
909 %    \end{macrocode}
910 %    If |\documentclass| is undefined, e.g., if Ini\TeX{} or plain
911 %    \TeX{} is used for formatting, we bypass the driver file.
913 % \changes{2.3a}{1995/08/20}{Changed driver}
914 %    We use some trickery to avoid issuing |\end{document}| when
915 %    the |\ifx| construction is unfinished. If condition below is
916 %    true a |\fi| is constructed on the fly, the |\ifx| is completed,
917 %    and the real |\fi| will never be seen as it comes after
918 %    |\end{document}|. On the other hand if condition is false
919 %    \TeX\ skips over |\csname fi\endcsname| having no idea that
920 %    this could stand for |\fi|, driver is skipped and only then
921 %    the condition completed.
923 %    Additional guard |gobble| prevents \ds\ from extracting
924 %    these tricks to real driver file.
925 %    \begin{macrocode}
926 %<*gobble>
927 \ifx\jobname\relax\let\documentclass\undefined\fi
928 \ifx\documentclass\undefined
929 \else \csname fi\endcsname
930 %</gobble>
931 %    \end{macrocode}
932 %    Otherwise we process the following lines which will result in
933 %    formatting the documentation.
934 %    \begin{macrocode}
935  \documentclass{ltxdoc}
936     \EnableCrossrefs
937  % \DisableCrossrefs
938  % use \DisableCrossrefs if the
939  % index is ready
940  \RecordChanges
941  % \OnlyDescription
942  \typeout{Expect some Under- and overfull boxes}
943  \begin{document}
944    \DocInput{docstrip.dtx}
945  \end{document}
946 %<*gobble>
948 %</gobble>
949 %</driver>
950 %    \end{macrocode}
953 % \section{The implementation}
955 % \subsection{Initex initializations}
956 % Allow this program to run with |initex|.
957 % The |Z| trickery saves the need to worry about |\outer| stuff in
958 % plain \TeX.
959 %    \begin{macrocode}
960 %<*initex>
961 \catcode`\Z=\catcode`\%
962 \ifnum13=\catcode`\~{\egroup\else
963   \catcode`\Z=9
965 Z  \catcode`\{=1  \catcode`\}=2
966 Z  \catcode`\#=6  \catcode`\^=7
967 Z  \catcode`\@=11 \catcode`\^^L=13
968 Z  \let\bgroup={  \let\egroup=}
970 Z  \dimendef\z@=10 \z@=0pt \chardef\@ne=1 \countdef\m@ne=22 \m@ne=-1
971 Z  \countdef\count@=255
973 Z  \def\wlog{\immediate\write\m@ne} \def\space{ }
975 Z  \count10=22 % allocates \count registers 23, 24, ...
976 Z  \count15=9 % allocates \toks registers 10, 11, ...
977 Z  \count16=-1 % allocates input streams 0, 1, ...
978 Z  \count17=-1 % allocates output streams 0, 1, ...
980 Z  \def\alloc@#1#2#3{\advance\count1#1\@ne#2#3\count1#1\relax}
982 Z  \def\newcount{\alloc@0\countdef} \def\newtoks{\alloc@5\toksdef}
983 Z  \def\newread{\alloc@6\chardef}   \def\newwrite{\alloc@7\chardef}
985 Z \def\newif#1{%
986 Z   \count@\escapechar \escapechar\m@ne
987 Z     \let#1\iffalse
988 Z     \@if#1\iftrue
989 Z     \@if#1\iffalse
990 Z   \escapechar\count@}
991 Z \def\@if#1#2{%
992 Z   \expandafter\def\csname\expandafter\@gobbletwo\string#1%
993 Z                     \expandafter\@gobbletwo\string#2\endcsname
994 Z                        {\let#1#2}}
996 Z  \def\@gobbletwo#1#2{}
997 Z  \def\@gobblethree#1#2#3{}
999 Z  \def\loop#1\repeat{\def\body{#1}\iterate}
1000 Z  \def\iterate{\body \let\next\iterate \else\let\next\relax\fi \next}
1001 Z  \let\repeat\fi
1003 Z  \def\empty{}
1005 Z  \def\tracingall{\tracingcommands2 \tracingstats2
1006 Z    \tracingpages1 \tracingoutput1 \tracinglostchars1
1007 Z    \tracingmacros2 \tracingparagraphs1 \tracingrestores1
1008 Z    \showboxbreadth 10000 \showboxdepth 10000 \errorstopmode
1009 Z    \errorcontextlines 10000 \tracingonline1 }
1011 \bgroup}\fi\catcode`\Z=11
1012 \let\bgroup={  \let\egroup=}
1013 %</initex>
1014 %    \end{macrocode}
1016 % \subsection{Declarations and initializations}
1018 %    In order to be able to include the \texttt{@}-sign in control
1019 %    sequences its category code is changed to \meta{letter}.  The
1020 %    `program' guard here allows most of the code to be excluded when
1021 %    extracting the driver file.
1022 %    \begin{macrocode}
1023 %<*program>
1024 \catcode`\@=11
1025 %    \end{macrocode}
1027 %    When we want to write multiple lines to the terminal with one
1028 %    statement, we need a character that tells \TeX\ to break the lines.
1029 %    We use \verb=^^J= for this purpose.
1030 %    \begin{macrocode}
1031 \newlinechar=`\^^J
1032 %    \end{macrocode}
1034 % \subsubsection{Switches}
1035 % \begin{macro}{\ifGenerate}
1036 %    The program will check if a
1037 %    file of the same name as the file it would be creating already
1038 %    exists. The switch |\ifGenerate| is used to indicate if the
1039 %    stripped file has to be generated.
1040 %    \begin{macrocode}
1041 \newif\ifGenerate
1042 %    \end{macrocode}
1043 % \end{macro}
1045 % \begin{macro}{\ifContinue}
1046 %    The switch |\ifContinue| is used in various places in the
1047 %    program to indicate if a |\loop| has to end.
1048 %    \begin{macrocode}
1049 \newif\ifContinue
1050 %    \end{macrocode}
1051 % \end{macro}
1053 % \begin{macro}{\ifForlist}
1054 % \changes{2.0g}{1991/06/05}{Macro added.}
1055 %    The program contains an implementation of a for-loop, based on
1056 %    plain \TeX{}'s |\loop| macros. The implementation needs a
1057 %    switch to terminate the loop.
1058 %    \begin{macrocode}
1059 \newif\ifForlist
1060 %    \end{macrocode}
1061 % \end{macro}
1063 % \begin{macro}{\ifDefault}
1064 %    The switch |\ifDefault| is used to indicate whether the
1065 %    default batch file has to be used.
1066 % \changes{2.0f}{1991/06/04}{Macro added.}
1067 %    \begin{macrocode}
1068 \newif\ifDefault
1069 %    \end{macrocode}
1070 % \end{macro}
1072 % \begin{macro}{\ifMoreFiles}
1073 %    The switch |\ifMoreFiles| is used to decide if the user
1074 %    wants more files to be processed. It is used only in interactive
1075 %    mode; initially it evaluates to \meta{true}.
1076 % \changes{2.0h}{1991/06/19}{Macro added.}
1077 %    \begin{macrocode}
1078 \newif\ifMoreFiles \MoreFilestrue
1079 %    \end{macrocode}
1080 % \end{macro}
1081 % \begin{macro}{\ifaskforoverwrite}
1082 %    The switch |\askforoverwrite| is used to  decide  if  the  user
1083 %    should be asked when a file is to be overwritten.
1084 %    \begin{macrocode}
1085 \newif\ifaskforoverwrite \askforoverwritetrue
1086 %    \end{macrocode}
1087 % \end{macro}
1089 % \subsubsection{Count registers}
1090 % \begin{macro}{\blockLevel}
1091 %    Optionally included blocks of code can be nested. The counter
1092 %    |\blockLevel| will be used to keep track of the level of
1093 %    nesting.  Its initial value is zero.
1094 %    \begin{macrocode}
1095 \newcount\blockLevel \blockLevel\z@
1096 %    \end{macrocode}
1097 % \end{macro}
1099 % \begin{macro}{\emptyLines}
1100 %    The count register |\emptyLines| is used to count the number
1101 %    of consecutive empty input lines. Only the first will be copied
1102 %    to the output file.
1103 % \changes{2.0i}{1990/06/27}{Macro added}
1104 %    \begin{macrocode}
1105 \newcount\emptyLines \emptyLines \z@
1106 %    \end{macrocode}
1107 % \end{macro}
1109 % \begin{macro}{\processedLines}
1110 % \begin{macro}{\commentsRemoved}
1111 % \begin{macro}{\commentsPassed}
1112 % \begin{macro}{\codeLinesPassed}
1113 %    To be able to provide the user with some statistics about the
1114 %    stripping process four counters are allocated if the statistics
1115 %    have been included when this program was \ds{}ped.  The number of
1116 %    lines processed is stored in the counter |\processedLines|.
1117 %    The number of lines containing comments that are not written on
1118 %    the output file is stored in the counter |\commentsRemoved|;
1119 %    the number of comments copied to the output file is stored in the
1120 %    counter |\commentsPassed|.  The number of lines containing
1121 %    macro code that are copied to the output file is stored in the
1122 %    counter |\codeLinesPassed|.
1123 %    \begin{macrocode}
1124 %<*stats>
1125 \newcount\processedLines   \processedLines  \z@
1126 \newcount\commentsRemoved  \commentsRemoved \z@
1127 \newcount\commentsPassed   \commentsPassed  \z@
1128 \newcount\codeLinesPassed  \codeLinesPassed \z@
1129 %    \end{macrocode}
1130 % \end{macro}
1131 % \end{macro}
1132 % \end{macro}
1133 % \end{macro}
1135 % \changes{2.0e}{1991/05/31}{Added counter allocation for the processing
1136 %                           of multiple files}
1137 % \begin{macro}{\TotalprocessedLines}
1138 % \begin{macro}{\TotalcommentsRemoved}
1139 % \begin{macro}{\TotalcommentsPassed}
1140 % \begin{macro}{\TotalcodeLinesPassed}
1141 %    When more than one file is processed and when statistics have
1142 %    been included we provide the user also with information about the
1143 %    total amount of lines processed. For this purpose four more count
1144 %    registers are allocated here.
1145 %    \begin{macrocode}
1146 \newcount\TotalprocessedLines   \TotalprocessedLines  \z@
1147 \newcount\TotalcommentsRemoved  \TotalcommentsRemoved \z@
1148 \newcount\TotalcommentsPassed   \TotalcommentsPassed  \z@
1149 \newcount\TotalcodeLinesPassed  \TotalcodeLinesPassed \z@
1150 %</stats>
1151 %    \end{macrocode}
1152 % \end{macro}
1153 % \end{macro}
1154 % \end{macro}
1155 % \end{macro}
1157 % \begin{macro}{\NumberOfFiles}
1158 %    When more than one file is processed, the number of files is
1159 %    stored in the count register |\NumberOfFiles|.
1160 % \changes{2.4h}{1997/07/07}{Declare counter always pr/2429}
1161 %    \begin{macrocode}
1162 \newcount\NumberOfFiles \NumberOfFiles\z@
1163 %    \end{macrocode}
1164 % \end{macro}
1166 % \subsubsection{I/O streams}
1167 % \begin{macro}{\inFile}
1168 %    For reading the file with documented \TeX-code, an input stream
1169 %    |\inFile| is allocated.
1170 %    \begin{macrocode}
1171 \newread\inFile
1172 %    \end{macrocode}
1173 % \end{macro}
1175 % \changes{2.3a}{1995/08/18}{No allocated streams for console}
1176 % \begin{macro}{\ttyin}
1177 % \begin{macro}{\ttyout}
1178 %    Communication with the user goes through (nonexistent) stream 16.
1179 %    \begin{macrocode}
1180 \chardef\ttyin16
1181 \chardef\ttyout16
1182 %    \end{macrocode}
1183 % \end{macro}
1184 % \end{macro}
1186 % \begin{macro}{\inputcheck}
1187 %    This stream is only used for checking for existence of files.
1188 %    \begin{macrocode}
1189 \newread\inputcheck
1190 %    \end{macrocode}
1191 % \end{macro}
1193 %  \begin{macro}{\ifToplevel}
1194 %    Execute the argument if current batch file is the outermost one.
1195 %    Otherwise suppress it.
1196 %    \begin{macrocode}
1197 \newif\iftopbatchfile \topbatchfiletrue
1198 \def\ifToplevel{\relax\iftopbatchfile
1199    \expandafter\iden \else \expandafter\@gobble\fi}
1200 %    \end{macrocode}
1201 %  \end{macro}
1203 % \begin{macro}{\batchinput}
1204 % \changes{2.0n}{1992/04/26}{Added macro}
1205 % \changes{2.1a}{1993/02/22}{Completely redefined (so that it works)}
1207 %    When the file \texttt{docstrip.tex} is read because of an
1208 %    |\input| statement in a batch file we have to prevent an
1209 %    endless loop (well, limited by \TeX's stack). Therefore we save
1210 %    the original primitive |\input| and define a new macro with
1211 %    an argument delimited by \verb*= = (i.e.\ a space) that just
1212 %    gobbles the argument.  Since the end-of-line character is
1213 %    converted by \TeX{} to a space.  This means that |\input| is not
1214 %    available as a command within batch files.
1216 % \begin{macro}{\@@input}
1217 % \changes{2.1a}{1993/02/22}{Macro added}
1218 %    We therefore keep a copy of the original under the name
1219 %    |\@@input| for internal use. If \ds{} runs under \LaTeX{} this
1220 %    command is already defined, so we make a quick test.
1221 %    \begin{macrocode}
1222 \ifx\undefined\@@input \let\@@input\input\fi
1223 %    \end{macrocode}
1224 % \end{macro}
1226 %    To allow the nesting of batch files the |\batchinput| command is
1227 %    provided it takes one argument, the name of the batch file to
1228 %    switch to.
1229 %    \begin{macrocode}
1230 \def\batchinput#1{%
1231 %    \end{macrocode}
1232 %    We start a new group and locally redefine |\batchFile| to hold
1233 %    the new batch file name. We toggle the |\iftopbatchfile| switch
1234 %    since this definitely is not top batch file.
1235 %    \begin{macrocode}
1236    \begingroup
1237      \def\batchfile{#1}%
1238      \topbatchfilefalse
1239      \Defaultfalse
1240      \usepreamble\org@preamble
1241      \usepostamble\org@postamble
1242      \let\destdir\WriteToDir
1243 %    \end{macrocode}
1244 %    After this we can simply call |\processbatchFile| which will
1245 %    open the new batch file and read it until it
1246 %    is exhausted. Note that if the batch file is not available, or
1247 %    misspelled this routine will produce a warning and return.
1248 %    \begin{macrocode}
1249      \processbatchFile
1250 %    \end{macrocode}
1251 %    The value of |\batchfile| as well as local definitions of
1252 %    preambles, directories etc. will be restored
1253 %    at this  closing |\endgroup|, so that further processing
1254 %    continues in the calling batch file.
1255 %    \begin{macrocode}
1256    \endgroup
1258 %    \end{macrocode}
1259 % \begin{macro}{\skip@input}
1260 % \changes{2.0j}{1992/03/03}{Added macro}
1261 % \changes{2.0n}{1992/04/26}{Argument delimited by space not \cs{relax}}
1262 % \changes{2.0n}{1992/04/26}{Macro renamed from \cs{skipinput}}
1263 %    And here is the promised redefinition of |\input|:
1264 %    \begin{macrocode}
1265 \def\skip@input#1 {}
1266 \let\input\skip@input
1267 %    \end{macrocode}
1268 % \end{macro}
1269 % \end{macro}
1271 % \subsubsection{Empty macros and macros that expand to a string}
1272 % \begin{macro}{\guardStack}
1273 %    \changes{2.0k}{1992/04/06}{Renamed from \texttt{\bsl blockStack}}
1274 %    Because blocks of code that will conditionally be included in the
1275 %    output can be nested, a stack is maintained to keep track of
1276 %    these blocks. The main reason for this is that we want to be able
1277 %    to check if the blocks are properly nested. The stack itself is
1278 %    stored in |\guardStack|.
1279 %    \begin{macrocode}
1280 \def\guardStack{}
1281 %    \end{macrocode}
1282 % \end{macro}
1284 % \begin{macro}{\blockHead}
1285 %    The macro |\blockHead| is used for storing and retrieving
1286 %    the boolean expression that starts a block.
1287 %    \begin{macrocode}
1288 \def\blockHead{}
1289 %    \end{macrocode}
1290 % \end{macro}
1292 % \begin{macro}{\yes}
1293 % \begin{macro}{\y}
1294 %    When the user is asked a question that he has to answer with either
1295 %    \meta{yes} or \meta{no}, his response has to be evaluated. For this
1296 %    reason the macros |\yes| and |\y| are defined.
1297 %    \begin{macrocode}
1298 \def\yes{yes}
1299 \def\y{y}
1300 %    \end{macrocode}
1301 % \begin{macro}{\n}
1302 %    We also define |\n| for use in \ds{} command files.
1303 % \changes{2.1e}{1993/03/09}{Macro added}
1304 %    \begin{macrocode}
1305 \def\n{n}
1306 %    \end{macrocode}
1307 % \end{macro}
1308 % \end{macro}
1309 % \end{macro}
1311 % \begin{macro}{\Defaultbatchile}
1312 % \changes{2.0f}{1991/06/04}{Macro added.}
1313 %    When the \ds{} program has to process a batch file it
1314 %    can look for a batch file with a default name. This name
1315 %    is stored in |\DefaultbatchFile|.
1316 %    \begin{macrocode}
1317 \def\DefaultbatchFile{docstrip.cmd}
1318 %    \end{macrocode}
1319 % \end{macro}
1321 % \begin{macro}{\perCent}
1322 % \begin{macro}{\DoubleperCent}
1323 % \begin{macro}{\MetaPrefix}
1324 %    To be able to display percent-signs on the terminal, a
1325 %    \texttt{\%} with category code 12 is stored in |\perCent| and
1326 %    |\DoubleperCent|. The macro |\MetaPrefix| is put on beginning of
1327 %    every meta-comment line. It is defined indirect way since some
1328 %    applications need redefining it.
1329 %    \begin{macrocode}
1330 {\catcode`\%=12
1331  \gdef\perCent{%}
1332  \gdef\DoubleperCent{%%}
1334 \let\MetaPrefix\DoubleperCent
1335 %    \end{macrocode}
1336 % \end{macro}
1337 % \end{macro}
1338 % \end{macro}
1339 %    In order to allow formfeeds in the input we define a one-character
1340 %    control sequence \verb=^^L=.
1341 %    \begin{macrocode}
1342 \def^^L{ }
1343 %    \end{macrocode}
1345 %    The only result of using |\Name| is slowing down execution since
1346 %    its typical use (e.g., |\Name\def{foo bar}...|) has exactly the
1347 %    same number of tokens as its expansion. However I think that it's
1348 %    easier to read. The meaning of |\Name| as a black box is:
1349 %    ``construct a name from second parameter and then pass it to your
1350 %    first parameter as a parameter''.
1352 %    |\@stripstring| is used to get tokens building name of a macro
1353 %    without leading backslash.
1354 %    \begin{macrocode}
1355 \def\Name#1#2{\expandafter#1\csname#2\endcsname}
1356 \def\@stripstring{\expandafter\@gobble\string}
1357 %    \end{macrocode}
1359 % \subsubsection{Miscellaneous variables}
1360 % \begin{macro}{\sourceFileName}
1361 %    The macro |\sourceFileName| is used to store the name of the
1362 %    current input file.
1363 % \end{macro}
1364 % \begin{macro}{\batchfile}
1365 %    The macro |\batchfile| is used to store the name of the
1366 %    batch file.
1367 % \end{macro}
1368 % \begin{macro}{\inLine}
1369 %    The macro |\inLine| is used to store the lines, read from
1370 %    the input file, before further processing.
1371 % \end{macro}
1372 % \begin{macro}{\answer}
1373 %    When some interaction with the user is needed the macro
1374 %    |\answer| is used to store his response.
1375 % \end{macro}
1376 % \begin{macro}{\tmp}
1377 %    Sometimes something has to be temporarily stored in a control
1378 %    sequence.  For these purposes the control sequence |\tmp| is
1379 %    used.
1380 % \end{macro}
1382 % \subsection{Support macros}
1383 %    \subsubsection{The stack mechanism}
1385 %    It is possible to have `nested guards'. This means that within a
1386 %    block of optionally included code a subgroup is only included
1387 %    when an additional option is specified. To keep track of the
1388 %    nesting of the guards the currently `open' guard can be pushed on
1389 %    the stack |\guardStack| and later popped off the stack again. The
1390 %    macros that implement this stack mechanism are loosely based on
1391 %    code that is developed in the context of the \LaTeX3 project.
1393 %    To be able to implement a stack mechanism we need a couple of
1394 %    support macros.
1395 % \begin{macro}{\eltStart}
1396 %    \changes{2.0k}{1992/04/06}{Macro added}
1397 % \begin{macro}{\eltEnd}
1398 %    \changes{2.0k}{1992/04/06}{Macro added}
1399 %    The macros |\eltStart| and |\eltEnd| are used to delimit a stack
1400 %    element. They are both empty.
1401 %    \begin{macrocode}
1402 \def\eltStart{}
1403 \def\eltEnd{}
1404 %    \end{macrocode}
1405 % \end{macro}
1406 % \end{macro}
1408 % \begin{macro}{\qStop}
1409 %    \changes{2.0k}{1992/04/06}{Macro added}
1410 %    The macro |\qStop| is a so-called `quark', a macro that expands to
1411 %    itself\footnote{The concept of `quarks' is developed for the
1412 %    \LaTeX3 project.}.
1413 %    \begin{macrocode}
1414 \def\qStop{\qStop}
1415 %    \end{macrocode}
1416 % \end{macro}
1418 % \begin{macro}{\pop}
1419 %    \changes{2.0k}{1992/04/06}{Macro added} The macro
1420 %    |\pop|\meta{stack}\meta{cs} `pops' the top element from the
1421 %    stack. It assigns the value of the top element to \meta{cs} and
1422 %    removes it from \meta{stack}. When \meta{stack} is empty a
1423 %    warning is issued and \meta{cs} is assigned an empty value.
1424 %    \begin{macrocode}
1425 \def\pop#1#2{%
1426   \ifx#1\empty
1427     \Msg{Warning: Found end guard without matching begin}%
1428     \let#2\empty
1429   \else
1430 %    \end{macrocode}
1431 %    To be able to `peel' off the first guard we use an extra macro
1432 %    |\popX| that receives both the expanded and the unexpanded stack
1433 %    in its arguments. The expanded stack is delimited with the quark
1434 %    |\qStop|.
1435 %    \begin{macrocode}
1436     \def\tmp{\expandafter\popX #1\qStop #1#2}%
1437     \expandafter\tmp\fi}
1438 %    \end{macrocode}
1439 % \begin{macro}{\popX}
1440 %    \changes{2.0k}{1992/04/06}{Macro added} When the stack is expanded
1441 %    the elements are surrounded with |\eltStart| and |\eltEnd|. The
1442 %    first element of the stack is assigned to |#4|.
1443 %    \begin{macrocode}
1444 \def\popX\eltStart #1\eltEnd #2\qStop #3#4{\def#3{#2}\def#4{#1}}
1445 %    \end{macrocode}
1446 % \end{macro}
1447 % \end{macro}
1449 % \begin{macro}{\push}
1450 %    \changes{2.0k}{1992/04/06}{Macro added}
1451 %    Guards can be pushed on the stack using the macro
1452 %    |\push|\meta{stack}\meta{guard}. Again we need a secondary macro
1453 %    (|\pushX|) that has both the expanded and the unexpanded stack as
1454 %    arguments.
1455 %    \begin{macrocode}
1456 \def\push#1#2{\expandafter\pushX #1\qStop #1{\eltStart #2\eltEnd}}
1457 %    \end{macrocode}
1458 % \begin{macro}{\pushX}
1459 %    \changes{2.0k}{1992/04/06}{Macro added}
1460 %    The macro |\pushX| picks up the complete expansion of the stack as
1461 %    its first argument and places the guard in |#3| on the `top'.
1462 %    \begin{macrocode}
1463 \def\pushX #1\qStop #2#3{\def #2{#3#1}}
1464 %    \end{macrocode}
1465 % \end{macro}
1466 % \end{macro}
1468 % \subsubsection{Programming structures}
1470 % \begin{macro}{\forlist}
1471 % \changes{2.0g}{1991/06/05}{Macro added.}
1472 %    When the program is used in interactive mode the
1473 %    user can supply a list of files that have to be processed.
1474 %    In order to process this list a for-loop is needed. This
1475 %    implementation of such a programming construct is based on the
1476 %    use of the \verb=\loop{=\meta{body}\verb=}\repeat= macro that
1477 %    is defined in plain \TeX\@. The syntax for this loop is:
1478 %    \begin{flushleft}
1479 %    |\for|\meta{control sequence} |:=| \meta{list}
1480 %    |\do|\\
1481 %    \meta{body}\\
1482 %    |\od|
1483 %    \end{flushleft}
1484 %    The \meta{list} should be a comma separated list.
1486 %    The first actions that have to be taken are to set the switch
1487 %    |\ifForlist| to \meta{true} and to store the loop condition
1488 %    in the macro |\ListCondition|. This is done using an
1489 %    |\edef| to allow for a control sequence that contains a
1490 %    \meta{list}.
1491 %    \begin{macrocode}
1492 \def\forlist#1:=#2\do#3\od{%
1493     \edef\ListCondition{#2}%
1494     \Forlisttrue
1495 %    \end{macrocode}
1496 %    Then we start the loop.
1497 %    We store the first element from the |\ListCondition| in the
1498 %    macro that was supplied as the first argument to |\forlist|.
1499 %    This element is then removed from the |\ListCondition|.
1500 %    \begin{macrocode}
1501     \loop
1502       \edef#1{\expandafter\FirstElt\ListCondition,\empty.}%
1503       \edef\ListCondition{\expandafter\OtherElts\ListCondition,\empty.}%
1504 %    \end{macrocode}
1505 %    When the first element from the \meta{list} is empty, we are done
1506 %    processing, so we switch |\ifForlist| to \meta{false}.
1507 %    When it is not empty we execute the third argument that should
1508 %    contain \TeX\ commands to execute.
1509 %    \begin{macrocode}
1510       \ifx#1\empty \Forlistfalse \else#3\fi
1511 %    \end{macrocode}
1512 %    Finally we test the switch |\ifForlist| to decide whether the
1513 %    loop has to be continued.
1514 %    \begin{macrocode}
1515       \ifForlist
1516     \repeat}
1517 %    \end{macrocode}
1518 % \begin{macro}{\FirstElt}
1519 % \changes{2.0g}{1991/06/05}{Macro added.}
1520 %    The macro |\FirstElt| is used to get the first element from a
1521 %    comma-separated list.
1522 %    \begin{macrocode}
1523 \def\FirstElt#1,#2.{#1}
1524 %    \end{macrocode}
1525 % \end{macro}
1526 % \begin{macro}{\OtherElts}
1527 % \changes{2.0g}{1991/06/05}{Macro added.}
1528 %    The macro |\OtherElts| is used to get all elements {\em but\/}
1529 %    the first element from a comma-separated list.
1530 %    \begin{macrocode}
1531 \def\OtherElts#1,#2.{#2}
1532 %    \end{macrocode}
1533 % \end{macro}
1534 % \end{macro}
1536 % \begin{macro}{\whileswitch}
1537 % \changes{2.0h}{1991/06/19}{Macro added.} When the program is used in
1538 %    interactive mode the user might want to process several files
1539 %    with different options or extensions.  This goal could be reached
1540 %    by running the program several times, but it is more
1541 %    user-friendly to ask if he would like to process more files when
1542 %    we are done processing his last request.  To accomplish this we
1543 %    need the implementation of a \texttt{while}-loop.  Again plain
1544 %    \TeX's \verb=\loop{=\meta{body}\verb=}\repeat= is used to
1545 %    implement this programming structure.
1547 %    The syntax for this loop is:
1548 %    \begin{flushleft}
1549 %    |\whileswitch|\meta{switch} \verb|\fi| \meta{list}
1550 %    \verb={=\meta{body}\verb=}=\\
1551 %    \end{flushleft}
1552 %    The first argument to this macro has to be a switch, defined
1553 %    using |\newif|; the second argument contains the statements
1554 %    to execute while the switch evaluates to \meta{true}.
1555 %    \begin{macrocode}
1556 \def\whileswitch#1\fi#2{#1\loop#2#1\repeat\fi}
1557 %    \end{macrocode}
1558 % \end{macro}
1560 % \changes{2.3a}{1995/08/18}{New mechanism: output streams allocation}
1562 % \subsubsection{Output streams allocator}
1564 % For each of sixteen output streams  available  we  have  a  macro
1565 % named |\s@0| through |\s@15| saying if the stream is assigned to a
1566 % file~(1) or not~(0). Initially all streams are not assigned.
1568 % We also declare 16 counters which will be needed by the conditional
1569 % code inclusion algorithm.
1571 %    \begin{macrocode}
1572 \ifx\@tempcnta\undefined \newcount\@tempcnta \fi
1573 \@tempcnta=0
1574 \loop
1575 \Name\chardef{s@\number\@tempcnta}=0
1576 \csname newcount\expandafter\endcsname%
1577   \csname off@\number\@tempcnta\endcsname
1578 \advance\@tempcnta1
1579 \ifnum\@tempcnta<16\repeat
1580 %    \end{macrocode}
1582 % We will use \emph{The \TeX book} style list to search through streams.
1584 %    \begin{macrocode}
1585 \let\s@do\relax
1586 \edef\@outputstreams{%
1587   \s@do\Name\noexpand{s@0}\s@do\Name\noexpand{s@1}%
1588   \s@do\Name\noexpand{s@2}\s@do\Name\noexpand{s@3}%
1589   \s@do\Name\noexpand{s@4}\s@do\Name\noexpand{s@5}%
1590   \s@do\Name\noexpand{s@6}\s@do\Name\noexpand{s@7}%
1591   \s@do\Name\noexpand{s@8}\s@do\Name\noexpand{s@9}%
1592   \s@do\Name\noexpand{s@10}\s@do\Name\noexpand{s@11}%
1593   \s@do\Name\noexpand{s@12}\s@do\Name\noexpand{s@13}%
1594   \s@do\Name\noexpand{s@14}\s@do\Name\noexpand{s@15}%
1595   \noexpand\@nostreamerror
1596   }
1597 %    \end{macrocode}
1599 % \begin{macro}{\@nostreamerror}\begin{macro}{\@streamfound}
1600 % When |\@outputstreams| is executed |\s@do| is defined to do
1601 % something on condition   of   some   test.    If   condition
1602 % always   fails   macro |\@nostreamerror| on the end of the list
1603 % causes an error. When condition succeeds  |\@streamfound|  is
1604 % called,  which  gobbles  rest of the list including the ending
1605 % |\@nostreamerror|. It also gobbles |\fi| ending the condition, so
1606 % the |\fi| is reinserted.
1608 %    \begin{macrocode}
1609 \def\@nostreamerror{\errmessage{No more output streams!}}
1610 \def\@streamfound#1\@nostreamerror{\fi}
1611 %    \end{macrocode}
1612 % \end{macro}\end{macro}
1614 % |\@stripstr| is auxiliary macro eating characters |\s@|
1615 % (backslash,s,@). It is defined in somewhat strange way since |\s@|
1616 % must have all category code  12  (other).  This  macro  is  used to
1617 % extract stream numbers from stream names.
1619 %    \begin{macrocode}
1620 \bgroup\edef\x{\egroup
1621  \def\noexpand\@stripstr\string\s@{}}
1623 %    \end{macrocode}
1625 % \begin{macro}{\StreamOpen}\begin{macro}{\StreamPut}
1626 % \begin{macro}{\StreamClose}
1627 % Here is stream opening operator. Its parameter should be a  macro
1628 % named the  same  as  the  external  file  being  opened. E.g., to
1629 % write to file |foo.tex|   use    |\StreamOpen\foo|,    then
1630 % |\StreamPut\foo|    and |\StreamClose\foo|.
1632 %    \begin{macrocode}
1633 \chardef\stream@closed=16
1634 \def\StreamOpen#1{%
1635   \chardef#1=\stream@closed
1636   \def\s@do##1{\ifnum##1=0
1637     \chardef#1=\expandafter\@stripstr\string##1 %
1638     \global\chardef##1=1 %
1639     \immediate\openout#1=\csname pth@\@stripstring#1\endcsname %
1640     \@streamfound
1641     \fi}
1642   \@outputstreams
1643   }
1644 \def\StreamClose#1{%
1645   \immediate\closeout#1%
1646   \def\s@do##1{\ifnum#1=\expandafter\@stripstr\string##1 %
1647     \global\chardef##1=0 %
1648     \@streamfound
1649     \fi}
1650   \@outputstreams
1651   \chardef#1=\stream@closed
1652   }
1653 \def\StreamPut{\immediate\write}
1654 %    \end{macrocode}
1655 % \end{macro}\end{macro}\end{macro}
1657 % \subsubsection{Input and Output}
1659 % \begin{macro}{\maybeMsg}
1660 % \begin{macro}{\showprogress}
1661 % \begin{macro}{\keepsilent}
1662 %    When this program is used it can optionally show its progress on
1663 %    the terminal. In that case it will write a special character to
1664 %    the terminal (and the transcript file) for each input line. This
1665 %    option is on by default when statistics are included in
1666 %    \texttt{docstrip.tex}. It is off when statistics are excluded. The
1667 %    commands |\showprogress| and |\keepsilent| can be used
1668 %    to choose otherwise.
1669 %    \begin{macrocode}
1670 \def\showprogress{\let\maybeMsg\message}
1671 \def\keepsilent{\let\maybeMsg\@gobble}
1672 %<*stats>
1673 \showprogress
1674 %</stats>
1675 %<-stats>\keepsilent
1676 %    \end{macrocode}
1677 % \end{macro}
1678 % \end{macro}
1679 % \end{macro}
1681 % \begin{macro}{\Msg}
1682 %    For displaying messages on the terminal the macro |\Msg| is
1683 %    defined to write {\em immediately\/} to |\ttyout|.
1684 %    \begin{macrocode}
1685 \def\Msg{\immediate\write\ttyout}
1686 %    \end{macrocode}
1687 % \end{macro}
1689 % \begin{macro}{\Ask}
1690 %    The macro
1691 %    \verb=\Ask{=\meta{cs}\verb=}{=\meta{string}\verb=}= is a
1692 %    slightly modified copy of the \LaTeX\ macro |\typein|. It is
1693 %    used to ask the user a question.  The \meta{string} will be
1694 %    displayed on his terminal and the response will be stored in the
1695 %    \meta{cs}. The trailing space left over from the carriage return
1696 %    is stripped off by the macro |\strip|. If the user just
1697 %    types a carriage return, the result will be an empty macro.
1698 % \changes{2.0i}{1991/06/27}{Added check for just \protect\meta{CR}}
1699 %    \begin{macrocode}
1700 \def\iden#1{#1}
1701 \def\strip#1#2 \@gobble{\def #1{#2}}
1702 \def\@defpar{\par}
1703 \def\Ask#1#2{%
1704     \message{#2}\read\ttyin to #1\ifx#1\@defpar\def#1{}\else
1705     \iden{\expandafter\strip
1706        \expandafter#1#1\@gobble\@gobble} \@gobble\fi}
1707 %    \end{macrocode}
1708 % \end{macro}
1710 % \begin{macro}{\OriginalAsk}
1711 % \changes{2.4e}{1996/10/24}{macro added (was in unpack.ins) (DPC)}
1712 %    \begin{macrocode}
1713 \let\OriginalAsk=\Ask
1714 %    \end{macrocode}
1715 % \end{macro}
1718 % \begin{macro}{\askonceonly}
1719 % \changes{2.4e}{1996/10/22}
1720 %      {macro added (essentially from unpack.ins) (DPC)}
1721 %    \begin{macrocode}
1722 \def\askonceonly{%
1723   \def\Ask##1##2{%
1724     \OriginalAsk{##1}{##2}%
1725     \global\let\Ask\OriginalAsk
1726     \Ask\noprompt{%
1727       By default you will be asked this question for every file.^^J%
1728       If you enter `y' now,^^J%
1729       I will assume `y' for all future questions^^J%
1730       without prompting.}%
1731     \ifx\y\noprompt\let\noprompt\yes\fi
1732     \ifx\yes\noprompt\gdef\Ask####1####2{\def####1{y}}\fi}}
1733 %    \end{macrocode}
1734 % \end{macro}
1736 % \subsubsection{Miscellaneous}
1738 % \begin{macro}{\@gobble}
1739 % \changes{2.0a}{1991/05/25}{Macro added.}
1740 %    A macro that has an argument and puts it in the bitbucket.
1741 %    \begin{macrocode}
1742 \def\@gobble#1{}
1743 %    \end{macrocode}
1744 % \end{macro}
1746 % \begin{macro}{\Endinput}
1747 % \changes{2.0f}{1991/06/04}{Macro added.} When a \texttt{doc} file
1748 %    contains a \verb+\endinput+ on a line by itself this normally
1749 %    means that anything following in this file should be ignored.
1750 %    Therefore we need a macro containing |\endinput| as its
1751 %    replacement text to check this against |\inLine| (the
1752 %    current line from the current input file). Of course the
1753 %    backslash has to have the correct |\catcode|. One way of
1754 %    doing this is feeding \verb=\\= to the |\string| operation
1755 %    and afterwards removing one of the |\| characters.
1756 %    \begin{macrocode}
1757 \edef\Endinput{\expandafter\@gobble\string\\endinput}
1758 %    \end{macrocode}
1759 % \end{macro}
1761 % \begin{macro}{\makeOther}
1762 %    During the process of reading a file with \TeX\ code the category
1763 %    code of all special characters has to be changed to \meta{other}.
1764 %    The macro |\makeOther| serves this purpose.
1765 %    \begin{macrocode}
1766 \def\makeOther#1{\catcode`#1=12\relax}
1767 %    \end{macrocode}
1768 % \end{macro}
1770 % \begin{macro}{\end}
1771 % \changes{2.0h}{1991/06/19}{Macro added.} For now we want the \ds{}
1772 %    program to be compatible with both plain \TeX\ and \LaTeX\@.
1773 %    \LaTeX\  hides plain \TeX{}'s |\end| command and
1774 %    calls it |\@@end|. We unhide it here.
1775 %    \begin{macrocode}
1776 \ifx\undefined\@@end\else\let\end\@@end\fi
1777 %    \end{macrocode}
1778 % \end{macro}
1780 % \begin{macro}{\@addto}
1781 %    A macro extending macro's definition. The trick with |\csname|
1782 %    is necessary to get around |\newtoks| being outer in plain \TeX{}
1783 %    and \LaTeX\ version 2.09.
1784 %    \begin{macrocode}
1785 \ifx\@temptokena\undefined \csname newtoks\endcsname\@temptokena\fi
1786 %    \end{macrocode}
1788 %    \begin{macrocode}
1789 \def\@addto#1#2{%
1790   \@temptokena\expandafter{#1}%
1791   \edef#1{\the\@temptokena#2}}
1792 %    \end{macrocode}
1793 % \end{macro}
1795 % \begin{macro}{\@ifpresent}
1796 %    This macro checks if its first argument  is  present  on  a
1797 %    list passed as the second argument. Depending on the result
1798 %    it executes either its third or fourth argument.
1800 %    \begin{macrocode}
1801 \def\@ifpresent#1#2#3#4{%
1802   \def\tmp##1#1##2\qStop{\ifx!##2!}%
1803   \expandafter\tmp#2#1\qStop #4\else #3\fi
1804   }
1805 %    \end{macrocode}
1806 % \end{macro}
1808 % \begin{macro}{\tospaces}
1809 %    This macro converts its argument delimited with |\secapsot| to
1810 %    appropriate number of spaces. We need this for smart displaying
1811 %    messages on the screen.
1813 %    |\@spaces| are used when we need many spaces in a row.
1814 %    \begin{macrocode}
1815 \def\tospaces#1{%
1816   \ifx#1\secapsot\secapsot\fi\space\tospaces}
1817 \def\secapsot\fi\space\tospaces{\fi}
1818 \def\@spaces{\space\space\space\space\space}
1819 %    \end{macrocode}
1820 % \end{macro}
1822 % \begin{macro}{\uptospace}
1823 % \changes{2.3c}{1995/08/24}{Macro added}
1824 %    This  macro extracts from its argument delimited with |\qStop|
1825 %    part up to first occurrence of space.
1826 %    \begin{macrocode}
1827 \def\uptospace#1 #2\qStop{#1}
1828 %    \end{macrocode}
1829 % \end{macro}
1831 % \begin{macro}{\afterfi}
1832 % \changes{2.3c}{1995/09/04}{Macro added}
1833 %    This macro can be used in conditionals to perform some actions
1834 %    (its  first  parameter) after the condition is completed (i.e.
1835 %    after  reading the matching |\fi|. Second parameter is used to
1836 %    gobble the rest of |\if ... \fi|  construction  (some  |\else|
1837 %    maybe). Note that this won't work in nested |\if|s!
1838 %    \begin{macrocode}
1839 \def\afterfi#1#2\fi{\fi#1}
1840 %    \end{macrocode}
1841 % \end{macro}
1842 % \begin{macro}{\@ifnextchar}
1843 % \changes{2.3e}{1995/09/25}{Macro added}
1844 %    This is one of \LaTeX's  macros  not  defined  by  plain.   My
1845 %    devious   definition   differs   from  the  standard  one  but
1846 %    functionality is the same.
1847 %    \begin{macrocode}
1848 \def\@ifnextchar#1#2#3{\bgroup
1849   \def\reserved@a{\ifx\reserved@c #1 \aftergroup\@firstoftwo
1850     \else \aftergroup\@secondoftwo\fi\egroup
1851     {#2}{#3}}%
1852   \futurelet\reserved@c\@ifnch
1853   }
1854 \def\@ifnch{\ifx \reserved@c \@sptoken \expandafter\@xifnch
1855       \else \expandafter\reserved@a
1856       \fi}
1857 \def\@firstoftwo#1#2{#1}
1858 \def\@secondoftwo#1#2{#2}
1859 \iden{\let\@sptoken= } %
1860 \iden{\def\@xifnch} {\futurelet\reserved@c\@ifnch}
1861 %    \end{macrocode}
1862 % \end{macro}
1863 % \begin{macro}{\kernel@ifnextchar}
1864 %   \changes{v2.5d}{2005/07/29}{Added macro}
1865 %   The 2003/12/01 release of \LaTeX\ incorporated this macro to avoid
1866 %   problems with \texttt{amsmath} but this also means that we have to
1867 %   perform the same trick here when people use \LaTeX\ on a
1868 %   installation file containing |\ProvidesFile|.
1869 %    \begin{macrocode}
1870 \let\kernel@ifnextchar\@ifnextchar
1871 %    \end{macrocode}
1872 % \end{macro}
1875 % \subsection{The evaluation of boolean expressions}
1877 %    For clarity we repeat here the syntax for the boolean expressions
1878 %    in a somewhat changed but equivalent way:
1880 % \DeleteShortVerb\|
1881 %    \begin{tabular}{lcl}
1882 %    \meta{Expression} & $::=$ & \meta{Secondary} $|$
1883 %                            \meta{Secondary} \{\texttt{|}, \texttt{,}\}
1884 %                              \meta{Expression}\\
1885 %    \meta{Secondary}    & $::=$ & \meta{Primary} $|$
1886 %                         \meta{Primary} \texttt{\&}
1887 %                              \meta{Secondary}\\
1888 %    \meta{Primary}  & $::=$ &
1889 %                         \meta{Terminal} $|$ \texttt{!}\meta{Primary}
1890 %                                  $|$
1891 %                         \texttt{(}\meta{Expression}\texttt{)}\\
1892 %    \end{tabular}
1894 %    The \texttt{|} stands for disjunction, the \texttt{\&} stands for
1895 %    conjunction and the \texttt{!}\ stands for negation. The
1896 %    \meta{Terminal} is any sequence of letters and evaluates to
1897 %    \meta{true} iff it occurs in the list of options that have to be
1898 %    included.
1899 % \MakeShortVerb\|
1901 %    Since we can generate multiple output files  from  one  input,
1902 %    same  guard  expressions  can  be  computed several times with
1903 %    different options. For that reason we  first  ``compile''  the
1904 %    expression   to  the  form  of  one  parameter  macro  |\Expr|
1905 %    expanding to nested |\if|s that when  given  current  list  of
1906 %    options  produces  1  or  0  as  a  result. The idea is to say
1907 %    |\if1\Expr{|\meta{current set  of  options}|}...\fi|  for  all
1908 %    output files.
1910 %    Here is a table recursively defining  translations  for  right
1911 %    sides  of the grammar. $\tau(X)$ denotes translation of~$X$.
1913 % \DeleteShortVerb\|
1914 % \MakeShortVerb\"
1915 %    \begingroup
1916 %     \addtolength\arraycolsep{-2.1pt}
1917 %    \begin{eqnarray*}
1918 %    \tau(\meta{Terminal})&=&"\t@<Terminal>,#1,<Terminal>,\qStop"\\
1919 %   \tau(!\meta{Primary})&=&"\if1"\,\tau(\meta{Primary})\,"0\else1\fi"\\
1920 %    \tau(\mbox{\texttt{(}\meta{Expression}\texttt{)}})
1921 %                         &=&\tau(\meta{Expression})\\
1922 %    \tau(\mbox{\meta{Primary}\texttt{\&}\meta{Secondary}})
1923 %                         &=&"\if0"\,\tau(\meta{Primary})\,"0\else"
1924 %                             \,\tau(\meta{Secondary})\,"\fi"\\
1925 %    \tau(\mbox{\meta{Secondary}\texttt{|}\meta{Expression}})
1926 %                         &=&"\if1"\,\tau(\meta{Secondary})\,"1\else"
1927 %                            \,\tau(\meta{Expression})\,"\fi"
1928 %    \end{eqnarray*}
1929 %    \endgroup
1930 % \DeleteShortVerb\"
1931 % \MakeShortVerb\|
1932 %    |\t@<Terminal>|  denotes macro with name constructed from |t@|
1933 %    with appended tokens of terminal. E.g., for terminal |foo|  the
1934 %    translation would be
1935 %\begin{verbatim}
1936 %    \t@foo,#1,foo,\qStop
1937 %\end{verbatim}
1938 %    This will  end up in definition of |\Expr|,  so |#1| here will
1939 %    be substituted by current list  of  options  when  |\Expr|  is
1940 %    called. Macro |\t@foo| would be defined as
1941 %\begin{verbatim}
1942 %    \def\t@foo#1,foo,#2\qStop{\ifx>#2>0\else1\fi}
1943 %\end{verbatim}
1944 %    When  called  as  above  this  will  expand to |1| if |foo| is
1945 %    present on current list of options and to |0| otherwise.
1947 %    Macros  below  work  in  ``almost  expand-only''   mode   i.e.
1948 %    expression is analyzed only by expansion but we have to define
1949 %    some macros on the way (e.g., |\Expr| and |\t@foo|).
1951 %    The   first   parameter   of   each   of   these   macros   is
1952 %    ``continuation''   (in  the  sense  similar  to  the  language
1953 %    \textsc{Scheme}). Continuation is a function of at  least  one
1954 %    argument  (parameter)  being  the  value  of previous steps of
1955 %    computation.   For   example   macro   |\Primary|   constructs
1956 %    translation of \meta{Primary} expression. When it decides that
1957 %    expression is completed it calls its continuation  (its  first
1958 %    argument)   passing   to  it  whole  constructed  translation.
1959 %    Continuation may expect more arguments if it wants to see what
1960 %    comes next on the input.
1962 %    We  will perform recursive descent parse, but definitions will
1963 %    be presented in bottom-up order.
1965 % \begin{macro}{\Terminal}
1967 %    \meta{Terminal}s are  recognized  by  macro  |\Terminal|.  The
1968 %    proper   way   of   calling  it  is  |\Terminal{|\meta{current
1969 %    continuation}|}{}|.     Parameters     are:      continuation,
1970 %    \meta{Terminal}  so  far  and  next  character from the input.
1971 %    Macro checks if |#3| is one of terminal-ending characters  and
1972 %    then  takes  appropriate  actions.  Since  there  are 7 ending
1973 %    chars  and probably one |\csname| costs  less  than  7  nested
1974 %    |\if|s we construct a name and check if it is defined.
1976 %    We must expand |\ifx| completely before taking next actions so
1977 %    we use |\afterfi|.
1978 %    \begin{macrocode}
1979 \def\Terminal#1#2#3{%
1980   \expandafter\ifx\csname eT@#3\endcsname\relax
1981 %    \end{macrocode}
1982 %    If condition is true |#3| belongs to  current  \meta{Terminal}
1983 %    so we append it to \meta{Terminal}-so-far and call |\Terminal|
1984 %    again.
1985 %    \begin{macrocode}
1986     \afterfi{\Terminal{#1}{#2#3}}\else
1987 %    \end{macrocode}
1988 %    When condition is false it's time to end  the  \meta{Terminal}
1989 %    so we call macro |\TerminalX|. Next character is reinserted to
1990 %    the input.
1992 %    In both cases continuation is passed unchanged.
1993 %    \begin{macrocode}
1994     \afterfi{\TerminalX{#1}{#2}#3}\fi
1995   }
1996 %    \end{macrocode}
1997 % \end{macro}
1999 % \begin{macro}{\eT@}
2000 %    Here we define macros marking characters  that  cannot  appear
2001 %    inside  terminal.  The value is not important as long as it is
2002 %    different from |\relax|.
2003 %    \begin{macrocode}
2004 \Name\let{eT@>}=1
2005 \Name\let{eT@&}=1 \Name\let{eT@!}=1
2006 \Name\let{eT@|}=1 \Name\let{eT@,}=1
2007 \Name\let{eT@(}=1 \Name\let{eT@)}=1
2008 %    \end{macrocode}
2009 % \end{macro}
2011 % \begin{macro}{\TerminalX}
2012 %    This macro should end scanning of \meta{Terminal}.  Parameters
2013 %    are continuation and gathered tokens of \meta{Terminal}.
2015 %    Macro starts by issuing an error message if \meta{Terminal} is
2016 %    empty.
2017 %    \begin{macrocode}
2018 \def\TerminalX#1#2{%
2019   \ifx>#2> \errmessage{Error in expression: empty terminal}\fi
2020 %    \end{macrocode}
2021 %    Then  a  macro  is  constructed  for  checking   presence   of
2022 %    \meta{Terminal} in options list.
2023 %    \begin{macrocode}
2024   \Name\def{t@#2}##1,#2,##2\qStop{\ifx>##2>0\else1\fi}%
2025 %    \end{macrocode}
2026 %    And  then  current  continuation is called with translation of
2027 %    \meta{Terminal} according to formula
2028 %    $$\tau(\meta{Terminal})=|\t@<Terminal>,#1,<Terminal>,\qStop|$$
2029 %    \begin{macrocode}
2030   #1{\Name\noexpand{t@#2},##1,#2,\noexpand\qStop}%
2031   }
2032 %    \end{macrocode}
2033 % \end{macro}
2035 % \begin{macro}{\Primary}
2036 %    Parameters are continuation and next character from the input.
2038 %    According to the syntax \meta{Primari}es can have three forms.
2039 %    This  makes us use even more dirty tricks than usual. Note the
2040 %    |\space| after a series of |\ifx|s. This  series  produces  an
2041 %    one  digit  number of case to be executed. The number is given
2042 %    to  |\ifcase|  and  |\space|  stops  \TeX{}  scanning  for   a
2043 %    \meta{number}.  Use of |\ifcase| gives possibility to have one
2044 %    of three actions  selected  without  placing  them  in  nested
2045 %    |\if|s and so to use |\afterfi|.
2046 %    \begin{macrocode}
2047 \def\Primary#1#2{%
2048   \ifcase \ifx!#20\else\ifx(#21\else2\fi\fi\space
2049 %    \end{macrocode}
2050 %    First case is for |!| i.e.  negated \meta{Primary}.   In  this
2051 %    case   we  call  |\Primary|  recursively  but  we  create  new
2052 %    continuation:   macro  |\NPrimary|  that  will  negate  result
2053 %    passed  by  |\Primary|  and  pass  it  to current continuation
2054 %    (|#1|).
2055 %    \begin{macrocode}
2056   \afterfi{\Primary{\NPrimary{#1}}}\or
2057 %    \end{macrocode}
2058 %    When next character is |(| we call |\Expression| giving it  as
2059 %    continuation  macro  |\PExpression|  which  will just pass the
2060 %    result up but ensuring first that a |)| comes next.
2061 %    \begin{macrocode}
2062   \afterfi{\Expression{\PExpression{#1}}}\or
2063 %    \end{macrocode}
2064 %    Otherwise we start a \meta{Terminal}. |#2| is  not  passed  as
2065 %    \meta{Terminal}-so-far  but reinserted to input since we didn't
2066 %    check if it can appear in a \meta{Terminal}.
2067 %    \begin{macrocode}
2068   \afterfi{\Terminal{#1}{}#2}\fi
2069   }
2070 %    \end{macrocode}
2071 % \end{macro}
2073 % \begin{macro}{\NPrimary}
2074 %    Parameters    are   continuation   and   previously   computed
2075 %    \meta{Primary}.
2077 %    This macro negates result of previous  computations  according
2078 %    to the rule
2079 %    $$\tau(!\meta{Primary})
2080 %         =|\if1|\,\tau(\meta{Primary})\,|0\else1\fi|$$
2081 %    \begin{macrocode}
2082 \def\NPrimary#1#2{%
2083   #1{\noexpand\if1#20\noexpand\else1\noexpand\fi}%
2084   }
2085 %    \end{macrocode}
2086 % \end{macro}
2088 % \begin{macro}{\PExpression}
2089 %    Parameters: continuation,  \meta{Expression},  next  character
2090 %    from  input. We are checking if character is |)| and then pass
2091 %    unchanged result to our continuation.
2092 %    \begin{macrocode}
2093 \def\PExpression#1#2#3{%
2094   \ifx)#3\else
2095     \errmessage{Error in expression: expected right parenthesis}\fi
2096   #1{#2}}
2097 %    \end{macrocode}
2098 % \end{macro}
2100 % \begin{macro}{\Secondary}
2101 %    Each \meta{Secondary} expression starts  with  \meta{Primary}.
2102 %    Next checks will be performed by |\SecondaryX|.
2103 %    \begin{macrocode}
2104 \def\Secondary#1{%
2105   \Primary{\SecondaryX{#1}}}
2106 %    \end{macrocode}
2107 % \end{macro}
2109 % \begin{macro}{\SecondaryX}
2110 %    Parameters:  continuation, translation of \meta{Primary}, next
2111 %    character. We start by checking if next character is |&|.
2112 %    \begin{macrocode}
2113 \bgroup\catcode`\&=12
2114 \gdef\SecondaryX#1#2#3{%
2115   \ifx&#3%
2116 %    \end{macrocode}
2117 %    If it is  we  should  parse  next  \meta{Secondary}  and  then
2118 %    combine  it with results so far. Note that |\SecondaryXX| will
2119 %    have 3 parameters.
2120 %    \begin{macrocode}
2121   \afterfi{\Secondary{\SecondaryXX{#1}{#2}}}\else
2122 %    \end{macrocode}
2123 %    Otherwise   \meta{Secondary}   turned   out   to    be    just
2124 %    \meta{Primary}. We call continuation passing to it translation
2125 %    of that \meta{Primary} not forgetting to reinsert |#3| to  the
2126 %    input as it does not belong here.
2127 %    \begin{macrocode}
2128   \afterfi{#1{#2}#3}\fi
2129   }
2130 \egroup
2131 %    \end{macrocode}
2132 % \end{macro}
2134 % \begin{macro}{\SecondaryXX}
2135 %    Parameters:   continuation,   translation  of  \meta{Primary},
2136 %    translation of \meta{Secondary}. We construct  translation  of
2137 %    whole construction according to the rule:
2138 %    $$\tau(\mbox{\meta{Primary}\texttt{\&}\meta{Secondary}})
2139 %                         =|\if0|\,\tau(\meta{Primary})\,|0\else|
2140 %                             \,\tau(\meta{Secondary})\,|\fi| $$
2141 %    and pass it to our continuation.
2142 %    \begin{macrocode}
2143 \def\SecondaryXX#1#2#3{%
2144   #1{\noexpand\if0#20\noexpand\else#3\noexpand\fi}}
2145 %    \end{macrocode}
2146 % \end{macro}
2148 % \begin{macro}{\Expression}
2149 %    Every   \meta{Expression}  starts  with  \meta{Secondary}.  We
2150 %    construct new continuation and pass it to |\Secondary|.
2151 %    \begin{macrocode}
2152 \def\Expression#1{%
2153   \Secondary{\ExpressionX{#1}}}
2154 %    \end{macrocode}
2155 % \end{macro}
2157 % \begin{macro}{\ExpressionX}
2158 %    Parameters:  continuation,  translation  of  \meta{Secondary},
2159 %    next   character.   We   perform   check   if   character   is
2160 %    \texttt{\char`\|} or |,|.
2161 %    \begin{macrocode}
2162 \def\ExpressionX#1#2#3{%
2163   \if0\ifx|#31\else\ifx,#31\fi\fi0
2164 %    \end{macrocode}
2165 %    If it is not \meta{Expression} is just a \meta{Secondary}.  We
2166 %    pass its translation to continuation and reinsert |#3|.
2167 %    \begin{macrocode}
2168   \afterfi{#1{#2}#3}\else
2169 %    \end{macrocode}
2170 %    If  we  are  dealing  with complex \meta{Expression} we should
2171 %    parse another |\Expression| now.
2172 %    \begin{macrocode}
2173   \afterfi{\Expression{\ExpressionXX{#1}{#2}}}\fi
2174   }
2175 %    \end{macrocode}
2176 % \end{macro}
2178 % \begin{macro}{\ExpressionXX}
2179 %    Parameters:  continuation,  translation  of  \meta{Secondary},
2180 %    translation of \meta{Expression}.
2181 %    We finish up translating  of  \meta{Expression}  according  to
2182 %    the formula:
2183 %    $$\tau(\mbox{\meta{Secondary}\texttt{\char`\|}\meta{Expression}})
2184 %                         =|\if1|\,\tau(\meta{Secondary})\,|1\else|
2185 %                            \,\tau(\meta{Expression})\,|\fi|$$
2186 %    \begin{macrocode}
2187 \def\ExpressionXX#1#2#3{%
2188   #1{\noexpand\if1#21\noexpand\else#3\noexpand\fi}}
2189 %    \end{macrocode}
2190 % \end{macro}
2192 % \begin{macro}{\StopParse}
2193 %    Here is initial continuation for whole parse process. It  will
2194 %    be  used  by  |\Evaluate|. Note that we assume that expression
2195 %    has |>| on its end.  This macro  eventually  defines  |\Expr|.
2196 %    Parameters:   translation  of whole \meta{Expression} and next
2197 %    character from input.
2198 %    \begin{macrocode}
2199 \def\StopParse#1#2{%
2200   \ifx>#2 \else\errmessage{Error in expression: spurious #2}\fi
2201   \edef\Expr##1{#1}}
2202 %    \end{macrocode}
2203 % \end{macro}
2205 % \begin{macro}{\Evaluate}
2206 %    This macro is used to start  parsing.  We  call  |\Expression|
2207 %    with  continuation  defined  above.   On  end of expression we
2208 %    append a |>|.
2209 %    \begin{macrocode}
2210 \def\Evaluate#1{%
2211   \Expression\StopParse#1>}
2212 %    \end{macrocode}
2213 % \end{macro}
2215 % \subsection{Processing the input lines}
2217 % \begin{macro}{\normalLine}
2218 %    The macro |\normalLine| writes its argument (which has to be
2219 %    delimited with |\endLine|) on all active output files i.e.
2220 %    those with off-counters equal to zero.
2221 %    If statistics are included, the counter
2222 %    |\codeLinesPassed| is incremented by $1$.
2223 %    \begin{macrocode}
2224 \def\normalLine#1\endLine{%
2225 %<*stats>
2226   \advance\codeLinesPassed\@ne
2227 %</stats>
2228   \maybeMsg{.}%
2229   \def\inLine{#1}%
2230   \let\do\putline@do
2231   \activefiles
2232   }
2233 %    \end{macrocode}
2234 % \end{macro}
2236 % \begin{macro}{\putline@do}
2237 % \changes{2.3b}{1995/08/22}{Change for pre-constructed
2238 %                            off-counters' names}
2239 %    This is a value for |\do| when copying line to output files.
2240 %    \begin{macrocode}
2241 \def\putline@do#1#2#3{%
2242   \StreamPut#1{\inLine}}
2243 %    \end{macrocode}
2244 % \end{macro}
2246 % \begin{macro}{\removeComment}
2247 %    The macro |\removeComment| throws its argument (which has to be
2248 %    delimited with |\endLine|) away. When statistics are included
2249 %    in the program the removed comment is counted.
2250 %    \begin{macrocode}
2252 \def\removeComment#1\endLine{%
2253 %<*stats>
2254     \advance\commentsRemoved\@ne
2255 %</stats>
2256     \maybeMsg{\perCent}}
2257 %    \end{macrocode}
2258 % \end{macro}
2260 % \begin{macro}{\putMetaComment}
2261 % \changes{2.3e}{1996/09/16}{Introduced \cs{MetaPrefix}}
2262 %    If a line starts with two consecutive percent signs, it is
2263 %    considered to be a {\em MetaComment\/}. Such a comment line is
2264 %    passed on to the output file unmodified.
2265 %    \begin{macrocode}
2266 \bgroup\catcode`\%=12
2267 \iden{\egroup
2268 \def\putMetaComment%}#1\endLine{%
2269 %    \end{macrocode}
2270 %    If statistics are included the line is counted.
2271 %    \begin{macrocode}
2272 %<*stats>
2273   \advance\commentsPassed\@ne
2274 %</stats>
2275 %    \end{macrocode}
2276 %    The macro |\putMetaComment| has one argument, delimited with
2277 %    |\endLine|. It brings the source line with |%%| stripped. We
2278 %    prepend to it |\MetaPrefix| (which can be different from |%%|)
2279 %    and send the line to all active files.
2280 %    \begin{macrocode}
2281   \edef\inLine{\MetaPrefix#1}%
2282   \let\do\putline@do
2283   \activefiles
2284   }
2285 %    \end{macrocode}
2286 % \end{macro}
2289 % \begin{macro}{\processLine}
2290 % \changes{2.3a}{1995/08/18}{Adaptation for concurrent version}
2291 % \changes{2.3a}{1995/08/20}{Trying to avoid assignments}
2292 %    Each line that is read from the input stream has to be processed
2293 %    to see if it has to be written on the output stream. This task
2294 %    is performed by calling the macro |\processLine|.
2295 %    In order to do
2296 %    that, it needs to check whether the line starts with a
2297 %    `\texttt{\%}'.  Therefore the macro is globally defined within a
2298 %    group. Within this group the category code of `\texttt{\%}' is
2299 %    changed to 12 (other).  Because a comment character is needed,
2300 %    the category code of `\texttt{*}' is changed to 14 (comment
2301 %    character).
2303 %    The macro increments counter |\processedLines| by $1$ if
2304 %    statistics are included. We cannot include this line with
2305 %    |%<*stats>| since the category of \texttt{\%} is changed and the
2306 %    file must be loadable unstripped. So the whole definition is
2307 %    repeated embedded in guards.
2309 %    The next token from the input stream is passed in |#1|. If it is
2310 %    a `\texttt{\%}' further processing has to be done by
2311 %    |\processLineX|; otherwise this is normal (not commented out)
2312 %    line.
2314 %    In either case the character read is reinserted to the input
2315 %    as it may have to be written out.
2317 %    \begin{macrocode}
2318 %<*!stats>
2319 \begingroup
2320 \catcode`\%=12 \catcode`\*=14
2321 \gdef\processLine#1{*
2322   \ifx%#1
2323     \expandafter\processLineX
2324   \else
2325     \expandafter\normalLine
2326   \fi
2327   #1}
2328 \endgroup
2329 %</!stats>
2330 %<*stats>
2331 \begingroup
2332 \catcode`\%=12 \catcode`\*=14
2333 \gdef\processLine#1{*
2334   \advance\processedLines\@ne
2335   \ifx%#1
2336     \expandafter\processLineX
2337   \else
2338     \expandafter\normalLine
2339   \fi
2340   #1}
2341 \endgroup
2342 %</stats>
2343 %    \end{macrocode}
2344 % \end{macro}
2347 % \begin{macro}{\processLineX}
2348 % \changes{2.3a}{1995/08/20}{Trying to avoid assignments}
2349 %    This macro is also defined within a group,
2350 %    because it also has to check if the next
2351 %    token in the input stream is a `\texttt{\%}' character.
2353 %    If the second token in the current line happens to be a
2354 %    `\texttt{\%}', a \meta{MetaComment} has been found. This has to
2355 %    be copied in its entirety to the output.  Another possible second
2356 %    character is `\texttt{<}', which introduces a guard expression.
2357 %    The processing of such an expression is started by calling
2358 %    |\checkOption|.
2360 %    When the token was neither a `\texttt{\%}' nor a `\texttt{<}',
2361 %    the line contains a normal comment that has to be removed.
2363 %    We express conditions in such a way that all actions appear
2364 %    on first nesting level of |\if|s. In such conditions just one
2365 %    expandafter pushes us outside whole construction. A thing to
2366 %    watch here is |\relax|. It stops search for numeric constant.
2367 %    If it wasn't here \TeX\ would expand the first case of |\ifcase|
2368 %    before knowing the value.
2370 %    \begin{macrocode}
2371 \begingroup
2372 \catcode`\%=12 \catcode`\*=14
2373 \gdef\processLineX%#1{*
2374   \ifcase\ifx%#10\else
2375          \ifx<#11\else 2\fi\fi\relax
2376     \expandafter\putMetaComment\or
2377     \expandafter\checkOption\or
2378     \expandafter\removeComment\fi
2379   #1}
2380 \endgroup
2381 %    \end{macrocode}
2382 % \end{macro}
2384 % \subsection{The handling of options}
2386 % \begin{macro}{\checkOption}
2387 %    \changes{2.3a}{1995/08/18}{Adapted to concurrent version}
2388 %  \changes{2.3a}{1995/08/20}{Trying to avoid assignments}
2389 %  \changes{2.3e}{1996/09/16}{Verbatim mode}
2390 %    When the macros that process a line have found that the line
2391 %    starts with `\texttt{\%<}', a guard line has been encountered.
2392 %    The first character of a guard can be an asterisk (\texttt{*}), a
2393 %    slash (\texttt{/}) a plus (\texttt{+}), a minus (\texttt{-}), a
2394 %    less-than sign (\texttt{<}) starting verbatim mode or
2395 %    any other character that can be found in an option name. This
2396 %    means that we have to peek at the next token and
2397 %    decide what kind of guard we have.
2399 %    We reinsert |#1| as it may be needed by |\doOption|.
2400 %    \begin{macrocode}
2401 \def\checkOption<#1{%
2402   \ifcase
2403     \ifx*#10\else \ifx/#11\else
2404     \ifx+#12\else \ifx-#13\else
2405     \ifx<#14\else 5\fi\fi\fi\fi\fi\relax
2406   \expandafter\starOption\or
2407   \expandafter\slashOption\or
2408   \expandafter\plusOption\or
2409   \expandafter\minusOption\or
2410   \expandafter\verbOption\or
2411   \expandafter\doOption\fi
2412   #1}
2413 %    \end{macrocode}
2414 % \end{macro}
2416 % \begin{macro}{\doOption}
2417 %    When no guard modifier is found by |\checkOptions|, the
2418 %    macro |\doOption| is called. It evaluates a boolean
2419 %    expression. The result of this evaluation is stored in
2420 %    |\Expr|. The guard only affects the current
2421 %    line,  so  |\do|  is  defined in such a way that depending on the
2422 %    result of the  test |\if1\Expr{|\meta{options}|}|,  the  current
2423 %    line is either copied to the output stream or removed. Then
2424 %    the test is computed for all active output files.
2425 %    \begin{macrocode}
2426 \def\doOption#1>#2\endLine{%
2427   \maybeMsg{<#1 . >}%
2428   \Evaluate{#1}%
2429   \def\do##1##2##3{%
2430     \if1\Expr{##2}\StreamPut##1{#2}\fi
2431     }%
2432   \activefiles
2433   }
2434 %    \end{macrocode}
2435 % \end{macro}
2437 % \begin{macro}{\plusOption}
2438 %    When a `\texttt{+}' is found as a guard modifier,
2439 %    |\plusOption| is called. This macro is very similar to
2440 %    |\doOption|, the only difference being that displayed
2441 %    message now contains `\texttt{+}'.
2442 %    \begin{macrocode}
2443 \def\plusOption+#1>#2\endLine{%
2444   \maybeMsg{<+#1 . >}%
2445   \Evaluate{#1}%
2446   \def\do##1##2##3{%
2447     \if1\Expr{##2}\StreamPut##1{#2}\fi
2448     }%
2449   \activefiles
2450   }
2451 %    \end{macrocode}
2452 % \end{macro}
2454 % \begin{macro}{\minusOption}
2455 %    When a `\texttt{-}' is found as a guard modifier,
2456 %    |\minusOption| is called. This macro is very similar to
2457 %    |\plusOption|, the difference is that condition is negated.
2458 %    \begin{macrocode}
2459 \def\minusOption-#1>#2\endLine{%
2460   \maybeMsg{<-#1 . >}%
2461   \Evaluate{#1}%
2462   \def\do##1##2##3{%
2463     \if1\Expr{##2}\else \StreamPut##1{#2}\fi
2464     }%
2465   \activefiles
2466   }
2467 %    \end{macrocode}
2468 % \end{macro}
2470 % \begin{macro}{\starOption}
2471 %    \changes{2.3a}{1995/08/18}{Adapted to concurrent version}
2472 %    When a `\texttt{*}' is found as a guard modifier,
2473 %    |\starOption| is called. In this case a block of code will
2474 %    be included in the output on the condition that the guard
2475 %    expression evaluates to \meta{true}.
2477 %    The current line is gobbled as |#2|, because it only contains
2478 %    the guard and possibly a comment.
2480 %    \begin{macrocode}
2481 \def\starOption*#1>#2\endLine{%
2482 %    \end{macrocode}
2483 %    First we optionally write
2484 %    a message to the terminal to indicate that a new option starts
2485 %    here.
2486 %    \begin{macrocode}
2487   \maybeMsg{<*#1}%
2488 %    \end{macrocode}
2489 %    Then we push the current contents of |\blockHead| on the
2490 %    stack of blocks, |\guardStack| and increment  the counter
2491 %    |\blockLevel| to indicate that we are now one level of
2492 %    nesting deeper.
2493 % \changes{2.0k}{1992/04/06}{Use new stack mechanism}
2494 % \changes{2.0k}{1992/04/09}{The macro that holds the guard needs to be
2495 %    expanded}
2496 %    \begin{macrocode}
2497   \expandafter\push\expandafter\guardStack\expandafter{\blockHead}%
2498   \advance\blockLevel\@ne
2499 %    \end{macrocode}
2500 %    The guard for this block of code is now stored in
2501 %    |\blockHead|.
2502 %    \begin{macrocode}
2503   \def\blockHead{#1}%
2504 %    \end{macrocode}
2505 %    Now we evaluate guard expression for all output files
2506 %    updating off-counters. Then we create new list of active
2507 %    output files. Only files that were active in the outer block
2508 %    can remain active now.
2509 %    \begin{macrocode}
2510   \Evaluate{#1}%
2511   \let\do\checkguard@do
2512   \outputfiles
2513   \let\do\findactive@do
2514   \edef\activefiles{\activefiles}
2515   }
2516 %    \end{macrocode}
2517 % \end{macro}
2519 % \begin{macro}{\checkguard@do}
2520 % \changes{2.3b}{1995/08/22}{Change for pre-constructed
2521 %                            off-counters' names}
2522 %    This form of |\do| updates off-counts according to the value of
2523 %    guard expression.
2524 %    \begin{macrocode}
2525 \def\checkguard@do#1#2#3{%
2526 %    \end{macrocode}
2527 %    If this block of code occurs inside another block of code that is
2528 %    {\em not\/} included in the output, we increment the off counter.
2529 %    In that case the guard expression will not be
2530 %    evaluated, because a block inside another block that is excluded
2531 %    from the output will also be excluded, regardless of the
2532 %    evaluation of its guard.
2533 %    \begin{macrocode}
2534   \ifnum#3>0
2535     \advance#3\@ne
2536 %    \end{macrocode}
2537 %    When the off count has  value 0, we have
2538 %    to evaluate the guard expression. If the result is \meta{false}
2539 %    we increase the off-counter.
2540 %    \begin{macrocode}
2541   \else
2542     \if1\Expr{#2}\else
2543       \advance#3\@ne\fi
2544   \fi}
2545 %    \end{macrocode}
2546 % \end{macro}
2548 % \begin{macro}{\findactive@do}
2549 % \changes{2.3b}{1995/08/22}{Change for pre-constructed
2550 %                            off-counters' names}
2551 %    This form of |\do| picks elements of output files list which
2552 %    have off-counters equal to zero.
2553 %    \begin{macrocode}
2554 \def\findactive@do#1#2#3{%
2555   \ifnum#3=0
2556     \noexpand\do#1{#2}#3\fi}
2557 %    \end{macrocode}
2558 % \end{macro}
2560 % \begin{macro}{\slashOption}
2561 %    \changes{2.3a}{1995/08/18}{Adapted for concurrent version}
2562 %    The macro |\slashOption| is the counterpart to
2563 %    |\starOption|.  It indicates the end of a block of
2564 %    conditionally included code.  We store the argument in the
2565 %    temporary control sequence |\tmp|.
2566 %    \begin{macrocode}
2567 \def\slashOption/#1>#2\endLine{%
2568   \def\tmp{#1}%
2569 %    \end{macrocode}
2570 %    When the counter |\blockLevel| has a value less than $1$,
2571 %    this `end-of-block' line has no corresponding `start-of-block'.
2572 %    Therefore we signal an error and ignore this end of block.
2573 %    \begin{macrocode}
2574   \ifnum\blockLevel<\@ne
2575     \errmessage{Spurious end block </\tmp> ignored}%
2576 %    \end{macrocode}
2577 %    Next we compare the contents of |\tmp| with the contents
2578 %    of |\blockHead|. The latter macro contains the last guard for
2579 %    a block of code that was encountered. If the contents match, we
2580 %    pop the previous guard from the stack.
2581 %    \changes{2.0k}{1992/04/06}{Use new stack mechanism}
2582 %    \begin{macrocode}
2583   \else
2584     \ifx\tmp\blockHead
2585       \pop\guardStack\blockHead
2586 %    \end{macrocode}
2587 %    When the contents of the two macros don't match something is
2588 %    amiss. We signal this to the user, but accept the `end-of-block'.
2589 %\note{Is this the desired behaviour??}
2590 %    \begin{macrocode}
2591     \else
2592       \errmessage{Found </\tmp> instead of </\blockHead>}%
2593     \fi
2594 %    \end{macrocode}
2595 %    When the end of a block of optionally included code is encountered
2596 %    we optionally signal this on the terminal and decrement the counter
2597 %    |\blockLevel|.
2598 %    \begin{macrocode}
2599     \maybeMsg{>}%
2600     \advance\blockLevel\m@ne
2601 %    \end{macrocode}
2602 %    The last thing that has to be done is to decrement off-counters and
2603 %    make new list of active files. Now whole list of output files has
2604 %    to be searched since some inactive files could have been
2605 %    reactivated.
2606 %    \begin{macrocode}
2607   \let\do\closeguard@do
2608   \outputfiles
2609   \let\do\findactive@do
2610   \edef\activefiles{\outputfiles}
2611   \fi
2612   }
2613 %    \end{macrocode}
2614 % \end{macro}
2616 % \begin{macro}{\closeguard@do}
2617 % \changes{2.3b}{1995/08/22}{Change for pre-constructed
2618 %                            off-counters' names}
2619 %    This macro decrements non-zero off-counters.
2620 %    \begin{macrocode}
2621 \def\closeguard@do#1#2#3{%
2622   \ifnum#3>0
2623     \advance#3\m@ne
2624   \fi}
2625 %    \end{macrocode}
2626 % \end{macro}
2629 %  \begin{macro}{\verbOption}
2630 %  \changes{2.3e}{1996/09/16}{Macro added}
2631 %  \changes{2.4g}{1996/12/13}{Reset \cs{putline@do} for /2340}
2632 %    This macro is called when a line starts with |%<<|. It reads a
2633 %    bunch of lines in verbatim mode: the lines are passed unchanged
2634 %    to the output without even checking for starting |%|. This way of
2635 %    processing ends when a line containing only a percent sign
2636 %    followed by stop mark given on the |%<<| line is found.
2637 %    \begin{macrocode}
2638 \def\verbOption<#1\endLine{{%
2639   \edef\verbStop{\perCent#1}\maybeMsg{<<<}%
2640   \let\do\putline@do
2641   \loop
2642     \ifeof\inFile\errmessage{Source file ended while in verbatim
2643                              mode!}\fi
2644     \read\inFile to \inLine
2645   \if 1\ifx\inLine\verbStop 0\fi 1% if not inLine==verbStop
2646     \activefiles
2647     \maybeMsg{.}%
2648   \repeat
2649   \maybeMsg{>}%
2650   }}
2651 %    \end{macrocode}
2652 %  \end{macro}
2654 % \subsection{Batchfile commands}
2655 % \changes{2.3e}{1996/10/02}{Added doc}
2656 %    \ds{} keeps information needed to control inclusion of sources in
2657 %    several list structures. Lists are macros expanding to a series
2658 %    of calls to macro |\do| with two or three parameters.
2659 %    Subsequently |\do| is redefined in various ways and list
2660 %    macros sometimes are executed to perform some action on every
2661 %    element, and sometimes are used inside an |\edef| to make new
2662 %    list of elements having some properties. For every input file
2663 %    \meta{infile} the following lists are kept:
2664 %    \begin{itemize}
2665 %    \item[\cs{b@}\meta{infile}] the ``open list''---names of all output
2666 %               files such that their generation should start with
2667 %               reading of \meta{infile},
2668 %    \item[\cs{o@}\meta{infile}] the ``output list''---names of all
2669 %               output files generated from that source together with
2670 %               suitable sets of options (guards),
2671 %    \item[\cs{e@}\meta{infile}] the ``close list''---names of all
2672 %               output files that should be closed when this source is
2673 %               read.
2674 %    \end{itemize}
2676 %    For every output file name \meta{outfile} \ds{} keeps following
2677 %    information:
2678 %    \begin{itemize}
2679 %    \item[\cs{pth@}\meta{outfile}] full pathname (including file name),
2680 %    \item[\cs{ref@}\meta{outfile}] reference lines for the file,
2681 %    \item[\cs{in@}\meta{outfile}] names of all source files separated
2682 %               with spaces (needed by \cs{InFileName}),
2683 %    \item[\cs{pre@}\meta{outfile}] preamble template (as defined with
2684 %               |\declarepreamble|),
2685 %    \item[\cs{post@}\meta{outfile}] postamble template.
2686 %    \end{itemize}
2688 % \begin{macro}{\generate}
2689 % \changes{2.3a}{1995/08/20}{Messages changed}
2690 % \changes{2.4a}{1996/06/06}{Repeat processing of files until all
2691 %                           done (MDW)}
2692 %    This macro executes its argument in a group. |\inputfiles| is
2693 %    a list of files to be read, |\filestogenerate| list of names
2694 %    of output files (needed for the message below). |\file|s
2695 %    contained in |#1| define |\inputfiles| in such a way that all
2696 %    that has to be done when the parameter is executed is to call
2697 %    this macro. |\inputfiles| command is called over and over again
2698 %    until no output files had to be postponed.
2699 %    \begin{macrocode}
2700 \def\generate#1{\begingroup
2701   \let\inputfiles\empty \let\filestogenerate\empty
2702   \let\file\@file
2703   #1
2704   \ifx\filestogenerate\empty\else
2705   \Msg{^^JGenerating file(s) \filestogenerate}\fi
2706   \def\inFileName{\csname in@\outFileName\endcsname}%
2707   \def\ReferenceLines{\csname ref@\outFileName\endcsname}%
2708   \processinputfiles
2709   \endgroup}
2710 %    \end{macrocode}
2711 % \end{macro}
2713 %  \begin{macro}{\processinputfiles}
2714 % \changes{2.4a}{1996/10/02}{Macro added (MW)}
2715 %    This is a recurrent function which processes input files until
2716 %    they are all gone.
2717 %    \begin{macrocode}
2718 \def\processinputfiles{%
2719   \let\newinputfiles\empty
2720   \inputfiles
2721   \let\inputfiles\newinputfiles
2722   \ifx\inputfiles\empty\else
2723     \expandafter\processinputfiles
2724   \fi
2725   }
2726 %    \end{macrocode}
2727 %  \end{macro}
2729 % \begin{macro}{\file}
2730 %    The first argument is the file to produce, the second
2731 %    argument contains the list of input files. Each entry should have
2732 %    the format
2733 %    \verb=\from{=\meta{filename.ext}\verb=}{=\meta{options}\verb=}=.
2735 % \changes{2.3a}{1995/08/20}{Messages changed}
2736 % ^^A   The macro starts by displaying a message on the terminal to
2737 % ^^A   indicate which file is going to be made.
2738 %    The switch |\ifGenerate| is initially set to \meta{true}.
2739 %    \begin{macrocode}
2740 \def\file#1#2{\errmessage{Command `\string\file' only allowed in
2741                           argument to `\string\generate'}}
2742 \def\@file#1{%
2743   \Generatetrue
2744 %    \end{macrocode}
2745 %    Next we construct full path name for output file and check if we
2746 %    have to be careful about overwriting existing files. If the user
2747 %    specified |\askforoverwritetrue| we will ask him if he wants to
2748 %    overwrite an existing file. Otherwise we simply go ahead.
2749 %    \begin{macrocode}
2750   \makepathname{#1}%
2751   \ifaskforoverwrite
2752 %    \end{macrocode}
2753 %    We try to open a file with the name of the output file for
2754 %    reading.  If this succeeds the file exists and we ask the user if
2755 %    he wants to overwrite the file.
2756 % \changes{2.0p}{1992/06/26}{Added \cs{WriteToDir} (FMi).}
2757 % \changes{2.3a}{1995/08/18}{Changed \cs{@empty} (which was undefined)
2758 %                            to \cs{empty}}
2759 % \changes{2.3e}{1995/09/25}{Changed \cs{WriteToDir} to \cs{destdir}}
2760 %    \begin{macrocode}
2761     \immediate\openin\inFile\@pathname\relax
2762     \ifeof\inFile\else
2763       \Ask\answer{File \@pathname\space already exists
2764                   \ifx\empty\destdir somewhere \fi
2765                   on the system.^^J%
2766                   Overwrite it%
2767                   \ifx\empty\destdir\space if necessary\fi
2768                   ? [y/n]}%
2769 %    \end{macrocode}
2770 %    We set the switch |\ifGenerate| according to his answer. We
2771 %    allow for both ``\texttt{y}'' and ``\texttt{yes}''.
2772 %    \begin{macrocode}
2773       \ifx\y  \answer \else
2774       \ifx\yes\answer \else
2775                       \Generatefalse\fi\fi\fi
2776 %    \end{macrocode}
2777 %    Don't forget to close the file just opened as we want to write
2778 %    to it.
2779 %    \begin{macrocode}
2780     \closein\inFile
2781   \fi
2782 %    \end{macrocode}
2783 % \changes{2.3e}{1995/09/25}{Destination directory handling}
2784 %   If file is to be generated we save its destination pathname  and
2785 %   pass control to macro |\@fileX|.
2786 %   Note that file name is turned into control sequence and |\else|
2787 %   branch is skipped before calling |\@fileX|.
2788 %    \begin{macrocode}
2789   \ifGenerate
2790   \Name\let{pth@#1}\@pathname
2791   \@addto\filestogenerate{\@pathname\space}%
2792   \Name\@fileX{#1\expandafter}%
2793   \else
2794 %    \end{macrocode}
2795 %    In case we were not allowed to overwrite an existing file
2796 %    we inform the user that we are {\em not\/} generating his file
2797 %    and we gobble |\from| specifications.
2798 %    \begin{macrocode}
2799     \Msg{Not generating file \@pathname^^J}%
2800   \expandafter\@gobble
2801   \fi
2802   }
2803 %    \end{macrocode}
2804 % \end{macro}
2806 % \begin{macro}{\@fileX}
2807 %    We put name of current output file in |\curout| and initialize
2808 %    |\curinfiles|  (the list of source files for this output file)
2809 %    to empty---these will be needed  by  |\from|.  Then  we  start
2810 %    defining preamble for the current file.
2811 %    \begin{macrocode}
2812 \def\@fileX#1#2{%
2813   \chardef#1=\stream@closed
2814   \def\curout{#1}%
2815   \let\curinfiles\empty
2816   \let\curinnames\empty
2817   \def\curref{\MetaPrefix ^^J%
2818               \MetaPrefix\space The original source files were:^^J%
2819               \MetaPrefix ^^J}%
2820 %    \end{macrocode}
2821 %    Next we execute second parameter. |\from|s will add reference
2822 %    lines to the preamble.
2823 %    \begin{macrocode}
2824   \let\from\@from \let\needed\@needed
2825   #2%
2826   \let\from\err@from \let\needed\err@needed
2827 %    \end{macrocode}
2828 %    We check order of input files.
2829 %    \begin{macrocode}
2830   \checkorder
2831 %    \end{macrocode}
2832 %    Each |\from| clause defines |\curin| to be its first parameter.
2833 %    So now |\curin| holds name of last input file for current output
2834 %    file. This means that current output file should be closed after
2835 %    processing |\curin|. We add |#1| to proper `close list'.
2836 %    \begin{macrocode}
2837   \Name\@addto{e@\curin}{\noexpand\closeoutput{#1}}%
2838 %    \end{macrocode}
2839 %    Last we save all the interesting information about current file.
2840 %    \begin{macrocode}
2841   \Name\let{pre@\@stripstring#1\expandafter}\currentpreamble
2842   \Name\let{post@\@stripstring#1\expandafter}\currentpostamble
2843   \Name\edef{in@\@stripstring#1}{\expandafter\iden\curinnames}
2844   \Name\edef{ref@\@stripstring#1}{\curref}
2845   }
2846 %    \end{macrocode}
2847 % \end{macro}
2849 %  \begin{macro}{\checkorder}
2850 %    This macro checks  if  the order  of  files  in  |\curinfiles|
2851 %    agrees  with that of |\inputfiles|. The coding is somewhat
2852 %    clumsy.
2853 %    \begin{macrocode}
2854 \def\checkorder{%
2855   \expandafter\expandafter\expandafter
2856   \checkorderX\expandafter\curinfiles
2857   \expandafter\qStop\inputfiles\qStop
2858   }
2859 \def\checkorderX(#1)#2\qStop#3\qStop{%
2860   \def\tmp##1\readsource(#1)##2\qStop{%
2861     \ifx!##2! \order@error
2862     \else\ifx!#2!\else
2863        \checkorderXX##2%
2864     \fi\fi}%
2865   \def\checkorderXX##1\readsource(#1)\fi\fi{\fi\fi
2866     \checkorderX#2\qStop##1\qStop}%
2867   \tmp#3\readsource(#1)\qStop
2868   }
2869 \def\order@error#1\fi\fi{\fi
2870   \errmessage{DOCSTRIP error: Incompatible order of input
2871               files specified for file
2872               `\iden{\expandafter\uptospace\curin} \qStop'.^^J
2873               Read DOCSTRIP documentation for explanation.^^J
2874               This is a serious problem, I'm exiting}\end
2875   }
2876 %    \end{macrocode}
2877 %  \end{macro}
2879 % \begin{macro}{\needed}
2880 % \changes{2.3c}{1995/08/24}{Macro added}
2881 % \changes{2.3e}{1996/09/12}{Forced expansion of argument to fix a bug
2882 %                with filenames containing macros}
2883 % \begin{macro}{\@needed}
2884 %    This  macro  uniquizes  name  of  an  input  file  passed as a
2885 %    parameter and marks it as needed to  be  input.  It  is  used
2886 %    internally  by  |\from|, but can also be issued in argument to
2887 %    |\file| to influence the order in which files are read.
2888 %    \begin{macrocode}
2889 \def\needed#1{\errmessage{\string\needed\space can only be used in
2890                argument to \string\file}}
2891 \let\err@needed\needed
2892 \def\@needed#1{%
2893   \edef\reserved@a{#1}%
2894   \expandafter\@need@d\expandafter{\reserved@a}}
2895 \def\@need@d#1{%
2896   \@ifpresent{(#1)}\curinfiles
2897 %    \end{macrocode}
2898 %    If  |#1|  is present on list of input files for current output
2899 %    file we add a space on end of its name and try again. The idea
2900 %    is  to construct a name that will look different for \TeX\ but
2901 %    will lead to the same file when seen by operating system.
2902 %    \begin{macrocode}
2903     {\@need@d{#1 }}%
2904 %    \end{macrocode}
2905 %    When it is not we check if |#1| is  present  in  the  list  of
2906 %    files to be processed. If not we add it and initialize list of
2907 %    output files for that input and  list  of  output  files  that
2908 %    should   be  closed  when  this  file  closes.   We  also  add
2909 %    constructed name to |\curinfiles| and define  |\curin|  to  be
2910 %    able to access constructed name from |\@from|.
2911 %    \begin{macrocode}
2912     {\@ifpresent{\readsource(#1)}\inputfiles
2913        {}{\@addto\inputfiles{\noexpand\readsource(#1)}%
2914        \Name\let{b@#1}\empty
2915        \Name\let{o@#1}\empty
2916        \Name\let{e@#1}\empty}%
2917      \@addto\curinfiles{(#1)}%
2918      \def\curin{#1}}%
2919   }
2920 %    \end{macrocode}
2921 % \end{macro}
2922 % \end{macro}
2924 % \begin{macro}{\from}
2925 % \changes{2.3c}{1995/08/24}{part of code moved to \cs{needed}}
2926 %    |\from| starts by adding a line to  preamble for output file.
2927 %    \begin{macrocode}
2928 \def\from#1#2{\errmessage{Command `\string\from' only allowed in
2929                           argument to `\string\file'}}
2930 \let\err@from\from
2931 \def\@from#1#2{%
2932   \@addto\curref{\MetaPrefix\space #1 \if>#2>\else
2933                               \space (with options: `#2')\fi^^J}%
2934 %    \end{macrocode}
2935 %    Then we mark the file as needed input file.
2936 %    \begin{macrocode}
2937   \needed{#1}%
2938 %    \end{macrocode}
2939 % \changes{2.3e}{1996/10/02}{Introduced ``open list''}
2940 %    If this is the first |\from| in current |\file| (i.e. if the
2941 %    |\curinnames| so far is empty) the file name is added to the
2942 %    ``open list'' for the current input file.
2943 %    And |\do|\meta{current output}|{|\meta{options}|}| is appended
2944 %    to the list of output files for current input file.
2945 %    \begin{macrocode}
2946   \ifx\curinnames\empty
2947      \Name\@addto{b@\curin}{\noexpand\openoutput\curout}%
2948   \fi
2949   \@addto\curinnames{ #1}%
2950   \Name\@addto{o@\curin}{\noexpand\do\curout{#2}}%
2951   }
2952 %    \end{macrocode}
2953 % \end{macro}
2955 % \begin{macro}{\readsource}
2956 % \changes{2.4a}{1996/06/06}{Extensively hacked to honour stream
2957 %                            limits (MDW)}
2958 % \changes{2.3a}{1995/08/18}{Renamed to \cs{readsource}; adaptation for
2959 %                            concurrent version}
2960 % \changes{2.0f}{1991/06/04}{Added check for lines with \texttt{\bsl
2961 %    endinput}} This macro is called for each input file that
2962 %    is to be processed.
2964 %    \begin{macrocode}
2965 \def\readsource(#1){%
2966 %    \end{macrocode}
2967 %    We try to open the input file. If this doesn't succeed, we
2968 %    tell the user so and nothing else happens.
2969 %    \begin{macrocode}
2970   \immediate\openin\inFile\uptospace#1 \qStop\relax
2971   \ifeof\inFile
2972     \errmessage{Cannot find file \uptospace#1 \qStop}%
2973   \else
2974 %    \end{macrocode}
2975 %    If statistics are included we nullify line counters
2976 %    \begin{macrocode}
2977 %<*stats>
2978     \processedLines\z@
2979     \commentsRemoved\z@
2980     \commentsPassed\z@
2981     \codeLinesPassed\z@
2982 %</stats>
2983 %    \end{macrocode}
2984 % \changes{2.3b}{1995/08/22}{Change for pre-constructed
2985 %                            off-counters' names}
2986 % \changes{2.3e}{1996/10/02}{Introduced ``open list''}
2987 %    When the input file was successfully opened, we try to open all
2988 %    needed output files by executing the ``open list''.
2989 %    If any of files couldn't be opened because of number of streams
2990 %    limits, their names are put into |\refusedfiles| list. This list
2991 %    subsequently becomes the open list for the next pass.
2992 %    \begin{macrocode}
2993     \let\refusedfiles\empty
2994     \csname b@#1\endcsname
2995     \Name\let{b@#1}\refusedfiles
2996 %    \end{macrocode}
2997 %    Now all output files that could be opened are open. So we go
2998 %    through the ``output list'' and for every open file we display a
2999 %    message and zero the off-counter, while closed files are appended
3000 %    to |\refusedfiles|.
3001 %    \begin{macrocode}
3002     \Msg{} \def\@msg{Processing file \uptospace#1 \qStop}
3003     \def\change@msg{%
3004       \edef\@msg{\@spaces\@spaces\@spaces\space
3005         \expandafter\tospaces\uptospace#1 \qStop\secapsot}
3006       \let\change@msg\relax}
3007     \let\do\showfiles@do
3008     \let\refusedfiles\empty
3009     \csname o@#1\endcsname
3010 %    \end{macrocode}
3011 %    If |\refusedfiles| is nonempty current source file needs reread,
3012 %    so we append it to |\newinputfiles|.
3013 %    \begin{macrocode}
3014     \ifx\refusedfiles\empty\else
3015       \@addto\newinputfiles{\noexpand\readsource(#1)}
3016     \fi
3017 %    \end{macrocode}
3018 %    Finally we define |\outputfiles| and construct off-counters
3019 %    names. Now |\do|s will have 3 parameters! All output files become
3020 %    active.
3021 %    \begin{macrocode}
3022     \let\do\makeoutlist@do
3023     \edef\outputfiles{\csname o@#1\endcsname}%
3024     \let\activefiles\outputfiles
3025     \Name\let{o@#1}\refusedfiles
3026 %    \end{macrocode}
3027 %    Now we change the category code of a lot of characters to
3028 %    \meta{other} and make sure that no extra spaces appear in the
3029 %    lines read by setting the |\endlinechar| to $-1$.
3030 %    \begin{macrocode}
3031     \makeOther\ \makeOther\\\makeOther\$%
3032     \makeOther\#\makeOther\^\makeOther\^^K%
3033     \makeOther\_\makeOther\^^A\makeOther\%%
3034     \makeOther\~\makeOther\{\makeOther\}\makeOther\&%
3035     \endlinechar-1\relax
3036 %    \end{macrocode}
3037 %    Then we start a loop to process the lines in the file one by one.
3038 %    \begin{macrocode}
3039     \loop
3040       \read\inFile to\inLine
3041 %    \end{macrocode}
3042 %    The first thing we check is whether the current line
3043 %    contains an |\endinput|. To allow also real |\endinput|
3044 %    commands in the source file, |\endinput| is only recognized
3045 %    when it occurs directly at the beginning of a line.
3046 %    \begin{macrocode}
3047       \ifx\inLine\Endinput
3048 %    \end{macrocode}
3049 %    In this case we output a message to inform the programmer (in
3050 %    case this was a mistake) and end the loop immediately by setting
3051 %    \verb=Continue= to \meta{false}. Note that |\endinput| is
3052 %    not placed into the output file. This is important in cases where
3053 %    the output file is generated from several \texttt{doc} files.
3054 %    \begin{macrocode}
3055         \Msg{File #1 ended by \string\endinput.}%
3056         \Continuefalse
3057       \else
3058 %    \end{macrocode}
3059 % \changes{2.0j}{1992/03/03}{First check for end of file before check
3060 %    for empty lines} When the end of the file is found we have to
3061 %    interrupt the loop.
3062 %    \begin{macrocode}
3063        \ifeof\inFile
3064          \Continuefalse
3065 %    \end{macrocode}
3066 % \changes{2.0i}{1991/06/27}{Added check for consecutive empty lines}
3067 %    If the file did not end we check if the input line is empty.
3068 %    If it is, the counter |\emptyLines| is incremented.
3069 %    \begin{macrocode}
3070        \else
3071          \Continuetrue
3072          \ifx\inLine\empty
3073             \advance\emptyLines\@ne
3074           \else
3075             \emptyLines\z@
3076           \fi
3077 %    \end{macrocode}
3078 %    When the number of empty lines seen so far exceeds 1, we skip them.
3079 %    If it doesn't, the expansion of |\inLine| is fed to |\processLine|
3080 %    with |\endLine| appended to indicate the end of the line.
3081 %    \begin{macrocode}
3082           \ifnum \emptyLines<2
3083             \expandafter\processLine\inLine\endLine
3084           \else
3085             \maybeMsg{/}%
3086           \fi
3087        \fi
3088       \fi
3089 %    \end{macrocode}
3090 %    When the processing of the line is finished, we check if there is
3091 %    more to do, in which case we repeat the loop.
3092 %    \begin{macrocode}
3093     \ifContinue
3094     \repeat
3095 %    \end{macrocode}
3096 %    The input file is closed.
3097 %    \begin{macrocode}
3098     \closein\inFile
3099 %    \end{macrocode}
3100 %    We close output files for which this was the last input file.
3101 %    \begin{macrocode}
3102   \csname e@#1\endcsname
3103 %    \end{macrocode}
3104 %    If the user was interested in statistics, we inform him of the
3105 %    number of lines processed, the number of comments that were
3106 %    either removed or passed and the number of codelines that were
3107 %    written to the output file. Also the totals are updated.
3108 %    \begin{macrocode}
3109 %<*stats>
3110     \Msg{Lines \space processed: \the\processedLines^^J%
3111          Comments removed: \the\commentsRemoved^^J%
3112          Comments \space passed: \the\commentsPassed^^J%
3113          Codelines passed: \the\codeLinesPassed^^J}%
3114       \global\advance\TotalprocessedLines  by \processedLines
3115       \global\advance\TotalcommentsRemoved by \commentsRemoved
3116       \global\advance\TotalcommentsPassed  by \commentsPassed
3117       \global\advance\TotalcodeLinesPassed by \codeLinesPassed
3118 %</stats>
3119 %    \end{macrocode}
3120 %    The |\NumberOfFiles| need to be known even if no statistics are
3121 %    gathered so we update it always.
3122 % \changes{2.4h}{1997/07/07}{update \cs{NumberOfFiles} even if stats are
3123 %      not gathered pr/2429}
3124 %    \begin{macrocode}
3125       \global\advance\NumberOfFiles by \@ne
3126     \fi}
3127 %    \end{macrocode}
3128 % \end{macro}
3130 %  \begin{macro}{\showfiles@do}
3131 % \changes{2.4a}{1996/10/02}{Macro added (MW)}
3132 %    A message is displayed on the terminal telling the user what we
3133 %    are about to do. For each open output file we display one line
3134 %    saying what options it is generated with and the off-counter
3135 %    associated with the file is zeroed. First line contains also name
3136 %    of input file.
3137 %    Names of output files that are closed are appended to
3138 %    |\refusedfiles|.
3139 %    \begin{macrocode}
3140 \def\showfiles@do#1#2{%
3141   \ifnum#1=\stream@closed
3142     \@addto\refusedfiles{\noexpand\do#1{#2}}%
3143   \else
3144     \Msg{\@msg
3145          \ifx>#2>\else\space(#2)\fi
3146          \space -> \@stripstring#1}
3147     \change@msg
3148   \csname off@\number#1\endcsname=\z@
3149   \fi
3151 %    \end{macrocode}
3152 %  \end{macro}
3154 % \begin{macro}{\makeoutlist@do}
3155 % \changes{2.3b}{1995/08/22}{Macro added --- pre-constructed
3156 %                            off-counters' names}
3157 %   This macro selects only open output files and constructs names for
3158 %   off-counters.
3159 %    \begin{macrocode}
3160 \def\makeoutlist@do#1#2{%
3161   \ifnum#1=\stream@closed\else
3162     \noexpand\do#1{#2}\csname off@\number#1\endcsname
3163   \fi}
3164 %    \end{macrocode}
3165 % \end{macro}
3167 % \begin{macro}{\openoutput}
3168 % \changes{2.3e}{1996/10/02}{Change for ``open lists'' -- renamed from
3169 %                            \cs{ensureopen@do}}
3170 % \changes{2.4a}{1996/06/06}{Check whether there are streams left (MDW)}
3171 %    This macro opens output streams if possible.
3172 %    \begin{macrocode}
3173 \def\openoutput#1{%
3174 %    \end{macrocode}
3175 %    If both maxfile counters are non-zero\dots
3176 %    \begin{macrocode}
3177   \if 1\ifnum\@maxfiles=\z@ 0\fi
3178        \ifnum\@maxoutfiles=\z@ 0\fi1%
3179 %    \end{macrocode}
3180 %    \dots the stream may be opened and counters decremented. But if
3181 %    that cannot be done\dots
3182 %    \begin{macrocode}
3183     \advance\@maxfiles\m@ne
3184     \advance\@maxoutfiles\m@ne
3185     \StreamOpen#1%
3186     \WritePreamble#1%
3187   \else
3188 %    \end{macrocode}
3189 %    \dots the file is added to the ``refuse list''.
3190 %    \begin{macrocode}
3191      \@addto\refusedfiles{\noexpand\openoutput#1}%
3192   \fi
3193   }
3194 %    \end{macrocode}
3195 % \end{macro}
3197 % \begin{macro}{\closeoutput}
3198 % \changes{2.4a}{1996/06/06}
3199 %      {Don't close the file if it's not open (MDW)}
3200 %    This macro closes open output stream when it is no longer
3201 %    needed and increments maxfiles counters.
3202 %    \begin{macrocode}
3203 \def\closeoutput#1{%
3204   \ifnum#1=\stream@closed\else
3205     \WritePostamble#1%
3206     \StreamClose#1%
3207     \advance\@maxfiles\@ne
3208     \advance\@maxoutfiles\@ne
3209   \fi}
3210 %    \end{macrocode}
3211 % \end{macro}
3213 % \subsubsection{Preamble and postamble}
3215 %  \begin{macro}{\ds@heading}
3216 % \changes{2.3e}{1996/09/16}{Macro added.}
3217 %    This is a couple of lines, stating what file is being written and
3218 %    how it was created.
3219 %    \begin{macrocode}
3220 \def\ds@heading{%
3221   \MetaPrefix ^^J%
3222   \MetaPrefix\space This is file `\outFileName',^^J%
3223   \MetaPrefix\space  generated with the docstrip utility.^^J%
3224   }
3225 %    \end{macrocode}
3226 %  \end{macro}
3228 %  \begin{macro}{\AddGenerationDate}
3229 % \changes{2.3d}{1995/11/17}{(DPC) Macro added.}
3230 %  Older versions of \ds{} added the date that any file was generated
3231 % and the version number of \ds{}. This confused some people as they
3232 % mistook this for the version/date of the file that was being
3233 % written. So now this information is not normally written, but
3234 % a batch file may call this to get an old style header.
3235 %    \begin{macrocode}
3236 \def\AddGenerationDate{%
3237   \def\ds@heading{%
3238     \MetaPrefix ^^J%
3239     \MetaPrefix\space This is file `\outFileName', generated %
3240            on <\the\year/\the\month/\the\day> ^^J%
3241     \MetaPrefix\space with the docstrip utility (\fileversion).^^J%
3242  }}
3243 %    \end{macrocode}
3244 %  \end{macro}
3246 % \begin{macro}{\declarepreamble}
3247 % \changes{2.3a}{1995/08/18}{renamed from \cs{preamble};
3248 %                            interface changed}
3249 % \changes{2.0e}{1991/06/01}{Macro added.}
3250 % \changes{2.3e}{1995/09/25}
3251 %     {Change for batchfiles working by \cs{input}}
3252 % \changes{2.3e}{1996/09/16}{Change to allow customization.}
3253 %    When a batch file is used the
3254 %    user can specify a preamble of his own that will be written to
3255 %    each file that is created. This can be useful to include an extra
3256 %    copyright notice in the stripped version of a file.  Also a
3257 %    warning that both versions of a file should {\em always\/} be
3258 %    distributed together could be written to a stripped file by
3259 %    including it in such a preamble.
3261 %    Every line that is written to |\outFile| that belongs to the
3262 %    preamble is preceded by two percent characters. This will prevent
3263 %    \ds{} from stripping these lines off the file.
3265 %    The preamble should be started with the macro
3266 %    |\declarepreamble|; it is ended by |\endpreamble|. All
3267 %    processing is done within a group in order to be able to locally
3268 %    change some values.
3270 %    |\ReferenceLines| is let equal |\relax| to be unexpandable.
3271 %    \begin{macrocode}
3272 \let\inFileName\relax
3273 \let\outFileName\relax
3274 \let\ReferenceLines\relax
3275 \def\declarepreamble{\begingroup
3276 \catcode`\^^M=13 \catcode`\ =12 %
3277 \declarepreambleX}
3278 {\catcode`\^^M=13 %
3279 \gdef\declarepreambleX#1#2
3280 \endpreamble{\endgroup%
3281   \def^^M{^^J\MetaPrefix\space}%
3282   \edef#1{\ds@heading%
3283           \ReferenceLines%
3284           \MetaPrefix\space\checkeoln#2\empty}}%
3285 \gdef\checkeoln#1{\ifx^^M#1\else\expandafter#1\fi}%
3287 %    \end{macrocode}
3288 % \end{macro}
3290 % \begin{macro}{\declarepostamble}
3291 % \changes{2.0e}{1991/06/01}{Macro added.}
3292 % \changes{2.3e}{1995/09/25}
3293 %     {Change for batchfiles working by \cs{input}}
3294 %    Just as a preamble can be
3295 %    specified in a batch file, the same can be done for a {\em
3296 %    post\/}amble.
3298 %    The definition of |\declarepostamble| is very much like the
3299 %    definition above of |\declarepreamble|.
3300 %    \begin{macrocode}
3301 \def\declarepostamble{\begingroup
3302 \catcode`\ =12 \catcode`\^^M=13
3303 \declarepostambleX}
3304 {\catcode`\^^M=13 %
3305 \gdef\declarepostambleX#1#2
3306 \endpostamble{\endgroup%
3307   \def^^M{^^J\MetaPrefix\space}%
3308   \edef#1{\MetaPrefix\space\checkeoln#2\empty^^J%
3309           \MetaPrefix ^^J%
3310           \MetaPrefix\space End of file `\outFileName'.%
3311   }}%
3313 %    \end{macrocode}
3314 % \end{macro}
3316 % \begin{macro}{\usepreamble}
3317 % \begin{macro}{\usepostamble}
3318 %    Macros for selecting [pre/post]amble to be used.
3319 %    \begin{macrocode}
3320 \def\usepreamble#1{\def\currentpreamble{#1}}
3321 \def\usepostamble#1{\def\currentpostamble{#1}}
3322 %    \end{macrocode}
3323 % \end{macro}
3324 % \end{macro}
3326 % \begin{macro}{\nopreamble}
3327 % \changes{2.4i}{1998/01/18}{Macro added. pr/2726}
3328 % \begin{macro}{\nopostamble}
3329 % \changes{2.4i}{1998/01/18}{Macro added. pr/2726}
3330 %    Shortcuts for disabling the writing of [pre/post]ambles.
3331 %    This is not done by disabling |\WritePreamble| or |\WritePostamble|
3332 %    since that wouldn't
3333 %    revertable afterwards. Instead the empty [pre/post]ambles are handled
3334 %    specially in those macros.
3335 %    \begin{macrocode}
3336 \def\nopreamble{\usepreamble\empty}
3337 \def\nopostamble{\usepostamble\empty}
3338 %    \end{macrocode}
3339 % \end{macro}
3340 % \end{macro}
3342 % \begin{macro}{\preamble}
3343 % \changes{2.3c}{1995/08/28}{Bug fixed: default preamble is now selected
3344 %                             not only defined}
3345 % \begin{macro}{\postamble}
3346 % \changes{2.3c}{1995/08/28}{As for \cs{preamble}}
3347 %    For backward compatibility we provide these macros defining
3348 %    default preamble and postamble.
3349 %    \begin{macrocode}
3350 \def\preamble{\usepreamble\defaultpreamble
3351   \declarepreamble\defaultpreamble}
3352 \def\postamble{\usepostamble\defaultpostamble
3353   \declarepostamble\defaultpostamble}
3354 %    \end{macrocode}
3355 % \end{macro}
3356 % \end{macro}
3357 % \begin{macro}{\org@preamble}
3358 %  \changes{2.3a}{1995/08/18}{Macro added}
3359 % \changes{2.3c}{1995/11/16}{With \cs{inFileName} again}
3360 % \begin{macro}{\org@postamble}
3361 %  \changes{2.3a}{1995/08/18}{Macro added}
3362 %    Default values to use if nothing different is provided.
3363 % \changes{2.2j}{1995/08/06}{Updated default preamble}
3364 % \changes{2.5a}{1998/04/03}{Updated default preamble}
3365 %    \begin{macrocode}
3366 \declarepreamble\org@preamble
3368 IMPORTANT NOTICE:
3370 For the copyright see the source file.
3372 Any modified versions of this file must be renamed
3373 with new filenames distinct from \outFileName.
3375 For distribution of the original source see the terms
3376 for copying and modification in the file \inFileName.
3378 This generated file may be distributed as long as the
3379 original source files, as listed above, are part of the
3380 same distribution. (The sources need not necessarily be
3381 in the same archive or directory.)
3382 \endpreamble
3383 %    \end{macrocode}
3385 %    \begin{macrocode}
3386 \edef\org@postamble{\string\endinput^^J%
3387   \MetaPrefix ^^J%
3388   \MetaPrefix\space End of file `\outFileName'.%
3389   }
3390 %    \end{macrocode}
3392 %    \begin{macrocode}
3393 \let\defaultpreamble\org@preamble
3394 \let\defaultpostamble\org@postamble
3395 %    \end{macrocode}
3397 %    \begin{macrocode}
3398 \usepreamble\defaultpreamble
3399 \usepostamble\defaultpostamble
3400 %    \end{macrocode}
3401 % \end{macro}
3402 % \end{macro}
3404 % \begin{macro}{\originaldefault}
3405 % \changes{2.5a}{1998/04/03}{Macro added}
3406 % \changes{2.5b}{1998/04/28}{Macro renamed from \cs{orginaldefault}
3407 %   to \cs{originaldefault}}
3408 % The default preamble header changed in v2.5 to allow distribution
3409 % of generated files as long as source also distributed. If you need
3410 % the original default, not allowing distribution of generated files
3411 % add |\usepreamble\originaldefault| to your .ins files.
3412 % Note then that your file can not be included in most TeX distributions
3413 % on CD which are distributed `pre-installed' with all \LaTeX\ files
3414 % extracted form the documented sources and moved to a suitable
3415 % directory in \TeX's search path.
3416 %    \begin{macrocode}
3417 \declarepreamble\originaldefault
3419 IMPORTANT NOTICE:
3421 For the copyright see the source file.
3423 You are *not* allowed to modify this file.
3425 You are *not* allowed to distribute this file.
3426 For distribution of the original source see the terms
3427 for copying and modification in the file \inFileName.
3429 \endpreamble
3430 %    \end{macrocode}
3431 % \end{macro}
3433 % \begin{macro}{\WritePreamble}
3434 % \changes{2.0e}{1991/06/01}{Macro added.}
3435 % \changes{2.3c}{1995/11/16}{Added definitions of \cs{inFileName} and
3436 %                            \cs{outFileName}}
3437 % \changes{2.3d}{1995/11/17}{(DPC) Macro added.}
3438 % \changes{2.4i}{1998/01/18}{Test for \cs{empty} postamble and
3439 %        don't write it out. pr/2726}
3440 %    \begin{macrocode}
3441 \def\WritePreamble#1{%
3442 %    \end{macrocode}
3443 %    We write out only non-empty preambles.
3444 %    \begin{macrocode}
3445   \expandafter\ifx\csname pre@\@stripstring#1\endcsname\empty
3446   \else
3447     \edef\outFileName{\@stripstring#1}%
3448 %    \end{macrocode}
3449 %    Then the reference lines that tell from what source file(s) the
3450 %    stripped file was created and user supplied preamble.
3451 %    \begin{macrocode}
3452     \StreamPut#1{\csname pre@\@stripstring#1\endcsname}%
3453   \fi}
3454 %    \end{macrocode}
3455 % \end{macro}
3457 % \begin{macro}{\WritePostamble}
3458 % \changes{2.0e}{1991/06/01}{Macro added.}
3459 % \changes{2.3c}{1995/11/16}{Added defs of \cs{inFileName} and
3460 %                            \cs{outFileName}}
3461 % \changes{2.4i}{1998/01/18}{Test for \cs{empty} postamble and
3462 %        don't write it out.  pr/2726}
3463 %    Postamble attributed to |#1| is written out. The
3464 %    last line written identifies the file again.
3465 %    \begin{macrocode}
3466 \def\WritePostamble#1{%
3467 %    \end{macrocode}
3468 %    We write out only non-empty postambles.
3469 %    \begin{macrocode}
3470   \expandafter\ifx\csname post@\@stripstring#1\endcsname\empty
3471   \else
3472     \edef\outFileName{\@stripstring#1}%
3473     \StreamPut#1{\csname post@\@stripstring#1\endcsname}%
3474   \fi}
3475 %    \end{macrocode}
3476 % \end{macro}
3478 % \subsection{Support for writing to specified directories}
3480 %    As we've seen before every output file is written to  directory
3481 %    specified  by  the  value of |\destdir| current at the moment of
3482 %    this file's  |\file|  declaration.
3484 % \begin{macro}{\usedir}
3485 %  \changes{2.3e}{1995/09/15}{Macro added}
3486 %    This macro when called should translate its one argument into a
3487 %    directory name and define |\destdir| to that value.  The default
3488 %    for |\usedir| is to ignore its argument and return name of
3489 %    current directory (if known).  This can be changed by commands
3490 %    from |docstrip.cfg| file.
3492 %    |\showdirectory| is used just to display directory name for
3493 %    user's information.
3494 %    \begin{macrocode}
3495 \def\usedir#1{\edef\destdir{\WriteToDir}}
3496 \def\showdirectory#1{\WriteToDir}
3497 %    \end{macrocode}
3498 % \end{macro}
3500 % \begin{macro}{\BaseDirectory}
3501 % \changes{2.3e}{1995/09/15}{Macro added}
3502 % \changes{2.4e}{1996/10/22}{\cs{@setwritetodir} added (DPC)}
3503 %    This is config file command for specifying root directory of the
3504 %    \TeX{}  hierarchy.  It enables the whole directory
3505 %    selecting mechanism by redefining |\usedir|.
3506 %    First make sure that the directory syntax commands have been set
3507 %    up by calling |\@setwritedir|, so that the value of |\dirsep|
3508 %   used by the |\edef| is (hopefully) correct.
3509 %    \begin{macrocode}
3510 \def\BaseDirectory#1{%
3511   \@setwritetodir
3512   \let\usedir\alt@usedir
3513   \let\showdirectory\showalt@directory
3514   \edef\basedir{#1\dirsep}}
3515 %    \end{macrocode}
3516 % \end{macro}
3518 % \begin{macro}{\convsep}
3519 % \changes{2.3e}{1995/09/15}{Macro added}
3520 %    This macro loops through slashes in its argument replacing them
3521 %    with  current  |\dirsep|.  It  should   be   called
3522 %    |\convsep some/directory/name/\qStop| (with slash on the end).
3523 %    \begin{macrocode}
3524 \def\convsep#1/#2\qStop{%
3525   #1\ifx\qStop#2\qStop \pesvnoc\fi\convsep\dirsep#2\qStop}
3526 \def\pesvnoc#1\qStop{\fi}
3527 %    \end{macrocode}
3528 % \end{macro}
3530 % \begin{macro}{\alt@usedir}
3531 % \changes{2.3e}{1995/09/15}{Macro added}
3532 %    Directory name construction macro enabling writing to various
3533 %    directories.
3534 %    \begin{macrocode}
3535 \def\alt@usedir#1{%
3536   \Name\ifx{dir@#1}\relax
3537     \undefined@directory{#1}%
3538   \else
3539     \edef\destdir{\csname dir@#1\endcsname}%
3540   \fi}
3541 \def\showalt@directory#1{%
3542   \Name\ifx{dir@#1}\relax
3543     \showundef@directory{#1}%
3544   \else\csname dir@#1\endcsname\fi}
3545 %    \end{macrocode}
3546 % \end{macro}
3548 %  \begin{macro}{\undefined@directory}
3549 % \changes{2.4a}{1996/10/04}{Macro added (MW)}
3550 % \changes{2.4e}{1996/10/22}{Help text added (DPC)}
3551 %    This macro comes into action when undefined label is spotted. The
3552 %    action is to raise an error and define |\destdir| to point to the
3553 %    current directory.
3554 %    \begin{macrocode}
3555 \def\undefined@directory#1{%
3556   \errhelp{docstrip.cfg should specify a target directory for^^J%
3557    #1 using \DeclareDir or \UseTDS.}%
3558   \errmessage{You haven't defined the output directory for `#1'.^^J%
3559             Subsequent files will be written to the current directory}%
3560   \let\destdir\WriteToDir
3561   }
3562 \def\showundef@directory#1{UNDEFINED (label is #1)}
3563 %    \end{macrocode}
3564 %  \end{macro}
3566 %  \begin{macro}{\undefined@TDSdirectory}
3567 % \changes{2.4a}{1996/10/04}{Macro added (MW)}
3568 %    This happens when label is undefined while using TDS. The label
3569 %    is converted to use proper separators and appended to base
3570 %    directory name.
3571 %    \begin{macrocode}
3572 \def\undefined@TDSdirectory#1{%
3573   \edef\destdir{%
3574     \basedir\convsep#1/\qStop
3575   }}
3576 \def\showundef@TDSdirectory#1{\basedir\convsep#1/\qStop}
3577 %    \end{macrocode}
3578 %  \end{macro}
3580 %  \begin{macro}{\UseTDS}
3581 % \changes{2.4a}{1996/10/04}{Macro added (MW)}
3582 % \changes{2.4e}{1996/10/22}{\cs{@setwritetodir} added (DPC)}
3583 %    Change of behaviour for undefined labels is done simply:
3584 %    \begin{macrocode}
3585 \def\UseTDS{%
3586   \@setwritetodir
3587   \let\undefined@directory\undefined@TDSdirectory
3588   \let\showundef@directory\showundef@TDSdirectory
3589   }
3590 %    \end{macrocode}
3591 %  \end{macro}
3593 % \begin{macro}{\DeclareDir}
3594 % \changes{2.3e}{1995/09/15}{Macro added}
3595 % \changes{2.4e}{1996/10/22}{\cs{@setwritetodir} added (DPC)}
3596 %    This macro remaps some directory name to another.
3597 %    \begin{macrocode}
3598 \def\DeclareDir{\@ifnextchar*{\DeclareDirX}{\DeclareDirX\basedir*}}
3599 \def\DeclareDirX#1*#2#3{%
3600   \@setwritetodir
3601   \Name\edef{dir@#2}{#1#3}}
3602 %    \end{macrocode}
3603 % \end{macro}
3606 % \subsubsection{Compatibility with older versions}
3608 % \begin{macro}{\generateFile}
3609 %    Main macro of previous versions of \ds.
3610 %    \begin{macrocode}
3611 \def\generateFile#1#2#3{{%
3612   \ifx t#2\askforoverwritetrue
3613   \else\askforoverwritefalse\fi
3614   \generate{\file{#1}{#3}}%
3615   }}
3616 %    \end{macrocode}
3617 % \end{macro}
3619 %    To support command files that were written for the first version
3620 %    of \ds{} the commands |\include| and |\processFile|
3621 %    are defined here. The use of this interface is not recommended
3622 %    as it may be removed in a future release of \ds{}.
3624 % \begin{macro}{\include}
3625 % \changes{2.0f}{1991/06/04}{Macro added} To provide the \ds{} program
3626 %    with a list of options that should be included in the output the
3627 %    command \verb=\include{=\meta{Options}\verb=}= can be used. This
3628 %    macro is meant to be used in conjunction with the
3629 %    |\processFile| command.
3630 %    \begin{macrocode}
3631 \def\include#1{\def\Options{#1}}
3632 %    \end{macrocode}
3633 % \end{macro}
3635 % \begin{macro}{\processFile}
3636 % \changes{2.0f}{1991/06/04}{Supply \texttt{\bsl generateFile} with
3637 %                          \texttt{\bsl Options}}
3638 %\DeleteShortVerb\|
3639 %    The macro
3640 %    \verb=\processFile{=\meta{filename}\verb=}{=\meta{inext}\verb=}{=%
3641 %\unskip\meta{outext}\verb=}{=\meta{t{\fontshape{n}\ttfamily|}f}\verb=}=
3642 %    can be used when a single input file is used to produce
3643 %    a single output file. The macro is also used in the interactive
3644 %    mode of the \ds{} program.
3645 %\MakeShortVerb\|
3647 %    The arguments \meta{inext} and \meta{outext} denote the
3648 %    extensions of the input and output files respectively. The fourth
3649 %    argument can be used to specify if an existing file should be
3650 %    overwritten without asking. If \meta{t} is specified the program
3651 %    will ask for permission before overwriting an existing file.
3653 %    This macro is defined using the more generic macro |\generateFile|.
3654 %    \begin{macrocode}
3655 \def\processFile#1#2#3#4{%
3656   \generateFile{#1.#3}{#4}{\from{#1.#2}{\Options}}}
3657 %    \end{macrocode}
3658 % \end{macro}
3660 % \begin{macro}{\processfile}
3661 % \begin{macro}{\generatefile}
3662 % \changes{2.0m}{1991/04/23}{Now issue a warning when \cs{processfile}
3663 %     or \cs{generatefile} are used}
3664 %    Early
3665 %    versions of \ds{} defined |\processfile| and
3666 %    |\generatefile| instead of the commands as they are defined in
3667 %    this version. To remain upwards compatible, we still provide
3668 %    these commands, but issue a warning when they are used.
3669 %    \begin{macrocode}
3670 \def\processfile{\Msg{%
3671     ^^Jplease use \string\processFile\space instead of
3672        \string\processfile!^^J}%
3673     \processFile}
3674 \def\generatefile{\Msg{%
3675     ^^Jplease use \string\generateFile\space instead of
3676       \string\generatefile!^^J}%
3677     \generateFile}
3678 %    \end{macrocode}
3679 % \end{macro}
3680 % \end{macro}
3683 % \subsection{Limiting open file streams}
3685 % (This section was written by Mark Wooding)
3687 % \begin{macro}{\maxfiles}
3688 % \changes{2.4a}{1996/06/06}{Macro added (MDW)}
3689 % Some operating systems with duff libraries or other restrictions
3690 % can't cope with all the files which \ds\ tries to output at once.
3691 % A configuration file can say |\maxfiles{|\meta{number}|}| to
3692 % describe the maximum limit for the environment.
3694 % I'll need a counter for this value, so I'd better allocate one.
3696 %    \begin{macrocode}
3697 \newcount\@maxfiles
3698 %    \end{macrocode}
3700 % The configuration command |\maxfiles| is just slightly prettier than
3701 % an assignment, for \LaTeX\ people.  It also gives me an opportunity
3702 % to check that the limit is vaguely sensible.  I need at least 4
3703 % streams:
3704 % \begin{enumerate}
3705 % \item A batch file.
3706 % \item A sub batch file, which \LaTeX's installation utility uses.
3707 % \item An input stream for reading an unstripped file.
3708 % \item An output stream for writing a stripped file.
3709 % \end{enumerate}
3711 %    \begin{macrocode}
3712 \def\maxfiles#1{%
3713   \@maxfiles#1\relax
3714   \ifnum\@maxfiles<4
3715     \errhelp{I'm not a magician.  I need at least four^^J%
3716              streams to be able to work properly, but^^J%
3717              you've only let me use \the\@maxfiles.}%
3718     \errmessage{\noexpand\maxfiles limit is too strict.}%
3719     \@maxfiles4
3720   \fi
3722 %    \end{macrocode}
3724 % \changes{2.4a}{1996/10/03}{No default limit since batchfiles are now
3725 %                            \cs{input} (MW)}
3726 % Since batchfiles are now |\input|ed there should be no default limit
3727 % here. I'll just use some abstract large number.
3728 %    \begin{macrocode}
3729 \maxfiles{1972} % year of my birth (MW)
3730 %    \end{macrocode}
3732 % \end{macro}
3734 % \begin{macro}{\maxoutfiles}
3735 % \changes{2.4a}{1996/06/06}{Macro added (MDW)}
3737 % Maybe there's a restriction on just output streams.  (Well, there is:
3738 % I know, because \TeX\ only allows 16.)  I may as well allow the
3739 % configuration to set this up.
3741 % Again, I need a counter.
3743 %    \begin{macrocode}
3744 \newcount\@maxoutfiles
3745 %    \end{macrocode}
3747 % And now the macro.  I need at least one output stream which I think is
3748 % reasonable.
3750 %    \begin{macrocode}
3751 \def\maxoutfiles#1{%
3752   \@maxoutfiles=#1\relax
3753   \ifnum\@maxoutfiles<1
3754     \@maxoutfiles1
3755     \errhelp{I'm not a magician.  I need at least one output^^J%
3756              stream to be able to do anything useful at all.^^J%
3757              Please be reasonable.}%
3758     \errmessage{\noexpand\maxoutfiles limit is insane}%
3759   \fi
3761 %    \end{macrocode}
3763 % The default limit is 16, because that's what \TeX\ says.
3765 %    \begin{macrocode}
3766 \maxoutfiles{16}
3767 %    \end{macrocode}
3769 % \end{macro}
3771 % \begin{macro}{\checkfilelimit}
3773 % This checks the file limit when a new batch file is started.  If
3774 % there's fewer than two files left here, we're not going to be able
3775 % to strip any files.  The file limit counter is local to the group
3776 % which is set up around |\batchinput|, so that's all pretty cool.
3778 %    \begin{macrocode}
3779 \def\checkfilelimit{%
3780   \advance\@maxfiles\m@ne
3781   \ifnum\@maxfiles<2 %
3782     \errhelp{There aren't enough streams left to do any unpacking.^^J%
3783              I can't do anything about this, so complain at the^^J%
3784              person who made such a complicated installation.}%
3785     \errmessage{Too few streams left.}%
3786     \end
3787   \fi
3789 %    \end{macrocode}
3791 % \end{macro}
3793 % \subsection{Interaction with the user}
3795 % \begin{macro}{\strip@meaning}
3796 % Throw away the first part of |\meaning| output.
3797 % \changes{2.4c}{1996/06/11}{Macro added (DPC)}
3798 %    \begin{macrocode}
3799 \def\strip@meaning#1>{}
3800 %    \end{macrocode}
3801 % \end{macro}
3803 % \begin{macro}{\processbatchFile}
3804 % \changes{2.0f}{1991/06/04}{Macro added.}
3805 % \changes{2.3e}{1995/09/25}{Batch file is \cs{input}ed not \cs{read}}
3806 %    When \ds{} is run it always tries to use a batch file.
3808 %    For this purpose it calls the macro |\processbatchFile|.
3810 % \changes{2.4a}{1996/06/06}
3811 %      {Added check for file limits (MDW)}
3812 % \changes{2.4c}{1996/06/11}
3813 %      {Add \cs{jobname} checks (DPC)}
3814 % \changes{2.4d}{1996/06/17}
3815 %      {Move \cs{jobname} checks to top level (DPC)}
3816 %    The first thing is to check if there are any input streams left.
3817 %    \begin{macrocode}
3818 \def\processbatchFile{%
3819   \checkfilelimit
3820   \let\next\relax
3821 %    \end{macrocode}
3822 %    Now we try to open the batch file for reading.
3823 %    \begin{macrocode}
3824   \openin\inputcheck \batchfile\relax
3825   \ifeof\inputcheck
3826 %    \end{macrocode}
3827 %    If we didn't succeed in opening the file, we assume that it does
3828 %    not exist. If we tried the default filename, we silently
3829 %    continue; the \ds{} program will switch to interactive mode in
3830 %    this case.
3831 %    \begin{macrocode}
3832     \ifDefault
3833     \else
3834 %    \end{macrocode}
3835 % \changes{2.4d}{1996/10/17}{Missing batchfile an error (DPC)}
3836 %    If we failed to open the user-supplied file, something is wrong
3837 %    and we warn him about it. This will also result in a switch to
3838 %    interactive mode.
3839 %    \begin{macrocode}
3840       \errhelp
3841         {A batchfile specified in \batchinput could not be found.}%
3842       \errmessage{^^J%
3843            **************************************************^^J%
3844            * Could not find your \string\batchfile=\batchfile.^^J%
3845            **************************************************}%
3846     \fi
3847   \else
3848 %    \end{macrocode}
3849 %    When we were successful in opening a file, we again have to check
3850 %    whether it was the default file. In that case we tell the user
3851 %    we found that file and ask him if he wants to use it.
3852 %    \begin{macrocode}
3853     \ifDefault
3854       \Msg{**************************************************^^J%
3855            * Batchfile \DefaultbatchFile\space found Use it? (y/n)?}%
3856       \Ask\answer{%
3857              **************************************************}%
3858     \else
3859 %    \end{macrocode}
3860 %    When it was the user-supplied file we can safely assume he wants
3861 %    to use it so we set |\answer| to \texttt{y}.
3862 %    \begin{macrocode}
3863       \let\answer\y
3864     \fi
3865 %    \end{macrocode}
3866 % If the macro |\answer| contains  a  \texttt{y}  we  can  read  in  the
3867 % batchfile. We do it in an indirect way---after completing |\if|s.
3868 %    \begin{macrocode}
3869     \ifx\answer\y
3870       \closein\inputcheck
3871       \def\next{\@@input\batchfile\relax}%
3872     \fi
3873   \fi
3874   \next}
3875 %    \end{macrocode}
3876 % \end{macro}
3878 % \begin{macro}{\ReportTotals}
3879 % \changes{2.0g}{1991/06/05}{Macro added.} The macro
3880 %    |\ReportTotals| can be used to report total statistics for
3881 %    all files processed. This code is only included in the program if
3882 %    the option \texttt{stats} is included.
3883 %    \begin{macrocode}
3884 %<*stats>
3885 \def\ReportTotals{%
3886   \ifnum\NumberOfFiles>\@ne
3887     \Msg{Overall statistics:^^J%
3888          Files \space processed: \the\NumberOfFiles^^J%
3889          Lines \space processed: \the\TotalprocessedLines^^J%
3890          Comments removed: \the\TotalcommentsRemoved^^J%
3891          Comments \space passed: \the\TotalcommentsPassed^^J%
3892          Codelines passed: \the\TotalcodeLinesPassed}%
3893   \fi}
3894 %</stats>
3895 %    \end{macrocode}
3896 % \end{macro}
3898 % \begin{macro}{\SetFileNames}
3899 %    The macro |\SetFileNames| is used when the program runs in
3900 %    interactive mode and the user was asked to supply extensions and
3901 %    a list of filenames.
3902 %    \begin{macrocode}
3903 \def\SetFileNames{%
3904     \edef\sourceFileName{\MainFileName.\infileext}%
3905     \edef\destFileName{\MainFileName.\outfileext}}
3906 %    \end{macrocode}
3907 % \end{macro}
3909 % \begin{macro}{\CheckFileNames}
3910 %    In interactive mode, the user gets asked for the extensions for
3911 %    the input and output files. Also the name or names of the input
3912 %    files (without extension) is asked for. Then the names of the
3913 %    input and output files are constructed from this information by
3914 %    |\SetFileNames|. This assumes that the name of the input file is
3915 %    the same as the name of the output file. But we should not write
3916 %    to the same file we're reading from so the extensions should
3917 %    differ.
3919 %    The macro |\CheckFileNames| makes sure that the output goes to a
3920 %    different file to the one where the input comes from.
3921 %    \begin{macrocode}
3922 \def\CheckFileNames{%
3923     \ifx\sourceFileName\destFileName
3924 %    \end{macrocode}
3925 %    If input and output files are the same we signal an error and stop
3926 %    processing.
3927 %    \begin{macrocode}
3928       \Msg{^^J%
3929      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!^^J%
3930      ! It is not possible to read from and write to the same file !^^J%
3931      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!^^J}%
3932       \Continuefalse
3933     \else
3934 %    \end{macrocode}
3935 %    If they are not the same we check if the input file exists by
3936 %    trying to open it for reading.
3937 %    \begin{macrocode}
3938       \Continuetrue
3939       \immediate\openin\inFile \sourceFileName\relax
3940       \ifeof\inFile
3941 %    \end{macrocode}
3942 %    If an end of file was found, the file couldn't be opened, so we
3943 %    signal an error and stop processing.
3944 %    \begin{macrocode}
3945         \Msg{^^J%
3946               !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!^^J%
3947               ! Your input file `\sourceFileName' was not found !^^J%
3948               !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!^^J}%
3949         \Continuefalse
3950       \else
3951 %    \end{macrocode}
3952 %    The last check we have to make is if the output file already
3953 %    exists.  Therefore we try to open it for reading.
3954 %    As a precaution we first close the input stream.
3955 % \changes{2.0p}{1992/06/26}{Added \cs{WriteToDir} (FMi).}
3956 % \changes{2.0r}{1992/08/17}{Use \cs{inFile} for reading}
3957 % \changes{2.0r}{1992/08/17}{Moved \cs{closein} statements}
3958 %    \begin{macrocode}
3959         \immediate\closein\inFile
3960         \immediate\openin\inFile\destdir \destFileName\relax
3961         \ifeof\inFile
3962 %    \end{macrocode}
3963 %    If this fails, it didn't exist and all is well.
3964 %    \begin{macrocode}
3965           \Continuetrue
3966         \else
3967 %    \end{macrocode}
3968 %    If opening of the output file for reading succeeded we have to
3969 %    ask the user if he wants to overwrite it. We assume he doesn't
3970 %    want to overwrite it, so the switch |\ifContinue| is initially
3971 %    set to \meta{false}. Only if he answers the question positively
3972 %    with `\texttt{y}' or `\texttt{yes}' we set the switch back to
3973 %    \meta{true}.
3974 % \changes{2.0p}{1992/06/26}{Changed question about overwriting.}
3975 %    \begin{macrocode}
3976           \Continuefalse
3977           \Ask\answer{File \destdir\destFileName\space already
3978                       exists
3979                       \ifx\empty\destdir somewhere \fi
3980                       on the system.^^J%
3981                       Overwrite it%
3982                       \ifx\empty\destdir\space if necessary\fi
3983                       ? [y/n]}%
3984           \ifx\y  \answer \Continuetrue \else
3985           \ifx\yes\answer \Continuetrue \else
3986           \fi\fi
3987         \fi
3988 %    \end{macrocode}
3989 %    All checks have been performed now, so we can close any file that
3990 %    was opened just for this purpose.
3991 %    \begin{macrocode}
3992       \fi
3993     \fi
3994     \closein\inFile}
3995 %    \end{macrocode}
3996 % \end{macro}
3998 % \begin{macro}{\interactive}
3999 %    The macro |\interactive| implements the interactive mode of the
4000 %    \ds{} program. The macro is implemented using the
4001 %    \meta{while} construction. While the switch |\ifMoreFiles| remains
4002 %    true, we continue processing.
4003 %    \begin{macrocode}
4004 \def\interactive{%
4005   \whileswitch\ifMoreFiles\fi%
4006 %    \end{macrocode}
4007 %    To keep macro redefinitions local we start a group and ask the
4008 %    user some questions about what he wants us to do.
4009 %    \begin{macrocode}
4010    {\begingroup
4011       \AskQuestions
4012 %    \end{macrocode}
4013 %    The names of the files that have to be processed are stored as a
4014 %    comma-separated list in the macro |\filelist| by |\AskQuestions|.
4015 %    We use a \meta{for} loop to process the files one by one.
4016 %    \begin{macrocode}
4017       \forlist\MainFileName:=\filelist
4018       \do
4019 %    \end{macrocode}
4020 %    First the names of the input and output files are constructed
4021 %    and a check is made if all filename information is correct.
4022 %    \begin{macrocode}
4023         \SetFileNames
4024         \CheckFileNames
4025         \ifContinue
4026 %    \end{macrocode}
4027 %    If everything was well, produce output file.
4028 % \changes{2.0q}{1992/07/01}{Preceded filename by \cs{WriteToDir}}
4029 %    \begin{macrocode}
4030         \generateFile{\destFileName}{f}%
4031                      {\from{\sourceFileName}{\Options}}
4032         \fi%
4033 %    \end{macrocode}
4034 %    This process is repeated until |\filelist| is exhausted.
4035 %    \begin{macrocode}
4036       \od
4037     \endgroup
4038 %    \end{macrocode}
4039 %    Maybe the user wants more files to be processed, possibly with
4040 %    another set of options, so we give him the opportunity.
4041 %    \begin{macrocode}
4042     \Ask\answer{More files to process (y/n)?}%
4043     \ifx\y  \answer\MoreFilestrue \else
4044     \ifx\yes\answer\MoreFilestrue \else
4045 %    \end{macrocode}
4046 %    If he didn't want to process any more files, the switch
4047 %    |\ifMoreFiles| is set to \meta{false} in order to interrupt the
4048 %    \meta{while} loop.
4049 %    \begin{macrocode}
4050                    \MoreFilesfalse\fi\fi
4051    }}
4052 %    \end{macrocode}
4053 % \end{macro}
4055 % \begin{macro}{\AskQuestions}
4056 % \changes{2.0e}{1991/06/01}{Macro added.}
4057 %    The macro |\AskQuestions| is called by |\interactive| to get
4058 %    some information from the user concerning the files that need
4059 %    to be processed.
4060 %    \begin{macrocode}
4061 \def\AskQuestions{%
4062     \Msg{^^J%
4063          ****************************************************}%
4064 %    \end{macrocode}
4065 %    We want to know the extension of the input files,
4066 %    \begin{macrocode}
4067     \Ask\infileext{%
4068          * First type the extension of your input file(s): \space  *}%
4069     \Msg{****************************************************^^J^^J%
4070          ****************************************************}%
4071 %    \end{macrocode}
4072 %    the extension of the output files,
4073 %    \begin{macrocode}
4074     \Ask\outfileext{%
4075          * Now type the extension of your output file(s) \space: *}%
4076     \Msg{****************************************************^^J^^J%
4077          ****************************************************}%
4078 %    \end{macrocode}
4079 %    if options are to be included and
4080 %    \begin{macrocode}
4081     \Ask\Options{%
4082        * Now type the name(s) of option(s) to include \space\space: *}%
4083     \Msg{****************************************************^^J^^J%
4084          ****************************************************^^J%
4085        * Finally give the list of input file(s) without \space\space*}%
4086 %    \end{macrocode}
4087 %    the name of the input file or a list of names, separated by commas.
4088 % \changes{2.5e}{2014/09/29}{Typo in \cs{Ask} argument fixed}
4089 %    \begin{macrocode}
4090     \Ask\filelist{%
4091          * extension separated by commas if necessary %
4092                                   \space\space\space\space: *}%
4093     \Msg{****************************************************^^J}}%
4094 %    \end{macrocode}
4095 % \end{macro}
4097 % \subsection{The main program}
4098 %    When \TeX\ processes the \ds{} program it displays
4099 %    a message about the version of the program and its function
4100 %    on the terminal.
4101 %    \begin{macrocode}
4102 \Msg{Utility: `docstrip' \fileversion\space <\filedate>^^J%
4103      English documentation \space\space\space <\docdate>}%
4104 \Msg{^^J%
4105      **********************************************************^^J%
4106      * This program converts documented macro-files into fast *^^J%
4107      * loadable files by stripping off (nearly) all comments! *^^J%
4108      **********************************************************^^J}%
4109 %    \end{macrocode}
4112 %  \begin{macro}{\WriteToDir}
4113 %    Macro |\WriteToDir| is either empty or holds the prefix
4114 %    necessary to read a file from the current directory. Under UNIX
4115 %    this is |./| but a lot of other systems addopted this concept.
4116 %    This macro is a default value for |\destdir|.
4118 %    The definition of this macro is now delayed until |\@setwritedir|
4119 %    is called.
4120 % \changes{2.0p}{1992/06/26}{Macro added (FMi).}
4121 % \changes{2.2a}{1993/12/02}{check texsys file}
4122 % \changes{2.2d}{1994/01/20}{do not read dircheck/texsys file}
4123 % \changes{2.4e}{1996/10/22}{set in \cs{@setwritedir} (DPC)}
4124 %  \end{macro}
4126 % \begin{macro}{\makepathname}
4127 % \changes{2.3e}{1995/10/24}{Macro added}
4128 % \changes{2.4e}{1996/10/22}{set in \cs{@setwritedir} (DPC)}
4129 %    This macro should define |\@pathname| to full path name made by
4130 %    combining current value of |\destdir| with its one argument being
4131 %    a file name.  Its default value defined here is suitable for
4132 %    \textsc{unix, ms-dos} and Macintosh, but for some systems it may
4133 %    be needed to redefine this in \texttt{docstrip.cfg} file.  We
4134 %    provide such redefinition for VMS here.
4136 %    Macro |\dirsep| holds directory separator specific for a
4137 %    system. Default value suitable for UNIX and DOS is slash. It
4138 %    comes in action when |\usedir| labels are used directly.
4140 %    The definition of this macro is now delayed until |\@setwritedir|
4141 %    is called.
4142 % \end{macro}
4144 % \begin{macro}{\@setwritedir}
4145 % \changes{2.4e}{1996/10/22}{macro added (DPC)}
4146 % The following tests try to automatically set the macros |\WriteToDir|,
4147 % |\dirname| and |\makepathname| in Unix, Mac, or VMS style.
4148 % The tests are not run at the top level but held in this macro
4149 % so that a configuration file has a chance to define |\WriteToDir|
4150 % which allows the other two to be set automatically. The tests could
4151 % more simply be run after the configuration file is read, but the
4152 % configuration commands like |\BaseDirectory| need (at least at
4153 % present)  to have |\dirsep| correctly defined. It does not define
4154 % any command that is already defined, so by defining these commands
4155 % a configuration file can produce different effects for special needs.
4156 % So this command is called by |BaseDirectory|, |\UseTDS|,
4157 % |\DeclareDir| and finally at the top level after the cfg is run.
4158 % It begins by redefining itself to be a no-op so it effectively is
4159 % only called once.
4160 %    \begin{macrocode}
4161 \def\@setwritetodir{%
4162   \let\setwritetodir\relax
4163 %    \end{macrocode}
4165 %    \begin{macrocode}
4166   \ifx\WriteToDir\@undefined
4167     \ifx\@currdir\@undefined
4168       \def\WriteToDir{}%
4169     \else
4170       \let\WriteToDir\@currdir
4171     \fi
4172   \fi
4173 %    \end{macrocode}
4175 %    \begin{macrocode}
4176   \let\destdir\WriteToDir
4177 %    \end{macrocode}
4179 % VMS Style.
4180 %    \begin{macrocode}
4181   \def\tmp{[]}%
4182   \ifx\tmp\WriteToDir
4183     \ifx\dirsep\@undefined
4184       \def\dirsep{.}%
4185     \fi
4186     \ifx\makepathname\@undefined
4187       \def\makepathname##1{%
4188         \edef\@pathname{\ifx\WriteToDir\destdir
4189           \WriteToDir\else[\destdir]\fi##1}}%
4190     \fi
4191   \fi
4192 %    \end{macrocode}
4194 % Unix and Mac styles.
4195 %    \begin{macrocode}
4196   \ifx\dirsep\@undefined
4197     \def\dirsep{/}%
4198     \def\tmp{:}%
4199     \ifx\tmp\WriteToDir
4200       \def\dirsep{:}%
4201     \fi
4202   \fi
4203 %    \end{macrocode}
4205 %    \begin{macrocode}
4206   \ifx\makepathname\@undefined
4207     \def\makepathname##1{%
4208       \edef\@pathname{\destdir\ifx\empty\destdir\else
4209            \ifx\WriteToDir\destdir\else\dirsep\fi\fi##1}}%
4210   \fi}
4211 %    \end{macrocode}
4212 % \end{macro}
4215 % If the user has a |docstrip.cfg| file, use it now.
4216 % \changes{2.4d}{1995/10/17}{Move config file test to outer level (DPC)}
4217 %    This macro tries to read \texttt{docstrip.cfg} file.  If this
4218 %    succeeds executes its first argument, otherwise the second.
4219 %    \begin{macrocode}
4220 \immediate\openin\inputcheck=docstrip.cfg\relax
4221 \ifeof\inputcheck
4222   \Msg{%
4223      ********************************************************^^J%
4224      * No Configuration file found, using default settings. *^^J%
4225      ********************************************************^^J}%
4226 \else
4227   \Msg{%
4228      ******************************************^^J%
4229      * Using Configuration file docstrip.cfg. *^^J%
4230      ******************************************^^J}%
4231   \closein\inputcheck
4232   \afterfi{\@@input docstrip.cfg\relax}
4234 %    \end{macrocode}
4236 % Now run |\@setwritedir| in case it has not already been run
4237 % by a command in a configuration file.
4238 %    \begin{macrocode}
4239 \@setwritetodir
4240 %    \end{macrocode}
4242 % \begin{macro}{\process@first@batchfile}
4243 % \changes{2.4d}{1996/10/17}
4244 %      {Macro added (DPC)}
4245 % Process the batch file, and then terminate cleanly.
4246 % This may be set to |\relax| for `new style' batch files that
4247 % do not start with |\def\batchfile{|\ldots
4248 %    \begin{macrocode}
4249 \def\process@first@batchfile{%
4250   \processbatchFile
4251   \ifnum\NumberOfFiles=\z@
4252     \interactive
4253   \fi
4254   \endbatchfile}
4255 %    \end{macrocode}
4256 % \end{macro}
4258 % \begin{macro}{\endbatchfile}
4259 % \changes{2.4d}{1996/10/17}
4260 %      {Macro added (DPC)}
4261 % User level command to end batch file processing.
4262 % At the top level, returns totals and then stops \TeX.
4263 % At nested levels just does |\endinput|.
4264 %    \begin{macrocode}
4265 \def\endbatchfile{%
4266   \iftopbatchfile
4267 %<*stats>
4268     \ReportTotals
4269 %</stats>
4270     \expandafter\end
4271   \else
4272     \endinput
4273   \fi}
4274 %    \end{macrocode}
4275 % \end{macro}
4277 %    Now we see whether to process a batch file.
4278 % \changes{2.4d}{1996/10/17}
4279 %      {Move default batchfile check to outer level (DPC)}
4282 % \begin{macro}{\@jobname}
4283 % \changes{2.4d}{1996/10/17}
4284 %      {Macro added (DPC)}
4285 % Jobname (catcode 12)
4286 %    \begin{macrocode}
4287 \edef\@jobname{\lowercase{\def\noexpand\@jobname{\jobname}}}%
4288 \@jobname
4289 %    \end{macrocode}
4290 % \end{macro}
4293 % \begin{macro}{\@docstrip}
4294 % \changes{2.4d}{1996/10/17}
4295 %      {Macro added (DPC)}
4296 % docstrip (catcode 12)
4297 %    \begin{macrocode}
4298 \def\@docstrip{docstrip}%
4299 \edef\@docstrip{\expandafter\strip@meaning\meaning\@docstrip}
4300 %    \end{macrocode}
4301 % \end{macro}
4303 %    First check whether the user has
4304 %    defined the control sequence |\batchfile|. If he did, it should
4305 %    contain the name of the file to process.
4306 %    If he didn't, try the current file, unless that is |docstrip.tex|
4307 %    in which case a default name is tried.
4308 %    Whether or not the default batch file is used is
4309 %    remembered by setting the switch |\ifDefault| to \meta{true} or
4310 %    \meta{false}.
4311 %    \begin{macrocode}
4312 \Defaultfalse
4313 %    \end{macrocode}
4315 %    \begin{macrocode}
4316 \ifx\undefined\batchfile
4317 %    \end{macrocode}
4318 % |\@jobname| is lowercase jobname (catcode 12)\\
4319 % |\@docstrip| is docstrip (catcode 12)
4320 %    \begin{macrocode}
4321   \ifx\@jobname\@docstrip
4322 %    \end{macrocode}
4323 % Set the batchfile to the default
4324 %    \begin{macrocode}
4325     \let\batchfile\DefaultbatchFile
4326     \Defaulttrue
4327 %    \end{macrocode}
4328 %  Else don't process a new batchfile, just carry on with past the end
4329 % of this file. In this case processing will move to the initial
4330 % batchfile which \emph{must} then be terminated by |\endbatchfile| or
4331 % \TeX\ will fall to the star prompt.
4332 %    \begin{macrocode}
4333   \else
4334     \let\process@first@batchfile\relax
4335   \fi
4337 \process@first@batchfile
4338 %    \end{macrocode}
4340 %    \begin{macrocode}
4341 %</program>
4342 %    \end{macrocode}
4344 % \Finale
4345 \endinput