Update LuaTeX testfiles for ^@ change
[latex2e.git] / latex2e-20170101 / required / tools / verbatim.dtx
blobb47419085c2355c4e3d981f01e6a2f92ab9d6538
1 % \iffalse meta-comment
3 % Copyright 1993-2014
5 % The LaTeX3 Project and any individual authors listed elsewhere
6 % in this file.
8 % This file is part of the Standard LaTeX `Tools Bundle'.
9 % -------------------------------------------------------
11 % It may be distributed and/or modified under the
12 % conditions of the LaTeX Project Public License, either version 1.3c
13 % of this license or (at your option) any later version.
14 % The latest version of this license is in
15 %    http://www.latex-project.org/lppl.txt
16 % and version 1.3c or later is part of all distributions of LaTeX
17 % version 2005/12/01 or later.
19 % The list of all files belonging to the LaTeX `Tools Bundle' is
20 % given in the file `manifest.txt'.
22 % \fi
24 %\iffalse   % this is a METACOMMENT !
27 %% Package `verbatim' to use with LaTeX2e
28 %% Copyright (C) 1989--2003 by Rainer Sch\"opf. All rights reserved.
30 % Copying of this file is authorized only if either
31 % (1) you make absolutely no changes to your copy, including name, or
32 % (2) if you do make changes, you name it something other than
33 %     verbatim.dtx.
34 % This restriction helps ensure that all styles developed here
35 % remain identical.
39 % \section{Producing the documentation}
41 % We provide a short driver file that can be extracted by the
42 % \textsf{DocStrip} program using the conditional `\textsf{driver}'.
44 %    \begin{macrocode}
45 %<*driver>
46 \documentclass{ltxdoc}
48 \pagestyle{myheadings}
50 \title{A New Implementation of \LaTeX{}'s \\ \texttt{verbatim}
51        and \texttt{verbatim*} Environments.}
52 \author{Rainer Sch\"opf\\
53         \and
54         Bernd Raichle\\
55         \and
56         Chris Rowley}
58 \date{2001/03/12}
59 \begin{document}
60 \markboth{Verbatim style option}{Verbatim style option}
61 \MaintainedByLaTeXTeam{tools}
62 \maketitle
63   \DocInput{verbatim.dtx}
64 \end{document}
65 %</driver>
66 %    \end{macrocode}
69 %\fi
72 % \changes{v1.5q}{2003/08/22}{Reintroduced \cs{@noligs}, by popular
73 %                             request.}
74 % \changes{v1.5i}{1996/06/04}{Move setting of verbatim font and
75 %                             \cs{@noligs}.}
76 % \changes{v1.5g}{1995/04/26}{Removed \cs{fileversion} and
77 %                             \cs{filedate} from running head in
78 %                             driver file, as these are no longer
79 %                             defined.}
80 % \changes{v1.5f}{1994/10/25}{Removed extra \cs{typeout} commands.}
81 % \changes{v1.5e}{1994/06/10}{Added missing closing verbtest guard.}
82 % \changes{v1.5d}{1994/05/30}{\cs{NeedsTeXFormat} and
83 %                             \cs{ProvidesPackage} added.}
84 % \changes{v1.5d}{1994/05/30}{\cs{addto@hook} removed, now in kernel.}
85 % \changes{v1.5a}{1993/10/12}{Included \cs{newverbtext} command, as
86 %          written by Chris Rowley.}
87 % \changes{v1.5}{1993/10/11}{Included vrbinput style option by Bernd
88 %          Raichle.}
90 % \changes{v1.4j}{1992/06/30}{Used \cs{lowercase}\{\cs{endgroup}
91 %    \ldots\} trick proposed by Bernd Raichle; changed all \cs{gdef}
92 %    to \cs{def} since no longer necessary.}
93 % \changes{v1.4g}{1991/11/21}{Several improvements in the
94 %                           documentation.}
95 % \changes{v1.4f}{1991/08/05}{Corrected bug in documentation.
96 %                           Found by Bernd Raichle.}
97 % \changes{v1.4e}{1991/07/24}{Avoid reading this file twice.}
98 % \changes{v1.4d}{1991/04/24}{\cs{penalty}\cs{interlinepenalty} added to
99 %                           definition of \cs{par} in \cs{@verbatim}.
100 %                           Necessary to avoid page breaks in
101 %                           the scope of a \cs{samepage} declaration.}
102 % \changes{v1.4c}{1990/10/18}{Added \cs{leavevmode} to definition of
103 %       backquote macro.}
104 % \changes{v1.4b}{1990/07/14}{Converted nearly all \cs{verb}'s to
105 %       \texttt{\protect\string!|\ldots\protect\string!|}.}
106 % \changes{v1.4a}{1990/04/04}{Added a number of percent characters
107 %       to suppress blank space at the end of some code lines.}
108 % \changes{v1.4}{1990/03/07}{\cs{verb} rewritten.}
110 % \changes{v1.3a}{1990/02/04}{Removed \texttt{verbatimwrite} environment
111 %       from the code. Now only shown as an example.}
113 % \changes{v1.2g}{1990/02/01}{Revised documentation.}
114 % \changes{v1.2e}{1990/01/15}{Added \cs{every@verbatim} hook.}
115 % \changes{v1.2d}{1989/11/29}{Use token register \cs{@temptokena}
116 %                           instead of macro \cs{@tempb}.}
117 % \changes{v1.2d}{1989/11/29}{Use token register \cs{verbatim@line}
118 %                           instead of macro \cs{@tempd}.}
119 % \changes{v1.2b}{1989/10/25}{\cs{verbatimfile} renamed to
120 %           \cs{verbatiminput}. Suggested by Reinhard Wonneberger.}
122 % \changes{v1.1a}{1989/10/16}{\cs{verb} added.}
123 % \changes{v1.1}{1989/10/09}{Made the code more modular (as suggested by
124 %                          Chris Rowley):  introduced
125 %                          \cs{verbatim@addtoline}, etc.  Added
126 %                          \cs{verbatimwrite} environment.}
128 % \changes{v1.0e}{1989/07/17}{Fixed bug in \cs{verbatimfile} (*-form
129 %         handling, discovered by Dirk Kreimer).}
130 % \changes{v1.0d}{1989/05/16}{Revised documentation, fixed silly bug
131 %         in \cs{verbatim@@@}.}
132 % \changes{v1.0c}{1989/05/12}{Added redefinition of \cs{@sverb}, change
133 %         in end-of-line handling.}
134 % \changes{v1.0b}{1989/05/09}{Change in \cs{verbatim@rescan}.}
135 % \changes{v1.0a}{1989/05/07}{Change in \cs{verbatim@@testend}.}
138 % \DoNotIndex{\ ,\!,\C,\[,\\,\],\^,\`,\{,\},\~}
139 % \DoNotIndex{\@M,\@empty,\@flushglue,\@gobble,\@ifstar,\@ifundefined}
140 % \DoNotIndex{\@namedef,\@spaces,\@tempa,\@tempb,\@tempc,\@tempd}
141 % \DoNotIndex{\@temptokena,\@totalleftmargin,\@warning,\active}
142 % \DoNotIndex{\aftergroup,\arabic,\begingroup,\catcode,\char,\closein}
143 % \DoNotIndex{\csname,\def,\do,\docdate,\dospecials,\edef,\else}
144 % \DoNotIndex{\endcsname,\endgraf,\endgroup,\endinput,\endlinechar}
145 % \DoNotIndex{\endtrivlist,\expandafter,\fi,\filedate,\fileversion}
146 % \DoNotIndex{\frenchspacing,\futurelet,\if,\ifcat,\ifeof,\ifnum}
147 % \DoNotIndex{\ifx,\immediate,\item,\kern,\lccode,\leftskip,\let}
148 % \DoNotIndex{\lowercase,\m@ne,\makeatletter,\makeatother,\newread}
149 % \DoNotIndex{\newread,\next,\noexpand,\noindent,\openin,\parfillskip}
150 % \DoNotIndex{\parindent,\parskip,\penalty,\read,\relax,\rightskip}
151 % \DoNotIndex{\sloppy,\space,\string,\the,\toks@,\trivlist,\tt,\typeout}
152 % \DoNotIndex{\vskip,\write,\z@}
154 % \begin{abstract}
155 %   This package reimplements the \LaTeX{} \texttt{verbatim} and
156 %   \texttt{verbatim*} environments.
157 %   In addition it provides a \texttt{comment} environment
158 %   that skips any commands or text between
159 %   |\begin{comment}|
160 %   and the next |\end{comment}|.
161 %   It also defines the command \texttt{verbatiminput} to input a whole
162 %   file verbatim.
163 % \end{abstract}
165 % \section{Usage notes}
167 % \let\docDescribeMacro\DescribeMacro
168 % \let\docDescribeEnv\DescribeEnv
169 % \def\DescribeMacro#1{}
170 % \def\DescribeEnv#1{}
171 % \LaTeX's \texttt{verbatim} and \texttt{verbatim*} environments
172 % have a few features that may give rise to problems. These are:
173 % \begin{itemize}
174 %   \item
175 %     Due to the method used to detect the closing |\end{verbatim}|
176 %     (i.e.\ macro parameter delimiting) you cannot leave spaces
177 %     between the |\end| token and |{verbatim}|.
178 %   \item
179 %     Since \TeX{} has to read all the text between the
180 %     |\begin{verbatim}| and the |\end{verbatim}| before it can output
181 %     anything, long verbatim listings may overflow \TeX's memory.
182 % \end{itemize}
183 % Whereas the first     of these points can be considered
184 % only a minor nuisance the other one is a real limitation.
187 % \DescribeEnv{verbatim}
188 % \DescribeEnv{verbatim*}
189 % This package file contains a reimplementation of the \texttt{verbatim}
190 % and \texttt{verbatim*} environments which overcomes these
191 % restrictions.
192 % There is, however, one incompatibility between the old and the
193 % new implementations of these environments: the old version
194 % would treat text on the same line as the |\end{verbatim}|
195 % command as if it were on a line by itself.
196 % \begin{center}
197 %   \bf This new version will simply ignore it.
198 % \end{center}
199 % (This is the price one has to pay for the removal of the old
200 % \texttt{verbatim} environment's size limitations.)
201 % It will, however, issue a warning message of the form
202 % \begin{verbatim}
203 %LaTeX warning: Characters dropped after \end{verbatim*}!
204 %\end{verbatim}
205 % This is not a real problem since this text can easily be put
206 % on the next line without affecting the output.
208 % This new implementation also solves the second problem mentioned
209 % above: it is possible to leave spaces (but \emph{not} begin a new
210 % line) between the |\end| and the |{verbatim}| or |{verbatim*}|:
211 % \begin{verbatim}
212 %\begin {verbatim*}
213 %   test
214 %   test
215 %\end {verbatim*}
216 %\end{verbatim}
218 % \DescribeEnv{comment}
219 % Additionally we introduce a \texttt{comment} environment, with the
220 % effect that the text between |\begin{comment}| and |\end{comment}|
221 % is simply ignored, regardless of what it looks like.
222 % At first sight this seems to be quite different from the purpose
223 % of verbatim listing, but actually the implementation of these two
224 % concepts turns out to be very similar.
225 % Both rely on the fact that the text between |\begin{...}| and
226 % |\end{...}| is read by \TeX{} without interpreting any commands or
227 % special characters.
228 % The remaining difference between \texttt{verbatim} and
229 % \texttt{comment} is only that the text is to be typeset in the
230 % first case and to be thrown away in the latter. Note that these
231 % environments cannot be nested.
233 % \DescribeMacro{\verbatiminput}
234 % |\verbatiminput| is a command with one argument that inputs a file
235 % verbatim, i.e.\ the command |verbatiminput{xx.yy}|
236 % has the same effect as\\[2pt]
237 %   \hspace*{\MacroIndent}|\begin{verbatim}|\\
238 %   \hspace*{\MacroIndent}\meta{Contents of the file \texttt{xx.yy}}\\
239 %   \hspace*{\MacroIndent}|\end{verbatim}|\\[2pt]
240 % This command has also a |*|-variant that prints spaces as \verb*+ +.
243 % \StopEventually{}
246 % \section{Interfaces for package writers}
248 % The \texttt{verbatim} environment of \LaTeXe{} does not
249 % offer a good interface to programmers.
250 % In contrast, this package provides a simple mechanism to
251 % implement similar features, the \texttt{comment} environment
252 % implemented here being an example of what can be done and how.
255 % \subsection{Simple examples}
257 % It is now possible to use the \texttt{verbatim} environment to define
258 % environments of your own.
259 % E.g.,
260 %\begin{verbatim}
261 % \newenvironment{myverbatim}%
262 %   {\endgraf\noindent MYVERBATIM:%
263 %    \endgraf\verbatim}%
264 %   {\endverbatim}
265 %\end{verbatim}
266 % can be used afterwards like the \texttt{verbatim} environment, i.e.
267 % \begin{verbatim}
268 %\begin {myverbatim}
269 %  test
270 %  test
271 %\end {myverbatim}
272 %\end{verbatim}
273 % Another way to use it is to write
274 % \begin{verbatim}
275 %\let\foo=\comment
276 %\let\endfoo=\endcomment
277 %\end{verbatim}
278 % and from that point on environment \texttt{foo} is the same as the
279 % comment environment, i.e.\ everything inside its body is ignored.
281 % You may also add special commands after the |\verbatim| macro is
282 % invoked, e.g.
283 %\begin{verbatim}
284 %\newenvironment{myverbatim}%
285 %  {\verbatim\myspecialverbatimsetup}%
286 %  {\endverbatim}
287 %\end{verbatim}
288 % though you may want to learn about the hook |\every@verbatim| at
289 % this point.
290 % \changes{v1.5h}{1995/09/21}{Clarified documentation on use of other
291 %               environments to define new verbatim-type ones.}
292 % However, there are still a number of restrictions:
293 % \begin{enumerate}
294 %   \item
295 %     You must not use the |\begin| or the |\end| command inside a
296 %     definition, e.g.~the following two examples will \emph{not} work:
297 %\begin{verbatim*}
298 %\newenvironment{myverbatim}%
299 %{\endgraf\noindent MYVERBATIM:%
300 % \endgraf\begin{verbatim}}%
301 %{\end{verbatim}}
302 %\newenvironment{fred}
303 %{\begin{minipage}{30mm}\verbatim}
304 %{\endverbatim\end{minipage}}
305 %\end{verbatim*}
306 %     If you try these examples, \TeX{} will report a
307 %     ``runaway argument'' error.
308 %     More generally, it is not possible to use
309 %     |\begin|\ldots\allowbreak|\end|
310 %     or the related environments in the definition of the new
311 %     environment. Instead, the correct way to define this environment
312 %     would be
313 %    \begin{verbatim*}
314 %\newenvironment{fred}
315 %{\minipage{30mm}\verbatim}
316 %{\endverbatim\endminipage}
317 %\end{verbatim*}
318 %   \item
319 %     You can\emph{not} use the \texttt{verbatim} environment inside
320 %     user defined \emph{commands}; e.g.,
321 % \changes{v1.4g}{1991/11/21}{Corrected wrong position of optional
322 %        argument to \cs{newcommand}. Discovered by Piet van Oostrum.}
323 %     \begin{verbatim*}
324 %\newcommand{\verbatimfile}[1]%
325 %           {\begin{verbatim}\input{#1}\end{verbatim}}
326 %\end{verbatim*}
327 %     does \emph{not} work; nor does
328 %     \begin{verbatim}
329 %\newcommand{\verbatimfile}[1]{\verbatim\input{#1}\endverbatim}
330 %\end{verbatim}
331 %   \item The name of the newly defined environment must not contain
332 %     characters with category code other than $11$ (letter) or
333 %     $12$ (other), or this will not work.
334 % \end{enumerate}
337 % \subsection{The interfaces}
339 % \DescribeMacro{\verbatim@font}
340 % Let us start with the simple things.
341 % Sometimes it may be necessary to use a special typeface for your
342 % verbatim text, or perhaps the usual computer modern typewriter shape
343 % in a reduced size.
345 % You may select this by redefining the macro |\verbatim@font|.
346 % This macro is executed at the beginning of every verbatim text to
347 % select the font shape.
348 % Do not use it for other purposes; if you find yourself abusing this
349 % you may want to read about the |\every@verbatim| hook below.
351 % By default, |\verbatim@font| switches to the typewriter font and
352 % disables the ligatures contained therein.
355 % \DescribeMacro{\every@verbatim}
356 % \DescribeMacro{\addto@hook}
357 % There is a hook (i.e.\ a token register) called |\every@verbatim|
358 % whose contents are inserted into \TeX's mouth just before every
359 % verbatim text.
360 % Please use the |\addto@hook| macro to add something to this hook.
361 % It is used as follows:\\[2pt]
362 % \hspace*{\MacroIndent}|\addto@hook|\meta{name of the hook}^^A
363 %  |{|\meta{commands to be added}|}|
364 % \vspace*{2pt}
368 % \DescribeMacro{\verbatim@start}
369 % After all specific setup, like switching of category codes, has been
370 % done, the |\verbatim@start| macro is called.
371 % This starts the main loop of the scanning mechanism implemented here.
372 % Any other environment that wants to make use of this feature should
373 % execute this macro as its last action.
376 % \DescribeMacro{\verbatim@startline}
377 % \DescribeMacro{\verbatim@addtoline}
378 % \DescribeMacro{\verbatim@processline}
379 % \DescribeMacro{\verbatim@finish}
380 % These are the things that concern the start of a verbatim
381 % environment.
382 % Once this (and other) setup has been done, the code in this package
383 % reads and processes characters from the input stream in the
384 % following way:
385 % \begin{enumerate}
386 %   \item Before the first character of an input line is read, it
387 %     executes the macro |\verbatim@startline|.
388 %   \item After some characters have been read, the macro
389 %     |\verbatim@addtoline| is called with these characters as its only
390 %     argument.
391 %     This may happen several times per line (when an |\end| command is
392 %     present on the line in question).
393 %   \item When the end of the line is reached, the macro
394 %     |\verbatim@processline| is called to process the characters that
395 %     |\verbatim@addtoline| has accumulated.
396 %   \item Finally, there is the macro |\verbatim@finish| that is called
397 %     just before the environment is ended by a call to the |\end|
398 %      macro.
399 % \end{enumerate}
402 % To make this clear let us consider the standard \texttt{verbatim}
403 % environment.
404 % In this case the three macros above are defined as follows:
405 % \begin{enumerate}
406 %   \item |\verbatim@startline| clears the character buffer
407 %     (a token register).
408 %   \item |\verbatim@addtoline| adds its argument to the character
409 %     buffer.
410 %   \item |\verbatim@processline| typesets the characters accumulated
411 %     in the buffer.
412 % \end{enumerate}
413 % With this it is very simple to implement the \texttt{comment}
414 % environment:
415 % in this case |\verbatim@startline| and |\verbatim@processline| are
416 % defined to be
417 % no-ops whereas |\verbatim@addtoline| discards its argument.
420 % Let's use this to define a variant of the |verbatim|
421 % environment that prints line numbers in the left margin.
422 % Assume that this would be done by a counter called |VerbatimLineNo|.
423 % Assuming that this counter was initialized properly by the
424 % environment, |\verbatim@processline| would be defined in this case as
425 % \begin{verbatim}
426 %\def\verbatim@processline{%
427 %  \addtocounter{VerbatimLineNo}{1}%
428 %  \leavevmode
429 %  \llap{\theVerbatimLineNo\ \hskip\@totalleftmargin}%
430 %  \the\verbatim@line\par}
431 %\end{verbatim}
433 % A further possibility is to define a variant of the |verbatim|
434 % environment that boxes and centers the whole verbatim text.
435 % Note that the boxed text should be less than a page otherwise you
436 % have to change this example.
438 %\begin{verbatim}
439 %\def\verbatimboxed#1{\begingroup
440 %  \def\verbatim@processline{%
441 %    {\setbox0=\hbox{\the\verbatim@line}%
442 %     \hsize=\wd0
443 %     \the\verbatim@line\par}}%
444 %  \setbox0=\vbox{\parskip=0pt\topsep=0pt\partopsep=0pt
445 %                 \verbatiminput{#1}}%
446 %  \begin{center}\fbox{\box0}\end{center}%
447 % \endgroup}
448 %\end{verbatim}
450 % As a final nontrivial example we describe the definition of an
451 % environment called \texttt{verbatimwrite}.
452 % It writes all text in its body to a file whose name is
453 % given as an argument.
454 % We assume that a stream number called |\verbatim@out| has already
455 % been reserved by means of the |\newwrite| macro.
457 % Let's begin with the definition of the macro |\verbatimwrite|.
458 % \begin{verbatim}
459 %\def\verbatimwrite#1{%
460 %\end{verbatim}
461 % First we call |\@bsphack| so that this environment does not influence
462 % the spacing.
463 % Then we open the file and set the category codes of all special
464 % characters:
465 % \begin{verbatim}
466 %  \@bsphack
467 %  \immediate\openout \verbatim@out #1
468 %  \let\do\@makeother\dospecials
469 %  \catcode`\^^M\active
470 %\end{verbatim}
471 % The default definitions of the macros
472 % \begin{verbatim}
473 %  \verbatim@startline
474 %  \verbatim@addtoline
475 %  \verbatim@finish
476 %\end{verbatim}
477 % are also used in this environment.
478 % Only the macro |\verbatim@processline| has to be changed before
479 % |\verbatim@start| is called:
480 % \begin{verbatim}
481 %  \def\verbatim@processline{%
482 %    \immediate\write\verbatim@out{\the\verbatim@line}}%
483 %  \verbatim@start}
484 %\end{verbatim}
485 % The definition of |\endverbatimwrite| is very simple:
486 % we close the stream and call |\@esphack| to get the spacing right.
487 % \begin{verbatim}
488 %\def\endverbatimwrite{\immediate\closeout\verbatim@out\@esphack}
489 %\end{verbatim}
491 % \section{The implementation}
493 % \let\DescribeMacro\docDescribeMacro
494 % \let\DescribeEnv\docDescribeEnv
496 % \changes{v1.4e}{1991/07/24}{Avoid reading this file twice.}
497 % The very first thing we do is to ensure that this file is not read
498 % in twice. To this end we check whether the macro |\verbatim@@@| is
499 % defined. If so, we just stop reading this file. The `package'
500 % guard here allows most of the code to be excluded when extracting
501 % the driver file for testing this package.
502 %    \begin{macrocode}
503 %<*package>
504 \NeedsTeXFormat{LaTeX2e}
505 \ProvidesPackage{verbatim}
506      [2014/10/28 v1.5q LaTeX2e package for verbatim enhancements]
507 \@ifundefined{verbatim@@@}{}{\endinput}
508 %    \end{macrocode}
510 % We use a mechanism similar to the one implemented for the
511 % |\comment|\ldots\allowbreak|\endcomment| macro in \AmSTeX:
512 % We input one line at a time and check if it contains the |\end{...}|
513 % tokens.
514 % Then we can decide whether we have reached the end of the verbatim
515 % text, or must continue.
518 % \subsection{Preliminaries}
520 % \begin{macro}{\every@verbatim}
521 %    The hook (i.e.\ token register) |\every@verbatim|
522 %    is initialized to \meta{empty}.
523 %    \begin{macrocode}
524 \newtoks\every@verbatim
525 \every@verbatim={}
526 %    \end{macrocode}
527 % \end{macro}
530 % \begin{macro}{\@makeother}
531 % \changes{v1.1a}{1989/10/16}{\cs{@makeother} added.}
532 %    |\@makeother| takes as argument a character and changes
533 %    its category code to $12$ (other).
534 %    \begin{macrocode}
535 \def\@makeother#1{\catcode`#112\relax}
536 %    \end{macrocode}
537 % \end{macro}
540 % \begin{macro}{\@vobeyspaces}
541 % \changes{v1.5}{1993/10/11}{Changed definition to not use \cs{gdef}.}
542 % \changes{v1.1a}{1989/10/16}{\cs{@vobeyspaces} added.}
543 %    The macro |\@vobeyspaces| causes spaces in the input
544 %    to be printed as spaces in the output.
545 %    \begin{macrocode}
546 \begingroup
547  \catcode`\ =\active%
548  \def\x{\def\@vobeyspaces{\catcode`\ \active\let \@xobeysp}}
549  \expandafter\endgroup\x
550 %    \end{macrocode}
551 % \end{macro}
554 % \begin{macro}{\@xobeysp}
555 % \changes{v1.1a}{1989/10/16}{\cs{@xobeysp} added.}
556 %    The macro |\@xobeysp| produces exactly one space in
557 %    the output, protected against breaking just before it.
558 %    (|\@M| is an abbreviation for the number $10000$.)
559 %    \begin{macrocode}
560 \def\@xobeysp{\leavevmode\penalty\@M\ }
561 %    \end{macrocode}
562 % \end{macro}
565 % \begin{macro}{\verbatim@line}
566 % \changes{v1.2d}{1989/11/29}{Introduced token register
567 %                \cs{verbatim@line}.}
568 %    We use a newly defined token register called |\verbatim@line|
569 %    that will be used as the character buffer.
570 %    \begin{macrocode}
571 \newtoks\verbatim@line
572 %    \end{macrocode}
573 % \end{macro}
575 % The following four macros are defined globally in a way suitable for
576 % the \texttt{verbatim} and \texttt{verbatim*} environments.
577 % \begin{macro}{\verbatim@startline}
578 % \begin{macro}{\verbatim@addtoline}
579 % \begin{macro}{\verbatim@processline}
580 %    |\verbatim@startline| initializes processing of a line
581 %    by emptying the character buffer (|\verbatim@line|).
582 %    \begin{macrocode}
583 \def\verbatim@startline{\verbatim@line{}}
584 %    \end{macrocode}
585 %    |\verbatim@addtoline| adds the tokens in its argument
586 %    to our buffer register |\verbatim@line| without expanding
587 %    them.
588 %    \begin{macrocode}
589 \def\verbatim@addtoline#1{%
590   \verbatim@line\expandafter{\the\verbatim@line#1}}
591 %    \end{macrocode}
592 %    Processing a line inside a \texttt{verbatim} or \texttt{verbatim*}
593 %    environment means printing it.
594 % \changes{v1.2c}{1989/10/31}{Changed \cs{@@par} to \cs{par} in
595 %    \cs{verbatim@processline}.  Removed \cs{leavevmode} and \cs{null}
596 %    (i.e.\ the empty \cs{hbox}).}
597 %    Ending the line means that we have to begin a new paragraph.
598 %    We use |\par| for this purpose.  Note that |\par|
599 %    is redefined in |\@verbatim| to force \TeX{} into horizontal
600 %    mode and to insert an empty box so that empty lines in the input
601 %    do appear in the output.
602 % \changes{v1.2f}{1990/01/31}{\cs{verbatim@startline} removed.}
603 %    \begin{macrocode}
604 \def\verbatim@processline{\the\verbatim@line\par}
605 %    \end{macrocode}
606 % \end{macro}
607 % \end{macro}
608 % \end{macro}
610 % \begin{macro}{\verbatim@finish}
611 %    As a default, |\verbatim@finish| processes the remaining
612 %    characters.
613 %    When this macro is called we are facing the following problem:
614 %    when the |\end{verbatim}|
615 %    command is encountered |\verbatim@processline| is called
616 %    to process the characters preceding the command on the same
617 %    line.  If there are none, an empty line would be output if we
618 %    did not check for this case.
620 %    If the line is empty |\the\verbatim@line| expands to
621 %    nothing.  To test this we use a trick similar to that on p.\ 376
622 %    of the \TeX{}book, but with |$|\ldots|$| instead of
623 %    the |!| tokens.  These |$| tokens can never have the same
624 %    category code as a |$| token that might possibly appear in the
625 %    token register |\verbatim@line|, as such a token will always have
626 %    been read with category code $12$ (other).
627 %    Note that |\ifcat| expands the following tokens so that
628 %    |\the\verbatim@line| is replaced by the accumulated
629 %    characters
630 % \changes{v1.2d}{1989/11/29}{Changed \cs{ifx} to \cs{ifcat} test.}
631 % \changes{v1.1b}{1989/10/18}{Corrected bug in if test (found by CRo).}
632 %    \begin{macrocode}
633 \def\verbatim@finish{\ifcat$\the\verbatim@line$\else
634   \verbatim@processline\fi}
635 %    \end{macrocode}
636 % \end{macro}
639 % \subsection{The \texttt{verbatim} and \texttt{verbatim*} environments}
641 % \begin{macro}{\verbatim@font}
642 % \changes{v1.2f}{1990/01/31}{\cs{@lquote} macro removed.}
643 % \changes{v1.1b}{1989/10/18}{\cs{@noligs} removed.  Code inserted
644 %                           directly into \cs{verbatim@font}.}
645 % \changes{v1.1a}{1989/10/16}{\cs{verbatim@font} added.}
646 % \changes{v1.1a}{1989/10/16}{\cs{@noligs} added.}
647 % \changes{v1.1a}{1989/10/16}{\cs{@lquote} added.}
648 %    We start by defining the macro |\verbatim@font| that is
649 %    to select the font and to set font-dependent parameters.
650 %    Then we expand |\@noligs| (defined in the \LaTeXe{} kernel). Among
651 %    possibly other things, it will go through |\verbatim@nolig@list|
652 %    to avoid certain ligatures.
653 %    |\verbatim@nolig@list| is a macro defined in the \LaTeXe{} kernel
654 %    to expand to
655 %    \begin{verbatim}
656 %    \do\`\do\<\do\>\do\,\do\'\do\-
657 %\end{verbatim}
658 %    All the characters in this list can be part of a ligature in some
659 %    font or other.
660 % \changes{v1.2f}{1990/01/31}{\cs{@lquote} macro removed.}
661 % \changes{v1.4c}{1990/10/18}{Added \cs{leavevmode}.}
662 % \changes{v1.4k}{1992/07/13}{Replaced Blank after $96$ by \cs{relax}.
663 %                           (Proposed by Dan Dill.)}
664 % \changes{v1.5}{1993/10/11}{Definition changed according to new code
665 %          in latex.tex and to avoid global definition.}
666 % \changes{v1.5c}{1994/02/07}{Changed to use new font switching
667 %                           commands.}
668 % \changes{v1.5m}{2000/01/07}{Disable hyphenation even if the font
669 %    allows it.}
670 % \changes{v1.5q}{2003/08/22}{Use \cs{@noligs}, as it is by now properly
671 %    defined in the \LaTeXe{} kernel.}
672 %    \begin{macrocode}
673 \def\verbatim@font{\normalfont\ttfamily
674                    \hyphenchar\font\m@ne
675                    \@noligs}
676 %    \end{macrocode}
677 % \end{macro}
680 % \begin{macro}{\@verbatim}
681 % \changes{v1.1a}{1989/10/16}{\cs{@verbatim} added.}
682 %    The macro |\@verbatim| sets up things properly.
683 %    First of all, the tokens of the |\every@verbatim| hook
684 %    are inserted.
685 %    Then a \texttt{trivlist} environment is started and its first
686 %    |\item| command inserted.
687 %    Each line of the \texttt{verbatim} or \texttt{verbatim*}
688 %    environment will be treated as a separate paragraph.
689 % \changes{v1.2e}{1990/01/15}{Added \cs{every@verbatim} hook.}
690 % \changes{v1.5b}{1994/01/24}{Removed optional argument of \cs{item}.}
691 %    \begin{macrocode}
692 \def\@verbatim{\the\every@verbatim
693   \trivlist \item \relax
694 %    \end{macrocode}
695 % \changes{v1.5b}{1994/01/24}{Set \texttt{@inlabel} switch to false.}
696 % \changes{v1.5f}{1994/10/25}{Removed setting of \texttt{@inlabel}
697 %                             switch again.}
698 % \changes{v1.3c}{1990/02/26}{Removed extra vertical space.
699 %           Suggested by Frank Mittelbach.}
700 % \changes{v1.5h}{1995/09/21}{Added the space again, since it is
701 %           necessary for correct vertical spacing if \texttt{verbatim}
702 %           is nested inside \texttt{quote}.}
703 %    The following extra vertical space is for compatibility with the
704 %    \LaTeX kernel: otherwise, using the |verbatim| package changes
705 %    the vertical spacing of a |verbatim| environment nested within a
706 %    |quote| environment.
707 %    \begin{macrocode}
708   \if@minipage\else\vskip\parskip\fi
709 %    \end{macrocode}
710 % \changes{v1.4k}{1992/07/13}{Added setting for
711 %        \cs{@beginparpenalty}. Suggested by Frank Mittelbach.}
712 %    The paragraph parameters are set appropriately:
713 %    the penalty at the beginning of the environment,
714 %    left and right margins, paragraph indentation, the glue to
715 %    fill the last line, and the vertical space between paragraphs.
716 %    The latter space has to be zero since we do not want to add
717 %    extra space between lines.
718 %    \begin{macrocode}
719   \@beginparpenalty \predisplaypenalty
720   \leftskip\@totalleftmargin\rightskip\z@
721   \parindent\z@\parfillskip\@flushglue\parskip\z@
722 %    \end{macrocode}
723 % \changes{v1.1b}{1989/10/18}{Added resetting of \cs{parshape}
724 %                           if at beginning of a list.
725 %                           (Problem pointed out by Chris Rowley.)}
726 %    There's one point to make here:
727 %    the \texttt{list} environment uses \TeX's |\parshape|
728 %    primitive to get a special indentation for the first line
729 %    of the  list.
730 %    If the list begins with a \texttt{verbatim} environment
731 %    this |\parshape| is still in effect.
732 %    Therefore we have to reset this internal parameter explicitly.
733 %    We could do this by assigning $0$ to |\parshape|.
734 %    However, there is a simpler way to achieve this:
735 %    we simply tell \TeX{} to start a new paragraph.
736 %    As is explained on p.~103 of the \TeX{}book, this resets
737 %    |\parshape| to zero.
738 % \changes{v1.1c}{1989/10/19}{Replaced explicit resetting of
739 %                           \cs{parshape} by \cs{@@par}.}
740 %    \begin{macrocode}
741   \@@par
742 %    \end{macrocode}
743 %    We now ensure that |\par| has the correct definition,
744 %    namely to force \TeX{} into horizontal mode
745 %    and to include an empty box.
746 %    This is to ensure that empty lines do appear in the output.
747 %    Afterwards, we insert the |\interlinepenalty| since \TeX{}
748 %    does not add a penalty between paragraphs (here: lines)
749 %    by its own initiative. Otherwise a |verbatim| environment
750 %    could be broken across pages even if a |\samepage|
751 %    declaration were present.
753 %    However, in a top-aligned minipage, this will result in an extra
754 %    empty line added at the top. Therefore, a slightly more
755 %    complicated construct is necessary.
756 %    One of the important things here is the inclusion of
757 %    |\leavevmode| as the first macro in the first line, for example,
758 %    a blank verbatim line is the first thing in a list item.
759 % \changes{v1.2c}{1989/10/31}{Definition of \cs{par} added.
760 %                           Ensures identical behaviour for
761 %                           verbatim and \cs{verbatiminput}.
762 %                           Problem pointed out by Chris.}
763 % \changes{v1.4d}{1991/04/24}{\cs{penalty}\cs{interlinepenalty} added.
764 %                           Necessary to avoid page breaks in
765 %                           the scope of a \cs{samepage} declaration.}
766 % \changes{v1.5b}{1994/01/24}{Improved definition of \cs{par} to work
767 %                           under all circumstances.}
768 % \changes{v1.5f}{1994/10/25}{\cs{leavevmode} added for first line.}
769 %    \begin{macrocode}
770   \def\par{%
771     \if@tempswa
772       \leavevmode\null\@@par\penalty\interlinepenalty
773     \else
774       \@tempswatrue
775       \ifhmode\@@par\penalty\interlinepenalty\fi
776     \fi}%
777 %    \end{macrocode}
778 %    But to avoid an error message when the environment
779 %    doesn't contain any text, we redefine |\@noitemerr|
780 %    which will in this case be called by |\endtrivlist|.
781 % \changes{v1.4j}{1992/06/30}{Introduced warning instead of error
782 %        for empty body of verbatim text.
783 %        Suggested by Nelson Beebe.}
784 %    \begin{macrocode}
785   \def\@noitemerr{\@warning{No verbatim text}}%
786 %    \end{macrocode}
787 %    Now we call |\obeylines| to make the end of line character
788 %    active,
789 %    \begin{macrocode}
790   \obeylines
791 %    \end{macrocode}
792 %    change the category code of all special characters,
793 %    to $12$ (other).
794 %    \changes{v1.5i}{1996/06/04}{Moved \cs{verbatim@font} after
795 %           \cs{dospecials}.}
796 %    \begin{macrocode}
797   \let\do\@makeother \dospecials
798 %    \end{macrocode}
799 %    and switch to the font to be used.
800 %    \begin{macrocode}
801   \verbatim@font
802 %    \end{macrocode}
803 %    To avoid a breakpoint after the labels box, we remove the penalty
804 %    put there by the list macros: another use of |\unpenalty|!
805 % \changes{v1.5f}{1994/10/25}{Change to \cs{everypar} added.}
806 %    \begin{macrocode}
807   \everypar \expandafter{\the\everypar \unpenalty}}
808 %    \end{macrocode}
809 % \end{macro}
812 % \begin{macro}{\verbatim}
813 % \begin{macro}{\verbatim*}
814 %    Now we define the toplevel macros.
815 %    |\verbatim| is slightly changed:
816 %    after setting up things properly it calls
817 %    |\verbatim@start|.
818 % \changes{v1.5l}{1999/12/14}{Added \cs{begingroup} for cases where
819 %    \cs{verbatim} is used directly, rather than in \cs{begin}: see
820 %    pr/3115.}
821 %    This is done inside a group, so that |\verbatim| can be used
822 %    directly, without |\begin|.
823 %    \begin{macrocode}
824 \def\verbatim{\begingroup\@verbatim \frenchspacing\@vobeyspaces
825               \verbatim@start}
826 %    \end{macrocode}
827 %    |\verbatim*| is defined accordingly.
828 %    \begin{macrocode}
829 \@namedef{verbatim*}{\begingroup\@verbatim\verbatim@start}
830 %    \end{macrocode}
831 % \end{macro}
832 % \end{macro}
834 % \begin{macro}{\endverbatim}
835 % \begin{macro}{\endverbatim*}
836 %    To end the \texttt{verbatim} and \texttt{verbatim*}
837 %    environments it is only necessary to finish the
838 %    \texttt{trivlist} environment started in |\@verbatim| and
839 %    close the corresponding group.
840 % \changes{v1.5l}{1999/12/14}{Added \cs{endgroup} for cases where
841 %    \cs{endverbatim} is used directly, rather than in \cs{end}: see
842 %    pr/3115.}
843 % \changes{v1.5n}{2000/08/03}{Added \cs{@endpetrue}: needed when
844 %    faking such a \cs{end} (pr/3234).}
845 % \changes{v1.5o}{2000/08/23}{Changed \cs{@endpetrue} to \cs{@doendpe}:
846 %    see (pr/3234).}
847 %    \begin{macrocode}
848 \def\endverbatim{\endtrivlist\endgroup\@doendpe}
849 \expandafter\let\csname endverbatim*\endcsname =\endverbatim
850 %    \end{macrocode}
851 % \end{macro}
852 % \end{macro}
855 % \subsection{The \texttt{comment} environment}
857 % \begin{macro}{\comment}
858 % \begin{macro}{\endcomment}
859 % \changes{v1.1c}{1989/10/19}{Added \cs{@bsphack}/\cs{@esphack} to the
860 %            \texttt{comment} environment.  Suggested by Chris Rowley.}
861 %    The |\comment| macro is similar to |\verbatim*|.
862 %    However, we do not need to switch fonts or set special
863 %    formatting parameters such as |\parindent| or |\parskip|.
864 %    We need only set the category code of all special characters
865 %    to $12$ (other) and that of |^^M| (the end of line character)
866 %    to $13$ (active).
867 %    The latter is needed for macro parameter delimiter matching in
868 %    the internal macros defined below.
869 %    In contrast to the default definitions used by the
870 %    |\verbatim| and |\verbatim*| macros,
871 %    we define |\verbatim@addtoline| to throw away its argument
872 %    and |\verbatim@processline|, |\verbatim@startline|,
873 %    and |\verbatim@finish| to act as no-ops.
874 %    Then we call |\verbatim@|.
875 %    But the first thing we do is to call |\@bsphack| so that
876 %    this environment has no influence whatsoever upon the spacing.
877 % \changes{v1.1c}{1989/10/19}{Changed \cs{verbatim@start} to
878 %                           \cs{verbatim@}.  Suggested by Chris Rowley.}
879 % \changes{v1.1c}{1989/10/19}{\cs{verbatim@startline} and
880 %                           \cs{verbatim@finish} are now
881 %                           also redefined to do nothing.}
882 %    \begin{macrocode}
883 \def\comment{\@bsphack
884              \let\do\@makeother\dospecials\catcode`\^^M\active
885              \let\verbatim@startline\relax
886              \let\verbatim@addtoline\@gobble
887              \let\verbatim@processline\relax
888              \let\verbatim@finish\relax
889              \verbatim@}
890 %    \end{macrocode}
891 %    |\endcomment| is very simple: it only calls
892 %    |\@esphack| to take care of the spacing.
893 %    The |\end| macro closes the group and therefore takes care
894 %    of restoring everything we changed.
895 %    \begin{macrocode}
896 \let\endcomment=\@esphack
897 %    \end{macrocode}
898 % \end{macro}
899 % \end{macro}
903 % \subsection{The main loop}
905 % Here comes the tricky part:
906 % During the definition of the macros we need to use the special
907 % characters |\|, |{|, and |}| not only with their
908 % normal category codes,
909 % but also with category code $12$ (other).
910 % We achieve this by the following trick:
911 % first we tell \TeX{} that |\|, |{|, and |}|
912 % are the lowercase versions of |!|, |[|, and |]|.
913 % Then we replace every occurrence of |\|, |{|, and |}|
914 % that should be read with category code $12$ by |!|, |[|,
915 % and |]|, respectively,
916 % and give the whole list of tokens to |\lowercase|,
917 % knowing that category codes are not altered by this primitive!
919 % But first we have ensure that
920 % |!|, |[|, and |]| themselves have
921 % the correct category code!
922 % \changes{v1.3b}{1990/02/07}{Introduced \cs{vrb@catcodes} instead
923 %                  of explicit setting of category codes.}
924 % To allow special settings of these codes we hide their setting in
925 % the macro |\vrb@catcodes|.  If it is already defined our new
926 % definition is skipped.
927 %    \begin{macrocode}
928 \@ifundefined{vrb@catcodes}%
929   {\def\vrb@catcodes{%
930      \catcode`\!12\catcode`\[12\catcode`\]12}}{}
931 %    \end{macrocode}
932 % This trick allows us to use this code for applications where other
933 % category codes are in effect.
935 % We start a group to keep the category code changes local.
936 %    \begin{macrocode}
937 \begingroup
938  \vrb@catcodes
939  \lccode`\!=`\\ \lccode`\[=`\{ \lccode`\]=`\}
940 %    \end{macrocode}
941 % \changes{v1.2f}{1990/01/31}{Code for TABs removed.}
942 %    We also need the end-of-line character |^^M|,
943 %    as an active character.
944 %    If we were to simply write |\catcode`\^^M=\active|
945 %    then we would get an unwanted active end of line character
946 %    at the end of every line of the following macro definitions.
947 %    Therefore we use the same trick as above:
948 %    we write a tilde |~| instead of |^^M| and
949 %    pretend that the
950 %    latter is the lowercase variant of the former.
951 %    Thus we have to ensure now that the tilde character has
952 %    category code $13$ (active).
953 %    \begin{macrocode}
954  \catcode`\~=\active \lccode`\~=`\^^M
955 %    \end{macrocode}
956 %    The use of the |\lowercase| primitive leads to one problem:
957 %    the uppercase character `|C|' needs to be used in the
958 %    code below and its case must be preserved.
959 %    So we add the command:
960 %    \begin{macrocode}
961  \lccode`\C=`\C
962 %    \end{macrocode}
963 %    Now we start the token list passed to |\lowercase|.
964 %    We use the following little trick (proposed by Bernd Raichle):
965 %    The very first token in the token list we give to |\lowercase| is
966 %    the |\endgroup| primitive. This means that it is processed by
967 %    \TeX{} immediately after |\lowercase| has finished its operation,
968 %    thus ending the group started by |\begingroup| above. This avoids
969 %    the global definition of all macros.
970 %    \begin{macrocode}
971  \lowercase{\endgroup
972 %    \end{macrocode}
973 % \begin{macro}{\verbatim@start}
974 %    The purpose of |\verbatim@start| is to check whether there
975 %    are any characters on the same line as the |\begin{verbatim}|
976 %    and to pretend that they were on a line by themselves.
977 %    On the other hand, if there are no characters remaining
978 %    on the current line we shall just find an end of line character.
979 %    |\verbatim@start| performs its task by first grabbing the
980 %    following character (its argument).
981 %    This argument is then compared to an active |^^M|,
982 %    the end of line character.
983 %    \begin{macrocode}
984     \def\verbatim@start#1{%
985       \verbatim@startline
986       \if\noexpand#1\noexpand~%
987 %    \end{macrocode}
988 %    If this is true we transfer control to |\verbatim@|
989 %    to process the next line.  We use
990 %    |\next| as the macro which will continue the work.
991 %    \begin{macrocode}
992         \let\next\verbatim@
993 %    \end{macrocode}
994 %    Otherwise, we define |\next| to expand to a call
995 %    to |\verbatim@| followed by the character just
996 %    read so that it is reinserted into the text.
997 %    This means that those characters remaining on this line
998 %    are handled as if they formed a line by themselves.
999 %    \begin{macrocode}
1000       \else \def\next{\verbatim@#1}\fi
1001 %    \end{macrocode}
1002 %    Finally we call |\next|.
1003 %    \begin{macrocode}
1004       \next}%
1005 %    \end{macrocode}
1006 % \end{macro}
1008 % \begin{macro}{\verbatim@}
1009 %    The three macros |\verbatim@|, |\verbatim@@|,
1010 %    and |\verbatim@@@| form the ``main loop'' of the
1011 %    \texttt{verbatim} environment.
1012 %    The purpose of |\verbatim@| is to read exactly one line
1013 %    of input.
1014 %    |\verbatim@@| and |\verbatim@@@| work together to
1015 %    find out whether the four characters
1016 %    |\end| (all with category code $12$ (other)) occur in that
1017 %    line.
1018 %    If so, |\verbatim@@@| will call
1019 %    |\verbatim@test| to check whether this |\end| is
1020 %    part of |\end{verbatim}| and will terminate the environment
1021 %    if this is the case.
1022 %    Otherwise we continue as if nothing had happened.
1023 %    So let's have a look at the definition of |\verbatim@|:
1024 % \changes{v1.1a}{1989/10/16}{Replaced \cs{verbatim@@@} by \cs{@nil}.}
1025 %    \begin{macrocode}
1026     \def\verbatim@#1~{\verbatim@@#1!end\@nil}%
1027 %    \end{macrocode}
1028 %    Note that the |!| character will have been replaced by a
1029 %    |\| with category code $12$ (other) by the |\lowercase|
1030 %    primitive governing this code before the definition of this
1031 %    macro actually takes place.
1032 %    That means that
1033 %    it takes the line, puts |\end| (four character tokens)
1034 %    and |\@nil| (one control sequence token) as a
1035 %    delimiter behind it, and
1036 %    then calls |\verbatim@@|.
1037 % \end{macro}
1039 % \begin{macro}{\verbatim@@}
1040 %    |\verbatim@@| takes everything up to the next occurrence of
1041 %    the four characters |\end| as its argument.
1042 %    \begin{macrocode}
1043     \def\verbatim@@#1!end{%
1044 %    \end{macrocode}
1045 %    That means: if they do not occur in the original line, then
1046 %    argument |#1| is the
1047 %    whole input line, and |\@nil| is the next token
1048 %    to be processed.
1049 %    However, if the four characters |\end| are part of the
1050 %    original line, then
1051 %    |#1| consists of the characters in front of |\end|,
1052 %    and the next token is the following character (always remember
1053 %    that the line was lengthened by five tokens).
1054 %    Whatever |#1| may be, it is verbatim text,
1055 %    so |#1| is added to the line currently built.
1056 %    \begin{macrocode}
1057        \verbatim@addtoline{#1}%
1058 %    \end{macrocode}
1059 %    The next token in the input stream
1060 %    is of special interest to us.
1061 %    Therefore |\futurelet| defines |\next| to be equal
1062 %    to it before calling |\verbatim@@@|.
1063 %    \begin{macrocode}
1064        \futurelet\next\verbatim@@@}%
1065 %    \end{macrocode}
1066 % \end{macro}
1068 % \begin{macro}{\verbatim@@@}
1069 % \changes{v1.1a}{1989/10/16}{Replaced \cs{verbatim@@@} by
1070 %                           \cs{@nil} where used as delimiter.}
1071 %    |\verbatim@@@| will now read the rest of the tokens on
1072 %    the current line,
1073 %    up to the final |\@nil| token.
1074 %    \begin{macrocode}
1075     \def\verbatim@@@#1\@nil{%
1076 %    \end{macrocode}
1077 %    If the first of the above two cases occurred, i.e.\ no
1078 %    |\end| characters were on that line, |#1| is empty
1079 %    and |\next| is equal to |\@nil|.
1080 %    This is easily checked.
1081 %    \begin{macrocode}
1082        \ifx\next\@nil
1083 %    \end{macrocode}
1084 %    If so, this was a simple line.
1085 %    We finish it by processing the line we accumulated so far.
1086 %    Then we prepare to read the next line.
1087 % \changes{v1.2f}{1990/01/31}{Added \cs{verbatim@startline}.}
1088 %    \begin{macrocode}
1089          \verbatim@processline
1090          \verbatim@startline
1091          \let\next\verbatim@
1092 %    \end{macrocode}
1093 %    Otherwise we have to check what follows these |\end|
1094 %    tokens.
1095 %    \begin{macrocode}
1096        \else
1097 %    \end{macrocode}
1098 %    Before we continue, it's a good idea to stop for a moment
1099 %    and remember where we are:
1100 %    We have just read the four character tokens |\end|
1101 %    and must now check whether the name of the environment (surrounded
1102 %    by braces) follows.
1103 %    To this end we define a macro called |\@tempa|
1104 %    that reads exactly one character and decides what to do next.
1105 %    This macro should do the following: skip spaces until
1106 %    it encounters either a left brace or the end of the line.
1107 %    But it is important to remember which characters are skipped.
1108 %    The |\end|\meta{optional spaces}|{| characters
1109 %    may be part of the verbatim text, i.e.\ these characters
1110 %    must be printed.
1112 %    Assume for example that the current line contains
1113 %    \begin{verbatim*}
1114 %      \end {AVeryLongEnvironmentName}
1115 %\end{verbatim*}
1116 %    As we shall soon see, the scanning mechanism implemented here
1117 %    will not find out that this is text to be printed until
1118 %    it has read the right brace.
1119 %    Therefore we need a way to accumulate the characters read
1120 %    so that we can reinsert them if necessary.
1121 %    The token register |\@temptokena| is used for this purpose.
1123 %    Before we do this we have to get rid of the superfluous
1124 %    |\end| tokens at the end of the line.
1125 % \changes{v1.4j}{1992/06/30}{Removed use of \cs{toks@}. Suggested by
1126 %           Bernd Raichle.}
1127 %    To this end we define a temporary macro whose argument
1128 %    is delimited by |\end\@nil| (four character tokens
1129 %    and one control sequence token) to be used below
1130 %    on the rest of the line, after appending a |\@nil| token to it.
1131 %    (Note that this token can never appear in |#1|.)
1132 %    We use the following definition of
1133 %    |\@tempa| to get the rest of the line (after the first
1134 %    |\end|).
1135 %    \begin{macrocode}
1136          \def\@tempa##1!end\@nil{##1}%
1137 %    \end{macrocode}
1138 %    We mentioned already that we use token register
1139 %    |\@temptokena|
1140 %    to remember the characters we skip, in case we need them again.
1141 %    We initialize this with the |\end| we have thrown away
1142 %    in the call to |\@tempa|.
1143 %    \begin{macrocode}
1144          \@temptokena{!end}%
1145 %    \end{macrocode}
1146 %    We shall now call |\verbatim@test|
1147 %    to process the characters
1148 %    remaining on the current line.
1149 %    But wait a moment: we cannot simply call this macro
1150 %    since we have already read the whole line.
1151 %    Therefore we have to first expand the macro |\@tempa| to insert
1152 %    them again after the |\verbatim@test| token.
1153 %    A |^^M| character is appended to denote the end of the line.
1154 %    (Remember that this character comes disguised as a tilde.)
1155 % \changes{v1.2}{1989/10/20}{Taken local definition of \cs{@tempa} out
1156 %                          of \cs{verbatim@@@} and introduced
1157 %                          \cs{verbatim@test} instead.}
1158 %    \begin{macrocode}
1159          \def\next{\expandafter\verbatim@test\@tempa#1\@nil~}%
1160 %    \end{macrocode}
1161 %    That's almost all, but we still have to
1162 %    now call |\next| to do the work.
1163 %    \begin{macrocode}
1164        \fi \next}%
1165 %    \end{macrocode}
1166 % \end{macro}
1169 % \begin{macro}{\verbatim@test}
1170 % \changes{v1.2}{1989/10/20}{Introduced \cs{verbatim@test}.}
1171 %    We define |\verbatim@test| to investigate every token
1172 %    in turn.
1173 %    \begin{macrocode}
1174     \def\verbatim@test#1{%
1175 %    \end{macrocode}
1176 %    First of all we set |\next| equal to |\verbatim@test|
1177 %    in case this macro must call itself recursively in order to
1178 %    skip spaces.
1179 %    \begin{macrocode}
1180            \let\next\verbatim@test
1181 %    \end{macrocode}
1182 %    We have to distinguish four cases:
1183 %    \begin{enumerate}
1184 %      \item The next token is a |^^M|, i.e.\ we reached
1185 %            the end of the line.  That means that nothing
1186 %            special was found.
1187 %            Note that we use |\if| for the following
1188 %            comparisons so that the category code of the
1189 %            characters is irrelevant.
1190 %    \begin{macrocode}
1191            \if\noexpand#1\noexpand~%
1192 %    \end{macrocode}
1193 %            We add the characters accumulated in token register
1194 %            |\@temptokena| to the current line.  Since
1195 %            |\verbatim@addtoline| does not expand its argument,
1196 %            we have to do the expansion at this point.  Then we
1197 %            |\let| |\next| equal to |\verbatim@|
1198 %            to prepare to read the next line.
1199 % \changes{v1.2f}{1990/01/31}{Added \cs{verbatim@startline}.}
1200 %    \begin{macrocode}
1201              \expandafter\verbatim@addtoline
1202                \expandafter{\the\@temptokena}%
1203              \verbatim@processline
1204              \verbatim@startline
1205              \let\next\verbatim@
1206 %    \end{macrocode}
1207 %      \item A space character follows.
1208 %            This is allowed, so we add it to |\@temptokena|
1209 %            and continue.
1210 %    \begin{macrocode}
1211            \else \if\noexpand#1
1212              \@temptokena\expandafter{\the\@temptokena#1}%
1213 %    \end{macrocode}
1214 % \changes{v1.2f}{1990/01/31}{Code for TABs removed.}
1215 %      \item An open brace follows.
1216 %            This is the most interesting case.
1217 %            We must now collect characters until we read the closing
1218 %            brace and check whether they form the environment name.
1219 %            This will be done by |\verbatim@testend|, so here
1220 %            we let |\next| equal this macro.
1221 %            Again we will process the rest of the line, character
1222 %            by character.
1223 % \changes{v1.2}{1989/10/20}{Moved the initialization of
1224 %                          \cs{@tempc} from \cs{verbatim@testend} into
1225 %                          \cs{verbatim@test}.}
1226 %            The characters forming the name of the environment will
1227 %            be accumulated in |\@tempc|.
1228 %            We initialize this macro to expand to nothing.
1229 % \changes{v1.3b}{1990/02/07}{\cs{noexpand} added.}
1230 %    \begin{macrocode}
1231            \else \if\noexpand#1\noexpand[%
1232              \let\@tempc\@empty
1233              \let\next\verbatim@testend
1234 %    \end{macrocode}
1235 %            Note that the |[| character will be a |{| when
1236 %            this macro is defined.
1237 %      \item Any other character means that the |\end| was part
1238 %            of the verbatim text.
1239 %            Add the characters to the current line and prepare to call
1240 %            |\verbatim@| to process the rest of the line.
1241 %  \changes{v1.0f}{1989/10/09}{Fixed \cs{end} \cs{end} bug
1242 %                            found by Chris Rowley}
1243 %    \begin{macrocode}
1244            \else
1245              \expandafter\verbatim@addtoline
1246                \expandafter{\the\@temptokena}%
1247              \def\next{\verbatim@#1}%
1248            \fi\fi\fi
1249 %    \end{macrocode}
1250 %    \end{enumerate}
1251 %    The last thing this macro does is to call |\next|
1252 %    to continue processing.
1253 %    \begin{macrocode}
1254            \next}%
1255 %    \end{macrocode}
1256 % \end{macro}
1258 % \begin{macro}{\verbatim@testend}
1259 %    |\verbatim@testend| is called when
1260 %    |\end|\meta{optional spaces}|{| was seen.
1261 %    Its task is to scan everything up to the next |}|
1262 %    and to call |\verbatim@@testend|.
1263 %    If no |}| is found it must reinsert the characters it read
1264 %    and return to |\verbatim@|.
1265 %    The following definition is similar to that of
1266 %    |\verbatim@test|:
1267 %    it takes the next character and decides what to do.
1268 % \changes{v1.2}{1989/10/20}{Removed local definition of \cs{@tempa}
1269 %                          from \cs{verbatim@testend} which now
1270 %                          does the work itself.}
1271 %    \begin{macrocode}
1272     \def\verbatim@testend#1{%
1273 %    \end{macrocode}
1274 %    Again, we have four cases:
1275 %    \begin{enumerate}
1276 %      \item |^^M|: As no |}| is found in the current line,
1277 %            add the characters to the buffer.  To avoid a
1278 %            complicated construction for expanding
1279 %            |\@temptokena|
1280 %            and |\@tempc| we do it in two steps.  Then we
1281 %            continue with |\verbatim@| to process the
1282 %            next line.
1283 % \changes{v1.2f}{1990/01/31}{Added \cs{verbatim@startline}.}
1284 %    \begin{macrocode}
1285          \if\noexpand#1\noexpand~%
1286            \expandafter\verbatim@addtoline
1287              \expandafter{\the\@temptokena[}%
1288            \expandafter\verbatim@addtoline
1289              \expandafter{\@tempc}%
1290            \verbatim@processline
1291            \verbatim@startline
1292            \let\next\verbatim@
1293 %    \end{macrocode}
1294 %      \item |}|: Call |\verbatim@@testend| to check
1295 %            if this is the right environment name.
1296 % \changes{v1.3b}{1990/02/07}{\cs{noexpand} added.}
1297 %    \begin{macrocode}
1298          \else\if\noexpand#1\noexpand]%
1299            \let\next\verbatim@@testend
1300 %    \end{macrocode}
1301 %  \changes{v1.0f}{1989/10/09}{Introduced check for
1302 %              {\tt\string\verb!\string|!\string\!\string|} to fix
1303 %              single brace bug found by Chris Rowley}
1304 %      \item |\|: This character must not occur in the name of
1305 %            an environment.  Thus we stop collecting characters.
1306 %            In principle, the same argument would apply to other
1307 %            characters as well, e.g., |{|.
1308 %            However, |\| is a special case, since it may be
1309 %            the first character of |\end|.  This means that
1310 %            we have to look again for
1311 %            |\end{|\meta{environment name}|}|.
1312 %            Note that we prefixed the |!| by a |\noexpand|
1313 %            primitive, to protect ourselves against it being an
1314 %            active character.
1315 % \changes{v1.3b}{1990/02/07}{\cs{noexpand} added.}
1316 %    \begin{macrocode}
1317          \else\if\noexpand#1\noexpand!%
1318            \expandafter\verbatim@addtoline
1319              \expandafter{\the\@temptokena[}%
1320            \expandafter\verbatim@addtoline
1321              \expandafter{\@tempc}%
1322            \def\next{\verbatim@!}%
1323 %    \end{macrocode}
1324 %      \item Any other character: collect it and continue.
1325 %            We cannot use |\edef| to define |\@tempc|
1326 %            since its replacement text might contain active
1327 %            character tokens.
1328 %    \begin{macrocode}
1329          \else \expandafter\def\expandafter\@tempc\expandafter
1330            {\@tempc#1}\fi\fi\fi
1331 %    \end{macrocode}
1332 %    \end{enumerate}
1333 %    As before, the macro ends by calling itself, to
1334 %    process the next character if appropriate.
1335 %    \begin{macrocode}
1336          \next}%
1337 %    \end{macrocode}
1338 % \end{macro}
1340 % \begin{macro}{\verbatim@@testend}
1341 %    Unlike the previous macros |\verbatim@@testend| is simple:
1342 %    it has only to check if the |\end{|\ldots|}|
1343 %    matches the corresponding |\begin{|\ldots|}|.
1344 %    \begin{macrocode}
1345     \def\verbatim@@testend{%
1346 %    \end{macrocode}
1347 %    We use |\next| again to define the things that are
1348 %    to be done.
1349 %    Remember that the name of the current environment is
1350 %    held in |\@currenvir|, the characters accumulated
1351 %    by |\verbatim@testend| are in |\@tempc|.
1352 %    So we simply compare these and prepare to execute
1353 %    |\end{|\meta{current environment}|}|
1354 %    macro if they match.
1355 %    Before we do this we call |\verbatim@finish| to process
1356 %    the last line.
1357 %    We define |\next| via |\edef| so that
1358 %    |\@currenvir| is replaced by its expansion.
1359 %    Therefore we need |\noexpand| to inhibit the expansion
1360 %    of |\end| at this point.
1361 %    \begin{macrocode}
1362        \ifx\@tempc\@currenvir
1363          \verbatim@finish
1364          \edef\next{\noexpand\end{\@currenvir}%
1365 %    \end{macrocode}
1366 %    Without this trick the |\end| command would not be able
1367 %    to correctly check whether its argument matches the name of
1368 %    the current environment and you'd get an
1369 %    interesting \LaTeX{} error message such as:
1370 %    \begin{verbatim}
1371 %! \begin{verbatim*} ended by \end{verbatim*}.
1372 %\end{verbatim}
1373 %    But what do we do with the rest of the characters, those
1374 %    that remain on that line?
1375 %    We call |\verbatim@rescan| to take care of that.
1376 %    Its first argument is the name of the environment just
1377 %    ended, in case we need it again.
1378 %    |\verbatim@rescan| takes the list of characters to be
1379 %    reprocessed as its second argument.
1380 %    (This token list was inserted after the current macro
1381 %    by |\verbatim@@@|.)
1382 %    Since we are still in an |\edef| we protect it
1383 %    by means of|\noexpand|.
1384 %    \begin{macrocode}
1385                     \noexpand\verbatim@rescan{\@currenvir}}%
1386 %    \end{macrocode}
1387 %    If the names do not match, we reinsert everything read up
1388 %    to now and prepare to call |\verbatim@| to process
1389 %    the rest of the line.
1390 %    \begin{macrocode}
1391        \else
1392          \expandafter\verbatim@addtoline
1393            \expandafter{\the\@temptokena[}%
1394            \expandafter\verbatim@addtoline
1395              \expandafter{\@tempc]}%
1396          \let\next\verbatim@
1397        \fi
1398 %    \end{macrocode}
1399 %    Finally we call |\next|.
1400 %    \begin{macrocode}
1401        \next}%
1402 %    \end{macrocode}
1403 % \end{macro}
1405 % \begin{macro}{\verbatim@rescan}
1406 %    In principle |\verbatim@rescan| could be used to
1407 %    analyse the characters remaining after the |\end{...}|
1408 %    command and pretend that these were read
1409 %    ``properly'', assuming ``standard'' category codes are in
1410 %    force.\footnote{Remember that they were all read with
1411 %          category codes $11$ (letter) and $12$ (other) so
1412 %          that control sequences are not recognized as such.}
1413 %    But this is not always possible (when there are unmatched
1414 %    curly braces in the rest of the line).
1415 %    Besides, we think that this is not worth the effort:
1416 %    After a \texttt{verbatim} or \texttt{verbatim*} environment
1417 %    a new line in the output is begun anyway,
1418 %    and an |\end{comment}| can easily be put on a line by itself.
1419 %    So there is no reason why there should be any text here.
1420 %    For the benefit of the user who did put something there
1421 %    (a comment, perhaps)
1422 %    we simply issue a warning and drop them.
1423 %    The method of testing is explained in Appendix~D, p.\ 376 of
1424 %    the \TeX{}book. We use |^^M| instead of the |!|
1425 %    character used there
1426 %    since this is a character that cannot appear in |#1|.
1427 %    The two |\noexpand| primitives are necessary to avoid
1428 %    expansion of active characters and macros.
1430 %    One extra subtlety should be noted here: remember that
1431 %    the token list we are currently building will first be
1432 %    processed by the |\lowercase| primitive before \TeX{}
1433 %    carries out the definitions.
1434 %    This means that the `|C|' character in the
1435 %    argument to the |\@warning| macro must be protected against
1436 %    being changed to `|c|'.  That's the reason why we added the
1437 %    |\lccode`\C=`\C| assignment above.
1438 %    We can now finish the argument to |\lowercase| as well as the
1439 %    group in which the category codes were changed.
1440 %    \begin{macrocode}
1441     \def\verbatim@rescan#1#2~{\if\noexpand~\noexpand#2~\else
1442         \@warning{Characters dropped after `\string\end{#1}'}\fi}}
1443 %    \end{macrocode}
1444 % \end{macro}
1446 % \subsection{The \cs{verbatiminput} command}
1448 % \begin{macro}{\verbatim@in@stream}
1449 %    We begin by allocating an input stream (out of the 16 available
1450 %    input streams).
1451 %\iffalse
1452 %  Vorstellbar ist auch der Aufruf von |`verbatiminput| innerhalb eines
1453 %  |`verbatiminput| (z.B: wenn man |`input|-Anweisungen im zu lesenden
1454 %  File hat und auch diese Files automatisch lesen will).  Dies kann
1455 %  man jedoch nur ermoeglichen, wenn man einen besseren Mechanismus
1456 %  verwendet als es das simple, statische |`newread| darstellt.
1457 %  Vorstellbar fuer eine neuere \LaTeX-Version ist eine (lokale)
1458 %  Allokation des Streams durch ein |`open| und eine Freigabe des
1459 %  Streams durch |`close| oder Verlassen der Gruppe.
1460 %\fi
1461 %    \begin{macrocode}
1462 \newread\verbatim@in@stream
1463 %    \end{macrocode}
1464 % \end{macro}
1466 % \begin{macro}{\verbatim@readfile}
1467 %    The macro |\verbatim@readfile| encloses the main loop by calls to
1468 %    the macros |\verbatim@startline| and |\verbatim@finish|,
1469 %    respectively.  This makes sure
1470 %    that the user can initialize and finish the command when the file
1471 %    is empty or doesn't exist.  The \texttt{verbatim} environment has a
1472 %    similar behaviour when called with an empty text.
1473 %    \begin{macrocode}
1474 \def\verbatim@readfile#1{%
1475   \verbatim@startline
1476 %    \end{macrocode}
1477 %    When the file is not found we issue a warning.
1478 %    \begin{macrocode}
1479   \openin\verbatim@in@stream #1\relax
1480   \ifeof\verbatim@in@stream
1481     \typeout{No file #1.}%
1482   \else
1483 %    \end{macrocode}
1484 %    At this point we pass the name of the file to |\@addtofilelist|
1485 %    so that its appears appears in the output of a |\listfiles|
1486 %    command.
1487 % \changes{v1.5j}{1996/09/25}{Add \cs{@addtofilelist} and
1488 %    \cs{ProvidesFile} so that the name of the file
1489 %    read in appears in the \cs{listfiles} output (Omission pointed
1490 %    out by Patrick W.~Daly).}
1491 %    In addition, we use |\ProvidesFile| to make a log entry in the
1492 %    transcript file and to distinguish files read in via
1493 %    |\verbatiminput| from others.
1494 %    \begin{macrocode}
1495     \@addtofilelist{#1}%
1496     \ProvidesFile{#1}[(verbatim)]%
1497 %    \end{macrocode}
1498 %    While reading from the file it is useful to switch off the
1499 %    recognition of the end-of-line character.  This saves us stripping
1500 %    off spaces from the contents of the line.
1501 %    \begin{macrocode}
1502     \expandafter\endlinechar\expandafter\m@ne
1503     \expandafter\verbatim@read@file
1504     \expandafter\endlinechar\the\endlinechar\relax
1505     \closein\verbatim@in@stream
1506   \fi
1507   \verbatim@finish
1509 %    \end{macrocode}
1510 % \end{macro}
1512 % \begin{macro}{\verbatim@read@file}
1513 %    All the work is done in |\verbatim@read@file|.  It reads the input
1514 %    file line by line and recursively calls itself until the end of
1515 %    the file.
1516 %    \begin{macrocode}
1517 \def\verbatim@read@file{%
1518   \read\verbatim@in@stream to\next
1519   \ifeof\verbatim@in@stream
1520   \else
1521 %    \end{macrocode}
1522 %    For each line we call |\verbatim@addtoline| with the contents of
1523 %    the line. \hskip0pt plus 3cm\penalty0\hskip0pt plus -3cm
1524 %    |\verbatim@processline| is called next.
1525 %    \begin{macrocode}
1526     \expandafter\verbatim@addtoline\expandafter{\next}%
1527     \verbatim@processline
1528 %    \end{macrocode}
1529 %    After processing the line we call |\verbatim@startline| to
1530 %    initialize all before we read the next line.
1531 %    \begin{macrocode}
1532     \verbatim@startline
1533 %    \end{macrocode}
1534 %    Without |\expandafter| each call of |\verbatim@read@file| uses
1535 %    space in \TeX's input stack.\footnote{A standard \TeX\ would
1536 %    report an overflow error if you try to read a file with more than
1537 %    ca.\ 200~lines.  The same error occurs if the first line of code
1538 %    in \S 390 of \textsl{``TeX: The Program''\/} is missing.}
1539 %    \begin{macrocode}
1540     \expandafter\verbatim@read@file
1541   \fi
1543 %    \end{macrocode}
1544 % \end{macro}
1547 % \begin{macro}{\verbatiminput}
1548 %    |\verbatiminput| first starts a group to keep font and category
1549 %    changes local.
1550 %    Then it calls the macro |\verbatim@input| with additional
1551 %    arguments, depending on whether an asterisk follows.
1552 %    \begin{macrocode}
1553 \def\verbatiminput{\begingroup
1554   \@ifstar{\verbatim@input\relax}%
1555           {\verbatim@input{\frenchspacing\@vobeyspaces}}}
1556 %    \end{macrocode}
1557 % \end{macro}
1559 % \begin{macro}{\verbatim@input}
1560 % \changes{1.5k}{1997/04/30}{Have \cs{verbatim@input} check for
1561 %    existence of file.}
1562 %    |\verbatim@input| first checks whether the file exists, using
1563 %    the standard macro |\IfFileExists| which leaves the name of the
1564 %    file found in |\@filef@und|.
1565 %    Then everything is set up as in the |\verbatim| macro.
1566 %    \begin{macrocode}
1567 \def\verbatim@input#1#2{%
1568    \IfFileExists {#2}{\@verbatim #1\relax
1569 %    \end{macrocode}
1570 %    Then it reads in the file, finishes off the \texttt{trivlist}
1571 %    environment started by |\@verbatim| and closes the group.
1572 %    This restores everything to its normal settings.
1573 %    \begin{macrocode}
1574     \verbatim@readfile{\@filef@und}\endtrivlist\endgroup\@doendpe}%
1575 %    \end{macrocode}
1576 %   If the file is not found a more or less helpful message is
1577 %    printed. The final |\endgroup| is  needed to close the group
1578 %    started in |\verbatiminput| above.
1579 %    \begin{macrocode}
1580    {\typeout {No file #2.}\endgroup}}
1581 %</package>
1582 %    \end{macrocode}
1583 % \end{macro}
1586 % \subsection{Getting verbatim text into arguments.}
1588 % One way of achieving this is to define a macro (command) whose
1589 % expansion is the required verbatim text.  This command can then be
1590 % used anywhere that the verbatim text is required.  It can be used in
1591 % arguments, even moving ones, but it is fragile (at least, the
1592 % version here is).
1594 % Here is some code which claims to provide this.  It is a much revised
1595 % version of something I (Chris) did about 2 years ago.  Maybe it needs
1596 % further revision.
1598 % It is only intended as an extension to |\verb|, not to the
1599 % \texttt{verbatim} environment.  It should therefore, perhaps, treat
1600 % line-ends similarly to whatever is best for |\verb|.
1602 % \begin{macro}{\newverbtext}
1603 % This is the command to produce a new macro whose expansion is
1604 % verbatim text.  This command itself cannot be used in arguments,
1605 % of course! It is used as follows:
1607 % \begin{verbatim}
1608 %    \newverbtext{\myverb}"^%{ &~_\}}@ #"
1609 % \end{verbatim}
1611 % The rules for delimiting the verbatim text are the same as those for
1612 % |\verb|.
1614 %    \begin{macrocode}
1615 %<*verbtext>
1616 \def \newverbtext {%
1617   \@ifstar {\@tempswatrue \@verbtext }{\@tempswafalse \@verbtext *}%
1619 %    \end{macrocode}
1620 % \end{macro}
1621 %    I think that a temporary switch is safe here: if not, then
1622 %    suitable |\let|s can be used.
1623 %    \changes{v1.5i}{1996/06/04}{Moved processing of
1624 %              \cs{verbatim@nolig@list} after \cs{dospecials}.}
1625 %    \changes{v1.5p}{2001/03/12}{Added missing right brace in
1626 %               definition of \cs{@verbtext} (PR 3314).}
1627 %    \begin{macrocode}
1628 \def \@verbtext *#1#2{%
1629    \begingroup
1630      \let\do\@makeother \dospecials
1631      \let\do\do@noligs \verbatim@nolig@list
1632      \@vobeyspaces
1633      \catcode`#2\active
1634      \catcode`~\active
1635      \lccode`\~`#2%
1636      \lowercase
1637 %    \end{macrocode}
1638 %    We use a temporary macro here and a trick so that the definition of
1639 %    the command itself can be done inside the group and be a local
1640 %    definition (there may be better ways to achieve this).
1641 %    \begin{macrocode}
1642      {\def \@tempa ##1~%
1643            {\whitespaces
1644 %    \end{macrocode}
1645 %    If these |\noexpand|s were |\noexpand\protect\noexpand|, would
1646 %    this make these things robust?
1647 %    \begin{macrocode}
1648             \edef #1{\noexpand \@verbtextmcheck
1649                      \bgroup
1650                      \if@tempswa
1651                        \noexpand \visiblespaces
1652                      \fi
1653                      \noexpand \@verbtextsetup
1654                      ##1%
1655                      \egroup}%
1656             }%
1657       \expandafter\endgroup\@tempa
1658      }
1660 %    \end{macrocode}
1661 %    This sets up the correct type of group for the mode: it must not
1662 %    be expanded at define time!
1663 %    \begin{macrocode}
1664 \def \@verbtextmcheck {%
1665    \relax\ifmmode
1666            \hbox
1667          \else
1668            \leavevmode
1669            \null
1670          \fi
1672 %    \end{macrocode}
1673 %    This contains other things which should not be expanded during the
1674 %    definition.
1675 %    \begin{macrocode}
1676 \def \@verbtextsetup {%
1677    \frenchspacing
1678    \verbatim@font
1679    \verbtextstyle
1681 %    \end{macrocode}
1682 %    The command |\verbtextstyle| is a document-level hook which can be
1683 %    used to override the predefined typographic treatment of commands
1684 %    defined with |\newverbtext| commands.
1686 %    |\visiblespaces| and |\whitespaces| are examples of possible values
1687 %    of this hook.
1688 %    \begin{macrocode}
1689 \let \verbtextstyle \relax
1690 \def \visiblespaces {\chardef \  32\relax}
1691 \def \whitespaces {\let \ \@@space}
1692 \let \@@space \ %
1693 %</verbtext>
1694 %    \end{macrocode}
1697 % \section{Testing the implementation}
1699 % For testing the implementation and for demonstration we provide
1700 % an extra file. It can be extracted by using the conditional
1701 % `\textsf{testdriver}'. It uses a small input file called
1702 % `\texttt{verbtest.tst}' that is distributed separately.
1703 % Again, we use individual `+' guards.
1704 %    \begin{macrocode}
1705 %<*testdriver>
1706 \documentclass{article}
1708 \usepackage{verbatim}
1710 \newenvironment{myverbatim}%
1711    {\endgraf\noindent MYVERBATIM:\endgraf\verbatim}%
1712    {\endverbatim}
1714 \makeatletter
1716 \newenvironment{verbatimlisting}[1]%
1717  {\def\verbatim@startline{\input{#1}%
1718     \def\verbatim@startline{\verbatim@line{}}%
1719     \verbatim@startline}%
1720   \verbatim}{\endverbatim}
1722 \newwrite\verbatim@out
1724 \newenvironment{verbatimwrite}[1]%
1725  {\@bsphack
1726   \immediate\openout \verbatim@out #1
1727   \let\do\@makeother\dospecials\catcode`\^^M\active
1728   \def\verbatim@processline{%
1729     \immediate\write\verbatim@out{\the\verbatim@line}}%
1730   \verbatim@start}%
1731  {\immediate\closeout\verbatim@out\@esphack}
1733 \makeatother
1735 \addtolength{\textwidth}{30pt}
1737 \begin{document}
1739 \typeout{}
1740 \typeout{===> Expect ``characters dropped''
1741          warning messages in this test! <====}
1742 \typeout{}
1744 Text Text Text Text Text Text Text Text Text Text Text
1745 Text Text Text Text Text Text Text Text Text Text Text
1746 Text Text Text Text Text Text Text Text Text Text Text
1747   \begin{verbatim}
1748     test
1749     \end{verbatim*}
1750     test
1751     \end{verbatim
1752     test of ligatures: <`!`?`>
1753     \endverbatim
1754     test
1755     \end  verbatim
1756     test
1757     test of end of line:
1758     \end
1759     {verbatim}
1760   \end{verbatim} Further text to be typeset: $\alpha$.
1761 Text Text Text Text Text Text Text Text Text Text Text
1762 Text Text Text Text Text Text Text Text Text Text Text
1763 Text Text Text Text Text Text Text Text Text Text Text
1764   \begin{verbatim*}
1765     test
1766     test
1767   \end {verbatim*}
1768 Text Text Text Text Text Text Text Text Text Text Text
1769 Text Text Text Text Text Text Text Text Text Text Text
1770 Text Text Text Text Text Text Text Text Text Text Text
1771   \begin{verbatim*}  bla bla
1772     test
1773     test
1774   \end {verbatim*}
1775 Text Text Text Text Text Text Text Text Text Text Text
1776 Text Text Text Text Text Text Text Text Text Text Text
1777 Text Text Text Text Text Text Text Text Text Text Text
1778 Text Text Text Text Text Text Text Text Text Text Text
1780 First of Chris Rowley's fiendish tests:
1781 \begin{verbatim}
1782 the double end test<text>
1783 \end\end{verbatim}  or even \end \end{verbatim}
1785 %not \end\ended??
1786 %\end{verbatim}
1788 Another of Chris' devils:
1789 \begin{verbatim}
1790 the single brace test<text>
1791 \end{not the end\end{verbatim}
1793 %not \end}ed??
1794 %\end{verbatim}
1795 Back to my own tests:
1796   \begin{myverbatim}
1797     test
1798     test
1799   \end {myverbatim} rest of line
1800 Text Text Text Text Text Text Text Text Text Text Text
1801 Text Text Text Text Text Text Text Text Text Text Text
1802 Text Text Text Text Text Text Text Text Text Text Text
1804 Test of empty verbatim:
1805 \begin{verbatim}
1806 \end{verbatim}
1807 Text Text Text Text Text Text Text Text Text Text Text
1808 Text Text Text Text Text Text Text Text Text Text Text
1809 Text Text Text Text Text Text Text Text Text Text Text
1810   \begin {verbatimlisting}{verbtest.tex}
1811     Additional verbatim text
1812       ...
1813   \end{verbatimlisting}
1814 And here for listing a file:
1815   \verbatiminput{verbtest.tex}
1816 And again, with explicit spaces:
1817   \verbatiminput*{verbtest.tex}
1818 Text Text Text Text Text Text Text Text Text Text Text
1819 Text Text Text Text Text Text Text Text Text Text Text
1820 Text Text Text Text Text Text Text Text Text Text Text
1821   \begin{comment}
1822     test
1823     \end{verbatim*}
1824     test
1825     \end {comment
1826     test
1827     \endverbatim
1828     test
1829     \end  verbatim
1830     test
1831   \end {comment} Further text to be typeset: $\alpha$.
1832 Text Text Text Text Text Text Text Text Text Text Text
1833 Text Text Text Text Text Text Text Text Text Text Text
1834 Text Text Text Text Text Text Text Text Text Text Text
1835   \begin{comment}  bla bla
1836     test
1837     test
1838   \end {comment}
1839 Text Text Text Text Text Text Text Text Text Text Text
1840 Text Text Text Text Text Text Text Text Text Text Text
1841 Text Text Text Text Text Text Text Text Text Text Text
1842 Text Text Text Text Text Text Text Text Text Text Text
1844 \begin{verbatimwrite}{verbtest.txt}
1845 asfa<fa<df
1846 sdfsdfasd
1847 asdfa<fsa
1848 \end{verbatimwrite}
1850 \end{document}
1851 %</testdriver>
1852 %    \end{macrocode}
1855 % \Finale
1857 \endinput