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