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