"Fossies" - the Fresh Open Source Software Archive

Member "gawk-5.1.0/doc/texinfo.tex" (13 Apr 2020, 376807 Bytes) of package /linux/misc/gawk-5.1.0.tar.xz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) TeX and LaTeX source code syntax highlighting (style: standard) with prefixed line numbers. Alternatively you can here view or download the uninterpreted source code file.

    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{2020-02-11.09}
    7 %
    8 % Copyright 1985, 1986, 1988, 1990-2019 Free Software Foundation, Inc.
    9 %
   10 % This texinfo.tex file is free software: you can redistribute it and/or
   11 % modify it under the terms of the GNU General Public License as
   12 % published by the Free Software Foundation, either version 3 of the
   13 % License, or (at your option) any later version.
   14 %
   15 % This texinfo.tex file is distributed in the hope that it will be
   16 % useful, but WITHOUT ANY WARRANTY; without even the implied warranty
   17 % of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   18 % General Public License for more details.
   19 %
   20 % You should have received a copy of the GNU General Public License
   21 % along with this program.  If not, see <https://www.gnu.org/licenses/>.
   22 %
   23 % As a special exception, when this file is read by TeX when processing
   24 % a Texinfo source document, you may use the result without
   25 % restriction. This Exception is an additional permission under section 7
   26 % of the GNU General Public License, version 3 ("GPLv3").
   27 %
   28 % Please try the latest version of texinfo.tex before submitting bug
   29 % reports; you can get the latest version from:
   30 %   https://ftp.gnu.org/gnu/texinfo/ (the Texinfo release area), or
   31 %   https://ftpmirror.gnu.org/texinfo/ (same, via a mirror), or
   32 %   https://www.gnu.org/software/texinfo/ (the Texinfo home page)
   33 % The texinfo.tex in any given distribution could well be out
   34 % of date, so if that's what you're using, please check.
   35 %
   36 % Send bug reports to bug-texinfo@gnu.org.  Please include including a
   37 % complete document in each bug report with which we can reproduce the
   38 % problem.  Patches are, of course, greatly appreciated.
   39 %
   40 % To process a Texinfo manual with TeX, it's most reliable to use the
   41 % texi2dvi shell script that comes with the distribution.  For a simple
   42 % manual foo.texi, however, you can get away with this:
   43 %   tex foo.texi
   44 %   texindex foo.??
   45 %   tex foo.texi
   46 %   tex foo.texi
   47 %   dvips foo.dvi -o  # or whatever; this makes foo.ps.
   48 % The extra TeX runs get the cross-reference information correct.
   49 % Sometimes one run after texindex suffices, and sometimes you need more
   50 % than two; texi2dvi does it as many times as necessary.
   51 %
   52 % It is possible to adapt texinfo.tex for other languages, to some
   53 % extent.  You can get the existing language-specific files from the
   54 % full Texinfo distribution.
   55 %
   56 % The GNU Texinfo home page is https://www.gnu.org/software/texinfo.
   57 
   58 
   59 \message{Loading texinfo [version \texinfoversion]:}
   60 
   61 % If in a .fmt file, print the version number
   62 % and turn on active characters that we couldn't do earlier because
   63 % they might have appeared in the input file name.
   64 \everyjob{\message{[Texinfo version \texinfoversion]}%
   65   \catcode`+=\active \catcode`\_=\active}
   66 
   67 % LaTeX's \typeout.  This ensures that the messages it is used for
   68 % are identical in format to the corresponding ones from latex/pdflatex.
   69 \def\typeout{\immediate\write17}%
   70 
   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\ptexraggedright=\raggedright
   99 \let\ptexrbrace=\}
  100 \let\ptexslash=\/
  101 \let\ptexsp=\sp
  102 \let\ptexstar=\*
  103 \let\ptexsup=\sup
  104 \let\ptext=\t
  105 \let\ptextop=\top
  106 {\catcode`\'=\active \global\let\ptexquoteright'}% active in plain's math mode
  107 
  108 % If this character appears in an error message or help string, it
  109 % starts a new line in the output.
  110 \newlinechar = `^^J
  111 
  112 % Use TeX 3.0's \inputlineno to get the line number, for better error
  113 % messages, but if we're using an old version of TeX, don't do anything.
  114 %
  115 \ifx\inputlineno\thisisundefined
  116   \let\linenumber = \empty % Pre-3.0.
  117 \else
  118   \def\linenumber{l.\the\inputlineno:\space}
  119 \fi
  120 
  121 % Set up fixed words for English if not already set.
  122 \ifx\putwordAppendix\undefined  \gdef\putwordAppendix{Appendix}\fi
  123 \ifx\putwordChapter\undefined   \gdef\putwordChapter{Chapter}\fi
  124 \ifx\putworderror\undefined     \gdef\putworderror{error}\fi
  125 \ifx\putwordfile\undefined      \gdef\putwordfile{file}\fi
  126 \ifx\putwordin\undefined        \gdef\putwordin{in}\fi
  127 \ifx\putwordIndexIsEmpty\undefined       \gdef\putwordIndexIsEmpty{(Index is empty)}\fi
  128 \ifx\putwordIndexNonexistent\undefined   \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi
  129 \ifx\putwordInfo\undefined      \gdef\putwordInfo{Info}\fi
  130 \ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi
  131 \ifx\putwordMethodon\undefined  \gdef\putwordMethodon{Method on}\fi
  132 \ifx\putwordNoTitle\undefined   \gdef\putwordNoTitle{No Title}\fi
  133 \ifx\putwordof\undefined        \gdef\putwordof{of}\fi
  134 \ifx\putwordon\undefined        \gdef\putwordon{on}\fi
  135 \ifx\putwordpage\undefined      \gdef\putwordpage{page}\fi
  136 \ifx\putwordsection\undefined   \gdef\putwordsection{section}\fi
  137 \ifx\putwordSection\undefined   \gdef\putwordSection{Section}\fi
  138 \ifx\putwordsee\undefined       \gdef\putwordsee{see}\fi
  139 \ifx\putwordSee\undefined       \gdef\putwordSee{See}\fi
  140 \ifx\putwordShortTOC\undefined  \gdef\putwordShortTOC{Short Contents}\fi
  141 \ifx\putwordTOC\undefined       \gdef\putwordTOC{Table of Contents}\fi
  142 %
  143 \ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi
  144 \ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi
  145 \ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi
  146 \ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi
  147 \ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi
  148 \ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi
  149 \ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi
  150 \ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi
  151 \ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi
  152 \ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi
  153 \ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi
  154 \ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi
  155 %
  156 \ifx\putwordDefmac\undefined    \gdef\putwordDefmac{Macro}\fi
  157 \ifx\putwordDefspec\undefined   \gdef\putwordDefspec{Special Form}\fi
  158 \ifx\putwordDefvar\undefined    \gdef\putwordDefvar{Variable}\fi
  159 \ifx\putwordDefopt\undefined    \gdef\putwordDefopt{User Option}\fi
  160 \ifx\putwordDeffunc\undefined   \gdef\putwordDeffunc{Function}\fi
  161 
  162 % Give the space character the catcode for a space.
  163 \def\spaceisspace{\catcode`\ =10\relax}
  164 
  165 % Likewise for ^^M, the end of line character.
  166 \def\endlineisspace{\catcode13=10\relax}
  167 
  168 \chardef\dashChar  = `\-
  169 \chardef\slashChar = `\/
  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 % Sometimes it is convenient to have everything in the transcript file
  192 % and nothing on the terminal.  We don't just call \tracingall here,
  193 % since that produces some useless output on the terminal.  We also make
  194 % some effort to order the tracing commands to reduce output in the log
  195 % file; cf. trace.sty in LaTeX.
  196 %
  197 \def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
  198 \def\loggingall{%
  199   \tracingstats2
  200   \tracingpages1
  201   \tracinglostchars2  % 2 gives us more in etex
  202   \tracingparagraphs1
  203   \tracingoutput1
  204   \tracingmacros2
  205   \tracingrestores1
  206   \showboxbreadth\maxdimen \showboxdepth\maxdimen
  207   \ifx\eTeXversion\thisisundefined\else % etex gives us more logging
  208     \tracingscantokens1
  209     \tracingifs1
  210     \tracinggroups1
  211     \tracingnesting2
  212     \tracingassigns1
  213   \fi
  214   \tracingcommands3  % 3 gives us more in etex
  215   \errorcontextlines16
  216 }%
  217 
  218 % @errormsg{MSG}.  Do the index-like expansions on MSG, but if things
  219 % aren't perfect, it's not the end of the world, being an error message,
  220 % after all.
  221 %
  222 \def\errormsg{\begingroup \indexnofonts \doerrormsg}
  223 \def\doerrormsg#1{\errmessage{#1}}
  224 
  225 % add check for \lastpenalty to plain's definitions.  If the last thing
  226 % we did was a \nobreak, we don't want to insert more space.
  227 %
  228 \def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount
  229   \removelastskip\penalty-50\smallskip\fi\fi}
  230 \def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount
  231   \removelastskip\penalty-100\medskip\fi\fi}
  232 \def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount
  233   \removelastskip\penalty-200\bigskip\fi\fi}
  234 
  235 % Output routine
  236 %
  237 
  238 % For a final copy, take out the rectangles
  239 % that mark overfull boxes (in case you have decided
  240 % that the text looks ok even though it passes the margin).
  241 %
  242 \def\finalout{\overfullrule=0pt }
  243 
  244 \newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
  245 \newdimen\topandbottommargin \topandbottommargin=.75in
  246 
  247 % Output a mark which sets \thischapter, \thissection and \thiscolor.
  248 % We dump everything together because we only have one kind of mark.
  249 % This works because we only use \botmark / \topmark, not \firstmark.
  250 %
  251 % A mark contains a subexpression of the \ifcase ... \fi construct.
  252 % \get*marks macros below extract the needed part using \ifcase.
  253 %
  254 % Another complication is to let the user choose whether \thischapter
  255 % (\thissection) refers to the chapter (section) in effect at the top
  256 % of a page, or that at the bottom of a page.
  257 
  258 % \domark is called twice inside \chapmacro, to add one
  259 % mark before the section break, and one after.
  260 %   In the second call \prevchapterdefs is the same as \currentchapterdefs,
  261 % and \prevsectiondefs is the same as \currentsectiondefs.
  262 %   Then if the page is not broken at the mark, some of the previous
  263 % section appears on the page, and we can get the name of this section
  264 % from \firstmark for @everyheadingmarks top.
  265 %   @everyheadingmarks bottom uses \botmark.
  266 %
  267 % See page 260 of The TeXbook.
  268 \def\domark{%
  269   \toks0=\expandafter{\currentchapterdefs}%
  270   \toks2=\expandafter{\currentsectiondefs}%
  271   \toks4=\expandafter{\prevchapterdefs}%
  272   \toks6=\expandafter{\prevsectiondefs}%
  273   \toks8=\expandafter{\currentcolordefs}%
  274   \mark{%
  275                    \the\toks0 \the\toks2  % 0: marks for @everyheadingmarks top
  276       \noexpand\or \the\toks4 \the\toks6  % 1: for @everyheadingmarks bottom
  277     \noexpand\else \the\toks8             % 2: color marks
  278   }%
  279 }
  280 
  281 % \gettopheadingmarks, \getbottomheadingmarks,
  282 % \getcolormarks - extract needed part of mark.
  283 %
  284 % \topmark doesn't work for the very first chapter (after the title
  285 % page or the contents), so we use \firstmark there -- this gets us
  286 % the mark with the chapter defs, unless the user sneaks in, e.g.,
  287 % @setcolor (or @url, or @link, etc.) between @contents and the very
  288 % first @chapter.
  289 \def\gettopheadingmarks{%
  290   \ifcase0\the\savedtopmark\fi
  291   \ifx\thischapter\empty \ifcase0\firstmark\fi \fi
  292 }
  293 \def\getbottomheadingmarks{\ifcase1\botmark\fi}
  294 \def\getcolormarks{\ifcase2\the\savedtopmark\fi}
  295 
  296 % Avoid "undefined control sequence" errors.
  297 \def\currentchapterdefs{}
  298 \def\currentsectiondefs{}
  299 \def\currentsection{}
  300 \def\prevchapterdefs{}
  301 \def\prevsectiondefs{}
  302 \def\currentcolordefs{}
  303 
  304 % Margin to add to right of even pages, to left of odd pages.
  305 \newdimen\bindingoffset
  306 \newdimen\normaloffset
  307 \newdimen\txipagewidth \newdimen\txipageheight
  308 
  309 % Main output routine.
  310 %
  311 \chardef\PAGE = 255
  312 \newtoks\defaultoutput
  313 \defaultoutput = {\savetopmark\onepageout{\pagecontents\PAGE}}
  314 \output=\expandafter{\the\defaultoutput}
  315 
  316 \newbox\headlinebox
  317 \newbox\footlinebox
  318 
  319 % When outputting the double column layout for indices, an output routine
  320 % is run several times, which hides the original value of \topmark.  This
  321 % can lead to a page heading being output and duplicating the chapter heading
  322 % of the index.  Hence, save the contents of \topmark at the beginning of
  323 % the output routine.  The saved contents are valid until we actually
  324 % \shipout a page.
  325 %
  326 % (We used to run a short output routine to actually set \topmark and
  327 % \firstmark to the right values, but if this was called with an empty page
  328 % containing whatsits for writing index entries, the whatsits would be thrown
  329 % away and the index auxiliary file would remain empty.)
  330 %
  331 \newtoks\savedtopmark
  332 \newif\iftopmarksaved
  333 \topmarksavedtrue
  334 \def\savetopmark{%
  335   \iftopmarksaved\else
  336     \global\savedtopmark=\expandafter{\topmark}%
  337     \global\topmarksavedtrue
  338   \fi
  339 }
  340 
  341 % \onepageout takes a vbox as an argument.
  342 % \shipout a vbox for a single page, adding an optional header, footer
  343 % and footnote.  This also causes index entries for this page to be written
  344 % to the auxiliary files.
  345 %
  346 \def\onepageout#1{%
  347   \hoffset=\normaloffset
  348   %
  349   \ifodd\pageno  \advance\hoffset by \bindingoffset
  350   \else \advance\hoffset by -\bindingoffset\fi
  351   %
  352   % Retrieve the information for the headings from the marks in the page,
  353   % and call Plain TeX's \makeheadline and \makefootline, which use the
  354   % values in \headline and \footline.
  355   %
  356   % This is used to check if we are on the first page of a chapter.
  357   \ifcase1\the\savedtopmark\fi
  358   \let\prevchaptername\thischaptername
  359   \ifcase0\firstmark\fi
  360   \let\curchaptername\thischaptername
  361   %
  362   \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi
  363   %
  364   \ifx\curchaptername\prevchaptername
  365     \let\thischapterheading\thischapter
  366   \else
  367     % \thischapterheading is the same as \thischapter except it is blank
  368     % for the first page of a chapter.  This is to prevent the chapter name
  369     % being shown twice.
  370     \def\thischapterheading{}%
  371   \fi
  372   %
  373   % Common context changes for both heading and footing.
  374   % Do this outside of the \shipout so @code etc. will be expanded in
  375   % the headline as they should be, not taken literally (outputting ''code).
  376   \def\commonheadfootline{\let\hsize=\txipagewidth \texinfochars}
  377   %
  378   \global\setbox\headlinebox = \vbox{\commonheadfootline \makeheadline}%
  379   %
  380   \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi
  381   \global\setbox\footlinebox = \vbox{\commonheadfootline \makefootline}%
  382   %
  383   {%
  384     % Set context for writing to auxiliary files like index files.
  385     % Have to do this stuff outside the \shipout because we want it to
  386     % take effect in \write's, yet the group defined by the \vbox ends
  387     % before the \shipout runs.
  388     %
  389     \atdummies         % don't expand commands in the output.
  390     \turnoffactive
  391     \shipout\vbox{%
  392       % Do this early so pdf references go to the beginning of the page.
  393       \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi
  394       %
  395       \unvbox\headlinebox
  396       \pagebody{#1}%
  397       \ifdim\ht\footlinebox > 0pt
  398         % Only leave this space if the footline is nonempty.
  399         % (We lessened \vsize for it in \oddfootingyyy.)
  400         % The \baselineskip=24pt in plain's \makefootline has no effect.
  401         \vskip 24pt
  402         \unvbox\footlinebox
  403       \fi
  404       %
  405     }%
  406   }%
  407   \global\topmarksavedfalse
  408   \advancepageno
  409   \ifnum\outputpenalty>-20000 \else\dosupereject\fi
  410 }
  411 
  412 \newinsert\margin \dimen\margin=\maxdimen
  413 
  414 % Main part of page, including any footnotes
  415 \def\pagebody#1{\vbox to\txipageheight{\boxmaxdepth=\maxdepth #1}}
  416 {\catcode`\@ =11
  417 \gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
  418 % marginal hacks, juha@viisa.uucp (Juha Takala)
  419 \ifvoid\margin\else % marginal info is present
  420   \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi
  421 \dimen@=\dp#1\relax \unvbox#1\relax
  422 \ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
  423 \ifr@ggedbottom \kern-\dimen@ \vfil \fi}
  424 }
  425 
  426 
  427 % Argument parsing
  428 
  429 % Parse an argument, then pass it to #1.  The argument is the rest of
  430 % the input line (except we remove a trailing comment).  #1 should be a
  431 % macro which expects an ordinary undelimited TeX argument.
  432 % For example, \def\foo{\parsearg\fooxxx}.
  433 %
  434 \def\parsearg{\parseargusing{}}
  435 \def\parseargusing#1#2{%
  436   \def\argtorun{#2}%
  437   \begingroup
  438     \obeylines
  439     \spaceisspace
  440     #1%
  441     \parseargline\empty% Insert the \empty token, see \finishparsearg below.
  442 }
  443 
  444 {\obeylines %
  445   \gdef\parseargline#1^^M{%
  446     \endgroup % End of the group started in \parsearg.
  447     \argremovecomment #1\comment\ArgTerm%
  448   }%
  449 }
  450 
  451 % First remove any @comment, then any @c comment.  Pass the result on to
  452 % \argcheckspaces.
  453 \def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm}
  454 \def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm}
  455 
  456 % Each occurrence of `\^^M' or `<space>\^^M' is replaced by a single space.
  457 %
  458 % \argremovec might leave us with trailing space, e.g.,
  459 %    @end itemize  @c foo
  460 % This space token undergoes the same procedure and is eventually removed
  461 % by \finishparsearg.
  462 %
  463 \def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M}
  464 \def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M}
  465 \def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{%
  466   \def\temp{#3}%
  467   \ifx\temp\empty
  468     % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp:
  469     \let\temp\finishparsearg
  470   \else
  471     \let\temp\argcheckspaces
  472   \fi
  473   % Put the space token in:
  474   \temp#1 #3\ArgTerm
  475 }
  476 
  477 % If a _delimited_ argument is enclosed in braces, they get stripped; so
  478 % to get _exactly_ the rest of the line, we had to prevent such situation.
  479 % We prepended an \empty token at the very beginning and we expand it now,
  480 % just before passing the control to \argtorun.
  481 % (Similarly, we have to think about #3 of \argcheckspacesY above: it is
  482 % either the null string, or it ends with \^^M---thus there is no danger
  483 % that a pair of braces would be stripped.
  484 %
  485 % But first, we have to remove the trailing space token.
  486 %
  487 \def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}}
  488 
  489 
  490 % \parseargdef - define a command taking an argument on the line
  491 %
  492 % \parseargdef\foo{...}
  493 %   is roughly equivalent to
  494 % \def\foo{\parsearg\Xfoo}
  495 % \def\Xfoo#1{...}
  496 \def\parseargdef#1{%
  497   \expandafter \doparseargdef \csname\string#1\endcsname #1%
  498 }
  499 \def\doparseargdef#1#2{%
  500   \def#2{\parsearg#1}%
  501   \def#1##1%
  502 }
  503 
  504 % Several utility definitions with active space:
  505 {
  506   \obeyspaces
  507   \gdef\obeyedspace{ }
  508 
  509   % Make each space character in the input produce a normal interword
  510   % space in the output.  Don't allow a line break at this space, as this
  511   % is used only in environments like @example, where each line of input
  512   % should produce a line of output anyway.
  513   %
  514   \gdef\sepspaces{\obeyspaces\let =\tie}
  515 
  516   % If an index command is used in an @example environment, any spaces
  517   % therein should become regular spaces in the raw index file, not the
  518   % expansion of \tie (\leavevmode \penalty \@M \ ).
  519   \gdef\unsepspaces{\let =\space}
  520 }
  521 
  522 
  523 \def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
  524 
  525 % Define the framework for environments in texinfo.tex.  It's used like this:
  526 %
  527 %   \envdef\foo{...}
  528 %   \def\Efoo{...}
  529 %
  530 % It's the responsibility of \envdef to insert \begingroup before the
  531 % actual body; @end closes the group after calling \Efoo.  \envdef also
  532 % defines \thisenv, so the current environment is known; @end checks
  533 % whether the environment name matches.  The \checkenv macro can also be
  534 % used to check whether the current environment is the one expected.
  535 %
  536 % Non-false conditionals (@iftex, @ifset) don't fit into this, so they
  537 % are not treated as environments; they don't open a group.  (The
  538 % implementation of @end takes care not to call \endgroup in this
  539 % special case.)
  540 
  541 
  542 % At run-time, environments start with this:
  543 \def\startenvironment#1{\begingroup\def\thisenv{#1}}
  544 % initialize
  545 \let\thisenv\empty
  546 
  547 % ... but they get defined via ``\envdef\foo{...}'':
  548 \long\def\envdef#1#2{\def#1{\startenvironment#1#2}}
  549 \def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}}
  550 
  551 % Check whether we're in the right environment:
  552 \def\checkenv#1{%
  553   \def\temp{#1}%
  554   \ifx\thisenv\temp
  555   \else
  556     \badenverr
  557   \fi
  558 }
  559 
  560 % Environment mismatch, #1 expected:
  561 \def\badenverr{%
  562   \errhelp = \EMsimple
  563   \errmessage{This command can appear only \inenvironment\temp,
  564     not \inenvironment\thisenv}%
  565 }
  566 \def\inenvironment#1{%
  567   \ifx#1\empty
  568     outside of any environment%
  569   \else
  570     in environment \expandafter\string#1%
  571   \fi
  572 }
  573 
  574 % @end foo executes the definition of \Efoo.
  575 % But first, it executes a specialized version of \checkenv
  576 %
  577 \parseargdef\end{%
  578   \if 1\csname iscond.#1\endcsname
  579   \else
  580     % The general wording of \badenverr may not be ideal.
  581     \expandafter\checkenv\csname#1\endcsname
  582     \csname E#1\endcsname
  583     \endgroup
  584   \fi
  585 }
  586 
  587 \newhelp\EMsimple{Press RETURN to continue.}
  588 
  589 
  590 % Be sure we're in horizontal mode when doing a tie, since we make space
  591 % equivalent to this in @example-like environments. Otherwise, a space
  592 % at the beginning of a line will start with \penalty -- and
  593 % since \penalty is valid in vertical mode, we'd end up putting the
  594 % penalty on the vertical list instead of in the new paragraph.
  595 {\catcode`@ = 11
  596  % Avoid using \@M directly, because that causes trouble
  597  % if the definition is written into an index file.
  598  \global\let\tiepenalty = \@M
  599  \gdef\tie{\leavevmode\penalty\tiepenalty\ }
  600 }
  601 
  602 % @: forces normal size whitespace following.
  603 \def\:{\spacefactor=1000 }
  604 
  605 % @* forces a line break.
  606 \def\*{\unskip\hfil\break\hbox{}\ignorespaces}
  607 
  608 % @/ allows a line break.
  609 \let\/=\allowbreak
  610 
  611 % @. is an end-of-sentence period.
  612 \def\.{.\spacefactor=\endofsentencespacefactor\space}
  613 
  614 % @! is an end-of-sentence bang.
  615 \def\!{!\spacefactor=\endofsentencespacefactor\space}
  616 
  617 % @? is an end-of-sentence query.
  618 \def\?{?\spacefactor=\endofsentencespacefactor\space}
  619 
  620 % @frenchspacing on|off  says whether to put extra space after punctuation.
  621 %
  622 \def\onword{on}
  623 \def\offword{off}
  624 %
  625 \parseargdef\frenchspacing{%
  626   \def\temp{#1}%
  627   \ifx\temp\onword \plainfrenchspacing
  628   \else\ifx\temp\offword \plainnonfrenchspacing
  629   \else
  630     \errhelp = \EMsimple
  631     \errmessage{Unknown @frenchspacing option `\temp', must be on|off}%
  632   \fi\fi
  633 }
  634 
  635 % @w prevents a word break.  Without the \leavevmode, @w at the
  636 % beginning of a paragraph, when TeX is still in vertical mode, would
  637 % produce a whole line of output instead of starting the paragraph.
  638 \def\w#1{\leavevmode\hbox{#1}}
  639 
  640 % @group ... @end group forces ... to be all on one page, by enclosing
  641 % it in a TeX vbox.  We use \vtop instead of \vbox to construct the box
  642 % to keep its height that of a normal line.  According to the rules for
  643 % \topskip (p.114 of the TeXbook), the glue inserted is
  644 % max (\topskip - \ht (first item), 0).  If that height is large,
  645 % therefore, no glue is inserted, and the space between the headline and
  646 % the text is small, which looks bad.
  647 %
  648 % Another complication is that the group might be very large.  This can
  649 % cause the glue on the previous page to be unduly stretched, because it
  650 % does not have much material.  In this case, it's better to add an
  651 % explicit \vfill so that the extra space is at the bottom.  The
  652 % threshold for doing this is if the group is more than \vfilllimit
  653 % percent of a page (\vfilllimit can be changed inside of @tex).
  654 %
  655 \newbox\groupbox
  656 \def\vfilllimit{0.7}
  657 %
  658 \envdef\group{%
  659   \ifnum\catcode`\^^M=\active \else
  660     \errhelp = \groupinvalidhelp
  661     \errmessage{@group invalid in context where filling is enabled}%
  662   \fi
  663   \startsavinginserts
  664   %
  665   \setbox\groupbox = \vtop\bgroup
  666     % Do @comment since we are called inside an environment such as
  667     % @example, where each end-of-line in the input causes an
  668     % end-of-line in the output.  We don't want the end-of-line after
  669     % the `@group' to put extra space in the output.  Since @group
  670     % should appear on a line by itself (according to the Texinfo
  671     % manual), we don't worry about eating any user text.
  672     \comment
  673 }
  674 %
  675 % The \vtop produces a box with normal height and large depth; thus, TeX puts
  676 % \baselineskip glue before it, and (when the next line of text is done)
  677 % \lineskip glue after it.  Thus, space below is not quite equal to space
  678 % above.  But it's pretty close.
  679 \def\Egroup{%
  680     % To get correct interline space between the last line of the group
  681     % and the first line afterwards, we have to propagate \prevdepth.
  682     \endgraf % Not \par, as it may have been set to \lisppar.
  683     \global\dimen1 = \prevdepth
  684   \egroup           % End the \vtop.
  685   \addgroupbox
  686   \prevdepth = \dimen1
  687   \checkinserts
  688 }
  689 
  690 \def\addgroupbox{
  691   % \dimen0 is the vertical size of the group's box.
  692   \dimen0 = \ht\groupbox  \advance\dimen0 by \dp\groupbox
  693   % \dimen2 is how much space is left on the page (more or less).
  694   \dimen2 = \txipageheight   \advance\dimen2 by -\pagetotal
  695   % if the group doesn't fit on the current page, and it's a big big
  696   % group, force a page break.
  697   \ifdim \dimen0 > \dimen2
  698     \ifdim \pagetotal < \vfilllimit\txipageheight
  699       \page
  700     \fi
  701   \fi
  702   \box\groupbox
  703 }
  704 
  705 %
  706 % TeX puts in an \escapechar (i.e., `@') at the beginning of the help
  707 % message, so this ends up printing `@group can only ...'.
  708 %
  709 \newhelp\groupinvalidhelp{%
  710 group can only be used in environments such as @example,^^J%
  711 where each line of input produces a line of output.}
  712 
  713 % @need space-in-mils
  714 % forces a page break if there is not space-in-mils remaining.
  715 
  716 \newdimen\mil  \mil=0.001in
  717 
  718 \parseargdef\need{%
  719   % Ensure vertical mode, so we don't make a big box in the middle of a
  720   % paragraph.
  721   \par
  722   %
  723   % If the @need value is less than one line space, it's useless.
  724   \dimen0 = #1\mil
  725   \dimen2 = \ht\strutbox
  726   \advance\dimen2 by \dp\strutbox
  727   \ifdim\dimen0 > \dimen2
  728     %
  729     % Do a \strut just to make the height of this box be normal, so the
  730     % normal leading is inserted relative to the preceding line.
  731     % And a page break here is fine.
  732     \vtop to #1\mil{\strut\vfil}%
  733     %
  734     % TeX does not even consider page breaks if a penalty added to the
  735     % main vertical list is 10000 or more.  But in order to see if the
  736     % empty box we just added fits on the page, we must make it consider
  737     % page breaks.  On the other hand, we don't want to actually break the
  738     % page after the empty box.  So we use a penalty of 9999.
  739     %
  740     % There is an extremely small chance that TeX will actually break the
  741     % page at this \penalty, if there are no other feasible breakpoints in
  742     % sight.  (If the user is using lots of big @group commands, which
  743     % almost-but-not-quite fill up a page, TeX will have a hard time doing
  744     % good page breaking, for example.)  However, I could not construct an
  745     % example where a page broke at this \penalty; if it happens in a real
  746     % document, then we can reconsider our strategy.
  747     \penalty9999
  748     %
  749     % Back up by the size of the box, whether we did a page break or not.
  750     \kern -#1\mil
  751     %
  752     % Do not allow a page break right after this kern.
  753     \nobreak
  754   \fi
  755 }
  756 
  757 % @br   forces paragraph break (and is undocumented).
  758 
  759 \let\br = \par
  760 
  761 % @page forces the start of a new page.
  762 %
  763 \def\page{\par\vfill\supereject}
  764 
  765 % @exdent text....
  766 % outputs text on separate line in roman font, starting at standard page margin
  767 
  768 % This records the amount of indent in the innermost environment.
  769 % That's how much \exdent should take out.
  770 \newskip\exdentamount
  771 
  772 % This defn is used inside fill environments such as @defun.
  773 \parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}
  774 
  775 % This defn is used inside nofill environments such as @example.
  776 \parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount
  777   \leftline{\hskip\leftskip{\rm#1}}}}
  778 
  779 % @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
  780 % paragraph.  For more general purposes, use the \margin insertion
  781 % class.  WHICH is `l' or `r'.  Not documented, written for gawk manual.
  782 %
  783 \newskip\inmarginspacing \inmarginspacing=1cm
  784 \def\strutdepth{\dp\strutbox}
  785 %
  786 \def\doinmargin#1#2{\strut\vadjust{%
  787   \nobreak
  788   \kern-\strutdepth
  789   \vtop to \strutdepth{%
  790     \baselineskip=\strutdepth
  791     \vss
  792     % if you have multiple lines of stuff to put here, you'll need to
  793     % make the vbox yourself of the appropriate size.
  794     \ifx#1l%
  795       \llap{\ignorespaces #2\hskip\inmarginspacing}%
  796     \else
  797       \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}%
  798     \fi
  799     \null
  800   }%
  801 }}
  802 \def\inleftmargin{\doinmargin l}
  803 \def\inrightmargin{\doinmargin r}
  804 %
  805 % @inmargin{TEXT [, RIGHT-TEXT]}
  806 % (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right;
  807 % else use TEXT for both).
  808 %
  809 \def\inmargin#1{\parseinmargin #1,,\finish}
  810 \def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing.
  811   \setbox0 = \hbox{\ignorespaces #2}%
  812   \ifdim\wd0 > 0pt
  813     \def\lefttext{#1}%  have both texts
  814     \def\righttext{#2}%
  815   \else
  816     \def\lefttext{#1}%  have only one text
  817     \def\righttext{#1}%
  818   \fi
  819   %
  820   \ifodd\pageno
  821     \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin
  822   \else
  823     \def\temp{\inleftmargin\lefttext}%
  824   \fi
  825   \temp
  826 }
  827 
  828 % @include FILE -- \input text of FILE.
  829 %
  830 \def\include{\parseargusing\filenamecatcodes\includezzz}
  831 \def\includezzz#1{%
  832   \pushthisfilestack
  833   \def\thisfile{#1}%
  834   {%
  835     \makevalueexpandable  % we want to expand any @value in FILE.
  836     \turnoffactive        % and allow special characters in the expansion
  837     \indexnofonts         % Allow `@@' and other weird things in file names.
  838     \wlog{texinfo.tex: doing @include of #1^^J}%
  839     \edef\temp{\noexpand\input #1 }%
  840     %
  841     % This trickery is to read FILE outside of a group, in case it makes
  842     % definitions, etc.
  843     \expandafter
  844   }\temp
  845   \popthisfilestack
  846 }
  847 \def\filenamecatcodes{%
  848   \catcode`\\=\other
  849   \catcode`~=\other
  850   \catcode`^=\other
  851   \catcode`_=\other
  852   \catcode`|=\other
  853   \catcode`<=\other
  854   \catcode`>=\other
  855   \catcode`+=\other
  856   \catcode`-=\other
  857   \catcode`\`=\other
  858   \catcode`\'=\other
  859 }
  860 
  861 \def\pushthisfilestack{%
  862   \expandafter\pushthisfilestackX\popthisfilestack\StackTerm
  863 }
  864 \def\pushthisfilestackX{%
  865   \expandafter\pushthisfilestackY\thisfile\StackTerm
  866 }
  867 \def\pushthisfilestackY #1\StackTerm #2\StackTerm {%
  868   \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}%
  869 }
  870 
  871 \def\popthisfilestack{\errthisfilestackempty}
  872 \def\errthisfilestackempty{\errmessage{Internal error:
  873   the stack of filenames is empty.}}
  874 %
  875 \def\thisfile{}
  876 
  877 % @center line
  878 % outputs that line, centered.
  879 %
  880 \parseargdef\center{%
  881   \ifhmode
  882     \let\centersub\centerH
  883   \else
  884     \let\centersub\centerV
  885   \fi
  886   \centersub{\hfil \ignorespaces#1\unskip \hfil}%
  887   \let\centersub\relax % don't let the definition persist, just in case
  888 }
  889 \def\centerH#1{{%
  890   \hfil\break
  891   \advance\hsize by -\leftskip
  892   \advance\hsize by -\rightskip
  893   \line{#1}%
  894   \break
  895 }}
  896 %
  897 \newcount\centerpenalty
  898 \def\centerV#1{%
  899   % The idea here is the same as in \startdefun, \cartouche, etc.: if
  900   % @center is the first thing after a section heading, we need to wipe
  901   % out the negative parskip inserted by \sectionheading, but still
  902   % prevent a page break here.
  903   \centerpenalty = \lastpenalty
  904   \ifnum\centerpenalty>10000 \vskip\parskip \fi
  905   \ifnum\centerpenalty>9999 \penalty\centerpenalty \fi
  906   \line{\kern\leftskip #1\kern\rightskip}%
  907 }
  908 
  909 % @sp n   outputs n lines of vertical space
  910 %
  911 \parseargdef\sp{\vskip #1\baselineskip}
  912 
  913 % @comment ...line which is ignored...
  914 % @c is the same as @comment
  915 % @ignore ... @end ignore  is another way to write a comment
  916 
  917 
  918 \def\c{\begingroup \catcode`\^^M=\active%
  919 \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
  920 \cxxx}
  921 {\catcode`\^^M=\active \gdef\cxxx#1^^M{\endgroup}}
  922 %
  923 \let\comment\c
  924 
  925 % @paragraphindent NCHARS
  926 % We'll use ems for NCHARS, close enough.
  927 % NCHARS can also be the word `asis' or `none'.
  928 % We cannot feasibly implement @paragraphindent asis, though.
  929 %
  930 \def\asisword{asis} % no translation, these are keywords
  931 \def\noneword{none}
  932 %
  933 \parseargdef\paragraphindent{%
  934   \def\temp{#1}%
  935   \ifx\temp\asisword
  936   \else
  937     \ifx\temp\noneword
  938       \defaultparindent = 0pt
  939     \else
  940       \defaultparindent = #1em
  941     \fi
  942   \fi
  943   \parindent = \defaultparindent
  944 }
  945 
  946 % @exampleindent NCHARS
  947 % We'll use ems for NCHARS like @paragraphindent.
  948 % It seems @exampleindent asis isn't necessary, but
  949 % I preserve it to make it similar to @paragraphindent.
  950 \parseargdef\exampleindent{%
  951   \def\temp{#1}%
  952   \ifx\temp\asisword
  953   \else
  954     \ifx\temp\noneword
  955       \lispnarrowing = 0pt
  956     \else
  957       \lispnarrowing = #1em
  958     \fi
  959   \fi
  960 }
  961 
  962 % @firstparagraphindent WORD
  963 % If WORD is `none', then suppress indentation of the first paragraph
  964 % after a section heading.  If WORD is `insert', then do indent at such
  965 % paragraphs.
  966 %
  967 % The paragraph indentation is suppressed or not by calling
  968 % \suppressfirstparagraphindent, which the sectioning commands do.
  969 % We switch the definition of this back and forth according to WORD.
  970 % By default, we suppress indentation.
  971 %
  972 \def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent}
  973 \def\insertword{insert}
  974 %
  975 \parseargdef\firstparagraphindent{%
  976   \def\temp{#1}%
  977   \ifx\temp\noneword
  978     \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent
  979   \else\ifx\temp\insertword
  980     \let\suppressfirstparagraphindent = \relax
  981   \else
  982     \errhelp = \EMsimple
  983     \errmessage{Unknown @firstparagraphindent option `\temp'}%
  984   \fi\fi
  985 }
  986 
  987 % Here is how we actually suppress indentation.  Redefine \everypar to
  988 % \kern backwards by \parindent, and then reset itself to empty.
  989 %
  990 % We also make \indent itself not actually do anything until the next
  991 % paragraph.
  992 %
  993 \gdef\dosuppressfirstparagraphindent{%
  994   \gdef\indent  {\restorefirstparagraphindent \indent}%
  995   \gdef\noindent{\restorefirstparagraphindent \noindent}%
  996   \global\everypar = {\kern -\parindent \restorefirstparagraphindent}%
  997 }
  998 %
  999 \gdef\restorefirstparagraphindent{%
 1000   \global\let\indent = \ptexindent
 1001   \global\let\noindent = \ptexnoindent
 1002   \global\everypar = {}%
 1003 }
 1004 
 1005 
 1006 % @refill is a no-op.
 1007 \let\refill=\relax
 1008 
 1009 % @setfilename INFO-FILENAME - ignored
 1010 \let\setfilename=\comment
 1011 
 1012 % @bye.
 1013 \outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
 1014 
 1015 
 1016 \message{pdf,}
 1017 % adobe `portable' document format
 1018 \newcount\tempnum
 1019 \newcount\lnkcount
 1020 \newtoks\filename
 1021 \newcount\filenamelength
 1022 \newcount\pgn
 1023 \newtoks\toksA
 1024 \newtoks\toksB
 1025 \newtoks\toksC
 1026 \newtoks\toksD
 1027 \newbox\boxA
 1028 \newbox\boxB
 1029 \newcount\countA
 1030 \newif\ifpdf
 1031 \newif\ifpdfmakepagedest
 1032 
 1033 %
 1034 % For LuaTeX
 1035 %
 1036 
 1037 \newif\iftxiuseunicodedestname
 1038 \txiuseunicodedestnamefalse % For pdfTeX etc.
 1039 
 1040 \ifx\luatexversion\thisisundefined
 1041 \else
 1042   % Use Unicode destination names
 1043   \txiuseunicodedestnametrue
 1044   % Escape PDF strings with converting UTF-16 from UTF-8
 1045   \begingroup
 1046     \catcode`\%=12
 1047     \directlua{
 1048       function UTF16oct(str)
 1049         tex.sprint(string.char(0x5c) .. '376' .. string.char(0x5c) .. '377')
 1050         for c in string.utfvalues(str) do
 1051           if c < 0x10000 then
 1052             tex.sprint(
 1053               string.format(string.char(0x5c) .. string.char(0x25) .. '03o' ..
 1054                             string.char(0x5c) .. string.char(0x25) .. '03o',
 1055                             math.floor(c / 256), math.floor(c % 256)))
 1056           else
 1057             c = c - 0x10000
 1058             local c_hi = c / 1024 + 0xd800
 1059             local c_lo = c % 1024 + 0xdc00
 1060             tex.sprint(
 1061               string.format(string.char(0x5c) .. string.char(0x25) .. '03o' ..
 1062                             string.char(0x5c) .. string.char(0x25) .. '03o' ..
 1063                             string.char(0x5c) .. string.char(0x25) .. '03o' ..
 1064                             string.char(0x5c) .. string.char(0x25) .. '03o',
 1065                             math.floor(c_hi / 256), math.floor(c_hi % 256),
 1066                             math.floor(c_lo / 256), math.floor(c_lo % 256)))
 1067           end
 1068         end
 1069       end
 1070     }
 1071   \endgroup
 1072   \def\pdfescapestrutfsixteen#1{\directlua{UTF16oct('\luaescapestring{#1}')}}
 1073   % Escape PDF strings without converting
 1074   \begingroup
 1075     \directlua{
 1076       function PDFescstr(str)
 1077         for c in string.bytes(str) do
 1078           if c <= 0x20 or c >= 0x80 or c == 0x28 or c == 0x29 or c == 0x5c then
 1079             tex.sprint(-2,
 1080               string.format(string.char(0x5c) .. string.char(0x25) .. '03o',
 1081                             c))
 1082           else
 1083             tex.sprint(-2, string.char(c))
 1084           end
 1085         end
 1086       end
 1087     }
 1088     % The -2 in the arguments here gives all the input to TeX catcode 12
 1089     % (other) or 10 (space), preventing undefined control sequence errors. See
 1090     % https://lists.gnu.org/archive/html/bug-texinfo/2019-08/msg00031.html
 1091     %
 1092   \endgroup
 1093   \def\pdfescapestring#1{\directlua{PDFescstr('\luaescapestring{#1}')}}
 1094   \ifnum\luatexversion>84
 1095     % For LuaTeX >= 0.85
 1096     \def\pdfdest{\pdfextension dest}
 1097     \let\pdfoutput\outputmode
 1098     \def\pdfliteral{\pdfextension literal}
 1099     \def\pdfcatalog{\pdfextension catalog}
 1100     \def\pdftexversion{\numexpr\pdffeedback version\relax}
 1101     \let\pdfximage\saveimageresource
 1102     \let\pdfrefximage\useimageresource
 1103     \let\pdflastximage\lastsavedimageresourceindex
 1104     \def\pdfendlink{\pdfextension endlink\relax}
 1105     \def\pdfoutline{\pdfextension outline}
 1106     \def\pdfstartlink{\pdfextension startlink}
 1107     \def\pdffontattr{\pdfextension fontattr}
 1108     \def\pdfobj{\pdfextension obj}
 1109     \def\pdflastobj{\numexpr\pdffeedback lastobj\relax}
 1110     \let\pdfpagewidth\pagewidth
 1111     \let\pdfpageheight\pageheight
 1112     \edef\pdfhorigin{\pdfvariable horigin}
 1113     \edef\pdfvorigin{\pdfvariable vorigin}
 1114   \fi
 1115 \fi
 1116 
 1117 % when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1
 1118 % can be set).  So we test for \relax and 0 as well as being undefined.
 1119 \ifx\pdfoutput\thisisundefined
 1120 \else
 1121   \ifx\pdfoutput\relax
 1122   \else
 1123     \ifcase\pdfoutput
 1124     \else
 1125       \pdftrue
 1126     \fi
 1127   \fi
 1128 \fi
 1129 
 1130 \newif\ifpdforxetex
 1131 \pdforxetexfalse
 1132 \ifpdf
 1133   \pdforxetextrue
 1134 \fi
 1135 \ifx\XeTeXrevision\thisisundefined\else
 1136   \pdforxetextrue
 1137 \fi
 1138 
 1139 
 1140 % PDF uses PostScript string constants for the names of xref targets,
 1141 % for display in the outlines, and in other places.  Thus, we have to
 1142 % double any backslashes.  Otherwise, a name like "\node" will be
 1143 % interpreted as a newline (\n), followed by o, d, e.  Not good.
 1144 %
 1145 % See http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html and
 1146 % related messages.  The final outcome is that it is up to the TeX user
 1147 % to double the backslashes and otherwise make the string valid, so
 1148 % that's what we do.  pdftex 1.30.0 (ca.2005) introduced a primitive to
 1149 % do this reliably, so we use it.
 1150 
 1151 % #1 is a control sequence in which to do the replacements,
 1152 % which we \xdef.
 1153 \def\txiescapepdf#1{%
 1154   \ifx\pdfescapestring\thisisundefined
 1155     % No primitive available; should we give a warning or log?
 1156     % Many times it won't matter.
 1157     \xdef#1{#1}%
 1158   \else
 1159     % The expandable \pdfescapestring primitive escapes parentheses,
 1160     % backslashes, and other special chars.
 1161     \xdef#1{\pdfescapestring{#1}}%
 1162   \fi
 1163 }
 1164 \def\txiescapepdfutfsixteen#1{%
 1165   \ifx\pdfescapestrutfsixteen\thisisundefined
 1166     % No UTF-16 converting macro available.
 1167     \txiescapepdf{#1}%
 1168   \else
 1169     \xdef#1{\pdfescapestrutfsixteen{#1}}%
 1170   \fi
 1171 }
 1172 
 1173 \newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images
 1174 with PDF output, and none of those formats could be found.  (.eps cannot
 1175 be supported due to the design of the PDF format; use regular TeX (DVI
 1176 output) for that.)}
 1177 
 1178 \ifpdf
 1179   %
 1180   % Color manipulation macros using ideas from pdfcolor.tex,
 1181   % except using rgb instead of cmyk; the latter is said to render as a
 1182   % very dark gray on-screen and a very dark halftone in print, instead
 1183   % of actual black. The dark red here is dark enough to print on paper as
 1184   % nearly black, but still distinguishable for online viewing.  We use
 1185   % black by default, though.
 1186   \def\rgbDarkRed{0.50 0.09 0.12}
 1187   \def\rgbBlack{0 0 0}
 1188   %
 1189   % rg sets the color for filling (usual text, etc.);
 1190   % RG sets the color for stroking (thin rules, e.g., normal _'s).
 1191   \def\pdfsetcolor#1{\pdfliteral{#1 rg  #1 RG}}
 1192   %
 1193   % Set color, and create a mark which defines \thiscolor accordingly,
 1194   % so that \makeheadline knows which color to restore.
 1195   \def\setcolor#1{%
 1196     \xdef\currentcolordefs{\gdef\noexpand\thiscolor{#1}}%
 1197     \domark
 1198     \pdfsetcolor{#1}%
 1199   }
 1200   %
 1201   \def\maincolor{\rgbBlack}
 1202   \pdfsetcolor{\maincolor}
 1203   \edef\thiscolor{\maincolor}
 1204   \def\currentcolordefs{}
 1205   %
 1206   \def\makefootline{%
 1207     \baselineskip24pt
 1208     \line{\pdfsetcolor{\maincolor}\the\footline}%
 1209   }
 1210   %
 1211   \def\makeheadline{%
 1212     \vbox to 0pt{%
 1213       \vskip-22.5pt
 1214       \line{%
 1215         \vbox to8.5pt{}%
 1216         % Extract \thiscolor definition from the marks.
 1217         \getcolormarks
 1218         % Typeset the headline with \maincolor, then restore the color.
 1219         \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}%
 1220       }%
 1221       \vss
 1222     }%
 1223     \nointerlineskip
 1224   }
 1225   %
 1226   %
 1227   \pdfcatalog{/PageMode /UseOutlines}
 1228   %
 1229   % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto).
 1230   \def\dopdfimage#1#2#3{%
 1231     \def\pdfimagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}%
 1232     \def\pdfimageheight{#3}\setbox2 = \hbox{\ignorespaces #3}%
 1233     %
 1234     % pdftex (and the PDF format) support .pdf, .png, .jpg (among
 1235     % others).  Let's try in that order, PDF first since if
 1236     % someone has a scalable image, presumably better to use that than a
 1237     % bitmap.
 1238     \let\pdfimgext=\empty
 1239     \begingroup
 1240       \openin 1 #1.pdf \ifeof 1
 1241         \openin 1 #1.PDF \ifeof 1
 1242           \openin 1 #1.png \ifeof 1
 1243             \openin 1 #1.jpg \ifeof 1
 1244               \openin 1 #1.jpeg \ifeof 1
 1245                 \openin 1 #1.JPG \ifeof 1
 1246                   \errhelp = \nopdfimagehelp
 1247                   \errmessage{Could not find image file #1 for pdf}%
 1248                 \else \gdef\pdfimgext{JPG}%
 1249                 \fi
 1250               \else \gdef\pdfimgext{jpeg}%
 1251               \fi
 1252             \else \gdef\pdfimgext{jpg}%
 1253             \fi
 1254           \else \gdef\pdfimgext{png}%
 1255           \fi
 1256         \else \gdef\pdfimgext{PDF}%
 1257         \fi
 1258       \else \gdef\pdfimgext{pdf}%
 1259       \fi
 1260       \closein 1
 1261     \endgroup
 1262     %
 1263     % without \immediate, ancient pdftex seg faults when the same image is
 1264     % included twice.  (Version 3.14159-pre-1.0-unofficial-20010704.)
 1265     \ifnum\pdftexversion < 14
 1266       \immediate\pdfimage
 1267     \else
 1268       \immediate\pdfximage
 1269     \fi
 1270       \ifdim \wd0 >0pt width \pdfimagewidth \fi
 1271       \ifdim \wd2 >0pt height \pdfimageheight \fi
 1272       \ifnum\pdftexversion<13
 1273          #1.\pdfimgext
 1274        \else
 1275          {#1.\pdfimgext}%
 1276        \fi
 1277     \ifnum\pdftexversion < 14 \else
 1278       \pdfrefximage \pdflastximage
 1279     \fi}
 1280   %
 1281   \def\setpdfdestname#1{{%
 1282     % We have to set dummies so commands such as @code, and characters
 1283     % such as \, aren't expanded when present in a section title.
 1284     \indexnofonts
 1285     \makevalueexpandable
 1286     \turnoffactive
 1287     \iftxiuseunicodedestname
 1288       \ifx \declaredencoding \latone
 1289         % Pass through Latin-1 characters.
 1290         % LuaTeX with byte wise I/O converts Latin-1 characters to Unicode.
 1291       \else
 1292         \ifx \declaredencoding \utfeight
 1293           % Pass through Unicode characters.
 1294         \else
 1295           % Use ASCII approximations in destination names.
 1296           \passthroughcharsfalse
 1297         \fi
 1298       \fi
 1299     \else
 1300       % Use ASCII approximations in destination names.
 1301       \passthroughcharsfalse
 1302     \fi
 1303     \def\pdfdestname{#1}%
 1304     \txiescapepdf\pdfdestname
 1305   }}
 1306   %
 1307   \def\setpdfoutlinetext#1{{%
 1308     \indexnofonts
 1309     \makevalueexpandable
 1310     \turnoffactive
 1311     \ifx \declaredencoding \latone
 1312       % The PDF format can use an extended form of Latin-1 in bookmark
 1313       % strings.  See Appendix D of the PDF Reference, Sixth Edition, for
 1314       % the "PDFDocEncoding".
 1315       \passthroughcharstrue
 1316       % Pass through Latin-1 characters.
 1317       %   LuaTeX: Convert to Unicode
 1318       %   pdfTeX: Use Latin-1 as PDFDocEncoding
 1319       \def\pdfoutlinetext{#1}%
 1320     \else
 1321       \ifx \declaredencoding \utfeight
 1322         \ifx\luatexversion\thisisundefined
 1323           % For pdfTeX  with UTF-8.
 1324           % TODO: the PDF format can use UTF-16 in bookmark strings,
 1325           % but the code for this isn't done yet.
 1326           % Use ASCII approximations.
 1327           \passthroughcharsfalse
 1328           \def\pdfoutlinetext{#1}%
 1329         \else
 1330           % For LuaTeX with UTF-8.
 1331           % Pass through Unicode characters for title texts.
 1332           \passthroughcharstrue
 1333           \def\pdfoutlinetext{#1}%
 1334         \fi
 1335       \else
 1336         % For non-Latin-1 or non-UTF-8 encodings.
 1337         % Use ASCII approximations.
 1338         \passthroughcharsfalse
 1339         \def\pdfoutlinetext{#1}%
 1340       \fi
 1341     \fi
 1342     % LuaTeX: Convert to UTF-16
 1343     % pdfTeX: Use Latin-1 as PDFDocEncoding
 1344     \txiescapepdfutfsixteen\pdfoutlinetext
 1345   }}
 1346   %
 1347   \def\pdfmkdest#1{%
 1348     \setpdfdestname{#1}%
 1349     \safewhatsit{\pdfdest name{\pdfdestname} xyz}%
 1350   }
 1351   %
 1352   % used to mark target names; must be expandable.
 1353   \def\pdfmkpgn#1{#1}
 1354   %
 1355   % by default, use black for everything.
 1356   \def\urlcolor{\rgbBlack}
 1357   \def\linkcolor{\rgbBlack}
 1358   \def\endlink{\setcolor{\maincolor}\pdfendlink}
 1359   %
 1360   % Adding outlines to PDF; macros for calculating structure of outlines
 1361   % come from Petr Olsak
 1362   \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
 1363     \else \csname#1\endcsname \fi}
 1364   \def\advancenumber#1{\tempnum=\expnumber{#1}\relax
 1365     \advance\tempnum by 1
 1366     \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
 1367   %
 1368   % #1 is the section text, which is what will be displayed in the
 1369   % outline by the pdf viewer.  #2 is the pdf expression for the number
 1370   % of subentries (or empty, for subsubsections).  #3 is the node text,
 1371   % which might be empty if this toc entry had no corresponding node.
 1372   % #4 is the page number
 1373   %
 1374   \def\dopdfoutline#1#2#3#4{%
 1375     % Generate a link to the node text if that exists; else, use the
 1376     % page number.  We could generate a destination for the section
 1377     % text in the case where a section has no node, but it doesn't
 1378     % seem worth the trouble, since most documents are normally structured.
 1379     \setpdfoutlinetext{#1}
 1380     \setpdfdestname{#3}
 1381     \ifx\pdfdestname\empty
 1382       \def\pdfdestname{#4}%
 1383     \fi
 1384     %
 1385     \pdfoutline goto name{\pdfmkpgn{\pdfdestname}}#2{\pdfoutlinetext}%
 1386   }
 1387   %
 1388   \def\pdfmakeoutlines{%
 1389     \begingroup
 1390       % Read toc silently, to get counts of subentries for \pdfoutline.
 1391       \def\partentry##1##2##3##4{}% ignore parts in the outlines
 1392       \def\numchapentry##1##2##3##4{%
 1393     \def\thischapnum{##2}%
 1394     \def\thissecnum{0}%
 1395     \def\thissubsecnum{0}%
 1396       }%
 1397       \def\numsecentry##1##2##3##4{%
 1398     \advancenumber{chap\thischapnum}%
 1399     \def\thissecnum{##2}%
 1400     \def\thissubsecnum{0}%
 1401       }%
 1402       \def\numsubsecentry##1##2##3##4{%
 1403     \advancenumber{sec\thissecnum}%
 1404     \def\thissubsecnum{##2}%
 1405       }%
 1406       \def\numsubsubsecentry##1##2##3##4{%
 1407     \advancenumber{subsec\thissubsecnum}%
 1408       }%
 1409       \def\thischapnum{0}%
 1410       \def\thissecnum{0}%
 1411       \def\thissubsecnum{0}%
 1412       %
 1413       % use \def rather than \let here because we redefine \chapentry et
 1414       % al. a second time, below.
 1415       \def\appentry{\numchapentry}%
 1416       \def\appsecentry{\numsecentry}%
 1417       \def\appsubsecentry{\numsubsecentry}%
 1418       \def\appsubsubsecentry{\numsubsubsecentry}%
 1419       \def\unnchapentry{\numchapentry}%
 1420       \def\unnsecentry{\numsecentry}%
 1421       \def\unnsubsecentry{\numsubsecentry}%
 1422       \def\unnsubsubsecentry{\numsubsubsecentry}%
 1423       \readdatafile{toc}%
 1424       %
 1425       % Read toc second time, this time actually producing the outlines.
 1426       % The `-' means take the \expnumber as the absolute number of
 1427       % subentries, which we calculated on our first read of the .toc above.
 1428       %
 1429       % We use the node names as the destinations.
 1430       \def\numchapentry##1##2##3##4{%
 1431         \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}%
 1432       \def\numsecentry##1##2##3##4{%
 1433         \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}%
 1434       \def\numsubsecentry##1##2##3##4{%
 1435         \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}%
 1436       \def\numsubsubsecentry##1##2##3##4{% count is always zero
 1437         \dopdfoutline{##1}{}{##3}{##4}}%
 1438       %
 1439       % PDF outlines are displayed using system fonts, instead of
 1440       % document fonts.  Therefore we cannot use special characters,
 1441       % since the encoding is unknown.  For example, the eogonek from
 1442       % Latin 2 (0xea) gets translated to a | character.  Info from
 1443       % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100.
 1444       %
 1445       % TODO this right, we have to translate 8-bit characters to
 1446       % their "best" equivalent, based on the @documentencoding.  Too
 1447       % much work for too little return.  Just use the ASCII equivalents
 1448       % we use for the index sort strings.
 1449       %
 1450       \indexnofonts
 1451       \setupdatafile
 1452       % We can have normal brace characters in the PDF outlines, unlike
 1453       % Texinfo index files.  So set that up.
 1454       \def\{{\lbracecharliteral}%
 1455       \def\}{\rbracecharliteral}%
 1456       \catcode`\\=\active \otherbackslash
 1457       \input \tocreadfilename
 1458     \endgroup
 1459   }
 1460   {\catcode`[=1 \catcode`]=2
 1461    \catcode`{=\other \catcode`}=\other
 1462    \gdef\lbracecharliteral[{]%
 1463    \gdef\rbracecharliteral[}]%
 1464   ]
 1465   %
 1466   \def\skipspaces#1{\def\PP{#1}\def\D{|}%
 1467     \ifx\PP\D\let\nextsp\relax
 1468     \else\let\nextsp\skipspaces
 1469       \addtokens{\filename}{\PP}%
 1470       \advance\filenamelength by 1
 1471     \fi
 1472     \nextsp}
 1473   \def\getfilename#1{%
 1474     \filenamelength=0
 1475     % If we don't expand the argument now, \skipspaces will get
 1476     % snagged on things like "@value{foo}".
 1477     \edef\temp{#1}%
 1478     \expandafter\skipspaces\temp|\relax
 1479   }
 1480   \ifnum\pdftexversion < 14
 1481     \let \startlink \pdfannotlink
 1482   \else
 1483     \let \startlink \pdfstartlink
 1484   \fi
 1485   % make a live url in pdf output.
 1486   \def\pdfurl#1{%
 1487     \begingroup
 1488       % it seems we really need yet another set of dummies; have not
 1489       % tried to figure out what each command should do in the context
 1490       % of @url.  for now, just make @/ a no-op, that's the only one
 1491       % people have actually reported a problem with.
 1492       %
 1493       \normalturnoffactive
 1494       \def\@{@}%
 1495       \let\/=\empty
 1496       \makevalueexpandable
 1497       % do we want to go so far as to use \indexnofonts instead of just
 1498       % special-casing \var here?
 1499       \def\var##1{##1}%
 1500       %
 1501       \leavevmode\setcolor{\urlcolor}%
 1502       \startlink attr{/Border [0 0 0]}%
 1503         user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
 1504     \endgroup}
 1505   % \pdfgettoks - Surround page numbers in #1 with @pdflink.  #1 may
 1506   % be a simple number, or a list of numbers in the case of an index
 1507   % entry.
 1508   \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
 1509   \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
 1510   \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
 1511   \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
 1512   \def\maketoks{%
 1513     \expandafter\poptoks\the\toksA|ENDTOKS|\relax
 1514     \ifx\first0\adn0
 1515     \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
 1516     \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
 1517     \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9
 1518     \else
 1519       \ifnum0=\countA\else\makelink\fi
 1520       \ifx\first.\let\next=\done\else
 1521         \let\next=\maketoks
 1522         \addtokens{\toksB}{\the\toksD}
 1523         \ifx\first,\addtokens{\toksB}{\space}\fi
 1524       \fi
 1525     \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
 1526     \next}
 1527   \def\makelink{\addtokens{\toksB}%
 1528     {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
 1529   \def\pdflink#1{%
 1530     \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}
 1531     \setcolor{\linkcolor}#1\endlink}
 1532   \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
 1533 \else
 1534   % non-pdf mode
 1535   \let\pdfmkdest = \gobble
 1536   \let\pdfurl = \gobble
 1537   \let\endlink = \relax
 1538   \let\setcolor = \gobble
 1539   \let\pdfsetcolor = \gobble
 1540   \let\pdfmakeoutlines = \relax
 1541 \fi  % \ifx\pdfoutput
 1542 
 1543 %
 1544 % For XeTeX
 1545 %
 1546 \ifx\XeTeXrevision\thisisundefined
 1547 \else
 1548   %
 1549   % XeTeX version check
 1550   %
 1551   \ifnum\strcmp{\the\XeTeXversion\XeTeXrevision}{0.99996}>-1
 1552     % TeX Live 2016 contains XeTeX 0.99996 and xdvipdfmx 20160307.
 1553     % It can use the `dvipdfmx:config' special (from TeX Live SVN r40941).
 1554     % For avoiding PDF destination name replacement, we use this special
 1555     % instead of xdvipdfmx's command line option `-C 0x0010'.
 1556     \special{dvipdfmx:config C 0x0010}
 1557     % XeTeX 0.99995+ comes with xdvipdfmx 20160307+.
 1558     % It can handle Unicode destination names for PDF.
 1559     \txiuseunicodedestnametrue
 1560   \else
 1561     % XeTeX < 0.99996 (TeX Live < 2016) cannot use the
 1562     % `dvipdfmx:config' special.
 1563     % So for avoiding PDF destination name replacement,
 1564     % xdvipdfmx's command line option `-C 0x0010' is necessary.
 1565     %
 1566     % XeTeX < 0.99995 can not handle Unicode destination names for PDF
 1567     % because xdvipdfmx 20150315 has a UTF-16 conversion issue.
 1568     % It is fixed by xdvipdfmx 20160106 (TeX Live SVN r39753).
 1569     \txiuseunicodedestnamefalse
 1570   \fi
 1571   %
 1572   % Color support
 1573   %
 1574   \def\rgbDarkRed{0.50 0.09 0.12}
 1575   \def\rgbBlack{0 0 0}
 1576   %
 1577   \def\pdfsetcolor#1{\special{pdf:scolor [#1]}}
 1578   %
 1579   % Set color, and create a mark which defines \thiscolor accordingly,
 1580   % so that \makeheadline knows which color to restore.
 1581   \def\setcolor#1{%
 1582     \xdef\currentcolordefs{\gdef\noexpand\thiscolor{#1}}%
 1583     \domark
 1584     \pdfsetcolor{#1}%
 1585   }
 1586   %
 1587   \def\maincolor{\rgbBlack}
 1588   \pdfsetcolor{\maincolor}
 1589   \edef\thiscolor{\maincolor}
 1590   \def\currentcolordefs{}
 1591   %
 1592   \def\makefootline{%
 1593     \baselineskip24pt
 1594     \line{\pdfsetcolor{\maincolor}\the\footline}%
 1595   }
 1596   %
 1597   \def\makeheadline{%
 1598     \vbox to 0pt{%
 1599       \vskip-22.5pt
 1600       \line{%
 1601         \vbox to8.5pt{}%
 1602         % Extract \thiscolor definition from the marks.
 1603         \getcolormarks
 1604         % Typeset the headline with \maincolor, then restore the color.
 1605         \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}%
 1606       }%
 1607       \vss
 1608     }%
 1609     \nointerlineskip
 1610   }
 1611   %
 1612   % PDF outline support
 1613   %
 1614   % Emulate pdfTeX primitive
 1615   \def\pdfdest name#1 xyz{%
 1616     \special{pdf:dest (#1) [@thispage /XYZ @xpos @ypos null]}%
 1617   }
 1618   %
 1619   \def\setpdfdestname#1{{%
 1620     % We have to set dummies so commands such as @code, and characters
 1621     % such as \, aren't expanded when present in a section title.
 1622     \indexnofonts
 1623     \makevalueexpandable
 1624     \turnoffactive
 1625     \iftxiuseunicodedestname
 1626       % Pass through Unicode characters.
 1627     \else
 1628       % Use ASCII approximations in destination names.
 1629       \passthroughcharsfalse
 1630     \fi
 1631     \def\pdfdestname{#1}%
 1632     \txiescapepdf\pdfdestname
 1633   }}
 1634   %
 1635   \def\setpdfoutlinetext#1{{%
 1636     \turnoffactive
 1637     % Always use Unicode characters in title texts.
 1638     \def\pdfoutlinetext{#1}%
 1639     % For XeTeX, xdvipdfmx converts to UTF-16.
 1640     % So we do not convert.
 1641     \txiescapepdf\pdfoutlinetext
 1642   }}
 1643   %
 1644   \def\pdfmkdest#1{%
 1645     \setpdfdestname{#1}%
 1646     \safewhatsit{\pdfdest name{\pdfdestname} xyz}%
 1647   }
 1648   %
 1649   % by default, use black for everything.
 1650   \def\urlcolor{\rgbBlack}
 1651   \def\linkcolor{\rgbBlack}
 1652   \def\endlink{\setcolor{\maincolor}\pdfendlink}
 1653   %
 1654   \def\dopdfoutline#1#2#3#4{%
 1655     \setpdfoutlinetext{#1}
 1656     \setpdfdestname{#3}
 1657     \ifx\pdfdestname\empty
 1658       \def\pdfdestname{#4}%
 1659     \fi
 1660     %
 1661     \special{pdf:out [-] #2 << /Title (\pdfoutlinetext) /A
 1662       << /S /GoTo /D (\pdfdestname) >> >> }%
 1663   }
 1664   %
 1665   \def\pdfmakeoutlines{%
 1666     \begingroup
 1667       %
 1668       % For XeTeX, counts of subentries are not necessary.
 1669       % Therefore, we read toc only once.
 1670       %
 1671       % We use node names as destinations.
 1672       \def\partentry##1##2##3##4{}% ignore parts in the outlines
 1673       \def\numchapentry##1##2##3##4{%
 1674         \dopdfoutline{##1}{1}{##3}{##4}}%
 1675       \def\numsecentry##1##2##3##4{%
 1676         \dopdfoutline{##1}{2}{##3}{##4}}%
 1677       \def\numsubsecentry##1##2##3##4{%
 1678         \dopdfoutline{##1}{3}{##3}{##4}}%
 1679       \def\numsubsubsecentry##1##2##3##4{%
 1680         \dopdfoutline{##1}{4}{##3}{##4}}%
 1681       %
 1682       \let\appentry\numchapentry%
 1683       \let\appsecentry\numsecentry%
 1684       \let\appsubsecentry\numsubsecentry%
 1685       \let\appsubsubsecentry\numsubsubsecentry%
 1686       \let\unnchapentry\numchapentry%
 1687       \let\unnsecentry\numsecentry%
 1688       \let\unnsubsecentry\numsubsecentry%
 1689       \let\unnsubsubsecentry\numsubsubsecentry%
 1690       %
 1691       % For XeTeX, xdvipdfmx converts strings to UTF-16.
 1692       % Therefore, the encoding and the language may not be considered.
 1693       %
 1694       \indexnofonts
 1695       \setupdatafile
 1696       % We can have normal brace characters in the PDF outlines, unlike
 1697       % Texinfo index files.  So set that up.
 1698       \def\{{\lbracecharliteral}%
 1699       \def\}{\rbracecharliteral}%
 1700       \catcode`\\=\active \otherbackslash
 1701       \input \tocreadfilename
 1702     \endgroup
 1703   }
 1704   {\catcode`[=1 \catcode`]=2
 1705    \catcode`{=\other \catcode`}=\other
 1706    \gdef\lbracecharliteral[{]%
 1707    \gdef\rbracecharliteral[}]%
 1708   ]
 1709 
 1710   \special{pdf:docview << /PageMode /UseOutlines >> }
 1711   % ``\special{pdf:tounicode ...}'' is not necessary
 1712   % because xdvipdfmx converts strings from UTF-8 to UTF-16 without it.
 1713   % However, due to a UTF-16 conversion issue of xdvipdfmx 20150315,
 1714   % ``\special{pdf:dest ...}'' cannot handle non-ASCII strings.
 1715   % It is fixed by xdvipdfmx 20160106 (TeX Live SVN r39753).
 1716 %
 1717   \def\skipspaces#1{\def\PP{#1}\def\D{|}%
 1718     \ifx\PP\D\let\nextsp\relax
 1719     \else\let\nextsp\skipspaces
 1720       \addtokens{\filename}{\PP}%
 1721       \advance\filenamelength by 1
 1722     \fi
 1723     \nextsp}
 1724   \def\getfilename#1{%
 1725     \filenamelength=0
 1726     % If we don't expand the argument now, \skipspaces will get
 1727     % snagged on things like "@value{foo}".
 1728     \edef\temp{#1}%
 1729     \expandafter\skipspaces\temp|\relax
 1730   }
 1731   % make a live url in pdf output.
 1732   \def\pdfurl#1{%
 1733     \begingroup
 1734       % it seems we really need yet another set of dummies; have not
 1735       % tried to figure out what each command should do in the context
 1736       % of @url.  for now, just make @/ a no-op, that's the only one
 1737       % people have actually reported a problem with.
 1738       %
 1739       \normalturnoffactive
 1740       \def\@{@}%
 1741       \let\/=\empty
 1742       \makevalueexpandable
 1743       % do we want to go so far as to use \indexnofonts instead of just
 1744       % special-casing \var here?
 1745       \def\var##1{##1}%
 1746       %
 1747       \leavevmode\setcolor{\urlcolor}%
 1748       \special{pdf:bann << /Border [0 0 0]
 1749         /Subtype /Link /A << /S /URI /URI (#1) >> >>}%
 1750     \endgroup}
 1751   \def\endlink{\setcolor{\maincolor}\special{pdf:eann}}
 1752   \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
 1753   \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
 1754   \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
 1755   \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
 1756   \def\maketoks{%
 1757     \expandafter\poptoks\the\toksA|ENDTOKS|\relax
 1758     \ifx\first0\adn0
 1759     \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
 1760     \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
 1761     \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9
 1762     \else
 1763       \ifnum0=\countA\else\makelink\fi
 1764       \ifx\first.\let\next=\done\else
 1765         \let\next=\maketoks
 1766         \addtokens{\toksB}{\the\toksD}
 1767         \ifx\first,\addtokens{\toksB}{\space}\fi
 1768       \fi
 1769     \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
 1770     \next}
 1771   \def\makelink{\addtokens{\toksB}%
 1772     {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
 1773   \def\pdflink#1{%
 1774     \special{pdf:bann << /Border [0 0 0]
 1775       /Type /Annot /Subtype /Link /A << /S /GoTo /D (#1) >> >>}%
 1776     \setcolor{\linkcolor}#1\endlink}
 1777   \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
 1778 %
 1779   %
 1780   % @image support
 1781   %
 1782   % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto).
 1783   \def\doxeteximage#1#2#3{%
 1784     \def\xeteximagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}%
 1785     \def\xeteximageheight{#3}\setbox2 = \hbox{\ignorespaces #3}%
 1786     %
 1787     % XeTeX (and the PDF format) supports .pdf, .png, .jpg (among
 1788     % others).  Let's try in that order, PDF first since if
 1789     % someone has a scalable image, presumably better to use that than a
 1790     % bitmap.
 1791     \let\xeteximgext=\empty
 1792     \begingroup
 1793       \openin 1 #1.pdf \ifeof 1
 1794         \openin 1 #1.PDF \ifeof 1
 1795           \openin 1 #1.png \ifeof 1
 1796             \openin 1 #1.jpg \ifeof 1
 1797               \openin 1 #1.jpeg \ifeof 1
 1798                 \openin 1 #1.JPG \ifeof 1
 1799                   \errmessage{Could not find image file #1 for XeTeX}%
 1800                 \else \gdef\xeteximgext{JPG}%
 1801                 \fi
 1802               \else \gdef\xeteximgext{jpeg}%
 1803               \fi
 1804             \else \gdef\xeteximgext{jpg}%
 1805             \fi
 1806           \else \gdef\xeteximgext{png}%
 1807           \fi
 1808         \else \gdef\xeteximgext{PDF}%
 1809         \fi
 1810       \else \gdef\xeteximgext{pdf}%
 1811       \fi
 1812       \closein 1
 1813     \endgroup
 1814     %
 1815     \def\xetexpdfext{pdf}%
 1816     \ifx\xeteximgext\xetexpdfext
 1817       \XeTeXpdffile "#1".\xeteximgext ""
 1818     \else
 1819       \def\xetexpdfext{PDF}%
 1820       \ifx\xeteximgext\xetexpdfext
 1821         \XeTeXpdffile "#1".\xeteximgext ""
 1822       \else
 1823         \XeTeXpicfile "#1".\xeteximgext ""
 1824       \fi
 1825     \fi
 1826     \ifdim \wd0 >0pt width \xeteximagewidth \fi
 1827     \ifdim \wd2 >0pt height \xeteximageheight \fi \relax
 1828   }
 1829 \fi
 1830 
 1831 
 1832 %
 1833 \message{fonts,}
 1834 
 1835 % Set the baselineskip to #1, and the lineskip and strut size
 1836 % correspondingly.  There is no deep meaning behind these magic numbers
 1837 % used as factors; they just match (closely enough) what Knuth defined.
 1838 %
 1839 \def\lineskipfactor{.08333}
 1840 \def\strutheightpercent{.70833}
 1841 \def\strutdepthpercent {.29167}
 1842 %
 1843 % can get a sort of poor man's double spacing by redefining this.
 1844 \def\baselinefactor{1}
 1845 %
 1846 \newdimen\textleading
 1847 \def\setleading#1{%
 1848   \dimen0 = #1\relax
 1849   \normalbaselineskip = \baselinefactor\dimen0
 1850   \normallineskip = \lineskipfactor\normalbaselineskip
 1851   \normalbaselines
 1852   \setbox\strutbox =\hbox{%
 1853     \vrule width0pt height\strutheightpercent\baselineskip
 1854                     depth \strutdepthpercent \baselineskip
 1855   }%
 1856 }
 1857 
 1858 % PDF CMaps.  See also LaTeX's t1.cmap.
 1859 %
 1860 % do nothing with this by default.
 1861 \expandafter\let\csname cmapOT1\endcsname\gobble
 1862 \expandafter\let\csname cmapOT1IT\endcsname\gobble
 1863 \expandafter\let\csname cmapOT1TT\endcsname\gobble
 1864 
 1865 % if we are producing pdf, and we have \pdffontattr, then define cmaps.
 1866 % (\pdffontattr was introduced many years ago, but people still run
 1867 % older pdftex's; it's easy to conditionalize, so we do.)
 1868 \ifpdf \ifx\pdffontattr\thisisundefined \else
 1869   \begingroup
 1870     \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
 1871     \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
 1872 %%DocumentNeededResources: ProcSet (CIDInit)
 1873 %%IncludeResource: ProcSet (CIDInit)
 1874 %%BeginResource: CMap (TeX-OT1-0)
 1875 %%Title: (TeX-OT1-0 TeX OT1 0)
 1876 %%Version: 1.000
 1877 %%EndComments
 1878 /CIDInit /ProcSet findresource begin
 1879 12 dict begin
 1880 begincmap
 1881 /CIDSystemInfo
 1882 << /Registry (TeX)
 1883 /Ordering (OT1)
 1884 /Supplement 0
 1885 >> def
 1886 /CMapName /TeX-OT1-0 def
 1887 /CMapType 2 def
 1888 1 begincodespacerange
 1889 <00> <7F>
 1890 endcodespacerange
 1891 8 beginbfrange
 1892 <00> <01> <0393>
 1893 <09> <0A> <03A8>
 1894 <23> <26> <0023>
 1895 <28> <3B> <0028>
 1896 <3F> <5B> <003F>
 1897 <5D> <5E> <005D>
 1898 <61> <7A> <0061>
 1899 <7B> <7C> <2013>
 1900 endbfrange
 1901 40 beginbfchar
 1902 <02> <0398>
 1903 <03> <039B>
 1904 <04> <039E>
 1905 <05> <03A0>
 1906 <06> <03A3>
 1907 <07> <03D2>
 1908 <08> <03A6>
 1909 <0B> <00660066>
 1910 <0C> <00660069>
 1911 <0D> <0066006C>
 1912 <0E> <006600660069>
 1913 <0F> <00660066006C>
 1914 <10> <0131>
 1915 <11> <0237>
 1916 <12> <0060>
 1917 <13> <00B4>
 1918 <14> <02C7>
 1919 <15> <02D8>
 1920 <16> <00AF>
 1921 <17> <02DA>
 1922 <18> <00B8>
 1923 <19> <00DF>
 1924 <1A> <00E6>
 1925 <1B> <0153>
 1926 <1C> <00F8>
 1927 <1D> <00C6>
 1928 <1E> <0152>
 1929 <1F> <00D8>
 1930 <21> <0021>
 1931 <22> <201D>
 1932 <27> <2019>
 1933 <3C> <00A1>
 1934 <3D> <003D>
 1935 <3E> <00BF>
 1936 <5C> <201C>
 1937 <5F> <02D9>
 1938 <60> <2018>
 1939 <7D> <02DD>
 1940 <7E> <007E>
 1941 <7F> <00A8>
 1942 endbfchar
 1943 endcmap
 1944 CMapName currentdict /CMap defineresource pop
 1945 end
 1946 end
 1947 %%EndResource
 1948 %%EOF
 1949     }\endgroup
 1950   \expandafter\edef\csname cmapOT1\endcsname#1{%
 1951     \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
 1952   }%
 1953 %
 1954 % \cmapOT1IT
 1955   \begingroup
 1956     \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
 1957     \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
 1958 %%DocumentNeededResources: ProcSet (CIDInit)
 1959 %%IncludeResource: ProcSet (CIDInit)
 1960 %%BeginResource: CMap (TeX-OT1IT-0)
 1961 %%Title: (TeX-OT1IT-0 TeX OT1IT 0)
 1962 %%Version: 1.000
 1963 %%EndComments
 1964 /CIDInit /ProcSet findresource begin
 1965 12 dict begin
 1966 begincmap
 1967 /CIDSystemInfo
 1968 << /Registry (TeX)
 1969 /Ordering (OT1IT)
 1970 /Supplement 0
 1971 >> def
 1972 /CMapName /TeX-OT1IT-0 def
 1973 /CMapType 2 def
 1974 1 begincodespacerange
 1975 <00> <7F>
 1976 endcodespacerange
 1977 8 beginbfrange
 1978 <00> <01> <0393>
 1979 <09> <0A> <03A8>
 1980 <25> <26> <0025>
 1981 <28> <3B> <0028>
 1982 <3F> <5B> <003F>
 1983 <5D> <5E> <005D>
 1984 <61> <7A> <0061>
 1985 <7B> <7C> <2013>
 1986 endbfrange
 1987 42 beginbfchar
 1988 <02> <0398>
 1989 <03> <039B>
 1990 <04> <039E>
 1991 <05> <03A0>
 1992 <06> <03A3>
 1993 <07> <03D2>
 1994 <08> <03A6>
 1995 <0B> <00660066>
 1996 <0C> <00660069>
 1997 <0D> <0066006C>
 1998 <0E> <006600660069>
 1999 <0F> <00660066006C>
 2000 <10> <0131>
 2001 <11> <0237>
 2002 <12> <0060>
 2003 <13> <00B4>
 2004 <14> <02C7>
 2005 <15> <02D8>
 2006 <16> <00AF>
 2007 <17> <02DA>
 2008 <18> <00B8>
 2009 <19> <00DF>
 2010 <1A> <00E6>
 2011 <1B> <0153>
 2012 <1C> <00F8>
 2013 <1D> <00C6>
 2014 <1E> <0152>
 2015 <1F> <00D8>
 2016 <21> <0021>
 2017 <22> <201D>
 2018 <23> <0023>
 2019 <24> <00A3>
 2020 <27> <2019>
 2021 <3C> <00A1>
 2022 <3D> <003D>
 2023 <3E> <00BF>
 2024 <5C> <201C>
 2025 <5F> <02D9>
 2026 <60> <2018>
 2027 <7D> <02DD>
 2028 <7E> <007E>
 2029 <7F> <00A8>
 2030 endbfchar
 2031 endcmap
 2032 CMapName currentdict /CMap defineresource pop
 2033 end
 2034 end
 2035 %%EndResource
 2036 %%EOF
 2037     }\endgroup
 2038   \expandafter\edef\csname cmapOT1IT\endcsname#1{%
 2039     \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
 2040   }%
 2041 %
 2042 % \cmapOT1TT
 2043   \begingroup
 2044     \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
 2045     \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
 2046 %%DocumentNeededResources: ProcSet (CIDInit)
 2047 %%IncludeResource: ProcSet (CIDInit)
 2048 %%BeginResource: CMap (TeX-OT1TT-0)
 2049 %%Title: (TeX-OT1TT-0 TeX OT1TT 0)
 2050 %%Version: 1.000
 2051 %%EndComments
 2052 /CIDInit /ProcSet findresource begin
 2053 12 dict begin
 2054 begincmap
 2055 /CIDSystemInfo
 2056 << /Registry (TeX)
 2057 /Ordering (OT1TT)
 2058 /Supplement 0
 2059 >> def
 2060 /CMapName /TeX-OT1TT-0 def
 2061 /CMapType 2 def
 2062 1 begincodespacerange
 2063 <00> <7F>
 2064 endcodespacerange
 2065 5 beginbfrange
 2066 <00> <01> <0393>
 2067 <09> <0A> <03A8>
 2068 <21> <26> <0021>
 2069 <28> <5F> <0028>
 2070 <61> <7E> <0061>
 2071 endbfrange
 2072 32 beginbfchar
 2073 <02> <0398>
 2074 <03> <039B>
 2075 <04> <039E>
 2076 <05> <03A0>
 2077 <06> <03A3>
 2078 <07> <03D2>
 2079 <08> <03A6>
 2080 <0B> <2191>
 2081 <0C> <2193>
 2082 <0D> <0027>
 2083 <0E> <00A1>
 2084 <0F> <00BF>
 2085 <10> <0131>
 2086 <11> <0237>
 2087 <12> <0060>
 2088 <13> <00B4>
 2089 <14> <02C7>
 2090 <15> <02D8>
 2091 <16> <00AF>
 2092 <17> <02DA>
 2093 <18> <00B8>
 2094 <19> <00DF>
 2095 <1A> <00E6>
 2096 <1B> <0153>
 2097 <1C> <00F8>
 2098 <1D> <00C6>
 2099 <1E> <0152>
 2100 <1F> <00D8>
 2101 <20> <2423>
 2102 <27> <2019>
 2103 <60> <2018>
 2104 <7F> <00A8>
 2105 endbfchar
 2106 endcmap
 2107 CMapName currentdict /CMap defineresource pop
 2108 end
 2109 end
 2110 %%EndResource
 2111 %%EOF
 2112     }\endgroup
 2113   \expandafter\edef\csname cmapOT1TT\endcsname#1{%
 2114     \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
 2115   }%
 2116 \fi\fi
 2117 
 2118 
 2119 % Set the font macro #1 to the font named \fontprefix#2.
 2120 % #3 is the font's design size, #4 is a scale factor, #5 is the CMap
 2121 % encoding (only OT1, OT1IT and OT1TT are allowed, or empty to omit).
 2122 % Example:
 2123 % #1 = \textrm
 2124 % #2 = \rmshape
 2125 % #3 = 10
 2126 % #4 = \mainmagstep
 2127 % #5 = OT1
 2128 %
 2129 \def\setfont#1#2#3#4#5{%
 2130   \font#1=\fontprefix#2#3 scaled #4
 2131   \csname cmap#5\endcsname#1%
 2132 }
 2133 % This is what gets called when #5 of \setfont is empty.
 2134 \let\cmap\gobble
 2135 %
 2136 % (end of cmaps)
 2137 
 2138 % Use cm as the default font prefix.
 2139 % To specify the font prefix, you must define \fontprefix
 2140 % before you read in texinfo.tex.
 2141 \ifx\fontprefix\thisisundefined
 2142 \def\fontprefix{cm}
 2143 \fi
 2144 % Support font families that don't use the same naming scheme as CM.
 2145 \def\rmshape{r}
 2146 \def\rmbshape{bx}               % where the normal face is bold
 2147 \def\bfshape{b}
 2148 \def\bxshape{bx}
 2149 \def\ttshape{tt}
 2150 \def\ttbshape{tt}
 2151 \def\ttslshape{sltt}
 2152 \def\itshape{ti}
 2153 \def\itbshape{bxti}
 2154 \def\slshape{sl}
 2155 \def\slbshape{bxsl}
 2156 \def\sfshape{ss}
 2157 \def\sfbshape{ss}
 2158 \def\scshape{csc}
 2159 \def\scbshape{csc}
 2160 
 2161 % Definitions for a main text size of 11pt.  (The default in Texinfo.)
 2162 %
 2163 \def\definetextfontsizexi{%
 2164 % Text fonts (11.2pt, magstep1).
 2165 \def\textnominalsize{11pt}
 2166 \edef\mainmagstep{\magstephalf}
 2167 \setfont\textrm\rmshape{10}{\mainmagstep}{OT1}
 2168 \setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT}
 2169 \setfont\textbf\bfshape{10}{\mainmagstep}{OT1}
 2170 \setfont\textit\itshape{10}{\mainmagstep}{OT1IT}
 2171 \setfont\textsl\slshape{10}{\mainmagstep}{OT1}
 2172 \setfont\textsf\sfshape{10}{\mainmagstep}{OT1}
 2173 \setfont\textsc\scshape{10}{\mainmagstep}{OT1}
 2174 \setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT}
 2175 \font\texti=cmmi10 scaled \mainmagstep
 2176 \font\textsy=cmsy10 scaled \mainmagstep
 2177 \def\textecsize{1095}
 2178 
 2179 % A few fonts for @defun names and args.
 2180 \setfont\defbf\bfshape{10}{\magstep1}{OT1}
 2181 \setfont\deftt\ttshape{10}{\magstep1}{OT1TT}
 2182 \setfont\defsl\slshape{10}{\magstep1}{OT1}
 2183 \setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT}
 2184 \def\df{\let\ttfont=\deftt \let\bffont = \defbf
 2185 \let\ttslfont=\defttsl \let\slfont=\defsl \bf}
 2186 
 2187 % Fonts for indices, footnotes, small examples (9pt).
 2188 \def\smallnominalsize{9pt}
 2189 \setfont\smallrm\rmshape{9}{1000}{OT1}
 2190 \setfont\smalltt\ttshape{9}{1000}{OT1TT}
 2191 \setfont\smallbf\bfshape{10}{900}{OT1}
 2192 \setfont\smallit\itshape{9}{1000}{OT1IT}
 2193 \setfont\smallsl\slshape{9}{1000}{OT1}
 2194 \setfont\smallsf\sfshape{9}{1000}{OT1}
 2195 \setfont\smallsc\scshape{10}{900}{OT1}
 2196 \setfont\smallttsl\ttslshape{10}{900}{OT1TT}
 2197 \font\smalli=cmmi9
 2198 \font\smallsy=cmsy9
 2199 \def\smallecsize{0900}
 2200 
 2201 % Fonts for small examples (8pt).
 2202 \def\smallernominalsize{8pt}
 2203 \setfont\smallerrm\rmshape{8}{1000}{OT1}
 2204 \setfont\smallertt\ttshape{8}{1000}{OT1TT}
 2205 \setfont\smallerbf\bfshape{10}{800}{OT1}
 2206 \setfont\smallerit\itshape{8}{1000}{OT1IT}
 2207 \setfont\smallersl\slshape{8}{1000}{OT1}
 2208 \setfont\smallersf\sfshape{8}{1000}{OT1}
 2209 \setfont\smallersc\scshape{10}{800}{OT1}
 2210 \setfont\smallerttsl\ttslshape{10}{800}{OT1TT}
 2211 \font\smalleri=cmmi8
 2212 \font\smallersy=cmsy8
 2213 \def\smallerecsize{0800}
 2214 
 2215 % Fonts for math mode superscripts (7pt).
 2216 \def\sevennominalsize{7pt}
 2217 \setfont\sevenrm\rmshape{7}{1000}{OT1}
 2218 \setfont\seventt\ttshape{10}{700}{OT1TT}
 2219 \setfont\sevenbf\bfshape{10}{700}{OT1}
 2220 \setfont\sevenit\itshape{7}{1000}{OT1IT}
 2221 \setfont\sevensl\slshape{10}{700}{OT1}
 2222 \setfont\sevensf\sfshape{10}{700}{OT1}
 2223 \setfont\sevensc\scshape{10}{700}{OT1}
 2224 \setfont\seventtsl\ttslshape{10}{700}{OT1TT}
 2225 \font\seveni=cmmi7
 2226 \font\sevensy=cmsy7
 2227 \def\sevenecsize{0700}
 2228 
 2229 % Fonts for title page (20.4pt):
 2230 \def\titlenominalsize{20pt}
 2231 \setfont\titlerm\rmbshape{12}{\magstep3}{OT1}
 2232 \setfont\titleit\itbshape{10}{\magstep4}{OT1IT}
 2233 \setfont\titlesl\slbshape{10}{\magstep4}{OT1}
 2234 \setfont\titlett\ttbshape{12}{\magstep3}{OT1TT}
 2235 \setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT}
 2236 \setfont\titlesf\sfbshape{17}{\magstep1}{OT1}
 2237 \let\titlebf=\titlerm
 2238 \setfont\titlesc\scbshape{10}{\magstep4}{OT1}
 2239 \font\titlei=cmmi12 scaled \magstep3
 2240 \font\titlesy=cmsy10 scaled \magstep4
 2241 \def\titleecsize{2074}
 2242 
 2243 % Chapter (and unnumbered) fonts (17.28pt).
 2244 \def\chapnominalsize{17pt}
 2245 \setfont\chaprm\rmbshape{12}{\magstep2}{OT1}
 2246 \setfont\chapit\itbshape{10}{\magstep3}{OT1IT}
 2247 \setfont\chapsl\slbshape{10}{\magstep3}{OT1}
 2248 \setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT}
 2249 \setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT}
 2250 \setfont\chapsf\sfbshape{17}{1000}{OT1}
 2251 \let\chapbf=\chaprm
 2252 \setfont\chapsc\scbshape{10}{\magstep3}{OT1}
 2253 \font\chapi=cmmi12 scaled \magstep2
 2254 \font\chapsy=cmsy10 scaled \magstep3
 2255 \def\chapecsize{1728}
 2256 
 2257 % Section fonts (14.4pt).
 2258 \def\secnominalsize{14pt}
 2259 \setfont\secrm\rmbshape{12}{\magstep1}{OT1}
 2260 \setfont\secrmnotbold\rmshape{12}{\magstep1}{OT1}
 2261 \setfont\secit\itbshape{10}{\magstep2}{OT1IT}
 2262 \setfont\secsl\slbshape{10}{\magstep2}{OT1}
 2263 \setfont\sectt\ttbshape{12}{\magstep1}{OT1TT}
 2264 \setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT}
 2265 \setfont\secsf\sfbshape{12}{\magstep1}{OT1}
 2266 \let\secbf\secrm
 2267 \setfont\secsc\scbshape{10}{\magstep2}{OT1}
 2268 \font\seci=cmmi12 scaled \magstep1
 2269 \font\secsy=cmsy10 scaled \magstep2
 2270 \def\sececsize{1440}
 2271 
 2272 % Subsection fonts (13.15pt).
 2273 \def\ssecnominalsize{13pt}
 2274 \setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1}
 2275 \setfont\ssecit\itbshape{10}{1315}{OT1IT}
 2276 \setfont\ssecsl\slbshape{10}{1315}{OT1}
 2277 \setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT}
 2278 \setfont\ssecttsl\ttslshape{10}{1315}{OT1TT}
 2279 \setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1}
 2280 \let\ssecbf\ssecrm
 2281 \setfont\ssecsc\scbshape{10}{1315}{OT1}
 2282 \font\sseci=cmmi12 scaled \magstephalf
 2283 \font\ssecsy=cmsy10 scaled 1315
 2284 \def\ssececsize{1200}
 2285 
 2286 % Reduced fonts for @acronym in text (10pt).
 2287 \def\reducednominalsize{10pt}
 2288 \setfont\reducedrm\rmshape{10}{1000}{OT1}
 2289 \setfont\reducedtt\ttshape{10}{1000}{OT1TT}
 2290 \setfont\reducedbf\bfshape{10}{1000}{OT1}
 2291 \setfont\reducedit\itshape{10}{1000}{OT1IT}
 2292 \setfont\reducedsl\slshape{10}{1000}{OT1}
 2293 \setfont\reducedsf\sfshape{10}{1000}{OT1}
 2294 \setfont\reducedsc\scshape{10}{1000}{OT1}
 2295 \setfont\reducedttsl\ttslshape{10}{1000}{OT1TT}
 2296 \font\reducedi=cmmi10
 2297 \font\reducedsy=cmsy10
 2298 \def\reducedecsize{1000}
 2299 
 2300 \textleading = 13.2pt % line spacing for 11pt CM
 2301 \textfonts            % reset the current fonts
 2302 \rm
 2303 } % end of 11pt text font size definitions, \definetextfontsizexi
 2304 
 2305 
 2306 % Definitions to make the main text be 10pt Computer Modern, with
 2307 % section, chapter, etc., sizes following suit.  This is for the GNU
 2308 % Press printing of the Emacs 22 manual.  Maybe other manuals in the
 2309 % future.  Used with @smallbook, which sets the leading to 12pt.
 2310 %
 2311 \def\definetextfontsizex{%
 2312 % Text fonts (10pt).
 2313 \def\textnominalsize{10pt}
 2314 \edef\mainmagstep{1000}
 2315 \setfont\textrm\rmshape{10}{\mainmagstep}{OT1}
 2316 \setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT}
 2317 \setfont\textbf\bfshape{10}{\mainmagstep}{OT1}
 2318 \setfont\textit\itshape{10}{\mainmagstep}{OT1IT}
 2319 \setfont\textsl\slshape{10}{\mainmagstep}{OT1}
 2320 \setfont\textsf\sfshape{10}{\mainmagstep}{OT1}
 2321 \setfont\textsc\scshape{10}{\mainmagstep}{OT1}
 2322 \setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT}
 2323 \font\texti=cmmi10 scaled \mainmagstep
 2324 \font\textsy=cmsy10 scaled \mainmagstep
 2325 \def\textecsize{1000}
 2326 
 2327 % A few fonts for @defun names and args.
 2328 \setfont\defbf\bfshape{10}{\magstephalf}{OT1}
 2329 \setfont\deftt\ttshape{10}{\magstephalf}{OT1TT}
 2330 \setfont\defsl\slshape{10}{\magstephalf}{OT1}
 2331 \setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT}
 2332 \def\df{\let\ttfont=\deftt \let\bffont = \defbf
 2333 \let\slfont=\defsl \let\ttslfont=\defttsl \bf}
 2334 
 2335 % Fonts for indices, footnotes, small examples (9pt).
 2336 \def\smallnominalsize{9pt}
 2337 \setfont\smallrm\rmshape{9}{1000}{OT1}
 2338 \setfont\smalltt\ttshape{9}{1000}{OT1TT}
 2339 \setfont\smallbf\bfshape{10}{900}{OT1}
 2340 \setfont\smallit\itshape{9}{1000}{OT1IT}
 2341 \setfont\smallsl\slshape{9}{1000}{OT1}
 2342 \setfont\smallsf\sfshape{9}{1000}{OT1}
 2343 \setfont\smallsc\scshape{10}{900}{OT1}
 2344 \setfont\smallttsl\ttslshape{10}{900}{OT1TT}
 2345 \font\smalli=cmmi9
 2346 \font\smallsy=cmsy9
 2347 \def\smallecsize{0900}
 2348 
 2349 % Fonts for small examples (8pt).
 2350 \def\smallernominalsize{8pt}
 2351 \setfont\smallerrm\rmshape{8}{1000}{OT1}
 2352 \setfont\smallertt\ttshape{8}{1000}{OT1TT}
 2353 \setfont\smallerbf\bfshape{10}{800}{OT1}
 2354 \setfont\smallerit\itshape{8}{1000}{OT1IT}
 2355 \setfont\smallersl\slshape{8}{1000}{OT1}
 2356 \setfont\smallersf\sfshape{8}{1000}{OT1}
 2357 \setfont\smallersc\scshape{10}{800}{OT1}
 2358 \setfont\smallerttsl\ttslshape{10}{800}{OT1TT}
 2359 \font\smalleri=cmmi8
 2360 \font\smallersy=cmsy8
 2361 \def\smallerecsize{0800}
 2362 
 2363 % Fonts for math mode superscripts (7pt).
 2364 \def\sevennominalsize{7pt}
 2365 \setfont\sevenrm\rmshape{7}{1000}{OT1}
 2366 \setfont\seventt\ttshape{10}{700}{OT1TT}
 2367 \setfont\sevenbf\bfshape{10}{700}{OT1}
 2368 \setfont\sevenit\itshape{7}{1000}{OT1IT}
 2369 \setfont\sevensl\slshape{10}{700}{OT1}
 2370 \setfont\sevensf\sfshape{10}{700}{OT1}
 2371 \setfont\sevensc\scshape{10}{700}{OT1}
 2372 \setfont\seventtsl\ttslshape{10}{700}{OT1TT}
 2373 \font\seveni=cmmi7
 2374 \font\sevensy=cmsy7
 2375 \def\sevenecsize{0700}
 2376 
 2377 % Fonts for title page (20.4pt):
 2378 \def\titlenominalsize{20pt}
 2379 \setfont\titlerm\rmbshape{12}{\magstep3}{OT1}
 2380 \setfont\titleit\itbshape{10}{\magstep4}{OT1IT}
 2381 \setfont\titlesl\slbshape{10}{\magstep4}{OT1}
 2382 \setfont\titlett\ttbshape{12}{\magstep3}{OT1TT}
 2383 \setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT}
 2384 \setfont\titlesf\sfbshape{17}{\magstep1}{OT1}
 2385 \let\titlebf=\titlerm
 2386 \setfont\titlesc\scbshape{10}{\magstep4}{OT1}
 2387 \font\titlei=cmmi12 scaled \magstep3
 2388 \font\titlesy=cmsy10 scaled \magstep4
 2389 \def\titleecsize{2074}
 2390 
 2391 % Chapter fonts (14.4pt).
 2392 \def\chapnominalsize{14pt}
 2393 \setfont\chaprm\rmbshape{12}{\magstep1}{OT1}
 2394 \setfont\chapit\itbshape{10}{\magstep2}{OT1IT}
 2395 \setfont\chapsl\slbshape{10}{\magstep2}{OT1}
 2396 \setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT}
 2397 \setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT}
 2398 \setfont\chapsf\sfbshape{12}{\magstep1}{OT1}
 2399 \let\chapbf\chaprm
 2400 \setfont\chapsc\scbshape{10}{\magstep2}{OT1}
 2401 \font\chapi=cmmi12 scaled \magstep1
 2402 \font\chapsy=cmsy10 scaled \magstep2
 2403 \def\chapecsize{1440}
 2404 
 2405 % Section fonts (12pt).
 2406 \def\secnominalsize{12pt}
 2407 \setfont\secrm\rmbshape{12}{1000}{OT1}
 2408 \setfont\secit\itbshape{10}{\magstep1}{OT1IT}
 2409 \setfont\secsl\slbshape{10}{\magstep1}{OT1}
 2410 \setfont\sectt\ttbshape{12}{1000}{OT1TT}
 2411 \setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT}
 2412 \setfont\secsf\sfbshape{12}{1000}{OT1}
 2413 \let\secbf\secrm
 2414 \setfont\secsc\scbshape{10}{\magstep1}{OT1}
 2415 \font\seci=cmmi12
 2416 \font\secsy=cmsy10 scaled \magstep1
 2417 \def\sececsize{1200}
 2418 
 2419 % Subsection fonts (10pt).
 2420 \def\ssecnominalsize{10pt}
 2421 \setfont\ssecrm\rmbshape{10}{1000}{OT1}
 2422 \setfont\ssecit\itbshape{10}{1000}{OT1IT}
 2423 \setfont\ssecsl\slbshape{10}{1000}{OT1}
 2424 \setfont\ssectt\ttbshape{10}{1000}{OT1TT}
 2425 \setfont\ssecttsl\ttslshape{10}{1000}{OT1TT}
 2426 \setfont\ssecsf\sfbshape{10}{1000}{OT1}
 2427 \let\ssecbf\ssecrm
 2428 \setfont\ssecsc\scbshape{10}{1000}{OT1}
 2429 \font\sseci=cmmi10
 2430 \font\ssecsy=cmsy10
 2431 \def\ssececsize{1000}
 2432 
 2433 % Reduced fonts for @acronym in text (9pt).
 2434 \def\reducednominalsize{9pt}
 2435 \setfont\reducedrm\rmshape{9}{1000}{OT1}
 2436 \setfont\reducedtt\ttshape{9}{1000}{OT1TT}
 2437 \setfont\reducedbf\bfshape{10}{900}{OT1}
 2438 \setfont\reducedit\itshape{9}{1000}{OT1IT}
 2439 \setfont\reducedsl\slshape{9}{1000}{OT1}
 2440 \setfont\reducedsf\sfshape{9}{1000}{OT1}
 2441 \setfont\reducedsc\scshape{10}{900}{OT1}
 2442 \setfont\reducedttsl\ttslshape{10}{900}{OT1TT}
 2443 \font\reducedi=cmmi9
 2444 \font\reducedsy=cmsy9
 2445 \def\reducedecsize{0900}
 2446 
 2447 \divide\parskip by 2  % reduce space between paragraphs
 2448 \textleading = 12pt   % line spacing for 10pt CM
 2449 \textfonts            % reset the current fonts
 2450 \rm
 2451 } % end of 10pt text font size definitions, \definetextfontsizex
 2452 
 2453 % Fonts for short table of contents.
 2454 \setfont\shortcontrm\rmshape{12}{1000}{OT1}
 2455 \setfont\shortcontbf\bfshape{10}{\magstep1}{OT1}  % no cmb12
 2456 \setfont\shortcontsl\slshape{12}{1000}{OT1}
 2457 \setfont\shortconttt\ttshape{12}{1000}{OT1TT}
 2458 
 2459 
 2460 % We provide the user-level command
 2461 %   @fonttextsize 10
 2462 % (or 11) to redefine the text font size.  pt is assumed.
 2463 %
 2464 \def\xiword{11}
 2465 \def\xword{10}
 2466 \def\xwordpt{10pt}
 2467 %
 2468 \parseargdef\fonttextsize{%
 2469   \def\textsizearg{#1}%
 2470   %\wlog{doing @fonttextsize \textsizearg}%
 2471   %
 2472   % Set \globaldefs so that documents can use this inside @tex, since
 2473   % makeinfo 4.8 does not support it, but we need it nonetheless.
 2474   %
 2475  \begingroup \globaldefs=1
 2476   \ifx\textsizearg\xword \definetextfontsizex
 2477   \else \ifx\textsizearg\xiword \definetextfontsizexi
 2478   \else
 2479     \errhelp=\EMsimple
 2480     \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'}
 2481   \fi\fi
 2482  \endgroup
 2483 }
 2484 
 2485 %
 2486 % Change the current font style to #1, remembering it in \curfontstyle.
 2487 % For now, we do not accumulate font styles: @b{@i{foo}} prints foo in
 2488 % italics, not bold italics.
 2489 %
 2490 \def\setfontstyle#1{%
 2491   \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd.
 2492   \csname #1font\endcsname  % change the current font
 2493 }
 2494 
 2495 \def\rm{\fam=0 \setfontstyle{rm}}
 2496 \def\it{\fam=\itfam \setfontstyle{it}}
 2497 \def\sl{\fam=\slfam \setfontstyle{sl}}
 2498 \def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf}
 2499 \def\tt{\fam=\ttfam \setfontstyle{tt}}
 2500 
 2501 % Texinfo sort of supports the sans serif font style, which plain TeX does not.
 2502 % So we set up a \sf.
 2503 \newfam\sffam
 2504 \def\sf{\fam=\sffam \setfontstyle{sf}}
 2505 
 2506 % We don't need math for this font style.
 2507 \def\ttsl{\setfontstyle{ttsl}}
 2508 
 2509 
 2510 % In order for the font changes to affect most math symbols and letters,
 2511 % we have to define the \textfont of the standard families.
 2512 % We don't bother to reset \scriptscriptfont; awaiting user need.
 2513 %
 2514 \def\resetmathfonts{%
 2515   \textfont0=\rmfont \textfont1=\ifont \textfont2=\syfont
 2516   \textfont\itfam=\itfont \textfont\slfam=\slfont \textfont\bffam=\bffont
 2517   \textfont\ttfam=\ttfont \textfont\sffam=\sffont
 2518   %
 2519   % Fonts for superscript.  Note that the 7pt fonts are used regardless
 2520   % of the current font size.
 2521   \scriptfont0=\sevenrm \scriptfont1=\seveni \scriptfont2=\sevensy
 2522   \scriptfont\itfam=\sevenit \scriptfont\slfam=\sevensl
 2523   \scriptfont\bffam=\sevenbf \scriptfont\ttfam=\seventt
 2524   \scriptfont\sffam=\sevensf
 2525 }
 2526 
 2527 %
 2528 
 2529 % The font-changing commands (all called \...fonts) redefine the meanings
 2530 % of \STYLEfont, instead of just \STYLE.  We do this because \STYLE needs
 2531 % to also set the current \fam for math mode.  Our \STYLE (e.g., \rm)
 2532 % commands hardwire \STYLEfont to set the current font.
 2533 %
 2534 % The fonts used for \ifont are for "math italics"  (\itfont is for italics
 2535 % in regular text).  \syfont is also used in math mode only.
 2536 %
 2537 % Each font-changing command also sets the names \lsize (one size lower)
 2538 % and \lllsize (three sizes lower).  These relative commands are used
 2539 % in, e.g., the LaTeX logo and acronyms.
 2540 %
 2541 % This all needs generalizing, badly.
 2542 %
 2543 
 2544 \def\assignfonts#1{%
 2545   \expandafter\let\expandafter\rmfont\csname #1rm\endcsname
 2546   \expandafter\let\expandafter\itfont\csname #1it\endcsname
 2547   \expandafter\let\expandafter\slfont\csname #1sl\endcsname
 2548   \expandafter\let\expandafter\bffont\csname #1bf\endcsname
 2549   \expandafter\let\expandafter\ttfont\csname #1tt\endcsname
 2550   \expandafter\let\expandafter\smallcaps\csname #1sc\endcsname
 2551   \expandafter\let\expandafter\sffont  \csname #1sf\endcsname
 2552   \expandafter\let\expandafter\ifont   \csname #1i\endcsname
 2553   \expandafter\let\expandafter\syfont  \csname #1sy\endcsname
 2554   \expandafter\let\expandafter\ttslfont\csname #1ttsl\endcsname
 2555 }
 2556 
 2557 \newif\ifrmisbold
 2558 
 2559 % Select smaller font size with the current style.  Used to change font size
 2560 % in, e.g., the LaTeX logo and acronyms.  If we are using bold fonts for
 2561 % normal roman text, also use bold fonts for roman text in the smaller size.
 2562 \def\switchtolllsize{%
 2563    \expandafter\assignfonts\expandafter{\lllsize}%
 2564    \ifrmisbold
 2565      \let\rmfont\bffont
 2566    \fi
 2567    \csname\curfontstyle\endcsname
 2568 }%
 2569 
 2570 \def\switchtolsize{%
 2571    \expandafter\assignfonts\expandafter{\lsize}%
 2572    \ifrmisbold
 2573      \let\rmfont\bffont
 2574    \fi
 2575    \csname\curfontstyle\endcsname
 2576 }%
 2577 
 2578 \def\definefontsetatsize#1#2#3#4#5{%
 2579 \expandafter\def\csname #1fonts\endcsname{%
 2580   \def\curfontsize{#1}%
 2581   \def\lsize{#2}\def\lllsize{#3}%
 2582   \csname rmisbold#5\endcsname
 2583   \assignfonts{#1}%
 2584   \resetmathfonts
 2585   \setleading{#4}%
 2586 }}
 2587 
 2588 \definefontsetatsize{text}   {reduced}{smaller}{\textleading}{false}
 2589 \definefontsetatsize{title}  {chap}   {subsec} {27pt}  {true}
 2590 \definefontsetatsize{chap}   {sec}    {text}   {19pt}  {true}
 2591 \definefontsetatsize{sec}    {subsec} {reduced}{17pt}  {true}
 2592 \definefontsetatsize{ssec}   {text}   {small}  {15pt}  {true}
 2593 \definefontsetatsize{reduced}{small}  {smaller}{10.5pt}{false}
 2594 \definefontsetatsize{small}  {smaller}{smaller}{10.5pt}{false}
 2595 \definefontsetatsize{smaller}{smaller}{smaller}{9.5pt} {false}
 2596 
 2597 \def\titlefont#1{{\titlefonts\rm #1}}
 2598 \let\subsecfonts = \ssecfonts
 2599 \let\subsubsecfonts = \ssecfonts
 2600 
 2601 % Define these just so they can be easily changed for other fonts.
 2602 \def\angleleft{$\langle$}
 2603 \def\angleright{$\rangle$}
 2604 
 2605 % Set the fonts to use with the @small... environments.
 2606 \let\smallexamplefonts = \smallfonts
 2607 
 2608 % About \smallexamplefonts.  If we use \smallfonts (9pt), @smallexample
 2609 % can fit this many characters:
 2610 %   8.5x11=86   smallbook=72  a4=90  a5=69
 2611 % If we use \scriptfonts (8pt), then we can fit this many characters:
 2612 %   8.5x11=90+  smallbook=80  a4=90+  a5=77
 2613 % For me, subjectively, the few extra characters that fit aren't worth
 2614 % the additional smallness of 8pt.  So I'm making the default 9pt.
 2615 %
 2616 % By the way, for comparison, here's what fits with @example (10pt):
 2617 %   8.5x11=71  smallbook=60  a4=75  a5=58
 2618 % --karl, 24jan03.
 2619 
 2620 % Set up the default fonts, so we can use them for creating boxes.
 2621 %
 2622 \definetextfontsizexi
 2623 
 2624 
 2625 \message{markup,}
 2626 
 2627 % Check if we are currently using a typewriter font.  Since all the
 2628 % Computer Modern typewriter fonts have zero interword stretch (and
 2629 % shrink), and it is reasonable to expect all typewriter fonts to have
 2630 % this property, we can check that font parameter.
 2631 %
 2632 \def\ifmonospace{\ifdim\fontdimen3\font=0pt }
 2633 
 2634 % Markup style infrastructure.  \defmarkupstylesetup\INITMACRO will
 2635 % define and register \INITMACRO to be called on markup style changes.
 2636 % \INITMACRO can check \currentmarkupstyle for the innermost
 2637 % style.
 2638 
 2639 \let\currentmarkupstyle\empty
 2640 
 2641 \def\setupmarkupstyle#1{%
 2642   \def\currentmarkupstyle{#1}%
 2643   \markupstylesetup
 2644 }
 2645 
 2646 \let\markupstylesetup\empty
 2647 
 2648 \def\defmarkupstylesetup#1{%
 2649   \expandafter\def\expandafter\markupstylesetup
 2650     \expandafter{\markupstylesetup #1}%
 2651   \def#1%
 2652 }
 2653 
 2654 % Markup style setup for left and right quotes.
 2655 \defmarkupstylesetup\markupsetuplq{%
 2656   \expandafter\let\expandafter \temp
 2657     \csname markupsetuplq\currentmarkupstyle\endcsname
 2658   \ifx\temp\relax \markupsetuplqdefault \else \temp \fi
 2659 }
 2660 
 2661 \defmarkupstylesetup\markupsetuprq{%
 2662   \expandafter\let\expandafter \temp
 2663     \csname markupsetuprq\currentmarkupstyle\endcsname
 2664   \ifx\temp\relax \markupsetuprqdefault \else \temp \fi
 2665 }
 2666 
 2667 {
 2668 \catcode`\'=\active
 2669 \catcode`\`=\active
 2670 
 2671 \gdef\markupsetuplqdefault{\let`\lq}
 2672 \gdef\markupsetuprqdefault{\let'\rq}
 2673 
 2674 \gdef\markupsetcodequoteleft{\let`\codequoteleft}
 2675 \gdef\markupsetcodequoteright{\let'\codequoteright}
 2676 }
 2677 
 2678 \let\markupsetuplqcode \markupsetcodequoteleft
 2679 \let\markupsetuprqcode \markupsetcodequoteright
 2680 %
 2681 \let\markupsetuplqexample \markupsetcodequoteleft
 2682 \let\markupsetuprqexample \markupsetcodequoteright
 2683 %
 2684 \let\markupsetuplqkbd     \markupsetcodequoteleft
 2685 \let\markupsetuprqkbd     \markupsetcodequoteright
 2686 %
 2687 \let\markupsetuplqsamp \markupsetcodequoteleft
 2688 \let\markupsetuprqsamp \markupsetcodequoteright
 2689 %
 2690 \let\markupsetuplqverb \markupsetcodequoteleft
 2691 \let\markupsetuprqverb \markupsetcodequoteright
 2692 %
 2693 \let\markupsetuplqverbatim \markupsetcodequoteleft
 2694 \let\markupsetuprqverbatim \markupsetcodequoteright
 2695 
 2696 % Allow an option to not use regular directed right quote/apostrophe
 2697 % (char 0x27), but instead the undirected quote from cmtt (char 0x0d).
 2698 % The undirected quote is ugly, so don't make it the default, but it
 2699 % works for pasting with more pdf viewers (at least evince), the
 2700 % lilypond developers report.  xpdf does work with the regular 0x27.
 2701 %
 2702 \def\codequoteright{%
 2703   \ifmonospace
 2704     \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax
 2705       \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax
 2706         '%
 2707       \else \char'15 \fi
 2708     \else \char'15 \fi
 2709    \else
 2710      '%
 2711    \fi
 2712 }
 2713 %
 2714 % and a similar option for the left quote char vs. a grave accent.
 2715 % Modern fonts display ASCII 0x60 as a grave accent, so some people like
 2716 % the code environments to do likewise.
 2717 %
 2718 \def\codequoteleft{%
 2719   \ifmonospace
 2720     \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax
 2721       \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax
 2722         % [Knuth] pp. 380,381,391
 2723         % \relax disables Spanish ligatures ?` and !` of \tt font.
 2724         \relax`%
 2725       \else \char'22 \fi
 2726     \else \char'22 \fi
 2727    \else
 2728      \relax`%
 2729    \fi
 2730 }
 2731 
 2732 % Commands to set the quote options.
 2733 %
 2734 \parseargdef\codequoteundirected{%
 2735   \def\temp{#1}%
 2736   \ifx\temp\onword
 2737     \expandafter\let\csname SETtxicodequoteundirected\endcsname
 2738       = t%
 2739   \else\ifx\temp\offword
 2740     \expandafter\let\csname SETtxicodequoteundirected\endcsname
 2741       = \relax
 2742   \else
 2743     \errhelp = \EMsimple
 2744     \errmessage{Unknown @codequoteundirected value `\temp', must be on|off}%
 2745   \fi\fi
 2746 }
 2747 %
 2748 \parseargdef\codequotebacktick{%
 2749   \def\temp{#1}%
 2750   \ifx\temp\onword
 2751     \expandafter\let\csname SETtxicodequotebacktick\endcsname
 2752       = t%
 2753   \else\ifx\temp\offword
 2754     \expandafter\let\csname SETtxicodequotebacktick\endcsname
 2755       = \relax
 2756   \else
 2757     \errhelp = \EMsimple
 2758     \errmessage{Unknown @codequotebacktick value `\temp', must be on|off}%
 2759   \fi\fi
 2760 }
 2761 
 2762 % [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font.
 2763 \def\noligaturesquoteleft{\relax\lq}
 2764 
 2765 % Count depth in font-changes, for error checks
 2766 \newcount\fontdepth \fontdepth=0
 2767 
 2768 % Font commands.
 2769 
 2770 % #1 is the font command (\sl or \it), #2 is the text to slant.
 2771 % If we are in a monospaced environment, however, 1) always use \ttsl,
 2772 % and 2) do not add an italic correction.
 2773 \def\dosmartslant#1#2{%
 2774   \ifusingtt
 2775     {{\ttsl #2}\let\next=\relax}%
 2776     {\def\next{{#1#2}\futurelet\next\smartitaliccorrection}}%
 2777   \next
 2778 }
 2779 \def\smartslanted{\dosmartslant\sl}
 2780 \def\smartitalic{\dosmartslant\it}
 2781 
 2782 % Output an italic correction unless \next (presumed to be the following
 2783 % character) is such as not to need one.
 2784 \def\smartitaliccorrection{%
 2785   \ifx\next,%
 2786   \else\ifx\next-%
 2787   \else\ifx\next.%
 2788   \else\ifx\next\.%
 2789   \else\ifx\next\comma%
 2790   \else\ptexslash
 2791   \fi\fi\fi\fi\fi
 2792   \aftersmartic
 2793 }
 2794 
 2795 % Unconditional use \ttsl, and no ic.  @var is set to this for defuns.
 2796 \def\ttslanted#1{{\ttsl #1}}
 2797 
 2798 % @cite is like \smartslanted except unconditionally use \sl.  We never want
 2799 % ttsl for book titles, do we?
 2800 \def\cite#1{{\sl #1}\futurelet\next\smartitaliccorrection}
 2801 
 2802 \def\aftersmartic{}
 2803 \def\var#1{%
 2804   \let\saveaftersmartic = \aftersmartic
 2805   \def\aftersmartic{\null\let\aftersmartic=\saveaftersmartic}%
 2806   \smartslanted{#1}%
 2807 }
 2808 
 2809 \let\i=\smartitalic
 2810 \let\slanted=\smartslanted
 2811 \let\dfn=\smartslanted
 2812 \let\emph=\smartitalic
 2813 
 2814 % Explicit font changes: @r, @sc, undocumented @ii.
 2815 \def\r#1{{\rm #1}}              % roman font
 2816 \def\sc#1{{\smallcaps#1}}       % smallcaps font
 2817 \def\ii#1{{\it #1}}             % italic font
 2818 
 2819 % @b, explicit bold.  Also @strong.
 2820 \def\b#1{{\bf #1}}
 2821 \let\strong=\b
 2822 
 2823 % @sansserif, explicit sans.
 2824 \def\sansserif#1{{\sf #1}}
 2825 
 2826 % We can't just use \exhyphenpenalty, because that only has effect at
 2827 % the end of a paragraph.  Restore normal hyphenation at the end of the
 2828 % group within which \nohyphenation is presumably called.
 2829 %
 2830 \def\nohyphenation{\hyphenchar\font = -1  \aftergroup\restorehyphenation}
 2831 \def\restorehyphenation{\hyphenchar\font = `- }
 2832 
 2833 % Set sfcode to normal for the chars that usually have another value.
 2834 % Can't use plain's \frenchspacing because it uses the `\x notation, and
 2835 % sometimes \x has an active definition that messes things up.
 2836 %
 2837 \catcode`@=11
 2838   \def\plainfrenchspacing{%
 2839     \sfcode`\.=\@m \sfcode`\?=\@m \sfcode`\!=\@m
 2840     \sfcode`\:=\@m \sfcode`\;=\@m \sfcode`\,=\@m
 2841     \def\endofsentencespacefactor{1000}% for @. and friends
 2842   }
 2843   \def\plainnonfrenchspacing{%
 2844     \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000
 2845     \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250
 2846     \def\endofsentencespacefactor{3000}% for @. and friends
 2847   }
 2848 \catcode`@=\other
 2849 \def\endofsentencespacefactor{3000}% default
 2850 
 2851 % @t, explicit typewriter.
 2852 \def\t#1{%
 2853   {\tt \plainfrenchspacing #1}%
 2854   \null
 2855 }
 2856 
 2857 % @samp.
 2858 \def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}}
 2859 
 2860 % @indicateurl is \samp, that is, with quotes.
 2861 \let\indicateurl=\samp
 2862 
 2863 % @code (and similar) prints in typewriter, but with spaces the same
 2864 % size as normal in the surrounding text, without hyphenation, etc.
 2865 % This is a subroutine for that.
 2866 \def\tclose#1{%
 2867   {%
 2868     % Change normal interword space to be same as for the current font.
 2869     \spaceskip = \fontdimen2\font
 2870     %
 2871     % Switch to typewriter.
 2872     \tt
 2873     %
 2874     % But `\ ' produces the large typewriter interword space.
 2875     \def\ {{\spaceskip = 0pt{} }}%
 2876     %
 2877     % Turn off hyphenation.
 2878     \nohyphenation
 2879     %
 2880     \plainfrenchspacing
 2881     #1%
 2882   }%
 2883   \null % reset spacefactor to 1000
 2884 }
 2885 
 2886 % We *must* turn on hyphenation at `-' and `_' in @code.
 2887 % (But see \codedashfinish below.)
 2888 % Otherwise, it is too hard to avoid overfull hboxes
 2889 % in the Emacs manual, the Library manual, etc.
 2890 %
 2891 % Unfortunately, TeX uses one parameter (\hyphenchar) to control
 2892 % both hyphenation at - and hyphenation within words.
 2893 % We must therefore turn them both off (\tclose does that)
 2894 % and arrange explicitly to hyphenate at a dash. -- rms.
 2895 {
 2896   \catcode`\-=\active \catcode`\_=\active
 2897   \catcode`\'=\active \catcode`\`=\active
 2898   \global\let'=\rq \global\let`=\lq  % default definitions
 2899   %
 2900   \global\def\code{\begingroup
 2901     \setupmarkupstyle{code}%
 2902     % The following should really be moved into \setupmarkupstyle handlers.
 2903     \catcode\dashChar=\active  \catcode\underChar=\active
 2904     \ifallowcodebreaks
 2905      \let-\codedash
 2906      \let_\codeunder
 2907     \else
 2908      \let-\normaldash
 2909      \let_\realunder
 2910     \fi
 2911     % Given -foo (with a single dash), we do not want to allow a break
 2912     % after the hyphen.
 2913     \global\let\codedashprev=\codedash
 2914     %
 2915     \codex
 2916   }
 2917   %
 2918   \gdef\codedash{\futurelet\next\codedashfinish}
 2919   \gdef\codedashfinish{%
 2920     \normaldash % always output the dash character itself.
 2921     %
 2922     % Now, output a discretionary to allow a line break, unless
 2923     % (a) the next character is a -, or
 2924     % (b) the preceding character is a -.
 2925     % E.g., given --posix, we do not want to allow a break after either -.
 2926     % Given --foo-bar, we do want to allow a break between the - and the b.
 2927     \ifx\next\codedash \else
 2928       \ifx\codedashprev\codedash
 2929       \else \discretionary{}{}{}\fi
 2930     \fi
 2931     % we need the space after the = for the case when \next itself is a
 2932     % space token; it would get swallowed otherwise.  As in @code{- a}.
 2933     \global\let\codedashprev= \next
 2934   }
 2935 }
 2936 \def\normaldash{-}
 2937 %
 2938 \def\codex #1{\tclose{#1}\endgroup}
 2939 
 2940 \def\codeunder{%
 2941   % this is all so @math{@code{var_name}+1} can work.  In math mode, _
 2942   % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.)
 2943   % will therefore expand the active definition of _, which is us
 2944   % (inside @code that is), therefore an endless loop.
 2945   \ifusingtt{\ifmmode
 2946                \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_.
 2947              \else\normalunderscore \fi
 2948              \discretionary{}{}{}}%
 2949             {\_}%
 2950 }
 2951 
 2952 % An additional complication: the above will allow breaks after, e.g.,
 2953 % each of the four underscores in __typeof__.  This is bad.
 2954 % @allowcodebreaks provides a document-level way to turn breaking at -
 2955 % and _ on and off.
 2956 %
 2957 \newif\ifallowcodebreaks  \allowcodebreakstrue
 2958 
 2959 \def\keywordtrue{true}
 2960 \def\keywordfalse{false}
 2961 
 2962 \parseargdef\allowcodebreaks{%
 2963   \def\txiarg{#1}%
 2964   \ifx\txiarg\keywordtrue
 2965     \allowcodebreakstrue
 2966   \else\ifx\txiarg\keywordfalse
 2967     \allowcodebreaksfalse
 2968   \else
 2969     \errhelp = \EMsimple
 2970     \errmessage{Unknown @allowcodebreaks option `\txiarg', must be true|false}%
 2971   \fi\fi
 2972 }
 2973 
 2974 % For @command, @env, @file, @option quotes seem unnecessary,
 2975 % so use \code rather than \samp.
 2976 \let\command=\code
 2977 \let\env=\code
 2978 \let\file=\code
 2979 \let\option=\code
 2980 
 2981 % @uref (abbreviation for `urlref') aka @url takes an optional
 2982 % (comma-separated) second argument specifying the text to display and
 2983 % an optional third arg as text to display instead of (rather than in
 2984 % addition to) the url itself.  First (mandatory) arg is the url.
 2985 
 2986 % TeX-only option to allow changing PDF output to show only the second
 2987 % arg (if given), and not the url (which is then just the link target).
 2988 \newif\ifurefurlonlylink
 2989 
 2990 % The main macro is \urefbreak, which allows breaking at expected
 2991 % places within the url.  (There used to be another version, which
 2992 % didn't support automatic breaking.)
 2993 \def\urefbreak{\begingroup \urefcatcodes \dourefbreak}
 2994 \let\uref=\urefbreak
 2995 %
 2996 \def\dourefbreak#1{\urefbreakfinish #1,,,\finish}
 2997 \def\urefbreakfinish#1,#2,#3,#4\finish{% doesn't work in @example
 2998   \unsepspaces
 2999   \pdfurl{#1}%
 3000   \setbox0 = \hbox{\ignorespaces #3}%
 3001   \ifdim\wd0 > 0pt
 3002     \unhbox0 % third arg given, show only that
 3003   \else
 3004     \setbox0 = \hbox{\ignorespaces #2}% look for second arg
 3005     \ifdim\wd0 > 0pt
 3006       \ifpdf
 3007         % For pdfTeX and LuaTeX
 3008         \ifurefurlonlylink
 3009           % PDF plus option to not display url, show just arg
 3010           \unhbox0
 3011         \else
 3012           % PDF, normally display both arg and url for consistency,
 3013           % visibility, if the pdf is eventually used to print, etc.
 3014           \unhbox0\ (\urefcode{#1})%
 3015         \fi
 3016       \else
 3017         \ifx\XeTeXrevision\thisisundefined
 3018           \unhbox0\ (\urefcode{#1})% DVI, always show arg and url
 3019         \else
 3020           % For XeTeX
 3021           \ifurefurlonlylink
 3022             % PDF plus option to not display url, show just arg
 3023             \unhbox0
 3024           \else
 3025             % PDF, normally display both arg and url for consistency,
 3026             % visibility, if the pdf is eventually used to print, etc.
 3027             \unhbox0\ (\urefcode{#1})%
 3028           \fi
 3029         \fi
 3030       \fi
 3031     \else
 3032       \urefcode{#1}% only url given, so show it
 3033     \fi
 3034   \fi
 3035   \endlink
 3036 \endgroup}
 3037 
 3038 % Allow line breaks around only a few characters (only).
 3039 \def\urefcatcodes{%
 3040   \catcode`\&=\active \catcode`\.=\active
 3041   \catcode`\#=\active \catcode`\?=\active
 3042   \catcode`\/=\active
 3043 }
 3044 {
 3045   \urefcatcodes
 3046   %
 3047   \global\def\urefcode{\begingroup
 3048     \setupmarkupstyle{code}%
 3049     \urefcatcodes
 3050     \let&\urefcodeamp
 3051     \let.\urefcodedot
 3052     \let#\urefcodehash
 3053     \let?\urefcodequest
 3054     \let/\urefcodeslash
 3055     \codex
 3056   }
 3057   %
 3058   % By default, they are just regular characters.
 3059   \global\def&{\normalamp}
 3060   \global\def.{\normaldot}
 3061   \global\def#{\normalhash}
 3062   \global\def?{\normalquest}
 3063   \global\def/{\normalslash}
 3064 }
 3065 
 3066 \def\urefcodeamp{\urefprebreak \&\urefpostbreak}
 3067 \def\urefcodedot{\urefprebreak .\urefpostbreak}
 3068 \def\urefcodehash{\urefprebreak \#\urefpostbreak}
 3069 \def\urefcodequest{\urefprebreak ?\urefpostbreak}
 3070 \def\urefcodeslash{\futurelet\next\urefcodeslashfinish}
 3071 {
 3072   \catcode`\/=\active
 3073   \global\def\urefcodeslashfinish{%
 3074     \urefprebreak \slashChar
 3075     % Allow line break only after the final / in a sequence of
 3076     % slashes, to avoid line break between the slashes in http://.
 3077     \ifx\next/\else \urefpostbreak \fi
 3078   }
 3079 }
 3080 
 3081 % By default we'll break after the special characters, but some people like to
 3082 % break before the special chars, so allow that.  Also allow no breaking at
 3083 % all, for manual control.
 3084 %
 3085 \parseargdef\urefbreakstyle{%
 3086   \def\txiarg{#1}%
 3087   \ifx\txiarg\wordnone
 3088     \def\urefprebreak{\nobreak}\def\urefpostbreak{\nobreak}
 3089   \else\ifx\txiarg\wordbefore
 3090     \def\urefprebreak{\urefallowbreak}\def\urefpostbreak{\nobreak}
 3091   \else\ifx\txiarg\wordafter
 3092     \def\urefprebreak{\nobreak}\def\urefpostbreak{\urefallowbreak}
 3093   \else
 3094     \errhelp = \EMsimple
 3095     \errmessage{Unknown @urefbreakstyle setting `\txiarg'}%
 3096   \fi\fi\fi
 3097 }
 3098 \def\wordafter{after}
 3099 \def\wordbefore{before}
 3100 \def\wordnone{none}
 3101 
 3102 % Allow a ragged right output to aid breaking long URL's.  There can
 3103 % be a break at the \allowbreak with no extra glue (if the existing stretch in
 3104 % the line is sufficent), a break at the \penalty100 with extra glue added
 3105 % at the end of the line, or no break at all here.
 3106 %   Changing the value of the penalty and/or the amount of stretch affects how
 3107 % preferrable one choice is over the other.
 3108 \def\urefallowbreak{%
 3109   \allowbreak
 3110   \hskip 0pt plus 2 em\relax
 3111   \penalty300
 3112   \hskip 0pt plus -2 em\relax
 3113 }
 3114 
 3115 \urefbreakstyle after
 3116 
 3117 % @url synonym for @uref, since that's how everyone uses it.
 3118 %
 3119 \let\url=\uref
 3120 
 3121 % rms does not like angle brackets --karl, 17may97.
 3122 % So now @email is just like @uref, unless we are pdf.
 3123 %
 3124 %\def\email#1{\angleleft{\tt #1}\angleright}
 3125 \ifpdforxetex
 3126   \def\email#1{\doemail#1,,\finish}
 3127   \def\doemail#1,#2,#3\finish{\begingroup
 3128     \unsepspaces
 3129     \pdfurl{mailto:#1}%
 3130     \setbox0 = \hbox{\ignorespaces #2}%
 3131     \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi
 3132     \endlink
 3133   \endgroup}
 3134 \else
 3135   \let\email=\uref
 3136 \fi
 3137 
 3138 % @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
 3139 %   `example' (@kbd uses ttsl only inside of @example and friends),
 3140 %   or `code' (@kbd uses normal tty font always).
 3141 \parseargdef\kbdinputstyle{%
 3142   \def\txiarg{#1}%
 3143   \ifx\txiarg\worddistinct
 3144     \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
 3145   \else\ifx\txiarg\wordexample
 3146     \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%
 3147   \else\ifx\txiarg\wordcode
 3148     \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
 3149   \else
 3150     \errhelp = \EMsimple
 3151     \errmessage{Unknown @kbdinputstyle setting `\txiarg'}%
 3152   \fi\fi\fi
 3153 }
 3154 \def\worddistinct{distinct}
 3155 \def\wordexample{example}
 3156 \def\wordcode{code}
 3157 
 3158 % Default is `distinct'.
 3159 \kbdinputstyle distinct
 3160 
 3161 % @kbd is like @code, except that if the argument is just one @key command,
 3162 % then @kbd has no effect.
 3163 \def\kbd#1{{\def\look{#1}\expandafter\kbdsub\look??\par}}
 3164 
 3165 \def\xkey{\key}
 3166 \def\kbdsub#1#2#3\par{%
 3167   \def\one{#1}\def\three{#3}\def\threex{??}%
 3168   \ifx\one\xkey\ifx\threex\three \key{#2}%
 3169   \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi
 3170   \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi
 3171 }
 3172 
 3173 % definition of @key that produces a lozenge.  Doesn't adjust to text size.
 3174 %\setfont\keyrm\rmshape{8}{1000}{OT1}
 3175 %\font\keysy=cmsy9
 3176 %\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{%
 3177 %  \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{%
 3178 %    \vbox{\hrule\kern-0.4pt
 3179 %     \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}%
 3180 %    \kern-0.4pt\hrule}%
 3181 %  \kern-.06em\raise0.4pt\hbox{\angleright}}}}
 3182 
 3183 % definition of @key with no lozenge.  If the current font is already
 3184 % monospace, don't change it; that way, we respect @kbdinputstyle.  But
 3185 % if it isn't monospace, then use \tt.
 3186 %
 3187 \def\key#1{{\setupmarkupstyle{key}%
 3188   \nohyphenation
 3189   \ifmonospace\else\tt\fi
 3190   #1}\null}
 3191 
 3192 % @clicksequence{File @click{} Open ...}
 3193 \def\clicksequence#1{\begingroup #1\endgroup}
 3194 
 3195 % @clickstyle @arrow   (by default)
 3196 \parseargdef\clickstyle{\def\click{#1}}
 3197 \def\click{\arrow}
 3198 
 3199 % Typeset a dimension, e.g., `in' or `pt'.  The only reason for the
 3200 % argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
 3201 %
 3202 \def\dmn#1{\thinspace #1}
 3203 
 3204 % @acronym for "FBI", "NATO", and the like.
 3205 % We print this one point size smaller, since it's intended for
 3206 % all-uppercase.
 3207 %
 3208 \def\acronym#1{\doacronym #1,,\finish}
 3209 \def\doacronym#1,#2,#3\finish{%
 3210   {\switchtolsize #1}%
 3211   \def\temp{#2}%
 3212   \ifx\temp\empty \else
 3213     \space ({\unsepspaces \ignorespaces \temp \unskip})%
 3214   \fi
 3215   \null % reset \spacefactor=1000
 3216 }
 3217 
 3218 % @abbr for "Comput. J." and the like.
 3219 % No font change, but don't do end-of-sentence spacing.
 3220 %
 3221 \def\abbr#1{\doabbr #1,,\finish}
 3222 \def\doabbr#1,#2,#3\finish{%
 3223   {\plainfrenchspacing #1}%
 3224   \def\temp{#2}%
 3225   \ifx\temp\empty \else
 3226     \space ({\unsepspaces \ignorespaces \temp \unskip})%
 3227   \fi
 3228   \null % reset \spacefactor=1000
 3229 }
 3230 
 3231 % @asis just yields its argument.  Used with @table, for example.
 3232 %
 3233 \def\asis#1{#1}
 3234 
 3235 % @math outputs its argument in math mode.
 3236 %
 3237 % One complication: _ usually means subscripts, but it could also mean
 3238 % an actual _ character, as in @math{@var{some_variable} + 1}.  So make
 3239 % _ active, and distinguish by seeing if the current family is \slfam,
 3240 % which is what @var uses.
 3241 {
 3242   \catcode`\_ = \active
 3243   \gdef\mathunderscore{%
 3244     \catcode`\_=\active
 3245     \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
 3246   }
 3247 }
 3248 % Another complication: we want \\ (and @\) to output a math (or tt) \.
 3249 % FYI, plain.tex uses \\ as a temporary control sequence (for no
 3250 % particular reason), but this is not advertised and we don't care.
 3251 %
 3252 % The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\.
 3253 \def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}
 3254 %
 3255 \def\math{%
 3256   \ifmmode\else % only go into math if not in math mode already
 3257     \tex
 3258     \mathunderscore
 3259     \let\\ = \mathbackslash
 3260     \mathactive
 3261     % make the texinfo accent commands work in math mode
 3262     \let\"=\ddot
 3263     \let\'=\acute
 3264     \let\==\bar
 3265     \let\^=\hat
 3266     \let\`=\grave
 3267     \let\u=\breve
 3268     \let\v=\check
 3269     \let\~=\tilde
 3270     \let\dotaccent=\dot
 3271     % have to provide another name for sup operator
 3272     \let\mathopsup=\sup
 3273   $\expandafter\finishmath\fi
 3274 }
 3275 \def\finishmath#1{#1$\endgroup}  % Close the group opened by \tex.
 3276 
 3277 % Some active characters (such as <) are spaced differently in math.
 3278 % We have to reset their definitions in case the @math was an argument
 3279 % to a command which sets the catcodes (such as @item or @section).
 3280 %
 3281 {
 3282   \catcode`^ = \active
 3283   \catcode`< = \active
 3284   \catcode`> = \active
 3285   \catcode`+ = \active
 3286   \catcode`' = \active
 3287   \gdef\mathactive{%
 3288     \let^ = \ptexhat
 3289     \let< = \ptexless
 3290     \let> = \ptexgtr
 3291     \let+ = \ptexplus
 3292     \let' = \ptexquoteright
 3293   }
 3294 }
 3295 
 3296 % for @sub and @sup, if in math mode, just do a normal sub/superscript.
 3297 % If in text, use math to place as sub/superscript, but switch
 3298 % into text mode, with smaller fonts.  This is a different font than the
 3299 % one used for real math sub/superscripts (8pt vs. 7pt), but let's not
 3300 % fix it (significant additions to font machinery) until someone notices.
 3301 %
 3302 \def\sub{\ifmmode \expandafter\sb \else \expandafter\finishsub\fi}
 3303 \def\finishsub#1{$\sb{\hbox{\switchtolllsize #1}}$}%
 3304 %
 3305 \def\sup{\ifmmode \expandafter\ptexsp \else \expandafter\finishsup\fi}
 3306 \def\finishsup#1{$\ptexsp{\hbox{\switchtolllsize #1}}$}%
 3307 
 3308 % @inlinefmt{FMTNAME,PROCESSED-TEXT} and @inlineraw{FMTNAME,RAW-TEXT}.
 3309 % Ignore unless FMTNAME == tex; then it is like @iftex and @tex,
 3310 % except specified as a normal braced arg, so no newlines to worry about.
 3311 %
 3312 \def\outfmtnametex{tex}
 3313 %
 3314 \long\def\inlinefmt#1{\doinlinefmt #1,\finish}
 3315 \long\def\doinlinefmt#1,#2,\finish{%
 3316   \def\inlinefmtname{#1}%
 3317   \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\fi
 3318 }
 3319 %
 3320 % @inlinefmtifelse{FMTNAME,THEN-TEXT,ELSE-TEXT} expands THEN-TEXT if
 3321 % FMTNAME is tex, else ELSE-TEXT.
 3322 \long\def\inlinefmtifelse#1{\doinlinefmtifelse #1,,,\finish}
 3323 \long\def\doinlinefmtifelse#1,#2,#3,#4,\finish{%
 3324   \def\inlinefmtname{#1}%
 3325   \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\else \ignorespaces #3\fi
 3326 }
 3327 %
 3328 % For raw, must switch into @tex before parsing the argument, to avoid
 3329 % setting catcodes prematurely.  Doing it this way means that, for
 3330 % example, @inlineraw{html, foo{bar} gets a parse error instead of being
 3331 % ignored.  But this isn't important because if people want a literal
 3332 % *right* brace they would have to use a command anyway, so they may as
 3333 % well use a command to get a left brace too.  We could re-use the
 3334 % delimiter character idea from \verb, but it seems like overkill.
 3335 %
 3336 \long\def\inlineraw{\tex \doinlineraw}
 3337 \long\def\doinlineraw#1{\doinlinerawtwo #1,\finish}
 3338 \def\doinlinerawtwo#1,#2,\finish{%
 3339   \def\inlinerawname{#1}%
 3340   \ifx\inlinerawname\outfmtnametex \ignorespaces #2\fi
 3341   \endgroup % close group opened by \tex.
 3342 }
 3343 
 3344 % @inlineifset{VAR, TEXT} expands TEXT if VAR is @set.
 3345 %
 3346 \long\def\inlineifset#1{\doinlineifset #1,\finish}
 3347 \long\def\doinlineifset#1,#2,\finish{%
 3348   \def\inlinevarname{#1}%
 3349   \expandafter\ifx\csname SET\inlinevarname\endcsname\relax
 3350   \else\ignorespaces#2\fi
 3351 }
 3352 
 3353 % @inlineifclear{VAR, TEXT} expands TEXT if VAR is not @set.
 3354 %
 3355 \long\def\inlineifclear#1{\doinlineifclear #1,\finish}
 3356 \long\def\doinlineifclear#1,#2,\finish{%
 3357   \def\inlinevarname{#1}%
 3358   \expandafter\ifx\csname SET\inlinevarname\endcsname\relax \ignorespaces#2\fi
 3359 }
 3360 
 3361 
 3362 \message{glyphs,}
 3363 % and logos.
 3364 
 3365 % @@ prints an @, as does @atchar{}.
 3366 \def\@{\char64 }
 3367 \let\atchar=\@
 3368 
 3369 % @{ @} @lbracechar{} @rbracechar{} all generate brace characters.
 3370 \def\lbracechar{{\ifmonospace\char123\else\ensuremath\lbrace\fi}}
 3371 \def\rbracechar{{\ifmonospace\char125\else\ensuremath\rbrace\fi}}
 3372 \let\{=\lbracechar
 3373 \let\}=\rbracechar
 3374 
 3375 % @comma{} to avoid , parsing problems.
 3376 \let\comma = ,
 3377 
 3378 % Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
 3379 % Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
 3380 \let\, = \ptexc
 3381 \let\dotaccent = \ptexdot
 3382 \def\ringaccent#1{{\accent23 #1}}
 3383 \let\tieaccent = \ptext
 3384 \let\ubaraccent = \ptexb
 3385 \let\udotaccent = \d
 3386 
 3387 % Other special characters: @questiondown @exclamdown @ordf @ordm
 3388 % Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
 3389 \def\questiondown{?`}
 3390 \def\exclamdown{!`}
 3391 \def\ordf{\leavevmode\raise1ex\hbox{\switchtolllsize \underbar{a}}}
 3392 \def\ordm{\leavevmode\raise1ex\hbox{\switchtolllsize \underbar{o}}}
 3393 
 3394 % Dotless i and dotless j, used for accents.
 3395 \def\imacro{i}
 3396 \def\jmacro{j}
 3397 \def\dotless#1{%
 3398   \def\temp{#1}%
 3399   \ifx\temp\imacro \ifmmode\imath \else\ptexi \fi
 3400   \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi
 3401   \else \errmessage{@dotless can be used only with i or j}%
 3402   \fi\fi
 3403 }
 3404 
 3405 % The \TeX{} logo, as in plain, but resetting the spacing so that a
 3406 % period following counts as ending a sentence.  (Idea found in latex.)
 3407 %
 3408 \edef\TeX{\TeX \spacefactor=1000 }
 3409 
 3410 % @LaTeX{} logo.  Not quite the same results as the definition in
 3411 % latex.ltx, since we use a different font for the raised A; it's most
 3412 % convenient for us to use an explicitly smaller font, rather than using
 3413 % the \scriptstyle font (since we don't reset \scriptstyle and
 3414 % \scriptscriptstyle).
 3415 %
 3416 \def\LaTeX{%
 3417   L\kern-.36em
 3418   {\setbox0=\hbox{T}%
 3419    \vbox to \ht0{\hbox{%
 3420      \ifx\textnominalsize\xwordpt
 3421        % for 10pt running text, lllsize (8pt) is too small for the A in LaTeX.
 3422        % Revert to plain's \scriptsize, which is 7pt.
 3423        \count255=\the\fam $\fam\count255 \scriptstyle A$%
 3424      \else
 3425        % For 11pt, we can use our lllsize.
 3426        \switchtolllsize A%
 3427      \fi
 3428      }%
 3429      \vss
 3430   }}%
 3431   \kern-.15em
 3432   \TeX
 3433 }
 3434 
 3435 % Some math mode symbols.  Define \ensuremath to switch into math mode
 3436 % unless we are already there.  Expansion tricks may not be needed here,
 3437 % but safer, and can't hurt.
 3438 \def\ensuremath{\ifmmode \expandafter\asis \else\expandafter\ensuredmath \fi}
 3439 \def\ensuredmath#1{$\relax#1$}
 3440 %
 3441 \def\bullet{\ensuremath\ptexbullet}
 3442 \def\geq{\ensuremath\ge}
 3443 \def\leq{\ensuremath\le}
 3444 \def\minus{\ensuremath-}
 3445 
 3446 % @dots{} outputs an ellipsis using the current font.
 3447 % We do .5em per period so that it has the same spacing in the cm
 3448 % typewriter fonts as three actual period characters; on the other hand,
 3449 % in other typewriter fonts three periods are wider than 1.5em.  So do
 3450 % whichever is larger.
 3451 %
 3452 \def\dots{%
 3453   \leavevmode
 3454   \setbox0=\hbox{...}% get width of three periods
 3455   \ifdim\wd0 > 1.5em
 3456     \dimen0 = \wd0
 3457   \else
 3458     \dimen0 = 1.5em
 3459   \fi
 3460   \hbox to \dimen0{%
 3461     \hskip 0pt plus.25fil
 3462     .\hskip 0pt plus1fil
 3463     .\hskip 0pt plus1fil
 3464     .\hskip 0pt plus.5fil
 3465   }%
 3466 }
 3467 
 3468 % @enddots{} is an end-of-sentence ellipsis.
 3469 %
 3470 \def\enddots{%
 3471   \dots
 3472   \spacefactor=\endofsentencespacefactor
 3473 }
 3474 
 3475 % @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
 3476 %
 3477 % Since these characters are used in examples, they should be an even number of
 3478 % \tt widths. Each \tt character is 1en, so two makes it 1em.
 3479 %
 3480 \def\point{$\star$}
 3481 \def\arrow{\leavevmode\raise.05ex\hbox to 1em{\hfil$\rightarrow$\hfil}}
 3482 \def\result{\leavevmode\raise.05ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
 3483 \def\expansion{\leavevmode\hbox to 1em{\hfil$\mapsto$\hfil}}
 3484 \def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
 3485 \def\equiv{\leavevmode\hbox to 1em{\hfil$\ptexequiv$\hfil}}
 3486 
 3487 % The @error{} command.
 3488 % Adapted from the TeXbook's \boxit.
 3489 %
 3490 \newbox\errorbox
 3491 %
 3492 {\ttfont \global\dimen0 = 3em}% Width of the box.
 3493 \dimen2 = .55pt % Thickness of rules
 3494 % The text. (`r' is open on the right, `e' somewhat less so on the left.)
 3495 \setbox0 = \hbox{\kern-.75pt \reducedsf \putworderror\kern-1.5pt}
 3496 %
 3497 \setbox\errorbox=\hbox to \dimen0{\hfil
 3498    \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
 3499    \advance\hsize by -2\dimen2 % Rules.
 3500    \vbox{%
 3501       \hrule height\dimen2
 3502       \hbox{\vrule width\dimen2 \kern3pt          % Space to left of text.
 3503          \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
 3504          \kern3pt\vrule width\dimen2}% Space to right.
 3505       \hrule height\dimen2}
 3506     \hfil}
 3507 %
 3508 \def\error{\leavevmode\lower.7ex\copy\errorbox}
 3509 
 3510 % @pounds{} is a sterling sign, which Knuth put in the CM italic font.
 3511 %
 3512 \def\pounds{{\it\$}}
 3513 
 3514 % @euro{} comes from a separate font, depending on the current style.
 3515 % We use the free feym* fonts from the eurosym package by Henrik
 3516 % Theiling, which support regular, slanted, bold and bold slanted (and
 3517 % "outlined" (blackboard board, sort of) versions, which we don't need).
 3518 % It is available from http://www.ctan.org/tex-archive/fonts/eurosym.
 3519 %
 3520 % Although only regular is the truly official Euro symbol, we ignore
 3521 % that.  The Euro is designed to be slightly taller than the regular
 3522 % font height.
 3523 %
 3524 % feymr - regular
 3525 % feymo - slanted
 3526 % feybr - bold
 3527 % feybo - bold slanted
 3528 %
 3529 % There is no good (free) typewriter version, to my knowledge.
 3530 % A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide.
 3531 % Hmm.
 3532 %
 3533 % Also doesn't work in math.  Do we need to do math with euro symbols?
 3534 % Hope not.
 3535 %
 3536 %
 3537 \def\euro{{\eurofont e}}
 3538 \def\eurofont{%
 3539   % We set the font at each command, rather than predefining it in
 3540   % \textfonts and the other font-switching commands, so that
 3541   % installations which never need the symbol don't have to have the
 3542   % font installed.
 3543   %
 3544   % There is only one designed size (nominal 10pt), so we always scale
 3545   % that to the current nominal size.
 3546   %
 3547   % By the way, simply using "at 1em" works for cmr10 and the like, but
 3548   % does not work for cmbx10 and other extended/shrunken fonts.
 3549   %
 3550   \def\eurosize{\csname\curfontsize nominalsize\endcsname}%
 3551   %
 3552   \ifx\curfontstyle\bfstylename
 3553     % bold:
 3554     \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize
 3555   \else
 3556     % regular:
 3557     \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize
 3558   \fi
 3559   \thiseurofont
 3560 }
 3561 
 3562 % Glyphs from the EC fonts.  We don't use \let for the aliases, because
 3563 % sometimes we redefine the original macro, and the alias should reflect
 3564 % the redefinition.
 3565 %
 3566 % Use LaTeX names for the Icelandic letters.
 3567 \def\DH{{\ecfont \char"D0}} % Eth
 3568 \def\dh{{\ecfont \char"F0}} % eth
 3569 \def\TH{{\ecfont \char"DE}} % Thorn
 3570 \def\th{{\ecfont \char"FE}} % thorn
 3571 %
 3572 \def\guillemetleft{{\ecfont \char"13}}
 3573 \def\guillemotleft{\guillemetleft}
 3574 \def\guillemetright{{\ecfont \char"14}}
 3575 \def\guillemotright{\guillemetright}
 3576 \def\guilsinglleft{{\ecfont \char"0E}}
 3577 \def\guilsinglright{{\ecfont \char"0F}}
 3578 \def\quotedblbase{{\ecfont \char"12}}
 3579 \def\quotesinglbase{{\ecfont \char"0D}}
 3580 %
 3581 % This positioning is not perfect (see the ogonek LaTeX package), but
 3582 % we have the precomposed glyphs for the most common cases.  We put the
 3583 % tests to use those glyphs in the single \ogonek macro so we have fewer
 3584 % dummy definitions to worry about for index entries, etc.
 3585 %
 3586 % ogonek is also used with other letters in Lithuanian (IOU), but using
 3587 % the precomposed glyphs for those is not so easy since they aren't in
 3588 % the same EC font.
 3589 \def\ogonek#1{{%
 3590   \def\temp{#1}%
 3591   \ifx\temp\macrocharA\Aogonek
 3592   \else\ifx\temp\macrochara\aogonek
 3593   \else\ifx\temp\macrocharE\Eogonek
 3594   \else\ifx\temp\macrochare\eogonek
 3595   \else
 3596     \ecfont \setbox0=\hbox{#1}%
 3597     \ifdim\ht0=1ex\accent"0C #1%
 3598     \else\ooalign{\unhbox0\crcr\hidewidth\char"0C \hidewidth}%
 3599     \fi
 3600   \fi\fi\fi\fi
 3601   }%
 3602 }
 3603 \def\Aogonek{{\ecfont \char"81}}\def\macrocharA{A}
 3604 \def\aogonek{{\ecfont \char"A1}}\def\macrochara{a}
 3605 \def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E}
 3606 \def\eogonek{{\ecfont \char"A6}}\def\macrochare{e}
 3607 %
 3608 % Use the European Computer Modern fonts (cm-super in outline format)
 3609 % for non-CM glyphs.  That is ec* for regular text and tc* for the text
 3610 % companion symbols (LaTeX TS1 encoding).  Both are part of the ec
 3611 % package and follow the same conventions.
 3612 %
 3613 \def\ecfont{\etcfont{e}}
 3614 \def\tcfont{\etcfont{t}}
 3615 %
 3616 \def\etcfont#1{%
 3617   % We can't distinguish serif/sans and italic/slanted, but this
 3618   % is used for crude hacks anyway (like adding French and German
 3619   % quotes to documents typeset with CM, where we lose kerning), so
 3620   % hopefully nobody will notice/care.
 3621   \edef\ecsize{\csname\curfontsize ecsize\endcsname}%
 3622   \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}%
 3623   \ifmonospace
 3624     % typewriter:
 3625     \font\thisecfont = #1ctt\ecsize \space at \nominalsize
 3626   \else
 3627     \ifx\curfontstyle\bfstylename
 3628       % bold:
 3629       \font\thisecfont = #1cb\ifusingit{i}{x}\ecsize \space at \nominalsize
 3630     \else
 3631       % regular:
 3632       \font\thisecfont = #1c\ifusingit{ti}{rm}\ecsize \space at \nominalsize
 3633     \fi
 3634   \fi
 3635   \thisecfont
 3636 }
 3637 
 3638 % @registeredsymbol - R in a circle.  The font for the R should really
 3639 % be smaller yet, but lllsize is the best we can do for now.
 3640 % Adapted from the plain.tex definition of \copyright.
 3641 %
 3642 \def\registeredsymbol{%
 3643   $^{{\ooalign{\hfil\raise.07ex\hbox{\switchtolllsize R}%
 3644                \hfil\crcr\Orb}}%
 3645     }$%
 3646 }
 3647 
 3648 % @textdegree - the normal degrees sign.
 3649 %
 3650 \def\textdegree{$^\circ$}
 3651 
 3652 % Laurent Siebenmann reports \Orb undefined with:
 3653 %  Textures 1.7.7 (preloaded format=plain 93.10.14)  (68K)  16 APR 2004 02:38
 3654 % so we'll define it if necessary.
 3655 %
 3656 \ifx\Orb\thisisundefined
 3657 \def\Orb{\mathhexbox20D}
 3658 \fi
 3659 
 3660 % Quotes.
 3661 \chardef\quotedblleft="5C
 3662 \chardef\quotedblright=`\"
 3663 \chardef\quoteleft=`\`
 3664 \chardef\quoteright=`\'
 3665 
 3666 
 3667 \message{page headings,}
 3668 
 3669 \newskip\titlepagetopglue \titlepagetopglue = 1.5in
 3670 \newskip\titlepagebottomglue \titlepagebottomglue = 2pc
 3671 
 3672 % First the title page.  Must do @settitle before @titlepage.
 3673 \newif\ifseenauthor
 3674 \newif\iffinishedtitlepage
 3675 
 3676 % @setcontentsaftertitlepage used to do an implicit @contents or
 3677 % @shortcontents after @end titlepage, but it is now obsolete.
 3678 \def\setcontentsaftertitlepage{%
 3679   \errmessage{@setcontentsaftertitlepage has been removed as a Texinfo
 3680               command; move your @contents command if you want the contents
 3681               after the title page.}}%
 3682 \def\setshortcontentsaftertitlepage{%
 3683   \errmessage{@setshortcontentsaftertitlepage has been removed as a Texinfo
 3684               command; move your @shortcontents and @contents commands if you
 3685               want the contents after the title page.}}%
 3686 
 3687 \parseargdef\shorttitlepage{%
 3688   \begingroup \hbox{}\vskip 1.5in \chaprm \centerline{#1}%
 3689   \endgroup\page\hbox{}\page}
 3690 
 3691 \envdef\titlepage{%
 3692   % Open one extra group, as we want to close it in the middle of \Etitlepage.
 3693   \begingroup
 3694     \parindent=0pt \textfonts
 3695     % Leave some space at the very top of the page.
 3696     \vglue\titlepagetopglue
 3697     % No rule at page bottom unless we print one at the top with @title.
 3698     \finishedtitlepagetrue
 3699     %
 3700     % Most title ``pages'' are actually two pages long, with space
 3701     % at the top of the second.  We don't want the ragged left on the second.
 3702     \let\oldpage = \page
 3703     \def\page{%
 3704       \iffinishedtitlepage\else
 3705      \finishtitlepage
 3706       \fi
 3707       \let\page = \oldpage
 3708       \page
 3709       \null
 3710     }%
 3711 }
 3712 
 3713 \def\Etitlepage{%
 3714     \iffinishedtitlepage\else
 3715     \finishtitlepage
 3716     \fi
 3717     % It is important to do the page break before ending the group,
 3718     % because the headline and footline are only empty inside the group.
 3719     % If we use the new definition of \page, we always get a blank page
 3720     % after the title page, which we certainly don't want.
 3721     \oldpage
 3722   \endgroup
 3723   %
 3724   % Need this before the \...aftertitlepage checks so that if they are
 3725   % in effect the toc pages will come out with page numbers.
 3726   \HEADINGSon
 3727 }
 3728 
 3729 \def\finishtitlepage{%
 3730   \vskip4pt \hrule height 2pt width \hsize
 3731   \vskip\titlepagebottomglue
 3732   \finishedtitlepagetrue
 3733 }
 3734 
 3735 % Settings used for typesetting titles: no hyphenation, no indentation,
 3736 % don't worry much about spacing, ragged right.  This should be used
 3737 % inside a \vbox, and fonts need to be set appropriately first. \par should
 3738 % be specified before the end of the \vbox, since a vbox is a group.
 3739 %
 3740 \def\raggedtitlesettings{%
 3741   \rm
 3742   \hyphenpenalty=10000
 3743   \parindent=0pt
 3744   \tolerance=5000
 3745   \ptexraggedright
 3746 }
 3747 
 3748 % Macros to be used within @titlepage:
 3749 
 3750 \let\subtitlerm=\rmfont
 3751 \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}
 3752 
 3753 \parseargdef\title{%
 3754   \checkenv\titlepage
 3755   \vbox{\titlefonts \raggedtitlesettings #1\par}%
 3756   % print a rule at the page bottom also.
 3757   \finishedtitlepagefalse
 3758   \vskip4pt \hrule height 4pt width \hsize \vskip4pt
 3759 }
 3760 
 3761 \parseargdef\subtitle{%
 3762   \checkenv\titlepage
 3763   {\subtitlefont \rightline{#1}}%
 3764 }
 3765 
 3766 % @author should come last, but may come many times.
 3767 % It can also be used inside @quotation.
 3768 %
 3769 \parseargdef\author{%
 3770   \def\temp{\quotation}%
 3771   \ifx\thisenv\temp
 3772     \def\quotationauthor{#1}% printed in \Equotation.
 3773   \else
 3774     \checkenv\titlepage
 3775     \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi
 3776     {\secfonts\rm \leftline{#1}}%
 3777   \fi
 3778 }
 3779 
 3780 
 3781 % Set up page headings and footings.
 3782 
 3783 \let\thispage=\folio
 3784 
 3785 \newtoks\evenheadline    % headline on even pages
 3786 \newtoks\oddheadline     % headline on odd pages
 3787 \newtoks\evenfootline    % footline on even pages
 3788 \newtoks\oddfootline     % footline on odd pages
 3789 
 3790 % Now make \makeheadline and \makefootline in Plain TeX use those variables
 3791 \headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
 3792                             \else \the\evenheadline \fi}}
 3793 \footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
 3794                             \else \the\evenfootline \fi}\HEADINGShook}
 3795 \let\HEADINGShook=\relax
 3796 
 3797 % Commands to set those variables.
 3798 % For example, this is what  @headings on  does
 3799 % @evenheading @thistitle|@thispage|@thischapter
 3800 % @oddheading @thischapter|@thispage|@thistitle
 3801 % @evenfooting @thisfile||
 3802 % @oddfooting ||@thisfile
 3803 
 3804 
 3805 \def\evenheading{\parsearg\evenheadingxxx}
 3806 \def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish}
 3807 \def\evenheadingyyy #1\|#2\|#3\|#4\finish{%
 3808 \global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
 3809 
 3810 \def\oddheading{\parsearg\oddheadingxxx}
 3811 \def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish}
 3812 \def\oddheadingyyy #1\|#2\|#3\|#4\finish{%
 3813 \global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
 3814 
 3815 \parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
 3816 
 3817 \def\evenfooting{\parsearg\evenfootingxxx}
 3818 \def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish}
 3819 \def\evenfootingyyy #1\|#2\|#3\|#4\finish{%
 3820 \global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
 3821 
 3822 \def\oddfooting{\parsearg\oddfootingxxx}
 3823 \def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish}
 3824 \def\oddfootingyyy #1\|#2\|#3\|#4\finish{%
 3825   \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
 3826   %
 3827   % Leave some space for the footline.  Hopefully ok to assume
 3828   % @evenfooting will not be used by itself.
 3829   \global\advance\txipageheight by -12pt
 3830   \global\advance\vsize by -12pt
 3831 }
 3832 
 3833 \parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}}
 3834 
 3835 % @evenheadingmarks top     \thischapter <- chapter at the top of a page
 3836 % @evenheadingmarks bottom  \thischapter <- chapter at the bottom of a page
 3837 %
 3838 % The same set of arguments for:
 3839 %
 3840 % @oddheadingmarks
 3841 % @evenfootingmarks
 3842 % @oddfootingmarks
 3843 % @everyheadingmarks
 3844 % @everyfootingmarks
 3845 
 3846 % These define \getoddheadingmarks, \getevenheadingmarks,
 3847 % \getoddfootingmarks, and \getevenfootingmarks, each to one of
 3848 % \gettopheadingmarks, \getbottomheadingmarks.
 3849 %
 3850 \def\evenheadingmarks{\headingmarks{even}{heading}}
 3851 \def\oddheadingmarks{\headingmarks{odd}{heading}}
 3852 \def\evenfootingmarks{\headingmarks{even}{footing}}
 3853 \def\oddfootingmarks{\headingmarks{odd}{footing}}
 3854 \parseargdef\everyheadingmarks{\headingmarks{even}{heading}{#1}
 3855                           \headingmarks{odd}{heading}{#1} }
 3856 \parseargdef\everyfootingmarks{\headingmarks{even}{footing}{#1}
 3857                           \headingmarks{odd}{footing}{#1} }
 3858 % #1 = even/odd, #2 = heading/footing, #3 = top/bottom.
 3859 \def\headingmarks#1#2#3 {%
 3860   \expandafter\let\expandafter\temp \csname get#3headingmarks\endcsname
 3861   \global\expandafter\let\csname get#1#2marks\endcsname \temp
 3862 }
 3863 
 3864 \everyheadingmarks bottom
 3865 \everyfootingmarks bottom
 3866 
 3867 % @headings double      turns headings on for double-sided printing.
 3868 % @headings single      turns headings on for single-sided printing.
 3869 % @headings off         turns them off.
 3870 % @headings on          same as @headings double, retained for compatibility.
 3871 % @headings after       turns on double-sided headings after this page.
 3872 % @headings doubleafter turns on double-sided headings after this page.
 3873 % @headings singleafter turns on single-sided headings after this page.
 3874 % By default, they are off at the start of a document,
 3875 % and turned `on' after @end titlepage.
 3876 
 3877 \parseargdef\headings{\csname HEADINGS#1\endcsname}
 3878 
 3879 \def\headingsoff{% non-global headings elimination
 3880   \evenheadline={\hfil}\evenfootline={\hfil}%
 3881    \oddheadline={\hfil}\oddfootline={\hfil}%
 3882 }
 3883 
 3884 \def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting
 3885 \HEADINGSoff  % it's the default
 3886 
 3887 % When we turn headings on, set the page number to 1.
 3888 % For double-sided printing, put current file name in lower left corner,
 3889 % chapter name on inside top of right hand pages, document
 3890 % title on inside top of left hand pages, and page numbers on outside top
 3891 % edge of all pages.
 3892 \def\HEADINGSdouble{%
 3893 \global\pageno=1
 3894 \global\evenfootline={\hfil}
 3895 \global\oddfootline={\hfil}
 3896 \global\evenheadline={\line{\folio\hfil\thistitle}}
 3897 \global\oddheadline={\line{\thischapterheading\hfil\folio}}
 3898 \global\let\contentsalignmacro = \chapoddpage
 3899 }
 3900 \let\contentsalignmacro = \chappager
 3901 
 3902 % For single-sided printing, chapter title goes across top left of page,
 3903 % page number on top right.
 3904 \def\HEADINGSsingle{%
 3905 \global\pageno=1
 3906 \global\evenfootline={\hfil}
 3907 \global\oddfootline={\hfil}
 3908 \global\evenheadline={\line{\thischapterheading\hfil\folio}}
 3909 \global\oddheadline={\line{\thischapterheading\hfil\folio}}
 3910 \global\let\contentsalignmacro = \chappager
 3911 }
 3912 \def\HEADINGSon{\HEADINGSdouble}
 3913 
 3914 \def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
 3915 \let\HEADINGSdoubleafter=\HEADINGSafter
 3916 \def\HEADINGSdoublex{%
 3917 \global\evenfootline={\hfil}
 3918 \global\oddfootline={\hfil}
 3919 \global\evenheadline={\line{\folio\hfil\thistitle}}
 3920 \global\oddheadline={\line{\thischapterheading\hfil\folio}}
 3921 \global\let\contentsalignmacro = \chapoddpage
 3922 }
 3923 
 3924 \def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
 3925 \def\HEADINGSsinglex{%
 3926 \global\evenfootline={\hfil}
 3927 \global\oddfootline={\hfil}
 3928 \global\evenheadline={\line{\thischapterheading\hfil\folio}}
 3929 \global\oddheadline={\line{\thischapterheading\hfil\folio}}
 3930 \global\let\contentsalignmacro = \chappager
 3931 }
 3932 
 3933 % Subroutines used in generating headings
 3934 % This produces Day Month Year style of output.
 3935 % Only define if not already defined, in case a txi-??.tex file has set
 3936 % up a different format (e.g., txi-cs.tex does this).
 3937 \ifx\today\thisisundefined
 3938 \def\today{%
 3939   \number\day\space
 3940   \ifcase\month
 3941   \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
 3942   \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
 3943   \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
 3944   \fi
 3945   \space\number\year}
 3946 \fi
 3947 
 3948 % @settitle line...  specifies the title of the document, for headings.
 3949 % It generates no output of its own.
 3950 \def\thistitle{\putwordNoTitle}
 3951 \def\settitle{\parsearg{\gdef\thistitle}}
 3952 
 3953 
 3954 \message{tables,}
 3955 % Tables -- @table, @ftable, @vtable, @item(x).
 3956 
 3957 % default indentation of table text
 3958 \newdimen\tableindent \tableindent=.8in
 3959 % default indentation of @itemize and @enumerate text
 3960 \newdimen\itemindent  \itemindent=.3in
 3961 % margin between end of table item and start of table text.
 3962 \newdimen\itemmargin  \itemmargin=.1in
 3963 
 3964 % used internally for \itemindent minus \itemmargin
 3965 \newdimen\itemmax
 3966 
 3967 % Note @table, @ftable, and @vtable define @item, @itemx, etc., with
 3968 % these defs.
 3969 % They also define \itemindex
 3970 % to index the item name in whatever manner is desired (perhaps none).
 3971 
 3972 \newif\ifitemxneedsnegativevskip
 3973 
 3974 \def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi}
 3975 
 3976 \def\internalBitem{\smallbreak \parsearg\itemzzz}
 3977 \def\internalBitemx{\itemxpar \parsearg\itemzzz}
 3978 
 3979 \def\itemzzz #1{\begingroup %
 3980   \advance\hsize by -\rightskip
 3981   \advance\hsize by -\tableindent
 3982   \setbox0=\hbox{\itemindicate{#1}}%
 3983   \itemindex{#1}%
 3984   \nobreak % This prevents a break before @itemx.
 3985   %
 3986   % If the item text does not fit in the space we have, put it on a line
 3987   % by itself, and do not allow a page break either before or after that
 3988   % line.  We do not start a paragraph here because then if the next
 3989   % command is, e.g., @kindex, the whatsit would get put into the
 3990   % horizontal list on a line by itself, resulting in extra blank space.
 3991   \ifdim \wd0>\itemmax
 3992     %
 3993     % Make this a paragraph so we get the \parskip glue and wrapping,
 3994     % but leave it ragged-right.
 3995     \begingroup
 3996       \advance\leftskip by-\tableindent
 3997       \advance\hsize by\tableindent
 3998       \advance\rightskip by0pt plus1fil\relax
 3999       \leavevmode\unhbox0\par
 4000     \endgroup
 4001     %
 4002     % We're going to be starting a paragraph, but we don't want the
 4003     % \parskip glue -- logically it's part of the @item we just started.
 4004     \nobreak \vskip-\parskip
 4005     %
 4006     % Stop a page break at the \parskip glue coming up.  However, if
 4007     % what follows is an environment such as @example, there will be no
 4008     % \parskip glue; then the negative vskip we just inserted would
 4009     % cause the example and the item to crash together.  So we use this
 4010     % bizarre value of 10001 as a signal to \aboveenvbreak to insert
 4011     % \parskip glue after all.  Section titles are handled this way also.
 4012     %
 4013     \penalty 10001
 4014     \endgroup
 4015     \itemxneedsnegativevskipfalse
 4016   \else
 4017     % The item text fits into the space.  Start a paragraph, so that the
 4018     % following text (if any) will end up on the same line.
 4019     \noindent
 4020     % Do this with kerns and \unhbox so that if there is a footnote in
 4021     % the item text, it can migrate to the main vertical list and
 4022     % eventually be printed.
 4023     \nobreak\kern-\tableindent
 4024     \dimen0 = \itemmax  \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0
 4025     \unhbox0
 4026     \nobreak\kern\dimen0
 4027     \endgroup
 4028     \itemxneedsnegativevskiptrue
 4029   \fi
 4030 }
 4031 
 4032 \def\item{\errmessage{@item while not in a list environment}}
 4033 \def\itemx{\errmessage{@itemx while not in a list environment}}
 4034 
 4035 % @table, @ftable, @vtable.
 4036 \envdef\table{%
 4037   \let\itemindex\gobble
 4038   \tablecheck{table}%
 4039 }
 4040 \envdef\ftable{%
 4041   \def\itemindex ##1{\doind {fn}{\code{##1}}}%
 4042   \tablecheck{ftable}%
 4043 }
 4044 \envdef\vtable{%
 4045   \def\itemindex ##1{\doind {vr}{\code{##1}}}%
 4046   \tablecheck{vtable}%
 4047 }
 4048 \def\tablecheck#1{%
 4049   \ifnum \the\catcode`\^^M=\active
 4050     \endgroup
 4051     \errmessage{This command won't work in this context; perhaps the problem is
 4052       that we are \inenvironment\thisenv}%
 4053     \def\next{\doignore{#1}}%
 4054   \else
 4055     \let\next\tablex
 4056   \fi
 4057   \next
 4058 }
 4059 \def\tablex#1{%
 4060   \def\itemindicate{#1}%
 4061   \parsearg\tabley
 4062 }
 4063 \def\tabley#1{%
 4064   {%
 4065     \makevalueexpandable
 4066     \edef\temp{\noexpand\tablez #1\space\space\space}%
 4067     \expandafter
 4068   }\temp \endtablez
 4069 }
 4070 \def\tablez #1 #2 #3 #4\endtablez{%
 4071   \aboveenvbreak
 4072   \ifnum 0#1>0 \advance \leftskip by #1\mil \fi
 4073   \ifnum 0#2>0 \tableindent=#2\mil \fi
 4074   \ifnum 0#3>0 \advance \rightskip by #3\mil \fi
 4075   \itemmax=\tableindent
 4076   \advance \itemmax by -\itemmargin
 4077   \advance \leftskip by \tableindent
 4078   \exdentamount=\tableindent
 4079   \parindent = 0pt
 4080   \parskip = \smallskipamount
 4081   \ifdim \parskip=0pt \parskip=2pt \fi
 4082   \let\item = \internalBitem
 4083   \let\itemx = \internalBitemx
 4084 }
 4085 \def\Etable{\endgraf\afterenvbreak}
 4086 \let\Eftable\Etable
 4087 \let\Evtable\Etable
 4088 \let\Eitemize\Etable
 4089 \let\Eenumerate\Etable
 4090 
 4091 % This is the counter used by @enumerate, which is really @itemize
 4092 
 4093 \newcount \itemno
 4094 
 4095 \envdef\itemize{\parsearg\doitemize}
 4096 
 4097 \def\doitemize#1{%
 4098   \aboveenvbreak
 4099   \itemmax=\itemindent
 4100   \advance\itemmax by -\itemmargin
 4101   \advance\leftskip by \itemindent
 4102   \exdentamount=\itemindent
 4103   \parindent=0pt
 4104   \parskip=\smallskipamount
 4105   \ifdim\parskip=0pt \parskip=2pt \fi
 4106   %
 4107   % Try typesetting the item mark so that if the document erroneously says
 4108   % something like @itemize @samp (intending @table), there's an error
 4109   % right away at the @itemize.  It's not the best error message in the
 4110   % world, but it's better than leaving it to the @item.  This means if
 4111   % the user wants an empty mark, they have to say @w{} not just @w.
 4112   \def\itemcontents{#1}%
 4113   \setbox0 = \hbox{\itemcontents}%
 4114   %
 4115   % @itemize with no arg is equivalent to @itemize @bullet.
 4116   \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi
 4117   %
 4118   \let\item=\itemizeitem
 4119 }
 4120 
 4121 % Definition of @item while inside @itemize and @enumerate.
 4122 %
 4123 \def\itemizeitem{%
 4124   \advance\itemno by 1  % for enumerations
 4125   {\let\par=\endgraf \smallbreak}% reasonable place to break
 4126   {%
 4127    % If the document has an @itemize directly after a section title, a
 4128    % \nobreak will be last on the list, and \sectionheading will have
 4129    % done a \vskip-\parskip.  In that case, we don't want to zero
 4130    % parskip, or the item text will crash with the heading.  On the
 4131    % other hand, when there is normal text preceding the item (as there
 4132    % usually is), we do want to zero parskip, or there would be too much
 4133    % space.  In that case, we won't have a \nobreak before.  At least
 4134    % that's the theory.
 4135    \ifnum\lastpenalty<10000 \parskip=0in \fi
 4136    \noindent
 4137    \hbox to 0pt{\hss \itemcontents \kern\itemmargin}%
 4138    %
 4139    \ifinner\else
 4140      \vadjust{\penalty 1200}% not good to break after first line of item.
 4141    \fi
 4142    % We can be in inner vertical mode in a footnote, although an
 4143    % @itemize looks awful there.
 4144   }%
 4145   \flushcr
 4146 }
 4147 
 4148 % \splitoff TOKENS\endmark defines \first to be the first token in
 4149 % TOKENS, and \rest to be the remainder.
 4150 %
 4151 \def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}%
 4152 
 4153 % Allow an optional argument of an uppercase letter, lowercase letter,
 4154 % or number, to specify the first label in the enumerated list.  No
 4155 % argument is the same as `1'.
 4156 %
 4157 \envparseargdef\enumerate{\enumeratey #1  \endenumeratey}
 4158 \def\enumeratey #1 #2\endenumeratey{%
 4159   % If we were given no argument, pretend we were given `1'.
 4160   \def\thearg{#1}%
 4161   \ifx\thearg\empty \def\thearg{1}\fi
 4162   %
 4163   % Detect if the argument is a single token.  If so, it might be a
 4164   % letter.  Otherwise, the only valid thing it can be is a number.
 4165   % (We will always have one token, because of the test we just made.
 4166   % This is a good thing, since \splitoff doesn't work given nothing at
 4167   % all -- the first parameter is undelimited.)
 4168   \expandafter\splitoff\thearg\endmark
 4169   \ifx\rest\empty
 4170     % Only one token in the argument.  It could still be anything.
 4171     % A ``lowercase letter'' is one whose \lccode is nonzero.
 4172     % An ``uppercase letter'' is one whose \lccode is both nonzero, and
 4173     %   not equal to itself.
 4174     % Otherwise, we assume it's a number.
 4175     %
 4176     % We need the \relax at the end of the \ifnum lines to stop TeX from
 4177     % continuing to look for a <number>.
 4178     %
 4179     \ifnum\lccode\expandafter`\thearg=0\relax
 4180       \numericenumerate % a number (we hope)
 4181     \else
 4182       % It's a letter.
 4183       \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax
 4184         \lowercaseenumerate % lowercase letter
 4185       \else
 4186         \uppercaseenumerate % uppercase letter
 4187       \fi
 4188     \fi
 4189   \else
 4190     % Multiple tokens in the argument.  We hope it's a number.
 4191     \numericenumerate
 4192   \fi
 4193 }
 4194 
 4195 % An @enumerate whose labels are integers.  The starting integer is
 4196 % given in \thearg.
 4197 %
 4198 \def\numericenumerate{%
 4199   \itemno = \thearg
 4200   \startenumeration{\the\itemno}%
 4201 }
 4202 
 4203 % The starting (lowercase) letter is in \thearg.
 4204 \def\lowercaseenumerate{%
 4205   \itemno = \expandafter`\thearg
 4206   \startenumeration{%
 4207     % Be sure we're not beyond the end of the alphabet.
 4208     \ifnum\itemno=0
 4209       \errmessage{No more lowercase letters in @enumerate; get a bigger
 4210                   alphabet}%
 4211     \fi
 4212     \char\lccode\itemno
 4213   }%
 4214 }
 4215 
 4216 % The starting (uppercase) letter is in \thearg.
 4217 \def\uppercaseenumerate{%
 4218   \itemno = \expandafter`\thearg
 4219   \startenumeration{%
 4220     % Be sure we're not beyond the end of the alphabet.
 4221     \ifnum\itemno=0
 4222       \errmessage{No more uppercase letters in @enumerate; get a bigger
 4223                   alphabet}
 4224     \fi
 4225     \char\uccode\itemno
 4226   }%
 4227 }
 4228 
 4229 % Call \doitemize, adding a period to the first argument and supplying the
 4230 % common last two arguments.  Also subtract one from the initial value in
 4231 % \itemno, since @item increments \itemno.
 4232 %
 4233 \def\startenumeration#1{%
 4234   \advance\itemno by -1
 4235   \doitemize{#1.}\flushcr
 4236 }
 4237 
 4238 % @alphaenumerate and @capsenumerate are abbreviations for giving an arg
 4239 % to @enumerate.
 4240 %
 4241 \def\alphaenumerate{\enumerate{a}}
 4242 \def\capsenumerate{\enumerate{A}}
 4243 \def\Ealphaenumerate{\Eenumerate}
 4244 \def\Ecapsenumerate{\Eenumerate}
 4245 
 4246 
 4247 % @multitable macros
 4248 % Amy Hendrickson, 8/18/94, 3/6/96
 4249 %
 4250 % @multitable ... @end multitable will make as many columns as desired.
 4251 % Contents of each column will wrap at width given in preamble.  Width
 4252 % can be specified either with sample text given in a template line,
 4253 % or in percent of \hsize, the current width of text on page.
 4254 
 4255 % Table can continue over pages but will only break between lines.
 4256 
 4257 % To make preamble:
 4258 %
 4259 % Either define widths of columns in terms of percent of \hsize:
 4260 %   @multitable @columnfractions .25 .3 .45
 4261 %   @item ...
 4262 %
 4263 %   Numbers following @columnfractions are the percent of the total
 4264 %   current hsize to be used for each column. You may use as many
 4265 %   columns as desired.
 4266 
 4267 
 4268 % Or use a template:
 4269 %   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
 4270 %   @item ...
 4271 %   using the widest term desired in each column.
 4272 
 4273 % Each new table line starts with @item, each subsequent new column
 4274 % starts with @tab. Empty columns may be produced by supplying @tab's
 4275 % with nothing between them for as many times as empty columns are needed,
 4276 % ie, @tab@tab@tab will produce two empty columns.
 4277 
 4278 % @item, @tab do not need to be on their own lines, but it will not hurt
 4279 % if they are.
 4280 
 4281 % Sample multitable:
 4282 
 4283 %   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
 4284 %   @item first col stuff @tab second col stuff @tab third col
 4285 %   @item
 4286 %   first col stuff
 4287 %   @tab
 4288 %   second col stuff
 4289 %   @tab
 4290 %   third col
 4291 %   @item first col stuff @tab second col stuff
 4292 %   @tab Many paragraphs of text may be used in any column.
 4293 %
 4294 %         They will wrap at the width determined by the template.
 4295 %   @item@tab@tab This will be in third column.
 4296 %   @end multitable
 4297 
 4298 % Default dimensions may be reset by user.
 4299 % @multitableparskip is vertical space between paragraphs in table.
 4300 % @multitableparindent is paragraph indent in table.
 4301 % @multitablecolmargin is horizontal space to be left between columns.
 4302 % @multitablelinespace is space to leave between table items, baseline
 4303 %                                                            to baseline.
 4304 %   0pt means it depends on current normal line spacing.
 4305 %
 4306 \newskip\multitableparskip
 4307 \newskip\multitableparindent
 4308 \newdimen\multitablecolspace
 4309 \newskip\multitablelinespace
 4310 \multitableparskip=0pt
 4311 \multitableparindent=6pt
 4312 \multitablecolspace=12pt
 4313 \multitablelinespace=0pt
 4314 
 4315 % Macros used to set up halign preamble:
 4316 %
 4317 \let\endsetuptable\relax
 4318 \def\xendsetuptable{\endsetuptable}
 4319 \let\columnfractions\relax
 4320 \def\xcolumnfractions{\columnfractions}
 4321 \newif\ifsetpercent
 4322 
 4323 % #1 is the @columnfraction, usually a decimal number like .5, but might
 4324 % be just 1.  We just use it, whatever it is.
 4325 %
 4326 \def\pickupwholefraction#1 {%
 4327   \global\advance\colcount by 1
 4328   \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}%
 4329   \setuptable
 4330 }
 4331 
 4332 \newcount\colcount
 4333 \def\setuptable#1{%
 4334   \def\firstarg{#1}%
 4335   \ifx\firstarg\xendsetuptable
 4336     \let\go = \relax
 4337   \else
 4338     \ifx\firstarg\xcolumnfractions
 4339       \global\setpercenttrue
 4340     \else
 4341       \ifsetpercent
 4342          \let\go\pickupwholefraction
 4343       \else
 4344          \global\advance\colcount by 1
 4345          \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a
 4346                    % separator; typically that is always in the input, anyway.
 4347          \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
 4348       \fi
 4349     \fi
 4350     \ifx\go\pickupwholefraction
 4351       % Put the argument back for the \pickupwholefraction call, so
 4352       % we'll always have a period there to be parsed.
 4353       \def\go{\pickupwholefraction#1}%
 4354     \else
 4355       \let\go = \setuptable
 4356     \fi%
 4357   \fi
 4358   \go
 4359 }
 4360 
 4361 % multitable-only commands.
 4362 %
 4363 % @headitem starts a heading row, which we typeset in bold.  Assignments
 4364 % have to be global since we are inside the implicit group of an
 4365 % alignment entry.  \everycr below resets \everytab so we don't have to
 4366 % undo it ourselves.
 4367 \def\headitemfont{\b}% for people to use in the template row; not changeable
 4368 \def\headitem{%
 4369   \checkenv\multitable
 4370   \crcr
 4371   \gdef\headitemcrhook{\nobreak}% attempt to avoid page break after headings
 4372   \global\everytab={\bf}% can't use \headitemfont since the parsing differs
 4373   \the\everytab % for the first item
 4374 }%
 4375 %
 4376 % default for tables with no headings.
 4377 \let\headitemcrhook=\relax
 4378 %
 4379 % A \tab used to include \hskip1sp.  But then the space in a template
 4380 % line is not enough.  That is bad.  So let's go back to just `&' until
 4381 % we again encounter the problem the 1sp was intended to solve.
 4382 %                   --karl, nathan@acm.org, 20apr99.
 4383 \def\tab{\checkenv\multitable &\the\everytab}%
 4384 
 4385 % @multitable ... @end multitable definitions:
 4386 %
 4387 \newtoks\everytab  % insert after every tab.
 4388 %
 4389 \envdef\multitable{%
 4390   \vskip\parskip
 4391   \startsavinginserts
 4392   %
 4393   % @item within a multitable starts a normal row.
 4394   % We use \def instead of \let so that if one of the multitable entries
 4395   % contains an @itemize, we don't choke on the \item (seen as \crcr aka
 4396   % \endtemplate) expanding \doitemize.
 4397   \def\item{\crcr}%
 4398   %
 4399   \tolerance=9500
 4400   \hbadness=9500
 4401   \setmultitablespacing
 4402   \parskip=\multitableparskip
 4403   \parindent=\multitableparindent
 4404   \overfullrule=0pt
 4405   \global\colcount=0
 4406   %
 4407   \everycr = {%
 4408     \noalign{%
 4409       \global\everytab={}% Reset from possible headitem.
 4410       \global\colcount=0 % Reset the column counter.
 4411       %
 4412       % Check for saved footnotes, etc.:
 4413       \checkinserts
 4414       %
 4415       % Perhaps a \nobreak, then reset:
 4416       \headitemcrhook
 4417       \global\let\headitemcrhook=\relax
 4418     }%
 4419   }%
 4420   %
 4421   \parsearg\domultitable
 4422 }
 4423 \def\domultitable#1{%
 4424   % To parse everything between @multitable and @item:
 4425   \setuptable#1 \endsetuptable
 4426   %
 4427   % This preamble sets up a generic column definition, which will
 4428   % be used as many times as user calls for columns.
 4429   % \vtop will set a single line and will also let text wrap and
 4430   % continue for many paragraphs if desired.
 4431   \halign\bgroup &%
 4432     \global\advance\colcount by 1
 4433     \multistrut
 4434     \vtop{%
 4435       % Use the current \colcount to find the correct column width:
 4436       \hsize=\expandafter\csname col\the\colcount\endcsname
 4437       %
 4438       % In order to keep entries from bumping into each other
 4439       % we will add a \leftskip of \multitablecolspace to all columns after
 4440       % the first one.
 4441       %
 4442       % If a template has been used, we will add \multitablecolspace
 4443       % to the width of each template entry.
 4444       %
 4445       % If the user has set preamble in terms of percent of \hsize we will
 4446       % use that dimension as the width of the column, and the \leftskip
 4447       % will keep entries from bumping into each other.  Table will start at
 4448       % left margin and final column will justify at right margin.
 4449       %
 4450       % Make sure we don't inherit \rightskip from the outer environment.
 4451       \rightskip=0pt
 4452       \ifnum\colcount=1
 4453     % The first column will be indented with the surrounding text.
 4454     \advance\hsize by\leftskip
 4455       \else
 4456     \ifsetpercent \else
 4457       % If user has not set preamble in terms of percent of \hsize
 4458       % we will advance \hsize by \multitablecolspace.
 4459       \advance\hsize by \multitablecolspace
 4460     \fi
 4461        % In either case we will make \leftskip=\multitablecolspace:
 4462       \leftskip=\multitablecolspace
 4463       \fi
 4464       % Ignoring space at the beginning and end avoids an occasional spurious
 4465       % blank line, when TeX decides to break the line at the space before the
 4466       % box from the multistrut, so the strut ends up on a line by itself.
 4467       % For example:
 4468       % @multitable @columnfractions .11 .89
 4469       % @item @code{#}
 4470       % @tab Legal holiday which is valid in major parts of the whole country.
 4471       % Is automatically provided with highlighting sequences respectively
 4472       % marking characters.
 4473       \noindent\ignorespaces##\unskip\multistrut
 4474     }\cr
 4475 }
 4476 \def\Emultitable{%
 4477   \crcr
 4478   \egroup % end the \halign
 4479   \global\setpercentfalse
 4480 }
 4481 
 4482 \def\setmultitablespacing{%
 4483   \def\multistrut{\strut}% just use the standard line spacing
 4484   %
 4485   % Compute \multitablelinespace (if not defined by user) for use in
 4486   % \multitableparskip calculation.  We used define \multistrut based on
 4487   % this, but (ironically) that caused the spacing to be off.
 4488   % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100.
 4489 \ifdim\multitablelinespace=0pt
 4490 \setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
 4491 \global\advance\multitablelinespace by-\ht0
 4492 \fi
 4493 % Test to see if parskip is larger than space between lines of
 4494 % table. If not, do nothing.
 4495 %        If so, set to same dimension as multitablelinespace.
 4496 \ifdim\multitableparskip>\multitablelinespace
 4497 \global\multitableparskip=\multitablelinespace
 4498 \global\advance\multitableparskip-7pt % to keep parskip somewhat smaller
 4499                                       % than skip between lines in the table.
 4500 \fi%
 4501 \ifdim\multitableparskip=0pt
 4502 \global\multitableparskip=\multitablelinespace
 4503 \global\advance\multitableparskip-7pt % to keep parskip somewhat smaller
 4504                                       % than skip between lines in the table.
 4505 \fi}
 4506 
 4507 
 4508 \message{conditionals,}
 4509 
 4510 % @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext,
 4511 % @ifnotxml always succeed.  They currently do nothing; we don't
 4512 % attempt to check whether the conditionals are properly nested.  But we
 4513 % have to remember that they are conditionals, so that @end doesn't
 4514 % attempt to close an environment group.
 4515 %
 4516 \def\makecond#1{%
 4517   \expandafter\let\csname #1\endcsname = \relax
 4518   \expandafter\let\csname iscond.#1\endcsname = 1
 4519 }
 4520 \makecond{iftex}
 4521 \makecond{ifnotdocbook}
 4522 \makecond{ifnothtml}
 4523 \makecond{ifnotinfo}
 4524 \makecond{ifnotplaintext}
 4525 \makecond{ifnotxml}
 4526 
 4527 % Ignore @ignore, @ifhtml, @ifinfo, and the like.
 4528 %
 4529 \def\direntry{\doignore{direntry}}
 4530 \def\documentdescription{\doignore{documentdescription}}
 4531 \def\docbook{\doignore{docbook}}
 4532 \def\html{\doignore{html}}
 4533 \def\ifdocbook{\doignore{ifdocbook}}
 4534 \def\ifhtml{\doignore{ifhtml}}
 4535 \def\ifinfo{\doignore{ifinfo}}
 4536 \def\ifnottex{\doignore{ifnottex}}
 4537 \def\ifplaintext{\doignore{ifplaintext}}
 4538 \def\ifxml{\doignore{ifxml}}
 4539 \def\ignore{\doignore{ignore}}
 4540 \def\menu{\doignore{menu}}
 4541 \def\xml{\doignore{xml}}
 4542 
 4543 % Ignore text until a line `@end #1', keeping track of nested conditionals.
 4544 %
 4545 % A count to remember the depth of nesting.
 4546 \newcount\doignorecount
 4547 
 4548 \def\doignore#1{\begingroup
 4549   % Scan in ``verbatim'' mode:
 4550   \obeylines
 4551   \catcode`\@ = \other
 4552   \catcode`\{ = \other
 4553   \catcode`\} = \other
 4554   %
 4555   % Make sure that spaces turn into tokens that match what \doignoretext wants.
 4556   \spaceisspace
 4557   %
 4558   % Count number of #1's that we've seen.
 4559   \doignorecount = 0
 4560   %
 4561   % Swallow text until we reach the matching `@end #1'.
 4562   \dodoignore{#1}%
 4563 }
 4564 
 4565 { \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source.
 4566   \obeylines %
 4567   %
 4568   \gdef\dodoignore#1{%
 4569     % #1 contains the command name as a string, e.g., `ifinfo'.
 4570     %
 4571     % Define a command to find the next `@end #1'.
 4572     \long\def\doignoretext##1^^M@end #1{%
 4573       \doignoretextyyy##1^^M@#1\_STOP_}%
 4574     %
 4575     % And this command to find another #1 command, at the beginning of a
 4576     % line.  (Otherwise, we would consider a line `@c @ifset', for
 4577     % example, to count as an @ifset for nesting.)
 4578     \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}%
 4579     %
 4580     % And now expand that command.
 4581     \doignoretext ^^M%
 4582   }%
 4583 }
 4584 
 4585 \def\doignoreyyy#1{%
 4586   \def\temp{#1}%
 4587   \ifx\temp\empty           % Nothing found.
 4588     \let\next\doignoretextzzz
 4589   \else                 % Found a nested condition, ...
 4590     \advance\doignorecount by 1
 4591     \let\next\doignoretextyyy       % ..., look for another.
 4592     % If we're here, #1 ends with ^^M\ifinfo (for example).
 4593   \fi
 4594   \next #1% the token \_STOP_ is present just after this macro.
 4595 }
 4596 
 4597 % We have to swallow the remaining "\_STOP_".
 4598 %
 4599 \def\doignoretextzzz#1{%
 4600   \ifnum\doignorecount = 0  % We have just found the outermost @end.
 4601     \let\next\enddoignore
 4602   \else             % Still inside a nested condition.
 4603     \advance\doignorecount by -1
 4604     \let\next\doignoretext      % Look for the next @end.
 4605   \fi
 4606   \next
 4607 }
 4608 
 4609 % Finish off ignored text.
 4610 { \obeylines%
 4611   % Ignore anything after the last `@end #1'; this matters in verbatim
 4612   % environments, where otherwise the newline after an ignored conditional
 4613   % would result in a blank line in the output.
 4614   \gdef\enddoignore#1^^M{\endgroup\ignorespaces}%
 4615 }
 4616 
 4617 
 4618 % @set VAR sets the variable VAR to an empty value.
 4619 % @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
 4620 %
 4621 % Since we want to separate VAR from REST-OF-LINE (which might be
 4622 % empty), we can't just use \parsearg; we have to insert a space of our
 4623 % own to delimit the rest of the line, and then take it out again if we
 4624 % didn't need it.
 4625 % We rely on the fact that \parsearg sets \catcode`\ =10.
 4626 %
 4627 \parseargdef\set{\setyyy#1 \endsetyyy}
 4628 \def\setyyy#1 #2\endsetyyy{%
 4629   {%
 4630     \makevalueexpandable
 4631     \def\temp{#2}%
 4632     \edef\next{\gdef\makecsname{SET#1}}%
 4633     \ifx\temp\empty
 4634       \next{}%
 4635     \else
 4636       \setzzz#2\endsetzzz
 4637     \fi
 4638   }%
 4639 }
 4640 % Remove the trailing space \setxxx inserted.
 4641 \def\setzzz#1 \endsetzzz{\next{#1}}
 4642 
 4643 % @clear VAR clears (i.e., unsets) the variable VAR.
 4644 %
 4645 \parseargdef\clear{%
 4646   {%
 4647     \makevalueexpandable
 4648     \global\expandafter\let\csname SET#1\endcsname=\relax
 4649   }%
 4650 }
 4651 
 4652 % @value{foo} gets the text saved in variable foo.
 4653 \def\value{\begingroup\makevalueexpandable\valuexxx}
 4654 \def\valuexxx#1{\expandablevalue{#1}\endgroup}
 4655 {
 4656   \catcode`\-=\active \catcode`\_=\active
 4657   %
 4658   \gdef\makevalueexpandable{%
 4659     \let\value = \expandablevalue
 4660     % We don't want these characters active, ...
 4661     \catcode`\-=\other \catcode`\_=\other
 4662     % ..., but we might end up with active ones in the argument if
 4663     % we're called from @code, as @code{@value{foo-bar_}}, though.
 4664     % So \let them to their normal equivalents.
 4665     \let-\normaldash \let_\normalunderscore
 4666   }
 4667 }
 4668 
 4669 \def\expandablevalue#1{%
 4670   \expandafter\ifx\csname SET#1\endcsname\relax
 4671     {[No value for ``#1'']}%
 4672     \message{Variable `#1', used in @value, is not set.}%
 4673   \else
 4674     \csname SET#1\endcsname
 4675   \fi
 4676 }
 4677 
 4678 % Like \expandablevalue, but completely expandable (the \message in the
 4679 % definition above operates at the execution level of TeX).  Used when
 4680 % writing to auxiliary files, due to the expansion that \write does.
 4681 % If flag is undefined, pass through an unexpanded @value command: maybe it
 4682 % will be set by the time it is read back in.
 4683 %
 4684 % NB flag names containing - or _ may not work here.
 4685 \def\dummyvalue#1{%
 4686   \expandafter\ifx\csname SET#1\endcsname\relax
 4687     \string\value{#1}%
 4688   \else
 4689     \csname SET#1\endcsname
 4690   \fi
 4691 }
 4692 
 4693 % Used for @value's in index entries to form the sort key: expand the @value
 4694 % if possible, otherwise sort late.
 4695 \def\indexnofontsvalue#1{%
 4696   \expandafter\ifx\csname SET#1\endcsname\relax
 4697     ZZZZZZZ%
 4698   \else
 4699     \csname SET#1\endcsname
 4700   \fi
 4701 }
 4702 
 4703 % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
 4704 % with @set.
 4705 %
 4706 % To get the special treatment we need for `@end ifset,' we call
 4707 % \makecond and then redefine.
 4708 %
 4709 \makecond{ifset}
 4710 \def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}}
 4711 \def\doifset#1#2{%
 4712   {%
 4713     \makevalueexpandable
 4714     \let\next=\empty
 4715     \expandafter\ifx\csname SET#2\endcsname\relax
 4716       #1% If not set, redefine \next.
 4717     \fi
 4718     \expandafter
 4719   }\next
 4720 }
 4721 \def\ifsetfail{\doignore{ifset}}
 4722 
 4723 % @ifclear VAR ... @end executes the `...' iff VAR has never been
 4724 % defined with @set, or has been undefined with @clear.
 4725 %
 4726 % The `\else' inside the `\doifset' parameter is a trick to reuse the
 4727 % above code: if the variable is not set, do nothing, if it is set,
 4728 % then redefine \next to \ifclearfail.
 4729 %
 4730 \makecond{ifclear}
 4731 \def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}}
 4732 \def\ifclearfail{\doignore{ifclear}}
 4733 
 4734 % @ifcommandisdefined CMD ... @end executes the `...' if CMD (written
 4735 % without the @) is in fact defined.  We can only feasibly check at the
 4736 % TeX level, so something like `mathcode' is going to considered
 4737 % defined even though it is not a Texinfo command.
 4738 %
 4739 \makecond{ifcommanddefined}
 4740 \def\ifcommanddefined{\parsearg{\doifcmddefined{\let\next=\ifcmddefinedfail}}}
 4741 %
 4742 \def\doifcmddefined#1#2{{%
 4743     \makevalueexpandable
 4744     \let\next=\empty
 4745     \expandafter\ifx\csname #2\endcsname\relax
 4746       #1% If not defined, \let\next as above.
 4747     \fi
 4748     \expandafter
 4749   }\next
 4750 }
 4751 \def\ifcmddefinedfail{\doignore{ifcommanddefined}}
 4752 
 4753 % @ifcommandnotdefined CMD ... handled similar to @ifclear above.
 4754 \makecond{ifcommandnotdefined}
 4755 \def\ifcommandnotdefined{%
 4756   \parsearg{\doifcmddefined{\else \let\next=\ifcmdnotdefinedfail}}}
 4757 \def\ifcmdnotdefinedfail{\doignore{ifcommandnotdefined}}
 4758 
 4759 % Set the `txicommandconditionals' variable, so documents have a way to
 4760 % test if the @ifcommand...defined conditionals are available.
 4761 \set txicommandconditionals
 4762 
 4763 % @dircategory CATEGORY  -- specify a category of the dir file
 4764 % which this file should belong to.  Ignore this in TeX.
 4765 \let\dircategory=\comment
 4766 
 4767 % @defininfoenclose.
 4768 \let\definfoenclose=\comment
 4769 
 4770 
 4771 \message{indexing,}
 4772 % Index generation facilities
 4773 
 4774 % Define \newwrite to be identical to plain tex's \newwrite
 4775 % except not \outer, so it can be used within macros and \if's.
 4776 \edef\newwrite{\makecsname{ptexnewwrite}}
 4777 
 4778 % \newindex {foo} defines an index named IX.
 4779 % It automatically defines \IXindex such that
 4780 % \IXindex ...rest of line... puts an entry in the index IX.
 4781 % It also defines \IXindfile to be the number of the output channel for
 4782 % the file that accumulates this index.  The file's extension is IX.
 4783 % The name of an index should be no more than 2 characters long
 4784 % for the sake of vms.
 4785 %
 4786 \def\newindex#1{%
 4787   \expandafter\chardef\csname#1indfile\endcsname=0
 4788   \expandafter\xdef\csname#1index\endcsname{%     % Define @#1index
 4789     \noexpand\doindex{#1}}
 4790 }
 4791 
 4792 % @defindex foo  ==  \newindex{foo}
 4793 %
 4794 \def\defindex{\parsearg\newindex}
 4795 
 4796 % Define @defcodeindex, like @defindex except put all entries in @code.
 4797 %
 4798 \def\defcodeindex{\parsearg\newcodeindex}
 4799 %
 4800 \def\newcodeindex#1{%
 4801   \expandafter\chardef\csname#1indfile\endcsname=0
 4802   \expandafter\xdef\csname#1index\endcsname{%
 4803     \noexpand\docodeindex{#1}}%
 4804 }
 4805 
 4806 % The default indices:
 4807 \newindex{cp}%      concepts,
 4808 \newcodeindex{fn}%  functions,
 4809 \newcodeindex{vr}%  variables,
 4810 \newcodeindex{tp}%  types,
 4811 \newcodeindex{ky}%  keys
 4812 \newcodeindex{pg}%  and programs.
 4813 
 4814 
 4815 % @synindex foo bar    makes index foo feed into index bar.
 4816 % Do this instead of @defindex foo if you don't want it as a separate index.
 4817 %
 4818 % @syncodeindex foo bar   similar, but put all entries made for index foo
 4819 % inside @code.
 4820 %
 4821 \def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}}
 4822 \def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}}
 4823 
 4824 % #1 is \doindex or \docodeindex, #2 the index getting redefined (foo),
 4825 % #3 the target index (bar).
 4826 \def\dosynindex#1#2#3{%
 4827   \requireopenindexfile{#3}%
 4828   % redefine \fooindfile:
 4829   \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname
 4830   \expandafter\let\csname#2indfile\endcsname=\temp
 4831   % redefine \fooindex:
 4832   \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}%
 4833 }
 4834 
 4835 % Define \doindex, the driver for all index macros.
 4836 % Argument #1 is generated by the calling \fooindex macro,
 4837 % and it is the two-letter name of the index.
 4838 
 4839 \def\doindex#1{\edef\indexname{#1}\parsearg\doindexxxx}
 4840 \def\doindexxxx #1{\doind{\indexname}{#1}}
 4841 
 4842 % like the previous two, but they put @code around the argument.
 4843 \def\docodeindex#1{\edef\indexname{#1}\parsearg\docodeindexxxx}
 4844 \def\docodeindexxxx #1{\doind{\indexname}{\code{#1}}}
 4845 
 4846 
 4847 % Used for the aux, toc and index files to prevent expansion of Texinfo
 4848 % commands.
 4849 %
 4850 \def\atdummies{%
 4851   \definedummyletter\@%
 4852   \definedummyletter\ %
 4853   \definedummyletter\{%
 4854   \definedummyletter\}%
 4855   \definedummyletter\&%
 4856   %
 4857   % Do the redefinitions.
 4858   \definedummies
 4859   \otherbackslash
 4860 }
 4861 
 4862 % \definedummyword defines \#1 as \string\#1\space, thus effectively
 4863 % preventing its expansion.  This is used only for control words,
 4864 % not control letters, because the \space would be incorrect for
 4865 % control characters, but is needed to separate the control word
 4866 % from whatever follows.
 4867 %
 4868 % These can be used both for control words that take an argument and
 4869 % those that do not.  If it is followed by {arg} in the input, then
 4870 % that will dutifully get written to the index (or wherever).
 4871 %
 4872 % For control letters, we have \definedummyletter, which omits the
 4873 % space.
 4874 %
 4875 \def\definedummyword  #1{\def#1{\string#1\space}}%
 4876 \def\definedummyletter#1{\def#1{\string#1}}%
 4877 \let\definedummyaccent\definedummyletter
 4878 
 4879 % Called from \atdummies to prevent the expansion of commands.
 4880 %
 4881 \def\definedummies{%
 4882   %
 4883   \let\commondummyword\definedummyword
 4884   \let\commondummyletter\definedummyletter
 4885   \let\commondummyaccent\definedummyaccent
 4886   \commondummiesnofonts
 4887   %
 4888   \definedummyletter\_%
 4889   \definedummyletter\-%
 4890   %
 4891   % Non-English letters.
 4892   \definedummyword\AA
 4893   \definedummyword\AE
 4894   \definedummyword\DH
 4895   \definedummyword\L
 4896   \definedummyword\O
 4897   \definedummyword\OE
 4898   \definedummyword\TH
 4899   \definedummyword\aa
 4900   \definedummyword\ae
 4901   \definedummyword\dh
 4902   \definedummyword\exclamdown
 4903   \definedummyword\l
 4904   \definedummyword\o
 4905   \definedummyword\oe
 4906   \definedummyword\ordf
 4907   \definedummyword\ordm
 4908   \definedummyword\questiondown
 4909   \definedummyword\ss
 4910   \definedummyword\th
 4911   %
 4912   % Although these internal commands shouldn't show up, sometimes they do.
 4913   \definedummyword\bf
 4914   \definedummyword\gtr
 4915   \definedummyword\hat
 4916   \definedummyword\less
 4917   \definedummyword\sf
 4918   \definedummyword\sl
 4919   \definedummyword\tclose
 4920   \definedummyword\tt
 4921   %
 4922   \definedummyword\LaTeX
 4923   \definedummyword\TeX
 4924   %
 4925   % Assorted special characters.
 4926   \definedummyword\ampchar
 4927   \definedummyword\atchar
 4928   \definedummyword\arrow
 4929   \definedummyword\backslashchar
 4930   \definedummyword\bullet
 4931   \definedummyword\comma
 4932   \definedummyword\copyright
 4933   \definedummyword\registeredsymbol
 4934   \definedummyword\dots
 4935   \definedummyword\enddots
 4936   \definedummyword\entrybreak
 4937   \definedummyword\equiv
 4938   \definedummyword\error
 4939   \definedummyword\euro
 4940   \definedummyword\expansion
 4941   \definedummyword\geq
 4942   \definedummyword\guillemetleft
 4943   \definedummyword\guillemetright
 4944   \definedummyword\guilsinglleft
 4945   \definedummyword\guilsinglright
 4946   \definedummyword\lbracechar
 4947   \definedummyword\leq
 4948   \definedummyword\mathopsup
 4949   \definedummyword\minus
 4950   \definedummyword\ogonek
 4951   \definedummyword\pounds
 4952   \definedummyword\point
 4953   \definedummyword\print
 4954   \definedummyword\quotedblbase
 4955   \definedummyword\quotedblleft
 4956   \definedummyword\quotedblright
 4957   \definedummyword\quoteleft
 4958   \definedummyword\quoteright
 4959   \definedummyword\quotesinglbase
 4960   \definedummyword\rbracechar
 4961   \definedummyword\result
 4962   \definedummyword\sub
 4963   \definedummyword\sup
 4964   \definedummyword\textdegree
 4965   %
 4966   \definedummyword\subentry
 4967   %
 4968   % We want to disable all macros so that they are not expanded by \write.
 4969   \macrolist
 4970   \let\value\dummyvalue
 4971   %
 4972   \normalturnoffactive
 4973 }
 4974 
 4975 % \commondummiesnofonts: common to \definedummies and \indexnofonts.
 4976 % Define \commondummyletter, \commondummyaccent and \commondummyword before
 4977 % using.  Used for accents, font commands, and various control letters.
 4978 %
 4979 \def\commondummiesnofonts{%
 4980   % Control letters and accents.
 4981   \commondummyletter\!%
 4982   \commondummyaccent\"%
 4983   \commondummyaccent\'%
 4984   \commondummyletter\*%
 4985   \commondummyaccent\,%
 4986   \commondummyletter\.%
 4987   \commondummyletter\/%
 4988   \commondummyletter\:%
 4989   \commondummyaccent\=%
 4990   \commondummyletter\?%
 4991   \commondummyaccent\^%
 4992   \commondummyaccent\`%
 4993   \commondummyaccent\~%
 4994   \commondummyword\u
 4995   \commondummyword\v
 4996   \commondummyword\H
 4997   \commondummyword\dotaccent
 4998   \commondummyword\ogonek
 4999   \commondummyword\ringaccent
 5000   \commondummyword\tieaccent
 5001   \commondummyword\ubaraccent
 5002   \commondummyword\udotaccent
 5003   \commondummyword\dotless
 5004   %
 5005   % Texinfo font commands.
 5006   \commondummyword\b
 5007   \commondummyword\i
 5008   \commondummyword\r
 5009   \commondummyword\sansserif
 5010   \commondummyword\sc
 5011   \commondummyword\slanted
 5012   \commondummyword\t
 5013   %
 5014   % Commands that take arguments.
 5015   \commondummyword\abbr
 5016   \commondummyword\acronym
 5017   \commondummyword\anchor
 5018   \commondummyword\cite
 5019   \commondummyword\code
 5020   \commondummyword\command
 5021   \commondummyword\dfn
 5022   \commondummyword\dmn
 5023   \commondummyword\email
 5024   \commondummyword\emph
 5025   \commondummyword\env
 5026   \commondummyword\file
 5027   \commondummyword\image
 5028   \commondummyword\indicateurl
 5029   \commondummyword\inforef
 5030   \commondummyword\kbd
 5031   \commondummyword\key
 5032   \commondummyword\math
 5033   \commondummyword\option
 5034   \commondummyword\pxref
 5035   \commondummyword\ref
 5036   \commondummyword\samp
 5037   \commondummyword\strong
 5038   \commondummyword\tie
 5039   \commondummyword\U
 5040   \commondummyword\uref
 5041   \commondummyword\url
 5042   \commondummyword\var
 5043   \commondummyword\verb
 5044   \commondummyword\w
 5045   \commondummyword\xref
 5046 }
 5047 
 5048 \let\indexlbrace\relax
 5049 \let\indexrbrace\relax
 5050 \let\indexatchar\relax
 5051 \let\indexbackslash\relax
 5052 
 5053 {\catcode`\@=0
 5054 \catcode`\\=13
 5055   @gdef@backslashdisappear{@def\{}}
 5056 }
 5057 
 5058 {
 5059 \catcode`\<=13
 5060 \catcode`\-=13
 5061 \catcode`\`=13
 5062   \gdef\indexnonalnumdisappear{%
 5063     \expandafter\ifx\csname SETtxiindexlquoteignore\endcsname\relax\else
 5064       % @set txiindexlquoteignore makes us ignore left quotes in the sort term.
 5065       % (Introduced for FSFS 2nd ed.)
 5066       \let`=\empty
 5067     \fi
 5068     %
 5069     \expandafter\ifx\csname SETtxiindexbackslashignore\endcsname\relax\else
 5070       \backslashdisappear
 5071     \fi
 5072     %
 5073     \expandafter\ifx\csname SETtxiindexhyphenignore\endcsname\relax\else
 5074       \def-{}%
 5075     \fi
 5076     \expandafter\ifx\csname SETtxiindexlessthanignore\endcsname\relax\else
 5077       \def<{}%
 5078     \fi
 5079     \expandafter\ifx\csname SETtxiindexatsignignore\endcsname\relax\else
 5080       \def\@{}%
 5081     \fi
 5082   }
 5083 
 5084   \gdef\indexnonalnumreappear{%
 5085     \let-\normaldash
 5086     \let<\normalless
 5087   }
 5088 }
 5089 
 5090 
 5091 % \indexnofonts is used when outputting the strings to sort the index
 5092 % by, and when constructing control sequence names.  It eliminates all
 5093 % control sequences and just writes whatever the best ASCII sort string
 5094 % would be for a given command (usually its argument).
 5095 %
 5096 \def\indexnofonts{%
 5097   % Accent commands should become @asis.
 5098   \def\commondummyaccent##1{\let##1\asis}%
 5099   % We can just ignore other control letters.
 5100   \def\commondummyletter##1{\let##1\empty}%
 5101   % All control words become @asis by default; overrides below.
 5102   \let\commondummyword\commondummyaccent
 5103   \commondummiesnofonts
 5104   %
 5105   % Don't no-op \tt, since it isn't a user-level command
 5106   % and is used in the definitions of the active chars like <, >, |, etc.
 5107   % Likewise with the other plain tex font commands.
 5108   %\let\tt=\asis
 5109   %
 5110   \def\ { }%
 5111   \def\@{@}%
 5112   \def\_{\normalunderscore}%
 5113   \def\-{}% @- shouldn't affect sorting
 5114   %
 5115   \uccode`\1=`\{ \uppercase{\def\{{1}}%
 5116   \uccode`\1=`\} \uppercase{\def\}{1}}%
 5117   \let\lbracechar\{%
 5118   \let\rbracechar\}%
 5119   %
 5120   % Non-English letters.
 5121   \def\AA{AA}%
 5122   \def\AE{AE}%
 5123   \def\DH{DZZ}%
 5124   \def\L{L}%
 5125   \def\OE{OE}%
 5126   \def\O{O}%
 5127   \def\TH{TH}%
 5128   \def\aa{aa}%
 5129   \def\ae{ae}%
 5130   \def\dh{dzz}%
 5131   \def\exclamdown{!}%
 5132   \def\l{l}%
 5133   \def\oe{oe}%
 5134   \def\ordf{a}%
 5135   \def\ordm{o}%
 5136   \def\o{o}%
 5137   \def\questiondown{?}%
 5138   \def\ss{ss}%
 5139   \def\th{th}%
 5140   %
 5141   \def\LaTeX{LaTeX}%
 5142   \def\TeX{TeX}%
 5143   %
 5144   % Assorted special characters.  \defglyph gives the control sequence a
 5145   % definition that removes the {} that follows its use.
 5146   \defglyph\atchar{@}%
 5147   \defglyph\arrow{->}%
 5148   \defglyph\bullet{bullet}%
 5149   \defglyph\comma{,}%
 5150   \defglyph\copyright{copyright}%
 5151   \defglyph\dots{...}%
 5152   \defglyph\enddots{...}%
 5153   \defglyph\equiv{==}%
 5154   \defglyph\error{error}%
 5155   \defglyph\euro{euro}%
 5156   \defglyph\expansion{==>}%
 5157   \defglyph\geq{>=}%
 5158   \defglyph\guillemetleft{<<}%
 5159   \defglyph\guillemetright{>>}%
 5160   \defglyph\guilsinglleft{<}%
 5161   \defglyph\guilsinglright{>}%
 5162   \defglyph\leq{<=}%
 5163   \defglyph\lbracechar{\{}%
 5164   \defglyph\minus{-}%
 5165   \defglyph\point{.}%
 5166   \defglyph\pounds{pounds}%
 5167   \defglyph\print{-|}%
 5168   \defglyph\quotedblbase{"}%
 5169   \defglyph\quotedblleft{"}%
 5170   \defglyph\quotedblright{"}%
 5171   \defglyph\quoteleft{`}%
 5172   \defglyph\quoteright{'}%
 5173   \defglyph\quotesinglbase{,}%
 5174   \defglyph\rbracechar{\}}%
 5175   \defglyph\registeredsymbol{R}%
 5176   \defglyph\result{=>}%
 5177   \defglyph\textdegree{o}%
 5178   %
 5179   % We need to get rid of all macros, leaving only the arguments (if present).
 5180   % Of course this is not nearly correct, but it is the best we can do for now.
 5181   % makeinfo does not expand macros in the argument to @deffn, which ends up
 5182   % writing an index entry, and texindex isn't prepared for an index sort entry
 5183   % that starts with \.
 5184   %
 5185   % Since macro invocations are followed by braces, we can just redefine them
 5186   % to take a single TeX argument.  The case of a macro invocation that
 5187   % goes to end-of-line is not handled.
 5188   %
 5189   \macrolist
 5190   \let\value\indexnofontsvalue
 5191 }
 5192 \def\defglyph#1#2{\def#1##1{#2}} % see above
 5193 
 5194 
 5195 
 5196 
 5197 % #1 is the index name, #2 is the entry text.
 5198 \def\doind#1#2{%
 5199   \iflinks
 5200   {%
 5201     %
 5202     \requireopenindexfile{#1}%
 5203     \edef\writeto{\csname#1indfile\endcsname}%
 5204     %
 5205     \def\indextext{#2}%
 5206     \safewhatsit\doindwrite
 5207   }%
 5208   \fi
 5209 }
 5210 
 5211 % Check if an index file has been opened, and if not, open it.
 5212 \def\requireopenindexfile#1{%
 5213 \ifnum\csname #1indfile\endcsname=0
 5214   \expandafter\newwrite \csname#1indfile\endcsname
 5215   \edef\suffix{#1}%
 5216   % A .fls suffix would conflict with the file extension for the output
 5217   % of -recorder, so use .f1s instead.
 5218   \ifx\suffix\indexisfl\def\suffix{f1}\fi
 5219   % Open the file
 5220   \immediate\openout\csname#1indfile\endcsname \jobname.\suffix
 5221   % Using \immediate above here prevents an object entering into the current
 5222   % box, which could confound checks such as those in \safewhatsit for
 5223   % preceding skips.
 5224   \typeout{Writing index file \jobname.\suffix}%
 5225 \fi}
 5226 \def\indexisfl{fl}
 5227 
 5228 % Definition for writing index entry sort key.
 5229 {
 5230 \catcode`\-=13
 5231 \gdef\indexwritesortas{%
 5232   \begingroup
 5233   \indexnonalnumreappear
 5234   \indexwritesortasxxx}
 5235 \gdef\indexwritesortasxxx#1{%
 5236   \xdef\indexsortkey{#1}\endgroup}
 5237 }
 5238 
 5239 \def\indexwriteseealso#1{
 5240   \gdef\pagenumbertext{\string\seealso{#1}}%
 5241 }
 5242 \def\indexwriteseeentry#1{
 5243   \gdef\pagenumbertext{\string\seeentry{#1}}%
 5244 }
 5245 
 5246 % The default definitions
 5247 \def\sortas#1{}%
 5248 \def\seealso#1{\i{\putwordSeeAlso}\ #1}% for sorted index file only
 5249 \def\putwordSeeAlso{See also}
 5250 \def\seeentry#1{\i{\putwordSee}\ #1}% for sorted index file only
 5251 
 5252 
 5253 % Given index entry text like "aaa @subentry bbb @sortas{ZZZ}":
 5254 %   * Set \bracedtext to "{aaa}{bbb}"
 5255 %   * Set \fullindexsortkey to "aaa @subentry ZZZ"
 5256 %   * If @seealso occurs, set \pagenumbertext
 5257 %
 5258 \def\splitindexentry#1{%
 5259   \gdef\fullindexsortkey{}%
 5260   \xdef\bracedtext{}%
 5261   \def\sep{}%
 5262   \def\seealso##1{}%
 5263   \def\seeentry##1{}%
 5264   \expandafter\doindexsegment#1\subentry\finish\subentry
 5265 }
 5266 
 5267 % append the results from the next segment
 5268 \def\doindexsegment#1\subentry{%
 5269   \def\segment{#1}%
 5270   \ifx\segment\isfinish
 5271   \else
 5272     %
 5273     % Fully expand the segment, throwing away any @sortas directives, and
 5274     % trim spaces.
 5275     \edef\trimmed{\segment}%
 5276     \edef\trimmed{\expandafter\eatspaces\expandafter{\trimmed}}%
 5277     %
 5278     \xdef\bracedtext{\bracedtext{\trimmed}}%
 5279     %
 5280     % Get the string to sort by.  Process the segment with all
 5281     % font commands turned off.
 5282     \bgroup
 5283       \let\sortas\indexwritesortas
 5284       \let\seealso\indexwriteseealso
 5285       \let\seeentry\indexwriteseeentry
 5286       \indexnofonts
 5287       % The braces around the commands are recognized by texindex.
 5288       \def\lbracechar{{\string\indexlbrace}}%
 5289       \def\rbracechar{{\string\indexrbrace}}%
 5290       \let\{=\lbracechar
 5291       \let\}=\rbracechar
 5292       \def\@{{\string\indexatchar}}%
 5293       \def\atchar##1{\@}%
 5294       \def\backslashchar{{\string\indexbackslash}}%
 5295       \uccode`\~=`\\ \uppercase{\let~\backslashchar}%
 5296       %
 5297       \let\indexsortkey\empty
 5298       \global\let\pagenumbertext\empty
 5299       % Execute the segment and throw away the typeset output.  This executes
 5300       % any @sortas or @seealso commands in this segment.
 5301       \setbox\dummybox = \hbox{\segment}%
 5302       \ifx\indexsortkey\empty{%
 5303         \indexnonalnumdisappear
 5304         \xdef\trimmed{\segment}%
 5305         \xdef\trimmed{\expandafter\eatspaces\expandafter{\trimmed}}%
 5306         \xdef\indexsortkey{\trimmed}%
 5307         \ifx\indexsortkey\empty\xdef\indexsortkey{ }\fi
 5308       }\fi
 5309       %
 5310       % Append to \fullindexsortkey.
 5311       \edef\tmp{\gdef\noexpand\fullindexsortkey{%
 5312                   \fullindexsortkey\sep\indexsortkey}}%
 5313       \tmp
 5314     \egroup
 5315     \def\sep{\subentry}%
 5316     %
 5317     \expandafter\doindexsegment
 5318   \fi
 5319 }
 5320 \def\isfinish{\finish}%
 5321 \newbox\dummybox % used above
 5322 
 5323 \let\subentry\relax
 5324 
 5325 % Use \ instead of @ in index files.  To support old texi2dvi and texindex.
 5326 % This works without changing the escape character used in the toc or aux
 5327 % files because the index entries are fully expanded here, and \string uses
 5328 % the current value of \escapechar.
 5329 \def\escapeisbackslash{\escapechar=`\\}
 5330 
 5331 % Use \ in index files by default.  texi2dvi didn't support @ as the escape
 5332 % character (as it checked for "\entry" in the files, and not "@entry").  When
 5333 % the new version of texi2dvi has had a chance to become more prevalent, then
 5334 % the escape character can change back to @ again.  This should be an easy
 5335 % change to make now because both @ and \ are only used as escape characters in
 5336 % index files, never standing for themselves.
 5337 %
 5338 \set txiindexescapeisbackslash
 5339 
 5340 % Write the entry in \indextext to the index file.
 5341 %
 5342 \def\doindwrite{%
 5343   \maybemarginindex
 5344   %
 5345   \atdummies
 5346   %
 5347   \expandafter\ifx\csname SETtxiindexescapeisbackslash\endcsname\relax\else
 5348     \escapeisbackslash
 5349   \fi
 5350   %
 5351   % For texindex which always views { and } as separators.
 5352   \def\{{\lbracechar{}}%
 5353   \def\}{\rbracechar{}}%
 5354   \uccode`\~=`\\ \uppercase{\def~{\backslashchar{}}}%
 5355   %
 5356   % Split the entry into primary entry and any subentries, and get the index
 5357   % sort key.
 5358   \splitindexentry\indextext
 5359   %
 5360   % Set up the complete index entry, with both the sort key and
 5361   % the original text, including any font commands.  We write
 5362   % three arguments to \entry to the .?? file (four in the
 5363   % subentry case), texindex reduces to two when writing the .??s
 5364   % sorted result.
 5365   %
 5366   \edef\temp{%
 5367     \write\writeto{%
 5368       \string\entry{\fullindexsortkey}%
 5369         {\ifx\pagenumbertext\empty\noexpand\folio\else\pagenumbertext\fi}%
 5370         \bracedtext}%
 5371   }%
 5372   \temp
 5373 }
 5374 
 5375 % Put the index entry in the margin if desired (undocumented).
 5376 \def\maybemarginindex{%
 5377   \ifx\SETmarginindex\relax\else
 5378     \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \relax\indextext}}%
 5379   \fi
 5380 }
 5381 \let\SETmarginindex=\relax
 5382 
 5383 
 5384 % Take care of unwanted page breaks/skips around a whatsit:
 5385 %
 5386 % If a skip is the last thing on the list now, preserve it
 5387 % by backing up by \lastskip, doing the \write, then inserting
 5388 % the skip again.  Otherwise, the whatsit generated by the
 5389 % \write or \pdfdest will make \lastskip zero.  The result is that
 5390 % sequences like this:
 5391 % @end defun
 5392 % @tindex whatever
 5393 % @defun ...
 5394 % will have extra space inserted, because the \medbreak in the
 5395 % start of the @defun won't see the skip inserted by the @end of
 5396 % the previous defun.
 5397 %
 5398 % But don't do any of this if we're not in vertical mode.  We
 5399 % don't want to do a \vskip and prematurely end a paragraph.
 5400 %
 5401 % Avoid page breaks due to these extra skips, too.
 5402 %
 5403 % But wait, there is a catch there:
 5404 % We'll have to check whether \lastskip is zero skip.  \ifdim is not
 5405 % sufficient for this purpose, as it ignores stretch and shrink parts
 5406 % of the skip.  The only way seems to be to check the textual
 5407 % representation of the skip.
 5408 %
 5409 % The following is almost like \def\zeroskipmacro{0.0pt} except that
 5410 % the ``p'' and ``t'' characters have catcode \other, not 11 (letter).
 5411 %
 5412 \edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname}
 5413 %
 5414 \newskip\whatsitskip
 5415 \newcount\whatsitpenalty
 5416 %
 5417 % ..., ready, GO:
 5418 %
 5419 \def\safewhatsit#1{\ifhmode
 5420   #1%
 5421  \else
 5422   % \lastskip and \lastpenalty cannot both be nonzero simultaneously.
 5423   \whatsitskip = \lastskip
 5424   \edef\lastskipmacro{\the\lastskip}%
 5425   \whatsitpenalty = \lastpenalty
 5426   %
 5427   % If \lastskip is nonzero, that means the last item was a
 5428   % skip.  And since a skip is discardable, that means this
 5429   % -\whatsitskip glue we're inserting is preceded by a
 5430   % non-discardable item, therefore it is not a potential
 5431   % breakpoint, therefore no \nobreak needed.
 5432   \ifx\lastskipmacro\zeroskipmacro
 5433   \else
 5434     \vskip-\whatsitskip
 5435   \fi
 5436   %
 5437   #1%
 5438   %
 5439   \ifx\lastskipmacro\zeroskipmacro
 5440     % If \lastskip was zero, perhaps the last item was a penalty, and
 5441     % perhaps it was >=10000, e.g., a \nobreak.  In that case, we want
 5442     % to re-insert the same penalty (values >10000 are used for various
 5443     % signals); since we just inserted a non-discardable item, any
 5444     % following glue (such as a \parskip) would be a breakpoint.  For example:
 5445     %   @deffn deffn-whatever
 5446     %   @vindex index-whatever
 5447     %   Description.
 5448     % would allow a break between the index-whatever whatsit
 5449     % and the "Description." paragraph.
 5450     \ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi
 5451   \else
 5452     % On the other hand, if we had a nonzero \lastskip,
 5453     % this make-up glue would be preceded by a non-discardable item
 5454     % (the whatsit from the \write), so we must insert a \nobreak.
 5455     \nobreak\vskip\whatsitskip
 5456   \fi
 5457 \fi}
 5458 
 5459 % The index entry written in the file actually looks like
 5460 %  \entry {sortstring}{page}{topic}
 5461 % or
 5462 %  \entry {sortstring}{page}{topic}{subtopic}
 5463 % The texindex program reads in these files and writes files
 5464 % containing these kinds of lines:
 5465 %  \initial {c}
 5466 %     before the first topic whose initial is c
 5467 %  \entry {topic}{pagelist}
 5468 %     for a topic that is used without subtopics
 5469 %  \primary {topic}
 5470 %  \entry {topic}{}
 5471 %     for the beginning of a topic that is used with subtopics
 5472 %  \secondary {subtopic}{pagelist}
 5473 %     for each subtopic.
 5474 %  \secondary {subtopic}{}
 5475 %     for a subtopic with sub-subtopics
 5476 %  \tertiary {subtopic}{subsubtopic}{pagelist}
 5477 %     for each sub-subtopic.
 5478 
 5479 % Define the user-accessible indexing commands
 5480 % @findex, @vindex, @kindex, @cindex.
 5481 
 5482 \def\findex {\fnindex}
 5483 \def\kindex {\kyindex}
 5484 \def\cindex {\cpindex}
 5485 \def\vindex {\vrindex}
 5486 \def\tindex {\tpindex}
 5487 \def\pindex {\pgindex}
 5488 
 5489 % Define the macros used in formatting output of the sorted index material.
 5490 
 5491 % @printindex causes a particular index (the ??s file) to get printed.
 5492 % It does not print any chapter heading (usually an @unnumbered).
 5493 %
 5494 \parseargdef\printindex{\begingroup
 5495   \dobreak \chapheadingskip{10000}%
 5496   %
 5497   \smallfonts \rm
 5498   \tolerance = 9500
 5499   \plainfrenchspacing
 5500   \everypar = {}% don't want the \kern\-parindent from indentation suppression.
 5501   %
 5502   % See comment in \requireopenindexfile.
 5503   \def\indexname{#1}\ifx\indexname\indexisfl\def\indexname{f1}\fi
 5504   %
 5505   % See if the index file exists and is nonempty.
 5506   \openin 1 \jobname.\indexname s
 5507   \ifeof 1
 5508     % \enddoublecolumns gets confused if there is no text in the index,
 5509     % and it loses the chapter title and the aux file entries for the
 5510     % index.  The easiest way to prevent this problem is to make sure
 5511     % there is some text.
 5512     \putwordIndexNonexistent
 5513     \typeout{No file \jobname.\indexname s.}%
 5514   \else
 5515     % If the index file exists but is empty, then \openin leaves \ifeof
 5516     % false.  We have to make TeX try to read something from the file, so
 5517     % it can discover if there is anything in it.
 5518     \read 1 to \thisline
 5519     \ifeof 1
 5520       \putwordIndexIsEmpty
 5521     \else
 5522       \expandafter\printindexzz\thisline\relax\relax\finish%
 5523     \fi
 5524   \fi
 5525   \closein 1
 5526 \endgroup}
 5527 
 5528 % If the index file starts with a backslash, forgo reading the index
 5529 % file altogether.  If somebody upgrades texinfo.tex they may still have
 5530 % old index files using \ as the escape character.  Reading this would
 5531 % at best lead to typesetting garbage, at worst a TeX syntax error.
 5532 \def\printindexzz#1#2\finish{%
 5533   \expandafter\ifx\csname SETtxiindexescapeisbackslash\endcsname\relax
 5534     \uccode`\~=`\\ \uppercase{\if\noexpand~}\noexpand#1
 5535       \expandafter\ifx\csname SETtxiskipindexfileswithbackslash\endcsname\relax
 5536 \errmessage{%
 5537 ERROR: A sorted index file in an obsolete format was skipped.
 5538 To fix this problem, please upgrade your version of 'texi2dvi'
 5539 or 'texi2pdf' to that at <https://ftp.gnu.org/gnu/texinfo>.
 5540 If you are using an old version of 'texindex' (part of the Texinfo
 5541 distribution), you may also need to upgrade to a newer version (at least 6.0).
 5542 You may be able to typeset the index if you run
 5543 'texindex \jobname.\indexname' yourself.
 5544 You could also try setting the 'txiindexescapeisbackslash' flag by
 5545 running a command like
 5546 'texi2dvi -t "@set txiindexescapeisbackslash" \jobname.texi'.  If you do
 5547 this, Texinfo will try to use index files in the old format.
 5548 If you continue to have problems, deleting the index files and starting again
 5549 might help (with 'rm \jobname.?? \jobname.??s')%
 5550 }%
 5551       \else
 5552         (Skipped sorted index file in obsolete format)
 5553       \fi
 5554     \else
 5555       \begindoublecolumns
 5556       \input \jobname.\indexname s
 5557       \enddoublecolumns
 5558     \fi
 5559   \else
 5560     \begindoublecolumns
 5561     \catcode`\\=0\relax
 5562     \catcode`\@=12\relax
 5563     \input \jobname.\indexname s
 5564     \enddoublecolumns
 5565   \fi
 5566 }
 5567 
 5568 % These macros are used by the sorted index file itself.
 5569 % Change them to control the appearance of the index.
 5570 
 5571 {\catcode`\/=13 \catcode`\-=13 \catcode`\^=13 \catcode`\~=13 \catcode`\_=13
 5572 \catcode`\|=13 \catcode`\<=13 \catcode`\>=13 \catcode`\+=13 \catcode`\"=13
 5573 \catcode`\$=3
 5574 \gdef\initialglyphs{%
 5575   % special control sequences used in the index sort key
 5576   \let\indexlbrace\{%
 5577   \let\indexrbrace\}%
 5578   \let\indexatchar\@%
 5579   \def\indexbackslash{\math{\backslash}}%
 5580   %
 5581   % Some changes for non-alphabetic characters.  Using the glyphs from the
 5582   % math fonts looks more consistent than the typewriter font used elsewhere
 5583   % for these characters.
 5584   \uccode`\~=`\\ \uppercase{\def~{\math{\backslash}}}
 5585   %
 5586   % In case @\ is used for backslash
 5587   \uppercase{\let\\=~}
 5588   % Can't get bold backslash so don't use bold forward slash
 5589   \catcode`\/=13
 5590   \def/{{\secrmnotbold \normalslash}}%
 5591   \def-{{\normaldash\normaldash}}% en dash `--'
 5592   \def^{{\chapbf \normalcaret}}%
 5593   \def~{{\chapbf \normaltilde}}%
 5594   \def\_{%
 5595      \leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }%
 5596   \def|{$\vert$}%
 5597   \def<{$\less$}%
 5598   \def>{$\gtr$}%
 5599   \def+{$\normalplus$}%
 5600 }}
 5601 
 5602 \def\initial{%
 5603   \bgroup
 5604   \initialglyphs
 5605   \initialx
 5606 }
 5607 
 5608 \def\initialx#1{%
 5609   % Remove any glue we may have, we'll be inserting our own.
 5610   \removelastskip
 5611   %
 5612   % We like breaks before the index initials, so insert a bonus.
 5613   % The glue before the bonus allows a little bit of space at the
 5614   % bottom of a column to reduce an increase in inter-line spacing.
 5615   \nobreak
 5616   \vskip 0pt plus 5\baselineskip
 5617   \penalty -300
 5618   \vskip 0pt plus -5\baselineskip
 5619   %
 5620   % Typeset the initial.  Making this add up to a whole number of
 5621   % baselineskips increases the chance of the dots lining up from column
 5622   % to column.  It still won't often be perfect, because of the stretch
 5623   % we need before each entry, but it's better.
 5624   %
 5625   % No shrink because it confuses \balancecolumns.
 5626   \vskip 1.67\baselineskip plus 1\baselineskip
 5627   \leftline{\secfonts \kern-0.05em \secbf #1}%
 5628   % \secfonts is inside the argument of \leftline so that the change of
 5629   % \baselineskip will not affect any glue inserted before the vbox that
 5630   % \leftline creates.
 5631   % Do our best not to break after the initial.
 5632   \nobreak
 5633   \vskip .33\baselineskip plus .1\baselineskip
 5634   \egroup % \initialglyphs
 5635 }
 5636 
 5637 \newdimen\entryrightmargin
 5638 \entryrightmargin=0pt
 5639 
 5640 % \entry typesets a paragraph consisting of the text (#1), dot leaders, and
 5641 % then page number (#2) flushed to the right margin.  It is used for index
 5642 % and table of contents entries.  The paragraph is indented by \leftskip.
 5643 %
 5644 \def\entry{%
 5645   \begingroup
 5646     %
 5647     % Start a new paragraph if necessary, so our assignments below can't
 5648     % affect previous text.
 5649     \par
 5650     %
 5651     % No extra space above this paragraph.
 5652     \parskip = 0in
 5653     %
 5654     % When reading the text of entry, convert explicit line breaks
 5655     % from @* into spaces.  The user might give these in long section
 5656     % titles, for instance.
 5657     \def\*{\unskip\space\ignorespaces}%
 5658     \def\entrybreak{\hfil\break}% An undocumented command
 5659     %
 5660     % Swallow the left brace of the text (first parameter):
 5661     \afterassignment\doentry
 5662     \let\temp =
 5663 }
 5664 \def\entrybreak{\unskip\space\ignorespaces}%
 5665 \def\doentry{%
 5666     % Save the text of the entry
 5667     \global\setbox\boxA=\hbox\bgroup
 5668     \bgroup % Instead of the swallowed brace.
 5669       \noindent
 5670       \aftergroup\finishentry
 5671       % And now comes the text of the entry.
 5672       % Not absorbing as a macro argument reduces the chance of problems
 5673       % with catcodes occurring.
 5674 }
 5675 {\catcode`\@=11
 5676 \gdef\finishentry#1{%
 5677     \egroup % end box A
 5678     \dimen@ = \wd\boxA % Length of text of entry
 5679     \global\setbox\boxA=\hbox\bgroup
 5680       \unhbox\boxA
 5681       % #1 is the page number.
 5682       %
 5683       % Get the width of the page numbers, and only use
 5684       % leaders if they are present.
 5685       \global\setbox\boxB = \hbox{#1}%
 5686       \ifdim\wd\boxB = 0pt
 5687         \null\nobreak\hfill\ %
 5688       \else
 5689         %
 5690         \null\nobreak\indexdotfill % Have leaders before the page number.
 5691         %
 5692         \ifpdforxetex
 5693           \pdfgettoks#1.%
 5694           \hskip\skip\thinshrinkable\the\toksA
 5695         \else
 5696           \hskip\skip\thinshrinkable #1%
 5697         \fi
 5698       \fi
 5699     \egroup % end \boxA
 5700     \ifdim\wd\boxB = 0pt
 5701       \noindent\unhbox\boxA\par
 5702       \nobreak
 5703     \else\bgroup
 5704       % We want the text of the entries to be aligned to the left, and the
 5705       % page numbers to be aligned to the right.
 5706       %
 5707       \parindent = 0pt
 5708       \advance\leftskip by 0pt plus 1fil
 5709       \advance\leftskip by 0pt plus -1fill
 5710       \rightskip = 0pt plus -1fil
 5711       \advance\rightskip by 0pt plus 1fill
 5712       % Cause last line, which could consist of page numbers on their own
 5713       % if the list of page numbers is long, to be aligned to the right.
 5714       \parfillskip=0pt plus -1fill
 5715       %
 5716       \advance\rightskip by \entryrightmargin
 5717       % Determine how far we can stretch into the margin.
 5718       % This allows, e.g., "Appendix H  GNU Free Documentation License" to
 5719       % fit on one line in @letterpaper format.
 5720       \ifdim\entryrightmargin>2.1em
 5721         \dimen@i=2.1em
 5722       \else
 5723         \dimen@i=0em
 5724       \fi
 5725       \advance \parfillskip by 0pt minus 1\dimen@i
 5726       %
 5727       \dimen@ii = \hsize
 5728       \advance\dimen@ii by -1\leftskip
 5729       \advance\dimen@ii by -1\entryrightmargin
 5730       \advance\dimen@ii by 1\dimen@i
 5731       \ifdim\wd\boxA > \dimen@ii % If the entry doesn't fit in one line
 5732       \ifdim\dimen@ > 0.8\dimen@ii   % due to long index text
 5733         % Try to split the text roughly evenly.  \dimen@ will be the length of
 5734         % the first line.
 5735         \dimen@ = 0.7\dimen@
 5736         \dimen@ii = \hsize
 5737         \ifnum\dimen@>\dimen@ii
 5738           % If the entry is too long (for example, if it needs more than
 5739           % two lines), use all the space in the first line.
 5740           \dimen@ = \dimen@ii
 5741         \fi
 5742         \advance\leftskip by 0pt plus 1fill % ragged right
 5743         \advance \dimen@ by 1\rightskip
 5744         \parshape = 2 0pt \dimen@ 0em \dimen@ii
 5745         % Ideally we'd add a finite glue at the end of the first line only,
 5746         % instead of using \parshape with explicit line lengths, but TeX
 5747         % doesn't seem to provide a way to do such a thing.
 5748         %
 5749         % Indent all lines but the first one.
 5750         \advance\leftskip by 1em
 5751         \advance\parindent by -1em
 5752       \fi\fi
 5753       \indent % start paragraph
 5754       \unhbox\boxA
 5755       %
 5756       % Do not prefer a separate line ending with a hyphen to fewer lines.
 5757       \finalhyphendemerits = 0
 5758       %
 5759       % Word spacing - no stretch
 5760       \spaceskip=\fontdimen2\font minus \fontdimen4\font
 5761       %
 5762       \linepenalty=1000  % Discourage line breaks.
 5763       \hyphenpenalty=5000  % Discourage hyphenation.
 5764       %
 5765       \par % format the paragraph
 5766     \egroup % The \vbox
 5767     \fi
 5768   \endgroup
 5769 }}
 5770 
 5771 \newskip\thinshrinkable
 5772 \skip\thinshrinkable=.15em minus .15em
 5773 
 5774 % Like plain.tex's \dotfill, except uses up at least 1 em.
 5775 % The filll stretch here overpowers both the fil and fill stretch to push
 5776 % the page number to the right.
 5777 \def\indexdotfill{\cleaders
 5778   \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1filll}
 5779 
 5780 
 5781 \def\primary #1{\line{#1\hfil}}
 5782 
 5783 \def\secondary{\indententry{0.5cm}}
 5784 \def\tertiary{\indententry{1cm}}
 5785 
 5786 \def\indententry#1#2#3{%
 5787   \bgroup
 5788   \leftskip=#1
 5789   \entry{#2}{#3}%
 5790   \egroup
 5791 }
 5792 
 5793 % Define two-column mode, which we use to typeset indexes.
 5794 % Adapted from the TeXbook, page 416, which is to say,
 5795 % the manmac.tex format used to print the TeXbook itself.
 5796 \catcode`\@=11  % private names
 5797 
 5798 \newbox\partialpage
 5799 \newdimen\doublecolumnhsize
 5800 
 5801 \def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
 5802   % If not much space left on page, start a new page.
 5803   \ifdim\pagetotal>0.8\vsize\vfill\eject\fi
 5804   %
 5805   % Grab any single-column material above us.
 5806   \output = {%
 5807     \savetopmark
 5808     %
 5809     \global\setbox\partialpage = \vbox{%
 5810       % Unvbox the main output page.
 5811       \unvbox\PAGE
 5812       \kern-\topskip \kern\baselineskip
 5813     }%
 5814   }%
 5815   \eject % run that output routine to set \partialpage
 5816   %
 5817   % Use the double-column output routine for subsequent pages.
 5818   \output = {\doublecolumnout}%
 5819   %
 5820   % Change the page size parameters.  We could do this once outside this
 5821   % routine, in each of @smallbook, @afourpaper, and the default 8.5x11
 5822   % format, but then we repeat the same computation.  Repeating a couple
 5823   % of assignments once per index is clearly meaningless for the
 5824   % execution time, so we may as well do it in one place.
 5825   %
 5826   % First we halve the line length, less a little for the gutter between
 5827   % the columns.  We compute the gutter based on the line length, so it
 5828   % changes automatically with the paper format.  The magic constant
 5829   % below is chosen so that the gutter has the same value (well, +-<1pt)
 5830   % as it did when we hard-coded it.
 5831   %
 5832   % We put the result in a separate register, \doublecolumhsize, so we
 5833   % can restore it in \pagesofar, after \hsize itself has (potentially)
 5834   % been clobbered.
 5835   %
 5836   \doublecolumnhsize = \hsize
 5837     \advance\doublecolumnhsize by -.04154\hsize
 5838     \divide\doublecolumnhsize by 2
 5839   \hsize = \doublecolumnhsize
 5840   %
 5841   % Get the available space for the double columns -- the normal
 5842   % (undoubled) page height minus any material left over from the
 5843   % previous page.
 5844   \advance\vsize by -\ht\partialpage
 5845   \vsize = 2\vsize
 5846   %
 5847   % For the benefit of balancing columns
 5848   \advance\baselineskip by 0pt plus 0.5pt
 5849 }
 5850 
 5851 % The double-column output routine for all double-column pages except
 5852 % the last, which is done by \balancecolumns.
 5853 %
 5854 \def\doublecolumnout{%
 5855   %
 5856   \savetopmark
 5857   \splittopskip=\topskip \splitmaxdepth=\maxdepth
 5858   \dimen@ = \vsize
 5859   \divide\dimen@ by 2
 5860   %
 5861   % box0 will be the left-hand column, box2 the right.
 5862   \setbox0=\vsplit\PAGE to\dimen@ \setbox2=\vsplit\PAGE to\dimen@
 5863   \global\advance\vsize by 2\ht\partialpage
 5864   \onepageout\pagesofar % empty except for the first time we are called
 5865   \unvbox\PAGE
 5866   \penalty\outputpenalty
 5867 }
 5868 %
 5869 % Re-output the contents of the output page -- any previous material,
 5870 % followed by the two boxes we just split, in box0 and box2.
 5871 \def\pagesofar{%
 5872   \unvbox\partialpage
 5873   %
 5874   \hsize = \doublecolumnhsize
 5875   \wd0=\hsize \wd2=\hsize
 5876   \hbox to\txipagewidth{\box0\hfil\box2}%
 5877 }
 5878 
 5879 
 5880 % Finished with double columns.
 5881 \def\enddoublecolumns{%
 5882   % The following penalty ensures that the page builder is exercised
 5883   % _before_ we change the output routine.  This is necessary in the
 5884   % following situation:
 5885   %
 5886   % The last section of the index consists only of a single entry.
 5887   % Before this section, \pagetotal is less than \pagegoal, so no
 5888   % break occurs before the last section starts.  However, the last
 5889   % section, consisting of \initial and the single \entry, does not
 5890   % fit on the page and has to be broken off.  Without the following
 5891   % penalty the page builder will not be exercised until \eject
 5892   % below, and by that time we'll already have changed the output
 5893   % routine to the \balancecolumns version, so the next-to-last
 5894   % double-column page will be processed with \balancecolumns, which
 5895   % is wrong:  The two columns will go to the main vertical list, with
 5896   % the broken-off section in the recent contributions.  As soon as
 5897   % the output routine finishes, TeX starts reconsidering the page
 5898   % break.  The two columns and the broken-off section both fit on the
 5899   % page, because the two columns now take up only half of the page
 5900   % goal.  When TeX sees \eject from below which follows the final
 5901   % section, it invokes the new output routine that we've set after
 5902   % \balancecolumns below; \onepageout will try to fit the two columns
 5903   % and the final section into the vbox of \txipageheight (see
 5904   % \pagebody), causing an overfull box.
 5905   %
 5906   % Note that glue won't work here, because glue does not exercise the
 5907   % page builder, unlike penalties (see The TeXbook, pp. 280-281).
 5908   \penalty0
 5909   %
 5910   \output = {%
 5911     % Split the last of the double-column material.
 5912     \savetopmark
 5913     \balancecolumns
 5914   }%
 5915   \eject % call the \output just set
 5916   \ifdim\pagetotal=0pt
 5917     % Having called \balancecolumns once, we do not
 5918     % want to call it again.  Therefore, reset \output to its normal
 5919     % definition right away.
 5920     \global\output=\expandafter{\the\defaultoutput}
 5921     %
 5922     \endgroup % started in \begindoublecolumns
 5923     % Leave the double-column material on the current page, no automatic
 5924     % page break.
 5925     \box\balancedcolumns
 5926     %
 5927     % \pagegoal was set to the doubled \vsize above, since we restarted
 5928     % the current page.  We're now back to normal single-column
 5929     % typesetting, so reset \pagegoal to the normal \vsize.
 5930     \global\vsize = \txipageheight %
 5931     \pagegoal = \txipageheight %
 5932   \else
 5933     % We had some left-over material.  This might happen when \doublecolumnout
 5934     % is called in \balancecolumns.  Try again.
 5935     \expandafter\enddoublecolumns
 5936   \fi
 5937 }
 5938 \newbox\balancedcolumns
 5939 \setbox\balancedcolumns=\vbox{shouldnt see this}%
 5940 %
 5941 % Only called for the last of the double column material.  \doublecolumnout
 5942 % does the others.
 5943 \def\balancecolumns{%
 5944   \setbox0 = \vbox{\unvbox\PAGE}% like \box255 but more efficient, see p.120.
 5945   \dimen@ = \ht0
 5946   \ifdim\dimen@<7\baselineskip
 5947     % Don't split a short final column in two.
 5948     \setbox2=\vbox{}%
 5949     \global\setbox\balancedcolumns=\vbox{\pagesofar}%
 5950   \else
 5951     % double the leading vertical space
 5952     \advance\dimen@ by \topskip
 5953     \advance\dimen@ by-\baselineskip
 5954     \divide\dimen@ by 2 % target to split to
 5955     \dimen@ii = \dimen@
 5956     \splittopskip = \topskip
 5957     % Loop until left column is at least as high as the right column.
 5958     {%
 5959       \vbadness = 10000
 5960       \loop
 5961         \global\setbox3 = \copy0
 5962         \global\setbox1 = \vsplit3 to \dimen@
 5963       \ifdim\ht1<\ht3
 5964         \global\advance\dimen@ by 1pt
 5965       \repeat
 5966     }%
 5967     % Now the left column is in box 1, and the right column in box 3.
 5968     %
 5969     % Check whether the left column has come out higher than the page itself.
 5970     % (Note that we have doubled \vsize for the double columns, so
 5971     % the actual height of the page is 0.5\vsize).
 5972     \ifdim2\ht1>\vsize
 5973       % It appears that we have been called upon to balance too much material.
 5974       % Output some of it with \doublecolumnout, leaving the rest on the page.
 5975       \setbox\PAGE=\box0
 5976       \doublecolumnout
 5977     \else
 5978       % Compare the heights of the two columns.
 5979       \ifdim4\ht1>5\ht3
 5980         % Column heights are too different, so don't make their bottoms
 5981         % flush with each other.
 5982         \setbox2=\vbox to \ht1 {\unvbox3\vfill}%
 5983         \setbox0=\vbox to \ht1 {\unvbox1\vfill}%
 5984       \else
 5985         % Make column bottoms flush with each other.
 5986         \setbox2=\vbox to\ht1{\unvbox3\unskip}%
 5987         \setbox0=\vbox to\ht1{\unvbox1\unskip}%
 5988       \fi
 5989       \global\setbox\balancedcolumns=\vbox{\pagesofar}%
 5990     \fi
 5991   \fi
 5992   %
 5993 }
 5994 \catcode`\@ = \other
 5995 
 5996 
 5997 \message{sectioning,}
 5998 % Chapters, sections, etc.
 5999 
 6000 % Let's start with @part.
 6001 \outer\parseargdef\part{\partzzz{#1}}
 6002 \def\partzzz#1{%
 6003   \chapoddpage
 6004   \null
 6005   \vskip.3\vsize  % move it down on the page a bit
 6006   \begingroup
 6007     \noindent \titlefonts\rm #1\par % the text
 6008     \let\lastnode=\empty      % no node to associate with
 6009     \writetocentry{part}{#1}{}% but put it in the toc
 6010     \headingsoff              % no headline or footline on the part page
 6011     % This outputs a mark at the end of the page that clears \thischapter
 6012     % and \thissection, as is done in \startcontents.
 6013     \let\pchapsepmacro\relax
 6014     \chapmacro{}{Yomitfromtoc}{}%
 6015     \chapoddpage
 6016   \endgroup
 6017 }
 6018 
 6019 % \unnumberedno is an oxymoron.  But we count the unnumbered
 6020 % sections so that we can refer to them unambiguously in the pdf
 6021 % outlines by their "section number".  We avoid collisions with chapter
 6022 % numbers by starting them at 10000.  (If a document ever has 10000
 6023 % chapters, we're in trouble anyway, I'm sure.)
 6024 \newcount\unnumberedno \unnumberedno = 10000
 6025 \newcount\chapno
 6026 \newcount\secno        \secno=0
 6027 \newcount\subsecno     \subsecno=0
 6028 \newcount\subsubsecno  \subsubsecno=0
 6029 
 6030 % This counter is funny since it counts through charcodes of letters A, B, ...
 6031 \newcount\appendixno  \appendixno = `\@
 6032 %
 6033 % \def\appendixletter{\char\the\appendixno}
 6034 % We do the following ugly conditional instead of the above simple
 6035 % construct for the sake of pdftex, which needs the actual
 6036 % letter in the expansion, not just typeset.
 6037 %
 6038 \def\appendixletter{%
 6039   \ifnum\appendixno=`A A%
 6040   \else\ifnum\appendixno=`B B%
 6041   \else\ifnum\appendixno=`C C%
 6042   \else\ifnum\appendixno=`D D%
 6043   \else\ifnum\appendixno=`E E%
 6044   \else\ifnum\appendixno=`F F%
 6045   \else\ifnum\appendixno=`G G%
 6046   \else\ifnum\appendixno=`H H%
 6047   \else\ifnum\appendixno=`I I%
 6048   \else\ifnum\appendixno=`J J%
 6049   \else\ifnum\appendixno=`K K%
 6050   \else\ifnum\appendixno=`L L%
 6051   \else\ifnum\appendixno=`M M%
 6052   \else\ifnum\appendixno=`N N%
 6053   \else\ifnum\appendixno=`O O%
 6054   \else\ifnum\appendixno=`P P%
 6055   \else\ifnum\appendixno=`Q Q%
 6056   \else\ifnum\appendixno=`R R%
 6057   \else\ifnum\appendixno=`S S%
 6058   \else\ifnum\appendixno=`T T%
 6059   \else\ifnum\appendixno=`U U%
 6060   \else\ifnum\appendixno=`V V%
 6061   \else\ifnum\appendixno=`W W%
 6062   \else\ifnum\appendixno=`X X%
 6063   \else\ifnum\appendixno=`Y Y%
 6064   \else\ifnum\appendixno=`Z Z%
 6065   % The \the is necessary, despite appearances, because \appendixletter is
 6066   % expanded while writing the .toc file.  \char\appendixno is not
 6067   % expandable, thus it is written literally, thus all appendixes come out
 6068   % with the same letter (or @) in the toc without it.
 6069   \else\char\the\appendixno
 6070   \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
 6071   \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
 6072 
 6073 % Each @chapter defines these (using marks) as the number+name, number
 6074 % and name of the chapter.  Page headings and footings can use
 6075 % these.  @section does likewise.
 6076 \def\thischapter{}
 6077 \def\thischapternum{}
 6078 \def\thischaptername{}
 6079 \def\thissection{}
 6080 \def\thissectionnum{}
 6081 \def\thissectionname{}
 6082 
 6083 \newcount\absseclevel % used to calculate proper heading level
 6084 \newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count
 6085 
 6086 % @raisesections: treat @section as chapter, @subsection as section, etc.
 6087 \def\raisesections{\global\advance\secbase by -1}
 6088 
 6089 % @lowersections: treat @chapter as section, @section as subsection, etc.
 6090 \def\lowersections{\global\advance\secbase by 1}
 6091 
 6092 % we only have subsub.
 6093 \chardef\maxseclevel = 3
 6094 %
 6095 % A numbered section within an unnumbered changes to unnumbered too.
 6096 % To achieve this, remember the "biggest" unnum. sec. we are currently in:
 6097 \chardef\unnlevel = \maxseclevel
 6098 %
 6099 % Trace whether the current chapter is an appendix or not:
 6100 % \chapheadtype is "N" or "A", unnumbered chapters are ignored.
 6101 \def\chapheadtype{N}
 6102 
 6103 % Choose a heading macro
 6104 % #1 is heading type
 6105 % #2 is heading level
 6106 % #3 is text for heading
 6107 \def\genhead#1#2#3{%
 6108   % Compute the abs. sec. level:
 6109   \absseclevel=#2
 6110   \advance\absseclevel by \secbase
 6111   % Make sure \absseclevel doesn't fall outside the range:
 6112   \ifnum \absseclevel < 0
 6113     \absseclevel = 0
 6114   \else
 6115     \ifnum \absseclevel > 3
 6116       \absseclevel = 3
 6117     \fi
 6118   \fi
 6119   % The heading type:
 6120   \def\headtype{#1}%
 6121   \if \headtype U%
 6122     \ifnum \absseclevel < \unnlevel
 6123       \chardef\unnlevel = \absseclevel
 6124     \fi
 6125   \else
 6126     % Check for appendix sections:
 6127     \ifnum \absseclevel = 0
 6128       \edef\chapheadtype{\headtype}%
 6129     \else
 6130       \if \headtype A\if \chapheadtype N%
 6131     \errmessage{@appendix... within a non-appendix chapter}%
 6132       \fi\fi
 6133     \fi
 6134     % Check for numbered within unnumbered:
 6135     \ifnum \absseclevel > \unnlevel
 6136       \def\headtype{U}%
 6137     \else
 6138       \chardef\unnlevel = 3
 6139     \fi
 6140   \fi
 6141   % Now print the heading:
 6142   \if \headtype U%
 6143     \ifcase\absseclevel
 6144     \unnumberedzzz{#3}%
 6145     \or \unnumberedseczzz{#3}%
 6146     \or \unnumberedsubseczzz{#3}%
 6147     \or \unnumberedsubsubseczzz{#3}%
 6148     \fi
 6149   \else
 6150     \if \headtype A%
 6151       \ifcase\absseclevel
 6152       \appendixzzz{#3}%
 6153       \or \appendixsectionzzz{#3}%
 6154       \or \appendixsubseczzz{#3}%
 6155       \or \appendixsubsubseczzz{#3}%
 6156       \fi
 6157     \else
 6158       \ifcase\absseclevel
 6159       \chapterzzz{#3}%
 6160       \or \seczzz{#3}%
 6161       \or \numberedsubseczzz{#3}%
 6162       \or \numberedsubsubseczzz{#3}%
 6163       \fi
 6164     \fi
 6165   \fi
 6166   \suppressfirstparagraphindent
 6167 }
 6168 
 6169 % an interface:
 6170 \def\numhead{\genhead N}
 6171 \def\apphead{\genhead A}
 6172 \def\unnmhead{\genhead U}
 6173 
 6174 % @chapter, @appendix, @unnumbered.  Increment top-level counter, reset
 6175 % all lower-level sectioning counters to zero.
 6176 %
 6177 % Also set \chaplevelprefix, which we prepend to @float sequence numbers
 6178 % (e.g., figures), q.v.  By default (before any chapter), that is empty.
 6179 \let\chaplevelprefix = \empty
 6180 %
 6181 \outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz
 6182 \def\chapterzzz#1{%
 6183   % section resetting is \global in case the chapter is in a group, such
 6184   % as an @include file.
 6185   \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
 6186     \global\advance\chapno by 1
 6187   %
 6188   % Used for \float.
 6189   \gdef\chaplevelprefix{\the\chapno.}%
 6190   \resetallfloatnos
 6191   %
 6192   % \putwordChapter can contain complex things in translations.
 6193   \toks0=\expandafter{\putwordChapter}%
 6194   \message{\the\toks0 \space \the\chapno}%
 6195   %
 6196   % Write the actual heading.
 6197   \chapmacro{#1}{Ynumbered}{\the\chapno}%
 6198   %
 6199   % So @section and the like are numbered underneath this chapter.
 6200   \global\let\section = \numberedsec
 6201   \global\let\subsection = \numberedsubsec
 6202   \global\let\subsubsection = \numberedsubsubsec
 6203 }
 6204 
 6205 \outer\parseargdef\appendix{\apphead0{#1}} % normally calls appendixzzz
 6206 %
 6207 \def\appendixzzz#1{%
 6208   \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
 6209     \global\advance\appendixno by 1
 6210   \gdef\chaplevelprefix{\appendixletter.}%
 6211   \resetallfloatnos
 6212   %
 6213   % \putwordAppendix can contain complex things in translations.
 6214   \toks0=\expandafter{\putwordAppendix}%
 6215   \message{\the\toks0 \space \appendixletter}%
 6216   %
 6217   \chapmacro{#1}{Yappendix}{\appendixletter}%
 6218   %
 6219   \global\let\section = \appendixsec
 6220   \global\let\subsection = \appendixsubsec
 6221   \global\let\subsubsection = \appendixsubsubsec
 6222 }
 6223 
 6224 % normally unnmhead0 calls unnumberedzzz:
 6225 \outer\parseargdef\unnumbered{\unnmhead0{#1}}
 6226 \def\unnumberedzzz#1{%
 6227   \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
 6228     \global\advance\unnumberedno by 1
 6229   %
 6230   % Since an unnumbered has no number, no prefix for figures.
 6231   \global\let\chaplevelprefix = \empty
 6232   \resetallfloatnos
 6233   %
 6234   % This used to be simply \message{#1}, but TeX fully expands the
 6235   % argument to \message.  Therefore, if #1 contained @-commands, TeX
 6236   % expanded them.  For example, in `@unnumbered The @cite{Book}', TeX
 6237   % expanded @cite (which turns out to cause errors because \cite is meant
 6238   % to be executed, not expanded).
 6239   %
 6240   % Anyway, we don't want the fully-expanded definition of @cite to appear
 6241   % as a result of the \message, we just want `@cite' itself.  We use
 6242   % \the<toks register> to achieve this: TeX expands \the<toks> only once,
 6243   % simply yielding the contents of <toks register>.  (We also do this for
 6244   % the toc entries.)
 6245   \toks0 = {#1}%
 6246   \message{(\the\toks0)}