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