7b943897de209b691a162dcc8cae3f37ca6a7d7e
[debian/tar] / build-aux / 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{2011-02-24.09}
7 %
8 % Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
9 % 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
10 % 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
11 %
12 % This texinfo.tex file is free software: you can redistribute it and/or
13 % modify it under the terms of the GNU General Public License as
14 % published by the Free Software Foundation, either version 3 of the
15 % License, or (at your option) any later version.
16 %
17 % This texinfo.tex file is distributed in the hope that it will be
18 % useful, but WITHOUT ANY WARRANTY; without even the implied warranty
19 % of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20 % General Public License for more details.
21 %
22 % You should have received a copy of the GNU General Public License
23 % along with this program.  If not, see <http://www.gnu.org/licenses/>.
24 %
25 % As a special exception, when this file is read by TeX when processing
26 % a Texinfo source document, you may use the result without
27 % restriction.  (This has been our intent since Texinfo was invented.)
28 %
29 % Please try the latest version of texinfo.tex before submitting bug
30 % reports; you can get the latest version from:
31 %   http://www.gnu.org/software/texinfo/ (the Texinfo home page), or
32 %   ftp://tug.org/tex/texinfo.tex
33 %     (and all CTAN mirrors, see http://www.ctan.org).
34 % The texinfo.tex in any given distribution could well be out
35 % of date, so if that's what you're using, please check.
36 %
37 % Send bug reports to bug-texinfo@gnu.org.  Please include including a
38 % complete document in each bug report with which we can reproduce the
39 % problem.  Patches are, of course, greatly appreciated.
40 %
41 % To process a Texinfo manual with TeX, it's most reliable to use the
42 % texi2dvi shell script that comes with the distribution.  For a simple
43 % manual foo.texi, however, you can get away with this:
44 %   tex foo.texi
45 %   texindex foo.??
46 %   tex foo.texi
47 %   tex foo.texi
48 %   dvips foo.dvi -o  # or whatever; this makes foo.ps.
49 % The extra TeX runs get the cross-reference information correct.
50 % Sometimes one run after texindex suffices, and sometimes you need more
51 % than two; texi2dvi does it as many times as necessary.
52 %
53 % It is possible to adapt texinfo.tex for other languages, to some
54 % extent.  You can get the existing language-specific files from the
55 % full Texinfo distribution.
56 %
57 % The GNU Texinfo home page is http://www.gnu.org/software/texinfo.
58
59
60 \message{Loading texinfo [version \texinfoversion]:}
61
62 % If in a .fmt file, print the version number
63 % and turn on active characters that we couldn't do earlier because
64 % they might have appeared in the input file name.
65 \everyjob{\message{[Texinfo version \texinfoversion]}%
66   \catcode`+=\active \catcode`\_=\active}
67
68 \chardef\other=12
69
70 % We never want plain's \outer definition of \+ in Texinfo.
71 % For @tex, we can use \tabalign.
72 \let\+ = \relax
73
74 % Save some plain tex macros whose names we will redefine.
75 \let\ptexb=\b
76 \let\ptexbullet=\bullet
77 \let\ptexc=\c
78 \let\ptexcomma=\,
79 \let\ptexdot=\.
80 \let\ptexdots=\dots
81 \let\ptexend=\end
82 \let\ptexequiv=\equiv
83 \let\ptexexclam=\!
84 \let\ptexfootnote=\footnote
85 \let\ptexgtr=>
86 \let\ptexhat=^
87 \let\ptexi=\i
88 \let\ptexindent=\indent
89 \let\ptexinsert=\insert
90 \let\ptexlbrace=\{
91 \let\ptexless=<
92 \let\ptexnewwrite\newwrite
93 \let\ptexnoindent=\noindent
94 \let\ptexplus=+
95 \let\ptexraggedright=\raggedright
96 \let\ptexrbrace=\}
97 \let\ptexslash=\/
98 \let\ptexstar=\*
99 \let\ptext=\t
100 \let\ptextop=\top
101 {\catcode`\'=\active \global\let\ptexquoteright'}% active in plain's math mode
102
103 % If this character appears in an error message or help string, it
104 % starts a new line in the output.
105 \newlinechar = `^^J
106
107 % Use TeX 3.0's \inputlineno to get the line number, for better error
108 % messages, but if we're using an old version of TeX, don't do anything.
109 %
110 \ifx\inputlineno\thisisundefined
111   \let\linenumber = \empty % Pre-3.0.
112 \else
113   \def\linenumber{l.\the\inputlineno:\space}
114 \fi
115
116 % Set up fixed words for English if not already set.
117 \ifx\putwordAppendix\undefined  \gdef\putwordAppendix{Appendix}\fi
118 \ifx\putwordChapter\undefined   \gdef\putwordChapter{Chapter}\fi
119 \ifx\putwordfile\undefined      \gdef\putwordfile{file}\fi
120 \ifx\putwordin\undefined        \gdef\putwordin{in}\fi
121 \ifx\putwordIndexIsEmpty\undefined       \gdef\putwordIndexIsEmpty{(Index is empty)}\fi
122 \ifx\putwordIndexNonexistent\undefined   \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi
123 \ifx\putwordInfo\undefined      \gdef\putwordInfo{Info}\fi
124 \ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi
125 \ifx\putwordMethodon\undefined  \gdef\putwordMethodon{Method on}\fi
126 \ifx\putwordNoTitle\undefined   \gdef\putwordNoTitle{No Title}\fi
127 \ifx\putwordof\undefined        \gdef\putwordof{of}\fi
128 \ifx\putwordon\undefined        \gdef\putwordon{on}\fi
129 \ifx\putwordpage\undefined      \gdef\putwordpage{page}\fi
130 \ifx\putwordsection\undefined   \gdef\putwordsection{section}\fi
131 \ifx\putwordSection\undefined   \gdef\putwordSection{Section}\fi
132 \ifx\putwordsee\undefined       \gdef\putwordsee{see}\fi
133 \ifx\putwordSee\undefined       \gdef\putwordSee{See}\fi
134 \ifx\putwordShortTOC\undefined  \gdef\putwordShortTOC{Short Contents}\fi
135 \ifx\putwordTOC\undefined       \gdef\putwordTOC{Table of Contents}\fi
136 %
137 \ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi
138 \ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi
139 \ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi
140 \ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi
141 \ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi
142 \ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi
143 \ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi
144 \ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi
145 \ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi
146 \ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi
147 \ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi
148 \ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi
149 %
150 \ifx\putwordDefmac\undefined    \gdef\putwordDefmac{Macro}\fi
151 \ifx\putwordDefspec\undefined   \gdef\putwordDefspec{Special Form}\fi
152 \ifx\putwordDefvar\undefined    \gdef\putwordDefvar{Variable}\fi
153 \ifx\putwordDefopt\undefined    \gdef\putwordDefopt{User Option}\fi
154 \ifx\putwordDeffunc\undefined   \gdef\putwordDeffunc{Function}\fi
155
156 % Since the category of space is not known, we have to be careful.
157 \chardef\spacecat = 10
158 \def\spaceisspace{\catcode`\ =\spacecat}
159
160 % sometimes characters are active, so we need control sequences.
161 \chardef\ampChar   = `\&
162 \chardef\colonChar = `\:
163 \chardef\commaChar = `\,
164 \chardef\dashChar  = `\-
165 \chardef\dotChar   = `\.
166 \chardef\exclamChar= `\!
167 \chardef\hashChar  = `\#
168 \chardef\lquoteChar= `\`
169 \chardef\questChar = `\?
170 \chardef\rquoteChar= `\'
171 \chardef\semiChar  = `\;
172 \chardef\slashChar = `\/
173 \chardef\underChar = `\_
174
175 % Ignore a token.
176 %
177 \def\gobble#1{}
178
179 % The following is used inside several \edef's.
180 \def\makecsname#1{\expandafter\noexpand\csname#1\endcsname}
181
182 % Hyphenation fixes.
183 \hyphenation{
184   Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script
185   ap-pen-dix bit-map bit-maps
186   data-base data-bases eshell fall-ing half-way long-est man-u-script
187   man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm
188   par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces
189   spell-ing spell-ings
190   stand-alone strong-est time-stamp time-stamps which-ever white-space
191   wide-spread wrap-around
192 }
193
194 % Margin to add to right of even pages, to left of odd pages.
195 \newdimen\bindingoffset
196 \newdimen\normaloffset
197 \newdimen\pagewidth \newdimen\pageheight
198
199 % For a final copy, take out the rectangles
200 % that mark overfull boxes (in case you have decided
201 % that the text looks ok even though it passes the margin).
202 %
203 \def\finalout{\overfullrule=0pt }
204
205 % Sometimes it is convenient to have everything in the transcript file
206 % and nothing on the terminal.  We don't just call \tracingall here,
207 % since that produces some useless output on the terminal.  We also make
208 % some effort to order the tracing commands to reduce output in the log
209 % file; cf. trace.sty in LaTeX.
210 %
211 \def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
212 \def\loggingall{%
213   \tracingstats2
214   \tracingpages1
215   \tracinglostchars2  % 2 gives us more in etex
216   \tracingparagraphs1
217   \tracingoutput1
218   \tracingmacros2
219   \tracingrestores1
220   \showboxbreadth\maxdimen \showboxdepth\maxdimen
221   \ifx\eTeXversion\thisisundefined\else % etex gives us more logging
222     \tracingscantokens1
223     \tracingifs1
224     \tracinggroups1
225     \tracingnesting2
226     \tracingassigns1
227   \fi
228   \tracingcommands3  % 3 gives us more in etex
229   \errorcontextlines16
230 }%
231
232 % add check for \lastpenalty to plain's definitions.  If the last thing
233 % we did was a \nobreak, we don't want to insert more space.
234 %
235 \def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount
236   \removelastskip\penalty-50\smallskip\fi\fi}
237 \def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount
238   \removelastskip\penalty-100\medskip\fi\fi}
239 \def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount
240   \removelastskip\penalty-200\bigskip\fi\fi}
241
242 % Do @cropmarks to get crop marks.
243 %
244 \newif\ifcropmarks
245 \let\cropmarks = \cropmarkstrue
246 %
247 % Dimensions to add cropmarks at corners.
248 % Added by P. A. MacKay, 12 Nov. 1986
249 %
250 \newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
251 \newdimen\cornerlong  \cornerlong=1pc
252 \newdimen\cornerthick \cornerthick=.3pt
253 \newdimen\topandbottommargin \topandbottommargin=.75in
254
255 % Output a mark which sets \thischapter, \thissection and \thiscolor.
256 % We dump everything together because we only have one kind of mark.
257 % This works because we only use \botmark / \topmark, not \firstmark.
258 %
259 % A mark contains a subexpression of the \ifcase ... \fi construct.
260 % \get*marks macros below extract the needed part using \ifcase.
261 %
262 % Another complication is to let the user choose whether \thischapter
263 % (\thissection) refers to the chapter (section) in effect at the top
264 % of a page, or that at the bottom of a page.  The solution is
265 % described on page 260 of The TeXbook.  It involves outputting two
266 % marks for the sectioning macros, one before the section break, and
267 % one after.  I won't pretend I can describe this better than DEK...
268 \def\domark{%
269   \toks0=\expandafter{\lastchapterdefs}%
270   \toks2=\expandafter{\lastsectiondefs}%
271   \toks4=\expandafter{\prevchapterdefs}%
272   \toks6=\expandafter{\prevsectiondefs}%
273   \toks8=\expandafter{\lastcolordefs}%
274   \mark{%
275                    \the\toks0 \the\toks2
276       \noexpand\or \the\toks4 \the\toks6
277     \noexpand\else \the\toks8
278   }%
279 }
280 % \topmark doesn't work for the very first chapter (after the title
281 % page or the contents), so we use \firstmark there -- this gets us
282 % the mark with the chapter defs, unless the user sneaks in, e.g.,
283 % @setcolor (or @url, or @link, etc.) between @contents and the very
284 % first @chapter.
285 \def\gettopheadingmarks{%
286   \ifcase0\topmark\fi
287   \ifx\thischapter\empty \ifcase0\firstmark\fi \fi
288 }
289 \def\getbottomheadingmarks{\ifcase1\botmark\fi}
290 \def\getcolormarks{\ifcase2\topmark\fi}
291
292 % Avoid "undefined control sequence" errors.
293 \def\lastchapterdefs{}
294 \def\lastsectiondefs{}
295 \def\prevchapterdefs{}
296 \def\prevsectiondefs{}
297 \def\lastcolordefs{}
298
299 % Main output routine.
300 \chardef\PAGE = 255
301 \output = {\onepageout{\pagecontents\PAGE}}
302
303 \newbox\headlinebox
304 \newbox\footlinebox
305
306 % \onepageout takes a vbox as an argument.  Note that \pagecontents
307 % does insertions, but you have to call it yourself.
308 \def\onepageout#1{%
309   \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi
310   %
311   \ifodd\pageno  \advance\hoffset by \bindingoffset
312   \else \advance\hoffset by -\bindingoffset\fi
313   %
314   % Do this outside of the \shipout so @code etc. will be expanded in
315   % the headline as they should be, not taken literally (outputting ''code).
316   \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi
317   \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}%
318   \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi
319   \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}%
320   %
321   {%
322     % Have to do this stuff outside the \shipout because we want it to
323     % take effect in \write's, yet the group defined by the \vbox ends
324     % before the \shipout runs.
325     %
326     \indexdummies         % don't expand commands in the output.
327     \normalturnoffactive  % \ in index entries must not stay \, e.g., if
328                % the page break happens to be in the middle of an example.
329                % We don't want .vr (or whatever) entries like this:
330                % \entry{{\tt \indexbackslash }acronym}{32}{\code {\acronym}}
331                % "\acronym" won't work when it's read back in;
332                % it needs to be
333                % {\code {{\tt \backslashcurfont }acronym}
334     \shipout\vbox{%
335       % Do this early so pdf references go to the beginning of the page.
336       \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi
337       %
338       \ifcropmarks \vbox to \outervsize\bgroup
339         \hsize = \outerhsize
340         \vskip-\topandbottommargin
341         \vtop to0pt{%
342           \line{\ewtop\hfil\ewtop}%
343           \nointerlineskip
344           \line{%
345             \vbox{\moveleft\cornerthick\nstop}%
346             \hfill
347             \vbox{\moveright\cornerthick\nstop}%
348           }%
349           \vss}%
350         \vskip\topandbottommargin
351         \line\bgroup
352           \hfil % center the page within the outer (page) hsize.
353           \ifodd\pageno\hskip\bindingoffset\fi
354           \vbox\bgroup
355       \fi
356       %
357       \unvbox\headlinebox
358       \pagebody{#1}%
359       \ifdim\ht\footlinebox > 0pt
360         % Only leave this space if the footline is nonempty.
361         % (We lessened \vsize for it in \oddfootingyyy.)
362         % The \baselineskip=24pt in plain's \makefootline has no effect.
363         \vskip 24pt
364         \unvbox\footlinebox
365       \fi
366       %
367       \ifcropmarks
368           \egroup % end of \vbox\bgroup
369         \hfil\egroup % end of (centering) \line\bgroup
370         \vskip\topandbottommargin plus1fill minus1fill
371         \boxmaxdepth = \cornerthick
372         \vbox to0pt{\vss
373           \line{%
374             \vbox{\moveleft\cornerthick\nsbot}%
375             \hfill
376             \vbox{\moveright\cornerthick\nsbot}%
377           }%
378           \nointerlineskip
379           \line{\ewbot\hfil\ewbot}%
380         }%
381       \egroup % \vbox from first cropmarks clause
382       \fi
383     }% end of \shipout\vbox
384   }% end of group with \indexdummies
385   \advancepageno
386   \ifnum\outputpenalty>-20000 \else\dosupereject\fi
387 }
388
389 \newinsert\margin \dimen\margin=\maxdimen
390
391 \def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}
392 {\catcode`\@ =11
393 \gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
394 % marginal hacks, juha@viisa.uucp (Juha Takala)
395 \ifvoid\margin\else % marginal info is present
396   \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi
397 \dimen@=\dp#1\relax \unvbox#1\relax
398 \ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
399 \ifr@ggedbottom \kern-\dimen@ \vfil \fi}
400 }
401
402 % Here are the rules for the cropmarks.  Note that they are
403 % offset so that the space between them is truly \outerhsize or \outervsize
404 % (P. A. MacKay, 12 November, 1986)
405 %
406 \def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}
407 \def\nstop{\vbox
408   {\hrule height\cornerthick depth\cornerlong width\cornerthick}}
409 \def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}
410 \def\nsbot{\vbox
411   {\hrule height\cornerlong depth\cornerthick width\cornerthick}}
412
413 % Parse an argument, then pass it to #1.  The argument is the rest of
414 % the input line (except we remove a trailing comment).  #1 should be a
415 % macro which expects an ordinary undelimited TeX argument.
416 %
417 \def\parsearg{\parseargusing{}}
418 \def\parseargusing#1#2{%
419   \def\argtorun{#2}%
420   \begingroup
421     \obeylines
422     \spaceisspace
423     #1%
424     \parseargline\empty% Insert the \empty token, see \finishparsearg below.
425 }
426
427 {\obeylines %
428   \gdef\parseargline#1^^M{%
429     \endgroup % End of the group started in \parsearg.
430     \argremovecomment #1\comment\ArgTerm%
431   }%
432 }
433
434 % First remove any @comment, then any @c comment.
435 \def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm}
436 \def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm}
437
438 % Each occurrence of `\^^M' or `<space>\^^M' is replaced by a single space.
439 %
440 % \argremovec might leave us with trailing space, e.g.,
441 %    @end itemize  @c foo
442 % This space token undergoes the same procedure and is eventually removed
443 % by \finishparsearg.
444 %
445 \def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M}
446 \def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M}
447 \def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{%
448   \def\temp{#3}%
449   \ifx\temp\empty
450     % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp:
451     \let\temp\finishparsearg
452   \else
453     \let\temp\argcheckspaces
454   \fi
455   % Put the space token in:
456   \temp#1 #3\ArgTerm
457 }
458
459 % If a _delimited_ argument is enclosed in braces, they get stripped; so
460 % to get _exactly_ the rest of the line, we had to prevent such situation.
461 % We prepended an \empty token at the very beginning and we expand it now,
462 % just before passing the control to \argtorun.
463 % (Similarly, we have to think about #3 of \argcheckspacesY above: it is
464 % either the null string, or it ends with \^^M---thus there is no danger
465 % that a pair of braces would be stripped.
466 %
467 % But first, we have to remove the trailing space token.
468 %
469 \def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}}
470
471 % \parseargdef\foo{...}
472 %       is roughly equivalent to
473 % \def\foo{\parsearg\Xfoo}
474 % \def\Xfoo#1{...}
475 %
476 % Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my
477 % favourite TeX trick.  --kasal, 16nov03
478
479 \def\parseargdef#1{%
480   \expandafter \doparseargdef \csname\string#1\endcsname #1%
481 }
482 \def\doparseargdef#1#2{%
483   \def#2{\parsearg#1}%
484   \def#1##1%
485 }
486
487 % Several utility definitions with active space:
488 {
489   \obeyspaces
490   \gdef\obeyedspace{ }
491
492   % Make each space character in the input produce a normal interword
493   % space in the output.  Don't allow a line break at this space, as this
494   % is used only in environments like @example, where each line of input
495   % should produce a line of output anyway.
496   %
497   \gdef\sepspaces{\obeyspaces\let =\tie}
498
499   % If an index command is used in an @example environment, any spaces
500   % therein should become regular spaces in the raw index file, not the
501   % expansion of \tie (\leavevmode \penalty \@M \ ).
502   \gdef\unsepspaces{\let =\space}
503 }
504
505
506 \def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
507
508 % Define the framework for environments in texinfo.tex.  It's used like this:
509 %
510 %   \envdef\foo{...}
511 %   \def\Efoo{...}
512 %
513 % It's the responsibility of \envdef to insert \begingroup before the
514 % actual body; @end closes the group after calling \Efoo.  \envdef also
515 % defines \thisenv, so the current environment is known; @end checks
516 % whether the environment name matches.  The \checkenv macro can also be
517 % used to check whether the current environment is the one expected.
518 %
519 % Non-false conditionals (@iftex, @ifset) don't fit into this, so they
520 % are not treated as environments; they don't open a group.  (The
521 % implementation of @end takes care not to call \endgroup in this
522 % special case.)
523
524
525 % At run-time, environments start with this:
526 \def\startenvironment#1{\begingroup\def\thisenv{#1}}
527 % initialize
528 \let\thisenv\empty
529
530 % ... but they get defined via ``\envdef\foo{...}'':
531 \long\def\envdef#1#2{\def#1{\startenvironment#1#2}}
532 \def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}}
533
534 % Check whether we're in the right environment:
535 \def\checkenv#1{%
536   \def\temp{#1}%
537   \ifx\thisenv\temp
538   \else
539     \badenverr
540   \fi
541 }
542
543 % Environment mismatch, #1 expected:
544 \def\badenverr{%
545   \errhelp = \EMsimple
546   \errmessage{This command can appear only \inenvironment\temp,
547     not \inenvironment\thisenv}%
548 }
549 \def\inenvironment#1{%
550   \ifx#1\empty
551     outside of any environment%
552   \else
553     in environment \expandafter\string#1%
554   \fi
555 }
556
557 % @end foo executes the definition of \Efoo.
558 % But first, it executes a specialized version of \checkenv
559 %
560 \parseargdef\end{%
561   \if 1\csname iscond.#1\endcsname
562   \else
563     % The general wording of \badenverr may not be ideal.
564     \expandafter\checkenv\csname#1\endcsname
565     \csname E#1\endcsname
566     \endgroup
567   \fi
568 }
569
570 \newhelp\EMsimple{Press RETURN to continue.}
571
572
573 % Be sure we're in horizontal mode when doing a tie, since we make space
574 % equivalent to this in @example-like environments. Otherwise, a space
575 % at the beginning of a line will start with \penalty -- and
576 % since \penalty is valid in vertical mode, we'd end up putting the
577 % penalty on the vertical list instead of in the new paragraph.
578 {\catcode`@ = 11
579  % Avoid using \@M directly, because that causes trouble
580  % if the definition is written into an index file.
581  \global\let\tiepenalty = \@M
582  \gdef\tie{\leavevmode\penalty\tiepenalty\ }
583 }
584
585 % @: forces normal size whitespace following.
586 \def\:{\spacefactor=1000 }
587
588 % @* forces a line break.
589 \def\*{\hfil\break\hbox{}\ignorespaces}
590
591 % @/ allows a line break.
592 \let\/=\allowbreak
593
594 % @. is an end-of-sentence period.
595 \def\.{.\spacefactor=\endofsentencespacefactor\space}
596
597 % @! is an end-of-sentence bang.
598 \def\!{!\spacefactor=\endofsentencespacefactor\space}
599
600 % @? is an end-of-sentence query.
601 \def\?{?\spacefactor=\endofsentencespacefactor\space}
602
603 % @frenchspacing on|off  says whether to put extra space after punctuation.
604 %
605 \def\onword{on}
606 \def\offword{off}
607 %
608 \parseargdef\frenchspacing{%
609   \def\temp{#1}%
610   \ifx\temp\onword \plainfrenchspacing
611   \else\ifx\temp\offword \plainnonfrenchspacing
612   \else
613     \errhelp = \EMsimple
614     \errmessage{Unknown @frenchspacing option `\temp', must be on|off}%
615   \fi\fi
616 }
617
618 % @w prevents a word break.  Without the \leavevmode, @w at the
619 % beginning of a paragraph, when TeX is still in vertical mode, would
620 % produce a whole line of output instead of starting the paragraph.
621 \def\w#1{\leavevmode\hbox{#1}}
622
623 % @group ... @end group forces ... to be all on one page, by enclosing
624 % it in a TeX vbox.  We use \vtop instead of \vbox to construct the box
625 % to keep its height that of a normal line.  According to the rules for
626 % \topskip (p.114 of the TeXbook), the glue inserted is
627 % max (\topskip - \ht (first item), 0).  If that height is large,
628 % therefore, no glue is inserted, and the space between the headline and
629 % the text is small, which looks bad.
630 %
631 % Another complication is that the group might be very large.  This can
632 % cause the glue on the previous page to be unduly stretched, because it
633 % does not have much material.  In this case, it's better to add an
634 % explicit \vfill so that the extra space is at the bottom.  The
635 % threshold for doing this is if the group is more than \vfilllimit
636 % percent of a page (\vfilllimit can be changed inside of @tex).
637 %
638 \newbox\groupbox
639 \def\vfilllimit{0.7}
640 %
641 \envdef\group{%
642   \ifnum\catcode`\^^M=\active \else
643     \errhelp = \groupinvalidhelp
644     \errmessage{@group invalid in context where filling is enabled}%
645   \fi
646   \startsavinginserts
647   %
648   \setbox\groupbox = \vtop\bgroup
649     % Do @comment since we are called inside an environment such as
650     % @example, where each end-of-line in the input causes an
651     % end-of-line in the output.  We don't want the end-of-line after
652     % the `@group' to put extra space in the output.  Since @group
653     % should appear on a line by itself (according to the Texinfo
654     % manual), we don't worry about eating any user text.
655     \comment
656 }
657 %
658 % The \vtop produces a box with normal height and large depth; thus, TeX puts
659 % \baselineskip glue before it, and (when the next line of text is done)
660 % \lineskip glue after it.  Thus, space below is not quite equal to space
661 % above.  But it's pretty close.
662 \def\Egroup{%
663     % To get correct interline space between the last line of the group
664     % and the first line afterwards, we have to propagate \prevdepth.
665     \endgraf % Not \par, as it may have been set to \lisppar.
666     \global\dimen1 = \prevdepth
667   \egroup           % End the \vtop.
668   % \dimen0 is the vertical size of the group's box.
669   \dimen0 = \ht\groupbox  \advance\dimen0 by \dp\groupbox
670   % \dimen2 is how much space is left on the page (more or less).
671   \dimen2 = \pageheight   \advance\dimen2 by -\pagetotal
672   % if the group doesn't fit on the current page, and it's a big big
673   % group, force a page break.
674   \ifdim \dimen0 > \dimen2
675     \ifdim \pagetotal < \vfilllimit\pageheight
676       \page
677     \fi
678   \fi
679   \box\groupbox
680   \prevdepth = \dimen1
681   \checkinserts
682 }
683 %
684 % TeX puts in an \escapechar (i.e., `@') at the beginning of the help
685 % message, so this ends up printing `@group can only ...'.
686 %
687 \newhelp\groupinvalidhelp{%
688 group can only be used in environments such as @example,^^J%
689 where each line of input produces a line of output.}
690
691 % @need space-in-mils
692 % forces a page break if there is not space-in-mils remaining.
693
694 \newdimen\mil  \mil=0.001in
695
696 % Old definition--didn't work.
697 %\parseargdef\need{\par %
698 %% This method tries to make TeX break the page naturally
699 %% if the depth of the box does not fit.
700 %{\baselineskip=0pt%
701 %\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak
702 %\prevdepth=-1000pt
703 %}}
704
705 \parseargdef\need{%
706   % Ensure vertical mode, so we don't make a big box in the middle of a
707   % paragraph.
708   \par
709   %
710   % If the @need value is less than one line space, it's useless.
711   \dimen0 = #1\mil
712   \dimen2 = \ht\strutbox
713   \advance\dimen2 by \dp\strutbox
714   \ifdim\dimen0 > \dimen2
715     %
716     % Do a \strut just to make the height of this box be normal, so the
717     % normal leading is inserted relative to the preceding line.
718     % And a page break here is fine.
719     \vtop to #1\mil{\strut\vfil}%
720     %
721     % TeX does not even consider page breaks if a penalty added to the
722     % main vertical list is 10000 or more.  But in order to see if the
723     % empty box we just added fits on the page, we must make it consider
724     % page breaks.  On the other hand, we don't want to actually break the
725     % page after the empty box.  So we use a penalty of 9999.
726     %
727     % There is an extremely small chance that TeX will actually break the
728     % page at this \penalty, if there are no other feasible breakpoints in
729     % sight.  (If the user is using lots of big @group commands, which
730     % almost-but-not-quite fill up a page, TeX will have a hard time doing
731     % good page breaking, for example.)  However, I could not construct an
732     % example where a page broke at this \penalty; if it happens in a real
733     % document, then we can reconsider our strategy.
734     \penalty9999
735     %
736     % Back up by the size of the box, whether we did a page break or not.
737     \kern -#1\mil
738     %
739     % Do not allow a page break right after this kern.
740     \nobreak
741   \fi
742 }
743
744 % @br   forces paragraph break (and is undocumented).
745
746 \let\br = \par
747
748 % @page forces the start of a new page.
749 %
750 \def\page{\par\vfill\supereject}
751
752 % @exdent text....
753 % outputs text on separate line in roman font, starting at standard page margin
754
755 % This records the amount of indent in the innermost environment.
756 % That's how much \exdent should take out.
757 \newskip\exdentamount
758
759 % This defn is used inside fill environments such as @defun.
760 \parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}
761
762 % This defn is used inside nofill environments such as @example.
763 \parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount
764   \leftline{\hskip\leftskip{\rm#1}}}}
765
766 % @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
767 % paragraph.  For more general purposes, use the \margin insertion
768 % class.  WHICH is `l' or `r'.  Not documented, written for gawk manual.
769 %
770 \newskip\inmarginspacing \inmarginspacing=1cm
771 \def\strutdepth{\dp\strutbox}
772 %
773 \def\doinmargin#1#2{\strut\vadjust{%
774   \nobreak
775   \kern-\strutdepth
776   \vtop to \strutdepth{%
777     \baselineskip=\strutdepth
778     \vss
779     % if you have multiple lines of stuff to put here, you'll need to
780     % make the vbox yourself of the appropriate size.
781     \ifx#1l%
782       \llap{\ignorespaces #2\hskip\inmarginspacing}%
783     \else
784       \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}%
785     \fi
786     \null
787   }%
788 }}
789 \def\inleftmargin{\doinmargin l}
790 \def\inrightmargin{\doinmargin r}
791 %
792 % @inmargin{TEXT [, RIGHT-TEXT]}
793 % (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right;
794 % else use TEXT for both).
795 %
796 \def\inmargin#1{\parseinmargin #1,,\finish}
797 \def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing.
798   \setbox0 = \hbox{\ignorespaces #2}%
799   \ifdim\wd0 > 0pt
800     \def\lefttext{#1}%  have both texts
801     \def\righttext{#2}%
802   \else
803     \def\lefttext{#1}%  have only one text
804     \def\righttext{#1}%
805   \fi
806   %
807   \ifodd\pageno
808     \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin
809   \else
810     \def\temp{\inleftmargin\lefttext}%
811   \fi
812   \temp
813 }
814
815 % @| inserts a changebar to the left of the current line.  It should
816 % surround any changed text.  This approach does *not* work if the
817 % change spans more than two lines of output.  To handle that, we would
818 % have adopt a much more difficult approach (putting marks into the main
819 % vertical list for the beginning and end of each change).  This command
820 % is not documented, not supported, and doesn't work.
821 %
822 \def\|{%
823   % \vadjust can only be used in horizontal mode.
824   \leavevmode
825   %
826   % Append this vertical mode material after the current line in the output.
827   \vadjust{%
828     % We want to insert a rule with the height and depth of the current
829     % leading; that is exactly what \strutbox is supposed to record.
830     \vskip-\baselineskip
831     %
832     % \vadjust-items are inserted at the left edge of the type.  So
833     % the \llap here moves out into the left-hand margin.
834     \llap{%
835       %
836       % For a thicker or thinner bar, change the `1pt'.
837       \vrule height\baselineskip width1pt
838       %
839       % This is the space between the bar and the text.
840       \hskip 12pt
841     }%
842   }%
843 }
844
845 % @include FILE -- \input text of FILE.
846 %
847 \def\include{\parseargusing\filenamecatcodes\includezzz}
848 \def\includezzz#1{%
849   \pushthisfilestack
850   \def\thisfile{#1}%
851   {%
852     \makevalueexpandable  % we want to expand any @value in FILE.
853     \turnoffactive        % and allow special characters in the expansion
854     \indexnofonts         % Allow `@@' and other weird things in file names.
855     \wlog{texinfo.tex: doing @include of #1^^J}%
856     \edef\temp{\noexpand\input #1 }%
857     %
858     % This trickery is to read FILE outside of a group, in case it makes
859     % definitions, etc.
860     \expandafter
861   }\temp
862   \popthisfilestack
863 }
864 \def\filenamecatcodes{%
865   \catcode`\\=\other
866   \catcode`~=\other
867   \catcode`^=\other
868   \catcode`_=\other
869   \catcode`|=\other
870   \catcode`<=\other
871   \catcode`>=\other
872   \catcode`+=\other
873   \catcode`-=\other
874   \catcode`\`=\other
875   \catcode`\'=\other
876 }
877
878 \def\pushthisfilestack{%
879   \expandafter\pushthisfilestackX\popthisfilestack\StackTerm
880 }
881 \def\pushthisfilestackX{%
882   \expandafter\pushthisfilestackY\thisfile\StackTerm
883 }
884 \def\pushthisfilestackY #1\StackTerm #2\StackTerm {%
885   \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}%
886 }
887
888 \def\popthisfilestack{\errthisfilestackempty}
889 \def\errthisfilestackempty{\errmessage{Internal error:
890   the stack of filenames is empty.}}
891
892 \def\thisfile{}
893
894 % @center line
895 % outputs that line, centered.
896 %
897 \parseargdef\center{%
898   \ifhmode
899     \let\next\centerH
900   \else
901     \let\next\centerV
902   \fi
903   \next{\hfil \ignorespaces#1\unskip \hfil}%
904 }
905 \def\centerH#1{%
906   {%
907     \hfil\break
908     \advance\hsize by -\leftskip
909     \advance\hsize by -\rightskip
910     \line{#1}%
911     \break
912   }%
913 }
914 \def\centerV#1{\line{\kern\leftskip #1\kern\rightskip}}
915
916 % @sp n   outputs n lines of vertical space
917
918 \parseargdef\sp{\vskip #1\baselineskip}
919
920 % @comment ...line which is ignored...
921 % @c is the same as @comment
922 % @ignore ... @end ignore  is another way to write a comment
923
924 \def\comment{\begingroup \catcode`\^^M=\other%
925 \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
926 \commentxxx}
927 {\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}}
928
929 \let\c=\comment
930
931 % @paragraphindent NCHARS
932 % We'll use ems for NCHARS, close enough.
933 % NCHARS can also be the word `asis' or `none'.
934 % We cannot feasibly implement @paragraphindent asis, though.
935 %
936 \def\asisword{asis} % no translation, these are keywords
937 \def\noneword{none}
938 %
939 \parseargdef\paragraphindent{%
940   \def\temp{#1}%
941   \ifx\temp\asisword
942   \else
943     \ifx\temp\noneword
944       \defaultparindent = 0pt
945     \else
946       \defaultparindent = #1em
947     \fi
948   \fi
949   \parindent = \defaultparindent
950 }
951
952 % @exampleindent NCHARS
953 % We'll use ems for NCHARS like @paragraphindent.
954 % It seems @exampleindent asis isn't necessary, but
955 % I preserve it to make it similar to @paragraphindent.
956 \parseargdef\exampleindent{%
957   \def\temp{#1}%
958   \ifx\temp\asisword
959   \else
960     \ifx\temp\noneword
961       \lispnarrowing = 0pt
962     \else
963       \lispnarrowing = #1em
964     \fi
965   \fi
966 }
967
968 % @firstparagraphindent WORD
969 % If WORD is `none', then suppress indentation of the first paragraph
970 % after a section heading.  If WORD is `insert', then do indent at such
971 % paragraphs.
972 %
973 % The paragraph indentation is suppressed or not by calling
974 % \suppressfirstparagraphindent, which the sectioning commands do.
975 % We switch the definition of this back and forth according to WORD.
976 % By default, we suppress indentation.
977 %
978 \def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent}
979 \def\insertword{insert}
980 %
981 \parseargdef\firstparagraphindent{%
982   \def\temp{#1}%
983   \ifx\temp\noneword
984     \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent
985   \else\ifx\temp\insertword
986     \let\suppressfirstparagraphindent = \relax
987   \else
988     \errhelp = \EMsimple
989     \errmessage{Unknown @firstparagraphindent option `\temp'}%
990   \fi\fi
991 }
992
993 % Here is how we actually suppress indentation.  Redefine \everypar to
994 % \kern backwards by \parindent, and then reset itself to empty.
995 %
996 % We also make \indent itself not actually do anything until the next
997 % paragraph.
998 %
999 \gdef\dosuppressfirstparagraphindent{%
1000   \gdef\indent{%
1001     \restorefirstparagraphindent
1002     \indent
1003   }%
1004   \gdef\noindent{%
1005     \restorefirstparagraphindent
1006     \noindent
1007   }%
1008   \global\everypar = {%
1009     \kern -\parindent
1010     \restorefirstparagraphindent
1011   }%
1012 }
1013
1014 \gdef\restorefirstparagraphindent{%
1015   \global \let \indent = \ptexindent
1016   \global \let \noindent = \ptexnoindent
1017   \global \everypar = {}%
1018 }
1019
1020
1021 % @refill is a no-op.
1022 \let\refill=\relax
1023
1024 % If working on a large document in chapters, it is convenient to
1025 % be able to disable indexing, cross-referencing, and contents, for test runs.
1026 % This is done with @novalidate (before @setfilename).
1027 %
1028 \newif\iflinks \linkstrue % by default we want the aux files.
1029 \let\novalidate = \linksfalse
1030
1031 % @setfilename is done at the beginning of every texinfo file.
1032 % So open here the files we need to have open while reading the input.
1033 % This makes it possible to make a .fmt file for texinfo.
1034 \def\setfilename{%
1035    \fixbackslash  % Turn off hack to swallow `\input texinfo'.
1036    \iflinks
1037      \tryauxfile
1038      % Open the new aux file.  TeX will close it automatically at exit.
1039      \immediate\openout\auxfile=\jobname.aux
1040    \fi % \openindices needs to do some work in any case.
1041    \openindices
1042    \let\setfilename=\comment % Ignore extra @setfilename cmds.
1043    %
1044    % If texinfo.cnf is present on the system, read it.
1045    % Useful for site-wide @afourpaper, etc.
1046    \openin 1 texinfo.cnf
1047    \ifeof 1 \else \input texinfo.cnf \fi
1048    \closein 1
1049    %
1050    \comment % Ignore the actual filename.
1051 }
1052
1053 % Called from \setfilename.
1054 %
1055 \def\openindices{%
1056   \newindex{cp}%
1057   \newcodeindex{fn}%
1058   \newcodeindex{vr}%
1059   \newcodeindex{tp}%
1060   \newcodeindex{ky}%
1061   \newcodeindex{pg}%
1062 }
1063
1064 % @bye.
1065 \outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
1066
1067
1068 \message{pdf,}
1069 % adobe `portable' document format
1070 \newcount\tempnum
1071 \newcount\lnkcount
1072 \newtoks\filename
1073 \newcount\filenamelength
1074 \newcount\pgn
1075 \newtoks\toksA
1076 \newtoks\toksB
1077 \newtoks\toksC
1078 \newtoks\toksD
1079 \newbox\boxA
1080 \newcount\countA
1081 \newif\ifpdf
1082 \newif\ifpdfmakepagedest
1083
1084 % when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1
1085 % can be set).  So we test for \relax and 0 as well as being undefined.
1086 \ifx\pdfoutput\thisisundefined
1087 \else
1088   \ifx\pdfoutput\relax
1089   \else
1090     \ifcase\pdfoutput
1091     \else
1092       \pdftrue
1093     \fi
1094   \fi
1095 \fi
1096
1097 % PDF uses PostScript string constants for the names of xref targets,
1098 % for display in the outlines, and in other places.  Thus, we have to
1099 % double any backslashes.  Otherwise, a name like "\node" will be
1100 % interpreted as a newline (\n), followed by o, d, e.  Not good.
1101 % http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html
1102 % (and related messages, the final outcome is that it is up to the TeX
1103 % user to double the backslashes and otherwise make the string valid, so
1104 % that's what we do).
1105
1106 % double active backslashes.
1107 %
1108 {\catcode`\@=0 \catcode`\\=\active
1109  @gdef@activebackslashdouble{%
1110    @catcode`@\=@active
1111    @let\=@doublebackslash}
1112 }
1113
1114 % To handle parens, we must adopt a different approach, since parens are
1115 % not active characters.  hyperref.dtx (which has the same problem as
1116 % us) handles it with this amazing macro to replace tokens, with minor
1117 % changes for Texinfo.  It is included here under the GPL by permission
1118 % from the author, Heiko Oberdiek.
1119 %
1120 % #1 is the tokens to replace.
1121 % #2 is the replacement.
1122 % #3 is the control sequence with the string.
1123 %
1124 \def\HyPsdSubst#1#2#3{%
1125   \def\HyPsdReplace##1#1##2\END{%
1126     ##1%
1127     \ifx\\##2\\%
1128     \else
1129       #2%
1130       \HyReturnAfterFi{%
1131         \HyPsdReplace##2\END
1132       }%
1133     \fi
1134   }%
1135   \xdef#3{\expandafter\HyPsdReplace#3#1\END}%
1136 }
1137 \long\def\HyReturnAfterFi#1\fi{\fi#1}
1138
1139 % #1 is a control sequence in which to do the replacements.
1140 \def\backslashparens#1{%
1141   \xdef#1{#1}% redefine it as its expansion; the definition is simply
1142              % \lastnode when called from \setref -> \pdfmkdest.
1143   \HyPsdSubst{(}{\realbackslash(}{#1}%
1144   \HyPsdSubst{)}{\realbackslash)}{#1}%
1145 }
1146
1147 \newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images
1148 with PDF output, and none of those formats could be found.  (.eps cannot
1149 be supported due to the design of the PDF format; use regular TeX (DVI
1150 output) for that.)}
1151
1152 \ifpdf
1153   %
1154   % Color manipulation macros based on pdfcolor.tex,
1155   % except using rgb instead of cmyk; the latter is said to render as a
1156   % very dark gray on-screen and a very dark halftone in print, instead
1157   % of actual black.
1158   \def\rgbDarkRed{0.50 0.09 0.12}
1159   \def\rgbBlack{0 0 0}
1160   %
1161   % k sets the color for filling (usual text, etc.);
1162   % K sets the color for stroking (thin rules, e.g., normal _'s).
1163   \def\pdfsetcolor#1{\pdfliteral{#1 rg  #1 RG}}
1164   %
1165   % Set color, and create a mark which defines \thiscolor accordingly,
1166   % so that \makeheadline knows which color to restore.
1167   \def\setcolor#1{%
1168     \xdef\lastcolordefs{\gdef\noexpand\thiscolor{#1}}%
1169     \domark
1170     \pdfsetcolor{#1}%
1171   }
1172   %
1173   \def\maincolor{\rgbBlack}
1174   \pdfsetcolor{\maincolor}
1175   \edef\thiscolor{\maincolor}
1176   \def\lastcolordefs{}
1177   %
1178   \def\makefootline{%
1179     \baselineskip24pt
1180     \line{\pdfsetcolor{\maincolor}\the\footline}%
1181   }
1182   %
1183   \def\makeheadline{%
1184     \vbox to 0pt{%
1185       \vskip-22.5pt
1186       \line{%
1187         \vbox to8.5pt{}%
1188         % Extract \thiscolor definition from the marks.
1189         \getcolormarks
1190         % Typeset the headline with \maincolor, then restore the color.
1191         \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}%
1192       }%
1193       \vss
1194     }%
1195     \nointerlineskip
1196   }
1197   %
1198   %
1199   \pdfcatalog{/PageMode /UseOutlines}
1200   %
1201   % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto).
1202   \def\dopdfimage#1#2#3{%
1203     \def\imagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}%
1204     \def\imageheight{#3}\setbox2 = \hbox{\ignorespaces #3}%
1205     %
1206     % pdftex (and the PDF format) support .png, .jpg, .pdf (among
1207     % others).  Let's try in that order.
1208     \let\pdfimgext=\empty
1209     \begingroup
1210       \openin 1 #1.png \ifeof 1
1211         \openin 1 #1.jpg \ifeof 1
1212           \openin 1 #1.jpeg \ifeof 1
1213             \openin 1 #1.JPG \ifeof 1
1214               \openin 1 #1.pdf \ifeof 1
1215                 \openin 1 #1.PDF \ifeof 1
1216                   \errhelp = \nopdfimagehelp
1217                   \errmessage{Could not find image file #1 for pdf}%
1218                 \else \gdef\pdfimgext{PDF}%
1219                 \fi
1220               \else \gdef\pdfimgext{pdf}%
1221               \fi
1222             \else \gdef\pdfimgext{JPG}%
1223             \fi
1224           \else \gdef\pdfimgext{jpeg}%
1225           \fi
1226         \else \gdef\pdfimgext{jpg}%
1227         \fi
1228       \else \gdef\pdfimgext{png}%
1229       \fi
1230       \closein 1
1231     \endgroup
1232     %
1233     % without \immediate, ancient pdftex seg faults when the same image is
1234     % included twice.  (Version 3.14159-pre-1.0-unofficial-20010704.)
1235     \ifnum\pdftexversion < 14
1236       \immediate\pdfimage
1237     \else
1238       \immediate\pdfximage
1239     \fi
1240       \ifdim \wd0 >0pt width \imagewidth \fi
1241       \ifdim \wd2 >0pt height \imageheight \fi
1242       \ifnum\pdftexversion<13
1243          #1.\pdfimgext
1244        \else
1245          {#1.\pdfimgext}%
1246        \fi
1247     \ifnum\pdftexversion < 14 \else
1248       \pdfrefximage \pdflastximage
1249     \fi}
1250   %
1251   \def\pdfmkdest#1{{%
1252     % We have to set dummies so commands such as @code, and characters
1253     % such as \, aren't expanded when present in a section title.
1254     \indexnofonts
1255     \turnoffactive
1256     \activebackslashdouble
1257     \makevalueexpandable
1258     \def\pdfdestname{#1}%
1259     \backslashparens\pdfdestname
1260     \safewhatsit{\pdfdest name{\pdfdestname} xyz}%
1261   }}
1262   %
1263   % used to mark target names; must be expandable.
1264   \def\pdfmkpgn#1{#1}
1265   %
1266   % by default, use a color that is dark enough to print on paper as
1267   % nearly black, but still distinguishable for online viewing.
1268   \def\urlcolor{\rgbDarkRed}
1269   \def\linkcolor{\rgbDarkRed}
1270   \def\endlink{\setcolor{\maincolor}\pdfendlink}
1271   %
1272   % Adding outlines to PDF; macros for calculating structure of outlines
1273   % come from Petr Olsak
1274   \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
1275     \else \csname#1\endcsname \fi}
1276   \def\advancenumber#1{\tempnum=\expnumber{#1}\relax
1277     \advance\tempnum by 1
1278     \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
1279   %
1280   % #1 is the section text, which is what will be displayed in the
1281   % outline by the pdf viewer.  #2 is the pdf expression for the number
1282   % of subentries (or empty, for subsubsections).  #3 is the node text,
1283   % which might be empty if this toc entry had no corresponding node.
1284   % #4 is the page number
1285   %
1286   \def\dopdfoutline#1#2#3#4{%
1287     % Generate a link to the node text if that exists; else, use the
1288     % page number.  We could generate a destination for the section
1289     % text in the case where a section has no node, but it doesn't
1290     % seem worth the trouble, since most documents are normally structured.
1291     \def\pdfoutlinedest{#3}%
1292     \ifx\pdfoutlinedest\empty
1293       \def\pdfoutlinedest{#4}%
1294     \else
1295       % Doubled backslashes in the name.
1296       {\activebackslashdouble \xdef\pdfoutlinedest{#3}%
1297        \backslashparens\pdfoutlinedest}%
1298     \fi
1299     %
1300     % Also double the backslashes in the display string.
1301     {\activebackslashdouble \xdef\pdfoutlinetext{#1}%
1302      \backslashparens\pdfoutlinetext}%
1303     %
1304     \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}%
1305   }
1306   %
1307   \def\pdfmakeoutlines{%
1308     \begingroup
1309       % Thanh's hack / proper braces in bookmarks
1310       \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace
1311       \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace
1312       %
1313       % Read toc silently, to get counts of subentries for \pdfoutline.
1314       \def\partentry##1##2##3##4{}% ignore parts in the outlines
1315       \def\numchapentry##1##2##3##4{%
1316         \def\thischapnum{##2}%
1317         \def\thissecnum{0}%
1318         \def\thissubsecnum{0}%
1319       }%
1320       \def\numsecentry##1##2##3##4{%
1321         \advancenumber{chap\thischapnum}%
1322         \def\thissecnum{##2}%
1323         \def\thissubsecnum{0}%
1324       }%
1325       \def\numsubsecentry##1##2##3##4{%
1326         \advancenumber{sec\thissecnum}%
1327         \def\thissubsecnum{##2}%
1328       }%
1329       \def\numsubsubsecentry##1##2##3##4{%
1330         \advancenumber{subsec\thissubsecnum}%
1331       }%
1332       \def\thischapnum{0}%
1333       \def\thissecnum{0}%
1334       \def\thissubsecnum{0}%
1335       %
1336       % use \def rather than \let here because we redefine \chapentry et
1337       % al. a second time, below.
1338       \def\appentry{\numchapentry}%
1339       \def\appsecentry{\numsecentry}%
1340       \def\appsubsecentry{\numsubsecentry}%
1341       \def\appsubsubsecentry{\numsubsubsecentry}%
1342       \def\unnchapentry{\numchapentry}%
1343       \def\unnsecentry{\numsecentry}%
1344       \def\unnsubsecentry{\numsubsecentry}%
1345       \def\unnsubsubsecentry{\numsubsubsecentry}%
1346       \readdatafile{toc}%
1347       %
1348       % Read toc second time, this time actually producing the outlines.
1349       % The `-' means take the \expnumber as the absolute number of
1350       % subentries, which we calculated on our first read of the .toc above.
1351       %
1352       % We use the node names as the destinations.
1353       \def\numchapentry##1##2##3##4{%
1354         \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}%
1355       \def\numsecentry##1##2##3##4{%
1356         \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}%
1357       \def\numsubsecentry##1##2##3##4{%
1358         \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}%
1359       \def\numsubsubsecentry##1##2##3##4{% count is always zero
1360         \dopdfoutline{##1}{}{##3}{##4}}%
1361       %
1362       % PDF outlines are displayed using system fonts, instead of
1363       % document fonts.  Therefore we cannot use special characters,
1364       % since the encoding is unknown.  For example, the eogonek from
1365       % Latin 2 (0xea) gets translated to a | character.  Info from
1366       % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100.
1367       %
1368       % xx to do this right, we have to translate 8-bit characters to
1369       % their "best" equivalent, based on the @documentencoding.  Right
1370       % now, I guess we'll just let the pdf reader have its way.
1371       \indexnofonts
1372       \setupdatafile
1373       \catcode`\\=\active \otherbackslash
1374       \input \tocreadfilename
1375     \endgroup
1376   }
1377   %
1378   \def\skipspaces#1{\def\PP{#1}\def\D{|}%
1379     \ifx\PP\D\let\nextsp\relax
1380     \else\let\nextsp\skipspaces
1381       \ifx\p\space\else\addtokens{\filename}{\PP}%
1382         \advance\filenamelength by 1
1383       \fi
1384     \fi
1385     \nextsp}
1386   \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax}
1387   \ifnum\pdftexversion < 14
1388     \let \startlink \pdfannotlink
1389   \else
1390     \let \startlink \pdfstartlink
1391   \fi
1392   % make a live url in pdf output.
1393   \def\pdfurl#1{%
1394     \begingroup
1395       % it seems we really need yet another set of dummies; have not
1396       % tried to figure out what each command should do in the context
1397       % of @url.  for now, just make @/ a no-op, that's the only one
1398       % people have actually reported a problem with.
1399       %
1400       \normalturnoffactive
1401       \def\@{@}%
1402       \let\/=\empty
1403       \makevalueexpandable
1404       % do we want to go so far as to use \indexnofonts instead of just
1405       % special-casing \var here?
1406       \def\var##1{##1}%
1407       %
1408       \leavevmode\setcolor{\urlcolor}%
1409       \startlink attr{/Border [0 0 0]}%
1410         user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
1411     \endgroup}
1412   \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
1413   \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
1414   \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
1415   \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
1416   \def\maketoks{%
1417     \expandafter\poptoks\the\toksA|ENDTOKS|\relax
1418     \ifx\first0\adn0
1419     \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
1420     \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
1421     \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9
1422     \else
1423       \ifnum0=\countA\else\makelink\fi
1424       \ifx\first.\let\next=\done\else
1425         \let\next=\maketoks
1426         \addtokens{\toksB}{\the\toksD}
1427         \ifx\first,\addtokens{\toksB}{\space}\fi
1428       \fi
1429     \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
1430     \next}
1431   \def\makelink{\addtokens{\toksB}%
1432     {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
1433   \def\pdflink#1{%
1434     \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}
1435     \setcolor{\linkcolor}#1\endlink}
1436   \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
1437 \else
1438   % non-pdf mode
1439   \let\pdfmkdest = \gobble
1440   \let\pdfurl = \gobble
1441   \let\endlink = \relax
1442   \let\setcolor = \gobble
1443   \let\pdfsetcolor = \gobble
1444   \let\pdfmakeoutlines = \relax
1445 \fi  % \ifx\pdfoutput
1446
1447
1448 \message{fonts,}
1449
1450 % Change the current font style to #1, remembering it in \curfontstyle.
1451 % For now, we do not accumulate font styles: @b{@i{foo}} prints foo in
1452 % italics, not bold italics.
1453 %
1454 \def\setfontstyle#1{%
1455   \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd.
1456   \csname ten#1\endcsname  % change the current font
1457 }
1458
1459 % Select #1 fonts with the current style.
1460 %
1461 \def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname}
1462
1463 \def\rm{\fam=0 \setfontstyle{rm}}
1464 \def\it{\fam=\itfam \setfontstyle{it}}
1465 \def\sl{\fam=\slfam \setfontstyle{sl}}
1466 \def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf}
1467 \def\tt{\fam=\ttfam \setfontstyle{tt}}
1468
1469 % Unfortunately, we have to override this for titles and the like, since
1470 % in those cases "rm" is bold.  Sigh.
1471 \def\rmisbold{\rm\def\curfontstyle{bf}}
1472
1473 % Texinfo sort of supports the sans serif font style, which plain TeX does not.
1474 % So we set up a \sf.
1475 \newfam\sffam
1476 \def\sf{\fam=\sffam \setfontstyle{sf}}
1477 \let\li = \sf % Sometimes we call it \li, not \sf.
1478
1479 % We don't need math for this font style.
1480 \def\ttsl{\setfontstyle{ttsl}}
1481
1482
1483 % Default leading.
1484 \newdimen\textleading  \textleading = 13.2pt
1485
1486 % Set the baselineskip to #1, and the lineskip and strut size
1487 % correspondingly.  There is no deep meaning behind these magic numbers
1488 % used as factors; they just match (closely enough) what Knuth defined.
1489 %
1490 \def\lineskipfactor{.08333}
1491 \def\strutheightpercent{.70833}
1492 \def\strutdepthpercent {.29167}
1493 %
1494 % can get a sort of poor man's double spacing by redefining this.
1495 \def\baselinefactor{1}
1496 %
1497 \def\setleading#1{%
1498   \dimen0 = #1\relax
1499   \normalbaselineskip = \baselinefactor\dimen0
1500   \normallineskip = \lineskipfactor\normalbaselineskip
1501   \normalbaselines
1502   \setbox\strutbox =\hbox{%
1503     \vrule width0pt height\strutheightpercent\baselineskip
1504                     depth \strutdepthpercent \baselineskip
1505   }%
1506 }
1507
1508 % PDF CMaps.  See also LaTeX's t1.cmap.
1509 %
1510 % do nothing with this by default.
1511 \expandafter\let\csname cmapOT1\endcsname\gobble
1512 \expandafter\let\csname cmapOT1IT\endcsname\gobble
1513 \expandafter\let\csname cmapOT1TT\endcsname\gobble
1514
1515 % if we are producing pdf, and we have \pdffontattr, then define cmaps.
1516 % (\pdffontattr was introduced many years ago, but people still run
1517 % older pdftex's; it's easy to conditionalize, so we do.)
1518 \ifpdf \ifx\pdffontattr\thisisundefined \else
1519   \begingroup
1520     \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
1521     \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
1522 %%DocumentNeededResources: ProcSet (CIDInit)
1523 %%IncludeResource: ProcSet (CIDInit)
1524 %%BeginResource: CMap (TeX-OT1-0)
1525 %%Title: (TeX-OT1-0 TeX OT1 0)
1526 %%Version: 1.000
1527 %%EndComments
1528 /CIDInit /ProcSet findresource begin
1529 12 dict begin
1530 begincmap
1531 /CIDSystemInfo
1532 << /Registry (TeX)
1533 /Ordering (OT1)
1534 /Supplement 0
1535 >> def
1536 /CMapName /TeX-OT1-0 def
1537 /CMapType 2 def
1538 1 begincodespacerange
1539 <00> <7F>
1540 endcodespacerange
1541 8 beginbfrange
1542 <00> <01> <0393>
1543 <09> <0A> <03A8>
1544 <23> <26> <0023>
1545 <28> <3B> <0028>
1546 <3F> <5B> <003F>
1547 <5D> <5E> <005D>
1548 <61> <7A> <0061>
1549 <7B> <7C> <2013>
1550 endbfrange
1551 40 beginbfchar
1552 <02> <0398>
1553 <03> <039B>
1554 <04> <039E>
1555 <05> <03A0>
1556 <06> <03A3>
1557 <07> <03D2>
1558 <08> <03A6>
1559 <0B> <00660066>
1560 <0C> <00660069>
1561 <0D> <0066006C>
1562 <0E> <006600660069>
1563 <0F> <00660066006C>
1564 <10> <0131>
1565 <11> <0237>
1566 <12> <0060>
1567 <13> <00B4>
1568 <14> <02C7>
1569 <15> <02D8>
1570 <16> <00AF>
1571 <17> <02DA>
1572 <18> <00B8>
1573 <19> <00DF>
1574 <1A> <00E6>
1575 <1B> <0153>
1576 <1C> <00F8>
1577 <1D> <00C6>
1578 <1E> <0152>
1579 <1F> <00D8>
1580 <21> <0021>
1581 <22> <201D>
1582 <27> <2019>
1583 <3C> <00A1>
1584 <3D> <003D>
1585 <3E> <00BF>
1586 <5C> <201C>
1587 <5F> <02D9>
1588 <60> <2018>
1589 <7D> <02DD>
1590 <7E> <007E>
1591 <7F> <00A8>
1592 endbfchar
1593 endcmap
1594 CMapName currentdict /CMap defineresource pop
1595 end
1596 end
1597 %%EndResource
1598 %%EOF
1599     }\endgroup
1600   \expandafter\edef\csname cmapOT1\endcsname#1{%
1601     \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
1602   }%
1603 %
1604 % \cmapOT1IT
1605   \begingroup
1606     \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
1607     \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
1608 %%DocumentNeededResources: ProcSet (CIDInit)
1609 %%IncludeResource: ProcSet (CIDInit)
1610 %%BeginResource: CMap (TeX-OT1IT-0)
1611 %%Title: (TeX-OT1IT-0 TeX OT1IT 0)
1612 %%Version: 1.000
1613 %%EndComments
1614 /CIDInit /ProcSet findresource begin
1615 12 dict begin
1616 begincmap
1617 /CIDSystemInfo
1618 << /Registry (TeX)
1619 /Ordering (OT1IT)
1620 /Supplement 0
1621 >> def
1622 /CMapName /TeX-OT1IT-0 def
1623 /CMapType 2 def
1624 1 begincodespacerange
1625 <00> <7F>
1626 endcodespacerange
1627 8 beginbfrange
1628 <00> <01> <0393>
1629 <09> <0A> <03A8>
1630 <25> <26> <0025>
1631 <28> <3B> <0028>
1632 <3F> <5B> <003F>
1633 <5D> <5E> <005D>
1634 <61> <7A> <0061>
1635 <7B> <7C> <2013>
1636 endbfrange
1637 42 beginbfchar
1638 <02> <0398>
1639 <03> <039B>
1640 <04> <039E>
1641 <05> <03A0>
1642 <06> <03A3>
1643 <07> <03D2>
1644 <08> <03A6>
1645 <0B> <00660066>
1646 <0C> <00660069>
1647 <0D> <0066006C>
1648 <0E> <006600660069>
1649 <0F> <00660066006C>
1650 <10> <0131>
1651 <11> <0237>
1652 <12> <0060>
1653 <13> <00B4>
1654 <14> <02C7>
1655 <15> <02D8>
1656 <16> <00AF>
1657 <17> <02DA>
1658 <18> <00B8>
1659 <19> <00DF>
1660 <1A> <00E6>
1661 <1B> <0153>
1662 <1C> <00F8>
1663 <1D> <00C6>
1664 <1E> <0152>
1665 <1F> <00D8>
1666 <21> <0021>
1667 <22> <201D>
1668 <23> <0023>
1669 <24> <00A3>
1670 <27> <2019>
1671 <3C> <00A1>
1672 <3D> <003D>
1673 <3E> <00BF>
1674 <5C> <201C>
1675 <5F> <02D9>
1676 <60> <2018>
1677 <7D> <02DD>
1678 <7E> <007E>
1679 <7F> <00A8>
1680 endbfchar
1681 endcmap
1682 CMapName currentdict /CMap defineresource pop
1683 end
1684 end
1685 %%EndResource
1686 %%EOF
1687     }\endgroup
1688   \expandafter\edef\csname cmapOT1IT\endcsname#1{%
1689     \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
1690   }%
1691 %
1692 % \cmapOT1TT
1693   \begingroup
1694     \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
1695     \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
1696 %%DocumentNeededResources: ProcSet (CIDInit)
1697 %%IncludeResource: ProcSet (CIDInit)
1698 %%BeginResource: CMap (TeX-OT1TT-0)
1699 %%Title: (TeX-OT1TT-0 TeX OT1TT 0)
1700 %%Version: 1.000
1701 %%EndComments
1702 /CIDInit /ProcSet findresource begin
1703 12 dict begin
1704 begincmap
1705 /CIDSystemInfo
1706 << /Registry (TeX)
1707 /Ordering (OT1TT)
1708 /Supplement 0
1709 >> def
1710 /CMapName /TeX-OT1TT-0 def
1711 /CMapType 2 def
1712 1 begincodespacerange
1713 <00> <7F>
1714 endcodespacerange
1715 5 beginbfrange
1716 <00> <01> <0393>
1717 <09> <0A> <03A8>
1718 <21> <26> <0021>
1719 <28> <5F> <0028>
1720 <61> <7E> <0061>
1721 endbfrange
1722 32 beginbfchar
1723 <02> <0398>
1724 <03> <039B>
1725 <04> <039E>
1726 <05> <03A0>
1727 <06> <03A3>
1728 <07> <03D2>
1729 <08> <03A6>
1730 <0B> <2191>
1731 <0C> <2193>
1732 <0D> <0027>
1733 <0E> <00A1>
1734 <0F> <00BF>
1735 <10> <0131>
1736 <11> <0237>
1737 <12> <0060>
1738 <13> <00B4>
1739 <14> <02C7>
1740 <15> <02D8>
1741 <16> <00AF>
1742 <17> <02DA>
1743 <18> <00B8>
1744 <19> <00DF>
1745 <1A> <00E6>
1746 <1B> <0153>
1747 <1C> <00F8>
1748 <1D> <00C6>
1749 <1E> <0152>
1750 <1F> <00D8>
1751 <20> <2423>
1752 <27> <2019>
1753 <60> <2018>
1754 <7F> <00A8>
1755 endbfchar
1756 endcmap
1757 CMapName currentdict /CMap defineresource pop
1758 end
1759 end
1760 %%EndResource
1761 %%EOF
1762     }\endgroup
1763   \expandafter\edef\csname cmapOT1TT\endcsname#1{%
1764     \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
1765   }%
1766 \fi\fi
1767
1768
1769 % Set the font macro #1 to the font named #2, adding on the
1770 % specified font prefix (normally `cm').
1771 % #3 is the font's design size, #4 is a scale factor, #5 is the CMap
1772 % encoding (currently only OT1, OT1IT and OT1TT are allowed, pass
1773 % empty to omit).
1774 \def\setfont#1#2#3#4#5{%
1775   \font#1=\fontprefix#2#3 scaled #4
1776   \csname cmap#5\endcsname#1%
1777 }
1778 % This is what gets called when #5 of \setfont is empty.
1779 \let\cmap\gobble
1780 % emacs-page end of cmaps
1781
1782 % Use cm as the default font prefix.
1783 % To specify the font prefix, you must define \fontprefix
1784 % before you read in texinfo.tex.
1785 \ifx\fontprefix\thisisundefined
1786 \def\fontprefix{cm}
1787 \fi
1788 % Support font families that don't use the same naming scheme as CM.
1789 \def\rmshape{r}
1790 \def\rmbshape{bx}               %where the normal face is bold
1791 \def\bfshape{b}
1792 \def\bxshape{bx}
1793 \def\ttshape{tt}
1794 \def\ttbshape{tt}
1795 \def\ttslshape{sltt}
1796 \def\itshape{ti}
1797 \def\itbshape{bxti}
1798 \def\slshape{sl}
1799 \def\slbshape{bxsl}
1800 \def\sfshape{ss}
1801 \def\sfbshape{ss}
1802 \def\scshape{csc}
1803 \def\scbshape{csc}
1804
1805 % Definitions for a main text size of 11pt.  This is the default in
1806 % Texinfo.
1807 %
1808 \def\definetextfontsizexi{%
1809 % Text fonts (11.2pt, magstep1).
1810 \def\textnominalsize{11pt}
1811 \edef\mainmagstep{\magstephalf}
1812 \setfont\textrm\rmshape{10}{\mainmagstep}{OT1}
1813 \setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT}
1814 \setfont\textbf\bfshape{10}{\mainmagstep}{OT1}
1815 \setfont\textit\itshape{10}{\mainmagstep}{OT1IT}
1816 \setfont\textsl\slshape{10}{\mainmagstep}{OT1}
1817 \setfont\textsf\sfshape{10}{\mainmagstep}{OT1}
1818 \setfont\textsc\scshape{10}{\mainmagstep}{OT1}
1819 \setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT}
1820 \font\texti=cmmi10 scaled \mainmagstep
1821 \font\textsy=cmsy10 scaled \mainmagstep
1822 \def\textecsize{1095}
1823
1824 % A few fonts for @defun names and args.
1825 \setfont\defbf\bfshape{10}{\magstep1}{OT1}
1826 \setfont\deftt\ttshape{10}{\magstep1}{OT1TT}
1827 \setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT}
1828 \def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf}
1829
1830 % Fonts for indices, footnotes, small examples (9pt).
1831 \def\smallnominalsize{9pt}
1832 \setfont\smallrm\rmshape{9}{1000}{OT1}
1833 \setfont\smalltt\ttshape{9}{1000}{OT1TT}
1834 \setfont\smallbf\bfshape{10}{900}{OT1}
1835 \setfont\smallit\itshape{9}{1000}{OT1IT}
1836 \setfont\smallsl\slshape{9}{1000}{OT1}
1837 \setfont\smallsf\sfshape{9}{1000}{OT1}
1838 \setfont\smallsc\scshape{10}{900}{OT1}
1839 \setfont\smallttsl\ttslshape{10}{900}{OT1TT}
1840 \font\smalli=cmmi9
1841 \font\smallsy=cmsy9
1842 \def\smallecsize{0900}
1843
1844 % Fonts for small examples (8pt).
1845 \def\smallernominalsize{8pt}
1846 \setfont\smallerrm\rmshape{8}{1000}{OT1}
1847 \setfont\smallertt\ttshape{8}{1000}{OT1TT}
1848 \setfont\smallerbf\bfshape{10}{800}{OT1}
1849 \setfont\smallerit\itshape{8}{1000}{OT1IT}
1850 \setfont\smallersl\slshape{8}{1000}{OT1}
1851 \setfont\smallersf\sfshape{8}{1000}{OT1}
1852 \setfont\smallersc\scshape{10}{800}{OT1}
1853 \setfont\smallerttsl\ttslshape{10}{800}{OT1TT}
1854 \font\smalleri=cmmi8
1855 \font\smallersy=cmsy8
1856 \def\smallerecsize{0800}
1857
1858 % Fonts for title page (20.4pt):
1859 \def\titlenominalsize{20pt}
1860 \setfont\titlerm\rmbshape{12}{\magstep3}{OT1}
1861 \setfont\titleit\itbshape{10}{\magstep4}{OT1IT}
1862 \setfont\titlesl\slbshape{10}{\magstep4}{OT1}
1863 \setfont\titlett\ttbshape{12}{\magstep3}{OT1TT}
1864 \setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT}
1865 \setfont\titlesf\sfbshape{17}{\magstep1}{OT1}
1866 \let\titlebf=\titlerm
1867 \setfont\titlesc\scbshape{10}{\magstep4}{OT1}
1868 \font\titlei=cmmi12 scaled \magstep3
1869 \font\titlesy=cmsy10 scaled \magstep4
1870 \def\titleecsize{2074}
1871
1872 % Chapter (and unnumbered) fonts (17.28pt).
1873 \def\chapnominalsize{17pt}
1874 \setfont\chaprm\rmbshape{12}{\magstep2}{OT1}
1875 \setfont\chapit\itbshape{10}{\magstep3}{OT1IT}
1876 \setfont\chapsl\slbshape{10}{\magstep3}{OT1}
1877 \setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT}
1878 \setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT}
1879 \setfont\chapsf\sfbshape{17}{1000}{OT1}
1880 \let\chapbf=\chaprm
1881 \setfont\chapsc\scbshape{10}{\magstep3}{OT1}
1882 \font\chapi=cmmi12 scaled \magstep2
1883 \font\chapsy=cmsy10 scaled \magstep3
1884 \def\chapecsize{1728}
1885
1886 % Section fonts (14.4pt).
1887 \def\secnominalsize{14pt}
1888 \setfont\secrm\rmbshape{12}{\magstep1}{OT1}
1889 \setfont\secit\itbshape{10}{\magstep2}{OT1IT}
1890 \setfont\secsl\slbshape{10}{\magstep2}{OT1}
1891 \setfont\sectt\ttbshape{12}{\magstep1}{OT1TT}
1892 \setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT}
1893 \setfont\secsf\sfbshape{12}{\magstep1}{OT1}
1894 \let\secbf\secrm
1895 \setfont\secsc\scbshape{10}{\magstep2}{OT1}
1896 \font\seci=cmmi12 scaled \magstep1
1897 \font\secsy=cmsy10 scaled \magstep2
1898 \def\sececsize{1440}
1899
1900 % Subsection fonts (13.15pt).
1901 \def\ssecnominalsize{13pt}
1902 \setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1}
1903 \setfont\ssecit\itbshape{10}{1315}{OT1IT}
1904 \setfont\ssecsl\slbshape{10}{1315}{OT1}
1905 \setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT}
1906 \setfont\ssecttsl\ttslshape{10}{1315}{OT1TT}
1907 \setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1}
1908 \let\ssecbf\ssecrm
1909 \setfont\ssecsc\scbshape{10}{1315}{OT1}
1910 \font\sseci=cmmi12 scaled \magstephalf
1911 \font\ssecsy=cmsy10 scaled 1315
1912 \def\ssececsize{1200}
1913
1914 % Reduced fonts for @acro in text (10pt).
1915 \def\reducednominalsize{10pt}
1916 \setfont\reducedrm\rmshape{10}{1000}{OT1}
1917 \setfont\reducedtt\ttshape{10}{1000}{OT1TT}
1918 \setfont\reducedbf\bfshape{10}{1000}{OT1}
1919 \setfont\reducedit\itshape{10}{1000}{OT1IT}
1920 \setfont\reducedsl\slshape{10}{1000}{OT1}
1921 \setfont\reducedsf\sfshape{10}{1000}{OT1}
1922 \setfont\reducedsc\scshape{10}{1000}{OT1}
1923 \setfont\reducedttsl\ttslshape{10}{1000}{OT1TT}
1924 \font\reducedi=cmmi10
1925 \font\reducedsy=cmsy10
1926 \def\reducedecsize{1000}
1927
1928 \textleading = 13.2pt % line spacing for 11pt CM
1929 \textfonts            % reset the current fonts
1930 \rm
1931 } % end of 11pt text font size definitions
1932
1933
1934 % Definitions to make the main text be 10pt Computer Modern, with
1935 % section, chapter, etc., sizes following suit.  This is for the GNU
1936 % Press printing of the Emacs 22 manual.  Maybe other manuals in the
1937 % future.  Used with @smallbook, which sets the leading to 12pt.
1938 %
1939 \def\definetextfontsizex{%
1940 % Text fonts (10pt).
1941 \def\textnominalsize{10pt}
1942 \edef\mainmagstep{1000}
1943 \setfont\textrm\rmshape{10}{\mainmagstep}{OT1}
1944 \setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT}
1945 \setfont\textbf\bfshape{10}{\mainmagstep}{OT1}
1946 \setfont\textit\itshape{10}{\mainmagstep}{OT1IT}
1947 \setfont\textsl\slshape{10}{\mainmagstep}{OT1}
1948 \setfont\textsf\sfshape{10}{\mainmagstep}{OT1}
1949 \setfont\textsc\scshape{10}{\mainmagstep}{OT1}
1950 \setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT}
1951 \font\texti=cmmi10 scaled \mainmagstep
1952 \font\textsy=cmsy10 scaled \mainmagstep
1953 \def\textecsize{1000}
1954
1955 % A few fonts for @defun names and args.
1956 \setfont\defbf\bfshape{10}{\magstephalf}{OT1}
1957 \setfont\deftt\ttshape{10}{\magstephalf}{OT1TT}
1958 \setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT}
1959 \def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf}
1960
1961 % Fonts for indices, footnotes, small examples (9pt).
1962 \def\smallnominalsize{9pt}
1963 \setfont\smallrm\rmshape{9}{1000}{OT1}
1964 \setfont\smalltt\ttshape{9}{1000}{OT1TT}
1965 \setfont\smallbf\bfshape{10}{900}{OT1}
1966 \setfont\smallit\itshape{9}{1000}{OT1IT}
1967 \setfont\smallsl\slshape{9}{1000}{OT1}
1968 \setfont\smallsf\sfshape{9}{1000}{OT1}
1969 \setfont\smallsc\scshape{10}{900}{OT1}
1970 \setfont\smallttsl\ttslshape{10}{900}{OT1TT}
1971 \font\smalli=cmmi9
1972 \font\smallsy=cmsy9
1973 \def\smallecsize{0900}
1974
1975 % Fonts for small examples (8pt).
1976 \def\smallernominalsize{8pt}
1977 \setfont\smallerrm\rmshape{8}{1000}{OT1}
1978 \setfont\smallertt\ttshape{8}{1000}{OT1TT}
1979 \setfont\smallerbf\bfshape{10}{800}{OT1}
1980 \setfont\smallerit\itshape{8}{1000}{OT1IT}
1981 \setfont\smallersl\slshape{8}{1000}{OT1}
1982 \setfont\smallersf\sfshape{8}{1000}{OT1}
1983 \setfont\smallersc\scshape{10}{800}{OT1}
1984 \setfont\smallerttsl\ttslshape{10}{800}{OT1TT}
1985 \font\smalleri=cmmi8
1986 \font\smallersy=cmsy8
1987 \def\smallerecsize{0800}
1988
1989 % Fonts for title page (20.4pt):
1990 \def\titlenominalsize{20pt}
1991 \setfont\titlerm\rmbshape{12}{\magstep3}{OT1}
1992 \setfont\titleit\itbshape{10}{\magstep4}{OT1IT}
1993 \setfont\titlesl\slbshape{10}{\magstep4}{OT1}
1994 \setfont\titlett\ttbshape{12}{\magstep3}{OT1TT}
1995 \setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT}
1996 \setfont\titlesf\sfbshape{17}{\magstep1}{OT1}
1997 \let\titlebf=\titlerm
1998 \setfont\titlesc\scbshape{10}{\magstep4}{OT1}
1999 \font\titlei=cmmi12 scaled \magstep3
2000 \font\titlesy=cmsy10 scaled \magstep4
2001 \def\titleecsize{2074}
2002
2003 % Chapter fonts (14.4pt).
2004 \def\chapnominalsize{14pt}
2005 \setfont\chaprm\rmbshape{12}{\magstep1}{OT1}
2006 \setfont\chapit\itbshape{10}{\magstep2}{OT1IT}
2007 \setfont\chapsl\slbshape{10}{\magstep2}{OT1}
2008 \setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT}
2009 \setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT}
2010 \setfont\chapsf\sfbshape{12}{\magstep1}{OT1}
2011 \let\chapbf\chaprm
2012 \setfont\chapsc\scbshape{10}{\magstep2}{OT1}
2013 \font\chapi=cmmi12 scaled \magstep1
2014 \font\chapsy=cmsy10 scaled \magstep2
2015 \def\chapecsize{1440}
2016
2017 % Section fonts (12pt).
2018 \def\secnominalsize{12pt}
2019 \setfont\secrm\rmbshape{12}{1000}{OT1}
2020 \setfont\secit\itbshape{10}{\magstep1}{OT1IT}
2021 \setfont\secsl\slbshape{10}{\magstep1}{OT1}
2022 \setfont\sectt\ttbshape{12}{1000}{OT1TT}
2023 \setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT}
2024 \setfont\secsf\sfbshape{12}{1000}{OT1}
2025 \let\secbf\secrm
2026 \setfont\secsc\scbshape{10}{\magstep1}{OT1}
2027 \font\seci=cmmi12
2028 \font\secsy=cmsy10 scaled \magstep1
2029 \def\sececsize{1200}
2030
2031 % Subsection fonts (10pt).
2032 \def\ssecnominalsize{10pt}
2033 \setfont\ssecrm\rmbshape{10}{1000}{OT1}
2034 \setfont\ssecit\itbshape{10}{1000}{OT1IT}
2035 \setfont\ssecsl\slbshape{10}{1000}{OT1}
2036 \setfont\ssectt\ttbshape{10}{1000}{OT1TT}
2037 \setfont\ssecttsl\ttslshape{10}{1000}{OT1TT}
2038 \setfont\ssecsf\sfbshape{10}{1000}{OT1}
2039 \let\ssecbf\ssecrm
2040 \setfont\ssecsc\scbshape{10}{1000}{OT1}
2041 \font\sseci=cmmi10
2042 \font\ssecsy=cmsy10
2043 \def\ssececsize{1000}
2044
2045 % Reduced fonts for @acro in text (9pt).
2046 \def\reducednominalsize{9pt}
2047 \setfont\reducedrm\rmshape{9}{1000}{OT1}
2048 \setfont\reducedtt\ttshape{9}{1000}{OT1TT}
2049 \setfont\reducedbf\bfshape{10}{900}{OT1}
2050 \setfont\reducedit\itshape{9}{1000}{OT1IT}
2051 \setfont\reducedsl\slshape{9}{1000}{OT1}
2052 \setfont\reducedsf\sfshape{9}{1000}{OT1}
2053 \setfont\reducedsc\scshape{10}{900}{OT1}
2054 \setfont\reducedttsl\ttslshape{10}{900}{OT1TT}
2055 \font\reducedi=cmmi9
2056 \font\reducedsy=cmsy9
2057 \def\reducedecsize{0900}
2058
2059 \divide\parskip by 2  % reduce space between paragraphs
2060 \textleading = 12pt   % line spacing for 10pt CM
2061 \textfonts            % reset the current fonts
2062 \rm
2063 } % end of 10pt text font size definitions
2064
2065
2066 % We provide the user-level command
2067 %   @fonttextsize 10
2068 % (or 11) to redefine the text font size.  pt is assumed.
2069 %
2070 \def\xiword{11}
2071 \def\xword{10}
2072 \def\xwordpt{10pt}
2073 %
2074 \parseargdef\fonttextsize{%
2075   \def\textsizearg{#1}%
2076   %\wlog{doing @fonttextsize \textsizearg}%
2077   %
2078   % Set \globaldefs so that documents can use this inside @tex, since
2079   % makeinfo 4.8 does not support it, but we need it nonetheless.
2080   %
2081  \begingroup \globaldefs=1
2082   \ifx\textsizearg\xword \definetextfontsizex
2083   \else \ifx\textsizearg\xiword \definetextfontsizexi
2084   \else
2085     \errhelp=\EMsimple
2086     \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'}
2087   \fi\fi
2088  \endgroup
2089 }
2090
2091
2092 % In order for the font changes to affect most math symbols and letters,
2093 % we have to define the \textfont of the standard families.  Since
2094 % texinfo doesn't allow for producing subscripts and superscripts except
2095 % in the main text, we don't bother to reset \scriptfont and
2096 % \scriptscriptfont (which would also require loading a lot more fonts).
2097 %
2098 \def\resetmathfonts{%
2099   \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy
2100   \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf
2101   \textfont\ttfam=\tentt \textfont\sffam=\tensf
2102 }
2103
2104 % The font-changing commands redefine the meanings of \tenSTYLE, instead
2105 % of just \STYLE.  We do this because \STYLE needs to also set the
2106 % current \fam for math mode.  Our \STYLE (e.g., \rm) commands hardwire
2107 % \tenSTYLE to set the current font.
2108 %
2109 % Each font-changing command also sets the names \lsize (one size lower)
2110 % and \lllsize (three sizes lower).  These relative commands are used in
2111 % the LaTeX logo and acronyms.
2112 %
2113 % This all needs generalizing, badly.
2114 %
2115 \def\textfonts{%
2116   \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
2117   \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
2118   \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy
2119   \let\tenttsl=\textttsl
2120   \def\curfontsize{text}%
2121   \def\lsize{reduced}\def\lllsize{smaller}%
2122   \resetmathfonts \setleading{\textleading}}
2123 \def\titlefonts{%
2124   \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl
2125   \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc
2126   \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy
2127   \let\tenttsl=\titlettsl
2128   \def\curfontsize{title}%
2129   \def\lsize{chap}\def\lllsize{subsec}%
2130   \resetmathfonts \setleading{27pt}}
2131 \def\titlefont#1{{\titlefonts\rmisbold #1}}
2132 \def\chapfonts{%
2133   \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
2134   \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
2135   \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy
2136   \let\tenttsl=\chapttsl
2137   \def\curfontsize{chap}%
2138   \def\lsize{sec}\def\lllsize{text}%
2139   \resetmathfonts \setleading{19pt}}
2140 \def\secfonts{%
2141   \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
2142   \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
2143   \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy
2144   \let\tenttsl=\secttsl
2145   \def\curfontsize{sec}%
2146   \def\lsize{subsec}\def\lllsize{reduced}%
2147   \resetmathfonts \setleading{16pt}}
2148 \def\subsecfonts{%
2149   \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
2150   \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
2151   \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy
2152   \let\tenttsl=\ssecttsl
2153   \def\curfontsize{ssec}%
2154   \def\lsize{text}\def\lllsize{small}%
2155   \resetmathfonts \setleading{15pt}}
2156 \let\subsubsecfonts = \subsecfonts
2157 \def\reducedfonts{%
2158   \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl
2159   \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc
2160   \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy
2161   \let\tenttsl=\reducedttsl
2162   \def\curfontsize{reduced}%
2163   \def\lsize{small}\def\lllsize{smaller}%
2164   \resetmathfonts \setleading{10.5pt}}
2165 \def\smallfonts{%
2166   \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl
2167   \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc
2168   \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy
2169   \let\tenttsl=\smallttsl
2170   \def\curfontsize{small}%
2171   \def\lsize{smaller}\def\lllsize{smaller}%
2172   \resetmathfonts \setleading{10.5pt}}
2173 \def\smallerfonts{%
2174   \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl
2175   \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc
2176   \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy
2177   \let\tenttsl=\smallerttsl
2178   \def\curfontsize{smaller}%
2179   \def\lsize{smaller}\def\lllsize{smaller}%
2180   \resetmathfonts \setleading{9.5pt}}
2181
2182 % Fonts for short table of contents.
2183 \setfont\shortcontrm\rmshape{12}{1000}{OT1}
2184 \setfont\shortcontbf\bfshape{10}{\magstep1}{OT1}  % no cmb12
2185 \setfont\shortcontsl\slshape{12}{1000}{OT1}
2186 \setfont\shortconttt\ttshape{12}{1000}{OT1TT}
2187
2188 % Define these just so they can be easily changed for other fonts.
2189 \def\angleleft{$\langle$}
2190 \def\angleright{$\rangle$}
2191
2192 % Set the fonts to use with the @small... environments.
2193 \let\smallexamplefonts = \smallfonts
2194
2195 % About \smallexamplefonts.  If we use \smallfonts (9pt), @smallexample
2196 % can fit this many characters:
2197 %   8.5x11=86   smallbook=72  a4=90  a5=69
2198 % If we use \scriptfonts (8pt), then we can fit this many characters:
2199 %   8.5x11=90+  smallbook=80  a4=90+  a5=77
2200 % For me, subjectively, the few extra characters that fit aren't worth
2201 % the additional smallness of 8pt.  So I'm making the default 9pt.
2202 %
2203 % By the way, for comparison, here's what fits with @example (10pt):
2204 %   8.5x11=71  smallbook=60  a4=75  a5=58
2205 % --karl, 24jan03.
2206
2207 % Set up the default fonts, so we can use them for creating boxes.
2208 %
2209 \definetextfontsizexi
2210
2211
2212 \message{markup,}
2213
2214 % Check if we are currently using a typewriter font.  Since all the
2215 % Computer Modern typewriter fonts have zero interword stretch (and
2216 % shrink), and it is reasonable to expect all typewriter fonts to have
2217 % this property, we can check that font parameter.
2218 %
2219 \def\ifmonospace{\ifdim\fontdimen3\font=0pt }
2220
2221 % Markup style infrastructure.  \defmarkupstylesetup\INITMACRO will
2222 % define and register \INITMACRO to be called on markup style changes.
2223 % \INITMACRO can check \currentmarkupstyle for the innermost
2224 % style and the set of \ifmarkupSTYLE switches for all styles
2225 % currently in effect.
2226 \newif\ifmarkupvar
2227 \newif\ifmarkupsamp
2228 \newif\ifmarkupkey
2229 %\newif\ifmarkupfile % @file == @samp.
2230 %\newif\ifmarkupoption % @option == @samp.
2231 \newif\ifmarkupcode
2232 \newif\ifmarkupkbd
2233 %\newif\ifmarkupenv % @env == @code.
2234 %\newif\ifmarkupcommand % @command == @code.
2235 \newif\ifmarkuptex % @tex (and part of @math, for now).
2236 \newif\ifmarkupexample
2237 \newif\ifmarkupverb
2238 \newif\ifmarkupverbatim
2239
2240 \let\currentmarkupstyle\empty
2241
2242 \def\setupmarkupstyle#1{%
2243   \csname markup#1true\endcsname
2244   \def\currentmarkupstyle{#1}%
2245   \markupstylesetup
2246 }
2247
2248 \let\markupstylesetup\empty
2249
2250 \def\defmarkupstylesetup#1{%
2251   \expandafter\def\expandafter\markupstylesetup
2252     \expandafter{\markupstylesetup #1}%
2253   \def#1%
2254 }
2255
2256 % Markup style setup for left and right quotes.
2257 \defmarkupstylesetup\markupsetuplq{%
2258   \expandafter\let\expandafter \temp
2259     \csname markupsetuplq\currentmarkupstyle\endcsname
2260   \ifx\temp\relax \markupsetuplqdefault \else \temp \fi
2261 }
2262
2263 \defmarkupstylesetup\markupsetuprq{%
2264   \expandafter\let\expandafter \temp
2265     \csname markupsetuprq\currentmarkupstyle\endcsname
2266   \ifx\temp\relax \markupsetuprqdefault \else \temp \fi
2267 }
2268
2269 {
2270 \catcode`\'=\active
2271 \catcode`\`=\active
2272
2273 \gdef\markupsetuplqdefault{\let`\lq}
2274 \gdef\markupsetuprqdefault{\let'\rq}
2275
2276 \gdef\markupsetcodequoteleft{\let`\codequoteleft}
2277 \gdef\markupsetcodequoteright{\let'\codequoteright}
2278
2279 \gdef\markupsetnoligaturesquoteleft{\let`\noligaturesquoteleft}
2280 }
2281
2282 \let\markupsetuplqcode \markupsetcodequoteleft
2283 \let\markupsetuprqcode \markupsetcodequoteright
2284 %
2285 \let\markupsetuplqexample \markupsetcodequoteleft
2286 \let\markupsetuprqexample \markupsetcodequoteright
2287 %
2288 \let\markupsetuplqsamp \markupsetcodequoteleft
2289 \let\markupsetuprqsamp \markupsetcodequoteright
2290 %
2291 \let\markupsetuplqverb \markupsetcodequoteleft
2292 \let\markupsetuprqverb \markupsetcodequoteright
2293 %
2294 \let\markupsetuplqverbatim \markupsetcodequoteleft
2295 \let\markupsetuprqverbatim \markupsetcodequoteright
2296
2297 \let\markupsetuplqkbd \markupsetnoligaturesquoteleft
2298
2299 % Allow an option to not use regular directed right quote/apostrophe
2300 % (char 0x27), but instead the undirected quote from cmtt (char 0x0d).
2301 % The undirected quote is ugly, so don't make it the default, but it
2302 % works for pasting with more pdf viewers (at least evince), the
2303 % lilypond developers report.  xpdf does work with the regular 0x27.
2304 %
2305 \def\codequoteright{%
2306   \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax
2307     \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax
2308       '%
2309     \else \char'15 \fi
2310   \else \char'15 \fi
2311 }
2312 %
2313 % and a similar option for the left quote char vs. a grave accent.
2314 % Modern fonts display ASCII 0x60 as a grave accent, so some people like
2315 % the code environments to do likewise.
2316 %
2317 \def\codequoteleft{%
2318   \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax
2319     \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax
2320       % [Knuth] pp. 380,381,391
2321       % \relax disables Spanish ligatures ?` and !` of \tt font.
2322       \relax`%
2323     \else \char'22 \fi
2324   \else \char'22 \fi
2325 }
2326
2327 % Commands to set the quote options.
2328
2329 \parseargdef\codequoteundirected{%
2330   \def\temp{#1}%
2331   \ifx\temp\onword
2332     \expandafter\let\csname SETtxicodequoteundirected\endcsname
2333       = t%
2334   \else\ifx\temp\offword
2335     \expandafter\let\csname SETtxicodequoteundirected\endcsname
2336       = \relax
2337   \else
2338     \errhelp = \EMsimple
2339     \errmessage{Unknown @codequoteundirected value `\temp', must be on|off}%
2340   \fi\fi
2341 }
2342 %
2343 \parseargdef\codequotebacktick{%
2344   \def\temp{#1}%
2345   \ifx\temp\onword
2346     \expandafter\let\csname SETtxicodequotebacktick\endcsname
2347       = t%
2348   \else\ifx\temp\offword
2349     \expandafter\let\csname SETtxicodequotebacktick\endcsname
2350       = \relax
2351   \else
2352     \errhelp = \EMsimple
2353     \errmessage{Unknown @codequotebacktick value `\temp', must be on|off}%
2354   \fi\fi
2355 }
2356
2357 % [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font.
2358 \def\noligaturesquoteleft{\relax\lq}
2359
2360 % Count depth in font-changes, for error checks
2361 \newcount\fontdepth \fontdepth=0
2362
2363 % Font commands.
2364
2365 % #1 is the font command (\sl or \it), #2 is the text to slant.
2366 % If we are in a monospaced environment, however, 1) always use \ttsl,
2367 % and 2) do not add an italic correction.
2368 \def\dosmartslant#1#2{%
2369   \ifusingtt 
2370     {{\ttsl #2}\let\next=\relax}%
2371     {\def\next{{#1#2}\futurelet\next\smartitaliccorrection}}%
2372   \next
2373 }
2374 \def\smartslanted{\dosmartslant\sl}
2375 \def\smartitalic{\dosmartslant\it}
2376
2377 % Output an italic correction unless \next (presumed to be the following
2378 % character) is such as not to need one.
2379 \def\smartitaliccorrection{%
2380   \ifx\next,%
2381   \else\ifx\next-%
2382   \else\ifx\next.%
2383   \else\ptexslash
2384   \fi\fi\fi}
2385
2386 % like \smartslanted except unconditionally uses \ttsl, and no ic.
2387 % @var is set to this for defun arguments.
2388 \def\ttslanted#1{{\ttsl #1}}
2389
2390 % @cite is like \smartslanted except unconditionally use \sl.  We never want
2391 % ttsl for book titles, do we?
2392 \def\cite#1{{\sl #1}\futurelet\next\smartitaliccorrection}
2393
2394 \let\i=\smartitalic
2395 \let\slanted=\smartslanted
2396 \def\var#1{\smartslanted{#1}}
2397 \let\dfn=\smartslanted
2398 \let\emph=\smartitalic
2399
2400 % Explicit font changes: @r, @sc, undocumented @ii.
2401 \def\r#1{{\rm #1}}              % roman font
2402 \def\sc#1{{\smallcaps#1}}       % smallcaps font
2403 \def\ii#1{{\it #1}}             % italic font
2404
2405 % @b, explicit bold.  Also @strong.
2406 \def\b#1{{\bf #1}}
2407 \let\strong=\b
2408
2409 % @sansserif, explicit sans.
2410 \def\sansserif#1{{\sf #1}}
2411
2412 % We can't just use \exhyphenpenalty, because that only has effect at
2413 % the end of a paragraph.  Restore normal hyphenation at the end of the
2414 % group within which \nohyphenation is presumably called.
2415 %
2416 \def\nohyphenation{\hyphenchar\font = -1  \aftergroup\restorehyphenation}
2417 \def\restorehyphenation{\hyphenchar\font = `- }
2418
2419 % Set sfcode to normal for the chars that usually have another value.
2420 % Can't use plain's \frenchspacing because it uses the `\x notation, and
2421 % sometimes \x has an active definition that messes things up.
2422 %
2423 \catcode`@=11
2424   \def\plainfrenchspacing{%
2425     \sfcode\dotChar  =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m
2426     \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m
2427     \def\endofsentencespacefactor{1000}% for @. and friends
2428   }
2429   \def\plainnonfrenchspacing{%
2430     \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000
2431     \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250
2432     \def\endofsentencespacefactor{3000}% for @. and friends
2433   }
2434 \catcode`@=\other
2435 \def\endofsentencespacefactor{3000}% default
2436
2437 % @t, explicit typewriter.
2438 \def\t#1{%
2439   {\tt \rawbackslash \plainfrenchspacing #1}%
2440   \null
2441 }
2442
2443 % @samp.
2444 \def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}}
2445
2446 % definition of @key that produces a lozenge.  Doesn't adjust to text size.
2447 %\setfont\keyrm\rmshape{8}{1000}{OT1}
2448 %\font\keysy=cmsy9
2449 %\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{%
2450 %  \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{%
2451 %    \vbox{\hrule\kern-0.4pt
2452 %     \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}%
2453 %    \kern-0.4pt\hrule}%
2454 %  \kern-.06em\raise0.4pt\hbox{\angleright}}}}
2455
2456 % definition of @key with no lozenge.  If the current font is already
2457 % monospace, don't change it; that way, we respect @kbdinputstyle.  But
2458 % if it isn't monospace, then use \tt.
2459 %
2460 \def\key#1{{\setupmarkupstyle{key}%
2461   \nohyphenation
2462   \ifmonospace\else\tt\fi
2463   #1}\null}
2464
2465 % ctrl is no longer a Texinfo command.
2466 \def\ctrl #1{{\tt \rawbackslash \hat}#1}
2467
2468 % @file, @option are the same as @samp.
2469 \let\file=\samp
2470 \let\option=\samp
2471
2472 % @code is a modification of @t,
2473 % which makes spaces the same size as normal in the surrounding text.
2474 \def\tclose#1{%
2475   {%
2476     % Change normal interword space to be same as for the current font.
2477     \spaceskip = \fontdimen2\font
2478     %
2479     % Switch to typewriter.
2480     \tt
2481     %
2482     % But `\ ' produces the large typewriter interword space.
2483     \def\ {{\spaceskip = 0pt{} }}%
2484     %
2485     % Turn off hyphenation.
2486     \nohyphenation
2487     %
2488     \rawbackslash
2489     \plainfrenchspacing
2490     #1%
2491   }%
2492   \null
2493 }
2494
2495 % We *must* turn on hyphenation at `-' and `_' in @code.
2496 % Otherwise, it is too hard to avoid overfull hboxes
2497 % in the Emacs manual, the Library manual, etc.
2498
2499 % Unfortunately, TeX uses one parameter (\hyphenchar) to control
2500 % both hyphenation at - and hyphenation within words.
2501 % We must therefore turn them both off (\tclose does that)
2502 % and arrange explicitly to hyphenate at a dash.
2503 %  -- rms.
2504 {
2505   \catcode`\-=\active \catcode`\_=\active
2506   \catcode`\'=\active \catcode`\`=\active
2507   \global\let'=\rq \global\let`=\lq  % default definitions
2508   %
2509   \global\def\code{\begingroup
2510     \setupmarkupstyle{code}%
2511     % The following should really be moved into \setupmarkupstyle handlers.
2512     \catcode\dashChar=\active  \catcode\underChar=\active
2513     \ifallowcodebreaks
2514      \let-\codedash
2515      \let_\codeunder
2516     \else
2517      \let-\realdash
2518      \let_\realunder
2519     \fi
2520     \codex
2521   }
2522 }
2523
2524 \def\codex #1{\tclose{#1}\endgroup}
2525
2526 \def\realdash{-}
2527 \def\codedash{-\discretionary{}{}{}}
2528 \def\codeunder{%
2529   % this is all so @math{@code{var_name}+1} can work.  In math mode, _
2530   % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.)
2531   % will therefore expand the active definition of _, which is us
2532   % (inside @code that is), therefore an endless loop.
2533   \ifusingtt{\ifmmode
2534                \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_.
2535              \else\normalunderscore \fi
2536              \discretionary{}{}{}}%
2537             {\_}%
2538 }
2539
2540 % An additional complication: the above will allow breaks after, e.g.,
2541 % each of the four underscores in __typeof__.  This is undesirable in
2542 % some manuals, especially if they don't have long identifiers in
2543 % general.  @allowcodebreaks provides a way to control this.
2544 %
2545 \newif\ifallowcodebreaks  \allowcodebreakstrue
2546
2547 \def\keywordtrue{true}
2548 \def\keywordfalse{false}
2549
2550 \parseargdef\allowcodebreaks{%
2551   \def\txiarg{#1}%
2552   \ifx\txiarg\keywordtrue
2553     \allowcodebreakstrue
2554   \else\ifx\txiarg\keywordfalse
2555     \allowcodebreaksfalse
2556   \else
2557     \errhelp = \EMsimple
2558     \errmessage{Unknown @allowcodebreaks option `\txiarg', must be true|false}%
2559   \fi\fi
2560 }
2561
2562 % @uref (abbreviation for `urlref') takes an optional (comma-separated)
2563 % second argument specifying the text to display and an optional third
2564 % arg as text to display instead of (rather than in addition to) the url
2565 % itself.  First (mandatory) arg is the url.
2566 % (This \urefnobreak definition isn't used now, leaving it for a while
2567 % for comparison.)
2568 \def\urefnobreak#1{\dourefnobreak #1,,,\finish}
2569 \def\dourefnobreak#1,#2,#3,#4\finish{\begingroup
2570   \unsepspaces
2571   \pdfurl{#1}%
2572   \setbox0 = \hbox{\ignorespaces #3}%
2573   \ifdim\wd0 > 0pt
2574     \unhbox0 % third arg given, show only that
2575   \else
2576     \setbox0 = \hbox{\ignorespaces #2}%
2577     \ifdim\wd0 > 0pt
2578       \ifpdf
2579         \unhbox0             % PDF: 2nd arg given, show only it
2580       \else
2581         \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url
2582       \fi
2583     \else
2584       \code{#1}% only url given, so show it
2585     \fi
2586   \fi
2587   \endlink
2588 \endgroup}
2589
2590 % This \urefbreak definition is the active one.
2591 \def\urefbreak{\begingroup \urefcatcodes \dourefbreak}
2592 \let\uref=\urefbreak
2593 \def\dourefbreak#1{\urefbreakfinish #1,,,\finish}
2594 \def\urefbreakfinish#1,#2,#3,#4\finish{% doesn't work in @example
2595   \unsepspaces
2596   \pdfurl{#1}%
2597   \setbox0 = \hbox{\ignorespaces #3}%
2598   \ifdim\wd0 > 0pt
2599     \unhbox0 % third arg given, show only that
2600   \else
2601     \setbox0 = \hbox{\ignorespaces #2}%
2602     \ifdim\wd0 > 0pt
2603       \ifpdf
2604         \unhbox0             % PDF: 2nd arg given, show only it
2605       \else
2606         \unhbox0\ (\urefcode{#1})% DVI: 2nd arg given, show both it and url
2607       \fi
2608     \else
2609       \urefcode{#1}% only url given, so show it
2610     \fi
2611   \fi
2612   \endlink
2613 \endgroup}
2614
2615 % Allow line breaks around only a few characters (only).
2616 \def\urefcatcodes{%
2617   \catcode\ampChar=\active   \catcode\dotChar=\active
2618   \catcode\hashChar=\active  \catcode\questChar=\active
2619   \catcode\slashChar=\active
2620 }
2621 {
2622   \urefcatcodes
2623   %
2624   \global\def\urefcode{\begingroup
2625     \setupmarkupstyle{code}%
2626     \urefcatcodes
2627     \let&\urefcodeamp
2628     \let.\urefcodedot
2629     \let#\urefcodehash
2630     \let?\urefcodequest
2631     \let/\urefcodeslash
2632     \codex
2633   }
2634   %
2635   % By default, they are just regular characters.
2636   \global\def&{\normalamp}
2637   \global\def.{\normaldot}
2638   \global\def#{\normalhash}
2639   \global\def?{\normalquest}
2640   \global\def/{\normalslash}
2641 }
2642
2643 % we put a little stretch before and after the breakable chars, to help
2644 % line breaking of long url's.  The unequal skips make look better in
2645 % cmtt at least, especially for dots.
2646 \def\urefprestretch{\urefprebreak \hskip0pt plus.13em }
2647 \def\urefpoststretch{\urefpostbreak \hskip0pt plus.1em }
2648 %
2649 \def\urefcodeamp{\urefprestretch \&\urefpoststretch}
2650 \def\urefcodedot{\urefprestretch .\urefpoststretch}
2651 \def\urefcodehash{\urefprestretch \#\urefpoststretch}
2652 \def\urefcodequest{\urefprestretch ?\urefpoststretch}
2653 \def\urefcodeslash{\futurelet\next\urefcodeslashfinish}
2654 {
2655   \catcode`\/=\active
2656   \global\def\urefcodeslashfinish{%
2657     \urefprestretch \slashChar
2658     % Allow line break only after the final / in a sequence of
2659     % slashes, to avoid line break between the slashes in http://.
2660     \ifx\next/\else \urefpoststretch \fi
2661   }
2662 }
2663
2664 % One more complication: by default we'll break after the special
2665 % characters, but some people like to break before the special chars, so
2666 % allow that.  Also allow no breaking at all, for manual control.
2667
2668 \parseargdef\urefbreakstyle{%
2669   \def\txiarg{#1}%
2670   \ifx\txiarg\wordnone
2671     \def\urefprebreak{\nobreak}\def\urefpostbreak{\nobreak}
2672   \else\ifx\txiarg\wordbefore
2673     \def\urefprebreak{\allowbreak}\def\urefpostbreak{\nobreak}
2674   \else\ifx\txiarg\wordafter
2675     \def\urefprebreak{\nobreak}\def\urefpostbreak{\allowbreak}
2676   \else
2677     \errhelp = \EMsimple
2678     \errmessage{Unknown @urefbreakstyle setting `\txiarg'}%
2679   \fi\fi\fi
2680 }
2681 \def\wordafter{after}
2682 \def\wordbefore{before}
2683 \def\wordnone{none}
2684
2685 \urefbreakstyle after
2686
2687 % @url synonym for @uref, since that's how everyone uses it.
2688 %
2689 \let\url=\uref
2690
2691 % rms does not like angle brackets --karl, 17may97.
2692 % So now @email is just like @uref, unless we are pdf.
2693 %
2694 %\def\email#1{\angleleft{\tt #1}\angleright}
2695 \ifpdf
2696   \def\email#1{\doemail#1,,\finish}
2697   \def\doemail#1,#2,#3\finish{\begingroup
2698     \unsepspaces
2699     \pdfurl{mailto:#1}%
2700     \setbox0 = \hbox{\ignorespaces #2}%
2701     \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi
2702     \endlink
2703   \endgroup}
2704 \else
2705   \let\email=\uref
2706 \fi
2707
2708 % @kbd is like @code, except that if the argument is just one @key command,
2709 % then @kbd has no effect.
2710 \def\kbd#1{{\setupmarkupstyle{kbd}\def\look{#1}\expandafter\kbdfoo\look??\par}}
2711
2712 % @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
2713 %   `example' (@kbd uses ttsl only inside of @example and friends),
2714 %   or `code' (@kbd uses normal tty font always).
2715 \parseargdef\kbdinputstyle{%
2716   \def\txiarg{#1}%
2717   \ifx\txiarg\worddistinct
2718     \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
2719   \else\ifx\txiarg\wordexample
2720     \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%
2721   \else\ifx\txiarg\wordcode
2722     \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
2723   \else
2724     \errhelp = \EMsimple
2725     \errmessage{Unknown @kbdinputstyle setting `\txiarg'}%
2726   \fi\fi\fi
2727 }
2728 \def\worddistinct{distinct}
2729 \def\wordexample{example}
2730 \def\wordcode{code}
2731
2732 % Default is `distinct'.
2733 \kbdinputstyle distinct
2734
2735 \def\xkey{\key}
2736 \def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
2737 \ifx\one\xkey\ifx\threex\three \key{#2}%
2738 \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi
2739 \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi}
2740
2741 % For @indicateurl, @env, @command quotes seem unnecessary, so use \code.
2742 \let\indicateurl=\code
2743 \let\env=\code
2744 \let\command=\code
2745
2746 % @clicksequence{File @click{} Open ...}
2747 \def\clicksequence#1{\begingroup #1\endgroup}
2748
2749 % @clickstyle @arrow   (by default)
2750 \parseargdef\clickstyle{\def\click{#1}}
2751 \def\click{\arrow}
2752
2753 % Typeset a dimension, e.g., `in' or `pt'.  The only reason for the
2754 % argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
2755 %
2756 \def\dmn#1{\thinspace #1}
2757
2758 % @l was never documented to mean ``switch to the Lisp font'',
2759 % and it is not used as such in any manual I can find.  We need it for
2760 % Polish suppressed-l.  --karl, 22sep96.
2761 %\def\l#1{{\li #1}\null}
2762
2763 % @acronym for "FBI", "NATO", and the like.
2764 % We print this one point size smaller, since it's intended for
2765 % all-uppercase.
2766 %
2767 \def\acronym#1{\doacronym #1,,\finish}
2768 \def\doacronym#1,#2,#3\finish{%
2769   {\selectfonts\lsize #1}%
2770   \def\temp{#2}%
2771   \ifx\temp\empty \else
2772     \space ({\unsepspaces \ignorespaces \temp \unskip})%
2773   \fi
2774 }
2775
2776 % @abbr for "Comput. J." and the like.
2777 % No font change, but don't do end-of-sentence spacing.
2778 %
2779 \def\abbr#1{\doabbr #1,,\finish}
2780 \def\doabbr#1,#2,#3\finish{%
2781   {\plainfrenchspacing #1}%
2782   \def\temp{#2}%
2783   \ifx\temp\empty \else
2784     \space ({\unsepspaces \ignorespaces \temp \unskip})%
2785   \fi
2786 }
2787
2788 % @asis just yields its argument.  Used with @table, for example.
2789 %
2790 \def\asis#1{#1}
2791
2792 % @math outputs its argument in math mode.
2793 %
2794 % One complication: _ usually means subscripts, but it could also mean
2795 % an actual _ character, as in @math{@var{some_variable} + 1}.  So make
2796 % _ active, and distinguish by seeing if the current family is \slfam,
2797 % which is what @var uses.
2798 {
2799   \catcode`\_ = \active
2800   \gdef\mathunderscore{%
2801     \catcode`\_=\active
2802     \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
2803   }
2804 }
2805 % Another complication: we want \\ (and @\) to output a math (or tt) \.
2806 % FYI, plain.tex uses \\ as a temporary control sequence (for no
2807 % particular reason), but this is not advertised and we don't care.
2808 %
2809 % The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\.
2810 \def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}
2811 %
2812 \def\math{%
2813   \tex
2814   \mathunderscore
2815   \let\\ = \mathbackslash
2816   \mathactive
2817   % make the texinfo accent commands work in math mode
2818   \let\"=\ddot
2819   \let\'=\acute
2820   \let\==\bar
2821   \let\^=\hat
2822   \let\`=\grave
2823   \let\u=\breve
2824   \let\v=\check
2825   \let\~=\tilde
2826   \let\dotaccent=\dot
2827   $\finishmath
2828 }
2829 \def\finishmath#1{#1$\endgroup}  % Close the group opened by \tex.
2830
2831 % Some active characters (such as <) are spaced differently in math.
2832 % We have to reset their definitions in case the @math was an argument
2833 % to a command which sets the catcodes (such as @item or @section).
2834 %
2835 {
2836   \catcode`^ = \active
2837   \catcode`< = \active
2838   \catcode`> = \active
2839   \catcode`+ = \active
2840   \catcode`' = \active
2841   \gdef\mathactive{%
2842     \let^ = \ptexhat
2843     \let< = \ptexless
2844     \let> = \ptexgtr
2845     \let+ = \ptexplus
2846     \let' = \ptexquoteright
2847   }
2848 }
2849
2850
2851 \message{glyphs,}
2852 % and logos.
2853
2854 % @@ prints an @.
2855 \def\@{\char64 }
2856
2857 % Used to generate quoted braces.  Unless we're in typewriter, use
2858 % \ecfont because the CM text fonts do not have braces, and we don't
2859 % want to switch into math.
2860 \def\mylbrace{{\ifmonospace\else\ecfont\fi \char123}}
2861 \def\myrbrace{{\ifmonospace\else\ecfont\fi \char125}}
2862 \let\{=\mylbrace
2863 \let\}=\myrbrace
2864 \begingroup
2865   % Definitions to produce \{ and \} commands for indices,
2866   % and @{ and @} for the aux/toc files.
2867   \catcode`\{ = \other \catcode`\} = \other
2868   \catcode`\[ = 1 \catcode`\] = 2
2869   \catcode`\! = 0 \catcode`\\ = \other
2870   !gdef!lbracecmd[\{]%
2871   !gdef!rbracecmd[\}]%
2872   !gdef!lbraceatcmd[@{]%
2873   !gdef!rbraceatcmd[@}]%
2874 !endgroup
2875
2876 % @comma{} to avoid , parsing problems.
2877 \let\comma = ,
2878
2879 % Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
2880 % Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
2881 \let\, = \ptexc
2882 \let\dotaccent = \ptexdot
2883 \def\ringaccent#1{{\accent23 #1}}
2884 \let\tieaccent = \ptext
2885 \let\ubaraccent = \ptexb
2886 \let\udotaccent = \d
2887
2888 % Other special characters: @questiondown @exclamdown @ordf @ordm
2889 % Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
2890 \def\questiondown{?`}
2891 \def\exclamdown{!`}
2892 \def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}}
2893 \def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}}
2894
2895 % Dotless i and dotless j, used for accents.
2896 \def\imacro{i}
2897 \def\jmacro{j}
2898 \def\dotless#1{%
2899   \def\temp{#1}%
2900   \ifx\temp\imacro \ifmmode\imath \else\ptexi \fi
2901   \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi
2902   \else \errmessage{@dotless can be used only with i or j}%
2903   \fi\fi
2904 }
2905
2906 % The \TeX{} logo, as in plain, but resetting the spacing so that a
2907 % period following counts as ending a sentence.  (Idea found in latex.)
2908 %
2909 \edef\TeX{\TeX \spacefactor=1000 }
2910
2911 % @LaTeX{} logo.  Not quite the same results as the definition in
2912 % latex.ltx, since we use a different font for the raised A; it's most
2913 % convenient for us to use an explicitly smaller font, rather than using
2914 % the \scriptstyle font (since we don't reset \scriptstyle and
2915 % \scriptscriptstyle).
2916 %
2917 \def\LaTeX{%
2918   L\kern-.36em
2919   {\setbox0=\hbox{T}%
2920    \vbox to \ht0{\hbox{%
2921      \ifx\textnominalsize\xwordpt
2922        % for 10pt running text, \lllsize (8pt) is too small for the A in LaTeX.
2923        % Revert to plain's \scriptsize, which is 7pt.
2924        \count255=\the\fam $\fam\count255 \scriptstyle A$%
2925      \else
2926        % For 11pt, we can use our lllsize.
2927        \selectfonts\lllsize A%
2928      \fi
2929      }%
2930      \vss
2931   }}%
2932   \kern-.15em
2933   \TeX
2934 }
2935
2936 % Some math mode symbols.
2937 \def\bullet{$\ptexbullet$}
2938 \def\geq{\ifmmode \ge\else $\ge$\fi}
2939 \def\leq{\ifmmode \le\else $\le$\fi}
2940 \def\minus{\ifmmode -\else $-$\fi}
2941
2942 % @dots{} outputs an ellipsis using the current font.
2943 % We do .5em per period so that it has the same spacing in the cm
2944 % typewriter fonts as three actual period characters; on the other hand,
2945 % in other typewriter fonts three periods are wider than 1.5em.  So do
2946 % whichever is larger.
2947 %
2948 \def\dots{%
2949   \leavevmode
2950   \setbox0=\hbox{...}% get width of three periods
2951   \ifdim\wd0 > 1.5em
2952     \dimen0 = \wd0
2953   \else
2954     \dimen0 = 1.5em
2955   \fi
2956   \hbox to \dimen0{%
2957     \hskip 0pt plus.25fil
2958     .\hskip 0pt plus1fil
2959     .\hskip 0pt plus1fil
2960     .\hskip 0pt plus.5fil
2961   }%
2962 }
2963
2964 % @enddots{} is an end-of-sentence ellipsis.
2965 %
2966 \def\enddots{%
2967   \dots
2968   \spacefactor=\endofsentencespacefactor
2969 }
2970
2971 % @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
2972 %
2973 % Since these characters are used in examples, they should be an even number of
2974 % \tt widths. Each \tt character is 1en, so two makes it 1em.
2975 %
2976 \def\point{$\star$}
2977 \def\arrow{\leavevmode\raise.05ex\hbox to 1em{\hfil$\rightarrow$\hfil}}
2978 \def\result{\leavevmode\raise.05ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
2979 \def\expansion{\leavevmode\hbox to 1em{\hfil$\mapsto$\hfil}}
2980 \def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
2981 \def\equiv{\leavevmode\hbox to 1em{\hfil$\ptexequiv$\hfil}}
2982
2983 % The @error{} command.
2984 % Adapted from the TeXbook's \boxit.
2985 %
2986 \newbox\errorbox
2987 %
2988 {\tentt \global\dimen0 = 3em}% Width of the box.
2989 \dimen2 = .55pt % Thickness of rules
2990 % The text. (`r' is open on the right, `e' somewhat less so on the left.)
2991 \setbox0 = \hbox{\kern-.75pt \reducedsf error\kern-1.5pt}
2992 %
2993 \setbox\errorbox=\hbox to \dimen0{\hfil
2994    \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
2995    \advance\hsize by -2\dimen2 % Rules.
2996    \vbox{%
2997       \hrule height\dimen2
2998       \hbox{\vrule width\dimen2 \kern3pt          % Space to left of text.
2999          \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
3000          \kern3pt\vrule width\dimen2}% Space to right.
3001       \hrule height\dimen2}
3002     \hfil}
3003 %
3004 \def\error{\leavevmode\lower.7ex\copy\errorbox}
3005
3006 % @pounds{} is a sterling sign, which Knuth put in the CM italic font.
3007 %
3008 \def\pounds{{\it\$}}
3009
3010 % @euro{} comes from a separate font, depending on the current style.
3011 % We use the free feym* fonts from the eurosym package by Henrik
3012 % Theiling, which support regular, slanted, bold and bold slanted (and
3013 % "outlined" (blackboard board, sort of) versions, which we don't need).
3014 % It is available from http://www.ctan.org/tex-archive/fonts/eurosym.
3015 %
3016 % Although only regular is the truly official Euro symbol, we ignore
3017 % that.  The Euro is designed to be slightly taller than the regular
3018 % font height.
3019 %
3020 % feymr - regular
3021 % feymo - slanted
3022 % feybr - bold
3023 % feybo - bold slanted
3024 %
3025 % There is no good (free) typewriter version, to my knowledge.
3026 % A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide.
3027 % Hmm.
3028 %
3029 % Also doesn't work in math.  Do we need to do math with euro symbols?
3030 % Hope not.
3031 %
3032 %
3033 \def\euro{{\eurofont e}}
3034 \def\eurofont{%
3035   % We set the font at each command, rather than predefining it in
3036   % \textfonts and the other font-switching commands, so that
3037   % installations which never need the symbol don't have to have the
3038   % font installed.
3039   %
3040   % There is only one designed size (nominal 10pt), so we always scale
3041   % that to the current nominal size.
3042   %
3043   % By the way, simply using "at 1em" works for cmr10 and the like, but
3044   % does not work for cmbx10 and other extended/shrunken fonts.
3045   %
3046   \def\eurosize{\csname\curfontsize nominalsize\endcsname}%
3047   %
3048   \ifx\curfontstyle\bfstylename
3049     % bold:
3050     \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize
3051   \else
3052     % regular:
3053     \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize
3054   \fi
3055   \thiseurofont
3056 }
3057
3058 % Glyphs from the EC fonts.  We don't use \let for the aliases, because
3059 % sometimes we redefine the original macro, and the alias should reflect
3060 % the redefinition.
3061 %
3062 % Use LaTeX names for the Icelandic letters.
3063 \def\DH{{\ecfont \char"D0}} % Eth
3064 \def\dh{{\ecfont \char"F0}} % eth
3065 \def\TH{{\ecfont \char"DE}} % Thorn
3066 \def\th{{\ecfont \char"FE}} % thorn
3067 %
3068 \def\guillemetleft{{\ecfont \char"13}}
3069 \def\guillemotleft{\guillemetleft}
3070 \def\guillemetright{{\ecfont \char"14}}
3071 \def\guillemotright{\guillemetright}
3072 \def\guilsinglleft{{\ecfont \char"0E}}
3073 \def\guilsinglright{{\ecfont \char"0F}}
3074 \def\quotedblbase{{\ecfont \char"12}}
3075 \def\quotesinglbase{{\ecfont \char"0D}}
3076 %
3077 % This positioning is not perfect (see the ogonek LaTeX package), but
3078 % we have the precomposed glyphs for the most common cases.  We put the
3079 % tests to use those glyphs in the single \ogonek macro so we have fewer
3080 % dummy definitions to worry about for index entries, etc.
3081 %
3082 % ogonek is also used with other letters in Lithuanian (IOU), but using
3083 % the precomposed glyphs for those is not so easy since they aren't in
3084 % the same EC font.
3085 \def\ogonek#1{{%
3086   \def\temp{#1}%
3087   \ifx\temp\macrocharA\Aogonek
3088   \else\ifx\temp\macrochara\aogonek
3089   \else\ifx\temp\macrocharE\Eogonek
3090   \else\ifx\temp\macrochare\eogonek
3091   \else
3092     \ecfont \setbox0=\hbox{#1}%
3093     \ifdim\ht0=1ex\accent"0C #1%
3094     \else\ooalign{\unhbox0\crcr\hidewidth\char"0C \hidewidth}%
3095     \fi
3096   \fi\fi\fi\fi
3097   }%
3098 }
3099 \def\Aogonek{{\ecfont \char"81}}\def\macrocharA{A}
3100 \def\aogonek{{\ecfont \char"A1}}\def\macrochara{a}
3101 \def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E}
3102 \def\eogonek{{\ecfont \char"A6}}\def\macrochare{e}
3103 %
3104 % Use the ec* fonts (cm-super in outline format) for non-CM glyphs.
3105 \def\ecfont{%
3106   % We can't distinguish serif/sans and italic/slanted, but this
3107   % is used for crude hacks anyway (like adding French and German
3108   % quotes to documents typeset with CM, where we lose kerning), so
3109   % hopefully nobody will notice/care.
3110   \edef\ecsize{\csname\curfontsize ecsize\endcsname}%
3111   \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}%
3112   \ifx\curfontstyle\bfstylename
3113     % bold:
3114     \font\thisecfont = ecb\ifusingit{i}{x}\ecsize \space at \nominalsize
3115   \else
3116     % regular:
3117     \font\thisecfont = ec\ifusingit{ti}{rm}\ecsize \space at \nominalsize
3118   \fi
3119   \thisecfont
3120 }
3121
3122 % @registeredsymbol - R in a circle.  The font for the R should really
3123 % be smaller yet, but lllsize is the best we can do for now.
3124 % Adapted from the plain.tex definition of \copyright.
3125 %
3126 \def\registeredsymbol{%
3127   $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}%
3128                \hfil\crcr\Orb}}%
3129     }$%
3130 }
3131
3132 % @textdegree - the normal degrees sign.
3133 %
3134 \def\textdegree{$^\circ$}
3135
3136 % Laurent Siebenmann reports \Orb undefined with:
3137 %  Textures 1.7.7 (preloaded format=plain 93.10.14)  (68K)  16 APR 2004 02:38
3138 % so we'll define it if necessary.
3139 %
3140 \ifx\Orb\thisisundefined
3141 \def\Orb{\mathhexbox20D}
3142 \fi
3143
3144 % Quotes.
3145 \chardef\quotedblleft="5C
3146 \chardef\quotedblright=`\"
3147 \chardef\quoteleft=`\`
3148 \chardef\quoteright=`\'
3149
3150
3151 \message{page headings,}
3152
3153 \newskip\titlepagetopglue \titlepagetopglue = 1.5in
3154 \newskip\titlepagebottomglue \titlepagebottomglue = 2pc
3155
3156 % First the title page.  Must do @settitle before @titlepage.
3157 \newif\ifseenauthor
3158 \newif\iffinishedtitlepage
3159
3160 % Do an implicit @contents or @shortcontents after @end titlepage if the
3161 % user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage.
3162 %
3163 \newif\ifsetcontentsaftertitlepage
3164  \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue
3165 \newif\ifsetshortcontentsaftertitlepage
3166  \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue
3167
3168 \parseargdef\shorttitlepage{%
3169   \begingroup \hbox{}\vskip 1.5in \chaprm \centerline{#1}%
3170   \endgroup\page\hbox{}\page}
3171
3172 \envdef\titlepage{%
3173   % Open one extra group, as we want to close it in the middle of \Etitlepage.
3174   \begingroup
3175     \parindent=0pt \textfonts
3176     % Leave some space at the very top of the page.
3177     \vglue\titlepagetopglue
3178     % No rule at page bottom unless we print one at the top with @title.
3179     \finishedtitlepagetrue
3180     %
3181     % Most title ``pages'' are actually two pages long, with space
3182     % at the top of the second.  We don't want the ragged left on the second.
3183     \let\oldpage = \page
3184     \def\page{%
3185       \iffinishedtitlepage\else
3186          \finishtitlepage
3187       \fi
3188       \let\page = \oldpage
3189       \page
3190       \null
3191     }%
3192 }
3193
3194 \def\Etitlepage{%
3195     \iffinishedtitlepage\else
3196         \finishtitlepage
3197     \fi
3198     % It is important to do the page break before ending the group,
3199     % because the headline and footline are only empty inside the group.
3200     % If we use the new definition of \page, we always get a blank page
3201     % after the title page, which we certainly don't want.
3202     \oldpage
3203   \endgroup
3204   %
3205   % Need this before the \...aftertitlepage checks so that if they are
3206   % in effect the toc pages will come out with page numbers.
3207   \HEADINGSon
3208   %
3209   % If they want short, they certainly want long too.
3210   \ifsetshortcontentsaftertitlepage
3211     \shortcontents
3212     \contents
3213     \global\let\shortcontents = \relax
3214     \global\let\contents = \relax
3215   \fi
3216   %
3217   \ifsetcontentsaftertitlepage
3218     \contents
3219     \global\let\contents = \relax
3220     \global\let\shortcontents = \relax
3221   \fi
3222 }
3223
3224 \def\finishtitlepage{%
3225   \vskip4pt \hrule height 2pt width \hsize
3226   \vskip\titlepagebottomglue
3227   \finishedtitlepagetrue
3228 }
3229
3230 %%% Macros to be used within @titlepage:
3231
3232 \let\subtitlerm=\tenrm
3233 \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}
3234
3235 \parseargdef\title{%
3236   \checkenv\titlepage
3237   \leftline{\titlefonts\rmisbold #1}
3238   % print a rule at the page bottom also.
3239   \finishedtitlepagefalse
3240   \vskip4pt \hrule height 4pt width \hsize \vskip4pt
3241 }
3242
3243 \parseargdef\subtitle{%
3244   \checkenv\titlepage
3245   {\subtitlefont \rightline{#1}}%
3246 }
3247
3248 % @author should come last, but may come many times.
3249 % It can also be used inside @quotation.
3250 %
3251 \parseargdef\author{%
3252   \def\temp{\quotation}%
3253   \ifx\thisenv\temp
3254     \def\quotationauthor{#1}% printed in \Equotation.
3255   \else
3256     \checkenv\titlepage
3257     \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi
3258     {\secfonts\rmisbold \leftline{#1}}%
3259   \fi
3260 }
3261
3262
3263 %%% Set up page headings and footings.
3264
3265 \let\thispage=\folio
3266
3267 \newtoks\evenheadline    % headline on even pages
3268 \newtoks\oddheadline     % headline on odd pages
3269 \newtoks\evenfootline    % footline on even pages
3270 \newtoks\oddfootline     % footline on odd pages
3271
3272 % Now make TeX use those variables
3273 \headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
3274                             \else \the\evenheadline \fi}}
3275 \footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
3276                             \else \the\evenfootline \fi}\HEADINGShook}
3277 \let\HEADINGShook=\relax
3278
3279 % Commands to set those variables.
3280 % For example, this is what  @headings on  does
3281 % @evenheading @thistitle|@thispage|@thischapter
3282 % @oddheading @thischapter|@thispage|@thistitle
3283 % @evenfooting @thisfile||
3284 % @oddfooting ||@thisfile
3285
3286
3287 \def\evenheading{\parsearg\evenheadingxxx}
3288 \def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish}
3289 \def\evenheadingyyy #1\|#2\|#3\|#4\finish{%
3290 \global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
3291
3292 \def\oddheading{\parsearg\oddheadingxxx}
3293 \def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish}
3294 \def\oddheadingyyy #1\|#2\|#3\|#4\finish{%
3295 \global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
3296
3297 \parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
3298
3299 \def\evenfooting{\parsearg\evenfootingxxx}
3300 \def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish}
3301 \def\evenfootingyyy #1\|#2\|#3\|#4\finish{%
3302 \global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
3303
3304 \def\oddfooting{\parsearg\oddfootingxxx}
3305 \def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish}
3306 \def\oddfootingyyy #1\|#2\|#3\|#4\finish{%
3307   \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
3308   %
3309   % Leave some space for the footline.  Hopefully ok to assume
3310   % @evenfooting will not be used by itself.
3311   \global\advance\pageheight by -12pt
3312   \global\advance\vsize by -12pt
3313 }
3314
3315 \parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}}
3316
3317 % @evenheadingmarks top     \thischapter <- chapter at the top of a page
3318 % @evenheadingmarks bottom  \thischapter <- chapter at the bottom of a page
3319 %
3320 % The same set of arguments for:
3321 %
3322 % @oddheadingmarks
3323 % @evenfootingmarks
3324 % @oddfootingmarks
3325 % @everyheadingmarks
3326 % @everyfootingmarks
3327
3328 \def\evenheadingmarks{\headingmarks{even}{heading}}
3329 \def\oddheadingmarks{\headingmarks{odd}{heading}}
3330 \def\evenfootingmarks{\headingmarks{even}{footing}}
3331 \def\oddfootingmarks{\headingmarks{odd}{footing}}
3332 \def\everyheadingmarks#1 {\headingmarks{even}{heading}{#1}
3333                           \headingmarks{odd}{heading}{#1} }
3334 \def\everyfootingmarks#1 {\headingmarks{even}{footing}{#1}
3335                           \headingmarks{odd}{footing}{#1} }
3336 % #1 = even/odd, #2 = heading/footing, #3 = top/bottom.
3337 \def\headingmarks#1#2#3 {%
3338   \expandafter\let\expandafter\temp \csname get#3headingmarks\endcsname
3339   \global\expandafter\let\csname get#1#2marks\endcsname \temp
3340 }
3341
3342 \everyheadingmarks bottom
3343 \everyfootingmarks bottom
3344
3345 % @headings double      turns headings on for double-sided printing.
3346 % @headings single      turns headings on for single-sided printing.
3347 % @headings off         turns them off.
3348 % @headings on          same as @headings double, retained for compatibility.
3349 % @headings after       turns on double-sided headings after this page.
3350 % @headings doubleafter turns on double-sided headings after this page.
3351 % @headings singleafter turns on single-sided headings after this page.
3352 % By default, they are off at the start of a document,
3353 % and turned `on' after @end titlepage.
3354
3355 \def\headings #1 {\csname HEADINGS#1\endcsname}
3356
3357 \def\headingsoff{% non-global headings elimination
3358   \evenheadline={\hfil}\evenfootline={\hfil}%
3359    \oddheadline={\hfil}\oddfootline={\hfil}%
3360 }
3361
3362 \def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting
3363 \HEADINGSoff  % it's the default
3364
3365 % When we turn headings on, set the page number to 1.
3366 % For double-sided printing, put current file name in lower left corner,
3367 % chapter name on inside top of right hand pages, document
3368 % title on inside top of left hand pages, and page numbers on outside top
3369 % edge of all pages.
3370 \def\HEADINGSdouble{%
3371 \global\pageno=1
3372 \global\evenfootline={\hfil}
3373 \global\oddfootline={\hfil}
3374 \global\evenheadline={\line{\folio\hfil\thistitle}}
3375 \global\oddheadline={\line{\thischapter\hfil\folio}}
3376 \global\let\contentsalignmacro = \chapoddpage
3377 }
3378 \let\contentsalignmacro = \chappager
3379
3380 % For single-sided printing, chapter title goes across top left of page,
3381 % page number on top right.
3382 \def\HEADINGSsingle{%
3383 \global\pageno=1
3384 \global\evenfootline={\hfil}
3385 \global\oddfootline={\hfil}
3386 \global\evenheadline={\line{\thischapter\hfil\folio}}
3387 \global\oddheadline={\line{\thischapter\hfil\folio}}
3388 \global\let\contentsalignmacro = \chappager
3389 }
3390 \def\HEADINGSon{\HEADINGSdouble}
3391
3392 \def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
3393 \let\HEADINGSdoubleafter=\HEADINGSafter
3394 \def\HEADINGSdoublex{%
3395 \global\evenfootline={\hfil}
3396 \global\oddfootline={\hfil}
3397 \global\evenheadline={\line{\folio\hfil\thistitle}}
3398 \global\oddheadline={\line{\thischapter\hfil\folio}}
3399 \global\let\contentsalignmacro = \chapoddpage
3400 }
3401
3402 \def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
3403 \def\HEADINGSsinglex{%
3404 \global\evenfootline={\hfil}
3405 \global\oddfootline={\hfil}
3406 \global\evenheadline={\line{\thischapter\hfil\folio}}
3407 \global\oddheadline={\line{\thischapter\hfil\folio}}
3408 \global\let\contentsalignmacro = \chappager
3409 }
3410
3411 % Subroutines used in generating headings
3412 % This produces Day Month Year style of output.
3413 % Only define if not already defined, in case a txi-??.tex file has set
3414 % up a different format (e.g., txi-cs.tex does this).
3415 \ifx\today\thisisundefined
3416 \def\today{%
3417   \number\day\space
3418   \ifcase\month
3419   \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
3420   \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
3421   \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
3422   \fi
3423   \space\number\year}
3424 \fi
3425
3426 % @settitle line...  specifies the title of the document, for headings.
3427 % It generates no output of its own.
3428 \def\thistitle{\putwordNoTitle}
3429 \def\settitle{\parsearg{\gdef\thistitle}}
3430
3431
3432 \message{tables,}
3433 % Tables -- @table, @ftable, @vtable, @item(x).
3434
3435 % default indentation of table text
3436 \newdimen\tableindent \tableindent=.8in
3437 % default indentation of @itemize and @enumerate text
3438 \newdimen\itemindent  \itemindent=.3in
3439 % margin between end of table item and start of table text.
3440 \newdimen\itemmargin  \itemmargin=.1in
3441
3442 % used internally for \itemindent minus \itemmargin
3443 \newdimen\itemmax
3444
3445 % Note @table, @ftable, and @vtable define @item, @itemx, etc., with
3446 % these defs.
3447 % They also define \itemindex
3448 % to index the item name in whatever manner is desired (perhaps none).
3449
3450 \newif\ifitemxneedsnegativevskip
3451
3452 \def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi}
3453
3454 \def\internalBitem{\smallbreak \parsearg\itemzzz}
3455 \def\internalBitemx{\itemxpar \parsearg\itemzzz}
3456
3457 \def\itemzzz #1{\begingroup %
3458   \advance\hsize by -\rightskip
3459   \advance\hsize by -\tableindent
3460   \setbox0=\hbox{\itemindicate{#1}}%
3461   \itemindex{#1}%
3462   \nobreak % This prevents a break before @itemx.
3463   %
3464   % If the item text does not fit in the space we have, put it on a line
3465   % by itself, and do not allow a page break either before or after that
3466   % line.  We do not start a paragraph here because then if the next
3467   % command is, e.g., @kindex, the whatsit would get put into the
3468   % horizontal list on a line by itself, resulting in extra blank space.
3469   \ifdim \wd0>\itemmax
3470     %
3471     % Make this a paragraph so we get the \parskip glue and wrapping,
3472     % but leave it ragged-right.
3473     \begingroup
3474       \advance\leftskip by-\tableindent
3475       \advance\hsize by\tableindent
3476       \advance\rightskip by0pt plus1fil\relax
3477       \leavevmode\unhbox0\par
3478     \endgroup
3479     %
3480     % We're going to be starting a paragraph, but we don't want the
3481     % \parskip glue -- logically it's part of the @item we just started.
3482     \nobreak \vskip-\parskip
3483     %
3484     % Stop a page break at the \parskip glue coming up.  However, if
3485     % what follows is an environment such as @example, there will be no
3486     % \parskip glue; then the negative vskip we just inserted would
3487     % cause the example and the item to crash together.  So we use this
3488     % bizarre value of 10001 as a signal to \aboveenvbreak to insert
3489     % \parskip glue after all.  Section titles are handled this way also.
3490     %
3491     \penalty 10001
3492     \endgroup
3493     \itemxneedsnegativevskipfalse
3494   \else
3495     % The item text fits into the space.  Start a paragraph, so that the
3496     % following text (if any) will end up on the same line.
3497     \noindent
3498     % Do this with kerns and \unhbox so that if there is a footnote in
3499     % the item text, it can migrate to the main vertical list and
3500     % eventually be printed.
3501     \nobreak\kern-\tableindent
3502     \dimen0 = \itemmax  \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0
3503     \unhbox0
3504     \nobreak\kern\dimen0
3505     \endgroup
3506     \itemxneedsnegativevskiptrue
3507   \fi
3508 }
3509
3510 \def\item{\errmessage{@item while not in a list environment}}
3511 \def\itemx{\errmessage{@itemx while not in a list environment}}
3512
3513 % @table, @ftable, @vtable.
3514 \envdef\table{%
3515   \let\itemindex\gobble
3516   \tablecheck{table}%
3517 }
3518 \envdef\ftable{%
3519   \def\itemindex ##1{\doind {fn}{\code{##1}}}%
3520   \tablecheck{ftable}%
3521 }
3522 \envdef\vtable{%
3523   \def\itemindex ##1{\doind {vr}{\code{##1}}}%
3524   \tablecheck{vtable}%
3525 }
3526 \def\tablecheck#1{%
3527   \ifnum \the\catcode`\^^M=\active
3528     \endgroup
3529     \errmessage{This command won't work in this context; perhaps the problem is
3530       that we are \inenvironment\thisenv}%
3531     \def\next{\doignore{#1}}%
3532   \else
3533     \let\next\tablex
3534   \fi
3535   \next
3536 }
3537 \def\tablex#1{%
3538   \def\itemindicate{#1}%
3539   \parsearg\tabley
3540 }
3541 \def\tabley#1{%
3542   {%
3543     \makevalueexpandable
3544     \edef\temp{\noexpand\tablez #1\space\space\space}%
3545     \expandafter
3546   }\temp \endtablez
3547 }
3548 \def\tablez #1 #2 #3 #4\endtablez{%
3549   \aboveenvbreak
3550   \ifnum 0#1>0 \advance \leftskip by #1\mil \fi
3551   \ifnum 0#2>0 \tableindent=#2\mil \fi
3552   \ifnum 0#3>0 \advance \rightskip by #3\mil \fi
3553   \itemmax=\tableindent
3554   \advance \itemmax by -\itemmargin
3555   \advance \leftskip by \tableindent
3556   \exdentamount=\tableindent
3557   \parindent = 0pt
3558   \parskip = \smallskipamount
3559   \ifdim \parskip=0pt \parskip=2pt \fi
3560   \let\item = \internalBitem
3561   \let\itemx = \internalBitemx
3562 }
3563 \def\Etable{\endgraf\afterenvbreak}
3564 \let\Eftable\Etable
3565 \let\Evtable\Etable
3566 \let\Eitemize\Etable
3567 \let\Eenumerate\Etable
3568
3569 % This is the counter used by @enumerate, which is really @itemize
3570
3571 \newcount \itemno
3572
3573 \envdef\itemize{\parsearg\doitemize}
3574
3575 \def\doitemize#1{%
3576   \aboveenvbreak
3577   \itemmax=\itemindent
3578   \advance\itemmax by -\itemmargin
3579   \advance\leftskip by \itemindent
3580   \exdentamount=\itemindent
3581   \parindent=0pt
3582   \parskip=\smallskipamount
3583   \ifdim\parskip=0pt \parskip=2pt \fi
3584   %
3585   % Try typesetting the item mark that if the document erroneously says
3586   % something like @itemize @samp (intending @table), there's an error
3587   % right away at the @itemize.  It's not the best error message in the
3588   % world, but it's better than leaving it to the @item.  This means if
3589   % the user wants an empty mark, they have to say @w{} not just @w.
3590   \def\itemcontents{#1}%
3591   \setbox0 = \hbox{\itemcontents}%
3592   %
3593   % @itemize with no arg is equivalent to @itemize @bullet.
3594   \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi
3595   %
3596   \let\item=\itemizeitem
3597 }
3598
3599 % Definition of @item while inside @itemize and @enumerate.
3600 %
3601 \def\itemizeitem{%
3602   \advance\itemno by 1  % for enumerations
3603   {\let\par=\endgraf \smallbreak}% reasonable place to break
3604   {%
3605    % If the document has an @itemize directly after a section title, a
3606    % \nobreak will be last on the list, and \sectionheading will have
3607    % done a \vskip-\parskip.  In that case, we don't want to zero
3608    % parskip, or the item text will crash with the heading.  On the
3609    % other hand, when there is normal text preceding the item (as there
3610    % usually is), we do want to zero parskip, or there would be too much
3611    % space.  In that case, we won't have a \nobreak before.  At least
3612    % that's the theory.
3613    \ifnum\lastpenalty<10000 \parskip=0in \fi
3614    \noindent
3615    \hbox to 0pt{\hss \itemcontents \kern\itemmargin}%
3616    %
3617    \vadjust{\penalty 1200}}% not good to break after first line of item.
3618   \flushcr
3619 }
3620
3621 % \splitoff TOKENS\endmark defines \first to be the first token in
3622 % TOKENS, and \rest to be the remainder.
3623 %
3624 \def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}%
3625
3626 % Allow an optional argument of an uppercase letter, lowercase letter,
3627 % or number, to specify the first label in the enumerated list.  No
3628 % argument is the same as `1'.
3629 %
3630 \envparseargdef\enumerate{\enumeratey #1  \endenumeratey}
3631 \def\enumeratey #1 #2\endenumeratey{%
3632   % If we were given no argument, pretend we were given `1'.
3633   \def\thearg{#1}%
3634   \ifx\thearg\empty \def\thearg{1}\fi
3635   %
3636   % Detect if the argument is a single token.  If so, it might be a
3637   % letter.  Otherwise, the only valid thing it can be is a number.
3638   % (We will always have one token, because of the test we just made.
3639   % This is a good thing, since \splitoff doesn't work given nothing at
3640   % all -- the first parameter is undelimited.)
3641   \expandafter\splitoff\thearg\endmark
3642   \ifx\rest\empty
3643     % Only one token in the argument.  It could still be anything.
3644     % A ``lowercase letter'' is one whose \lccode is nonzero.
3645     % An ``uppercase letter'' is one whose \lccode is both nonzero, and
3646     %   not equal to itself.
3647     % Otherwise, we assume it's a number.
3648     %
3649     % We need the \relax at the end of the \ifnum lines to stop TeX from
3650     % continuing to look for a <number>.
3651     %
3652     \ifnum\lccode\expandafter`\thearg=0\relax
3653       \numericenumerate % a number (we hope)
3654     \else
3655       % It's a letter.
3656       \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax
3657         \lowercaseenumerate % lowercase letter
3658       \else
3659         \uppercaseenumerate % uppercase letter
3660       \fi
3661     \fi
3662   \else
3663     % Multiple tokens in the argument.  We hope it's a number.
3664     \numericenumerate
3665   \fi
3666 }
3667
3668 % An @enumerate whose labels are integers.  The starting integer is
3669 % given in \thearg.
3670 %
3671 \def\numericenumerate{%
3672   \itemno = \thearg
3673   \startenumeration{\the\itemno}%
3674 }
3675
3676 % The starting (lowercase) letter is in \thearg.
3677 \def\lowercaseenumerate{%
3678   \itemno = \expandafter`\thearg
3679   \startenumeration{%
3680     % Be sure we're not beyond the end of the alphabet.
3681     \ifnum\itemno=0
3682       \errmessage{No more lowercase letters in @enumerate; get a bigger
3683                   alphabet}%
3684     \fi
3685     \char\lccode\itemno
3686   }%
3687 }
3688
3689 % The starting (uppercase) letter is in \thearg.
3690 \def\uppercaseenumerate{%
3691   \itemno = \expandafter`\thearg
3692   \startenumeration{%
3693     % Be sure we're not beyond the end of the alphabet.
3694     \ifnum\itemno=0
3695       \errmessage{No more uppercase letters in @enumerate; get a bigger
3696                   alphabet}
3697     \fi
3698     \char\uccode\itemno
3699   }%
3700 }
3701
3702 % Call \doitemize, adding a period to the first argument and supplying the
3703 % common last two arguments.  Also subtract one from the initial value in
3704 % \itemno, since @item increments \itemno.
3705 %
3706 \def\startenumeration#1{%
3707   \advance\itemno by -1
3708   \doitemize{#1.}\flushcr
3709 }
3710
3711 % @alphaenumerate and @capsenumerate are abbreviations for giving an arg
3712 % to @enumerate.
3713 %
3714 \def\alphaenumerate{\enumerate{a}}
3715 \def\capsenumerate{\enumerate{A}}
3716 \def\Ealphaenumerate{\Eenumerate}
3717 \def\Ecapsenumerate{\Eenumerate}
3718
3719
3720 % @multitable macros
3721 % Amy Hendrickson, 8/18/94, 3/6/96
3722 %
3723 % @multitable ... @end multitable will make as many columns as desired.
3724 % Contents of each column will wrap at width given in preamble.  Width
3725 % can be specified either with sample text given in a template line,
3726 % or in percent of \hsize, the current width of text on page.
3727
3728 % Table can continue over pages but will only break between lines.
3729
3730 % To make preamble:
3731 %
3732 % Either define widths of columns in terms of percent of \hsize:
3733 %   @multitable @columnfractions .25 .3 .45
3734 %   @item ...
3735 %
3736 %   Numbers following @columnfractions are the percent of the total
3737 %   current hsize to be used for each column. You may use as many
3738 %   columns as desired.
3739
3740
3741 % Or use a template:
3742 %   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
3743 %   @item ...
3744 %   using the widest term desired in each column.
3745
3746 % Each new table line starts with @item, each subsequent new column
3747 % starts with @tab. Empty columns may be produced by supplying @tab's
3748 % with nothing between them for as many times as empty columns are needed,
3749 % ie, @tab@tab@tab will produce two empty columns.
3750
3751 % @item, @tab do not need to be on their own lines, but it will not hurt
3752 % if they are.
3753
3754 % Sample multitable:
3755
3756 %   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
3757 %   @item first col stuff @tab second col stuff @tab third col
3758 %   @item
3759 %   first col stuff
3760 %   @tab
3761 %   second col stuff
3762 %   @tab
3763 %   third col
3764 %   @item first col stuff @tab second col stuff
3765 %   @tab Many paragraphs of text may be used in any column.
3766 %
3767 %         They will wrap at the width determined by the template.
3768 %   @item@tab@tab This will be in third column.
3769 %   @end multitable
3770
3771 % Default dimensions may be reset by user.
3772 % @multitableparskip is vertical space between paragraphs in table.
3773 % @multitableparindent is paragraph indent in table.
3774 % @multitablecolmargin is horizontal space to be left between columns.
3775 % @multitablelinespace is space to leave between table items, baseline
3776 %                                                            to baseline.
3777 %   0pt means it depends on current normal line spacing.
3778 %
3779 \newskip\multitableparskip
3780 \newskip\multitableparindent
3781 \newdimen\multitablecolspace
3782 \newskip\multitablelinespace
3783 \multitableparskip=0pt
3784 \multitableparindent=6pt
3785 \multitablecolspace=12pt
3786 \multitablelinespace=0pt
3787
3788 % Macros used to set up halign preamble:
3789 %
3790 \let\endsetuptable\relax
3791 \def\xendsetuptable{\endsetuptable}
3792 \let\columnfractions\relax
3793 \def\xcolumnfractions{\columnfractions}
3794 \newif\ifsetpercent
3795
3796 % #1 is the @columnfraction, usually a decimal number like .5, but might
3797 % be just 1.  We just use it, whatever it is.
3798 %
3799 \def\pickupwholefraction#1 {%
3800   \global\advance\colcount by 1
3801   \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}%
3802   \setuptable
3803 }
3804
3805 \newcount\colcount
3806 \def\setuptable#1{%
3807   \def\firstarg{#1}%
3808   \ifx\firstarg\xendsetuptable
3809     \let\go = \relax
3810   \else
3811     \ifx\firstarg\xcolumnfractions
3812       \global\setpercenttrue
3813     \else
3814       \ifsetpercent
3815          \let\go\pickupwholefraction
3816       \else
3817          \global\advance\colcount by 1
3818          \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a
3819                    % separator; typically that is always in the input, anyway.
3820          \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
3821       \fi
3822     \fi
3823     \ifx\go\pickupwholefraction
3824       % Put the argument back for the \pickupwholefraction call, so
3825       % we'll always have a period there to be parsed.
3826       \def\go{\pickupwholefraction#1}%
3827     \else
3828       \let\go = \setuptable
3829     \fi%
3830   \fi
3831   \go
3832 }
3833
3834 % multitable-only commands.
3835 %
3836 % @headitem starts a heading row, which we typeset in bold.
3837 % Assignments have to be global since we are inside the implicit group
3838 % of an alignment entry.  \everycr resets \everytab so we don't have to
3839 % undo it ourselves.
3840 \def\headitemfont{\b}% for people to use in the template row; not changeable
3841 \def\headitem{%
3842   \checkenv\multitable
3843   \crcr
3844   \global\everytab={\bf}% can't use \headitemfont since the parsing differs
3845   \the\everytab % for the first item
3846 }%
3847 %
3848 % A \tab used to include \hskip1sp.  But then the space in a template
3849 % line is not enough.  That is bad.  So let's go back to just `&' until
3850 % we again encounter the problem the 1sp was intended to solve.
3851 %                                       --karl, nathan@acm.org, 20apr99.
3852 \def\tab{\checkenv\multitable &\the\everytab}%
3853
3854 % @multitable ... @end multitable definitions:
3855 %
3856 \newtoks\everytab  % insert after every tab.
3857 %
3858 \envdef\multitable{%
3859   \vskip\parskip
3860   \startsavinginserts
3861   %
3862   % @item within a multitable starts a normal row.
3863   % We use \def instead of \let so that if one of the multitable entries
3864   % contains an @itemize, we don't choke on the \item (seen as \crcr aka
3865   % \endtemplate) expanding \doitemize.
3866   \def\item{\crcr}%
3867   %
3868   \tolerance=9500
3869   \hbadness=9500
3870   \setmultitablespacing
3871   \parskip=\multitableparskip
3872   \parindent=\multitableparindent
3873   \overfullrule=0pt
3874   \global\colcount=0
3875   %
3876   \everycr = {%
3877     \noalign{%
3878       \global\everytab={}%
3879       \global\colcount=0 % Reset the column counter.
3880       % Check for saved footnotes, etc.
3881       \checkinserts
3882       % Keeps underfull box messages off when table breaks over pages.
3883       %\filbreak
3884         % Maybe so, but it also creates really weird page breaks when the
3885         % table breaks over pages. Wouldn't \vfil be better?  Wait until the
3886         % problem manifests itself, so it can be fixed for real --karl.
3887     }%
3888   }%
3889   %
3890   \parsearg\domultitable
3891 }
3892 \def\domultitable#1{%
3893   % To parse everything between @multitable and @item:
3894   \setuptable#1 \endsetuptable
3895   %
3896   % This preamble sets up a generic column definition, which will
3897   % be used as many times as user calls for columns.
3898   % \vtop will set a single line and will also let text wrap and
3899   % continue for many paragraphs if desired.
3900   \halign\bgroup &%
3901     \global\advance\colcount by 1
3902     \multistrut
3903     \vtop{%
3904       % Use the current \colcount to find the correct column width:
3905       \hsize=\expandafter\csname col\the\colcount\endcsname
3906       %
3907       % In order to keep entries from bumping into each other
3908       % we will add a \leftskip of \multitablecolspace to all columns after
3909       % the first one.
3910       %
3911       % If a template has been used, we will add \multitablecolspace
3912       % to the width of each template entry.
3913       %
3914       % If the user has set preamble in terms of percent of \hsize we will
3915       % use that dimension as the width of the column, and the \leftskip
3916       % will keep entries from bumping into each other.  Table will start at
3917       % left margin and final column will justify at right margin.
3918       %
3919       % Make sure we don't inherit \rightskip from the outer environment.
3920       \rightskip=0pt
3921       \ifnum\colcount=1
3922         % The first column will be indented with the surrounding text.
3923         \advance\hsize by\leftskip
3924       \else
3925         \ifsetpercent \else
3926           % If user has not set preamble in terms of percent of \hsize
3927           % we will advance \hsize by \multitablecolspace.
3928           \advance\hsize by \multitablecolspace
3929         \fi
3930        % In either case we will make \leftskip=\multitablecolspace:
3931       \leftskip=\multitablecolspace
3932       \fi
3933       % Ignoring space at the beginning and end avoids an occasional spurious
3934       % blank line, when TeX decides to break the line at the space before the
3935       % box from the multistrut, so the strut ends up on a line by itself.
3936       % For example:
3937       % @multitable @columnfractions .11 .89
3938       % @item @code{#}
3939       % @tab Legal holiday which is valid in major parts of the whole country.
3940       % Is automatically provided with highlighting sequences respectively
3941       % marking characters.
3942       \noindent\ignorespaces##\unskip\multistrut
3943     }\cr
3944 }
3945 \def\Emultitable{%
3946   \crcr
3947   \egroup % end the \halign
3948   \global\setpercentfalse
3949 }
3950
3951 \def\setmultitablespacing{%
3952   \def\multistrut{\strut}% just use the standard line spacing
3953   %
3954   % Compute \multitablelinespace (if not defined by user) for use in
3955   % \multitableparskip calculation.  We used define \multistrut based on
3956   % this, but (ironically) that caused the spacing to be off.
3957   % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100.
3958 \ifdim\multitablelinespace=0pt
3959 \setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
3960 \global\advance\multitablelinespace by-\ht0
3961 \fi
3962 %% Test to see if parskip is larger than space between lines of
3963 %% table. If not, do nothing.
3964 %%        If so, set to same dimension as multitablelinespace.
3965 \ifdim\multitableparskip>\multitablelinespace
3966 \global\multitableparskip=\multitablelinespace
3967 \global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
3968                                       %% than skip between lines in the table.
3969 \fi%
3970 \ifdim\multitableparskip=0pt
3971 \global\multitableparskip=\multitablelinespace
3972 \global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
3973                                       %% than skip between lines in the table.
3974 \fi}
3975
3976
3977 \message{conditionals,}
3978
3979 % @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext,
3980 % @ifnotxml always succeed.  They currently do nothing; we don't
3981 % attempt to check whether the conditionals are properly nested.  But we
3982 % have to remember that they are conditionals, so that @end doesn't
3983 % attempt to close an environment group.
3984 %
3985 \def\makecond#1{%
3986   \expandafter\let\csname #1\endcsname = \relax
3987   \expandafter\let\csname iscond.#1\endcsname = 1
3988 }
3989 \makecond{iftex}
3990 \makecond{ifnotdocbook}
3991 \makecond{ifnothtml}
3992 \makecond{ifnotinfo}
3993 \makecond{ifnotplaintext}
3994 \makecond{ifnotxml}
3995
3996 % Ignore @ignore, @ifhtml, @ifinfo, and the like.
3997 %
3998 \def\direntry{\doignore{direntry}}
3999 \def\documentdescription{\doignore{documentdescription}}
4000 \def\docbook{\doignore{docbook}}
4001 \def\html{\doignore{html}}
4002 \def\ifdocbook{\doignore{ifdocbook}}
4003 \def\ifhtml{\doignore{ifhtml}}
4004 \def\ifinfo{\doignore{ifinfo}}
4005 \def\ifnottex{\doignore{ifnottex}}
4006 \def\ifplaintext{\doignore{ifplaintext}}
4007 \def\ifxml{\doignore{ifxml}}
4008 \def\ignore{\doignore{ignore}}
4009 \def\menu{\doignore{menu}}
4010 \def\xml{\doignore{xml}}
4011
4012 % Ignore text until a line `@end #1', keeping track of nested conditionals.
4013 %
4014 % A count to remember the depth of nesting.
4015 \newcount\doignorecount
4016
4017 \def\doignore#1{\begingroup
4018   % Scan in ``verbatim'' mode:
4019   \obeylines
4020   \catcode`\@ = \other
4021   \catcode`\{ = \other
4022   \catcode`\} = \other
4023   %
4024   % Make sure that spaces turn into tokens that match what \doignoretext wants.
4025   \spaceisspace
4026   %
4027   % Count number of #1's that we've seen.
4028   \doignorecount = 0
4029   %
4030   % Swallow text until we reach the matching `@end #1'.
4031   \dodoignore{#1}%
4032 }
4033
4034 { \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source.
4035   \obeylines %
4036   %
4037   \gdef\dodoignore#1{%
4038     % #1 contains the command name as a string, e.g., `ifinfo'.
4039     %
4040     % Define a command to find the next `@end #1'.
4041     \long\def\doignoretext##1^^M@end #1{%
4042       \doignoretextyyy##1^^M@#1\_STOP_}%
4043     %
4044     % And this command to find another #1 command, at the beginning of a
4045     % line.  (Otherwise, we would consider a line `@c @ifset', for
4046     % example, to count as an @ifset for nesting.)
4047     \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}%
4048     %
4049     % And now expand that command.
4050     \doignoretext ^^M%
4051   }%
4052 }
4053
4054 \def\doignoreyyy#1{%
4055   \def\temp{#1}%
4056   \ifx\temp\empty                       % Nothing found.
4057     \let\next\doignoretextzzz
4058   \else                                 % Found a nested condition, ...
4059     \advance\doignorecount by 1
4060     \let\next\doignoretextyyy           % ..., look for another.
4061     % If we're here, #1 ends with ^^M\ifinfo (for example).
4062   \fi
4063   \next #1% the token \_STOP_ is present just after this macro.
4064 }
4065
4066 % We have to swallow the remaining "\_STOP_".
4067 %
4068 \def\doignoretextzzz#1{%
4069   \ifnum\doignorecount = 0      % We have just found the outermost @end.
4070     \let\next\enddoignore
4071   \else                         % Still inside a nested condition.
4072     \advance\doignorecount by -1
4073     \let\next\doignoretext      % Look for the next @end.
4074   \fi
4075   \next
4076 }
4077
4078 % Finish off ignored text.
4079 { \obeylines%
4080   % Ignore anything after the last `@end #1'; this matters in verbatim
4081   % environments, where otherwise the newline after an ignored conditional
4082   % would result in a blank line in the output.
4083   \gdef\enddoignore#1^^M{\endgroup\ignorespaces}%
4084 }
4085
4086
4087 % @set VAR sets the variable VAR to an empty value.
4088 % @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
4089 %
4090 % Since we want to separate VAR from REST-OF-LINE (which might be
4091 % empty), we can't just use \parsearg; we have to insert a space of our
4092 % own to delimit the rest of the line, and then take it out again if we
4093 % didn't need it.
4094 % We rely on the fact that \parsearg sets \catcode`\ =10.
4095 %
4096 \parseargdef\set{\setyyy#1 \endsetyyy}
4097 \def\setyyy#1 #2\endsetyyy{%
4098   {%
4099     \makevalueexpandable
4100     \def\temp{#2}%
4101     \edef\next{\gdef\makecsname{SET#1}}%
4102     \ifx\temp\empty
4103       \next{}%
4104     \else
4105       \setzzz#2\endsetzzz
4106     \fi
4107   }%
4108 }
4109 % Remove the trailing space \setxxx inserted.
4110 \def\setzzz#1 \endsetzzz{\next{#1}}
4111
4112 % @clear VAR clears (i.e., unsets) the variable VAR.
4113 %
4114 \parseargdef\clear{%
4115   {%
4116     \makevalueexpandable
4117     \global\expandafter\let\csname SET#1\endcsname=\relax
4118   }%
4119 }
4120
4121 % @value{foo} gets the text saved in variable foo.
4122 \def\value{\begingroup\makevalueexpandable\valuexxx}
4123 \def\valuexxx#1{\expandablevalue{#1}\endgroup}
4124 {
4125   \catcode`\- = \active \catcode`\_ = \active
4126   %
4127   \gdef\makevalueexpandable{%
4128     \let\value = \expandablevalue
4129     % We don't want these characters active, ...
4130     \catcode`\-=\other \catcode`\_=\other
4131     % ..., but we might end up with active ones in the argument if
4132     % we're called from @code, as @code{@value{foo-bar_}}, though.
4133     % So \let them to their normal equivalents.
4134     \let-\realdash \let_\normalunderscore
4135   }
4136 }
4137
4138 % We have this subroutine so that we can handle at least some @value's
4139 % properly in indexes (we call \makevalueexpandable in \indexdummies).
4140 % The command has to be fully expandable (if the variable is set), since
4141 % the result winds up in the index file.  This means that if the
4142 % variable's value contains other Texinfo commands, it's almost certain
4143 % it will fail (although perhaps we could fix that with sufficient work
4144 % to do a one-level expansion on the result, instead of complete).
4145 %
4146 \def\expandablevalue#1{%
4147   \expandafter\ifx\csname SET#1\endcsname\relax
4148     {[No value for ``#1'']}%
4149     \message{Variable `#1', used in @value, is not set.}%
4150   \else
4151     \csname SET#1\endcsname
4152   \fi
4153 }
4154
4155 % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
4156 % with @set.
4157 %
4158 % To get special treatment of `@end ifset,' call \makeond and the redefine.
4159 %
4160 \makecond{ifset}
4161 \def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}}
4162 \def\doifset#1#2{%
4163   {%
4164     \makevalueexpandable
4165     \let\next=\empty
4166     \expandafter\ifx\csname SET#2\endcsname\relax
4167       #1% If not set, redefine \next.
4168     \fi
4169     \expandafter
4170   }\next
4171 }
4172 \def\ifsetfail{\doignore{ifset}}
4173
4174 % @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been
4175 % defined with @set, or has been undefined with @clear.
4176 %
4177 % The `\else' inside the `\doifset' parameter is a trick to reuse the
4178 % above code: if the variable is not set, do nothing, if it is set,
4179 % then redefine \next to \ifclearfail.
4180 %
4181 \makecond{ifclear}
4182 \def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}}
4183 \def\ifclearfail{\doignore{ifclear}}
4184
4185 % @dircategory CATEGORY  -- specify a category of the dir file
4186 % which this file should belong to.  Ignore this in TeX.
4187 \let\dircategory=\comment
4188
4189 % @defininfoenclose.
4190 \let\definfoenclose=\comment
4191
4192
4193 \message{indexing,}
4194 % Index generation facilities
4195
4196 % Define \newwrite to be identical to plain tex's \newwrite
4197 % except not \outer, so it can be used within macros and \if's.
4198 \edef\newwrite{\makecsname{ptexnewwrite}}
4199
4200 % \newindex {foo} defines an index named foo.
4201 % It automatically defines \fooindex such that
4202 % \fooindex ...rest of line... puts an entry in the index foo.
4203 % It also defines \fooindfile to be the number of the output channel for
4204 % the file that accumulates this index.  The file's extension is foo.
4205 % The name of an index should be no more than 2 characters long
4206 % for the sake of vms.
4207 %
4208 \def\newindex#1{%
4209   \iflinks
4210     \expandafter\newwrite \csname#1indfile\endcsname
4211     \openout \csname#1indfile\endcsname \jobname.#1 % Open the file
4212   \fi
4213   \expandafter\xdef\csname#1index\endcsname{%     % Define @#1index
4214     \noexpand\doindex{#1}}
4215 }
4216
4217 % @defindex foo  ==  \newindex{foo}
4218 %
4219 \def\defindex{\parsearg\newindex}
4220
4221 % Define @defcodeindex, like @defindex except put all entries in @code.
4222 %
4223 \def\defcodeindex{\parsearg\newcodeindex}
4224 %
4225 \def\newcodeindex#1{%
4226   \iflinks
4227     \expandafter\newwrite \csname#1indfile\endcsname
4228     \openout \csname#1indfile\endcsname \jobname.#1
4229   \fi
4230   \expandafter\xdef\csname#1index\endcsname{%
4231     \noexpand\docodeindex{#1}}%
4232 }
4233
4234
4235 % @synindex foo bar    makes index foo feed into index bar.
4236 % Do this instead of @defindex foo if you don't want it as a separate index.
4237 %
4238 % @syncodeindex foo bar   similar, but put all entries made for index foo
4239 % inside @code.
4240 %
4241 \def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}}
4242 \def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}}
4243
4244 % #1 is \doindex or \docodeindex, #2 the index getting redefined (foo),
4245 % #3 the target index (bar).
4246 \def\dosynindex#1#2#3{%
4247   % Only do \closeout if we haven't already done it, else we'll end up
4248   % closing the target index.
4249   \expandafter \ifx\csname donesynindex#2\endcsname \relax
4250     % The \closeout helps reduce unnecessary open files; the limit on the
4251     % Acorn RISC OS is a mere 16 files.
4252     \expandafter\closeout\csname#2indfile\endcsname
4253     \expandafter\let\csname donesynindex#2\endcsname = 1
4254   \fi
4255   % redefine \fooindfile:
4256   \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname
4257   \expandafter\let\csname#2indfile\endcsname=\temp
4258   % redefine \fooindex:
4259   \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}%
4260 }
4261
4262 % Define \doindex, the driver for all \fooindex macros.
4263 % Argument #1 is generated by the calling \fooindex macro,
4264 %  and it is "foo", the name of the index.
4265
4266 % \doindex just uses \parsearg; it calls \doind for the actual work.
4267 % This is because \doind is more useful to call from other macros.
4268
4269 % There is also \dosubind {index}{topic}{subtopic}
4270 % which makes an entry in a two-level index such as the operation index.
4271
4272 \def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer}
4273 \def\singleindexer #1{\doind{\indexname}{#1}}
4274
4275 % like the previous two, but they put @code around the argument.
4276 \def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}
4277 \def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
4278
4279 % Take care of Texinfo commands that can appear in an index entry.
4280 % Since there are some commands we want to expand, and others we don't,
4281 % we have to laboriously prevent expansion for those that we don't.
4282 %
4283 \def\indexdummies{%
4284   \escapechar = `\\     % use backslash in output files.
4285   \def\@{@}% change to @@ when we switch to @ as escape char in index files.
4286   \def\ {\realbackslash\space }%
4287   %
4288   % Need these unexpandable (because we define \tt as a dummy)
4289   % definitions when @{ or @} appear in index entry text.  Also, more
4290   % complicated, when \tex is in effect and \{ is a \delimiter again.
4291   % We can't use \lbracecmd and \rbracecmd because texindex assumes
4292   % braces and backslashes are used only as delimiters.  Perhaps we
4293   % should define @lbrace and @rbrace commands a la @comma.
4294   \def\{{{\tt\char123}}%
4295   \def\}{{\tt\char125}}%
4296   %
4297   % I don't entirely understand this, but when an index entry is
4298   % generated from a macro call, the \endinput which \scanmacro inserts
4299   % causes processing to be prematurely terminated.  This is,
4300   % apparently, because \indexsorttmp is fully expanded, and \endinput
4301   % is an expandable command.  The redefinition below makes \endinput
4302   % disappear altogether for that purpose -- although logging shows that
4303   % processing continues to some further point.  On the other hand, it
4304   % seems \endinput does not hurt in the printed index arg, since that
4305   % is still getting written without apparent harm.
4306   %
4307   % Sample source (mac-idx3.tex, reported by Graham Percival to
4308   % help-texinfo, 22may06):
4309   % @macro funindex {WORD}
4310   % @findex xyz
4311   % @end macro
4312   % ...
4313   % @funindex commtest
4314   %
4315   % The above is not enough to reproduce the bug, but it gives the flavor.
4316   %
4317   % Sample whatsit resulting:
4318   % .@write3{\entry{xyz}{@folio }{@code {xyz@endinput }}}
4319   %
4320   % So:
4321   \let\endinput = \empty
4322   %
4323   % Do the redefinitions.
4324   \commondummies
4325 }
4326
4327 % For the aux and toc files, @ is the escape character.  So we want to
4328 % redefine everything using @ as the escape character (instead of
4329 % \realbackslash, still used for index files).  When everything uses @,
4330 % this will be simpler.
4331 %
4332 \def\atdummies{%
4333   \def\@{@@}%
4334   \def\ {@ }%
4335   \let\{ = \lbraceatcmd
4336   \let\} = \rbraceatcmd
4337   %
4338   % Do the redefinitions.
4339   \commondummies
4340   \otherbackslash
4341 }
4342
4343 % Called from \indexdummies and \atdummies.
4344 %
4345 \def\commondummies{%
4346   %
4347   % \definedummyword defines \#1 as \string\#1\space, thus effectively
4348   % preventing its expansion.  This is used only for control words,
4349   % not control letters, because the \space would be incorrect for
4350   % control characters, but is needed to separate the control word
4351   % from whatever follows.
4352   %
4353   % For control letters, we have \definedummyletter, which omits the
4354   % space.
4355   %
4356   % These can be used both for control words that take an argument and
4357   % those that do not.  If it is followed by {arg} in the input, then
4358   % that will dutifully get written to the index (or wherever).
4359   %
4360   \def\definedummyword  ##1{\def##1{\string##1\space}}%
4361   \def\definedummyletter##1{\def##1{\string##1}}%
4362   \let\definedummyaccent\definedummyletter
4363   %
4364   \commondummiesnofonts
4365   %
4366   \definedummyletter\_%
4367   \definedummyletter\-%
4368   %
4369   % Non-English letters.
4370   \definedummyword\AA
4371   \definedummyword\AE
4372   \definedummyword\DH
4373   \definedummyword\L
4374   \definedummyword\O
4375   \definedummyword\OE
4376   \definedummyword\TH
4377   \definedummyword\aa
4378   \definedummyword\ae
4379   \definedummyword\dh
4380   \definedummyword\exclamdown
4381   \definedummyword\l
4382   \definedummyword\o
4383   \definedummyword\oe
4384   \definedummyword\ordf
4385   \definedummyword\ordm
4386   \definedummyword\questiondown
4387   \definedummyword\ss
4388   \definedummyword\th
4389   %
4390   % Although these internal commands shouldn't show up, sometimes they do.
4391   \definedummyword\bf
4392   \definedummyword\gtr
4393   \definedummyword\hat
4394   \definedummyword\less
4395   \definedummyword\sf
4396   \definedummyword\sl
4397   \definedummyword\tclose
4398   \definedummyword\tt
4399   %
4400   \definedummyword\LaTeX
4401   \definedummyword\TeX
4402   %
4403   % Assorted special characters.
4404   \definedummyword\arrow
4405   \definedummyword\bullet
4406   \definedummyword\comma
4407   \definedummyword\copyright
4408   \definedummyword\registeredsymbol
4409   \definedummyword\dots
4410   \definedummyword\enddots
4411   \definedummyword\entrybreak
4412   \definedummyword\equiv
4413   \definedummyword\error
4414   \definedummyword\euro
4415   \definedummyword\expansion
4416   \definedummyword\geq
4417   \definedummyword\guillemetleft
4418   \definedummyword\guillemetright
4419   \definedummyword\guilsinglleft
4420   \definedummyword\guilsinglright
4421   \definedummyword\leq
4422   \definedummyword\minus
4423   \definedummyword\ogonek
4424   \definedummyword\pounds
4425   \definedummyword\point
4426   \definedummyword\print
4427   \definedummyword\quotedblbase
4428   \definedummyword\quotedblleft
4429   \definedummyword\quotedblright
4430   \definedummyword\quoteleft
4431   \definedummyword\quoteright
4432   \definedummyword\quotesinglbase
4433   \definedummyword\result
4434   \definedummyword\textdegree
4435   %
4436   % We want to disable all macros so that they are not expanded by \write.
4437   \macrolist
4438   %
4439   \normalturnoffactive
4440   %
4441   % Handle some cases of @value -- where it does not contain any
4442   % (non-fully-expandable) commands.
4443   \makevalueexpandable
4444 }
4445
4446 % \commondummiesnofonts: common to \commondummies and \indexnofonts.
4447 %
4448 \def\commondummiesnofonts{%
4449   % Control letters and accents.
4450   \definedummyletter\!%
4451   \definedummyaccent\"%
4452   \definedummyaccent\'%
4453   \definedummyletter\*%
4454   \definedummyaccent\,%
4455   \definedummyletter\.%
4456   \definedummyletter\/%
4457   \definedummyletter\:%
4458   \definedummyaccent\=%
4459   \definedummyletter\?%
4460   \definedummyaccent\^%
4461   \definedummyaccent\`%
4462   \definedummyaccent\~%
4463   \definedummyword\u
4464   \definedummyword\v
4465   \definedummyword\H
4466   \definedummyword\dotaccent
4467   \definedummyword\ogonek
4468   \definedummyword\ringaccent
4469   \definedummyword\tieaccent
4470   \definedummyword\ubaraccent
4471   \definedummyword\udotaccent
4472   \definedummyword\dotless
4473   %
4474   % Texinfo font commands.
4475   \definedummyword\b
4476   \definedummyword\i
4477   \definedummyword\r
4478   \definedummyword\sansserif
4479   \definedummyword\sc
4480   \definedummyword\slanted
4481   \definedummyword\t
4482   %
4483   % Commands that take arguments.
4484   \definedummyword\acronym
4485   \definedummyword\cite
4486   \definedummyword\code
4487   \definedummyword\command
4488   \definedummyword\dfn
4489   \definedummyword\dmn
4490   \definedummyword\email
4491   \definedummyword\emph
4492   \definedummyword\env
4493   \definedummyword\file
4494   \definedummyword\indicateurl
4495   \definedummyword\kbd
4496   \definedummyword\key
4497   \definedummyword\math
4498   \definedummyword\option
4499   \definedummyword\pxref
4500   \definedummyword\ref
4501   \definedummyword\samp
4502   \definedummyword\strong
4503   \definedummyword\tie
4504   \definedummyword\uref
4505   \definedummyword\url
4506   \definedummyword\var
4507   \definedummyword\verb
4508   \definedummyword\w
4509   \definedummyword\xref
4510 }
4511
4512 % \indexnofonts is used when outputting the strings to sort the index
4513 % by, and when constructing control sequence names.  It eliminates all
4514 % control sequences and just writes whatever the best ASCII sort string
4515 % would be for a given command (usually its argument).
4516 %
4517 \def\indexnofonts{%
4518   % Accent commands should become @asis.
4519   \def\definedummyaccent##1{\let##1\asis}%
4520   % We can just ignore other control letters.
4521   \def\definedummyletter##1{\let##1\empty}%
4522   % All control words become @asis by default; overrides below.
4523   \let\definedummyword\definedummyaccent
4524   %
4525   \commondummiesnofonts
4526   %
4527   % Don't no-op \tt, since it isn't a user-level command
4528   % and is used in the definitions of the active chars like <, >, |, etc.
4529   % Likewise with the other plain tex font commands.
4530   %\let\tt=\asis
4531   %
4532   \def\ { }%
4533   \def\@{@}%
4534   \def\_{\normalunderscore}%
4535   \def\-{}% @- shouldn't affect sorting
4536   %
4537   % Unfortunately, texindex is not prepared to handle braces in the
4538   % content at all.  So for index sorting, we map @{ and @} to strings
4539   % starting with |, since that ASCII character is between ASCII { and }.
4540   \def\{{|a}%
4541   \def\}{|b}%
4542   %
4543   % Non-English letters.
4544   \def\AA{AA}%
4545   \def\AE{AE}%
4546   \def\DH{DZZ}%
4547   \def\L{L}%
4548   \def\OE{OE}%
4549   \def\O{O}%
4550   \def\TH{ZZZ}%
4551   \def\aa{aa}%
4552   \def\ae{ae}%
4553   \def\dh{dzz}%
4554   \def\exclamdown{!}%
4555   \def\l{l}%
4556   \def\oe{oe}%
4557   \def\ordf{a}%
4558   \def\ordm{o}%
4559   \def\o{o}%
4560   \def\questiondown{?}%
4561   \def\ss{ss}%
4562   \def\th{zzz}%
4563   %
4564   \def\LaTeX{LaTeX}%
4565   \def\TeX{TeX}%
4566   %
4567   % Assorted special characters.
4568   % (The following {} will end up in the sort string, but that's ok.)
4569   \def\arrow{->}%
4570   \def\bullet{bullet}%
4571   \def\comma{,}%
4572   \def\copyright{copyright}%
4573   \def\dots{...}%
4574   \def\enddots{...}%
4575   \def\equiv{==}%
4576   \def\error{error}%
4577   \def\euro{euro}%
4578   \def\expansion{==>}%
4579   \def\geq{>=}%
4580   \def\guillemetleft{<<}%
4581   \def\guillemetright{>>}%
4582   \def\guilsinglleft{<}%
4583   \def\guilsinglright{>}%
4584   \def\leq{<=}%
4585   \def\minus{-}%
4586   \def\point{.}%
4587   \def\pounds{pounds}%
4588   \def\print{-|}%
4589   \def\quotedblbase{"}%
4590   \def\quotedblleft{"}%
4591   \def\quotedblright{"}%
4592   \def\quoteleft{`}%
4593   \def\quoteright{'}%
4594   \def\quotesinglbase{,}%
4595   \def\registeredsymbol{R}%
4596   \def\result{=>}%
4597   \def\textdegree{o}%
4598   %
4599   \expandafter\ifx\csname SETtxiindexlquoteignore\endcsname\relax
4600   \else \indexlquoteignore \fi
4601   %
4602   % We need to get rid of all macros, leaving only the arguments (if present).
4603   % Of course this is not nearly correct, but it is the best we can do for now.
4604   % makeinfo does not expand macros in the argument to @deffn, which ends up
4605   % writing an index entry, and texindex isn't prepared for an index sort entry
4606   % that starts with \.
4607   %
4608   % Since macro invocations are followed by braces, we can just redefine them
4609   % to take a single TeX argument.  The case of a macro invocation that
4610   % goes to end-of-line is not handled.
4611   %
4612   \macrolist
4613 }
4614
4615 % Undocumented (for FSFS 2nd ed.): @set txiindexlquoteignore makes us
4616 % ignore left quotes in the sort term.
4617 {\catcode`\`=\active
4618  \gdef\indexlquoteignore{\let`=\empty}}
4619
4620 \let\indexbackslash=0  %overridden during \printindex.
4621 \let\SETmarginindex=\relax % put index entries in margin (undocumented)?
4622
4623 % Most index entries go through here, but \dosubind is the general case.
4624 % #1 is the index name, #2 is the entry text.
4625 \def\doind#1#2{\dosubind{#1}{#2}{}}
4626
4627 % Workhorse for all \fooindexes.
4628 % #1 is name of index, #2 is stuff to put there, #3 is subentry --
4629 % empty if called from \doind, as we usually are (the main exception
4630 % is with most defuns, which call us directly).
4631 %
4632 \def\dosubind#1#2#3{%
4633   \iflinks
4634   {%
4635     % Store the main index entry text (including the third arg).
4636     \toks0 = {#2}%
4637     % If third arg is present, precede it with a space.
4638     \def\thirdarg{#3}%
4639     \ifx\thirdarg\empty \else
4640       \toks0 = \expandafter{\the\toks0 \space #3}%
4641     \fi
4642     %
4643     \edef\writeto{\csname#1indfile\endcsname}%
4644     %
4645     \safewhatsit\dosubindwrite
4646   }%
4647   \fi
4648 }
4649
4650 % Write the entry in \toks0 to the index file:
4651 %
4652 \def\dosubindwrite{%
4653   % Put the index entry in the margin if desired.
4654   \ifx\SETmarginindex\relax\else
4655     \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}%
4656   \fi
4657   %
4658   % Remember, we are within a group.
4659   \indexdummies % Must do this here, since \bf, etc expand at this stage
4660   \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now
4661       % so it will be output as is; and it will print as backslash.
4662   %
4663   % Process the index entry with all font commands turned off, to
4664   % get the string to sort by.
4665   {\indexnofonts
4666    \edef\temp{\the\toks0}% need full expansion
4667    \xdef\indexsorttmp{\temp}%
4668   }%
4669   %
4670   % Set up the complete index entry, with both the sort key and
4671   % the original text, including any font commands.  We write
4672   % three arguments to \entry to the .?? file (four in the
4673   % subentry case), texindex reduces to two when writing the .??s
4674   % sorted result.
4675   \edef\temp{%
4676     \write\writeto{%
4677       \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}%
4678   }%
4679   \temp
4680 }
4681
4682 % Take care of unwanted page breaks/skips around a whatsit:
4683 %
4684 % If a skip is the last thing on the list now, preserve it
4685 % by backing up by \lastskip, doing the \write, then inserting
4686 % the skip again.  Otherwise, the whatsit generated by the
4687 % \write or \pdfdest will make \lastskip zero.  The result is that
4688 % sequences like this:
4689 % @end defun
4690 % @tindex whatever
4691 % @defun ...
4692 % will have extra space inserted, because the \medbreak in the
4693 % start of the @defun won't see the skip inserted by the @end of
4694 % the previous defun.
4695 %
4696 % But don't do any of this if we're not in vertical mode.  We
4697 % don't want to do a \vskip and prematurely end a paragraph.
4698 %
4699 % Avoid page breaks due to these extra skips, too.
4700 %
4701 % But wait, there is a catch there:
4702 % We'll have to check whether \lastskip is zero skip.  \ifdim is not
4703 % sufficient for this purpose, as it ignores stretch and shrink parts
4704 % of the skip.  The only way seems to be to check the textual
4705 % representation of the skip.
4706 %
4707 % The following is almost like \def\zeroskipmacro{0.0pt} except that
4708 % the ``p'' and ``t'' characters have catcode \other, not 11 (letter).
4709 %
4710 \edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname}
4711 %
4712 \newskip\whatsitskip
4713 \newcount\whatsitpenalty
4714 %
4715 % ..., ready, GO:
4716 %
4717 \def\safewhatsit#1{%
4718 \ifhmode
4719   #1%
4720 \else
4721   % \lastskip and \lastpenalty cannot both be nonzero simultaneously.
4722   \whatsitskip = \lastskip
4723   \edef\lastskipmacro{\the\lastskip}%
4724   \whatsitpenalty = \lastpenalty
4725   %
4726   % If \lastskip is nonzero, that means the last item was a
4727   % skip.  And since a skip is discardable, that means this
4728   % -\whatsitskip glue we're inserting is preceded by a
4729   % non-discardable item, therefore it is not a potential
4730   % breakpoint, therefore no \nobreak needed.
4731   \ifx\lastskipmacro\zeroskipmacro
4732   \else
4733     \vskip-\whatsitskip
4734   \fi
4735   %
4736   #1%
4737   %
4738   \ifx\lastskipmacro\zeroskipmacro
4739     % If \lastskip was zero, perhaps the last item was a penalty, and
4740     % perhaps it was >=10000, e.g., a \nobreak.  In that case, we want
4741     % to re-insert the same penalty (values >10000 are used for various
4742     % signals); since we just inserted a non-discardable item, any
4743     % following glue (such as a \parskip) would be a breakpoint.  For example:
4744     %
4745     %   @deffn deffn-whatever
4746     %   @vindex index-whatever
4747     %   Description.
4748     % would allow a break between the index-whatever whatsit
4749     % and the "Description." paragraph.
4750     \ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi
4751   \else
4752     % On the other hand, if we had a nonzero \lastskip,
4753     % this make-up glue would be preceded by a non-discardable item
4754     % (the whatsit from the \write), so we must insert a \nobreak.
4755     \nobreak\vskip\whatsitskip
4756   \fi
4757 \fi
4758 }
4759
4760 % The index entry written in the file actually looks like
4761 %  \entry {sortstring}{page}{topic}
4762 % or
4763 %  \entry {sortstring}{page}{topic}{subtopic}
4764 % The texindex program reads in these files and writes files
4765 % containing these kinds of lines:
4766 %  \initial {c}
4767 %     before the first topic whose initial is c
4768 %  \entry {topic}{pagelist}
4769 %     for a topic that is used without subtopics
4770 %  \primary {topic}
4771 %     for the beginning of a topic that is used with subtopics
4772 %  \secondary {subtopic}{pagelist}
4773 %     for each subtopic.
4774
4775 % Define the user-accessible indexing commands
4776 % @findex, @vindex, @kindex, @cindex.
4777
4778 \def\findex {\fnindex}
4779 \def\kindex {\kyindex}
4780 \def\cindex {\cpindex}
4781 \def\vindex {\vrindex}
4782 \def\tindex {\tpindex}
4783 \def\pindex {\pgindex}
4784
4785 \def\cindexsub {\begingroup\obeylines\cindexsub}
4786 {\obeylines %
4787 \gdef\cindexsub "#1" #2^^M{\endgroup %
4788 \dosubind{cp}{#2}{#1}}}
4789
4790 % Define the macros used in formatting output of the sorted index material.
4791
4792 % @printindex causes a particular index (the ??s file) to get printed.
4793 % It does not print any chapter heading (usually an @unnumbered).
4794 %
4795 \parseargdef\printindex{\begingroup
4796   \dobreak \chapheadingskip{10000}%
4797   %
4798   \smallfonts \rm
4799   \tolerance = 9500
4800   \plainfrenchspacing
4801   \everypar = {}% don't want the \kern\-parindent from indentation suppression.
4802   %
4803   % See if the index file exists and is nonempty.
4804   % Change catcode of @ here so that if the index file contains
4805   % \initial {@}
4806   % as its first line, TeX doesn't complain about mismatched braces
4807   % (because it thinks @} is a control sequence).
4808   \catcode`\@ = 11
4809   \openin 1 \jobname.#1s
4810   \ifeof 1
4811     % \enddoublecolumns gets confused if there is no text in the index,
4812     % and it loses the chapter title and the aux file entries for the
4813     % index.  The easiest way to prevent this problem is to make sure
4814     % there is some text.
4815     \putwordIndexNonexistent
4816   \else
4817     %
4818     % If the index file exists but is empty, then \openin leaves \ifeof
4819     % false.  We have to make TeX try to read something from the file, so
4820     % it can discover if there is anything in it.
4821     \read 1 to \temp
4822     \ifeof 1
4823       \putwordIndexIsEmpty
4824     \else
4825       % Index files are almost Texinfo source, but we use \ as the escape
4826       % character.  It would be better to use @, but that's too big a change
4827       % to make right now.
4828       \def\indexbackslash{\backslashcurfont}%
4829       \catcode`\\ = 0
4830       \escapechar = `\\
4831       \begindoublecolumns
4832       \input \jobname.#1s
4833       \enddoublecolumns
4834     \fi
4835   \fi
4836   \closein 1
4837 \endgroup}
4838
4839 % These macros are used by the sorted index file itself.
4840 % Change them to control the appearance of the index.
4841
4842 \def\initial#1{{%
4843   % Some minor font changes for the special characters.
4844   \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt
4845   %
4846   % Remove any glue we may have, we'll be inserting our own.
4847   \removelastskip
4848   %
4849   % We like breaks before the index initials, so insert a bonus.
4850   \nobreak
4851   \vskip 0pt plus 3\baselineskip
4852   \penalty 0
4853   \vskip 0pt plus -3\baselineskip
4854   %
4855   % Typeset the initial.  Making this add up to a whole number of
4856   % baselineskips increases the chance of the dots lining up from column
4857   % to column.  It still won't often be perfect, because of the stretch
4858   % we need before each entry, but it's better.
4859   %
4860   % No shrink because it confuses \balancecolumns.
4861   \vskip 1.67\baselineskip plus .5\baselineskip
4862   \leftline{\secbf #1}%
4863   % Do our best not to break after the initial.
4864   \nobreak
4865   \vskip .33\baselineskip plus .1\baselineskip
4866 }}
4867
4868 % \entry typesets a paragraph consisting of the text (#1), dot leaders, and
4869 % then page number (#2) flushed to the right margin.  It is used for index
4870 % and table of contents entries.  The paragraph is indented by \leftskip.
4871 %
4872 % A straightforward implementation would start like this:
4873 %       \def\entry#1#2{...
4874 % But this freezes the catcodes in the argument, and can cause problems to
4875 % @code, which sets - active.  This problem was fixed by a kludge---
4876 % ``-'' was active throughout whole index, but this isn't really right.
4877 % The right solution is to prevent \entry from swallowing the whole text.
4878 %                                 --kasal, 21nov03
4879 \def\entry{%
4880   \begingroup
4881     %
4882     % Start a new paragraph if necessary, so our assignments below can't
4883     % affect previous text.
4884     \par
4885     %
4886     % Do not fill out the last line with white space.
4887     \parfillskip = 0in
4888     %
4889     % No extra space above this paragraph.
4890     \parskip = 0in
4891     %
4892     % Do not prefer a separate line ending with a hyphen to fewer lines.
4893     \finalhyphendemerits = 0
4894     %
4895     % \hangindent is only relevant when the entry text and page number
4896     % don't both fit on one line.  In that case, bob suggests starting the
4897     % dots pretty far over on the line.  Unfortunately, a large
4898     % indentation looks wrong when the entry text itself is broken across
4899     % lines.  So we use a small indentation and put up with long leaders.
4900     %
4901     % \hangafter is reset to 1 (which is the value we want) at the start
4902     % of each paragraph, so we need not do anything with that.
4903     \hangindent = 2em
4904     %
4905     % When the entry text needs to be broken, just fill out the first line
4906     % with blank space.
4907     \rightskip = 0pt plus1fil
4908     %
4909     % A bit of stretch before each entry for the benefit of balancing
4910     % columns.
4911     \vskip 0pt plus1pt
4912     %
4913     % When reading the text of entry, convert explicit line breaks
4914     % from @* into spaces.  The user might give these in long section
4915     % titles, for instance.
4916     \def\*{\unskip\space\ignorespaces}%
4917     \def\entrybreak{\hfil\break}%
4918     %
4919     % Swallow the left brace of the text (first parameter):
4920     \afterassignment\doentry
4921     \let\temp =
4922 }
4923 \def\entrybreak{\unskip\space\ignorespaces}%
4924 \def\doentry{%
4925     \bgroup % Instead of the swallowed brace.
4926       \noindent
4927       \aftergroup\finishentry
4928       % And now comes the text of the entry.
4929 }
4930 \def\finishentry#1{%
4931     % #1 is the page number.
4932     %
4933     % The following is kludged to not output a line of dots in the index if
4934     % there are no page numbers.  The next person who breaks this will be
4935     % cursed by a Unix daemon.
4936     \setbox\boxA = \hbox{#1}%
4937     \ifdim\wd\boxA = 0pt
4938       \ %
4939     \else
4940       %
4941       % If we must, put the page number on a line of its own, and fill out
4942       % this line with blank space.  (The \hfil is overwhelmed with the
4943       % fill leaders glue in \indexdotfill if the page number does fit.)
4944       \hfil\penalty50
4945       \null\nobreak\indexdotfill % Have leaders before the page number.
4946       %
4947       % The `\ ' here is removed by the implicit \unskip that TeX does as
4948       % part of (the primitive) \par.  Without it, a spurious underfull
4949       % \hbox ensues.
4950       \ifpdf
4951         \pdfgettoks#1.%
4952         \ \the\toksA
4953       \else
4954         \ #1%
4955       \fi
4956     \fi
4957     \par
4958   \endgroup
4959 }
4960
4961 % Like plain.tex's \dotfill, except uses up at least 1 em.
4962 \def\indexdotfill{\cleaders
4963   \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1fill}
4964
4965 \def\primary #1{\line{#1\hfil}}
4966
4967 \newskip\secondaryindent \secondaryindent=0.5cm
4968 \def\secondary#1#2{{%
4969   \parfillskip=0in
4970   \parskip=0in
4971   \hangindent=1in
4972   \hangafter=1
4973   \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill
4974   \ifpdf
4975     \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
4976   \else
4977     #2
4978   \fi
4979   \par
4980 }}
4981
4982 % Define two-column mode, which we use to typeset indexes.
4983 % Adapted from the TeXbook, page 416, which is to say,
4984 % the manmac.tex format used to print the TeXbook itself.
4985 \catcode`\@=11
4986
4987 \newbox\partialpage
4988 \newdimen\doublecolumnhsize
4989
4990 \def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
4991   % Grab any single-column material above us.
4992   \output = {%
4993     %
4994     % Here is a possibility not foreseen in manmac: if we accumulate a
4995     % whole lot of material, we might end up calling this \output
4996     % routine twice in a row (see the doublecol-lose test, which is
4997     % essentially a couple of indexes with @setchapternewpage off).  In
4998     % that case we just ship out what is in \partialpage with the normal
4999     % output routine.  Generally, \partialpage will be empty when this
5000     % runs and this will be a no-op.  See the indexspread.tex test case.
5001     \ifvoid\partialpage \else
5002       \onepageout{\pagecontents\partialpage}%
5003     \fi
5004     %
5005     \global\setbox\partialpage = \vbox{%
5006       % Unvbox the main output page.
5007       \unvbox\PAGE
5008       \kern-\topskip \kern\baselineskip
5009     }%
5010   }%
5011   \eject % run that output routine to set \partialpage
5012   %
5013   % Use the double-column output routine for subsequent pages.
5014   \output = {\doublecolumnout}%
5015   %
5016   % Change the page size parameters.  We could do this once outside this
5017   % routine, in each of @smallbook, @afourpaper, and the default 8.5x11
5018   % format, but then we repeat the same computation.  Repeating a couple
5019   % of assignments once per index is clearly meaningless for the
5020   % execution time, so we may as well do it in one place.
5021   %
5022   % First we halve the line length, less a little for the gutter between
5023   % the columns.  We compute the gutter based on the line length, so it
5024   % changes automatically with the paper format.  The magic constant
5025   % below is chosen so that the gutter has the same value (well, +-<1pt)
5026   % as it did when we hard-coded it.
5027   %
5028   % We put the result in a separate register, \doublecolumhsize, so we
5029   % can restore it in \pagesofar, after \hsize itself has (potentially)
5030   % been clobbered.
5031   %
5032   \doublecolumnhsize = \hsize
5033     \advance\doublecolumnhsize by -.04154\hsize
5034     \divide\doublecolumnhsize by 2
5035   \hsize = \doublecolumnhsize
5036   %
5037   % Double the \vsize as well.  (We don't need a separate register here,
5038   % since nobody clobbers \vsize.)
5039   \vsize = 2\vsize
5040 }
5041
5042 % The double-column output routine for all double-column pages except
5043 % the last.
5044 %
5045 \def\doublecolumnout{%
5046   \splittopskip=\topskip \splitmaxdepth=\maxdepth
5047   % Get the available space for the double columns -- the normal
5048   % (undoubled) page height minus any material left over from the
5049   % previous page.
5050   \dimen@ = \vsize
5051   \divide\dimen@ by 2
5052   \advance\dimen@ by -\ht\partialpage
5053   %
5054   % box0 will be the left-hand column, box2 the right.
5055   \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
5056   \onepageout\pagesofar
5057   \unvbox255
5058   \penalty\outputpenalty
5059 }
5060 %
5061 % Re-output the contents of the output page -- any previous material,
5062 % followed by the two boxes we just split, in box0 and box2.
5063 \def\pagesofar{%
5064   \unvbox\partialpage
5065   %
5066   \hsize = \doublecolumnhsize
5067   \wd0=\hsize \wd2=\hsize
5068   \hbox to\pagewidth{\box0\hfil\box2}%
5069 }
5070 %
5071 % All done with double columns.
5072 \def\enddoublecolumns{%
5073   % The following penalty ensures that the page builder is exercised
5074   % _before_ we change the output routine.  This is necessary in the
5075   % following situation:
5076   %
5077   % The last section of the index consists only of a single entry.
5078   % Before this section, \pagetotal is less than \pagegoal, so no
5079   % break occurs before the last section starts.  However, the last
5080   % section, consisting of \initial and the single \entry, does not
5081   % fit on the page and has to be broken off.  Without the following
5082   % penalty the page builder will not be exercised until \eject
5083   % below, and by that time we'll already have changed the output
5084   % routine to the \balancecolumns version, so the next-to-last
5085   % double-column page will be processed with \balancecolumns, which
5086   % is wrong:  The two columns will go to the main vertical list, with
5087   % the broken-off section in the recent contributions.  As soon as
5088   % the output routine finishes, TeX starts reconsidering the page
5089   % break.  The two columns and the broken-off section both fit on the
5090   % page, because the two columns now take up only half of the page
5091   % goal.  When TeX sees \eject from below which follows the final
5092   % section, it invokes the new output routine that we've set after
5093   % \balancecolumns below; \onepageout will try to fit the two columns
5094   % and the final section into the vbox of \pageheight (see
5095   % \pagebody), causing an overfull box.
5096   %
5097   % Note that glue won't work here, because glue does not exercise the
5098   % page builder, unlike penalties (see The TeXbook, pp. 280-281).
5099   \penalty0
5100   %
5101   \output = {%
5102     % Split the last of the double-column material.  Leave it on the
5103     % current page, no automatic page break.
5104     \balancecolumns
5105     %
5106     % If we end up splitting too much material for the current page,
5107     % though, there will be another page break right after this \output
5108     % invocation ends.  Having called \balancecolumns once, we do not
5109     % want to call it again.  Therefore, reset \output to its normal
5110     % definition right away.  (We hope \balancecolumns will never be
5111     % called on to balance too much material, but if it is, this makes
5112     % the output somewhat more palatable.)
5113     \global\output = {\onepageout{\pagecontents\PAGE}}%
5114   }%
5115   \eject
5116   \endgroup % started in \begindoublecolumns
5117   %
5118   % \pagegoal was set to the doubled \vsize above, since we restarted
5119   % the current page.  We're now back to normal single-column
5120   % typesetting, so reset \pagegoal to the normal \vsize (after the
5121   % \endgroup where \vsize got restored).
5122   \pagegoal = \vsize
5123 }
5124 %
5125 % Called at the end of the double column material.
5126 \def\balancecolumns{%
5127   \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120.
5128   \dimen@ = \ht0
5129   \advance\dimen@ by \topskip
5130   \advance\dimen@ by-\baselineskip
5131   \divide\dimen@ by 2 % target to split to
5132   %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}%
5133   \splittopskip = \topskip
5134   % Loop until we get a decent breakpoint.
5135   {%
5136     \vbadness = 10000
5137     \loop
5138       \global\setbox3 = \copy0
5139       \global\setbox1 = \vsplit3 to \dimen@
5140     \ifdim\ht3>\dimen@
5141       \global\advance\dimen@ by 1pt
5142     \repeat
5143   }%
5144   %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}%
5145   \setbox0=\vbox to\dimen@{\unvbox1}%
5146   \setbox2=\vbox to\dimen@{\unvbox3}%
5147   %
5148   \pagesofar
5149 }
5150 \catcode`\@ = \other
5151
5152
5153 \message{sectioning,}
5154 % Chapters, sections, etc.
5155
5156 % Let's start with @part.
5157 \outer\parseargdef\part{\partzzz{#1}}
5158 \def\partzzz#1{%
5159   \chapoddpage
5160   \null
5161   \vskip.3\vsize  % move it down on the page a bit
5162   \begingroup
5163     \noindent \titlefonts\rmisbold #1\par % the text
5164     \let\lastnode=\empty      % no node to associate with
5165     \writetocentry{part}{#1}{}% but put it in the toc
5166     \headingsoff              % no headline or footline on the part page
5167     \chapoddpage
5168   \endgroup
5169 }
5170
5171 % \unnumberedno is an oxymoron.  But we count the unnumbered
5172 % sections so that we can refer to them unambiguously in the pdf
5173 % outlines by their "section number".  We avoid collisions with chapter
5174 % numbers by starting them at 10000.  (If a document ever has 10000
5175 % chapters, we're in trouble anyway, I'm sure.)
5176 \newcount\unnumberedno \unnumberedno = 10000
5177 \newcount\chapno
5178 \newcount\secno        \secno=0
5179 \newcount\subsecno     \subsecno=0
5180 \newcount\subsubsecno  \subsubsecno=0
5181
5182 % This counter is funny since it counts through charcodes of letters A, B, ...
5183 \newcount\appendixno  \appendixno = `\@
5184 %
5185 % \def\appendixletter{\char\the\appendixno}
5186 % We do the following ugly conditional instead of the above simple
5187 % construct for the sake of pdftex, which needs the actual
5188 % letter in the expansion, not just typeset.
5189 %
5190 \def\appendixletter{%
5191   \ifnum\appendixno=`A A%
5192   \else\ifnum\appendixno=`B B%
5193   \else\ifnum\appendixno=`C C%
5194   \else\ifnum\appendixno=`D D%
5195   \else\ifnum\appendixno=`E E%
5196   \else\ifnum\appendixno=`F F%
5197   \else\ifnum\appendixno=`G G%
5198   \else\ifnum\appendixno=`H H%
5199   \else\ifnum\appendixno=`I I%
5200   \else\ifnum\appendixno=`J J%
5201   \else\ifnum\appendixno=`K K%
5202   \else\ifnum\appendixno=`L L%
5203   \else\ifnum\appendixno=`M M%
5204   \else\ifnum\appendixno=`N N%
5205   \else\ifnum\appendixno=`O O%
5206   \else\ifnum\appendixno=`P P%
5207   \else\ifnum\appendixno=`Q Q%
5208   \else\ifnum\appendixno=`R R%
5209   \else\ifnum\appendixno=`S S%
5210   \else\ifnum\appendixno=`T T%
5211   \else\ifnum\appendixno=`U U%
5212   \else\ifnum\appendixno=`V V%
5213   \else\ifnum\appendixno=`W W%
5214   \else\ifnum\appendixno=`X X%
5215   \else\ifnum\appendixno=`Y Y%
5216   \else\ifnum\appendixno=`Z Z%
5217   % The \the is necessary, despite appearances, because \appendixletter is
5218   % expanded while writing the .toc file.  \char\appendixno is not
5219   % expandable, thus it is written literally, thus all appendixes come out
5220   % with the same letter (or @) in the toc without it.
5221   \else\char\the\appendixno
5222   \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
5223   \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
5224
5225 % Each @chapter defines these (using marks) as the number+name, number
5226 % and name of the chapter.  Page headings and footings can use
5227 % these.  @section does likewise.
5228 \def\thischapter{}
5229 \def\thischapternum{}
5230 \def\thischaptername{}
5231 \def\thissection{}
5232 \def\thissectionnum{}
5233 \def\thissectionname{}
5234
5235 \newcount\absseclevel % used to calculate proper heading level
5236 \newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count
5237
5238 % @raisesections: treat @section as chapter, @subsection as section, etc.
5239 \def\raisesections{\global\advance\secbase by -1}
5240 \let\up=\raisesections % original BFox name
5241
5242 % @lowersections: treat @chapter as section, @section as subsection, etc.
5243 \def\lowersections{\global\advance\secbase by 1}
5244 \let\down=\lowersections % original BFox name
5245
5246 % we only have subsub.
5247 \chardef\maxseclevel = 3
5248 %
5249 % A numbered section within an unnumbered changes to unnumbered too.
5250 % To achieve this, remember the "biggest" unnum. sec. we are currently in:
5251 \chardef\unnlevel = \maxseclevel
5252 %
5253 % Trace whether the current chapter is an appendix or not:
5254 % \chapheadtype is "N" or "A", unnumbered chapters are ignored.
5255 \def\chapheadtype{N}
5256
5257 % Choose a heading macro
5258 % #1 is heading type
5259 % #2 is heading level
5260 % #3 is text for heading
5261 \def\genhead#1#2#3{%
5262   % Compute the abs. sec. level:
5263   \absseclevel=#2
5264   \advance\absseclevel by \secbase
5265   % Make sure \absseclevel doesn't fall outside the range:
5266   \ifnum \absseclevel < 0
5267     \absseclevel = 0
5268   \else
5269     \ifnum \absseclevel > 3
5270       \absseclevel = 3
5271     \fi
5272   \fi
5273   % The heading type:
5274   \def\headtype{#1}%
5275   \if \headtype U%
5276     \ifnum \absseclevel < \unnlevel
5277       \chardef\unnlevel = \absseclevel
5278     \fi
5279   \else
5280     % Check for appendix sections:
5281     \ifnum \absseclevel = 0
5282       \edef\chapheadtype{\headtype}%
5283     \else
5284       \if \headtype A\if \chapheadtype N%
5285         \errmessage{@appendix... within a non-appendix chapter}%
5286       \fi\fi
5287     \fi
5288     % Check for numbered within unnumbered:
5289     \ifnum \absseclevel > \unnlevel
5290       \def\headtype{U}%
5291     \else
5292       \chardef\unnlevel = 3
5293     \fi
5294   \fi
5295   % Now print the heading:
5296   \if \headtype U%
5297     \ifcase\absseclevel
5298         \unnumberedzzz{#3}%
5299     \or \unnumberedseczzz{#3}%
5300     \or \unnumberedsubseczzz{#3}%
5301     \or \unnumberedsubsubseczzz{#3}%
5302     \fi
5303   \else
5304     \if \headtype A%
5305       \ifcase\absseclevel
5306           \appendixzzz{#3}%
5307       \or \appendixsectionzzz{#3}%
5308       \or \appendixsubseczzz{#3}%
5309       \or \appendixsubsubseczzz{#3}%
5310       \fi
5311     \else
5312       \ifcase\absseclevel
5313           \chapterzzz{#3}%
5314       \or \seczzz{#3}%
5315       \or \numberedsubseczzz{#3}%
5316       \or \numberedsubsubseczzz{#3}%
5317       \fi
5318     \fi
5319   \fi
5320   \suppressfirstparagraphindent
5321 }
5322
5323 % an interface:
5324 \def\numhead{\genhead N}
5325 \def\apphead{\genhead A}
5326 \def\unnmhead{\genhead U}
5327
5328 % @chapter, @appendix, @unnumbered.  Increment top-level counter, reset
5329 % all lower-level sectioning counters to zero.
5330 %
5331 % Also set \chaplevelprefix, which we prepend to @float sequence numbers
5332 % (e.g., figures), q.v.  By default (before any chapter), that is empty.
5333 \let\chaplevelprefix = \empty
5334 %
5335 \outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz
5336 \def\chapterzzz#1{%
5337   % section resetting is \global in case the chapter is in a group, such
5338   % as an @include file.
5339   \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
5340     \global\advance\chapno by 1
5341   %
5342   % Used for \float.
5343   \gdef\chaplevelprefix{\the\chapno.}%
5344   \resetallfloatnos
5345   %
5346   % \putwordChapter can contain complex things in translations.
5347   \toks0=\expandafter{\putwordChapter}%
5348   \message{\the\toks0 \space \the\chapno}%
5349   %
5350   % Write the actual heading.
5351   \chapmacro{#1}{Ynumbered}{\the\chapno}%
5352   %
5353   % So @section and the like are numbered underneath this chapter.
5354   \global\let\section = \numberedsec
5355   \global\let\subsection = \numberedsubsec
5356   \global\let\subsubsection = \numberedsubsubsec
5357 }
5358
5359 \outer\parseargdef\appendix{\apphead0{#1}} % normally calls appendixzzz
5360 %
5361 \def\appendixzzz#1{%
5362   \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
5363     \global\advance\appendixno by 1
5364   \gdef\chaplevelprefix{\appendixletter.}%
5365   \resetallfloatnos
5366   %
5367   % \putwordAppendix can contain complex things in translations.
5368   \toks0=\expandafter{\putwordAppendix}%
5369   \message{\the\toks0 \space \appendixletter}%
5370   %
5371   \chapmacro{#1}{Yappendix}{\appendixletter}%
5372   %
5373   \global\let\section = \appendixsec
5374   \global\let\subsection = \appendixsubsec
5375   \global\let\subsubsection = \appendixsubsubsec
5376 }
5377
5378 % normally unnmhead0 calls unnumberedzzz:
5379 \outer\parseargdef\unnumbered{\unnmhead0{#1}}
5380 \def\unnumberedzzz#1{%
5381   \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
5382     \global\advance\unnumberedno by 1
5383   %
5384   % Since an unnumbered has no number, no prefix for figures.
5385   \global\let\chaplevelprefix = \empty
5386   \resetallfloatnos
5387   %
5388   % This used to be simply \message{#1}, but TeX fully expands the
5389   % argument to \message.  Therefore, if #1 contained @-commands, TeX
5390   % expanded them.  For example, in `@unnumbered The @cite{Book}', TeX
5391   % expanded @cite (which turns out to cause errors because \cite is meant
5392   % to be executed, not expanded).
5393   %
5394   % Anyway, we don't want the fully-expanded definition of @cite to appear
5395   % as a result of the \message, we just want `@cite' itself.  We use
5396   % \the<toks register> to achieve this: TeX expands \the<toks> only once,
5397   % simply yielding the contents of <toks register>.  (We also do this for
5398   % the toc entries.)
5399   \toks0 = {#1}%
5400   \message{(\the\toks0)}%
5401   %
5402   \chapmacro{#1}{Ynothing}{\the\unnumberedno}%
5403   %
5404   \global\let\section = \unnumberedsec
5405   \global\let\subsection = \unnumberedsubsec
5406   \global\let\subsubsection = \unnumberedsubsubsec
5407 }
5408
5409 % @centerchap is like @unnumbered, but the heading is centered.
5410 \outer\parseargdef\centerchap{%
5411   % Well, we could do the following in a group, but that would break
5412   % an assumption that \chapmacro is called at the outermost level.
5413   % Thus we are safer this way:         --kasal, 24feb04
5414   \let\centerparametersmaybe = \centerparameters
5415   \unnmhead0{#1}%
5416   \let\centerparametersmaybe = \relax
5417 }
5418
5419 % @top is like @unnumbered.
5420 \let\top\unnumbered
5421
5422 % Sections.
5423
5424 \outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz
5425 \def\seczzz#1{%
5426   \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
5427   \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}%
5428 }
5429
5430 % normally calls appendixsectionzzz:
5431 \outer\parseargdef\appendixsection{\apphead1{#1}}
5432 \def\appendixsectionzzz#1{%
5433   \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
5434   \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}%
5435 }
5436 \let\appendixsec\appendixsection
5437
5438 % normally calls unnumberedseczzz:
5439 \outer\parseargdef\unnumberedsec{\unnmhead1{#1}}
5440 \def\unnumberedseczzz#1{%
5441   \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
5442   \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}%
5443 }
5444
5445 % Subsections.
5446
5447 % normally calls numberedsubseczzz:
5448 \outer\parseargdef\numberedsubsec{\numhead2{#1}}
5449 \def\numberedsubseczzz#1{%
5450   \global\subsubsecno=0  \global\advance\subsecno by 1
5451   \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}%
5452 }
5453
5454 % normally calls appendixsubseczzz:
5455 \outer\parseargdef\appendixsubsec{\apphead2{#1}}
5456 \def\appendixsubseczzz#1{%
5457   \global\subsubsecno=0  \global\advance\subsecno by 1
5458   \sectionheading{#1}{subsec}{Yappendix}%
5459                  {\appendixletter.\the\secno.\the\subsecno}%
5460 }
5461
5462 % normally calls unnumberedsubseczzz:
5463 \outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}}
5464 \def\unnumberedsubseczzz#1{%
5465   \global\subsubsecno=0  \global\advance\subsecno by 1
5466   \sectionheading{#1}{subsec}{Ynothing}%
5467                  {\the\unnumberedno.\the\secno.\the\subsecno}%
5468 }
5469
5470 % Subsubsections.
5471
5472 % normally numberedsubsubseczzz:
5473 \outer\parseargdef\numberedsubsubsec{\numhead3{#1}}
5474 \def\numberedsubsubseczzz#1{%
5475   \global\advance\subsubsecno by 1
5476   \sectionheading{#1}{subsubsec}{Ynumbered}%
5477                  {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}%
5478 }
5479
5480 % normally appendixsubsubseczzz:
5481 \outer\parseargdef\appendixsubsubsec{\apphead3{#1}}
5482 \def\appendixsubsubseczzz#1{%
5483   \global\advance\subsubsecno by 1
5484   \sectionheading{#1}{subsubsec}{Yappendix}%
5485                  {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}%
5486 }
5487
5488 % normally unnumberedsubsubseczzz:
5489 \outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}}
5490 \def\unnumberedsubsubseczzz#1{%
5491   \global\advance\subsubsecno by 1
5492   \sectionheading{#1}{subsubsec}{Ynothing}%
5493                  {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}%
5494 }
5495
5496 % These macros control what the section commands do, according
5497 % to what kind of chapter we are in (ordinary, appendix, or unnumbered).
5498 % Define them by default for a numbered chapter.
5499 \let\section = \numberedsec
5500 \let\subsection = \numberedsubsec
5501 \let\subsubsection = \numberedsubsubsec
5502
5503 % Define @majorheading, @heading and @subheading
5504
5505 % NOTE on use of \vbox for chapter headings, section headings, and such:
5506 %       1) We use \vbox rather than the earlier \line to permit
5507 %          overlong headings to fold.
5508 %       2) \hyphenpenalty is set to 10000 because hyphenation in a
5509 %          heading is obnoxious; this forbids it.
5510 %       3) Likewise, headings look best if no \parindent is used, and
5511 %          if justification is not attempted.  Hence \raggedright.
5512
5513 \def\majorheading{%
5514   {\advance\chapheadingskip by 10pt \chapbreak }%
5515   \parsearg\chapheadingzzz
5516 }
5517
5518 \def\chapheading{\chapbreak \parsearg\chapheadingzzz}
5519 \def\chapheadingzzz#1{%
5520   {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
5521                     \parindent=0pt\ptexraggedright
5522                     \rmisbold #1\hfill}}%
5523   \bigskip \par\penalty 200\relax
5524   \suppressfirstparagraphindent
5525 }
5526
5527 % @heading, @subheading, @subsubheading.
5528 \parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{}
5529   \suppressfirstparagraphindent}
5530 \parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{}
5531   \suppressfirstparagraphindent}
5532 \parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{}
5533   \suppressfirstparagraphindent}
5534
5535 % These macros generate a chapter, section, etc. heading only
5536 % (including whitespace, linebreaking, etc. around it),
5537 % given all the information in convenient, parsed form.
5538
5539 %%% Args are the skip and penalty (usually negative)
5540 \def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
5541
5542 %%% Define plain chapter starts, and page on/off switching for it
5543 % Parameter controlling skip before chapter headings (if needed)
5544
5545 \newskip\chapheadingskip
5546
5547 \def\chapbreak{\dobreak \chapheadingskip {-4000}}
5548 \def\chappager{\par\vfill\supereject}
5549 % Because \domark is called before \chapoddpage, the filler page will
5550 % get the headings for the next chapter, which is wrong.  But we don't
5551 % care -- we just disable all headings on the filler page.
5552 \def\chapoddpage{%
5553   \chappager
5554   \ifodd\pageno \else
5555     \begingroup
5556       \headingsoff
5557       \null
5558       \chappager
5559     \endgroup
5560   \fi
5561 }
5562
5563 \def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
5564
5565 \def\CHAPPAGoff{%
5566 \global\let\contentsalignmacro = \chappager
5567 \global\let\pchapsepmacro=\chapbreak
5568 \global\let\pagealignmacro=\chappager}
5569
5570 \def\CHAPPAGon{%
5571 \global\let\contentsalignmacro = \chappager
5572 \global\let\pchapsepmacro=\chappager
5573 \global\let\pagealignmacro=\chappager
5574 \global\def\HEADINGSon{\HEADINGSsingle}}
5575
5576 \def\CHAPPAGodd{%
5577 \global\let\contentsalignmacro = \chapoddpage
5578 \global\let\pchapsepmacro=\chapoddpage
5579 \global\let\pagealignmacro=\chapoddpage
5580 \global\def\HEADINGSon{\HEADINGSdouble}}
5581
5582 \CHAPPAGon
5583
5584 % Chapter opening.
5585 %
5586 % #1 is the text, #2 is the section type (Ynumbered, Ynothing,
5587 % Yappendix, Yomitfromtoc), #3 the chapter number.
5588 %
5589 % To test against our argument.
5590 \def\Ynothingkeyword{Ynothing}
5591 \def\Yomitfromtockeyword{Yomitfromtoc}
5592 \def\Yappendixkeyword{Yappendix}
5593 %
5594 \def\chapmacro#1#2#3{%
5595   % Insert the first mark before the heading break (see notes for \domark).
5596   \let\prevchapterdefs=\lastchapterdefs
5597   \let\prevsectiondefs=\lastsectiondefs
5598   \gdef\lastsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}%
5599                         \gdef\thissection{}}%
5600   %
5601   \def\temptype{#2}%
5602   \ifx\temptype\Ynothingkeyword
5603     \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}%
5604                           \gdef\thischapter{\thischaptername}}%
5605   \else\ifx\temptype\Yomitfromtockeyword
5606     \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}%
5607                           \gdef\thischapter{}}%
5608   \else\ifx\temptype\Yappendixkeyword
5609     \toks0={#1}%
5610     \xdef\lastchapterdefs{%
5611       \gdef\noexpand\thischaptername{\the\toks0}%
5612       \gdef\noexpand\thischapternum{\appendixletter}%
5613       % \noexpand\putwordAppendix avoids expanding indigestible
5614       % commands in some of the translations.
5615       \gdef\noexpand\thischapter{\noexpand\putwordAppendix{}
5616                                  \noexpand\thischapternum:
5617                                  \noexpand\thischaptername}%
5618     }%
5619   \else
5620     \toks0={#1}%
5621     \xdef\lastchapterdefs{%
5622       \gdef\noexpand\thischaptername{\the\toks0}%
5623       \gdef\noexpand\thischapternum{\the\chapno}%
5624       % \noexpand\putwordChapter avoids expanding indigestible
5625       % commands in some of the translations.
5626       \gdef\noexpand\thischapter{\noexpand\putwordChapter{}
5627                                  \noexpand\thischapternum:
5628                                  \noexpand\thischaptername}%
5629     }%
5630   \fi\fi\fi
5631   %
5632   % Output the mark.  Pass it through \safewhatsit, to take care of
5633   % the preceding space.
5634   \safewhatsit\domark
5635   %
5636   % Insert the chapter heading break.
5637   \pchapsepmacro
5638   %
5639   % Now the second mark, after the heading break.  No break points
5640   % between here and the heading.
5641   \let\prevchapterdefs=\lastchapterdefs
5642   \let\prevsectiondefs=\lastsectiondefs
5643   \domark
5644   %
5645   {%
5646     \chapfonts \rmisbold
5647     %
5648     % Have to define \lastsection before calling \donoderef, because the
5649     % xref code eventually uses it.  On the other hand, it has to be called
5650     % after \pchapsepmacro, or the headline will change too soon.
5651     \gdef\lastsection{#1}%
5652     %
5653     % Only insert the separating space if we have a chapter/appendix
5654     % number, and don't print the unnumbered ``number''.
5655     \ifx\temptype\Ynothingkeyword
5656       \setbox0 = \hbox{}%
5657       \def\toctype{unnchap}%
5658     \else\ifx\temptype\Yomitfromtockeyword
5659       \setbox0 = \hbox{}% contents like unnumbered, but no toc entry
5660       \def\toctype{omit}%
5661     \else\ifx\temptype\Yappendixkeyword
5662       \setbox0 = \hbox{\putwordAppendix{} #3\enspace}%
5663       \def\toctype{app}%
5664     \else
5665       \setbox0 = \hbox{#3\enspace}%
5666       \def\toctype{numchap}%
5667     \fi\fi\fi
5668     %
5669     % Write the toc entry for this chapter.  Must come before the
5670     % \donoderef, because we include the current node name in the toc
5671     % entry, and \donoderef resets it to empty.
5672     \writetocentry{\toctype}{#1}{#3}%
5673     %
5674     % For pdftex, we have to write out the node definition (aka, make
5675     % the pdfdest) after any page break, but before the actual text has
5676     % been typeset.  If the destination for the pdf outline is after the
5677     % text, then jumping from the outline may wind up with the text not
5678     % being visible, for instance under high magnification.
5679     \donoderef{#2}%
5680     %
5681     % Typeset the actual heading.
5682     \nobreak % Avoid page breaks at the interline glue.
5683     \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright
5684           \hangindent=\wd0 \centerparametersmaybe
5685           \unhbox0 #1\par}%
5686   }%
5687   \nobreak\bigskip % no page break after a chapter title
5688   \nobreak
5689 }
5690
5691 % @centerchap -- centered and unnumbered.
5692 \let\centerparametersmaybe = \relax
5693 \def\centerparameters{%
5694   \advance\rightskip by 3\rightskip
5695   \leftskip = \rightskip
5696   \parfillskip = 0pt
5697 }
5698
5699
5700 % I don't think this chapter style is supported any more, so I'm not
5701 % updating it with the new noderef stuff.  We'll see.  --karl, 11aug03.
5702 %
5703 \def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
5704 %
5705 \def\unnchfopen #1{%
5706 \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
5707                        \parindent=0pt\ptexraggedright
5708                        \rmisbold #1\hfill}}\bigskip \par\nobreak
5709 }
5710 \def\chfopen #1#2{\chapoddpage {\chapfonts
5711 \vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
5712 \par\penalty 5000 %
5713 }
5714 \def\centerchfopen #1{%
5715 \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
5716                        \parindent=0pt
5717                        \hfill {\rmisbold #1}\hfill}}\bigskip \par\nobreak
5718 }
5719 \def\CHAPFopen{%
5720   \global\let\chapmacro=\chfopen
5721   \global\let\centerchapmacro=\centerchfopen}
5722
5723
5724 % Section titles.  These macros combine the section number parts and
5725 % call the generic \sectionheading to do the printing.
5726 %
5727 \newskip\secheadingskip
5728 \def\secheadingbreak{\dobreak \secheadingskip{-1000}}
5729
5730 % Subsection titles.
5731 \newskip\subsecheadingskip
5732 \def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}}
5733
5734 % Subsubsection titles.
5735 \def\subsubsecheadingskip{\subsecheadingskip}
5736 \def\subsubsecheadingbreak{\subsecheadingbreak}
5737
5738
5739 % Print any size, any type, section title.
5740 %
5741 % #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is
5742 % the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the
5743 % section number.
5744 %
5745 \def\seckeyword{sec}
5746 %
5747 \def\sectionheading#1#2#3#4{%
5748   {%
5749     \checkenv{}% should not be in an environment.
5750     %
5751     % Switch to the right set of fonts.
5752     \csname #2fonts\endcsname \rmisbold
5753     %
5754     \def\sectionlevel{#2}%
5755     \def\temptype{#3}%
5756     %
5757     % Insert first mark before the heading break (see notes for \domark).
5758     \let\prevsectiondefs=\lastsectiondefs
5759     \ifx\temptype\Ynothingkeyword
5760       \ifx\sectionlevel\seckeyword
5761         \gdef\lastsectiondefs{\gdef\thissectionname{#1}\gdef\thissectionnum{}%
5762                               \gdef\thissection{\thissectionname}}%
5763       \fi
5764     \else\ifx\temptype\Yomitfromtockeyword
5765       % Don't redefine \thissection.
5766     \else\ifx\temptype\Yappendixkeyword
5767       \ifx\sectionlevel\seckeyword
5768         \toks0={#1}%
5769         \xdef\lastsectiondefs{%
5770           \gdef\noexpand\thissectionname{\the\toks0}%
5771           \gdef\noexpand\thissectionnum{#4}%
5772           % \noexpand\putwordSection avoids expanding indigestible
5773           % commands in some of the translations.
5774           \gdef\noexpand\thissection{\noexpand\putwordSection{}
5775                                      \noexpand\thissectionnum:
5776                                      \noexpand\thissectionname}%
5777         }%
5778       \fi
5779     \else
5780       \ifx\sectionlevel\seckeyword
5781         \toks0={#1}%
5782         \xdef\lastsectiondefs{%
5783           \gdef\noexpand\thissectionname{\the\toks0}%
5784           \gdef\noexpand\thissectionnum{#4}%
5785           % \noexpand\putwordSection avoids expanding indigestible
5786           % commands in some of the translations.
5787           \gdef\noexpand\thissection{\noexpand\putwordSection{}
5788                                      \noexpand\thissectionnum:
5789                                      \noexpand\thissectionname}%
5790         }%
5791       \fi
5792     \fi\fi\fi
5793     %
5794     % Go into vertical mode.  Usually we'll already be there, but we
5795     % don't want the following whatsit to end up in a preceding paragraph
5796     % if the document didn't happen to have a blank line.
5797     \par
5798     %
5799     % Output the mark.  Pass it through \safewhatsit, to take care of
5800     % the preceding space.
5801     \safewhatsit\domark
5802     %
5803     % Insert space above the heading.
5804     \csname #2headingbreak\endcsname
5805     %
5806     % Now the second mark, after the heading break.  No break points
5807     % between here and the heading.
5808     \let\prevsectiondefs=\lastsectiondefs
5809     \domark
5810     %
5811     % Only insert the space after the number if we have a section number.
5812     \ifx\temptype\Ynothingkeyword
5813       \setbox0 = \hbox{}%
5814       \def\toctype{unn}%
5815       \gdef\lastsection{#1}%
5816     \else\ifx\temptype\Yomitfromtockeyword
5817       % for @headings -- no section number, don't include in toc,
5818       % and don't redefine \lastsection.
5819       \setbox0 = \hbox{}%
5820       \def\toctype{omit}%
5821       \let\sectionlevel=\empty
5822     \else\ifx\temptype\Yappendixkeyword
5823       \setbox0 = \hbox{#4\enspace}%
5824       \def\toctype{app}%
5825       \gdef\lastsection{#1}%
5826     \else
5827       \setbox0 = \hbox{#4\enspace}%
5828       \def\toctype{num}%
5829       \gdef\lastsection{#1}%
5830     \fi\fi\fi
5831     %
5832     % Write the toc entry (before \donoderef).  See comments in \chapmacro.
5833     \writetocentry{\toctype\sectionlevel}{#1}{#4}%
5834     %
5835     % Write the node reference (= pdf destination for pdftex).
5836     % Again, see comments in \chapmacro.
5837     \donoderef{#3}%
5838     %
5839     % Interline glue will be inserted when the vbox is completed.
5840     % That glue will be a valid breakpoint for the page, since it'll be
5841     % preceded by a whatsit (usually from the \donoderef, or from the
5842     % \writetocentry if there was no node).  We don't want to allow that
5843     % break, since then the whatsits could end up on page n while the
5844     % section is on page n+1, thus toc/etc. are wrong.  Debian bug 276000.
5845     \nobreak
5846     %
5847     % Output the actual section heading.
5848     \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright
5849           \hangindent=\wd0  % zero if no section number
5850           \unhbox0 #1}%
5851   }%
5852   % Add extra space after the heading -- half of whatever came above it.
5853   % Don't allow stretch, though.
5854   \kern .5 \csname #2headingskip\endcsname
5855   %
5856   % Do not let the kern be a potential breakpoint, as it would be if it
5857   % was followed by glue.
5858   \nobreak
5859   %
5860   % We'll almost certainly start a paragraph next, so don't let that
5861   % glue accumulate.  (Not a breakpoint because it's preceded by a
5862   % discardable item.)
5863   \vskip-\parskip
5864   %
5865   % This is purely so the last item on the list is a known \penalty >
5866   % 10000.  This is so \startdefun can avoid allowing breakpoints after
5867   % section headings.  Otherwise, it would insert a valid breakpoint between:
5868   %
5869   %   @section sec-whatever
5870   %   @deffn def-whatever
5871   \penalty 10001
5872 }
5873
5874
5875 \message{toc,}
5876 % Table of contents.
5877 \newwrite\tocfile
5878
5879 % Write an entry to the toc file, opening it if necessary.
5880 % Called from @chapter, etc.
5881 %
5882 % Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno}
5883 % We append the current node name (if any) and page number as additional
5884 % arguments for the \{chap,sec,...}entry macros which will eventually
5885 % read this.  The node name is used in the pdf outlines as the
5886 % destination to jump to.
5887 %
5888 % We open the .toc file for writing here instead of at @setfilename (or
5889 % any other fixed time) so that @contents can be anywhere in the document.
5890 % But if #1 is `omit', then we don't do anything.  This is used for the
5891 % table of contents chapter openings themselves.
5892 %
5893 \newif\iftocfileopened
5894 \def\omitkeyword{omit}%
5895 %
5896 \def\writetocentry#1#2#3{%
5897   \edef\writetoctype{#1}%
5898   \ifx\writetoctype\omitkeyword \else
5899     \iftocfileopened\else
5900       \immediate\openout\tocfile = \jobname.toc
5901       \global\tocfileopenedtrue
5902     \fi
5903     %
5904     \iflinks
5905       {\atdummies
5906        \edef\temp{%
5907          \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}%
5908        \temp
5909       }%
5910     \fi
5911   \fi
5912   %
5913   % Tell \shipout to create a pdf destination on each page, if we're
5914   % writing pdf.  These are used in the table of contents.  We can't
5915   % just write one on every page because the title pages are numbered
5916   % 1 and 2 (the page numbers aren't printed), and so are the first
5917   % two pages of the document.  Thus, we'd have two destinations named
5918   % `1', and two named `2'.
5919   \ifpdf \global\pdfmakepagedesttrue \fi
5920 }
5921
5922
5923 % These characters do not print properly in the Computer Modern roman
5924 % fonts, so we must take special care.  This is more or less redundant
5925 % with the Texinfo input format setup at the end of this file.
5926 %
5927 \def\activecatcodes{%
5928   \catcode`\"=\active
5929   \catcode`\$=\active
5930   \catcode`\<=\active
5931   \catcode`\>=\active
5932   \catcode`\\=\active
5933   \catcode`\^=\active
5934   \catcode`\_=\active
5935   \catcode`\|=\active
5936   \catcode`\~=\active
5937 }
5938
5939
5940 % Read the toc file, which is essentially Texinfo input.
5941 \def\readtocfile{%
5942   \setupdatafile
5943   \activecatcodes
5944   \input \tocreadfilename
5945 }
5946
5947 \newskip\contentsrightmargin \contentsrightmargin=1in
5948 \newcount\savepageno
5949 \newcount\lastnegativepageno \lastnegativepageno = -1
5950
5951 % Prepare to read what we've written to \tocfile.
5952 %
5953 \def\startcontents#1{%
5954   % If @setchapternewpage on, and @headings double, the contents should
5955   % start on an odd page, unlike chapters.  Thus, we maintain
5956   % \contentsalignmacro in parallel with \pagealignmacro.
5957   % From: Torbjorn Granlund <tege@matematik.su.se>
5958   \contentsalignmacro
5959   \immediate\closeout\tocfile
5960   %
5961   % Don't need to put `Contents' or `Short Contents' in the headline.
5962   % It is abundantly clear what they are.
5963   \chapmacro{#1}{Yomitfromtoc}{}%
5964   %
5965   \savepageno = \pageno
5966   \begingroup                  % Set up to handle contents files properly.
5967     \raggedbottom              % Worry more about breakpoints than the bottom.
5968     \advance\hsize by -\contentsrightmargin % Don't use the full line length.
5969     %
5970     % Roman numerals for page numbers.
5971     \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi
5972 }
5973
5974 % redefined for the two-volume lispref.  We always output on
5975 % \jobname.toc even if this is redefined.
5976 %
5977 \def\tocreadfilename{\jobname.toc}
5978
5979 % Normal (long) toc.
5980 %
5981 \def\contents{%
5982   \startcontents{\putwordTOC}%
5983     \openin 1 \tocreadfilename\space
5984     \ifeof 1 \else
5985       \readtocfile
5986     \fi
5987     \vfill \eject
5988     \contentsalignmacro % in case @setchapternewpage odd is in effect
5989     \ifeof 1 \else
5990       \pdfmakeoutlines
5991     \fi
5992     \closein 1
5993   \endgroup
5994   \lastnegativepageno = \pageno
5995   \global\pageno = \savepageno
5996 }
5997
5998 % And just the chapters.
5999 \def\summarycontents{%
6000   \startcontents{\putwordShortTOC}%
6001     %
6002     \let\partentry = \shortpartentry
6003     \let\numchapentry = \shortchapentry
6004     \let\appentry = \shortchapentry
6005     \let\unnchapentry = \shortunnchapentry
6006     % We want a true roman here for the page numbers.
6007     \secfonts
6008     \let\rm=\shortcontrm \let\bf=\shortcontbf
6009     \let\sl=\shortcontsl \let\tt=\shortconttt
6010     \rm
6011     \hyphenpenalty = 10000
6012     \advance\baselineskip by 1pt % Open it up a little.
6013     \def\numsecentry##1##2##3##4{}
6014     \let\appsecentry = \numsecentry
6015     \let\unnsecentry = \numsecentry
6016     \let\numsubsecentry = \numsecentry
6017     \let\appsubsecentry = \numsecentry
6018     \let\unnsubsecentry = \numsecentry
6019     \let\numsubsubsecentry = \numsecentry
6020     \let\appsubsubsecentry = \numsecentry
6021     \let\unnsubsubsecentry = \numsecentry
6022     \openin 1 \tocreadfilename\space
6023     \ifeof 1 \else
6024       \readtocfile
6025     \fi
6026     \closein 1
6027     \vfill \eject
6028     \contentsalignmacro % in case @setchapternewpage odd is in effect
6029   \endgroup
6030   \lastnegativepageno = \pageno
6031   \global\pageno = \savepageno
6032 }
6033 \let\shortcontents = \summarycontents
6034
6035 % Typeset the label for a chapter or appendix for the short contents.
6036 % The arg is, e.g., `A' for an appendix, or `3' for a chapter.
6037 %
6038 \def\shortchaplabel#1{%
6039   % This space should be enough, since a single number is .5em, and the
6040   % widest letter (M) is 1em, at least in the Computer Modern fonts.
6041   % But use \hss just in case.
6042   % (This space doesn't include the extra space that gets added after
6043   % the label; that gets put in by \shortchapentry above.)
6044   %
6045   % We'd like to right-justify chapter numbers, but that looks strange
6046   % with appendix letters.  And right-justifying numbers and
6047   % left-justifying letters looks strange when there is less than 10
6048   % chapters.  Have to read the whole toc once to know how many chapters
6049   % there are before deciding ...
6050   \hbox to 1em{#1\hss}%
6051 }
6052
6053 % These macros generate individual entries in the table of contents.
6054 % The first argument is the chapter or section name.
6055 % The last argument is the page number.
6056 % The arguments in between are the chapter number, section number, ...
6057
6058 % Parts, in the main contents.  Replace the part number, which doesn't
6059 % exist, with an empty box.  Let's hope all the numbers have the same width.
6060 % Also ignore the page number, which is conventionally not printed.
6061 \def\numeralbox{\setbox0=\hbox{8}\hbox to \wd0{\hfil}}
6062 \def\partentry#1#2#3#4{\dochapentry{\numeralbox\labelspace#1}{}}
6063 %
6064 % Parts, in the short toc.
6065 \def\shortpartentry#1#2#3#4{%
6066   \penalty-300
6067   \vskip.5\baselineskip plus.15\baselineskip minus.1\baselineskip
6068   \shortchapentry{{\bf #1}}{\numeralbox}{}{}%
6069 }
6070
6071 % Chapters, in the main contents.
6072 \def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}}
6073 %
6074 % Chapters, in the short toc.
6075 % See comments in \dochapentry re vbox and related settings.
6076 \def\shortchapentry#1#2#3#4{%
6077   \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}%
6078 }
6079
6080 % Appendices, in the main contents.
6081 % Need the word Appendix, and a fixed-size box.
6082 %
6083 \def\appendixbox#1{%
6084   % We use M since it's probably the widest letter.
6085   \setbox0 = \hbox{\putwordAppendix{} M}%
6086   \hbox to \wd0{\putwordAppendix{} #1\hss}}
6087 %
6088 \def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}}
6089
6090 % Unnumbered chapters.
6091 \def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}}
6092 \def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}}
6093
6094 % Sections.
6095 \def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}}
6096 \let\appsecentry=\numsecentry
6097 \def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}}
6098
6099 % Subsections.
6100 \def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}}
6101 \let\appsubsecentry=\numsubsecentry
6102 \def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}}
6103
6104 % And subsubsections.
6105 \def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}}
6106 \let\appsubsubsecentry=\numsubsubsecentry
6107 \def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}}
6108
6109 % This parameter controls the indentation of the various levels.
6110 % Same as \defaultparindent.
6111 \newdimen\tocindent \tocindent = 15pt
6112
6113 % Now for the actual typesetting. In all these, #1 is the text and #2 is the
6114 % page number.
6115 %
6116 % If the toc has to be broken over pages, we want it to be at chapters
6117 % if at all possible; hence the \penalty.
6118 \def\dochapentry#1#2{%
6119    \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip
6120    \begingroup
6121      \chapentryfonts
6122      \tocentry{#1}{\dopageno\bgroup#2\egroup}%
6123    \endgroup
6124    \nobreak\vskip .25\baselineskip plus.1\baselineskip
6125 }
6126
6127 \def\dosecentry#1#2{\begingroup
6128   \secentryfonts \leftskip=\tocindent
6129   \tocentry{#1}{\dopageno\bgroup#2\egroup}%
6130 \endgroup}
6131
6132 \def\dosubsecentry#1#2{\begingroup
6133   \subsecentryfonts \leftskip=2\tocindent
6134   \tocentry{#1}{\dopageno\bgroup#2\egroup}%
6135 \endgroup}
6136
6137 \def\dosubsubsecentry#1#2{\begingroup
6138   \subsubsecentryfonts \leftskip=3\tocindent
6139   \tocentry{#1}{\dopageno\bgroup#2\egroup}%
6140 \endgroup}
6141
6142 % We use the same \entry macro as for the index entries.
6143 \let\tocentry = \entry
6144
6145 % Space between chapter (or whatever) number and the title.
6146 \def\labelspace{\hskip1em \relax}
6147
6148 \def\dopageno#1{{\rm #1}}
6149 \def\doshortpageno#1{{\rm #1}}
6150
6151 \def\chapentryfonts{\secfonts \rm}
6152 \def\secentryfonts{\textfonts}
6153 \def\subsecentryfonts{\textfonts}
6154 \def\subsubsecentryfonts{\textfonts}
6155
6156
6157 \message{environments,}
6158 % @foo ... @end foo.
6159
6160 % @tex ... @end tex    escapes into raw TeX temporarily.
6161 % One exception: @ is still an escape character, so that @end tex works.
6162 % But \@ or @@ will get a plain @ character.
6163
6164 \envdef\tex{%
6165   \setupmarkupstyle{tex}%
6166   \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
6167   \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
6168   \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie
6169   \catcode `\%=14
6170   \catcode `\+=\other
6171   \catcode `\"=\other
6172   \catcode `\|=\other
6173   \catcode `\<=\other
6174   \catcode `\>=\other
6175   \catcode`\`=\other
6176   \catcode`\'=\other
6177   \escapechar=`\\
6178   %
6179   % ' is active in math mode (mathcode"8000).  So reset it, and all our
6180   % other math active characters (just in case), to plain's definitions.
6181   \mathactive
6182   %
6183   \let\b=\ptexb
6184   \let\bullet=\ptexbullet
6185   \let\c=\ptexc
6186   \let\,=\ptexcomma
6187   \let\.=\ptexdot
6188   \let\dots=\ptexdots
6189   \let\equiv=\ptexequiv
6190   \let\!=\ptexexclam
6191   \let\i=\ptexi
6192   \let\indent=\ptexindent
6193   \let\noindent=\ptexnoindent
6194   \let\{=\ptexlbrace
6195   \let\+=\tabalign
6196   \let\}=\ptexrbrace
6197   \let\/=\ptexslash
6198   \let\*=\ptexstar
6199   \let\t=\ptext
6200   \expandafter \let\csname top\endcsname=\ptextop  % outer
6201   \let\frenchspacing=\plainfrenchspacing
6202   %
6203   \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
6204   \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
6205   \def\@{@}%
6206 }
6207 % There is no need to define \Etex.
6208
6209 % Define @lisp ... @end lisp.
6210 % @lisp environment forms a group so it can rebind things,
6211 % including the definition of @end lisp (which normally is erroneous).
6212
6213 % Amount to narrow the margins by for @lisp.
6214 \newskip\lispnarrowing \lispnarrowing=0.4in
6215
6216 % This is the definition that ^^M gets inside @lisp, @example, and other
6217 % such environments.  \null is better than a space, since it doesn't
6218 % have any width.
6219 \def\lisppar{\null\endgraf}
6220
6221 % This space is always present above and below environments.
6222 \newskip\envskipamount \envskipamount = 0pt
6223
6224 % Make spacing and below environment symmetrical.  We use \parskip here
6225 % to help in doing that, since in @example-like environments \parskip
6226 % is reset to zero; thus the \afterenvbreak inserts no space -- but the
6227 % start of the next paragraph will insert \parskip.
6228 %
6229 \def\aboveenvbreak{{%
6230   % =10000 instead of <10000 because of a special case in \itemzzz and
6231   % \sectionheading, q.v.
6232   \ifnum \lastpenalty=10000 \else
6233     \advance\envskipamount by \parskip
6234     \endgraf
6235     \ifdim\lastskip<\envskipamount
6236       \removelastskip
6237       % it's not a good place to break if the last penalty was \nobreak
6238       % or better ...
6239       \ifnum\lastpenalty<10000 \penalty-50 \fi
6240       \vskip\envskipamount
6241     \fi
6242   \fi
6243 }}
6244
6245 \let\afterenvbreak = \aboveenvbreak
6246
6247 % \nonarrowing is a flag.  If "set", @lisp etc don't narrow margins; it will
6248 % also clear it, so that its embedded environments do the narrowing again.
6249 \let\nonarrowing=\relax
6250
6251 % @cartouche ... @end cartouche: draw rectangle w/rounded corners around
6252 % environment contents.
6253 \font\circle=lcircle10
6254 \newdimen\circthick
6255 \newdimen\cartouter\newdimen\cartinner
6256 \newskip\normbskip\newskip\normpskip\newskip\normlskip
6257 \circthick=\fontdimen8\circle
6258 %
6259 \def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth
6260 \def\ctr{{\hskip 6pt\circle\char'010}}
6261 \def\cbl{{\circle\char'012\hskip -6pt}}
6262 \def\cbr{{\hskip 6pt\circle\char'011}}
6263 \def\carttop{\hbox to \cartouter{\hskip\lskip
6264         \ctl\leaders\hrule height\circthick\hfil\ctr
6265         \hskip\rskip}}
6266 \def\cartbot{\hbox to \cartouter{\hskip\lskip
6267         \cbl\leaders\hrule height\circthick\hfil\cbr
6268         \hskip\rskip}}
6269 %
6270 \newskip\lskip\newskip\rskip
6271
6272 \envdef\cartouche{%
6273   \ifhmode\par\fi  % can't be in the midst of a paragraph.
6274   \startsavinginserts
6275   \lskip=\leftskip \rskip=\rightskip
6276   \leftskip=0pt\rightskip=0pt % we want these *outside*.
6277   \cartinner=\hsize \advance\cartinner by-\lskip
6278   \advance\cartinner by-\rskip
6279   \cartouter=\hsize
6280   \advance\cartouter by 18.4pt  % allow for 3pt kerns on either
6281                                 % side, and for 6pt waste from
6282                                 % each corner char, and rule thickness
6283   \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
6284   % Flag to tell @lisp, etc., not to narrow margin.
6285   \let\nonarrowing = t%
6286   \vbox\bgroup
6287       \baselineskip=0pt\parskip=0pt\lineskip=0pt
6288       \carttop
6289       \hbox\bgroup
6290           \hskip\lskip
6291           \vrule\kern3pt
6292           \vbox\bgroup
6293               \kern3pt
6294               \hsize=\cartinner
6295               \baselineskip=\normbskip
6296               \lineskip=\normlskip
6297               \parskip=\normpskip
6298               \vskip -\parskip
6299               \comment % For explanation, see the end of \def\group.
6300 }
6301 \def\Ecartouche{%
6302               \ifhmode\par\fi
6303               \kern3pt
6304           \egroup
6305           \kern3pt\vrule
6306           \hskip\rskip
6307       \egroup
6308       \cartbot
6309   \egroup
6310   \checkinserts
6311 }
6312
6313
6314 % This macro is called at the beginning of all the @example variants,
6315 % inside a group.
6316 \newdimen\nonfillparindent
6317 \def\nonfillstart{%
6318   \aboveenvbreak
6319   \hfuzz = 12pt % Don't be fussy
6320   \sepspaces % Make spaces be word-separators rather than space tokens.
6321   \let\par = \lisppar % don't ignore blank lines
6322   \obeylines % each line of input is a line of output
6323   \parskip = 0pt
6324   % Turn off paragraph indentation but redefine \indent to emulate
6325   % the normal \indent.
6326   \nonfillparindent=\parindent
6327   \parindent = 0pt
6328   \let\indent\nonfillindent
6329   %
6330   \emergencystretch = 0pt % don't try to avoid overfull boxes
6331   \ifx\nonarrowing\relax
6332     \advance \leftskip by \lispnarrowing
6333     \exdentamount=\lispnarrowing
6334   \else
6335     \let\nonarrowing = \relax
6336   \fi
6337   \let\exdent=\nofillexdent
6338 }
6339
6340 \begingroup
6341 \obeyspaces
6342 % We want to swallow spaces (but not other tokens) after the fake
6343 % @indent in our nonfill-environments, where spaces are normally
6344 % active and set to @tie, resulting in them not being ignored after
6345 % @indent.
6346 \gdef\nonfillindent{\futurelet\temp\nonfillindentcheck}%
6347 \gdef\nonfillindentcheck{%
6348 \ifx\temp %
6349 \expandafter\nonfillindentgobble%
6350 \else%
6351 \leavevmode\nonfillindentbox%
6352 \fi%
6353 }%
6354 \endgroup
6355 \def\nonfillindentgobble#1{\nonfillindent}
6356 \def\nonfillindentbox{\hbox to \nonfillparindent{\hss}}
6357
6358 % If you want all examples etc. small: @set dispenvsize small.
6359 % If you want even small examples the full size: @set dispenvsize nosmall.
6360 % This affects the following displayed environments:
6361 %    @example, @display, @format, @lisp
6362 %
6363 \def\smallword{small}
6364 \def\nosmallword{nosmall}
6365 \let\SETdispenvsize\relax
6366 \def\setnormaldispenv{%
6367   \ifx\SETdispenvsize\smallword
6368     % end paragraph for sake of leading, in case document has no blank
6369     % line.  This is redundant with what happens in \aboveenvbreak, but
6370     % we need to do it before changing the fonts, and it's inconvenient
6371     % to change the fonts afterward.
6372     \ifnum \lastpenalty=10000 \else \endgraf \fi
6373     \smallexamplefonts \rm
6374   \fi
6375 }
6376 \def\setsmalldispenv{%
6377   \ifx\SETdispenvsize\nosmallword
6378   \else
6379     \ifnum \lastpenalty=10000 \else \endgraf \fi
6380     \smallexamplefonts \rm
6381   \fi
6382 }
6383
6384 % We often define two environments, @foo and @smallfoo.
6385 % Let's do it in one command.  #1 is the env name, #2 the definition.
6386 \def\makedispenvdef#1#2{%
6387   \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}%
6388   \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}%
6389   \expandafter\let\csname E#1\endcsname \afterenvbreak
6390   \expandafter\let\csname Esmall#1\endcsname \afterenvbreak
6391 }
6392
6393 % Define two environment synonyms (#1 and #2) for an environment.
6394 \def\maketwodispenvdef#1#2#3{%
6395   \makedispenvdef{#1}{#3}%
6396   \makedispenvdef{#2}{#3}%
6397 }
6398 %
6399 % @lisp: indented, narrowed, typewriter font;
6400 % @example: same as @lisp.
6401 %
6402 % @smallexample and @smalllisp: use smaller fonts.
6403 % Originally contributed by Pavel@xerox.
6404 %
6405 \maketwodispenvdef{lisp}{example}{%
6406   \nonfillstart
6407   \tt\setupmarkupstyle{example}%
6408   \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
6409   \gobble % eat return
6410 }
6411 % @display/@smalldisplay: same as @lisp except keep current font.
6412 %
6413 \makedispenvdef{display}{%
6414   \nonfillstart
6415   \gobble
6416 }
6417
6418 % @format/@smallformat: same as @display except don't narrow margins.
6419 %
6420 \makedispenvdef{format}{%
6421   \let\nonarrowing = t%
6422   \nonfillstart
6423   \gobble
6424 }
6425
6426 % @flushleft: same as @format, but doesn't obey \SETdispenvsize.
6427 \envdef\flushleft{%
6428   \let\nonarrowing = t%
6429   \nonfillstart
6430   \gobble
6431 }
6432 \let\Eflushleft = \afterenvbreak
6433
6434 % @flushright.
6435 %
6436 \envdef\flushright{%
6437   \let\nonarrowing = t%
6438   \nonfillstart
6439   \advance\leftskip by 0pt plus 1fill\relax
6440   \gobble
6441 }
6442 \let\Eflushright = \afterenvbreak
6443
6444
6445 % @raggedright does more-or-less normal line breaking but no right
6446 % justification.  From plain.tex.
6447 \envdef\raggedright{%
6448   \rightskip0pt plus2em \spaceskip.3333em \xspaceskip.5em\relax
6449 }
6450 \let\Eraggedright\par
6451
6452 \envdef\raggedleft{%
6453   \parindent=0pt \leftskip0pt plus2em
6454   \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt
6455   \hbadness=10000 % Last line will usually be underfull, so turn off
6456                   % badness reporting.
6457 }
6458 \let\Eraggedleft\par
6459
6460 \envdef\raggedcenter{%
6461   \parindent=0pt \rightskip0pt plus1em \leftskip0pt plus1em
6462   \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt
6463   \hbadness=10000 % Last line will usually be underfull, so turn off
6464                   % badness reporting.
6465 }
6466 \let\Eraggedcenter\par
6467
6468
6469 % @quotation does normal linebreaking (hence we can't use \nonfillstart)
6470 % and narrows the margins.  We keep \parskip nonzero in general, since
6471 % we're doing normal filling.  So, when using \aboveenvbreak and
6472 % \afterenvbreak, temporarily make \parskip 0.
6473 %
6474 \makedispenvdef{quotation}{\quotationstart}
6475 %
6476 \def\quotationstart{%
6477   {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
6478   \parindent=0pt
6479   %
6480   % @cartouche defines \nonarrowing to inhibit narrowing at next level down.
6481   \ifx\nonarrowing\relax
6482     \advance\leftskip by \lispnarrowing
6483     \advance\rightskip by \lispnarrowing
6484     \exdentamount = \lispnarrowing
6485   \else
6486     \let\nonarrowing = \relax
6487   \fi
6488   \parsearg\quotationlabel
6489 }
6490
6491 % We have retained a nonzero parskip for the environment, since we're
6492 % doing normal filling.
6493 %
6494 \def\Equotation{%
6495   \par
6496   \ifx\quotationauthor\thisisundefined\else
6497     % indent a bit.
6498     \leftline{\kern 2\leftskip \sl ---\quotationauthor}%
6499   \fi
6500   {\parskip=0pt \afterenvbreak}%
6501 }
6502 \def\Esmallquotation{\Equotation}
6503
6504 % If we're given an argument, typeset it in bold with a colon after.
6505 \def\quotationlabel#1{%
6506   \def\temp{#1}%
6507   \ifx\temp\empty \else
6508     {\bf #1: }%
6509   \fi
6510 }
6511
6512
6513 % LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>}
6514 % If we want to allow any <char> as delimiter,
6515 % we need the curly braces so that makeinfo sees the @verb command, eg:
6516 % `@verbx...x' would look like the '@verbx' command.  --janneke@gnu.org
6517 %
6518 % [Knuth]: Donald Ervin Knuth, 1996.  The TeXbook.
6519 %
6520 % [Knuth] p.344; only we need to do the other characters Texinfo sets
6521 % active too.  Otherwise, they get lost as the first character on a
6522 % verbatim line.
6523 \def\dospecials{%
6524   \do\ \do\\\do\{\do\}\do\$\do\&%
6525   \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~%
6526   \do\<\do\>\do\|\do\@\do+\do\"%
6527   % Don't do the quotes -- if we do, @set txicodequoteundirected and
6528   % @set txicodequotebacktick will not have effect on @verb and
6529   % @verbatim, and ?` and !` ligatures won't get disabled.
6530   %\do\`\do\'%
6531 }
6532 %
6533 % [Knuth] p. 380
6534 \def\uncatcodespecials{%
6535   \def\do##1{\catcode`##1=\other}\dospecials}
6536 %
6537 % Setup for the @verb command.
6538 %
6539 % Eight spaces for a tab
6540 \begingroup
6541   \catcode`\^^I=\active
6542   \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }}
6543 \endgroup
6544 %
6545 \def\setupverb{%
6546   \tt  % easiest (and conventionally used) font for verbatim
6547   \def\par{\leavevmode\endgraf}%
6548   \setupmarkupstyle{verb}%
6549   \tabeightspaces
6550   % Respect line breaks,
6551   % print special symbols as themselves, and
6552   % make each space count
6553   % must do in this order:
6554   \obeylines \uncatcodespecials \sepspaces
6555 }
6556
6557 % Setup for the @verbatim environment
6558 %
6559 % Real tab expansion.
6560 \newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount
6561 %
6562 % We typeset each line of the verbatim in an \hbox, so we can handle
6563 % tabs.  The \global is in case the verbatim line starts with an accent,
6564 % or some other command that starts with a begin-group.  Otherwise, the
6565 % entire \verbbox would disappear at the corresponding end-group, before
6566 % it is typeset.  Meanwhile, we can't have nested verbatim commands
6567 % (can we?), so the \global won't be overwriting itself.
6568 \newbox\verbbox
6569 \def\starttabbox{\global\setbox\verbbox=\hbox\bgroup}
6570 %
6571 \begingroup
6572   \catcode`\^^I=\active
6573   \gdef\tabexpand{%
6574     \catcode`\^^I=\active
6575     \def^^I{\leavevmode\egroup
6576       \dimen\verbbox=\wd\verbbox % the width so far, or since the previous tab
6577       \divide\dimen\verbbox by\tabw
6578       \multiply\dimen\verbbox by\tabw % compute previous multiple of \tabw
6579       \advance\dimen\verbbox by\tabw  % advance to next multiple of \tabw
6580       \wd\verbbox=\dimen\verbbox \box\verbbox \starttabbox
6581     }%
6582   }
6583 \endgroup
6584
6585 % start the verbatim environment.
6586 \def\setupverbatim{%
6587   \let\nonarrowing = t%
6588   \nonfillstart
6589   \tt % easiest (and conventionally used) font for verbatim
6590   % The \leavevmode here is for blank lines.  Otherwise, we would
6591   % never \starttabox and the \egroup would end verbatim mode.
6592   \def\par{\leavevmode\egroup\box\verbbox\endgraf}%
6593   \tabexpand
6594   \setupmarkupstyle{verbatim}%
6595   % Respect line breaks,
6596   % print special symbols as themselves, and
6597   % make each space count.
6598   % Must do in this order:
6599   \obeylines \uncatcodespecials \sepspaces
6600   \everypar{\starttabbox}%
6601 }
6602
6603 % Do the @verb magic: verbatim text is quoted by unique
6604 % delimiter characters.  Before first delimiter expect a
6605 % right brace, after last delimiter expect closing brace:
6606 %
6607 %    \def\doverb'{'<char>#1<char>'}'{#1}
6608 %
6609 % [Knuth] p. 382; only eat outer {}
6610 \begingroup
6611   \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other
6612   \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next]
6613 \endgroup
6614 %
6615 \def\verb{\begingroup\setupverb\doverb}
6616 %
6617 %
6618 % Do the @verbatim magic: define the macro \doverbatim so that
6619 % the (first) argument ends when '@end verbatim' is reached, ie:
6620 %
6621 %     \def\doverbatim#1@end verbatim{#1}
6622 %
6623 % For Texinfo it's a lot easier than for LaTeX,
6624 % because texinfo's \verbatim doesn't stop at '\end{verbatim}':
6625 % we need not redefine '\', '{' and '}'.
6626 %
6627 % Inspired by LaTeX's verbatim command set [latex.ltx]
6628 %
6629 \begingroup
6630   \catcode`\ =\active
6631   \obeylines %
6632   % ignore everything up to the first ^^M, that's the newline at the end
6633   % of the @verbatim input line itself.  Otherwise we get an extra blank
6634   % line in the output.
6635   \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}%
6636   % We really want {...\end verbatim} in the body of the macro, but
6637   % without the active space; thus we have to use \xdef and \gobble.
6638 \endgroup
6639 %
6640 \envdef\verbatim{%
6641     \setupverbatim\doverbatim
6642 }
6643 \let\Everbatim = \afterenvbreak
6644
6645
6646 % @verbatiminclude FILE - insert text of file in verbatim environment.
6647 %
6648 \def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude}
6649 %
6650 \def\doverbatiminclude#1{%
6651   {%
6652     \makevalueexpandable
6653     \setupverbatim
6654     \indexnofonts       % Allow `@@' and other weird things in file names.
6655     \wlog{texinfo.tex: doing @verbatiminclude of #1^^J}%
6656     \input #1
6657     \afterenvbreak
6658   }%
6659 }
6660
6661 % @copying ... @end copying.
6662 % Save the text away for @insertcopying later.
6663 %
6664 % We save the uninterpreted tokens, rather than creating a box.
6665 % Saving the text in a box would be much easier, but then all the
6666 % typesetting commands (@smallbook, font changes, etc.) have to be done
6667 % beforehand -- and a) we want @copying to be done first in the source
6668 % file; b) letting users define the frontmatter in as flexible order as
6669 % possible is very desirable.
6670 %
6671 \def\copying{\checkenv{}\begingroup\scanargctxt\docopying}
6672 \def\docopying#1@end copying{\endgroup\def\copyingtext{#1}}
6673 %
6674 \def\insertcopying{%
6675   \begingroup
6676     \parindent = 0pt  % paragraph indentation looks wrong on title page
6677     \scanexp\copyingtext
6678   \endgroup
6679 }
6680
6681
6682 \message{defuns,}
6683 % @defun etc.
6684
6685 \newskip\defbodyindent \defbodyindent=.4in
6686 \newskip\defargsindent \defargsindent=50pt
6687 \newskip\deflastargmargin \deflastargmargin=18pt
6688 \newcount\defunpenalty
6689
6690 % Start the processing of @deffn:
6691 \def\startdefun{%
6692   \ifnum\lastpenalty<10000
6693     \medbreak
6694     \defunpenalty=10003 % Will keep this @deffn together with the
6695                         % following @def command, see below.
6696   \else
6697     % If there are two @def commands in a row, we'll have a \nobreak,
6698     % which is there to keep the function description together with its
6699     % header.  But if there's nothing but headers, we need to allow a
6700     % break somewhere.  Check specifically for penalty 10002, inserted
6701     % by \printdefunline, instead of 10000, since the sectioning
6702     % commands also insert a nobreak penalty, and we don't want to allow
6703     % a break between a section heading and a defun.
6704     %
6705     % As a minor refinement, we avoid "club" headers by signalling
6706     % with penalty of 10003 after the very first @deffn in the
6707     % sequence (see above), and penalty of 10002 after any following
6708     % @def command.
6709     \ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \fi
6710     %
6711     % Similarly, after a section heading, do not allow a break.
6712     % But do insert the glue.
6713     \medskip  % preceded by discardable penalty, so not a breakpoint
6714   \fi
6715   %
6716   \parindent=0in
6717   \advance\leftskip by \defbodyindent
6718   \exdentamount=\defbodyindent
6719 }
6720
6721 \def\dodefunx#1{%
6722   % First, check whether we are in the right environment:
6723   \checkenv#1%
6724   %
6725   % As above, allow line break if we have multiple x headers in a row.
6726   % It's not a great place, though.
6727   \ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi
6728   %
6729   % And now, it's time to reuse the body of the original defun:
6730   \expandafter\gobbledefun#1%
6731 }
6732 \def\gobbledefun#1\startdefun{}
6733
6734 % \printdefunline \deffnheader{text}
6735 %
6736 \def\printdefunline#1#2{%
6737   \begingroup
6738     % call \deffnheader:
6739     #1#2 \endheader
6740     % common ending:
6741     \interlinepenalty = 10000
6742     \advance\rightskip by 0pt plus 1fil\relax
6743     \endgraf
6744     \nobreak\vskip -\parskip
6745     \penalty\defunpenalty  % signal to \startdefun and \dodefunx
6746     % Some of the @defun-type tags do not enable magic parentheses,
6747     % rendering the following check redundant.  But we don't optimize.
6748     \checkparencounts
6749   \endgroup
6750 }
6751
6752 \def\Edefun{\endgraf\medbreak}
6753
6754 % \makedefun{deffn} creates \deffn, \deffnx and \Edeffn;
6755 % the only thing remaining is to define \deffnheader.
6756 %
6757 \def\makedefun#1{%
6758   \expandafter\let\csname E#1\endcsname = \Edefun
6759   \edef\temp{\noexpand\domakedefun
6760     \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}%
6761   \temp
6762 }
6763
6764 % \domakedefun \deffn \deffnx \deffnheader
6765 %
6766 % Define \deffn and \deffnx, without parameters.
6767 % \deffnheader has to be defined explicitly.
6768 %
6769 \def\domakedefun#1#2#3{%
6770   \envdef#1{%
6771     \startdefun
6772     \parseargusing\activeparens{\printdefunline#3}%
6773   }%
6774   \def#2{\dodefunx#1}%
6775   \def#3%
6776 }
6777
6778 %%% Untyped functions:
6779
6780 % @deffn category name args
6781 \makedefun{deffn}{\deffngeneral{}}
6782
6783 % @deffn category class name args
6784 \makedefun{defop}#1 {\defopon{#1\ \putwordon}}
6785
6786 % \defopon {category on}class name args
6787 \def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
6788
6789 % \deffngeneral {subind}category name args
6790 %
6791 \def\deffngeneral#1#2 #3 #4\endheader{%
6792   % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}.
6793   \dosubind{fn}{\code{#3}}{#1}%
6794   \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}%
6795 }
6796
6797 %%% Typed functions:
6798
6799 % @deftypefn category type name args
6800 \makedefun{deftypefn}{\deftypefngeneral{}}
6801
6802 % @deftypeop category class type name args
6803 \makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}}
6804
6805 % \deftypeopon {category on}class type name args
6806 \def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
6807
6808 % \deftypefngeneral {subind}category type name args
6809 %
6810 \def\deftypefngeneral#1#2 #3 #4 #5\endheader{%
6811   \dosubind{fn}{\code{#4}}{#1}%
6812   \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
6813 }
6814
6815 %%% Typed variables:
6816
6817 % @deftypevr category type var args
6818 \makedefun{deftypevr}{\deftypecvgeneral{}}
6819
6820 % @deftypecv category class type var args
6821 \makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}}
6822
6823 % \deftypecvof {category of}class type var args
6824 \def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} }
6825
6826 % \deftypecvgeneral {subind}category type var args
6827 %
6828 \def\deftypecvgeneral#1#2 #3 #4 #5\endheader{%
6829   \dosubind{vr}{\code{#4}}{#1}%
6830   \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
6831 }
6832
6833 %%% Untyped variables:
6834
6835 % @defvr category var args
6836 \makedefun{defvr}#1 {\deftypevrheader{#1} {} }
6837
6838 % @defcv category class var args
6839 \makedefun{defcv}#1 {\defcvof{#1\ \putwordof}}
6840
6841 % \defcvof {category of}class var args
6842 \def\defcvof#1#2 {\deftypecvof{#1}#2 {} }
6843
6844 %%% Type:
6845 % @deftp category name args
6846 \makedefun{deftp}#1 #2 #3\endheader{%
6847   \doind{tp}{\code{#2}}%
6848   \defname{#1}{}{#2}\defunargs{#3\unskip}%
6849 }
6850
6851 % Remaining @defun-like shortcuts:
6852 \makedefun{defun}{\deffnheader{\putwordDeffunc} }
6853 \makedefun{defmac}{\deffnheader{\putwordDefmac} }
6854 \makedefun{defspec}{\deffnheader{\putwordDefspec} }
6855 \makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} }
6856 \makedefun{defvar}{\defvrheader{\putwordDefvar} }
6857 \makedefun{defopt}{\defvrheader{\putwordDefopt} }
6858 \makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} }
6859 \makedefun{defmethod}{\defopon\putwordMethodon}
6860 \makedefun{deftypemethod}{\deftypeopon\putwordMethodon}
6861 \makedefun{defivar}{\defcvof\putwordInstanceVariableof}
6862 \makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof}
6863
6864 % \defname, which formats the name of the @def (not the args).
6865 % #1 is the category, such as "Function".
6866 % #2 is the return type, if any.
6867 % #3 is the function name.
6868 %
6869 % We are followed by (but not passed) the arguments, if any.
6870 %
6871 \def\defname#1#2#3{%
6872   % Get the values of \leftskip and \rightskip as they were outside the @def...
6873   \advance\leftskip by -\defbodyindent
6874   %
6875   % How we'll format the type name.  Putting it in brackets helps
6876   % distinguish it from the body text that may end up on the next line
6877   % just below it.
6878   \def\temp{#1}%
6879   \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi}
6880   %
6881   % Figure out line sizes for the paragraph shape.
6882   % The first line needs space for \box0; but if \rightskip is nonzero,
6883   % we need only space for the part of \box0 which exceeds it:
6884   \dimen0=\hsize  \advance\dimen0 by -\wd0  \advance\dimen0 by \rightskip
6885   % The continuations:
6886   \dimen2=\hsize  \advance\dimen2 by -\defargsindent
6887   % (plain.tex says that \dimen1 should be used only as global.)
6888   \parshape 2 0in \dimen0 \defargsindent \dimen2
6889   %
6890   % Put the type name to the right margin.
6891   \noindent
6892   \hbox to 0pt{%
6893     \hfil\box0 \kern-\hsize
6894     % \hsize has to be shortened this way:
6895     \kern\leftskip
6896     % Intentionally do not respect \rightskip, since we need the space.
6897   }%
6898   %
6899   % Allow all lines to be underfull without complaint:
6900   \tolerance=10000 \hbadness=10000
6901   \exdentamount=\defbodyindent
6902   {%
6903     % defun fonts. We use typewriter by default (used to be bold) because:
6904     % . we're printing identifiers, they should be in tt in principle.
6905     % . in languages with many accents, such as Czech or French, it's
6906     %   common to leave accents off identifiers.  The result looks ok in
6907     %   tt, but exceedingly strange in rm.
6908     % . we don't want -- and --- to be treated as ligatures.
6909     % . this still does not fix the ?` and !` ligatures, but so far no
6910     %   one has made identifiers using them :).
6911     \df \tt
6912     \def\temp{#2}% return value type
6913     \ifx\temp\empty\else \tclose{\temp} \fi
6914     #3% output function name
6915   }%
6916   {\rm\enskip}% hskip 0.5 em of \tenrm
6917   %
6918   \boldbrax
6919   % arguments will be output next, if any.
6920 }
6921
6922 % Print arguments in slanted roman (not ttsl), inconsistently with using
6923 % tt for the name.  This is because literal text is sometimes needed in
6924 % the argument list (groff manual), and ttsl and tt are not very
6925 % distinguishable.  Prevent hyphenation at `-' chars.
6926 %
6927 \def\defunargs#1{%
6928   % use sl by default (not ttsl),
6929   % tt for the names.
6930   \df \sl \hyphenchar\font=0
6931   %
6932   % On the other hand, if an argument has two dashes (for instance), we
6933   % want a way to get ttsl.  Let's try @var for that.
6934   \def\var##1{{\setupmarkupstyle{var}\ttslanted{##1}}}%
6935   #1%
6936   \sl\hyphenchar\font=45
6937 }
6938
6939 % We want ()&[] to print specially on the defun line.
6940 %
6941 \def\activeparens{%
6942   \catcode`\(=\active \catcode`\)=\active
6943   \catcode`\[=\active \catcode`\]=\active
6944   \catcode`\&=\active
6945 }
6946
6947 % Make control sequences which act like normal parenthesis chars.
6948 \let\lparen = ( \let\rparen = )
6949
6950 % Be sure that we always have a definition for `(', etc.  For example,
6951 % if the fn name has parens in it, \boldbrax will not be in effect yet,
6952 % so TeX would otherwise complain about undefined control sequence.
6953 {
6954   \activeparens
6955   \global\let(=\lparen \global\let)=\rparen
6956   \global\let[=\lbrack \global\let]=\rbrack
6957   \global\let& = \&
6958
6959   \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
6960   \gdef\magicamp{\let&=\amprm}
6961 }
6962
6963 \newcount\parencount
6964
6965 % If we encounter &foo, then turn on ()-hacking afterwards
6966 \newif\ifampseen
6967 \def\amprm#1 {\ampseentrue{\bf\&#1 }}
6968
6969 \def\parenfont{%
6970   \ifampseen
6971     % At the first level, print parens in roman,
6972     % otherwise use the default font.
6973     \ifnum \parencount=1 \rm \fi
6974   \else
6975     % The \sf parens (in \boldbrax) actually are a little bolder than
6976     % the contained text.  This is especially needed for [ and ] .
6977     \sf
6978   \fi
6979 }
6980 \def\infirstlevel#1{%
6981   \ifampseen
6982     \ifnum\parencount=1
6983       #1%
6984     \fi
6985   \fi
6986 }
6987 \def\bfafterword#1 {#1 \bf}
6988
6989 \def\opnr{%
6990   \global\advance\parencount by 1
6991   {\parenfont(}%
6992   \infirstlevel \bfafterword
6993 }
6994 \def\clnr{%
6995   {\parenfont)}%
6996   \infirstlevel \sl
6997   \global\advance\parencount by -1
6998 }
6999
7000 \newcount\brackcount
7001 \def\lbrb{%
7002   \global\advance\brackcount by 1
7003   {\bf[}%
7004 }
7005 \def\rbrb{%
7006   {\bf]}%
7007   \global\advance\brackcount by -1
7008 }
7009
7010 \def\checkparencounts{%
7011   \ifnum\parencount=0 \else \badparencount \fi
7012   \ifnum\brackcount=0 \else \badbrackcount \fi
7013 }
7014 % these should not use \errmessage; the glibc manual, at least, actually
7015 % has such constructs (when documenting function pointers).
7016 \def\badparencount{%
7017   \message{Warning: unbalanced parentheses in @def...}%
7018   \global\parencount=0
7019 }
7020 \def\badbrackcount{%
7021   \message{Warning: unbalanced square brackets in @def...}%
7022   \global\brackcount=0
7023 }
7024
7025
7026 \message{macros,}
7027 % @macro.
7028
7029 % To do this right we need a feature of e-TeX, \scantokens,
7030 % which we arrange to emulate with a temporary file in ordinary TeX.
7031 \ifx\eTeXversion\thisisundefined
7032   \newwrite\macscribble
7033   \def\scantokens#1{%
7034     \toks0={#1}%
7035     \immediate\openout\macscribble=\jobname.tmp
7036     \immediate\write\macscribble{\the\toks0}%
7037     \immediate\closeout\macscribble
7038     \input \jobname.tmp
7039   }
7040 \fi
7041
7042 \def\scanmacro#1{\begingroup
7043   \newlinechar`\^^M
7044   \let\xeatspaces\eatspaces
7045   %
7046   % Undo catcode changes of \startcontents and \doprintindex
7047   % When called from @insertcopying or (short)caption, we need active
7048   % backslash to get it printed correctly.  Previously, we had
7049   % \catcode`\\=\other instead.  We'll see whether a problem appears
7050   % with macro expansion.                               --kasal, 19aug04
7051   \catcode`\@=0 \catcode`\\=\active \escapechar=`\@
7052   %
7053   % ... and for \example:
7054   \spaceisspace
7055   %
7056   % The \empty here causes a following catcode 5 newline to be eaten
7057   % as part of reading whitespace after a control sequence.  It does
7058   % not eat a catcode 13 newline.  There's no good way to handle the
7059   % two cases.  See the Macro Details node in the manual for the
7060   % workaround we currently have to recommend for macros and
7061   % line-oriented commands.
7062   \scantokens{#1\empty}%
7063 \endgroup}
7064
7065 \def\scanexp#1{%
7066   \edef\temp{\noexpand\scanmacro{#1}}%
7067   \temp
7068 }
7069
7070 \newcount\paramno   % Count of parameters
7071 \newtoks\macname    % Macro name
7072 \newif\ifrecursive  % Is it recursive?
7073
7074 % List of all defined macros in the form
7075 %    \definedummyword\macro1\definedummyword\macro2...
7076 % Currently is also contains all @aliases; the list can be split
7077 % if there is a need.
7078 \def\macrolist{}
7079
7080 % Add the macro to \macrolist
7081 \def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname}
7082 \def\addtomacrolistxxx#1{%
7083      \toks0 = \expandafter{\macrolist\definedummyword#1}%
7084      \xdef\macrolist{\the\toks0}%
7085 }
7086
7087 % Utility routines.
7088 % This does \let #1 = #2, with \csnames; that is,
7089 %   \let \csname#1\endcsname = \csname#2\endcsname
7090 % (except of course we have to play expansion games).
7091 %
7092 \def\cslet#1#2{%
7093   \expandafter\let
7094   \csname#1\expandafter\endcsname
7095   \csname#2\endcsname
7096 }
7097
7098 % Trim leading and trailing spaces off a string.
7099 % Concepts from aro-bend problem 15 (see CTAN).
7100 {\catcode`\@=11
7101 \gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }}
7102 \gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@}
7103 \gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @}
7104 \def\unbrace#1{#1}
7105 \unbrace{\gdef\trim@@@ #1 } #2@{#1}
7106 }
7107
7108 % Trim a single trailing ^^M off a string.
7109 {\catcode`\^^M=\other \catcode`\Q=3%
7110 \gdef\eatcr #1{\eatcra #1Q^^MQ}%
7111 \gdef\eatcra#1^^MQ{\eatcrb#1Q}%
7112 \gdef\eatcrb#1Q#2Q{#1}%
7113 }
7114
7115 % Macro bodies are absorbed as an argument in a context where
7116 % all characters are catcode 10, 11 or 12, except \ which is active
7117 % (as in normal texinfo). It is necessary to change the definition of \
7118 % to recognize macro arguments; this is the job of \mbodybackslash.
7119 %
7120 % Non-ASCII encodings make 8-bit characters active, so un-activate
7121 % them to avoid their expansion.  Must do this non-globally, to
7122 % confine the change to the current group.
7123 %
7124 % It's necessary to have hard CRs when the macro is executed. This is
7125 % done by making ^^M (\endlinechar) catcode 12 when reading the macro
7126 % body, and then making it the \newlinechar in \scanmacro.
7127 %
7128 \def\scanctxt{% used as subroutine
7129   \catcode`\"=\other
7130   \catcode`\+=\other
7131   \catcode`\<=\other
7132   \catcode`\>=\other
7133   \catcode`\@=\other
7134   \catcode`\^=\other
7135   \catcode`\_=\other
7136   \catcode`\|=\other
7137   \catcode`\~=\other
7138   \ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi
7139 }
7140
7141 \def\scanargctxt{% used for copying and captions, not macros.
7142   \scanctxt
7143   \catcode`\\=\other
7144   \catcode`\^^M=\other
7145 }
7146
7147 \def\macrobodyctxt{% used for @macro definitions
7148   \scanctxt
7149   \catcode`\{=\other
7150   \catcode`\}=\other
7151   \catcode`\^^M=\other
7152   \usembodybackslash
7153 }
7154
7155 \def\macroargctxt{% used when scanning invocations
7156   \scanctxt
7157   \catcode`\\=0
7158 }
7159 % why catcode 0 for \ in the above?  To recognize \\ \{ \} as "escapes"
7160 % for the single characters \ { }.  Thus, we end up with the "commands"
7161 % that would be written @\ @{ @} in a Texinfo document.
7162
7163 % We already have @{ and @}.  For @\, we define it here, and only for
7164 % this purpose, to produce a typewriter backslash (so, the @\ that we
7165 % define for @math can't be used with @macro calls):
7166 %
7167 \def\\{\normalbackslash}%
7168
7169 % We would like to do this for \, too, since that is what makeinfo does.
7170 % But it is not possible, because Texinfo already has a command @, for a
7171 % cedilla accent.  Documents must use @comma{} instead.
7172 %
7173 % \anythingelse will almost certainly be an error of some kind.
7174
7175
7176 % \mbodybackslash is the definition of \ in @macro bodies.
7177 % It maps \foo\ => \csname macarg.foo\endcsname => #N
7178 % where N is the macro parameter number.
7179 % We define \csname macarg.\endcsname to be \realbackslash, so
7180 % \\ in macro replacement text gets you a backslash.
7181 %
7182 {\catcode`@=0 @catcode`@\=@active
7183  @gdef@usembodybackslash{@let\=@mbodybackslash}
7184  @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname}
7185 }
7186 \expandafter\def\csname macarg.\endcsname{\realbackslash}
7187
7188 \def\margbackslash#1{\char`\#1 }
7189
7190 \def\macro{\recursivefalse\parsearg\macroxxx}
7191 \def\rmacro{\recursivetrue\parsearg\macroxxx}
7192
7193 \def\macroxxx#1{%
7194   \getargs{#1}% now \macname is the macname and \argl the arglist
7195   \ifx\argl\empty       % no arguments
7196      \paramno=0
7197   \else
7198      \expandafter\parsemargdef \argl;%
7199   \fi
7200   \if1\csname ismacro.\the\macname\endcsname
7201      \message{Warning: redefining \the\macname}%
7202   \else
7203      \expandafter\ifx\csname \the\macname\endcsname \relax
7204      \else \errmessage{Macro name \the\macname\space already defined}\fi
7205      \global\cslet{macsave.\the\macname}{\the\macname}%
7206      \global\expandafter\let\csname ismacro.\the\macname\endcsname=1%
7207      \addtomacrolist{\the\macname}%
7208   \fi
7209   \begingroup \macrobodyctxt
7210   \ifrecursive \expandafter\parsermacbody
7211   \else \expandafter\parsemacbody
7212   \fi}
7213
7214 \parseargdef\unmacro{%
7215   \if1\csname ismacro.#1\endcsname
7216     \global\cslet{#1}{macsave.#1}%
7217     \global\expandafter\let \csname ismacro.#1\endcsname=0%
7218     % Remove the macro name from \macrolist:
7219     \begingroup
7220       \expandafter\let\csname#1\endcsname \relax
7221       \let\definedummyword\unmacrodo
7222       \xdef\macrolist{\macrolist}%
7223     \endgroup
7224   \else
7225     \errmessage{Macro #1 not defined}%
7226   \fi
7227 }
7228
7229 % Called by \do from \dounmacro on each macro.  The idea is to omit any
7230 % macro definitions that have been changed to \relax.
7231 %
7232 \def\unmacrodo#1{%
7233   \ifx #1\relax
7234     % remove this
7235   \else
7236     \noexpand\definedummyword \noexpand#1%
7237   \fi
7238 }
7239
7240 % This makes use of the obscure feature that if the last token of a
7241 % <parameter list> is #, then the preceding argument is delimited by
7242 % an opening brace, and that opening brace is not consumed.
7243 \def\getargs#1{\getargsxxx#1{}}
7244 \def\getargsxxx#1#{\getmacname #1 \relax\getmacargs}
7245 \def\getmacname#1 #2\relax{\macname={#1}}
7246 \def\getmacargs#1{\def\argl{#1}}
7247
7248 % Parse the optional {params} list.  Set up \paramno and \paramlist
7249 % so \defmacro knows what to do.  Define \macarg.blah for each blah
7250 % in the params list to be ##N where N is the position in that list.
7251 % That gets used by \mbodybackslash (above).
7252 %
7253 % We need to get `macro parameter char #' into several definitions.
7254 % The technique used is stolen from LaTeX: let \hash be something
7255 % unexpandable, insert that wherever you need a #, and then redefine
7256 % it to # just before using the token list produced.
7257 %
7258 % The same technique is used to protect \eatspaces till just before
7259 % the macro is used.
7260
7261 \def\parsemargdef#1;{%
7262   \paramno=0\def\paramlist{}%
7263   \let\hash\relax
7264   \let\xeatspaces\relax
7265   \parsemargdefxxx#1,;,%
7266 }
7267 \def\parsemargdefxxx#1,{%
7268   \if#1;\let\next=\relax
7269   \else \let\next=\parsemargdefxxx
7270     \advance\paramno by 1
7271     \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname
7272         {\xeatspaces{\hash\the\paramno}}%
7273     \edef\paramlist{\paramlist\hash\the\paramno,}%
7274   \fi\next}
7275
7276 % These two commands read recursive and nonrecursive macro bodies.
7277 % (They're different since rec and nonrec macros end differently.)
7278 %
7279 \long\def\parsemacbody#1@end macro%
7280 {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
7281 \long\def\parsermacbody#1@end rmacro%
7282 {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
7283
7284 % This defines the macro itself. There are six cases: recursive and
7285 % nonrecursive macros of zero, one, and many arguments.
7286 % Much magic with \expandafter here.
7287 % \xdef is used so that macro definitions will survive the file
7288 % they're defined in; @include reads the file inside a group.
7289 %
7290 \def\defmacro{%
7291   \let\hash=##% convert placeholders to macro parameter chars
7292   \ifrecursive
7293     \ifcase\paramno
7294     % 0
7295       \expandafter\xdef\csname\the\macname\endcsname{%
7296         \noexpand\scanmacro{\temp}}%
7297     \or % 1
7298       \expandafter\xdef\csname\the\macname\endcsname{%
7299          \bgroup\noexpand\macroargctxt
7300          \noexpand\braceorline
7301          \expandafter\noexpand\csname\the\macname xxx\endcsname}%
7302       \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
7303          \egroup\noexpand\scanmacro{\temp}}%
7304     \else % many
7305       \expandafter\xdef\csname\the\macname\endcsname{%
7306          \bgroup\noexpand\macroargctxt
7307          \noexpand\csname\the\macname xx\endcsname}%
7308       \expandafter\xdef\csname\the\macname xx\endcsname##1{%
7309           \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
7310       \expandafter\expandafter
7311       \expandafter\xdef
7312       \expandafter\expandafter
7313         \csname\the\macname xxx\endcsname
7314           \paramlist{\egroup\noexpand\scanmacro{\temp}}%
7315     \fi
7316   \else
7317     \ifcase\paramno
7318     % 0
7319       \expandafter\xdef\csname\the\macname\endcsname{%
7320         \noexpand\norecurse{\the\macname}%
7321         \noexpand\scanmacro{\temp}\egroup}%
7322     \or % 1
7323       \expandafter\xdef\csname\the\macname\endcsname{%
7324          \bgroup\noexpand\macroargctxt
7325          \noexpand\braceorline
7326          \expandafter\noexpand\csname\the\macname xxx\endcsname}%
7327       \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
7328         \egroup
7329         \noexpand\norecurse{\the\macname}%
7330         \noexpand\scanmacro{\temp}\egroup}%
7331     \else % many
7332       \expandafter\xdef\csname\the\macname\endcsname{%
7333          \bgroup\noexpand\macroargctxt
7334          \expandafter\noexpand\csname\the\macname xx\endcsname}%
7335       \expandafter\xdef\csname\the\macname xx\endcsname##1{%
7336           \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
7337       \expandafter\expandafter
7338       \expandafter\xdef
7339       \expandafter\expandafter
7340       \csname\the\macname xxx\endcsname
7341       \paramlist{%
7342           \egroup
7343           \noexpand\norecurse{\the\macname}%
7344           \noexpand\scanmacro{\temp}\egroup}%
7345     \fi
7346   \fi}
7347
7348 \def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
7349
7350 % \braceorline decides whether the next nonwhitespace character is a
7351 % {.  If so it reads up to the closing }, if not, it reads the whole
7352 % line.  Whatever was read is then fed to the next control sequence
7353 % as an argument (by \parsebrace or \parsearg).
7354
7355 \def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx}
7356 \def\braceorlinexxx{%
7357   \ifx\nchar\bgroup\else
7358     \expandafter\parsearg
7359   \fi \macnamexxx}
7360
7361
7362 % @alias.
7363 % We need some trickery to remove the optional spaces around the equal
7364 % sign.  Make them active and then expand them all to nothing.
7365 %
7366 \def\alias{\parseargusing\obeyspaces\aliasxxx}
7367 \def\aliasxxx #1{\aliasyyy#1\relax}
7368 \def\aliasyyy #1=#2\relax{%
7369   {%
7370     \expandafter\let\obeyedspace=\empty
7371     \addtomacrolist{#1}%
7372     \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}%
7373   }%
7374   \next
7375 }
7376
7377
7378 \message{cross references,}
7379
7380 \newwrite\auxfile
7381 \newif\ifhavexrefs    % True if xref values are known.
7382 \newif\ifwarnedxrefs  % True if we warned once that they aren't known.
7383
7384 % @inforef is relatively simple.
7385 \def\inforef #1{\inforefzzz #1,,,,**}
7386 \def\inforefzzz #1,#2,#3,#4**{%
7387   \putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
7388   node \samp{\ignorespaces#1{}}}
7389
7390 % @node's only job in TeX is to define \lastnode, which is used in
7391 % cross-references.  The @node line might or might not have commas, and
7392 % might or might not have spaces before the first comma, like:
7393 % @node foo , bar , ...
7394 % We don't want such trailing spaces in the node name.
7395 %
7396 \parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse}
7397 %
7398 % also remove a trailing comma, in case of something like this:
7399 % @node Help-Cross,  ,  , Cross-refs
7400 \def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse}
7401 \def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}}
7402
7403 \let\nwnode=\node
7404 \let\lastnode=\empty
7405
7406 % Write a cross-reference definition for the current node.  #1 is the
7407 % type (Ynumbered, Yappendix, Ynothing).
7408 %
7409 \def\donoderef#1{%
7410   \ifx\lastnode\empty\else
7411     \setref{\lastnode}{#1}%
7412     \global\let\lastnode=\empty
7413   \fi
7414 }
7415
7416 % @anchor{NAME} -- define xref target at arbitrary point.
7417 %
7418 \newcount\savesfregister
7419 %
7420 \def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
7421 \def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
7422 \def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}
7423
7424 % \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an
7425 % anchor), which consists of three parts:
7426 % 1) NAME-title - the current sectioning name taken from \lastsection,
7427 %                 or the anchor name.
7428 % 2) NAME-snt   - section number and type, passed as the SNT arg, or
7429 %                 empty for anchors.
7430 % 3) NAME-pg    - the page number.
7431 %
7432 % This is called from \donoderef, \anchor, and \dofloat.  In the case of
7433 % floats, there is an additional part, which is not written here:
7434 % 4) NAME-lof   - the text as it should appear in a @listoffloats.
7435 %
7436 \def\setref#1#2{%
7437   \pdfmkdest{#1}%
7438   \iflinks
7439     {%
7440       \atdummies  % preserve commands, but don't expand them
7441       \edef\writexrdef##1##2{%
7442         \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef
7443           ##1}{##2}}% these are parameters of \writexrdef
7444       }%
7445       \toks0 = \expandafter{\lastsection}%
7446       \immediate \writexrdef{title}{\the\toks0 }%
7447       \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc.
7448       \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, at \shipout
7449     }%
7450   \fi
7451 }
7452
7453 % @xrefautosectiontitle on|off says whether @section(ing) names are used
7454 % automatically in xrefs, if the third arg is not explicitly specified.
7455 % This was provided as a "secret" @set xref-automatic-section-title
7456 % variable, now it's official.
7457
7458 \parseargdef\xrefautomaticsectiontitle{%
7459   \def\temp{#1}%
7460   \ifx\temp\onword
7461     \expandafter\let\csname SETxref-automatic-section-title\endcsname
7462       = \empty
7463   \else\ifx\temp\offword
7464     \expandafter\let\csname SETxref-automatic-section-title\endcsname
7465       = \relax
7466   \else
7467     \errhelp = \EMsimple
7468     \errmessage{Unknown @xrefautomaticsectiontitle value `\temp',
7469                 must be on|off}%
7470   \fi\fi
7471 }
7472
7473
7474 % @xref, @pxref, and @ref generate cross-references.  For \xrefX, #1 is
7475 % the node name, #2 the name of the Info cross-reference, #3 the printed
7476 % node name, #4 the name of the Info file, #5 the name of the printed
7477 % manual.  All but the node name can be omitted.
7478 %
7479 \def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]}
7480 \def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]}
7481 \def\ref#1{\xrefX[#1,,,,,,,]}
7482 \def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
7483   \unsepspaces
7484   \def\printedmanual{\ignorespaces #5}%
7485   \def\printedrefname{\ignorespaces #3}%
7486   \setbox1=\hbox{\printedmanual\unskip}%
7487   \setbox0=\hbox{\printedrefname\unskip}%
7488   \ifdim \wd0 = 0pt
7489     % No printed node name was explicitly given.
7490     \expandafter\ifx\csname SETxref-automatic-section-title\endcsname \relax
7491       % Use the node name inside the square brackets.
7492       \def\printedrefname{\ignorespaces #1}%
7493     \else
7494       % Use the actual chapter/section title appear inside
7495       % the square brackets.  Use the real section title if we have it.
7496       \ifdim \wd1 > 0pt
7497         % It is in another manual, so we don't have it.
7498         \def\printedrefname{\ignorespaces #1}%
7499       \else
7500         \ifhavexrefs
7501           % We know the real title if we have the xref values.
7502           \def\printedrefname{\refx{#1-title}{}}%
7503         \else
7504           % Otherwise just copy the Info node name.
7505           \def\printedrefname{\ignorespaces #1}%
7506         \fi%
7507       \fi
7508     \fi
7509   \fi
7510   %
7511   % Make link in pdf output.
7512   \ifpdf
7513     {\indexnofonts
7514      \turnoffactive
7515      % This expands tokens, so do it after making catcode changes, so _
7516      % etc. don't get their TeX definitions.
7517      \getfilename{#4}%
7518      %
7519      % See comments at \activebackslashdouble.
7520      {\activebackslashdouble \xdef\pdfxrefdest{#1}%
7521       \backslashparens\pdfxrefdest}%
7522      %
7523      \leavevmode
7524      \startlink attr{/Border [0 0 0]}%
7525      \ifnum\filenamelength>0
7526        goto file{\the\filename.pdf} name{\pdfxrefdest}%
7527      \else
7528        goto name{\pdfmkpgn{\pdfxrefdest}}%
7529      \fi
7530     }%
7531     \setcolor{\linkcolor}%
7532   \fi
7533   %
7534   % Float references are printed completely differently: "Figure 1.2"
7535   % instead of "[somenode], p.3".  We distinguish them by the
7536   % LABEL-title being set to a magic string.
7537   {%
7538     % Have to otherify everything special to allow the \csname to
7539     % include an _ in the xref name, etc.
7540     \indexnofonts
7541     \turnoffactive
7542     \expandafter\global\expandafter\let\expandafter\Xthisreftitle
7543       \csname XR#1-title\endcsname
7544   }%
7545   \iffloat\Xthisreftitle
7546     % If the user specified the print name (third arg) to the ref,
7547     % print it instead of our usual "Figure 1.2".
7548     \ifdim\wd0 = 0pt
7549       \refx{#1-snt}{}%
7550     \else
7551       \printedrefname
7552     \fi
7553     %
7554     % if the user also gave the printed manual name (fifth arg), append
7555     % "in MANUALNAME".
7556     \ifdim \wd1 > 0pt
7557       \space \putwordin{} \cite{\printedmanual}%
7558     \fi
7559   \else
7560     % node/anchor (non-float) references.
7561     %
7562     % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not
7563     % insert empty discretionaries after hyphens, which means that it will
7564     % not find a line break at a hyphen in a node names.  Since some manuals
7565     % are best written with fairly long node names, containing hyphens, this
7566     % is a loss.  Therefore, we give the text of the node name again, so it
7567     % is as if TeX is seeing it for the first time.
7568     \ifdim \wd1 > 0pt
7569       \putwordSection{} ``\printedrefname'' \putwordin{} \cite{\printedmanual}%
7570     \else
7571       % _ (for example) has to be the character _ for the purposes of the
7572       % control sequence corresponding to the node, but it has to expand
7573       % into the usual \leavevmode...\vrule stuff for purposes of
7574       % printing. So we \turnoffactive for the \refx-snt, back on for the
7575       % printing, back off for the \refx-pg.
7576       {\turnoffactive
7577        % Only output a following space if the -snt ref is nonempty; for
7578        % @unnumbered and @anchor, it won't be.
7579        \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
7580        \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
7581       }%
7582       % output the `[mynode]' via a macro so it can be overridden.
7583       \xrefprintnodename\printedrefname
7584       %
7585       % But we always want a comma and a space:
7586       ,\space
7587       %
7588       % output the `page 3'.
7589       \turnoffactive \putwordpage\tie\refx{#1-pg}{}%
7590     \fi
7591   \fi
7592   \endlink
7593 \endgroup}
7594
7595 % This macro is called from \xrefX for the `[nodename]' part of xref
7596 % output.  It's a separate macro only so it can be changed more easily,
7597 % since square brackets don't work well in some documents.  Particularly
7598 % one that Bob is working on :).
7599 %
7600 \def\xrefprintnodename#1{[#1]}
7601
7602 % Things referred to by \setref.
7603 %
7604 \def\Ynothing{}
7605 \def\Yomitfromtoc{}
7606 \def\Ynumbered{%
7607   \ifnum\secno=0
7608     \putwordChapter@tie \the\chapno
7609   \else \ifnum\subsecno=0
7610     \putwordSection@tie \the\chapno.\the\secno
7611   \else \ifnum\subsubsecno=0
7612     \putwordSection@tie \the\chapno.\the\secno.\the\subsecno
7613   \else
7614     \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno
7615   \fi\fi\fi
7616 }
7617 \def\Yappendix{%
7618   \ifnum\secno=0
7619      \putwordAppendix@tie @char\the\appendixno{}%
7620   \else \ifnum\subsecno=0
7621      \putwordSection@tie @char\the\appendixno.\the\secno
7622   \else \ifnum\subsubsecno=0
7623     \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno
7624   \else
7625     \putwordSection@tie
7626       @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno
7627   \fi\fi\fi
7628 }
7629
7630 % Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME.
7631 % If its value is nonempty, SUFFIX is output afterward.
7632 %
7633 \def\refx#1#2{%
7634   {%
7635     \indexnofonts
7636     \otherbackslash
7637     \expandafter\global\expandafter\let\expandafter\thisrefX
7638       \csname XR#1\endcsname
7639   }%
7640   \ifx\thisrefX\relax
7641     % If not defined, say something at least.
7642     \angleleft un\-de\-fined\angleright
7643     \iflinks
7644       \ifhavexrefs
7645         {\toks0 = {#1}% avoid expansion of possibly-complex value
7646          \message{\linenumber Undefined cross reference `\the\toks0'.}}%
7647       \else
7648         \ifwarnedxrefs\else
7649           \global\warnedxrefstrue
7650           \message{Cross reference values unknown; you must run TeX again.}%
7651         \fi
7652       \fi
7653     \fi
7654   \else
7655     % It's defined, so just use it.
7656     \thisrefX
7657   \fi
7658   #2% Output the suffix in any case.
7659 }
7660
7661 % This is the macro invoked by entries in the aux file.  Usually it's
7662 % just a \def (we prepend XR to the control sequence name to avoid
7663 % collisions).  But if this is a float type, we have more work to do.
7664 %
7665 \def\xrdef#1#2{%
7666   {% The node name might contain 8-bit characters, which in our current
7667    % implementation are changed to commands like @'e.  Don't let these
7668    % mess up the control sequence name.
7669     \indexnofonts
7670     \turnoffactive
7671     \xdef\safexrefname{#1}%
7672   }%
7673   %
7674   \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% remember this xref
7675   %
7676   % Was that xref control sequence that we just defined for a float?
7677   \expandafter\iffloat\csname XR\safexrefname\endcsname
7678     % it was a float, and we have the (safe) float type in \iffloattype.
7679     \expandafter\let\expandafter\floatlist
7680       \csname floatlist\iffloattype\endcsname
7681     %
7682     % Is this the first time we've seen this float type?
7683     \expandafter\ifx\floatlist\relax
7684       \toks0 = {\do}% yes, so just \do
7685     \else
7686       % had it before, so preserve previous elements in list.
7687       \toks0 = \expandafter{\floatlist\do}%
7688     \fi
7689     %
7690     % Remember this xref in the control sequence \floatlistFLOATTYPE,
7691     % for later use in \listoffloats.
7692     \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0
7693       {\safexrefname}}%
7694   \fi
7695 }
7696
7697 % Read the last existing aux file, if any.  No error if none exists.
7698 %
7699 \def\tryauxfile{%
7700   \openin 1 \jobname.aux
7701   \ifeof 1 \else
7702     \readdatafile{aux}%
7703     \global\havexrefstrue
7704   \fi
7705   \closein 1
7706 }
7707
7708 \def\setupdatafile{%
7709   \catcode`\^^@=\other
7710   \catcode`\^^A=\other
7711   \catcode`\^^B=\other
7712   \catcode`\^^C=\other
7713   \catcode`\^^D=\other
7714   \catcode`\^^E=\other
7715   \catcode`\^^F=\other
7716   \catcode`\^^G=\other
7717   \catcode`\^^H=\other
7718   \catcode`\^^K=\other
7719   \catcode`\^^L=\other
7720   \catcode`\^^N=\other
7721   \catcode`\^^P=\other
7722   \catcode`\^^Q=\other
7723   \catcode`\^^R=\other
7724   \catcode`\^^S=\other
7725   \catcode`\^^T=\other
7726   \catcode`\^^U=\other
7727   \catcode`\^^V=\other
7728   \catcode`\^^W=\other
7729   \catcode`\^^X=\other
7730   \catcode`\^^Z=\other
7731   \catcode`\^^[=\other
7732   \catcode`\^^\=\other
7733   \catcode`\^^]=\other
7734   \catcode`\^^^=\other
7735   \catcode`\^^_=\other
7736   % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc.
7737   % in xref tags, i.e., node names.  But since ^^e4 notation isn't
7738   % supported in the main text, it doesn't seem desirable.  Furthermore,
7739   % that is not enough: for node names that actually contain a ^
7740   % character, we would end up writing a line like this: 'xrdef {'hat
7741   % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first
7742   % argument, and \hat is not an expandable control sequence.  It could
7743   % all be worked out, but why?  Either we support ^^ or we don't.
7744   %
7745   % The other change necessary for this was to define \auxhat:
7746   % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter
7747   % and then to call \auxhat in \setq.
7748   %
7749   \catcode`\^=\other
7750   %
7751   % Special characters.  Should be turned off anyway, but...
7752   \catcode`\~=\other
7753   \catcode`\[=\other
7754   \catcode`\]=\other
7755   \catcode`\"=\other
7756   \catcode`\_=\other
7757   \catcode`\|=\other
7758   \catcode`\<=\other
7759   \catcode`\>=\other
7760   \catcode`\$=\other
7761   \catcode`\#=\other
7762   \catcode`\&=\other
7763   \catcode`\%=\other
7764   \catcode`+=\other % avoid \+ for paranoia even though we've turned it off
7765   %
7766   % This is to support \ in node names and titles, since the \
7767   % characters end up in a \csname.  It's easier than
7768   % leaving it active and making its active definition an actual \
7769   % character.  What I don't understand is why it works in the *value*
7770   % of the xrdef.  Seems like it should be a catcode12 \, and that
7771   % should not typeset properly.  But it works, so I'm moving on for
7772   % now.  --karl, 15jan04.
7773   \catcode`\\=\other
7774   %
7775   % Make the characters 128-255 be printing characters.
7776   {%
7777     \count1=128
7778     \def\loop{%
7779       \catcode\count1=\other
7780       \advance\count1 by 1
7781       \ifnum \count1<256 \loop \fi
7782     }%
7783   }%
7784   %
7785   % @ is our escape character in .aux files, and we need braces.
7786   \catcode`\{=1
7787   \catcode`\}=2
7788   \catcode`\@=0
7789 }
7790
7791 \def\readdatafile#1{%
7792 \begingroup
7793   \setupdatafile
7794   \input\jobname.#1
7795 \endgroup}
7796
7797
7798 \message{insertions,}
7799 % including footnotes.
7800
7801 \newcount \footnoteno
7802
7803 % The trailing space in the following definition for supereject is
7804 % vital for proper filling; pages come out unaligned when you do a
7805 % pagealignmacro call if that space before the closing brace is
7806 % removed. (Generally, numeric constants should always be followed by a
7807 % space to prevent strange expansion errors.)
7808 \def\supereject{\par\penalty -20000\footnoteno =0 }
7809
7810 % @footnotestyle is meaningful for info output only.
7811 \let\footnotestyle=\comment
7812
7813 {\catcode `\@=11
7814 %
7815 % Auto-number footnotes.  Otherwise like plain.
7816 \gdef\footnote{%
7817   \let\indent=\ptexindent
7818   \let\noindent=\ptexnoindent
7819   \global\advance\footnoteno by \@ne
7820   \edef\thisfootno{$^{\the\footnoteno}$}%
7821   %
7822   % In case the footnote comes at the end of a sentence, preserve the
7823   % extra spacing after we do the footnote number.
7824   \let\@sf\empty
7825   \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi
7826   %
7827   % Remove inadvertent blank space before typesetting the footnote number.
7828   \unskip
7829   \thisfootno\@sf
7830   \dofootnote
7831 }%
7832
7833 % Don't bother with the trickery in plain.tex to not require the
7834 % footnote text as a parameter.  Our footnotes don't need to be so general.
7835 %
7836 % Oh yes, they do; otherwise, @ifset (and anything else that uses
7837 % \parseargline) fails inside footnotes because the tokens are fixed when
7838 % the footnote is read.  --karl, 16nov96.
7839 %
7840 \gdef\dofootnote{%
7841   \insert\footins\bgroup
7842   % We want to typeset this text as a normal paragraph, even if the
7843   % footnote reference occurs in (for example) a display environment.
7844   % So reset some parameters.
7845   \hsize=\pagewidth
7846   \interlinepenalty\interfootnotelinepenalty
7847   \splittopskip\ht\strutbox % top baseline for broken footnotes
7848   \splitmaxdepth\dp\strutbox
7849   \floatingpenalty\@MM
7850   \leftskip\z@skip
7851   \rightskip\z@skip
7852   \spaceskip\z@skip
7853   \xspaceskip\z@skip
7854   \parindent\defaultparindent
7855   %
7856   \smallfonts \rm
7857   %
7858   % Because we use hanging indentation in footnotes, a @noindent appears
7859   % to exdent this text, so make it be a no-op.  makeinfo does not use
7860   % hanging indentation so @noindent can still be needed within footnote
7861   % text after an @example or the like (not that this is good style).
7862   \let\noindent = \relax
7863   %
7864   % Hang the footnote text off the number.  Use \everypar in case the
7865   % footnote extends for more than one paragraph.
7866   \everypar = {\hang}%
7867   \textindent{\thisfootno}%
7868   %
7869   % Don't crash into the line above the footnote text.  Since this
7870   % expands into a box, it must come within the paragraph, lest it
7871   % provide a place where TeX can split the footnote.
7872   \footstrut
7873   \futurelet\next\fo@t
7874 }
7875 }%end \catcode `\@=11
7876
7877 % In case a @footnote appears in a vbox, save the footnote text and create
7878 % the real \insert just after the vbox finished.  Otherwise, the insertion
7879 % would be lost.
7880 % Similarly, if a @footnote appears inside an alignment, save the footnote
7881 % text to a box and make the \insert when a row of the table is finished.
7882 % And the same can be done for other insert classes.  --kasal, 16nov03.
7883
7884 % Replace the \insert primitive by a cheating macro.
7885 % Deeper inside, just make sure that the saved insertions are not spilled
7886 % out prematurely.
7887 %
7888 \def\startsavinginserts{%
7889   \ifx \insert\ptexinsert
7890     \let\insert\saveinsert
7891   \else
7892     \let\checkinserts\relax
7893   \fi
7894 }
7895
7896 % This \insert replacement works for both \insert\footins{foo} and
7897 % \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}.
7898 %
7899 \def\saveinsert#1{%
7900   \edef\next{\noexpand\savetobox \makeSAVEname#1}%
7901   \afterassignment\next
7902   % swallow the left brace
7903   \let\temp =
7904 }
7905 \def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}}
7906 \def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1}
7907
7908 \def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi}
7909
7910 \def\placesaveins#1{%
7911   \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname
7912     {\box#1}%
7913 }
7914
7915 % eat @SAVE -- beware, all of them have catcode \other:
7916 {
7917   \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials  %  ;-)
7918   \gdef\gobblesave @SAVE{}
7919 }
7920
7921 % initialization:
7922 \def\newsaveins #1{%
7923   \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}%
7924   \next
7925 }
7926 \def\newsaveinsX #1{%
7927   \csname newbox\endcsname #1%
7928   \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts
7929     \checksaveins #1}%
7930 }
7931
7932 % initialize:
7933 \let\checkinserts\empty
7934 \newsaveins\footins
7935 \newsaveins\margin
7936
7937
7938 % @image.  We use the macros from epsf.tex to support this.
7939 % If epsf.tex is not installed and @image is used, we complain.
7940 %
7941 % Check for and read epsf.tex up front.  If we read it only at @image
7942 % time, we might be inside a group, and then its definitions would get
7943 % undone and the next image would fail.
7944 \openin 1 = epsf.tex
7945 \ifeof 1 \else
7946   % Do not bother showing banner with epsf.tex v2.7k (available in
7947   % doc/epsf.tex and on ctan).
7948   \def\epsfannounce{\toks0 = }%
7949   \input epsf.tex
7950 \fi
7951 \closein 1
7952 %
7953 % We will only complain once about lack of epsf.tex.
7954 \newif\ifwarnednoepsf
7955 \newhelp\noepsfhelp{epsf.tex must be installed for images to
7956   work.  It is also included in the Texinfo distribution, or you can get
7957   it from ftp://tug.org/tex/epsf.tex.}
7958 %
7959 \def\image#1{%
7960   \ifx\epsfbox\thisiundefined
7961     \ifwarnednoepsf \else
7962       \errhelp = \noepsfhelp
7963       \errmessage{epsf.tex not found, images will be ignored}%
7964       \global\warnednoepsftrue
7965     \fi
7966   \else
7967     \imagexxx #1,,,,,\finish
7968   \fi
7969 }
7970 %
7971 % Arguments to @image:
7972 % #1 is (mandatory) image filename; we tack on .eps extension.
7973 % #2 is (optional) width, #3 is (optional) height.
7974 % #4 is (ignored optional) html alt text.
7975 % #5 is (ignored optional) extension.
7976 % #6 is just the usual extra ignored arg for parsing stuff.
7977 \newif\ifimagevmode
7978 \def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup
7979   \catcode`\^^M = 5     % in case we're inside an example
7980   \normalturnoffactive  % allow _ et al. in names
7981   % If the image is by itself, center it.
7982   \ifvmode
7983     \imagevmodetrue
7984     \nobreak\medskip
7985     % Usually we'll have text after the image which will insert
7986     % \parskip glue, so insert it here too to equalize the space
7987     % above and below.
7988     \nobreak\vskip\parskip
7989     \nobreak
7990   \fi
7991   %
7992   % Leave vertical mode so that indentation from an enclosing
7993   % environment such as @quotation is respected.  On the other hand, if
7994   % it's at the top level, we don't want the normal paragraph indentation.
7995   \noindent
7996   %
7997   % Output the image.
7998   \ifpdf
7999     \dopdfimage{#1}{#2}{#3}%
8000   \else
8001     % \epsfbox itself resets \epsf?size at each figure.
8002     \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi
8003     \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi
8004     \epsfbox{#1.eps}%
8005   \fi
8006   %
8007   \ifimagevmode \medskip \fi  % space after the standalone image
8008 \endgroup}
8009
8010
8011 % @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables,
8012 % etc.  We don't actually implement floating yet, we always include the
8013 % float "here".  But it seemed the best name for the future.
8014 %
8015 \envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish}
8016
8017 % There may be a space before second and/or third parameter; delete it.
8018 \def\eatcommaspace#1, {#1,}
8019
8020 % #1 is the optional FLOATTYPE, the text label for this float, typically
8021 % "Figure", "Table", "Example", etc.  Can't contain commas.  If omitted,
8022 % this float will not be numbered and cannot be referred to.
8023 %
8024 % #2 is the optional xref label.  Also must be present for the float to
8025 % be referable.
8026 %
8027 % #3 is the optional positioning argument; for now, it is ignored.  It
8028 % will somehow specify the positions allowed to float to (here, top, bottom).
8029 %
8030 % We keep a separate counter for each FLOATTYPE, which we reset at each
8031 % chapter-level command.
8032 \let\resetallfloatnos=\empty
8033 %
8034 \def\dofloat#1,#2,#3,#4\finish{%
8035   \let\thiscaption=\empty
8036   \let\thisshortcaption=\empty
8037   %
8038   % don't lose footnotes inside @float.
8039   %
8040   % BEWARE: when the floats start float, we have to issue warning whenever an
8041   % insert appears inside a float which could possibly float. --kasal, 26may04
8042   %
8043   \startsavinginserts
8044   %
8045   % We can't be used inside a paragraph.
8046   \par
8047   %
8048   \vtop\bgroup
8049     \def\floattype{#1}%
8050     \def\floatlabel{#2}%
8051     \def\floatloc{#3}% we do nothing with this yet.
8052     %
8053     \ifx\floattype\empty
8054       \let\safefloattype=\empty
8055     \else
8056       {%
8057         % the floattype might have accents or other special characters,
8058         % but we need to use it in a control sequence name.
8059         \indexnofonts
8060         \turnoffactive
8061         \xdef\safefloattype{\floattype}%
8062       }%
8063     \fi
8064     %
8065     % If label is given but no type, we handle that as the empty type.
8066     \ifx\floatlabel\empty \else
8067       % We want each FLOATTYPE to be numbered separately (Figure 1,
8068       % Table 1, Figure 2, ...).  (And if no label, no number.)
8069       %
8070       \expandafter\getfloatno\csname\safefloattype floatno\endcsname
8071       \global\advance\floatno by 1
8072       %
8073       {%
8074         % This magic value for \lastsection is output by \setref as the
8075         % XREFLABEL-title value.  \xrefX uses it to distinguish float
8076         % labels (which have a completely different output format) from
8077         % node and anchor labels.  And \xrdef uses it to construct the
8078         % lists of floats.
8079         %
8080         \edef\lastsection{\floatmagic=\safefloattype}%
8081         \setref{\floatlabel}{Yfloat}%
8082       }%
8083     \fi
8084     %
8085     % start with \parskip glue, I guess.
8086     \vskip\parskip
8087     %
8088     % Don't suppress indentation if a float happens to start a section.
8089     \restorefirstparagraphindent
8090 }
8091
8092 % we have these possibilities:
8093 % @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap
8094 % @float Foo,lbl & no caption:    Foo 1.1
8095 % @float Foo & @caption{Cap}:     Foo: Cap
8096 % @float Foo & no caption:        Foo
8097 % @float ,lbl & Caption{Cap}:     1.1: Cap
8098 % @float ,lbl & no caption:       1.1
8099 % @float & @caption{Cap}:         Cap
8100 % @float & no caption:
8101 %
8102 \def\Efloat{%
8103     \let\floatident = \empty
8104     %
8105     % In all cases, if we have a float type, it comes first.
8106     \ifx\floattype\empty \else \def\floatident{\floattype}\fi
8107     %
8108     % If we have an xref label, the number comes next.
8109     \ifx\floatlabel\empty \else
8110       \ifx\floattype\empty \else % if also had float type, need tie first.
8111         \appendtomacro\floatident{\tie}%
8112       \fi
8113       % the number.
8114       \appendtomacro\floatident{\chaplevelprefix\the\floatno}%
8115     \fi
8116     %
8117     % Start the printed caption with what we've constructed in
8118     % \floatident, but keep it separate; we need \floatident again.
8119     \let\captionline = \floatident
8120     %
8121     \ifx\thiscaption\empty \else
8122       \ifx\floatident\empty \else
8123         \appendtomacro\captionline{: }% had ident, so need a colon between
8124       \fi
8125       %
8126       % caption text.
8127       \appendtomacro\captionline{\scanexp\thiscaption}%
8128     \fi
8129     %
8130     % If we have anything to print, print it, with space before.
8131     % Eventually this needs to become an \insert.
8132     \ifx\captionline\empty \else
8133       \vskip.5\parskip
8134       \captionline
8135       %
8136       % Space below caption.
8137       \vskip\parskip
8138     \fi
8139     %
8140     % If have an xref label, write the list of floats info.  Do this
8141     % after the caption, to avoid chance of it being a breakpoint.
8142     \ifx\floatlabel\empty \else
8143       % Write the text that goes in the lof to the aux file as
8144       % \floatlabel-lof.  Besides \floatident, we include the short
8145       % caption if specified, else the full caption if specified, else nothing.
8146       {%
8147         \atdummies
8148         %
8149         % since we read the caption text in the macro world, where ^^M
8150         % is turned into a normal character, we have to scan it back, so
8151         % we don't write the literal three characters "^^M" into the aux file.
8152         \scanexp{%
8153           \xdef\noexpand\gtemp{%
8154             \ifx\thisshortcaption\empty
8155               \thiscaption
8156             \else
8157               \thisshortcaption
8158             \fi
8159           }%
8160         }%
8161         \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident
8162           \ifx\gtemp\empty \else : \gtemp \fi}}%
8163       }%
8164     \fi
8165   \egroup  % end of \vtop
8166   %
8167   % place the captured inserts
8168   %
8169   % BEWARE: when the floats start floating, we have to issue warning
8170   % whenever an insert appears inside a float which could possibly
8171   % float. --kasal, 26may04
8172   %
8173   \checkinserts
8174 }
8175
8176 % Append the tokens #2 to the definition of macro #1, not expanding either.
8177 %
8178 \def\appendtomacro#1#2{%
8179   \expandafter\def\expandafter#1\expandafter{#1#2}%
8180 }
8181
8182 % @caption, @shortcaption
8183 %
8184 \def\caption{\docaption\thiscaption}
8185 \def\shortcaption{\docaption\thisshortcaption}
8186 \def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption}
8187 \def\defcaption#1#2{\egroup \def#1{#2}}
8188
8189 % The parameter is the control sequence identifying the counter we are
8190 % going to use.  Create it if it doesn't exist and assign it to \floatno.
8191 \def\getfloatno#1{%
8192   \ifx#1\relax
8193       % Haven't seen this figure type before.
8194       \csname newcount\endcsname #1%
8195       %
8196       % Remember to reset this floatno at the next chap.
8197       \expandafter\gdef\expandafter\resetallfloatnos
8198         \expandafter{\resetallfloatnos #1=0 }%
8199   \fi
8200   \let\floatno#1%
8201 }
8202
8203 % \setref calls this to get the XREFLABEL-snt value.  We want an @xref
8204 % to the FLOATLABEL to expand to "Figure 3.1".  We call \setref when we
8205 % first read the @float command.
8206 %
8207 \def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}%
8208
8209 % Magic string used for the XREFLABEL-title value, so \xrefX can
8210 % distinguish floats from other xref types.
8211 \def\floatmagic{!!float!!}
8212
8213 % #1 is the control sequence we are passed; we expand into a conditional
8214 % which is true if #1 represents a float ref.  That is, the magic
8215 % \lastsection value which we \setref above.
8216 %
8217 \def\iffloat#1{\expandafter\doiffloat#1==\finish}
8218 %
8219 % #1 is (maybe) the \floatmagic string.  If so, #2 will be the
8220 % (safe) float type for this float.  We set \iffloattype to #2.
8221 %
8222 \def\doiffloat#1=#2=#3\finish{%
8223   \def\temp{#1}%
8224   \def\iffloattype{#2}%
8225   \ifx\temp\floatmagic
8226 }
8227
8228 % @listoffloats FLOATTYPE - print a list of floats like a table of contents.
8229 %
8230 \parseargdef\listoffloats{%
8231   \def\floattype{#1}% floattype
8232   {%
8233     % the floattype might have accents or other special characters,
8234     % but we need to use it in a control sequence name.
8235     \indexnofonts
8236     \turnoffactive
8237     \xdef\safefloattype{\floattype}%
8238   }%
8239   %
8240   % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE.
8241   \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax
8242     \ifhavexrefs
8243       % if the user said @listoffloats foo but never @float foo.
8244       \message{\linenumber No `\safefloattype' floats to list.}%
8245     \fi
8246   \else
8247     \begingroup
8248       \leftskip=\tocindent  % indent these entries like a toc
8249       \let\do=\listoffloatsdo
8250       \csname floatlist\safefloattype\endcsname
8251     \endgroup
8252   \fi
8253 }
8254
8255 % This is called on each entry in a list of floats.  We're passed the
8256 % xref label, in the form LABEL-title, which is how we save it in the
8257 % aux file.  We strip off the -title and look up \XRLABEL-lof, which
8258 % has the text we're supposed to typeset here.
8259 %
8260 % Figures without xref labels will not be included in the list (since
8261 % they won't appear in the aux file).
8262 %
8263 \def\listoffloatsdo#1{\listoffloatsdoentry#1\finish}
8264 \def\listoffloatsdoentry#1-title\finish{{%
8265   % Can't fully expand XR#1-lof because it can contain anything.  Just
8266   % pass the control sequence.  On the other hand, XR#1-pg is just the
8267   % page number, and we want to fully expand that so we can get a link
8268   % in pdf output.
8269   \toksA = \expandafter{\csname XR#1-lof\endcsname}%
8270   %
8271   % use the same \entry macro we use to generate the TOC and index.
8272   \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}%
8273   \writeentry
8274 }}
8275
8276
8277 \message{localization,}
8278
8279 % For single-language documents, @documentlanguage is usually given very
8280 % early, just after @documentencoding.  Single argument is the language
8281 % (de) or locale (de_DE) abbreviation.
8282 %
8283 {
8284   \catcode`\_ = \active
8285   \globaldefs=1
8286 \parseargdef\documentlanguage{\begingroup
8287   \let_=\normalunderscore  % normal _ character for filenames
8288   \tex % read txi-??.tex file in plain TeX.
8289     % Read the file by the name they passed if it exists.
8290     \openin 1 txi-#1.tex
8291     \ifeof 1
8292       \documentlanguagetrywithoutunderscore{#1_\finish}%
8293     \else
8294       \globaldefs = 1  % everything in the txi-LL files needs to persist
8295       \input txi-#1.tex
8296     \fi
8297     \closein 1
8298   \endgroup % end raw TeX
8299 \endgroup}
8300 %
8301 % If they passed de_DE, and txi-de_DE.tex doesn't exist,
8302 % try txi-de.tex.
8303 %
8304 \gdef\documentlanguagetrywithoutunderscore#1_#2\finish{%
8305   \openin 1 txi-#1.tex
8306   \ifeof 1
8307     \errhelp = \nolanghelp
8308     \errmessage{Cannot read language file txi-#1.tex}%
8309   \else
8310     \globaldefs = 1  % everything in the txi-LL files needs to persist
8311     \input txi-#1.tex
8312   \fi
8313   \closein 1
8314 }
8315 }% end of special _ catcode
8316 %
8317 \newhelp\nolanghelp{The given language definition file cannot be found or
8318 is empty.  Maybe you need to install it?  Putting it in the current
8319 directory should work if nowhere else does.}
8320
8321 % This macro is called from txi-??.tex files; the first argument is the
8322 % \language name to set (without the "\lang@" prefix), the second and
8323 % third args are \{left,right}hyphenmin.
8324 %
8325 % The language names to pass are determined when the format is built.
8326 % See the etex.log file created at that time, e.g.,
8327 % /usr/local/texlive/2008/texmf-var/web2c/pdftex/etex.log.
8328 %
8329 % With TeX Live 2008, etex now includes hyphenation patterns for all
8330 % available languages.  This means we can support hyphenation in
8331 % Texinfo, at least to some extent.  (This still doesn't solve the
8332 % accented characters problem.)
8333 %
8334 \catcode`@=11
8335 \def\txisetlanguage#1#2#3{%
8336   % do not set the language if the name is undefined in the current TeX.
8337   \expandafter\ifx\csname lang@#1\endcsname \relax
8338     \message{no patterns for #1}%
8339   \else
8340     \global\language = \csname lang@#1\endcsname
8341   \fi
8342   % but there is no harm in adjusting the hyphenmin values regardless.
8343   \global\lefthyphenmin = #2\relax
8344   \global\righthyphenmin = #3\relax
8345 }
8346
8347 % Helpers for encodings.
8348 % Set the catcode of characters 128 through 255 to the specified number.
8349 %
8350 \def\setnonasciicharscatcode#1{%
8351    \count255=128
8352    \loop\ifnum\count255<256
8353       \global\catcode\count255=#1\relax
8354       \advance\count255 by 1
8355    \repeat
8356 }
8357
8358 \def\setnonasciicharscatcodenonglobal#1{%
8359    \count255=128
8360    \loop\ifnum\count255<256
8361       \catcode\count255=#1\relax
8362       \advance\count255 by 1
8363    \repeat
8364 }
8365
8366 % @documentencoding sets the definition of non-ASCII characters
8367 % according to the specified encoding.
8368 %
8369 \parseargdef\documentencoding{%
8370   % Encoding being declared for the document.
8371   \def\declaredencoding{\csname #1.enc\endcsname}%
8372   %
8373   % Supported encodings: names converted to tokens in order to be able
8374   % to compare them with \ifx.
8375   \def\ascii{\csname US-ASCII.enc\endcsname}%
8376   \def\latnine{\csname ISO-8859-15.enc\endcsname}%
8377   \def\latone{\csname ISO-8859-1.enc\endcsname}%
8378   \def\lattwo{\csname ISO-8859-2.enc\endcsname}%
8379   \def\utfeight{\csname UTF-8.enc\endcsname}%
8380   %
8381   \ifx \declaredencoding \ascii
8382      \asciichardefs
8383   %
8384   \else \ifx \declaredencoding \lattwo
8385      \setnonasciicharscatcode\active
8386      \lattwochardefs
8387   %
8388   \else \ifx \declaredencoding \latone
8389      \setnonasciicharscatcode\active
8390      \latonechardefs
8391   %
8392   \else \ifx \declaredencoding \latnine
8393      \setnonasciicharscatcode\active
8394      \latninechardefs
8395   %
8396   \else \ifx \declaredencoding \utfeight
8397      \setnonasciicharscatcode\active
8398      \utfeightchardefs
8399   %
8400   \else
8401     \message{Unknown document encoding #1, ignoring.}%
8402   %
8403   \fi % utfeight
8404   \fi % latnine
8405   \fi % latone
8406   \fi % lattwo
8407   \fi % ascii
8408 }
8409
8410 % A message to be logged when using a character that isn't available
8411 % the default font encoding (OT1).
8412 %
8413 \def\missingcharmsg#1{\message{Character missing in OT1 encoding: #1.}}
8414
8415 % Take account of \c (plain) vs. \, (Texinfo) difference.
8416 \def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi}
8417
8418 % First, make active non-ASCII characters in order for them to be
8419 % correctly categorized when TeX reads the replacement text of
8420 % macros containing the character definitions.
8421 \setnonasciicharscatcode\active
8422 %
8423 % Latin1 (ISO-8859-1) character definitions.
8424 \def\latonechardefs{%
8425   \gdef^^a0{~}
8426   \gdef^^a1{\exclamdown}
8427   \gdef^^a2{\missingcharmsg{CENT SIGN}}
8428   \gdef^^a3{{\pounds}}
8429   \gdef^^a4{\missingcharmsg{CURRENCY SIGN}}
8430   \gdef^^a5{\missingcharmsg{YEN SIGN}}
8431   \gdef^^a6{\missingcharmsg{BROKEN BAR}}
8432   \gdef^^a7{\S}
8433   \gdef^^a8{\"{}}
8434   \gdef^^a9{\copyright}
8435   \gdef^^aa{\ordf}
8436   \gdef^^ab{\guillemetleft}
8437   \gdef^^ac{$\lnot$}
8438   \gdef^^ad{\-}
8439   \gdef^^ae{\registeredsymbol}
8440   \gdef^^af{\={}}
8441   %
8442   \gdef^^b0{\textdegree}
8443   \gdef^^b1{$\pm$}
8444   \gdef^^b2{$^2$}
8445   \gdef^^b3{$^3$}
8446   \gdef^^b4{\'{}}
8447   \gdef^^b5{$\mu$}
8448   \gdef^^b6{\P}
8449   %
8450   \gdef^^b7{$^.$}
8451   \gdef^^b8{\cedilla\ }
8452   \gdef^^b9{$^1$}
8453   \gdef^^ba{\ordm}
8454   %
8455   \gdef^^bb{\guillemetright}
8456   \gdef^^bc{$1\over4$}
8457   \gdef^^bd{$1\over2$}
8458   \gdef^^be{$3\over4$}
8459   \gdef^^bf{\questiondown}
8460   %
8461   \gdef^^c0{\`A}
8462   \gdef^^c1{\'A}
8463   \gdef^^c2{\^A}
8464   \gdef^^c3{\~A}
8465   \gdef^^c4{\"A}
8466   \gdef^^c5{\ringaccent A}
8467   \gdef^^c6{\AE}
8468   \gdef^^c7{\cedilla C}
8469   \gdef^^c8{\`E}
8470   \gdef^^c9{\'E}
8471   \gdef^^ca{\^E}
8472   \gdef^^cb{\"E}
8473   \gdef^^cc{\`I}
8474   \gdef^^cd{\'I}
8475   \gdef^^ce{\^I}
8476   \gdef^^cf{\"I}
8477   %
8478   \gdef^^d0{\DH}
8479   \gdef^^d1{\~N}
8480   \gdef^^d2{\`O}
8481   \gdef^^d3{\'O}
8482   \gdef^^d4{\^O}
8483   \gdef^^d5{\~O}
8484   \gdef^^d6{\"O}
8485   \gdef^^d7{$\times$}
8486   \gdef^^d8{\O}
8487   \gdef^^d9{\`U}
8488   \gdef^^da{\'U}
8489   \gdef^^db{\^U}
8490   \gdef^^dc{\"U}
8491   \gdef^^dd{\'Y}
8492   \gdef^^de{\TH}
8493   \gdef^^df{\ss}
8494   %
8495   \gdef^^e0{\`a}
8496   \gdef^^e1{\'a}
8497   \gdef^^e2{\^a}
8498   \gdef^^e3{\~a}
8499   \gdef^^e4{\"a}
8500   \gdef^^e5{\ringaccent a}
8501   \gdef^^e6{\ae}
8502   \gdef^^e7{\cedilla c}
8503   \gdef^^e8{\`e}
8504   \gdef^^e9{\'e}
8505   \gdef^^ea{\^e}
8506   \gdef^^eb{\"e}
8507   \gdef^^ec{\`{\dotless i}}
8508   \gdef^^ed{\'{\dotless i}}
8509   \gdef^^ee{\^{\dotless i}}
8510   \gdef^^ef{\"{\dotless i}}
8511   %
8512   \gdef^^f0{\dh}
8513   \gdef^^f1{\~n}
8514   \gdef^^f2{\`o}
8515   \gdef^^f3{\'o}
8516   \gdef^^f4{\^o}
8517   \gdef^^f5{\~o}
8518   \gdef^^f6{\"o}
8519   \gdef^^f7{$\div$}
8520   \gdef^^f8{\o}
8521   \gdef^^f9{\`u}
8522   \gdef^^fa{\'u}
8523   \gdef^^fb{\^u}
8524   \gdef^^fc{\"u}
8525   \gdef^^fd{\'y}
8526   \gdef^^fe{\th}
8527   \gdef^^ff{\"y}
8528 }
8529
8530 % Latin9 (ISO-8859-15) encoding character definitions.
8531 \def\latninechardefs{%
8532   % Encoding is almost identical to Latin1.
8533   \latonechardefs
8534   %
8535   \gdef^^a4{\euro}
8536   \gdef^^a6{\v S}
8537   \gdef^^a8{\v s}
8538   \gdef^^b4{\v Z}
8539   \gdef^^b8{\v z}
8540   \gdef^^bc{\OE}
8541   \gdef^^bd{\oe}
8542   \gdef^^be{\"Y}
8543 }
8544
8545 % Latin2 (ISO-8859-2) character definitions.
8546 \def\lattwochardefs{%
8547   \gdef^^a0{~}
8548   \gdef^^a1{\ogonek{A}}
8549   \gdef^^a2{\u{}}
8550   \gdef^^a3{\L}
8551   \gdef^^a4{\missingcharmsg{CURRENCY SIGN}}
8552   \gdef^^a5{\v L}
8553   \gdef^^a6{\'S}
8554   \gdef^^a7{\S}
8555   \gdef^^a8{\"{}}
8556   \gdef^^a9{\v S}
8557   \gdef^^aa{\cedilla S}
8558   \gdef^^ab{\v T}
8559   \gdef^^ac{\'Z}
8560   \gdef^^ad{\-}
8561   \gdef^^ae{\v Z}
8562   \gdef^^af{\dotaccent Z}
8563   %
8564   \gdef^^b0{\textdegree}
8565   \gdef^^b1{\ogonek{a}}
8566   \gdef^^b2{\ogonek{ }}
8567   \gdef^^b3{\l}
8568   \gdef^^b4{\'{}}
8569   \gdef^^b5{\v l}
8570   \gdef^^b6{\'s}
8571   \gdef^^b7{\v{}}
8572   \gdef^^b8{\cedilla\ }
8573   \gdef^^b9{\v s}
8574   \gdef^^ba{\cedilla s}
8575   \gdef^^bb{\v t}
8576   \gdef^^bc{\'z}
8577   \gdef^^bd{\H{}}
8578   \gdef^^be{\v z}
8579   \gdef^^bf{\dotaccent z}
8580   %
8581   \gdef^^c0{\'R}
8582   \gdef^^c1{\'A}
8583   \gdef^^c2{\^A}
8584   \gdef^^c3{\u A}
8585   \gdef^^c4{\"A}
8586   \gdef^^c5{\'L}
8587   \gdef^^c6{\'C}
8588   \gdef^^c7{\cedilla C}
8589   \gdef^^c8{\v C}
8590   \gdef^^c9{\'E}
8591   \gdef^^ca{\ogonek{E}}
8592   \gdef^^cb{\"E}
8593   \gdef^^cc{\v E}
8594   \gdef^^cd{\'I}
8595   \gdef^^ce{\^I}
8596   \gdef^^cf{\v D}
8597   %
8598   \gdef^^d0{\DH}
8599   \gdef^^d1{\'N}
8600   \gdef^^d2{\v N}
8601   \gdef^^d3{\'O}
8602   \gdef^^d4{\^O}
8603   \gdef^^d5{\H O}
8604   \gdef^^d6{\"O}
8605   \gdef^^d7{$\times$}
8606   \gdef^^d8{\v R}
8607   \gdef^^d9{\ringaccent U}
8608   \gdef^^da{\'U}
8609   \gdef^^db{\H U}
8610   \gdef^^dc{\"U}
8611   \gdef^^dd{\'Y}
8612   \gdef^^de{\cedilla T}
8613   \gdef^^df{\ss}
8614   %
8615   \gdef^^e0{\'r}
8616   \gdef^^e1{\'a}
8617   \gdef^^e2{\^a}
8618   \gdef^^e3{\u a}
8619   \gdef^^e4{\"a}
8620   \gdef^^e5{\'l}
8621   \gdef^^e6{\'c}
8622   \gdef^^e7{\cedilla c}
8623   \gdef^^e8{\v c}
8624   \gdef^^e9{\'e}
8625   \gdef^^ea{\ogonek{e}}
8626   \gdef^^eb{\"e}
8627   \gdef^^ec{\v e}
8628   \gdef^^ed{\'{\dotless{i}}}
8629   \gdef^^ee{\^{\dotless{i}}}
8630   \gdef^^ef{\v d}
8631   %
8632   \gdef^^f0{\dh}
8633   \gdef^^f1{\'n}
8634   \gdef^^f2{\v n}
8635   \gdef^^f3{\'o}
8636   \gdef^^f4{\^o}
8637   \gdef^^f5{\H o}
8638   \gdef^^f6{\"o}
8639   \gdef^^f7{$\div$}
8640   \gdef^^f8{\v r}
8641   \gdef^^f9{\ringaccent u}
8642   \gdef^^fa{\'u}
8643   \gdef^^fb{\H u}
8644   \gdef^^fc{\"u}
8645   \gdef^^fd{\'y}
8646   \gdef^^fe{\cedilla t}
8647   \gdef^^ff{\dotaccent{}}
8648 }
8649
8650 % UTF-8 character definitions.
8651 %
8652 % This code to support UTF-8 is based on LaTeX's utf8.def, with some
8653 % changes for Texinfo conventions.  It is included here under the GPL by
8654 % permission from Frank Mittelbach and the LaTeX team.
8655 %
8656 \newcount\countUTFx
8657 \newcount\countUTFy
8658 \newcount\countUTFz
8659
8660 \gdef\UTFviiiTwoOctets#1#2{\expandafter
8661    \UTFviiiDefined\csname u8:#1\string #2\endcsname}
8662 %
8663 \gdef\UTFviiiThreeOctets#1#2#3{\expandafter
8664    \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname}
8665 %
8666 \gdef\UTFviiiFourOctets#1#2#3#4{\expandafter
8667    \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname}
8668
8669 \gdef\UTFviiiDefined#1{%
8670   \ifx #1\relax
8671     \message{\linenumber Unicode char \string #1 not defined for Texinfo}%
8672   \else
8673     \expandafter #1%
8674   \fi
8675 }
8676
8677 \begingroup
8678   \catcode`\~13
8679   \catcode`\"12
8680
8681   \def\UTFviiiLoop{%
8682     \global\catcode\countUTFx\active
8683     \uccode`\~\countUTFx
8684     \uppercase\expandafter{\UTFviiiTmp}%
8685     \advance\countUTFx by 1
8686     \ifnum\countUTFx < \countUTFy
8687       \expandafter\UTFviiiLoop
8688     \fi}
8689
8690   \countUTFx = "C2
8691   \countUTFy = "E0
8692   \def\UTFviiiTmp{%
8693     \xdef~{\noexpand\UTFviiiTwoOctets\string~}}
8694   \UTFviiiLoop
8695
8696   \countUTFx = "E0
8697   \countUTFy = "F0
8698   \def\UTFviiiTmp{%
8699     \xdef~{\noexpand\UTFviiiThreeOctets\string~}}
8700   \UTFviiiLoop
8701
8702   \countUTFx = "F0
8703   \countUTFy = "F4
8704   \def\UTFviiiTmp{%
8705     \xdef~{\noexpand\UTFviiiFourOctets\string~}}
8706   \UTFviiiLoop
8707 \endgroup
8708
8709 \begingroup
8710   \catcode`\"=12
8711   \catcode`\<=12
8712   \catcode`\.=12
8713   \catcode`\,=12
8714   \catcode`\;=12
8715   \catcode`\!=12
8716   \catcode`\~=13
8717
8718   \gdef\DeclareUnicodeCharacter#1#2{%
8719     \countUTFz = "#1\relax
8720     %\wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}%
8721     \begingroup
8722       \parseXMLCharref
8723       \def\UTFviiiTwoOctets##1##2{%
8724         \csname u8:##1\string ##2\endcsname}%
8725       \def\UTFviiiThreeOctets##1##2##3{%
8726         \csname u8:##1\string ##2\string ##3\endcsname}%
8727       \def\UTFviiiFourOctets##1##2##3##4{%
8728         \csname u8:##1\string ##2\string ##3\string ##4\endcsname}%
8729       \expandafter\expandafter\expandafter\expandafter
8730        \expandafter\expandafter\expandafter
8731        \gdef\UTFviiiTmp{#2}%
8732     \endgroup}
8733
8734   \gdef\parseXMLCharref{%
8735     \ifnum\countUTFz < "A0\relax
8736       \errhelp = \EMsimple
8737       \errmessage{Cannot define Unicode char value < 00A0}%
8738     \else\ifnum\countUTFz < "800\relax
8739       \parseUTFviiiA,%
8740       \parseUTFviiiB C\UTFviiiTwoOctets.,%
8741     \else\ifnum\countUTFz < "10000\relax
8742       \parseUTFviiiA;%
8743       \parseUTFviiiA,%
8744       \parseUTFviiiB E\UTFviiiThreeOctets.{,;}%
8745     \else
8746       \parseUTFviiiA;%
8747       \parseUTFviiiA,%
8748       \parseUTFviiiA!%
8749       \parseUTFviiiB F\UTFviiiFourOctets.{!,;}%
8750     \fi\fi\fi
8751   }
8752
8753   \gdef\parseUTFviiiA#1{%
8754     \countUTFx = \countUTFz
8755     \divide\countUTFz by 64
8756     \countUTFy = \countUTFz
8757     \multiply\countUTFz by 64
8758     \advance\countUTFx by -\countUTFz
8759     \advance\countUTFx by 128
8760     \uccode `#1\countUTFx
8761     \countUTFz = \countUTFy}
8762
8763   \gdef\parseUTFviiiB#1#2#3#4{%
8764     \advance\countUTFz by "#10\relax
8765     \uccode `#3\countUTFz
8766     \uppercase{\gdef\UTFviiiTmp{#2#3#4}}}
8767 \endgroup
8768
8769 \def\utfeightchardefs{%
8770   \DeclareUnicodeCharacter{00A0}{\tie}
8771   \DeclareUnicodeCharacter{00A1}{\exclamdown}
8772   \DeclareUnicodeCharacter{00A3}{\pounds}
8773   \DeclareUnicodeCharacter{00A8}{\"{ }}
8774   \DeclareUnicodeCharacter{00A9}{\copyright}
8775   \DeclareUnicodeCharacter{00AA}{\ordf}
8776   \DeclareUnicodeCharacter{00AB}{\guillemetleft}
8777   \DeclareUnicodeCharacter{00AD}{\-}
8778   \DeclareUnicodeCharacter{00AE}{\registeredsymbol}
8779   \DeclareUnicodeCharacter{00AF}{\={ }}
8780
8781   \DeclareUnicodeCharacter{00B0}{\ringaccent{ }}
8782   \DeclareUnicodeCharacter{00B4}{\'{ }}
8783   \DeclareUnicodeCharacter{00B8}{\cedilla{ }}
8784   \DeclareUnicodeCharacter{00BA}{\ordm}
8785   \DeclareUnicodeCharacter{00BB}{\guillemetright}
8786   \DeclareUnicodeCharacter{00BF}{\questiondown}
8787
8788   \DeclareUnicodeCharacter{00C0}{\`A}
8789   \DeclareUnicodeCharacter{00C1}{\'A}
8790   \DeclareUnicodeCharacter{00C2}{\^A}
8791   \DeclareUnicodeCharacter{00C3}{\~A}
8792   \DeclareUnicodeCharacter{00C4}{\"A}
8793   \DeclareUnicodeCharacter{00C5}{\AA}
8794   \DeclareUnicodeCharacter{00C6}{\AE}
8795   \DeclareUnicodeCharacter{00C7}{\cedilla{C}}
8796   \DeclareUnicodeCharacter{00C8}{\`E}
8797   \DeclareUnicodeCharacter{00C9}{\'E}
8798   \DeclareUnicodeCharacter{00CA}{\^E}
8799   \DeclareUnicodeCharacter{00CB}{\"E}
8800   \DeclareUnicodeCharacter{00CC}{\`I}
8801   \DeclareUnicodeCharacter{00CD}{\'I}
8802   \DeclareUnicodeCharacter{00CE}{\^I}
8803   \DeclareUnicodeCharacter{00CF}{\"I}
8804
8805   \DeclareUnicodeCharacter{00D0}{\DH}
8806   \DeclareUnicodeCharacter{00D1}{\~N}
8807   \DeclareUnicodeCharacter{00D2}{\`O}
8808   \DeclareUnicodeCharacter{00D3}{\'O}
8809   \DeclareUnicodeCharacter{00D4}{\^O}
8810   \DeclareUnicodeCharacter{00D5}{\~O}
8811   \DeclareUnicodeCharacter{00D6}{\"O}
8812   \DeclareUnicodeCharacter{00D8}{\O}
8813   \DeclareUnicodeCharacter{00D9}{\`U}
8814   \DeclareUnicodeCharacter{00DA}{\'U}
8815   \DeclareUnicodeCharacter{00DB}{\^U}
8816   \DeclareUnicodeCharacter{00DC}{\"U}
8817   \DeclareUnicodeCharacter{00DD}{\'Y}
8818   \DeclareUnicodeCharacter{00DE}{\TH}
8819   \DeclareUnicodeCharacter{00DF}{\ss}
8820
8821   \DeclareUnicodeCharacter{00E0}{\`a}
8822   \DeclareUnicodeCharacter{00E1}{\'a}
8823   \DeclareUnicodeCharacter{00E2}{\^a}
8824   \DeclareUnicodeCharacter{00E3}{\~a}
8825   \DeclareUnicodeCharacter{00E4}{\"a}
8826   \DeclareUnicodeCharacter{00E5}{\aa}
8827   \DeclareUnicodeCharacter{00E6}{\ae}
8828   \DeclareUnicodeCharacter{00E7}{\cedilla{c}}
8829   \DeclareUnicodeCharacter{00E8}{\`e}
8830   \DeclareUnicodeCharacter{00E9}{\'e}
8831   \DeclareUnicodeCharacter{00EA}{\^e}
8832   \DeclareUnicodeCharacter{00EB}{\"e}
8833   \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}}
8834   \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}}
8835   \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}}
8836   \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}}
8837
8838   \DeclareUnicodeCharacter{00F0}{\dh}
8839   \DeclareUnicodeCharacter{00F1}{\~n}
8840   \DeclareUnicodeCharacter{00F2}{\`o}
8841   \DeclareUnicodeCharacter{00F3}{\'o}
8842   \DeclareUnicodeCharacter{00F4}{\^o}
8843   \DeclareUnicodeCharacter{00F5}{\~o}
8844   \DeclareUnicodeCharacter{00F6}{\"o}
8845   \DeclareUnicodeCharacter{00F8}{\o}
8846   \DeclareUnicodeCharacter{00F9}{\`u}
8847   \DeclareUnicodeCharacter{00FA}{\'u}
8848   \DeclareUnicodeCharacter{00FB}{\^u}
8849   \DeclareUnicodeCharacter{00FC}{\"u}
8850   \DeclareUnicodeCharacter{00FD}{\'y}
8851   \DeclareUnicodeCharacter{00FE}{\th}
8852   \DeclareUnicodeCharacter{00FF}{\"y}
8853
8854   \DeclareUnicodeCharacter{0100}{\=A}
8855   \DeclareUnicodeCharacter{0101}{\=a}
8856   \DeclareUnicodeCharacter{0102}{\u{A}}
8857   \DeclareUnicodeCharacter{0103}{\u{a}}
8858   \DeclareUnicodeCharacter{0104}{\ogonek{A}}
8859   \DeclareUnicodeCharacter{0105}{\ogonek{a}}
8860   \DeclareUnicodeCharacter{0106}{\'C}
8861   \DeclareUnicodeCharacter{0107}{\'c}
8862   \DeclareUnicodeCharacter{0108}{\^C}
8863   \DeclareUnicodeCharacter{0109}{\^c}
8864   \DeclareUnicodeCharacter{0118}{\ogonek{E}}
8865   \DeclareUnicodeCharacter{0119}{\ogonek{e}}
8866   \DeclareUnicodeCharacter{010A}{\dotaccent{C}}
8867   \DeclareUnicodeCharacter{010B}{\dotaccent{c}}
8868   \DeclareUnicodeCharacter{010C}{\v{C}}
8869   \DeclareUnicodeCharacter{010D}{\v{c}}
8870   \DeclareUnicodeCharacter{010E}{\v{D}}
8871
8872   \DeclareUnicodeCharacter{0112}{\=E}
8873   \DeclareUnicodeCharacter{0113}{\=e}
8874   \DeclareUnicodeCharacter{0114}{\u{E}}
8875   \DeclareUnicodeCharacter{0115}{\u{e}}
8876   \DeclareUnicodeCharacter{0116}{\dotaccent{E}}
8877   \DeclareUnicodeCharacter{0117}{\dotaccent{e}}
8878   \DeclareUnicodeCharacter{011A}{\v{E}}
8879   \DeclareUnicodeCharacter{011B}{\v{e}}
8880   \DeclareUnicodeCharacter{011C}{\^G}
8881   \DeclareUnicodeCharacter{011D}{\^g}
8882   \DeclareUnicodeCharacter{011E}{\u{G}}
8883   \DeclareUnicodeCharacter{011F}{\u{g}}
8884
8885   \DeclareUnicodeCharacter{0120}{\dotaccent{G}}
8886   \DeclareUnicodeCharacter{0121}{\dotaccent{g}}
8887   \DeclareUnicodeCharacter{0124}{\^H}
8888   \DeclareUnicodeCharacter{0125}{\^h}
8889   \DeclareUnicodeCharacter{0128}{\~I}
8890   \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}}
8891   \DeclareUnicodeCharacter{012A}{\=I}
8892   \DeclareUnicodeCharacter{012B}{\={\dotless{i}}}
8893   \DeclareUnicodeCharacter{012C}{\u{I}}
8894   \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}}
8895
8896   \DeclareUnicodeCharacter{0130}{\dotaccent{I}}
8897   \DeclareUnicodeCharacter{0131}{\dotless{i}}
8898   \DeclareUnicodeCharacter{0132}{IJ}
8899   \DeclareUnicodeCharacter{0133}{ij}
8900   \DeclareUnicodeCharacter{0134}{\^J}
8901   \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}}
8902   \DeclareUnicodeCharacter{0139}{\'L}
8903   \DeclareUnicodeCharacter{013A}{\'l}
8904
8905   \DeclareUnicodeCharacter{0141}{\L}
8906   \DeclareUnicodeCharacter{0142}{\l}
8907   \DeclareUnicodeCharacter{0143}{\'N}
8908   \DeclareUnicodeCharacter{0144}{\'n}
8909   \DeclareUnicodeCharacter{0147}{\v{N}}
8910   \DeclareUnicodeCharacter{0148}{\v{n}}
8911   \DeclareUnicodeCharacter{014C}{\=O}
8912   \DeclareUnicodeCharacter{014D}{\=o}
8913   \DeclareUnicodeCharacter{014E}{\u{O}}
8914   \DeclareUnicodeCharacter{014F}{\u{o}}
8915
8916   \DeclareUnicodeCharacter{0150}{\H{O}}
8917   \DeclareUnicodeCharacter{0151}{\H{o}}
8918   \DeclareUnicodeCharacter{0152}{\OE}
8919   \DeclareUnicodeCharacter{0153}{\oe}
8920   \DeclareUnicodeCharacter{0154}{\'R}
8921   \DeclareUnicodeCharacter{0155}{\'r}
8922   \DeclareUnicodeCharacter{0158}{\v{R}}
8923   \DeclareUnicodeCharacter{0159}{\v{r}}
8924   \DeclareUnicodeCharacter{015A}{\'S}
8925   \DeclareUnicodeCharacter{015B}{\'s}
8926   \DeclareUnicodeCharacter{015C}{\^S}
8927   \DeclareUnicodeCharacter{015D}{\^s}
8928   \DeclareUnicodeCharacter{015E}{\cedilla{S}}
8929   \DeclareUnicodeCharacter{015F}{\cedilla{s}}
8930
8931   \DeclareUnicodeCharacter{0160}{\v{S}}
8932   \DeclareUnicodeCharacter{0161}{\v{s}}
8933   \DeclareUnicodeCharacter{0162}{\cedilla{t}}
8934   \DeclareUnicodeCharacter{0163}{\cedilla{T}}
8935   \DeclareUnicodeCharacter{0164}{\v{T}}
8936
8937   \DeclareUnicodeCharacter{0168}{\~U}
8938   \DeclareUnicodeCharacter{0169}{\~u}
8939   \DeclareUnicodeCharacter{016A}{\=U}
8940   \DeclareUnicodeCharacter{016B}{\=u}
8941   \DeclareUnicodeCharacter{016C}{\u{U}}
8942   \DeclareUnicodeCharacter{016D}{\u{u}}
8943   \DeclareUnicodeCharacter{016E}{\ringaccent{U}}
8944   \DeclareUnicodeCharacter{016F}{\ringaccent{u}}
8945
8946   \DeclareUnicodeCharacter{0170}{\H{U}}
8947   \DeclareUnicodeCharacter{0171}{\H{u}}
8948   \DeclareUnicodeCharacter{0174}{\^W}
8949   \DeclareUnicodeCharacter{0175}{\^w}
8950   \DeclareUnicodeCharacter{0176}{\^Y}
8951   \DeclareUnicodeCharacter{0177}{\^y}
8952   \DeclareUnicodeCharacter{0178}{\"Y}
8953   \DeclareUnicodeCharacter{0179}{\'Z}
8954   \DeclareUnicodeCharacter{017A}{\'z}
8955   \DeclareUnicodeCharacter{017B}{\dotaccent{Z}}
8956   \DeclareUnicodeCharacter{017C}{\dotaccent{z}}
8957   \DeclareUnicodeCharacter{017D}{\v{Z}}
8958   \DeclareUnicodeCharacter{017E}{\v{z}}
8959
8960   \DeclareUnicodeCharacter{01C4}{D\v{Z}}
8961   \DeclareUnicodeCharacter{01C5}{D\v{z}}
8962   \DeclareUnicodeCharacter{01C6}{d\v{z}}
8963   \DeclareUnicodeCharacter{01C7}{LJ}
8964   \DeclareUnicodeCharacter{01C8}{Lj}
8965   \DeclareUnicodeCharacter{01C9}{lj}
8966   \DeclareUnicodeCharacter{01CA}{NJ}
8967   \DeclareUnicodeCharacter{01CB}{Nj}
8968   \DeclareUnicodeCharacter{01CC}{nj}
8969   \DeclareUnicodeCharacter{01CD}{\v{A}}
8970   \DeclareUnicodeCharacter{01CE}{\v{a}}
8971   \DeclareUnicodeCharacter{01CF}{\v{I}}
8972
8973   \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}}
8974   \DeclareUnicodeCharacter{01D1}{\v{O}}
8975   \DeclareUnicodeCharacter{01D2}{\v{o}}
8976   \DeclareUnicodeCharacter{01D3}{\v{U}}
8977   \DeclareUnicodeCharacter{01D4}{\v{u}}
8978
8979   \DeclareUnicodeCharacter{01E2}{\={\AE}}
8980   \DeclareUnicodeCharacter{01E3}{\={\ae}}
8981   \DeclareUnicodeCharacter{01E6}{\v{G}}
8982   \DeclareUnicodeCharacter{01E7}{\v{g}}
8983   \DeclareUnicodeCharacter{01E8}{\v{K}}
8984   \DeclareUnicodeCharacter{01E9}{\v{k}}
8985
8986   \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}}
8987   \DeclareUnicodeCharacter{01F1}{DZ}
8988   \DeclareUnicodeCharacter{01F2}{Dz}
8989   \DeclareUnicodeCharacter{01F3}{dz}
8990   \DeclareUnicodeCharacter{01F4}{\'G}
8991   \DeclareUnicodeCharacter{01F5}{\'g}
8992   \DeclareUnicodeCharacter{01F8}{\`N}
8993   \DeclareUnicodeCharacter{01F9}{\`n}
8994   \DeclareUnicodeCharacter{01FC}{\'{\AE}}
8995   \DeclareUnicodeCharacter{01FD}{\'{\ae}}
8996   \DeclareUnicodeCharacter{01FE}{\'{\O}}
8997   \DeclareUnicodeCharacter{01FF}{\'{\o}}
8998
8999   \DeclareUnicodeCharacter{021E}{\v{H}}
9000   \DeclareUnicodeCharacter{021F}{\v{h}}
9001
9002   \DeclareUnicodeCharacter{0226}{\dotaccent{A}}
9003   \DeclareUnicodeCharacter{0227}{\dotaccent{a}}
9004   \DeclareUnicodeCharacter{0228}{\cedilla{E}}
9005   \DeclareUnicodeCharacter{0229}{\cedilla{e}}
9006   \DeclareUnicodeCharacter{022E}{\dotaccent{O}}
9007   \DeclareUnicodeCharacter{022F}{\dotaccent{o}}
9008
9009   \DeclareUnicodeCharacter{0232}{\=Y}
9010   \DeclareUnicodeCharacter{0233}{\=y}
9011   \DeclareUnicodeCharacter{0237}{\dotless{j}}
9012
9013   \DeclareUnicodeCharacter{02DB}{\ogonek{ }}
9014
9015   \DeclareUnicodeCharacter{1E02}{\dotaccent{B}}
9016   \DeclareUnicodeCharacter{1E03}{\dotaccent{b}}
9017   \DeclareUnicodeCharacter{1E04}{\udotaccent{B}}
9018   \DeclareUnicodeCharacter{1E05}{\udotaccent{b}}
9019   \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}}
9020   \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}}
9021   \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}}
9022   \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}}
9023   \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}}
9024   \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}}
9025   \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}}
9026   \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}}
9027
9028   \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}}
9029   \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}}
9030
9031   \DeclareUnicodeCharacter{1E20}{\=G}
9032   \DeclareUnicodeCharacter{1E21}{\=g}
9033   \DeclareUnicodeCharacter{1E22}{\dotaccent{H}}
9034   \DeclareUnicodeCharacter{1E23}{\dotaccent{h}}
9035   \DeclareUnicodeCharacter{1E24}{\udotaccent{H}}
9036   \DeclareUnicodeCharacter{1E25}{\udotaccent{h}}
9037   \DeclareUnicodeCharacter{1E26}{\"H}
9038   \DeclareUnicodeCharacter{1E27}{\"h}
9039
9040   \DeclareUnicodeCharacter{1E30}{\'K}
9041   \DeclareUnicodeCharacter{1E31}{\'k}
9042   \DeclareUnicodeCharacter{1E32}{\udotaccent{K}}
9043   \DeclareUnicodeCharacter{1E33}{\udotaccent{k}}
9044   \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}}
9045   \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}}
9046   \DeclareUnicodeCharacter{1E36}{\udotaccent{L}}
9047   \DeclareUnicodeCharacter{1E37}{\udotaccent{l}}
9048   \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}}
9049   \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}}
9050   \DeclareUnicodeCharacter{1E3E}{\'M}
9051   \DeclareUnicodeCharacter{1E3F}{\'m}
9052
9053   \DeclareUnicodeCharacter{1E40}{\dotaccent{M}}
9054   \DeclareUnicodeCharacter{1E41}{\dotaccent{m}}
9055   \DeclareUnicodeCharacter{1E42}{\udotaccent{M}}
9056   \DeclareUnicodeCharacter{1E43}{\udotaccent{m}}
9057   \DeclareUnicodeCharacter{1E44}{\dotaccent{N}}
9058   \DeclareUnicodeCharacter{1E45}{\dotaccent{n}}
9059   \DeclareUnicodeCharacter{1E46}{\udotaccent{N}}
9060   \DeclareUnicodeCharacter{1E47}{\udotaccent{n}}
9061   \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}}
9062   \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}}
9063
9064   \DeclareUnicodeCharacter{1E54}{\'P}
9065   \DeclareUnicodeCharacter{1E55}{\'p}
9066   \DeclareUnicodeCharacter{1E56}{\dotaccent{P}}
9067   \DeclareUnicodeCharacter{1E57}{\dotaccent{p}}
9068   \DeclareUnicodeCharacter{1E58}{\dotaccent{R}}
9069   \DeclareUnicodeCharacter{1E59}{\dotaccent{r}}
9070   \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}}
9071   \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}}
9072   \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}}
9073   \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}}
9074
9075   \DeclareUnicodeCharacter{1E60}{\dotaccent{S}}
9076   \DeclareUnicodeCharacter{1E61}{\dotaccent{s}}
9077   \DeclareUnicodeCharacter{1E62}{\udotaccent{S}}
9078   \DeclareUnicodeCharacter{1E63}{\udotaccent{s}}
9079   \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}}
9080   \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}}
9081   \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}}
9082   \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}}
9083   \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}}
9084   \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}}
9085
9086   \DeclareUnicodeCharacter{1E7C}{\~V}
9087   \DeclareUnicodeCharacter{1E7D}{\~v}
9088   \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}}
9089   \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}}
9090
9091   \DeclareUnicodeCharacter{1E80}{\`W}
9092   \DeclareUnicodeCharacter{1E81}{\`w}
9093   \DeclareUnicodeCharacter{1E82}{\'W}
9094   \DeclareUnicodeCharacter{1E83}{\'w}
9095   \DeclareUnicodeCharacter{1E84}{\"W}
9096   \DeclareUnicodeCharacter{1E85}{\"w}
9097   \DeclareUnicodeCharacter{1E86}{\dotaccent{W}}
9098   \DeclareUnicodeCharacter{1E87}{\dotaccent{w}}
9099   \DeclareUnicodeCharacter{1E88}{\udotaccent{W}}
9100   \DeclareUnicodeCharacter{1E89}{\udotaccent{w}}
9101   \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}}
9102   \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}}
9103   \DeclareUnicodeCharacter{1E8C}{\"X}
9104   \DeclareUnicodeCharacter{1E8D}{\"x}
9105   \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}}
9106   \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}}
9107
9108   \DeclareUnicodeCharacter{1E90}{\^Z}
9109   \DeclareUnicodeCharacter{1E91}{\^z}
9110   \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}}
9111   \DeclareUnicodeCharacter{1E93}{\udotaccent{z}}
9112   \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}}
9113   \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}}
9114   \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}}
9115   \DeclareUnicodeCharacter{1E97}{\"t}
9116   \DeclareUnicodeCharacter{1E98}{\ringaccent{w}}
9117   \DeclareUnicodeCharacter{1E99}{\ringaccent{y}}
9118
9119   \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}}
9120   \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}}
9121
9122   \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}}
9123   \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}}
9124   \DeclareUnicodeCharacter{1EBC}{\~E}
9125   \DeclareUnicodeCharacter{1EBD}{\~e}
9126
9127   \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}}
9128   \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}}
9129   \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}}
9130   \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}}
9131
9132   \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}}
9133   \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}}
9134
9135   \DeclareUnicodeCharacter{1EF2}{\`Y}
9136   \DeclareUnicodeCharacter{1EF3}{\`y}
9137   \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}}
9138
9139   \DeclareUnicodeCharacter{1EF8}{\~Y}
9140   \DeclareUnicodeCharacter{1EF9}{\~y}
9141
9142   \DeclareUnicodeCharacter{2013}{--}
9143   \DeclareUnicodeCharacter{2014}{---}
9144   \DeclareUnicodeCharacter{2018}{\quoteleft}
9145   \DeclareUnicodeCharacter{2019}{\quoteright}
9146   \DeclareUnicodeCharacter{201A}{\quotesinglbase}
9147   \DeclareUnicodeCharacter{201C}{\quotedblleft}
9148   \DeclareUnicodeCharacter{201D}{\quotedblright}
9149   \DeclareUnicodeCharacter{201E}{\quotedblbase}
9150   \DeclareUnicodeCharacter{2022}{\bullet}
9151   \DeclareUnicodeCharacter{2026}{\dots}
9152   \DeclareUnicodeCharacter{2039}{\guilsinglleft}
9153   \DeclareUnicodeCharacter{203A}{\guilsinglright}
9154   \DeclareUnicodeCharacter{20AC}{\euro}
9155
9156   \DeclareUnicodeCharacter{2192}{\expansion}
9157   \DeclareUnicodeCharacter{21D2}{\result}
9158
9159   \DeclareUnicodeCharacter{2212}{\minus}
9160   \DeclareUnicodeCharacter{2217}{\point}
9161   \DeclareUnicodeCharacter{2261}{\equiv}
9162 }% end of \utfeightchardefs
9163
9164
9165 % US-ASCII character definitions.
9166 \def\asciichardefs{% nothing need be done
9167    \relax
9168 }
9169
9170 % Make non-ASCII characters printable again for compatibility with
9171 % existing Texinfo documents that may use them, even without declaring a
9172 % document encoding.
9173 %
9174 \setnonasciicharscatcode \other
9175
9176
9177 \message{formatting,}
9178
9179 \newdimen\defaultparindent \defaultparindent = 15pt
9180
9181 \chapheadingskip = 15pt plus 4pt minus 2pt
9182 \secheadingskip = 12pt plus 3pt minus 2pt
9183 \subsecheadingskip = 9pt plus 2pt minus 2pt
9184
9185 % Prevent underfull vbox error messages.
9186 \vbadness = 10000
9187
9188 % Don't be very finicky about underfull hboxes, either.
9189 \hbadness = 6666
9190
9191 % Following George Bush, get rid of widows and orphans.
9192 \widowpenalty=10000
9193 \clubpenalty=10000
9194
9195 % Use TeX 3.0's \emergencystretch to help line breaking, but if we're
9196 % using an old version of TeX, don't do anything.  We want the amount of
9197 % stretch added to depend on the line length, hence the dependence on
9198 % \hsize.  We call this whenever the paper size is set.
9199 %
9200 \def\setemergencystretch{%
9201   \ifx\emergencystretch\thisisundefined
9202     % Allow us to assign to \emergencystretch anyway.
9203     \def\emergencystretch{\dimen0}%
9204   \else
9205     \emergencystretch = .15\hsize
9206   \fi
9207 }
9208
9209 % Parameters in order: 1) textheight; 2) textwidth;
9210 % 3) voffset; 4) hoffset; 5) binding offset; 6) topskip;
9211 % 7) physical page height; 8) physical page width.
9212 %
9213 % We also call \setleading{\textleading}, so the caller should define
9214 % \textleading.  The caller should also set \parskip.
9215 %
9216 \def\internalpagesizes#1#2#3#4#5#6#7#8{%
9217   \voffset = #3\relax
9218   \topskip = #6\relax
9219   \splittopskip = \topskip
9220   %
9221   \vsize = #1\relax
9222   \advance\vsize by \topskip
9223   \outervsize = \vsize
9224   \advance\outervsize by 2\topandbottommargin
9225   \pageheight = \vsize
9226   %
9227   \hsize = #2\relax
9228   \outerhsize = \hsize
9229   \advance\outerhsize by 0.5in
9230   \pagewidth = \hsize
9231   %
9232   \normaloffset = #4\relax
9233   \bindingoffset = #5\relax
9234   %
9235   \ifpdf
9236     \pdfpageheight #7\relax
9237     \pdfpagewidth #8\relax
9238     % if we don't reset these, they will remain at "1 true in" of
9239     % whatever layout pdftex was dumped with.
9240     \pdfhorigin = 1 true in
9241     \pdfvorigin = 1 true in
9242   \fi
9243   %
9244   \setleading{\textleading}
9245   %
9246   \parindent = \defaultparindent
9247   \setemergencystretch
9248 }
9249
9250 % @letterpaper (the default).
9251 \def\letterpaper{{\globaldefs = 1
9252   \parskip = 3pt plus 2pt minus 1pt
9253   \textleading = 13.2pt
9254   %
9255   % If page is nothing but text, make it come out even.
9256   \internalpagesizes{607.2pt}{6in}% that's 46 lines
9257                     {\voffset}{.25in}%
9258                     {\bindingoffset}{36pt}%
9259                     {11in}{8.5in}%
9260 }}
9261
9262 % Use @smallbook to reset parameters for 7x9.25 trim size.
9263 \def\smallbook{{\globaldefs = 1
9264   \parskip = 2pt plus 1pt
9265   \textleading = 12pt
9266   %
9267   \internalpagesizes{7.5in}{5in}%
9268                     {-.2in}{0in}%
9269                     {\bindingoffset}{16pt}%
9270                     {9.25in}{7in}%
9271   %
9272   \lispnarrowing = 0.3in
9273   \tolerance = 700
9274   \hfuzz = 1pt
9275   \contentsrightmargin = 0pt
9276   \defbodyindent = .5cm
9277 }}
9278
9279 % Use @smallerbook to reset parameters for 6x9 trim size.
9280 % (Just testing, parameters still in flux.)
9281 \def\smallerbook{{\globaldefs = 1
9282   \parskip = 1.5pt plus 1pt
9283   \textleading = 12pt
9284   %
9285   \internalpagesizes{7.4in}{4.8in}%
9286                     {-.2in}{-.4in}%
9287                     {0pt}{14pt}%
9288                     {9in}{6in}%
9289   %
9290   \lispnarrowing = 0.25in
9291   \tolerance = 700
9292   \hfuzz = 1pt
9293   \contentsrightmargin = 0pt
9294   \defbodyindent = .4cm
9295 }}
9296
9297 % Use @afourpaper to print on European A4 paper.
9298 \def\afourpaper{{\globaldefs = 1
9299   \parskip = 3pt plus 2pt minus 1pt
9300   \textleading = 13.2pt
9301   %
9302   % Double-side printing via postscript on Laserjet 4050
9303   % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm.
9304   % To change the settings for a different printer or situation, adjust
9305   % \normaloffset until the front-side and back-side texts align.  Then
9306   % do the same for \bindingoffset.  You can set these for testing in
9307   % your texinfo source file like this:
9308   % @tex
9309   % \global\normaloffset = -6mm
9310   % \global\bindingoffset = 10mm
9311   % @end tex
9312   \internalpagesizes{673.2pt}{160mm}% that's 51 lines
9313                     {\voffset}{\hoffset}%
9314                     {\bindingoffset}{44pt}%
9315                     {297mm}{210mm}%
9316   %
9317   \tolerance = 700
9318   \hfuzz = 1pt
9319   \contentsrightmargin = 0pt
9320   \defbodyindent = 5mm
9321 }}
9322
9323 % Use @afivepaper to print on European A5 paper.
9324 % From romildo@urano.iceb.ufop.br, 2 July 2000.
9325 % He also recommends making @example and @lisp be small.
9326 \def\afivepaper{{\globaldefs = 1
9327   \parskip = 2pt plus 1pt minus 0.1pt
9328   \textleading = 12.5pt
9329   %
9330   \internalpagesizes{160mm}{120mm}%
9331                     {\voffset}{\hoffset}%
9332                     {\bindingoffset}{8pt}%
9333                     {210mm}{148mm}%
9334   %
9335   \lispnarrowing = 0.2in
9336   \tolerance = 800
9337   \hfuzz = 1.2pt
9338   \contentsrightmargin = 0pt
9339   \defbodyindent = 2mm
9340   \tableindent = 12mm
9341 }}
9342
9343 % A specific text layout, 24x15cm overall, intended for A4 paper.
9344 \def\afourlatex{{\globaldefs = 1
9345   \afourpaper
9346   \internalpagesizes{237mm}{150mm}%
9347                     {\voffset}{4.6mm}%
9348                     {\bindingoffset}{7mm}%
9349                     {297mm}{210mm}%
9350   %
9351   % Must explicitly reset to 0 because we call \afourpaper.
9352   \globaldefs = 0
9353 }}
9354
9355 % Use @afourwide to print on A4 paper in landscape format.
9356 \def\afourwide{{\globaldefs = 1
9357   \afourpaper
9358   \internalpagesizes{241mm}{165mm}%
9359                     {\voffset}{-2.95mm}%
9360                     {\bindingoffset}{7mm}%
9361                     {297mm}{210mm}%
9362   \globaldefs = 0
9363 }}
9364
9365 % @pagesizes TEXTHEIGHT[,TEXTWIDTH]
9366 % Perhaps we should allow setting the margins, \topskip, \parskip,
9367 % and/or leading, also. Or perhaps we should compute them somehow.
9368 %
9369 \parseargdef\pagesizes{\pagesizesyyy #1,,\finish}
9370 \def\pagesizesyyy#1,#2,#3\finish{{%
9371   \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
9372   \globaldefs = 1
9373   %
9374   \parskip = 3pt plus 2pt minus 1pt
9375   \setleading{\textleading}%
9376   %
9377   \dimen0 = #1\relax
9378   \advance\dimen0 by \voffset
9379   %
9380   \dimen2 = \hsize
9381   \advance\dimen2 by \normaloffset
9382   %
9383   \internalpagesizes{#1}{\hsize}%
9384                     {\voffset}{\normaloffset}%
9385                     {\bindingoffset}{44pt}%
9386                     {\dimen0}{\dimen2}%
9387 }}
9388
9389 % Set default to letter.
9390 %
9391 \letterpaper
9392
9393
9394 \message{and turning on texinfo input format.}
9395
9396 % DEL is a comment character, in case @c does not suffice.
9397 \catcode`\^^? = 14
9398
9399 % Define macros to output various characters with catcode for normal text.
9400 \catcode`\"=\other \def\normaldoublequote{"}
9401 \catcode`\$=\other \def\normaldollar{$}%$ font-lock fix
9402 \catcode`\+=\other \def\normalplus{+}
9403 \catcode`\<=\other \def\normalless{<}
9404 \catcode`\>=\other \def\normalgreater{>}
9405 \catcode`\^=\other \def\normalcaret{^}
9406 \catcode`\_=\other \def\normalunderscore{_}
9407 \catcode`\|=\other \def\normalverticalbar{|}
9408 \catcode`\~=\other \def\normaltilde{~}
9409
9410 % This macro is used to make a character print one way in \tt
9411 % (where it can probably be output as-is), and another way in other fonts,
9412 % where something hairier probably needs to be done.
9413 %
9414 % #1 is what to print if we are indeed using \tt; #2 is what to print
9415 % otherwise.  Since all the Computer Modern typewriter fonts have zero
9416 % interword stretch (and shrink), and it is reasonable to expect all
9417 % typewriter fonts to have this, we can check that font parameter.
9418 %
9419 \def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi}
9420
9421 % Same as above, but check for italic font.  Actually this also catches
9422 % non-italic slanted fonts since it is impossible to distinguish them from
9423 % italic fonts.  But since this is only used by $ and it uses \sl anyway
9424 % this is not a problem.
9425 \def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi}
9426
9427 % Turn off all special characters except @
9428 % (and those which the user can use as if they were ordinary).
9429 % Most of these we simply print from the \tt font, but for some, we can
9430 % use math or other variants that look better in normal text.
9431
9432 \catcode`\"=\active
9433 \def\activedoublequote{{\tt\char34}}
9434 \let"=\activedoublequote
9435 \catcode`\~=\active
9436 \def~{{\tt\char126}}
9437 \chardef\hat=`\^
9438 \catcode`\^=\active
9439 \def^{{\tt \hat}}
9440
9441 \catcode`\_=\active
9442 \def_{\ifusingtt\normalunderscore\_}
9443 \let\realunder=_
9444 % Subroutine for the previous macro.
9445 \def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }
9446
9447 \catcode`\|=\active
9448 \def|{{\tt\char124}}
9449 \chardef \less=`\<
9450 \catcode`\<=\active
9451 \def<{{\tt \less}}
9452 \chardef \gtr=`\>
9453 \catcode`\>=\active
9454 \def>{{\tt \gtr}}
9455 \catcode`\+=\active
9456 \def+{{\tt \char 43}}
9457 \catcode`\$=\active
9458 \def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix
9459
9460 % If a .fmt file is being used, characters that might appear in a file
9461 % name cannot be active until we have parsed the command line.
9462 % So turn them off again, and have \everyjob (or @setfilename) turn them on.
9463 % \otherifyactive is called near the end of this file.
9464 \def\otherifyactive{\catcode`+=\other \catcode`\_=\other}
9465
9466 % Used sometimes to turn off (effectively) the active characters even after
9467 % parsing them.
9468 \def\turnoffactive{%
9469   \normalturnoffactive
9470   \otherbackslash
9471 }
9472
9473 \catcode`\@=0
9474
9475 % \backslashcurfont outputs one backslash character in current font,
9476 % as in \char`\\.
9477 \global\chardef\backslashcurfont=`\\
9478 \global\let\rawbackslashxx=\backslashcurfont  % let existing .??s files work
9479
9480 % \realbackslash is an actual character `\' with catcode other, and
9481 % \doublebackslash is two of them (for the pdf outlines).
9482 {\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}}
9483
9484 % In texinfo, backslash is an active character; it prints the backslash
9485 % in fixed width font.
9486 \catcode`\\=\active
9487 @def@normalbackslash{{@tt@backslashcurfont}}
9488 % On startup, @fixbackslash assigns:
9489 %  @let \ = @normalbackslash
9490
9491 % \rawbackslash defines an active \ to do \backslashcurfont.
9492 % \otherbackslash defines an active \ to be a literal `\' character with
9493 % catcode other.
9494 @gdef@rawbackslash{@let\=@backslashcurfont}
9495 @gdef@otherbackslash{@let\=@realbackslash}
9496
9497 % Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of
9498 % the literal character `\'.
9499 %
9500 @def@normalturnoffactive{%
9501   @let"=@normaldoublequote
9502   @let$=@normaldollar %$ font-lock fix
9503   @let+=@normalplus
9504   @let<=@normalless
9505   @let>=@normalgreater
9506   @let\=@normalbackslash
9507   @let^=@normalcaret
9508   @let_=@normalunderscore
9509   @let|=@normalverticalbar
9510   @let~=@normaltilde
9511   @markupsetuplqdefault
9512   @markupsetuprqdefault
9513   @unsepspaces
9514 }
9515
9516 % Make _ and + \other characters, temporarily.
9517 % This is canceled by @fixbackslash.
9518 @otherifyactive
9519
9520 % If a .fmt file is being used, we don't want the `\input texinfo' to show up.
9521 % That is what \eatinput is for; after that, the `\' should revert to printing
9522 % a backslash.
9523 %
9524 @gdef@eatinput input texinfo{@fixbackslash}
9525 @global@let\ = @eatinput
9526
9527 % On the other hand, perhaps the file did not have a `\input texinfo'. Then
9528 % the first `\' in the file would cause an error. This macro tries to fix
9529 % that, assuming it is called before the first `\' could plausibly occur.
9530 % Also turn back on active characters that might appear in the input
9531 % file name, in case not using a pre-dumped format.
9532 %
9533 @gdef@fixbackslash{%
9534   @ifx\@eatinput @let\ = @normalbackslash @fi
9535   @catcode`+=@active
9536   @catcode`@_=@active
9537 }
9538
9539 % Say @foo, not \foo, in error messages.
9540 @escapechar = `@@
9541
9542 % These (along with & and #) are made active for url-breaking, so need
9543 % active definitions as the normal characters.
9544 @def@normaldot{.}
9545 @def@normalquest{?}
9546 @def@normalslash{/}
9547
9548 % These look ok in all fonts, so just make them not special.
9549 @catcode`@& = @other @def@normalamp{&}
9550 @catcode`@# = @other @def@normalhash{#}
9551 @catcode`@% = @other @def@normalpercent{%}
9552
9553 @c Finally, make ` and ' active, so that txicodequoteundirected and
9554 @c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}.  If we
9555 @c don't make ` and ' active, @code will not get them as active chars.
9556 @c Do this last of all since we use ` in the previous @catcode assignments.
9557 @catcode`@'=@active
9558 @catcode`@`=@active
9559 @markupsetuplqdefault
9560 @markupsetuprqdefault
9561
9562 @c Local variables:
9563 @c eval: (add-hook 'write-file-hooks 'time-stamp)
9564 @c page-delimiter: "^\\\\message"
9565 @c time-stamp-start: "def\\\\texinfoversion{"
9566 @c time-stamp-format: "%:y-%02m-%02d.%02H"
9567 @c time-stamp-end: "}"
9568 @c End:
9569
9570 @c vim:sw=2:
9571
9572 @ignore
9573    arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115
9574 @end ignore