]> git.donarmstrong.com Git - lilypond.git/blob - tex/texinfo.tex
* scripts/lilypond-book.py (Snippet.output_print_filename): new
[lilypond.git] / tex / texinfo.tex
1 % texinfo.tex -- TeX macros to handle Texinfo files.
2 %
3 % Load plain if necessary, i.e., if running under initex.
4 \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
5 %
6 \def\texinfoversion{2003-12-07.11}
7 %
8 % Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
9 % 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
10 %
11 % This texinfo.tex file is free software; you can redistribute it and/or
12 % modify it under the terms of the GNU General Public License as
13 % published by the Free Software Foundation; either version 2, or (at
14 % your option) any later version.
15 %
16 % This texinfo.tex file is distributed in the hope that it will be
17 % useful, but WITHOUT ANY WARRANTY; without even the implied warranty
18 % of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19 % General Public License for more details.
20 %
21 % You should have received a copy of the GNU General Public License
22 % along with this texinfo.tex file; see the file COPYING.  If not, write
23 % to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
24 % Boston, MA 02111-1307, USA.
25 %
26 % As a special exception, when this file is read by TeX when processing
27 % a Texinfo source document, you may use the result without
28 % restriction.  (This has been our intent since Texinfo was invented.)
29
30 % Please try the latest version of texinfo.tex before submitting bug
31 % reports; you can get the latest version from:
32 %   http://www.gnu.org/software/texinfo/ (the Texinfo home page), or
33 %   ftp://tug.org/tex/texinfo.tex
34 %     (and all CTAN mirrors, see http://www.ctan.org).
35 % The texinfo.tex in any given distribution could well be out
36 % of date, so if that's what you're using, please check.
37 %
38 % Send bug reports to bug-texinfo@gnu.org.  Please include including a
39 % complete document in each bug report with which we can reproduce the
40 % problem.  Patches are, of course, greatly appreciated.
41 %
42 % To process a Texinfo manual with TeX, it's most reliable to use the
43 % texi2dvi shell script that comes with the distribution.  For a simple
44 % manual foo.texi, however, you can get away with this:
45 %   tex foo.texi
46 %   texindex foo.??
47 %   tex foo.texi
48 %   tex foo.texi
49 %   dvips foo.dvi -o  # or whatever; this makes foo.ps.
50 % The extra TeX runs get the cross-reference information correct.
51 % Sometimes one run after texindex suffices, and sometimes you need more
52 % than two; texi2dvi does it as many times as necessary.
53 %
54 % It is possible to adapt texinfo.tex for other languages, to some
55 % extent.  You can get the existing language-specific files from the
56 % full Texinfo distribution.
57
58 % The GNU Texinfo home page is http://www.gnu.org/software/texinfo.
59
60
61 \message{Loading texinfo [version \texinfoversion]:}
62
63 % If in a .fmt file, print the version number
64 % and turn on active characters that we couldn't do earlier because
65 % they might have appeared in the input file name.
66 \everyjob{\message{[Texinfo version \texinfoversion]}%
67   \catcode`+=\active \catcode`\_=\active}
68
69 \message{Basics,}
70 \chardef\other=12
71
72 % We never want plain's \outer definition of \+ in Texinfo.
73 % For @tex, we can use \tabalign.
74 \let\+ = \relax
75
76 % Save some plain tex macros whose names we will redefine.
77 \let\ptexb=\b
78 \let\ptexbullet=\bullet
79 \let\ptexc=\c
80 \let\ptexcomma=\,
81 \let\ptexdot=\.
82 \let\ptexdots=\dots
83 \let\ptexend=\end
84 \let\ptexequiv=\equiv
85 \let\ptexexclam=\!
86 \let\ptexfootnote=\footnote
87 \let\ptexgtr=>
88 \let\ptexhat=^
89 \let\ptexi=\i
90 \let\ptexindent=\indent
91 \let\ptexnoindent=\noindent
92 \let\ptexinsert=\insert
93 \let\ptexlbrace=\{
94 \let\ptexless=<
95 \let\ptexplus=+
96 \let\ptexrbrace=\}
97 \let\ptexslash=\/
98 \let\ptexstar=\*
99 \let\ptext=\t
100
101 % If this character appears in an error message or help string, it
102 % starts a new line in the output.
103 \newlinechar = `^^J
104
105 % Use TeX 3.0's \inputlineno to get the line number, for better error
106 % messages, but if we're using an old version of TeX, don't do anything.
107 %
108 \ifx\inputlineno\thisisundefined
109   \let\linenumber = \empty % Pre-3.0.
110 \else
111   \def\linenumber{l.\the\inputlineno:\space}
112 \fi
113
114 % Set up fixed words for English if not already set.
115 \ifx\putwordAppendix\undefined  \gdef\putwordAppendix{Appendix}\fi
116 \ifx\putwordChapter\undefined   \gdef\putwordChapter{Chapter}\fi
117 \ifx\putwordfile\undefined      \gdef\putwordfile{file}\fi
118 \ifx\putwordin\undefined        \gdef\putwordin{in}\fi
119 \ifx\putwordIndexIsEmpty\undefined     \gdef\putwordIndexIsEmpty{(Index is empty)}\fi
120 \ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi
121 \ifx\putwordInfo\undefined      \gdef\putwordInfo{Info}\fi
122 \ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi
123 \ifx\putwordMethodon\undefined  \gdef\putwordMethodon{Method on}\fi
124 \ifx\putwordNoTitle\undefined   \gdef\putwordNoTitle{No Title}\fi
125 \ifx\putwordof\undefined        \gdef\putwordof{of}\fi
126 \ifx\putwordon\undefined        \gdef\putwordon{on}\fi
127 \ifx\putwordpage\undefined      \gdef\putwordpage{page}\fi
128 \ifx\putwordsection\undefined   \gdef\putwordsection{section}\fi
129 \ifx\putwordSection\undefined   \gdef\putwordSection{Section}\fi
130 \ifx\putwordsee\undefined       \gdef\putwordsee{see}\fi
131 \ifx\putwordSee\undefined       \gdef\putwordSee{See}\fi
132 \ifx\putwordShortTOC\undefined  \gdef\putwordShortTOC{Short Contents}\fi
133 \ifx\putwordTOC\undefined       \gdef\putwordTOC{Table of Contents}\fi
134 %
135 \ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi
136 \ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi
137 \ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi
138 \ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi
139 \ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi
140 \ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi
141 \ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi
142 \ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi
143 \ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi
144 \ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi
145 \ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi
146 \ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi
147 %
148 \ifx\putwordDefmac\undefined    \gdef\putwordDefmac{Macro}\fi
149 \ifx\putwordDefspec\undefined   \gdef\putwordDefspec{Special Form}\fi
150 \ifx\putwordDefvar\undefined    \gdef\putwordDefvar{Variable}\fi
151 \ifx\putwordDefopt\undefined    \gdef\putwordDefopt{User Option}\fi
152 \ifx\putwordDeffunc\undefined   \gdef\putwordDeffunc{Function}\fi
153
154 % In some macros, we cannot use the `\? notation---the left quote is
155 % in some cases the escape char.
156 \chardef\colonChar = `\:
157 \chardef\commaChar = `\,
158 \chardef\dotChar   = `\.
159 \chardef\exclamChar= `\!
160 \chardef\questChar = `\?
161 \chardef\semiChar  = `\;
162 \chardef\spaceChar = `\ %
163 \chardef\underChar = `\_
164
165 % Ignore a token.
166 %
167 \def\gobble#1{}
168
169 % The following is used inside several \edef's.
170 \def\makecsname#1{\expandafter\noexpand\csname#1\endcsname}
171
172 % Make an outer definition into an inner one (due to Chris Thompson).
173 % The arguments should be the control sequence to be defined, and the
174 % new of the \outer control sequence, as characters; the control
175 % sequence #1 is defined to be just the same as \csname#2\endcsname, but
176 % not \outer.
177
178 % For example, \innerdef\innernewcount{newcount} defines \innernewcount
179 % to be a non-outer version of \newcount.
180 %
181 \def\innerdef#1#2{\edef#1{\expandafter\noexpand\csname #2\endcsname}}%
182 %
183 \innerdef\innernewcount{newcount}%
184
185 % Hyphenation fixes.
186 \hyphenation{ap-pen-dix}
187 \hyphenation{eshell}
188 \hyphenation{mini-buf-fer mini-buf-fers}
189 \hyphenation{time-stamp}
190 \hyphenation{white-space}
191
192 % Margin to add to right of even pages, to left of odd pages.
193 \newdimen\bindingoffset
194 \newdimen\normaloffset
195 \newdimen\pagewidth \newdimen\pageheight
196
197 % For a final copy, take out the rectangles
198 % that mark overfull boxes (in case you have decided
199 % that the text looks ok even though it passes the margin).
200 %
201 \def\finalout{\overfullrule=0pt}
202
203 % @| inserts a changebar to the left of the current line.  It should
204 % surround any changed text.  This approach does *not* work if the
205 % change spans more than two lines of output.  To handle that, we would
206 % have adopt a much more difficult approach (putting marks into the main
207 % vertical list for the beginning and end of each change).
208 %
209 \def\|{%
210   % \vadjust can only be used in horizontal mode.
211   \leavevmode
212   %
213   % Append this vertical mode material after the current line in the output.
214   \vadjust{%
215     % We want to insert a rule with the height and depth of the current
216     % leading; that is exactly what \strutbox is supposed to record.
217     \vskip-\baselineskip
218     %
219     % \vadjust-items are inserted at the left edge of the type.  So
220     % the \llap here moves out into the left-hand margin.
221     \llap{%
222       %
223       % For a thicker or thinner bar, change the `1pt'.
224       \vrule height\baselineskip width1pt
225       %
226       % This is the space between the bar and the text.
227       \hskip 12pt
228     }%
229   }%
230 }
231
232 % Sometimes it is convenient to have everything in the transcript file
233 % and nothing on the terminal.  We don't just call \tracingall here,
234 % since that produces some useless output on the terminal.  We also make
235 % some effort to order the tracing commands to reduce output in the log
236 % file; cf. trace.sty in LaTeX.
237 %
238 \def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
239 \def\loggingall{%
240   \tracingstats2
241   \tracingpages1
242   \tracinglostchars2  % 2 gives us more in etex
243   \tracingparagraphs1
244   \tracingoutput1
245   \tracingmacros2
246   \tracingrestores1
247   \showboxbreadth\maxdimen \showboxdepth\maxdimen
248   \ifx\eTeXversion\undefined\else % etex gives us more logging
249     \tracingscantokens1
250     \tracingifs1
251     \tracinggroups1
252     \tracingnesting2
253     \tracingassigns1
254   \fi
255   \tracingcommands3  % 3 gives us more in etex
256   \errorcontextlines\maxdimen
257 }%
258
259 % add check for \lastpenalty to plain's definitions.  If the last thing
260 % we did was a \nobreak, we don't want to insert more space.
261 %
262 \def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount
263   \removelastskip\penalty-50\smallskip\fi\fi}
264 \def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount
265   \removelastskip\penalty-100\medskip\fi\fi}
266 \def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount
267   \removelastskip\penalty-200\bigskip\fi\fi}
268
269 % For @cropmarks command.
270 % Do @cropmarks to get crop marks.
271 %
272 \newif\ifcropmarks
273 \let\cropmarks = \cropmarkstrue
274 %
275 % Dimensions to add cropmarks at corners.
276 % Added by P. A. MacKay, 12 Nov. 1986
277 %
278 \newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
279 \newdimen\cornerlong  \cornerlong=1pc
280 \newdimen\cornerthick \cornerthick=.3pt
281 \newdimen\topandbottommargin \topandbottommargin=.75in
282
283 % Main output routine.
284 \chardef\PAGE = 255
285 \output = {\onepageout{\pagecontents\PAGE}}
286
287 \newbox\headlinebox
288 \newbox\footlinebox
289
290 % \onepageout takes a vbox as an argument.  Note that \pagecontents
291 % does insertions, but you have to call it yourself.
292 \def\onepageout#1{%
293   \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi
294   %
295   \ifodd\pageno  \advance\hoffset by \bindingoffset
296   \else \advance\hoffset by -\bindingoffset\fi
297   %
298   % Do this outside of the \shipout so @code etc. will be expanded in
299   % the headline as they should be, not taken literally (outputting ''code).
300   \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}%
301   \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}%
302   %
303   {%
304     % Have to do this stuff outside the \shipout because we want it to
305     % take effect in \write's, yet the group defined by the \vbox ends
306     % before the \shipout runs.
307     %
308     \escapechar = `\\     % use backslash in output files.
309     \indexdummies         % don't expand commands in the output.
310     \normalturnoffactive  % \ in index entries must not stay \, e.g., if
311                    % the page break happens to be in the middle of an example.
312     \shipout\vbox{%
313       % Do this early so pdf references go to the beginning of the page.
314       \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi
315       %
316       \ifcropmarks \vbox to \outervsize\bgroup
317         \hsize = \outerhsize
318         \vskip-\topandbottommargin
319         \vtop to0pt{%
320           \line{\ewtop\hfil\ewtop}%
321           \nointerlineskip
322           \line{%
323             \vbox{\moveleft\cornerthick\nstop}%
324             \hfill
325             \vbox{\moveright\cornerthick\nstop}%
326           }%
327           \vss}%
328         \vskip\topandbottommargin
329         \line\bgroup
330           \hfil % center the page within the outer (page) hsize.
331           \ifodd\pageno\hskip\bindingoffset\fi
332           \vbox\bgroup
333       \fi
334       %
335       \unvbox\headlinebox
336       \pagebody{#1}%
337       \ifdim\ht\footlinebox > 0pt
338         % Only leave this space if the footline is nonempty.
339         % (We lessened \vsize for it in \oddfootingxxx.)
340         % The \baselineskip=24pt in plain's \makefootline has no effect.
341         \vskip 2\baselineskip
342         \unvbox\footlinebox
343       \fi
344       %
345       \ifcropmarks
346           \egroup % end of \vbox\bgroup
347         \hfil\egroup % end of (centering) \line\bgroup
348         \vskip\topandbottommargin plus1fill minus1fill
349         \boxmaxdepth = \cornerthick
350         \vbox to0pt{\vss
351           \line{%
352             \vbox{\moveleft\cornerthick\nsbot}%
353             \hfill
354             \vbox{\moveright\cornerthick\nsbot}%
355           }%
356           \nointerlineskip
357           \line{\ewbot\hfil\ewbot}%
358         }%
359       \egroup % \vbox from first cropmarks clause
360       \fi
361     }% end of \shipout\vbox
362   }% end of group with \normalturnoffactive
363   \advancepageno
364   \ifnum\outputpenalty>-20000 \else\dosupereject\fi
365 }
366
367 \newinsert\margin \dimen\margin=\maxdimen
368
369 \def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}
370 {\catcode`\@ =11
371 \gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
372 % marginal hacks, juha@viisa.uucp (Juha Takala)
373 \ifvoid\margin\else % marginal info is present
374   \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi
375 \dimen@=\dp#1 \unvbox#1
376 \ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
377 \ifr@ggedbottom \kern-\dimen@ \vfil \fi}
378 }
379
380 % Here are the rules for the cropmarks.  Note that they are
381 % offset so that the space between them is truly \outerhsize or \outervsize
382 % (P. A. MacKay, 12 November, 1986)
383 %
384 \def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}
385 \def\nstop{\vbox
386   {\hrule height\cornerthick depth\cornerlong width\cornerthick}}
387 \def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}
388 \def\nsbot{\vbox
389   {\hrule height\cornerlong depth\cornerthick width\cornerthick}}
390
391 % Parse an argument, then pass it to #1.  The argument is the rest of
392 % the input line (except we remove a trailing comment).  #1 should be a
393 % macro which expects an ordinary undelimited TeX argument.
394 %
395 \def\parsearg{\parseargusing{}}
396 \def\parseargusing#1#2{%
397   \def\next{#2}%
398   \begingroup
399     \obeylines
400     \catcode`\ =10
401     #1%
402     \parseargline\empty% Insert the \empty token, see \finishparsearg below.
403 }
404
405 {\obeylines %
406   \gdef\parseargline#1^^M{%
407     \endgroup % End of the group started in \parsearg.
408     \argremovecomment #1\comment\ArgTerm%
409   }%
410 }
411
412 % First remove any @comment, then any @c comment.
413 \def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm}
414 \def\argremovec#1\c#2\ArgTerm{\argremovespace#1$ $\ArgTerm}
415 % \argremovec might leave us with trailing space, though; e.g.,
416 %    @end itemize  @c foo
417 % Note that the argument cannot contain the TeX $, as its catcode is
418 % changed to \other when Texinfo source is read.
419 \def\argremovespace#1 $#2\ArgTerm{\finishparsearg#1$\ArgTerm}
420
421 % If a _delimited_ argument is enclosed in braces, they get stripped; so
422 % to get _exactly_ the rest of the line, we had to prevent such situation.
423 % We prepended an \empty token at the very beginning and we expand it
424 % just before passing the control to \next.
425 % (But first, we have to spend the remaining $ or two.)
426 \def\finishparsearg#1$#2\ArgTerm{\expandafter\next\expandafter{#1}}
427
428 % \defparsearg\foo{...}
429 %       is roughly equivalent to
430 % \def\foo{\parsearg\Xfoo}
431 % \def\Xfoo#1{...}
432 %
433 % Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my
434 % favourite TeX trick.  --kasal, 16nov03
435
436 \def\defparsearg#1{%
437   \expandafter \dodefparsearg \csname\string#1\endcsname #1%
438 }
439 \def\dodefparsearg#1#2{%
440   \def#2{\parsearg#1}%
441   \def#1##1%
442 }
443
444 % Several utility definitions with active space:
445 {
446   \obeyspaces
447   \gdef\obeyedspace{ }
448
449   % Make each space character in the input produce a normal interword
450   % space in the output.  Don't allow a line break at this space, as this
451   % is used only in environments like @example, where each line of input
452   % should produce a line of output anyway.
453   %
454   \gdef\sepspaces{\obeyspaces\let =\tie}
455
456   % If an index command is used in an @example environment, any spaces
457   % therein should become regular spaces in the raw index file, not the
458   % expansion of \tie (\leavevmode \penalty \@M \ ).
459   \gdef\unsepspaces{\let =\space}
460 }
461
462
463 \def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
464
465
466 %% These are used to keep @begin/@end levels from running away
467 %% Call \inENV within environments (after a \begingroup)
468 \newif\ifENV \ENVfalse \def\inENV{\ifENV\relax\else\ENVtrue\fi}
469 \def\ENVcheck{%
470 \ifENV\errmessage{Still within an environment; press RETURN to continue}
471 \endgroup\fi} % This is not perfect, but it should reduce lossage
472
473 % @end foo executes the definition of \Efoo.
474 %
475 \defparsearg\end{%
476   \expandafter\ifx\csname E#1\endcsname\relax
477     \badenderror{#1}%
478   \else
479     % Everything's ok; the right environment has been started.
480     \csname E#1\endcsname
481   \fi
482 }
483
484 \def\badenderror#1{%
485   \expandafter\ifx\csname#1\endcsname\relax
486     % There's no \foo, i.e., no ``environment'' foo.
487     \errhelp = \EMsimple
488     \errmessage{Undefined command `@end #1'}%
489   \else
490     \unmatchedenderror{#1}%
491   \fi
492 }
493
494 % There is an environment #1, but it hasn't been started.  Give an error.
495 %
496 \def\unmatchedenderror#1{%
497   \errhelp = \EMsimple
498   \errmessage{This `@end #1' doesn't have a matching `@#1'}%
499 }
500
501 % Define the control sequence \E#1 to give an unmatched @end error.
502 %
503 \def\defineunmatchedend#1{%
504   \expandafter\def\csname E#1\endcsname{\unmatchedenderror{#1}}%
505 }
506
507 \newhelp\EMsimple{Press RETURN to continue.}
508
509
510 %% Simple single-character @ commands
511
512 % @@ prints an @
513 % Kludge this until the fonts are right (grr).
514 \def\@{{\tt\char64}}
515
516 % This is turned off because it was never documented
517 % and you can use @w{...} around a quote to suppress ligatures.
518 %% Define @` and @' to be the same as ` and '
519 %% but suppressing ligatures.
520 %\def\`{{`}}
521 %\def\'{{'}}
522
523 % Used to generate quoted braces.
524 \def\mylbrace {{\tt\char123}}
525 \def\myrbrace {{\tt\char125}}
526 \let\{=\mylbrace
527 \let\}=\myrbrace
528 \begingroup
529   % Definitions to produce \{ and \} commands for indices,
530   % and @{ and @} for the aux file.
531   \catcode`\{ = \other \catcode`\} = \other
532   \catcode`\[ = 1 \catcode`\] = 2
533   \catcode`\! = 0 \catcode`\\ = \other
534   !gdef!lbracecmd[\{]%
535   !gdef!rbracecmd[\}]%
536   !gdef!lbraceatcmd[@{]%
537   !gdef!rbraceatcmd[@}]%
538 !endgroup
539
540 % Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
541 % Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
542 \let\, = \c
543 \let\dotaccent = \.
544 \def\ringaccent#1{{\accent23 #1}}
545 \let\tieaccent = \t
546 \let\ubaraccent = \b
547 \let\udotaccent = \d
548
549 % Other special characters: @questiondown @exclamdown
550 % Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
551 \def\questiondown{?`}
552 \def\exclamdown{!`}
553
554 % Dotless i and dotless j, used for accents.
555 \def\imacro{i}
556 \def\jmacro{j}
557 \def\dotless#1{%
558   \def\temp{#1}%
559   \ifx\temp\imacro \ptexi
560   \else\ifx\temp\jmacro \j
561   \else \errmessage{@dotless can be used only with i or j}%
562   \fi\fi
563 }
564
565 % Be sure we're in horizontal mode when doing a tie, since we make space
566 % equivalent to this in @example-like environments. Otherwise, a space
567 % at the beginning of a line will start with \penalty -- and
568 % since \penalty is valid in vertical mode, we'd end up putting the
569 % penalty on the vertical list instead of in the new paragraph.
570 {\catcode`@ = 11
571  % Avoid using \@M directly, because that causes trouble
572  % if the definition is written into an index file.
573  \global\let\tiepenalty = \@M
574  \gdef\tie{\leavevmode\penalty\tiepenalty\ }
575 }
576
577 % @: forces normal size whitespace following.
578 \def\:{\spacefactor=1000 }
579
580 % @* forces a line break.
581 \def\*{\hfil\break\hbox{}\ignorespaces}
582
583 % @/ allows a line break.
584 \let\/=\allowbreak
585
586 % @. is an end-of-sentence period.
587 \def\.{.\spacefactor=3000 }
588
589 % @! is an end-of-sentence bang.
590 \def\!{!\spacefactor=3000 }
591
592 % @? is an end-of-sentence query.
593 \def\?{?\spacefactor=3000 }
594
595 % @w prevents a word break.  Without the \leavevmode, @w at the
596 % beginning of a paragraph, when TeX is still in vertical mode, would
597 % produce a whole line of output instead of starting the paragraph.
598 \def\w#1{\leavevmode\hbox{#1}}
599
600 % @group ... @end group forces ... to be all on one page, by enclosing
601 % it in a TeX vbox.  We use \vtop instead of \vbox to construct the box
602 % to keep its height that of a normal line.  According to the rules for
603 % \topskip (p.114 of the TeXbook), the glue inserted is
604 % max (\topskip - \ht (first item), 0).  If that height is large,
605 % therefore, no glue is inserted, and the space between the headline and
606 % the text is small, which looks bad.
607 %
608 % Another complication is that the group might be very large.  This can
609 % cause the glue on the previous page to be unduly stretched, because it
610 % does not have much material.  In this case, it's better to add an
611 % explicit \vfill so that the extra space is at the bottom.  The
612 % threshold for doing this is if the group is more than \vfilllimit
613 % percent of a page (\vfilllimit can be changed inside of @tex).
614 %
615 \newbox\groupbox
616 \def\vfilllimit{0.7}
617 %
618 \def\group{\begingroup
619   \ifnum\catcode`\^^M=\active \else
620     \errhelp = \groupinvalidhelp
621     \errmessage{@group invalid in context where filling is enabled}%
622   \fi
623   \startsavinginserts
624   %
625   % The \vtop we start below produces a box with normal height and large
626   % depth; thus, TeX puts \baselineskip glue before it, and (when the
627   % next line of text is done) \lineskip glue after it.  (See p.82 of
628   % the TeXbook.)  Thus, space below is not quite equal to space
629   % above.  But it's pretty close.
630   \def\Egroup{%
631     \egroup           % End the \vtop.
632     % \dimen0 is the vertical size of the group's box.
633     \dimen0 = \ht\groupbox  \advance\dimen0 by \dp\groupbox
634     % \dimen2 is how much space is left on the page (more or less).
635     \dimen2 = \pageheight   \advance\dimen2 by -\pagetotal
636     % if the group doesn't fit on the current page, and it's a big big
637     % group, force a page break.
638     \ifdim \dimen0 > \dimen2
639       \ifdim \pagetotal < \vfilllimit\pageheight
640         \page
641       \fi
642     \fi
643     \box\groupbox
644     \checkinserts
645     \endgroup         % End the \group.
646   }%
647   %
648   \setbox\groupbox = \vtop\bgroup
649     % We have to put a strut on the last line in case the @group is in
650     % the midst of an example, rather than completely enclosing it.
651     % Otherwise, the interline space between the last line of the group
652     % and the first line afterwards is too small.  But we can't put the
653     % strut in \Egroup, since there it would be on a line by itself.
654     % Hence this just inserts a strut at the beginning of each line.
655     \everypar = {\strut}%
656     %
657     % Since we have a strut on every line, we don't need any of TeX's
658     % normal interline spacing.
659     \offinterlineskip
660     %
661     % OK, but now we have to do something about blank
662     % lines in the input in @example-like environments, which normally
663     % just turn into \lisppar, which will insert no space now that we've
664     % turned off the interline space.  Simplest is to make them be an
665     % empty paragraph.
666     \ifx\par\lisppar
667       \edef\par{\leavevmode \par}%
668       %
669       % Reset ^^M's definition to new definition of \par.
670       \obeylines
671     \fi
672     %
673     % Do @comment since we are called inside an environment such as
674     % @example, where each end-of-line in the input causes an
675     % end-of-line in the output.  We don't want the end-of-line after
676     % the `@group' to put extra space in the output.  Since @group
677     % should appear on a line by itself (according to the Texinfo
678     % manual), we don't worry about eating any user text.
679     \comment
680 }
681 %
682 % TeX puts in an \escapechar (i.e., `@') at the beginning of the help
683 % message, so this ends up printing `@group can only ...'.
684 %
685 \newhelp\groupinvalidhelp{%
686 group can only be used in environments such as @example,^^J%
687 where each line of input produces a line of output.}
688
689 % @need space-in-mils
690 % forces a page break if there is not space-in-mils remaining.
691
692 \newdimen\mil  \mil=0.001in
693
694 % Old definition--didn't work.
695 %\defparsearg\need{\par %
696 %% This method tries to make TeX break the page naturally
697 %% if the depth of the box does not fit.
698 %{\baselineskip=0pt%
699 %\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak
700 %\prevdepth=-1000pt
701 %}}
702
703 \defparsearg\need{%
704   % Ensure vertical mode, so we don't make a big box in the middle of a
705   % paragraph.
706   \par
707   %
708   % If the @need value is less than one line space, it's useless.
709   \dimen0 = #1\mil
710   \dimen2 = \ht\strutbox
711   \advance\dimen2 by \dp\strutbox
712   \ifdim\dimen0 > \dimen2
713     %
714     % Do a \strut just to make the height of this box be normal, so the
715     % normal leading is inserted relative to the preceding line.
716     % And a page break here is fine.
717     \vtop to #1\mil{\strut\vfil}%
718     %
719     % TeX does not even consider page breaks if a penalty added to the
720     % main vertical list is 10000 or more.  But in order to see if the
721     % empty box we just added fits on the page, we must make it consider
722     % page breaks.  On the other hand, we don't want to actually break the
723     % page after the empty box.  So we use a penalty of 9999.
724     %
725     % There is an extremely small chance that TeX will actually break the
726     % page at this \penalty, if there are no other feasible breakpoints in
727     % sight.  (If the user is using lots of big @group commands, which
728     % almost-but-not-quite fill up a page, TeX will have a hard time doing
729     % good page breaking, for example.)  However, I could not construct an
730     % example where a page broke at this \penalty; if it happens in a real
731     % document, then we can reconsider our strategy.
732     \penalty9999
733     %
734     % Back up by the size of the box, whether we did a page break or not.
735     \kern -#1\mil
736     %
737     % Do not allow a page break right after this kern.
738     \nobreak
739   \fi
740 }
741
742 % @br   forces paragraph break
743
744 \let\br = \par
745
746 % @dots{} output an ellipsis using the current font.
747 % We do .5em per period so that it has the same spacing in a typewriter
748 % font as three actual period characters.
749 %
750 \def\dots{%
751   \leavevmode
752   \hbox to 1.5em{%
753     \hskip 0pt plus 0.25fil minus 0.25fil
754     .\hss.\hss.%
755     \hskip 0pt plus 0.5fil minus 0.5fil
756   }%
757 }
758
759 % @enddots{} is an end-of-sentence ellipsis.
760 %
761 \def\enddots{%
762   \leavevmode
763   \hbox to 2em{%
764     \hskip 0pt plus 0.25fil minus 0.25fil
765     .\hss.\hss.\hss.%
766     \hskip 0pt plus 0.5fil minus 0.5fil
767   }%
768   \spacefactor=3000
769 }
770
771 % @page forces the start of a new page.
772 %
773 \def\page{\par\vfill\supereject}
774
775 % @exdent text....
776 % outputs text on separate line in roman font, starting at standard page margin
777
778 % This records the amount of indent in the innermost environment.
779 % That's how much \exdent should take out.
780 \newskip\exdentamount
781
782 % This defn is used inside fill environments such as @defun.
783 \defparsearg\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}
784
785 % This defn is used inside nofill environments such as @example.
786 \defparsearg\nofillexdent{{\advance \leftskip by -\exdentamount
787   \leftline{\hskip\leftskip{\rm#1}}}}
788
789 % @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
790 % paragraph.  For more general purposes, use the \margin insertion
791 % class.  WHICH is `l' or `r'.
792 %
793 \newskip\inmarginspacing \inmarginspacing=1cm
794 \def\strutdepth{\dp\strutbox}
795 %
796 \def\doinmargin#1#2{\strut\vadjust{%
797   \nobreak
798   \kern-\strutdepth
799   \vtop to \strutdepth{%
800     \baselineskip=\strutdepth
801     \vss
802     % if you have multiple lines of stuff to put here, you'll need to
803     % make the vbox yourself of the appropriate size.
804     \ifx#1l%
805       \llap{\ignorespaces #2\hskip\inmarginspacing}%
806     \else
807       \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}%
808     \fi
809     \null
810   }%
811 }}
812 \def\inleftmargin{\doinmargin l}
813 \def\inrightmargin{\doinmargin r}
814 %
815 % @inmargin{TEXT [, RIGHT-TEXT]}
816 % (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right;
817 % else use TEXT for both).
818 %
819 \def\inmargin#1{\parseinmargin #1,,\finish}
820 \def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing.
821   \setbox0 = \hbox{\ignorespaces #2}%
822   \ifdim\wd0 > 0pt
823     \def\lefttext{#1}%  have both texts
824     \def\righttext{#2}%
825   \else
826     \def\lefttext{#1}%  have only one text
827     \def\righttext{#1}%
828   \fi
829   %
830   \ifodd\pageno
831     \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin
832   \else
833     \def\temp{\inleftmargin\lefttext}%
834   \fi
835   \temp
836 }
837
838 % @include file    insert text of that file as input.
839 %
840 \def\include{\parseargusing\filenamecatcodes\includezzz}
841 \def\includezzz#1{%
842   \pushthisfilestack
843   \def\thisfile{#1}%
844   {%
845     \makevalueexpandable
846     \def\temp{\input #1 }%
847     \expandafter
848   }\temp
849   \popthisfilestack
850 }
851 \def\filenamecatcodes{%
852   \catcode`\\=\other
853   \catcode`~=\other
854   \catcode`^=\other
855   \catcode`_=\other
856   \catcode`|=\other
857   \catcode`<=\other
858   \catcode`>=\other
859   \catcode`+=\other
860   \catcode`-=\other
861 }
862
863 \def\pushthisfilestack{%
864   \expandafter\pushthisfilestackX\popthisfilestack\StackTerm
865 }
866 \def\pushthisfilestackX{%
867   \expandafter\pushthisfilestackY\thisfile\StackTerm
868 }
869 \def\pushthisfilestackY #1\StackTerm #2\StackTerm {%
870   \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}%
871 }
872
873 \def\popthisfilestack{\errthisfilestackempty}
874 \def\errthisfilestackempty{\errmessage{Internal error:
875   the stack of filenames is empty.}}
876
877 \def\thisfile{}
878
879 % @center line
880 % outputs that line, centered.
881 %
882 \defparsearg\center{%
883   \ifhmode \hfil\break \fi
884   {%
885     \advance\hsize by -\leftskip
886     \advance\hsize by -\rightskip
887     \line{\hfil \ignorespaces#1\unskip \hfil}%
888   }%
889   \ifhmode \break \fi
890 }
891
892 % @sp n   outputs n lines of vertical space
893
894 \defparsearg\sp{\vskip #1\baselineskip}
895
896 % @comment ...line which is ignored...
897 % @c is the same as @comment
898 % @ignore ... @end ignore  is another way to write a comment
899
900 \def\comment{\begingroup \catcode`\^^M=\other%
901 \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
902 \commentxxx}
903 {\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}}
904
905 \let\c=\comment
906
907 % @paragraphindent NCHARS
908 % We'll use ems for NCHARS, close enough.
909 % NCHARS can also be the word `asis' or `none'.
910 % We cannot feasibly implement @paragraphindent asis, though.
911 %
912 \def\asisword{asis} % no translation, these are keywords
913 \def\noneword{none}
914 %
915 \defparsearg\paragraphindent{%
916   \def\temp{#1}%
917   \ifx\temp\asisword
918   \else
919     \ifx\temp\noneword
920       \defaultparindent = 0pt
921     \else
922       \defaultparindent = #1em
923     \fi
924   \fi
925   \parindent = \defaultparindent
926 }
927
928 % @exampleindent NCHARS
929 % We'll use ems for NCHARS like @paragraphindent.
930 % It seems @exampleindent asis isn't necessary, but
931 % I preserve it to make it similar to @paragraphindent.
932 \defparsearg\exampleindent{%
933   \def\temp{#1}%
934   \ifx\temp\asisword
935   \else
936     \ifx\temp\noneword
937       \lispnarrowing = 0pt
938     \else
939       \lispnarrowing = #1em
940     \fi
941   \fi
942 }
943
944 % @firstparagraphindent WORD
945 % If WORD is `none', then suppress indentation of the first paragraph
946 % after a section heading.  If WORD is `insert', then do indent at such
947 % paragraphs.
948 %
949 % The paragraph indentation is suppressed or not by calling
950 % \suppressfirstparagraphindent, which the sectioning commands do.
951 % We switch the definition of this back and forth according to WORD.
952 % By default, we suppress indentation.
953 %
954 \def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent}
955 \newdimen\currentparindent
956 %
957 \def\insertword{insert}
958 %
959 \defparsearg\firstparagraphindent{%
960   \def\temp{#1}%
961   \ifx\temp\noneword
962     \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent
963   \else\ifx\temp\insertword
964     \let\suppressfirstparagraphindent = \relax
965   \else
966     \errhelp = \EMsimple
967     \errmessage{Unknown @firstparagraphindent option `\temp'}%
968   \fi\fi
969 }
970
971 % Here is how we actually suppress indentation.  Redefine \everypar to
972 % \kern backwards by \parindent, and then reset itself to empty.
973 %
974 % We also make \indent itself not actually do anything until the next
975 % paragraph.
976 %
977 \gdef\dosuppressfirstparagraphindent{%
978   \gdef\indent{%
979     \restorefirstparagraphindent
980     \indent
981   }%
982   \gdef\noindent{%
983     \restorefirstparagraphindent
984     \noindent
985   }%
986   \global\everypar = {%
987     \kern -\parindent
988     \restorefirstparagraphindent
989   }%
990 }
991
992 \gdef\restorefirstparagraphindent{%
993   \global \let \indent = \ptexindent
994   \global \let \noindent = \ptexnoindent
995   \global \everypar = {}%
996 }
997
998
999 % @asis just yields its argument.  Used with @table, for example.
1000 %
1001 \def\asis#1{#1}
1002
1003 % @math outputs its argument in math mode.
1004 %
1005 % One complication: _ usually means subscripts, but it could also mean
1006 % an actual _ character, as in @math{@var{some_variable} + 1}.  So make
1007 % _ active, and distinguish by seeing if the current family is \slfam,
1008 % which is what @var uses.
1009 {
1010   \catcode\underChar = \active
1011   \gdef\mathunderscore{%
1012     \catcode\underChar=\active
1013     \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
1014   }
1015 }
1016 % Another complication: we want \\ (and @\) to output a \ character.
1017 % FYI, plain.tex uses \\ as a temporary control sequence (why?), but
1018 % this is not advertised and we don't care.  Texinfo does not
1019 % otherwise define @\.
1020 %
1021 % The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\.
1022 \def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}
1023 %
1024 \def\math{%
1025   \tex
1026   \mathunderscore
1027   \let\\ = \mathbackslash
1028   \mathactive
1029   $\finishmath
1030 }
1031 \def\finishmath#1{#1$\Etex}
1032
1033 % Some active characters (such as <) are spaced differently in math.
1034 % We have to reset their definitions in case the @math was an argument
1035 % to a command which sets the catcodes (such as @item or @section).
1036 %
1037 {
1038   \catcode`^ = \active
1039   \catcode`< = \active
1040   \catcode`> = \active
1041   \catcode`+ = \active
1042   \gdef\mathactive{%
1043     \let^ = \ptexhat
1044     \let< = \ptexless
1045     \let> = \ptexgtr
1046     \let+ = \ptexplus
1047   }
1048 }
1049
1050 % @bullet and @minus need the same treatment as @math, just above.
1051 \def\bullet{$\ptexbullet$}
1052 \def\minus{$-$}
1053
1054 % @refill is a no-op.
1055 \let\refill=\relax
1056
1057 % If working on a large document in chapters, it is convenient to
1058 % be able to disable indexing, cross-referencing, and contents, for test runs.
1059 % This is done with @novalidate (before @setfilename).
1060 %
1061 \newif\iflinks \linkstrue % by default we want the aux files.
1062 \let\novalidate = \linksfalse
1063
1064 % @setfilename is done at the beginning of every texinfo file.
1065 % So open here the files we need to have open while reading the input.
1066 % This makes it possible to make a .fmt file for texinfo.
1067 \def\setfilename{%
1068    \iflinks
1069      \readauxfile
1070    \fi % \openindices needs to do some work in any case.
1071    \openindices
1072    \fixbackslash  % Turn off hack to swallow `\input texinfo'.
1073    \global\let\setfilename=\comment % Ignore extra @setfilename cmds.
1074    %
1075    % If texinfo.cnf is present on the system, read it.
1076    % Useful for site-wide @afourpaper, etc.
1077    % Just to be on the safe side, close the input stream before the \input.
1078    \openin 1 texinfo.cnf
1079    \ifeof1 \let\temp=\relax \else \def\temp{\input texinfo.cnf }\fi
1080    \closein1
1081    \temp
1082    %
1083    \comment % Ignore the actual filename.
1084 }
1085
1086 % Called from \setfilename.
1087 %
1088 \def\openindices{%
1089   \newindex{cp}%
1090   \newcodeindex{fn}%
1091   \newcodeindex{vr}%
1092   \newcodeindex{tp}%
1093   \newcodeindex{ky}%
1094   \newcodeindex{pg}%
1095 }
1096
1097 % @bye.
1098 \outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
1099
1100
1101 \message{pdf,}
1102 % adobe `portable' document format
1103 \newcount\tempnum
1104 \newcount\lnkcount
1105 \newtoks\filename
1106 \newcount\filenamelength
1107 \newcount\pgn
1108 \newtoks\toksA
1109 \newtoks\toksB
1110 \newtoks\toksC
1111 \newtoks\toksD
1112 \newbox\boxA
1113 \newcount\countA
1114 \newif\ifpdf
1115 \newif\ifpdfmakepagedest
1116
1117 \ifx\pdfoutput\undefined
1118   \pdffalse
1119   \let\pdfmkdest = \gobble
1120   \let\pdfurl = \gobble
1121   \let\endlink = \relax
1122   \let\linkcolor = \relax
1123   \let\pdfmakeoutlines = \relax
1124 \else
1125   \pdftrue
1126   \pdfoutput = 1
1127   \input pdfcolor
1128   \pdfcatalog{/PageMode /UseOutlines}%
1129   \def\dopdfimage#1#2#3{%
1130     \def\imagewidth{#2}%
1131     \def\imageheight{#3}%
1132     % without \immediate, pdftex seg faults when the same image is
1133     % included twice.  (Version 3.14159-pre-1.0-unofficial-20010704.)
1134     \ifnum\pdftexversion < 14
1135       \immediate\pdfimage
1136     \else
1137       \immediate\pdfximage
1138     \fi
1139       \ifx\empty\imagewidth\else width \imagewidth \fi
1140       \ifx\empty\imageheight\else height \imageheight \fi
1141       \ifnum\pdftexversion<13
1142          #1.pdf%
1143        \else
1144          {#1.pdf}%
1145        \fi
1146     \ifnum\pdftexversion < 14 \else
1147       \pdfrefximage \pdflastximage
1148     \fi}
1149   \def\pdfmkdest#1{{%
1150     % We have to set dummies so commands such as @code in a section title
1151     % aren't expanded.
1152     \atdummies
1153     \normalturnoffactive
1154     \pdfdest name{#1} xyz%
1155   }}
1156   \def\pdfmkpgn#1{#1}
1157   \let\linkcolor = \Blue  % was Cyan, but that seems light?
1158   \def\endlink{\Black\pdfendlink}
1159   % Adding outlines to PDF; macros for calculating structure of outlines
1160   % come from Petr Olsak
1161   \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
1162     \else \csname#1\endcsname \fi}
1163   \def\advancenumber#1{\tempnum=\expnumber{#1}\relax
1164     \advance\tempnum by 1
1165     \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
1166   %
1167   % #1 is the section text.  #2 is the pdf expression for the number
1168   % of subentries (or empty, for subsubsections).  #3 is the node
1169   % text, which might be empty if this toc entry had no
1170   % corresponding node.  #4 is the page number.
1171   % 
1172   \def\dopdfoutline#1#2#3#4{%
1173     % Generate a link to the node text if that exists; else, use the
1174     % page number.  We could generate a destination for the section
1175     % text in the case where a section has no node, but it doesn't
1176     % seem worthwhile, since most documents are normally structured.
1177     \def\pdfoutlinedest{#3}%
1178     \ifx\pdfoutlinedest\empty \def\pdfoutlinedest{#4}\fi
1179     %
1180     \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{#1}%
1181   }
1182   %
1183   \def\pdfmakeoutlines{%
1184     \openin 1 \jobname.toc
1185     \ifeof 1\else\begingroup
1186       \closein 1
1187       % Thanh's hack / proper braces in bookmarks
1188       \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace
1189       \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace
1190       %
1191       % Read toc silently, to get counts of subentries for \pdfoutline.
1192       \def\numchapentry##1##2##3##4{\def\thischapnum{##2}}%
1193       \def\numsecentry##1##2##3##4{%
1194         \def\thissecnum{##2}%
1195         \advancenumber{chap\thischapnum}}%
1196       \def\numsubsecentry##1##2##3##4{%
1197         \def\thissubsecnum{##2}%
1198         \advancenumber{sec\thissecnum}}%
1199       \def\numsubsubsecentry##1##2##3##4{\advancenumber{subsec\thissubsecnum}}%
1200       %
1201       % use \def rather than \let here because we redefine \chapentry et
1202       % al. a second time, below.
1203       \def\appentry{\numchapentry}%
1204       \def\appsecentry{\numsecentry}%
1205       \def\appsubsecentry{\numsubsecentry}%
1206       \def\appsubsubsecentry{\numsubsubsecentry}%
1207       \def\unnchapentry{\numchapentry}%
1208       \def\unnsecentry{\numsecentry}%
1209       \def\unnsubsecentry{\numsubsecentry}%
1210       \def\unnsubsubsecentry{\numsubsubsecentry}%
1211       \input \jobname.toc
1212       %
1213       % Read toc second time, this time actually producing the outlines.
1214       % The `-' means take the \expnumber as the absolute number of
1215       % subentries, which we calculated on our first read of the .toc above.
1216       % 
1217       % We use the node names as the destinations.
1218       \def\numchapentry##1##2##3##4{%
1219         \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}%
1220       \def\numsecentry##1##2##3##4{%
1221         \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}%
1222       \def\numsubsecentry##1##2##3##4{%
1223         \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}%
1224       \def\numsubsubsecentry##1##2##3##4{% count is always zero
1225         \dopdfoutline{##1}{}{##3}{##4}}%
1226       %
1227       % Make special characters normal for writing to the pdf file.
1228       \indexnofonts
1229       \turnoffactive
1230       \input \jobname.toc
1231     \endgroup\fi
1232   }
1233   %
1234   \def\makelinks #1,{%
1235     \def\params{#1}\def\E{END}%
1236     \ifx\params\E
1237       \let\nextmakelinks=\relax
1238     \else
1239       \let\nextmakelinks=\makelinks
1240       \ifnum\lnkcount>0,\fi
1241       \picknum{#1}%
1242       \startlink attr{/Border [0 0 0]}
1243         goto name{\pdfmkpgn{\the\pgn}}%
1244       \linkcolor #1%
1245       \advance\lnkcount by 1%
1246       \endlink
1247     \fi
1248     \nextmakelinks
1249   }
1250   \def\picknum#1{\expandafter\pn#1}
1251   \def\pn#1{%
1252     \def\p{#1}%
1253     \ifx\p\lbrace
1254       \let\nextpn=\ppn
1255     \else
1256       \let\nextpn=\ppnn
1257       \def\first{#1}
1258     \fi
1259     \nextpn
1260   }
1261   \def\ppn#1{\pgn=#1\gobble}
1262   \def\ppnn{\pgn=\first}
1263   \def\pdfmklnk#1{\lnkcount=0\makelinks #1,END,}
1264   \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
1265   \def\skipspaces#1{\def\PP{#1}\def\D{|}%
1266     \ifx\PP\D\let\nextsp\relax
1267     \else\let\nextsp\skipspaces
1268       \ifx\p\space\else\addtokens{\filename}{\PP}%
1269         \advance\filenamelength by 1
1270       \fi
1271     \fi
1272     \nextsp}
1273   \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax}
1274   \ifnum\pdftexversion < 14
1275     \let \startlink \pdfannotlink
1276   \else
1277     \let \startlink \pdfstartlink
1278   \fi
1279   \def\pdfurl#1{%
1280     \begingroup
1281       \normalturnoffactive\def\@{@}%
1282       \makevalueexpandable
1283       \leavevmode\Red
1284       \startlink attr{/Border [0 0 0]}%
1285         user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
1286         % #1
1287     \endgroup}
1288   \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
1289   \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
1290   \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
1291   \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
1292   \def\maketoks{%
1293     \expandafter\poptoks\the\toksA|ENDTOKS|
1294     \ifx\first0\adn0
1295     \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
1296     \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
1297     \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9
1298     \else
1299       \ifnum0=\countA\else\makelink\fi
1300       \ifx\first.\let\next=\done\else
1301         \let\next=\maketoks
1302         \addtokens{\toksB}{\the\toksD}
1303         \ifx\first,\addtokens{\toksB}{\space}\fi
1304       \fi
1305     \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
1306     \next}
1307   \def\makelink{\addtokens{\toksB}%
1308     {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
1309   \def\pdflink#1{%
1310     \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}
1311     \linkcolor #1\endlink}
1312   \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
1313 \fi % \ifx\pdfoutput
1314
1315
1316 \message{fonts,}
1317 % Font-change commands.
1318
1319 % Texinfo sort of supports the sans serif font style, which plain TeX does not.
1320 % So we set up a \sf analogous to plain's \rm, etc.
1321 \newfam\sffam
1322 \def\sf{\fam=\sffam \tensf}
1323 \let\li = \sf % Sometimes we call it \li, not \sf.
1324
1325 % We don't need math for this one.
1326 \def\ttsl{\tenttsl}
1327
1328 % Default leading.
1329 \newdimen\textleading  \textleading = 13.2pt
1330
1331 % Set the baselineskip to #1, and the lineskip and strut size
1332 % correspondingly.  There is no deep meaning behind these magic numbers
1333 % used as factors; they just match (closely enough) what Knuth defined.
1334 %
1335 \def\lineskipfactor{.08333}
1336 \def\strutheightpercent{.70833}
1337 \def\strutdepthpercent {.29167}
1338 %
1339 \def\setleading#1{%
1340   \normalbaselineskip = #1\relax
1341   \normallineskip = \lineskipfactor\normalbaselineskip
1342   \normalbaselines
1343   \setbox\strutbox =\hbox{%
1344     \vrule width0pt height\strutheightpercent\baselineskip
1345                     depth \strutdepthpercent \baselineskip
1346   }%
1347 }
1348
1349 % Set the font macro #1 to the font named #2, adding on the
1350 % specified font prefix (normally `cm').
1351 % #3 is the font's design size, #4 is a scale factor
1352 \def\setfont#1#2#3#4{\font#1=\fontprefix#2#3 scaled #4}
1353
1354 % Use cm as the default font prefix.
1355 % To specify the font prefix, you must define \fontprefix
1356 % before you read in texinfo.tex.
1357 \ifx\fontprefix\undefined
1358 \def\fontprefix{cm}
1359 \fi
1360 % Support font families that don't use the same naming scheme as CM.
1361 \def\rmshape{r}
1362 \def\rmbshape{bx}               %where the normal face is bold
1363 \def\bfshape{b}
1364 \def\bxshape{bx}
1365 \def\ttshape{tt}
1366 \def\ttbshape{tt}
1367 \def\ttslshape{sltt}
1368 \def\itshape{ti}
1369 \def\itbshape{bxti}
1370 \def\slshape{sl}
1371 \def\slbshape{bxsl}
1372 \def\sfshape{ss}
1373 \def\sfbshape{ss}
1374 \def\scshape{csc}
1375 \def\scbshape{csc}
1376
1377 \newcount\mainmagstep
1378 \ifx\bigger\relax
1379   % not really supported.
1380   \mainmagstep=\magstep1
1381   \setfont\textrm\rmshape{12}{1000}
1382   \setfont\texttt\ttshape{12}{1000}
1383 \else
1384   \mainmagstep=\magstephalf
1385   \setfont\textrm\rmshape{10}{\mainmagstep}
1386   \setfont\texttt\ttshape{10}{\mainmagstep}
1387 \fi
1388 \setfont\textbf\bfshape{10}{\mainmagstep}
1389 \setfont\textit\itshape{10}{\mainmagstep}
1390 \setfont\textsl\slshape{10}{\mainmagstep}
1391 \setfont\textsf\sfshape{10}{\mainmagstep}
1392 \setfont\textsc\scshape{10}{\mainmagstep}
1393 \setfont\textttsl\ttslshape{10}{\mainmagstep}
1394 \font\texti=cmmi10 scaled \mainmagstep
1395 \font\textsy=cmsy10 scaled \mainmagstep
1396
1397 % A few fonts for @defun names and args.
1398 \setfont\defbf\bfshape{10}{\magstep1}
1399 \setfont\deftt\ttshape{10}{\magstep1}
1400 \setfont\defttsl\ttslshape{10}{\magstep1}
1401 \def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf}
1402
1403 % Fonts for indices, footnotes, small examples (9pt).
1404 \setfont\smallrm\rmshape{9}{1000}
1405 \setfont\smalltt\ttshape{9}{1000}
1406 \setfont\smallbf\bfshape{10}{900}
1407 \setfont\smallit\itshape{9}{1000}
1408 \setfont\smallsl\slshape{9}{1000}
1409 \setfont\smallsf\sfshape{9}{1000}
1410 \setfont\smallsc\scshape{10}{900}
1411 \setfont\smallttsl\ttslshape{10}{900}
1412 \font\smalli=cmmi9
1413 \font\smallsy=cmsy9
1414
1415 % Fonts for small examples (8pt).
1416 \setfont\smallerrm\rmshape{8}{1000}
1417 \setfont\smallertt\ttshape{8}{1000}
1418 \setfont\smallerbf\bfshape{10}{800}
1419 \setfont\smallerit\itshape{8}{1000}
1420 \setfont\smallersl\slshape{8}{1000}
1421 \setfont\smallersf\sfshape{8}{1000}
1422 \setfont\smallersc\scshape{10}{800}
1423 \setfont\smallerttsl\ttslshape{10}{800}
1424 \font\smalleri=cmmi8
1425 \font\smallersy=cmsy8
1426
1427 % Fonts for title page:
1428 \setfont\titlerm\rmbshape{12}{\magstep3}
1429 \setfont\titleit\itbshape{10}{\magstep4}
1430 \setfont\titlesl\slbshape{10}{\magstep4}
1431 \setfont\titlett\ttbshape{12}{\magstep3}
1432 \setfont\titlettsl\ttslshape{10}{\magstep4}
1433 \setfont\titlesf\sfbshape{17}{\magstep1}
1434 \let\titlebf=\titlerm
1435 \setfont\titlesc\scbshape{10}{\magstep4}
1436 \font\titlei=cmmi12 scaled \magstep3
1437 \font\titlesy=cmsy10 scaled \magstep4
1438 \def\authorrm{\secrm}
1439 \def\authortt{\sectt}
1440
1441 % Chapter (and unnumbered) fonts (17.28pt).
1442 \setfont\chaprm\rmbshape{12}{\magstep2}
1443 \setfont\chapit\itbshape{10}{\magstep3}
1444 \setfont\chapsl\slbshape{10}{\magstep3}
1445 \setfont\chaptt\ttbshape{12}{\magstep2}
1446 \setfont\chapttsl\ttslshape{10}{\magstep3}
1447 \setfont\chapsf\sfbshape{17}{1000}
1448 \let\chapbf=\chaprm
1449 \setfont\chapsc\scbshape{10}{\magstep3}
1450 \font\chapi=cmmi12 scaled \magstep2
1451 \font\chapsy=cmsy10 scaled \magstep3
1452
1453 % Section fonts (14.4pt).
1454 \setfont\secrm\rmbshape{12}{\magstep1}
1455 \setfont\secit\itbshape{10}{\magstep2}
1456 \setfont\secsl\slbshape{10}{\magstep2}
1457 \setfont\sectt\ttbshape{12}{\magstep1}
1458 \setfont\secttsl\ttslshape{10}{\magstep2}
1459 \setfont\secsf\sfbshape{12}{\magstep1}
1460 \let\secbf\secrm
1461 \setfont\secsc\scbshape{10}{\magstep2}
1462 \font\seci=cmmi12 scaled \magstep1
1463 \font\secsy=cmsy10 scaled \magstep2
1464
1465 % Subsection fonts (13.15pt).
1466 \setfont\ssecrm\rmbshape{12}{\magstephalf}
1467 \setfont\ssecit\itbshape{10}{1315}
1468 \setfont\ssecsl\slbshape{10}{1315}
1469 \setfont\ssectt\ttbshape{12}{\magstephalf}
1470 \setfont\ssecttsl\ttslshape{10}{1315}
1471 \setfont\ssecsf\sfbshape{12}{\magstephalf}
1472 \let\ssecbf\ssecrm
1473 \setfont\ssecsc\scbshape{10}{\magstep1}
1474 \font\sseci=cmmi12 scaled \magstephalf
1475 \font\ssecsy=cmsy10 scaled 1315
1476 % The smallcaps and symbol fonts should actually be scaled \magstep1.5,
1477 % but that is not a standard magnification.
1478
1479 % In order for the font changes to affect most math symbols and letters,
1480 % we have to define the \textfont of the standard families.  Since
1481 % texinfo doesn't allow for producing subscripts and superscripts except
1482 % in the main text, we don't bother to reset \scriptfont and
1483 % \scriptscriptfont (which would also require loading a lot more fonts).
1484 %
1485 \def\resetmathfonts{%
1486   \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy
1487   \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf
1488   \textfont\ttfam=\tentt \textfont\sffam=\tensf
1489 }
1490
1491 % The font-changing commands redefine the meanings of \tenSTYLE, instead
1492 % of just \STYLE.  We do this so that font changes will continue to work
1493 % in math mode, where it is the current \fam that is relevant in most
1494 % cases, not the current font.  Plain TeX does \def\bf{\fam=\bffam
1495 % \tenbf}, for example.  By redefining \tenbf, we obviate the need to
1496 % redefine \bf itself.
1497 \def\textfonts{%
1498   \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
1499   \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
1500   \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy \let\tenttsl=\textttsl
1501   \resetmathfonts \setleading{\textleading}}
1502 \def\titlefonts{%
1503   \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl
1504   \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc
1505   \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy
1506   \let\tenttsl=\titlettsl
1507   \resetmathfonts \setleading{25pt}}
1508 \def\titlefont#1{{\titlefonts\rm #1}}
1509 \def\chapfonts{%
1510   \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
1511   \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
1512   \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl
1513   \resetmathfonts \setleading{19pt}}
1514 \def\secfonts{%
1515   \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
1516   \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
1517   \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy \let\tenttsl=\secttsl
1518   \resetmathfonts \setleading{16pt}}
1519 \def\subsecfonts{%
1520   \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
1521   \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
1522   \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl
1523   \resetmathfonts \setleading{15pt}}
1524 \let\subsubsecfonts = \subsecfonts % Maybe make sssec fonts scaled magstephalf?
1525 \def\smallfonts{%
1526   \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl
1527   \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc
1528   \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy
1529   \let\tenttsl=\smallttsl
1530   \resetmathfonts \setleading{10.5pt}}
1531 \def\smallerfonts{%
1532   \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl
1533   \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc
1534   \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy
1535   \let\tenttsl=\smallerttsl
1536   \resetmathfonts \setleading{9.5pt}}
1537
1538 % Set the fonts to use with the @small... environments.
1539 \let\smallexamplefonts = \smallfonts
1540
1541 % About \smallexamplefonts.  If we use \smallfonts (9pt), @smallexample
1542 % can fit this many characters:
1543 %   8.5x11=86   smallbook=72  a4=90  a5=69
1544 % If we use \smallerfonts (8pt), then we can fit this many characters:
1545 %   8.5x11=90+  smallbook=80  a4=90+  a5=77
1546 % For me, subjectively, the few extra characters that fit aren't worth
1547 % the additional smallness of 8pt.  So I'm making the default 9pt.
1548 %
1549 % By the way, for comparison, here's what fits with @example (10pt):
1550 %   8.5x11=71  smallbook=60  a4=75  a5=58
1551 %
1552 % I wish we used A4 paper on this side of the Atlantic.
1553 %
1554 % --karl, 24jan03.
1555
1556
1557 % Set up the default fonts, so we can use them for creating boxes.
1558 %
1559 \textfonts
1560
1561 % Define these so they can be easily changed for other fonts.
1562 \def\angleleft{$\langle$}
1563 \def\angleright{$\rangle$}
1564
1565 % Count depth in font-changes, for error checks
1566 \newcount\fontdepth \fontdepth=0
1567
1568 % Fonts for short table of contents.
1569 \setfont\shortcontrm\rmshape{12}{1000}
1570 \setfont\shortcontbf\bfshape{10}{\magstep1}  % no cmb12
1571 \setfont\shortcontsl\slshape{12}{1000}
1572 \setfont\shortconttt\ttshape{12}{1000}
1573
1574 %% Add scribe-like font environments, plus @l for inline lisp (usually sans
1575 %% serif) and @ii for TeX italic
1576
1577 % \smartitalic{ARG} outputs arg in italics, followed by an italic correction
1578 % unless the following character is such as not to need one.
1579 \def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else
1580                     \ptexslash\fi\fi\fi}
1581 \def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx}
1582 \def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx}
1583
1584 % like \smartslanted except unconditionally uses \ttsl.
1585 % @var is set to this for defun arguments.
1586 \def\ttslanted#1{{\ttsl #1}\futurelet\next\smartitalicx}
1587
1588 % like \smartslanted except unconditionally use \sl.  We never want
1589 % ttsl for book titles, do we?
1590 \def\cite#1{{\sl #1}\futurelet\next\smartitalicx}
1591
1592 \let\i=\smartitalic
1593 \let\var=\smartslanted
1594 \let\dfn=\smartslanted
1595 \let\emph=\smartitalic
1596
1597 \def\b#1{{\bf #1}}
1598 \let\strong=\b
1599
1600 % We can't just use \exhyphenpenalty, because that only has effect at
1601 % the end of a paragraph.  Restore normal hyphenation at the end of the
1602 % group within which \nohyphenation is presumably called.
1603 %
1604 \def\nohyphenation{\hyphenchar\font = -1  \aftergroup\restorehyphenation}
1605 \def\restorehyphenation{\hyphenchar\font = `- }
1606
1607 % Set sfcode to normal for the chars that usually have another value.
1608 % Can't use plain's \frenchspacing because it uses the `\x notation, and
1609 % sometimes \x has an active definition that messes things up.
1610 %
1611 \catcode`@=11
1612   \def\frenchspacing{%
1613     \sfcode\dotChar  =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m
1614     \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m
1615   }
1616 \catcode`@=\other
1617
1618 \def\t#1{%
1619   {\tt \rawbackslash \frenchspacing #1}%
1620   \null
1621 }
1622 \let\ttfont=\t
1623 \def\samp#1{`\tclose{#1}'\null}
1624 \setfont\keyrm\rmshape{8}{1000}
1625 \font\keysy=cmsy9
1626 \def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{%
1627   \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{%
1628     \vbox{\hrule\kern-0.4pt
1629      \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}%
1630     \kern-0.4pt\hrule}%
1631   \kern-.06em\raise0.4pt\hbox{\angleright}}}}
1632 % The old definition, with no lozenge:
1633 %\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null}
1634 \def\ctrl #1{{\tt \rawbackslash \hat}#1}
1635
1636 % @file, @option are the same as @samp.
1637 \let\file=\samp
1638 \let\option=\samp
1639
1640 % @code is a modification of @t,
1641 % which makes spaces the same size as normal in the surrounding text.
1642 \def\tclose#1{%
1643   {%
1644     % Change normal interword space to be same as for the current font.
1645     \spaceskip = \fontdimen2\font
1646     %
1647     % Switch to typewriter.
1648     \tt
1649     %
1650     % But `\ ' produces the large typewriter interword space.
1651     \def\ {{\spaceskip = 0pt{} }}%
1652     %
1653     % Turn off hyphenation.
1654     \nohyphenation
1655     %
1656     \rawbackslash
1657     \frenchspacing
1658     #1%
1659   }%
1660   \null
1661 }
1662
1663 % We *must* turn on hyphenation at `-' and `_' in \code.
1664 % Otherwise, it is too hard to avoid overfull hboxes
1665 % in the Emacs manual, the Library manual, etc.
1666
1667 % Unfortunately, TeX uses one parameter (\hyphenchar) to control
1668 % both hyphenation at - and hyphenation within words.
1669 % We must therefore turn them both off (\tclose does that)
1670 % and arrange explicitly to hyphenate at a dash.
1671 %  -- rms.
1672 {
1673   \catcode`\-=\active
1674   \catcode`\_=\active
1675   %
1676   \global\def\code{\begingroup
1677     \catcode`\-=\active \let-\codedash
1678     \catcode`\_=\active \let_\codeunder
1679     \codex
1680   }
1681 }
1682
1683 \def\realdash{-}
1684 \def\codedash{-\discretionary{}{}{}}
1685 \def\codeunder{%
1686   % this is all so @math{@code{var_name}+1} can work.  In math mode, _
1687   % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.)
1688   % will therefore expand the active definition of _, which is us
1689   % (inside @code that is), therefore an endless loop.
1690   \ifusingtt{\ifmmode
1691                \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_.
1692              \else\normalunderscore \fi
1693              \discretionary{}{}{}}%
1694             {\_}%
1695 }
1696 \def\codex #1{\tclose{#1}\endgroup}
1697
1698 % @kbd is like @code, except that if the argument is just one @key command,
1699 % then @kbd has no effect.
1700
1701 % @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
1702 %   `example' (@kbd uses ttsl only inside of @example and friends),
1703 %   or `code' (@kbd uses normal tty font always).
1704 \defparsearg\kbdinputstyle{%
1705   \def\arg{#1}%
1706   \ifx\arg\worddistinct
1707     \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
1708   \else\ifx\arg\wordexample
1709     \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%
1710   \else\ifx\arg\wordcode
1711     \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
1712   \else
1713     \errhelp = \EMsimple
1714     \errmessage{Unknown @kbdinputstyle option `\arg'}%
1715   \fi\fi\fi
1716 }
1717 \def\worddistinct{distinct}
1718 \def\wordexample{example}
1719 \def\wordcode{code}
1720
1721 % Default is `distinct.'
1722 \kbdinputstyle distinct
1723
1724 \def\xkey{\key}
1725 \def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
1726 \ifx\one\xkey\ifx\threex\three \key{#2}%
1727 \else{\tclose{\kbdfont\look}}\fi
1728 \else{\tclose{\kbdfont\look}}\fi}
1729
1730 % For @url, @env, @command quotes seem unnecessary, so use \code.
1731 \let\url=\code
1732 \let\env=\code
1733 \let\command=\code
1734
1735 % @uref (abbreviation for `urlref') takes an optional (comma-separated)
1736 % second argument specifying the text to display and an optional third
1737 % arg as text to display instead of (rather than in addition to) the url
1738 % itself.  First (mandatory) arg is the url.  Perhaps eventually put in
1739 % a hypertex \special here.
1740 %
1741 \def\uref#1{\douref #1,,,\finish}
1742 \def\douref#1,#2,#3,#4\finish{\begingroup
1743   \unsepspaces
1744   \pdfurl{#1}%
1745   \setbox0 = \hbox{\ignorespaces #3}%
1746   \ifdim\wd0 > 0pt
1747     \unhbox0 % third arg given, show only that
1748   \else
1749     \setbox0 = \hbox{\ignorespaces #2}%
1750     \ifdim\wd0 > 0pt
1751       \ifpdf
1752         \unhbox0             % PDF: 2nd arg given, show only it
1753       \else
1754         \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url
1755       \fi
1756     \else
1757       \code{#1}% only url given, so show it
1758     \fi
1759   \fi
1760   \endlink
1761 \endgroup}
1762
1763 % rms does not like angle brackets --karl, 17may97.
1764 % So now @email is just like @uref, unless we are pdf.
1765 %
1766 %\def\email#1{\angleleft{\tt #1}\angleright}
1767 \ifpdf
1768   \def\email#1{\doemail#1,,\finish}
1769   \def\doemail#1,#2,#3\finish{\begingroup
1770     \unsepspaces
1771     \pdfurl{mailto:#1}%
1772     \setbox0 = \hbox{\ignorespaces #2}%
1773     \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi
1774     \endlink
1775   \endgroup}
1776 \else
1777   \let\email=\uref
1778 \fi
1779
1780 % Check if we are currently using a typewriter font.  Since all the
1781 % Computer Modern typewriter fonts have zero interword stretch (and
1782 % shrink), and it is reasonable to expect all typewriter fonts to have
1783 % this property, we can check that font parameter.
1784 %
1785 \def\ifmonospace{\ifdim\fontdimen3\font=0pt }
1786
1787 % Typeset a dimension, e.g., `in' or `pt'.  The only reason for the
1788 % argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
1789 %
1790 \def\dmn#1{\thinspace #1}
1791
1792 \def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par}
1793
1794 % @l was never documented to mean ``switch to the Lisp font'',
1795 % and it is not used as such in any manual I can find.  We need it for
1796 % Polish suppressed-l.  --karl, 22sep96.
1797 %\def\l#1{{\li #1}\null}
1798
1799 % Explicit font changes: @r, @sc, undocumented @ii.
1800 \def\r#1{{\rm #1}}              % roman font
1801 \def\sc#1{{\smallcaps#1}}       % smallcaps font
1802 \def\ii#1{{\it #1}}             % italic font
1803
1804 % @acronym downcases the argument and prints in smallcaps.
1805 % It would be nicer to go one point size down.
1806 \def\acronym#1{{\smallcaps \lowercase{#1}}}
1807
1808 % @pounds{} is a sterling sign.
1809 \def\pounds{{\it\$}}
1810
1811 % @registeredsymbol - R in a circle.  For now, only works in text size;
1812 % we'd have to redo the font mechanism to change the \scriptstyle and
1813 % \scriptscriptstyle font sizes to make it look right in headings.
1814 % Adapted from the plain.tex definition of \copyright.
1815 %
1816 \def\registeredsymbol{%
1817   $^{{\ooalign{\hfil\raise.07ex\hbox{$\scriptstyle\rm R$}\hfil\crcr\Orb}}%
1818     }$%
1819 }
1820
1821
1822 \message{page headings,}
1823
1824 \newskip\titlepagetopglue \titlepagetopglue = 1.5in
1825 \newskip\titlepagebottomglue \titlepagebottomglue = 2pc
1826
1827 % First the title page.  Must do @settitle before @titlepage.
1828 \newif\ifseenauthor
1829 \newif\iffinishedtitlepage
1830
1831 % Do an implicit @contents or @shortcontents after @end titlepage if the
1832 % user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage.
1833 %
1834 \newif\ifsetcontentsaftertitlepage
1835  \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue
1836 \newif\ifsetshortcontentsaftertitlepage
1837  \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue
1838
1839 \defparsearg\shorttitlepage{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%
1840         \endgroup\page\hbox{}\page}
1841
1842 \def\titlepage{%
1843   \begingroup \parindent=0pt \textfonts
1844   % Leave some space at the very top of the page.
1845   \vglue\titlepagetopglue
1846   % No rule at page bottom unless we print one at the top with @title.
1847   \finishedtitlepagetrue
1848   %
1849   % Most title ``pages'' are actually two pages long, with space
1850   % at the top of the second.  We don't want the ragged left on the second.
1851   \let\oldpage = \page
1852   \def\page{%
1853     \iffinishedtitlepage\else
1854        \finishtitlepage
1855     \fi
1856     \let\page = \oldpage
1857     \page
1858     \null
1859   }%
1860 }
1861
1862 \def\Etitlepage{%
1863    \iffinishedtitlepage\else
1864       \finishtitlepage
1865    \fi
1866    % It is important to do the page break before ending the group,
1867    % because the headline and footline are only empty inside the group.
1868    % If we use the new definition of \page, we always get a blank page
1869    % after the title page, which we certainly don't want.
1870    \oldpage
1871    \endgroup
1872    %
1873    % Need this before the \...aftertitlepage checks so that if they are
1874    % in effect the toc pages will come out with page numbers.
1875    \HEADINGSon
1876    %
1877    % If they want short, they certainly want long too.
1878    \ifsetshortcontentsaftertitlepage
1879      \shortcontents
1880      \contents
1881      \global\let\shortcontents = \relax
1882      \global\let\contents = \relax
1883    \fi
1884    %
1885    \ifsetcontentsaftertitlepage
1886      \contents
1887      \global\let\contents = \relax
1888      \global\let\shortcontents = \relax
1889    \fi
1890 }
1891
1892 \def\finishtitlepage{%
1893    \vskip4pt \hrule height 2pt width \hsize
1894    \vskip\titlepagebottomglue
1895    \finishedtitlepagetrue
1896 }
1897
1898 %%% Macros to be used within @titlepage:
1899
1900 \let\subtitlerm=\tenrm
1901 \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}
1902
1903 \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines
1904                 \let\tt=\authortt}
1905
1906 \defparsearg\title{\leftline{\titlefonts\rm #1}
1907                 % print a rule at the page bottom also.
1908                 \finishedtitlepagefalse
1909                 \vskip4pt \hrule height 4pt width \hsize \vskip4pt}
1910
1911 \defparsearg\subtitle{{\subtitlefont \rightline{#1}}}
1912
1913 % @author should come last, but may come many times.
1914 \defparsearg\author{\ifseenauthor\else\vskip 0pt plus 1filll\seenauthortrue\fi
1915   {\authorfont \leftline{#1}}}
1916
1917
1918 %%% Set up page headings and footings.
1919
1920 \let\thispage=\folio
1921
1922 \newtoks\evenheadline    % headline on even pages
1923 \newtoks\oddheadline     % headline on odd pages
1924 \newtoks\evenfootline    % footline on even pages
1925 \newtoks\oddfootline     % footline on odd pages
1926
1927 % Now make TeX use those variables
1928 \headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
1929                             \else \the\evenheadline \fi}}
1930 \footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
1931                             \else \the\evenfootline \fi}\HEADINGShook}
1932 \let\HEADINGShook=\relax
1933
1934 % Commands to set those variables.
1935 % For example, this is what  @headings on  does
1936 % @evenheading @thistitle|@thispage|@thischapter
1937 % @oddheading @thischapter|@thispage|@thistitle
1938 % @evenfooting @thisfile||
1939 % @oddfooting ||@thisfile
1940
1941
1942 \def\evenheading{\parsearg\evenheadingxxx}
1943 \def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish}
1944 \def\evenheadingyyy #1\|#2\|#3\|#4\finish{%
1945 \global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
1946
1947 \def\oddheading{\parsearg\oddheadingxxx}
1948 \def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish}
1949 \def\oddheadingyyy #1\|#2\|#3\|#4\finish{%
1950 \global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
1951
1952 \defparsearg\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
1953
1954 \def\evenfooting{\parsearg\evenfootingxxx}
1955 \def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish}
1956 \def\evenfootingyyy #1\|#2\|#3\|#4\finish{%
1957 \global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
1958
1959 \def\oddfooting{\parsearg\oddfootingxxx}
1960 \def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish}
1961 \def\oddfootingyyy #1\|#2\|#3\|#4\finish{%
1962   \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
1963   %
1964   % Leave some space for the footline.  Hopefully ok to assume
1965   % @evenfooting will not be used by itself.
1966   \global\advance\pageheight by -\baselineskip
1967   \global\advance\vsize by -\baselineskip
1968 }
1969
1970 \defparsearg\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}}
1971
1972
1973 % @headings double      turns headings on for double-sided printing.
1974 % @headings single      turns headings on for single-sided printing.
1975 % @headings off         turns them off.
1976 % @headings on          same as @headings double, retained for compatibility.
1977 % @headings after       turns on double-sided headings after this page.
1978 % @headings doubleafter turns on double-sided headings after this page.
1979 % @headings singleafter turns on single-sided headings after this page.
1980 % By default, they are off at the start of a document,
1981 % and turned `on' after @end titlepage.
1982
1983 \def\headings #1 {\csname HEADINGS#1\endcsname}
1984
1985 \def\HEADINGSoff{%
1986 \global\evenheadline={\hfil} \global\evenfootline={\hfil}
1987 \global\oddheadline={\hfil} \global\oddfootline={\hfil}}
1988 \HEADINGSoff
1989 % When we turn headings on, set the page number to 1.
1990 % For double-sided printing, put current file name in lower left corner,
1991 % chapter name on inside top of right hand pages, document
1992 % title on inside top of left hand pages, and page numbers on outside top
1993 % edge of all pages.
1994 \def\HEADINGSdouble{%
1995 \global\pageno=1
1996 \global\evenfootline={\hfil}
1997 \global\oddfootline={\hfil}
1998 \global\evenheadline={\line{\folio\hfil\thistitle}}
1999 \global\oddheadline={\line{\thischapter\hfil\folio}}
2000 \global\let\contentsalignmacro = \chapoddpage
2001 }
2002 \let\contentsalignmacro = \chappager
2003
2004 % For single-sided printing, chapter title goes across top left of page,
2005 % page number on top right.
2006 \def\HEADINGSsingle{%
2007 \global\pageno=1
2008 \global\evenfootline={\hfil}
2009 \global\oddfootline={\hfil}
2010 \global\evenheadline={\line{\thischapter\hfil\folio}}
2011 \global\oddheadline={\line{\thischapter\hfil\folio}}
2012 \global\let\contentsalignmacro = \chappager
2013 }
2014 \def\HEADINGSon{\HEADINGSdouble}
2015
2016 \def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
2017 \let\HEADINGSdoubleafter=\HEADINGSafter
2018 \def\HEADINGSdoublex{%
2019 \global\evenfootline={\hfil}
2020 \global\oddfootline={\hfil}
2021 \global\evenheadline={\line{\folio\hfil\thistitle}}
2022 \global\oddheadline={\line{\thischapter\hfil\folio}}
2023 \global\let\contentsalignmacro = \chapoddpage
2024 }
2025
2026 \def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
2027 \def\HEADINGSsinglex{%
2028 \global\evenfootline={\hfil}
2029 \global\oddfootline={\hfil}
2030 \global\evenheadline={\line{\thischapter\hfil\folio}}
2031 \global\oddheadline={\line{\thischapter\hfil\folio}}
2032 \global\let\contentsalignmacro = \chappager
2033 }
2034
2035 % Subroutines used in generating headings
2036 % This produces Day Month Year style of output.
2037 % Only define if not already defined, in case a txi-??.tex file has set
2038 % up a different format (e.g., txi-cs.tex does this).
2039 \ifx\today\undefined
2040 \def\today{%
2041   \number\day\space
2042   \ifcase\month
2043   \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
2044   \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
2045   \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
2046   \fi
2047   \space\number\year}
2048 \fi
2049
2050 % @settitle line...  specifies the title of the document, for headings.
2051 % It generates no output of its own.
2052 \def\thistitle{\putwordNoTitle}
2053 \def\settitle{\parsearg{\gdef\thistitle}}
2054
2055
2056 \message{tables,}
2057 % Tables -- @table, @ftable, @vtable, @item(x).
2058
2059 % default indentation of table text
2060 \newdimen\tableindent \tableindent=.8in
2061 % default indentation of @itemize and @enumerate text
2062 \newdimen\itemindent  \itemindent=.3in
2063 % margin between end of table item and start of table text.
2064 \newdimen\itemmargin  \itemmargin=.1in
2065
2066 % used internally for \itemindent minus \itemmargin
2067 \newdimen\itemmax
2068
2069 % Note @table, @ftable, and @vtable define @item, @itemx, etc., with
2070 % these defs.
2071 % They also define \itemindex
2072 % to index the item name in whatever manner is desired (perhaps none).
2073
2074 \newif\ifitemxneedsnegativevskip
2075
2076 \def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi}
2077
2078 \def\internalBitem{\smallbreak \parsearg\itemzzz}
2079 \def\internalBitemx{\itemxpar \parsearg\itemzzz}
2080
2081 \def\itemzzz #1{\begingroup %
2082   \advance\hsize by -\rightskip
2083   \advance\hsize by -\tableindent
2084   \setbox0=\hbox{\itemindicate{#1}}%
2085   \itemindex{#1}%
2086   \nobreak % This prevents a break before @itemx.
2087   %
2088   % If the item text does not fit in the space we have, put it on a line
2089   % by itself, and do not allow a page break either before or after that
2090   % line.  We do not start a paragraph here because then if the next
2091   % command is, e.g., @kindex, the whatsit would get put into the
2092   % horizontal list on a line by itself, resulting in extra blank space.
2093   \ifdim \wd0>\itemmax
2094     %
2095     % Make this a paragraph so we get the \parskip glue and wrapping,
2096     % but leave it ragged-right.
2097     \begingroup
2098       \advance\leftskip by-\tableindent
2099       \advance\hsize by\tableindent
2100       \advance\rightskip by0pt plus1fil
2101       \leavevmode\unhbox0\par
2102     \endgroup
2103     %
2104     % We're going to be starting a paragraph, but we don't want the
2105     % \parskip glue -- logically it's part of the @item we just started.
2106     \nobreak \vskip-\parskip
2107     %
2108     % Stop a page break at the \parskip glue coming up.  (Unfortunately
2109     % we can't prevent a possible page break at the following
2110     % \baselineskip glue.)  However, if what follows is an environment
2111     % such as @example, there will be no \parskip glue; then
2112     % the negative vskip we just would cause the example and the item to
2113     % crash together.  So we use this bizarre value of 10001 as a signal
2114     % to \aboveenvbreak to insert \parskip glue after all.
2115     % (Possibly there are other commands that could be followed by
2116     % @example which need the same treatment, but not section titles; or
2117     % maybe section titles are the only special case and they should be
2118     % penalty 10001...)
2119     \penalty 10001
2120     \endgroup
2121     \itemxneedsnegativevskipfalse
2122   \else
2123     % The item text fits into the space.  Start a paragraph, so that the
2124     % following text (if any) will end up on the same line.
2125     \noindent
2126     % Do this with kerns and \unhbox so that if there is a footnote in
2127     % the item text, it can migrate to the main vertical list and
2128     % eventually be printed.
2129     \nobreak\kern-\tableindent
2130     \dimen0 = \itemmax  \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0
2131     \unhbox0
2132     \nobreak\kern\dimen0
2133     \endgroup
2134     \itemxneedsnegativevskiptrue
2135   \fi
2136 }
2137
2138 \def\item{\errmessage{@item while not in a list environment}}
2139 \def\itemx{\errmessage{@itemx while not in a list environment}}
2140
2141 % @table, @ftable, @vtable.
2142 \def\table{%
2143   \begingroup\inENV
2144   \let\itemindex\gobble
2145   \tablex
2146 }
2147 \def\ftable{%
2148   \begingroup\inENV
2149   \def\itemindex ##1{\doind {fn}{\code{##1}}}%
2150   \tablex
2151 }
2152 \def\vtable{%
2153   \begingroup\inENV
2154   \def\itemindex ##1{\doind {vr}{\code{##1}}}%
2155   \tablex
2156 }
2157 \def\tablex#1{%
2158   \def\itemindicate{#1}%
2159   \parsearg\tabley
2160 }
2161 \def\tabley#1{%
2162   {%
2163     \makevalueexpandable
2164     \edef\temp{\noexpand\tablez #1\space\space\space}%
2165     \expandafter
2166   }\temp \endtablez
2167 }
2168 \def\tablez #1 #2 #3 #4\endtablez{%
2169   \aboveenvbreak
2170   \ifnum 0#1>0 \advance \leftskip by #1\mil \fi
2171   \ifnum 0#2>0 \tableindent=#2\mil \fi
2172   \ifnum 0#3>0 \advance \rightskip by #3\mil \fi
2173   \itemmax=\tableindent
2174   \advance \itemmax by -\itemmargin
2175   \advance \leftskip by \tableindent
2176   \exdentamount=\tableindent
2177   \parindent = 0pt
2178   \parskip = \smallskipamount
2179   \ifdim \parskip=0pt \parskip=2pt \fi
2180   \let\item = \internalBitem
2181   \let\itemx = \internalBitemx
2182 }
2183 \def\Etable{\endgraf\afterenvbreak\endgroup}
2184 \let\Eftable\Etable
2185 \let\Evtable\Etable
2186
2187 % This is the counter used by @enumerate, which is really @itemize
2188
2189 \newcount \itemno
2190
2191 \defparsearg\itemize{%
2192   \begingroup % ended by the @end itemize
2193   \itemizey {#1}{\Eitemize}
2194 }
2195
2196 \def\itemizey#1#2{%
2197   \aboveenvbreak
2198   \itemmax=\itemindent
2199   \advance\itemmax by -\itemmargin
2200   \advance\leftskip by \itemindent
2201   \exdentamount=\itemindent
2202   \parindent=0pt
2203   \parskip=\smallskipamount
2204   \ifdim\parskip=0pt \parskip=2pt \fi
2205   \def#2{\endgraf\afterenvbreak\endgroup}%
2206   \def\itemcontents{#1}%
2207   % @itemize with no arg is equivalent to @itemize @bullet.
2208   \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi
2209   \let\item=\itemizeitem
2210 }
2211
2212 % \splitoff TOKENS\endmark defines \first to be the first token in
2213 % TOKENS, and \rest to be the remainder.
2214 %
2215 \def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}%
2216
2217 % Allow an optional argument of an uppercase letter, lowercase letter,
2218 % or number, to specify the first label in the enumerated list.  No
2219 % argument is the same as `1'.
2220 %
2221 \defparsearg\enumerate{\enumeratey #1  \endenumeratey}
2222 \def\enumeratey #1 #2\endenumeratey{%
2223   \begingroup % ended by the @end enumerate
2224   %
2225   % If we were given no argument, pretend we were given `1'.
2226   \def\thearg{#1}%
2227   \ifx\thearg\empty \def\thearg{1}\fi
2228   %
2229   % Detect if the argument is a single token.  If so, it might be a
2230   % letter.  Otherwise, the only valid thing it can be is a number.
2231   % (We will always have one token, because of the test we just made.
2232   % This is a good thing, since \splitoff doesn't work given nothing at
2233   % all -- the first parameter is undelimited.)
2234   \expandafter\splitoff\thearg\endmark
2235   \ifx\rest\empty
2236     % Only one token in the argument.  It could still be anything.
2237     % A ``lowercase letter'' is one whose \lccode is nonzero.
2238     % An ``uppercase letter'' is one whose \lccode is both nonzero, and
2239     %   not equal to itself.
2240     % Otherwise, we assume it's a number.
2241     %
2242     % We need the \relax at the end of the \ifnum lines to stop TeX from
2243     % continuing to look for a <number>.
2244     %
2245     \ifnum\lccode\expandafter`\thearg=0\relax
2246       \numericenumerate % a number (we hope)
2247     \else
2248       % It's a letter.
2249       \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax
2250         \lowercaseenumerate % lowercase letter
2251       \else
2252         \uppercaseenumerate % uppercase letter
2253       \fi
2254     \fi
2255   \else
2256     % Multiple tokens in the argument.  We hope it's a number.
2257     \numericenumerate
2258   \fi
2259 }
2260
2261 % An @enumerate whose labels are integers.  The starting integer is
2262 % given in \thearg.
2263 %
2264 \def\numericenumerate{%
2265   \itemno = \thearg
2266   \startenumeration{\the\itemno}%
2267 }
2268
2269 % The starting (lowercase) letter is in \thearg.
2270 \def\lowercaseenumerate{%
2271   \itemno = \expandafter`\thearg
2272   \startenumeration{%
2273     % Be sure we're not beyond the end of the alphabet.
2274     \ifnum\itemno=0
2275       \errmessage{No more lowercase letters in @enumerate; get a bigger
2276                   alphabet}%
2277     \fi
2278     \char\lccode\itemno
2279   }%
2280 }
2281
2282 % The starting (uppercase) letter is in \thearg.
2283 \def\uppercaseenumerate{%
2284   \itemno = \expandafter`\thearg
2285   \startenumeration{%
2286     % Be sure we're not beyond the end of the alphabet.
2287     \ifnum\itemno=0
2288       \errmessage{No more uppercase letters in @enumerate; get a bigger
2289                   alphabet}
2290     \fi
2291     \char\uccode\itemno
2292   }%
2293 }
2294
2295 % Call itemizey, adding a period to the first argument and supplying the
2296 % common last two arguments.  Also subtract one from the initial value in
2297 % \itemno, since @item increments \itemno.
2298 %
2299 \def\startenumeration#1{%
2300   \advance\itemno by -1
2301   \itemizey{#1.}\Eenumerate\flushcr
2302 }
2303
2304 % @alphaenumerate and @capsenumerate are abbreviations for giving an arg
2305 % to @enumerate.
2306 %
2307 \def\alphaenumerate{\enumerate{a}}
2308 \def\capsenumerate{\enumerate{A}}
2309 \def\Ealphaenumerate{\Eenumerate}
2310 \def\Ecapsenumerate{\Eenumerate}
2311
2312 % Definition of @item while inside @itemize.
2313
2314 \def\itemizeitem{%
2315 \advance\itemno by 1
2316 {\let\par=\endgraf \smallbreak}%
2317 \ifhmode \errmessage{In hmode at itemizeitem}\fi
2318 {\parskip=0in \hskip 0pt
2319 \hbox to 0pt{\hss \itemcontents\hskip \itemmargin}%
2320 \vadjust{\penalty 1200}}%
2321 \flushcr}
2322
2323 % @multitable macros
2324 % Amy Hendrickson, 8/18/94, 3/6/96
2325 %
2326 % @multitable ... @end multitable will make as many columns as desired.
2327 % Contents of each column will wrap at width given in preamble.  Width
2328 % can be specified either with sample text given in a template line,
2329 % or in percent of \hsize, the current width of text on page.
2330
2331 % Table can continue over pages but will only break between lines.
2332
2333 % To make preamble:
2334 %
2335 % Either define widths of columns in terms of percent of \hsize:
2336 %   @multitable @columnfractions .25 .3 .45
2337 %   @item ...
2338 %
2339 %   Numbers following @columnfractions are the percent of the total
2340 %   current hsize to be used for each column. You may use as many
2341 %   columns as desired.
2342
2343
2344 % Or use a template:
2345 %   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
2346 %   @item ...
2347 %   using the widest term desired in each column.
2348
2349 % Each new table line starts with @item, each subsequent new column
2350 % starts with @tab. Empty columns may be produced by supplying @tab's
2351 % with nothing between them for as many times as empty columns are needed,
2352 % ie, @tab@tab@tab will produce two empty columns.
2353
2354 % @item, @tab do not need to be on their own lines, but it will not hurt
2355 % if they are.
2356
2357 % Sample multitable:
2358
2359 %   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
2360 %   @item first col stuff @tab second col stuff @tab third col
2361 %   @item
2362 %   first col stuff
2363 %   @tab
2364 %   second col stuff
2365 %   @tab
2366 %   third col
2367 %   @item first col stuff @tab second col stuff
2368 %   @tab Many paragraphs of text may be used in any column.
2369 %
2370 %         They will wrap at the width determined by the template.
2371 %   @item@tab@tab This will be in third column.
2372 %   @end multitable
2373
2374 % Default dimensions may be reset by user.
2375 % @multitableparskip is vertical space between paragraphs in table.
2376 % @multitableparindent is paragraph indent in table.
2377 % @multitablecolmargin is horizontal space to be left between columns.
2378 % @multitablelinespace is space to leave between table items, baseline
2379 %                                                            to baseline.
2380 %   0pt means it depends on current normal line spacing.
2381 %
2382 \newskip\multitableparskip
2383 \newskip\multitableparindent
2384 \newdimen\multitablecolspace
2385 \newskip\multitablelinespace
2386 \multitableparskip=0pt
2387 \multitableparindent=6pt
2388 \multitablecolspace=12pt
2389 \multitablelinespace=0pt
2390
2391 % Macros used to set up halign preamble:
2392 %
2393 \let\endsetuptable\relax
2394 \def\xendsetuptable{\endsetuptable}
2395 \let\columnfractions\relax
2396 \def\xcolumnfractions{\columnfractions}
2397 \newif\ifsetpercent
2398
2399 % #1 is the part of the @columnfraction before the decimal point, which
2400 % is presumably either 0 or the empty string (but we don't check, we
2401 % just throw it away).  #2 is the decimal part, which we use as the
2402 % percent of \hsize for this column.
2403 \def\pickupwholefraction#1.#2 {%
2404   \global\advance\colcount by 1
2405   \expandafter\xdef\csname col\the\colcount\endcsname{.#2\hsize}%
2406   \setuptable
2407 }
2408
2409 \newcount\colcount
2410 \def\setuptable#1{%
2411   \def\firstarg{#1}%
2412   \ifx\firstarg\xendsetuptable
2413     \let\go = \relax
2414   \else
2415     \ifx\firstarg\xcolumnfractions
2416       \global\setpercenttrue
2417     \else
2418       \ifsetpercent
2419          \let\go\pickupwholefraction
2420       \else
2421          \global\advance\colcount by 1
2422          \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a
2423                    % separator; typically that is always in the input, anyway.
2424          \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
2425       \fi
2426     \fi
2427     \ifx\go\pickupwholefraction
2428       % Put the argument back for the \pickupwholefraction call, so
2429       % we'll always have a period there to be parsed.
2430       \def\go{\pickupwholefraction#1}%
2431     \else
2432       \let\go = \setuptable
2433     \fi%
2434   \fi
2435   \go
2436 }
2437
2438 % multitable-only commands.
2439 \def\headitem{\errmessage{@headitem outside of @multitable}}
2440 \def\tab{\errmessage{@tab outside of @multitable}}
2441
2442 % @multitable ... @end multitable definitions:
2443 %
2444 \newtoks\everytab  % insert after every tab.
2445 %
2446 \defparsearg\multitable{\bgroup
2447   \vskip\parskip
2448   \startsavinginserts
2449   %
2450   % @headitem starts a heading row, which we typeset in bold.
2451   % Assignments have to be global since we are inside the implicit group
2452   % of an alignment entry.
2453   \def\headitem{\crcrwithinserts \global\everytab={\bf}\the\everytab}%
2454   %
2455   % @item within a multitable starts a normal row, get rid of any bold.
2456   \def\item{\crcrwithinserts \global\everytab={}}%
2457   %
2458   % A \tab used to include \hskip1sp.  But then the space in a template
2459   % line is not enough.  That is bad.  So let's go back to just & until
2460   % we encounter the problem it was intended to solve again.  --karl,
2461   % nathan@acm.org, 20apr99.
2462   \def\tab{&\the\everytab}%
2463   %
2464   \tolerance=9500
2465   \hbadness=9500
2466   \setmultitablespacing
2467   \parskip=\multitableparskip
2468   \parindent=\multitableparindent
2469   \overfullrule=0pt
2470   \global\colcount=0
2471   %
2472   \def\Emultitable{%
2473     \global\setpercentfalse
2474     \crcrwithinserts
2475     \egroup\egroup
2476   }%
2477   %
2478   % To parse everything between @multitable and @item:
2479   \setuptable#1 \endsetuptable
2480   %
2481   % \everycr will reset column counter, \colcount, at the end of
2482   % each line. Every column entry will cause \colcount to advance by one.
2483   % The table preamble
2484   % looks at the current \colcount to find the correct column width.
2485   \everycr{\noalign{%
2486   %
2487   % \filbreak%% keeps underfull box messages off when table breaks over pages.
2488   % Maybe so, but it also creates really weird page breaks when the table
2489   % breaks over pages. Wouldn't \vfil be better?  Wait until the problem
2490   % manifests itself, so it can be fixed for real --karl.
2491     \global\colcount=0\relax}}%
2492   %
2493   % This preamble sets up a generic column definition, which will
2494   % be used as many times as user calls for columns.
2495   % \vtop will set a single line and will also let text wrap and
2496   % continue for many paragraphs if desired.
2497   \halign\bgroup&\global\advance\colcount by 1\relax
2498     \multistrut\vtop{\hsize=\expandafter\csname col\the\colcount\endcsname
2499   %
2500   % In order to keep entries from bumping into each other
2501   % we will add a \leftskip of \multitablecolspace to all columns after
2502   % the first one.
2503   %
2504   % If a template has been used, we will add \multitablecolspace
2505   % to the width of each template entry.
2506   %
2507   % If the user has set preamble in terms of percent of \hsize we will
2508   % use that dimension as the width of the column, and the \leftskip
2509   % will keep entries from bumping into each other.  Table will start at
2510   % left margin and final column will justify at right margin.
2511   %
2512   % Make sure we don't inherit \rightskip from the outer environment.
2513   \rightskip=0pt
2514   \ifnum\colcount=1
2515     % The first column will be indented with the surrounding text.
2516     \advance\hsize by\leftskip
2517   \else
2518     \ifsetpercent \else
2519       % If user has not set preamble in terms of percent of \hsize
2520       % we will advance \hsize by \multitablecolspace.
2521       \advance\hsize by \multitablecolspace
2522     \fi
2523    % In either case we will make \leftskip=\multitablecolspace:
2524   \leftskip=\multitablecolspace
2525   \fi
2526   % Ignoring space at the beginning and end avoids an occasional spurious
2527   % blank line, when TeX decides to break the line at the space before the
2528   % box from the multistrut, so the strut ends up on a line by itself.
2529   % For example:
2530   % @multitable @columnfractions .11 .89
2531   % @item @code{#}
2532   % @tab Legal holiday which is valid in major parts of the whole country.
2533   % Is automatically provided with highlighting sequences respectively marking
2534   % characters.
2535   \noindent\ignorespaces##\unskip\multistrut}\cr
2536 }
2537 \def\crcrwithinserts{\crcr\noalign{\checkinserts}}
2538
2539 \def\setmultitablespacing{% test to see if user has set \multitablelinespace.
2540 % If so, do nothing. If not, give it an appropriate dimension based on
2541 % current baselineskip.
2542 \ifdim\multitablelinespace=0pt
2543 \setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
2544 \global\advance\multitablelinespace by-\ht0
2545 %% strut to put in table in case some entry doesn't have descenders,
2546 %% to keep lines equally spaced
2547 \let\multistrut = \strut
2548 \else
2549 %% FIXME: what is \box0 supposed to be?
2550 \gdef\multistrut{\vrule height\multitablelinespace depth\dp0
2551 width0pt\relax} \fi
2552 %% Test to see if parskip is larger than space between lines of
2553 %% table. If not, do nothing.
2554 %%        If so, set to same dimension as multitablelinespace.
2555 \ifdim\multitableparskip>\multitablelinespace
2556 \global\multitableparskip=\multitablelinespace
2557 \global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
2558                                       %% than skip between lines in the table.
2559 \fi%
2560 \ifdim\multitableparskip=0pt
2561 \global\multitableparskip=\multitablelinespace
2562 \global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
2563                                       %% than skip between lines in the table.
2564 \fi}
2565
2566
2567 \message{conditionals,}
2568 % Prevent errors for section commands.
2569 % Used in @ignore and in failing conditionals.
2570 \def\ignoresections{%
2571   \let\appendix=\relax
2572   \let\appendixsec=\relax
2573   \let\appendixsection=\relax
2574   \let\appendixsubsec=\relax
2575   \let\appendixsubsection=\relax
2576   \let\appendixsubsubsec=\relax
2577   \let\appendixsubsubsection=\relax
2578   %\let\begin=\relax
2579   %\let\bye=\relax
2580   \let\centerchap=\relax
2581   \let\chapter=\relax
2582   \let\contents=\relax
2583   \let\section=\relax
2584   \let\smallbook=\relax
2585   \let\subsec=\relax
2586   \let\subsection=\relax
2587   \let\subsubsec=\relax
2588   \let\subsubsection=\relax
2589   \let\titlepage=\relax
2590   \let\top=\relax
2591   \let\unnumbered=\relax
2592   \let\unnumberedsec=\relax
2593   \let\unnumberedsection=\relax
2594   \let\unnumberedsubsec=\relax
2595   \let\unnumberedsubsection=\relax
2596   \let\unnumberedsubsubsec=\relax
2597   \let\unnumberedsubsubsection=\relax
2598 }
2599
2600 % Ignore @ignore, @ifhtml, @ifinfo, and the like.
2601 %
2602 \def\direntry{\doignore{direntry}}
2603 \def\documentdescriptionword{documentdescription}
2604 \def\documentdescription{\doignore{documentdescription}}
2605 \def\docbook{\doignore{docbook}}
2606 \def\html{\doignore{html}}
2607 \def\ifdocbook{\doignore{ifdocbook}}
2608 \def\ifhtml{\doignore{ifhtml}}
2609 \def\ifinfo{\doignore{ifinfo}}
2610 \def\ifnottex{\doignore{ifnottex}}
2611 \def\ifplaintext{\doignore{ifplaintext}}
2612 \def\ifxml{\doignore{ifxml}}
2613 \def\ignore{\doignore{ignore}}
2614 \def\menu{\doignore{menu}}
2615 \def\xml{\doignore{xml}}
2616
2617 % @dircategory CATEGORY  -- specify a category of the dir file
2618 % which this file should belong to.  Ignore this in TeX.
2619 \let\dircategory = \comment
2620
2621 % Ignore text until a line `@end #1', keeping track of nested conditionals.
2622 %
2623 % A count to remember the depth of nesting.
2624 \newcount\doignorecount
2625
2626 \def\doignore#1{\begingroup
2627   % Scan in ``verbatim'' mode:
2628   \catcode`\@ = \other
2629   \catcode`\{ = \other
2630   \catcode`\} = \other
2631   %
2632   % Make sure that spaces turn into tokens that match what \doignoretext wants.
2633   \catcode\spaceChar = 10
2634   %
2635   % Count number of #1's that we've seen.
2636   \doignorecount = 0
2637   %
2638   % Swallow text until we reach the matching `@end #1'.
2639   \dodoignore {#1}%
2640 }
2641
2642 { \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source.
2643   \obeylines %
2644   %
2645   \gdef\dodoignore#1{%
2646     % #1 contains the string `ifinfo'.
2647     %
2648     % Define a command to find the next `@end #1', which must be on a line
2649     % by itself.
2650     \long\def\doignoretext##1^^M@end #1{\doignoretextyyy##1^^M@#1\_STOP_}%
2651     % And this command to find another #1 command, at the beginning of a
2652     % line.  (Otherwise, we would consider a line `@c @ifset', for
2653     % example, to count as an @ifset for nesting.)
2654     \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}%
2655     %
2656     % And now expand that command.
2657     \obeylines %
2658     \doignoretext ^^M%
2659   }%
2660 }
2661
2662 \def\doignoreyyy#1{%
2663   \def\temp{#1}%
2664   \ifx\temp\empty                       % Nothing found.
2665     \let\next\doignoretextzzz
2666   \else                                 % Found a nested condition, ...
2667     \advance\doignorecount by 1
2668     \let\next\doignoretextyyy           % ..., look for another.
2669     % If we're here, #1 ends with ^^M\ifinfo (for example).
2670   \fi
2671   \next #1% the token \_STOP_ is present just after this macro.
2672 }
2673
2674 % We have to swallow the remaining "\_STOP_".
2675
2676 \def\doignoretextzzz#1{%
2677   \ifnum\doignorecount = 0      % We have just found the outermost @end.
2678     \let\next\enddoignore
2679   \else                         % Still inside a nested condition.
2680     \advance\doignorecount by -1
2681     \let\next\doignoretext      % Look for the next @end.
2682   \fi
2683   \next
2684 }
2685
2686 % Finish off ignored text.
2687 \def\enddoignore{\endgroup\ignorespaces}
2688
2689
2690 % @set VAR sets the variable VAR to an empty value.
2691 % @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
2692 %
2693 % Since we want to separate VAR from REST-OF-LINE (which might be
2694 % empty), we can't just use \parsearg; we have to insert a space of our
2695 % own to delimit the rest of the line, and then take it out again if we
2696 % didn't need it.
2697 % We rely on the fact that \parsearg sets \catcode`\ =10.
2698 %
2699 \def\set{\parseargusing{\catcode`\-=\other \catcode`\_=\other}\setxxx}
2700 \def\setxxx#1{\setyyy#1 \endsetyyy}
2701 \def\setyyy#1 #2\endsetyyy{%
2702   \def\temp{#2}%
2703   \edef\next{\gdef\makecsname{SET#1}}%
2704   \ifx\temp\empty
2705     \next{}%
2706   \else
2707     \setzzz#2\endsetzzz
2708   \fi
2709 }
2710 % Remove the trailing space \setxxx inserted.
2711 \def\setzzz#1 \endsetzzz{\next{#1}}
2712
2713 % @clear VAR clears (i.e., unsets) the variable VAR.
2714 %
2715 \defparsearg\clear{\global\expandafter\let\csname SET#1\endcsname=\relax}
2716
2717 % @value{foo} gets the text saved in variable foo.
2718 \def\value{\begingroup\makevalueexpandable\valuexxx}
2719 \def\valuexxx#1{\expandablevalue{#1}\endgroup}
2720 {
2721   \catcode`\- = \active \catcode`\_ = \active
2722   %
2723   \gdef\makevalueexpandable{%
2724     \let\value = \expandablevalue
2725     % We don't want these characters active, ...
2726     \catcode`\-=\other \catcode`\_=\other
2727     % ..., but we might end up with active ones in the argument if
2728     % we're called from @code, as @code{@value{foo-bar_}}, though.
2729     % So \let them to their normal equivalents.
2730     \let-\realdash \let_\normalunderscore
2731   }
2732 }
2733
2734 % We have this subroutine so that we can handle at least some @value's
2735 % properly in indexes (we call \makevalueexpandable in \indexdummies).
2736 % The command has to be fully expandable (if the variable is set), since
2737 % the result winds up in the index file.  This means that if the
2738 % variable's value contains other Texinfo commands, it's almost certain
2739 % it will fail (although perhaps we could fix that with sufficient work
2740 % to do a one-level expansion on the result, instead of complete).
2741 %
2742 \def\expandablevalue#1{%
2743   \expandafter\ifx\csname SET#1\endcsname\relax
2744     {[No value for ``#1'']}%
2745     \message{Variable `#1', used in @value, is not set.}%
2746   \else
2747     \csname SET#1\endcsname
2748   \fi
2749 }
2750
2751 % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
2752 % with @set.
2753 %
2754 \defparsearg\ifset{%
2755   \expandafter\ifx\csname SET#1\endcsname\relax
2756     \let\next=\ifsetfail
2757   \else
2758     \let\next=\ifsetsucceed
2759   \fi
2760   \next
2761 }
2762 \def\ifsetsucceed{\conditionalsucceed{ifset}}
2763 \def\ifsetfail{\doignore{ifset}}
2764 \defineunmatchedend{ifset}
2765
2766 % @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been
2767 % defined with @set, or has been undefined with @clear.
2768 %
2769 \defparsearg\ifclear{%
2770   \expandafter\ifx\csname SET#1\endcsname\relax
2771     \let\next=\ifclearsucceed
2772   \else
2773     \let\next=\ifclearfail
2774   \fi
2775   \next
2776 }
2777 \def\ifclearsucceed{\conditionalsucceed{ifclear}}
2778 \def\ifclearfail{\doignore{ifclear}}
2779 \defineunmatchedend{ifclear}
2780
2781 % @iftex, @ifnothtml, @ifnotinfo, @ifnotplaintext always succeed; we
2782 % read the text following, through the first @end iftex (etc.).  Make
2783 % `@end iftex' (etc.) valid only after an @iftex.
2784 %
2785 \def\iftex{\conditionalsucceed{iftex}}
2786 \def\ifnothtml{\conditionalsucceed{ifnothtml}}
2787 \def\ifnotinfo{\conditionalsucceed{ifnotinfo}}
2788 \def\ifnotplaintext{\conditionalsucceed{ifnotplaintext}}
2789 \defineunmatchedend{iftex}
2790 \defineunmatchedend{ifnothtml}
2791 \defineunmatchedend{ifnotinfo}
2792 \defineunmatchedend{ifnotplaintext}
2793
2794 % True conditional.  Since \set globally defines its variables, we can
2795 % just start and end a group (to keep the @end definition undefined at
2796 % the outer level).
2797 %
2798 \def\conditionalsucceed#1{\begingroup
2799   \expandafter\def\csname E#1\endcsname{\endgroup}%
2800 }
2801
2802 % @defininfoenclose.
2803 \let\definfoenclose=\comment
2804
2805
2806 \message{indexing,}
2807 % Index generation facilities
2808
2809 % Define \newwrite to be identical to plain tex's \newwrite
2810 % except not \outer, so it can be used within \newindex.
2811 {\catcode`\@=11
2812 \gdef\newwrite{\alloc@7\write\chardef\sixt@@n}}
2813
2814 % \newindex {foo} defines an index named foo.
2815 % It automatically defines \fooindex such that
2816 % \fooindex ...rest of line... puts an entry in the index foo.
2817 % It also defines \fooindfile to be the number of the output channel for
2818 % the file that accumulates this index.  The file's extension is foo.
2819 % The name of an index should be no more than 2 characters long
2820 % for the sake of vms.
2821 %
2822 \def\newindex#1{%
2823   \iflinks
2824     \expandafter\newwrite \csname#1indfile\endcsname
2825     \openout \csname#1indfile\endcsname \jobname.#1 % Open the file
2826   \fi
2827   \expandafter\xdef\csname#1index\endcsname{%     % Define @#1index
2828     \noexpand\doindex{#1}}
2829 }
2830
2831 % @defindex foo  ==  \newindex{foo}
2832 %
2833 \def\defindex{\parsearg\newindex}
2834
2835 % Define @defcodeindex, like @defindex except put all entries in @code.
2836 %
2837 \def\defcodeindex{\parsearg\newcodeindex}
2838 %
2839 \def\newcodeindex#1{%
2840   \iflinks
2841     \expandafter\newwrite \csname#1indfile\endcsname
2842     \openout \csname#1indfile\endcsname \jobname.#1
2843   \fi
2844   \expandafter\xdef\csname#1index\endcsname{%
2845     \noexpand\docodeindex{#1}}%
2846 }
2847
2848
2849 % @synindex foo bar    makes index foo feed into index bar.
2850 % Do this instead of @defindex foo if you don't want it as a separate index.
2851 %
2852 % @syncodeindex foo bar   similar, but put all entries made for index foo
2853 % inside @code.
2854 %
2855 \def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}}
2856 \def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}}
2857
2858 % #1 is \doindex or \docodeindex, #2 the index getting redefined (foo),
2859 % #3 the target index (bar).
2860 \def\dosynindex#1#2#3{%
2861   % Only do \closeout if we haven't already done it, else we'll end up
2862   % closing the target index.
2863   \expandafter \ifx\csname donesynindex#2\endcsname \undefined
2864     % The \closeout helps reduce unnecessary open files; the limit on the
2865     % Acorn RISC OS is a mere 16 files.
2866     \expandafter\closeout\csname#2indfile\endcsname
2867     \expandafter\let\csname\donesynindex#2\endcsname = 1
2868   \fi
2869   % redefine \fooindfile:
2870   \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname
2871   \expandafter\let\csname#2indfile\endcsname=\temp
2872   % redefine \fooindex:
2873   \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}%
2874 }
2875
2876 % Define \doindex, the driver for all \fooindex macros.
2877 % Argument #1 is generated by the calling \fooindex macro,
2878 %  and it is "foo", the name of the index.
2879
2880 % \doindex just uses \parsearg; it calls \doind for the actual work.
2881 % This is because \doind is more useful to call from other macros.
2882
2883 % There is also \dosubind {index}{topic}{subtopic}
2884 % which makes an entry in a two-level index such as the operation index.
2885
2886 \def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer}
2887 \def\singleindexer #1{\doind{\indexname}{#1}}
2888
2889 % like the previous two, but they put @code around the argument.
2890 \def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}
2891 \def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
2892
2893 % Take care of Texinfo commands that can appear in an index entry.
2894 % Since there are some commands we want to expand, and others we don't,
2895 % we have to laboriously prevent expansion for those that we don't.
2896 %
2897 \def\indexdummies{%
2898   \def\@{@}% change to @@ when we switch to @ as escape char in index files.
2899   \def\ {\realbackslash\space }%
2900   % Need these in case \tex is in effect and \{ is a \delimiter again.
2901   % But can't use \lbracecmd and \rbracecmd because texindex assumes
2902   % braces and backslashes are used only as delimiters.
2903   \let\{ = \mylbrace
2904   \let\} = \myrbrace
2905   %
2906   % \definedummyword defines \#1 as \realbackslash #1\space, thus
2907   % effectively preventing its expansion.  This is used only for control
2908   % words, not control letters, because the \space would be incorrect
2909   % for control characters, but is needed to separate the control word
2910   % from whatever follows.
2911   %
2912   % For control letters, we have \definedummyletter, which omits the
2913   % space.
2914   %
2915   % These can be used both for control words that take an argument and
2916   % those that do not.  If it is followed by {arg} in the input, then
2917   % that will dutifully get written to the index (or wherever).
2918   %
2919   \def\definedummyword##1{%
2920     \expandafter\def\csname ##1\endcsname{\realbackslash ##1\space}%
2921   }%
2922   \def\definedummyletter##1{%
2923     \expandafter\def\csname ##1\endcsname{\realbackslash ##1}%
2924   }%
2925   %
2926   % Do the redefinitions.
2927   \commondummies
2928 }
2929
2930 % For the aux file, @ is the escape character.  So we want to redefine
2931 % everything using @ instead of \realbackslash.  When everything uses
2932 % @, this will be simpler.
2933 %
2934 \def\atdummies{%
2935   \def\@{@@}%
2936   \def\ {@ }%
2937   \let\{ = \lbraceatcmd
2938   \let\} = \rbraceatcmd
2939   %
2940   % (See comments in \indexdummies.)
2941   \def\definedummyword##1{%
2942     \expandafter\def\csname ##1\endcsname{@##1\space}%
2943   }%
2944   \def\definedummyletter##1{%
2945     \expandafter\def\csname ##1\endcsname{@##1}%
2946   }%
2947   %
2948   % Do the redefinitions.
2949   \commondummies
2950 }
2951
2952 % Called from \indexdummies and \atdummies.  \definedummyword and
2953 % \definedummyletter must be defined first.
2954 %
2955 \def\commondummies{%
2956   %
2957   \normalturnoffactive
2958   %
2959   % Control letters and accents.
2960   \definedummyletter{_}%
2961   \definedummyletter{,}%
2962   \definedummyletter{"}%
2963   \definedummyletter{`}%
2964   \definedummyletter{'}%
2965   \definedummyletter{^}%
2966   \definedummyletter{~}%
2967   \definedummyletter{=}%
2968   \definedummyword{u}%
2969   \definedummyword{v}%
2970   \definedummyword{H}%
2971   \definedummyword{dotaccent}%
2972   \definedummyword{ringaccent}%
2973   \definedummyword{tieaccent}%
2974   \definedummyword{ubaraccent}%
2975   \definedummyword{udotaccent}%
2976   \definedummyword{dotless}%
2977   %
2978   % Other non-English letters.
2979   \definedummyword{AA}%
2980   \definedummyword{AE}%
2981   \definedummyword{L}%
2982   \definedummyword{OE}%
2983   \definedummyword{O}%
2984   \definedummyword{aa}%
2985   \definedummyword{ae}%
2986   \definedummyword{l}%
2987   \definedummyword{oe}%
2988   \definedummyword{o}%
2989   \definedummyword{ss}%
2990   %
2991   % Although these internal commands shouldn't show up, sometimes they do.
2992   \definedummyword{bf}%
2993   \definedummyword{gtr}%
2994   \definedummyword{hat}%
2995   \definedummyword{less}%
2996   \definedummyword{sf}%
2997   \definedummyword{sl}%
2998   \definedummyword{tclose}%
2999   \definedummyword{tt}%
3000   %
3001   % Texinfo font commands.
3002   \definedummyword{b}%
3003   \definedummyword{i}%
3004   \definedummyword{r}%
3005   \definedummyword{sc}%
3006   \definedummyword{t}%
3007   %
3008   \definedummyword{TeX}%
3009   \definedummyword{acronym}%
3010   \definedummyword{cite}%
3011   \definedummyword{code}%
3012   \definedummyword{command}%
3013   \definedummyword{dfn}%
3014   \definedummyword{dots}%
3015   \definedummyword{emph}%
3016   \definedummyword{env}%
3017   \definedummyword{file}%
3018   \definedummyword{kbd}%
3019   \definedummyword{key}%
3020   \definedummyword{math}%
3021   \definedummyword{option}%
3022   \definedummyword{samp}%
3023   \definedummyword{strong}%
3024   \definedummyword{uref}%
3025   \definedummyword{url}%
3026   \definedummyword{var}%
3027   \definedummyword{verb}%
3028   \definedummyword{w}%
3029   %
3030   % Assorted special characters.
3031   \definedummyword{bullet}%
3032   \definedummyword{copyright}%
3033   \definedummyword{registeredsymbol}%
3034   \definedummyword{dots}%
3035   \definedummyword{enddots}%
3036   \definedummyword{equiv}%
3037   \definedummyword{error}%
3038   \definedummyword{expansion}%
3039   \definedummyword{minus}%
3040   \definedummyword{pounds}%
3041   \definedummyword{point}%
3042   \definedummyword{print}%
3043   \definedummyword{result}%
3044   %
3045   % Handle some cases of @value -- where it does not contain any
3046   % (non-fully-expandable) commands.
3047   \makevalueexpandable
3048   %
3049   % Normal spaces, not active ones.
3050   \unsepspaces
3051   %
3052   % No macro expansion.
3053   \turnoffmacros
3054 }
3055
3056
3057 % \indexnofonts is used when outputting the strings to sort the index
3058 % by, and when constructing control sequence names.  It eliminates all
3059 % control sequences and just writes whatever the best ASCII sort string
3060 % would be for a given command (usually its argument).
3061 %
3062 \def\indexdummytex{TeX}
3063 \def\indexdummydots{...}
3064 %
3065 \def\indexnofonts{%
3066   \def\ { }%
3067   \def\@{@}%
3068   % how to handle braces?
3069   \def\_{\normalunderscore}%
3070   %
3071   \let\,=\asis
3072   \let\"=\asis
3073   \let\`=\asis
3074   \let\'=\asis
3075   \let\^=\asis
3076   \let\~=\asis
3077   \let\==\asis
3078   \let\u=\asis
3079   \let\v=\asis
3080   \let\H=\asis
3081   \let\dotaccent=\asis
3082   \let\ringaccent=\asis
3083   \let\tieaccent=\asis
3084   \let\ubaraccent=\asis
3085   \let\udotaccent=\asis
3086   \let\dotless=\asis
3087   %
3088   % Other non-English letters.
3089   \def\AA{AA}%
3090   \def\AE{AE}%
3091   \def\L{L}%
3092   \def\OE{OE}%
3093   \def\O{O}%
3094   \def\aa{aa}%
3095   \def\ae{ae}%
3096   \def\l{l}%
3097   \def\oe{oe}%
3098   \def\o{o}%
3099   \def\ss{ss}%
3100   \def\exclamdown{!}%
3101   \def\questiondown{?}%
3102   %
3103   % Don't no-op \tt, since it isn't a user-level command
3104   % and is used in the definitions of the active chars like <, >, |, etc.
3105   % Likewise with the other plain tex font commands.
3106   %\let\tt=\asis
3107   %
3108   % Texinfo font commands.
3109   \let\b=\asis
3110   \let\i=\asis
3111   \let\r=\asis
3112   \let\sc=\asis
3113   \let\t=\asis
3114   %
3115   \let\TeX=\indexdummytex
3116   \let\acronym=\asis
3117   \let\cite=\asis
3118   \let\code=\asis
3119   \let\command=\asis
3120   \let\dfn=\asis
3121   \let\dots=\indexdummydots
3122   \let\emph=\asis
3123   \let\env=\asis
3124   \let\file=\asis
3125   \let\kbd=\asis
3126   \let\key=\asis
3127   \let\math=\asis
3128   \let\option=\asis
3129   \let\samp=\asis
3130   \let\strong=\asis
3131   \let\uref=\asis
3132   \let\url=\asis
3133   \let\var=\asis
3134   \let\verb=\asis
3135   \let\w=\asis
3136 }
3137
3138 \let\indexbackslash=0  %overridden during \printindex.
3139 \let\SETmarginindex=\relax % put index entries in margin (undocumented)?
3140
3141 % Most index entries go through here, but \dosubind is the general case.
3142 % #1 is the index name, #2 is the entry text.
3143 \def\doind#1#2{\dosubind{#1}{#2}{}}
3144
3145 % Workhorse for all \fooindexes.
3146 % #1 is name of index, #2 is stuff to put there, #3 is subentry --
3147 % empty if called from \doind, as we usually are (the main exception
3148 % is with most defuns, which call us directly).
3149 %
3150 \def\dosubind#1#2#3{%
3151   \iflinks
3152   {%
3153     % Store the main index entry text (including the third arg).
3154     \toks0 = {#2}%
3155     % If third arg is present, precede it with a space.
3156     \def\thirdarg{#3}%
3157     \ifx\thirdarg\empty \else
3158       \toks0 = \expandafter{\the\toks0 \space #3}%
3159     \fi
3160     %
3161     \edef\writeto{\csname#1indfile\endcsname}%
3162     %
3163     \ifvmode
3164       \dosubindsanitize
3165     \else
3166       \dosubindwrite
3167     \fi
3168   }%
3169   \fi
3170 }
3171
3172 % Write the entry in \toks0 to the index file:
3173 %
3174 \def\dosubindwrite{%
3175   % Put the index entry in the margin if desired.
3176   \ifx\SETmarginindex\relax\else
3177     \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}%
3178   \fi
3179   %
3180   % Remember, we are within a group.
3181   \indexdummies % Must do this here, since \bf, etc expand at this stage
3182   \escapechar=`\\
3183   \def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now
3184       % so it will be output as is; and it will print as backslash.
3185   %
3186   % Process the index entry with all font commands turned off, to
3187   % get the string to sort by.
3188   {\indexnofonts
3189    \edef\temp{\the\toks0}% need full expansion
3190    \xdef\indexsorttmp{\temp}%
3191   }%
3192   %
3193   % Set up the complete index entry, with both the sort key and
3194   % the original text, including any font commands.  We write
3195   % three arguments to \entry to the .?? file (four in the
3196   % subentry case), texindex reduces to two when writing the .??s
3197   % sorted result.
3198   \edef\temp{%
3199     \write\writeto{%
3200       \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}%
3201   }%
3202   \temp
3203 }
3204
3205 % Take care of unwanted page breaks:
3206 %
3207 % If a skip is the last thing on the list now, preserve it
3208 % by backing up by \lastskip, doing the \write, then inserting
3209 % the skip again.  Otherwise, the whatsit generated by the
3210 % \write will make \lastskip zero.  The result is that sequences
3211 % like this:
3212 % @end defun
3213 % @tindex whatever
3214 % @defun ...
3215 % will have extra space inserted, because the \medbreak in the
3216 % start of the @defun won't see the skip inserted by the @end of
3217 % the previous defun.
3218 %
3219 % But don't do any of this if we're not in vertical mode.  We
3220 % don't want to do a \vskip and prematurely end a paragraph.
3221 %
3222 % Avoid page breaks due to these extra skips, too.
3223 %
3224 % But wait, there is a catch there:
3225 % We'll have to check whether \lastskip is zero skip.  \ifdim is not
3226 % sufficient for this purpose, as it ignores stretch and shrink parts
3227 % of the skip.  The only way seems to be to check the textual
3228 % representation of the skip.
3229 %
3230 % The following is almost like \def\zeroskipmacro{0.0pt} except that
3231 % the ``p'' and ``t'' characters have catcode \other, not 11 (letter).
3232 %
3233 \edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname}
3234 %
3235 % ..., ready, GO:
3236 %
3237 \def\dosubindsanitize{%
3238   % \lastskip and \lastpenalty cannot both be nonzero simultaneously.
3239   \skip0 = \lastskip
3240   \edef\lastskipmacro{\the\lastskip}%
3241   \count255 = \lastpenalty
3242   %
3243   % If \lastskip is nonzero, that means the last item was a
3244   % skip.  And since a skip is discardable, that means this
3245   % -\skip0 glue we're inserting is preceded by a
3246   % non-discardable item, therefore it is not a potential
3247   % breakpoint, therefore no \nobreak needed.
3248   \ifx\lastskipmacro\zeroskipmacro
3249   \else
3250     \vskip-\skip0
3251   \fi
3252   %
3253   \dosubindwrite
3254   %
3255   \ifx\lastskipmacro\zeroskipmacro
3256     % if \lastskip was zero, perhaps the last item was a
3257     % penalty, and perhaps it was >=10000, e.g., a \nobreak.
3258     % In that case, we want to re-insert the penalty; since we
3259     % just inserted a non-discardable item, any following glue
3260     % (such as a \parskip) would be a breakpoint.  For example:
3261     %   @deffn deffn-whatever
3262     %   @vindex index-whatever
3263     %   Description.
3264     % would allow a break between the index-whatever whatsit
3265     % and the "Description." paragraph.
3266     \ifnum\count255>9999 \nobreak \fi
3267   \else
3268     % On the other hand, if we had a nonzero \lastskip,
3269     % this make-up glue would be preceded by a non-discardable item
3270     % (the whatsit from the \write), so we must insert a \nobreak.
3271     \nobreak\vskip\skip0
3272   \fi
3273 }
3274
3275 % The index entry written in the file actually looks like
3276 %  \entry {sortstring}{page}{topic}
3277 % or
3278 %  \entry {sortstring}{page}{topic}{subtopic}
3279 % The texindex program reads in these files and writes files
3280 % containing these kinds of lines:
3281 %  \initial {c}
3282 %     before the first topic whose initial is c
3283 %  \entry {topic}{pagelist}
3284 %     for a topic that is used without subtopics
3285 %  \primary {topic}
3286 %     for the beginning of a topic that is used with subtopics
3287 %  \secondary {subtopic}{pagelist}
3288 %     for each subtopic.
3289
3290 % Define the user-accessible indexing commands
3291 % @findex, @vindex, @kindex, @cindex.
3292
3293 \def\findex {\fnindex}
3294 \def\kindex {\kyindex}
3295 \def\cindex {\cpindex}
3296 \def\vindex {\vrindex}
3297 \def\tindex {\tpindex}
3298 \def\pindex {\pgindex}
3299
3300 \def\cindexsub {\begingroup\obeylines\cindexsub}
3301 {\obeylines %
3302 \gdef\cindexsub "#1" #2^^M{\endgroup %
3303 \dosubind{cp}{#2}{#1}}}
3304
3305 % Define the macros used in formatting output of the sorted index material.
3306
3307 % @printindex causes a particular index (the ??s file) to get printed.
3308 % It does not print any chapter heading (usually an @unnumbered).
3309 %
3310 \defparsearg\printindex{\begingroup
3311   \dobreak \chapheadingskip{10000}%
3312   %
3313   \smallfonts \rm
3314   \tolerance = 9500
3315   \everypar = {}% don't want the \kern\-parindent from indentation suppression.
3316   %
3317   % See if the index file exists and is nonempty.
3318   % Change catcode of @ here so that if the index file contains
3319   % \initial {@}
3320   % as its first line, TeX doesn't complain about mismatched braces
3321   % (because it thinks @} is a control sequence).
3322   \catcode`\@ = 11
3323   \openin 1 \jobname.#1s
3324   \ifeof 1
3325     % \enddoublecolumns gets confused if there is no text in the index,
3326     % and it loses the chapter title and the aux file entries for the
3327     % index.  The easiest way to prevent this problem is to make sure
3328     % there is some text.
3329     \putwordIndexNonexistent
3330   \else
3331     %
3332     % If the index file exists but is empty, then \openin leaves \ifeof
3333     % false.  We have to make TeX try to read something from the file, so
3334     % it can discover if there is anything in it.
3335     \read 1 to \temp
3336     \ifeof 1
3337       \putwordIndexIsEmpty
3338     \else
3339       % Index files are almost Texinfo source, but we use \ as the escape
3340       % character.  It would be better to use @, but that's too big a change
3341       % to make right now.
3342       \def\indexbackslash{\rawbackslashxx}%
3343       \catcode`\\ = 0
3344       \escapechar = `\\
3345       \begindoublecolumns
3346       \input \jobname.#1s
3347       \enddoublecolumns
3348     \fi
3349   \fi
3350   \closein 1
3351 \endgroup}
3352
3353 % These macros are used by the sorted index file itself.
3354 % Change them to control the appearance of the index.
3355
3356 \def\initial#1{{%
3357   % Some minor font changes for the special characters.
3358   \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt
3359   %
3360   % Remove any glue we may have, we'll be inserting our own.
3361   \removelastskip
3362   %
3363   % We like breaks before the index initials, so insert a bonus.
3364   \penalty -300
3365   %
3366   % Typeset the initial.  Making this add up to a whole number of
3367   % baselineskips increases the chance of the dots lining up from column
3368   % to column.  It still won't often be perfect, because of the stretch
3369   % we need before each entry, but it's better.
3370   %
3371   % No shrink because it confuses \balancecolumns.
3372   \vskip 1.67\baselineskip plus .5\baselineskip
3373   \leftline{\secbf #1}%
3374   \vskip .33\baselineskip plus .1\baselineskip
3375   %
3376   % Do our best not to break after the initial.
3377   \nobreak
3378 }}
3379
3380 % \entry typesets a paragraph consisting of the text (#1), dot leaders, and
3381 % then page number (#2) flushed to the right margin.  It is used for index
3382 % and table of contents entries.  The paragraph is indented by \leftskip.
3383 %
3384 % A straigtforward implementation would start like this:
3385 %       \def\entry#1#2{...
3386 % But this frozes the catcodes in the argument, and can cause problems to
3387 % @code, which set's active ``-''.  This problem was fixed by a kludge---
3388 % ``-'' was active throughout whole index, but this isn't what we really
3389 % want.
3390 % The right solution is to prevent \entry from swallowing the whole text.
3391 %                                 --kasal, 21nov03
3392 \def\entry{%
3393   \begingroup
3394     %
3395     % Start a new paragraph if necessary, so our assignments below can't
3396     % affect previous text.
3397     \par
3398     %
3399     % Do not fill out the last line with white space.
3400     \parfillskip = 0in
3401     %
3402     % No extra space above this paragraph.
3403     \parskip = 0in
3404     %
3405     % Do not prefer a separate line ending with a hyphen to fewer lines.
3406     \finalhyphendemerits = 0
3407     %
3408     % \hangindent is only relevant when the entry text and page number
3409     % don't both fit on one line.  In that case, bob suggests starting the
3410     % dots pretty far over on the line.  Unfortunately, a large
3411     % indentation looks wrong when the entry text itself is broken across
3412     % lines.  So we use a small indentation and put up with long leaders.
3413     %
3414     % \hangafter is reset to 1 (which is the value we want) at the start
3415     % of each paragraph, so we need not do anything with that.
3416     \hangindent = 2em
3417     %
3418     % When the entry text needs to be broken, just fill out the first line
3419     % with blank space.
3420     \rightskip = 0pt plus1fil
3421     %
3422     % A bit of stretch before each entry for the benefit of balancing
3423     % columns.
3424     \vskip 0pt plus1pt
3425     %
3426     % Swallow the left brace of the text (first parameter):
3427     \afterassignment\doentry
3428     \let\temp =
3429 }
3430 \def\doentry{%
3431     \bgroup % Instead of the swallowed brace.
3432       \noindent
3433       \aftergroup\finishentry
3434       % And now comes the text of the entry.
3435 }
3436 \def\finishentry#1{%
3437     % #1 is the page number.
3438     %
3439     % The following is kludged to not output a line of dots in the index if
3440     % there are no page numbers.  The next person who breaks this will be
3441     % cursed by a Unix daemon.
3442     \def\tempa{{\rm }}%
3443     \def\tempb{#1}%
3444     \edef\tempc{\tempa}%
3445     \edef\tempd{\tempb}%
3446     \ifx\tempc\tempd
3447       \ %
3448     \else
3449       %
3450       % If we must, put the page number on a line of its own, and fill out
3451       % this line with blank space.  (The \hfil is overwhelmed with the
3452       % fill leaders glue in \indexdotfill if the page number does fit.)
3453       \hfil\penalty50
3454       \null\nobreak\indexdotfill % Have leaders before the page number.
3455       %
3456       % The `\ ' here is removed by the implicit \unskip that TeX does as
3457       % part of (the primitive) \par.  Without it, a spurious underfull
3458       % \hbox ensues.
3459       \ifpdf
3460         \pdfgettoks#1.\ \the\toksA
3461       \else
3462         \ #1%
3463       \fi
3464     \fi
3465     \par
3466   \endgroup
3467 }
3468
3469 % Like \dotfill except takes at least 1 em.
3470 \def\indexdotfill{\cleaders
3471   \hbox{$\mathsurround=0pt \mkern1.5mu ${\it .}$ \mkern1.5mu$}\hskip 1em plus 1fill}
3472
3473 \def\primary #1{\line{#1\hfil}}
3474
3475 \newskip\secondaryindent \secondaryindent=0.5cm
3476 \def\secondary#1#2{{%
3477   \parfillskip=0in
3478   \parskip=0in
3479   \hangindent=1in
3480   \hangafter=1
3481   \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill
3482   \ifpdf
3483     \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
3484   \else
3485     #2
3486   \fi
3487   \par
3488 }}
3489
3490 % Define two-column mode, which we use to typeset indexes.
3491 % Adapted from the TeXbook, page 416, which is to say,
3492 % the manmac.tex format used to print the TeXbook itself.
3493 \catcode`\@=11
3494
3495 \newbox\partialpage
3496 \newdimen\doublecolumnhsize
3497
3498 \def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
3499   % Grab any single-column material above us.
3500   \output = {%
3501     %
3502     % Here is a possibility not foreseen in manmac: if we accumulate a
3503     % whole lot of material, we might end up calling this \output
3504     % routine twice in a row (see the doublecol-lose test, which is
3505     % essentially a couple of indexes with @setchapternewpage off).  In
3506     % that case we just ship out what is in \partialpage with the normal
3507     % output routine.  Generally, \partialpage will be empty when this
3508     % runs and this will be a no-op.  See the indexspread.tex test case.
3509     \ifvoid\partialpage \else
3510       \onepageout{\pagecontents\partialpage}%
3511     \fi
3512     %
3513     \global\setbox\partialpage = \vbox{%
3514       % Unvbox the main output page.
3515       \unvbox\PAGE
3516       \kern-\topskip \kern\baselineskip
3517     }%
3518   }%
3519   \eject % run that output routine to set \partialpage
3520   %
3521   % Use the double-column output routine for subsequent pages.
3522   \output = {\doublecolumnout}%
3523   %
3524   % Change the page size parameters.  We could do this once outside this
3525   % routine, in each of @smallbook, @afourpaper, and the default 8.5x11
3526   % format, but then we repeat the same computation.  Repeating a couple
3527   % of assignments once per index is clearly meaningless for the
3528   % execution time, so we may as well do it in one place.
3529   %
3530   % First we halve the line length, less a little for the gutter between
3531   % the columns.  We compute the gutter based on the line length, so it
3532   % changes automatically with the paper format.  The magic constant
3533   % below is chosen so that the gutter has the same value (well, +-<1pt)
3534   % as it did when we hard-coded it.
3535   %
3536   % We put the result in a separate register, \doublecolumhsize, so we
3537   % can restore it in \pagesofar, after \hsize itself has (potentially)
3538   % been clobbered.
3539   %
3540   \doublecolumnhsize = \hsize
3541     \advance\doublecolumnhsize by -.04154\hsize
3542     \divide\doublecolumnhsize by 2
3543   \hsize = \doublecolumnhsize
3544   %
3545   % Double the \vsize as well.  (We don't need a separate register here,
3546   % since nobody clobbers \vsize.)
3547   \vsize = 2\vsize
3548 }
3549
3550 % The double-column output routine for all double-column pages except
3551 % the last.
3552 %
3553 \def\doublecolumnout{%
3554   \splittopskip=\topskip \splitmaxdepth=\maxdepth
3555   % Get the available space for the double columns -- the normal
3556   % (undoubled) page height minus any material left over from the
3557   % previous page.
3558   \dimen@ = \vsize
3559   \divide\dimen@ by 2
3560   \advance\dimen@ by -\ht\partialpage
3561   %
3562   % box0 will be the left-hand column, box2 the right.
3563   \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
3564   \onepageout\pagesofar
3565   \unvbox255
3566   \penalty\outputpenalty
3567 }
3568 %
3569 % Re-output the contents of the output page -- any previous material,
3570 % followed by the two boxes we just split, in box0 and box2.
3571 \def\pagesofar{%
3572   \unvbox\partialpage
3573   %
3574   \hsize = \doublecolumnhsize
3575   \wd0=\hsize \wd2=\hsize
3576   \hbox to\pagewidth{\box0\hfil\box2}%
3577 }
3578 %
3579 % All done with double columns.
3580 \def\enddoublecolumns{%
3581   \output = {%
3582     % Split the last of the double-column material.  Leave it on the
3583     % current page, no automatic page break.
3584     \balancecolumns
3585     %
3586     % If we end up splitting too much material for the current page,
3587     % though, there will be another page break right after this \output
3588     % invocation ends.  Having called \balancecolumns once, we do not
3589     % want to call it again.  Therefore, reset \output to its normal
3590     % definition right away.  (We hope \balancecolumns will never be
3591     % called on to balance too much material, but if it is, this makes
3592     % the output somewhat more palatable.)
3593     \global\output = {\onepageout{\pagecontents\PAGE}}%
3594   }%
3595   \eject
3596   \endgroup % started in \begindoublecolumns
3597   %
3598   % \pagegoal was set to the doubled \vsize above, since we restarted
3599   % the current page.  We're now back to normal single-column
3600   % typesetting, so reset \pagegoal to the normal \vsize (after the
3601   % \endgroup where \vsize got restored).
3602   \pagegoal = \vsize
3603 }
3604 %
3605 % Called at the end of the double column material.
3606 \def\balancecolumns{%
3607   \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120.
3608   \dimen@ = \ht0
3609   \advance\dimen@ by \topskip
3610   \advance\dimen@ by-\baselineskip
3611   \divide\dimen@ by 2 % target to split to
3612   %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}%
3613   \splittopskip = \topskip
3614   % Loop until we get a decent breakpoint.
3615   {%
3616     \vbadness = 10000
3617     \loop
3618       \global\setbox3 = \copy0
3619       \global\setbox1 = \vsplit3 to \dimen@
3620     \ifdim\ht3>\dimen@
3621       \global\advance\dimen@ by 1pt
3622     \repeat
3623   }%
3624   %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}%
3625   \setbox0=\vbox to\dimen@{\unvbox1}%
3626   \setbox2=\vbox to\dimen@{\unvbox3}%
3627   %
3628   \pagesofar
3629 }
3630 \catcode`\@ = \other
3631
3632
3633 \message{sectioning,}
3634 % Chapters, sections, etc.
3635
3636 % \unnumberedno is an oxymoron, of course.  But we count the unnumbered
3637 % sections so that we can refer to them unambiguously in the pdf
3638 % outlines by their "section number".  We avoid collisions with chapter
3639 % numbers by starting them at 10000.  (If a document ever has 10000
3640 % chapters, we're in trouble anyway, I'm sure.)
3641 \newcount\unnumberedno \unnumberedno = 10000
3642 \newcount\chapno
3643 \newcount\secno        \secno=0
3644 \newcount\subsecno     \subsecno=0
3645 \newcount\subsubsecno  \subsubsecno=0
3646
3647 % This counter is funny since it counts through charcodes of letters A, B, ...
3648 \newcount\appendixno  \appendixno = `\@
3649 %
3650 % \def\appendixletter{\char\the\appendixno}
3651 % We do the following ugly conditional instead of the above simple
3652 % construct for the sake of pdftex, which needs the actual
3653 % letter in the expansion, not just typeset.
3654
3655 \def\appendixletter{%
3656   \ifnum\appendixno=`A A%
3657   \else\ifnum\appendixno=`B B%
3658   \else\ifnum\appendixno=`C C%
3659   \else\ifnum\appendixno=`D D%
3660   \else\ifnum\appendixno=`E E%
3661   \else\ifnum\appendixno=`F F%
3662   \else\ifnum\appendixno=`G G%
3663   \else\ifnum\appendixno=`H H%
3664   \else\ifnum\appendixno=`I I%
3665   \else\ifnum\appendixno=`J J%
3666   \else\ifnum\appendixno=`K K%
3667   \else\ifnum\appendixno=`L L%
3668   \else\ifnum\appendixno=`M M%
3669   \else\ifnum\appendixno=`N N%
3670   \else\ifnum\appendixno=`O O%
3671   \else\ifnum\appendixno=`P P%
3672   \else\ifnum\appendixno=`Q Q%
3673   \else\ifnum\appendixno=`R R%
3674   \else\ifnum\appendixno=`S S%
3675   \else\ifnum\appendixno=`T T%
3676   \else\ifnum\appendixno=`U U%
3677   \else\ifnum\appendixno=`V V%
3678   \else\ifnum\appendixno=`W W%
3679   \else\ifnum\appendixno=`X X%
3680   \else\ifnum\appendixno=`Y Y%
3681   \else\ifnum\appendixno=`Z Z%
3682   % The \the is necessary, despite appearances, because \appendixletter is
3683   % expanded while writing the .toc file.  \char\appendixno is not
3684   % expandable, thus it is written literally, thus all appendixes come out
3685   % with the same letter (or @) in the toc without it.
3686   \else\char\the\appendixno
3687   \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
3688   \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
3689
3690 % Each @chapter defines this as the name of the chapter.
3691 % page headings and footings can use it.  @section does likewise.
3692 % However, they are not reliable, because we don't use marks.
3693 \def\thischapter{}
3694 \def\thissection{}
3695
3696 \newcount\absseclevel % used to calculate proper heading level
3697 \newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count
3698
3699 % @raisesections: treat @section as chapter, @subsection as section, etc.
3700 \def\raisesections{\global\advance\secbase by -1}
3701 \let\up=\raisesections % original BFox name
3702
3703 % @lowersections: treat @chapter as section, @section as subsection, etc.
3704 \def\lowersections{\global\advance\secbase by 1}
3705 \let\down=\lowersections % original BFox name
3706
3707 % Choose a numbered-heading macro
3708 % #1 is heading level if unmodified by @raisesections or @lowersections
3709 % #2 is text for heading
3710 \def\numhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
3711 \ifcase\absseclevel
3712       \chapterzzz{#2}%
3713   \or \seczzz{#2}%
3714   \or \numberedsubseczzz{#2}%
3715   \or \numberedsubsubseczzz{#2}%
3716   \else
3717     \ifnum \absseclevel<0 \chapterzzz{#2}%
3718     \else \numberedsubsubseczzz{#2}%
3719     \fi
3720   \fi
3721   \suppressfirstparagraphindent
3722 }
3723
3724 % like \numhead, but chooses appendix heading levels
3725 \def\apphead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
3726 \ifcase\absseclevel
3727       \appendixzzz{#2}%
3728   \or \appendixsectionzzz{#2}%
3729   \or \appendixsubseczzz{#2}%
3730   \or \appendixsubsubseczzz{#2}%
3731   \else
3732     \ifnum \absseclevel<0 \appendixzzz{#2}%
3733     \else \appendixsubsubseczzz{#2}%
3734     \fi
3735   \fi
3736   \suppressfirstparagraphindent
3737 }
3738
3739 % like \numhead, but chooses numberless heading levels
3740 \def\unnmhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
3741   \ifcase\absseclevel
3742       \unnumberedzzz{#2}%
3743   \or \unnumberedseczzz{#2}%
3744   \or \unnumberedsubseczzz{#2}%
3745   \or \unnumberedsubsubseczzz{#2}%
3746   \else
3747     \ifnum \absseclevel<0 \unnumberedzzz{#2}%
3748     \else \unnumberedsubsubseczzz{#2}%
3749     \fi
3750   \fi
3751   \suppressfirstparagraphindent
3752 }
3753
3754 % @chapter, @appendix, @unnumbered.  Increment top-level counter, reset
3755 % all lower-level sectioning counters to zero.
3756
3757 % Also set \chaplevelprefix, which we prepend to @float sequence numbers
3758 % (e.g., figures), q.v.  By default (before any chapter), that is empty.
3759 \let\chaplevelprefix = \empty
3760
3761 \outer\defparsearg\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz
3762 \def\chapterzzz#1{%
3763   % section resetting is \global in case the chapter is in a group, such
3764   % as an @include file.
3765   \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
3766     \global\advance\chapno by 1
3767   %
3768   % Used for \float.
3769   \gdef\chaplevelprefix{\the\chapno.}%
3770   \resetallfloatnos
3771   %
3772   \message{\putwordChapter\space \the\chapno}%
3773   %
3774   % Write the actual heading.
3775   \chapmacro{#1}{Ynumbered}{\the\chapno}%
3776   %
3777   % So @section and the like are numbered underneath this chapter.
3778   \global\let\section = \numberedsec
3779   \global\let\subsection = \numberedsubsec
3780   \global\let\subsubsection = \numberedsubsubsec
3781 }
3782
3783 \outer\defparsearg\appendix{\apphead0{#1}} % normally apphead0 calls appendixzzz
3784 \def\appendixzzz#1{%
3785   \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
3786     \global\advance\appendixno by 1
3787   \gdef\chaplevelprefix{\appendixletter.}%
3788   \resetallfloatnos
3789   %
3790   \def\appendixnum{\putwordAppendix\space \appendixletter}%
3791   \message{\appendixnum}%
3792   %
3793   \chapmacro{#1}{Yappendix}{\appendixletter}%
3794   %
3795   \global\let\section = \appendixsec
3796   \global\let\subsection = \appendixsubsec
3797   \global\let\subsubsection = \appendixsubsubsec
3798 }
3799
3800 % @centerchap is like @unnumbered, but the heading is centered.
3801 \outer\defparsearg\centerchap{{\unnumberedyyy{#1}}}
3802
3803 \outer\defparsearg\unnumbered{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz
3804 \def\unnumberedzzz#1{%
3805   \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
3806     \global\advance\unnumberedno by 1
3807   %
3808   % Since an unnumbered as no number, no prefix for figures.
3809   \global\let\chaplevelprefix = \empty
3810   \resetallfloatnos
3811   %
3812   % This used to be simply \message{#1}, but TeX fully expands the
3813   % argument to \message.  Therefore, if #1 contained @-commands, TeX
3814   % expanded them.  For example, in `@unnumbered The @cite{Book}', TeX
3815   % expanded @cite (which turns out to cause errors because \cite is meant
3816   % to be executed, not expanded).
3817   %
3818   % Anyway, we don't want the fully-expanded definition of @cite to appear
3819   % as a result of the \message, we just want `@cite' itself.  We use
3820   % \the<toks register> to achieve this: TeX expands \the<toks> only once,
3821   % simply yielding the contents of <toks register>.  (We also do this for
3822   % the toc entries.)
3823   \toks0 = {#1}%
3824   \message{(\the\toks0)}%
3825   %
3826   \chapmacro{#1}{Ynothing}{\the\unnumberedno}%
3827   %
3828   \global\let\section = \unnumberedsec
3829   \global\let\subsection = \unnumberedsubsec
3830   \global\let\subsubsection = \unnumberedsubsubsec
3831 }
3832
3833 % @top is like @unnumbered.
3834 \let\top\unnumbered
3835
3836 % Sections.
3837 \outer\defparsearg\numberedsec{\numhead1{#1}} % normally calls seczzz
3838 \def\seczzz#1{%
3839   \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
3840   \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}%
3841 }
3842
3843 \outer\defparsearg\appendixsection{\apphead1{#1}} % normally calls appendixsectionzzz
3844 \def\appendixsectionzzz#1{%
3845   \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
3846   \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}%
3847 }
3848 \let\appendixsec\appendixsection
3849
3850 \outer\defparsearg\unnumberedsec{\unnmhead1{#1}} % normally calls unnumberedseczzz
3851 \def\unnumberedseczzz#1{%
3852   \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
3853   \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}%
3854 }
3855
3856 % Subsections.
3857 \outer\defparsearg\numberedsubsec{\numhead2{#1}} % normally calls numberedsubseczzz
3858 \def\numberedsubseczzz#1{%
3859   \global\subsubsecno=0  \global\advance\subsecno by 1
3860   \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}%
3861 }
3862
3863 \outer\defparsearg\appendixsubsec{\apphead2{#1}} % normally calls appendixsubseczzz
3864 \def\appendixsubseczzz#1{%
3865   \global\subsubsecno=0  \global\advance\subsecno by 1
3866   \sectionheading{#1}{subsec}{Yappendix}%
3867                  {\appendixletter.\the\secno.\the\subsecno}%
3868 }
3869
3870 \outer\defparsearg\unnumberedsubsec{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
3871 \def\unnumberedsubseczzz#1{%
3872   \global\subsubsecno=0  \global\advance\subsecno by 1
3873   \sectionheading{#1}{subsec}{Ynothing}%
3874                  {\the\unnumberedno.\the\secno.\the\subsecno}%
3875 }
3876
3877 % Subsubsections.
3878 \outer\defparsearg\numberedsubsubsec{\numhead3{#1}} % normally numberedsubsubseczzz
3879 \def\numberedsubsubseczzz#1{%
3880   \global\advance\subsubsecno by 1
3881   \sectionheading{#1}{subsubsec}{Ynumbered}%
3882                  {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}%
3883 }
3884
3885 \outer\defparsearg\appendixsubsubsec{\apphead3{#1}} % normally appendixsubsubseczzz
3886 \def\appendixsubsubseczzz#1{%
3887   \global\advance\subsubsecno by 1
3888   \sectionheading{#1}{subsubsec}{Yappendix}%
3889                  {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}%
3890 }
3891
3892 \outer\defparsearg\unnumberedsubsubsec{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
3893 \def\unnumberedsubsubseczzz#1{%
3894   \global\advance\subsubsecno by 1
3895   \sectionheading{#1}{subsubsec}{Ynothing}%
3896                  {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}%
3897 }
3898
3899 % These are variants which are not "outer", so they can appear in @ifinfo.
3900 % Actually, they are now be obsolete; ordinary section commands should work.
3901 \def\infotop{\parsearg\unnumberedzzz}
3902 \def\infounnumbered{\parsearg\unnumberedzzz}
3903 \def\infounnumberedsec{\parsearg\unnumberedseczzz}
3904 \def\infounnumberedsubsec{\parsearg\unnumberedsubseczzz}
3905 \def\infounnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz}
3906
3907 \def\infoappendix{\parsearg\appendixzzz}
3908 \def\infoappendixsec{\parsearg\appendixseczzz}
3909 \def\infoappendixsubsec{\parsearg\appendixsubseczzz}
3910 \def\infoappendixsubsubsec{\parsearg\appendixsubsubseczzz}
3911
3912 \def\infochapter{\parsearg\chapterzzz}
3913 \def\infosection{\parsearg\sectionzzz}
3914 \def\infosubsection{\parsearg\subsectionzzz}
3915 \def\infosubsubsection{\parsearg\subsubsectionzzz}
3916
3917 % These macros control what the section commands do, according
3918 % to what kind of chapter we are in (ordinary, appendix, or unnumbered).
3919 % Define them by default for a numbered chapter.
3920 \let\section = \numberedsec
3921 \let\subsection = \numberedsubsec
3922 \let\subsubsection = \numberedsubsubsec
3923
3924 % Define @majorheading, @heading and @subheading
3925
3926 % NOTE on use of \vbox for chapter headings, section headings, and such:
3927 %       1) We use \vbox rather than the earlier \line to permit
3928 %          overlong headings to fold.
3929 %       2) \hyphenpenalty is set to 10000 because hyphenation in a
3930 %          heading is obnoxious; this forbids it.
3931 %       3) Likewise, headings look best if no \parindent is used, and
3932 %          if justification is not attempted.  Hence \raggedright.
3933
3934
3935 \def\majorheading{%
3936   {\advance\chapheadingskip by 10pt \chapbreak }%
3937   \parsearg\chapheadingzzz
3938 }
3939
3940 \def\chapheading{\chapbreak \parsearg\chapheadingzzz}
3941 \def\chapheadingzzz#1{%
3942   {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
3943                     \parindent=0pt\raggedright
3944                     \rm #1\hfill}}%
3945   \bigskip \par\penalty 200\relax
3946   \suppressfirstparagraphindent
3947 }
3948
3949 % @heading, @subheading, @subsubheading.
3950 \defparsearg\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{}
3951   \suppressfirstparagraphindent}
3952 \defparsearg\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{}
3953   \suppressfirstparagraphindent}
3954 \defparsearg\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{}
3955   \suppressfirstparagraphindent}
3956
3957 % These macros generate a chapter, section, etc. heading only
3958 % (including whitespace, linebreaking, etc. around it),
3959 % given all the information in convenient, parsed form.
3960
3961 %%% Args are the skip and penalty (usually negative)
3962 \def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
3963
3964 \def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
3965
3966 %%% Define plain chapter starts, and page on/off switching for it
3967 % Parameter controlling skip before chapter headings (if needed)
3968
3969 \newskip\chapheadingskip
3970
3971 \def\chapbreak{\dobreak \chapheadingskip {-4000}}
3972 \def\chappager{\par\vfill\supereject}
3973 \def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi}
3974
3975 \def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
3976
3977 \def\CHAPPAGoff{%
3978 \global\let\contentsalignmacro = \chappager
3979 \global\let\pchapsepmacro=\chapbreak
3980 \global\let\pagealignmacro=\chappager}
3981
3982 \def\CHAPPAGon{%
3983 \global\let\contentsalignmacro = \chappager
3984 \global\let\pchapsepmacro=\chappager
3985 \global\let\pagealignmacro=\chappager
3986 \global\def\HEADINGSon{\HEADINGSsingle}}
3987
3988 \def\CHAPPAGodd{%
3989 \global\let\contentsalignmacro = \chapoddpage
3990 \global\let\pchapsepmacro=\chapoddpage
3991 \global\let\pagealignmacro=\chapoddpage
3992 \global\def\HEADINGSon{\HEADINGSdouble}}
3993
3994 \CHAPPAGon
3995
3996 \def\CHAPFplain{%
3997 \global\let\chapmacro=\chfplain
3998 \global\let\centerchapmacro=\centerchfplain}
3999
4000 % Normal chapter opening.
4001
4002 % #1 is the text, #2 is the section type (Ynumbered, Ynothing,
4003 % Yappendix, Yomitfromtoc), #3 the chapter number.
4004
4005 % To test against our argument.
4006 \def\Ynothingkeyword{Ynothing}
4007 \def\Yomitfromtockeyword{Yomitfromtoc}
4008 \def\Yappendixkeyword{Yappendix}
4009 %
4010 \def\chfplain#1#2#3{%
4011   \pchapsepmacro
4012   {%
4013     \chapfonts \rm
4014     %
4015     % Have to define \thissection before calling \donoderef, because the
4016     % xref code eventually uses it.  On the other hand, it has to be called
4017     % after \pchapsepmacro, or the headline will change too soon.
4018     \gdef\thissection{#1}%
4019     \gdef\thischaptername{#1}%
4020     %
4021     % Only insert the separating space if we have a chapter/appendix
4022     % number, and don't print the unnumbered ``number''.
4023     \def\temptype{#2}%
4024     \ifx\temptype\Ynothingkeyword
4025       \setbox0 = \hbox{}%
4026       \def\toctype{unnchap}%
4027       \def\thischapter{#1}%
4028     \else\ifx\temptype\Yomitfromtockeyword
4029       \setbox0 = \hbox{}% contents like unnumbered, but no toc entry
4030       \def\toctype{omit}%
4031       \xdef\thischapter{}%
4032     \else\ifx\temptype\Yappendixkeyword
4033       \setbox0 = \hbox{\putwordAppendix{} #3\enspace}%
4034       \def\toctype{app}%
4035       % We don't substitute the actual chapter name into \thischapter
4036       % because we don't want its macros evaluated now.  And we don't
4037       % use \thissection because that changes with each section.
4038       %
4039       \xdef\thischapter{\putwordAppendix{} \appendixletter:
4040                         \noexpand\thischaptername}%
4041     \else
4042       \setbox0 = \hbox{#3\enspace}%
4043       \def\toctype{numchap}%
4044       \xdef\thischapter{\putwordChapter{} \the\chapno:
4045                         \noexpand\thischaptername}%
4046     \fi\fi\fi
4047     %
4048     % Write the toc entry for this chapter.  Must come before the
4049     % \donoderef, because we include the current node name in the toc
4050     % entry, and \donoderef resets it to empty.
4051     \writetocentry{\toctype}{#1}{#3}%
4052     %
4053     % For pdftex, we have to write out the node definition (aka, make
4054     % the pdfdest) after any page break, but before the actual text has
4055     % been typeset.  If the destination for the pdf outline is after the
4056     % text, then jumping from the outline may wind up with the text not
4057     % being visible, for instance under high magnification.
4058     \donoderef{#2}%
4059     %
4060     % Typeset the actual heading.
4061     \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
4062           \hangindent=\wd0 \centerparametersmaybe
4063           \unhbox0 #1\par}%
4064   }%
4065   \nobreak\bigskip % no page break after a chapter title
4066   \nobreak
4067 }
4068
4069 % @centerchap -- centered and unnumbered.
4070 \let\centerparametersmaybe = \relax
4071 \def\centerchfplain#1{{%
4072   \def\centerparametersmaybe{%
4073     \advance\rightskip by 3\rightskip
4074     \leftskip = \rightskip
4075     \parfillskip = 0pt
4076   }%
4077   \chfplain{#1}{Ynothing}{}%
4078 }}
4079
4080 \CHAPFplain % The default
4081
4082 % I don't think this chapter style is supported any more, so I'm not
4083 % updating it with the new noderef stuff.  We'll see.  --karl, 11aug03.
4084
4085 \def\unnchfopen #1{%
4086 \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
4087                        \parindent=0pt\raggedright
4088                        \rm #1\hfill}}\bigskip \par\nobreak
4089 }
4090
4091 \def\chfopen #1#2{\chapoddpage {\chapfonts
4092 \vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
4093 \par\penalty 5000 %
4094 }
4095
4096 \def\centerchfopen #1{%
4097 \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
4098                        \parindent=0pt
4099                        \hfill {\rm #1}\hfill}}\bigskip \par\nobreak
4100 }
4101
4102 \def\CHAPFopen{%
4103 \global\let\chapmacro=\chfopen
4104 \global\let\centerchapmacro=\centerchfopen}
4105
4106
4107 % Section titles.  These macros combine the section number parts and
4108 % call the generic \sectionheading to do the printing.
4109
4110 \newskip\secheadingskip
4111 \def\secheadingbreak{\dobreak \secheadingskip{-1000}}
4112
4113 % Subsection titles.
4114 \newskip\subsecheadingskip
4115 \def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}}
4116
4117 % Subsubsection titles.
4118 \def\subsubsecheadingskip{\subsecheadingskip}
4119 \def\subsubsecheadingbreak{\subsecheadingbreak}
4120
4121
4122 % Print any size, any type, section title.
4123
4124 % #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is
4125 % the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the
4126 % section number.
4127
4128 \def\sectionheading#1#2#3#4{%
4129   {%
4130     % Switch to the right set of fonts.
4131     \csname #2fonts\endcsname \rm
4132     %
4133     % Insert space above the heading.
4134     \csname #2headingbreak\endcsname
4135     %
4136     % Only insert the space after the number if we have a section number.
4137     \def\sectionlevel{#2}%
4138     \def\temptype{#3}%
4139     %
4140     \ifx\temptype\Ynothingkeyword
4141       \setbox0 = \hbox{}%
4142       \def\toctype{unn}%
4143       \gdef\thissection{#1}%
4144     \else\ifx\temptype\Yomitfromtockeyword
4145       % for @headings -- no section number, don't include in toc,
4146       % and don't redefine \thissection.
4147       \setbox0 = \hbox{}%
4148       \def\toctype{omit}%
4149       \let\sectionlevel=\empty
4150     \else\ifx\temptype\Yappendixkeyword
4151       \setbox0 = \hbox{#4\enspace}%
4152       \def\toctype{app}%
4153       \gdef\thissection{#1}%
4154     \else
4155       \setbox0 = \hbox{#4\enspace}%
4156       \def\toctype{num}%
4157       \gdef\thissection{#1}%
4158     \fi\fi\fi
4159     %
4160     % Write the toc entry (before \donoderef).  See comments in \chfplain.
4161     \writetocentry{\toctype\sectionlevel}{#1}{#4}%
4162     %
4163     % Write the node reference (= pdf destination for pdftex).
4164     % Again, see comments in \chfplain.
4165     \donoderef{#3}%
4166     %
4167     % Output the actual section heading.
4168     \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
4169           \hangindent=\wd0  % zero if no section number
4170           \unhbox0 #1}%
4171   }%
4172   % Add extra space after the heading -- half of whatever came above it.
4173   % Don't allow stretch, though.
4174   \kern .5 \csname #2headingskip\endcsname
4175   %
4176   % Do not let the kern be a potential breakpoint, as it would be if it
4177   % was followed by glue.
4178   \nobreak
4179   %
4180   % We'll almost certainly start a paragraph next, so don't let that
4181   % glue accumulate.  (Not a breakpoint because it's preceded by a
4182   % discardable item.)
4183   \vskip-\parskip
4184   %
4185   % This \nobreak is purely so the last item on the list is a \penalty
4186   % of 10000.  This is so other code, for instance \parsebodycommon, can
4187   % check for and avoid allowing breakpoints.  Otherwise, it would
4188   % insert a valid breakpoint between:
4189   %   @section sec-whatever
4190   %   @deffn def-whatever
4191   \nobreak
4192 }
4193
4194
4195 \message{toc,}
4196 % Table of contents.
4197 \newwrite\tocfile
4198
4199 % Write an entry to the toc file, opening it if necessary.
4200 % Called from @chapter, etc.  
4201
4202 % Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno}
4203 % We append the current node name (if any) and page number as additional
4204 % arguments for the \{chap,sec,...}entry macros which will eventually
4205 % read this.  The node name is used in the pdf outlines as the
4206 % destination to jump to.
4207
4208 % We open the .toc file for writing here instead of at @setfilename (or
4209 % any other fixed time) so that @contents can be anywhere in the document.
4210 % But if #1 is `omit', then we don't do anything.  This is used for the
4211 % table of contents chapter openings themselves.
4212 %
4213 \newif\iftocfileopened
4214 \def\omitkeyword{omit}%
4215 %
4216 \def\writetocentry#1#2#3{%
4217   \edef\writetoctype{#1}%
4218   \ifx\writetoctype\omitkeyword \else
4219     \iftocfileopened\else
4220       \immediate\openout\tocfile = \jobname.toc
4221       \global\tocfileopenedtrue
4222     \fi
4223     %
4224     \iflinks
4225       \toks0 = {#2}%
4226       \toks2 = \expandafter{\lastnode}%
4227       \edef\temp{\write\tocfile{\realbackslash #1entry{\the\toks0}{#3}%
4228                                {\the\toks2}{\noexpand\folio}}}%
4229       \temp
4230     \fi
4231   \fi
4232   %
4233   % Tell \shipout to create a pdf destination on each page, if we're
4234   % writing pdf.  These are used in the table of contents.  We can't
4235   % just write one on every page because the title pages are numbered
4236   % 1 and 2 (the page numbers aren't printed), and so are the first
4237   % two pages of the document.  Thus, we'd have two destinations named
4238   % `1', and two named `2'.
4239   \ifpdf \global\pdfmakepagedesttrue \fi
4240 }
4241
4242 \newskip\contentsrightmargin \contentsrightmargin=1in
4243 \newcount\savepageno
4244 \newcount\lastnegativepageno \lastnegativepageno = -1
4245
4246 % Prepare to read what we've written to \tocfile.
4247 %
4248 \def\startcontents#1{%
4249    % If @setchapternewpage on, and @headings double, the contents should
4250    % start on an odd page, unlike chapters.  Thus, we maintain
4251    % \contentsalignmacro in parallel with \pagealignmacro.
4252    % From: Torbjorn Granlund <tege@matematik.su.se>
4253    \contentsalignmacro
4254    \immediate\closeout\tocfile
4255    %
4256    % Don't need to put `Contents' or `Short Contents' in the headline.
4257    % It is abundantly clear what they are.
4258    \def\thischapter{}%
4259    \chapmacro{#1}{Yomitfromtoc}{}%
4260    %
4261    \savepageno = \pageno
4262    \begingroup                  % Set up to handle contents files properly.
4263       \catcode`\\=0  \catcode`\{=1  \catcode`\}=2  \catcode`\@=11
4264       % We can't do this, because then an actual ^ in a section
4265       % title fails, e.g., @chapter ^ -- exponentiation.  --karl, 9jul97.
4266       %\catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi
4267       \raggedbottom             % Worry more about breakpoints than the bottom.
4268       \advance\hsize by -\contentsrightmargin % Don't use the full line length.
4269       %
4270       % Roman numerals for page numbers.
4271       \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi
4272 }
4273
4274
4275 % Normal (long) toc.
4276 \def\contents{%
4277    \startcontents{\putwordTOC}%
4278      \openin 1 \jobname.toc
4279      \ifeof 1 \else
4280        \closein 1
4281        \input \jobname.toc
4282      \fi
4283      \vfill \eject
4284      \contentsalignmacro % in case @setchapternewpage odd is in effect
4285      \pdfmakeoutlines
4286    \endgroup
4287    \lastnegativepageno = \pageno
4288    \global\pageno = \savepageno
4289 }
4290
4291 % And just the chapters.
4292 \def\summarycontents{%
4293    \startcontents{\putwordShortTOC}%
4294       %
4295       \let\numchapentry = \shortchapentry
4296       \let\appentry = \shortchapentry
4297       \let\unnchapentry = \shortunnchapentry
4298       % We want a true roman here for the page numbers.
4299       \secfonts
4300       \let\rm=\shortcontrm \let\bf=\shortcontbf
4301       \let\sl=\shortcontsl \let\tt=\shortconttt
4302       \rm
4303       \hyphenpenalty = 10000
4304       \advance\baselineskip by 1pt % Open it up a little.
4305       \def\numsecentry##1##2##3##4{}
4306       \let\appsecentry = \numsecentry
4307       \let\unnsecentry = \numsecentry
4308       \let\numsubsecentry = \numsecentry
4309       \let\appsubsecentry = \numsecentry
4310       \let\unnsubsecentry = \numsecentry
4311       \let\numsubsubsecentry = \numsecentry
4312       \let\appsubsubsecentry = \numsecentry
4313       \let\unnsubsubsecentry = \numsecentry
4314       \openin 1 \jobname.toc
4315       \ifeof 1 \else
4316         \closein 1
4317         \input \jobname.toc
4318       \fi
4319      \vfill \eject
4320      \contentsalignmacro % in case @setchapternewpage odd is in effect
4321    \endgroup
4322    \lastnegativepageno = \pageno
4323    \global\pageno = \savepageno
4324 }
4325 \let\shortcontents = \summarycontents
4326
4327 % Typeset the label for a chapter or appendix for the short contents.
4328 % The arg is, e.g., `A' for an appendix, or `3' for a chapter.
4329 %
4330 \def\shortchaplabel#1{%
4331   % This space should be enough, since a single number is .5em, and the
4332   % widest letter (M) is 1em, at least in the Computer Modern fonts.
4333   % But use \hss just in case.
4334   % (This space doesn't include the extra space that gets added after
4335   % the label; that gets put in by \shortchapentry above.)
4336   % 
4337   % We'd like to right-justify chapter numbers, but that looks strange
4338   % with appendix letters.  And right-justifying numbers and
4339   % left-justifying letters looks strange when there is less than 10
4340   % chapters.  Have to read the whole toc once to know how many chapters
4341   % there are before deciding ...
4342   \hbox to 1em{#1\hss}%
4343 }
4344
4345 % These macros generate individual entries in the table of contents.
4346 % The first argument is the chapter or section name.
4347 % The last argument is the page number.
4348 % The arguments in between are the chapter number, section number, ...
4349
4350 % Chapters, in the main contents.
4351 \def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}}
4352 %
4353 % Chapters, in the short toc.
4354 % See comments in \dochapentry re vbox and related settings.
4355 \def\shortchapentry#1#2#3#4{%
4356   \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}%
4357 }
4358
4359 % Appendices, in the main contents.
4360 % Need the word Appendix, and a fixed-size box.
4361
4362 \def\appendixbox#1{%
4363   % We use M since it's probably the widest letter.
4364   \setbox0 = \hbox{\putwordAppendix{} M}%
4365   \hbox to \wd0{\putwordAppendix{} #1\hss}}
4366 %
4367 \def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}}
4368
4369 % Unnumbered chapters.
4370 \def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}}
4371 \def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}}
4372
4373 % Sections.
4374 \def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}}
4375 \let\appsecentry=\numsecentry
4376 \def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}}
4377
4378 % Subsections.
4379 \def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}}
4380 \let\appsubsecentry=\numsubsecentry
4381 \def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}}
4382
4383 % And subsubsections.
4384 \def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}}
4385 \let\appsubsubsecentry=\numsubsubsecentry
4386 \def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}}
4387
4388 % This parameter controls the indentation of the various levels.
4389 \newdimen\tocindent \tocindent = 2pc
4390
4391 % Now for the actual typesetting. In all these, #1 is the text and #2 is the
4392 % page number.
4393 %
4394 % If the toc has to be broken over pages, we want it to be at chapters
4395 % if at all possible; hence the \penalty.
4396 \def\dochapentry#1#2{%
4397    \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip
4398    \begingroup
4399      \chapentryfonts
4400      \tocentry{#1}{\dopageno\bgroup#2\egroup}%
4401    \endgroup
4402    \nobreak\vskip .25\baselineskip plus.1\baselineskip
4403 }
4404
4405 \def\dosecentry#1#2{\begingroup
4406   \secentryfonts \leftskip=\tocindent
4407   \tocentry{#1}{\dopageno\bgroup#2\egroup}%
4408 \endgroup}
4409
4410 \def\dosubsecentry#1#2{\begingroup
4411   \subsecentryfonts \leftskip=2\tocindent
4412   \tocentry{#1}{\dopageno\bgroup#2\egroup}%
4413 \endgroup}
4414
4415 \def\dosubsubsecentry#1#2{\begingroup
4416   \subsubsecentryfonts \leftskip=3\tocindent
4417   \tocentry{#1}{\dopageno\bgroup#2\egroup}%
4418 \endgroup}
4419
4420 % We use the same \entry macro as for the index entries.
4421 \let\tocentry = \entry
4422
4423 % Space between chapter (or whatever) number and the title.
4424 \def\labelspace{\hskip1em \relax}
4425
4426 \def\dopageno#1{{\rm #1}}
4427 \def\doshortpageno#1{{\rm #1}}
4428
4429 \def\chapentryfonts{\secfonts \rm}
4430 \def\secentryfonts{\textfonts}
4431 \def\subsecentryfonts{\textfonts}
4432 \def\subsubsecentryfonts{\textfonts}
4433
4434
4435 \message{environments,}
4436 % @foo ... @end foo.
4437
4438 % @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
4439 %
4440 % Since these characters are used in examples, it should be an even number of
4441 % \tt widths. Each \tt character is 1en, so two makes it 1em.
4442 %
4443 \def\point{$\star$}
4444 \def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
4445 \def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}}
4446 \def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
4447 \def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}}
4448
4449 % The @error{} command.
4450 % Adapted from the TeXbook's \boxit.
4451 %
4452 \newbox\errorbox
4453 %
4454 {\tentt \global\dimen0 = 3em}% Width of the box.
4455 \dimen2 = .55pt % Thickness of rules
4456 % The text. (`r' is open on the right, `e' somewhat less so on the left.)
4457 \setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt}
4458 %
4459 \setbox\errorbox=\hbox to \dimen0{\hfil
4460    \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
4461    \advance\hsize by -2\dimen2 % Rules.
4462    \vbox{%
4463       \hrule height\dimen2
4464       \hbox{\vrule width\dimen2 \kern3pt          % Space to left of text.
4465          \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
4466          \kern3pt\vrule width\dimen2}% Space to right.
4467       \hrule height\dimen2}
4468     \hfil}
4469 %
4470 \def\error{\leavevmode\lower.7ex\copy\errorbox}
4471
4472 % @tex ... @end tex    escapes into raw Tex temporarily.
4473 % One exception: @ is still an escape character, so that @end tex works.
4474 % But \@ or @@ will get a plain tex @ character.
4475
4476 \def\tex{\begingroup
4477   \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
4478   \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
4479   \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie
4480   \catcode `\%=14
4481   \catcode `\+=\other
4482   \catcode `\"=\other
4483   \catcode `\|=\other
4484   \catcode `\<=\other
4485   \catcode `\>=\other
4486   \escapechar=`\\
4487   %
4488   \let\b=\ptexb
4489   \let\bullet=\ptexbullet
4490   \let\c=\ptexc
4491   \let\,=\ptexcomma
4492   \let\.=\ptexdot
4493   \let\dots=\ptexdots
4494   \let\equiv=\ptexequiv
4495   \let\!=\ptexexclam
4496   \let\i=\ptexi
4497   \let\indent=\ptexindent
4498   \let\noindent=\ptexnoindent
4499   \let\{=\ptexlbrace
4500   \let\+=\tabalign
4501   \let\}=\ptexrbrace
4502   \let\/=\ptexslash
4503   \let\*=\ptexstar
4504   \let\t=\ptext
4505   %
4506   \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
4507   \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
4508   \def\@{@}%
4509 \let\Etex=\endgroup}
4510
4511 % Define @lisp ... @end lisp.
4512 % @lisp does a \begingroup so it can rebind things,
4513 % including the definition of @end lisp (which normally is erroneous).
4514
4515 % Amount to narrow the margins by for @lisp.
4516 \newskip\lispnarrowing \lispnarrowing=0.4in
4517
4518 % This is the definition that ^^M gets inside @lisp, @example, and other
4519 % such environments.  \null is better than a space, since it doesn't
4520 % have any width.
4521 \def\lisppar{\null\endgraf}
4522
4523 % This space is always present above and below environments.
4524 \newskip\envskipamount \envskipamount = 0pt
4525
4526 % Make spacing and below environment symmetrical.  We use \parskip here
4527 % to help in doing that, since in @example-like environments \parskip
4528 % is reset to zero; thus the \afterenvbreak inserts no space -- but the
4529 % start of the next paragraph will insert \parskip.
4530 %
4531 \def\aboveenvbreak{{%
4532   % =10000 instead of <10000 because of a special case in \itemzzz, q.v.
4533   \ifnum \lastpenalty=10000 \else
4534     \advance\envskipamount by \parskip
4535     \endgraf
4536     \ifdim\lastskip<\envskipamount
4537       \removelastskip
4538       % it's not a good place to break if the last penalty was \nobreak
4539       % or better ...
4540       \ifnum\lastpenalty>10000 \else \penalty-50 \fi
4541       \vskip\envskipamount
4542     \fi
4543   \fi
4544 }}
4545
4546 \let\afterenvbreak = \aboveenvbreak
4547
4548 % \nonarrowing is a flag.  If "set", @lisp etc don't narrow margins.
4549 \let\nonarrowing=\relax
4550
4551 % @cartouche ... @end cartouche: draw rectangle w/rounded corners around
4552 % environment contents.
4553 \font\circle=lcircle10
4554 \newdimen\circthick
4555 \newdimen\cartouter\newdimen\cartinner
4556 \newskip\normbskip\newskip\normpskip\newskip\normlskip
4557 \circthick=\fontdimen8\circle
4558 %
4559 \def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth
4560 \def\ctr{{\hskip 6pt\circle\char'010}}
4561 \def\cbl{{\circle\char'012\hskip -6pt}}
4562 \def\cbr{{\hskip 6pt\circle\char'011}}
4563 \def\carttop{\hbox to \cartouter{\hskip\lskip
4564         \ctl\leaders\hrule height\circthick\hfil\ctr
4565         \hskip\rskip}}
4566 \def\cartbot{\hbox to \cartouter{\hskip\lskip
4567         \cbl\leaders\hrule height\circthick\hfil\cbr
4568         \hskip\rskip}}
4569 %
4570 \newskip\lskip\newskip\rskip
4571
4572 \def\cartouche{%
4573 \begingroup\inENV
4574   \ifhmode\par\fi  % can't be in the midst of a paragraph.
4575   \startsavinginserts
4576   \lskip=\leftskip \rskip=\rightskip
4577   \leftskip=0pt\rightskip=0pt % we want these *outside*.
4578   \cartinner=\hsize \advance\cartinner by-\lskip
4579   \advance\cartinner by-\rskip
4580   \cartouter=\hsize
4581   \advance\cartouter by 18.4pt  % allow for 3pt kerns on either
4582                                 % side, and for 6pt waste from
4583                                 % each corner char, and rule thickness
4584   \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
4585   % Flag to tell @lisp, etc., not to narrow margin.
4586   \let\nonarrowing=\comment
4587   \vbox\bgroup
4588       \baselineskip=0pt\parskip=0pt\lineskip=0pt
4589       \carttop
4590       \hbox\bgroup
4591           \hskip\lskip
4592           \vrule\kern3pt
4593           \vbox\bgroup
4594               \kern3pt
4595               \hsize=\cartinner
4596               \baselineskip=\normbskip
4597               \lineskip=\normlskip
4598               \parskip=\normpskip
4599               \vskip -\parskip
4600               \comment % For explanation, see the end of \def\group.
4601 }
4602 \def\Ecartouche{%
4603               \ifhmode\par\fi
4604               \kern3pt
4605           \egroup
4606           \kern3pt\vrule
4607           \hskip\rskip
4608       \egroup
4609       \cartbot
4610   \egroup
4611   \checkinserts
4612 \endgroup
4613 }
4614
4615
4616 % This macro is called at the beginning of all the @example variants,
4617 % inside a group.
4618 \def\nonfillstart{%
4619   \aboveenvbreak
4620   \inENV % This group ends at the end of the body
4621   \hfuzz = 12pt % Don't be fussy
4622   \sepspaces % Make spaces be word-separators rather than space tokens.
4623   \let\par = \lisppar % don't ignore blank lines
4624   \obeylines % each line of input is a line of output
4625   \parskip = 0pt
4626   \parindent = 0pt
4627   \emergencystretch = 0pt % don't try to avoid overfull boxes
4628   % @cartouche defines \nonarrowing to inhibit narrowing
4629   % at next level down.
4630   \ifx\nonarrowing\relax
4631     \advance \leftskip by \lispnarrowing
4632     \exdentamount=\lispnarrowing
4633     \let\exdent=\nofillexdent
4634     \let\nonarrowing=\relax
4635   \fi
4636 }
4637
4638 % Define the \E... control sequence only if we are inside the particular
4639 % environment, so the error checking in \end will work.
4640 %
4641 % To end an @example-like environment, we first end the paragraph (via
4642 % \afterenvbreak's vertical glue), and then the group.  That way we keep
4643 % the zero \parskip that the environments set -- \parskip glue will be
4644 % inserted at the beginning of the next paragraph in the document, after
4645 % the environment.
4646 %
4647 \def\nonfillfinish{\afterenvbreak\endgroup}
4648
4649 % @lisp: indented, narrowed, typewriter font.
4650 \def\lisp{\begingroup
4651   \nonfillstart
4652   \let\Elisp = \nonfillfinish
4653   \tt
4654   \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
4655   \gobble       % eat return
4656 }
4657
4658 % @example: Same as @lisp.
4659 \def\example{\begingroup \def\Eexample{\nonfillfinish\endgroup}\lisp}
4660
4661 % @smallexample and @smalllisp: use smaller fonts.
4662 % Originally contributed by Pavel@xerox.
4663 \def\smalllisp{\begingroup
4664   \def\Esmalllisp{\nonfillfinish\endgroup}%
4665   \def\Esmallexample{\nonfillfinish\endgroup}%
4666   \smallexamplefonts
4667   \lisp
4668 }
4669 \let\smallexample = \smalllisp
4670
4671
4672 % @display: same as @lisp except keep current font.
4673 %
4674 \def\display{\begingroup
4675   \nonfillstart
4676   \let\Edisplay = \nonfillfinish
4677   \gobble
4678 }
4679 %
4680 % @smalldisplay: @display plus smaller fonts.
4681 %
4682 \def\smalldisplay{\begingroup
4683   \def\Esmalldisplay{\nonfillfinish\endgroup}%
4684   \smallexamplefonts \rm
4685   \display
4686 }
4687
4688 % @format: same as @display except don't narrow margins.
4689 %
4690 \def\format{\begingroup
4691   \let\nonarrowing = t%
4692   \nonfillstart
4693   \let\Eformat = \nonfillfinish
4694   \gobble
4695 }
4696 %
4697 % @smallformat: @format plus smaller fonts.
4698 %
4699 \def\smallformat{\begingroup
4700   \def\Esmallformat{\nonfillfinish\endgroup}%
4701   \smallexamplefonts \rm
4702   \format
4703 }
4704
4705 % @flushleft (same as @format).
4706 %
4707 \def\flushleft{\begingroup \def\Eflushleft{\nonfillfinish\endgroup}\format}
4708
4709 % @flushright.
4710 %
4711 \def\flushright{\begingroup
4712   \let\nonarrowing = t%
4713   \nonfillstart
4714   \let\Eflushright = \nonfillfinish
4715   \advance\leftskip by 0pt plus 1fill
4716   \gobble
4717 }
4718
4719
4720 % @quotation does normal linebreaking (hence we can't use \nonfillstart)
4721 % and narrows the margins.
4722 %
4723 \def\quotation{%
4724   \begingroup\inENV %This group ends at the end of the @quotation body
4725   {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
4726   \parindent=0pt
4727   % We have retained a nonzero parskip for the environment, since we're
4728   % doing normal filling. So to avoid extra space below the environment...
4729   \def\Equotation{\parskip = 0pt \nonfillfinish}%
4730   %
4731   % @cartouche defines \nonarrowing to inhibit narrowing at next level down.
4732   \ifx\nonarrowing\relax
4733     \advance\leftskip by \lispnarrowing
4734     \advance\rightskip by \lispnarrowing
4735     \exdentamount = \lispnarrowing
4736     \let\nonarrowing = \relax
4737   \fi
4738   \parsearg\quotationlabel
4739 }
4740
4741 % If we're given an argument, typeset it in bold with a colon after.
4742 \def\quotationlabel#1{%
4743   \def\temp{#1}%
4744   \ifx\temp\empty \else
4745     {\bf #1: }%
4746   \fi
4747 }
4748
4749
4750 % LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>}
4751 % If we want to allow any <char> as delimiter,
4752 % we need the curly braces so that makeinfo sees the @verb command, eg:
4753 % `@verbx...x' would look like the '@verbx' command.  --janneke@gnu.org
4754 %
4755 % [Knuth]: Donald Ervin Knuth, 1996.  The TeXbook.
4756 %
4757 % [Knuth] p.344; only we need to do the other characters Texinfo sets
4758 % active too.  Otherwise, they get lost as the first character on a
4759 % verbatim line.
4760 \def\dospecials{%
4761   \do\ \do\\\do\{\do\}\do\$\do\&%
4762   \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~%
4763   \do\<\do\>\do\|\do\@\do+\do\"%
4764 }
4765 %
4766 % [Knuth] p. 380
4767 \def\uncatcodespecials{%
4768   \def\do##1{\catcode`##1=\other}\dospecials}
4769 %
4770 % [Knuth] pp. 380,381,391
4771 % Disable Spanish ligatures ?` and !` of \tt font
4772 \begingroup
4773   \catcode`\`=\active\gdef`{\relax\lq}
4774 \endgroup
4775 %
4776 % Setup for the @verb command.
4777 %
4778 % Eight spaces for a tab
4779 \begingroup
4780   \catcode`\^^I=\active
4781   \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }}
4782 \endgroup
4783 %
4784 \def\setupverb{%
4785   \tt  % easiest (and conventionally used) font for verbatim
4786   \def\par{\leavevmode\endgraf}%
4787   \catcode`\`=\active
4788   \tabeightspaces
4789   % Respect line breaks,
4790   % print special symbols as themselves, and
4791   % make each space count
4792   % must do in this order:
4793   \obeylines \uncatcodespecials \sepspaces
4794 }
4795
4796 % Setup for the @verbatim environment
4797 %
4798 % Real tab expansion
4799 \newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount
4800 %
4801 \def\starttabbox{\setbox0=\hbox\bgroup}
4802 \begingroup
4803   \catcode`\^^I=\active
4804   \gdef\tabexpand{%
4805     \catcode`\^^I=\active
4806     \def^^I{\leavevmode\egroup
4807       \dimen0=\wd0 % the width so far, or since the previous tab
4808       \divide\dimen0 by\tabw
4809       \multiply\dimen0 by\tabw % compute previous multiple of \tabw
4810       \advance\dimen0 by\tabw  % advance to next multiple of \tabw
4811       \wd0=\dimen0 \box0 \starttabbox
4812     }%
4813   }
4814 \endgroup
4815 \def\setupverbatim{%
4816   \nonfillstart
4817   \advance\leftskip by -\defbodyindent
4818   % Easiest (and conventionally used) font for verbatim
4819   \tt
4820   \def\par{\leavevmode\egroup\box0\endgraf}%
4821   \catcode`\`=\active
4822   \tabexpand
4823   % Respect line breaks,
4824   % print special symbols as themselves, and
4825   % make each space count
4826   % must do in this order:
4827   \obeylines \uncatcodespecials \sepspaces
4828   \everypar{\starttabbox}%
4829 }
4830
4831 % Do the @verb magic: verbatim text is quoted by unique
4832 % delimiter characters.  Before first delimiter expect a
4833 % right brace, after last delimiter expect closing brace:
4834 %
4835 %    \def\doverb'{'<char>#1<char>'}'{#1}
4836 %
4837 % [Knuth] p. 382; only eat outer {}
4838 \begingroup
4839   \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other
4840   \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next]
4841 \endgroup
4842 %
4843 \def\verb{\begingroup\setupverb\doverb}
4844 %
4845 %
4846 % Do the @verbatim magic: define the macro \doverbatim so that
4847 % the (first) argument ends when '@end verbatim' is reached, ie:
4848 %
4849 %     \def\doverbatim#1@end verbatim{#1}
4850 %
4851 % For Texinfo it's a lot easier than for LaTeX,
4852 % because texinfo's \verbatim doesn't stop at '\end{verbatim}':
4853 % we need not redefine '\', '{' and '}'.
4854 %
4855 % Inspired by LaTeX's verbatim command set [latex.ltx]
4856 %
4857 \begingroup
4858   \catcode`\ =\active
4859   \obeylines %
4860   % ignore everything up to the first ^^M, that's the newline at the end
4861   % of the @verbatim input line itself.  Otherwise we get an extra blank
4862   % line in the output.
4863   \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}%
4864   % We really want {...\end verbatim} in the body of the macro, but
4865   % without the active space; thus we have to use \xdef and \gobble.
4866 \endgroup
4867 %
4868 \def\verbatim{%
4869   \let\Everbatim\nonfillfinish
4870   \begingroup
4871     \setupverbatim\doverbatim
4872 }
4873
4874 % @verbatiminclude FILE - insert text of file in verbatim environment.
4875 %
4876 \def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude}
4877 %
4878 \def\doverbatiminclude#1{%
4879   \begingroup
4880     \makevalueexpandable
4881     \setupverbatim
4882     \input #1
4883   \nonfillfinish % contains \endgroup
4884 }
4885
4886 % @copying ... @end copying.
4887 % Save the text away for @insertcopying later.  Many commands won't be
4888 % allowed in this context, but that's ok.
4889 %
4890 % We save the uninterpreted tokens, rather than creating a box.
4891 % Saving the text in a box would be much easier, but then all the
4892 % typesetting commands (@smallbook, font changes, etc.) have to be done
4893 % beforehand -- and a) we want @copying to be done first in the source
4894 % file; b) letting users define the frontmatter in as flexible order as
4895 % possible is very desirable.
4896 %
4897 \def\copying{\begingroup
4898   % Define a command to swallow text until we reach `@end copying'.
4899   % \ is the escape char in this texinfo.tex file, so it is the
4900   % delimiter for the command; @ will be the escape char when we read
4901   % it, but that doesn't matter.
4902   \long\def\docopying##1\end copying{\gdef\copyingtext{##1}\enddocopying}%
4903   %
4904   % We must preserve ^^M's in the input file; see \insertcopying below.
4905   \catcode`\^^M = \active
4906   \docopying
4907 }
4908
4909 % What we do to finish off the copying text.
4910 %
4911 \def\enddocopying{\endgroup\ignorespaces}
4912
4913 % @insertcopying.  Here we must play games with ^^M's.  On the one hand,
4914 % we need them to delimit commands such as `@end quotation', so they
4915 % must be active.  On the other hand, we certainly don't want every
4916 % end-of-line to be a \par, as would happen with the normal active
4917 % definition of ^^M.  On the third hand, two ^^M's in a row should still
4918 % generate a \par.
4919 %
4920 % Our approach is to make ^^M insert a space and a penalty1 normally;
4921 % then it can also check if \lastpenalty=1.  If it does, then manually
4922 % do \par.
4923 %
4924 % This messes up the normal definitions of @c[omment], so we redefine
4925 % it.  Similarly for @ignore.  (These commands are used in the gcc
4926 % manual for man page generation.)
4927 %
4928 % Seems pretty fragile, most line-oriented commands will presumably
4929 % fail, but for the limited use of getting the copying text (which
4930 % should be quite simple) inserted, we can hope it's ok.
4931 %
4932 {\catcode`\^^M=\active %
4933 \gdef\insertcopying{\begingroup %
4934   \parindent = 0pt  % looks wrong on title page
4935   \def^^M{%
4936     \ifnum \lastpenalty=1 %
4937       \par %
4938     \else %
4939       \space \penalty 1 %
4940     \fi %
4941   }%
4942   %
4943   % Fix @c[omment] for catcode 13 ^^M's.
4944   \def\c##1^^M{\ignorespaces}%
4945   \let\comment = \c %
4946   %
4947   % Don't bother jumping through all the hoops that \doignore does, it
4948   % would be very hard since the catcodes are already set.
4949   \long\def\ignore##1\end ignore{\ignorespaces}%
4950   %
4951   \copyingtext %
4952 \endgroup}%
4953 }
4954
4955 \message{defuns,}
4956 % @defun etc.
4957
4958 \newskip\defbodyindent \defbodyindent=.4in
4959 \newskip\defargsindent \defargsindent=50pt
4960 \newskip\deflastargmargin \deflastargmargin=18pt
4961
4962 % \startdefun \deffn
4963 % -- starts the processing of @deffn
4964 \def\startdefun#1{%
4965   \begingroup\inENV
4966   \def\thisenv{#1}%
4967   \ifnum\lastpenalty<10000
4968     \medbreak
4969   \else
4970     % If there are two @def commands in a row, we'll have a \nobreak,
4971     % which is there to keep the function description together with its
4972     % header.  But if there's nothing but headers, we need to allow a
4973     % break somewhere.  Check for penalty 10002 (inserted by
4974     % \defargscommonending) instead of 10000, since the sectioning
4975     % commands insert a \penalty10000, and we don't want to allow a break
4976     % between a section heading and a defun.
4977     \ifnum\lastpenalty=10002 \penalty2000 \fi
4978     %
4979     % Similarly, after a section heading, do not allow a break.
4980     % But do insert the glue.
4981     \medskip  % preceded by discardable penalty, so not a breakpoint
4982   \fi
4983   %
4984   \parindent=0in
4985   \advance\leftskip by \defbodyindent
4986   \exdentamount=\defbodyindent
4987 }
4988
4989 % \dodefunx \startdefun \deffn
4990 % -- converts \deffn expansion to \deffnx, omitting \startdefun.
4991 \def\dodefunx \startdefun #1{%
4992   % As above, allow line break if we have multiple x headers in a row.
4993   % It's not a great place, though.
4994   \ifnum\lastpenalty=10002 \penalty3000 \fi
4995   %
4996   % Check whether we are inside the corresponding @defun.
4997   \def\temp{#1}%
4998   \ifx\thisenv\temp
4999   \else
5000     \errmessage{\expandafter\string\temp x inside
5001       \expandafter\noexpand\thisenv environment}%
5002   \fi
5003 }
5004
5005 % Without continued lines we'd just have:
5006 %   \def\parsedefunline#1{\parseargusing\activeparens{\parsedefunlineX#1}}
5007 %   \def\parsedefunlineX#1#2{\printdefunline #1#2\DefunTerm}
5008 % but with continuations, things are much more complicated.
5009 %
5010 \def\parsedefunline#1{%
5011   \def\defunlinemacro{#1}% store \deffnheader (initially)
5012   \parsedefunlineX
5013 }
5014 \def\parsedefunlineX{%
5015   \parseargusing\activeparens\parsedefunlineY
5016 }
5017 \def\parsedefunlineY#1{%
5018   % We have to prepend a token to prevent brace stripping;
5019   % \defunlinemacro just comes handy.
5020   \defunchkspace\defunlinemacro#1\DefunMid\ \DefunMid\DefunTerm
5021 }
5022 \def\defunchkspace#1\ \DefunMid#2\DefunTerm{%
5023   \def\temp{#2}%
5024   \ifx\temp\empty
5025     % The line doesn't end with `@ '; in this case, #1 ends with \DefunMid.
5026     \let\next\defunchktab
5027   \else
5028     % `@ ' was found and stripped.
5029     \let\next\defunloop
5030   \fi
5031   \next#1\^^I\DefunMid\DefunTerm
5032 }
5033 \def\defunchktab#1\^^I\DefunMid#2\DefunTerm{%
5034   \def\temp{#2}%
5035   \ifx\temp\empty
5036     % The line doesn't end with `@TAB', either.
5037     \let\next\defunchkfinish
5038   \else
5039     % `@TAB' was found and stripped.
5040     \let\next\defunloop
5041   \fi
5042   \next#1\^^I\DefunMid\DefunTerm
5043 }
5044 \def\defunloop#1\^^I\DefunMid\DefunTerm{%
5045   % Expand the \defunlinemacro token at the beginning of #1.
5046   \expandafter\def\expandafter\defunlinemacro
5047     \expandafter{#1 }%
5048   \parsedefunlineX
5049 }
5050 \def\defunchkfinish#1\DefunMid\^^I%\DefunMid\DefunTerm -- stays here
5051 {%
5052   % #1 starts with \defunlinemacro, which is expanded and its expansion
5053   % starts with eg. \deffnheader.
5054   \expandafter\replaceeols #1\^^M%\DefunMid\DefunTerm -- stays here
5055 }
5056
5057 % Each occurence of `\^^M' or `<space>\^^M' is replaced by a single space.
5058 %
5059 % The parameters start with \deffnheader token, so trere is no risk braces
5060 % could be stripped at #1.  And we have a \DefunMid token just before
5061 % \DefunTerm, so we cannot loose braces at #2 either.  Uff!
5062 %
5063 \def\replaceeols#1\^^M#2\DefunTerm{%
5064   \stripDefunMid #2%
5065   \ifx\temp\empty
5066     % This \^^M is the terminating one.
5067     \printdefunline #1\DefunTerm
5068   \else
5069     \replaceeolsX#1\^^M \^^M#2\DefunTerm
5070   \fi
5071 }
5072 \def\replaceeolsX#1 \^^M{\replaceeolsY#1\^^M}
5073 \def\replaceeolsY#1\^^M#2\^^M{\replaceeols#1 }
5074 \def\stripDefunMid#1\DefunMid{\def\temp{#1}}
5075
5076 % \printdefunline \deffnheader text\DefunTerm
5077 %
5078 \def\printdefunline#1\DefunTerm{%
5079   \begingroup
5080     % call \deffnheader:
5081     #1 \endheader
5082     % common ending:
5083     \interlinepenalty = 10000
5084     \advance\rightskip by 0pt plus 1fil
5085     \endgraf
5086     \nobreak\vskip -\parskip
5087     \penalty 10002  % signal to \startdefun and \dodefunx
5088     % Some of the @defun-type tags do not enable magic parentheses,
5089     % rendering the following check redundant.  But we don't optimize.
5090     \checkparencounts
5091   \endgroup
5092 }
5093
5094 \def\Edefun{\endgraf\endgroup\medbreak}
5095
5096 % \makedefun{deffn} creates \deffn, \deffnx and \Edeffn;
5097 % the only thing remainnig is to define \deffnheader.
5098 %
5099 \def\makedefun#1{%
5100   \expandafter\let\csname E#1\endcsname = \Edefun
5101   \edef\temp{\noexpand\domakedefun
5102     \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}%
5103   \temp
5104 }
5105
5106 % \domakedefun \deffn \deffnx \deffnheader
5107 %
5108 % Define \deffn and \deffnx, without parameters.
5109 % \deffnheader has to be defined explicitly.
5110 %
5111 \def\domakedefun#1#2#3{%
5112   \def#1{%
5113     \startdefun#1%
5114     \parsedefunline#3%
5115   }%
5116   % A tricky way to recycle the code defined above:
5117   \def#2{\expandafter\dodefunx#1}%
5118 }
5119
5120 % Untyped functions (@deffn, @defop):
5121
5122 \makedefun{deffn} % category name args
5123 \def\deffnheader{\deffngeneral{}}
5124
5125 \makedefun{defop} % category class name args
5126 \def\defopheader#1 {\defopon{#1\ \putwordon}}
5127
5128 % \defopon {category on}class name args
5129 \def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
5130
5131 % \deffngeneral {subind}category name args
5132 %
5133 \def\deffngeneral#1#2 #3 #4\endheader{%
5134   % Remember that \dosubin{fn}{xxx}{} is equivalent to \doind{fn}{xxx}.
5135   \dosubind{fn}{\code{#3}}{#1}%
5136   \defname{#2}{}{#3}\ampdefunargs{#4\unskip}%
5137 }
5138
5139 % Typed functions (@deftypefn, @deftypeop):
5140
5141 \makedefun{deftypefn} % category type name args
5142 \def\deftypefnheader{\deftypefngeneral{}}
5143
5144 \makedefun{deftypeop} % category class type name args
5145 \def\deftypeopheader#1 {\deftypeopon{#1\ \putwordon}}
5146
5147 % \deftypeopon {category on}class type name args
5148 \def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
5149
5150 % \deftypefngeneral {subind}category type name args
5151 %
5152 \def\deftypefngeneral#1#2 #3 #4 #5\endheader{%
5153   \dosubind{fn}{\code{#4}}{#1}%
5154   \defname{#2}{#3}{#4}\normaldefunargs{#5\unskip}%
5155 }
5156
5157 % Typed variables (@deftypevr, @deftypecv):
5158
5159 \makedefun{deftypevr}% category type var args
5160 \def\deftypevrheader{\deftypecvgeneral{}}
5161
5162 \makedefun{deftypecv}% category class type var args
5163 \def\deftypecvheader#1 {\deftypecvof{#1\ \putwordof}}
5164
5165 % \deftypecvof {category of}class type var args
5166 \def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} }
5167
5168 % \deftypecvgeneral {subind}category type var args
5169 %
5170 \def\deftypecvgeneral#1#2 #3 #4 #5\endheader{%
5171   \dosubind{vr}{\code{#4}}{#1}%
5172   \defname{#2}{#3}{#4}\normaldefunargs{#5\unskip}%
5173 }
5174
5175 % Untyped variables (@defvr, @defcv):
5176 \makedefun{defvr}% category var args
5177 \def\defvrheader#1 {\deftypevrheader{#1} {} }
5178
5179 \makedefun{defcv}% category class var args
5180 \def\defcvheader#1 {\defcvof{#1\ \putwordof}}
5181
5182 % \defcvof {category of}class var args
5183 \def\defcvof#1#2 {\deftypecvof{#1}#2 {} }
5184
5185 % Type (@deftp):
5186 \makedefun{deftp}% category name args
5187 \def\deftpheader#1 #2 #3\endheader{%
5188   \doind{tp}{\code{#2}}%
5189   \defname{#1}{}{#2}\normaldefunargs{#3\unskip}%
5190 }
5191
5192 % Remaining @defun-like shortcuts:
5193 \makedefun{defun}     \def\defunheader{\deffnheader{\putwordDeffunc} }
5194 \makedefun{defmac}    \def\defmacheader{\deffnheader{\putwordDefmac} }
5195 \makedefun{defspec}   \def\defspecheader{\deffnheader{\putwordDefspec} }
5196 \makedefun{deftypefun}\def\deftypefunheader{\deftypefnheader{\putwordDeffunc} }
5197 \makedefun{defvar}    \def\defvarheader{\defvrheader{\putwordDefvar} }
5198 \makedefun{defopt}    \def\defoptheader{\defvrheader{\putwordDefopt} }
5199 \makedefun{deftypevar}\def\deftypevarheader{\deftypevrheader{\putwordDefvar} }
5200 \makedefun{defmethod} \def\defmethodheader{\defopon\putwordMethodon}
5201 \makedefun{deftypemethod}\def\deftypemethodheader{\deftypeopon\putwordMethodon}
5202 \makedefun{defivar}    \def\defivarheader{\defcvof\putwordInstanceVariableof}
5203 \makedefun{deftypeivar}\def\deftypeivarheader{\deftypecvof\putwordInstanceVariableof}
5204
5205 % \defname, which formats the name of the @def (not the args).
5206 % #1 is the category, such as "Function".
5207 % #2 is the return type, if any.
5208 % #3 is the function name.
5209
5210 % We are followed by (but not passed) the arguments, if any.
5211 %
5212 \def\defname#1#2#3{%
5213   % Get the values of \leftskip and \rightskip as they were outside the @def...
5214   \advance\leftskip by -\defbodyindent
5215   %
5216   % How we'll format the type name.  Putting it in brackets helps
5217   % distinguish it from the body text that may end up on the next line
5218   % just below it.
5219   \def\temp{#1}%
5220   \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi}
5221   %
5222   % Figure out line sizes for the paragraph shape.
5223   % The first line needs space for \box0; but if \rightskip is nonzero,
5224   % we need only space for the part of \box0 which exceeds it:
5225   \dimen0=\hsize  \advance\dimen0 by -\wd0  \advance\dimen0 by \rightskip
5226   % The continuations:
5227   \dimen2=\hsize  \advance\dimen2 by -\defargsindent
5228   % (plain.tex says that \dimen1 should be used only as global.)
5229   \parshape 2 0in \dimen0 \defargsindent \dimen2
5230   %
5231   % Put the type name to the right margin.
5232   \noindent
5233   \hbox to 0pt{%
5234     \hfil\box0 \kern-\hsize
5235     % \hsize has to be shortened this way:
5236     \kern\leftskip
5237     % Intentionally do not respect \rightskip, since we need the space.
5238   }%
5239   %
5240   % Allow all lines to be underfull without complaint:
5241   \tolerance=10000 \hbadness=10000
5242   \exdentamount=\defbodyindent
5243   {%
5244     % defun fonts. We use typewriter by default (used to be bold) because:
5245     % . we're printing identifiers, they should be in tt in principle.
5246     % . in languages with many accents, such as Czech or French, it's
5247     %   common to leave accents off identifiers.  The result looks ok in
5248     %   tt, but exceedingly strange in rm.
5249     % . we don't want -- and --- to be treated as ligatures.
5250     % . this still does not fix the ?` and !` ligatures, but so far no
5251     %   one has made identifiers using them :).
5252     \df \tt
5253     \def\temp{#2}% return value type
5254     \ifx\temp\empty\else \tclose{\temp} \fi
5255     #3% output function name
5256   }%
5257   {\rm\enskip}% hskip 0.5 em of \tenrm
5258   %
5259   \boldbrax
5260   % arguments will be output next, if any.
5261 }
5262
5263 % This expands the args, with & being treated magically.
5264 %
5265 \def\ampdefunargs{%
5266   \magicamp
5267   \normaldefunargs
5268 }
5269
5270 % Print arguments in slanted typewriter, prevent hyphenation at `-' chars.
5271
5272 \def\normaldefunargs#1{%
5273   % use sl by default (not ttsl), inconsistently with using tt for the
5274   % name.  This is because literal text is sometimes needed in the
5275   % argument list (groff manual), and ttsl and tt are not very
5276   % distinguishable.
5277   % tt for the names.
5278   \df \sl \hyphenchar\font=0
5279   % On the other hand, if an argument has two dashes (for instance), we
5280   % want a way to get ttsl.  Let's try @var for that.
5281   \let\var=\ttslanted
5282   #1%
5283   \sl\hyphenchar\font=45
5284 }
5285
5286 % We want ()&[] to print specially on the defun line.
5287 %
5288 \def\activeparens{%
5289   \catcode`\(=\active \catcode`\)=\active
5290   \catcode`\[=\active \catcode`\]=\active
5291   \catcode`\&=\active
5292 }
5293
5294 % Make control sequences which act like normal parenthesis chars.
5295 \let\lparen = ( \let\rparen = )
5296
5297 % Be sure that we always have a definition for `(', etc.  For example,
5298 % if the fn name has parens in it, \boldbrax will not be in effect yet,
5299 % so TeX would otherwise complain about undefined control sequence.
5300 {
5301   \activeparens
5302   \global\let(=\lparen \global\let)=\rparen
5303   \global\let[=\lbrack \global\let]=\rbrack
5304   \global\let& = \&
5305
5306   \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
5307   \gdef\magicamp{\let&=\amprm}
5308 }
5309
5310 \newcount\parencount
5311
5312 % If we encounter &foo, then turn on ()-hacking afterwards
5313 \newif\ifampseen
5314 \def\amprm#1 {\ampseentrue{\bf\&#1 }}
5315
5316 \def\parenfont{%
5317   \ifampseen
5318     % At the first level, print parens in roman,
5319     % otherwise use the default font.
5320     \ifnum \parencount=1 \rm \fi
5321   \else
5322     % The \sf parens (in \boldbrax) actually are a little bolder than
5323     % the contained text.  This is especially needed for [ and ] .
5324     \sf
5325   \fi
5326 }
5327 \def\infirstlevel#1{%
5328   \ifampseen
5329     \ifnum\parencount=1
5330       #1%
5331     \fi
5332   \fi
5333 }
5334 \def\bfafterword#1 {#1 \bf}
5335
5336 \def\opnr{%
5337   \global\advance\parencount by 1
5338   {\parenfont(}%
5339   \infirstlevel \bfafterword
5340 }
5341 \def\clnr{%
5342   {\parenfont)}%
5343   \infirstlevel \sl
5344   \global\advance\parencount by -1
5345 }
5346
5347 \newcount\brackcount
5348 \def\lbrb{%
5349   \global\advance\brackcount by 1
5350   {\bf[}%
5351 }
5352 \def\rbrb{%
5353   {\bf]}%
5354   \global\advance\brackcount by -1
5355 }
5356
5357 \def\checkparencounts{%
5358   \ifnum\parencount=0 \else \badparencount \fi
5359   \ifnum\brackcount=0 \else \badbrackcount \fi
5360 }
5361 \def\badparencount{%
5362   \errmessage{Unbalanced parentheses in @def}%
5363   \global\parencount=0
5364 }
5365 \def\badbrackcount{%
5366   \errmessage{Unbalanced square braces in @def}%
5367   \global\brackcount=0
5368 }
5369
5370
5371 \message{macros,}
5372 % @macro.
5373
5374 % To do this right we need a feature of e-TeX, \scantokens,
5375 % which we arrange to emulate with a temporary file in ordinary TeX.
5376 \ifx\eTeXversion\undefined
5377  \newwrite\macscribble
5378  \def\scanmacro#1{%
5379    \begingroup \newlinechar`\^^M
5380    % Undo catcode changes of \startcontents and \doprintindex
5381    \catcode`\@=0 \catcode`\\=\other \escapechar=`\@
5382    % Append \endinput to make sure that TeX does not see the ending newline.
5383    \toks0={#1\endinput}%
5384    \immediate\openout\macscribble=\jobname.tmp
5385    \immediate\write\macscribble{\the\toks0}%
5386    \immediate\closeout\macscribble
5387    \let\xeatspaces\eatspaces
5388    \input \jobname.tmp
5389    \endgroup
5390 }
5391 \else
5392 \def\scanmacro#1{%
5393 \begingroup \newlinechar`\^^M
5394 % Undo catcode changes of \startcontents and \doprintindex
5395 \catcode`\@=0 \catcode`\\=\other \escapechar=`\@
5396 \let\xeatspaces\eatspaces\scantokens{#1\endinput}\endgroup}
5397 \fi
5398
5399 \newcount\paramno   % Count of parameters
5400 \newtoks\macname    % Macro name
5401 \newif\ifrecursive  % Is it recursive?
5402 \def\macrolist{}    % List of all defined macros in the form
5403                     % \do\macro1\do\macro2...
5404
5405 % Utility routines.
5406 % Thisdoes \let #1 = #2, except with \csnames.
5407 \def\cslet#1#2{%
5408 \expandafter\expandafter
5409 \expandafter\let
5410 \expandafter\expandafter
5411 \csname#1\endcsname
5412 \csname#2\endcsname}
5413
5414 % Trim leading and trailing spaces off a string.
5415 % Concepts from aro-bend problem 15 (see CTAN).
5416 {\catcode`\@=11
5417 \gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }}
5418 \gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@}
5419 \gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @}
5420 \def\unbrace#1{#1}
5421 \unbrace{\gdef\trim@@@ #1 } #2@{#1}
5422 }
5423
5424 % Trim a single trailing ^^M off a string.
5425 {\catcode`\^^M=\other \catcode`\Q=3%
5426 \gdef\eatcr #1{\eatcra #1Q^^MQ}%
5427 \gdef\eatcra#1^^MQ{\eatcrb#1Q}%
5428 \gdef\eatcrb#1Q#2Q{#1}%
5429 }
5430
5431 % Macro bodies are absorbed as an argument in a context where
5432 % all characters are catcode 10, 11 or 12, except \ which is active
5433 % (as in normal texinfo). It is necessary to change the definition of \.
5434
5435 % It's necessary to have hard CRs when the macro is executed. This is
5436 % done by  making ^^M (\endlinechar) catcode 12 when reading the macro
5437 % body, and then making it the \newlinechar in \scanmacro.
5438
5439 \def\macrobodyctxt{%
5440   \catcode`\~=\other
5441   \catcode`\^=\other
5442   \catcode`\_=\other
5443   \catcode`\|=\other
5444   \catcode`\<=\other
5445   \catcode`\>=\other
5446   \catcode`\+=\other
5447   \catcode`\{=\other
5448   \catcode`\}=\other
5449   \catcode`\@=\other
5450   \catcode`\^^M=\other
5451   \usembodybackslash}
5452
5453 \def\macroargctxt{%
5454   \catcode`\~=\other
5455   \catcode`\^=\other
5456   \catcode`\_=\other
5457   \catcode`\|=\other
5458   \catcode`\<=\other
5459   \catcode`\>=\other
5460   \catcode`\+=\other
5461   \catcode`\@=\other
5462   \catcode`\\=\other}
5463
5464 % \mbodybackslash is the definition of \ in @macro bodies.
5465 % It maps \foo\ => \csname macarg.foo\endcsname => #N
5466 % where N is the macro parameter number.
5467 % We define \csname macarg.\endcsname to be \realbackslash, so
5468 % \\ in macro replacement text gets you a backslash.
5469
5470 {\catcode`@=0 @catcode`@\=@active
5471  @gdef@usembodybackslash{@let\=@mbodybackslash}
5472  @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname}
5473 }
5474 \expandafter\def\csname macarg.\endcsname{\realbackslash}
5475
5476 \def\macro{\recursivefalse\parsearg\macroxxx}
5477 \def\rmacro{\recursivetrue\parsearg\macroxxx}
5478
5479 \def\macroxxx#1{%
5480   \getargs{#1}%           now \macname is the macname and \argl the arglist
5481   \ifx\argl\empty       % no arguments
5482      \paramno=0%
5483   \else
5484      \expandafter\parsemargdef \argl;%
5485   \fi
5486   \if1\csname ismacro.\the\macname\endcsname
5487      \message{Warning: redefining \the\macname}%
5488   \else
5489      \expandafter\ifx\csname \the\macname\endcsname \relax
5490      \else \errmessage{Macro name \the\macname\space already defined}\fi
5491      \global\cslet{macsave.\the\macname}{\the\macname}%
5492      \global\expandafter\let\csname ismacro.\the\macname\endcsname=1%
5493      % Add the macroname to \macrolist
5494      \toks0 = \expandafter{\macrolist\do}%
5495      \xdef\macrolist{\the\toks0
5496        \expandafter\noexpand\csname\the\macname\endcsname}%
5497   \fi
5498   \begingroup \macrobodyctxt
5499   \ifrecursive \expandafter\parsermacbody
5500   \else \expandafter\parsemacbody
5501   \fi}
5502
5503 \defparsearg\unmacro{%
5504   \if1\csname ismacro.#1\endcsname
5505     \global\cslet{#1}{macsave.#1}%
5506     \global\expandafter\let \csname ismacro.#1\endcsname=0%
5507     % Remove the macro name from \macrolist:
5508     \begingroup
5509       \expandafter\let\csname#1\endcsname \relax
5510       \let\do\unmacrodo
5511       \xdef\macrolist{\macrolist}%
5512     \endgroup
5513   \else
5514     \errmessage{Macro #1 not defined}%
5515   \fi
5516 }
5517
5518 % Called by \do from \dounmacro on each macro.  The idea is to omit any
5519 % macro definitions that have been changed to \relax.
5520 %
5521 \def\unmacrodo#1{%
5522   \ifx#1\relax
5523     % remove this
5524   \else
5525     \noexpand\do \noexpand #1%
5526   \fi
5527 }
5528
5529 % This makes use of the obscure feature that if the last token of a
5530 % <parameter list> is #, then the preceding argument is delimited by
5531 % an opening brace, and that opening brace is not consumed.
5532 \def\getargs#1{\getargsxxx#1{}}
5533 \def\getargsxxx#1#{\getmacname #1 \relax\getmacargs}
5534 \def\getmacname #1 #2\relax{\macname={#1}}
5535 \def\getmacargs#1{\def\argl{#1}}
5536
5537 % Parse the optional {params} list.  Set up \paramno and \paramlist
5538 % so \defmacro knows what to do.  Define \macarg.blah for each blah
5539 % in the params list, to be ##N where N is the position in that list.
5540 % That gets used by \mbodybackslash (above).
5541
5542 % We need to get `macro parameter char #' into several definitions.
5543 % The technique used is stolen from LaTeX:  let \hash be something
5544 % unexpandable, insert that wherever you need a #, and then redefine
5545 % it to # just before using the token list produced.
5546 %
5547 % The same technique is used to protect \eatspaces till just before
5548 % the macro is used.
5549
5550 \def\parsemargdef#1;{\paramno=0\def\paramlist{}%
5551         \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,}
5552 \def\parsemargdefxxx#1,{%
5553   \if#1;\let\next=\relax
5554   \else \let\next=\parsemargdefxxx
5555     \advance\paramno by 1%
5556     \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname
5557         {\xeatspaces{\hash\the\paramno}}%
5558     \edef\paramlist{\paramlist\hash\the\paramno,}%
5559   \fi\next}
5560
5561 % These two commands read recursive and nonrecursive macro bodies.
5562 % (They're different since rec and nonrec macros end differently.)
5563
5564 \long\def\parsemacbody#1@end macro%
5565 {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
5566 \long\def\parsermacbody#1@end rmacro%
5567 {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
5568
5569 % This defines the macro itself. There are six cases: recursive and
5570 % nonrecursive macros of zero, one, and many arguments.
5571 % Much magic with \expandafter here.
5572 % \xdef is used so that macro definitions will survive the file
5573 % they're defined in; @include reads the file inside a group.
5574 \def\defmacro{%
5575   \let\hash=##% convert placeholders to macro parameter chars
5576   \ifrecursive
5577     \ifcase\paramno
5578     % 0
5579       \expandafter\xdef\csname\the\macname\endcsname{%
5580         \noexpand\scanmacro{\temp}}%
5581     \or % 1
5582       \expandafter\xdef\csname\the\macname\endcsname{%
5583          \bgroup\noexpand\macroargctxt
5584          \noexpand\braceorline
5585          \expandafter\noexpand\csname\the\macname xxx\endcsname}%
5586       \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
5587          \egroup\noexpand\scanmacro{\temp}}%
5588     \else % many
5589       \expandafter\xdef\csname\the\macname\endcsname{%
5590          \bgroup\noexpand\macroargctxt
5591          \noexpand\csname\the\macname xx\endcsname}%
5592       \expandafter\xdef\csname\the\macname xx\endcsname##1{%
5593           \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
5594       \expandafter\expandafter
5595       \expandafter\xdef
5596       \expandafter\expandafter
5597         \csname\the\macname xxx\endcsname
5598           \paramlist{\egroup\noexpand\scanmacro{\temp}}%
5599     \fi
5600   \else
5601     \ifcase\paramno
5602     % 0
5603       \expandafter\xdef\csname\the\macname\endcsname{%
5604         \noexpand\norecurse{\the\macname}%
5605         \noexpand\scanmacro{\temp}\egroup}%
5606     \or % 1
5607       \expandafter\xdef\csname\the\macname\endcsname{%
5608          \bgroup\noexpand\macroargctxt
5609          \noexpand\braceorline
5610          \expandafter\noexpand\csname\the\macname xxx\endcsname}%
5611       \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
5612         \egroup
5613         \noexpand\norecurse{\the\macname}%
5614         \noexpand\scanmacro{\temp}\egroup}%
5615     \else % many
5616       \expandafter\xdef\csname\the\macname\endcsname{%
5617          \bgroup\noexpand\macroargctxt
5618          \expandafter\noexpand\csname\the\macname xx\endcsname}%
5619       \expandafter\xdef\csname\the\macname xx\endcsname##1{%
5620           \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
5621       \expandafter\expandafter
5622       \expandafter\xdef
5623       \expandafter\expandafter
5624       \csname\the\macname xxx\endcsname
5625       \paramlist{%
5626           \egroup
5627           \noexpand\norecurse{\the\macname}%
5628           \noexpand\scanmacro{\temp}\egroup}%
5629     \fi
5630   \fi}
5631
5632 \def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
5633
5634 % \braceorline decides whether the next nonwhitespace character is a
5635 % {.  If so it reads up to the closing }, if not, it reads the whole
5636 % line.  Whatever was read is then fed to the next control sequence
5637 % as an argument (by \parsebrace or \parsearg)
5638 \def\braceorline#1{\let\next=#1\futurelet\nchar\braceorlinexxx}
5639 \def\braceorlinexxx{%
5640   \ifx\nchar\bgroup\else
5641     \expandafter\parsearg
5642   \fi \next}
5643
5644 % We mant to disable all macros during \shipout so that they are not
5645 % expanded by \write.
5646 \def\turnoffmacros{\begingroup \def\do##1{\let\noexpand##1=\relax}%
5647   \edef\next{\macrolist}\expandafter\endgroup\next}
5648
5649
5650 % @alias.
5651 % We need some trickery to remove the optional spaces around the equal
5652 % sign.  Just make them active and then expand them all to nothing.
5653 \def\alias{\parseargusing\obeyspaces\aliasxxx}
5654 \def\aliasxxx #1{\aliasyyy#1\relax}
5655 \def\aliasyyy #1=#2\relax{%
5656   {%
5657     \expandafter\let\obeyedspace=\empty
5658     \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}%
5659   }%
5660   \next
5661 }
5662
5663
5664 \message{cross references,}
5665
5666 \newwrite\auxfile
5667
5668 \newif\ifhavexrefs    % True if xref values are known.
5669 \newif\ifwarnedxrefs  % True if we warned once that they aren't known.
5670
5671 % @inforef is relatively simple.
5672 \def\inforef #1{\inforefzzz #1,,,,**}
5673 \def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
5674   node \samp{\ignorespaces#1{}}}
5675
5676 % @node's only job in TeX is to define \lastnode, which is used in
5677 % cross-references.
5678 \defparsearg\node{\ENVcheck\nodexxx #1,\finishnodeparse}
5679 \def\nodexxx#1,#2\finishnodeparse{\gdef\lastnode{#1}}
5680 \let\nwnode=\node
5681 \let\lastnode=\empty
5682
5683 % Write a cross-reference definition for the current node.  #1 is the
5684 % type (Ynumbered, Yappendix, Ynothing).
5685
5686 \def\donoderef#1{%
5687   \ifx\lastnode\empty\else
5688     \setref{\lastnode}{#1}%
5689     \global\let\lastnode=\empty
5690   \fi
5691 }
5692
5693 % @anchor{NAME} -- define xref target at arbitrary point.
5694 %
5695 \newcount\savesfregister
5696 %
5697 \gdef\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
5698 \gdef\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
5699 \gdef\anchor#1{%
5700   \savesf
5701   \setref{#1}{Ynothing}%
5702   \restoresf
5703   \ignorespaces
5704 }
5705
5706 % \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an
5707 % anchor), which consists of three parts:
5708 % 1) NAME-title - the current sectioning name, taken from \thissection;
5709 % 2) NAME-snt   - section number and type, defined as the SNT arg;
5710 % 3) NAME-pg    - the page number.
5711 % This is called from \donoderef, \anchor, and \dofloat.
5712
5713 % We take care not to fully expand the title, since it may contain
5714 % arbitrary macros.
5715 %
5716 % Use \turnoffactive so that punctuation chars such as underscore
5717 % and backslash work in node names.
5718 %
5719 \def\setref#1#2{%
5720   \pdfmkdest{#1}%
5721   \iflinks
5722     {%
5723       \turnoffactive
5724       \edef\writexrdef##1##2{%
5725         \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef
5726           ##1}{##2}}% these are parameters of \writexrdef
5727       }%
5728       \toks0 = \expandafter{\thissection}%
5729       \immediate \writexrdef{title}{\the\toks0 }%
5730       \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc.
5731       \writexrdef{pg}{\folio}% will be written later, during \shipout
5732     }%
5733   \fi
5734 }
5735
5736 % @xref, @pxref, and @ref generate cross-references.  For \xrefX, #1 is
5737 % the node name, #2 the name of the Info cross-reference, #3 the printed
5738 % node name, #4 the name of the Info file, #5 the name of the printed
5739 % manual.  All but the node name can be omitted.
5740 %
5741 \def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]}
5742 \def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]}
5743 \def\ref#1{\xrefX[#1,,,,,,,]}
5744 \def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
5745   \unsepspaces
5746   \def\printedmanual{\ignorespaces #5}%
5747   \def\printedrefname{\ignorespaces #3}%
5748   \setbox1=\hbox{\printedmanual\unskip}%
5749   \setbox0=\hbox{\printedrefname\unskip}%
5750   \ifdim \wd0 = 0pt
5751     % No printed node name was explicitly given.
5752     \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax
5753       % Use the node name inside the square brackets.
5754       \def\printedrefname{\ignorespaces #1}%
5755     \else
5756       % Use the actual chapter/section title appear inside
5757       % the square brackets.  Use the real section title if we have it.
5758       \ifdim \wd1 > 0pt
5759         % It is in another manual, so we don't have it.
5760         \def\printedrefname{\ignorespaces #1}%
5761       \else
5762         \ifhavexrefs
5763           % We know the real title if we have the xref values.
5764           \def\printedrefname{\refx{#1-title}{}}%
5765         \else
5766           % Otherwise just copy the Info node name.
5767           \def\printedrefname{\ignorespaces #1}%
5768         \fi%
5769       \fi
5770     \fi
5771   \fi
5772   %
5773   % Make link in pdf output.
5774   % 
5775   \ifpdf
5776     \leavevmode
5777     \getfilename{#4}%
5778     {\turnoffactive \otherbackslash
5779      \ifnum\filenamelength>0
5780        \startlink attr{/Border [0 0 0]}%
5781          goto file{\the\filename.pdf} name{#1}%
5782      \else
5783        \startlink attr{/Border [0 0 0]}%
5784          goto name{\pdfmkpgn{#1}}%
5785      \fi
5786     }%
5787     \linkcolor
5788   \fi
5789   %
5790   % Float references are printed completely differently: "Figure 1.2"
5791   % instead of "[somenode], p.3".  We distinguish them by the
5792   % LABEL-title being set to a magic string.
5793   \expandafter\ifx \csname X#1-title\endcsname \floatmagic
5794     % If the user specified the print name (third arg) to the ref,
5795     % print it instead of our usual "Figure 1.2".
5796     \ifdim\wd0 = 0pt
5797       \refx{#1-snt}%
5798     \else
5799       \printedrefname
5800     \fi
5801     %
5802     % if the user also gave the printed manual name (fifth arg), append
5803     % "in MANUALNAME". 
5804     \ifdim \wd1 > 0pt
5805       \space \putwordin{} \cite{\printedmanual}%
5806     \fi
5807   \else
5808   %
5809   % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not
5810   % insert empty discretionaries after hyphens, which means that it will
5811   % not find a line break at a hyphen in a node names.  Since some manuals
5812   % are best written with fairly long node names, containing hyphens, this
5813   % is a loss.  Therefore, we give the text of the node name again, so it
5814   % is as if TeX is seeing it for the first time.
5815   \ifdim \wd1 > 0pt
5816     \putwordsection{} ``\printedrefname'' \putwordin{} \cite{\printedmanual}%
5817   \else
5818     % _ (for example) has to be the character _ for the purposes of the
5819     % control sequence corresponding to the node, but it has to expand
5820     % into the usual \leavevmode...\vrule stuff for purposes of
5821     % printing. So we \turnoffactive for the \refx-snt, back on for the
5822     % printing, back off for the \refx-pg.
5823     {\turnoffactive \otherbackslash
5824      % Only output a following space if the -snt ref is nonempty; for
5825      % @unnumbered and @anchor, it won't be.
5826      \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
5827      \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
5828     }%
5829     % output the `[mynode]' via a macro.
5830     \xrefprintnodename\printedrefname
5831     %
5832     % But we always want a comma and a space:
5833     ,\space
5834     %
5835     % output the `page 3'.
5836     \turnoffactive \otherbackslash \putwordpage\tie\refx{#1-pg}{}%
5837   \fi
5838   \endlink
5839   \fi
5840 \endgroup}
5841
5842 % This macro is called from \xrefX for the `[nodename]' part of xref
5843 % output.  It's a separate macro only so it can be changed more easily,
5844 % since square brackets don't work well in some documents.  Particularly
5845 % one that Bob is working on :).
5846 %
5847 \def\xrefprintnodename#1{[#1]}
5848
5849 % Things referred to by \setref.
5850 %
5851 \def\Ynothing{}
5852 \def\Yomitfromtoc{}
5853 \def\Ynumbered{%
5854   \ifnum\secno=0
5855     \putwordChapter@tie \the\chapno
5856   \else \ifnum\subsecno=0
5857     \putwordSection@tie \the\chapno.\the\secno
5858   \else \ifnum\subsubsecno=0
5859     \putwordSection@tie \the\chapno.\the\secno.\the\subsecno
5860   \else
5861     \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno
5862   \fi\fi\fi
5863 }
5864 \def\Yappendix{%
5865   \ifnum\secno=0
5866      \putwordAppendix@tie @char\the\appendixno{}%
5867   \else \ifnum\subsecno=0
5868      \putwordSection@tie @char\the\appendixno.\the\secno
5869   \else \ifnum\subsubsecno=0
5870     \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno
5871   \else
5872     \putwordSection@tie
5873       @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno
5874   \fi\fi\fi
5875 }
5876
5877 % Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME.
5878 % If its value is nonempty, SUFFIX is output afterward.
5879 %
5880 \def\refx#1#2{%
5881   {%
5882     \indexnofonts
5883     \otherbackslash
5884     \expandafter\global\expandafter\let\expandafter\thisrefX
5885       \csname X#1\endcsname
5886   }%
5887   \ifx\thisrefX\relax
5888     % If not defined, say something at least.
5889     \angleleft un\-de\-fined\angleright
5890     \iflinks
5891       \ifhavexrefs
5892         \message{\linenumber Undefined cross reference `#1'.}%
5893       \else
5894         \ifwarnedxrefs\else
5895           \global\warnedxrefstrue
5896           \message{Cross reference values unknown; you must run TeX again.}%
5897         \fi
5898       \fi
5899     \fi
5900   \else
5901     % It's defined, so just use it.
5902     \thisrefX
5903   \fi
5904   #2% Output the suffix in any case.
5905 }
5906
5907 % This is the macro invoked by entries in the aux file.
5908 %
5909 \def\xrdef#1{\expandafter\gdef\csname X#1\endcsname}
5910
5911 % Read the last existing aux file, if any.  No error if none exists.
5912 % Open the new one.
5913
5914 \def\readauxfile{\begingroup
5915   \catcode`\^^@=\other
5916   \catcode`\^^A=\other
5917   \catcode`\^^B=\other
5918   \catcode`\^^C=\other
5919   \catcode`\^^D=\other
5920   \catcode`\^^E=\other
5921   \catcode`\^^F=\other
5922   \catcode`\^^G=\other
5923   \catcode`\^^H=\other
5924   \catcode`\^^K=\other
5925   \catcode`\^^L=\other
5926   \catcode`\^^N=\other
5927   \catcode`\^^P=\other
5928   \catcode`\^^Q=\other
5929   \catcode`\^^R=\other
5930   \catcode`\^^S=\other
5931   \catcode`\^^T=\other
5932   \catcode`\^^U=\other
5933   \catcode`\^^V=\other
5934   \catcode`\^^W=\other
5935   \catcode`\^^X=\other
5936   \catcode`\^^Z=\other
5937   \catcode`\^^[=\other
5938   \catcode`\^^\=\other
5939   \catcode`\^^]=\other
5940   \catcode`\^^^=\other
5941   \catcode`\^^_=\other
5942   % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc.
5943   % in xref tags, i.e., node names.  But since ^^e4 notation isn't
5944   % supported in the main text, it doesn't seem desirable.  Furthermore,
5945   % that is not enough: for node names that actually contain a ^
5946   % character, we would end up writing a line like this: 'xrdef {'hat
5947   % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first
5948   % argument, and \hat is not an expandable control sequence.  It could
5949   % all be worked out, but why?  Either we support ^^ or we don't.
5950   %
5951   % The other change necessary for this was to define \auxhat:
5952   % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter
5953   % and then to call \auxhat in \setq.
5954   %
5955   \catcode`\^=\other
5956   %
5957   % Special characters.  Should be turned off anyway, but...
5958   \catcode`\~=\other
5959   \catcode`\[=\other
5960   \catcode`\]=\other
5961   \catcode`\"=\other
5962   \catcode`\_=\other
5963   \catcode`\|=\other
5964   \catcode`\<=\other
5965   \catcode`\>=\other
5966   \catcode`\$=\other
5967   \catcode`\#=\other
5968   \catcode`\&=\other
5969   \catcode`\%=\other
5970   \catcode`+=\other % avoid \+ for paranoia even though we've turned it off
5971   %
5972   % Make the characters 128-255 be printing characters
5973   {%
5974     \count 1=128
5975     \def\loop{%
5976       \catcode\count 1=\other
5977       \advance\count 1 by 1
5978       \ifnum \count 1<256 \loop \fi
5979     }%
5980   }%
5981   %
5982   % Turn off \ as an escape so we do not lose on
5983   % entries which were dumped with control sequences in their names.
5984   % For example, @xrdef{$\leq $-fun}{page ...} made by @defun ^^
5985   % Reference to such entries still does not work the way one would wish,
5986   % but at least they do not bomb out when the aux file is read in.
5987   \catcode`\\=\other
5988   %
5989   % @ is our escape character in .aux files.
5990   \catcode`\{=1
5991   \catcode`\}=2
5992   \catcode`\@=0
5993   %
5994   \openin 1 \jobname.aux
5995   \ifeof 1 \else
5996     \closein 1
5997     \input \jobname.aux
5998     \global\havexrefstrue
5999   \fi
6000   % Open the new aux file right away (otherwise the \immediate's in
6001   % \setref cause spurious terminal output).  TeX will close it
6002   % automatically at exit.
6003   \immediate\openout\auxfile=\jobname.aux
6004 \endgroup}
6005
6006
6007 \message{insertions,}
6008 % including footnotes.
6009
6010 \newcount \footnoteno
6011
6012 % The trailing space in the following definition for supereject is
6013 % vital for proper filling; pages come out unaligned when you do a
6014 % pagealignmacro call if that space before the closing brace is
6015 % removed. (Generally, numeric constants should always be followed by a
6016 % space to prevent strange expansion errors.)
6017 \def\supereject{\par\penalty -20000\footnoteno =0 }
6018
6019 % @footnotestyle is meaningful for info output only.
6020 \let\footnotestyle=\comment
6021
6022 {\catcode `\@=11
6023 %
6024 % Auto-number footnotes.  Otherwise like plain.
6025 \gdef\footnote{%
6026   \let\indent=\ptexindent
6027   \let\noindent=\ptexnoindent
6028   \global\advance\footnoteno by \@ne
6029   \edef\thisfootno{$^{\the\footnoteno}$}%
6030   %
6031   % In case the footnote comes at the end of a sentence, preserve the
6032   % extra spacing after we do the footnote number.
6033   \let\@sf\empty
6034   \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi
6035   %
6036   % Remove inadvertent blank space before typesetting the footnote number.
6037   \unskip
6038   \thisfootno\@sf
6039   \dofootnote
6040 }%
6041
6042 % Don't bother with the trickery in plain.tex to not require the
6043 % footnote text as a parameter.  Our footnotes don't need to be so general.
6044 %
6045 % Oh yes, they do; otherwise, @ifset (and anything else that uses
6046 % \parseargline) fails inside footnotes because the tokens are fixed when
6047 % the footnote is read.  --karl, 16nov96.
6048 %
6049 \gdef\dofootnote{%
6050   \insert\footins\bgroup
6051   % We want to typeset this text as a normal paragraph, even if the
6052   % footnote reference occurs in (for example) a display environment.
6053   % So reset some parameters.
6054   \hsize=\pagewidth
6055   \interlinepenalty\interfootnotelinepenalty
6056   \splittopskip\ht\strutbox % top baseline for broken footnotes
6057   \splitmaxdepth\dp\strutbox
6058   \floatingpenalty\@MM
6059   \leftskip\z@skip
6060   \rightskip\z@skip
6061   \spaceskip\z@skip
6062   \xspaceskip\z@skip
6063   \parindent\defaultparindent
6064   %
6065   \smallfonts \rm
6066   %
6067   % Because we use hanging indentation in footnotes, a @noindent appears
6068   % to exdent this text, so make it be a no-op.  makeinfo does not use
6069   % hanging indentation so @noindent can still be needed within footnote
6070   % text after an @example or the like (not that this is good style).
6071   \let\noindent = \relax
6072   %
6073   % Hang the footnote text off the number.  Use \everypar in case the
6074   % footnote extends for more than one paragraph.
6075   \everypar = {\hang}%
6076   \textindent{\thisfootno}%
6077   %
6078   % Don't crash into the line above the footnote text.  Since this
6079   % expands into a box, it must come within the paragraph, lest it
6080   % provide a place where TeX can split the footnote.
6081   \footstrut
6082   \futurelet\next\fo@t
6083 }
6084 }%end \catcode `\@=11
6085
6086 % In case a @footnote appears in a vbox, save the footnote text and create
6087 % the real \insert just after the vbox finished.  Otherwise, the insertion
6088 % would be lost.
6089 % Similarily, if a @footnote appears inside an alignment, save the footnote
6090 % text to a box and make the \insert when a row of the table is finished.
6091 % And the same can be done for other insert classes.  --kasal, 16nov03.
6092
6093 % Replace the \insert primitive by a cheating macro.
6094 % Deeper inside, just make sure that the saved insertions are not spilled
6095 % out prematurely.
6096 %
6097 \def\startsavinginserts{%
6098   \ifx \insert\ptexinsert
6099     \let\insert\saveinsert
6100   \else
6101     \let\checkinserts\relax
6102   \fi
6103 }
6104
6105 % This \insert replacements works for both \insert\footins{xx} and
6106 % \insert\footins\bgroup xx\egroup, but it doesn't work for \insert27{xx}.
6107 %
6108 \def\saveinsert#1{%
6109   \edef\next{\noexpand\savetobox \makeSAVEname#1}%
6110   \afterassignment\next
6111   % swallow the left brace
6112   \let\temp =
6113 }
6114 \def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}}
6115 \def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1}
6116
6117 \def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi}
6118
6119 \def\placesaveins#1{%
6120   \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname
6121     {\box#1}%
6122 }
6123
6124 % eat @SAVE -- beware, all of them have catcode \other:
6125 {
6126   \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials  %  ;-)
6127   \gdef\gobblesave @SAVE{}
6128 }
6129
6130 % initialization:
6131 \def\newsaveins #1{%
6132   \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}%
6133   \next
6134 }
6135 \def\newsaveinsX #1{%
6136   \csname newbox\endcsname #1% \newbox cannot be pronounced, as it is outer
6137   \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts
6138     \checksaveins#1}%
6139 }
6140
6141 % initialize:
6142 \let\checkinserts\empty
6143 \newsaveins\footins
6144 \newsaveins\margin
6145
6146
6147 % @image.  We use the macros from epsf.tex to support this.
6148 % If epsf.tex is not installed and @image is used, we complain.
6149 %
6150 % Check for and read epsf.tex up front.  If we read it only at @image
6151 % time, we might be inside a group, and then its definitions would get
6152 % undone and the next image would fail.
6153 \openin 1 = epsf.tex
6154 \ifeof 1 \else
6155   \closein 1
6156   % Do not bother showing banner with epsf.tex v2.7k (available in
6157   % doc/epsf.tex and on ctan).
6158   \def\epsfannounce{\toks0 = }%
6159   \input epsf.tex
6160 \fi
6161 %
6162 % We will only complain once about lack of epsf.tex.
6163 \newif\ifwarnednoepsf
6164 \newhelp\noepsfhelp{epsf.tex must be installed for images to
6165   work.  It is also included in the Texinfo distribution, or you can get
6166   it from ftp://tug.org/tex/epsf.tex.}
6167 %
6168 \def\image#1{%
6169   \ifx\epsfbox\undefined
6170     \ifwarnednoepsf \else
6171       \errhelp = \noepsfhelp
6172       \errmessage{epsf.tex not found, images will be ignored}%
6173       \global\warnednoepsftrue
6174     \fi
6175   \else
6176     \imagexxx #1,,,,,\finish
6177   \fi
6178 }
6179 %
6180 % Arguments to @image:
6181 % #1 is (mandatory) image filename; we tack on .eps extension.
6182 % #2 is (optional) width, #3 is (optional) height.
6183 % #4 is (ignored optional) html alt text.
6184 % #5 is (ignored optional) extension.
6185 % #6 is just the usual extra ignored arg for parsing this stuff.
6186 \newif\ifimagevmode
6187 \def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup
6188   \catcode`\^^M = 5     % in case we're inside an example
6189   \normalturnoffactive  % allow _ et al. in names
6190   % If the image is by itself, center it.
6191   \ifvmode
6192     \imagevmodetrue
6193     \nobreak\bigskip
6194     % Usually we'll have text after the image which will insert
6195     % \parskip glue, so insert it here too to equalize the space
6196     % above and below.
6197     \nobreak\vskip\parskip
6198     \nobreak
6199     \line\bgroup\hss
6200   \fi
6201   %
6202   % Output the image.
6203   \ifpdf
6204     \dopdfimage{#1}{#2}{#3}%
6205   \else
6206     % \epsfbox itself resets \epsf?size at each figure.
6207     \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi
6208     \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi
6209     \epsfbox{#1.eps}%
6210   \fi
6211   %
6212   \ifimagevmode \hss \egroup \bigbreak \fi  % space after the image
6213 \endgroup}
6214
6215
6216 % @float FLOATTYPE,LOC ... @end float for displayed figures, tables, etc.
6217 % We don't actually implement floating yet, we just plop the float "here".
6218 % But it seemed the best name for the future.
6219
6220 \def\float{\parsearg\parsefloat}
6221 \def\parsefloat#1{\dofloat #1,,,\finish}
6222
6223 % #1 is the optional FLOATTYPE, the text label for this float, typically
6224 % "Figure", "Table", "Example", etc.  Can't contain commas.  If omitted,
6225 % this float will not be numbered and cannot be referred to.
6226
6227 % #2 is the optional xref label.  Also must be present for the float to
6228 % be referable.
6229
6230 % #3 is the optional positioning argument; for now, it is ignored.  It
6231 % will somehow specify the positions allowed to float to (here, top, bottom).
6232
6233 % We keep a separate counter for each FLOATTYPE, which we reset at each
6234 % chapter-level command.
6235 \let\resetallfloatnos=\empty
6236 %
6237 \def\dofloat#1,#2,#3,#4\finish{\vtop\bgroup
6238   \def\floattype{#1}%
6239   \def\floatlabel{#2}%
6240   \def\floatloc{#3}% we do nothing with this yet.
6241   % xx should we indent the whole thing? center it?
6242   % 
6243   % allow @[short]caption now.
6244   \let\thiscaption=\empty
6245   \def\caption##1{\def\thiscaption{##1}}%
6246   %
6247   \let\thisshortcaption=\empty
6248   \def\shortcaption##1{\def\thisshortcaption{##1}}%
6249   %
6250   \ifx\floattype\empty \else
6251     % For now, assume the FLOATTYPE is entirely letters, so we just use it
6252     % in a control sequence name literally.  We want each FLOATTYPE to be
6253     % numbered separately (Figure 1, Table 1, Figure 2, ...).
6254     \expandafter\let\expandafter\floatno\csname\floattype floatno\endcsname
6255     \ifx\floatno\relax
6256       % Haven't seen this figure type before, so need to define
6257       % the counter for it, and then redefine \floatno.
6258       \expandafter\innernewcount\csname\floattype floatno\endcsname
6259       \expandafter\let\expandafter\floatno\csname\floattype floatno\endcsname
6260       %
6261       % Remember to reset this floatno at the next chap.
6262       \toks0 = \expandafter{\resetallfloatnos}%
6263       \xdef\resetallfloatnos{\the\toks0 \makecsname{\floattype floatno}=0 }%
6264     \fi
6265     \global\advance\floatno by 1
6266     %
6267     \ifx\floatlabel\empty \else
6268       {%
6269         % This magic value for \thissection is output by \setref as the
6270         % XREFLABEL-title value.  \xrefX uses it to distinguish float
6271         % labels (which have a completely different output format) from
6272         % nodes and xref labels.
6273         % 
6274         \let\thissection=\floatmagic
6275         \setref{\floatlabel}{Yfloat}%
6276       }%
6277     \fi
6278   \fi
6279   %
6280   \def\Efloat{%
6281     % we have four possibilities:
6282     % @float Foo & @caption{Cap}: Foo 1.1: Cap
6283     % @float Foo & no caption:    Foo 1.1
6284     % @float & @caption{cap}:     Cap
6285     % @float & no caption:
6286     %
6287     \let\printedsomething = \empty
6288     %
6289     \ifx\floattype\empty \else
6290       \vskip.5\parskip  % space above caption
6291       %
6292       % Print the float number preceded by the chapter-level number
6293       % (empty in the case of unnumbered).  Although there are other
6294       % styles of float numbering, we hardwire this one.
6295       \floattype\space\chaplevelprefix\the\floatno
6296       \let\printedsomething = t%
6297     \fi
6298     %
6299     \ifx\thiscaption\empty \else
6300       \ifx\printedsomething\empty
6301         \vskip.5\parskip  % space above caption
6302       \else
6303         :\space  % had a number, so print a colon.
6304       \fi
6305       %
6306       % Print caption text.
6307       \thiscaption
6308       \let\printedsomething = t%
6309     \fi
6310     %
6311     % Space below caption, if we printed anything.
6312     \ifx\printedsomething\empty \else \vskip\parskip \fi
6313     %
6314     \egroup  % end of \vtop
6315   }%
6316 }
6317
6318 % \setref calls this to get the XREFLABEL-snt value.  We want an @xref
6319 % to the FLOATLABEL to expand to "Figure 3.1".  We call \setref when we
6320 % first read the @float command.
6321
6322 \def\Yfloat{\floattype @tie{}\chaplevelprefix\the\floatno}%
6323
6324 \def\floatmagic{!!float!!}
6325
6326 % @listoffloats FLOATTYPE - print a list of floats like a table of contents.
6327 \def\listoffloats{\parsearg\dolistoffloats}
6328 \def\dolistoffloats#1{%xx
6329 }
6330
6331 % Default definitions.
6332 \def\caption{\errmessage{@caption while not in @float environment}}
6333 \def\shortcaption{\errmessage{@shortcaption while not in @float environment}}
6334
6335
6336 \message{localization,}
6337 % and i18n.
6338
6339 % @documentlanguage is usually given very early, just after
6340 % @setfilename.  If done too late, it may not override everything
6341 % properly.  Single argument is the language abbreviation.
6342 % It would be nice if we could set up a hyphenation file here.
6343 %
6344 \defparsearg\documentlanguage{%
6345   \tex % read txi-??.tex file in plain TeX.
6346   % Read the file if it exists.
6347   \openin 1 txi-#1.tex
6348   \ifeof1
6349     \errhelp = \nolanghelp
6350     \errmessage{Cannot read language file txi-#1.tex}%
6351     \let\temp = \relax
6352   \else
6353     \def\temp{\input txi-#1.tex }%
6354   \fi
6355   \temp
6356   \endgroup
6357 }
6358 \newhelp\nolanghelp{The given language definition file cannot be found or
6359 is empty.  Maybe you need to install it?  In the current directory
6360 should work if nowhere else does.}
6361
6362
6363 % @documentencoding should change something in TeX eventually, most
6364 % likely, but for now just recognize it.
6365 \let\documentencoding = \comment
6366
6367
6368 % Page size parameters.
6369 %
6370 \newdimen\defaultparindent \defaultparindent = 15pt
6371
6372 \chapheadingskip = 15pt plus 4pt minus 2pt
6373 \secheadingskip = 12pt plus 3pt minus 2pt
6374 \subsecheadingskip = 9pt plus 2pt minus 2pt
6375
6376 % Prevent underfull vbox error messages.
6377 \vbadness = 10000
6378
6379 % Don't be so finicky about underfull hboxes, either.
6380 \hbadness = 2000
6381
6382 % Following George Bush, just get rid of widows and orphans.
6383 \widowpenalty=10000
6384 \clubpenalty=10000
6385
6386 % Use TeX 3.0's \emergencystretch to help line breaking, but if we're
6387 % using an old version of TeX, don't do anything.  We want the amount of
6388 % stretch added to depend on the line length, hence the dependence on
6389 % \hsize.  We call this whenever the paper size is set.
6390 %
6391 \def\setemergencystretch{%
6392   \ifx\emergencystretch\thisisundefined
6393     % Allow us to assign to \emergencystretch anyway.
6394     \def\emergencystretch{\dimen0}%
6395   \else
6396     \emergencystretch = .15\hsize
6397   \fi
6398 }
6399
6400 % Parameters in order: 1) textheight; 2) textwidth; 3) voffset;
6401 % 4) hoffset; 5) binding offset; 6) topskip; 7) physical page height; 8)
6402 % physical page width.
6403 %
6404 % We also call \setleading{\textleading}, so the caller should define
6405 % \textleading.  The caller should also set \parskip.
6406 %
6407 \def\internalpagesizes#1#2#3#4#5#6#7#8{%
6408   \voffset = #3\relax
6409   \topskip = #6\relax
6410   \splittopskip = \topskip
6411   %
6412   \vsize = #1\relax
6413   \advance\vsize by \topskip
6414   \outervsize = \vsize
6415   \advance\outervsize by 2\topandbottommargin
6416   \pageheight = \vsize
6417   %
6418   \hsize = #2\relax
6419   \outerhsize = \hsize
6420   \advance\outerhsize by 0.5in
6421   \pagewidth = \hsize
6422   %
6423   \normaloffset = #4\relax
6424   \bindingoffset = #5\relax
6425   %
6426   \ifpdf
6427     \pdfpageheight #7\relax
6428     \pdfpagewidth #8\relax
6429   \fi
6430   %
6431   \setleading{\textleading}
6432   %
6433   \parindent = \defaultparindent
6434   \setemergencystretch
6435 }
6436
6437 % @letterpaper (the default).
6438 \def\letterpaper{{\globaldefs = 1
6439   \parskip = 3pt plus 2pt minus 1pt
6440   \textleading = 13.2pt
6441   %
6442   % If page is nothing but text, make it come out even.
6443   \internalpagesizes{46\baselineskip}{6in}%
6444                     {\voffset}{.25in}%
6445                     {\bindingoffset}{36pt}%
6446                     {11in}{8.5in}%
6447 }}
6448
6449 % Use @smallbook to reset parameters for 7x9.5 (or so) format.
6450 \def\smallbook{{\globaldefs = 1
6451   \parskip = 2pt plus 1pt
6452   \textleading = 12pt
6453   %
6454   \internalpagesizes{7.5in}{5in}%
6455                     {\voffset}{.25in}%
6456                     {\bindingoffset}{16pt}%
6457                     {9.25in}{7in}%
6458   %
6459   \lispnarrowing = 0.3in
6460   \tolerance = 700
6461   \hfuzz = 1pt
6462   \contentsrightmargin = 0pt
6463   \defbodyindent = .5cm
6464 }}
6465
6466 % Use @afourpaper to print on European A4 paper.
6467 \def\afourpaper{{\globaldefs = 1
6468   \parskip = 3pt plus 2pt minus 1pt
6469   \textleading = 13.2pt
6470   %
6471   % Double-side printing via postscript on Laserjet 4050
6472   % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm.
6473   % To change the settings for a different printer or situation, adjust
6474   % \normaloffset until the front-side and back-side texts align.  Then
6475   % do the same for \bindingoffset.  You can set these for testing in
6476   % your texinfo source file like this:
6477   % @tex
6478   % \global\normaloffset = -6mm
6479   % \global\bindingoffset = 10mm
6480   % @end tex
6481   \internalpagesizes{51\baselineskip}{160mm}
6482                     {\voffset}{\hoffset}%
6483                     {\bindingoffset}{44pt}%
6484                     {297mm}{210mm}%
6485   %
6486   \tolerance = 700
6487   \hfuzz = 1pt
6488   \contentsrightmargin = 0pt
6489   \defbodyindent = 5mm
6490 }}
6491
6492 % Use @afivepaper to print on European A5 paper.
6493 % From romildo@urano.iceb.ufop.br, 2 July 2000.
6494 % He also recommends making @example and @lisp be small.
6495 \def\afivepaper{{\globaldefs = 1
6496   \parskip = 2pt plus 1pt minus 0.1pt
6497   \textleading = 12.5pt
6498   %
6499   \internalpagesizes{160mm}{120mm}%
6500                     {\voffset}{\hoffset}%
6501                     {\bindingoffset}{8pt}%
6502                     {210mm}{148mm}%
6503   %
6504   \lispnarrowing = 0.2in
6505   \tolerance = 800
6506   \hfuzz = 1.2pt
6507   \contentsrightmargin = 0pt
6508   \defbodyindent = 2mm
6509   \tableindent = 12mm
6510 }}
6511
6512 % A specific text layout, 24x15cm overall, intended for A4 paper.
6513 \def\afourlatex{{\globaldefs = 1
6514   \afourpaper
6515   \internalpagesizes{237mm}{150mm}%
6516                     {\voffset}{4.6mm}%
6517                     {\bindingoffset}{7mm}%
6518                     {297mm}{210mm}%
6519   %
6520   % Must explicitly reset to 0 because we call \afourpaper.
6521   \globaldefs = 0
6522 }}
6523
6524 % Use @afourwide to print on A4 paper in landscape format.
6525 \def\afourwide{{\globaldefs = 1
6526   \afourpaper
6527   \internalpagesizes{241mm}{165mm}%
6528                     {\voffset}{-2.95mm}%
6529                     {\bindingoffset}{7mm}%
6530                     {297mm}{210mm}%
6531   \globaldefs = 0
6532 }}
6533
6534 % @pagesizes TEXTHEIGHT[,TEXTWIDTH]
6535 % Perhaps we should allow setting the margins, \topskip, \parskip,
6536 % and/or leading, also. Or perhaps we should compute them somehow.
6537 %
6538 \defparsearg\pagesizes{\pagesizesyyy #1,,\finish}
6539 \def\pagesizesyyy#1,#2,#3\finish{{%
6540   \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
6541   \globaldefs = 1
6542   %
6543   \parskip = 3pt plus 2pt minus 1pt
6544   \setleading{\textleading}%
6545   %
6546   \dimen0 = #1
6547   \advance\dimen0 by \voffset
6548   %
6549   \dimen2 = \hsize
6550   \advance\dimen2 by \normaloffset
6551   %
6552   \internalpagesizes{#1}{\hsize}%
6553                     {\voffset}{\normaloffset}%
6554                     {\bindingoffset}{44pt}%
6555                     {\dimen0}{\dimen2}%
6556 }}
6557
6558 % Set default to letter.
6559 %
6560 \letterpaper
6561
6562
6563 \message{and turning on texinfo input format.}
6564
6565 % Define macros to output various characters with catcode for normal text.
6566 \catcode`\"=\other
6567 \catcode`\~=\other
6568 \catcode`\^=\other
6569 \catcode`\_=\other
6570 \catcode`\|=\other
6571 \catcode`\<=\other
6572 \catcode`\>=\other
6573 \catcode`\+=\other
6574 \catcode`\$=\other
6575 \def\normaldoublequote{"}
6576 \def\normaltilde{~}
6577 \def\normalcaret{^}
6578 \def\normalunderscore{_}
6579 \def\normalverticalbar{|}
6580 \def\normalless{<}
6581 \def\normalgreater{>}
6582 \def\normalplus{+}
6583 \def\normaldollar{$}%$ font-lock fix
6584
6585 % This macro is used to make a character print one way in ttfont
6586 % where it can probably just be output, and another way in other fonts,
6587 % where something hairier probably needs to be done.
6588 %
6589 % #1 is what to print if we are indeed using \tt; #2 is what to print
6590 % otherwise.  Since all the Computer Modern typewriter fonts have zero
6591 % interword stretch (and shrink), and it is reasonable to expect all
6592 % typewriter fonts to have this, we can check that font parameter.
6593 %
6594 \def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi}
6595
6596 % Same as above, but check for italic font.  Actually this also catches
6597 % non-italic slanted fonts since it is impossible to distinguish them from
6598 % italic fonts.  But since this is only used by $ and it uses \sl anyway
6599 % this is not a problem.
6600 \def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi}
6601
6602 % Turn off all special characters except @
6603 % (and those which the user can use as if they were ordinary).
6604 % Most of these we simply print from the \tt font, but for some, we can
6605 % use math or other variants that look better in normal text.
6606
6607 \catcode`\"=\active
6608 \def\activedoublequote{{\tt\char34}}
6609 \let"=\activedoublequote
6610 \catcode`\~=\active
6611 \def~{{\tt\char126}}
6612 \chardef\hat=`\^
6613 \catcode`\^=\active
6614 \def^{{\tt \hat}}
6615
6616 \catcode`\_=\active
6617 \def_{\ifusingtt\normalunderscore\_}
6618 % Subroutine for the previous macro.
6619 \def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }
6620
6621 \catcode`\|=\active
6622 \def|{{\tt\char124}}
6623 \chardef \less=`\<
6624 \catcode`\<=\active
6625 \def<{{\tt \less}}
6626 \chardef \gtr=`\>
6627 \catcode`\>=\active
6628 \def>{{\tt \gtr}}
6629 \catcode`\+=\active
6630 \def+{{\tt \char 43}}
6631 \catcode`\$=\active
6632 \def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix
6633
6634 % If a .fmt file is being used, characters that might appear in a file
6635 % name cannot be active until we have parsed the command line.
6636 % So turn them off again, and have \everyjob (or @setfilename) turn them on.
6637 % \otherifyactive is called near the end of this file.
6638 \def\otherifyactive{\catcode`+=\other \catcode`\_=\other}
6639
6640 \catcode`\@=0
6641
6642 % \rawbackslashxx outputs one backslash character in current font,
6643 % as in \char`\\.
6644 \global\chardef\rawbackslashxx=`\\
6645
6646 % \rawbackslash defines an active \ to do \rawbackslashxx.
6647 % \otherbackslash defines an active \ to be a literal `\' character with
6648 % catcode other.
6649 {\catcode`\\=\active
6650  @gdef@rawbackslash{@let\=@rawbackslashxx}
6651  @gdef@otherbackslash{@let\=@realbackslash}
6652 }
6653
6654 % \realbackslash is an actual character `\' with catcode other.
6655 {\catcode`\\=\other @gdef@realbackslash{\}}
6656
6657 % \normalbackslash outputs one backslash in fixed width font.
6658 \def\normalbackslash{{\tt\rawbackslashxx}}
6659
6660 \catcode`\\=\active
6661
6662 % Used sometimes to turn off (effectively) the active characters
6663 % even after parsing them.
6664 @def@turnoffactive{%
6665   @let"=@normaldoublequote
6666   @let\=@realbackslash
6667   @let~=@normaltilde
6668   @let^=@normalcaret
6669   @let_=@normalunderscore
6670   @let|=@normalverticalbar
6671   @let<=@normalless
6672   @let>=@normalgreater
6673   @let+=@normalplus
6674   @let$=@normaldollar %$ font-lock fix
6675   @unsepspaces
6676 }
6677
6678 % Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of
6679 % the literal character `\'.  (Thus, \ is not expandable when this is in
6680 % effect.)
6681 %
6682 @def@normalturnoffactive{@turnoffactive @let\=@normalbackslash}
6683
6684 % Make _ and + \other characters, temporarily.
6685 % This is canceled by @fixbackslash.
6686 @otherifyactive
6687
6688 % If a .fmt file is being used, we don't want the `\input texinfo' to show up.
6689 % That is what \eatinput is for; after that, the `\' should revert to printing
6690 % a backslash.
6691 %
6692 @gdef@eatinput input texinfo{@fixbackslash}
6693 @global@let\ = @eatinput
6694
6695 % On the other hand, perhaps the file did not have a `\input texinfo'. Then
6696 % the first `\{ in the file would cause an error. This macro tries to fix
6697 % that, assuming it is called before the first `\' could plausibly occur.
6698 % Also back turn on active characters that might appear in the input
6699 % file name, in case not using a pre-dumped format.
6700 %
6701 @gdef@fixbackslash{%
6702   @ifx\@eatinput @let\ = @normalbackslash @fi
6703   @catcode`+=@active
6704   @catcode`@_=@active
6705 }
6706
6707 % Say @foo, not \foo, in error messages.
6708 @escapechar = `@@
6709
6710 % These look ok in all fonts, so just make them not special.
6711 @catcode`@& = @other
6712 @catcode`@# = @other
6713 @catcode`@% = @other
6714
6715 @c Set initial fonts.
6716 @textfonts
6717 @rm
6718
6719
6720 @c Local variables:
6721 @c eval: (add-hook 'write-file-hooks 'time-stamp)
6722 @c page-delimiter: "^\\\\message"
6723 @c time-stamp-start: "def\\\\texinfoversion{"
6724 @c time-stamp-format: "%:y-%02m-%02d.%02H"
6725 @c time-stamp-end: "}"
6726 @c End:
6727
6728 @c vim:sw=2:
6729
6730 @ignore
6731    arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115
6732 @end ignore