chiark / gitweb /
Colour support! Better rule attribute handling. Lots of new hooks.
[mdwtools] / sverb.dtx
1 % \begin{meta-comment}
2 %
3 % $Id: sverb.dtx,v 1.2 2003/09/05 16:09:30 mdw Exp $
4 %
5 % Verbatim typesetting done properly (ahem)
6 %
7 % (c) 1996 Mark Wooding
8 %
9 %----- Revision history -----------------------------------------------------
10 %
11 % $Log: sverb.dtx,v $
12 % Revision 1.2  2003/09/05 16:09:30  mdw
13 % Make listing formatting more hookable.  Add colour support, and `splitverb'
14 % environment.
15 %
16 % Revision 1.1  2002/02/03 20:49:03  mdw
17 % Checkin for new build system.
18 %
19 % Revision 1.3  1996/11/19 21:01:18  mdw
20 % Entered into RCS
21 %
22 %
23 % \end{meta-comment}
24 %
25 % \begin{meta-comment} <general public licence>
26 %%
27 %% sverb package -- handling of verbatim text
28 %% Copyright (c) 1996 Mark Wooding
29 %%
30 %% This program is free software; you can redistribute it and/or modify
31 %% it under the terms of the GNU General Public License as published by
32 %% the Free Software Foundation; either version 2 of the License, or
33 %% (at your option) any later version.
34 %%
35 %% This program is distributed in the hope that it will be useful,
36 %% but WITHOUT ANY WARRANTY; without even the implied warranty of
37 %% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
38 %% GNU General Public License for more details.
39 %%
40 %% You should have received a copy of the GNU General Public License
41 %% along with this program; if not, write to the Free Software
42 %% Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
43 %%
44 % \end{meta-comment}
45 %
46 % \begin{meta-comment} <Package preamble>
47 %<+package>\NeedsTeXFormat{LaTeX2e}
48 %<+package>\ProvidesPackage{sverb}
49 %<+package>                [2003/09/04 1.4 Verbatim typesetting]
50 %<+colour>\NeedsTeXFormat{LaTeX2e}
51 %<+colour>\ProvidesPackage{svcolour}
52 %<+colour>                [2003/09/04 1.4 Colour support for sverb]
53 %<+color>\NeedsTeXFormat{LaTeX2e}
54 %<+color>\ProvidesPackage{svcolor}
55 %<+color>                [2003/09/04 1.4 Fix for people who can't spell]
56 %<+split>\NeedsTeXFormat{LaTeX2e}
57 %<+split>\ProvidesPackage{svsplit}
58 %<+split>                [2003/09/04 1.4 Verbatim, but with line breaking]
59 % \end{meta-comment}
60 %
61 % \CheckSum{1009}
62 %% \CharacterTable
63 %%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
64 %%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
65 %%   Digits        \0\1\2\3\4\5\6\7\8\9
66 %%   Exclamation   \!     Double quote  \"     Hash (number) \#
67 %%   Dollar        \$     Percent       \%     Ampersand     \&
68 %%   Acute accent  \'     Left paren    \(     Right paren   \)
69 %%   Asterisk      \*     Plus          \+     Comma         \,
70 %%   Minus         \-     Point         \.     Solidus       \/
71 %%   Colon         \:     Semicolon     \;     Less than     \<
72 %%   Equals        \=     Greater than  \>     Question mark \?
73 %%   Commercial at \@     Left bracket  \[     Backslash     \\
74 %%   Right bracket \]     Circumflex    \^     Underscore    \_
75 %%   Grave accent  \`     Left brace    \{     Vertical bar  \|
76 %%   Right brace   \}     Tilde         \~}
77 %%
78 %
79 % \begin{meta-comment}
80 %
81 %<*driver>
82 \input{mdwtools}
83 \describespackage{sverb}
84 \describespackage{svcolour}
85 \describespackage{svsplit}
86 \mdwdoc
87 %</driver>
88 %
89 % \end{meta-comment}
90 %
91 % \section{User guide}
92 %
93 % The \package{sverb} package provides some useful commands and environments
94 % for doing things with verbatim text.  I prefer this code to the standard
95 % \package{verbatim} package (by Rainer Sch\"opf et al.)\ although I'm
96 % biased.
97 %
98 % The package was written to fulfil a particular purpose: I wanted to be able
99 % to typeset ARM assembler code, 77~columns wide, on A5~paper, with the
100 % fields separated by \textit{tab} characters.  It's grown up fairly
101 % organically from that, and I've tidied it when I've seen the code get too
102 % ugly.
103 %
104 % The current features are:
105 %
106 % \begin{itemize}
107 %
108 % \item A `listing' environment which typesets verbatim text nicely.
109 %
110 % \item A command to read verbatim text from an external file.
111 %
112 % \item Support for arbitrary-sized chunks of text without overflowing \TeX's
113 %       memory.
114 %
115 % \item Support for \textit{tab} characters in the verbatim text.
116 %
117 % \item An environment for typesetting demonstrations of \LaTeX\ markup.
118 %
119 % \item It all works correctly with the \package{doc} system for documenting
120 %       \LaTeX\ packages.
121 %
122 % \item A fairly hairy but quite powerful programmer interface to the yukky
123 %       bits of the package.
124 %
125 % \end{itemize}
126 %
127 % The interface is described in its own section, so that more timid readers
128 % can avoid it.  That said, some of the stuff in this section gets rather
129 % technical.
130 %
131 % Note that this package doesn't even try to do anything with short bits of
132 % verbatim text (as handled by the |\verb:...:| command).  I have a separate
133 % package (\package{syntax}) which does all sorts of horrible things along
134 % those lines.
135 %
136 % \subsection{The \env{listing} environment}
137 %
138 % \DescribeEnv{listing}
139 % The main method for typesetting verbatim text is the \env{listing}
140 % environment.  This works pretty much the same as the standard
141 % \env{verbatim} environment, with some exceptions, which are described
142 % below.
143 %
144 % So that you know exactly what you're getting, here are the rules by which
145 % \package{sverb} decides what the verbatim text actually is:
146 %
147 % \begin{itemize}
148 %
149 % \item If there's any text, other than spaces, on the same line as the
150 %       `|\begin{listing}|', then the contents of the environment begins
151 %       immediately after the closing brace (with all leading spaces
152 %       preserved).  Otherwise, the text begins on the following line.
153 %
154 % \item If there is any text, other than spaces, before the
155 %       `|\end{listing}|', but on the same line, this is considered to be the
156 %       last line of the text; otherwise the text is presumed to have ended
157 %       at the end of the previous line.
158 %
159 % \item Any text following the |\end{listing}| on the same line is thrown
160 %       away.  There are good reasons for this, but they're technical.
161 %       Essentially there's nothing I can do about it.
162 %
163 % \end{itemize}
164 %
165 % \begin{figure}
166 % \begin{demo}[w]{The \env{listing} environment}
167 %\dots in the following code:
168 %
169 %\begin{listing}
170 %init            MOV     R0,#200         ;Version 2.00 please
171 %                LDR     R1,=&4B534154   ;Magic number (`TASK')
172 %                ADR     R2,appName      ;Find application name
173 %                SWI     Wimp_Initialise ;Register as a WIMP task
174 %\end{listing}
175 %
176 %The next step is to \dots
177 % \end{demo}
178 % \end{figure}
179 %
180 % Tab characters are supported within the environment: tab stops are set
181 % every eighth column, although this can be modified.
182 %
183 % \subsubsection{Configuring the \env{listing} environment}
184 %
185 % \DescribeMacro\listingsize
186 % The text size used in the \env{listing} environment is set by the
187 % |\listingsize| command.  By default, this is set to |\footnotesize|,
188 % although you can redefine it in the document preamble, or it can be set in
189 % the document class.  You can put other declarations (e.g., colours) here if
190 % you like.
191 %
192 % \DescribeMacro\listingindent
193 % The amount by which the listing text is indented is controlled by the
194 % |\listingindent| length parameter.  This is a fixed length, whose default
195 % value is 1\,em.
196 %
197 % \DescribeMacro\listinghook
198 % \DescribeMacro\svafter
199 % \DescribeMacro\svline
200 % \DescribeMacro\svdoline
201 % \DescribeEnv{listinglist}
202 % The |\listinghook| command is called by the \env{listing} environment (and
203 % |\verbinput| and \env{demo}) to set up the formatting of the listing.  It
204 % can do any setting up it likes, and may configure |\svline| and |\svafter|
205 % as necessary.  The macro |\svline| is run once for each line of verbatim
206 % text, with the line gathered into a box register, the number of which is
207 % given as an argument.  The macro |\svafter| is called when processing has
208 % finished.
209 %
210 % The default setting for |\listinghook| is (similar to)
211 %\begin{listing}
212 %\newcommand{\listinghook}{%
213 %  \par%
214 %  \begin{listinglist}%
215 %  \listingsize%
216 %  \renewcommand{\svline}{\listingline}%
217 %  \renewcommand{\svafter}{\end{listinglist}}%
218 %}
219 %\end{listing}
220 % (see the source for the true definition).  The default |\listingline| macro
221 % just writes out the line using |\svdoline|, which is a simple no-nonsense
222 % macro which just writes the text.  As an example, you could say
223 %\begin{listing}
224 %\renewcommand{\listingline}{\leavevmode\llap{\strut\vrule\space}\svdoline}
225 %\end{listing}
226 % to put a rule down the left-hand side of your listings.
227 %
228 % The \env{listinglist} environment is a relatively straightforward
229 % \env{list}-based environment which sets pu the indentation of a listing.
230 % Feel free to redefine it.
231 %
232 % \subsubsection{Choosing a different end-text}
233 %
234 % \DescribeEnv{listing*}
235 % The \env{listing} environment is terminated by the exact character sequence
236 % `|\end{listing}|'.  This isn't too much of a problem, unless you want to
237 % include this string in the text.  This is achieved by the \env{listing$*$}
238 % environment, which allows you to specify the end-text to find as an
239 % argument.
240 %
241 % For example:
242 %
243 % \begin{demo}{The \env{listing$*$} environment}
244 %Type a listing as follows:
245 %
246 %\begin{listing*}{<end-listing*>}
247 %\begin{listing}
248 %This is a listing.  Yes.
249 %\end{listing}
250 %<end-listing*>
251 %\end{demo}
252 %
253 % Don't include `special' characters in your chosen end-text unless you know
254 % what you're doing.
255 %
256 % \subsection{Writing text to a file}
257 %
258 % \DescribeEnv{verbwrite}
259 % You can write verbatim text to a file using the \env{verbwrite}
260 % environment.  The syntax is fairly straightforward:
261 %
262 % \begin{quote}
263 % \syntax{"\\begin{verbwrite}{"<file-name>"}" \dots "\\end{verbwrite}"}
264 % \end{quote}
265 %
266 % The text of the environment is written to the named file.  The rules about
267 % where the text actually starts and ends are the same as for the
268 % \env{listing} environment.
269 %
270 % There is also a $*$-variant, like \env{listing$*$}, which allows you to
271 % choose the end-text.  The end-text is the first argument, the filename
272 % comes second.
273 %
274 % There is a restriction on the characters you can write to the file: they
275 % must all be considered `printable' by \TeX; otherwise they will be read
276 % back in as `\syntax{"^^"<chars>}' which isn't too good.  Unfortunately,
277 % this includes tab characters, so you can't write them.\footnote{^^A
278 %   Well, not without doing serious surgery on \TeX\ itself, anyway. }
279 %
280 % \iffalse [Example time...  Ho hum.  There is evilness here.] \fi
281 %\begin{verbwrite*}{<end-write>}{wrdemo1.tmp}
282 %\begin{verbwrite}{wrdemo.tmp}
283 %This is some text written to
284 %a file near the beginning of
285 %the file.
286 %\end{verbwrite}
287 %<end-write>
288 %
289 % For example: \verbinput{wrdemo1.tmp}
290 %
291 % \input{wrdemo1.tmp} \iffalse [Now build the file ;-) ] \fi
292 %
293 % \subsection{The \cmd\verbinput\ command}
294 %
295 % \DescribeMacro{\verbinput}
296 % You can input a pre-prepared text file exactly as it is in the input using
297 % the |\verbinput| command.  The filename is given as an argument.  For
298 % example:
299 %
300 % \begin{demo}{The \cmd\verbinput\ command}
301 %\verbinput{wrdemo.tmp}
302 % \end{demo}
303 %
304 % \subsection{The \env{demo} environment}
305 %
306 % Package authors need to document their packages, and it's common to want
307 % to display examples showing the original text and the output side-by-side
308 % (or, when space doesn't permit this, one above the other).  Both the
309 % \LaTeX\ book and \textit{The \LaTeX\ Companion} contain such examples.
310 %
311 % The \env{demo} environment allows such displays to be created easily.  The
312 % syntax of the environment is as follows:
313 %
314 % \begin{quote}
315 % \syntax{"\\begin{demo}["<shape>"]{"<title>"}" \dots "\\end{demo}"}
316 % \end{quote}
317 %
318 % The optional \synt{shape} argument can be either `|w|' (wide), or `|n|'
319 % (narrow).  A `wide' shape places the input and output one above the other,
320 % while the `narrow' shape puts them side-by-side.  The default shape is
321 % `narrow'.  An attractive border is drawn around the display to finish it
322 % off nicely.
323 %
324 % An example:
325 %
326 %\begin{demo*}{<end-demo>}[w]{The \env{demo} environment}
327 %\begin{demo}{From the \textit{\TeX book}}
328 %\[ \sum_{p\;\rm prime}
329 %   f(p) = \int_{t>1}
330 %      f(t)\,{\rm d}\pi(t) \]
331 %\end{demo}
332 %<end-demo>
333 %
334 % \DescribeEnv{demo*}
335 % As with the other environments created by this package, there's a
336 % $*$-variant which takes the end-text as an argument.
337 %
338 % \DescribeMacro\demohook
339 % The |\demohook| does the same job for \env{demo} environments as
340 % |\listinghook| does for \env{listing}s.  The default version just says
341 %\begin{listing}
342 %\newcommand{\demohook}{\setlength{\listingindent}{0pt}\listinghook}
343 %\end{listing}
344 % (near enough), which turns off the indentation for the listing (which would
345 % otherwise look rather odd).
346 %
347 %
348 % \section{Programmer interface}
349 %
350 % This section describes the publicly available routines provided by the
351 % \package{sverb} package.  Routines not described here are libable to be
352 % changed or even removed without warning, so don't use them.
353 %
354 % \subsection{Environment hooks}
355 %
356 % Each of the environments created here works in the same way.  For each
357 % environment \env{foo}, there's a main command responsible for doing the
358 % work, called |\sv@foo|.  This is given all the arguments of the normal
359 % environment, and two more:
360 %
361 % \begin{itemize}
362 %
363 % \item The `end-text' to search for, which marks the end of the environment.
364 %
365 % \item Some actions to perform after the text has been read and processed.
366 %       This allows the calling macro to do some extra actions, like closing
367 %       boxes, etc.
368 %
369 % \end{itemize}
370 %
371 % All the environments do is call the main command with appropriate
372 % arguments.
373 %
374 % \subsection{Reading the verbatim text}
375 %
376 % \DescribeMacro{\sv@read}
377 % The main scanning routine is |\sv@read|.  It is called with three
378 % arguments:
379 %
380 % \begin{itemize}
381 %
382 % \item The end-text marking the end of the environment.
383 %
384 % \item The name of a macro (which must be a single token) which is called
385 %       with a line of text as its single argument.  This is given each
386 %       line of text which is read from the environment in turn.
387 %
388 % \item A macro, or other sort of action, which is to be done when the text
389 %       has been read and processed.
390 %
391 % \end{itemize}
392 %
393 % The macro |\sv@read| assumes that the caller has already made some
394 % provision for removing the category codes of the following text, by either
395 % calling |\@verbatim| or using the construction
396 % \begin{listing}
397 %\let\do=\@makeother
398 %\dospecials
399 % \end{listing}
400 %
401 % \DescribeMacro{\sv@safespc}
402 % Note that any space characters you read using |\sv@read| will be catcoded
403 % as |\active|.  Normally this is OK because |\obeyspaces| (or
404 % |\@vobeyspaces|) will be in effect.  If you're doing something more exotic,
405 % like writing text to a file or building a command string, you can call
406 % |\sv@safespc| which defines the active-space character to be a normal
407 % whitespace-space when expanded.
408 %
409 % \section{Colour support}
410 %
411 % There's now a little colour support in \package{sverb}.  To use it, give
412 % the \textsf{colour} (or \textsf{color}) package option, or load the
413 % \package{svcolour} package.
414 %
415 % \DescribeMacro\svcolourline
416 % Say \syntax{"\\svcolourline["<model>"]{"<colour>"}{"<box>"}"} to typeset
417 % \<box> against a background of the given colour.  This is a good thing to
418 % put in your |\listingline| command.
419 %\begin{demo}{Coloured listings}
420 %\renewcommand{\listingline}
421 %  {\svcolourline[rgb]{1, 0.8, 0.9}}
422 %Consider, for example, this more
423 %complicated program.
424 %\begin{listing}
425 %#include <stdio.h>
426 %
427 %int main(void)
428 %{
429 %  puts("Hello, world!");
430 %  return (0);
431 %}
432 %\end{listing}
433 %\end{demo}
434 % For coloured text rather than background, put a |\color| command in
435 % |\listinghook| itself.
436 %
437 % \section{The \package{svsplit} package}
438 %
439 % A new toy!
440 %
441 % \DescribeEnv{splitverb}
442 % \DescribeEnv{splitverb*}
443 % \DescribeMacro\svsplitchars
444 % The \env{splitverb} environment typesets verbatim material very slowly.  On
445 % the plus side, however, it does know how to do simple line-breaking.  It
446 % will break lines at spaces or tabs, or after any character listed in
447 % |\svsplitchars|.  Continuation lines have the same initial intentation as
448 % the original.  If a line has no `good' breaking point, it's broken as late
449 % as possible, and a little hyphen is inserted.
450 %\begin{demo}[w]{The \env{splitverb} environment}
451 %\begin{multicols}{2}
452 %\begin{splitverb}
453 %The \package{url} package is rather fine at splitting up long URLs such as
454 %  \url{http://www.excessus.demon.co.uk/tex}
455 %though it can't do its thing in the midst of verbatim text.  It
456 %also doesn't cope when
457 %  allthespacesinalongphrasehavemysteriouslydisappeared!
458 %\end{splitverb}
459 %\end{multicols}
460 %\end{demo}
461 %
462 % \implementation
463 %
464 % \section{Implementation}
465 %
466 % This section defines several macros and environments which allow verbatim
467 % typing, with a high degree of configurability.  OK, so this sort of
468 % thing's been done so often before that it isn't true, but I don't really
469 % care.
470 %
471 %    \begin{macrocode}
472 %<*package>
473 %    \end{macrocode}
474 %
475 % \subsection{Options processing}
476 %
477 % Notice options, load package.
478 %
479 %    \begin{macrocode}
480 \newif\ifsv@colour\sv@colourfalse
481 \DeclareOption{colour}{\sv@colourtrue}
482 \DeclareOption{color}{\sv@colourtrue}
483 \ProcessOptions
484 %    \end{macrocode}
485 %
486 % \subsection{Simple things}
487 %
488 % To help us build funny macros which involve strange and different category
489 % codes, I'll write some simple macros which I can use while building my
490 % complicated and clever ones.
491 %
492 % \begin{macro}{\@cspecials}
493 %
494 % This macro is used to assist the definition of some of the environments.
495 % It makes `|\|', `|{|' and `|}|' into `other' characters, and replaces them
496 % with `\verb"|"', `|<|' and `|>|' respectively.  Note that `|[|' and `|]|'
497 % aren't used, because they make defining commands which take optional
498 % arguments awkward.  Note that we open a group here.  This should be closed
499 % using \verb"|endgroup" at the end of the special section.
500 %
501 %    \begin{macrocode}
502 \def\@cspecials{%
503   \begingroup%
504   \catcode`|0%
505   \catcode`<1%
506   \catcode`>2%
507   \catcode`\{12%
508   \catcode`\}12%
509   \catcode`\\12%
510 }
511 %    \end{macrocode}
512 % \end{macro}
513 %
514 % \begin{macro}{\sv@addtobox}
515 %
516 % Add stuff to a horizontal box.
517 %
518 %    \begin{macrocode}
519 \def\sv@addtobox#1#2{\setbox#1\hbox{\unhbox#1\box#2}}
520 %    \end{macrocode}
521 %
522 % \end{macro}
523 %
524 % \begin{macro}{\sv@emptybox}
525 %
526 % Clear out a horizontal box.
527 %
528 %    \begin{macrocode}
529 \def\sv@emptybox#1{\setbox#1\hbox{}}
530 %    \end{macrocode}
531 %
532 % \end{macro}
533 %
534 % \begin{macro}{\sv@startlisting}
535 %
536 % This macro sets everything up nicely for a \env{listing}-type verbatim
537 % environment.
538 %
539 %    \begin{macrocode}
540 \def\sv@startlisting{%
541   \def\par{\@@par\penalty\interlinepenalty}%
542   \@@par%
543   \leftskip\@totalleftmargin%
544   \obeylines%
545   \@noligs%
546   \let\do\@makeother\dospecials%
547   \verbatim@font%
548   \frenchspacing%
549   \@vobeyspaces%
550   \settabwidth%
551   \catcode9\active%
552   \lccode`\~9\lowercase{\let~\sv@vtab}%
553   \lccode`\~13\lowercase{\let~\vinput@cr}%
554   \interlinepenalty500%
555 }
556 %    \end{macrocode}
557 %
558 % \end{macro}
559 %
560 % \subsection{Tab character handling}
561 %
562 % One of the things we want to do here is handle tab characters properly.
563 % (Here, `properly' means `moving to the next column which is a multiple of
564 % eight', the way these things were always meant to.)
565 %
566 % \begin{macro}{\settabwidth}
567 %
568 % The tabs used by our tabbed verbatim environments are set up by this
569 % routine.  It sets the tab width parameter |\svtab| to 8 times the width
570 % of a |\tt| space.  If you really want, you can redefine this macro.
571 %
572 %    \begin{macrocode}
573 \newdimen\svtab
574 \def\settabwidth{\setbox\z@\hbox{\texttt{\space}}\svtab8\wd\z@}
575 %    \end{macrocode}
576 %
577 % \end{macro}
578 %
579 % \begin{macro}{\sv@vtab}
580 %
581 % Here we handle tabs inside verbatim environments.  We expect to be inside
582 % |\box|~0.  This is padded to the correct width and contributed to |\box|~2;
583 % |\box|~0 is then cleared and re-entered.
584 %
585 % The idea is that you make tab active, and set it to this macro.  We stop
586 % the current box, stretch it to the right width, and start another one
587 % straight after, so nobody knows the difference.  The code here is straight
588 % from Appendix~D of \textit{The \TeX book}.
589 %
590 %    \begin{macrocode}
591 \def\sv@vtab{%
592   \hfill\egroup%
593   \@tempdima\wd\z@%
594   \divide\@tempdima\svtab%
595   \multiply\@tempdima\svtab%
596   \advance\@tempdima\svtab%
597   \wd\z@\@tempdima%
598   \sv@addtobox\tw@\z@%
599   \setbox\z@\hbox\bgroup%
600 }
601 %    \end{macrocode}
602 %
603 % \end{macro}
604 %
605 % \begin{macro}{\verbinput}
606 %
607 % We allow input from a file, by the |\verbinput| command.  We display the
608 % text pretty much the same as the \env{listing} environment below.
609 %
610 % We set tab and return active, and get them to do appropriate things.  This
611 % isn't actually all that hard.
612 %
613 %    \begin{macrocode}
614 \def\verbinput{\listinghook\@ifstar{\verbinput@\@input}{\verbinput@\input}}
615 \def\verbinput@#1#2{%  
616   \sv@startlisting%
617   \setbox\z@\hbox\bgroup%
618   #1{#2}%
619   \sv@stripspc%
620   \egroup%
621   \sv@addtobox\tw@\z@%
622   \ifdim\wd\tw@=\z@\listingline\tw@\fi%
623   \svafter%
624 }
625 %    \end{macrocode}
626 %
627 % \end{macro}
628 %
629 % \begin{macro}{\vinput@cr}
630 %
631 % This macro handles return characters while inputting text in |\verbinput|.
632 % We just output our current box, and start another.
633 %
634 %    \begin{macrocode}
635 \def\vinput@cr{%
636   \egroup%
637   \sv@addtobox\tw@\z@%
638   \listingline\tw@%
639   \sv@emptybox\tw@%
640   \setbox\z@\hbox\bgroup%
641 }
642 %    \end{macrocode}
643 %
644 % \end{macro}
645 %
646 % \subsection{Reading verbatim text}
647 %
648 % The traditional way of reading verbatim text is to use a delimited
649 % argument, as described in the \textit{\TeX book}.  This works well-ish if
650 % the text isn't very long.  A better solution would be to pick out the text
651 % line-by-line and process it like that.  So this is what we do.
652 %
653 % \begin{macro}{\matcher}
654 %
655 % For long verbatim environments, we need to be able to find the end text.
656 % This is rather tricky.  The solution here is rather horrible.  The
657 % environment picks out each line of the text at a time, as an argument, and
658 % tests to see if it contains the text we're after.  We do the test in a
659 % particularly yukky way: we add the actual target text to the end of the
660 % line, and inspect the text following the match to see if the match is at
661 % the end.
662 %
663 % The |\matcher| macro creates a `matcher' which will test strings to see if
664 % they contain something interesting.
665 %
666 % To create a matcher, say
667 % \syntax{"\\matcher{"<cmd-name>"}{"<target>"}{"<process-cmd>"}"}.  The
668 % command \synt{cmd-name} accepts a line of text as an argument and calls
669 % the \synt{process-cmd} with the text of the line before the match, or the
670 % whole lot.  It also sets |\@ifmatched| appropriately.
671 %
672 % (Having spent ages coming up with this cruft myself, I found some very
673 % similar, but slightly better, code in Appendix~D.  So I've changed mine to
674 % match Donald's.  Anyway, credit where it's due: cheers Don.)
675 %
676 %    \begin{macrocode}
677 \newif\if@matched
678 \def\matcher#1#2#3{%
679   \expandafter\def\csname\string#1$match\endcsname##1#2##2##3\end{%
680     \ifx##2\relax%
681       \@matchedfalse%
682     \else%
683       \@matchedtrue%
684     \fi%
685     #3{##1}%
686   }%
687   \expandafter\def\expandafter#1\expandafter##\expandafter1\expandafter{%
688     \csname\string#1$match\endcsname##1#2\relax\end%
689   }%
690 }
691 %    \end{macrocode}
692 %
693 % \end{macro}
694 %
695 % \begin{macro}{\sv@stripspc}
696 %
697 % This macro strips any trailing glue in the current horizontal list.  This
698 % is fairly simple, actually: we just loop while glue is the last item.  It's
699 % slightly complicated by penalties which \TeX\ puts into the list between
700 % the glue items, but we just remove them too.
701 %
702 %    \begin{macrocode}
703 \def\sv@stripspc{%
704   \unpenalty%
705   \ifdim\lastskip=\z@\else%
706     \unskip\expandafter\sv@stripspc%
707   \fi%
708 }
709 %    \end{macrocode}
710 %
711 % \end{macro}
712 %
713 % \begin{macro}{\sv@percent}
714 %
715 % This macro strips a single leading percent character if there is one, and
716 % if the \env{doc} package is loaded.  We store the possibly stripped text in
717 % |\@tempa|.
718 %
719 %    \begin{macrocode}
720 \begingroup
721 \catcode`\%=12
722 \gdef\sv@percent#1#2\relax
723     {\ifx\check@percent\@@undefined
724                      \ifx#1\relax\def\@tempa{}\else
725                          \def\@tempa{#1#2}\fi\else
726                      \ifx#1\relax\def\@tempa{}\else
727                          \ifx#1%\def\@tempa{#2}\else
728                              \def\@tempa{#1#2}\fi\fi\fi}
729 \endgroup
730 %    \end{macrocode}
731 %
732 % \end{macro}
733 %
734 % \begin{macro}{\@isspaces}
735 %
736 % We want to avoid writing the first and last lines of the environment to the
737 % file if there's nothing in them.  To do this, we need to know whether a
738 % piece of text contains only space characters.  This macro does this, in a
739 % rather nasty way.  See the other macros below for details of how this
740 % works.
741 %
742 % We define |\sv@safespc| at the same time: this makes space active and
743 % expand to a space character which is not active.  Neat, huh?
744 %
745 %    \begin{macrocode}
746 \lccode`\~32
747 \lccode`\!32
748 \lowercase{%
749   \def\@isspaces#1{%
750     \ifx#1\relax%
751       \def\@tempb{\@tempswafalse}%
752     \else\ifx#1~%
753       \let\@tempb\@isspaces%
754     \else%
755       \def\@tempb##1\relax{}%
756     \fi\fi%
757     \@tempb%
758   }
759   \def\sv@safespc{%
760     \catcode32\active%
761     \def~{ }%
762   }
763 }
764 %    \end{macrocode}
765 %
766 % \end{macro}
767 %
768 % \begin{macro}{\sv@read}
769 %
770 % This macro does the main job of reading a chunk of verbatim text.  You call
771 % it like this:
772 %
773 % \begin{quote}
774 % \syntax{"\\sv@read{"<end-text>"}{"<process-line-proc>"}{"<end-proc>"}"}
775 % \end{quote}
776 %
777 % The \synt{end-text} is the text to find at the end of the `environment': we
778 % stop when we find it.
779 %
780 % The \synt{process-line-proc} is a macro which is passed as an argument each
781 % line which we read from the text.
782 %
783 % The \synt{end-proc} is a macro to call once we've finished reading all of
784 % the text.  This can tidy up an environment or close a file or whatever.
785 %
786 % We read the text by picking out newlines using a delimited macro.  We have
787 % to be a little clever, because newlines are active in verbatim text.
788 %
789 % We will also strip `|%|' signs off the beginning if the \package{doc}
790 % package is here (\package{doc} tries to play with \LaTeX's verbatim stuff,
791 % and doesn't understand the way we do things).
792 %
793 %    \begin{macrocode}
794 \def\sv@read#1#2#3{%
795 %    \end{macrocode}
796 %
797 % This code does all sorts of evil things, so I'll start by opening a group.
798 %
799 %    \begin{macrocode}
800   \begingroup%
801 %    \end{macrocode}
802 %
803 % So that I can spot the end-text, I'll create a matcher macro.
804 %
805 %    \begin{macrocode}
806   \matcher\@match{#1}\sv@read@ii%
807 %    \end{macrocode}
808 %
809 % So that I can identify line ends, I'll make them active.  I'll also make
810 % spaces active so that they can expand to whatever they ought to expand
811 % to (spaces in files, or funny \verb*" " characters or whatever.
812 %
813 %    \begin{macrocode}
814   \catcode13\active%
815   \catcode32\active%
816 %    \end{macrocode}
817 %
818 % I'll use the |\if@tempswa| flag to tell me whether I ought to output the
819 % current line.  This is a little messy, so I'll describe it later.  I'll
820 % initialise it to false because this is the correct thing to do.
821 %
822 %    \begin{macrocode}
823   \@tempswafalse%
824 %    \end{macrocode}
825 %
826 % Most of the job is done by two submacros.  I'll define them in terms of
827 % my current arguments (to save lots of token munging).  The first just
828 % extracts the next line (which ends at the next newline character) and
829 % tries to match it.
830 %
831 %    \begin{macrocode}
832   \lccode`\~13\lowercase{%
833     \def\sv@read@i##1~{\@match{##1}}%
834   }%
835 %    \end{macrocode}
836 %
837 % The results of the match get passed here, along with the text of the
838 % line up to the matched text.
839 %
840 %    \begin{macrocode}
841   \def\sv@read@ii##1{%
842 %    \end{macrocode}
843 %
844 % The first job to do is to maybe strip off percent signs from the beginning,
845 % to keep \package{doc} happy.
846 %
847 %    \begin{macrocode}
848     \sv@percent##1\relax\relax%
849 %    \end{macrocode}
850 %
851 % Now I need to decide whether I ought to output this line.  The method goes
852 % like this: if this is the first line (|\if@tempswa| is false) or the last
853 % (|\if@matched| is true), \emph{and} the text consists only of spaces, then
854 % I'll ignore it.
855 %
856 % The first thing to do is to notice the last line -- if |\if@matched| is
857 % true, then I'll make |\if@tempswa| false to make the first-line and
858 % last-line cases work the same way.
859 %
860 %    \begin{macrocode}
861     \if@matched\@tempswafalse\fi%
862 %    \end{macrocode}
863 %
864 % Now if this is the first or last line, I'll examine it for spaces.  This
865 % is done in a separate macro.  It will set |\if@tempswa| false if the
866 % text contains only spaces.
867 %
868 %    \begin{macrocode}
869     \if@tempswa\else\@tempswatrue\expandafter\@isspaces\@tempa\relax\fi%
870 %    \end{macrocode}
871 %
872 % Now, if |\if@tempswa| is still true, perform the \<process-line-proc> on
873 % the line of text.  I'll provide a group, so that it doesn't upset me
874 % too much.
875 %
876 %    \begin{macrocode}
877     \if@tempswa%
878       \begingroup%
879       \expandafter#2\expandafter{\@tempa}%
880       \endgroup%
881     \fi%
882 %    \end{macrocode}
883 %
884 % The next line won't be the first one, so I'll set the flag true in
885 % readiness.
886 %
887 %    \begin{macrocode}
888     \@tempswatrue%
889 %    \end{macrocode}
890 %
891 % Now, if that wasn't the last line, go round again; otherwise end the group
892 % I started ages ago, and do the user's \<end-proc>.
893 %
894 %    \begin{macrocode}
895     \if@matched\def\@tempa{\endgroup#3}\else\let\@tempa\sv@read@i\fi%
896     \@tempa%
897   }%
898 %    \end{macrocode}
899 %
900 % Now to start the thing up.  I'll read the first line.
901 %
902 %    \begin{macrocode}
903   \sv@read@i%
904 }
905 %    \end{macrocode}
906 %
907 % \end{macro}
908 %
909 % \begin{macro}{\sv@readenv}
910 %
911 % This macro works out an appropriate end-text for the current environment.
912 % If you say \syntax{"\\sv@readenv{"<macro-name>"}"}, it will expand do
913 % \begin{listinglist} \listingsize \synshorts
914 % <macro-name>"{\\"$_{12}$"end{"$_{12}$<current-env-name>"}"$_{12}$"}"^^A
915 %               "{\\end{"<current-env-name>"}}"
916 % \end{listinglist}
917 % Easy, no?
918 %
919 % This is all done with mirrors.  No, err\dots\ it's done with
920 % |\expandafter|.
921 %
922 %    \begin{macrocode}
923 \begingroup
924 \lccode`\<=`\{
925 \lccode`\>=`\}
926 \lccode`\|=`\\
927 \lowercase{\endgroup
928 \def\sv@readenv#1{\expandafter\sv@readenv@i\expandafter{\@currenvir}{#1}}
929 \def\sv@readenv@i#1#2{#2{|end<#1>}{\end{#1}}}
930 }
931 %    \end{macrocode}
932 %
933 % \end{macro}
934 %
935 % \begin{macro}{\sv@verbline}
936 %
937 % This macro typesets a line in a verbatim way, so you can construct a real
938 % verbatim environment from it.  It's a bit tricky in the way that it catches
939 % the last line.  Don't worry about this: it's easy really.  Note the
940 % |\relax| after the |\par| -- this is because \package{doc} tries to do
941 % clever things with |\par| to strip `|%|' signs out.
942 %
943 %    \begin{macrocode}
944 \def\sv@verbline#1{%
945   \sv@emptybox\tw@%
946   \setbox\z@\hbox{#1\sv@stripspc}%
947   \sv@addtobox\tw@\z@%
948   \if1\ifdim\wd\tw@=\z@\if@matched0\else1\fi\else1\fi%
949     \svline\tw@\relax%
950   \fi%
951 }
952 %    \end{macrocode}
953 %
954 % \end{macro}
955 %
956 % \subsection{Listing environments}
957 %
958 % The \env{listing} environment is our equivalent of the standard
959 % \env{verbatim} environment.  We do some slightly cleverer things, though,
960 % to make sure (for example) that even text which contains |\end{listing}|
961 % can be typeset.
962 %
963 % \begin{macro}{\listinghook}
964 %
965 % Set everything up as required.  This is here for customization.  The
966 % underlying machinery doesn't mess with this directly, but assumes that
967 % |\svline| and |\svafter| are set up appropriately.
968 %
969 %    \begin{macrocode}
970 \def\listinghook{%
971   \par%
972   \begingroup
973   \listinglist%
974   \listingsize%
975   \let\svline\listingline%
976   \def\svafter{\endlistinglist\endgroup}%
977 }
978 %    \end{macrocode}
979 %
980 % \end{macro}
981 %
982 % \begin{macro}{\listinglist}
983 % \begin{environment}{listinglist}
984 %
985 % This defines the layout for the \env{listing} environment.  It starts a
986 % list with the appropriate shape.  It's also made into an environment, so
987 % that the end-paragraph-environment bits work correctly.
988 %
989 % The |\listingindent| length parameter sets up the indentation of the
990 % listings.  If there's a |\parindent| setting, I'll line listings up with
991 % that; otherwise I'll just choose something which looks right.
992 %
993 %    \begin{macrocode}
994 \newdimen\listingindent
995 \AtBeginDocument{%
996   \ifdim\parindent=\z@\listingindent1em\else\listingindent\parindent\fi%
997 }
998 %    \end{macrocode}
999 %
1000 % Now to define a size hook for the environment.  This is fairly simple
1001 % stuff.
1002 %
1003 %    \begin{macrocode}
1004 \ifx\listingsize\@@undefined
1005   \let\listingsize\footnotesize
1006 \fi
1007 %    \end{macrocode}
1008 %
1009 % Now to define the environment itself.  Suppress the indentation if we're
1010 % first thing on a new list item, so that the listing lines up with
1011 % everything else.
1012 %
1013 %    \begin{macrocode}
1014 \def\listinglist{%
1015   \list{}{%
1016     \if@inlabel%
1017       \leftmargin\z@%
1018     \else%
1019       \leftmargin\listingindent%
1020     \fi%
1021     \rightmargin\z@%
1022     \labelwidth\z@%
1023     \labelsep\z@%
1024     \itemindent\z@%
1025     \listparindent\z@%
1026     \let\makelabel\relax%
1027     \parsep\z@skip%
1028   }%
1029   \parfillskip\@flushglue%
1030   \item\relax%
1031 }
1032 \let\endlistinglist\endlist
1033 %    \end{macrocode}
1034 %
1035 % \end{environment}
1036 % \end{macro}
1037 %
1038 % \begin{macro}{\svline}
1039 % \begin{macro}{\svdoline}
1040 % \begin{macro}{\listingline}
1041 %
1042 % The simple spit-out-a-line macro.
1043 %
1044 %    \begin{macrocode}
1045 \def\svdoline#1{\leavevmode\box#1\par}
1046 \let\svline\svdoline
1047 \let\listingline\svline
1048 %    \end{macrocode}
1049 %
1050 % \end{macro}
1051 % \end{macro}
1052 % \end{macro}
1053 %
1054 % \begin{macro}{\svafter}
1055 %
1056 % This is called when the machinery finishes.  A default is set for safety's
1057 % sake.
1058 %
1059 %    \begin{macrocode}
1060 \let\svafter\relax
1061 %    \end{macrocode}
1062 %
1063 % \end{macro}
1064 %
1065 % \begin{environment}{listing}
1066 %
1067 % The \env{listing} environment is the only real verbatim-like environment we
1068 % create will all this kit, although it does the job very nicely.
1069 %
1070 % The environment indents its contents slightly, unlike \env{verbatim}, and
1071 % uses a smaller typeface in an attempt to fit 77-column text on an A5~page.
1072 % There is also a $*$-variant, which allows you to specify the terminating
1073 % text.  This enables you to include absolutely any text in the environment,
1074 % including |\end{listing}|.
1075 %
1076 % First, we must define the |\listing| command.
1077 %
1078 %    \begin{macrocode}
1079 \def\listing{\listinghook\sv@readenv\sv@listing}
1080 %    \end{macrocode}
1081 %
1082 % Now we define the |\@listing| command, which does most of the work.  We
1083 % base the \env{listing} environment on a \env{list}.
1084 %
1085 %    \begin{macrocode}
1086 \def\sv@listing#1#2{\sv@startlisting\sv@read{#1}\sv@verbline{\svafter#2}}
1087 %    \end{macrocode}
1088 %
1089 % Now we define the starred version.  The command name needs to include the
1090 % `|*|' character, so we must use |\csname|.  There's some hacking here to
1091 % allow us to read the name using the appropriate catcodes for otherwise
1092 % normal characters: \LaTeX\ activates some characters and makes them typeset
1093 % themselves to suppress some ligaturing.
1094 %
1095 %    \begin{macrocode}
1096 \expandafter\def\csname listing*\endcsname{%
1097   \listinghook\begingroup\@noligs\listing@star%
1098 }
1099 \def\listing@star#1{\endgroup\sv@listing{#1}{\end{listing*}}}
1100 %    \end{macrocode}
1101 %
1102 % \end{environment}
1103 %
1104 % \begin{environment}{ignore}
1105 %
1106 % The \env{ignore} environment entirely ignores its contents.  Anything at
1107 % all may be put into the environment: it is discarded utterly.
1108 %
1109 % We define some macros for defining ignoring environments, because this can
1110 % be useful for version control, possibly.
1111 %
1112 %    \begin{macrocode}
1113 \def\sv@ignore#1#2{%
1114   \@bsphack%
1115   \let\do\@makeother\dospecials%
1116   \sv@read{#1}\@gobble{\@esphack#2}%
1117 }
1118 \def\ignore{\sv@readenv\sv@ignore}
1119 \def\ignoreenv#1{%
1120   \expandafter\let\csname #1\endcsname\ignore%
1121 }
1122 \def\unignoreenv#1{%
1123   \expandafter\def\csname #1\endcsname{\endgroup}%
1124   \expandafter\def\csname end#1\endcsname%
1125       {\begingroup\def\@currenvir{#1}}%
1126 }
1127 %    \end{macrocode}
1128 %
1129 % \end{environment}
1130 %
1131 % \subsection{The \env{verbwrite} environment}
1132 %
1133 % The \env{verbwrite} environment allows text to be written to a file in a
1134 % verbatim way.  Note that tab characters don't work, because \TeX\ refuses
1135 % to be nice.
1136 %
1137 % \begin{macro}{\sv@write}
1138 %
1139 % As seems to be traditional now, we first define a general hookable macro
1140 % which allows a caller to specify the end-text and what to do afterwards.
1141 %
1142 %    \begin{macrocode}
1143 \newwrite\sv@writefile
1144 \def\sv@write#1#2{%
1145   \begingroup%
1146   \@bsphack%
1147   \let\do\@makeother\dospecials%
1148   \sv@safespc%
1149   \sv@read{#1}\sv@writeline{\sv@endwrite#2}%
1150 }
1151 \def\sv@writeline#1{%
1152   \immediate\write\sv@writefile{#1}%
1153 }
1154 \def\sv@endwrite{%
1155   \@esphack%
1156   \endgroup%
1157 }
1158 %    \end{macrocode}
1159 %
1160 % \end{macro}
1161 %
1162 % \begin{environment}{verbwrite}
1163 %
1164 % Now we can define the actual environment.  We define a $*$-variant which
1165 % allows the user to specify the end-text, just to make sure.
1166 %
1167 %    \begin{macrocode}
1168 \def\verbwrite#1{%
1169   \immediate\openout\sv@writefile#1\relax%
1170   \sv@readenv\sv@write%
1171 }
1172 \def\endverbwrite{\immediate\closeout\sv@writefile}
1173 \expandafter\def\csname verbwrite*\endcsname#1#2{%
1174   \immediate\openout\sv@writefile#2\relax%
1175   \sv@write{#1}{\immediate\closeout\sv@writefile\end{verbwrite*}}%
1176 }
1177 %    \end{macrocode}
1178 %
1179 % \end{environment}
1180 %
1181 % \subsection{The \env{demo} environment}
1182 %
1183 % By way of tying all of this together, I present an environment for
1184 % displaying demonstrations of \LaTeX\ markup.  We read the contents of the
1185 % environment, write it to a temporary file, and read it back twice,
1186 % typesetting it the first time and displaying it verbatim the second time.
1187 %
1188 % \begin{macro}{\sv@demoname}
1189 %
1190 % This macro expands to the filename to use for the temporary data.  To
1191 % allow the package documentation to demonstrate the \env{demo} environment
1192 % itself, we need to keep a nesting count.  This avoids too much hackery,
1193 % which unfortunately appears to plague all of my \TeX\ code.
1194 %
1195 %    \begin{macrocode}
1196 \newcount\sv@nestcount
1197 \def\sv@demoname{demo\number\sv@nestcount.tmp}
1198 %    \end{macrocode}
1199 %
1200 % \end{macro}
1201 %
1202 % \begin{macro}{\sv@demo}
1203 %
1204 % As for listing, we do all the business through a private macro.  This is
1205 % good because it means we can leave the main macro readable.  The argument
1206 % is the end-text to spot.
1207 %
1208 %    \begin{macrocode}
1209 \def\sv@demo#1#2{%
1210   \@ifnextchar[{\sv@demo@i{#1}{#2}}{\sv@demo@i{#1}{#2}[n]}%
1211 }
1212 \def\sv@demo@i#1#2[#3]#4{%
1213   \advance\sv@nestcount by\@ne%
1214   \immediate\openout\sv@writefile\sv@demoname\relax%
1215   \sv@write{#1}{%
1216     \immediate\closeout\sv@writefile%
1217     \sv@dodemo{#2}{#3}{#4}%
1218   }%
1219 }
1220 %    \end{macrocode}
1221 %
1222 % \end{macro}
1223 %
1224 % \begin{environment}{demo}
1225 %
1226 % This is the real environment.  We provide \env{demo$*$} too, to allow the
1227 % user to choose the end-text.
1228 %
1229 %    \begin{macrocode}
1230 \def\demo{\let\@demohook\demohook\sv@readenv\sv@demo}
1231 \expandafter\def\csname demo*\endcsname#1%
1232   {\let\@demohook\demohook\sv@demo{#1}{\end{demo*}}}
1233 %    \end{macrocode}
1234 %
1235 % \end{environment}
1236 %
1237 % \begin{macro}{\demohook}
1238 %
1239 % Like |\listinghook|.  So much so that we just call it, but first ensure
1240 % that the indent is zero (otherwise it looks really odd!).
1241 %
1242 %    \begin{macrocode}
1243 \def\demohook{\listingindent\z@\listinghook}
1244 %    \end{macrocode}
1245 %
1246 % \end{macro}
1247 %
1248 % \begin{macro}{\sv@dodemo}
1249 %
1250 % First, let's define some common bits of code in the stuff below.  The
1251 % minipages used to typeset the material has some clever stuff to avoid
1252 % strange spacing in the output.
1253 %
1254 %    \begin{macrocode}
1255 \def\sv@demosmp{%
1256   \begin{minipage}[t]{\@tempdima}%
1257   \vskip8\p@%
1258   \hrule\@height\z@%
1259   \raggedright%
1260   \vbox\bgroup%
1261 }
1262 \def\sv@demoemp{%
1263     \par\unpenalty\unskip%
1264   \egroup%
1265   \vskip8\p@%
1266   \hrule\@height\z@%
1267   \end{minipage}%
1268 }
1269 %    \end{macrocode}
1270 %
1271 % This is the macro which actually typesets the demonstration.
1272 %
1273 %    \begin{macrocode}
1274 \def\sv@dodemo#1#2#3{%
1275 %    \end{macrocode}
1276 %
1277 % Now work out some values.  We set |\hsize| to the line width leaving 2\,em
1278 % of space on either side.  The size of the minipages is calculated depending
1279 % on the shape of the demonstration.  This is all fairly simple.
1280 %
1281 %    \begin{macrocode}
1282   \begingroup%
1283   \@tempdima\linewidth%
1284   \advance\@tempdima-2em%
1285   \hsize\@tempdima%
1286   \if#2w%
1287     \advance\@tempdima-2em%
1288   \else%
1289     \advance\@tempdima-3em%
1290     \divide\@tempdima2%
1291   \fi%
1292 %    \end{macrocode}
1293 %
1294 % Now we open a big vertical box, and put in a header to mark off the
1295 % demonstration.
1296 %
1297 %    \begin{macrocode}
1298   \par%
1299   \setbox\z@\hbox{\strut\enspace#3\enspace\strut}%
1300   \@tempdimb.5\dp\z@%
1301   \advance\@tempdimb-.5\ht\z@%
1302   \ht\z@\@tempdimb\dp\z@\@tempdimb%
1303   \noindent\hskip1em\vtop{%
1304     \hb@xt@\hsize{%
1305       \hrulefill%
1306       \raise\@tempdimb\box\z@%
1307       \hrulefill%
1308     }%
1309     \nointerlineskip%
1310     \hb@xt@\hsize{\vrule\@height5\p@\hfil\vrule\@height5\p@}%
1311     \nointerlineskip%
1312 %    \end{macrocode}
1313 %
1314 % Now we insert the output text in the first minipage.  I'll force `|%|'
1315 % to be a comment character, in case something like \package{doc} has had its
1316 % wicked way.
1317 %
1318 %    \begin{macrocode}
1319     \vskip-\parskip%
1320     \noindent\hbox{}\hskip1em%
1321     \sv@demosmp%
1322     \catcode`\%14\relax%
1323     \@input{\sv@demoname}%
1324     \sv@demoemp%
1325 %    \end{macrocode}
1326 %
1327 % Insert some kind of separation between the two.  In `wide' format, we start
1328 % a new line, and put a ruleoff between the two.  In `narrow' format, we just
1329 % leave some space.
1330 %
1331 %    \begin{macrocode}
1332     \if#2w%
1333       \vskip8\p@\hrule\vskip8\p@%
1334       \noindent\hbox{}%
1335     \fi%
1336     \hskip1em%
1337 %    \end{macrocode}
1338 %
1339 % Now we put the verbatim copy of the text in the other minipage.
1340 %
1341 %    \begin{macrocode}
1342     \sv@demosmp%
1343     \@demohook%
1344     \verbinput@\@input\sv@demoname%
1345     \sv@demoemp%
1346     \par%
1347     \nointerlineskip%
1348     \hb@xt@\hsize{\vrule\@height5\p@\hfil\vrule\@height5\p@}%
1349     \hrule%
1350   }%
1351   \endgroup%
1352   \par%
1353   \vskip\baselineskip%
1354   #1%
1355 }
1356 %    \end{macrocode}
1357 %
1358 % \end{macro}
1359 %
1360 % \subsection{Loading the colour package}
1361 %
1362 % If requested, we load the \package{svcolour} package here.  This ensures
1363 % that it can patch this code if it needs to.
1364 %
1365 %    \begin{macrocode}
1366 \ifsv@colour
1367   \RequirePackage{svcolour}
1368 \fi
1369 %    \end{macrocode}
1370 %
1371 % That's all there is.  Have fun.
1372 %
1373 %    \begin{macrocode}
1374 %</package>
1375 %    \end{macrocode}
1376 %
1377 % \subsection{The \package{svcolour} package}
1378 %
1379 % This is in a separate package to avoid dragging in the \package{color}
1380 % package if it's unwanted.
1381 %
1382 % I prefer English spellings.  Here's a trivial redirection for Americans.
1383 %
1384 %    \begin{macrocode}
1385 %<*color>
1386 \DeclareOption*{\PassOptionsToPackage{\CurrentOption}{svcolour}}
1387 \ProcessOptions
1388 \RequirePackage{svcolour}
1389 %</color>
1390 %    \end{macrocode}
1391 %
1392 % And now we can start the thing properly.
1393 %
1394 %    \begin{macrocode}
1395 %<*colour>
1396 \RequirePackage{color}
1397 %    \end{macrocode}
1398 %
1399 % \begin{macro}{\@snarfcolour}
1400 %
1401 % Reading a colour specification is something we'll need to do a few times,
1402 % so an abstraction is useful.  Its single argument is a continuation to
1403 % which we pass a colour-spec acceptable to the |\color| command.  (This is
1404 % the same code as found in the \package{mdwtab} package.  Remember to keep
1405 % them in step.)
1406 %
1407 %    \begin{macrocode}
1408 \def\@snarfcolour#1{%
1409   \@ifnextchar[{\@snarfcolour@i{#1}}{\@snarfcolour@ii{#1}{}}%
1410 }
1411 \def\@snarfcolour@i#1[#2]{\@snarfcolour@ii{#1}{[#2]}}
1412 \def\@snarfcolour@ii#1#2#3{#1{#2{#3}}}
1413 %    \end{macrocode}
1414 %
1415 % \end{macro}
1416 %
1417 % \begin{macro}{\svcolourline}
1418 % \begin{macro}{\svcolorline}
1419 %
1420 % Snarf the option, and plot the coloured bar.  Note the penalties which are
1421 % meant to stick the glue and leaders onto the colour specials.
1422 %
1423 %    \begin{macrocode}
1424 \def\svcolourline{\@snarfcolour\svcl@i}
1425 \def\svcl@i#1#2{%
1426   \skip@\wd#2%
1427   \advance\skip@\parfillskip%
1428   \advance\skip@.2em%
1429   \strut%
1430   \kern.2em%
1431   \begingroup\color#1\nobreak\leaders\vrule\hskip\skip@\endgroup%
1432   \nobreak\hskip-\skip@%
1433   \kern.2em%
1434   \box#2%
1435   \nobreak\hskip-\rightskip\vadjust{}%
1436   \par%
1437 }
1438 \let\svcolorline\svcolourline
1439 %    \end{macrocode}
1440 %
1441 % \end{macro}
1442 % \end{macro}
1443 %
1444 % Done!
1445 %
1446 %    \begin{macrocode}
1447 %</colour>
1448 %    \end{macrocode}
1449 %
1450 % \subsection{The \package{svsplit} package}
1451 %
1452 %    \begin{macrocode}
1453 %<*split>
1454 \RequirePackage{sverb}
1455 %    \end{macrocode}
1456 %
1457 % \begin{environment}{splitverb}
1458 % \begin{environment}{splitverb*}
1459 %
1460 % The basic environments are simple enough.
1461 %
1462 %    \begin{macrocode}
1463 \def\splitverb{\listinghook\sv@readenv\splitverb@}
1464 \expandafter\def\csname splitverb*\endcsname%
1465   {\listinghook\begingroup\@noligs\svsplit@star}
1466 \def\svsplit@star#1{\endgroup\splitverb@{#1}{\end{splitverb*}}}
1467 %    \end{macrocode}
1468 %
1469 % \end{environment}
1470 % \end{environment}
1471 %
1472 % \begin{macro}{\splitverb@}
1473 %
1474 % Even this isn't so bad, really.
1475 %
1476 %    \begin{macrocode}
1477 \def\splitverb@#1#2{\sv@startlisting\sv@read{#1}\svsplit@line{\svafter#2}}
1478 %    \end{macrocode}
1479 %
1480 % \end{macro}
1481 %
1482 % \begin{macro}{\svsplit@line}
1483 %
1484 % For the sake of readability (and maybe saving a few tokens), we define some
1485 % synonyms for \TeX's scratch registers.  |\svsplit@remain| will be a
1486 % |\global| register containing the remaining horizontal space on the line;
1487 % |\svsplit@indent| is a local register containing the amount of initial
1488 % whitespace on the line.
1489 %
1490 %    \begin{macrocode}
1491 \dimendef\svsplit@remain=1 
1492 \dimendef\svsplit@indent=2
1493 %    \end{macrocode}
1494 %
1495 % The switch |\svsplit@| is set if we've found a good place to split the
1496 % current line.
1497 %
1498 %    \begin{macrocode}
1499 \newif\ifsvsplit@
1500 %    \end{macrocode}
1501 %
1502 % And finally a delimiter.  This is the same one I use everywhere else.
1503 %
1504 %    \begin{macrocode}
1505 \def\q@delim{\q@delim}
1506 %    \end{macrocode}
1507 %
1508 %    \begin{macrocode}
1509 \begingroup
1510 \catcode`\~=\active \lccode`\~=32
1511 \catcode`\!=\active \lccode`\!=9
1512 \lowercase{\endgroup
1513 %    \end{macrocode}
1514 %
1515 % So far, so good.  The |\svsplit@line| macro is given a line of text.  We
1516 % initialize |\svtab| to be a \emph{single} space, |\svsplit@remain| to be
1517 % the text width, and |\svsplit@indent| to zero.  Then we embark on the first
1518 % loop, which attempts to find the width of the leading whitespace.
1519 %
1520 %    \begin{macrocode}
1521 \def\svsplit@line#1{%
1522   \divide\svtab8%
1523   \global\svsplit@remain\linewidth%
1524   \svsplit@indent\z@%
1525   \sv@emptybox\tw@%
1526   \let\next@\svsplit@findindent%
1527   \next@#1\q@delim%
1528 }
1529 %    \end{macrocode}
1530 %
1531 % A straightforward tail-recursive loop finds out how much whitespace there
1532 % is at the start of the current line.  Note that |\next@| is already set up
1533 % for the optimized case of continuing the loop.  Also, if we reach the end
1534 % then this is a blank line, so only emit something if we didn't see the
1535 % end-marker.  This is the only place we need to check for this.
1536 %
1537 %    \begin{macrocode}
1538 \def\svsplit@findindent#1{%
1539   \ifx~#1%
1540     \advance\svsplit@indent\svtab%
1541   \else\ifx!#1%
1542     \dimen@8\svtab%
1543     \divide\svsplit@indent\dimen@%
1544     \multiply\svsplit@indent\dimen@%
1545     \advance\svsplit@indent\dimen@%
1546   \else\ifx\q@delim#1%
1547     \if@matched\else\svline\tw@\fi%
1548     \let\next@\relax%
1549   \else%
1550     \def\next@{\svsplit@scanline{#1}}%
1551   \fi\fi\fi%
1552   \next@%
1553 }
1554 %    \end{macrocode}
1555 %
1556 % Now we have to actually scan the line to find breakpoints.  We build the
1557 % current unbreakable chunk in |\box|~0.  When we find a breakpoint, we close
1558 % the box, maybe stretch it to take into account trailing space, and attach
1559 % it to |\box|~2, which is gathering the current line.  If |\svsplit@remain|
1560 % hits zero then we flush |\box|~2 to the output and continue on the next
1561 % line with a (more-or-less) clean slate.
1562 %
1563 % If there's no breakpoint then we're hosed.  In that case, we just insert a
1564 % (|\normalfont|) hyphen and eject what we've got.
1565 %
1566 % Note that this assumes that the indentation will fit.  If not, then we're
1567 % deeply stuffed.
1568 %
1569 %    \begin{macrocode}
1570 \def\svsplit@scanline{%
1571   \svsplit@false%
1572   \let\next@\svsplit@char%
1573   \setbox\z@\hbox\bgroup%
1574     \kern\svsplit@indent%
1575     \global\advance\svsplit@remain-\svsplit@indent%
1576     \next@%
1577 }
1578 %    \end{macrocode}
1579 %
1580 % Scanning a character isn't so bad, if we take it a step at a time.
1581 %
1582 %    \begin{macrocode}
1583 \def\svsplit@char#1{%
1584 %    \end{macrocode}
1585 %
1586 % If the character is a space or a tab, then we call |\svsplit@space| which
1587 % knows about adding breakable whitespace.  For tabs, this involves computing
1588 % the correct tab size.
1589 %
1590 %    \begin{macrocode}
1591     \ifx~#1%
1592       \svsplit@space\svtab%
1593     \else\ifx!#1%
1594       \@tempdima\linewidth%
1595       \advance\@tempdima-\svsplit@remain%
1596       \@tempdimb\@tempdima%
1597       \dimen@8\svtab%
1598       \divide\@tempdimb\dimen@%
1599       \multiply\@tempdimb\dimen@%
1600       \advance\@tempdimb\dimen@%
1601       \advance\@tempdimb-\@tempdima%
1602       \svsplit@space\@tempdimb%
1603 %    \end{macrocode}
1604 %
1605 % We might have reached the end of the line.  If so, then we finish off.
1606 %
1607 %    \begin{macrocode}
1608     \else\ifx\q@delim#1%
1609       \let\next@\svsplit@done%
1610 %    \end{macrocode}
1611 %
1612 % Otherwise it's a normal character.  If there's not enough space then force
1613 % a break.  
1614 %
1615 %    \begin{macrocode}
1616     \else%
1617       \ifdim\svsplit@remain<2\svtab%
1618         \ifsvsplit@\else\normalfont-\svsplit@break\fi%
1619         \svsplit@eject%
1620       \fi%
1621 %    \end{macrocode}
1622 %
1623 % Insert the character and decrement the distance-left register.
1624 %
1625 %    \begin{macrocode}
1626       #1%
1627       \global\advance\svsplit@remain-\svtab%
1628 %    \end{macrocode}
1629 %
1630 % Now we see if it's a breakable-after character and if so mark it as being
1631 % breakable.
1632 %
1633 %    \begin{macrocode}
1634       \def\temp@##1#1##2\q@delim%
1635         {\ifx\q@delim##2\q@delim\else\svsplit@break\fi}%
1636       \expandafter\temp@\svsplitchars#1\q@delim%
1637 %    \end{macrocode}
1638 %
1639 % And with that, we're done.
1640 %
1641 %    \begin{macrocode}
1642     \fi\fi\fi%
1643     \next@%
1644 }
1645 %    \end{macrocode}
1646 %
1647 % Our next macro is the break-insertion subroutine, which is quite easy.
1648 %
1649 %    \begin{macrocode}
1650 \def\svsplit@break{%
1651   \egroup%
1652   \sv@addtobox\tw@\z@%
1653   \svsplit@true%
1654   \setbox\z@\hbox\bgroup%
1655 }
1656 %    \end{macrocode}
1657 %
1658 % Now we add space to the current box.  The argument is a dimen register.
1659 %
1660 %    \begin{macrocode}
1661 \def\svsplit@space#1{%
1662     \ifdim\svsplit@remain>#1\kern#1\global\advance\svsplit@remain-#1\fi%
1663     \svsplit@break%
1664     \ifdim\svsplit@remain>#1\else\svsplit@eject\fi%
1665 }
1666 %    \end{macrocode}
1667 %
1668 % We now come to a slightly involved piece of code, which is how to flush out
1669 % a line, and then fix up the registers for the next line correctly.
1670 %
1671 %    \begin{macrocode}
1672 \def\svsplit@eject{%
1673   \egroup%
1674   \svline\tw@%
1675   \sv@emptybox\tw@%
1676   \svsplit@false%
1677   \setbox\z@\hbox\bgroup%
1678     \kern\svsplit@indent%
1679     \global\svsplit@remain\linewidth%
1680     \global\advance\svsplit@remain-\svsplit@indent%
1681     \global\advance\svsplit@remain-\wd\z@%
1682     \unhbox\z@%
1683 }
1684 %    \end{macrocode}
1685 %
1686 % Finally, how to finish the line and go home.
1687 %
1688 %    \begin{macrocode}
1689 \def\svsplit@done{%
1690   \egroup%
1691   \sv@addtobox\tw@\z@%
1692   \svline\tw@%
1693 }
1694 %    \end{macrocode}
1695 %
1696 % End the |\lowercase| hack.
1697 %
1698 %    \begin{macrocode}
1699 }
1700 %    \end{macrocode}
1701 %
1702 % \end{macro}
1703 %
1704 % Finally, set the breakable characters to something plausible.
1705 %
1706 %    \begin{macrocode}
1707 \def\svsplitchars{:/.}
1708 %    \end{macrocode}
1709 %
1710 % And with that, we're done!
1711 %
1712 %    \begin{macrocode}
1713 %</split>
1714 %    \end{macrocode}
1715 %
1716 % \hfill Mark Wooding, \today
1717 %
1718 % \Finale
1719 %
1720 \endinput