anastasis

Credential backup and recovery protocol and service
Log | Files | Refs | Submodules | README | LICENSE

texinfo.tex (381461B)


      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{2024-02-10.22}
      7 %
      8 % Copyright 1985, 1986, 1988, 1990-2024 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 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 % LaTeX's \typeout.  This ensures that the messages it is used for
     62 % are identical in format to the corresponding ones from latex/pdflatex.
     63 \def\typeout{\immediate\write17}%
     64 
     65 \chardef\other=12
     66 
     67 % We never want plain's \outer definition of \+ in Texinfo.
     68 % For @tex, we can use \tabalign.
     69 \let\+ = \relax
     70 
     71 % Save some plain tex macros whose names we will redefine.
     72 \let\ptexb=\b
     73 \let\ptexbullet=\bullet
     74 \let\ptexc=\c
     75 \let\ptexcomma=\,
     76 \let\ptexdot=\.
     77 \let\ptexdots=\dots
     78 \let\ptexend=\end
     79 \let\ptexequiv=\equiv
     80 \let\ptexexclam=\!
     81 \let\ptexfootnote=\footnote
     82 \let\ptexgtr=>
     83 \let\ptexhat=^
     84 \let\ptexi=\i
     85 \let\ptexindent=\indent
     86 \let\ptexinsert=\insert
     87 \let\ptexlbrace=\{
     88 \let\ptexless=<
     89 \let\ptexnewwrite\newwrite
     90 \let\ptexnoindent=\noindent
     91 \let\ptexplus=+
     92 \let\ptexraggedright=\raggedright
     93 \let\ptexrbrace=\}
     94 \let\ptexslash=\/
     95 \let\ptexsp=\sp
     96 \let\ptexstar=\*
     97 \let\ptexsup=\sup
     98 \let\ptext=\t
     99 \let\ptextop=\top
    100 {\catcode`\'=\active \global\let\ptexquoteright'}% active in plain's math mode
    101 
    102 % If this character appears in an error message or help string, it
    103 % starts a new line in the output.
    104 \newlinechar = `^^J
    105 
    106 % Use TeX 3.0's \inputlineno to get the line number, for better error
    107 % messages, but if we're using an old version of TeX, don't do anything.
    108 %
    109 \ifx\inputlineno\thisisundefined
    110   \let\linenumber = \empty % Pre-3.0.
    111 \else
    112   \def\linenumber{l.\the\inputlineno:\space}
    113 \fi
    114 
    115 % Set up fixed words for English if not already set.
    116 \ifx\putwordAppendix\undefined  \gdef\putwordAppendix{Appendix}\fi
    117 \ifx\putwordChapter\undefined   \gdef\putwordChapter{Chapter}\fi
    118 \ifx\putworderror\undefined     \gdef\putworderror{error}\fi
    119 \ifx\putwordfile\undefined      \gdef\putwordfile{file}\fi
    120 \ifx\putwordin\undefined        \gdef\putwordin{in}\fi
    121 \ifx\putwordIndexIsEmpty\undefined       \gdef\putwordIndexIsEmpty{(Index is empty)}\fi
    122 \ifx\putwordIndexNonexistent\undefined   \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi
    123 \ifx\putwordInfo\undefined      \gdef\putwordInfo{Info}\fi
    124 \ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi
    125 \ifx\putwordMethodon\undefined  \gdef\putwordMethodon{Method on}\fi
    126 \ifx\putwordNoTitle\undefined   \gdef\putwordNoTitle{No Title}\fi
    127 \ifx\putwordof\undefined        \gdef\putwordof{of}\fi
    128 \ifx\putwordon\undefined        \gdef\putwordon{on}\fi
    129 \ifx\putwordpage\undefined      \gdef\putwordpage{page}\fi
    130 \ifx\putwordsection\undefined   \gdef\putwordsection{section}\fi
    131 \ifx\putwordSection\undefined   \gdef\putwordSection{Section}\fi
    132 \ifx\putwordsee\undefined       \gdef\putwordsee{see}\fi
    133 \ifx\putwordSee\undefined       \gdef\putwordSee{See}\fi
    134 \ifx\putwordShortTOC\undefined  \gdef\putwordShortTOC{Short Contents}\fi
    135 \ifx\putwordTOC\undefined       \gdef\putwordTOC{Table of Contents}\fi
    136 %
    137 \ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi
    138 \ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi
    139 \ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi
    140 \ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi
    141 \ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi
    142 \ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi
    143 \ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi
    144 \ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi
    145 \ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi
    146 \ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi
    147 \ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi
    148 \ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi
    149 %
    150 \ifx\putwordDefmac\undefined    \gdef\putwordDefmac{Macro}\fi
    151 \ifx\putwordDefspec\undefined   \gdef\putwordDefspec{Special Form}\fi
    152 \ifx\putwordDefvar\undefined    \gdef\putwordDefvar{Variable}\fi
    153 \ifx\putwordDefopt\undefined    \gdef\putwordDefopt{User Option}\fi
    154 \ifx\putwordDeffunc\undefined   \gdef\putwordDeffunc{Function}\fi
    155 
    156 % Give the space character the catcode for a space.
    157 \def\spaceisspace{\catcode`\ =10\relax}
    158 
    159 % Likewise for ^^M, the end of line character.
    160 \def\endlineisspace{\catcode13=10\relax}
    161 
    162 \chardef\dashChar  = `\-
    163 \chardef\slashChar = `\/
    164 \chardef\underChar = `\_
    165 
    166 % Ignore a token.
    167 %
    168 \def\gobble#1{}
    169 
    170 % The following is used inside several \edef's.
    171 \def\makecsname#1{\expandafter\noexpand\csname#1\endcsname}
    172 
    173 % Hyphenation fixes.
    174 \hyphenation{
    175   Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script
    176   ap-pen-dix bit-map bit-maps
    177   data-base data-bases eshell fall-ing half-way long-est man-u-script
    178   man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm
    179   par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces
    180   spell-ing spell-ings
    181   stand-alone strong-est time-stamp time-stamps which-ever white-space
    182   wide-spread wrap-around
    183 }
    184 
    185 % Sometimes it is convenient to have everything in the transcript file
    186 % and nothing on the terminal.  We don't just call \tracingall here,
    187 % since that produces some useless output on the terminal.  We also make
    188 % some effort to order the tracing commands to reduce output in the log
    189 % file; cf. trace.sty in LaTeX.
    190 %
    191 \def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
    192 \def\loggingall{%
    193   \tracingstats2
    194   \tracingpages1
    195   \tracinglostchars2  % 2 gives us more in etex
    196   \tracingparagraphs1
    197   \tracingoutput1
    198   \tracingmacros2
    199   \tracingrestores1
    200   \showboxbreadth\maxdimen \showboxdepth\maxdimen
    201   \ifx\eTeXversion\thisisundefined\else % etex gives us more logging
    202     \tracingscantokens1
    203     \tracingifs1
    204     \tracinggroups1
    205     \tracingnesting2
    206     \tracingassigns1
    207   \fi
    208   \tracingcommands3  % 3 gives us more in etex
    209   \errorcontextlines16
    210 }%
    211 
    212 % @errormsg{MSG}.  Do the index-like expansions on MSG, but if things
    213 % aren't perfect, it's not the end of the world, being an error message,
    214 % after all.
    215 %
    216 \def\errormsg{\begingroup \indexnofonts \doerrormsg}
    217 \def\doerrormsg#1{\errmessage{#1}}
    218 
    219 % add check for \lastpenalty to plain's definitions.  If the last thing
    220 % we did was a \nobreak, we don't want to insert more space.
    221 %
    222 \def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount
    223   \removelastskip\penalty-50\smallskip\fi\fi}
    224 \def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount
    225   \removelastskip\penalty-100\medskip\fi\fi}
    226 \def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount
    227   \removelastskip\penalty-200\bigskip\fi\fi}
    228 
    229 % Output routine
    230 %
    231 
    232 % For a final copy, take out the rectangles
    233 % that mark overfull boxes (in case you have decided
    234 % that the text looks ok even though it passes the margin).
    235 %
    236 \def\finalout{\overfullrule=0pt }
    237 
    238 % Output a mark which sets \thischapter, \thissection and \thiscolor.
    239 % We dump everything together because we only have one kind of mark.
    240 % This works because we only use \botmark / \topmark, not \firstmark.
    241 %
    242 % A mark contains a subexpression of the \ifcase ... \fi construct.
    243 % \get*marks macros below extract the needed part using \ifcase.
    244 %
    245 % Another complication is to let the user choose whether \thischapter
    246 % (\thissection) refers to the chapter (section) in effect at the top
    247 % of a page, or that at the bottom of a page.
    248 
    249 % \domark is called twice inside \chapmacro, to add one
    250 % mark before the section break, and one after.
    251 %   In the second call \prevchapterdefs is the same as \currentchapterdefs,
    252 % and \prevsectiondefs is the same as \currentsectiondefs.
    253 %   Then if the page is not broken at the mark, some of the previous
    254 % section appears on the page, and we can get the name of this section
    255 % from \firstmark for @everyheadingmarks top.
    256 %   @everyheadingmarks bottom uses \botmark.
    257 %
    258 % See page 260 of The TeXbook.
    259 \def\domark{%
    260   \toks0=\expandafter{\currentchapterdefs}%
    261   \toks2=\expandafter{\currentsectiondefs}%
    262   \toks4=\expandafter{\prevchapterdefs}%
    263   \toks6=\expandafter{\prevsectiondefs}%
    264   \toks8=\expandafter{\currentcolordefs}%
    265   \mark{%
    266                    \the\toks0 \the\toks2  % 0: marks for @everyheadingmarks top
    267       \noexpand\or \the\toks4 \the\toks6  % 1: for @everyheadingmarks bottom
    268     \noexpand\else \the\toks8             % 2: color marks
    269   }%
    270 }
    271 
    272 % \gettopheadingmarks, \getbottomheadingmarks,
    273 % \getcolormarks - extract needed part of mark.
    274 %
    275 % \topmark doesn't work for the very first chapter (after the title
    276 % page or the contents), so we use \firstmark there -- this gets us
    277 % the mark with the chapter defs, unless the user sneaks in, e.g.,
    278 % @setcolor (or @url etc.) between @contents and the very first @chapter.
    279 \def\gettopheadingmarks{%
    280   \ifcase0\the\savedtopmark\fi
    281   \ifx\thischapter\empty \ifcase0\firstmark\fi \fi
    282 }
    283 \def\getbottomheadingmarks{\ifcase1\botmark\fi}
    284 \def\getcolormarks{\ifcase2\the\savedtopmark\fi}
    285 
    286 % Avoid "undefined control sequence" errors.
    287 \def\currentchapterdefs{}
    288 \def\currentsectiondefs{}
    289 \def\currentsection{}
    290 \def\prevchapterdefs{}
    291 \def\prevsectiondefs{}
    292 \def\currentcolordefs{}
    293 
    294 % Margin to add to right of even pages, to left of odd pages.
    295 \newdimen\bindingoffset
    296 \newdimen\normaloffset
    297 \newdimen\txipagewidth \newdimen\txipageheight
    298 
    299 % Main output routine.
    300 %
    301 \chardef\PAGE = 255
    302 \newtoks\defaultoutput
    303 \defaultoutput = {\savetopmark\onepageout{\pagecontents\PAGE}}
    304 \output=\expandafter{\the\defaultoutput}
    305 
    306 \newbox\headlinebox
    307 \newbox\footlinebox
    308 
    309 % When outputting the double column layout for indices, an output routine
    310 % is run several times, hiding the original value of \topmark.  Hence, save
    311 % \topmark at the beginning.
    312 %
    313 \newtoks\savedtopmark
    314 \newif\iftopmarksaved
    315 \topmarksavedtrue
    316 \def\savetopmark{%
    317   \iftopmarksaved\else
    318     \global\savedtopmark=\expandafter{\topmark}%
    319     \global\topmarksavedtrue
    320   \fi
    321 }
    322 
    323 % \onepageout takes a vbox as an argument.
    324 % \shipout a vbox for a single page, adding an optional header, footer
    325 % and footnote.  This also causes index entries for this page to be written
    326 % to the auxiliary files.
    327 %
    328 \def\onepageout#1{%
    329   \hoffset=\normaloffset
    330   %
    331   \ifodd\pageno  \advance\hoffset by \bindingoffset
    332   \else \advance\hoffset by -\bindingoffset\fi
    333   %
    334   \checkchapterpage
    335   %
    336   % Make the heading and footing.  \makeheadline and \makefootline
    337   % use the contents of \headline and \footline.
    338   \def\commonheadfootline{\let\hsize=\txipagewidth \texinfochars}
    339   \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi
    340   \global\setbox\headlinebox = \vbox{\commonheadfootline \makeheadline}%
    341   \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi
    342   \global\setbox\footlinebox = \vbox{\commonheadfootline \makefootline}%
    343   %
    344   {%
    345     % Set context for writing to auxiliary files like index files.
    346     % Have to do this stuff outside the \shipout because we want it to
    347     % take effect in \write's, yet the group defined by the \vbox ends
    348     % before the \shipout runs.
    349     %
    350     \atdummies         % don't expand commands in the output.
    351     \turnoffactive
    352     \shipout\vbox{%
    353       % Do this early so pdf references go to the beginning of the page.
    354       \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi
    355       %
    356       \unvbox\headlinebox
    357       \pagebody{#1}%
    358       \ifdim\ht\footlinebox > 0pt
    359         % Only leave this space if the footline is nonempty.
    360         % (We lessened \vsize for it in \oddfootingyyy.)
    361         % The \baselineskip=24pt in plain's \makefootline has no effect.
    362         \vskip 24pt
    363         \unvbox\footlinebox
    364       \fi
    365       %
    366     }%
    367   }%
    368   \global\topmarksavedfalse
    369   \advancepageno
    370   \ifnum\outputpenalty>-20000 \else\dosupereject\fi
    371 }
    372 
    373 \newinsert\margin \dimen\margin=\maxdimen
    374 
    375 % Main part of page, including any footnotes
    376 \def\pagebody#1{\vbox to\txipageheight{\boxmaxdepth=\maxdepth #1}}
    377 {\catcode`\@ =11
    378 \gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
    379 % marginal hacks, juha@viisa.uucp (Juha Takala)
    380 \ifvoid\margin\else % marginal info is present
    381   \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi
    382 \dimen@=\dp#1\relax \unvbox#1\relax
    383 \ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
    384 \ifr@ggedbottom \kern-\dimen@ \vfil \fi}
    385 }
    386 
    387 % Check if we are on the first page of a chapter.  Used for printing headings.
    388 \newif\ifchapterpage
    389 \def\checkchapterpage{%
    390   % Get the chapter that was current at the end of the last page
    391   \ifcase1\the\savedtopmark\fi
    392   \let\prevchaptername\thischaptername
    393   %
    394   \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi
    395   \let\curchaptername\thischaptername
    396   %
    397   \ifx\curchaptername\prevchaptername
    398     \chapterpagefalse
    399   \else
    400     \chapterpagetrue
    401   \fi
    402 }
    403 
    404 % Argument parsing
    405 
    406 % Parse an argument, then pass it to #1.  The argument is the rest of
    407 % the input line (except we remove a trailing comment).  #1 should be a
    408 % macro which expects an ordinary undelimited TeX argument.
    409 % For example, \def\foo{\parsearg\fooxxx}.
    410 %
    411 \def\parsearg{\parseargusing{}}
    412 \def\parseargusing#1#2{%
    413   \def\argtorun{#2}%
    414   \begingroup
    415     \obeylines
    416     \spaceisspace
    417     #1%
    418     \parseargline\empty% Insert the \empty token, see \finishparsearg below.
    419 }
    420 
    421 {\obeylines %
    422   \gdef\parseargline#1^^M{%
    423     \endgroup % End of the group started in \parsearg.
    424     \argremovecomment #1\comment\ArgTerm%
    425   }%
    426 }
    427 
    428 % First remove any @comment, then any @c comment.  Pass the result on to
    429 % \argremovespace.
    430 \def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm}
    431 \def\argremovec#1\c#2\ArgTerm{\argremovespace#1$ $\ArgTerm}
    432 % \argremovec might leave us with trailing space, though; e.g.,
    433 %    @end itemize  @c foo
    434 % Note that the argument cannot contain the TeX $, as its catcode is
    435 % changed to \other when Texinfo source is read.
    436 \def\argremovespace#1 $#2\ArgTerm{\finishparsearg#1$\ArgTerm}
    437 
    438 % If a _delimited_ argument is enclosed in braces, they get stripped; so
    439 % to get _exactly_ the rest of the line, we had to prevent such situation.
    440 % We prepended an \empty token at the very beginning and we expand it
    441 % just before passing the control to \next.
    442 % (But first, we have to remove the remaining $ or two.)
    443 \def\finishparsearg#1$#2\ArgTerm{\expandafter\argtorun\expandafter{#1}}
    444 
    445 
    446 % \parseargdef - define a command taking an argument on the line
    447 %
    448 % \parseargdef\foo{...}
    449 %	is roughly equivalent to
    450 % \def\foo{\parsearg\Xfoo}
    451 % \def\Xfoo#1{...}
    452 \def\parseargdef#1{%
    453   \expandafter \doparseargdef \csname\string#1\endcsname #1%
    454 }
    455 \def\doparseargdef#1#2{%
    456   \def#2{\parsearg#1}%
    457   \def#1##1%
    458 }
    459 
    460 % Several utility definitions with active space:
    461 {
    462   \obeyspaces
    463   \gdef\obeyedspace{ }
    464 
    465   % Make each space character in the input produce a normal interword
    466   % space in the output.  Don't allow a line break at this space, as this
    467   % is used only in environments like @example, where each line of input
    468   % should produce a line of output anyway.
    469   %
    470   \gdef\sepspaces{\obeyspaces\let =\tie}
    471 
    472   % If an index command is used in an @example environment, any spaces
    473   % therein should become regular spaces in the raw index file, not the
    474   % expansion of \tie (\leavevmode \penalty \@M \ ).
    475   \gdef\unsepspaces{\let =\space}
    476 }
    477 
    478 
    479 \def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
    480 
    481 % Define the framework for environments in texinfo.tex.  It's used like this:
    482 %
    483 %   \envdef\foo{...}
    484 %   \def\Efoo{...}
    485 %
    486 % It's the responsibility of \envdef to insert \begingroup before the
    487 % actual body; @end closes the group after calling \Efoo.  \envdef also
    488 % defines \thisenv, so the current environment is known; @end checks
    489 % whether the environment name matches.  The \checkenv macro can also be
    490 % used to check whether the current environment is the one expected.
    491 %
    492 % Non-false conditionals (@iftex, @ifset) don't fit into this, so they
    493 % are not treated as environments; they don't open a group.  (The
    494 % implementation of @end takes care not to call \endgroup in this
    495 % special case.)
    496 
    497 
    498 % At run-time, environments start with this:
    499 \def\startenvironment#1{\begingroup\def\thisenv{#1}}
    500 % initialize
    501 \let\thisenv\empty
    502 
    503 % ... but they get defined via ``\envdef\foo{...}'':
    504 \long\def\envdef#1#2{\def#1{\startenvironment#1#2}}
    505 \long\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}}
    506 
    507 % Check whether we're in the right environment:
    508 \def\checkenv#1{%
    509   \def\temp{#1}%
    510   \ifx\thisenv\temp
    511   \else
    512     \badenverr
    513   \fi
    514 }
    515 
    516 % Environment mismatch, #1 expected:
    517 \def\badenverr{%
    518   \errhelp = \EMsimple
    519   \errmessage{This command can appear only \inenvironment\temp,
    520     not \inenvironment\thisenv}%
    521 }
    522 \def\inenvironment#1{%
    523   \ifx#1\empty
    524     outside of any environment%
    525   \else
    526     in environment \expandafter\string#1%
    527   \fi
    528 }
    529 
    530 
    531 % @end foo calls \checkenv and executes the definition of \Efoo.
    532 \parseargdef\end{%
    533   \if 1\csname iscond.#1\endcsname
    534   \else
    535     % The general wording of \badenverr may not be ideal.
    536     \expandafter\checkenv\csname#1\endcsname
    537     \csname E#1\endcsname
    538     \endgroup
    539   \fi
    540 }
    541 
    542 \newhelp\EMsimple{Press RETURN to continue.}
    543 
    544 
    545 % Be sure we're in horizontal mode when doing a tie, since we make space
    546 % equivalent to this in @example-like environments. Otherwise, a space
    547 % at the beginning of a line will start with \penalty -- and
    548 % since \penalty is valid in vertical mode, we'd end up putting the
    549 % penalty on the vertical list instead of in the new paragraph.
    550 {\catcode`@ = 11
    551  % Avoid using \@M directly, because that causes trouble
    552  % if the definition is written into an index file.
    553  \global\let\tiepenalty = \@M
    554  \gdef\tie{\leavevmode\penalty\tiepenalty\ }
    555 }
    556 
    557 % @: forces normal size whitespace following.
    558 \def\:{\spacefactor=1000 }
    559 
    560 % @* forces a line break.
    561 \def\*{\unskip\hfil\break\hbox{}\ignorespaces}
    562 
    563 % @/ allows a line break.
    564 \let\/=\allowbreak
    565 
    566 % @- allows explicit insertion of hyphenation points
    567 \def\-{\discretionary{\normaldash}{}{}}%
    568 
    569 % @. is an end-of-sentence period.
    570 \def\.{.\spacefactor=\endofsentencespacefactor\space}
    571 
    572 % @! is an end-of-sentence bang.
    573 \def\!{!\spacefactor=\endofsentencespacefactor\space}
    574 
    575 % @? is an end-of-sentence query.
    576 \def\?{?\spacefactor=\endofsentencespacefactor\space}
    577 
    578 % @w prevents a word break.  Without the \leavevmode, @w at the
    579 % beginning of a paragraph, when TeX is still in vertical mode, would
    580 % produce a whole line of output instead of starting the paragraph.
    581 \def\w#1{\leavevmode\hbox{#1}}
    582 
    583 % @group ... @end group forces ... to be all on one page, by enclosing
    584 % it in a TeX vbox.  We use \vtop instead of \vbox to construct the box
    585 % to keep its height that of a normal line.  According to the rules for
    586 % \topskip (p.114 of the TeXbook), the glue inserted is
    587 % max (\topskip - \ht (first item), 0).  If that height is large,
    588 % therefore, no glue is inserted, and the space between the headline and
    589 % the text is small, which looks bad.
    590 %
    591 % Another complication is that the group might be very large.  This can
    592 % cause the glue on the previous page to be unduly stretched, because it
    593 % does not have much material.  In this case, it's better to add an
    594 % explicit \vfill so that the extra space is at the bottom.  The
    595 % threshold for doing this is if the group is more than \vfilllimit
    596 % percent of a page (\vfilllimit can be changed inside of @tex).
    597 %
    598 \newbox\groupbox
    599 \def\vfilllimit{0.7}
    600 %
    601 \envdef\group{%
    602   \ifnum\catcode`\^^M=\active \else
    603     \errhelp = \groupinvalidhelp
    604     \errmessage{@group invalid in context where filling is enabled}%
    605   \fi
    606   \startsavinginserts
    607   %
    608   \setbox\groupbox = \vtop\bgroup
    609     % Do @comment since we are called inside an environment such as
    610     % @example, where each end-of-line in the input causes an
    611     % end-of-line in the output.  We don't want the end-of-line after
    612     % the `@group' to put extra space in the output.  Since @group
    613     % should appear on a line by itself (according to the Texinfo
    614     % manual), we don't worry about eating any user text.
    615     \comment
    616 }
    617 %
    618 % The \vtop produces a box with normal height and large depth; thus, TeX puts
    619 % \baselineskip glue before it, and (when the next line of text is done)
    620 % \lineskip glue after it.  Thus, space below is not quite equal to space
    621 % above.  But it's pretty close.
    622 \def\Egroup{%
    623     % To get correct interline space between the last line of the group
    624     % and the first line afterwards, we have to propagate \prevdepth.
    625     \endgraf % Not \par, as it may have been set to \lisppar.
    626     \global\dimen1 = \prevdepth
    627   \egroup           % End the \vtop.
    628   \addgroupbox
    629   \prevdepth = \dimen1
    630   \checkinserts
    631 }
    632 
    633 \def\addgroupbox{
    634   % \dimen0 is the vertical size of the group's box.
    635   \dimen0 = \ht\groupbox  \advance\dimen0 by \dp\groupbox
    636   % \dimen2 is how much space is left on the page (more or less).
    637   \dimen2 = \txipageheight   \advance\dimen2 by -\pagetotal
    638   % if the group doesn't fit on the current page, and it's a big big
    639   % group, force a page break.
    640   \ifdim \dimen0 > \dimen2
    641     \ifdim \pagetotal < \vfilllimit\txipageheight
    642       \page
    643     \fi
    644   \fi
    645   \box\groupbox
    646 }
    647 
    648 %
    649 % TeX puts in an \escapechar (i.e., `@') at the beginning of the help
    650 % message, so this ends up printing `@group can only ...'.
    651 %
    652 \newhelp\groupinvalidhelp{%
    653 group can only be used in environments such as @example,^^J%
    654 where each line of input produces a line of output.}
    655 
    656 % @need space-in-mils
    657 % forces a page break if there is not space-in-mils remaining.
    658 
    659 \newdimen\mil  \mil=0.001in
    660 
    661 \parseargdef\need{%
    662   % Ensure vertical mode, so we don't make a big box in the middle of a
    663   % paragraph.
    664   \par
    665   %
    666   % If the @need value is less than one line space, it's useless.
    667   \dimen0 = #1\mil
    668   \dimen2 = \ht\strutbox
    669   \advance\dimen2 by \dp\strutbox
    670   \ifdim\dimen0 > \dimen2
    671     % This is similar to the 'needspace' module in LaTeX.
    672     % The first penalty allows a break if the end of the page is
    673     % not too far away.  Following penalties and skips are discarded.
    674     % Otherwise, require at least \dimen0 of vertical space.
    675     %
    676     % (We used to use a \vtop to reserve space, but this had spacing issues
    677     % when followed by a section heading, as it was not a "discardable item".
    678     % This also has the benefit of providing glue before the page break if
    679     % there isn't enough space.)
    680     \vskip0pt plus \dimen0
    681     \penalty-100
    682     \vskip0pt plus -\dimen0
    683     \vskip \dimen0
    684     \penalty9999
    685     \vskip -\dimen0
    686     \penalty0\relax % this hides the above glue from \safewhatsit and \dobreak
    687   \fi
    688 }
    689 
    690 % @br   forces paragraph break (and is undocumented).
    691 
    692 \let\br = \par
    693 
    694 % @page forces the start of a new page.
    695 %
    696 \def\page{\par\vfill\supereject}
    697 
    698 % @exdent text....
    699 % outputs text on separate line in roman font, starting at standard page margin
    700 
    701 % This records the amount of indent in the innermost environment.
    702 % That's how much \exdent should take out.
    703 \newskip\exdentamount
    704 
    705 % This defn is used inside fill environments such as @defun.
    706 \parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}
    707 
    708 % This defn is used inside nofill environments such as @example.
    709 \parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount
    710   \leftline{\hskip\leftskip{\rm#1}}}}
    711 
    712 % @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
    713 % paragraph.  For more general purposes, use the \margin insertion
    714 % class.  WHICH is `l' or `r'.  Not documented, written for gawk manual.
    715 %
    716 \newskip\inmarginspacing \inmarginspacing=1cm
    717 \def\strutdepth{\dp\strutbox}
    718 %
    719 \def\doinmargin#1#2{\strut\vadjust{%
    720   \nobreak
    721   \kern-\strutdepth
    722   \vtop to \strutdepth{%
    723     \baselineskip=\strutdepth
    724     \vss
    725     % if you have multiple lines of stuff to put here, you'll need to
    726     % make the vbox yourself of the appropriate size.
    727     \ifx#1l%
    728       \llap{\ignorespaces #2\hskip\inmarginspacing}%
    729     \else
    730       \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}%
    731     \fi
    732     \null
    733   }%
    734 }}
    735 \def\inleftmargin{\doinmargin l}
    736 \def\inrightmargin{\doinmargin r}
    737 %
    738 % @inmargin{TEXT [, RIGHT-TEXT]}
    739 % (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right;
    740 % else use TEXT for both).
    741 %
    742 \def\inmargin#1{\parseinmargin #1,,\finish}
    743 \def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing.
    744   \setbox0 = \hbox{\ignorespaces #2}%
    745   \ifdim\wd0 > 0pt
    746     \def\lefttext{#1}%  have both texts
    747     \def\righttext{#2}%
    748   \else
    749     \def\lefttext{#1}%  have only one text
    750     \def\righttext{#1}%
    751   \fi
    752   %
    753   \ifodd\pageno
    754     \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin
    755   \else
    756     \def\temp{\inleftmargin\lefttext}%
    757   \fi
    758   \temp
    759 }
    760 
    761 % @include FILE -- \input text of FILE.
    762 %
    763 \def\include{\parseargusing\filenamecatcodes\includezzz}
    764 \def\includezzz#1{%
    765   \pushthisfilestack
    766   \def\thisfile{#1}%
    767   {%
    768     \makevalueexpandable  % we want to expand any @value in FILE.
    769     \turnoffactive        % and allow special characters in the expansion
    770     \indexnofonts         % Allow `@@' and other weird things in file names.
    771     \wlog{texinfo.tex: doing @include of #1^^J}%
    772     \edef\temp{\noexpand\input #1 }%
    773     %
    774     % This trickery is to read FILE outside of a group, in case it makes
    775     % definitions, etc.
    776     \expandafter
    777   }\temp
    778   \popthisfilestack
    779 }
    780 \def\filenamecatcodes{%
    781   \catcode`\\=\other
    782   \catcode`~=\other
    783   \catcode`^=\other
    784   \catcode`_=\other
    785   \catcode`|=\other
    786   \catcode`<=\other
    787   \catcode`>=\other
    788   \catcode`+=\other
    789   \catcode`-=\other
    790   \catcode`\`=\other
    791   \catcode`\'=\other
    792 }
    793 
    794 \def\pushthisfilestack{%
    795   \expandafter\pushthisfilestackX\popthisfilestack\StackTerm
    796 }
    797 \def\pushthisfilestackX{%
    798   \expandafter\pushthisfilestackY\thisfile\StackTerm
    799 }
    800 \def\pushthisfilestackY #1\StackTerm #2\StackTerm {%
    801   \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}%
    802 }
    803 
    804 \def\popthisfilestack{\errthisfilestackempty}
    805 \def\errthisfilestackempty{\errmessage{Internal error:
    806   the stack of filenames is empty.}}
    807 %
    808 \def\thisfile{}
    809 
    810 % @center line
    811 % outputs that line, centered.
    812 %
    813 \parseargdef\center{%
    814   \ifhmode
    815     \let\centersub\centerH
    816   \else
    817     \let\centersub\centerV
    818   \fi
    819   \centersub{\hfil \ignorespaces#1\unskip \hfil}%
    820   \let\centersub\relax % don't let the definition persist, just in case
    821 }
    822 \def\centerH#1{{%
    823   \hfil\break
    824   \advance\hsize by -\leftskip
    825   \advance\hsize by -\rightskip
    826   \line{#1}%
    827   \break
    828 }}
    829 %
    830 \newcount\centerpenalty
    831 \def\centerV#1{%
    832   % The idea here is the same as in \startdefun, \cartouche, etc.: if
    833   % @center is the first thing after a section heading, we need to wipe
    834   % out the negative parskip inserted by \sectionheading, but still
    835   % prevent a page break here.
    836   \centerpenalty = \lastpenalty
    837   \ifnum\centerpenalty>10000 \vskip\parskip \fi
    838   \ifnum\centerpenalty>9999 \penalty\centerpenalty \fi
    839   \line{\kern\leftskip #1\kern\rightskip}%
    840 }
    841 
    842 % @sp n   outputs n lines of vertical space
    843 %
    844 \parseargdef\sp{\vskip #1\baselineskip}
    845 
    846 % @comment ...line which is ignored...
    847 % @c is the same as @comment
    848 % @ignore ... @end ignore  is another way to write a comment
    849 
    850 
    851 \def\c{\begingroup \catcode`\^^M=\active%
    852 \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
    853 \cxxx}
    854 {\catcode`\^^M=\active \gdef\cxxx#1^^M{\endgroup}}
    855 %
    856 \let\comment\c
    857 
    858 % @paragraphindent NCHARS
    859 % We'll use ems for NCHARS, close enough.
    860 % NCHARS can also be the word `asis' or `none'.
    861 % We cannot feasibly implement @paragraphindent asis, though.
    862 %
    863 \def\asisword{asis} % no translation, these are keywords
    864 \def\noneword{none}
    865 %
    866 \parseargdef\paragraphindent{%
    867   \def\temp{#1}%
    868   \ifx\temp\asisword
    869   \else
    870     \ifx\temp\noneword
    871       \defaultparindent = 0pt
    872     \else
    873       \defaultparindent = #1em
    874     \fi
    875   \fi
    876   \parindent = \defaultparindent
    877 }
    878 
    879 % @exampleindent NCHARS
    880 % We'll use ems for NCHARS like @paragraphindent.
    881 % It seems @exampleindent asis isn't necessary, but
    882 % I preserve it to make it similar to @paragraphindent.
    883 \parseargdef\exampleindent{%
    884   \def\temp{#1}%
    885   \ifx\temp\asisword
    886   \else
    887     \ifx\temp\noneword
    888       \lispnarrowing = 0pt
    889     \else
    890       \lispnarrowing = #1em
    891     \fi
    892   \fi
    893 }
    894 
    895 % @firstparagraphindent WORD
    896 % If WORD is `none', then suppress indentation of the first paragraph
    897 % after a section heading.  If WORD is `insert', then do indent at such
    898 % paragraphs.
    899 %
    900 % The paragraph indentation is suppressed or not by calling
    901 % \suppressfirstparagraphindent, which the sectioning commands do.
    902 % We switch the definition of this back and forth according to WORD.
    903 % By default, we suppress indentation.
    904 %
    905 \def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent}
    906 \def\insertword{insert}
    907 %
    908 \parseargdef\firstparagraphindent{%
    909   \def\temp{#1}%
    910   \ifx\temp\noneword
    911     \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent
    912   \else\ifx\temp\insertword
    913     \let\suppressfirstparagraphindent = \relax
    914   \else
    915     \errhelp = \EMsimple
    916     \errmessage{Unknown @firstparagraphindent option `\temp'}%
    917   \fi\fi
    918 }
    919 
    920 % Here is how we actually suppress indentation.  Redefine \everypar to
    921 % \kern backwards by \parindent, and then reset itself to empty.
    922 %
    923 % We also make \indent itself not actually do anything until the next
    924 % paragraph.
    925 %
    926 \gdef\dosuppressfirstparagraphindent{%
    927   \gdef\indent  {\restorefirstparagraphindent \indent}%
    928   \gdef\noindent{\restorefirstparagraphindent \noindent}%
    929   \global\everypar = {\kern -\parindent \restorefirstparagraphindent}%
    930 }
    931 %
    932 \gdef\restorefirstparagraphindent{%
    933   \global\let\indent = \ptexindent
    934   \global\let\noindent = \ptexnoindent
    935   \global\everypar = {}%
    936 }
    937 
    938 % leave vertical mode without cancelling any first paragraph indent
    939 \gdef\imageindent{%
    940   \toks0=\everypar
    941   \everypar={}%
    942   \ptexnoindent
    943   \global\everypar=\toks0
    944 }
    945 
    946 
    947 % @refill is a no-op.
    948 \let\refill=\relax
    949 
    950 % @setfilename INFO-FILENAME - ignored
    951 \let\setfilename=\comment
    952 
    953 % @bye.
    954 \outer\def\bye{\chappager\pagelabels\tracingstats=1\ptexend}
    955 
    956 
    957 \message{pdf,}
    958 % adobe `portable' document format
    959 \newcount\tempnum
    960 \newcount\lnkcount
    961 \newtoks\filename
    962 \newcount\filenamelength
    963 \newcount\pgn
    964 \newtoks\toksA
    965 \newtoks\toksB
    966 \newtoks\toksC
    967 \newtoks\toksD
    968 \newbox\boxA
    969 \newbox\boxB
    970 \newcount\countA
    971 \newif\ifpdf
    972 \newif\ifpdfmakepagedest
    973 
    974 %
    975 % For LuaTeX
    976 %
    977 
    978 \newif\iftxiuseunicodedestname
    979 \txiuseunicodedestnamefalse % For pdfTeX etc.
    980 
    981 \ifx\luatexversion\thisisundefined
    982 \else
    983   % Use Unicode destination names
    984   \txiuseunicodedestnametrue
    985   % Escape PDF strings with converting UTF-16 from UTF-8
    986   \begingroup
    987     \catcode`\%=12
    988     \directlua{
    989       function UTF16oct(str)
    990         tex.sprint(string.char(0x5c) .. '376' .. string.char(0x5c) .. '377')
    991         for c in string.utfvalues(str) do
    992           if c < 0x10000 then
    993             tex.sprint(
    994               string.format(string.char(0x5c) .. string.char(0x25) .. '03o' ..
    995                             string.char(0x5c) .. string.char(0x25) .. '03o',
    996                             math.floor(c / 256), math.floor(c % 256)))
    997           else
    998             c = c - 0x10000
    999             local c_hi = c / 1024 + 0xd800
   1000             local c_lo = c % 1024 + 0xdc00
   1001             tex.sprint(
   1002               string.format(string.char(0x5c) .. string.char(0x25) .. '03o' ..
   1003                             string.char(0x5c) .. string.char(0x25) .. '03o' ..
   1004                             string.char(0x5c) .. string.char(0x25) .. '03o' ..
   1005                             string.char(0x5c) .. string.char(0x25) .. '03o',
   1006                             math.floor(c_hi / 256), math.floor(c_hi % 256),
   1007                             math.floor(c_lo / 256), math.floor(c_lo % 256)))
   1008           end
   1009         end
   1010       end
   1011     }
   1012   \endgroup
   1013   \def\pdfescapestrutfsixteen#1{\directlua{UTF16oct('\luaescapestring{#1}')}}
   1014   % Escape PDF strings without converting
   1015   \begingroup
   1016     \directlua{
   1017       function PDFescstr(str)
   1018         for c in string.bytes(str) do
   1019           if c <= 0x20 or c >= 0x80 or c == 0x28 or c == 0x29 or c == 0x5c then
   1020             tex.sprint(-2,
   1021               string.format(string.char(0x5c) .. string.char(0x25) .. '03o',
   1022                             c))
   1023           else
   1024             tex.sprint(-2, string.char(c))
   1025           end
   1026         end
   1027       end
   1028     }
   1029     % The -2 in the arguments here gives all the input to TeX catcode 12
   1030     % (other) or 10 (space), preventing undefined control sequence errors. See
   1031     % https://lists.gnu.org/archive/html/bug-texinfo/2019-08/msg00031.html
   1032     %
   1033   \endgroup
   1034   \def\pdfescapestring#1{\directlua{PDFescstr('\luaescapestring{#1}')}}
   1035   \ifnum\luatexversion>84
   1036     % For LuaTeX >= 0.85
   1037     \def\pdfdest{\pdfextension dest}
   1038     \let\pdfoutput\outputmode
   1039     \def\pdfliteral{\pdfextension literal}
   1040     \def\pdfcatalog{\pdfextension catalog}
   1041     \def\pdftexversion{\numexpr\pdffeedback version\relax}
   1042     \let\pdfximage\saveimageresource
   1043     \let\pdfrefximage\useimageresource
   1044     \let\pdflastximage\lastsavedimageresourceindex
   1045     \def\pdfendlink{\pdfextension endlink\relax}
   1046     \def\pdfoutline{\pdfextension outline}
   1047     \def\pdfstartlink{\pdfextension startlink}
   1048     \def\pdffontattr{\pdfextension fontattr}
   1049     \def\pdfobj{\pdfextension obj}
   1050     \def\pdflastobj{\numexpr\pdffeedback lastobj\relax}
   1051     \let\pdfpagewidth\pagewidth
   1052     \let\pdfpageheight\pageheight
   1053     \edef\pdfhorigin{\pdfvariable horigin}
   1054     \edef\pdfvorigin{\pdfvariable vorigin}
   1055   \fi
   1056 \fi
   1057 
   1058 % when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1
   1059 % can be set).  So we test for \relax and 0 as well as being undefined.
   1060 \ifx\pdfoutput\thisisundefined
   1061 \else
   1062   \ifx\pdfoutput\relax
   1063   \else
   1064     \ifcase\pdfoutput
   1065     \else
   1066       \pdftrue
   1067     \fi
   1068   \fi
   1069 \fi
   1070 
   1071 \newif\ifpdforxetex
   1072 \pdforxetexfalse
   1073 \ifpdf
   1074   \pdforxetextrue
   1075 \fi
   1076 \ifx\XeTeXrevision\thisisundefined\else
   1077   \pdforxetextrue
   1078 \fi
   1079 
   1080 
   1081 % Output page labels information.
   1082 % See PDF reference v.1.7 p.594, section 8.3.1.
   1083 % Page label ranges must be increasing.
   1084 \ifpdf
   1085 \def\pagelabels{%
   1086   \def\title{0 << /P (T-) /S /D >>}%
   1087   %
   1088   % support @contents at very end of document
   1089   \ifnum\contentsendcount=\pagecount
   1090     \ifnum\arabiccount<\romancount
   1091       \pdfcatalog{/PageLabels << /Nums
   1092                   [\title
   1093                    \the\arabiccount << /S /D >>
   1094                    \the\romancount << /S /r >>
   1095                   ] >> }\relax
   1096     \fi
   1097   % no contents in document
   1098   \else\ifnum\contentsendcount=0
   1099     \pdfcatalog{/PageLabels << /Nums
   1100                 [\title
   1101                  \the\arabiccount << /S /D >>
   1102                 ] >> }\relax
   1103   \else
   1104     \pdfcatalog{/PageLabels << /Nums
   1105                 [\title
   1106                  \the\romancount << /S /r >>
   1107                  \the\contentsendcount << /S /D >>
   1108                 ] >> }\relax
   1109   \fi\fi
   1110 }
   1111 \else
   1112   \let\pagelabels\relax
   1113 \fi
   1114 
   1115 \newcount\pagecount \pagecount=0
   1116 \newcount\romancount \romancount=0
   1117 \newcount\arabiccount \arabiccount=0
   1118 \newcount\contentsendcount \contentsendcount=0
   1119 
   1120 \ifpdf
   1121   \let\ptxadvancepageno\advancepageno
   1122   \def\advancepageno{%
   1123     \ptxadvancepageno\global\advance\pagecount by 1
   1124   }
   1125 \fi
   1126 
   1127 
   1128 % PDF uses PostScript string constants for the names of xref targets,
   1129 % for display in the outlines, and in other places.  Thus, we have to
   1130 % double any backslashes.  Otherwise, a name like "\node" will be
   1131 % interpreted as a newline (\n), followed by o, d, e.  Not good.
   1132 %
   1133 % See http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html and
   1134 % related messages.  The final outcome is that it is up to the TeX user
   1135 % to double the backslashes and otherwise make the string valid, so
   1136 % that's what we do.  pdftex 1.30.0 (ca.2005) introduced a primitive to
   1137 % do this reliably, so we use it.
   1138 
   1139 % #1 is a control sequence in which to do the replacements,
   1140 % which we \xdef.
   1141 \def\txiescapepdf#1{%
   1142   \ifx\pdfescapestring\thisisundefined
   1143     % No primitive available; should we give a warning or log?
   1144     % Many times it won't matter.
   1145     \xdef#1{#1}%
   1146   \else
   1147     % The expandable \pdfescapestring primitive escapes parentheses,
   1148     % backslashes, and other special chars.
   1149     \xdef#1{\pdfescapestring{#1}}%
   1150   \fi
   1151 }
   1152 \def\txiescapepdfutfsixteen#1{%
   1153   \ifx\pdfescapestrutfsixteen\thisisundefined
   1154     % No UTF-16 converting macro available.
   1155     \txiescapepdf{#1}%
   1156   \else
   1157     \xdef#1{\pdfescapestrutfsixteen{#1}}%
   1158   \fi
   1159 }
   1160 
   1161 \newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images
   1162 with PDF output, and none of those formats could be found.  (.eps cannot
   1163 be supported due to the design of the PDF format; use regular TeX (DVI
   1164 output) for that.)}
   1165 
   1166 \ifpdf
   1167   %
   1168   % Color manipulation macros using ideas from pdfcolor.tex,
   1169   % except using rgb instead of cmyk; the latter is said to render as a
   1170   % very dark gray on-screen and a very dark halftone in print, instead
   1171   % of actual black. The dark red here is dark enough to print on paper as
   1172   % nearly black, but still distinguishable for online viewing.  We use
   1173   % black by default, though.
   1174   \def\rgbDarkRed{0.50 0.09 0.12}
   1175   \def\rgbBlack{0 0 0}
   1176   %
   1177   % rg sets the color for filling (usual text, etc.);
   1178   % RG sets the color for stroking (thin rules, e.g., normal _'s).
   1179   \def\pdfsetcolor#1{\pdfliteral{#1 rg  #1 RG}}
   1180   %
   1181   % Set color, and create a mark which defines \thiscolor accordingly,
   1182   % so that \makeheadline knows which color to restore.
   1183   \def\curcolor{0 0 0}%
   1184   \def\setcolor#1{%
   1185     \ifx#1\curcolor\else
   1186       \xdef\currentcolordefs{\gdef\noexpand\thiscolor{#1}}%
   1187       \domark
   1188       \pdfsetcolor{#1}%
   1189       \xdef\curcolor{#1}%
   1190     \fi
   1191   }
   1192   %
   1193   \let\maincolor\rgbBlack
   1194   \pdfsetcolor{\maincolor}
   1195   \edef\thiscolor{\maincolor}
   1196   \def\currentcolordefs{}
   1197   %
   1198   \def\makefootline{%
   1199     \baselineskip24pt
   1200     \line{\pdfsetcolor{\maincolor}\the\footline}%
   1201   }
   1202   %
   1203   \def\makeheadline{%
   1204     \vbox to 0pt{%
   1205       \vskip-22.5pt
   1206       \line{%
   1207         \vbox to8.5pt{}%
   1208         % Extract \thiscolor definition from the marks.
   1209         \getcolormarks
   1210         % Typeset the headline with \maincolor, then restore the color.
   1211         \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}%
   1212       }%
   1213       \vss
   1214     }%
   1215     \nointerlineskip
   1216   }
   1217   %
   1218   %
   1219   \pdfcatalog{/PageMode /UseOutlines}
   1220   %
   1221   % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto).
   1222   \def\dopdfimage#1#2#3{%
   1223     \def\pdfimagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}%
   1224     \def\pdfimageheight{#3}\setbox2 = \hbox{\ignorespaces #3}%
   1225     %
   1226     % pdftex (and the PDF format) support .pdf, .png, .jpg (among
   1227     % others).  Let's try in that order, PDF first since if
   1228     % someone has a scalable image, presumably better to use that than a
   1229     % bitmap.
   1230     \let\pdfimgext=\empty
   1231     \begingroup
   1232       \openin 1 #1.pdf \ifeof 1
   1233         \openin 1 #1.PDF \ifeof 1
   1234           \openin 1 #1.png \ifeof 1
   1235             \openin 1 #1.jpg \ifeof 1
   1236               \openin 1 #1.jpeg \ifeof 1
   1237                 \openin 1 #1.JPG \ifeof 1
   1238                   \errhelp = \nopdfimagehelp
   1239                   \errmessage{Could not find image file #1 for pdf}%
   1240                 \else \gdef\pdfimgext{JPG}%
   1241                 \fi
   1242               \else \gdef\pdfimgext{jpeg}%
   1243               \fi
   1244             \else \gdef\pdfimgext{jpg}%
   1245             \fi
   1246           \else \gdef\pdfimgext{png}%
   1247           \fi
   1248         \else \gdef\pdfimgext{PDF}%
   1249         \fi
   1250       \else \gdef\pdfimgext{pdf}%
   1251       \fi
   1252       \closein 1
   1253     \endgroup
   1254     %
   1255     % without \immediate, ancient pdftex seg faults when the same image is
   1256     % included twice.  (Version 3.14159-pre-1.0-unofficial-20010704.)
   1257     \ifnum\pdftexversion < 14
   1258       \immediate\pdfimage
   1259     \else
   1260       \immediate\pdfximage
   1261     \fi
   1262       \ifdim \wd0 >0pt width \pdfimagewidth \fi
   1263       \ifdim \wd2 >0pt height \pdfimageheight \fi
   1264       \ifnum\pdftexversion<13
   1265          #1.\pdfimgext
   1266        \else
   1267          {#1.\pdfimgext}%
   1268        \fi
   1269     \ifnum\pdftexversion < 14 \else
   1270       \pdfrefximage \pdflastximage
   1271     \fi}
   1272   %
   1273   \def\setpdfdestname#1{{%
   1274     % We have to set dummies so commands such as @code, and characters
   1275     % such as \, aren't expanded when present in a section title.
   1276     \indexnofonts
   1277     \makevalueexpandable
   1278     \turnoffactive
   1279     \iftxiuseunicodedestname
   1280       \ifx \declaredencoding \latone
   1281         % Pass through Latin-1 characters.
   1282         % LuaTeX with byte wise I/O converts Latin-1 characters to Unicode.
   1283       \else
   1284         \ifx \declaredencoding \utfeight
   1285           % Pass through Unicode characters.
   1286         \else
   1287           % Use ASCII approximations in destination names.
   1288           \passthroughcharsfalse
   1289         \fi
   1290       \fi
   1291     \else
   1292       % Use ASCII approximations in destination names.
   1293       \passthroughcharsfalse
   1294     \fi
   1295     \def\pdfdestname{#1}%
   1296     \txiescapepdf\pdfdestname
   1297   }}
   1298   %
   1299   \def\setpdfoutlinetext#1{{%
   1300     \indexnofonts
   1301     \makevalueexpandable
   1302     \turnoffactive
   1303     \ifx \declaredencoding \latone
   1304       % The PDF format can use an extended form of Latin-1 in bookmark
   1305       % strings.  See Appendix D of the PDF Reference, Sixth Edition, for
   1306       % the "PDFDocEncoding".
   1307       \passthroughcharstrue
   1308       % Pass through Latin-1 characters.
   1309       %   LuaTeX: Convert to Unicode
   1310       %   pdfTeX: Use Latin-1 as PDFDocEncoding
   1311       \def\pdfoutlinetext{#1}%
   1312     \else
   1313       \ifx \declaredencoding \utfeight
   1314         \ifx\luatexversion\thisisundefined
   1315           % For pdfTeX  with UTF-8.
   1316           % TODO: the PDF format can use UTF-16 in bookmark strings,
   1317           % but the code for this isn't done yet.
   1318           % Use ASCII approximations.
   1319           \passthroughcharsfalse
   1320           \def\pdfoutlinetext{#1}%
   1321         \else
   1322           % For LuaTeX with UTF-8.
   1323           % Pass through Unicode characters for title texts.
   1324           \passthroughcharstrue
   1325           \def\pdfoutlinetext{#1}%
   1326         \fi
   1327       \else
   1328         % For non-Latin-1 or non-UTF-8 encodings.
   1329         % Use ASCII approximations.
   1330         \passthroughcharsfalse
   1331         \def\pdfoutlinetext{#1}%
   1332       \fi
   1333     \fi
   1334     % LuaTeX: Convert to UTF-16
   1335     % pdfTeX: Use Latin-1 as PDFDocEncoding
   1336     \txiescapepdfutfsixteen\pdfoutlinetext
   1337   }}
   1338   %
   1339   \def\pdfmkdest#1{%
   1340     \setpdfdestname{#1}%
   1341     \safewhatsit{\pdfdest name{\pdfdestname} xyz}%
   1342   }
   1343   %
   1344   % used to mark target names; must be expandable.
   1345   \def\pdfmkpgn#1{#1}
   1346   %
   1347   % by default, use black for everything.
   1348   \def\urlcolor{\rgbBlack}
   1349   \let\linkcolor\rgbBlack
   1350   \def\endlink{\setcolor{\maincolor}\pdfendlink}
   1351   %
   1352   % Adding outlines to PDF; macros for calculating structure of outlines
   1353   % come from Petr Olsak
   1354   \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
   1355     \else \csname#1\endcsname \fi}
   1356   \def\advancenumber#1{\tempnum=\expnumber{#1}\relax
   1357     \advance\tempnum by 1
   1358     \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
   1359   %
   1360   % #1 is the section text, which is what will be displayed in the
   1361   % outline by the pdf viewer.  #2 is the pdf expression for the number
   1362   % of subentries (or empty, for subsubsections).  #3 is the node text,
   1363   % which might be empty if this toc entry had no corresponding node.
   1364   % #4 is the page number
   1365   %
   1366   \def\dopdfoutline#1#2#3#4{%
   1367     % Generate a link to the node text if that exists; else, use the
   1368     % page number.  We could generate a destination for the section
   1369     % text in the case where a section has no node, but it doesn't
   1370     % seem worth the trouble, since most documents are normally structured.
   1371     \setpdfoutlinetext{#1}
   1372     \setpdfdestname{#3}
   1373     \ifx\pdfdestname\empty
   1374       \def\pdfdestname{#4}%
   1375     \fi
   1376     %
   1377     \pdfoutline goto name{\pdfmkpgn{\pdfdestname}}#2{\pdfoutlinetext}%
   1378   }
   1379   %
   1380   \def\pdfmakeoutlines{%
   1381     \begingroup
   1382       % Read toc silently, to get counts of subentries for \pdfoutline.
   1383       \def\partentry##1##2##3##4{}% ignore parts in the outlines
   1384       \def\numchapentry##1##2##3##4{%
   1385 	\def\thischapnum{##2}%
   1386 	\def\thissecnum{0}%
   1387 	\def\thissubsecnum{0}%
   1388       }%
   1389       \def\numsecentry##1##2##3##4{%
   1390 	\advancenumber{chap\thischapnum}%
   1391 	\def\thissecnum{##2}%
   1392 	\def\thissubsecnum{0}%
   1393       }%
   1394       \def\numsubsecentry##1##2##3##4{%
   1395 	\advancenumber{sec\thissecnum}%
   1396 	\def\thissubsecnum{##2}%
   1397       }%
   1398       \def\numsubsubsecentry##1##2##3##4{%
   1399 	\advancenumber{subsec\thissubsecnum}%
   1400       }%
   1401       \def\thischapnum{0}%
   1402       \def\thissecnum{0}%
   1403       \def\thissubsecnum{0}%
   1404       %
   1405       % use \def rather than \let here because we redefine \chapentry et
   1406       % al. a second time, below.
   1407       \def\appentry{\numchapentry}%
   1408       \def\appsecentry{\numsecentry}%
   1409       \def\appsubsecentry{\numsubsecentry}%
   1410       \def\appsubsubsecentry{\numsubsubsecentry}%
   1411       \def\unnchapentry{\numchapentry}%
   1412       \def\unnsecentry{\numsecentry}%
   1413       \def\unnsubsecentry{\numsubsecentry}%
   1414       \def\unnsubsubsecentry{\numsubsubsecentry}%
   1415       \readdatafile{toc}%
   1416       %
   1417       % Read toc second time, this time actually producing the outlines.
   1418       % The `-' means take the \expnumber as the absolute number of
   1419       % subentries, which we calculated on our first read of the .toc above.
   1420       %
   1421       % We use the node names as the destinations.
   1422       %
   1423       % Currently we prefix the section name with the section number
   1424       % for chapter and appendix headings only in order to avoid too much
   1425       % horizontal space being required in the PDF viewer.
   1426       \def\numchapentry##1##2##3##4{%
   1427         \dopdfoutline{##2 ##1}{count-\expnumber{chap##2}}{##3}{##4}}%
   1428       \def\unnchapentry##1##2##3##4{%
   1429         \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}%
   1430       \def\numsecentry##1##2##3##4{%
   1431         \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}%
   1432       \def\numsubsecentry##1##2##3##4{%
   1433         \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}%
   1434       \def\numsubsubsecentry##1##2##3##4{% count is always zero
   1435         \dopdfoutline{##1}{}{##3}{##4}}%
   1436       %
   1437       % PDF outlines are displayed using system fonts, instead of
   1438       % document fonts.  Therefore we cannot use special characters,
   1439       % since the encoding is unknown.  For example, the eogonek from
   1440       % Latin 2 (0xea) gets translated to a | character.  Info from
   1441       % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100.
   1442       %
   1443       % TODO this right, we have to translate 8-bit characters to
   1444       % their "best" equivalent, based on the @documentencoding.  Too
   1445       % much work for too little return.  Just use the ASCII equivalents
   1446       % we use for the index sort strings.
   1447       %
   1448       \indexnofonts
   1449       \setupdatafile
   1450       % We can have normal brace characters in the PDF outlines, unlike
   1451       % Texinfo index files.  So set that up.
   1452       \def\{{\lbracecharliteral}%
   1453       \def\}{\rbracecharliteral}%
   1454       \catcode`\\=\active \otherbackslash
   1455       \input \tocreadfilename
   1456     \endgroup
   1457   }
   1458   {\catcode`[=1 \catcode`]=2
   1459    \catcode`{=\other \catcode`}=\other
   1460    \gdef\lbracecharliteral[{]%
   1461    \gdef\rbracecharliteral[}]%
   1462   ]
   1463   %
   1464   \def\skipspaces#1{\def\PP{#1}\def\D{|}%
   1465     \ifx\PP\D\let\nextsp\relax
   1466     \else\let\nextsp\skipspaces
   1467       \addtokens{\filename}{\PP}%
   1468       \advance\filenamelength by 1
   1469     \fi
   1470     \nextsp}
   1471   \def\getfilename#1{%
   1472     \filenamelength=0
   1473     % If we don't expand the argument now, \skipspaces will get
   1474     % snagged on things like "@value{foo}".
   1475     \edef\temp{#1}%
   1476     \expandafter\skipspaces\temp|\relax
   1477   }
   1478   \ifnum\pdftexversion < 14
   1479     \let \startlink \pdfannotlink
   1480   \else
   1481     \let \startlink \pdfstartlink
   1482   \fi
   1483   % make a live url in pdf output.
   1484   \def\pdfurl#1{%
   1485     \begingroup
   1486       % it seems we really need yet another set of dummies; have not
   1487       % tried to figure out what each command should do in the context
   1488       % of @url.  for now, just make @/ a no-op, that's the only one
   1489       % people have actually reported a problem with.
   1490       %
   1491       \normalturnoffactive
   1492       \def\@{@}%
   1493       \let\/=\empty
   1494       \makevalueexpandable
   1495       % do we want to go so far as to use \indexnofonts instead of just
   1496       % special-casing \var here?
   1497       \def\var##1{##1}%
   1498       %
   1499       \leavevmode\setcolor{\urlcolor}%
   1500       \startlink attr{/Border [0 0 0]}%
   1501         user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
   1502     \endgroup}
   1503   % \pdfgettoks - Surround page numbers in #1 with @pdflink.  #1 may
   1504   % be a simple number, or a list of numbers in the case of an index
   1505   % entry.
   1506   \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
   1507   \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
   1508   \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
   1509   \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
   1510   \def\maketoks{%
   1511     \expandafter\poptoks\the\toksA|ENDTOKS|\relax
   1512     \ifx\first0\adn0
   1513     \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
   1514     \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
   1515     \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9
   1516     \else
   1517       \ifnum0=\countA\else\makelink\fi
   1518       \ifx\first.\let\next=\done\else
   1519         \let\next=\maketoks
   1520         \addtokens{\toksB}{\the\toksD}
   1521         \ifx\first,\addtokens{\toksB}{\space}\fi
   1522       \fi
   1523     \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
   1524     \next}
   1525   \def\makelink{\addtokens{\toksB}%
   1526     {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
   1527   \def\pdflink#1{\pdflinkpage{#1}{#1}}%
   1528   \def\pdflinkpage#1#2{%
   1529     \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}
   1530     \setcolor{\linkcolor}#2\endlink}
   1531   \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
   1532 \else
   1533   % non-pdf mode
   1534   \let\pdfmkdest = \gobble
   1535   \let\pdfurl = \gobble
   1536   \let\endlink = \relax
   1537   \let\setcolor = \gobble
   1538   \let\pdfsetcolor = \gobble
   1539   \let\pdfmakeoutlines = \relax
   1540 \fi  % \ifx\pdfoutput
   1541 
   1542 %
   1543 % For XeTeX
   1544 %
   1545 \ifx\XeTeXrevision\thisisundefined
   1546 \else
   1547   %
   1548   % XeTeX version check
   1549   %
   1550   \ifnum\strcmp{\the\XeTeXversion\XeTeXrevision}{0.99996}>-1
   1551     % TeX Live 2016 contains XeTeX 0.99996 and xdvipdfmx 20160307.
   1552     % It can use the `dvipdfmx:config' special (from TeX Live SVN r40941).
   1553     % For avoiding PDF destination name replacement, we use this special
   1554     % instead of xdvipdfmx's command line option `-C 0x0010'.
   1555     \special{dvipdfmx:config C 0x0010}
   1556     % XeTeX 0.99995+ comes with xdvipdfmx 20160307+.
   1557     % It can handle Unicode destination names for PDF.
   1558     \txiuseunicodedestnametrue
   1559   \else
   1560     % XeTeX < 0.99996 (TeX Live < 2016) cannot use the
   1561     % `dvipdfmx:config' special.
   1562     % So for avoiding PDF destination name replacement,
   1563     % xdvipdfmx's command line option `-C 0x0010' is necessary.
   1564     %
   1565     % XeTeX < 0.99995 can not handle Unicode destination names for PDF
   1566     % because xdvipdfmx 20150315 has a UTF-16 conversion issue.
   1567     % It is fixed by xdvipdfmx 20160106 (TeX Live SVN r39753).
   1568     \txiuseunicodedestnamefalse
   1569   \fi
   1570   %
   1571   % Color support
   1572   %
   1573   \def\rgbDarkRed{0.50 0.09 0.12}
   1574   \def\rgbBlack{0 0 0}
   1575   %
   1576   \def\pdfsetcolor#1{\special{pdf:scolor [#1]}}
   1577   %
   1578   % Set color, and create a mark which defines \thiscolor accordingly,
   1579   % so that \makeheadline knows which color to restore.
   1580   \def\setcolor#1{%
   1581     \xdef\currentcolordefs{\gdef\noexpand\thiscolor{#1}}%
   1582     \domark
   1583     \pdfsetcolor{#1}%
   1584   }
   1585   %
   1586   \def\maincolor{\rgbBlack}
   1587   \pdfsetcolor{\maincolor}
   1588   \edef\thiscolor{\maincolor}
   1589   \def\currentcolordefs{}
   1590   %
   1591   \def\makefootline{%
   1592     \baselineskip24pt
   1593     \line{\pdfsetcolor{\maincolor}\the\footline}%
   1594   }
   1595   %
   1596   \def\makeheadline{%
   1597     \vbox to 0pt{%
   1598       \vskip-22.5pt
   1599       \line{%
   1600         \vbox to8.5pt{}%
   1601         % Extract \thiscolor definition from the marks.
   1602         \getcolormarks
   1603         % Typeset the headline with \maincolor, then restore the color.
   1604         \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}%
   1605       }%
   1606       \vss
   1607     }%
   1608     \nointerlineskip
   1609   }
   1610   %
   1611   % PDF outline support
   1612   %
   1613   % Emulate pdfTeX primitive
   1614   \def\pdfdest name#1 xyz{%
   1615     \special{pdf:dest (#1) [@thispage /XYZ @xpos @ypos null]}%
   1616   }
   1617   %
   1618   \def\setpdfdestname#1{{%
   1619     % We have to set dummies so commands such as @code, and characters
   1620     % such as \, aren't expanded when present in a section title.
   1621     \indexnofonts
   1622     \makevalueexpandable
   1623     \turnoffactive
   1624     \iftxiuseunicodedestname
   1625       % Pass through Unicode characters.
   1626     \else
   1627       % Use ASCII approximations in destination names.
   1628       \passthroughcharsfalse
   1629     \fi
   1630     \def\pdfdestname{#1}%
   1631     \txiescapepdf\pdfdestname
   1632   }}
   1633   %
   1634   \def\setpdfoutlinetext#1{{%
   1635     \turnoffactive
   1636     % Always use Unicode characters in title texts.
   1637     \def\pdfoutlinetext{#1}%
   1638     % For XeTeX, xdvipdfmx converts to UTF-16.
   1639     % So we do not convert.
   1640     \txiescapepdf\pdfoutlinetext
   1641   }}
   1642   %
   1643   \def\pdfmkdest#1{%
   1644     \setpdfdestname{#1}%
   1645     \safewhatsit{\pdfdest name{\pdfdestname} xyz}%
   1646   }
   1647   %
   1648   % by default, use black for everything.
   1649   \def\urlcolor{\rgbBlack}
   1650   \def\linkcolor{\rgbBlack}
   1651   \def\endlink{\setcolor{\maincolor}\pdfendlink}
   1652   %
   1653   \def\dopdfoutline#1#2#3#4{%
   1654     \setpdfoutlinetext{#1}
   1655     \setpdfdestname{#3}
   1656     \ifx\pdfdestname\empty
   1657       \def\pdfdestname{#4}%
   1658     \fi
   1659     %
   1660     \special{pdf:out [-] #2 << /Title (\pdfoutlinetext) /A
   1661       << /S /GoTo /D (\pdfdestname) >> >> }%
   1662   }
   1663   %
   1664   \def\pdfmakeoutlines{%
   1665     \begingroup
   1666       %
   1667       % For XeTeX, counts of subentries are not necessary.
   1668       % Therefore, we read toc only once.
   1669       %
   1670       % We use node names as destinations.
   1671       %
   1672       % Currently we prefix the section name with the section number
   1673       % for chapter and appendix headings only in order to avoid too much
   1674       % horizontal space being required in the PDF viewer.
   1675       \def\partentry##1##2##3##4{}% ignore parts in the outlines
   1676       \def\numchapentry##1##2##3##4{%
   1677         \dopdfoutline{##2 ##1}{1}{##3}{##4}}%
   1678       \def\numsecentry##1##2##3##4{%
   1679         \dopdfoutline{##1}{2}{##3}{##4}}%
   1680       \def\numsubsecentry##1##2##3##4{%
   1681         \dopdfoutline{##1}{3}{##3}{##4}}%
   1682       \def\numsubsubsecentry##1##2##3##4{%
   1683         \dopdfoutline{##1}{4}{##3}{##4}}%
   1684       %
   1685       \let\appentry\numchapentry%
   1686       \let\appsecentry\numsecentry%
   1687       \let\appsubsecentry\numsubsecentry%
   1688       \let\appsubsubsecentry\numsubsubsecentry%
   1689       \def\unnchapentry##1##2##3##4{%
   1690         \dopdfoutline{##1}{1}{##3}{##4}}%
   1691       \let\unnsecentry\numsecentry%
   1692       \let\unnsubsecentry\numsubsecentry%
   1693       \let\unnsubsubsecentry\numsubsubsecentry%
   1694       %
   1695       % For XeTeX, xdvipdfmx converts strings to UTF-16.
   1696       % Therefore, the encoding and the language may not be considered.
   1697       %
   1698       \indexnofonts
   1699       \setupdatafile
   1700       % We can have normal brace characters in the PDF outlines, unlike
   1701       % Texinfo index files.  So set that up.
   1702       \def\{{\lbracecharliteral}%
   1703       \def\}{\rbracecharliteral}%
   1704       \catcode`\\=\active \otherbackslash
   1705       \input \tocreadfilename
   1706     \endgroup
   1707   }
   1708   {\catcode`[=1 \catcode`]=2
   1709    \catcode`{=\other \catcode`}=\other
   1710    \gdef\lbracecharliteral[{]%
   1711    \gdef\rbracecharliteral[}]%
   1712   ]
   1713 
   1714   \special{pdf:docview << /PageMode /UseOutlines >> }
   1715   % ``\special{pdf:tounicode ...}'' is not necessary
   1716   % because xdvipdfmx converts strings from UTF-8 to UTF-16 without it.
   1717   % However, due to a UTF-16 conversion issue of xdvipdfmx 20150315,
   1718   % ``\special{pdf:dest ...}'' cannot handle non-ASCII strings.
   1719   % It is fixed by xdvipdfmx 20160106 (TeX Live SVN r39753).
   1720 %
   1721   \def\skipspaces#1{\def\PP{#1}\def\D{|}%
   1722     \ifx\PP\D\let\nextsp\relax
   1723     \else\let\nextsp\skipspaces
   1724       \addtokens{\filename}{\PP}%
   1725       \advance\filenamelength by 1
   1726     \fi
   1727     \nextsp}
   1728   \def\getfilename#1{%
   1729     \filenamelength=0
   1730     % If we don't expand the argument now, \skipspaces will get
   1731     % snagged on things like "@value{foo}".
   1732     \edef\temp{#1}%
   1733     \expandafter\skipspaces\temp|\relax
   1734   }
   1735   % make a live url in pdf output.
   1736   \def\pdfurl#1{%
   1737     \begingroup
   1738       % it seems we really need yet another set of dummies; have not
   1739       % tried to figure out what each command should do in the context
   1740       % of @url.  for now, just make @/ a no-op, that's the only one
   1741       % people have actually reported a problem with.
   1742       %
   1743       \normalturnoffactive
   1744       \def\@{@}%
   1745       \let\/=\empty
   1746       \makevalueexpandable
   1747       % do we want to go so far as to use \indexnofonts instead of just
   1748       % special-casing \var here?
   1749       \def\var##1{##1}%
   1750       %
   1751       \leavevmode\setcolor{\urlcolor}%
   1752       \special{pdf:bann << /Border [0 0 0]
   1753         /Subtype /Link /A << /S /URI /URI (#1) >> >>}%
   1754     \endgroup}
   1755   \def\endlink{\setcolor{\maincolor}\special{pdf:eann}}
   1756   \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
   1757   \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
   1758   \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
   1759   \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
   1760   \def\maketoks{%
   1761     \expandafter\poptoks\the\toksA|ENDTOKS|\relax
   1762     \ifx\first0\adn0
   1763     \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
   1764     \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
   1765     \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9
   1766     \else
   1767       \ifnum0=\countA\else\makelink\fi
   1768       \ifx\first.\let\next=\done\else
   1769         \let\next=\maketoks
   1770         \addtokens{\toksB}{\the\toksD}
   1771         \ifx\first,\addtokens{\toksB}{\space}\fi
   1772       \fi
   1773     \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
   1774     \next}
   1775   \def\makelink{\addtokens{\toksB}%
   1776     {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
   1777   \def\pdflink#1{\pdflinkpage{#1}{#1}}%
   1778   \def\pdflinkpage#1#2{%
   1779     \special{pdf:bann << /Border [0 0 0]
   1780       /Type /Annot /Subtype /Link /A << /S /GoTo /D (#1) >> >>}%
   1781     \setcolor{\linkcolor}#2\endlink}
   1782   \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
   1783 %
   1784   %
   1785   % @image support
   1786   %
   1787   % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto).
   1788   \def\doxeteximage#1#2#3{%
   1789     \def\xeteximagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}%
   1790     \def\xeteximageheight{#3}\setbox2 = \hbox{\ignorespaces #3}%
   1791     %
   1792     % XeTeX (and the PDF format) supports .pdf, .png, .jpg (among
   1793     % others).  Let's try in that order, PDF first since if
   1794     % someone has a scalable image, presumably better to use that than a
   1795     % bitmap.
   1796     \let\xeteximgext=\empty
   1797     \begingroup
   1798       \openin 1 #1.pdf \ifeof 1
   1799         \openin 1 #1.PDF \ifeof 1
   1800           \openin 1 #1.png \ifeof 1
   1801             \openin 1 #1.jpg \ifeof 1
   1802               \openin 1 #1.jpeg \ifeof 1
   1803                 \openin 1 #1.JPG \ifeof 1
   1804                   \errmessage{Could not find image file #1 for XeTeX}%
   1805                 \else \gdef\xeteximgext{JPG}%
   1806                 \fi
   1807               \else \gdef\xeteximgext{jpeg}%
   1808               \fi
   1809             \else \gdef\xeteximgext{jpg}%
   1810             \fi
   1811           \else \gdef\xeteximgext{png}%
   1812           \fi
   1813         \else \gdef\xeteximgext{PDF}%
   1814         \fi
   1815       \else \gdef\xeteximgext{pdf}%
   1816       \fi
   1817       \closein 1
   1818     \endgroup
   1819     %
   1820     % Putting an \hbox around the image can prevent an over-long line
   1821     % after the image.
   1822     \hbox\bgroup
   1823       \def\xetexpdfext{pdf}%
   1824       \ifx\xeteximgext\xetexpdfext
   1825         \XeTeXpdffile "#1".\xeteximgext ""
   1826       \else
   1827         \def\xetexpdfext{PDF}%
   1828         \ifx\xeteximgext\xetexpdfext
   1829           \XeTeXpdffile "#1".\xeteximgext ""
   1830         \else
   1831           \XeTeXpicfile "#1".\xeteximgext ""
   1832         \fi
   1833       \fi
   1834       \ifdim \wd0 >0pt width \xeteximagewidth \fi
   1835       \ifdim \wd2 >0pt height \xeteximageheight \fi \relax
   1836     \egroup
   1837   }
   1838 \fi
   1839 
   1840 
   1841 %
   1842 \message{fonts,}
   1843 
   1844 % Set the baselineskip to #1, and the lineskip and strut size
   1845 % correspondingly.  There is no deep meaning behind these magic numbers
   1846 % used as factors; they just match (closely enough) what Knuth defined.
   1847 %
   1848 \def\lineskipfactor{.08333}
   1849 \def\strutheightpercent{.70833}
   1850 \def\strutdepthpercent {.29167}
   1851 %
   1852 % can get a sort of poor man's double spacing by redefining this.
   1853 \def\baselinefactor{1}
   1854 %
   1855 \newdimen\textleading
   1856 \def\setleading#1{%
   1857   \dimen0 = #1\relax
   1858   \normalbaselineskip = \baselinefactor\dimen0
   1859   \normallineskip = \lineskipfactor\normalbaselineskip
   1860   \normalbaselines
   1861   \setbox\strutbox =\hbox{%
   1862     \vrule width0pt height\strutheightpercent\baselineskip
   1863                     depth \strutdepthpercent \baselineskip
   1864   }%
   1865 }
   1866 
   1867 % PDF CMaps.  See also LaTeX's t1.cmap.
   1868 %
   1869 % do nothing with this by default.
   1870 \expandafter\let\csname cmapOT1\endcsname\gobble
   1871 \expandafter\let\csname cmapOT1IT\endcsname\gobble
   1872 \expandafter\let\csname cmapOT1TT\endcsname\gobble
   1873 
   1874 % if we are producing pdf, and we have \pdffontattr, then define cmaps.
   1875 % (\pdffontattr was introduced many years ago, but people still run
   1876 % older pdftex's; it's easy to conditionalize, so we do.)
   1877 \ifpdf \ifx\pdffontattr\thisisundefined \else
   1878   \begingroup
   1879     \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
   1880     \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
   1881 %%DocumentNeededResources: ProcSet (CIDInit)
   1882 %%IncludeResource: ProcSet (CIDInit)
   1883 %%BeginResource: CMap (TeX-OT1-0)
   1884 %%Title: (TeX-OT1-0 TeX OT1 0)
   1885 %%Version: 1.000
   1886 %%EndComments
   1887 /CIDInit /ProcSet findresource begin
   1888 12 dict begin
   1889 begincmap
   1890 /CIDSystemInfo
   1891 << /Registry (TeX)
   1892 /Ordering (OT1)
   1893 /Supplement 0
   1894 >> def
   1895 /CMapName /TeX-OT1-0 def
   1896 /CMapType 2 def
   1897 1 begincodespacerange
   1898 <00> <7F>
   1899 endcodespacerange
   1900 8 beginbfrange
   1901 <00> <01> <0393>
   1902 <09> <0A> <03A8>
   1903 <23> <26> <0023>
   1904 <28> <3B> <0028>
   1905 <3F> <5B> <003F>
   1906 <5D> <5E> <005D>
   1907 <61> <7A> <0061>
   1908 <7B> <7C> <2013>
   1909 endbfrange
   1910 40 beginbfchar
   1911 <02> <0398>
   1912 <03> <039B>
   1913 <04> <039E>
   1914 <05> <03A0>
   1915 <06> <03A3>
   1916 <07> <03D2>
   1917 <08> <03A6>
   1918 <0B> <00660066>
   1919 <0C> <00660069>
   1920 <0D> <0066006C>
   1921 <0E> <006600660069>
   1922 <0F> <00660066006C>
   1923 <10> <0131>
   1924 <11> <0237>
   1925 <12> <0060>
   1926 <13> <00B4>
   1927 <14> <02C7>
   1928 <15> <02D8>
   1929 <16> <00AF>
   1930 <17> <02DA>
   1931 <18> <00B8>
   1932 <19> <00DF>
   1933 <1A> <00E6>
   1934 <1B> <0153>
   1935 <1C> <00F8>
   1936 <1D> <00C6>
   1937 <1E> <0152>
   1938 <1F> <00D8>
   1939 <21> <0021>
   1940 <22> <201D>
   1941 <27> <2019>
   1942 <3C> <00A1>
   1943 <3D> <003D>
   1944 <3E> <00BF>
   1945 <5C> <201C>
   1946 <5F> <02D9>
   1947 <60> <2018>
   1948 <7D> <02DD>
   1949 <7E> <007E>
   1950 <7F> <00A8>
   1951 endbfchar
   1952 endcmap
   1953 CMapName currentdict /CMap defineresource pop
   1954 end
   1955 end
   1956 %%EndResource
   1957 %%EOF
   1958     }\endgroup
   1959   \expandafter\edef\csname cmapOT1\endcsname#1{%
   1960     \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
   1961   }%
   1962 %
   1963 % \cmapOT1IT
   1964   \begingroup
   1965     \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
   1966     \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
   1967 %%DocumentNeededResources: ProcSet (CIDInit)
   1968 %%IncludeResource: ProcSet (CIDInit)
   1969 %%BeginResource: CMap (TeX-OT1IT-0)
   1970 %%Title: (TeX-OT1IT-0 TeX OT1IT 0)
   1971 %%Version: 1.000
   1972 %%EndComments
   1973 /CIDInit /ProcSet findresource begin
   1974 12 dict begin
   1975 begincmap
   1976 /CIDSystemInfo
   1977 << /Registry (TeX)
   1978 /Ordering (OT1IT)
   1979 /Supplement 0
   1980 >> def
   1981 /CMapName /TeX-OT1IT-0 def
   1982 /CMapType 2 def
   1983 1 begincodespacerange
   1984 <00> <7F>
   1985 endcodespacerange
   1986 8 beginbfrange
   1987 <00> <01> <0393>
   1988 <09> <0A> <03A8>
   1989 <25> <26> <0025>
   1990 <28> <3B> <0028>
   1991 <3F> <5B> <003F>
   1992 <5D> <5E> <005D>
   1993 <61> <7A> <0061>
   1994 <7B> <7C> <2013>
   1995 endbfrange
   1996 42 beginbfchar
   1997 <02> <0398>
   1998 <03> <039B>
   1999 <04> <039E>
   2000 <05> <03A0>
   2001 <06> <03A3>
   2002 <07> <03D2>
   2003 <08> <03A6>
   2004 <0B> <00660066>
   2005 <0C> <00660069>
   2006 <0D> <0066006C>
   2007 <0E> <006600660069>
   2008 <0F> <00660066006C>
   2009 <10> <0131>
   2010 <11> <0237>
   2011 <12> <0060>
   2012 <13> <00B4>
   2013 <14> <02C7>
   2014 <15> <02D8>
   2015 <16> <00AF>
   2016 <17> <02DA>
   2017 <18> <00B8>
   2018 <19> <00DF>
   2019 <1A> <00E6>
   2020 <1B> <0153>
   2021 <1C> <00F8>
   2022 <1D> <00C6>
   2023 <1E> <0152>
   2024 <1F> <00D8>
   2025 <21> <0021>
   2026 <22> <201D>
   2027 <23> <0023>
   2028 <24> <00A3>
   2029 <27> <2019>
   2030 <3C> <00A1>
   2031 <3D> <003D>
   2032 <3E> <00BF>
   2033 <5C> <201C>
   2034 <5F> <02D9>
   2035 <60> <2018>
   2036 <7D> <02DD>
   2037 <7E> <007E>
   2038 <7F> <00A8>
   2039 endbfchar
   2040 endcmap
   2041 CMapName currentdict /CMap defineresource pop
   2042 end
   2043 end
   2044 %%EndResource
   2045 %%EOF
   2046     }\endgroup
   2047   \expandafter\edef\csname cmapOT1IT\endcsname#1{%
   2048     \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
   2049   }%
   2050 %
   2051 % \cmapOT1TT
   2052   \begingroup
   2053     \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
   2054     \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
   2055 %%DocumentNeededResources: ProcSet (CIDInit)
   2056 %%IncludeResource: ProcSet (CIDInit)
   2057 %%BeginResource: CMap (TeX-OT1TT-0)
   2058 %%Title: (TeX-OT1TT-0 TeX OT1TT 0)
   2059 %%Version: 1.000
   2060 %%EndComments
   2061 /CIDInit /ProcSet findresource begin
   2062 12 dict begin
   2063 begincmap
   2064 /CIDSystemInfo
   2065 << /Registry (TeX)
   2066 /Ordering (OT1TT)
   2067 /Supplement 0
   2068 >> def
   2069 /CMapName /TeX-OT1TT-0 def
   2070 /CMapType 2 def
   2071 1 begincodespacerange
   2072 <00> <7F>
   2073 endcodespacerange
   2074 5 beginbfrange
   2075 <00> <01> <0393>
   2076 <09> <0A> <03A8>
   2077 <21> <26> <0021>
   2078 <28> <5F> <0028>
   2079 <61> <7E> <0061>
   2080 endbfrange
   2081 32 beginbfchar
   2082 <02> <0398>
   2083 <03> <039B>
   2084 <04> <039E>
   2085 <05> <03A0>
   2086 <06> <03A3>
   2087 <07> <03D2>
   2088 <08> <03A6>
   2089 <0B> <2191>
   2090 <0C> <2193>
   2091 <0D> <0027>
   2092 <0E> <00A1>
   2093 <0F> <00BF>
   2094 <10> <0131>
   2095 <11> <0237>
   2096 <12> <0060>
   2097 <13> <00B4>
   2098 <14> <02C7>
   2099 <15> <02D8>
   2100 <16> <00AF>
   2101 <17> <02DA>
   2102 <18> <00B8>
   2103 <19> <00DF>
   2104 <1A> <00E6>
   2105 <1B> <0153>
   2106 <1C> <00F8>
   2107 <1D> <00C6>
   2108 <1E> <0152>
   2109 <1F> <00D8>
   2110 <20> <2423>
   2111 <27> <2019>
   2112 <60> <2018>
   2113 <7F> <00A8>
   2114 endbfchar
   2115 endcmap
   2116 CMapName currentdict /CMap defineresource pop
   2117 end
   2118 end
   2119 %%EndResource
   2120 %%EOF
   2121     }\endgroup
   2122   \expandafter\edef\csname cmapOT1TT\endcsname#1{%
   2123     \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
   2124   }%
   2125 \fi\fi
   2126 %
   2127 % This is what gets called when #5 of \setfont is empty.
   2128 \let\cmap\gobble
   2129 %
   2130 % (end of cmaps)
   2131 
   2132 
   2133 % Set the font macro #1 to the font named \fontprefix#2.
   2134 % #3 is the font's design size, #4 is a scale factor, #5 is the CMap
   2135 % encoding (only OT1, OT1IT and OT1TT are allowed, or empty to omit).
   2136 % Example:
   2137 % #1 = \textrm
   2138 % #2 = \rmshape
   2139 % #3 = 10
   2140 % #4 = \mainmagstep
   2141 % #5 = OT1
   2142 %
   2143 \def\setfont#1#2#3#4#5{%
   2144   \font#1=\fontprefix#2#3 scaled #4
   2145   \csname cmap#5\endcsname#1%
   2146   \ifx#2\ttshape\hyphenchar#1=-1 \fi
   2147   \ifx#2\ttbshape\hyphenchar#1=-1 \fi
   2148   \ifx#2\ttslshape\hyphenchar#1=-1 \fi
   2149 }
   2150 
   2151 % Use cm as the default font prefix.
   2152 % To specify the font prefix, you must define \fontprefix
   2153 % before you read in texinfo.tex.
   2154 \ifx\fontprefix\thisisundefined
   2155 \def\fontprefix{cm}
   2156 \fi
   2157 % Support font families that don't use the same naming scheme as CM.
   2158 \def\rmshape{r}
   2159 \def\rmbshape{bx}               % where the normal face is bold
   2160 \def\bfshape{b}
   2161 \def\bxshape{bx}
   2162 \def\ttshape{tt}
   2163 \def\ttbshape{tt}
   2164 \def\ttslshape{sltt}
   2165 \def\itshape{ti}
   2166 \def\itbshape{bxti}
   2167 \def\slshape{sl}
   2168 \def\slbshape{bxsl}
   2169 \def\sfshape{ss}
   2170 \def\sfbshape{ss}
   2171 \def\scshape{csc}
   2172 \def\scbshape{csc}
   2173 
   2174 % Definitions for a main text size of 11pt.  (The default in Texinfo.)
   2175 %
   2176 \def\definetextfontsizexi{%
   2177 % Text fonts (11.2pt, magstep1).
   2178 \def\textnominalsize{11pt}
   2179 \edef\mainmagstep{\magstephalf}
   2180 \setfont\textrm\rmshape{10}{\mainmagstep}{OT1}
   2181 \setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT}
   2182 \setfont\textbf\bfshape{10}{\mainmagstep}{OT1}
   2183 \setfont\textit\itshape{10}{\mainmagstep}{OT1IT}
   2184 \setfont\textsl\slshape{10}{\mainmagstep}{OT1}
   2185 \setfont\textsf\sfshape{10}{\mainmagstep}{OT1}
   2186 \setfont\textsc\scshape{10}{\mainmagstep}{OT1}
   2187 \setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT}
   2188 \font\texti=cmmi10 scaled \mainmagstep
   2189 \font\textsy=cmsy10 scaled \mainmagstep
   2190 \def\textecsize{1095}
   2191 
   2192 % A few fonts for @defun names and args.
   2193 \setfont\defbf\bfshape{10}{\magstep1}{OT1}
   2194 \setfont\deftt\ttshape{10}{\magstep1}{OT1TT}
   2195 \setfont\defsl\slshape{10}{\magstep1}{OT1}
   2196 \setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT}
   2197 \def\df{\let\ttfont=\deftt \let\bffont = \defbf
   2198 \let\ttslfont=\defttsl \let\slfont=\defsl \bf}
   2199 
   2200 % Fonts for indices, footnotes, small examples (9pt).
   2201 \def\smallnominalsize{9pt}
   2202 \setfont\smallrm\rmshape{9}{1000}{OT1}
   2203 \setfont\smalltt\ttshape{9}{1000}{OT1TT}
   2204 \setfont\smallbf\bfshape{10}{900}{OT1}
   2205 \setfont\smallit\itshape{9}{1000}{OT1IT}
   2206 \setfont\smallsl\slshape{9}{1000}{OT1}
   2207 \setfont\smallsf\sfshape{9}{1000}{OT1}
   2208 \setfont\smallsc\scshape{10}{900}{OT1}
   2209 \setfont\smallttsl\ttslshape{10}{900}{OT1TT}
   2210 \font\smalli=cmmi9
   2211 \font\smallsy=cmsy9
   2212 \def\smallecsize{0900}
   2213 
   2214 % Fonts for small examples (8pt).
   2215 \def\smallernominalsize{8pt}
   2216 \setfont\smallerrm\rmshape{8}{1000}{OT1}
   2217 \setfont\smallertt\ttshape{8}{1000}{OT1TT}
   2218 \setfont\smallerbf\bfshape{10}{800}{OT1}
   2219 \setfont\smallerit\itshape{8}{1000}{OT1IT}
   2220 \setfont\smallersl\slshape{8}{1000}{OT1}
   2221 \setfont\smallersf\sfshape{8}{1000}{OT1}
   2222 \setfont\smallersc\scshape{10}{800}{OT1}
   2223 \setfont\smallerttsl\ttslshape{10}{800}{OT1TT}
   2224 \font\smalleri=cmmi8
   2225 \font\smallersy=cmsy8
   2226 \def\smallerecsize{0800}
   2227 
   2228 % Fonts for math mode superscripts (7pt).
   2229 \def\sevennominalsize{7pt}
   2230 \setfont\sevenrm\rmshape{7}{1000}{OT1}
   2231 \setfont\seventt\ttshape{10}{700}{OT1TT}
   2232 \setfont\sevenbf\bfshape{10}{700}{OT1}
   2233 \setfont\sevenit\itshape{7}{1000}{OT1IT}
   2234 \setfont\sevensl\slshape{10}{700}{OT1}
   2235 \setfont\sevensf\sfshape{10}{700}{OT1}
   2236 \setfont\sevensc\scshape{10}{700}{OT1}
   2237 \setfont\seventtsl\ttslshape{10}{700}{OT1TT}
   2238 \font\seveni=cmmi7
   2239 \font\sevensy=cmsy7
   2240 \def\sevenecsize{0700}
   2241 
   2242 % Fonts for title page (20.4pt):
   2243 \def\titlenominalsize{20pt}
   2244 \setfont\titlerm\rmbshape{12}{\magstep3}{OT1}
   2245 \setfont\titleit\itbshape{10}{\magstep4}{OT1IT}
   2246 \setfont\titlesl\slbshape{10}{\magstep4}{OT1}
   2247 \setfont\titlett\ttbshape{12}{\magstep3}{OT1TT}
   2248 \setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT}
   2249 \setfont\titlesf\sfbshape{17}{\magstep1}{OT1}
   2250 \let\titlebf=\titlerm
   2251 \setfont\titlesc\scbshape{10}{\magstep4}{OT1}
   2252 \font\titlei=cmmi12 scaled \magstep3
   2253 \font\titlesy=cmsy10 scaled \magstep4
   2254 \def\titleecsize{2074}
   2255 
   2256 % Chapter (and unnumbered) fonts (17.28pt).
   2257 \def\chapnominalsize{17pt}
   2258 \setfont\chaprm\rmbshape{12}{\magstep2}{OT1}
   2259 \setfont\chapit\itbshape{10}{\magstep3}{OT1IT}
   2260 \setfont\chapsl\slbshape{10}{\magstep3}{OT1}
   2261 \setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT}
   2262 \setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT}
   2263 \setfont\chapsf\sfbshape{17}{1000}{OT1}
   2264 \let\chapbf=\chaprm
   2265 \setfont\chapsc\scbshape{10}{\magstep3}{OT1}
   2266 \font\chapi=cmmi12 scaled \magstep2
   2267 \font\chapsy=cmsy10 scaled \magstep3
   2268 \def\chapecsize{1728}
   2269 
   2270 % Section fonts (14.4pt).
   2271 \def\secnominalsize{14pt}
   2272 \setfont\secrm\rmbshape{12}{\magstep1}{OT1}
   2273 \setfont\secrmnotbold\rmshape{12}{\magstep1}{OT1}
   2274 \setfont\secit\itbshape{10}{\magstep2}{OT1IT}
   2275 \setfont\secsl\slbshape{10}{\magstep2}{OT1}
   2276 \setfont\sectt\ttbshape{12}{\magstep1}{OT1TT}
   2277 \setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT}
   2278 \setfont\secsf\sfbshape{12}{\magstep1}{OT1}
   2279 \let\secbf\secrm
   2280 \setfont\secsc\scbshape{10}{\magstep2}{OT1}
   2281 \font\seci=cmmi12 scaled \magstep1
   2282 \font\secsy=cmsy10 scaled \magstep2
   2283 \def\sececsize{1440}
   2284 
   2285 % Subsection fonts (13.15pt).
   2286 \def\ssecnominalsize{13pt}
   2287 \setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1}
   2288 \setfont\ssecit\itbshape{10}{1315}{OT1IT}
   2289 \setfont\ssecsl\slbshape{10}{1315}{OT1}
   2290 \setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT}
   2291 \setfont\ssecttsl\ttslshape{10}{1315}{OT1TT}
   2292 \setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1}
   2293 \let\ssecbf\ssecrm
   2294 \setfont\ssecsc\scbshape{10}{1315}{OT1}
   2295 \font\sseci=cmmi12 scaled \magstephalf
   2296 \font\ssecsy=cmsy10 scaled 1315
   2297 \def\ssececsize{1200}
   2298 
   2299 % Reduced fonts for @acronym in text (10pt).
   2300 \def\reducednominalsize{10pt}
   2301 \setfont\reducedrm\rmshape{10}{1000}{OT1}
   2302 \setfont\reducedtt\ttshape{10}{1000}{OT1TT}
   2303 \setfont\reducedbf\bfshape{10}{1000}{OT1}
   2304 \setfont\reducedit\itshape{10}{1000}{OT1IT}
   2305 \setfont\reducedsl\slshape{10}{1000}{OT1}
   2306 \setfont\reducedsf\sfshape{10}{1000}{OT1}
   2307 \setfont\reducedsc\scshape{10}{1000}{OT1}
   2308 \setfont\reducedttsl\ttslshape{10}{1000}{OT1TT}
   2309 \font\reducedi=cmmi10
   2310 \font\reducedsy=cmsy10
   2311 \def\reducedecsize{1000}
   2312 
   2313 \textleading = 13.2pt % line spacing for 11pt CM
   2314 \textfonts            % reset the current fonts
   2315 \rm
   2316 } % end of 11pt text font size definitions, \definetextfontsizexi
   2317 
   2318 
   2319 % Definitions to make the main text be 10pt Computer Modern, with
   2320 % section, chapter, etc., sizes following suit.  This is for the GNU
   2321 % Press printing of the Emacs 22 manual.  Maybe other manuals in the
   2322 % future.  Used with @smallbook, which sets the leading to 12pt.
   2323 %
   2324 \def\definetextfontsizex{%
   2325 % Text fonts (10pt).
   2326 \def\textnominalsize{10pt}
   2327 \edef\mainmagstep{1000}
   2328 \setfont\textrm\rmshape{10}{\mainmagstep}{OT1}
   2329 \setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT}
   2330 \setfont\textbf\bfshape{10}{\mainmagstep}{OT1}
   2331 \setfont\textit\itshape{10}{\mainmagstep}{OT1IT}
   2332 \setfont\textsl\slshape{10}{\mainmagstep}{OT1}
   2333 \setfont\textsf\sfshape{10}{\mainmagstep}{OT1}
   2334 \setfont\textsc\scshape{10}{\mainmagstep}{OT1}
   2335 \setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT}
   2336 \font\texti=cmmi10 scaled \mainmagstep
   2337 \font\textsy=cmsy10 scaled \mainmagstep
   2338 \def\textecsize{1000}
   2339 
   2340 % A few fonts for @defun names and args.
   2341 \setfont\defbf\bfshape{10}{\magstephalf}{OT1}
   2342 \setfont\deftt\ttshape{10}{\magstephalf}{OT1TT}
   2343 \setfont\defsl\slshape{10}{\magstephalf}{OT1}
   2344 \setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT}
   2345 \def\df{\let\ttfont=\deftt \let\bffont = \defbf
   2346 \let\slfont=\defsl \let\ttslfont=\defttsl \bf}
   2347 
   2348 % Fonts for indices, footnotes, small examples (9pt).
   2349 \def\smallnominalsize{9pt}
   2350 \setfont\smallrm\rmshape{9}{1000}{OT1}
   2351 \setfont\smalltt\ttshape{9}{1000}{OT1TT}
   2352 \setfont\smallbf\bfshape{10}{900}{OT1}
   2353 \setfont\smallit\itshape{9}{1000}{OT1IT}
   2354 \setfont\smallsl\slshape{9}{1000}{OT1}
   2355 \setfont\smallsf\sfshape{9}{1000}{OT1}
   2356 \setfont\smallsc\scshape{10}{900}{OT1}
   2357 \setfont\smallttsl\ttslshape{10}{900}{OT1TT}
   2358 \font\smalli=cmmi9
   2359 \font\smallsy=cmsy9
   2360 \def\smallecsize{0900}
   2361 
   2362 % Fonts for small examples (8pt).
   2363 \def\smallernominalsize{8pt}
   2364 \setfont\smallerrm\rmshape{8}{1000}{OT1}
   2365 \setfont\smallertt\ttshape{8}{1000}{OT1TT}
   2366 \setfont\smallerbf\bfshape{10}{800}{OT1}
   2367 \setfont\smallerit\itshape{8}{1000}{OT1IT}
   2368 \setfont\smallersl\slshape{8}{1000}{OT1}
   2369 \setfont\smallersf\sfshape{8}{1000}{OT1}
   2370 \setfont\smallersc\scshape{10}{800}{OT1}
   2371 \setfont\smallerttsl\ttslshape{10}{800}{OT1TT}
   2372 \font\smalleri=cmmi8
   2373 \font\smallersy=cmsy8
   2374 \def\smallerecsize{0800}
   2375 
   2376 % Fonts for math mode superscripts (7pt).
   2377 \def\sevennominalsize{7pt}
   2378 \setfont\sevenrm\rmshape{7}{1000}{OT1}
   2379 \setfont\seventt\ttshape{10}{700}{OT1TT}
   2380 \setfont\sevenbf\bfshape{10}{700}{OT1}
   2381 \setfont\sevenit\itshape{7}{1000}{OT1IT}
   2382 \setfont\sevensl\slshape{10}{700}{OT1}
   2383 \setfont\sevensf\sfshape{10}{700}{OT1}
   2384 \setfont\sevensc\scshape{10}{700}{OT1}
   2385 \setfont\seventtsl\ttslshape{10}{700}{OT1TT}
   2386 \font\seveni=cmmi7
   2387 \font\sevensy=cmsy7
   2388 \def\sevenecsize{0700}
   2389 
   2390 % Fonts for title page (20.4pt):
   2391 \def\titlenominalsize{20pt}
   2392 \setfont\titlerm\rmbshape{12}{\magstep3}{OT1}
   2393 \setfont\titleit\itbshape{10}{\magstep4}{OT1IT}
   2394 \setfont\titlesl\slbshape{10}{\magstep4}{OT1}
   2395 \setfont\titlett\ttbshape{12}{\magstep3}{OT1TT}
   2396 \setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT}
   2397 \setfont\titlesf\sfbshape{17}{\magstep1}{OT1}
   2398 \let\titlebf=\titlerm
   2399 \setfont\titlesc\scbshape{10}{\magstep4}{OT1}
   2400 \font\titlei=cmmi12 scaled \magstep3
   2401 \font\titlesy=cmsy10 scaled \magstep4
   2402 \def\titleecsize{2074}
   2403 
   2404 % Chapter fonts (14.4pt).
   2405 \def\chapnominalsize{14pt}
   2406 \setfont\chaprm\rmbshape{12}{\magstep1}{OT1}
   2407 \setfont\chapit\itbshape{10}{\magstep2}{OT1IT}
   2408 \setfont\chapsl\slbshape{10}{\magstep2}{OT1}
   2409 \setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT}
   2410 \setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT}
   2411 \setfont\chapsf\sfbshape{12}{\magstep1}{OT1}
   2412 \let\chapbf\chaprm
   2413 \setfont\chapsc\scbshape{10}{\magstep2}{OT1}
   2414 \font\chapi=cmmi12 scaled \magstep1
   2415 \font\chapsy=cmsy10 scaled \magstep2
   2416 \def\chapecsize{1440}
   2417 
   2418 % Section fonts (12pt).
   2419 \def\secnominalsize{12pt}
   2420 \setfont\secrm\rmbshape{12}{1000}{OT1}
   2421 \setfont\secit\itbshape{10}{\magstep1}{OT1IT}
   2422 \setfont\secsl\slbshape{10}{\magstep1}{OT1}
   2423 \setfont\sectt\ttbshape{12}{1000}{OT1TT}
   2424 \setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT}
   2425 \setfont\secsf\sfbshape{12}{1000}{OT1}
   2426 \let\secbf\secrm
   2427 \setfont\secsc\scbshape{10}{\magstep1}{OT1}
   2428 \font\seci=cmmi12
   2429 \font\secsy=cmsy10 scaled \magstep1
   2430 \def\sececsize{1200}
   2431 
   2432 % Subsection fonts (10pt).
   2433 \def\ssecnominalsize{10pt}
   2434 \setfont\ssecrm\rmbshape{10}{1000}{OT1}
   2435 \setfont\ssecit\itbshape{10}{1000}{OT1IT}
   2436 \setfont\ssecsl\slbshape{10}{1000}{OT1}
   2437 \setfont\ssectt\ttbshape{10}{1000}{OT1TT}
   2438 \setfont\ssecttsl\ttslshape{10}{1000}{OT1TT}
   2439 \setfont\ssecsf\sfbshape{10}{1000}{OT1}
   2440 \let\ssecbf\ssecrm
   2441 \setfont\ssecsc\scbshape{10}{1000}{OT1}
   2442 \font\sseci=cmmi10
   2443 \font\ssecsy=cmsy10
   2444 \def\ssececsize{1000}
   2445 
   2446 % Reduced fonts for @acronym in text (9pt).
   2447 \def\reducednominalsize{9pt}
   2448 \setfont\reducedrm\rmshape{9}{1000}{OT1}
   2449 \setfont\reducedtt\ttshape{9}{1000}{OT1TT}
   2450 \setfont\reducedbf\bfshape{10}{900}{OT1}
   2451 \setfont\reducedit\itshape{9}{1000}{OT1IT}
   2452 \setfont\reducedsl\slshape{9}{1000}{OT1}
   2453 \setfont\reducedsf\sfshape{9}{1000}{OT1}
   2454 \setfont\reducedsc\scshape{10}{900}{OT1}
   2455 \setfont\reducedttsl\ttslshape{10}{900}{OT1TT}
   2456 \font\reducedi=cmmi9
   2457 \font\reducedsy=cmsy9
   2458 \def\reducedecsize{0900}
   2459 
   2460 \divide\parskip by 2  % reduce space between paragraphs
   2461 \textleading = 12pt   % line spacing for 10pt CM
   2462 \textfonts            % reset the current fonts
   2463 \rm
   2464 } % end of 10pt text font size definitions, \definetextfontsizex
   2465 
   2466 % Fonts for short table of contents.
   2467 \setfont\shortcontrm\rmshape{12}{1000}{OT1}
   2468 \setfont\shortcontbf\bfshape{10}{\magstep1}{OT1}  % no cmb12
   2469 \setfont\shortcontsl\slshape{12}{1000}{OT1}
   2470 \setfont\shortconttt\ttshape{12}{1000}{OT1TT}
   2471 
   2472 
   2473 % We provide the user-level command
   2474 %   @fonttextsize 10
   2475 % (or 11) to redefine the text font size.  pt is assumed.
   2476 %
   2477 \def\xiword{11}
   2478 \def\xword{10}
   2479 \def\xwordpt{10pt}
   2480 %
   2481 \parseargdef\fonttextsize{%
   2482   \def\textsizearg{#1}%
   2483   %\wlog{doing @fonttextsize \textsizearg}%
   2484   %
   2485   % Set \globaldefs so that documents can use this inside @tex, since
   2486   % makeinfo 4.8 does not support it, but we need it nonetheless.
   2487   %
   2488  \begingroup \globaldefs=1
   2489   \ifx\textsizearg\xword \definetextfontsizex
   2490   \else \ifx\textsizearg\xiword \definetextfontsizexi
   2491   \else
   2492     \errhelp=\EMsimple
   2493     \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'}
   2494   \fi\fi
   2495  \endgroup
   2496 }
   2497 
   2498 %
   2499 % Change the current font style to #1, remembering it in \curfontstyle.
   2500 % For now, we do not accumulate font styles: @b{@i{foo}} prints foo in
   2501 % italics, not bold italics.
   2502 %
   2503 \def\setfontstyle#1{%
   2504   \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd.
   2505   \csname #1font\endcsname  % change the current font
   2506 }
   2507 
   2508 \def\rm{\fam=0 \setfontstyle{rm}}
   2509 \def\it{\fam=\itfam \setfontstyle{it}}
   2510 \def\sl{\fam=\slfam \setfontstyle{sl}}
   2511 \def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf}
   2512 \def\tt{\fam=\ttfam \setfontstyle{tt}}
   2513 
   2514 % Texinfo sort of supports the sans serif font style, which plain TeX does not.
   2515 % So we set up a \sf.
   2516 \newfam\sffam
   2517 \def\sf{\fam=\sffam \setfontstyle{sf}}
   2518 
   2519 % We don't need math for this font style.
   2520 \def\ttsl{\setfontstyle{ttsl}}
   2521 
   2522 
   2523 % In order for the font changes to affect most math symbols and letters,
   2524 % we have to define the \textfont of the standard families.
   2525 % We don't bother to reset \scriptscriptfont; awaiting user need.
   2526 %
   2527 \def\resetmathfonts{%
   2528   \textfont0=\rmfont \textfont1=\ifont \textfont2=\syfont
   2529   \textfont\itfam=\itfont \textfont\slfam=\slfont \textfont\bffam=\bffont
   2530   \textfont\ttfam=\ttfont \textfont\sffam=\sffont
   2531   %
   2532   % Fonts for superscript.  Note that the 7pt fonts are used regardless
   2533   % of the current font size.
   2534   \scriptfont0=\sevenrm \scriptfont1=\seveni \scriptfont2=\sevensy
   2535   \scriptfont\itfam=\sevenit \scriptfont\slfam=\sevensl
   2536   \scriptfont\bffam=\sevenbf \scriptfont\ttfam=\seventt
   2537   \scriptfont\sffam=\sevensf
   2538 }
   2539 
   2540 
   2541 
   2542 % \defineassignfonts{SIZE} -
   2543 %   Define sequence \assignfontsSIZE, which switches between font sizes
   2544 % by redefining the meanings of \STYLEfont.  (Just \STYLE additionally sets
   2545 % the current \fam for math mode.)
   2546 %
   2547 \def\defineassignfonts#1{%
   2548   \expandafter\edef\csname assignfonts#1\endcsname{%
   2549     \let\noexpand\rmfont\csname #1rm\endcsname
   2550     \let\noexpand\itfont\csname #1it\endcsname
   2551     \let\noexpand\slfont\csname #1sl\endcsname
   2552     \let\noexpand\bffont\csname #1bf\endcsname
   2553     \let\noexpand\ttfont\csname #1tt\endcsname
   2554     \let\noexpand\smallcaps\csname #1sc\endcsname
   2555     \let\noexpand\sffont  \csname #1sf\endcsname
   2556     \let\noexpand\ifont   \csname #1i\endcsname
   2557     \let\noexpand\syfont  \csname #1sy\endcsname
   2558     \let\noexpand\ttslfont\csname #1ttsl\endcsname
   2559   }
   2560 }
   2561 
   2562 \def\assignfonts#1{%
   2563   \csname assignfonts#1\endcsname
   2564 }
   2565 
   2566 \newif\ifrmisbold
   2567 
   2568 % Select smaller font size with the current style.  Used to change font size
   2569 % in, e.g., the LaTeX logo and acronyms.  If we are using bold fonts for
   2570 % normal roman text, also use bold fonts for roman text in the smaller size.
   2571 \def\switchtolllsize{%
   2572    \expandafter\assignfonts\expandafter{\lllsize}%
   2573    \ifrmisbold
   2574      \let\rmfont\bffont
   2575    \fi
   2576    \csname\curfontstyle\endcsname
   2577 }%
   2578 
   2579 \def\switchtolsize{%
   2580    \expandafter\assignfonts\expandafter{\lsize}%
   2581    \ifrmisbold
   2582      \let\rmfont\bffont
   2583    \fi
   2584    \csname\curfontstyle\endcsname
   2585 }%
   2586 
   2587 % Define the font-changing commands (all called \...fonts).
   2588 % Each font-changing command also sets the names \lsize (one size lower)
   2589 % and \lllsize (three sizes lower).  These relative commands are used
   2590 % in, e.g., the LaTeX logo and acronyms.
   2591 %
   2592 % Note: The fonts used for \ifont are for "math italics"  (\itfont is for
   2593 % italics in regular text).  \syfont is also used in math mode only.
   2594 %
   2595 \def\definefontsetatsize#1#2#3#4#5{%
   2596   \defineassignfonts{#1}%
   2597 \expandafter\def\csname #1fonts\endcsname{%
   2598   \def\curfontsize{#1}%
   2599   \def\lsize{#2}\def\lllsize{#3}%
   2600   \csname rmisbold#5\endcsname
   2601   \csname assignfonts#1\endcsname
   2602   \resetmathfonts
   2603   \setleading{#4}%
   2604 }}
   2605 
   2606 \definefontsetatsize{text}   {reduced}{smaller}{\textleading}{false}
   2607 \definefontsetatsize{title}  {chap}   {subsec} {27pt}  {true}
   2608 \definefontsetatsize{chap}   {sec}    {text}   {19pt}  {true}
   2609 \definefontsetatsize{sec}    {subsec} {reduced}{17pt}  {true}
   2610 \definefontsetatsize{ssec}   {text}   {small}  {15pt}  {true}
   2611 \definefontsetatsize{reduced}{small}  {smaller}{10.5pt}{false}
   2612 \definefontsetatsize{small}  {smaller}{smaller}{10.5pt}{false}
   2613 \definefontsetatsize{smaller}{smaller}{smaller}{9.5pt} {false}
   2614 
   2615 \def\titlefont#1{{\titlefonts\rm #1}}
   2616 \let\subsecfonts = \ssecfonts
   2617 \let\subsubsecfonts = \ssecfonts
   2618 
   2619 % Define these just so they can be easily changed for other fonts.
   2620 \def\angleleft{$\langle$}
   2621 \def\angleright{$\rangle$}
   2622 
   2623 % Set the fonts to use with the @small... environments.
   2624 \let\smallexamplefonts = \smallfonts
   2625 
   2626 % About \smallexamplefonts.  If we use \smallfonts (9pt), @smallexample
   2627 % can fit this many characters:
   2628 %   8.5x11=86   smallbook=72  a4=90  a5=69
   2629 % If we use \scriptfonts (8pt), then we can fit this many characters:
   2630 %   8.5x11=90+  smallbook=80  a4=90+  a5=77
   2631 % For me, subjectively, the few extra characters that fit aren't worth
   2632 % the additional smallness of 8pt.  So I'm making the default 9pt.
   2633 %
   2634 % By the way, for comparison, here's what fits with @example (10pt):
   2635 %   8.5x11=71  smallbook=60  a4=75  a5=58
   2636 % --karl, 24jan03.
   2637 
   2638 % Set up the default fonts, so we can use them for creating boxes.
   2639 %
   2640 \definetextfontsizexi
   2641 
   2642 
   2643 % Check if we are currently using a typewriter font.  Since all the
   2644 % Computer Modern typewriter fonts have zero interword stretch (and
   2645 % shrink), and it is reasonable to expect all typewriter fonts to have
   2646 % this property, we can check that font parameter. #1 is what to
   2647 % print if we are indeed using \tt; #2 is what to print otherwise.
   2648 \def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi}
   2649 
   2650 % Same as above, but check for italic font.  Actually this also catches
   2651 % non-italic slanted fonts since it is impossible to distinguish them from
   2652 % italic fonts.  But since this is only used by $ and it uses \sl anyway
   2653 % this is not a problem.
   2654 \def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi}
   2655 
   2656 
   2657 % Check if internal flag is clear, i.e. has not been @set.
   2658 \def\ifflagclear#1#2#3{%
   2659   \expandafter\ifx\csname SET#1\endcsname\relax
   2660   #2\else#3\fi
   2661 }
   2662 
   2663 {
   2664 \catcode`\'=\active
   2665 \catcode`\`=\active
   2666 
   2667 \gdef\setcodequotes{\let`\codequoteleft \let'\codequoteright}
   2668 \gdef\setregularquotes{\let`\lq \let'\rq}
   2669 }
   2670 \setregularquotes
   2671 
   2672 % output for ' in @code
   2673 % in tt font hex 0D (undirected) or 27 (curly right quote)
   2674 %
   2675 \def\codequoteright{%
   2676   \ifusingtt
   2677       {\ifflagclear{txicodequoteundirected}%
   2678           {\ifflagclear{codequoteundirected}%
   2679               {'}%
   2680               {\char"0D }}%
   2681           {\char"0D }}%
   2682       {'}%
   2683 }
   2684 
   2685 % output for ` in @code
   2686 % in tt font hex 12 (grave accent) or 60 (curly left quote)
   2687 % \relax disables Spanish ligatures ?` and !` of \tt font.
   2688 %
   2689 \def\codequoteleft{%
   2690   \ifusingtt
   2691       {\ifflagclear{txicodequotebacktick}%
   2692           {\ifflagclear{codequotebacktick}%
   2693               {\relax`}%
   2694               {\char"12 }}%
   2695           {\char"12 }}%
   2696       {\relax`}%
   2697 }
   2698 
   2699 % Commands to set the quote options.
   2700 %
   2701 \parseargdef\codequoteundirected{%
   2702   \def\temp{#1}%
   2703   \ifx\temp\onword
   2704     \expandafter\let\csname SETtxicodequoteundirected\endcsname
   2705       = t%
   2706   \else\ifx\temp\offword
   2707     \expandafter\let\csname SETtxicodequoteundirected\endcsname
   2708       = \relax
   2709   \else
   2710     \errhelp = \EMsimple
   2711     \errmessage{Unknown @codequoteundirected value `\temp', must be on|off}%
   2712   \fi\fi
   2713 }
   2714 
   2715 \parseargdef\codequotebacktick{%
   2716   \def\temp{#1}%
   2717   \ifx\temp\onword
   2718     \expandafter\let\csname SETtxicodequotebacktick\endcsname
   2719       = t%
   2720   \else\ifx\temp\offword
   2721     \expandafter\let\csname SETtxicodequotebacktick\endcsname
   2722       = \relax
   2723   \else
   2724     \errhelp = \EMsimple
   2725     \errmessage{Unknown @codequotebacktick value `\temp', must be on|off}%
   2726   \fi\fi
   2727 }
   2728 
   2729 % Turn them on by default
   2730 \let\SETtxicodequoteundirected = t
   2731 \let\SETtxicodequotebacktick = t
   2732 
   2733 
   2734 % [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font.
   2735 \def\noligaturesquoteleft{\relax\lq}
   2736 
   2737 % Count depth in font-changes, for error checks
   2738 \newcount\fontdepth \fontdepth=0
   2739 
   2740 % Font commands.
   2741 
   2742 % #1 is the font command (\sl or \it), #2 is the text to slant.
   2743 % If we are in a monospaced environment, however, 1) always use \ttsl,
   2744 % and 2) do not add an italic correction.
   2745 \def\dosmartslant#1#2{%
   2746   \ifusingtt
   2747     {{\ttsl #2}\let\next=\relax}%
   2748     {\def\next{{#1#2}\smartitaliccorrection}}%
   2749   \next
   2750 }
   2751 \def\smartslanted{\dosmartslant\sl}
   2752 \def\smartitalic{\dosmartslant\it}
   2753 
   2754 % Output an italic correction unless the following character is such as
   2755 % not to need one.
   2756 \def\smartitaliccorrection{\futurelet\next\smartitaliccorrectionx}
   2757 \def\smartitaliccorrectionx{%
   2758   \ifx\next,%
   2759   \else\ifx\next-%
   2760   \else\ifx\next.%
   2761   \else\ifx\next\.%
   2762   \else\ifx\next\comma%
   2763   \else\ptexslash
   2764   \fi\fi\fi\fi\fi
   2765   \aftersmartic
   2766 }
   2767 
   2768 % @cite unconditionally uses \sl with \smartitaliccorrection.
   2769 \def\cite#1{{\sl #1}\smartitaliccorrection}
   2770 
   2771 % @var unconditionally uses \sl.  This gives consistency for
   2772 % parameter names whether they are in @def, @table @code or a
   2773 % regular paragraph.
   2774 %  To get ttsl font for @var when used in code context, @set txicodevaristt.
   2775 % The \null is to reset \spacefactor.
   2776 \def\aftersmartic{}
   2777 \def\var#1{%
   2778   \let\saveaftersmartic = \aftersmartic
   2779   \def\aftersmartic{\null\let\aftersmartic=\saveaftersmartic}%
   2780   %
   2781   \ifflagclear{txicodevaristt}%
   2782     {\def\varnext{{{\sl #1}}\smartitaliccorrection}}%
   2783     {\def\varnext{\smartslanted{#1}}}%
   2784   \varnext
   2785 }
   2786 
   2787 % To be removed after next release
   2788 \def\SETtxicodevaristt{}% @set txicodevaristt
   2789 
   2790 \let\i=\smartitalic
   2791 \let\slanted=\smartslanted
   2792 \let\dfn=\smartslanted
   2793 \let\emph=\smartitalic
   2794 
   2795 % @r for roman font, used for code comment
   2796 \def\r#1{{%
   2797   \usenormaldash % get --, --- ligatures even if in @code
   2798   \defcharsdefault  % in case on def line
   2799   \rm #1}}
   2800 {\catcode`-=\active \gdef\usenormaldash{\let-\normaldash}}
   2801 
   2802 % @sc, undocumented @ii.
   2803 \def\sc#1{{\smallcaps#1}}       % smallcaps font
   2804 \def\ii#1{{\it #1}}             % italic font
   2805 
   2806 % @b, explicit bold.  Also @strong.
   2807 \def\b#1{{\bf #1}}
   2808 \let\strong=\b
   2809 
   2810 % @sansserif, explicit sans.
   2811 \def\sansserif#1{{\sf #1}}
   2812 
   2813 \newif\iffrenchspacing
   2814 \frenchspacingfalse
   2815 
   2816 % Set sfcode to normal for the chars that usually have another value.
   2817 % Can't use plain's \frenchspacing because it uses the `\x notation, and
   2818 % sometimes \x has an active definition that messes things up.
   2819 %
   2820 \catcode`@=11
   2821   \def\plainfrenchspacing{%
   2822     \iffrenchspacing\else
   2823       \frenchspacingtrue
   2824       \sfcode`\.=\@m \sfcode`\?=\@m \sfcode`\!=\@m
   2825       \sfcode`\:=\@m \sfcode`\;=\@m \sfcode`\,=\@m
   2826       \def\endofsentencespacefactor{1000}% for @. and friends
   2827     \fi
   2828   }
   2829   \def\plainnonfrenchspacing{%
   2830     \iffrenchspacing
   2831       \frenchspacingfalse
   2832        \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000
   2833        \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250
   2834        \def\endofsentencespacefactor{3000}% for @. and friends
   2835     \fi
   2836   }
   2837 \catcode`@=\other
   2838 \def\endofsentencespacefactor{3000}% default
   2839 
   2840 % @frenchspacing on|off  says whether to put extra space after punctuation.
   2841 %
   2842 \def\onword{on}
   2843 \def\offword{off}
   2844 %
   2845 \let\frenchspacingsetting\plainnonfrenchspacing % used in output routine
   2846 \parseargdef\frenchspacing{%
   2847   \def\temp{#1}%
   2848   \ifx\temp\onword \let\frenchspacingsetting\plainfrenchspacing
   2849   \else\ifx\temp\offword \let\frenchspacingsetting\plainnonfrenchspacing
   2850   \else
   2851     \errhelp = \EMsimple
   2852     \errmessage{Unknown @frenchspacing option `\temp', must be on|off}%
   2853   \fi\fi
   2854   \frenchspacingsetting
   2855 }
   2856 
   2857 
   2858 % @t, explicit typewriter.
   2859 \def\t#1{%
   2860   {\tt \defcharsdefault \plainfrenchspacing #1}%
   2861   \null
   2862 }
   2863 
   2864 % @samp.
   2865 \def\samp#1{{\setcodequotes\lq\tclose{#1}\rq\null}}
   2866 
   2867 % @indicateurl is \samp, that is, with quotes.
   2868 \let\indicateurl=\samp
   2869 
   2870 % @code (and similar) prints in typewriter, but with spaces the same
   2871 % size as normal in the surrounding text, without hyphenation, etc.
   2872 % This is a subroutine for that.
   2873 \def\tclose#1{%
   2874   {%
   2875     % Change normal interword space to be same as for the current font.
   2876     \spaceskip = \fontdimen2\font
   2877     %
   2878     % Switch to typewriter.
   2879     \tt
   2880     %
   2881     % `\ ' produces the large typewriter interword space.
   2882     \def\ {{\spaceskip = 0pt{} }}%
   2883     %
   2884     \plainfrenchspacing
   2885     #1%
   2886   }%
   2887   \null % reset spacefactor to 1000
   2888 }
   2889 
   2890 % This is for LuaTeX: It is not sufficient to disable hyphenation at
   2891 % explicit dashes by setting `\hyphenchar` to -1.
   2892 \def\dashnobreak{%
   2893   \normaldash
   2894   \penalty 10000 }
   2895 
   2896 % We must turn on hyphenation at `-' and `_' in @code.
   2897 % Otherwise, it is too hard to avoid overfull hboxes
   2898 % in the Emacs manual, the Library manual, etc.
   2899 % We explicitly allow hyphenation at these characters
   2900 % using \discretionary.
   2901 %
   2902 % Hyphenation at - and hyphenation within words was turned off
   2903 % by default for the tt fonts using the \hyphenchar parameter of TeX.
   2904 {
   2905   \catcode`\-=\active \catcode`\_=\active
   2906   \catcode`\'=\active \catcode`\`=\active
   2907   \global\let'=\rq \global\let`=\lq  % default definitions
   2908   %
   2909   \global\def\code{\begingroup
   2910     \setcodequotes
   2911     \catcode\dashChar=\active  \catcode\underChar=\active
   2912     \ifallowcodebreaks
   2913      \let-\codedash
   2914      \let_\codeunder
   2915     \else
   2916      \let-\dashnobreak
   2917      \let_\realunder
   2918     \fi
   2919     \codex
   2920   }
   2921   %
   2922   \gdef\codedash{\futurelet\next\codedashfinish}
   2923   \gdef\codedashfinish{%
   2924     \normaldash % always output the dash character itself.
   2925     %
   2926     % Now, output a discretionary to allow a line break, unless
   2927     % (a) the next character is a -, or
   2928     % (b) the preceding character is a -, or
   2929     % (c) we are at the start of the string.
   2930     % In both cases (b) and (c), \codedashnobreak should be set to \codedash.
   2931     %
   2932     % E.g., given --posix, we do not want to allow a break after either -.
   2933     % Given --foo-bar, we do want to allow a break between the - and the b.
   2934     \ifx\next\codedash \else
   2935       \ifx\codedashnobreak\codedash
   2936       \else \discretionary{}{}{}\fi
   2937     \fi
   2938     % we need the space after the = for the case when \next itself is a
   2939     % space token; it would get swallowed otherwise.  As in @code{- a}.
   2940     \global\let\codedashnobreak= \next
   2941   }
   2942 }
   2943 \def\normaldash{-}
   2944 %
   2945 \def\codex #1{\tclose{%
   2946   % Given -foo (with a single dash), we do not want to allow a break
   2947   % after the -.  \codedashnobreak is set to the first character in
   2948   % @code.
   2949   \futurelet\codedashnobreak\relax
   2950   #1%
   2951 }\endgroup}
   2952 
   2953 \def\codeunder{%
   2954   % this is all so @math{@code{var_name}+1} can work.  In math mode, _
   2955   % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.)
   2956   % will therefore expand the active definition of _, which is us
   2957   % (inside @code that is), therefore an endless loop.
   2958   \ifusingtt{\ifmmode
   2959                \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_.
   2960              \else\normalunderscore \fi
   2961              \discretionary{}{}{}}%
   2962             {\_}%
   2963 }
   2964 
   2965 % An additional complication: the above will allow breaks after, e.g.,
   2966 % each of the four underscores in __typeof__.  This is bad.
   2967 % @allowcodebreaks provides a document-level way to turn breaking at -
   2968 % and _ on and off.
   2969 %
   2970 \newif\ifallowcodebreaks  \allowcodebreakstrue
   2971 
   2972 \def\keywordtrue{true}
   2973 \def\keywordfalse{false}
   2974 
   2975 \parseargdef\allowcodebreaks{%
   2976   \def\txiarg{#1}%
   2977   \ifx\txiarg\keywordtrue
   2978     \allowcodebreakstrue
   2979   \else\ifx\txiarg\keywordfalse
   2980     \allowcodebreaksfalse
   2981   \else
   2982     \errhelp = \EMsimple
   2983     \errmessage{Unknown @allowcodebreaks option `\txiarg', must be true|false}%
   2984   \fi\fi
   2985 }
   2986 
   2987 % For @command, @env, @file, @option quotes seem unnecessary,
   2988 % so use \code rather than \samp.
   2989 \let\command=\code
   2990 \let\env=\code
   2991 \let\file=\code
   2992 \let\option=\code
   2993 
   2994 % @uref (abbreviation for `urlref') aka @url takes an optional
   2995 % (comma-separated) second argument specifying the text to display and
   2996 % an optional third arg as text to display instead of (rather than in
   2997 % addition to) the url itself.  First (mandatory) arg is the url.
   2998 
   2999 % TeX-only option to allow changing PDF output to show only the second
   3000 % arg (if given), and not the url (which is then just the link target).
   3001 \newif\ifurefurlonlylink
   3002 
   3003 % The default \pretolerance setting stops the penalty inserted in
   3004 % \urefallowbreak being a discouragement to line breaking.  Set it to
   3005 % a negative value for this paragraph only.  Hopefully this does not
   3006 % conflict with redefinitions of \par done elsewhere.
   3007 \def\nopretolerance{%
   3008 \pretolerance=-1
   3009 \def\par{\endgraf\pretolerance=100 \let\par\endgraf}%
   3010 }
   3011 
   3012 % The main macro is \urefbreak, which allows breaking at expected
   3013 % places within the url.
   3014 \def\urefbreak{\nopretolerance \begingroup \urefcatcodes \dourefbreak}
   3015 \let\uref=\urefbreak
   3016 %
   3017 \def\dourefbreak#1{\urefbreakfinish #1,,,\finish}
   3018 \def\urefbreakfinish#1,#2,#3,#4\finish{% doesn't work in @example
   3019   \unsepspaces
   3020   \pdfurl{#1}%
   3021   \setbox0 = \hbox{\ignorespaces #3}%
   3022   \ifdim\wd0 > 0pt
   3023     \unhbox0 % third arg given, show only that
   3024   \else
   3025     \setbox0 = \hbox{\ignorespaces #2}% look for second arg
   3026     \ifdim\wd0 > 0pt
   3027       \ifpdf
   3028         % For pdfTeX and LuaTeX
   3029         \ifurefurlonlylink
   3030           % PDF plus option to not display url, show just arg
   3031           \unhbox0
   3032         \else
   3033           % PDF, normally display both arg and url for consistency,
   3034           % visibility, if the pdf is eventually used to print, etc.
   3035           \unhbox0\ (\urefcode{#1})%
   3036         \fi
   3037       \else
   3038         \ifx\XeTeXrevision\thisisundefined
   3039           \unhbox0\ (\urefcode{#1})% DVI, always show arg and url
   3040         \else
   3041           % For XeTeX
   3042           \ifurefurlonlylink
   3043             % PDF plus option to not display url, show just arg
   3044             \unhbox0
   3045           \else
   3046             % PDF, normally display both arg and url for consistency,
   3047             % visibility, if the pdf is eventually used to print, etc.
   3048             \unhbox0\ (\urefcode{#1})%
   3049           \fi
   3050         \fi
   3051       \fi
   3052     \else
   3053       \urefcode{#1}% only url given, so show it
   3054     \fi
   3055   \fi
   3056   \endlink
   3057 \endgroup}
   3058 
   3059 % Allow line breaks around only a few characters (only).
   3060 \def\urefcatcodes{%
   3061   \catcode`\&=\active \catcode`\.=\active
   3062   \catcode`\#=\active \catcode`\?=\active
   3063   \catcode`\/=\active
   3064 }
   3065 {
   3066   \urefcatcodes
   3067   %
   3068   \global\def\urefcode{\begingroup
   3069     \setcodequotes
   3070     \urefcatcodes
   3071     \let&\urefcodeamp
   3072     \let.\urefcodedot
   3073     \let#\urefcodehash
   3074     \let?\urefcodequest
   3075     \let/\urefcodeslash
   3076     \codex
   3077   }
   3078   %
   3079   % By default, they are just regular characters.
   3080   \global\def&{\normalamp}
   3081   \global\def.{\normaldot}
   3082   \global\def#{\normalhash}
   3083   \global\def?{\normalquest}
   3084   \global\def/{\normalslash}
   3085 }
   3086 
   3087 \def\urefcodeamp{\urefprebreak \&\urefpostbreak}
   3088 \def\urefcodedot{\urefprebreak .\urefpostbreak}
   3089 \def\urefcodehash{\urefprebreak \#\urefpostbreak}
   3090 \def\urefcodequest{\urefprebreak ?\urefpostbreak}
   3091 \def\urefcodeslash{\futurelet\next\urefcodeslashfinish}
   3092 {
   3093   \catcode`\/=\active
   3094   \global\def\urefcodeslashfinish{%
   3095     \urefprebreak \slashChar
   3096     % Allow line break only after the final / in a sequence of
   3097     % slashes, to avoid line break between the slashes in http://.
   3098     \ifx\next/\else \urefpostbreak \fi
   3099   }
   3100 }
   3101 
   3102 % By default we'll break after the special characters, but some people like to
   3103 % break before the special chars, so allow that.  Also allow no breaking at
   3104 % all, for manual control.
   3105 %
   3106 \parseargdef\urefbreakstyle{%
   3107   \def\txiarg{#1}%
   3108   \ifx\txiarg\wordnone
   3109     \def\urefprebreak{\nobreak}\def\urefpostbreak{\nobreak}
   3110   \else\ifx\txiarg\wordbefore
   3111     \def\urefprebreak{\urefallowbreak}\def\urefpostbreak{\nobreak}
   3112   \else\ifx\txiarg\wordafter
   3113     \def\urefprebreak{\nobreak}\def\urefpostbreak{\urefallowbreak}
   3114   \else
   3115     \errhelp = \EMsimple
   3116     \errmessage{Unknown @urefbreakstyle setting `\txiarg'}%
   3117   \fi\fi\fi
   3118 }
   3119 \def\wordafter{after}
   3120 \def\wordbefore{before}
   3121 \def\wordnone{none}
   3122 
   3123 % Allow a ragged right output to aid breaking long URL's.  There can
   3124 % be a break at the \allowbreak with no extra glue (if the existing stretch in
   3125 % the line is sufficient), a break at the \penalty with extra glue added
   3126 % at the end of the line, or no break at all here.
   3127 %   Changing the value of the penalty and/or the amount of stretch affects how
   3128 % preferable one choice is over the other.
   3129 \def\urefallowbreak{%
   3130   \penalty0\relax
   3131   \hskip 0pt plus 2 em\relax
   3132   \penalty1000\relax
   3133   \hskip 0pt plus -2 em\relax
   3134 }
   3135 
   3136 \urefbreakstyle after
   3137 
   3138 % @url synonym for @uref, since that's how everyone uses it.
   3139 %
   3140 \let\url=\uref
   3141 
   3142 % rms does not like angle brackets --karl, 17may97.
   3143 % So now @email is just like @uref, unless we are pdf.
   3144 %
   3145 %\def\email#1{\angleleft{\tt #1}\angleright}
   3146 \ifpdforxetex
   3147   \def\email#1{\doemail#1,,\finish}
   3148   \def\doemail#1,#2,#3\finish{\begingroup
   3149     \unsepspaces
   3150     \pdfurl{mailto:#1}%
   3151     \setbox0 = \hbox{\ignorespaces #2}%
   3152     \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi
   3153     \endlink
   3154   \endgroup}
   3155 \else
   3156   \let\email=\uref
   3157 \fi
   3158 
   3159 % @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
   3160 %   `example' (@kbd uses ttsl only inside of @example and friends),
   3161 %   or `code' (@kbd uses normal tty font always).
   3162 \parseargdef\kbdinputstyle{%
   3163   \def\txiarg{#1}%
   3164   \ifx\txiarg\worddistinct
   3165     \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
   3166   \else\ifx\txiarg\wordexample
   3167     \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%
   3168   \else\ifx\txiarg\wordcode
   3169     \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
   3170   \else
   3171     \errhelp = \EMsimple
   3172     \errmessage{Unknown @kbdinputstyle setting `\txiarg'}%
   3173   \fi\fi\fi
   3174 }
   3175 \def\worddistinct{distinct}
   3176 \def\wordexample{example}
   3177 \def\wordcode{code}
   3178 
   3179 % Default is `distinct'.
   3180 \kbdinputstyle distinct
   3181 
   3182 \def\kbd#1{%
   3183   \tclose{\kbdfont\setcodequotes#1}%
   3184 }
   3185 
   3186 % definition of @key that produces a lozenge.  Doesn't adjust to text size.
   3187 %\setfont\keyrm\rmshape{8}{1000}{OT1}
   3188 %\font\keysy=cmsy9
   3189 %\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{%
   3190 %  \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{%
   3191 %    \vbox{\hrule\kern-0.4pt
   3192 %     \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}%
   3193 %    \kern-0.4pt\hrule}%
   3194 %  \kern-.06em\raise0.4pt\hbox{\angleright}}}}
   3195 
   3196 % definition of @key with no lozenge.
   3197 %
   3198 \def\key#1{{\setregularquotes \tt #1}\null}
   3199 
   3200 % @clicksequence{File @click{} Open ...}
   3201 \def\clicksequence#1{\begingroup #1\endgroup}
   3202 
   3203 % @clickstyle @arrow   (by default)
   3204 \parseargdef\clickstyle{\def\click{#1}}
   3205 \def\click{\arrow}
   3206 
   3207 % Typeset a dimension, e.g., `in' or `pt'.  The only reason for the
   3208 % argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
   3209 %
   3210 \def\dmn#1{\thinspace #1}
   3211 
   3212 % @acronym for "FBI", "NATO", and the like.
   3213 % We print this one point size smaller, since it's intended for
   3214 % all-uppercase.
   3215 %
   3216 \def\acronym#1{\doacronym #1,,\finish}
   3217 \def\doacronym#1,#2,#3\finish{%
   3218   {\switchtolsize #1}%
   3219   \def\temp{#2}%
   3220   \ifx\temp\empty \else
   3221     \space ({\unsepspaces \ignorespaces \temp \unskip})%
   3222   \fi
   3223   \null % reset \spacefactor=1000
   3224 }
   3225 
   3226 % @abbr for "Comput. J." and the like.
   3227 % No font change, but don't do end-of-sentence spacing.
   3228 %
   3229 \def\abbr#1{\doabbr #1,,\finish}
   3230 \def\doabbr#1,#2,#3\finish{%
   3231   {\plainfrenchspacing #1}%
   3232   \def\temp{#2}%
   3233   \ifx\temp\empty \else
   3234     \space ({\unsepspaces \ignorespaces \temp \unskip})%
   3235   \fi
   3236   \null % reset \spacefactor=1000
   3237 }
   3238 
   3239 % @asis just yields its argument.  Used with @table, for example.
   3240 %
   3241 \def\asis#1{#1}
   3242 
   3243 % @math outputs its argument in math mode.
   3244 %
   3245 % One complication: _ usually means subscripts, but it could also mean
   3246 % an actual _ character, as in @math{@var{some_variable} + 1}.  So make
   3247 % _ active, and distinguish by seeing if the current family is \slfam,
   3248 % which is what @var uses.
   3249 {
   3250   \catcode`\_ = \active
   3251   \gdef\mathunderscore{%
   3252     \catcode`\_=\active
   3253     \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
   3254   }
   3255 }
   3256 % Another complication: we want \\ (and @\) to output a math (or tt) \.
   3257 % FYI, plain.tex uses \\ as a temporary control sequence (for no
   3258 % particular reason), but this is not advertised and we don't care.
   3259 %
   3260 % The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\.
   3261 \def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}
   3262 %
   3263 \def\math{%
   3264   \ifmmode\else % only go into math if not in math mode already
   3265     \tex
   3266     \mathunderscore
   3267     \let\\ = \mathbackslash
   3268     \mathactive
   3269     % make the texinfo accent commands work in math mode
   3270     \let\"=\ddot
   3271     \let\'=\acute
   3272     \let\==\bar
   3273     \let\^=\hat
   3274     \let\`=\grave
   3275     \let\u=\breve
   3276     \let\v=\check
   3277     \let\~=\tilde
   3278     \let\dotaccent=\dot
   3279     % have to provide another name for sup operator
   3280     \let\mathopsup=\sup
   3281   $\expandafter\finishmath\fi
   3282 }
   3283 \def\finishmath#1{#1$\endgroup}  % Close the group opened by \tex.
   3284 
   3285 % Some active characters (such as <) are spaced differently in math.
   3286 % We have to reset their definitions in case the @math was an argument
   3287 % to a command which sets the catcodes (such as @item or @section).
   3288 %
   3289 {
   3290   \catcode`^ = \active
   3291   \catcode`< = \active
   3292   \catcode`> = \active
   3293   \catcode`+ = \active
   3294   \catcode`' = \active
   3295   \gdef\mathactive{%
   3296     \let^ = \ptexhat
   3297     \let< = \ptexless
   3298     \let> = \ptexgtr
   3299     \let+ = \ptexplus
   3300     \let' = \ptexquoteright
   3301   }
   3302 }
   3303 
   3304 % for @sub and @sup, if in math mode, just do a normal sub/superscript.
   3305 % If in text, use math to place as sub/superscript, but switch
   3306 % into text mode, with smaller fonts.  This is a different font than the
   3307 % one used for real math sub/superscripts (8pt vs. 7pt), but let's not
   3308 % fix it (significant additions to font machinery) until someone notices.
   3309 %
   3310 \def\sub{\ifmmode \expandafter\sb \else \expandafter\finishsub\fi}
   3311 \def\finishsub#1{$\sb{\hbox{\switchtolllsize #1}}$}%
   3312 %
   3313 \def\sup{\ifmmode \expandafter\ptexsp \else \expandafter\finishsup\fi}
   3314 \def\finishsup#1{$\ptexsp{\hbox{\switchtolllsize #1}}$}%
   3315 
   3316 % provide this command from LaTeX as it is very common
   3317 \def\frac#1#2{{{#1}\over{#2}}}
   3318 
   3319 % @displaymath.
   3320 % \globaldefs is needed to recognize the end lines in \tex and
   3321 % \end tex.  Set \thisenv as @end displaymath is seen before @end tex.
   3322 {\obeylines
   3323 \globaldefs=1
   3324 \envdef\displaymath{%
   3325 \tex%
   3326 \def\thisenv{\displaymath}%
   3327 \begingroup\let\end\displaymathend%
   3328 $$%
   3329 }
   3330 
   3331 \def\displaymathend{$$\endgroup\end}%
   3332 
   3333 \def\Edisplaymath{%
   3334 \def\thisenv{\tex}%
   3335 \end tex
   3336 }}
   3337 
   3338 
   3339 % @inlinefmt{FMTNAME,PROCESSED-TEXT} and @inlineraw{FMTNAME,RAW-TEXT}.
   3340 % Ignore unless FMTNAME == tex; then it is like @iftex and @tex,
   3341 % except specified as a normal braced arg, so no newlines to worry about.
   3342 %
   3343 \def\outfmtnametex{tex}
   3344 %
   3345 \long\def\inlinefmt#1{\doinlinefmt #1,\finish}
   3346 \long\def\doinlinefmt#1,#2,\finish{%
   3347   \def\inlinefmtname{#1}%
   3348   \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\fi
   3349 }
   3350 %
   3351 % @inlinefmtifelse{FMTNAME,THEN-TEXT,ELSE-TEXT} expands THEN-TEXT if
   3352 % FMTNAME is tex, else ELSE-TEXT.
   3353 \long\def\inlinefmtifelse#1{\doinlinefmtifelse #1,,,\finish}
   3354 \long\def\doinlinefmtifelse#1,#2,#3,#4,\finish{%
   3355   \def\inlinefmtname{#1}%
   3356   \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\else \ignorespaces #3\fi
   3357 }
   3358 %
   3359 % For raw, must switch into @tex before parsing the argument, to avoid
   3360 % setting catcodes prematurely.  Doing it this way means that, for
   3361 % example, @inlineraw{html, foo{bar} gets a parse error instead of being
   3362 % ignored.  But this isn't important because if people want a literal
   3363 % *right* brace they would have to use a command anyway, so they may as
   3364 % well use a command to get a left brace too.  We could re-use the
   3365 % delimiter character idea from \verb, but it seems like overkill.
   3366 %
   3367 \long\def\inlineraw{\tex \doinlineraw}
   3368 \long\def\doinlineraw#1{\doinlinerawtwo #1,\finish}
   3369 \def\doinlinerawtwo#1,#2,\finish{%
   3370   \def\inlinerawname{#1}%
   3371   \ifx\inlinerawname\outfmtnametex \ignorespaces #2\fi
   3372   \endgroup % close group opened by \tex.
   3373 }
   3374 
   3375 % @inlineifset{VAR, TEXT} expands TEXT if VAR is @set.
   3376 %
   3377 \long\def\inlineifset#1{\doinlineifset #1,\finish}
   3378 \long\def\doinlineifset#1,#2,\finish{%
   3379   \def\inlinevarname{#1}%
   3380   \expandafter\ifx\csname SET\inlinevarname\endcsname\relax
   3381   \else\ignorespaces#2\fi
   3382 }
   3383 
   3384 % @inlineifclear{VAR, TEXT} expands TEXT if VAR is not @set.
   3385 %
   3386 \long\def\inlineifclear#1{\doinlineifclear #1,\finish}
   3387 \long\def\doinlineifclear#1,#2,\finish{%
   3388   \def\inlinevarname{#1}%
   3389   \expandafter\ifx\csname SET\inlinevarname\endcsname\relax \ignorespaces#2\fi
   3390 }
   3391 
   3392 
   3393 \message{glyphs,}
   3394 % and logos.
   3395 
   3396 % @@ prints an @, as does @atchar{}.
   3397 \def\@{\char64 }
   3398 \let\atchar=\@
   3399 
   3400 % @{ @} @lbracechar{} @rbracechar{} all generate brace characters.
   3401 \def\lbracechar{{\ifusingtt{\char123}{\ensuremath\lbrace}}}
   3402 \def\rbracechar{{\ifusingtt{\char125}{\ensuremath\rbrace}}}
   3403 \let\{=\lbracechar
   3404 \let\}=\rbracechar
   3405 
   3406 % @comma{} to avoid , parsing problems.
   3407 \let\comma = ,
   3408 
   3409 % Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
   3410 % Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
   3411 \let\, = \ptexc
   3412 \let\dotaccent = \ptexdot
   3413 \def\ringaccent#1{{\accent23 #1}}
   3414 \let\tieaccent = \ptext
   3415 \let\ubaraccent = \ptexb
   3416 \let\udotaccent = \d
   3417 
   3418 % Other special characters: @questiondown @exclamdown @ordf @ordm
   3419 % Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
   3420 \def\questiondown{?`}
   3421 \def\exclamdown{!`}
   3422 \def\ordf{\leavevmode\raise1ex\hbox{\switchtolllsize \underbar{a}}}
   3423 \def\ordm{\leavevmode\raise1ex\hbox{\switchtolllsize \underbar{o}}}
   3424 
   3425 % Dotless i and dotless j, used for accents.
   3426 \def\imacro{i}
   3427 \def\jmacro{j}
   3428 \def\dotless#1{%
   3429   \def\temp{#1}%
   3430   \ifx\temp\imacro \ifmmode\imath \else\ptexi \fi
   3431   \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi
   3432   \else \errmessage{@dotless can be used only with i or j}%
   3433   \fi\fi
   3434 }
   3435 
   3436 % The \TeX{} logo, as in plain, but resetting the spacing so that a
   3437 % period following counts as ending a sentence.  (Idea found in latex.)
   3438 %
   3439 \edef\TeX{\TeX \spacefactor=1000 }
   3440 
   3441 % @LaTeX{} logo.  Not quite the same results as the definition in
   3442 % latex.ltx, since we use a different font for the raised A; it's most
   3443 % convenient for us to use an explicitly smaller font, rather than using
   3444 % the \scriptstyle font (since we don't reset \scriptstyle and
   3445 % \scriptscriptstyle).
   3446 %
   3447 \def\LaTeX{%
   3448   L\kern-.36em
   3449   {\setbox0=\hbox{T}%
   3450    \vbox to \ht0{\hbox{%
   3451      \ifx\textnominalsize\xwordpt
   3452        % for 10pt running text, lllsize (8pt) is too small for the A in LaTeX.
   3453        % Revert to plain's \scriptsize, which is 7pt.
   3454        \count255=\the\fam $\fam\count255 \scriptstyle A$%
   3455      \else
   3456        \ifx\curfontsize\smallword
   3457          % For footnotes and indices
   3458          \count255=\the\fam $\fam\count255 \scriptstyle A$%
   3459        \else
   3460          % For 11pt, we can use our lllsize.
   3461          \switchtolllsize A%
   3462        \fi
   3463      \fi
   3464      }%
   3465      \vss
   3466   }}%
   3467   \kern-.15em
   3468   \TeX
   3469 }
   3470 \def\smallword{small}
   3471 
   3472 % Some math mode symbols.  Define \ensuremath to switch into math mode
   3473 % unless we are already there.  Expansion tricks may not be needed here,
   3474 % but safer, and can't hurt.
   3475 \def\ensuremath{\ifmmode \expandafter\asis \else\expandafter\ensuredmath \fi}
   3476 \def\ensuredmath#1{$\relax#1$}
   3477 %
   3478 \def\bullet{\ensuremath\ptexbullet}
   3479 \def\geq{\ensuremath\ge}
   3480 \def\leq{\ensuremath\le}
   3481 \def\minus{\ensuremath-}
   3482 
   3483 % @dots{} outputs an ellipsis using the current font.
   3484 % We do .5em per period so that it has the same spacing in the cm
   3485 % typewriter fonts as three actual period characters; on the other hand,
   3486 % in other typewriter fonts three periods are wider than 1.5em.  So do
   3487 % whichever is larger.
   3488 %
   3489 \def\dots{%
   3490   \leavevmode
   3491   \setbox0=\hbox{...}% get width of three periods
   3492   \ifdim\wd0 > 1.5em
   3493     \dimen0 = \wd0
   3494   \else
   3495     \dimen0 = 1.5em
   3496   \fi
   3497   \hbox to \dimen0{%
   3498     \hskip 0pt plus.25fil
   3499     .\hskip 0pt plus1fil
   3500     .\hskip 0pt plus1fil
   3501     .\hskip 0pt plus.5fil
   3502   }%
   3503 }
   3504 
   3505 % @enddots{} is an end-of-sentence ellipsis.
   3506 %
   3507 \def\enddots{%
   3508   \dots
   3509   \spacefactor=\endofsentencespacefactor
   3510 }
   3511 
   3512 % @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
   3513 %
   3514 % Since these characters are used in examples, they should be an even number of
   3515 % \tt widths. Each \tt character is 1en, so two makes it 1em.
   3516 %
   3517 \def\point{$\star$}
   3518 \def\arrow{\leavevmode\raise.05ex\hbox to 1em{\hfil$\rightarrow$\hfil}}
   3519 \def\result{\leavevmode\raise.05ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
   3520 \def\expansion{\leavevmode\hbox to 1em{\hfil$\mapsto$\hfil}}
   3521 \def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
   3522 \def\equiv{\leavevmode\hbox to 1em{\hfil$\ptexequiv$\hfil}}
   3523 
   3524 % The @error{} command.
   3525 % Adapted from the TeXbook's \boxit.
   3526 %
   3527 \newbox\errorbox
   3528 %
   3529 {\ttfont \global\dimen0 = 3em}% Width of the box.
   3530 \dimen2 = .55pt % Thickness of rules
   3531 % The text. (`r' is open on the right, `e' somewhat less so on the left.)
   3532 \setbox0 = \hbox{\kern-.75pt \reducedsf \putworderror\kern-1.5pt}
   3533 %
   3534 \setbox\errorbox=\hbox to \dimen0{\hfil
   3535    \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
   3536    \advance\hsize by -2\dimen2 % Rules.
   3537    \vbox{%
   3538       \hrule height\dimen2
   3539       \hbox{\vrule width\dimen2 \kern3pt          % Space to left of text.
   3540          \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
   3541          \kern3pt\vrule width\dimen2}% Space to right.
   3542       \hrule height\dimen2}
   3543     \hfil}
   3544 %
   3545 \def\error{\leavevmode\lower.7ex\copy\errorbox}
   3546 
   3547 % @pounds{} is a sterling sign, which Knuth put in the CM italic font.
   3548 %
   3549 \def\pounds{{\ifusingtt{\ecfont\char"BF}{\it\$}}}
   3550 
   3551 % @euro{} comes from a separate font, depending on the current style.
   3552 % We use the free feym* fonts from the eurosym package by Henrik
   3553 % Theiling, which support regular, slanted, bold and bold slanted (and
   3554 % "outlined" (blackboard board, sort of) versions, which we don't need).
   3555 % It is available from http://www.ctan.org/tex-archive/fonts/eurosym.
   3556 %
   3557 % Although only regular is the truly official Euro symbol, we ignore
   3558 % that.  The Euro is designed to be slightly taller than the regular
   3559 % font height.
   3560 %
   3561 % feymr - regular
   3562 % feymo - slanted
   3563 % feybr - bold
   3564 % feybo - bold slanted
   3565 %
   3566 % There is no good (free) typewriter version, to my knowledge.
   3567 % A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide.
   3568 % Hmm.
   3569 %
   3570 % Also doesn't work in math.  Do we need to do math with euro symbols?
   3571 % Hope not.
   3572 %
   3573 %
   3574 \def\euro{{\eurofont e}}
   3575 \def\eurofont{%
   3576   % We set the font at each command, rather than predefining it in
   3577   % \textfonts and the other font-switching commands, so that
   3578   % installations which never need the symbol don't have to have the
   3579   % font installed.
   3580   %
   3581   % There is only one designed size (nominal 10pt), so we always scale
   3582   % that to the current nominal size.
   3583   %
   3584   % By the way, simply using "at 1em" works for cmr10 and the like, but
   3585   % does not work for cmbx10 and other extended/shrunken fonts.
   3586   %
   3587   \def\eurosize{\csname\curfontsize nominalsize\endcsname}%
   3588   %
   3589   \ifx\curfontstyle\bfstylename
   3590     % bold:
   3591     \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize
   3592   \else
   3593     % regular:
   3594     \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize
   3595   \fi
   3596   \thiseurofont
   3597 }
   3598 
   3599 % Glyphs from the EC fonts.  We don't use \let for the aliases, because
   3600 % sometimes we redefine the original macro, and the alias should reflect
   3601 % the redefinition.
   3602 %
   3603 % Use LaTeX names for the Icelandic letters.
   3604 \def\DH{{\ecfont \char"D0}} % Eth
   3605 \def\dh{{\ecfont \char"F0}} % eth
   3606 \def\TH{{\ecfont \char"DE}} % Thorn
   3607 \def\th{{\ecfont \char"FE}} % thorn
   3608 %
   3609 \def\guillemetleft{{\ecfont \char"13}}
   3610 \def\guillemotleft{\guillemetleft}
   3611 \def\guillemetright{{\ecfont \char"14}}
   3612 \def\guillemotright{\guillemetright}
   3613 \def\guilsinglleft{{\ecfont \char"0E}}
   3614 \def\guilsinglright{{\ecfont \char"0F}}
   3615 \def\quotedblbase{{\ecfont \char"12}}
   3616 \def\quotesinglbase{{\ecfont \char"0D}}
   3617 %
   3618 \def\L{{\ecfont \char"8A}} % L with stroke
   3619 \def\l{{\ecfont \char"AA}} % l with stroke
   3620 %
   3621 % This positioning is not perfect (see the ogonek LaTeX package), but
   3622 % we have the precomposed glyphs for the most common cases.  We put the
   3623 % tests to use those glyphs in the single \ogonek macro so we have fewer
   3624 % dummy definitions to worry about for index entries, etc.
   3625 %
   3626 % ogonek is also used with other letters in Lithuanian (IOU), but using
   3627 % the precomposed glyphs for those is not so easy since they aren't in
   3628 % the same EC font.
   3629 \def\ogonek#1{{%
   3630   \def\temp{#1}%
   3631   \ifx\temp\macrocharA\Aogonek
   3632   \else\ifx\temp\macrochara\aogonek
   3633   \else\ifx\temp\macrocharE\Eogonek
   3634   \else\ifx\temp\macrochare\eogonek
   3635   \else
   3636     \ecfont \setbox0=\hbox{#1}%
   3637     \ifdim\ht0=1ex\accent"0C #1%
   3638     \else\ooalign{\unhbox0\crcr\hidewidth\char"0C \hidewidth}%
   3639     \fi
   3640   \fi\fi\fi\fi
   3641   }%
   3642 }
   3643 \def\Aogonek{{\ecfont \char"81}}\def\macrocharA{A}
   3644 \def\aogonek{{\ecfont \char"A1}}\def\macrochara{a}
   3645 \def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E}
   3646 \def\eogonek{{\ecfont \char"A6}}\def\macrochare{e}
   3647 %
   3648 % Use the European Computer Modern fonts (cm-super in outline format)
   3649 % for non-CM glyphs.  That is ec* for regular text and tc* for the text
   3650 % companion symbols (LaTeX TS1 encoding).  Both are part of the ec
   3651 % package and follow the same conventions.
   3652 %
   3653 \def\ecfont{\etcfont{e}}
   3654 \def\tcfont{\etcfont{t}}
   3655 %
   3656 \def\etcfont#1{%
   3657   % We can't distinguish serif/sans and italic/slanted, but this
   3658   % is used for crude hacks anyway (like adding French and German
   3659   % quotes to documents typeset with CM, where we lose kerning), so
   3660   % hopefully nobody will notice/care.
   3661   \edef\ecsize{\csname\curfontsize ecsize\endcsname}%
   3662   \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}%
   3663   \ifusingtt
   3664       % typewriter:
   3665      {\font\thisecfont = #1ctt\ecsize \space at \nominalsize}%
   3666   % else
   3667      {\ifx\curfontstyle\bfstylename
   3668         % bold:
   3669         \font\thisecfont = #1cb\ifusingit{i}{x}\ecsize \space at \nominalsize
   3670       \else
   3671         % regular:
   3672         \font\thisecfont = #1c\ifusingit{ti}{rm}\ecsize \space at \nominalsize
   3673       \fi}%
   3674   \thisecfont
   3675 }
   3676 
   3677 % @registeredsymbol - R in a circle.  The font for the R should really
   3678 % be smaller yet, but lllsize is the best we can do for now.
   3679 % Adapted from the plain.tex definition of \copyright.
   3680 %
   3681 \def\registeredsymbol{%
   3682   $^{{\ooalign{\hfil\raise.07ex\hbox{\switchtolllsize R}%
   3683                \hfil\crcr\Orb}}%
   3684     }$%
   3685 }
   3686 
   3687 % @textdegree - the normal degrees sign.
   3688 %
   3689 \def\textdegree{%
   3690    \ifmmode ^\circ
   3691    \else {\tcfont \char 176}%
   3692    \fi}
   3693 
   3694 % Laurent Siebenmann reports \Orb undefined with:
   3695 %  Textures 1.7.7 (preloaded format=plain 93.10.14)  (68K)  16 APR 2004 02:38
   3696 % so we'll define it if necessary.
   3697 %
   3698 \ifx\Orb\thisisundefined
   3699 \def\Orb{\mathhexbox20D}
   3700 \fi
   3701 
   3702 % Quotes.
   3703 \chardef\quoteleft=`\`
   3704 \chardef\quoteright=`\'
   3705 
   3706 % only change font for tt for correct kerning and to avoid using
   3707 % \ecfont unless necessary.
   3708 \def\quotedblleft{%
   3709   \ifusingtt{{\ecfont\char"10}}{{\char"5C}}%
   3710 }
   3711 
   3712 \def\quotedblright{%
   3713   \ifusingtt{{\ecfont\char"11}}{{\char`\"}}%
   3714 }
   3715 
   3716 
   3717 \message{page headings,}
   3718 
   3719 \newskip\titlepagetopglue \titlepagetopglue = 1.5in
   3720 \newskip\titlepagebottomglue \titlepagebottomglue = 2pc
   3721 
   3722 % First the title page.  Must do @settitle before @titlepage.
   3723 \newif\ifseenauthor
   3724 \newif\iffinishedtitlepage
   3725 
   3726 % @setcontentsaftertitlepage used to do an implicit @contents or
   3727 % @shortcontents after @end titlepage, but it is now obsolete.
   3728 \def\setcontentsaftertitlepage{%
   3729   \errmessage{@setcontentsaftertitlepage has been removed as a Texinfo
   3730               command; move your @contents command if you want the contents
   3731               after the title page.}}%
   3732 \def\setshortcontentsaftertitlepage{%
   3733   \errmessage{@setshortcontentsaftertitlepage has been removed as a Texinfo
   3734               command; move your @shortcontents and @contents commands if you
   3735               want the contents after the title page.}}%
   3736 
   3737 \parseargdef\shorttitlepage{%
   3738   {\headingsoff \begingroup \hbox{}\vskip 1.5in \chaprm \centerline{#1}%
   3739   \endgroup\page\hbox{}\page}\pageone}
   3740 
   3741 \envdef\titlepage{%
   3742   % Open one extra group, as we want to close it in the middle of \Etitlepage.
   3743   \begingroup
   3744     \parindent=0pt \textfonts
   3745     \headingsoff
   3746     % Leave some space at the very top of the page.
   3747     \vglue\titlepagetopglue
   3748     % No rule at page bottom unless we print one at the top with @title.
   3749     \finishedtitlepagetrue
   3750     %
   3751     % Most title ``pages'' are actually two pages long, with space
   3752     % at the top of the second.  We don't want the ragged left on the second.
   3753     \let\oldpage = \page
   3754     \def\page{%
   3755       \iffinishedtitlepage\else
   3756 	 \finishtitlepage
   3757       \fi
   3758       \let\page = \oldpage
   3759       \page
   3760       \null
   3761     }%
   3762 }
   3763 
   3764 \def\Etitlepage{%
   3765     \iffinishedtitlepage\else
   3766 	\finishtitlepage
   3767     \fi
   3768     % It is important to do the page break before ending the group,
   3769     % because the headline and footline are only empty inside the group.
   3770     % If we use the new definition of \page, we always get a blank page
   3771     % after the title page, which we certainly don't want.
   3772     \oldpage
   3773     \pageone
   3774   \endgroup
   3775   %
   3776 }
   3777 
   3778 \def\finishtitlepage{%
   3779   \vskip4pt \hrule height 2pt width \hsize
   3780   \vskip\titlepagebottomglue
   3781   \finishedtitlepagetrue
   3782 }
   3783 
   3784 % Settings used for typesetting titles: no hyphenation, no indentation,
   3785 % don't worry much about spacing, ragged right.  This should be used
   3786 % inside a \vbox, and fonts need to be set appropriately first. \par should
   3787 % be specified before the end of the \vbox, since a vbox is a group.
   3788 %
   3789 \def\raggedtitlesettings{%
   3790   \rm
   3791   \hyphenpenalty=10000
   3792   \parindent=0pt
   3793   \tolerance=5000
   3794   \ptexraggedright
   3795 }
   3796 
   3797 % Macros to be used within @titlepage:
   3798 
   3799 \let\subtitlerm=\rmfont
   3800 \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}
   3801 
   3802 \parseargdef\title{%
   3803   \checkenv\titlepage
   3804   \vbox{\titlefonts \raggedtitlesettings #1\par}%
   3805   % print a rule at the page bottom also.
   3806   \finishedtitlepagefalse
   3807   \vskip4pt \hrule height 4pt width \hsize \vskip4pt
   3808 }
   3809 
   3810 \parseargdef\subtitle{%
   3811   \checkenv\titlepage
   3812   {\subtitlefont \rightline{#1}}%
   3813 }
   3814 
   3815 % @author should come last, but may come many times.
   3816 % It can also be used inside @quotation.
   3817 %
   3818 \parseargdef\author{%
   3819   \def\temp{\quotation}%
   3820   \ifx\thisenv\temp
   3821     \def\quotationauthor{#1}% printed in \Equotation.
   3822   \else
   3823     \checkenv\titlepage
   3824     \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi
   3825     {\secfonts\rm \leftline{#1}}%
   3826   \fi
   3827 }
   3828 
   3829 
   3830 % Set up page headings and footings.
   3831 
   3832 \let\thispage=\folio
   3833 
   3834 \newtoks\evenheadline    % headline on even pages
   3835 \newtoks\oddheadline     % headline on odd pages
   3836 \newtoks\evenchapheadline% headline on even pages with a new chapter
   3837 \newtoks\oddchapheadline % headline on odd pages with a new chapter
   3838 \newtoks\evenfootline    % footline on even pages
   3839 \newtoks\oddfootline     % footline on odd pages
   3840 
   3841 % Now make \makeheadline and \makefootline in Plain TeX use those variables
   3842 \headline={{\textfonts\rm\frenchspacingsetting
   3843             \ifchapterpage
   3844               \ifodd\pageno\the\oddchapheadline\else\the\evenchapheadline\fi
   3845             \else
   3846               \ifodd\pageno\the\oddheadline\else\the\evenheadline\fi
   3847             \fi}}
   3848 
   3849 \footline={{\textfonts\rm\frenchspacingsetting
   3850             \ifodd\pageno \the\oddfootline \else \the\evenfootline \fi}%
   3851            \HEADINGShook}
   3852 \let\HEADINGShook=\relax
   3853 
   3854 % Commands to set those variables.
   3855 % For example, this is what  @headings on  does
   3856 % @evenheading @thistitle|@thispage|@thischapter
   3857 % @oddheading @thischapter|@thispage|@thistitle
   3858 % @evenfooting @thisfile||
   3859 % @oddfooting ||@thisfile
   3860 
   3861 
   3862 \def\evenheading{\parsearg\evenheadingxxx}
   3863 \def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish}
   3864 \def\evenheadingyyy #1\|#2\|#3\|#4\finish{%
   3865   \global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}
   3866   \global\evenchapheadline=\evenheadline}
   3867 
   3868 \def\oddheading{\parsearg\oddheadingxxx}
   3869 \def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish}
   3870 \def\oddheadingyyy #1\|#2\|#3\|#4\finish{%
   3871   \global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}%
   3872   \global\oddchapheadline=\oddheadline}
   3873 
   3874 \parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
   3875 
   3876 \def\evenfooting{\parsearg\evenfootingxxx}
   3877 \def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish}
   3878 \def\evenfootingyyy #1\|#2\|#3\|#4\finish{%
   3879 \global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
   3880 
   3881 \def\oddfooting{\parsearg\oddfootingxxx}
   3882 \def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish}
   3883 \def\oddfootingyyy #1\|#2\|#3\|#4\finish{%
   3884   \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
   3885   %
   3886   % Leave some space for the footline.  Hopefully ok to assume
   3887   % @evenfooting will not be used by itself.
   3888   \global\advance\txipageheight by -12pt
   3889   \global\advance\vsize by -12pt
   3890 }
   3891 
   3892 \parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}}
   3893 
   3894 % @evenheadingmarks top     \thischapter <- chapter at the top of a page
   3895 % @evenheadingmarks bottom  \thischapter <- chapter at the bottom of a page
   3896 %
   3897 % The same set of arguments for:
   3898 %
   3899 % @oddheadingmarks
   3900 % @evenfootingmarks
   3901 % @oddfootingmarks
   3902 % @everyheadingmarks
   3903 % @everyfootingmarks
   3904 
   3905 % These define \getoddheadingmarks, \getevenheadingmarks,
   3906 % \getoddfootingmarks, and \getevenfootingmarks, each to one of
   3907 % \gettopheadingmarks, \getbottomheadingmarks.
   3908 %
   3909 \def\evenheadingmarks{\headingmarks{even}{heading}}
   3910 \def\oddheadingmarks{\headingmarks{odd}{heading}}
   3911 \def\evenfootingmarks{\headingmarks{even}{footing}}
   3912 \def\oddfootingmarks{\headingmarks{odd}{footing}}
   3913 \parseargdef\everyheadingmarks{\headingmarks{even}{heading}{#1}
   3914                           \headingmarks{odd}{heading}{#1} }
   3915 \parseargdef\everyfootingmarks{\headingmarks{even}{footing}{#1}
   3916                           \headingmarks{odd}{footing}{#1} }
   3917 % #1 = even/odd, #2 = heading/footing, #3 = top/bottom.
   3918 \def\headingmarks#1#2#3 {%
   3919   \expandafter\let\expandafter\temp \csname get#3headingmarks\endcsname
   3920   \global\expandafter\let\csname get#1#2marks\endcsname \temp
   3921 }
   3922 
   3923 \everyheadingmarks bottom
   3924 \everyfootingmarks bottom
   3925 
   3926 % @headings double      turns headings on for double-sided printing.
   3927 % @headings single      turns headings on for single-sided printing.
   3928 % @headings off         turns them off.
   3929 % @headings on          same as @headings double, retained for compatibility.
   3930 % @headings after       turns on double-sided headings after this page.
   3931 % @headings doubleafter turns on double-sided headings after this page.
   3932 % @headings singleafter turns on single-sided headings after this page.
   3933 % By default, they are off at the start of a document,
   3934 % and turned `on' after @end titlepage.
   3935 
   3936 \parseargdef\headings{\csname HEADINGS#1\endcsname}
   3937 
   3938 \def\headingsoff{% non-global headings elimination
   3939   \evenheadline={\hfil}\evenfootline={\hfil}\evenchapheadline={\hfil}%
   3940    \oddheadline={\hfil}\oddfootline={\hfil}\oddchapheadline={\hfil}%
   3941 }
   3942 
   3943 \def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting
   3944 
   3945 % Set the page number to 1.
   3946 \def\pageone{
   3947   \global\pageno=1
   3948   \global\arabiccount = \pagecount
   3949 }
   3950 
   3951 \let\contentsalignmacro = \chappager
   3952 
   3953 % \def\HEADINGSon{\HEADINGSdouble} % defined by \CHAPPAGon
   3954 
   3955 % For double-sided printing, put current file name in lower left corner,
   3956 % chapter name on inside top of right hand pages, document
   3957 % title on inside top of left hand pages, and page numbers on outside top
   3958 % edge of all pages.
   3959 \def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdouble}
   3960 \let\HEADINGSdoubleafter=\HEADINGSafter
   3961 \def\HEADINGSdouble{%
   3962 \global\evenfootline={\hfil}
   3963 \global\oddfootline={\hfil}
   3964 \global\evenheadline={\line{\folio\hfil\thistitle}}
   3965 \global\oddheadline={\line{\thischapter\hfil\folio}}
   3966 \global\evenchapheadline={\line{\folio\hfil\thistitle}}
   3967 \global\oddchapheadline={\line{\hfil\folio}}
   3968 \global\let\contentsalignmacro = \chapoddpage
   3969 }
   3970 
   3971 % For single-sided printing, chapter title goes across top left of page,
   3972 % page number on top right.
   3973 \def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsingle}
   3974 \def\HEADINGSsingle{%
   3975 \global\evenfootline={\hfil}
   3976 \global\oddfootline={\hfil}
   3977 \global\evenheadline={\line{\thischapter\hfil\folio}}
   3978 \global\oddheadline={\line{\thischapter\hfil\folio}}
   3979 \global\evenchapheadline={\line{\hfil\folio}}
   3980 \global\oddchapheadline={\line{\hfil\folio}}
   3981 \global\let\contentsalignmacro = \chappager
   3982 }
   3983 
   3984 % for @setchapternewpage off
   3985 \def\HEADINGSsinglechapoff{%
   3986 \global\evenfootline={\hfil}
   3987 \global\oddfootline={\hfil}
   3988 \global\evenheadline={\line{\thischapter\hfil\folio}}
   3989 \global\oddheadline={\line{\thischapter\hfil\folio}}
   3990 \global\evenchapheadline=\evenheadline
   3991 \global\oddchapheadline=\oddheadline
   3992 \global\let\contentsalignmacro = \chappager
   3993 }
   3994 
   3995 % Subroutines used in generating headings
   3996 % This produces Day Month Year style of output.
   3997 % Only define if not already defined, in case a txi-??.tex file has set
   3998 % up a different format (e.g., txi-cs.tex does this).
   3999 \ifx\today\thisisundefined
   4000 \def\today{%
   4001   \number\day\space
   4002   \ifcase\month
   4003   \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
   4004   \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
   4005   \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
   4006   \fi
   4007   \space\number\year}
   4008 \fi
   4009 
   4010 % @settitle line...  specifies the title of the document, for headings.
   4011 % It generates no output of its own.
   4012 \def\thistitle{\putwordNoTitle}
   4013 \def\settitle{\parsearg{\gdef\thistitle}}
   4014 
   4015 
   4016 \message{tables,}
   4017 % Tables -- @table, @ftable, @vtable, @item(x).
   4018 
   4019 % default indentation of table text
   4020 \newdimen\tableindent \tableindent=.8in
   4021 % default indentation of @itemize and @enumerate text
   4022 \newdimen\itemindent  \itemindent=.3in
   4023 % margin between end of table item and start of table text.
   4024 \newdimen\itemmargin  \itemmargin=.1in
   4025 
   4026 % used internally for \itemindent minus \itemmargin
   4027 \newdimen\itemmax
   4028 
   4029 % Note @table, @ftable, and @vtable define @item, @itemx, etc., with
   4030 % these defs.
   4031 % They also define \itemindex
   4032 % to index the item name in whatever manner is desired (perhaps none).
   4033 
   4034 \newif\ifitemxneedsnegativevskip
   4035 
   4036 \def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi}
   4037 
   4038 \def\internalBitem{\smallbreak \parsearg\itemzzz}
   4039 \def\internalBitemx{\itemxpar \parsearg\itemzzz}
   4040 
   4041 \def\itemzzz #1{\begingroup %
   4042   \advance\hsize by -\rightskip
   4043   \advance\hsize by -\tableindent
   4044   \setbox0=\hbox{\itemindicate{#1}}%
   4045   \itemindex{#1}%
   4046   \nobreak % This prevents a break before @itemx.
   4047   %
   4048   % If the item text does not fit in the space we have, put it on a line
   4049   % by itself, and do not allow a page break either before or after that
   4050   % line.  We do not start a paragraph here because then if the next
   4051   % command is, e.g., @kindex, the whatsit would get put into the
   4052   % horizontal list on a line by itself, resulting in extra blank space.
   4053   \ifdim \wd0>\itemmax
   4054     %
   4055     % Make this a paragraph so we get the \parskip glue and wrapping,
   4056     % but leave it ragged-right.
   4057     \begingroup
   4058       \advance\leftskip by-\tableindent
   4059       \advance\hsize by\tableindent
   4060       \advance\rightskip by0pt plus1fil\relax
   4061       \leavevmode\unhbox0\par
   4062     \endgroup
   4063     %
   4064     % We're going to be starting a paragraph, but we don't want the
   4065     % \parskip glue -- logically it's part of the @item we just started.
   4066     \nobreak \vskip-\parskip
   4067     %
   4068     % Stop a page break at the \parskip glue coming up.  However, if
   4069     % what follows is an environment such as @example, there will be no
   4070     % \parskip glue; then the negative vskip we just inserted would
   4071     % cause the example and the item to crash together.  So we use this
   4072     % bizarre value of 10001 as a signal to \aboveenvbreak to insert
   4073     % \parskip glue after all.  Section titles are handled this way also.
   4074     %
   4075     \penalty 10001
   4076     \endgroup
   4077     \itemxneedsnegativevskipfalse
   4078   \else
   4079     % The item text fits into the space.  Start a paragraph, so that the
   4080     % following text (if any) will end up on the same line.
   4081     \noindent
   4082     % Do this with kerns and \unhbox so that if there is a footnote in
   4083     % the item text, it can migrate to the main vertical list and
   4084     % eventually be printed.
   4085     \nobreak\kern-\tableindent
   4086     \dimen0 = \itemmax  \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0
   4087     \unhbox0
   4088     \nobreak\kern\dimen0
   4089     \endgroup
   4090     \itemxneedsnegativevskiptrue
   4091   \fi
   4092 }
   4093 
   4094 \def\item{\errmessage{@item while not in a list environment}}
   4095 \def\itemx{\errmessage{@itemx while not in a list environment}}
   4096 
   4097 % @table, @ftable, @vtable.
   4098 \envdef\table{%
   4099   \let\itemindex\gobble
   4100   \tablecheck{table}%
   4101 }
   4102 \envdef\ftable{%
   4103   \def\itemindex ##1{\doind {fn}{\code{##1}}}%
   4104   \tablecheck{ftable}%
   4105 }
   4106 \envdef\vtable{%
   4107   \def\itemindex ##1{\doind {vr}{\code{##1}}}%
   4108   \tablecheck{vtable}%
   4109 }
   4110 \def\tablecheck#1{%
   4111   \ifnum \the\catcode`\^^M=\active
   4112     \endgroup
   4113     \errmessage{This command won't work in this context; perhaps the problem is
   4114       that we are \inenvironment\thisenv}%
   4115     \def\next{\doignore{#1}}%
   4116   \else
   4117     \let\next\tablex
   4118   \fi
   4119   \next
   4120 }
   4121 \def\tablex#1{%
   4122   \def\itemindicate{#1}%
   4123   \parsearg\tabley
   4124 }
   4125 \def\tabley#1{%
   4126   {%
   4127     \makevalueexpandable
   4128     \edef\temp{\noexpand\tablez #1\space\space\space}%
   4129     \expandafter
   4130   }\temp \endtablez
   4131 }
   4132 \def\tablez #1 #2 #3 #4\endtablez{%
   4133   \aboveenvbreak
   4134   \ifnum 0#1>0 \advance \leftskip by #1\mil \fi
   4135   \ifnum 0#2>0 \tableindent=#2\mil \fi
   4136   \ifnum 0#3>0 \advance \rightskip by #3\mil \fi
   4137   \itemmax=\tableindent
   4138   \advance \itemmax by -\itemmargin
   4139   \advance \leftskip by \tableindent
   4140   \exdentamount=\tableindent
   4141   \parindent = 0pt
   4142   \parskip = \smallskipamount
   4143   \ifdim \parskip=0pt \parskip=2pt \fi
   4144   \let\item = \internalBitem
   4145   \let\itemx = \internalBitemx
   4146 }
   4147 \def\Etable{\endgraf\afterenvbreak}
   4148 \let\Eftable\Etable
   4149 \let\Evtable\Etable
   4150 \let\Eitemize\Etable
   4151 \let\Eenumerate\Etable
   4152 
   4153 % This is the counter used by @enumerate, which is really @itemize
   4154 
   4155 \newcount \itemno
   4156 
   4157 \envdef\itemize{\parsearg\doitemize}
   4158 
   4159 \def\doitemize#1{%
   4160   \aboveenvbreak
   4161   \itemmax=\itemindent
   4162   \advance\itemmax by -\itemmargin
   4163   \advance\leftskip by \itemindent
   4164   \exdentamount=\itemindent
   4165   \parindent=0pt
   4166   \parskip=\smallskipamount
   4167   \ifdim\parskip=0pt \parskip=2pt \fi
   4168   %
   4169   % Try typesetting the item mark so that if the document erroneously says
   4170   % something like @itemize @samp (intending @table), there's an error
   4171   % right away at the @itemize.  It's not the best error message in the
   4172   % world, but it's better than leaving it to the @item.  This means if
   4173   % the user wants an empty mark, they have to say @w{} not just @w.
   4174   \def\itemcontents{#1}%
   4175   \setbox0 = \hbox{\itemcontents}%
   4176   %
   4177   % @itemize with no arg is equivalent to @itemize @bullet.
   4178   \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi
   4179   %
   4180   \let\item=\itemizeitem
   4181 }
   4182 
   4183 % Definition of @item while inside @itemize and @enumerate.
   4184 %
   4185 \def\itemizeitem{%
   4186   \advance\itemno by 1  % for enumerations
   4187   {\let\par=\endgraf \smallbreak}% reasonable place to break
   4188   {%
   4189    % If the document has an @itemize directly after a section title, a
   4190    % \nobreak will be last on the list, and \sectionheading will have
   4191    % done a \vskip-\parskip.  In that case, we don't want to zero
   4192    % parskip, or the item text will crash with the heading.  On the
   4193    % other hand, when there is normal text preceding the item (as there
   4194    % usually is), we do want to zero parskip, or there would be too much
   4195    % space.  In that case, we won't have a \nobreak before.  At least
   4196    % that's the theory.
   4197    \ifnum\lastpenalty<10000 \parskip=0in \fi
   4198    \noindent
   4199    \hbox to 0pt{\hss \itemcontents \kern\itemmargin}%
   4200    %
   4201    \ifinner\else
   4202      \vadjust{\penalty 1200}% not good to break after first line of item.
   4203    \fi
   4204    % We can be in inner vertical mode in a footnote, although an
   4205    % @itemize looks awful there.
   4206   }%
   4207   \flushcr
   4208 }
   4209 
   4210 % \splitoff TOKENS\endmark defines \first to be the first token in
   4211 % TOKENS, and \rest to be the remainder.
   4212 %
   4213 \def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}%
   4214 
   4215 % Allow an optional argument of an uppercase letter, lowercase letter,
   4216 % or number, to specify the first label in the enumerated list.  No
   4217 % argument is the same as `1'.
   4218 %
   4219 \envparseargdef\enumerate{\enumeratey #1  \endenumeratey}
   4220 \def\enumeratey #1 #2\endenumeratey{%
   4221   % If we were given no argument, pretend we were given `1'.
   4222   \def\thearg{#1}%
   4223   \ifx\thearg\empty \def\thearg{1}\fi
   4224   %
   4225   % Detect if the argument is a single token.  If so, it might be a
   4226   % letter.  Otherwise, the only valid thing it can be is a number.
   4227   % (We will always have one token, because of the test we just made.
   4228   % This is a good thing, since \splitoff doesn't work given nothing at
   4229   % all -- the first parameter is undelimited.)
   4230   \expandafter\splitoff\thearg\endmark
   4231   \ifx\rest\empty
   4232     % Only one token in the argument.  It could still be anything.
   4233     % A ``lowercase letter'' is one whose \lccode is nonzero.
   4234     % An ``uppercase letter'' is one whose \lccode is both nonzero, and
   4235     %   not equal to itself.
   4236     % Otherwise, we assume it's a number.
   4237     %
   4238     % We need the \relax at the end of the \ifnum lines to stop TeX from
   4239     % continuing to look for a <number>.
   4240     %
   4241     \ifnum\lccode\expandafter`\thearg=0\relax
   4242       \numericenumerate % a number (we hope)
   4243     \else
   4244       % It's a letter.
   4245       \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax
   4246         \lowercaseenumerate % lowercase letter
   4247       \else
   4248         \uppercaseenumerate % uppercase letter
   4249       \fi
   4250     \fi
   4251   \else
   4252     % Multiple tokens in the argument.  We hope it's a number.
   4253     \numericenumerate
   4254   \fi
   4255 }
   4256 
   4257 % An @enumerate whose labels are integers.  The starting integer is
   4258 % given in \thearg.
   4259 %
   4260 \def\numericenumerate{%
   4261   \itemno = \thearg
   4262   \startenumeration{\the\itemno}%
   4263 }
   4264 
   4265 % The starting (lowercase) letter is in \thearg.
   4266 \def\lowercaseenumerate{%
   4267   \itemno = \expandafter`\thearg
   4268   \startenumeration{%
   4269     % Be sure we're not beyond the end of the alphabet.
   4270     \ifnum\itemno=0
   4271       \errmessage{No more lowercase letters in @enumerate; get a bigger
   4272                   alphabet}%
   4273     \fi
   4274     \char\lccode\itemno
   4275   }%
   4276 }
   4277 
   4278 % The starting (uppercase) letter is in \thearg.
   4279 \def\uppercaseenumerate{%
   4280   \itemno = \expandafter`\thearg
   4281   \startenumeration{%
   4282     % Be sure we're not beyond the end of the alphabet.
   4283     \ifnum\itemno=0
   4284       \errmessage{No more uppercase letters in @enumerate; get a bigger
   4285                   alphabet}
   4286     \fi
   4287     \char\uccode\itemno
   4288   }%
   4289 }
   4290 
   4291 % Call \doitemize, adding a period to the first argument and supplying the
   4292 % common last two arguments.  Also subtract one from the initial value in
   4293 % \itemno, since @item increments \itemno.
   4294 %
   4295 \def\startenumeration#1{%
   4296   \advance\itemno by -1
   4297   \doitemize{#1.}\flushcr
   4298 }
   4299 
   4300 
   4301 % @multitable macros
   4302 
   4303 % Macros used to set up halign preamble:
   4304 %
   4305 \let\endsetuptable\relax
   4306 \def\xendsetuptable{\endsetuptable}
   4307 \let\columnfractions\relax
   4308 \def\xcolumnfractions{\columnfractions}
   4309 \newif\ifsetpercent
   4310 
   4311 % #1 is the @columnfraction, usually a decimal number like .5, but might
   4312 % be just 1.  We just use it, whatever it is.
   4313 %
   4314 \def\pickupwholefraction#1 {%
   4315   \global\advance\colcount by 1
   4316   \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}%
   4317   \setuptable
   4318 }
   4319 
   4320 \newcount\colcount
   4321 \def\setuptable#1{%
   4322   \def\firstarg{#1}%
   4323   \ifx\firstarg\xendsetuptable
   4324     \let\go = \relax
   4325   \else
   4326     \ifx\firstarg\xcolumnfractions
   4327       \global\setpercenttrue
   4328     \else
   4329       \ifsetpercent
   4330          \let\go\pickupwholefraction
   4331       \else
   4332          \global\advance\colcount by 1
   4333          \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a
   4334                    % separator; typically that is always in the input, anyway.
   4335          \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
   4336       \fi
   4337     \fi
   4338     \ifx\go\pickupwholefraction
   4339       % Put the argument back for the \pickupwholefraction call, so
   4340       % we'll always have a period there to be parsed.
   4341       \def\go{\pickupwholefraction#1}%
   4342     \else
   4343       \let\go = \setuptable
   4344     \fi%
   4345   \fi
   4346   \go
   4347 }
   4348 
   4349 % @headitem starts a heading row, which we typeset in bold.  Assignments
   4350 % have to be global since we are inside the implicit group of an
   4351 % alignment entry.  \everycr below resets \everytab so we don't have to
   4352 % undo it ourselves.
   4353 \def\headitemfont{\b}% for people to use in the template row; not changeable
   4354 \def\headitem{%
   4355   \crcr % must appear first
   4356   \gdef\headitemcrhook{\nobreak}% attempt to avoid page break after headings
   4357   \global\everytab={\bf}% can't use \headitemfont since the parsing differs
   4358   \the\everytab % for the first item
   4359 }%
   4360 %
   4361 % default for tables with no headings.
   4362 \let\headitemcrhook=\relax
   4363 %
   4364 \def\tab{\checkenv\multitable &\the\everytab}%
   4365 
   4366 \newtoks\everytab  % insert after every tab.
   4367 %
   4368 \envdef\multitable{%
   4369   \vskip\parskip
   4370   \startsavinginserts
   4371   %
   4372   % @item within a multitable starts a normal row.
   4373   % We use \def instead of \let so that if one of the multitable entries
   4374   % contains an @itemize, we don't choke on the \item (seen as \crcr aka
   4375   % \endtemplate) expanding \doitemize.
   4376   \def\item{\crcr}%
   4377   %
   4378   \tolerance=9500
   4379   \hbadness=9500
   4380   \parskip=0pt
   4381   \parindent=6pt
   4382   \overfullrule=0pt
   4383   \global\colcount=0
   4384   %
   4385   \everycr = {%
   4386     \noalign{%
   4387       \global\everytab={}% Reset from possible headitem.
   4388       \global\colcount=0 % Reset the column counter.
   4389       %
   4390       % Check for saved footnotes, etc.:
   4391       \checkinserts
   4392       %
   4393       % Perhaps a \nobreak, then reset:
   4394       \headitemcrhook
   4395       \global\let\headitemcrhook=\relax
   4396     }%
   4397   }%
   4398   %
   4399   \parsearg\domultitable
   4400 }
   4401 \def\domultitable#1{%
   4402   % To parse everything between @multitable and @item:
   4403   \setuptable#1 \endsetuptable
   4404   %
   4405   % This preamble sets up a generic column definition, which will
   4406   % be used as many times as user calls for columns.
   4407   % \vtop will set a single line and will also let text wrap and
   4408   % continue for many paragraphs if desired.
   4409   \halign\bgroup &%
   4410     \global\advance\colcount by 1
   4411     \strut
   4412     \vtop{%
   4413       \advance\hsize by -1\leftskip
   4414       % Find the correct column width
   4415       \hsize=\expandafter\csname col\the\colcount\endcsname
   4416       %
   4417       \advance\rightskip by -1\rightskip % Zero leaving only any stretch
   4418       \ifnum\colcount=1
   4419         \advance\hsize by\leftskip % Add indent of surrounding text
   4420       \else
   4421         % In order to keep entries from bumping into each other.
   4422         \leftskip=12pt
   4423         \ifsetpercent \else
   4424           % If a template has been used
   4425           \advance\hsize by \leftskip
   4426         \fi
   4427       \fi
   4428       \noindent\ignorespaces##\unskip\strut
   4429     }\cr
   4430 }
   4431 \def\Emultitable{%
   4432   \crcr
   4433   \egroup % end the \halign
   4434   \global\setpercentfalse
   4435 }
   4436 
   4437 
   4438 \message{conditionals,}
   4439 
   4440 % @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotlatex, @ifnotplaintext,
   4441 % @ifnotxml always succeed.  They currently do nothing; we don't
   4442 % attempt to check whether the conditionals are properly nested.  But we
   4443 % have to remember that they are conditionals, so that @end doesn't
   4444 % attempt to close an environment group.
   4445 %
   4446 \def\makecond#1{%
   4447   \expandafter\let\csname #1\endcsname = \relax
   4448   \expandafter\let\csname iscond.#1\endcsname = 1
   4449 }
   4450 \makecond{iftex}
   4451 \makecond{ifnotdocbook}
   4452 \makecond{ifnothtml}
   4453 \makecond{ifnotinfo}
   4454 \makecond{ifnotlatex}
   4455 \makecond{ifnotplaintext}
   4456 \makecond{ifnotxml}
   4457 
   4458 % Ignore @ignore, @ifhtml, @ifinfo, and the like.
   4459 %
   4460 \def\direntry{\doignore{direntry}}
   4461 \def\documentdescription{\doignore{documentdescription}}
   4462 \def\docbook{\doignore{docbook}}
   4463 \def\html{\doignore{html}}
   4464 \def\ifdocbook{\doignore{ifdocbook}}
   4465 \def\ifhtml{\doignore{ifhtml}}
   4466 \def\ifinfo{\doignore{ifinfo}}
   4467 \def\iflatex{\doignore{iflatex}}
   4468 \def\ifnottex{\doignore{ifnottex}}
   4469 \def\ifplaintext{\doignore{ifplaintext}}
   4470 \def\ifxml{\doignore{ifxml}}
   4471 \def\ignore{\doignore{ignore}}
   4472 \def\latex{\doignore{latex}}
   4473 \def\menu{\doignore{menu}}
   4474 \def\xml{\doignore{xml}}
   4475 
   4476 % Ignore text until a line `@end #1', keeping track of nested conditionals.
   4477 %
   4478 % A count to remember the depth of nesting.
   4479 \newcount\doignorecount
   4480 
   4481 \def\doignore#1{\begingroup
   4482   % Scan in ``verbatim'' mode:
   4483   \obeylines
   4484   \catcode`\@ = \other
   4485   \catcode`\{ = \other
   4486   \catcode`\} = \other
   4487   %
   4488   % Make sure that spaces turn into tokens that match what \doignoretext wants.
   4489   \spaceisspace
   4490   %
   4491   % Count number of #1's that we've seen.
   4492   \doignorecount = 0
   4493   %
   4494   % Swallow text until we reach the matching `@end #1'.
   4495   \dodoignore{#1}%
   4496 }
   4497 
   4498 { \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source.
   4499   \obeylines %
   4500   %
   4501   \gdef\dodoignore#1{%
   4502     % #1 contains the command name as a string, e.g., `ifinfo'.
   4503     %
   4504     % Define a command to find the next `@end #1'.
   4505     \long\def\doignoretext##1^^M@end #1{%
   4506       \doignoretextyyy##1^^M@#1\_STOP_}%
   4507     %
   4508     % And this command to find another #1 command, at the beginning of a
   4509     % line.  (Otherwise, we would consider a line `@c @ifset', for
   4510     % example, to count as an @ifset for nesting.)
   4511     \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}%
   4512     %
   4513     % And now expand that command.
   4514     \doignoretext ^^M%
   4515   }%
   4516 }
   4517 
   4518 \def\doignoreyyy#1{%
   4519   \def\temp{#1}%
   4520   \ifx\temp\empty			% Nothing found.
   4521     \let\next\doignoretextzzz
   4522   \else					% Found a nested condition, ...
   4523     \advance\doignorecount by 1
   4524     \let\next\doignoretextyyy		% ..., look for another.
   4525     % If we're here, #1 ends with ^^M\ifinfo (for example).
   4526   \fi
   4527   \next #1% the token \_STOP_ is present just after this macro.
   4528 }
   4529 
   4530 % We have to swallow the remaining "\_STOP_".
   4531 %
   4532 \def\doignoretextzzz#1{%
   4533   \ifnum\doignorecount = 0	% We have just found the outermost @end.
   4534     \let\next\enddoignore
   4535   \else				% Still inside a nested condition.
   4536     \advance\doignorecount by -1
   4537     \let\next\doignoretext      % Look for the next @end.
   4538   \fi
   4539   \next
   4540 }
   4541 
   4542 % Finish off ignored text.
   4543 { \obeylines%
   4544   % Ignore anything after the last `@end #1'; this matters in verbatim
   4545   % environments, where otherwise the newline after an ignored conditional
   4546   % would result in a blank line in the output.
   4547   \gdef\enddoignore#1^^M{\endgroup\ignorespaces}%
   4548 }
   4549 
   4550 
   4551 % @set VAR sets the variable VAR to an empty value.
   4552 % @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
   4553 %
   4554 % Since we want to separate VAR from REST-OF-LINE (which might be
   4555 % empty), we can't just use \parsearg; we have to insert a space of our
   4556 % own to delimit the rest of the line, and then take it out again if we
   4557 % didn't need it.
   4558 % We rely on the fact that \parsearg sets \catcode`\ =10.
   4559 %
   4560 \parseargdef\set{\setyyy#1 \endsetyyy}
   4561 \def\setyyy#1 #2\endsetyyy{%
   4562   {%
   4563     \makevalueexpandable
   4564     \def\temp{#2}%
   4565     \edef\next{\gdef\makecsname{SET#1}}%
   4566     \ifx\temp\empty
   4567       \next{}%
   4568     \else
   4569       \setzzz#2\endsetzzz
   4570     \fi
   4571   }%
   4572 }
   4573 % Remove the trailing space \setxxx inserted.
   4574 \def\setzzz#1 \endsetzzz{\next{#1}}
   4575 
   4576 % @clear VAR clears (i.e., unsets) the variable VAR.
   4577 %
   4578 \parseargdef\clear{%
   4579   {%
   4580     \makevalueexpandable
   4581     \global\expandafter\let\csname SET#1\endcsname=\relax
   4582   }%
   4583 }
   4584 
   4585 % @value{foo} gets the text saved in variable foo.
   4586 \def\value{\begingroup\makevalueexpandable\valuexxx}
   4587 \def\valuexxx#1{\expandablevalue{#1}\endgroup}
   4588 {
   4589   \catcode`\-=\active \catcode`\_=\active
   4590   %
   4591   \gdef\makevalueexpandable{%
   4592     \let\value = \expandablevalue
   4593     % We don't want these characters active, ...
   4594     \catcode`\-=\other \catcode`\_=\other
   4595     % ..., but we might end up with active ones in the argument if
   4596     % we're called from @code, as @code{@value{foo-bar_}}, though.
   4597     % So \let them to their normal equivalents.
   4598     \let-\normaldash \let_\normalunderscore
   4599   }
   4600 }
   4601 
   4602 \def\expandablevalue#1{%
   4603   \expandafter\ifx\csname SET#1\endcsname\relax
   4604     {[No value for ``#1'']}%
   4605     \message{Variable `#1', used in @value, is not set.}%
   4606   \else
   4607     \csname SET#1\endcsname
   4608   \fi
   4609 }
   4610 
   4611 % Like \expandablevalue, but completely expandable (the \message in the
   4612 % definition above operates at the execution level of TeX).  Used when
   4613 % writing to auxiliary files, due to the expansion that \write does.
   4614 % If flag is undefined, pass through an unexpanded @value command: maybe it
   4615 % will be set by the time it is read back in.
   4616 %
   4617 % NB flag names containing - or _ may not work here.
   4618 \def\dummyvalue#1{%
   4619   \expandafter\ifx\csname SET#1\endcsname\relax
   4620     \string\value{#1}%
   4621   \else
   4622     \csname SET#1\endcsname
   4623   \fi
   4624 }
   4625 
   4626 % Used for @value's in index entries to form the sort key: expand the @value
   4627 % if possible, otherwise sort late.
   4628 \def\indexnofontsvalue#1{%
   4629   \expandafter\ifx\csname SET#1\endcsname\relax
   4630     ZZZZZZZ%
   4631   \else
   4632     \csname SET#1\endcsname
   4633   \fi
   4634 }
   4635 
   4636 % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
   4637 % with @set.
   4638 %
   4639 % To get the special treatment we need for `@end ifset,' we call
   4640 % \makecond and then redefine.
   4641 %
   4642 \makecond{ifset}
   4643 \def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}}
   4644 \def\doifset#1#2{%
   4645   {%
   4646     \makevalueexpandable
   4647     \let\next=\empty
   4648     \expandafter\ifx\csname SET#2\endcsname\relax
   4649       #1% If not set, redefine \next.
   4650     \fi
   4651     \expandafter
   4652   }\next
   4653 }
   4654 \def\ifsetfail{\doignore{ifset}}
   4655 
   4656 % @ifclear VAR ... @end executes the `...' iff VAR has never been
   4657 % defined with @set, or has been undefined with @clear.
   4658 %
   4659 % The `\else' inside the `\doifset' parameter is a trick to reuse the
   4660 % above code: if the variable is not set, do nothing, if it is set,
   4661 % then redefine \next to \ifclearfail.
   4662 %
   4663 \makecond{ifclear}
   4664 \def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}}
   4665 \def\ifclearfail{\doignore{ifclear}}
   4666 
   4667 % @ifcommandisdefined CMD ... @end executes the `...' if CMD (written
   4668 % without the @) is in fact defined.  We can only feasibly check at the
   4669 % TeX level, so something like `mathcode' is going to considered
   4670 % defined even though it is not a Texinfo command.
   4671 %
   4672 \makecond{ifcommanddefined}
   4673 \def\ifcommanddefined{\parsearg{\doifcmddefined{\let\next=\ifcmddefinedfail}}}
   4674 %
   4675 \def\doifcmddefined#1#2{{%
   4676     \makevalueexpandable
   4677     \let\next=\empty
   4678     \expandafter\ifx\csname #2\endcsname\relax
   4679       #1% If not defined, \let\next as above.
   4680     \fi
   4681     \expandafter
   4682   }\next
   4683 }
   4684 \def\ifcmddefinedfail{\doignore{ifcommanddefined}}
   4685 
   4686 % @ifcommandnotdefined CMD ... handled similar to @ifclear above.
   4687 \makecond{ifcommandnotdefined}
   4688 \def\ifcommandnotdefined{%
   4689   \parsearg{\doifcmddefined{\else \let\next=\ifcmdnotdefinedfail}}}
   4690 \def\ifcmdnotdefinedfail{\doignore{ifcommandnotdefined}}
   4691 
   4692 % Set the `txicommandconditionals' variable, so documents have a way to
   4693 % test if the @ifcommand...defined conditionals are available.
   4694 \set txicommandconditionals
   4695 
   4696 % @dircategory CATEGORY  -- specify a category of the dir file
   4697 % which this file should belong to.  Ignore this in TeX.
   4698 \let\dircategory=\comment
   4699 
   4700 % @defininfoenclose.
   4701 \let\definfoenclose=\comment
   4702 
   4703 
   4704 \message{indexing,}
   4705 % Index generation facilities
   4706 
   4707 % Define \newwrite to be identical to plain tex's \newwrite
   4708 % except not \outer, so it can be used within macros and \if's.
   4709 \edef\newwrite{\makecsname{ptexnewwrite}}
   4710 
   4711 % \newindex {IX} defines an index named IX.
   4712 % It automatically defines \IXindex such that
   4713 % \IXindex ...rest of line... puts an entry in the index IX.
   4714 % It also defines \IXindfile to be the number of the output channel for
   4715 % the file that accumulates this index.  The file's extension is IX.
   4716 %
   4717 \def\newindex#1{%
   4718   \expandafter\chardef\csname#1indfile\endcsname=0
   4719   \expandafter\xdef\csname#1index\endcsname{%     % Define @#1index
   4720     \noexpand\doindex{#1}}
   4721 }
   4722 
   4723 % @defindex foo  ==  \newindex{foo}
   4724 %
   4725 \def\defindex{\parsearg\newindex}
   4726 
   4727 % Define @defcodeindex, like @defindex except put all entries in @code.
   4728 %
   4729 \def\defcodeindex{\parsearg\newcodeindex}
   4730 %
   4731 \def\newcodeindex#1{%
   4732   \expandafter\chardef\csname#1indfile\endcsname=0
   4733   \expandafter\xdef\csname#1index\endcsname{%
   4734     \noexpand\docodeindex{#1}}%
   4735 }
   4736 
   4737 % The default indices:
   4738 \newindex{cp}%      concepts,
   4739 \newcodeindex{fn}%  functions,
   4740 \newcodeindex{vr}%  variables,
   4741 \newcodeindex{tp}%  types,
   4742 \newcodeindex{ky}%  keys
   4743 \newcodeindex{pg}%  and programs.
   4744 
   4745 
   4746 % @synindex foo bar    makes index foo feed into index bar.
   4747 % Do this instead of @defindex foo if you don't want it as a separate index.
   4748 %
   4749 % @syncodeindex foo bar   similar, but put all entries made for index foo
   4750 % inside @code.
   4751 %
   4752 \def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}}
   4753 \def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}}
   4754 
   4755 % #1 is \doindex or \docodeindex, #2 the index getting redefined (foo),
   4756 % #3 the target index (bar).
   4757 \def\dosynindex#1#2#3{%
   4758   \requireopenindexfile{#3}%
   4759   % redefine \fooindfile:
   4760   \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname
   4761   \expandafter\let\csname#2indfile\endcsname=\temp
   4762   % redefine \fooindex:
   4763   \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}%
   4764 }
   4765 
   4766 % Define \doindex, the driver for all index macros.
   4767 % Argument #1 is generated by the calling \fooindex macro,
   4768 % and it is the two-letter name of the index.
   4769 
   4770 \def\doindex#1{\edef\indexname{#1}\parsearg\doindexxxx}
   4771 \def\doindexxxx #1{\doind{\indexname}{#1}}
   4772 
   4773 % like the previous two, but they put @code around the argument.
   4774 \def\docodeindex#1{\edef\indexname{#1}\parsearg\docodeindexxxx}
   4775 \def\docodeindexxxx #1{\docind{\indexname}{#1}}
   4776 
   4777 
   4778 % \definedummyword defines \#1 as \string\#1\space, thus effectively
   4779 % preventing its expansion.  This is used only for control words,
   4780 % not control letters, because the \space would be incorrect for
   4781 % control characters, but is needed to separate the control word
   4782 % from whatever follows.
   4783 %
   4784 % These can be used both for control words that take an argument and
   4785 % those that do not.  If it is followed by {arg} in the input, then
   4786 % that will dutifully get written to the index (or wherever).
   4787 %
   4788 % For control letters, we have \definedummyletter, which omits the
   4789 % space.
   4790 %
   4791 \def\definedummyword  #1{\def#1{\string#1\space}}%
   4792 \def\definedummyletter#1{\def#1{\string#1}}%
   4793 
   4794 % Used for the aux, toc and index files to prevent expansion of Texinfo
   4795 % commands.  Most of the commands are controlled through the
   4796 % \ifdummies conditional.
   4797 %
   4798 \def\atdummies{%
   4799   \dummiestrue
   4800   %
   4801   \definedummyletter\@%
   4802   \definedummyletter\ %
   4803   \definedummyletter\{%
   4804   \definedummyletter\}%
   4805   \definedummyletter\&%
   4806   %
   4807   \definedummyletter\_%
   4808   \definedummyletter\-%
   4809   %
   4810   \definedummyword\subentry
   4811   %
   4812   % We want to disable all macros so that they are not expanded by \write.
   4813   \let\commondummyword\definedummyword
   4814   \macrolist
   4815   \let\value\dummyvalue
   4816   %
   4817   \turnoffactive
   4818 }
   4819 
   4820 \newif\ifdummies
   4821 \newif\ifindexnofonts
   4822 
   4823 \def\commondummyletter#1{%
   4824   \expandafter\let\csname\string#1:impl\endcsname#1%
   4825   \edef#1{%
   4826     \noexpand\ifindexnofonts
   4827       % empty expansion
   4828     \noexpand\else
   4829       \noexpand\ifdummies\string#1%
   4830       \noexpand\else
   4831         \noexpand\jumptwofi % dispose of the \fi
   4832         \expandafter\noexpand\csname\string#1:impl\endcsname
   4833       \noexpand\fi
   4834     \noexpand\fi}%
   4835 }
   4836 
   4837 \def\commondummyaccent#1{%
   4838   \expandafter\let\csname\string#1:impl\endcsname#1%
   4839   \edef#1{%
   4840     \noexpand\ifindexnofonts
   4841       \noexpand\expandafter % dispose of \else ... \fi
   4842       \noexpand\asis
   4843     \noexpand\else
   4844       \noexpand\ifdummies\string#1%
   4845       \noexpand\else
   4846         \noexpand\jumptwofi % dispose of the \fi
   4847         \expandafter\noexpand\csname\string#1:impl\endcsname
   4848       \noexpand\fi
   4849     \noexpand\fi}%
   4850 }
   4851 
   4852 % Like \commondummyaccent but add a \space at the end of the dummy expansion
   4853 % #2 is the expansion used for \indexnofonts.  #2 is always followed by
   4854 % \asis to remove a pair of following braces.
   4855 \def\commondummyword#1#2{%
   4856   \expandafter\let\csname\string#1:impl\endcsname#1%
   4857   \expandafter\def\csname\string#1:ixnf\endcsname{#2\asis}%
   4858   \edef#1{%
   4859     \noexpand\ifindexnofonts
   4860       \noexpand\expandafter % dispose of \else ... \fi
   4861       \expandafter\noexpand\csname\string#1:ixnf\endcsname
   4862     \noexpand\else
   4863       \noexpand\ifdummies\string#1\space
   4864       \noexpand\else
   4865         \noexpand\jumptwofi % dispose of the \fi \fi
   4866         \expandafter\noexpand\csname\string#1:impl\endcsname
   4867       \noexpand\fi
   4868     \noexpand\fi}%
   4869 }
   4870 \def\jumptwofi#1\fi\fi{\fi\fi#1}
   4871 
   4872 % For \atdummies and \indexnofonts.  \atdummies sets
   4873 % \dummiestrue and \indexnofonts sets \indexnofontstrue.
   4874 \def\definedummies{
   4875   % @-sign is always an escape character when reading auxiliary files
   4876   \escapechar = `\@
   4877   %
   4878   \commondummyletter\!%
   4879   \commondummyaccent\"%
   4880   \commondummyaccent\'%
   4881   \commondummyletter\*%
   4882   \commondummyaccent\,%
   4883   \commondummyletter\.%
   4884   \commondummyletter\/%
   4885   \commondummyletter\:%
   4886   \commondummyaccent\=%
   4887   \commondummyletter\?%
   4888   \commondummyaccent\^%
   4889   \commondummyaccent\`%
   4890   \commondummyaccent\~%
   4891   %
   4892   % Control letters and accents.
   4893   \commondummyword\u          {}%
   4894   \commondummyword\v          {}%
   4895   \commondummyword\H          {}%
   4896   \commondummyword\dotaccent  {}%
   4897   \commondummyword\ogonek     {}%
   4898   \commondummyword\ringaccent {}%
   4899   \commondummyword\tieaccent  {}%
   4900   \commondummyword\ubaraccent {}%
   4901   \commondummyword\udotaccent {}%
   4902   \commondummyword\dotless    {}%
   4903   %
   4904   % Texinfo font commands.
   4905   \commondummyword\b          {}%
   4906   \commondummyword\i          {}%
   4907   \commondummyword\r          {}%
   4908   \commondummyword\sansserif  {}%
   4909   \commondummyword\sc         {}%
   4910   \commondummyword\slanted    {}%
   4911   \commondummyword\t          {}%
   4912   %
   4913   % Commands that take arguments.
   4914   \commondummyword\abbr       {}%
   4915   \commondummyword\acronym    {}%
   4916   \commondummyword\anchor     {}%
   4917   \commondummyword\cite       {}%
   4918   \commondummyword\code       {}%
   4919   \commondummyword\command    {}%
   4920   \commondummyword\dfn        {}%
   4921   \commondummyword\dmn        {}%
   4922   \commondummyword\email      {}%
   4923   \commondummyword\emph       {}%
   4924   \commondummyword\env        {}%
   4925   \commondummyword\file       {}%
   4926   \commondummyword\image      {}%
   4927   \commondummyword\indicateurl{}%
   4928   \commondummyword\inforef    {}%
   4929   \commondummyword\kbd        {}%
   4930   \commondummyword\key        {}%
   4931   \commondummyword\link       {}%
   4932   \commondummyword\math       {}%
   4933   \commondummyword\option     {}%
   4934   \commondummyword\pxref      {}%
   4935   \commondummyword\ref        {}%
   4936   \commondummyword\samp       {}%
   4937   \commondummyword\strong     {}%
   4938   \commondummyword\tie        {}%
   4939   \commondummyword\U          {}%
   4940   \commondummyword\uref       {}%
   4941   \commondummyword\url        {}%
   4942   \commondummyword\var        {}%
   4943   \commondummyword\verb       {}%
   4944   \commondummyword\w          {}%
   4945   \commondummyword\xref       {}%
   4946   %
   4947   \commondummyword\AA               {AA}%
   4948   \commondummyword\AE               {AE}%
   4949   \commondummyword\DH               {DZZ}%
   4950   \commondummyword\L                {L}%
   4951   \commondummyword\O                {O}%
   4952   \commondummyword\OE               {OE}%
   4953   \commondummyword\TH               {TH}%
   4954   \commondummyword\aa               {aa}%
   4955   \commondummyword\ae               {ae}%
   4956   \commondummyword\dh               {dzz}%
   4957   \commondummyword\exclamdown       {!}%
   4958   \commondummyword\l                {l}%
   4959   \commondummyword\o                {o}%
   4960   \commondummyword\oe               {oe}%
   4961   \commondummyword\ordf             {a}%
   4962   \commondummyword\ordm             {o}%
   4963   \commondummyword\questiondown     {?}%
   4964   \commondummyword\ss               {ss}%
   4965   \commondummyword\th               {th}%
   4966   %
   4967   \commondummyword\LaTeX            {LaTeX}%
   4968   \commondummyword\TeX              {TeX}%
   4969   %
   4970   % Assorted special characters.
   4971   \commondummyword\ampchar          {\normalamp}%
   4972   \commondummyword\atchar           {\@}%
   4973   \commondummyword\arrow            {->}%
   4974   \commondummyword\backslashchar    {\realbackslash}%
   4975   \commondummyword\bullet           {bullet}%
   4976   \commondummyword\comma            {,}%
   4977   \commondummyword\copyright        {copyright}%
   4978   \commondummyword\dots             {...}%
   4979   \commondummyword\enddots          {...}%
   4980   \commondummyword\entrybreak       {}%
   4981   \commondummyword\equiv            {===}%
   4982   \commondummyword\error            {error}%
   4983   \commondummyword\euro             {euro}%
   4984   \commondummyword\expansion        {==>}%
   4985   \commondummyword\geq              {>=}%
   4986   \commondummyword\guillemetleft    {<<}%
   4987   \commondummyword\guillemetright   {>>}%
   4988   \commondummyword\guilsinglleft    {<}%
   4989   \commondummyword\guilsinglright   {>}%
   4990   \commondummyword\lbracechar       {\{}%
   4991   \commondummyword\leq              {<=}%
   4992   \commondummyword\mathopsup        {sup}%
   4993   \commondummyword\minus            {-}%
   4994   \commondummyword\pounds           {pounds}%
   4995   \commondummyword\point            {.}%
   4996   \commondummyword\print            {-|}%
   4997   \commondummyword\quotedblbase     {"}%
   4998   \commondummyword\quotedblleft     {"}%
   4999   \commondummyword\quotedblright    {"}%
   5000   \commondummyword\quoteleft        {`}%
   5001   \commondummyword\quoteright       {'}%
   5002   \commondummyword\quotesinglbase   {,}%
   5003   \commondummyword\rbracechar       {\}}%
   5004   \commondummyword\registeredsymbol {R}%
   5005   \commondummyword\result           {=>}%
   5006   \commondummyword\sub              {}%
   5007   \commondummyword\sup              {}%
   5008   \commondummyword\textdegree       {o}%
   5009 }
   5010 
   5011 \let\indexlbrace\relax
   5012 \let\indexrbrace\relax
   5013 \let\indexatchar\relax
   5014 \let\indexbackslash\relax
   5015 
   5016 {\catcode`\@=0
   5017 \catcode`\\=13
   5018   @gdef@backslashdisappear{@def\{}}
   5019 }
   5020 
   5021 {
   5022 \catcode`\<=13
   5023 \catcode`\-=13
   5024 \catcode`\`=13
   5025   \gdef\indexnonalnumdisappear{%
   5026     \ifflagclear{txiindexlquoteignore}{}{%
   5027       % @set txiindexlquoteignore makes us ignore left quotes in the sort term.
   5028       % (Introduced for FSFS 2nd ed.)
   5029       \let`=\empty
   5030     }%
   5031     %
   5032     \ifflagclear{txiindexbackslashignore}{}{%
   5033       \backslashdisappear
   5034     }%
   5035     \ifflagclear{txiindexhyphenignore}{}{%
   5036       \def-{}%
   5037     }%
   5038     \ifflagclear{txiindexlessthanignore}{}{%
   5039       \def<{}%
   5040     }%
   5041     \ifflagclear{txiindexatsignignore}{}{%
   5042       \def\@{}%
   5043     }%
   5044   }
   5045 
   5046   \gdef\indexnonalnumreappear{%
   5047     \let-\normaldash
   5048     \let<\normalless
   5049   }
   5050 }
   5051 
   5052 
   5053 % \indexnofonts is used when outputting the strings to sort the index
   5054 % by, and when constructing control sequence names.  It eliminates all
   5055 % control sequences and just writes whatever the best ASCII sort string
   5056 % would be for a given command (usually its argument).
   5057 %
   5058 \def\indexnofonts{%
   5059   \indexnofontstrue
   5060   %
   5061   \def\ { }%
   5062   \def\@{@}%
   5063   \def\_{\normalunderscore}%
   5064   \def\-{}% @- shouldn't affect sorting
   5065   %
   5066   \uccode`\1=`\{ \uppercase{\def\{{1}}%
   5067   \uccode`\1=`\} \uppercase{\def\}{1}}%
   5068   \let\lbracechar\{%
   5069   \let\rbracechar\}%
   5070   %
   5071   %
   5072   % We need to get rid of all macros, leaving only the arguments (if present).
   5073   % Of course this is not nearly correct, but it is the best we can do for now.
   5074   %
   5075   % Since macro invocations are followed by braces, we can just redefine them
   5076   % to take a single TeX argument.  The case of a macro invocation that
   5077   % goes to end-of-line is not handled.
   5078   %
   5079   \def\commondummyword##1{\let##1\asis}%
   5080   \macrolist
   5081   \let\value\indexnofontsvalue
   5082 }
   5083 
   5084 
   5085 
   5086 
   5087 % #1 is the index name, #2 is the entry text.
   5088 \def\doind#1#2{%
   5089   \iflinks
   5090   {%
   5091     %
   5092     \requireopenindexfile{#1}%
   5093     \edef\writeto{\csname#1indfile\endcsname}%
   5094     %
   5095     \def\indextext{#2}%
   5096     \safewhatsit\doindwrite
   5097   }%
   5098   \fi
   5099 }
   5100 
   5101 % Same as \doind, but for code indices
   5102 \def\docind#1#2{%
   5103   \iflinks
   5104   {%
   5105     %
   5106     \requireopenindexfile{#1}%
   5107     \edef\writeto{\csname#1indfile\endcsname}%
   5108     %
   5109     \def\indextext{#2}%
   5110     \safewhatsit\docindwrite
   5111   }%
   5112   \fi
   5113 }
   5114 
   5115 % Check if an index file has been opened, and if not, open it.
   5116 \def\requireopenindexfile#1{%
   5117 \ifnum\csname #1indfile\endcsname=0
   5118   \expandafter\newwrite \csname#1indfile\endcsname
   5119   \edef\suffix{#1}%
   5120   % A .fls suffix would conflict with the file extension for the output
   5121   % of -recorder, so use .f1s instead.
   5122   \ifx\suffix\indexisfl\def\suffix{f1}\fi
   5123   % Open the file
   5124   \immediate\openout\csname#1indfile\endcsname \jobname.\suffix
   5125   % Using \immediate above here prevents an object entering into the current
   5126   % box, which could confound checks such as those in \safewhatsit for
   5127   % preceding skips.
   5128   \typeout{Writing index file \jobname.\suffix}%
   5129 \fi}
   5130 \def\indexisfl{fl}
   5131 
   5132 % Definition for writing index entry sort key.
   5133 {
   5134 \catcode`\-=13
   5135 \gdef\indexwritesortas{%
   5136   \begingroup
   5137   \indexnonalnumreappear
   5138   \indexwritesortasxxx}
   5139 \gdef\indexwritesortasxxx#1{%
   5140   \xdef\indexsortkey{#1}\endgroup}
   5141 }
   5142 
   5143 \def\indexwriteseealso#1{
   5144   \gdef\pagenumbertext{\string\seealso{#1}}%
   5145 }
   5146 \def\indexwriteseeentry#1{
   5147   \gdef\pagenumbertext{\string\seeentry{#1}}%
   5148 }
   5149 
   5150 % The default definitions
   5151 \def\sortas#1{}%
   5152 \def\seealso#1{\i{\putwordSeeAlso}\ #1}% for sorted index file only
   5153 \def\putwordSeeAlso{See also}
   5154 \def\seeentry#1{\i{\putwordSee}\ #1}% for sorted index file only
   5155 
   5156 
   5157 % Given index entry text like "aaa @subentry bbb @sortas{ZZZ}":
   5158 %   * Set \bracedtext to "{aaa}{bbb}"
   5159 %   * Set \fullindexsortkey to "aaa @subentry ZZZ"
   5160 %   * If @seealso occurs, set \pagenumbertext
   5161 %
   5162 \def\splitindexentry#1{%
   5163   \gdef\fullindexsortkey{}%
   5164   \xdef\bracedtext{}%
   5165   \def\sep{}%
   5166   \def\seealso##1{}%
   5167   \def\seeentry##1{}%
   5168   \expandafter\doindexsegment#1\subentry\finish\subentry
   5169 }
   5170 
   5171 % append the results from the next segment
   5172 \def\doindexsegment#1\subentry{%
   5173   \def\segment{#1}%
   5174   \ifx\segment\isfinish
   5175   \else
   5176     %
   5177     % Fully expand the segment, throwing away any @sortas directives, and
   5178     % trim spaces.
   5179     \edef\trimmed{\segment}%
   5180     \edef\trimmed{\expandafter\eatspaces\expandafter{\trimmed}}%
   5181     \ifincodeindex
   5182       \edef\trimmed{\noexpand\code{\trimmed}}%
   5183     \fi
   5184     %
   5185     \xdef\bracedtext{\bracedtext{\trimmed}}%
   5186     %
   5187     % Get the string to sort by.  Process the segment with all
   5188     % font commands turned off.
   5189     \bgroup
   5190       \let\sortas\indexwritesortas
   5191       \let\seealso\indexwriteseealso
   5192       \let\seeentry\indexwriteseeentry
   5193       \indexnofonts
   5194       % The braces around the commands are recognized by texindex.
   5195       \def\lbracechar{{\string\indexlbrace}}%
   5196       \def\rbracechar{{\string\indexrbrace}}%
   5197       \let\{=\lbracechar
   5198       \let\}=\rbracechar
   5199       \def\@{{\string\indexatchar}}%
   5200       \def\atchar##1{\@}%
   5201       \def\backslashchar{{\string\indexbackslash}}%
   5202       \uccode`\~=`\\ \uppercase{\let~\backslashchar}%
   5203       %
   5204       \let\indexsortkey\empty
   5205       \global\let\pagenumbertext\empty
   5206       % Execute the segment and throw away the typeset output.  This executes
   5207       % any @sortas or @seealso commands in this segment.
   5208       \setbox\dummybox = \hbox{\segment}%
   5209       \ifx\indexsortkey\empty{%
   5210         \indexnonalnumdisappear
   5211         \xdef\trimmed{\segment}%
   5212         \xdef\trimmed{\expandafter\eatspaces\expandafter{\trimmed}}%
   5213         \xdef\indexsortkey{\trimmed}%
   5214         \ifx\indexsortkey\empty
   5215           \message{Empty index sort key near line \the\inputlineno}%
   5216           \xdef\indexsortkey{ }%
   5217         \fi
   5218       }\fi
   5219       %
   5220       % Append to \fullindexsortkey.
   5221       \edef\tmp{\gdef\noexpand\fullindexsortkey{%
   5222                   \fullindexsortkey\sep\indexsortkey}}%
   5223       \tmp
   5224     \egroup
   5225     \def\sep{\subentry}%
   5226     %
   5227     \expandafter\doindexsegment
   5228   \fi
   5229 }
   5230 \def\isfinish{\finish}%
   5231 \newbox\dummybox % used above
   5232 
   5233 \let\subentry\relax
   5234 
   5235 % Use \ instead of @ in index files.  To support old texi2dvi and texindex.
   5236 % This works without changing the escape character used in the toc or aux
   5237 % files because the index entries are fully expanded here, and \string uses
   5238 % the current value of \escapechar.
   5239 \def\escapeisbackslash{\escapechar=`\\}
   5240 
   5241 % Uncomment to use \ in index files by default.  Old texi2dvi (before 2019)
   5242 % didn't support @ as the escape character (as it checked for "\entry" in
   5243 % the files, and not "@entry").
   5244 %   In the future we can remove this flag and simplify the code for
   5245 % index files and backslashes, once the support is no longer likely to be
   5246 % useful.
   5247 %
   5248 % \set txiindexescapeisbackslash
   5249 
   5250 % Write the entry in \indextext to the index file.
   5251 %
   5252 
   5253 \newif\ifincodeindex
   5254 \def\doindwrite{\incodeindexfalse\doindwritex}
   5255 \def\docindwrite{\incodeindextrue\doindwritex}
   5256 
   5257 \def\doindwritex{%
   5258   \maybemarginindex
   5259   %
   5260   \atdummies
   5261   %
   5262   \ifflagclear{txiindexescapeisbackslash}{}{\escapeisbackslash}%
   5263   %
   5264   % For texindex which always views { and } as separators.
   5265   \def\{{\lbracechar{}}%
   5266   \def\}{\rbracechar{}}%
   5267   \uccode`\~=`\\ \uppercase{\def~{\backslashchar{}}}%
   5268   %
   5269   % Split the entry into primary entry and any subentries, and get the index
   5270   % sort key.
   5271   \splitindexentry\indextext
   5272   %
   5273   % Set up the complete index entry, with both the sort key and
   5274   % the original text, including any font commands.  We write
   5275   % three arguments to \entry to the .?? file (four in the
   5276   % subentry case), texindex reduces to two when writing the .??s
   5277   % sorted result.
   5278   %
   5279   \edef\temp{%
   5280     \write\writeto{%
   5281       \string\entry{\fullindexsortkey}%
   5282         {\ifx\pagenumbertext\empty\noexpand\folio\else\pagenumbertext\fi}%
   5283         \bracedtext}%
   5284   }%
   5285   \temp
   5286 }
   5287 
   5288 % Put the index entry in the margin if desired (undocumented).
   5289 \def\maybemarginindex{%
   5290   \ifx\SETmarginindex\relax\else
   5291     \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \relax\indextext}}%
   5292   \fi
   5293 }
   5294 \let\SETmarginindex=\relax
   5295 
   5296 
   5297 % Take care of unwanted page breaks/skips around a whatsit:
   5298 %
   5299 % If a skip is the last thing on the list now, preserve it
   5300 % by backing up by \lastskip, doing the \write, then inserting
   5301 % the skip again.  Otherwise, the whatsit generated by the
   5302 % \write or \pdfdest will make \lastskip zero.  The result is that
   5303 % sequences like this:
   5304 % @end defun
   5305 % @tindex whatever
   5306 % @defun ...
   5307 % will have extra space inserted, because the \medbreak in the
   5308 % start of the @defun won't see the skip inserted by the @end of
   5309 % the previous defun.
   5310 %
   5311 % But don't do any of this if we're not in vertical mode.  We
   5312 % don't want to do a \vskip and prematurely end a paragraph.
   5313 %
   5314 % Avoid page breaks due to these extra skips, too.
   5315 %
   5316 % But wait, there is a catch there:
   5317 % We'll have to check whether \lastskip is zero skip.  \ifdim is not
   5318 % sufficient for this purpose, as it ignores stretch and shrink parts
   5319 % of the skip.  The only way seems to be to check the textual
   5320 % representation of the skip.
   5321 %
   5322 % The following is almost like \def\zeroskipmacro{0.0pt} except that
   5323 % the ``p'' and ``t'' characters have catcode \other, not 11 (letter).
   5324 %
   5325 \edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname}
   5326 %
   5327 \newskip\whatsitskip
   5328 \newcount\whatsitpenalty
   5329 %
   5330 % ..., ready, GO:
   5331 %
   5332 \def\safewhatsit#1{\ifhmode
   5333   #1%
   5334  \else
   5335   % \lastskip and \lastpenalty cannot both be nonzero simultaneously.
   5336   \whatsitskip = \lastskip
   5337   \edef\lastskipmacro{\the\lastskip}%
   5338   \whatsitpenalty = \lastpenalty
   5339   %
   5340   % If \lastskip is nonzero, that means the last item was a
   5341   % skip.  And since a skip is discardable, that means this
   5342   % -\whatsitskip glue we're inserting is preceded by a
   5343   % non-discardable item, therefore it is not a potential
   5344   % breakpoint, therefore no \nobreak needed.
   5345   \ifx\lastskipmacro\zeroskipmacro
   5346   \else
   5347     \vskip-\whatsitskip
   5348   \fi
   5349   %
   5350   #1%
   5351   %
   5352   \ifx\lastskipmacro\zeroskipmacro
   5353     % If \lastskip was zero, perhaps the last item was a penalty, and
   5354     % perhaps it was >=10000, e.g., a \nobreak.  In that case, we want
   5355     % to re-insert the same penalty (values >10000 are used for various
   5356     % signals); since we just inserted a non-discardable item, any
   5357     % following glue (such as a \parskip) would be a breakpoint.  For example:
   5358     %   @deffn deffn-whatever
   5359     %   @vindex index-whatever
   5360     %   Description.
   5361     % would allow a break between the index-whatever whatsit
   5362     % and the "Description." paragraph.
   5363     \ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi
   5364   \else
   5365     % On the other hand, if we had a nonzero \lastskip,
   5366     % this make-up glue would be preceded by a non-discardable item
   5367     % (the whatsit from the \write), so we must insert a \nobreak.
   5368     \nobreak\vskip\whatsitskip
   5369   \fi
   5370 \fi}
   5371 
   5372 % The index entry written in the file actually looks like
   5373 %  \entry {sortstring}{page}{topic}
   5374 % or
   5375 %  \entry {sortstring}{page}{topic}{subtopic}
   5376 % The texindex program reads in these files and writes files
   5377 % containing these kinds of lines:
   5378 %  \initial {c}
   5379 %     before the first topic whose initial is c
   5380 %  \entry {topic}{pagelist}
   5381 %     for a topic that is used without subtopics
   5382 %  \primary {topic}
   5383 %  \entry {topic}{}
   5384 %     for the beginning of a topic that is used with subtopics
   5385 %  \secondary {subtopic}{pagelist}
   5386 %     for each subtopic.
   5387 %  \secondary {subtopic}{}
   5388 %     for a subtopic with sub-subtopics
   5389 %  \tertiary {subtopic}{subsubtopic}{pagelist}
   5390 %     for each sub-subtopic.
   5391 
   5392 % Define the user-accessible indexing commands
   5393 % @findex, @vindex, @kindex, @cindex.
   5394 
   5395 \def\findex {\fnindex}
   5396 \def\kindex {\kyindex}
   5397 \def\cindex {\cpindex}
   5398 \def\vindex {\vrindex}
   5399 \def\tindex {\tpindex}
   5400 \def\pindex {\pgindex}
   5401 
   5402 % Define the macros used in formatting output of the sorted index material.
   5403 
   5404 % @printindex causes a particular index (the ??s file) to get printed.
   5405 % It does not print any chapter heading (usually an @unnumbered).
   5406 %
   5407 \parseargdef\printindex{\begingroup
   5408   \dobreak \chapheadingskip{10000}%
   5409   %
   5410   \smallfonts \rm
   5411   \tolerance = 9500
   5412   \plainfrenchspacing
   5413   \everypar = {}% don't want the \kern\-parindent from indentation suppression.
   5414   %
   5415   % See comment in \requireopenindexfile.
   5416   \def\indexname{#1}\ifx\indexname\indexisfl\def\indexname{f1}\fi
   5417   %
   5418   % See if the index file exists and is nonempty.
   5419   \openin 1 \jobname.\indexname s
   5420   \ifeof 1
   5421     % \enddoublecolumns gets confused if there is no text in the index,
   5422     % and it loses the chapter title and the aux file entries for the
   5423     % index.  The easiest way to prevent this problem is to make sure
   5424     % there is some text.
   5425     \putwordIndexNonexistent
   5426     \typeout{No file \jobname.\indexname s.}%
   5427   \else
   5428     % If the index file exists but is empty, then \openin leaves \ifeof
   5429     % false.  We have to make TeX try to read something from the file, so
   5430     % it can discover if there is anything in it.
   5431     \read 1 to \thisline
   5432     \ifeof 1
   5433       \putwordIndexIsEmpty
   5434     \else
   5435       \expandafter\printindexzz\thisline\relax\relax\finish%
   5436     \fi
   5437   \fi
   5438   \closein 1
   5439 \endgroup}
   5440 
   5441 % If the index file starts with a backslash, forgo reading the index
   5442 % file altogether.  If somebody upgrades texinfo.tex they may still have
   5443 % old index files using \ as the escape character.  Reading this would
   5444 % at best lead to typesetting garbage, at worst a TeX syntax error.
   5445 \def\printindexzz#1#2\finish{%
   5446   \ifflagclear{txiindexescapeisbackslash}{%
   5447     \uccode`\~=`\\ \uppercase{\if\noexpand~}\noexpand#1
   5448       \ifflagclear{txiskipindexfileswithbackslash}{%
   5449 \errmessage{%
   5450 ERROR: A sorted index file in an obsolete format was skipped.
   5451 To fix this problem, please upgrade your version of 'texi2dvi'
   5452 or 'texi2pdf' to that at <https://ftp.gnu.org/gnu/texinfo>.
   5453 If you are using an old version of 'texindex' (part of the Texinfo
   5454 distribution), you may also need to upgrade to a newer version (at least 6.0).
   5455 You may be able to typeset the index if you run
   5456 'texindex \jobname.\indexname' yourself.
   5457 You could also try setting the 'txiindexescapeisbackslash' flag by
   5458 running a command like
   5459 'texi2dvi -t "@set txiindexescapeisbackslash" \jobname.texi'.  If you do
   5460 this, Texinfo will try to use index files in the old format.
   5461 If you continue to have problems, deleting the index files and starting again
   5462 might help (with 'rm \jobname.?? \jobname.??s')%
   5463 }%
   5464       }{%
   5465         (Skipped sorted index file in obsolete format)
   5466       }%
   5467     \else
   5468       \begindoublecolumns
   5469       \input \jobname.\indexname s
   5470       \enddoublecolumns
   5471     \fi
   5472   }{%
   5473     \begindoublecolumns
   5474     \catcode`\\=0\relax
   5475     %
   5476     % Make @ an escape character to give macros a chance to work.  This
   5477     % should work because we (hopefully) don't otherwise use @ in index files.
   5478     %\catcode`\@=12\relax
   5479     \catcode`\@=0\relax
   5480     \input \jobname.\indexname s
   5481     \enddoublecolumns
   5482   }%
   5483 }
   5484 
   5485 % These macros are used by the sorted index file itself.
   5486 % Change them to control the appearance of the index.
   5487 
   5488 {\catcode`\/=13 \catcode`\-=13 \catcode`\^=13 \catcode`\~=13 \catcode`\_=13
   5489 \catcode`\|=13 \catcode`\<=13 \catcode`\>=13 \catcode`\+=13 \catcode`\"=13
   5490 \catcode`\$=3
   5491 \gdef\initialglyphs{%
   5492   % special control sequences used in the index sort key
   5493   \let\indexlbrace\{%
   5494   \let\indexrbrace\}%
   5495   \let\indexatchar\@%
   5496   \def\indexbackslash{\math{\backslash}}%
   5497   %
   5498   % Some changes for non-alphabetic characters.  Using the glyphs from the
   5499   % math fonts looks more consistent than the typewriter font used elsewhere
   5500   % for these characters.
   5501   \uccode`\~=`\\ \uppercase{\def~{\math{\backslash}}}
   5502   %
   5503   % In case @\ is used for backslash
   5504   \uppercase{\let\\=~}
   5505   % Can't get bold backslash so don't use bold forward slash
   5506   \catcode`\/=13
   5507   \def/{{\secrmnotbold \normalslash}}%
   5508   \def-{{\normaldash\normaldash}}% en dash `--'
   5509   \def^{{\chapbf \normalcaret}}%
   5510   \def~{{\chapbf \normaltilde}}%
   5511   \def\_{%
   5512      \leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }%
   5513   \def|{$\vert$}%
   5514   \def<{$\less$}%
   5515   \def>{$\gtr$}%
   5516   \def+{$\normalplus$}%
   5517 }}
   5518 
   5519 \def\initial{%
   5520   \bgroup
   5521   \initialglyphs
   5522   \initialx
   5523 }
   5524 
   5525 \def\initialx#1{%
   5526   % Remove any glue we may have, we'll be inserting our own.
   5527   \removelastskip
   5528   %
   5529   % We like breaks before the index initials, so insert a bonus.
   5530   % The glue before the bonus allows a little bit of space at the
   5531   % bottom of a column to reduce an increase in inter-line spacing.
   5532   \nobreak
   5533   \vskip 0pt plus 5\baselineskip
   5534   \penalty -300
   5535   \vskip 0pt plus -5\baselineskip
   5536   %
   5537   % Typeset the initial.  Making this add up to a whole number of
   5538   % baselineskips increases the chance of the dots lining up from column
   5539   % to column.  It still won't often be perfect, because of the stretch
   5540   % we need before each entry, but it's better.
   5541   %
   5542   % No shrink because it confuses \balancecolumns.
   5543   \vskip 1.67\baselineskip plus 1\baselineskip
   5544   \leftline{\secfonts \kern-0.05em \secbf #1}%
   5545   % \secfonts is inside the argument of \leftline so that the change of
   5546   % \baselineskip will not affect any glue inserted before the vbox that
   5547   % \leftline creates.
   5548   % Do our best not to break after the initial.
   5549   \nobreak
   5550   \vskip .33\baselineskip plus .1\baselineskip
   5551   \egroup % \initialglyphs
   5552 }
   5553 
   5554 \newdimen\entryrightmargin
   5555 \entryrightmargin=0pt
   5556 
   5557 % amount to indent subsequent lines in an entry when it spans more than
   5558 % one line.
   5559 \newdimen\entrycontskip
   5560 \entrycontskip=1em
   5561 
   5562 % for PDF output, whether to make the text of the entry a link to the page
   5563 % number.  set for @contents and @shortcontents where there is only one
   5564 % page number.
   5565 \newif\iflinkentrytext
   5566 
   5567 % \entry typesets a paragraph consisting of the text (#1), dot leaders, and
   5568 % then page number (#2) flushed to the right margin.  It is used for index
   5569 % and table of contents entries.  The paragraph is indented by \leftskip.
   5570 %
   5571 \def\entry{%
   5572   \begingroup
   5573     %
   5574     % Start a new paragraph if necessary, so our assignments below can't
   5575     % affect previous text.
   5576     \par
   5577     %
   5578     % No extra space above this paragraph.
   5579     \parskip = 0in
   5580     %
   5581     % When reading the text of entry, convert explicit line breaks
   5582     % from @* into spaces.  The user might give these in long section
   5583     % titles, for instance.
   5584     \def\*{\unskip\space\ignorespaces}%
   5585     \def\entrybreak{\hfil\break}% An undocumented command
   5586     %
   5587     % Swallow the left brace of the text (first parameter):
   5588     \afterassignment\doentry
   5589     \let\temp =
   5590 }
   5591 \def\entrybreak{\unskip\space\ignorespaces}%
   5592 \def\doentry{%
   5593     % Save the text of the entry in \boxA
   5594     \global\setbox\boxA=\hbox\bgroup
   5595     \bgroup % Instead of the swallowed brace.
   5596       \noindent
   5597       \aftergroup\finishentry
   5598       % And now comes the text of the entry.
   5599       % Not absorbing as a macro argument reduces the chance of problems
   5600       % with catcodes occurring.
   5601 }
   5602 {\catcode`\@=11
   5603 % #1 is the page number
   5604 \gdef\finishentry#1{%
   5605     \egroup % end \boxA
   5606     \dimen@ = \wd\boxA % Length of text of entry
   5607     % add any leaders and page number to \boxA.
   5608     \global\setbox\boxA=\hbox\bgroup
   5609       \ifpdforxetex
   5610         \iflinkentrytext
   5611           \pdflinkpage{#1}{\unhbox\boxA}%
   5612         \else
   5613           \unhbox\boxA
   5614         \fi
   5615       \else
   5616         \unhbox\boxA
   5617       \fi
   5618       %
   5619       % Get the width of the page numbers, and only use
   5620       % leaders if they are present.
   5621       \global\setbox\boxB = \hbox{#1}%
   5622       \ifdim\wd\boxB = 0pt
   5623         \null\nobreak\hfill\ %
   5624       \else
   5625         %
   5626         \null\nobreak\indexdotfill % Have leaders before the page number.
   5627         %
   5628         \ifpdforxetex
   5629           \pdfgettoks#1.%
   5630           \hskip\skip\thinshrinkable\the\toksA
   5631         \else
   5632           \hskip\skip\thinshrinkable #1%
   5633         \fi
   5634       \fi
   5635     \egroup % end \boxA
   5636     %
   5637     % now output
   5638     \ifdim\wd\boxB = 0pt
   5639       \noindent\unhbox\boxA\par
   5640       \nobreak
   5641     \else\bgroup
   5642       % We want the text of the entries to be aligned to the left, and the
   5643       % page numbers to be aligned to the right.
   5644       %
   5645       \parindent = 0pt
   5646       \advance\leftskip by 0pt plus 1fil
   5647       \advance\leftskip by 0pt plus -1fill
   5648       \rightskip = 0pt plus -1fil
   5649       \advance\rightskip by 0pt plus 1fill
   5650       % Cause last line, which could consist of page numbers on their own
   5651       % if the list of page numbers is long, to be aligned to the right.
   5652       \parfillskip=0pt plus -1fill
   5653       %
   5654       \advance\rightskip by \entryrightmargin
   5655       %
   5656       \dimen@ii = \hsize
   5657       \advance\dimen@ii by -1\leftskip
   5658       \advance\dimen@ii by -1\entryrightmargin
   5659       \ifdim\wd\boxA > \dimen@ii % If the entry doesn't fit in one line
   5660       \ifdim\dimen@ > 0.8\dimen@ii   % due to long index text
   5661         \advance\leftskip by 0pt plus 1fill % ragged right
   5662         %
   5663         % Indent all lines but the first one.
   5664         \advance\leftskip by \entrycontskip
   5665         \advance\parindent by -\entrycontskip
   5666       \fi\fi
   5667       \indent % start paragraph
   5668       \unhbox\boxA
   5669       %
   5670       % Do not prefer a separate line ending with a hyphen to fewer lines.
   5671       \finalhyphendemerits = 0
   5672       %
   5673       % Word spacing - no stretch
   5674       \spaceskip=\fontdimen2\font minus \fontdimen4\font
   5675       %
   5676       \linepenalty=1000  % Discourage line breaks.
   5677       \hyphenpenalty=5000  % Discourage hyphenation.
   5678       %
   5679       \par % format the paragraph
   5680     \egroup % The \vbox
   5681     \fi
   5682   \endgroup
   5683 }}
   5684 
   5685 \newskip\thinshrinkable
   5686 \skip\thinshrinkable=.15em minus .15em
   5687 
   5688 % Like plain.tex's \dotfill, except uses up at least 0.5 em.
   5689 % The filll stretch here overpowers both the fil and fill stretch to push
   5690 % the page number to the right.
   5691 \def\indexdotfill{\cleaders
   5692   \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 0.5em plus 1filll}
   5693 
   5694 \def\primary #1{\line{#1\hfil}}
   5695 
   5696 \def\secondary{\indententry{0.5cm}}
   5697 \def\tertiary{\indententry{1cm}}
   5698 
   5699 \def\indententry#1#2#3{%
   5700   \bgroup
   5701   \leftskip=#1
   5702   \entry{#2}{#3}%
   5703   \egroup
   5704 }
   5705 
   5706 % Define two-column mode, which we use to typeset indexes.
   5707 % Adapted from the TeXbook, page 416, which is to say,
   5708 % the manmac.tex format used to print the TeXbook itself.
   5709 \catcode`\@=11  % private names
   5710 
   5711 \newbox\partialpage
   5712 \newdimen\doublecolumnhsize
   5713 
   5714 \def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
   5715   % If not much space left on page, start a new page.
   5716   \ifdim\pagetotal>0.8\vsize\vfill\eject\fi
   5717   %
   5718   % Grab any single-column material above us.
   5719   \output = {%
   5720     \savetopmark
   5721     %
   5722     \global\setbox\partialpage = \vbox{%
   5723       % Unvbox the main output page.
   5724       \unvbox\PAGE
   5725       \kern-\topskip \kern\baselineskip
   5726     }%
   5727   }%
   5728   \eject % run that output routine to set \partialpage
   5729   %
   5730   % Use the double-column output routine for subsequent pages.
   5731   \output = {\doublecolumnout}%
   5732   %
   5733   % Change the page size parameters.  We could do this once outside this
   5734   % routine, in each of @smallbook, @afourpaper, and the default 8.5x11
   5735   % format, but then we repeat the same computation.  Repeating a couple
   5736   % of assignments once per index is clearly meaningless for the
   5737   % execution time, so we may as well do it in one place.
   5738   %
   5739   % First we halve the line length, less a little for the gutter between
   5740   % the columns.  We compute the gutter based on the line length, so it
   5741   % changes automatically with the paper format.  The magic constant
   5742   % below is chosen so that the gutter has the same value (well, +-<1pt)
   5743   % as it did when we hard-coded it.
   5744   %
   5745   % We put the result in a separate register, \doublecolumnhsize, so we
   5746   % can restore it in \pagesofar, after \hsize itself has (potentially)
   5747   % been clobbered.
   5748   %
   5749   \doublecolumnhsize = \hsize
   5750     \advance\doublecolumnhsize by -.04154\hsize
   5751     \divide\doublecolumnhsize by 2
   5752   \hsize = \doublecolumnhsize
   5753   %
   5754   % Get the available space for the double columns -- the normal
   5755   % (undoubled) page height minus any material left over from the
   5756   % previous page.
   5757   \advance\vsize by -\ht\partialpage
   5758   \vsize = 2\vsize
   5759   %
   5760   % For the benefit of balancing columns
   5761   \advance\baselineskip by 0pt plus 0.5pt
   5762 }
   5763 
   5764 % The double-column output routine for all double-column pages except
   5765 % the last, which is done by \balancecolumns.
   5766 %
   5767 \def\doublecolumnout{%
   5768   %
   5769   \savetopmark
   5770   \splittopskip=\topskip \splitmaxdepth=\maxdepth
   5771   \dimen@ = \vsize
   5772   \divide\dimen@ by 2
   5773   %
   5774   % box0 will be the left-hand column, box2 the right.
   5775   \setbox0=\vsplit\PAGE to\dimen@ \setbox2=\vsplit\PAGE to\dimen@
   5776   \global\advance\vsize by 2\ht\partialpage
   5777   \onepageout\pagesofar % empty except for the first time we are called
   5778   \unvbox\PAGE
   5779   \penalty\outputpenalty
   5780 }
   5781 %
   5782 % Re-output the contents of the output page -- any previous material,
   5783 % followed by the two boxes we just split, in box0 and box2.
   5784 \def\pagesofar{%
   5785   \unvbox\partialpage
   5786   %
   5787   \hsize = \doublecolumnhsize
   5788   \wd0=\hsize \wd2=\hsize
   5789   \hbox to\txipagewidth{\box0\hfil\box2}%
   5790 }
   5791 
   5792 
   5793 % Finished with double columns.
   5794 \def\enddoublecolumns{%
   5795   % The following penalty ensures that the page builder is exercised
   5796   % _before_ we change the output routine.  This is necessary in the
   5797   % following situation:
   5798   %
   5799   % The last section of the index consists only of a single entry.
   5800   % Before this section, \pagetotal is less than \pagegoal, so no
   5801   % break occurs before the last section starts.  However, the last
   5802   % section, consisting of \initial and the single \entry, does not
   5803   % fit on the page and has to be broken off.  Without the following
   5804   % penalty the page builder will not be exercised until \eject
   5805   % below, and by that time we'll already have changed the output
   5806   % routine to the \balancecolumns version, so the next-to-last
   5807   % double-column page will be processed with \balancecolumns, which
   5808   % is wrong:  The two columns will go to the main vertical list, with
   5809   % the broken-off section in the recent contributions.  As soon as
   5810   % the output routine finishes, TeX starts reconsidering the page
   5811   % break.  The two columns and the broken-off section both fit on the
   5812   % page, because the two columns now take up only half of the page
   5813   % goal.  When TeX sees \eject from below which follows the final
   5814   % section, it invokes the new output routine that we've set after
   5815   % \balancecolumns below; \onepageout will try to fit the two columns
   5816   % and the final section into the vbox of \txipageheight (see
   5817   % \pagebody), causing an overfull box.
   5818   %
   5819   % Note that glue won't work here, because glue does not exercise the
   5820   % page builder, unlike penalties (see The TeXbook, pp. 280-281).
   5821   \penalty0
   5822   %
   5823   \output = {%
   5824     % Split the last of the double-column material.
   5825     \savetopmark
   5826     \balancecolumns
   5827   }%
   5828   \eject % call the \output just set
   5829   \ifdim\pagetotal=0pt
   5830     % Having called \balancecolumns once, we do not
   5831     % want to call it again.  Therefore, reset \output to its normal
   5832     % definition right away.
   5833     \global\output=\expandafter{\the\defaultoutput}
   5834     %
   5835     \endgroup % started in \begindoublecolumns
   5836     % Leave the double-column material on the current page, no automatic
   5837     % page break.
   5838     \box\balancedcolumns
   5839     %
   5840     % \pagegoal was set to the doubled \vsize above, since we restarted
   5841     % the current page.  We're now back to normal single-column
   5842     % typesetting, so reset \pagegoal to the normal \vsize.
   5843     \global\vsize = \txipageheight %
   5844     \pagegoal = \txipageheight %
   5845   \else
   5846     % We had some left-over material.  This might happen when \doublecolumnout
   5847     % is called in \balancecolumns.  Try again.
   5848     \expandafter\enddoublecolumns
   5849   \fi
   5850 }
   5851 \newbox\balancedcolumns
   5852 \setbox\balancedcolumns=\vbox{shouldnt see this}%
   5853 %
   5854 % Only called for the last of the double column material.  \doublecolumnout
   5855 % does the others.
   5856 \def\balancecolumns{%
   5857   \setbox0 = \vbox{\unvbox\PAGE}% like \box255 but more efficient, see p.120.
   5858   \dimen@ = \ht0
   5859   \ifdim\dimen@<7\baselineskip
   5860     % Don't split a short final column in two.
   5861     \setbox2=\vbox{}%
   5862     \global\setbox\balancedcolumns=\vbox{\pagesofar}%
   5863   \else
   5864     % double the leading vertical space
   5865     \advance\dimen@ by \topskip
   5866     \advance\dimen@ by-\baselineskip
   5867     \divide\dimen@ by 2 % target to split to
   5868     \dimen@ii = \dimen@
   5869     \splittopskip = \topskip
   5870     % Loop until left column is at least as high as the right column.
   5871     {%
   5872       \vbadness = 10000
   5873       \loop
   5874         \global\setbox3 = \copy0
   5875         \global\setbox1 = \vsplit3 to \dimen@
   5876       \ifdim\ht1<\ht3
   5877         \global\advance\dimen@ by 1pt
   5878       \repeat
   5879     }%
   5880     % Now the left column is in box 1, and the right column in box 3.
   5881     %
   5882     % Check whether the left column has come out higher than the page itself.
   5883     % (Note that we have doubled \vsize for the double columns, so
   5884     % the actual height of the page is 0.5\vsize).
   5885     \ifdim2\ht1>\vsize
   5886       % It appears that we have been called upon to balance too much material.
   5887       % Output some of it with \doublecolumnout, leaving the rest on the page.
   5888       \setbox\PAGE=\box0
   5889       \doublecolumnout
   5890     \else
   5891       % Compare the heights of the two columns.
   5892       \ifdim4\ht1>5\ht3
   5893         % Column heights are too different, so don't make their bottoms
   5894         % flush with each other.
   5895         \setbox2=\vbox to \ht1 {\unvbox3\vfill}%
   5896         \setbox0=\vbox to \ht1 {\unvbox1\vfill}%
   5897       \else
   5898         % Make column bottoms flush with each other.
   5899         \setbox2=\vbox to\ht1{\unvbox3\unskip}%
   5900         \setbox0=\vbox to\ht1{\unvbox1\unskip}%
   5901       \fi
   5902       \global\setbox\balancedcolumns=\vbox{\pagesofar}%
   5903     \fi
   5904   \fi
   5905   %
   5906 }
   5907 \catcode`\@ = \other
   5908 
   5909 
   5910 \message{sectioning,}
   5911 % Chapters, sections, etc.
   5912 
   5913 % Let's start with @part.
   5914 \parseargdef\part{\partzzz{#1}}
   5915 \def\partzzz#1{%
   5916   \chapoddpage
   5917   \null
   5918   \vskip.3\vsize  % move it down on the page a bit
   5919   \begingroup
   5920     \noindent \titlefonts\rm #1\par % the text
   5921     \let\lastnode=\empty      % no node to associate with
   5922     \writetocentry{part}{#1}{}% but put it in the toc
   5923     \headingsoff              % no headline or footline on the part page
   5924     % This outputs a mark at the end of the page that clears \thischapter
   5925     % and \thissection, as is done in \startcontents.
   5926     \let\pchapsepmacro\relax
   5927     \chapmacro{}{Yomitfromtoc}{}%
   5928     \chapoddpage
   5929   \endgroup
   5930 }
   5931 
   5932 % \unnumberedno is an oxymoron.  But we count the unnumbered
   5933 % sections so that we can refer to them unambiguously in the pdf
   5934 % outlines by their "section number".  We avoid collisions with chapter
   5935 % numbers by starting them at 10000.  (If a document ever has 10000
   5936 % chapters, we're in trouble anyway, I'm sure.)
   5937 \newcount\unnumberedno \unnumberedno = 10000
   5938 \newcount\chapno
   5939 \newcount\secno        \secno=0
   5940 \newcount\subsecno     \subsecno=0
   5941 \newcount\subsubsecno  \subsubsecno=0
   5942 
   5943 % This counter is funny since it counts through charcodes of letters A, B, ...
   5944 \newcount\appendixno  \appendixno = `\@
   5945 %
   5946 % \def\appendixletter{\char\the\appendixno}
   5947 % We do the following ugly conditional instead of the above simple
   5948 % construct for the sake of pdftex, which needs the actual
   5949 % letter in the expansion, not just typeset.
   5950 %
   5951 \def\appendixletter{%
   5952   \ifnum\appendixno=`A A%
   5953   \else\ifnum\appendixno=`B B%
   5954   \else\ifnum\appendixno=`C C%
   5955   \else\ifnum\appendixno=`D D%
   5956   \else\ifnum\appendixno=`E E%
   5957   \else\ifnum\appendixno=`F F%
   5958   \else\ifnum\appendixno=`G G%
   5959   \else\ifnum\appendixno=`H H%
   5960   \else\ifnum\appendixno=`I I%
   5961   \else\ifnum\appendixno=`J J%
   5962   \else\ifnum\appendixno=`K K%
   5963   \else\ifnum\appendixno=`L L%
   5964   \else\ifnum\appendixno=`M M%
   5965   \else\ifnum\appendixno=`N N%
   5966   \else\ifnum\appendixno=`O O%
   5967   \else\ifnum\appendixno=`P P%
   5968   \else\ifnum\appendixno=`Q Q%
   5969   \else\ifnum\appendixno=`R R%
   5970   \else\ifnum\appendixno=`S S%
   5971   \else\ifnum\appendixno=`T T%
   5972   \else\ifnum\appendixno=`U U%
   5973   \else\ifnum\appendixno=`V V%
   5974   \else\ifnum\appendixno=`W W%
   5975   \else\ifnum\appendixno=`X X%
   5976   \else\ifnum\appendixno=`Y Y%
   5977   \else\ifnum\appendixno=`Z Z%
   5978   % The \the is necessary, despite appearances, because \appendixletter is
   5979   % expanded while writing the .toc file.  \char\appendixno is not
   5980   % expandable, thus it is written literally, thus all appendixes come out
   5981   % with the same letter (or @) in the toc without it.
   5982   \else\char\the\appendixno
   5983   \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
   5984   \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
   5985 
   5986 % Each @chapter defines these (using marks) as the number+name, number
   5987 % and name of the chapter.  Page headings and footings can use
   5988 % these.  @section does likewise.
   5989 \def\thischapter{}
   5990 \def\thischapternum{}
   5991 \def\thischaptername{}
   5992 \def\thissection{}
   5993 \def\thissectionnum{}
   5994 \def\thissectionname{}
   5995 
   5996 \newcount\absseclevel % used to calculate proper heading level
   5997 \newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count
   5998 
   5999 % @raisesections: treat @section as chapter, @subsection as section, etc.
   6000 \def\raisesections{\global\advance\secbase by -1}
   6001 
   6002 % @lowersections: treat @chapter as section, @section as subsection, etc.
   6003 \def\lowersections{\global\advance\secbase by 1}
   6004 
   6005 % we only have subsub.
   6006 \chardef\maxseclevel = 3
   6007 %
   6008 % A numbered section within an unnumbered changes to unnumbered too.
   6009 % To achieve this, remember the "biggest" unnum. sec. we are currently in:
   6010 \chardef\unnlevel = \maxseclevel
   6011 %
   6012 % Trace whether the current chapter is an appendix or not:
   6013 % \chapheadtype is "N" or "A", unnumbered chapters are ignored.
   6014 \def\chapheadtype{N}
   6015 
   6016 % Choose a heading macro
   6017 % #1 is heading type
   6018 % #2 is heading level
   6019 % #3 is text for heading
   6020 \def\genhead#1#2#3{%
   6021   % Compute the abs. sec. level:
   6022   \absseclevel=#2
   6023   \advance\absseclevel by \secbase
   6024   % Make sure \absseclevel doesn't fall outside the range:
   6025   \ifnum \absseclevel < 0
   6026     \absseclevel = 0
   6027   \else
   6028     \ifnum \absseclevel > 3
   6029       \absseclevel = 3
   6030     \fi
   6031   \fi
   6032   % The heading type:
   6033   \def\headtype{#1}%
   6034   \if \headtype U%
   6035     \ifnum \absseclevel < \unnlevel
   6036       \chardef\unnlevel = \absseclevel
   6037     \fi
   6038   \else
   6039     % Check for appendix sections:
   6040     \ifnum \absseclevel = 0
   6041       \edef\chapheadtype{\headtype}%
   6042     \else
   6043       \if \headtype A\if \chapheadtype N%
   6044 	\errmessage{@appendix... within a non-appendix chapter}%
   6045       \fi\fi
   6046     \fi
   6047     % Check for numbered within unnumbered:
   6048     \ifnum \absseclevel > \unnlevel
   6049       \def\headtype{U}%
   6050     \else
   6051       \chardef\unnlevel = 3
   6052     \fi
   6053   \fi
   6054   % Now print the heading:
   6055   \if \headtype U%
   6056     \ifcase\absseclevel
   6057 	\unnumberedzzz{#3}%
   6058     \or \unnumberedseczzz{#3}%
   6059     \or \unnumberedsubseczzz{#3}%
   6060     \or \unnumberedsubsubseczzz{#3}%
   6061     \fi
   6062   \else
   6063     \if \headtype A%
   6064       \ifcase\absseclevel
   6065 	  \appendixzzz{#3}%
   6066       \or \appendixsectionzzz{#3}%
   6067       \or \appendixsubseczzz{#3}%
   6068       \or \appendixsubsubseczzz{#3}%
   6069       \fi
   6070     \else
   6071       \ifcase\absseclevel
   6072 	  \chapterzzz{#3}%
   6073       \or \seczzz{#3}%
   6074       \or \numberedsubseczzz{#3}%
   6075       \or \numberedsubsubseczzz{#3}%
   6076       \fi
   6077     \fi
   6078   \fi
   6079   \suppressfirstparagraphindent
   6080 }
   6081 
   6082 % an interface:
   6083 \def\numhead{\genhead N}
   6084 \def\apphead{\genhead A}
   6085 \def\unnmhead{\genhead U}
   6086 
   6087 % @chapter, @appendix, @unnumbered.  Increment top-level counter, reset
   6088 % all lower-level sectioning counters to zero.
   6089 %
   6090 % Also set \chaplevelprefix, which we prepend to @float sequence numbers
   6091 % (e.g., figures), q.v.  By default (before any chapter), that is empty.
   6092 \let\chaplevelprefix = \empty
   6093 %
   6094 \outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz
   6095 \def\chapterzzz#1{%
   6096   % section resetting is \global in case the chapter is in a group, such
   6097   % as an @include file.
   6098   \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
   6099     \global\advance\chapno by 1
   6100   %
   6101   % Used for \float.
   6102   \gdef\chaplevelprefix{\the\chapno.}%
   6103   \resetallfloatnos
   6104   %
   6105   % \putwordChapter can contain complex things in translations.
   6106   \toks0=\expandafter{\putwordChapter}%
   6107   \message{\the\toks0 \space \the\chapno}%
   6108   %
   6109   % Write the actual heading.
   6110   \chapmacro{#1}{Ynumbered}{\the\chapno}%
   6111   %
   6112   % So @section and the like are numbered underneath this chapter.
   6113   \global\let\section = \numberedsec
   6114   \global\let\subsection = \numberedsubsec
   6115   \global\let\subsubsection = \numberedsubsubsec
   6116 }
   6117 
   6118 \outer\parseargdef\appendix{\apphead0{#1}} % normally calls appendixzzz
   6119 %
   6120 \def\appendixzzz#1{%
   6121   \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
   6122     \global\advance\appendixno by 1
   6123   \gdef\chaplevelprefix{\appendixletter.}%
   6124   \resetallfloatnos
   6125   %
   6126   % \putwordAppendix can contain complex things in translations.
   6127   \toks0=\expandafter{\putwordAppendix}%
   6128   \message{\the\toks0 \space \appendixletter}%
   6129   %
   6130   \chapmacro{#1}{Yappendix}{\appendixletter}%
   6131   %
   6132   \global\let\section = \appendixsec
   6133   \global\let\subsection = \appendixsubsec
   6134   \global\let\subsubsection = \appendixsubsubsec
   6135 }
   6136 
   6137 % normally unnmhead0 calls unnumberedzzz:
   6138 \outer\parseargdef\unnumbered{\unnmhead0{#1}}
   6139 \def\unnumberedzzz#1{%
   6140   \global\advance\unnumberedno by 1
   6141   %
   6142   % Since an unnumbered has no number, no prefix for figures.
   6143   \global\let\chaplevelprefix = \empty
   6144   \resetallfloatnos
   6145   %
   6146   % This used to be simply \message{#1}, but TeX fully expands the
   6147   % argument to \message.  Therefore, if #1 contained @-commands, TeX
   6148   % expanded them.  For example, in `@unnumbered The @cite{Book}', TeX
   6149   % expanded @cite (which turns out to cause errors because \cite is meant
   6150   % to be executed, not expanded).
   6151   %
   6152   % Anyway, we don't want the fully-expanded definition of @cite to appear
   6153   % as a result of the \message, we just want `@cite' itself.  We use
   6154   % \the<toks register> to achieve this: TeX expands \the<toks> only once,
   6155   % simply yielding the contents of <toks register>.  (We also do this for
   6156   % the toc entries.)
   6157   \toks0 = {#1}%
   6158   \message{(\the\toks0)}%
   6159   %
   6160   \chapmacro{#1}{Ynothing}{\the\unnumberedno}%
   6161   %
   6162   \global\let\section = \unnumberedsec
   6163   \global\let\subsection = \unnumberedsubsec
   6164   \global\let\subsubsection = \unnumberedsubsubsec
   6165 }
   6166 
   6167 % @centerchap is like @unnumbered, but the heading is centered.
   6168 \outer\parseargdef\centerchap{%
   6169   \let\centerparametersmaybe = \centerparameters
   6170   \unnmhead0{#1}%
   6171   \let\centerparametersmaybe = \relax
   6172 }
   6173 
   6174 % @top is like @unnumbered.
   6175 \let\top\unnumbered
   6176 
   6177 % Sections.
   6178 %
   6179 \outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz
   6180 \def\seczzz#1{%
   6181   \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
   6182   \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}%
   6183 }
   6184 
   6185 % normally calls appendixsectionzzz:
   6186 \outer\parseargdef\appendixsection{\apphead1{#1}}
   6187 \def\appendixsectionzzz#1{%
   6188   \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
   6189   \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}%
   6190 }
   6191 \let\appendixsec\appendixsection
   6192 
   6193 % normally calls unnumberedseczzz:
   6194 \outer\parseargdef\unnumberedsec{\unnmhead1{#1}}
   6195 \def\unnumberedseczzz#1{%
   6196   \global\advance\unnumberedno by 1
   6197   \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno}%
   6198 }
   6199 
   6200 % Subsections.
   6201 %
   6202 % normally calls numberedsubseczzz:
   6203 \outer\parseargdef\numberedsubsec{\numhead2{#1}}
   6204 \def\numberedsubseczzz#1{%
   6205   \global\subsubsecno=0  \global\advance\subsecno by 1
   6206   \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}%
   6207 }
   6208 
   6209 % normally calls appendixsubseczzz:
   6210 \outer\parseargdef\appendixsubsec{\apphead2{#1}}
   6211 \def\appendixsubseczzz#1{%
   6212   \global\subsubsecno=0  \global\advance\subsecno by 1
   6213   \sectionheading{#1}{subsec}{Yappendix}%
   6214                  {\appendixletter.\the\secno.\the\subsecno}%
   6215 }
   6216 
   6217 % normally calls unnumberedsubseczzz:
   6218 \outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}}
   6219 \def\unnumberedsubseczzz#1{%
   6220   \global\advance\unnumberedno by 1
   6221   \sectionheading{#1}{subsec}{Ynothing}{\the\unnumberedno}%
   6222 }
   6223 
   6224 % Subsubsections.
   6225 %
   6226 % normally numberedsubsubseczzz:
   6227 \outer\parseargdef\numberedsubsubsec{\numhead3{#1}}
   6228 \def\numberedsubsubseczzz#1{%
   6229   \global\advance\subsubsecno by 1
   6230   \sectionheading{#1}{subsubsec}{Ynumbered}%
   6231                  {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}%
   6232 }
   6233 
   6234 % normally appendixsubsubseczzz:
   6235 \outer\parseargdef\appendixsubsubsec{\apphead3{#1}}
   6236 \def\appendixsubsubseczzz#1{%
   6237   \global\advance\subsubsecno by 1
   6238   \sectionheading{#1}{subsubsec}{Yappendix}%
   6239                  {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}%
   6240 }
   6241 
   6242 % normally unnumberedsubsubseczzz:
   6243 \outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}}
   6244 \def\unnumberedsubsubseczzz#1{%
   6245   \global\advance\unnumberedno by 1
   6246   \sectionheading{#1}{subsubsec}{Ynothing}{\the\unnumberedno}%
   6247 }
   6248 
   6249 % These macros control what the section commands do, according
   6250 % to what kind of chapter we are in (ordinary, appendix, or unnumbered).
   6251 % Define them by default for a numbered chapter.
   6252 \let\section = \numberedsec
   6253 \let\subsection = \numberedsubsec
   6254 \let\subsubsection = \numberedsubsubsec
   6255 
   6256 % Define @majorheading, @heading and @subheading
   6257 
   6258 \def\majorheading{%
   6259   {\advance\chapheadingskip by 10pt \chapbreak }%
   6260   \parsearg\chapheadingzzz
   6261 }
   6262 
   6263 \def\chapheading{\chapbreak \parsearg\chapheadingzzz}
   6264 \def\chapheadingzzz#1{%
   6265   \vbox{\chapfonts \raggedtitlesettings #1\par}%
   6266   \nobreak\bigskip \nobreak
   6267   \suppressfirstparagraphindent
   6268 }
   6269 
   6270 % @heading, @subheading, @subsubheading.
   6271 \parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{}
   6272   \suppressfirstparagraphindent}
   6273 \parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{}
   6274   \suppressfirstparagraphindent}
   6275 \parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{}
   6276   \suppressfirstparagraphindent}
   6277 
   6278 % These macros generate a chapter, section, etc. heading only
   6279 % (including whitespace, linebreaking, etc. around it),
   6280 % given all the information in convenient, parsed form.
   6281 
   6282 % Args are the skip and penalty (usually negative)
   6283 \def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
   6284 
   6285 % Parameter controlling skip before chapter headings (if needed)
   6286 \newskip\chapheadingskip
   6287 
   6288 % Define plain chapter starts, and page on/off switching for it.
   6289 \def\chapbreak{\dobreak \chapheadingskip {-4000}}
   6290 
   6291 % Start a new page
   6292 \def\chappager{\par\vfill\supereject}
   6293 
   6294 % \chapoddpage - start on an odd page for a new chapter
   6295 % Because \domark is called before \chapoddpage, the filler page will
   6296 % get the headings for the next chapter, which is wrong.  But we don't
   6297 % care -- we just disable all headings on the filler page.
   6298 \def\chapoddpage{%
   6299   \chappager
   6300   \ifodd\pageno \else
   6301     \begingroup
   6302       \headingsoff
   6303       \null
   6304       \chappager
   6305     \endgroup
   6306   \fi
   6307 }
   6308 
   6309 \parseargdef\setchapternewpage{\csname CHAPPAG#1\endcsname\HEADINGSon}
   6310 
   6311 \def\CHAPPAGoff{%
   6312 \global\let\contentsalignmacro = \chappager
   6313 \global\let\pchapsepmacro=\chapbreak
   6314 \global\def\HEADINGSon{\HEADINGSsinglechapoff}}
   6315 
   6316 \def\CHAPPAGon{%
   6317 \global\let\contentsalignmacro = \chappager
   6318 \global\let\pchapsepmacro=\chappager
   6319 \global\def\HEADINGSon{\HEADINGSsingle}}
   6320 
   6321 \def\CHAPPAGodd{%
   6322 \global\let\contentsalignmacro = \chapoddpage
   6323 \global\let\pchapsepmacro=\chapoddpage
   6324 \global\def\HEADINGSon{\HEADINGSdouble}}
   6325 
   6326 \setchapternewpage on
   6327 
   6328 % \chapmacro - Chapter opening.
   6329 %
   6330 % #1 is the text, #2 is the section type (Ynumbered, Ynothing,
   6331 % Yappendix, Yomitfromtoc), #3 the chapter number.
   6332 % Not used for @heading series.
   6333 %
   6334 % To test against our argument.
   6335 \def\Ynothingkeyword{Ynothing}
   6336 \def\Yappendixkeyword{Yappendix}
   6337 \def\Yomitfromtockeyword{Yomitfromtoc}
   6338 %
   6339 %
   6340 % Definitions for @thischapter. These can be overridden in translation
   6341 % files.
   6342 \def\thischapterAppendix{%
   6343   \putwordAppendix{} \thischapternum: \thischaptername}
   6344 
   6345 \def\thischapterChapter{%
   6346   \putwordChapter{} \thischapternum: \thischaptername}
   6347 %
   6348 %
   6349 \def\chapmacro#1#2#3{%
   6350   \expandafter\ifx\thisenv\titlepage\else
   6351     \checkenv{}% chapters, etc., should not start inside an environment.
   6352   \fi
   6353   % Insert the first mark before the heading break (see notes for \domark).
   6354   \let\prevchapterdefs=\currentchapterdefs
   6355   \let\prevsectiondefs=\currentsectiondefs
   6356   \gdef\currentsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}%
   6357                         \gdef\thissection{}}%
   6358   %
   6359   \def\temptype{#2}%
   6360   \ifx\temptype\Ynothingkeyword
   6361     \gdef\currentchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}%
   6362                           \gdef\thischapter{\thischaptername}}%
   6363   \else\ifx\temptype\Yomitfromtockeyword
   6364     \gdef\currentchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}%
   6365                           \gdef\thischapter{}}%
   6366   \else\ifx\temptype\Yappendixkeyword
   6367     \toks0={#1}%
   6368     \xdef\currentchapterdefs{%
   6369       \gdef\noexpand\thischaptername{\the\toks0}%
   6370       \gdef\noexpand\thischapternum{\appendixletter}%
   6371       \let\noexpand\thischapter\noexpand\thischapterAppendix
   6372     }%
   6373   \else
   6374     \toks0={#1}%
   6375     \xdef\currentchapterdefs{%
   6376       \gdef\noexpand\thischaptername{\the\toks0}%
   6377       \gdef\noexpand\thischapternum{\the\chapno}%
   6378       \let\noexpand\thischapter\noexpand\thischapterChapter
   6379     }%
   6380   \fi\fi\fi
   6381   %
   6382   % Output the mark.  Pass it through \safewhatsit, to take care of
   6383   % the preceding space.
   6384   \safewhatsit\domark
   6385   %
   6386   % Insert the chapter heading break.
   6387   \pchapsepmacro
   6388   %
   6389   % Now the second mark, after the heading break.  No break points
   6390   % between here and the heading.
   6391   \let\prevchapterdefs=\currentchapterdefs
   6392   \let\prevsectiondefs=\currentsectiondefs
   6393   \domark
   6394   %
   6395   {%
   6396     \chapfonts \rm
   6397     \let\footnote=\errfootnoteheading % give better error message
   6398     %
   6399     % Have to define \currentsection before calling \donoderef, because the
   6400     % xref code eventually uses it.  On the other hand, it has to be called
   6401     % after \pchapsepmacro, or the headline will change too soon.
   6402     \gdef\currentsection{#1}%
   6403     %
   6404     % Only insert the separating space if we have a chapter/appendix
   6405     % number, and don't print the unnumbered ``number''.
   6406     \ifx\temptype\Ynothingkeyword
   6407       \setbox0 = \hbox{}%
   6408       \def\toctype{unnchap}%
   6409     \else\ifx\temptype\Yomitfromtockeyword
   6410       \setbox0 = \hbox{}% contents like unnumbered, but no toc entry
   6411       \def\toctype{omit}%
   6412     \else\ifx\temptype\Yappendixkeyword
   6413       \setbox0 = \hbox{\putwordAppendix{} #3\enspace}%
   6414       \def\toctype{app}%
   6415     \else
   6416       \setbox0 = \hbox{#3\enspace}%
   6417       \def\toctype{numchap}%
   6418     \fi\fi\fi
   6419     %
   6420     % Write the toc entry for this chapter.  Must come before the
   6421     % \donoderef, because we include the current node name in the toc
   6422     % entry, and \donoderef resets it to empty.
   6423     \writetocentry{\toctype}{#1}{#3}%
   6424     %
   6425     % For pdftex, we have to write out the node definition (aka, make
   6426     % the pdfdest) after any page break, but before the actual text has
   6427     % been typeset.  If the destination for the pdf outline is after the
   6428     % text, then jumping from the outline may wind up with the text not
   6429     % being visible, for instance under high magnification.
   6430     \donoderef{#2}%
   6431     %
   6432     % Typeset the actual heading.
   6433     \nobreak % Avoid page breaks at the interline glue.
   6434     \vbox{\raggedtitlesettings \hangindent=\wd0 \centerparametersmaybe
   6435           \unhbox0 #1\par}%
   6436   }%
   6437   \nobreak\bigskip % no page break after a chapter title
   6438   \nobreak
   6439 }
   6440 
   6441 % @centerchap -- centered and unnumbered.
   6442 \let\centerparametersmaybe = \relax
   6443 \def\centerparameters{%
   6444   \advance\rightskip by 3\rightskip
   6445   \leftskip = \rightskip
   6446   \parfillskip = 0pt
   6447 }
   6448 
   6449 
   6450 % Section titles.  These macros combine the section number parts and
   6451 % call the generic \sectionheading to do the printing.
   6452 %
   6453 \newskip\secheadingskip
   6454 \def\secheadingbreak{\dobreak \secheadingskip{-1000}}
   6455 
   6456 % Subsection titles.
   6457 \newskip\subsecheadingskip
   6458 \def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}}
   6459 
   6460 % Subsubsection titles.
   6461 \def\subsubsecheadingskip{\subsecheadingskip}
   6462 \def\subsubsecheadingbreak{\subsecheadingbreak}
   6463 
   6464 % Definition for @thissection. This can be overridden in translation
   6465 % files.
   6466 \def\thissectionDef{%
   6467   \putwordSection{} \thissectionnum: \thissectionname}
   6468 %
   6469 
   6470 
   6471 % Print any size, any type, section title.
   6472 %
   6473 % #1 is the text of the title,
   6474 % #2 is the section level (sec/subsec/subsubsec),
   6475 % #3 is the section type (Ynumbered, Ynothing, Yappendix, Yomitfromtoc),
   6476 % #4 is the section number.
   6477 %
   6478 \def\seckeyword{sec}
   6479 %
   6480 \def\sectionheading#1#2#3#4{%
   6481   {%
   6482     \def\sectionlevel{#2}%
   6483     \def\temptype{#3}%
   6484     %
   6485     % It is ok for the @heading series commands to appear inside an
   6486     % environment (it's been historically allowed, though the logic is
   6487     % dubious), but not the others.
   6488     \ifx\temptype\Yomitfromtockeyword\else
   6489       \checkenv{}% non-@*heading should not be in an environment.
   6490     \fi
   6491     \let\footnote=\errfootnoteheading
   6492     %
   6493     % Switch to the right set of fonts.
   6494     \csname #2fonts\endcsname \rm
   6495     %
   6496     % Insert first mark before the heading break (see notes for \domark).
   6497     \let\prevsectiondefs=\currentsectiondefs
   6498     \ifx\temptype\Ynothingkeyword
   6499       \ifx\sectionlevel\seckeyword
   6500         \gdef\currentsectiondefs{\gdef\thissectionname{#1}\gdef\thissectionnum{}%
   6501                               \gdef\thissection{\thissectionname}}%
   6502       \fi
   6503     \else\ifx\temptype\Yomitfromtockeyword
   6504       % Don't redefine \thissection.
   6505     \else\ifx\temptype\Yappendixkeyword
   6506       \ifx\sectionlevel\seckeyword
   6507         \toks0={#1}%
   6508         \xdef\currentsectiondefs{%
   6509           \gdef\noexpand\thissectionname{\the\toks0}%
   6510           \gdef\noexpand\thissectionnum{#4}%
   6511           \let\noexpand\thissection\noexpand\thissectionDef
   6512         }%
   6513       \fi
   6514     \else
   6515       \ifx\sectionlevel\seckeyword
   6516         \toks0={#1}%
   6517         \xdef\currentsectiondefs{%
   6518           \gdef\noexpand\thissectionname{\the\toks0}%
   6519           \gdef\noexpand\thissectionnum{#4}%
   6520           \let\noexpand\thissection\noexpand\thissectionDef
   6521         }%
   6522       \fi
   6523     \fi\fi\fi
   6524     %
   6525     % Go into vertical mode.  Usually we'll already be there, but we
   6526     % don't want the following whatsit to end up in a preceding paragraph
   6527     % if the document didn't happen to have a blank line.
   6528     \par
   6529     %
   6530     % Output the mark.  Pass it through \safewhatsit, to take care of
   6531     % the preceding space.
   6532     \safewhatsit\domark
   6533     %
   6534     % Insert space above the heading.
   6535     \csname #2headingbreak\endcsname
   6536     %
   6537     % Now the second mark, after the heading break.  No break points
   6538     % between here and the heading.
   6539     \global\let\prevsectiondefs=\currentsectiondefs
   6540     \domark
   6541     %
   6542     % Only insert the space after the number if we have a section number.
   6543     \ifx\temptype\Ynothingkeyword
   6544       \setbox0 = \hbox{}%
   6545       \def\toctype{unn}%
   6546       \gdef\currentsection{#1}%
   6547     \else\ifx\temptype\Yomitfromtockeyword
   6548       % for @headings -- no section number, don't include in toc,
   6549       % and don't redefine \currentsection.
   6550       \setbox0 = \hbox{}%
   6551       \def\toctype{omit}%
   6552       \let\sectionlevel=\empty
   6553     \else\ifx\temptype\Yappendixkeyword
   6554       \setbox0 = \hbox{#4\enspace}%
   6555       \def\toctype{app}%
   6556       \gdef\currentsection{#1}%
   6557     \else
   6558       \setbox0 = \hbox{#4\enspace}%
   6559       \def\toctype{num}%
   6560       \gdef\currentsection{#1}%
   6561     \fi\fi\fi
   6562     %
   6563     % Write the toc entry (before \donoderef).  See comments in \chapmacro.
   6564     \writetocentry{\toctype\sectionlevel}{#1}{#4}%
   6565     %
   6566     % Write the node reference (= pdf destination for pdftex).
   6567     % Again, see comments in \chapmacro.
   6568     \donoderef{#3}%
   6569     %
   6570     % Interline glue will be inserted when the vbox is completed.
   6571     % That glue will be a valid breakpoint for the page, since it'll be
   6572     % preceded by a whatsit (usually from the \donoderef, or from the
   6573     % \writetocentry if there was no node).  We don't want to allow that
   6574     % break, since then the whatsits could end up on page n while the
   6575     % section is on page n+1, thus toc/etc. are wrong.  Debian bug 276000.
   6576     \nobreak
   6577     %
   6578     % Output the actual section heading.
   6579     \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright
   6580           \hangindent=\wd0  % zero if no section number
   6581           \unhbox0 #1}%
   6582   }%
   6583   % Add extra space after the heading -- half of whatever came above it.
   6584   % Don't allow stretch, though.
   6585   \kern .5 \csname #2headingskip\endcsname
   6586   %
   6587   % Do not let the kern be a potential breakpoint, as it would be if it
   6588   % was followed by glue.
   6589   \nobreak
   6590   %
   6591   % We'll almost certainly start a paragraph next, so don't let that
   6592   % glue accumulate.  (Not a breakpoint because it's preceded by a
   6593   % discardable item.)  However, when a paragraph is not started next
   6594   % (\startdefun, \cartouche, \center, etc.), this needs to be wiped out
   6595   % or the negative glue will cause weirdly wrong output, typically
   6596   % obscuring the section heading with something else.
   6597   \vskip-\parskip
   6598   %
   6599   % This is so the last item on the main vertical list is a known
   6600   % \penalty > 10000, so \startdefun, etc., can recognize the situation
   6601   % and do the needful.
   6602   \penalty 10001
   6603 }
   6604 
   6605 
   6606 \message{toc,}
   6607 % Table of contents.
   6608 \newwrite\tocfile
   6609 
   6610 % Write an entry to the toc file, opening it if necessary.
   6611 % Called from @chapter, etc.
   6612 %
   6613 % Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno}
   6614 % We append the current node name (if any) and page number as additional
   6615 % arguments for the \{chap,sec,...}entry macros which will eventually
   6616 % read this.  The node name is used in the pdf outlines as the
   6617 % destination to jump to.
   6618 %
   6619 % We open the .toc file for writing here instead of at @setfilename (or
   6620 % any other fixed time) so that @contents can be anywhere in the document.
   6621 % But if #1 is `omit', then we don't do anything.  This is used for the
   6622 % table of contents chapter openings themselves.
   6623 %
   6624 \newif\iftocfileopened
   6625 \def\omitkeyword{omit}%
   6626 %
   6627 \def\writetocentry#1#2#3{%
   6628   \edef\writetoctype{#1}%
   6629   \ifx\writetoctype\omitkeyword \else
   6630     \iftocfileopened\else
   6631       \immediate\openout\tocfile = \jobname.toc
   6632       \global\tocfileopenedtrue
   6633     \fi
   6634     %
   6635     \iflinks
   6636       {\atdummies
   6637        \edef\temp{%
   6638          \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}%
   6639        \temp
   6640       }%
   6641     \fi
   6642   \fi
   6643   %
   6644   % Tell \shipout to create a pdf destination on each page, if we're
   6645   % writing pdf.  These are used in the table of contents.  We can't
   6646   % just write one on every page because the title pages are numbered
   6647   % 1 and 2 (the page numbers aren't printed), and so are the first
   6648   % two pages of the document.  Thus, we'd have two destinations named
   6649   % `1', and two named `2'.
   6650   \ifpdforxetex
   6651     \global\pdfmakepagedesttrue
   6652   \fi
   6653 }
   6654 
   6655 
   6656 % These characters do not print properly in the Computer Modern roman
   6657 % fonts, so we must take special care.  This is more or less redundant
   6658 % with the Texinfo input format setup at the end of this file.
   6659 %
   6660 \def\activecatcodes{%
   6661   \catcode`\"=\active
   6662   \catcode`\$=\active
   6663   \catcode`\<=\active
   6664   \catcode`\>=\active
   6665   \catcode`\\=\active
   6666   \catcode`\^=\active
   6667   \catcode`\_=\active
   6668   \catcode`\|=\active
   6669   \catcode`\~=\active
   6670 }
   6671 
   6672 
   6673 % Read the toc file, which is essentially Texinfo input.
   6674 \def\readtocfile{%
   6675   \setupdatafile
   6676   \activecatcodes
   6677   \input \tocreadfilename
   6678 }
   6679 
   6680 % process toc file to find the maximum width of the section numbers for
   6681 % each chapter
   6682 \def\findsecnowidths{%
   6683   \begingroup
   6684   \setupdatafile
   6685   \activecatcodes
   6686   \secentryfonts
   6687   % Redefinitions
   6688   \def\numchapentry##1##2##3##4{%
   6689     \def\curchapname{secnowidth-##2}%
   6690     \curchapmax=0pt
   6691   }%
   6692   \let\appentry\numchapentry
   6693   %
   6694   \def\numsecentry##1##2##3##4{%
   6695     \def\cursecname{secnowidth-##2}%
   6696     \cursecmax=0pt
   6697     %
   6698     \setbox0=\hbox{##2}%
   6699     \ifdim\wd0>\curchapmax
   6700       \curchapmax=\wd0
   6701       \expandafter\xdef\csname\curchapname\endcsname{\the\wd0}%
   6702     \fi
   6703   }%
   6704   \let\appsecentry\numsecentry
   6705   %
   6706   \def\numsubsecentry##1##2##3##4{%
   6707     \def\curssecname{secnowidth-##2}%
   6708     \curssecmax=0pt
   6709     %
   6710     \setbox0=\hbox{##2}%
   6711     \ifdim\wd0>\cursecmax
   6712       \cursecmax=\wd0
   6713       \expandafter\xdef\csname\cursecname\endcsname{\the\wd0}%
   6714     \fi
   6715   }%
   6716   \let\appsubsecentry\numsubsecentry
   6717   %
   6718   \def\numsubsubsecentry##1##2##3##4{%
   6719     \setbox0=\hbox{##2}%
   6720     \ifdim\wd0>\curssecmax
   6721       \curssecmax=\wd0
   6722       \expandafter\xdef\csname\curssecname\endcsname{\the\wd0}%
   6723     \fi
   6724   }%
   6725   \let\appsubsubsecentry\numsubsubsecentry
   6726   %
   6727   % Discard any output by outputting to dummy vbox, in case the toc file
   6728   % contains macros that we have not redefined above.
   6729   \setbox\dummybox\vbox\bgroup
   6730     \input \tocreadfilename\relax
   6731   \egroup
   6732   \endgroup
   6733 }
   6734 \newdimen\curchapmax
   6735 \newdimen\cursecmax
   6736 \newdimen\curssecmax
   6737 
   6738 
   6739 % set #1 to the maximum section width for #2
   6740 \def\retrievesecnowidth#1#2{%
   6741   \expandafter\let\expandafter\savedsecnowidth \csname secnowidth-#2\endcsname
   6742   \ifx\savedsecnowidth\relax
   6743     #1=0pt
   6744   \else
   6745     #1=\savedsecnowidth
   6746   \fi
   6747 }
   6748 \newdimen\secnowidthchap
   6749 \secnowidthchap=0pt
   6750 \newdimen\secnowidthsec
   6751 \secnowidthsec=0pt
   6752 \newdimen\secnowidthssec
   6753 \secnowidthssec=0pt
   6754 
   6755 
   6756 \newskip\contentsrightmargin \contentsrightmargin=1in
   6757 \newcount\savepageno
   6758 \newcount\lastnegativepageno \lastnegativepageno = -1
   6759 
   6760 % Prepare to read what we've written to \tocfile.
   6761 %
   6762 \def\startcontents#1{%
   6763   % If @setchapternewpage on, and @headings double, the contents should
   6764   % start on an odd page, unlike chapters.
   6765   \contentsalignmacro
   6766   \immediate\closeout\tocfile
   6767   %
   6768   % Don't need to put `Contents' or `Short Contents' in the headline.
   6769   % It is abundantly clear what they are.
   6770   \chapmacro{#1}{Yomitfromtoc}{}%
   6771   %
   6772   \savepageno = \pageno
   6773   \begingroup                  % Set up to handle contents files properly.
   6774     \raggedbottom              % Worry more about breakpoints than the bottom.
   6775     \entryrightmargin=\contentsrightmargin % Don't use the full line length.
   6776     %
   6777     % Roman numerals for page numbers.
   6778     \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi
   6779     \def\thistitle{}% no title in double-sided headings
   6780     % Record where the Roman numerals started.
   6781     \ifnum\romancount=0 \global\romancount=\pagecount \fi
   6782     \linkentrytexttrue
   6783 }
   6784 
   6785 % \raggedbottom in plain.tex hardcodes \topskip so override it
   6786 \catcode`\@=11
   6787 \def\raggedbottom{\advance\topskip by 0pt plus60pt \r@ggedbottomtrue}
   6788 \catcode`\@=\other
   6789 
   6790 % redefined for the two-volume lispref.  We always output on
   6791 % \jobname.toc even if this is redefined.
   6792 %
   6793 \def\tocreadfilename{\jobname.toc}
   6794 
   6795 % Normal (long) toc.
   6796 %
   6797 \def\contents{%
   6798   \startcontents{\putwordTOC}%
   6799     \openin 1 \tocreadfilename\space
   6800     \ifeof 1 \else
   6801       \findsecnowidths
   6802       \readtocfile
   6803     \fi
   6804     \vfill \eject
   6805     \contentsalignmacro % in case @setchapternewpage odd is in effect
   6806     \ifeof 1 \else
   6807       \pdfmakeoutlines
   6808     \fi
   6809     \closein 1
   6810   \endgroup
   6811   \contentsendroman
   6812 }
   6813 
   6814 % And just the chapters.
   6815 \def\summarycontents{%
   6816   \startcontents{\putwordShortTOC}%
   6817     %
   6818     \let\partentry = \shortpartentry
   6819     \let\numchapentry = \shortchapentry
   6820     \let\appentry = \shortchapentry
   6821     \let\unnchapentry = \shortunnchapentry
   6822     % We want a true roman here for the page numbers.
   6823     \secfonts
   6824     \let\rm=\shortcontrm \let\bf=\shortcontbf
   6825     \let\sl=\shortcontsl \let\tt=\shortconttt
   6826     \rm
   6827     \hyphenpenalty = 10000
   6828     \advance\baselineskip by 1pt % Open it up a little.
   6829     \extrasecnoskip=0.4pt
   6830     \def\numsecentry##1##2##3##4{}
   6831     \let\appsecentry = \numsecentry
   6832     \let\unnsecentry = \numsecentry
   6833     \let\numsubsecentry = \numsecentry
   6834     \let\appsubsecentry = \numsecentry
   6835     \let\unnsubsecentry = \numsecentry
   6836     \let\numsubsubsecentry = \numsecentry
   6837     \let\appsubsubsecentry = \numsecentry
   6838     \let\unnsubsubsecentry = \numsecentry
   6839     \openin 1 \tocreadfilename\space
   6840     \ifeof 1 \else
   6841       \readtocfile
   6842     \fi
   6843     \closein 1
   6844     \vfill \eject
   6845     \contentsalignmacro % in case @setchapternewpage odd is in effect
   6846   \endgroup
   6847   \contentsendroman
   6848 }
   6849 \let\shortcontents = \summarycontents
   6850 
   6851 % Get ready to use Arabic numerals again
   6852 \def\contentsendroman{%
   6853   \lastnegativepageno = \pageno
   6854   \global\pageno=1
   6855   \contentsendcount = \pagecount
   6856 }
   6857 
   6858 % Typeset the label for a chapter or appendix for the short contents.
   6859 % The arg is, e.g., `A' for an appendix, or `3' for a chapter.
   6860 %
   6861 \def\shortchaplabel#1{%
   6862   % This space should be enough, since a single number is .5em, and the
   6863   % widest letter (M) is 1em, at least in the Computer Modern fonts.
   6864   % But use \hss just in case.
   6865   %
   6866   % We'd like to right-justify chapter numbers, but that looks strange
   6867   % with appendix letters.  And right-justifying numbers and
   6868   % left-justifying letters looks strange when there is less than 10
   6869   % chapters.  Have to read the whole toc once to know how many chapters
   6870   % there are before deciding ...
   6871   \hbox to 1em{#1\hss}%
   6872 }
   6873 
   6874 % These macros generate individual entries in the table of contents,
   6875 % and are read in from the *.toc file.
   6876 %
   6877 % The arguments are like:
   6878 % \def\numchapentry#1#2#3#4
   6879 %   #1 - the chapter or section name.
   6880 %   #2 - section number
   6881 %   #3 - level of section (e.g "chap", "sec")
   6882 %   #4 - page number
   6883 
   6884 % Parts, in the main contents.  Replace the part number, which doesn't
   6885 % exist, with an empty box.  Let's hope all the numbers have the same width.
   6886 % Also ignore the page number, which is conventionally not printed.
   6887 \def\numeralbox{\setbox0=\hbox{8}\hbox to \wd0{\hfil}}
   6888 \def\partentry#1#2#3#4{%
   6889   % Add stretch and a bonus for breaking the page before the part heading.
   6890   % This reduces the chance of the page being broken immediately after the
   6891   % part heading, before a following chapter heading.
   6892   \vskip 0pt plus 5\baselineskip
   6893   \penalty-300
   6894   \vskip 0pt plus -5\baselineskip
   6895   \dochapentry{#1}{\numeralbox}{}%
   6896 }
   6897 %
   6898 % Parts, in the short toc.
   6899 \def\shortpartentry#1#2#3#4{%
   6900   \penalty-300
   6901   \vskip.5\baselineskip plus.15\baselineskip minus.1\baselineskip
   6902   \shortchapentry{{\bf #1}}{\numeralbox}{}{}%
   6903 }
   6904 
   6905 % Chapters, in the main contents.
   6906 \def\numchapentry#1#2#3#4{%
   6907   \retrievesecnowidth\secnowidthchap{#2}%
   6908   \dochapentry{#1}{#2}{#4}%
   6909 }
   6910 
   6911 % Chapters, in the short toc.
   6912 \def\shortchapentry#1#2#3#4{%
   6913   \tocentry{#1}{\shortchaplabel{#2}}{#4}%
   6914 }
   6915 
   6916 % Appendices, in the main contents.
   6917 % Need the word Appendix, and a fixed-size box.
   6918 %
   6919 \def\appendixbox#1{%
   6920   % We use M since it's probably the widest letter.
   6921   \setbox0 = \hbox{\putwordAppendix{} M}%
   6922   \hbox to \wd0{\putwordAppendix{} #1\hss}}
   6923 %
   6924 \def\appentry#1#2#3#4{%
   6925   \retrievesecnowidth\secnowidthchap{#2}%
   6926   \dochapentry{\appendixbox{#2}\hskip.7em#1}{}{#4}%
   6927 }
   6928 
   6929 % Unnumbered chapters.
   6930 \def\unnchapentry#1#2#3#4{\dochapentry{#1}{}{#4}}
   6931 \def\shortunnchapentry#1#2#3#4{\tocentry{#1}{}{#4}}
   6932 
   6933 % Sections.
   6934 \def\numsecentry#1#2#3#4{\dosecentry{#1}{#2}{#4}}
   6935 
   6936 \def\numsecentry#1#2#3#4{%
   6937   \retrievesecnowidth\secnowidthsec{#2}%
   6938   \dosecentry{#1}{#2}{#4}%
   6939 }
   6940 \let\appsecentry=\numsecentry
   6941 \def\unnsecentry#1#2#3#4{%
   6942   \retrievesecnowidth\secnowidthsec{#2}%
   6943   \dosecentry{#1}{}{#4}%
   6944 }
   6945 
   6946 % Subsections.
   6947 \def\numsubsecentry#1#2#3#4{%
   6948   \retrievesecnowidth\secnowidthssec{#2}%
   6949   \dosubsecentry{#1}{#2}{#4}%
   6950 }
   6951 \let\appsubsecentry=\numsubsecentry
   6952 \def\unnsubsecentry#1#2#3#4{%
   6953   \retrievesecnowidth\secnowidthssec{#2}%
   6954   \dosubsecentry{#1}{}{#4}%
   6955 }
   6956 
   6957 % And subsubsections.
   6958 \def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#2}{#4}}
   6959 \let\appsubsubsecentry=\numsubsubsecentry
   6960 \def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{}{#4}}
   6961 
   6962 % This parameter controls the indentation of the various levels.
   6963 % Same as \defaultparindent.
   6964 \newdimen\tocindent \tocindent = 15pt
   6965 
   6966 % Now for the actual typesetting. In all these, #1 is the text, #2 is
   6967 % a section number if present, and #3 is the page number.
   6968 %
   6969 % If the toc has to be broken over pages, we want it to be at chapters
   6970 % if at all possible; hence the \penalty.
   6971 \def\dochapentry#1#2#3{%
   6972    \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip
   6973    \begingroup
   6974      % Move the page numbers slightly to the right
   6975      \advance\entryrightmargin by -0.05em
   6976      \chapentryfonts
   6977      \extrasecnoskip=0.4em % separate chapter number more
   6978      \tocentry{#1}{#2}{#3}%
   6979    \endgroup
   6980    \nobreak\vskip .25\baselineskip plus.1\baselineskip
   6981 }
   6982 
   6983 \def\dosecentry#1#2#3{\begingroup
   6984   \secnowidth=\secnowidthchap
   6985   \secentryfonts \leftskip=\tocindent
   6986   \tocentry{#1}{#2}{#3}%
   6987 \endgroup}
   6988 
   6989 \def\dosubsecentry#1#2#3{\begingroup
   6990   \secnowidth=\secnowidthsec
   6991   \subsecentryfonts \leftskip=2\tocindent
   6992   \tocentry{#1}{#2}{#3}%
   6993 \endgroup}
   6994 
   6995 \def\dosubsubsecentry#1#2#3{\begingroup
   6996   \secnowidth=\secnowidthssec
   6997   \subsubsecentryfonts \leftskip=3\tocindent
   6998   \tocentry{#1}{#2}{#3}%
   6999 \endgroup}
   7000 
   7001 % Used for the maximum width of a section number so we can align
   7002 % section titles.
   7003 \newdimen\secnowidth
   7004 \secnowidth=0pt
   7005 \newdimen\extrasecnoskip
   7006 \extrasecnoskip=0pt
   7007 
   7008 % \tocentry{TITLE}{SEC NO}{PAGE}
   7009 %
   7010 \def\tocentry#1#2#3{%
   7011   \def\secno{#2}%
   7012   \ifx\empty\secno
   7013     \entry{#1}{#3}%
   7014   \else
   7015     \ifdim 0pt=\secnowidth
   7016       \setbox0=\hbox{#2\hskip\labelspace\hskip\extrasecnoskip}%
   7017     \else
   7018       \advance\secnowidth by \labelspace
   7019       \advance\secnowidth by \extrasecnoskip
   7020       \setbox0=\hbox to \secnowidth{%
   7021         #2\hskip\labelspace\hskip\extrasecnoskip\hfill}%
   7022     \fi
   7023     \entrycontskip=\wd0
   7024     \entry{\box0 #1}{#3}%
   7025   \fi
   7026 }
   7027 \newdimen\labelspace
   7028 \labelspace=0.6em
   7029 
   7030 \def\chapentryfonts{\secfonts \rm}
   7031 \def\secentryfonts{\textfonts}
   7032 \def\subsecentryfonts{\textfonts}
   7033 \def\subsubsecentryfonts{\textfonts}
   7034 
   7035 
   7036 \message{environments,}
   7037 % @foo ... @end foo.
   7038 
   7039 % @tex ... @end tex    escapes into raw TeX temporarily.
   7040 % One exception: @ is still an escape character, so that @end tex works.
   7041 % But \@ or @@ will get a plain @ character.
   7042 
   7043 \envdef\tex{%
   7044   \setregularquotes
   7045   \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
   7046   \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
   7047   \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie
   7048   \catcode `\%=14
   7049   \catcode `\+=\other
   7050   \catcode `\"=\other
   7051   \catcode `\|=\other
   7052   \catcode `\<=\other
   7053   \catcode `\>=\other
   7054   \catcode `\`=\other
   7055   \catcode `\'=\other
   7056   %
   7057   % ' is active in math mode (mathcode"8000).  So reset it, and all our
   7058   % other math active characters (just in case), to plain's definitions.
   7059   \mathactive
   7060   %
   7061   % Inverse of the list at the beginning of the file.
   7062   \let\b=\ptexb
   7063   \let\bullet=\ptexbullet
   7064   \let\c=\ptexc
   7065   \let\,=\ptexcomma
   7066   \let\.=\ptexdot
   7067   \let\dots=\ptexdots
   7068   \let\equiv=\ptexequiv
   7069   \let\!=\ptexexclam
   7070   \let\i=\ptexi
   7071   \let\indent=\ptexindent
   7072   \let\noindent=\ptexnoindent
   7073   \let\{=\ptexlbrace
   7074   \let\+=\tabalign
   7075   \let\}=\ptexrbrace
   7076   \let\/=\ptexslash
   7077   \let\sp=\ptexsp
   7078   \let\*=\ptexstar
   7079   %\let\sup=\ptexsup % do not redefine, we want @sup to work in math mode
   7080   \let\t=\ptext
   7081   \expandafter \let\csname top\endcsname=\ptextop  % we've made it outer
   7082   \let\frenchspacing=\plainfrenchspacing
   7083   %
   7084   \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
   7085   \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
   7086   \def\@{@}%
   7087 }
   7088 % There is no need to define \Etex.
   7089 
   7090 % Define @lisp ... @end lisp.
   7091 % @lisp environment forms a group so it can rebind things,
   7092 % including the definition of @end lisp (which normally is erroneous).
   7093 
   7094 % Amount to narrow the margins by for @lisp.
   7095 \newskip\lispnarrowing \lispnarrowing=0.4in
   7096 
   7097 % This is the definition that ^^M gets inside @lisp, @example, and other
   7098 % such environments.  \null is better than a space, since it doesn't
   7099 % have any width.
   7100 \def\lisppar{\null\endgraf}
   7101 
   7102 % This space is always present above and below environments.
   7103 \newskip\envskipamount \envskipamount = 0pt
   7104 
   7105 % Make spacing and below environment symmetrical.  We use \parskip here
   7106 % to help in doing that, since in @example-like environments \parskip
   7107 % is reset to zero; thus the \afterenvbreak inserts no space -- but the
   7108 % start of the next paragraph will insert \parskip.
   7109 %
   7110 \def\aboveenvbreak{{%
   7111   % =10000 instead of <10000 because of a special case in \itemzzz and
   7112   % \sectionheading, q.v.
   7113   \ifnum \lastpenalty=10000 \else
   7114     \advance\envskipamount by \parskip
   7115     \endgraf
   7116     \ifdim\lastskip<\envskipamount
   7117       \removelastskip
   7118       \ifnum\lastpenalty<10000
   7119         % Penalize breaking before the environment, because preceding text
   7120         % often leads into it.
   7121         \penalty100
   7122       \fi
   7123       \vskip\envskipamount
   7124     \fi
   7125   \fi
   7126 }}
   7127 
   7128 \def\afterenvbreak{{%
   7129   % =10000 instead of <10000 because of a special case in \itemzzz and
   7130   % \sectionheading, q.v.
   7131   \ifnum \lastpenalty=10000 \else
   7132     \advance\envskipamount by \parskip
   7133     \endgraf
   7134     \ifdim\lastskip<\envskipamount
   7135       \removelastskip
   7136       % it's not a good place to break if the last penalty was \nobreak
   7137       % or better ...
   7138       \ifnum\lastpenalty<10000 \penalty-50 \fi
   7139       \vskip\envskipamount
   7140     \fi
   7141   \fi
   7142 }}
   7143 
   7144 % \nonarrowing is a flag.  If "set", @lisp etc don't narrow margins; it will
   7145 % also clear it, so that its embedded environments do the narrowing again.
   7146 \let\nonarrowing=\relax
   7147 
   7148 % @cartouche ... @end cartouche: draw rectangle w/rounded corners around
   7149 % environment contents.
   7150 
   7151 %
   7152 \def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth
   7153 \def\ctr{{\hskip 6pt\circle\char'010}}
   7154 \def\cbl{{\circle\char'012\hskip -6pt}}
   7155 \def\cbr{{\hskip 6pt\circle\char'011}}
   7156 \def\carttop{\hbox to \cartouter{\hskip\lskip
   7157         \ctl\leaders\hrule height\circthick\hfil\ctr
   7158         \hskip\rskip}}
   7159 \def\cartbot{\hbox to \cartouter{\hskip\lskip
   7160         \cbl\leaders\hrule height\circthick\hfil\cbr
   7161         \hskip\rskip}}
   7162 %
   7163 \newskip\lskip\newskip\rskip
   7164 
   7165 % only require the font if @cartouche is actually used
   7166 \def\cartouchefontdefs{%
   7167   \font\circle=lcircle10\relax
   7168   \circthick=\fontdimen8\circle
   7169 }
   7170 \newdimen\circthick
   7171 \newdimen\cartouter\newdimen\cartinner
   7172 \newskip\normbskip\newskip\normpskip\newskip\normlskip
   7173 
   7174 \envparseargdef\cartouche{%
   7175   \cartouchefontdefs
   7176   \ifhmode\par\fi  % can't be in the midst of a paragraph.
   7177   \startsavinginserts
   7178   \lskip=\leftskip \rskip=\rightskip
   7179   \leftskip=0pt\rightskip=0pt % we want these *outside*.
   7180   %
   7181   % Set paragraph width for text inside cartouche.  There are
   7182   % left and right margins of 3pt each plus two vrules 0.4pt each.
   7183   \cartinner=\hsize \advance\cartinner by-\lskip
   7184   \advance\cartinner by-\rskip
   7185   \advance\cartinner by -6.8pt
   7186   %
   7187   % For drawing top and bottom of cartouche.  Each corner char
   7188   % adds 6pt and we take off the width of a rule to line up with the
   7189   % right boundary perfectly.
   7190   \cartouter=\hsize
   7191   \advance\cartouter by 11.6pt
   7192   %
   7193   \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
   7194   %
   7195   % If this cartouche directly follows a sectioning command, we need the
   7196   % \parskip glue (backspaced over by default) or the cartouche can
   7197   % collide with the section heading.
   7198   \ifnum\lastpenalty>10000 \vskip\parskip \penalty\lastpenalty \fi
   7199   %
   7200   \setbox\groupbox=\vtop\bgroup
   7201       \baselineskip=0pt\parskip=0pt\lineskip=0pt
   7202       \carttop
   7203       \hbox\bgroup
   7204           \hskip\lskip
   7205           \vrule\kern3pt
   7206           \vbox\bgroup
   7207               \hsize=\cartinner
   7208               \baselineskip=\normbskip
   7209               \lineskip=\normlskip
   7210               \parskip=\normpskip
   7211               \def\arg{#1}%
   7212               \ifx\arg\empty\else
   7213                 \centerV{\hfil \bf #1 \hfil}%
   7214               \fi
   7215               \kern3pt
   7216               \vskip -\parskip
   7217 }
   7218 \def\Ecartouche{%
   7219               \ifhmode\par\fi
   7220 	      \kern3pt
   7221 	  \egroup
   7222 	  \kern3pt\vrule
   7223 	  \hskip\rskip
   7224       \egroup
   7225       \cartbot
   7226   \egroup
   7227   \addgroupbox
   7228   \checkinserts
   7229 }
   7230 
   7231 
   7232 % This macro is called at the beginning of all the @example variants,
   7233 % inside a group.
   7234 \newdimen\nonfillparindent
   7235 \def\nonfillstart{%
   7236   \aboveenvbreak
   7237   \ifdim\hfuzz < 12pt \hfuzz = 12pt \fi % Don't be fussy
   7238   \sepspaces % Make spaces be word-separators rather than space tokens.
   7239   \let\par = \lisppar % don't ignore blank lines
   7240   \obeylines % each line of input is a line of output
   7241   \parskip = 0pt
   7242   % Turn off paragraph indentation but redefine \indent to emulate
   7243   % the normal \indent.
   7244   \nonfillparindent=\parindent
   7245   \parindent = 0pt
   7246   \let\indent\nonfillindent
   7247   %
   7248   \emergencystretch = 0pt % don't try to avoid overfull boxes
   7249   \ifx\nonarrowing\relax
   7250     \advance \leftskip by \lispnarrowing
   7251     \exdentamount=\lispnarrowing
   7252   \else
   7253     \let\nonarrowing = \relax
   7254   \fi
   7255   \let\exdent=\nofillexdent
   7256 }
   7257 
   7258 \begingroup
   7259 \obeyspaces
   7260 % We want to swallow spaces (but not other tokens) after the fake
   7261 % @indent in our nonfill-environments, where spaces are normally
   7262 % active and set to @tie, resulting in them not being ignored after
   7263 % @indent.
   7264 \gdef\nonfillindent{\futurelet\temp\nonfillindentcheck}%
   7265 \gdef\nonfillindentcheck{%
   7266 \ifx\temp %
   7267 \expandafter\nonfillindentgobble%
   7268 \else%
   7269 \leavevmode\nonfillindentbox%
   7270 \fi%
   7271 }%
   7272 \endgroup
   7273 \def\nonfillindentgobble#1{\nonfillindent}
   7274 \def\nonfillindentbox{\hbox to \nonfillparindent{\hss}}
   7275 
   7276 % If you want all examples etc. small: @set dispenvsize small.
   7277 % If you want even small examples the full size: @set dispenvsize nosmall.
   7278 % This affects the following displayed environments:
   7279 %    @example, @display, @format, @lisp, @verbatim
   7280 %
   7281 \def\smallword{small}
   7282 \def\nosmallword{nosmall}
   7283 \let\SETdispenvsize\relax
   7284 \def\setnormaldispenv{%
   7285   \ifx\SETdispenvsize\smallword
   7286     % end paragraph for sake of leading, in case document has no blank
   7287     % line.  This is redundant with what happens in \aboveenvbreak, but
   7288     % we need to do it before changing the fonts, and it's inconvenient
   7289     % to change the fonts afterward.
   7290     \ifnum \lastpenalty=10000 \else \endgraf \fi
   7291     \smallexamplefonts \rm
   7292   \fi
   7293 }
   7294 \def\setsmalldispenv{%
   7295   \ifx\SETdispenvsize\nosmallword
   7296   \else
   7297     \ifnum \lastpenalty=10000 \else \endgraf \fi
   7298     \smallexamplefonts \rm
   7299   \fi
   7300 }
   7301 
   7302 % We often define two environments, @foo and @smallfoo.
   7303 % Let's do it in one command.  #1 is the env name, #2 the definition.
   7304 \def\makedispenvdef#1#2{%
   7305   \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}%
   7306   \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}%
   7307   \expandafter\let\csname E#1\endcsname \afterenvbreak
   7308   \expandafter\let\csname Esmall#1\endcsname \afterenvbreak
   7309 }
   7310 
   7311 % Define two environment synonyms (#1 and #2) for an environment.
   7312 \def\maketwodispenvdef#1#2#3{%
   7313   \makedispenvdef{#1}{#3}%
   7314   \makedispenvdef{#2}{#3}%
   7315 }
   7316 %
   7317 % @lisp: indented, narrowed, typewriter font;
   7318 % @example: same as @lisp.
   7319 %
   7320 % @smallexample and @smalllisp: use smaller fonts.
   7321 % Originally contributed by Pavel@xerox.
   7322 %
   7323 \maketwodispenvdef{lisp}{example}{%
   7324   \nonfillstart
   7325   \tt\setcodequotes
   7326   \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
   7327   \parsearg\gobble
   7328 }
   7329 % @display/@smalldisplay: same as @lisp except keep current font.
   7330 %
   7331 \makedispenvdef{display}{%
   7332   \nonfillstart
   7333   \gobble
   7334 }
   7335 
   7336 % @format/@smallformat: same as @display except don't narrow margins.
   7337 %
   7338 \makedispenvdef{format}{%
   7339   \let\nonarrowing = t%
   7340   \nonfillstart
   7341   \gobble
   7342 }
   7343 
   7344 % @flushleft: same as @format, but doesn't obey \SETdispenvsize.
   7345 \envdef\flushleft{%
   7346   \let\nonarrowing = t%
   7347   \nonfillstart
   7348   \gobble
   7349 }
   7350 \let\Eflushleft = \afterenvbreak
   7351 
   7352 % @flushright.
   7353 %
   7354 \envdef\flushright{%
   7355   \let\nonarrowing = t%
   7356   \nonfillstart
   7357   \advance\leftskip by 0pt plus 1fill\relax
   7358   \gobble
   7359 }
   7360 \let\Eflushright = \afterenvbreak
   7361 
   7362 
   7363 % @raggedright does more-or-less normal line breaking but no right
   7364 % justification.  From plain.tex.
   7365 \envdef\raggedright{%
   7366   \rightskip0pt plus2.4em \spaceskip.3333em \xspaceskip.5em\relax
   7367 }
   7368 \let\Eraggedright\par
   7369 
   7370 
   7371 % @quotation does normal linebreaking (hence we can't use \nonfillstart)
   7372 % and narrows the margins.  We keep \parskip nonzero in general, since
   7373 % we're doing normal filling.  So, when using \aboveenvbreak and
   7374 % \afterenvbreak, temporarily make \parskip 0.
   7375 %
   7376 \makedispenvdef{quotation}{\quotationstart}
   7377 %
   7378 \def\quotationstart{%
   7379   \indentedblockstart % same as \indentedblock, but increase right margin too.
   7380   \ifx\nonarrowing\relax
   7381     \advance\rightskip by \lispnarrowing
   7382   \fi
   7383   \parsearg\quotationlabel
   7384 }
   7385 
   7386 % We have retained a nonzero parskip for the environment, since we're
   7387 % doing normal filling.
   7388 %
   7389 \def\Equotation{%
   7390   \par
   7391   \ifx\quotationauthor\thisisundefined\else
   7392     % indent a bit.
   7393     \leftline{\kern 2\leftskip \sl ---\quotationauthor}%
   7394   \fi
   7395   {\parskip=0pt \afterenvbreak}%
   7396 }
   7397 \def\Esmallquotation{\Equotation}
   7398 
   7399 % If we're given an argument, typeset it in bold with a colon after.
   7400 \def\quotationlabel#1{%
   7401   \def\temp{#1}%
   7402   \ifx\temp\empty \else
   7403     {\bf #1: }%
   7404   \fi
   7405 }
   7406 
   7407 % @indentedblock is like @quotation, but indents only on the left and
   7408 % has no optional argument.
   7409 %
   7410 \makedispenvdef{indentedblock}{\indentedblockstart}
   7411 %
   7412 \def\indentedblockstart{%
   7413   {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
   7414   \parindent=0pt
   7415   %
   7416   % @cartouche defines \nonarrowing to inhibit narrowing at next level down.
   7417   \ifx\nonarrowing\relax
   7418     \advance\leftskip by \lispnarrowing
   7419     \exdentamount = \lispnarrowing
   7420   \else
   7421     \let\nonarrowing = \relax
   7422   \fi
   7423 }
   7424 
   7425 % Keep a nonzero parskip for the environment, since we're doing normal filling.
   7426 %
   7427 \def\Eindentedblock{%
   7428   \par
   7429   {\parskip=0pt \afterenvbreak}%
   7430 }
   7431 \def\Esmallindentedblock{\Eindentedblock}
   7432 
   7433 
   7434 % LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>}
   7435 % If we want to allow any <char> as delimiter,
   7436 % we need the curly braces so that makeinfo sees the @verb command, eg:
   7437 % `@verbx...x' would look like the '@verbx' command.  --janneke@gnu.org
   7438 %
   7439 % [Knuth]: Donald Ervin Knuth, 1996.  The TeXbook.
   7440 %
   7441 % [Knuth] p.344; only we need to do the other characters Texinfo sets
   7442 % active too.  Otherwise, they get lost as the first character on a
   7443 % verbatim line.
   7444 \def\dospecials{%
   7445   \do\ \do\\\do\{\do\}\do\$\do\&%
   7446   \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~%
   7447   \do\<\do\>\do\|\do\@\do+\do\"%
   7448   % Don't do the quotes -- if we do, @set txicodequoteundirected and
   7449   % @set txicodequotebacktick will not have effect on @verb and
   7450   % @verbatim, and ?` and !` ligatures won't get disabled.
   7451   %\do\`\do\'%
   7452 }
   7453 %
   7454 % [Knuth] p. 380
   7455 \def\uncatcodespecials{%
   7456   \def\do##1{\catcode`##1=\other}\dospecials}
   7457 %
   7458 % Setup for the @verb command.
   7459 %
   7460 % Eight spaces for a tab
   7461 \begingroup
   7462   \catcode`\^^I=\active
   7463   \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }}
   7464 \endgroup
   7465 %
   7466 \def\setupverb{%
   7467   \tt
   7468   \def\par{\leavevmode\endgraf}%
   7469   \parindent = 0pt
   7470   \setcodequotes
   7471   \tabeightspaces
   7472   % Respect line breaks,
   7473   % print special symbols as themselves, and
   7474   % make each space count
   7475   % must do in this order:
   7476   \obeylines \uncatcodespecials \sepspaces
   7477 }
   7478 
   7479 % Setup for the @verbatim environment
   7480 %
   7481 % Real tab expansion.
   7482 \newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount
   7483 %
   7484 % We typeset each line of the verbatim in an \hbox, so we can handle
   7485 % tabs.
   7486 \newbox\verbbox
   7487 \def\starttabbox{\setbox\verbbox=\hbox\bgroup}
   7488 %
   7489 \begingroup
   7490   \catcode`\^^I=\active
   7491   \gdef\tabexpand{%
   7492     \catcode`\^^I=\active
   7493     \def^^I{\leavevmode\egroup
   7494       \dimen\verbbox=\wd\verbbox % the width so far, or since the previous tab
   7495       \divide\dimen\verbbox by\tabw
   7496       \multiply\dimen\verbbox by\tabw % compute previous multiple of \tabw
   7497       \advance\dimen\verbbox by\tabw  % advance to next multiple of \tabw
   7498       \wd\verbbox=\dimen\verbbox
   7499       \leavevmode\box\verbbox \starttabbox
   7500     }%
   7501   }
   7502 \endgroup
   7503 
   7504 % start the verbatim environment.
   7505 \def\setupverbatim{%
   7506   \let\nonarrowing = t%
   7507   \nonfillstart
   7508   \tt % easiest (and conventionally used) font for verbatim
   7509   \def\par{\egroup\leavevmode\box\verbbox\endgraf\starttabbox}%
   7510   \tabexpand
   7511   \setcodequotes
   7512   % Respect line breaks,
   7513   % print special symbols as themselves, and
   7514   % make each space count.
   7515   % Must do in this order:
   7516   \obeylines \uncatcodespecials \sepspaces
   7517 }
   7518 
   7519 % Do the @verb magic: verbatim text is quoted by unique
   7520 % delimiter characters.  Before first delimiter expect a
   7521 % right brace, after last delimiter expect closing brace:
   7522 %
   7523 %    \def\doverb'{'<char>#1<char>'}'{#1}
   7524 %
   7525 % [Knuth] p. 382; only eat outer {}
   7526 \begingroup
   7527   \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other
   7528   \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next]
   7529 \endgroup
   7530 %
   7531 \def\verb{\begingroup\setupverb\doverb}
   7532 %
   7533 %
   7534 % Do the @verbatim magic: define the macro \doverbatim so that
   7535 % the (first) argument ends when '@end verbatim' is reached, ie:
   7536 %
   7537 %     \def\doverbatim#1@end verbatim{#1}
   7538 %
   7539 % For Texinfo it's a lot easier than for LaTeX,
   7540 % because texinfo's \verbatim doesn't stop at '\end{verbatim}':
   7541 % we need not redefine '\', '{' and '}'.
   7542 %
   7543 % Inspired by LaTeX's verbatim command set [latex.ltx]
   7544 %
   7545 \begingroup
   7546   \catcode`\ =\active
   7547   \obeylines %
   7548   % ignore everything up to the first ^^M, that's the newline at the end
   7549   % of the @verbatim input line itself.  Otherwise we get an extra blank
   7550   % line in the output.
   7551   \xdef\doverbatim#1^^M#2@end verbatim{%
   7552     \starttabbox#2\egroup\noexpand\end\gobble verbatim}%
   7553   % We really want {...\end verbatim} in the body of the macro, but
   7554   % without the active space; thus we have to use \xdef and \gobble.
   7555   % The \egroup ends the \verbbox started at the end of the last line in
   7556   % the block.
   7557 \endgroup
   7558 %
   7559 \envdef\verbatim{%
   7560     \setnormaldispenv\setupverbatim\doverbatim
   7561 }
   7562 \let\Everbatim = \afterenvbreak
   7563 
   7564 
   7565 % @verbatiminclude FILE - insert text of file in verbatim environment.
   7566 %
   7567 \def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude}
   7568 %
   7569 \def\doverbatiminclude#1{%
   7570   {%
   7571     \makevalueexpandable
   7572     \setupverbatim
   7573     {%
   7574       \indexnofonts       % Allow `@@' and other weird things in file names.
   7575       \wlog{texinfo.tex: doing @verbatiminclude of #1^^J}%
   7576       \edef\tmp{\noexpand\input #1 }
   7577       \expandafter
   7578     }\expandafter\starttabbox\tmp\egroup
   7579     \afterenvbreak
   7580   }%
   7581 }
   7582 
   7583 % @copying ... @end copying.
   7584 % Save the text away for @insertcopying later.
   7585 %
   7586 % We save the uninterpreted tokens, rather than creating a box.
   7587 % Saving the text in a box would be much easier, but then all the
   7588 % typesetting commands (@smallbook, font changes, etc.) have to be done
   7589 % beforehand -- and a) we want @copying to be done first in the source
   7590 % file; b) letting users define the frontmatter in as flexible order as
   7591 % possible is desirable.
   7592 %
   7593 \def\copying{\checkenv{}\begingroup\macrobodyctxt\docopying}
   7594 {\catcode`\ =\other
   7595 \gdef\docopying#1@end copying{\endgroup\def\copyingtext{#1}}
   7596 }
   7597 
   7598 \def\insertcopying{%
   7599   \begingroup
   7600     \parindent = 0pt  % paragraph indentation looks wrong on title page
   7601     \scanexp\copyingtext
   7602   \endgroup
   7603 }
   7604 
   7605 
   7606 \message{defuns,}
   7607 % @defun etc.
   7608 
   7609 \newskip\defbodyindent \defbodyindent=.4in
   7610 \newskip\defargsindent \defargsindent=50pt
   7611 \newskip\deflastargmargin \deflastargmargin=18pt
   7612 \newcount\defunpenalty
   7613 
   7614 % Start the processing of @deffn:
   7615 \def\startdefun{%
   7616   \ifnum\lastpenalty<10000
   7617     \medbreak
   7618     \defunpenalty=10003 % Will keep this @deffn together with the
   7619                         % following @def command, see below.
   7620   \else
   7621     % If there are two @def commands in a row, we'll have a \nobreak,
   7622     % which is there to keep the function description together with its
   7623     % header.  But if there's nothing but headers, we need to allow a
   7624     % break somewhere.  Check specifically for penalty 10002, inserted
   7625     % by \printdefunline, instead of 10000, since the sectioning
   7626     % commands also insert a nobreak penalty, and we don't want to allow
   7627     % a break between a section heading and a defun.
   7628     %
   7629     % As a further refinement, we avoid "club" headers by signalling
   7630     % with penalty of 10003 after the very first @deffn in the
   7631     % sequence (see above), and penalty of 10002 after any following
   7632     % @def command.
   7633     \ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \fi
   7634     %
   7635     % Similarly, after a section heading, do not allow a break.
   7636     % But do insert the glue.
   7637     \medskip  % preceded by discardable penalty, so not a breakpoint
   7638   \fi
   7639   %
   7640   \parindent=0in
   7641   \advance\leftskip by \defbodyindent
   7642   \exdentamount=\defbodyindent
   7643 }
   7644 
   7645 % Called as \printdefunline \deffooheader{text}
   7646 %
   7647 \def\printdefunline#1#2{%
   7648   \begingroup
   7649     \plainfrenchspacing
   7650     % call \deffooheader:
   7651     #1#2 \endheader
   7652     % common ending:
   7653     \interlinepenalty = 10000
   7654     \advance\rightskip by 0pt plus 1fil\relax
   7655     \endgraf
   7656     \nobreak\vskip -\parskip
   7657     \penalty\defunpenalty  % signal to \startdefun and \deffoox
   7658     % Some of the @defun-type tags do not enable magic parentheses,
   7659     % rendering the following check redundant.  But we don't optimize.
   7660     \checkparencounts
   7661   \endgroup
   7662 }
   7663 
   7664 \def\Edefun{\endgraf\medbreak}
   7665 
   7666 % @defblock, @defline do not automatically create index entries
   7667 \envdef\defblock{%
   7668   \startdefun
   7669 }
   7670 \let\Edefblock\Edefun
   7671 
   7672 \def\defline{%
   7673   \doingtypefnfalse
   7674   \parseargusing\activeparens{\printdefunline\deflineheader}%
   7675 }
   7676 \def\deflineheader#1 #2 #3\endheader{%
   7677   \printdefname{#1}{}{#2}\magicamp\defunargs{#3\unskip}%
   7678 }
   7679 
   7680 \def\deftypeline{%
   7681   \doingtypefntrue
   7682   \parseargusing\activeparens{\printdefunline\deftypelineheader}%
   7683 }
   7684 \def\deftypelineheader#1 #2 #3 #4\endheader{%
   7685   \printdefname{#1}{#2}{#3}\magicamp\defunargs{#4\unskip}%
   7686 }
   7687 
   7688 % \makedefun{deffoo} (\deffooheader parameters) { (\deffooheader expansion) }
   7689 %
   7690 % Define \deffoo, \deffoox  \Edeffoo and \deffooheader.
   7691 \def\makedefun#1{%
   7692   \expandafter\let\csname E#1\endcsname = \Edefun
   7693   \edef\temp{\noexpand\domakedefun
   7694     \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}%
   7695   \temp
   7696 }
   7697 \def\domakedefun#1#2#3{%
   7698   \envdef#1{%
   7699     \startdefun
   7700     \doingtypefnfalse    % distinguish typed functions from all else
   7701     \parseargusing\activeparens{\printdefunline#3}%
   7702   }%
   7703   \def#2{%
   7704     % First, check whether we are in the right environment:
   7705     \checkenv#1%
   7706     %
   7707     % As in \startdefun, allow line break if we have multiple x headers
   7708     % in a row.  It's not a great place, though.
   7709     \ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi
   7710     %
   7711     \doingtypefnfalse    % distinguish typed functions from all else
   7712     \parseargusing\activeparens{\printdefunline#3}%
   7713   }%
   7714   \def#3% definition of \deffooheader follows
   7715 }
   7716 
   7717 \newif\ifdoingtypefn       % doing typed function?
   7718 \newif\ifrettypeownline    % typeset return type on its own line?
   7719 
   7720 % @deftypefnnewline on|off says whether the return type of typed functions
   7721 % are printed on their own line.  This affects @deftypefn, @deftypefun,
   7722 % @deftypeop, and @deftypemethod.
   7723 %
   7724 \parseargdef\deftypefnnewline{%
   7725   \def\temp{#1}%
   7726   \ifx\temp\onword
   7727     \expandafter\let\csname SETtxideftypefnnl\endcsname
   7728       = \empty
   7729   \else\ifx\temp\offword
   7730     \expandafter\let\csname SETtxideftypefnnl\endcsname
   7731       = \relax
   7732   \else
   7733     \errhelp = \EMsimple
   7734     \errmessage{Unknown @txideftypefnnl value `\temp',
   7735                 must be on|off}%
   7736   \fi\fi
   7737 }
   7738 
   7739 % Untyped functions:
   7740 
   7741 % @deffn category name args
   7742 \makedefun{deffn}#1 #2 #3\endheader{%
   7743   \doind{fn}{\code{#2}}%
   7744   \printdefname{#1}{}{#2}\magicamp\defunargs{#3\unskip}%
   7745 }
   7746 
   7747 % @defop category class name args
   7748 \makedefun{defop}#1 {\defopheaderx{#1\ \putwordon}}
   7749 \def\defopheaderx#1#2 #3 #4\endheader{%
   7750   \doind{fn}{\code{#3}\space\putwordon\ \code{#2}}%
   7751   \printdefname{#1\ \code{#2}}{}{#3}\magicamp\defunargs{#4\unskip}%
   7752 }
   7753 
   7754 % Typed functions:
   7755 
   7756 % @deftypefn category type name args
   7757 \makedefun{deftypefn}#1 #2 #3 #4\endheader{%
   7758   \doind{fn}{\code{#3}}%
   7759   \doingtypefntrue
   7760   \printdefname{#1}{#2}{#3}\defunargs{#4\unskip}%
   7761 }
   7762 
   7763 % @deftypeop category class type name args
   7764 \makedefun{deftypeop}#1 {\deftypeopheaderx{#1\ \putwordon}}
   7765 \def\deftypeopheaderx#1#2 #3 #4 #5\endheader{%
   7766   \doind{fn}{\code{#4}\space\putwordon\ \code{#1\ \code{#2}}}%
   7767   \doingtypefntrue
   7768   \printdefname{#1\ \code{#2}}{#3}{#4}\defunargs{#5\unskip}%
   7769 }
   7770 
   7771 % Typed variables:
   7772 
   7773 % @deftypevr category type var args
   7774 \makedefun{deftypevr}#1 #2 #3 #4\endheader{%
   7775   \doind{vr}{\code{#3}}%
   7776   \printdefname{#1}{#2}{#3}\defunargs{#4\unskip}%
   7777 }
   7778 
   7779 % @deftypecv category class type var args
   7780 \makedefun{deftypecv}#1 {\deftypecvheaderx{#1\ \putwordof}}
   7781 \def\deftypecvheaderx#1#2 #3 #4 #5\endheader{%
   7782   \doind{vr}{\code{#4}\space\putwordof\ \code{#2}}%
   7783   \printdefname{#1\ \code{#2}}{#3}{#4}\defunargs{#5\unskip}%
   7784 }
   7785 
   7786 % Untyped variables:
   7787 
   7788 % @defvr category var args
   7789 \makedefun{defvr}#1 {\deftypevrheader{#1} {} }
   7790 
   7791 % @defcv category class var args
   7792 \makedefun{defcv}#1 {\defcvheaderx{#1\ \putwordof}}
   7793 \def\defcvheaderx#1#2 {\deftypecvheaderx{#1}#2 {} }
   7794 
   7795 % Types:
   7796 
   7797 % @deftp category name args
   7798 \makedefun{deftp}#1 #2 #3\endheader{%
   7799   \doind{tp}{\code{#2}}%
   7800   \printdefname{#1}{}{#2}\defunargs{#3\unskip}%
   7801 }
   7802 
   7803 % Remaining @defun-like shortcuts:
   7804 \makedefun{defun}{\deffnheader{\putwordDeffunc} }
   7805 \makedefun{defmac}{\deffnheader{\putwordDefmac} }
   7806 \makedefun{defspec}{\deffnheader{\putwordDefspec} }
   7807 \makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} }
   7808 \makedefun{defvar}{\defvrheader{\putwordDefvar} }
   7809 \makedefun{defopt}{\defvrheader{\putwordDefopt} }
   7810 \makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} }
   7811 \makedefun{defmethod}{\defopheaderx\putwordMethodon}
   7812 \makedefun{deftypemethod}{\deftypeopheaderx\putwordMethodon}
   7813 \makedefun{defivar}{\defcvheaderx\putwordInstanceVariableof}
   7814 \makedefun{deftypeivar}{\deftypecvheaderx\putwordInstanceVariableof}
   7815 
   7816 % \printdefname, which formats the name of the @def (not the args).
   7817 % #1 is the category, such as "Function".
   7818 % #2 is the return type, if any.
   7819 % #3 is the function name.
   7820 %
   7821 % We are followed by (but not passed) the arguments, if any.
   7822 %
   7823 \def\printdefname#1#2#3{%
   7824   \par
   7825   % Get the values of \leftskip and \rightskip as they were outside the @def...
   7826   \advance\leftskip by -\defbodyindent
   7827   %
   7828   % Determine if we are typesetting the return type of a typed function
   7829   % on a line by itself.
   7830   \rettypeownlinefalse
   7831   \ifdoingtypefn  % doing a typed function specifically?
   7832     % then check user option for putting return type on its own line:
   7833     \ifflagclear{txideftypefnnl}{}{\rettypeownlinetrue}%
   7834   \fi
   7835   %
   7836   % How we'll format the category name.  Putting it in brackets helps
   7837   % distinguish it from the body text that may end up on the next line
   7838   % just below it.
   7839   \def\temp{#1}%
   7840   \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi}
   7841   %
   7842   % Figure out line sizes for the paragraph shape.  We'll always have at
   7843   % least two.
   7844   \tempnum = 2
   7845   %
   7846   % The first line needs space for \box0; but if \rightskip is nonzero,
   7847   % we need only space for the part of \box0 which exceeds it:
   7848   \dimen0=\hsize  \advance\dimen0 by -\wd0  \advance\dimen0 by \rightskip
   7849   %
   7850   % If doing a return type on its own line, we'll have another line.
   7851   \ifrettypeownline
   7852     \advance\tempnum by 1
   7853     \def\maybeshapeline{0in \hsize}%
   7854   \else
   7855     \def\maybeshapeline{}%
   7856   \fi
   7857   %
   7858   % The continuations:
   7859   \dimen2=\hsize  \advance\dimen2 by -\defargsindent
   7860   %
   7861   % The final paragraph shape:
   7862   \parshape \tempnum  0in \dimen0  \maybeshapeline  \defargsindent \dimen2
   7863   %
   7864   % Put the category name at the right margin.
   7865   \noindent
   7866   \hbox to 0pt{%
   7867     \hfil\box0 \kern-\hsize
   7868     % \hsize has to be shortened this way:
   7869     \kern\leftskip
   7870     % Intentionally do not respect \rightskip, since we need the space.
   7871   }%
   7872   %
   7873   % Allow all lines to be underfull without complaint:
   7874   \tolerance=10000 \hbadness=10000
   7875   \exdentamount=\defbodyindent
   7876   {%
   7877     \def\^^M{}% for line continuation
   7878     %
   7879     % defun fonts. We use typewriter by default (used to be bold) because:
   7880     % . we're printing identifiers, they should be in tt in principle.
   7881     % . in languages with many accents, such as Czech or French, it's
   7882     %   common to leave accents off identifiers.  The result looks ok in
   7883     %   tt, but exceedingly strange in rm.
   7884     % . we don't want -- and --- to be treated as ligatures.
   7885     % . this still does not fix the ?` and !` ligatures, but so far no
   7886     %   one has made identifiers using them :).
   7887     \df \tt
   7888     \def\temp{#2}% text of the return type
   7889     \ifx\temp\empty\else
   7890       \tclose{\temp}% typeset the return type
   7891       \ifrettypeownline
   7892         % put return type on its own line; prohibit line break following:
   7893         \hfil\vadjust{\nobreak}\break
   7894       \else
   7895         \space  % type on same line, so just followed by a space
   7896       \fi
   7897     \fi           % no return type
   7898     #3% output function name
   7899   }%
   7900   \ifflagclear{txidefnamenospace}{%
   7901     {\rm\enskip}% hskip 0.5 em of \rmfont
   7902   }{}%
   7903   %
   7904   \boldbrax
   7905   % arguments will be output next, if any.
   7906 }
   7907 
   7908 % Print arguments.  Use slanted for @def*, typewriter for @deftype*.
   7909 \def\defunargs#1{%
   7910   \bgroup
   7911     \def\^^M{}% for line continuation
   7912     \df \ifdoingtypefn \tt \else \sl \fi
   7913     \ifflagclear{txicodevaristt}{}%
   7914        {\def\var##1{{\setregularquotes \ttsl ##1}}}%
   7915     #1%
   7916   \egroup
   7917 }
   7918 
   7919 % We want ()&[] to print specially on the defun line.
   7920 %
   7921 \def\activeparens{%
   7922   \catcode`\(=\active \catcode`\)=\active
   7923   \catcode`\[=\active \catcode`\]=\active
   7924   \catcode`\&=\active
   7925 }
   7926 
   7927 % Make control sequences which act like normal parenthesis chars.
   7928 \let\lparen = ( \let\rparen = )
   7929 
   7930 % Be sure that we always have a definition for `(', etc.  For example,
   7931 % if the fn name has parens in it, \boldbrax will not be in effect yet,
   7932 % so TeX would otherwise complain about undefined control sequence.
   7933 {
   7934   \activeparens
   7935   \gdef\defcharsdefault{%
   7936     \let(=\lparen \let)=\rparen
   7937     \let[=\lbrack \let]=\rbrack
   7938     \let& = \&%
   7939   }
   7940   \globaldefs=1 \defcharsdefault
   7941 
   7942   \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
   7943   \gdef\magicamp{\let&=\amprm}
   7944 }
   7945 \let\ampchar\&
   7946 
   7947 \newcount\parencount
   7948 
   7949 % If we encounter &foo, then turn on ()-hacking afterwards
   7950 \newif\ifampseen
   7951 \def\amprm#1 {\ampseentrue{\rm\&#1 }}
   7952 
   7953 \def\parenfont{%
   7954   \ifampseen
   7955     % At the first level, print parens in roman,
   7956     % otherwise use the default font.
   7957     \ifnum \parencount=1 \rm \fi
   7958   \else
   7959     % The \sf parens (in \boldbrax) actually are a little bolder than
   7960     % the contained text.  This is especially needed for [ and ] .
   7961     \sf
   7962   \fi
   7963 }
   7964 \def\infirstlevel#1{%
   7965   \ifampseen
   7966     \ifnum\parencount=1
   7967       #1%
   7968     \fi
   7969   \fi
   7970 }
   7971 \def\bfafterword#1 {#1 \bf}
   7972 
   7973 \def\opnr{%
   7974   \global\advance\parencount by 1
   7975   {\parenfont(}%
   7976   \infirstlevel \bfafterword
   7977 }
   7978 \def\clnr{%
   7979   {\parenfont)}%
   7980   \infirstlevel \sl
   7981   \global\advance\parencount by -1
   7982 }
   7983 
   7984 \newcount\brackcount
   7985 \def\lbrb{%
   7986   \global\advance\brackcount by 1
   7987   {\bf[}%
   7988 }
   7989 \def\rbrb{%
   7990   {\bf]}%
   7991   \global\advance\brackcount by -1
   7992 }
   7993 
   7994 \def\checkparencounts{%
   7995   \ifnum\parencount=0 \else \badparencount \fi
   7996   \ifnum\brackcount=0 \else \badbrackcount \fi
   7997 }
   7998 % these should not use \errmessage; the glibc manual, at least, actually
   7999 % has such constructs (when documenting function pointers).
   8000 \def\badparencount{%
   8001   \message{Warning: unbalanced parentheses in @def...}%
   8002   \global\parencount=0
   8003 }
   8004 \def\badbrackcount{%
   8005   \message{Warning: unbalanced square brackets in @def...}%
   8006   \global\brackcount=0
   8007 }
   8008 
   8009 
   8010 \message{macros,}
   8011 % @macro.
   8012 
   8013 % To do this right we need a feature of e-TeX, \scantokens,
   8014 % which we arrange to emulate with a temporary file in ordinary TeX.
   8015 \ifx\eTeXversion\thisisundefined
   8016   \newwrite\macscribble
   8017   \def\scantokens#1{%
   8018     \toks0={#1}%
   8019     \immediate\openout\macscribble=\jobname.tmp
   8020     \immediate\write\macscribble{\the\toks0}%
   8021     \immediate\closeout\macscribble
   8022     \input \jobname.tmp
   8023   }
   8024 \fi
   8025 
   8026 \let\E=\expandafter
   8027 
   8028 % Used at the time of macro expansion.
   8029 % Argument is macro body with arguments substituted
   8030 \def\scanmacro#1{%
   8031   \newlinechar`\^^M
   8032   % expand the expansion of \eatleadingcr twice to maybe remove a leading
   8033   % newline (and \else and \fi tokens), then call \eatspaces on the result.
   8034   \def\xeatspaces##1{%
   8035     \E\E\E\E\E\E\E\eatspaces\E\E\E\E\E\E\E{\eatleadingcr##1%
   8036   }}%
   8037   \def\xempty##1{}%
   8038   %
   8039   % Process the macro body under the current catcode regime.
   8040   \scantokens{#1@comment}%
   8041   %
   8042   % The \comment is to remove the \newlinechar added by \scantokens, and
   8043   % can be noticed by \parsearg.  Note \c isn't used because this means cedilla
   8044   % in math mode.
   8045 }
   8046 
   8047 % Used for copying and captions
   8048 \def\scanexp#1{%
   8049   \expandafter\scanmacro\expandafter{#1}%
   8050 }
   8051 
   8052 \newcount\paramno   % Count of parameters
   8053 \newtoks\macname    % Macro name
   8054 \newif\ifrecursive  % Is it recursive?
   8055 
   8056 % List of all defined macros in the form
   8057 %    \commondummyword\macro1\commondummyword\macro2...
   8058 % Currently is also contains all @aliases; the list can be split
   8059 % if there is a need.
   8060 \def\macrolist{}
   8061 
   8062 % Add the macro to \macrolist
   8063 \def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname}
   8064 \def\addtomacrolistxxx#1{%
   8065      \toks0 = \expandafter{\macrolist\commondummyword#1}%
   8066      \xdef\macrolist{\the\toks0}%
   8067 }
   8068 
   8069 % Utility routines.
   8070 % This does \let #1 = #2, with \csnames; that is,
   8071 %   \let \csname#1\endcsname = \csname#2\endcsname
   8072 % (except of course we have to play expansion games).
   8073 %
   8074 \def\cslet#1#2{%
   8075   \expandafter\let
   8076   \csname#1\expandafter\endcsname
   8077   \csname#2\endcsname
   8078 }
   8079 
   8080 % Trim leading and trailing spaces off a string.
   8081 % Concepts from aro-bend problem 15 (see CTAN).
   8082 {\catcode`\@=11
   8083 \gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }}
   8084 \gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@}
   8085 \gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @}
   8086 \def\unbrace#1{#1}
   8087 \unbrace{\gdef\trim@@@ #1 } #2@{#1}
   8088 }
   8089 
   8090 {\catcode`\^^M=\other%
   8091 \gdef\eatleadingcr#1{\if\noexpand#1\noexpand^^M\else\E#1\fi}}%
   8092 % Warning: this won't work for a delimited argument
   8093 % or for an empty argument
   8094 
   8095 % Trim a single trailing ^^M off a string.
   8096 {\catcode`\^^M=\other \catcode`\Q=3%
   8097 \gdef\eatcr #1{\eatcra #1Q^^MQ}%
   8098 \gdef\eatcra#1^^MQ{\eatcrb#1Q}%
   8099 \gdef\eatcrb#1Q#2Q{#1}%
   8100 }
   8101 
   8102 % Macro bodies are absorbed as an argument in a context where
   8103 % all characters are catcode 10, 11 or 12, except \ which is active
   8104 % (as in normal texinfo). It is necessary to change the definition of \
   8105 % to recognize macro arguments; this is the job of \mbodybackslash.
   8106 %
   8107 % Non-ASCII encodings make 8-bit characters active, so un-activate
   8108 % them to avoid their expansion.  Must do this non-globally, to
   8109 % confine the change to the current group.
   8110 %
   8111 % It's necessary to have hard CRs when the macro is executed. This is
   8112 % done by making ^^M (\endlinechar) catcode 12 when reading the macro
   8113 % body, and then making it the \newlinechar in \scanmacro.
   8114 %
   8115 \def\scanctxt{% used as subroutine
   8116   \catcode`\"=\other
   8117   \catcode`\+=\other
   8118   \catcode`\<=\other
   8119   \catcode`\>=\other
   8120   \catcode`\^=\other
   8121   \catcode`\_=\other
   8122   \catcode`\|=\other
   8123   \catcode`\~=\other
   8124   \catcode`\@=\other
   8125   \catcode`\^^M=\other
   8126   \catcode`\\=\active
   8127   \passthroughcharstrue
   8128 }
   8129 
   8130 \def\macrobodyctxt{% used for @macro definitions and @copying
   8131   \scanctxt
   8132   \catcode`\ =\other
   8133   \catcode`\{=\other
   8134   \catcode`\}=\other
   8135 }
   8136 
   8137 % Used when scanning braced macro arguments.  Note, however, that catcode
   8138 % changes here are ineffectual if the macro invocation was nested inside
   8139 % an argument to another Texinfo command.
   8140 \def\macroargctxt{%
   8141   \scanctxt
   8142   \catcode`\ =\active
   8143 }
   8144 
   8145 \def\macrolineargctxt{% used for whole-line arguments without braces
   8146   \scanctxt
   8147   \catcode`\{=\other
   8148   \catcode`\}=\other
   8149 }
   8150 
   8151 % \mbodybackslash is the definition of \ in @macro bodies.
   8152 % It maps \foo\ => \csname macarg.foo\endcsname => #N
   8153 % where N is the macro parameter number.
   8154 % We define \csname macarg.\endcsname to be \realbackslash, so
   8155 % \\ in macro replacement text gets you a backslash.
   8156 %
   8157 {\catcode`@=0 @catcode`@\=@active
   8158  @gdef@usembodybackslash{@let\=@mbodybackslash}
   8159  @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname}
   8160 }
   8161 \expandafter\def\csname macarg.\endcsname{\realbackslash}
   8162 
   8163 \def\margbackslash#1{\char`\#1 }
   8164 
   8165 \def\macro{\recursivefalse\parsearg\macroxxx}
   8166 \def\rmacro{\recursivetrue\parsearg\macroxxx}
   8167 
   8168 \def\macroxxx#1{%
   8169   \getargs{#1}% now \macname is the macname and \argl the arglist
   8170   \ifx\argl\empty       % no arguments
   8171      \paramno=0\relax
   8172   \else
   8173      \expandafter\parsemargdef \argl;%
   8174      \if\paramno>256\relax
   8175        \ifx\eTeXversion\thisisundefined
   8176          \errhelp = \EMsimple
   8177          \errmessage{You need eTeX to compile a file with macros with more than 256 arguments}
   8178        \fi
   8179      \fi
   8180   \fi
   8181   \if1\csname ismacro.\the\macname\endcsname
   8182      \message{Warning: redefining \the\macname}%
   8183   \else
   8184      \expandafter\ifx\csname \the\macname\endcsname \relax
   8185      \else \errmessage{Macro name \the\macname\space already defined}\fi
   8186      \global\cslet{macsave.\the\macname}{\the\macname}%
   8187      \global\expandafter\let\csname ismacro.\the\macname\endcsname=1%
   8188      \addtomacrolist{\the\macname}%
   8189   \fi
   8190   \begingroup \macrobodyctxt \usembodybackslash
   8191   \ifrecursive \expandafter\parsermacbody
   8192   \else \expandafter\parsemacbody
   8193   \fi}
   8194 
   8195 \parseargdef\unmacro{%
   8196   \if1\csname ismacro.#1\endcsname
   8197     \global\cslet{#1}{macsave.#1}%
   8198     \global\expandafter\let \csname ismacro.#1\endcsname=0%
   8199     % Remove the macro name from \macrolist:
   8200     \begingroup
   8201       \expandafter\let\csname#1\endcsname \relax
   8202       \let\commondummyword\unmacrodo
   8203       \xdef\macrolist{\macrolist}%
   8204     \endgroup
   8205   \fi
   8206 }
   8207 
   8208 % Called by \do from \dounmacro on each macro.  The idea is to omit any
   8209 % macro definitions that have been changed to \relax.
   8210 %
   8211 \def\unmacrodo#1{%
   8212   \ifx #1\relax
   8213     % remove this
   8214   \else
   8215     \noexpand\commondummyword \noexpand#1%
   8216   \fi
   8217 }
   8218 
   8219 % \getargs -- Parse the arguments to a @macro line.  Set \macname to
   8220 % the name of the macro, and \argl to the braced argument list.
   8221 \def\getargs#1{\getargsxxx#1{}}
   8222 \def\getargsxxx#1#{\getmacname #1 \relax\getmacargs}
   8223 \def\getmacname#1 #2\relax{\macname={#1}}
   8224 \def\getmacargs#1{\def\argl{#1}}
   8225 % This made use of the feature that if the last token of a
   8226 % <parameter list> is #, then the preceding argument is delimited by
   8227 % an opening brace, and that opening brace is not consumed.
   8228 
   8229 % Parse the optional {params} list to @macro or @rmacro.
   8230 % Set \paramno to the number of arguments,
   8231 % and \paramlist to a parameter text for the macro (e.g. #1,#2,#3 for a
   8232 % three-param macro.)  Define \macarg.BLAH for each BLAH in the params
   8233 % list to some hook where the argument is to be expanded.  If there are
   8234 % less than 10 arguments that hook is to be replaced by ##N where N
   8235 % is the position in that list, that is to say the macro arguments are to be
   8236 % defined `a la TeX in the macro body.
   8237 %
   8238 % That gets used by \mbodybackslash (above).
   8239 %
   8240 % If there are 10 or more arguments, a different technique is used: see
   8241 % \parsemmanyargdef.
   8242 %
   8243 \def\parsemargdef#1;{%
   8244   \paramno=0\def\paramlist{}%
   8245   \let\hash\relax
   8246   % \hash is redefined to `#' later to get it into definitions
   8247   \let\xeatspaces\relax
   8248   \let\xempty\relax
   8249   \parsemargdefxxx#1,;,%
   8250   \ifnum\paramno<10\relax\else
   8251     \paramno0\relax
   8252     \parsemmanyargdef@@#1,;,% 10 or more arguments
   8253   \fi
   8254 }
   8255 \def\parsemargdefxxx#1,{%
   8256   \if#1;\let\next=\relax
   8257   \else \let\next=\parsemargdefxxx
   8258     \advance\paramno by 1
   8259     \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname
   8260         {\xeatspaces{\hash\the\paramno\noexpand\xempty{}}}%
   8261     \edef\paramlist{\paramlist\hash\the\paramno,}%
   8262   \fi\next}
   8263 % the \xempty{} is to give \eatleadingcr an argument in the case of an
   8264 % empty macro argument.
   8265 
   8266 % \parsemacbody, \parsermacbody
   8267 %
   8268 % Read recursive and nonrecursive macro bodies. (They're different since
   8269 % rec and nonrec macros end differently.)
   8270 %
   8271 % We are in \macrobodyctxt, and the \xdef causes backslashes in the macro
   8272 % body to be transformed.
   8273 % Set \macrobody to the body of the macro, and call \macrodef.
   8274 %
   8275 {\catcode`\ =\other\long\gdef\parsemacbody#1@end macro{%
   8276 \xdef\macrobody{\eatcr{#1}}\endgroup\macrodef}}%
   8277 {\catcode`\ =\other\long\gdef\parsermacbody#1@end rmacro{%
   8278 \xdef\macrobody{\eatcr{#1}}\endgroup\macrodef}}%
   8279 
   8280 % Make @ a letter, so that we can make private-to-Texinfo macro names.
   8281 \edef\texiatcatcode{\the\catcode`\@}
   8282 \catcode `@=11\relax
   8283 
   8284 %%%%%%%%%%%%%% Code for > 10 arguments only   %%%%%%%%%%%%%%%%%%
   8285 
   8286 % If there are 10 or more arguments, a different technique is used, where the
   8287 % hook remains in the body, and when macro is to be expanded the body is
   8288 % processed again to replace the arguments.
   8289 %
   8290 % In that case, the hook is \the\toks N-1, and we simply set \toks N-1 to the
   8291 % argument N value and then \edef the body (nothing else will expand because of
   8292 % the catcode regime under which the body was input).
   8293 %
   8294 % If you compile with TeX (not eTeX), and you have macros with 10 or more
   8295 % arguments, no macro can have more than 256 arguments (else error).
   8296 %
   8297 % In case that there are 10 or more arguments we parse again the arguments
   8298 % list to set new definitions for the \macarg.BLAH macros corresponding to
   8299 % each BLAH argument. It was anyhow needed to parse already once this list
   8300 % in order to count the arguments, and as macros with at most 9 arguments
   8301 % are by far more frequent than macro with 10 or more arguments, defining
   8302 % twice the \macarg.BLAH macros does not cost too much processing power.
   8303 \def\parsemmanyargdef@@#1,{%
   8304   \if#1;\let\next=\relax
   8305   \else
   8306     \let\next=\parsemmanyargdef@@
   8307     \edef\tempb{\eatspaces{#1}}%
   8308     \expandafter\def\expandafter\tempa
   8309        \expandafter{\csname macarg.\tempb\endcsname}%
   8310     % Note that we need some extra \noexpand\noexpand, this is because we
   8311     % don't want \the  to be expanded in the \parsermacbody  as it uses an
   8312     % \xdef .
   8313     \expandafter\edef\tempa
   8314       {\noexpand\noexpand\noexpand\the\toks\the\paramno}%
   8315     \advance\paramno by 1\relax
   8316   \fi\next}
   8317 
   8318 
   8319 \let\endargs@\relax
   8320 \let\nil@\relax
   8321 \def\nilm@{\nil@}%
   8322 \long\def\nillm@{\nil@}%
   8323 
   8324 % This macro is expanded during the Texinfo macro expansion, not during its
   8325 % definition.  It gets all the arguments' values and assigns them to macros
   8326 % macarg.ARGNAME
   8327 %
   8328 % #1 is the macro name
   8329 % #2 is the list of argument names
   8330 % #3 is the list of argument values
   8331 \def\getargvals@#1#2#3{%
   8332   \def\macargdeflist@{}%
   8333   \def\saveparamlist@{#2}% Need to keep a copy for parameter expansion.
   8334   \def\paramlist{#2,\nil@}%
   8335   \def\macroname{#1}%
   8336   \begingroup
   8337   \macroargctxt
   8338   \def\argvaluelist{#3,\nil@}%
   8339   \def\@tempa{#3}%
   8340   \ifx\@tempa\empty
   8341     \setemptyargvalues@
   8342   \else
   8343     \getargvals@@
   8344   \fi
   8345 }
   8346 \def\getargvals@@{%
   8347   \ifx\paramlist\nilm@
   8348       % Some sanity check needed here that \argvaluelist is also empty.
   8349       \ifx\argvaluelist\nillm@
   8350       \else
   8351         \errhelp = \EMsimple
   8352         \errmessage{Too many arguments in macro `\macroname'!}%
   8353       \fi
   8354       \let\next\macargexpandinbody@
   8355   \else
   8356     \ifx\argvaluelist\nillm@
   8357        % No more arguments values passed to macro.  Set remaining named-arg
   8358        % macros to empty.
   8359        \let\next\setemptyargvalues@
   8360     \else
   8361       % pop current arg name into \@tempb
   8362       \def\@tempa##1{\pop@{\@tempb}{\paramlist}##1\endargs@}%
   8363       \expandafter\@tempa\expandafter{\paramlist}%
   8364        % pop current argument value into \@tempc
   8365       \def\@tempa##1{\longpop@{\@tempc}{\argvaluelist}##1\endargs@}%
   8366       \expandafter\@tempa\expandafter{\argvaluelist}%
   8367        % Here \@tempb is the current arg name and \@tempc is the current arg value.
   8368        % First place the new argument macro definition into \@tempd
   8369        \expandafter\macname\expandafter{\@tempc}%
   8370        \expandafter\let\csname macarg.\@tempb\endcsname\relax
   8371        \expandafter\def\expandafter\@tempe\expandafter{%
   8372          \csname macarg.\@tempb\endcsname}%
   8373        \edef\@tempd{\long\def\@tempe{\the\macname}}%
   8374        \push@\@tempd\macargdeflist@
   8375        \let\next\getargvals@@
   8376     \fi
   8377   \fi
   8378   \next
   8379 }
   8380 
   8381 \def\push@#1#2{%
   8382   \expandafter\expandafter\expandafter\def
   8383   \expandafter\expandafter\expandafter#2%
   8384   \expandafter\expandafter\expandafter{%
   8385   \expandafter#1#2}%
   8386 }
   8387 
   8388 % Replace arguments by their values in the macro body, and place the result
   8389 % in macro \@tempa.
   8390 %
   8391 \def\macvalstoargs@{%
   8392   %  To do this we use the property that token registers that are \the'ed
   8393   % within an \edef  expand only once. So we are going to place all argument
   8394   % values into respective token registers.
   8395   %
   8396   % First we save the token context, and initialize argument numbering.
   8397   \begingroup
   8398     \paramno0\relax
   8399     % Then, for each argument number #N, we place the corresponding argument
   8400     % value into a new token list register \toks#N
   8401     \expandafter\putargsintokens@\saveparamlist@,;,%
   8402     % Then, we expand the body so that argument are replaced by their
   8403     % values. The trick for values not to be expanded themselves is that they
   8404     % are within tokens and that tokens expand only once in an \edef .
   8405     \edef\@tempc{\csname mac.\macroname .body\endcsname}%
   8406     % Now we restore the token stack pointer to free the token list registers
   8407     % which we have used, but we make sure that expanded body is saved after
   8408     % group.
   8409     \expandafter
   8410   \endgroup
   8411   \expandafter\def\expandafter\@tempa\expandafter{\@tempc}%
   8412   }
   8413 
   8414 % Define the named-macro outside of this group and then close this group.
   8415 %
   8416 \def\macargexpandinbody@{%
   8417   \expandafter
   8418   \endgroup
   8419   \macargdeflist@
   8420   % First the replace in body the macro arguments by their values, the result
   8421   % is in \@tempa .
   8422   \macvalstoargs@
   8423   % Then we point at the \norecurse or \gobble (for recursive) macro value
   8424   % with \@tempb .
   8425   \expandafter\let\expandafter\@tempb\csname mac.\macroname .recurse\endcsname
   8426   % Depending on whether it is recursive or not, we need some tailing
   8427   % \egroup .
   8428   \ifx\@tempb\gobble
   8429      \let\@tempc\relax
   8430   \else
   8431      \let\@tempc\egroup
   8432   \fi
   8433   % And now we do the real job:
   8434   \edef\@tempd{\noexpand\@tempb{\macroname}\noexpand\scanmacro{\@tempa}\@tempc}%
   8435   \@tempd
   8436 }
   8437 
   8438 \def\putargsintokens@#1,{%
   8439   \if#1;\let\next\relax
   8440   \else
   8441     \let\next\putargsintokens@
   8442     % First we allocate the new token list register, and give it a temporary
   8443     % alias \@tempb .
   8444     \toksdef\@tempb\the\paramno
   8445     % Then we place the argument value into that token list register.
   8446     \expandafter\let\expandafter\@tempa\csname macarg.#1\endcsname
   8447     \expandafter\@tempb\expandafter{\@tempa}%
   8448     \advance\paramno by 1\relax
   8449   \fi
   8450   \next
   8451 }
   8452 
   8453 % Trailing missing arguments are set to empty.
   8454 %
   8455 \def\setemptyargvalues@{%
   8456   \ifx\paramlist\nilm@
   8457     \let\next\macargexpandinbody@
   8458   \else
   8459     \expandafter\setemptyargvaluesparser@\paramlist\endargs@
   8460     \let\next\setemptyargvalues@
   8461   \fi
   8462   \next
   8463 }
   8464 
   8465 \def\setemptyargvaluesparser@#1,#2\endargs@{%
   8466   \expandafter\def\expandafter\@tempa\expandafter{%
   8467     \expandafter\def\csname macarg.#1\endcsname{}}%
   8468   \push@\@tempa\macargdeflist@
   8469   \def\paramlist{#2}%
   8470 }
   8471 
   8472 % #1 is the element target macro
   8473 % #2 is the list macro
   8474 % #3,#4\endargs@ is the list value
   8475 \def\pop@#1#2#3,#4\endargs@{%
   8476    \def#1{#3}%
   8477    \def#2{#4}%
   8478 }
   8479 \long\def\longpop@#1#2#3,#4\endargs@{%
   8480    \long\def#1{#3}%
   8481    \long\def#2{#4}%
   8482 }
   8483 
   8484 
   8485 %%%%%%%%%%%%%% End of code for > 10 arguments %%%%%%%%%%%%%%%%%%
   8486 
   8487 
   8488 % This defines a Texinfo @macro or @rmacro, called by \parsemacbody.
   8489 %    \macrobody has the body of the macro in it, with placeholders for
   8490 % its parameters, looking like "\xeatspaces{\hash 1}".
   8491 %    \paramno is the number of parameters
   8492 %    \paramlist is a TeX parameter text, e.g. "#1,#2,#3,"
   8493 % There are four cases: macros of zero, one, up to nine, and many arguments.
   8494 % \xdef is used so that macro definitions will survive the file
   8495 % they're defined in: @include reads the file inside a group.
   8496 %
   8497 \def\macrodef{%
   8498   \let\hash=##% convert placeholders to macro parameter chars
   8499   \ifnum\paramno=1
   8500     \long\def\xeatspaces##1{##1}%
   8501     % We don't use \xeatspaces for single-argument macros, because we
   8502     % want to keep ends of lines.  This definition removes \xeatspaces
   8503     % when \macrobody is expanded below.
   8504   \else
   8505     \def\xeatspaces{\string\xeatspaces}%
   8506     % This expands \xeatspaces as a sequence of character tokens, which
   8507     % stops \scantokens inserting an extra space after the control sequence.
   8508   \fi
   8509   \ifcase\paramno
   8510   % 0
   8511     \expandafter\xdef\csname\the\macname\endcsname{%
   8512       \begingroup
   8513         \noexpand\spaceisspace
   8514         \noexpand\endlineisspace
   8515         \noexpand\expandafter % skip any whitespace after the macro name.
   8516         \expandafter\noexpand\csname\the\macname @@@\endcsname}%
   8517     \expandafter\xdef\csname\the\macname @@@\endcsname{%
   8518       \endgroup
   8519       \noexpand\scanmacro{\macrobody}}%
   8520   \or % 1
   8521     \expandafter\xdef\csname\the\macname\endcsname{%
   8522        \begingroup
   8523        \noexpand\braceorline
   8524        \expandafter\noexpand\csname\the\macname @@@\endcsname}%
   8525     \expandafter\xdef\csname\the\macname @@@\endcsname##1{%
   8526       \endgroup
   8527       \noexpand\scanmacro{\macrobody}%
   8528       }%
   8529   \else % at most 9
   8530     \ifnum\paramno<10\relax
   8531       % @MACNAME sets the context for reading the macro argument
   8532       % @MACNAME@@ gets the argument, processes backslashes and appends a
   8533       % comma.
   8534       % @MACNAME@@@ removes braces surrounding the argument list.
   8535       % @MACNAME@@@@ scans the macro body with arguments substituted.
   8536       \expandafter\xdef\csname\the\macname\endcsname{%
   8537         \begingroup
   8538         \noexpand\expandafter  % This \expandafter skip any spaces after the
   8539         \noexpand\macroargctxt % macro before we change the catcode of space.
   8540         \noexpand\expandafter
   8541         \expandafter\noexpand\csname\the\macname @@\endcsname}%
   8542       \expandafter\xdef\csname\the\macname @@\endcsname##1{%
   8543           \noexpand\passargtomacro
   8544           \expandafter\noexpand\csname\the\macname @@@\endcsname{##1,}}%
   8545       \expandafter\xdef\csname\the\macname @@@\endcsname##1{%
   8546           \expandafter\noexpand\csname\the\macname @@@@\endcsname ##1}%
   8547       \expandafter\expandafter
   8548       \expandafter\xdef
   8549       \expandafter\expandafter
   8550         \csname\the\macname @@@@\endcsname\paramlist{%
   8551           \endgroup\noexpand\scanmacro{\macrobody}}%
   8552     \else % 10 or more:
   8553       \expandafter\xdef\csname\the\macname\endcsname{%
   8554         \noexpand\getargvals@{\the\macname}{\argl}%
   8555       }%
   8556       \global\expandafter\let\csname mac.\the\macname .body\endcsname\macrobody
   8557       \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\gobble
   8558     \fi
   8559   \fi}
   8560 
   8561 \catcode `\@\texiatcatcode\relax % end private-to-Texinfo catcodes
   8562 
   8563 \def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
   8564 
   8565 
   8566 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   8567 %
   8568 {\catcode`\@=0 \catcode`\\=13  % We need to manipulate \ so use @ as escape
   8569 @catcode`@_=11  % private names
   8570 @catcode`@!=11  % used as argument separator
   8571 
   8572 % \passargtomacro#1#2 -
   8573 % Call #1 with a list of tokens #2, with any doubled backslashes in #2
   8574 % compressed to one.
   8575 %
   8576 % This implementation works by expansion, and not execution (so we cannot use
   8577 % \def or similar).  This reduces the risk of this failing in contexts where
   8578 % complete expansion is done with no execution (for example, in writing out to
   8579 % an auxiliary file for an index entry).
   8580 %
   8581 % State is kept in the input stream: the argument passed to
   8582 % @look_ahead, @gobble_and_check_finish and @add_segment is
   8583 %
   8584 % THE_MACRO ARG_RESULT ! {PENDING_BS} NEXT_TOKEN  (... rest of input)
   8585 %
   8586 % where:
   8587 % THE_MACRO - name of the macro we want to call
   8588 % ARG_RESULT - argument list we build to pass to that macro
   8589 % PENDING_BS - either a backslash or nothing
   8590 % NEXT_TOKEN - used to look ahead in the input stream to see what's coming next
   8591 
   8592 @gdef@passargtomacro#1#2{%
   8593   @add_segment #1!{}@relax#2\@_finish\%
   8594 }
   8595 @gdef@_finish{@_finishx} @global@let@_finishx@relax
   8596 
   8597 % #1 - THE_MACRO ARG_RESULT
   8598 % #2 - PENDING_BS
   8599 % #3 - NEXT_TOKEN
   8600 % #4 used to look ahead
   8601 %
   8602 % If the next token is not a backslash, process the rest of the argument;
   8603 % otherwise, remove the next token.
   8604 @gdef@look_ahead#1!#2#3#4{%
   8605   @ifx#4\%
   8606    @expandafter@gobble_and_check_finish
   8607   @else
   8608    @expandafter@add_segment
   8609   @fi#1!{#2}#4#4%
   8610 }
   8611 
   8612 % #1 - THE_MACRO ARG_RESULT
   8613 % #2 - PENDING_BS
   8614 % #3 - NEXT_TOKEN
   8615 % #4 should be a backslash, which is gobbled.
   8616 % #5 looks ahead
   8617 %
   8618 % Double backslash found.  Add a single backslash, and look ahead.
   8619 @gdef@gobble_and_check_finish#1!#2#3#4#5{%
   8620   @add_segment#1\!{}#5#5%
   8621 }
   8622 
   8623 @gdef@is_fi{@fi}
   8624 
   8625 % #1 - THE_MACRO ARG_RESULT
   8626 % #2 - PENDING_BS
   8627 % #3 - NEXT_TOKEN
   8628 % #4 is input stream until next backslash
   8629 %
   8630 % Input stream is either at the start of the argument, or just after a
   8631 % backslash sequence, either a lone backslash, or a doubled backslash.
   8632 % NEXT_TOKEN contains the first token in the input stream: if it is \finish,
   8633 % finish; otherwise, append to ARG_RESULT the segment of the argument up until
   8634 % the next backslash.  PENDING_BACKSLASH contains a backslash to represent
   8635 % a backslash just before the start of the input stream that has not been
   8636 % added to ARG_RESULT.
   8637 @gdef@add_segment#1!#2#3#4\{%
   8638 @ifx#3@_finish
   8639   @call_the_macro#1!%
   8640 @else
   8641   % append the pending backslash to the result, followed by the next segment
   8642   @expandafter@is_fi@look_ahead#1#2#4!{\}@fi
   8643   % this @fi is discarded by @look_ahead.
   8644   % we can't get rid of it with \expandafter because we don't know how
   8645   % long #4 is.
   8646 }
   8647 
   8648 % #1 - THE_MACRO
   8649 % #2 - ARG_RESULT
   8650 % #3 discards the res of the conditional in @add_segment, and @is_fi ends the
   8651 % conditional.
   8652 @gdef@call_the_macro#1#2!#3@fi{@is_fi #1{#2}}
   8653 
   8654 }
   8655 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   8656 
   8657 % \braceorline MAC is used for a one-argument macro MAC.  It checks
   8658 % whether the next non-whitespace character is a {.  It sets the context
   8659 % for reading the argument (slightly different in the two cases).  Then,
   8660 % to read the argument, in the whole-line case, it then calls the regular
   8661 % \parsearg MAC; in the lbrace case, it calls \passargtomacro MAC.
   8662 %
   8663 \def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx}
   8664 \def\braceorlinexxx{%
   8665   \ifx\nchar\bgroup
   8666     \macroargctxt
   8667     \expandafter\passargtomacro
   8668   \else
   8669     \macrolineargctxt\expandafter\parsearg
   8670   \fi \macnamexxx}
   8671 
   8672 
   8673 % @linemacro
   8674 
   8675 \parseargdef\linemacro{%
   8676   \getargs{#1}% now \macname is the macname and \argl the arglist
   8677   \ifx\argl\empty
   8678     \paramno=0
   8679     \let\hash\relax
   8680     \def\paramlist{\hash 1\endlinemacro}%
   8681   \else
   8682     \expandafter\linegetparamlist\argl;%
   8683   \fi
   8684   \begingroup \macrobodyctxt \usembodybackslash
   8685   \parselinemacrobody
   8686 }
   8687 
   8688 % Build up \paramlist which will be used as the parameter text for the macro.
   8689 % At the end it will be like "#1 #2 #3\endlinemacro".
   8690 \def\linegetparamlist#1;{%
   8691   \paramno=0\def\paramlist{}%
   8692   \let\hash\relax
   8693   \linegetparamlistxxx#1,;,%
   8694 }
   8695 \def\linegetparamlistxxx#1,{%
   8696   \if#1;\let\next=\linegetparamlistxxxx
   8697   \else \let\next=\linegetparamlistxxx
   8698     \advance\paramno by 1
   8699     \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname
   8700         {\hash\the\paramno}%
   8701     \edef\paramlist{\paramlist\hash\the\paramno\space}%
   8702   \fi\next}
   8703 \def\linegetparamlistxxxx{%
   8704   \expandafter\fixparamlist\paramlist\fixparamlist
   8705 }
   8706 % Replace final space token
   8707 \def\fixparamlist#1 \fixparamlist{%
   8708   \def\paramlist{#1\endlinemacro}%
   8709 }
   8710 
   8711 % Read the body of the macro, replacing backslash-surrounded variables
   8712 %
   8713 {\catcode`\ =\other\long\gdef\parselinemacrobody#1@end linemacro{%
   8714 \xdef\macrobody{#1}%
   8715 \endgroup
   8716 \linemacrodef
   8717 }}
   8718 
   8719 % Make the definition
   8720 \def\linemacrodef{%
   8721   \let\hash=##%
   8722   \expandafter\xdef\csname\the\macname\endcsname{%
   8723     \bgroup
   8724     \noexpand\parsearg
   8725     \expandafter\noexpand\csname\the\macname @@\endcsname
   8726   }
   8727   \expandafter\xdef\csname\the\macname @@\endcsname##1{%
   8728     \egroup
   8729     \expandafter\noexpand
   8730     \csname\the\macname @@@\endcsname##1\noexpand\endlinemacro
   8731   }
   8732   \expandafter\expandafter
   8733   \expandafter\xdef
   8734   \expandafter\expandafter\csname\the\macname @@@\endcsname\paramlist{%
   8735     \newlinechar=13 % split \macrobody into lines
   8736     \noexpand\scantokens{\macrobody}%
   8737   }
   8738 }
   8739 
   8740 
   8741 
   8742 % @alias.
   8743 % We need some trickery to remove the optional spaces around the equal
   8744 % sign.  Make them active and then expand them all to nothing.
   8745 %
   8746 \def\alias{\parseargusing\obeyspaces\aliasxxx}
   8747 \def\aliasxxx #1{\aliasyyy#1\relax}
   8748 \def\aliasyyy #1=#2\relax{%
   8749   {%
   8750     \expandafter\let\obeyedspace=\empty
   8751     \addtomacrolist{#1}%
   8752     \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}%
   8753   }%
   8754   \next
   8755 }
   8756 
   8757 
   8758 \message{cross references,}
   8759 
   8760 \newwrite\auxfile
   8761 \newif\ifhavexrefs    % True if xref values are known.
   8762 \newif\ifwarnedxrefs  % True if we warned once that they aren't known.
   8763 
   8764 % @inforef is relatively simple.
   8765 \def\inforef #1{\inforefzzz #1,,,,**}
   8766 \def\inforefzzz #1,#2,#3,#4**{%
   8767   \putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
   8768   node \samp{\ignorespaces#1{}}}
   8769 
   8770 % @node's only job in TeX is to define \lastnode, which is used in
   8771 % cross-references.  The @node line might or might not have commas, and
   8772 % might or might not have spaces before the first comma, like:
   8773 % @node foo , bar , ...
   8774 % We don't want such trailing spaces in the node name.
   8775 %
   8776 \parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse}
   8777 %
   8778 % also remove a trailing comma, in case of something like this:
   8779 % @node Help-Cross,  ,  , Cross-refs
   8780 \def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse}
   8781 \def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}\omittopnode}
   8782 
   8783 % Used so that the @top node doesn't have to be wrapped in an @ifnottex
   8784 % conditional.
   8785 % \doignore goes to more effort to skip nested conditionals but we don't need
   8786 % that here.
   8787 \def\omittopnode{%
   8788    \ifx\lastnode\wordTop
   8789    \expandafter\ignorenode\fi
   8790 }
   8791 \def\wordTop{Top}
   8792 
   8793 % Until the next @node, @part or @bye command, divert output to a box that
   8794 % is not output.
   8795 \def\ignorenode{\setbox\dummybox\vbox\bgroup
   8796 \def\part{\egroup\part}%
   8797 \def\node{\egroup\node}%
   8798 \ignorenodebye
   8799 }
   8800 
   8801 {\let\bye\relax
   8802 \gdef\ignorenodebye{\let\bye\ignorenodebyedef}
   8803 \gdef\ignorenodebyedef{\egroup(`Top' node ignored)\bye}}
   8804 % The redefinition of \bye here is because it is declared \outer
   8805 
   8806 \let\lastnode=\empty
   8807 
   8808 % Write a cross-reference definition for the current node.  #1 is the
   8809 % type (Ynumbered, Yappendix, Ynothing).
   8810 %
   8811 \def\donoderef#1{%
   8812   \ifx\lastnode\empty\else
   8813     \setref{\lastnode}{#1}%
   8814     \global\let\lastnode=\empty
   8815   \fi
   8816 }
   8817 
   8818 % @nodedescription, @nodedescriptionblock - do nothing for TeX
   8819 \parseargdef\nodedescription{}
   8820 \def\nodedescriptionblock{\doignore{nodedescriptionblock}}
   8821 
   8822 
   8823 % @anchor{NAME} -- define xref target at arbitrary point.
   8824 %
   8825 \newcount\savesfregister
   8826 %
   8827 \def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
   8828 \def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
   8829 \def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}
   8830 
   8831 % \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an
   8832 % anchor), which consists of three parts:
   8833 % 1) NAME-title - the current sectioning name taken from \currentsection,
   8834 %                 or the anchor name.
   8835 % 2) NAME-snt   - section number and type, passed as the SNT arg, or
   8836 %                 empty for anchors.
   8837 % 3) NAME-pg    - the page number.
   8838 %
   8839 % This is called from \donoderef, \anchor, and \dofloat.  In the case of
   8840 % floats, there is an additional part, which is not written here:
   8841 % 4) NAME-lof   - the text as it should appear in a @listoffloats.
   8842 %
   8843 \def\setref#1#2{%
   8844   \pdfmkdest{#1}%
   8845   \iflinks
   8846     {%
   8847       \requireauxfile
   8848       \atdummies  % preserve commands, but don't expand them
   8849       % match definition in \xrdef, \refx, \xrefX.
   8850       \def\value##1{##1}%
   8851       \edef\writexrdef##1##2{%
   8852 	\write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef
   8853 	  ##1}{##2}}% these are parameters of \writexrdef
   8854       }%
   8855       \toks0 = \expandafter{\currentsection}%
   8856       \immediate \writexrdef{title}{\the\toks0 }%
   8857       \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc.
   8858       \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, at \shipout
   8859     }%
   8860   \fi
   8861 }
   8862 
   8863 % @xrefautosectiontitle on|off says whether @section(ing) names are used
   8864 % automatically in xrefs, if the third arg is not explicitly specified.
   8865 % This was provided as a "secret" @set xref-automatic-section-title
   8866 % variable, now it's official.
   8867 %
   8868 \parseargdef\xrefautomaticsectiontitle{%
   8869   \def\temp{#1}%
   8870   \ifx\temp\onword
   8871     \expandafter\let\csname SETxref-automatic-section-title\endcsname
   8872       = \empty
   8873   \else\ifx\temp\offword
   8874     \expandafter\let\csname SETxref-automatic-section-title\endcsname
   8875       = \relax
   8876   \else
   8877     \errhelp = \EMsimple
   8878     \errmessage{Unknown @xrefautomaticsectiontitle value `\temp',
   8879                 must be on|off}%
   8880   \fi\fi
   8881 }
   8882 
   8883 %
   8884 % @xref, @pxref, and @ref generate cross-references.  For \xrefX, #1 is
   8885 % the node name, #2 the name of the Info cross-reference, #3 the printed
   8886 % node name, #4 the name of the Info file, #5 the name of the printed
   8887 % manual.  All but the node name can be omitted.
   8888 %
   8889 \def\pxref{\putwordsee{} \xrefXX}
   8890 \def\xref{\putwordSee{} \xrefXX}
   8891 \def\ref{\xrefXX}
   8892 
   8893 \def\xrefXX#1{\def\xrefXXarg{#1}\futurelet\tokenafterxref\xrefXXX}
   8894 \def\xrefXXX{\expandafter\xrefX\expandafter[\xrefXXarg,,,,,,,]}
   8895 %
   8896 \newbox\toprefbox
   8897 \newbox\printedrefnamebox
   8898 \newbox\infofilenamebox
   8899 \newbox\printedmanualbox
   8900 %
   8901 \def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
   8902   \unsepspaces
   8903   %
   8904   \getprintedrefname{#1}{#3}{#5}%
   8905   \def\infofilename{\ignorespaces #4}%
   8906   \setbox\infofilenamebox = \hbox{\infofilename\unskip}%
   8907   %
   8908   \startxreflink{#1}{#4}%
   8909   {%
   8910     % Have to otherify everything special to allow the \csname to
   8911     % include an _ in the xref name, etc.
   8912     \indexnofonts
   8913     \turnoffactive
   8914     \def\value##1{##1}%
   8915     \expandafter\global\expandafter\let\expandafter\Xthisreftitle
   8916       \csname XR#1-title\endcsname
   8917   }%
   8918   %
   8919   % Float references are printed completely differently: "Figure 1.2"
   8920   % instead of "[somenode], p.3".  \iffloat distinguishes them by
   8921   % \Xthisreftitle being set to a magic string.
   8922   \iffloat\Xthisreftitle
   8923     % If the user specified the print name (third arg) to the ref,
   8924     % print it instead of our usual "Figure 1.2".
   8925     \ifdim\wd\printedrefnamebox = 0pt
   8926       \refx{#1-snt}%
   8927     \else
   8928       \printedrefname
   8929     \fi
   8930     %
   8931     % If the user also gave the printed manual name (fifth arg), append
   8932     % "in MANUALNAME".
   8933     \ifdim \wd\printedmanualbox > 0pt
   8934       \space \putwordin{} \cite{\printedmanual}%
   8935     \fi
   8936   \else
   8937     % node/anchor (non-float) references.
   8938     %
   8939     % If we use \unhbox to print the node names, TeX does not insert
   8940     % empty discretionaries after hyphens, which means that it will not
   8941     % find a line break at a hyphen in a node names.  Since some manuals
   8942     % are best written with fairly long node names, containing hyphens,
   8943     % this is a loss.  Therefore, we give the text of the node name
   8944     % again, so it is as if TeX is seeing it for the first time.
   8945     %
   8946     \ifdim \wd\printedmanualbox > 0pt
   8947       % Cross-manual reference with a printed manual name.
   8948       %
   8949       \crossmanualxref{\cite{\printedmanual\unskip}}%
   8950     %
   8951     \else\ifdim \wd\infofilenamebox > 0pt
   8952       % Cross-manual reference with only an info filename (arg 4), no
   8953       % printed manual name (arg 5).  This is essentially the same as
   8954       % the case above; we output the filename, since we have nothing else.
   8955       %
   8956       \crossmanualxref{\code{\infofilename\unskip}}%
   8957     %
   8958     \else
   8959       % Reference within this manual.
   8960       %
   8961       % Only output a following space if the -snt ref is nonempty, as the ref
   8962       % will be empty for @unnumbered and @anchor.
   8963       \setbox2 = \hbox{\ignorespaces \refx{#1-snt}}%
   8964       \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
   8965       %
   8966       % output the `[mynode]' via the macro below so it can be overridden.
   8967       \xrefprintnodename\printedrefname
   8968       %
   8969       \ifflagclear{txiomitxrefpg}{%
   8970         % We always want a comma
   8971         ,%
   8972         % output the `page 3'.
   8973         \turnoffactive \putpageref{#1}%
   8974         % Add a , if xref followed by a space
   8975         \if\space\noexpand\tokenafterxref ,%
   8976         \else\ifx\	\tokenafterxref ,% @TAB
   8977         \else\ifx\*\tokenafterxref ,%   @*
   8978         \else\ifx\ \tokenafterxref ,%   @SPACE
   8979         \else\ifx\
   8980                   \tokenafterxref ,%    @NL
   8981         \else\ifx\tie\tokenafterxref ,% @tie
   8982         \fi\fi\fi\fi\fi\fi
   8983       }{}%
   8984     \fi\fi
   8985   \fi
   8986   \endlink
   8987 \endgroup}
   8988 
   8989 % \getprintedrefname{NODE}{LABEL}{MANUAL}
   8990 % - set \printedrefname and \printedmanual
   8991 %
   8992 \def\getprintedrefname#1#2#3{%
   8993   % Get args without leading/trailing spaces.
   8994   \def\printedrefname{\ignorespaces #2}%
   8995   \setbox\printedrefnamebox = \hbox{\printedrefname\unskip}%
   8996   %
   8997   \def\printedmanual{\ignorespaces #3}%
   8998   \setbox\printedmanualbox  = \hbox{\printedmanual\unskip}%
   8999   %
   9000   % If the printed reference name (arg #2) was not explicitly given in
   9001   % the @xref, figure out what we want to use.
   9002   \ifdim \wd\printedrefnamebox = 0pt
   9003     % No printed node name was explicitly given.
   9004     \expandafter\ifx\csname SETxref-automatic-section-title\endcsname \relax
   9005       % Not auto section-title: use node name inside the square brackets.
   9006       \def\printedrefname{\ignorespaces #1}%
   9007     \else
   9008       % Auto section-title: use chapter/section title inside
   9009       % the square brackets if we have it.
   9010       \ifdim \wd\printedmanualbox > 0pt
   9011         % It is in another manual, so we don't have it; use node name.
   9012         \def\printedrefname{\ignorespaces #1}%
   9013       \else
   9014         \ifhavexrefs
   9015           % We (should) know the real title if we have the xref values.
   9016           \def\printedrefname{\refx{#1-title}}%
   9017         \else
   9018           % Otherwise just copy the Info node name.
   9019           \def\printedrefname{\ignorespaces #1}%
   9020         \fi%
   9021       \fi
   9022     \fi
   9023   \fi
   9024 }
   9025 
   9026 % \startxreflink{NODE}{FILE} - start link in pdf output.
   9027 \def\startxreflink#1#2{%
   9028   \ifpdforxetex
   9029     % For pdfTeX and LuaTeX
   9030     {\indexnofonts
   9031      \makevalueexpandable
   9032      \turnoffactive
   9033      % This expands tokens, so do it after making catcode changes, so _
   9034      % etc. don't get their TeX definitions.  This ignores all spaces in
   9035      % #2, including (wrongly) those in the middle of the filename.
   9036      \getfilename{#2}%
   9037      %
   9038      % This (wrongly) does not take account of leading or trailing
   9039      % spaces in #1, which should be ignored.
   9040      \setpdfdestname{#1}%
   9041      %
   9042      \ifx\pdfdestname\empty
   9043        \def\pdfdestname{Top}% no empty targets
   9044      \fi
   9045      %
   9046      \leavevmode
   9047      \ifpdf
   9048        \startlink attr{/Border [0 0 0]}%
   9049        \ifnum\filenamelength>0
   9050          goto file{\the\filename.pdf} name{\pdfdestname}%
   9051        \else
   9052          goto name{\pdfmkpgn{\pdfdestname}}%
   9053        \fi
   9054      \else % XeTeX
   9055        \ifnum\filenamelength>0
   9056          % With default settings,
   9057          % XeTeX (xdvipdfmx) replaces link destination names with integers.
   9058          % In this case, the replaced destination names of
   9059          % remote PDFs are no longer known.  In order to avoid a replacement,
   9060          % you can use xdvipdfmx's command line option `-C 0x0010'.
   9061          % If you use XeTeX 0.99996+ (TeX Live 2016+),
   9062          % this command line option is no longer necessary
   9063          % because we can use the `dvipdfmx:config' special.
   9064          \special{pdf:bann << /Border [0 0 0] /Type /Annot /Subtype /Link /A
   9065            << /S /GoToR /F (\the\filename.pdf) /D (\pdfdestname) >> >>}%
   9066        \else
   9067          \special{pdf:bann << /Border [0 0 0] /Type /Annot /Subtype /Link /A
   9068            << /S /GoTo /D (\pdfdestname) >> >>}%
   9069        \fi
   9070      \fi
   9071     }%
   9072     \setcolor{\linkcolor}%
   9073   \fi
   9074 }
   9075 
   9076 % can be overridden in translation files
   9077 \def\putpageref#1{%
   9078   \space\putwordpage\tie\refx{#1-pg}}
   9079 
   9080 % Output a cross-manual xref to #1.  Used just above (twice).
   9081 %
   9082 % Only include the text "Section ``foo'' in" if the foo is neither
   9083 % missing or Top.  Thus, @xref{,,,foo,The Foo Manual} outputs simply
   9084 % "see The Foo Manual", the idea being to refer to the whole manual.
   9085 %
   9086 % But, this being TeX, we can't easily compare our node name against the
   9087 % string "Top" while ignoring the possible spaces before and after in
   9088 % the input.  By adding the arbitrary 7sp below, we make it much less
   9089 % likely that a real node name would have the same width as "Top" (e.g.,
   9090 % in a monospaced font).  Hopefully it will never happen in practice.
   9091 %
   9092 % For the same basic reason, we retypeset the "Top" at every
   9093 % reference, since the current font is indeterminate.
   9094 %
   9095 \def\crossmanualxref#1{%
   9096   \setbox\toprefbox = \hbox{Top\kern7sp}%
   9097   \setbox2 = \hbox{\ignorespaces \printedrefname \unskip \kern7sp}%
   9098   \ifdim \wd2 > 7sp  % nonempty?
   9099     \ifdim \wd2 = \wd\toprefbox \else  % same as Top?
   9100       \putwordSection{} ``\printedrefname'' \putwordin{}\space
   9101     \fi
   9102   \fi
   9103   #1%
   9104 }
   9105 
   9106 % This macro is called from \xrefX for the `[nodename]' part of xref
   9107 % output.  It's a separate macro only so it can be changed more easily,
   9108 % since square brackets don't work well in some documents.  Particularly
   9109 % one that Bob is working on :).
   9110 %
   9111 \def\xrefprintnodename#1{[#1]}
   9112 
   9113 % @link{NODENAME, LABEL, MANUAL} - create a "plain" link, with no
   9114 % page number.  Not useful if printed on paper.
   9115 %
   9116 \def\link#1{\linkX[#1,,,]}
   9117 \def\linkX[#1,#2,#3,#4]{%
   9118   \begingroup
   9119   \unsepspaces
   9120   \getprintedrefname{#1}{#2}{#3}%
   9121   \startxreflink{#1}{#3}%
   9122   \printedrefname
   9123   \endlink
   9124   \endgroup
   9125 }
   9126 
   9127 
   9128 % Things referred to by \setref.
   9129 %
   9130 \def\Ynothing{}
   9131 \def\Yomitfromtoc{}
   9132 \def\Ynumbered{%
   9133   \ifnum\secno=0
   9134     \putwordChapter@tie \the\chapno
   9135   \else \ifnum\subsecno=0
   9136     \putwordSection@tie \the\chapno.\the\secno
   9137   \else \ifnum\subsubsecno=0
   9138     \putwordSection@tie \the\chapno.\the\secno.\the\subsecno
   9139   \else
   9140     \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno
   9141   \fi\fi\fi
   9142 }
   9143 \def\Yappendix{%
   9144   \ifnum\secno=0
   9145      \putwordAppendix@tie @char\the\appendixno{}%
   9146   \else \ifnum\subsecno=0
   9147      \putwordSection@tie @char\the\appendixno.\the\secno
   9148   \else \ifnum\subsubsecno=0
   9149     \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno
   9150   \else
   9151     \putwordSection@tie
   9152       @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno
   9153   \fi\fi\fi
   9154 }
   9155 
   9156 % \refx{NAME} - reference a cross-reference string named NAME.
   9157 \def\refx#1{%
   9158   \requireauxfile
   9159   {%
   9160     \indexnofonts
   9161     \turnoffactive
   9162     \def\value##1{##1}%
   9163     \expandafter\global\expandafter\let\expandafter\thisrefX
   9164       \csname XR#1\endcsname
   9165   }%
   9166   \ifx\thisrefX\relax
   9167     % If not defined, say something at least.
   9168     \angleleft un\-de\-fined\angleright
   9169     \iflinks
   9170       \ifhavexrefs
   9171         {\toks0 = {#1}% avoid expansion of possibly-complex value
   9172          \message{\linenumber Undefined cross reference `\the\toks0'.}}%
   9173       \else
   9174         \ifwarnedxrefs\else
   9175           \global\warnedxrefstrue
   9176           \message{Cross reference values unknown; you must run TeX again.}%
   9177         \fi
   9178       \fi
   9179     \fi
   9180   \else
   9181     % It's defined, so just use it.
   9182     \thisrefX
   9183   \fi
   9184 }
   9185 
   9186 % This is the macro invoked by entries in the aux file.  Define a control
   9187 % sequence for a cross-reference target (we prepend XR to the control sequence
   9188 % name to avoid collisions).  The value is the page number.  If this is a float
   9189 % type, we have more work to do.
   9190 %
   9191 \def\xrdef#1#2{%
   9192   {% Expand the node or anchor name to remove control sequences.
   9193    % \turnoffactive stops 8-bit characters being changed to commands
   9194    % like @'e.  \refx does the same to retrieve the value in the definition.
   9195     \indexnofonts
   9196     \turnoffactive
   9197     \def\value##1{##1}%
   9198     \xdef\safexrefname{#1}%
   9199   }%
   9200   %
   9201   \bgroup
   9202     \expandafter\gdef\csname XR\safexrefname\endcsname{#2}%
   9203   \egroup
   9204   % We put the \gdef inside a group to avoid the definitions building up on
   9205   % TeX's save stack, which can cause it to run out of space for aux files with
   9206   % thousands of lines.  \gdef doesn't use the save stack, but \csname does
   9207   % when it defines an unknown control sequence as \relax.
   9208   %
   9209   % Was that xref control sequence that we just defined for a float?
   9210   \expandafter\iffloat\csname XR\safexrefname\endcsname
   9211     % it was a float, and we have the (safe) float type in \iffloattype.
   9212     \expandafter\let\expandafter\floatlist
   9213       \csname floatlist\iffloattype\endcsname
   9214     %
   9215     % Is this the first time we've seen this float type?
   9216     \expandafter\ifx\floatlist\relax
   9217       \toks0 = {\do}% yes, so just \do
   9218     \else
   9219       % had it before, so preserve previous elements in list.
   9220       \toks0 = \expandafter{\floatlist\do}%
   9221     \fi
   9222     %
   9223     % Remember this xref in the control sequence \floatlistFLOATTYPE,
   9224     % for later use in \listoffloats.
   9225     \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0
   9226       {\safexrefname}}%
   9227   \fi
   9228 }
   9229 
   9230 % If working on a large document in chapters, it is convenient to
   9231 % be able to disable indexing, cross-referencing, and contents, for test runs.
   9232 % This is done with @novalidate at the beginning of the file.
   9233 %
   9234 \newif\iflinks \linkstrue % by default we want the aux files.
   9235 \let\novalidate = \linksfalse
   9236 
   9237 % Used when writing to the aux file, or when using data from it.
   9238 \def\requireauxfile{%
   9239   \iflinks
   9240     \tryauxfile
   9241     % Open the new aux file.  TeX will close it automatically at exit.
   9242     \immediate\openout\auxfile=\jobname.aux
   9243   \fi
   9244   \global\let\requireauxfile=\relax   % Only do this once.
   9245 }
   9246 
   9247 % Read the last existing aux file, if any.  No error if none exists.
   9248 %
   9249 \def\tryauxfile{%
   9250   \openin 1 \jobname.aux
   9251   \ifeof 1 \else
   9252     \readdatafile{aux}%
   9253     \global\havexrefstrue
   9254   \fi
   9255   \closein 1
   9256 }
   9257 
   9258 \def\setupdatafile{%
   9259   \catcode`\^^@=\other
   9260   \catcode`\^^A=\other
   9261   \catcode`\^^B=\other
   9262   \catcode`\^^C=\other
   9263   \catcode`\^^D=\other
   9264   \catcode`\^^E=\other
   9265   \catcode`\^^F=\other
   9266   \catcode`\^^G=\other
   9267   \catcode`\^^H=\other
   9268   \catcode`\^^K=\other
   9269   \catcode`\^^L=\other
   9270   \catcode`\^^N=\other
   9271   \catcode`\^^P=\other
   9272   \catcode`\^^Q=\other
   9273   \catcode`\^^R=\other
   9274   \catcode`\^^S=\other
   9275   \catcode`\^^T=\other
   9276   \catcode`\^^U=\other
   9277   \catcode`\^^V=\other
   9278   \catcode`\^^W=\other
   9279   \catcode`\^^X=\other
   9280   \catcode`\^^Z=\other
   9281   \catcode`\^^[=\other
   9282   \catcode`\^^\=\other
   9283   \catcode`\^^]=\other
   9284   \catcode`\^^^=\other
   9285   \catcode`\^^_=\other
   9286   \catcode`\^=\other
   9287   %
   9288   % Special characters.  Should be turned off anyway, but...
   9289   \catcode`\~=\other
   9290   \catcode`\[=\other
   9291   \catcode`\]=\other
   9292   \catcode`\"=\other
   9293   \catcode`\_=\active
   9294   \catcode`\|=\active
   9295   \catcode`\<=\active
   9296   \catcode`\>=\active
   9297   \catcode`\$=\other
   9298   \catcode`\#=\other
   9299   \catcode`\&=\other
   9300   \catcode`\%=\other
   9301   \catcode`+=\other % avoid \+ for paranoia even though we've turned it off
   9302   %
   9303   \catcode`\\=\active
   9304   %
   9305   % @ is our escape character in .aux files, and we need braces.
   9306   \catcode`\{=1
   9307   \catcode`\}=2
   9308   \catcode`\@=0
   9309 }
   9310 
   9311 \def\readdatafile#1{%
   9312 \begingroup
   9313   \setupdatafile
   9314   \input\jobname.#1
   9315 \endgroup}
   9316 
   9317 
   9318 \message{insertions,}
   9319 % including footnotes.
   9320 
   9321 \newcount \footnoteno
   9322 
   9323 % The trailing space in the following definition for supereject is
   9324 % vital for proper filling; pages come out unaligned when you do a
   9325 % pagealignmacro call if that space before the closing brace is
   9326 % removed. (Generally, numeric constants should always be followed by a
   9327 % space to prevent strange expansion errors.)
   9328 \def\supereject{\par\penalty -20000\footnoteno =0 }
   9329 
   9330 % @footnotestyle is meaningful for Info output only.
   9331 \let\footnotestyle=\comment
   9332 
   9333 {\catcode `\@=11
   9334 %
   9335 % Auto-number footnotes.  Otherwise like plain.
   9336 \gdef\footnote{%
   9337   \global\advance\footnoteno by \@ne
   9338   \edef\thisfootno{$^{\the\footnoteno}$}%
   9339   %
   9340   % In case the footnote comes at the end of a sentence, preserve the
   9341   % extra spacing after we do the footnote number.
   9342   \let\@sf\empty
   9343   \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi
   9344   %
   9345   % Remove inadvertent blank space before typesetting the footnote number.
   9346   \unskip
   9347   \thisfootno\@sf
   9348   \dofootnote
   9349 }%
   9350 
   9351 % Don't bother with the trickery in plain.tex to not require the
   9352 % footnote text as a parameter.  Our footnotes don't need to be so general.
   9353 %
   9354 % Oh yes, they do; otherwise, @ifset (and anything else that uses
   9355 % \parseargline) fails inside footnotes because the tokens are fixed when
   9356 % the footnote is read.  --karl, 16nov96.
   9357 %
   9358 \gdef\dofootnote{%
   9359   \insert\footins\bgroup
   9360   %
   9361   % Nested footnotes are not supported in TeX, that would take a lot
   9362   % more work.  (\startsavinginserts does not suffice.)
   9363   \let\footnote=\errfootnotenest
   9364   %
   9365   % We want to typeset this text as a normal paragraph, even if the
   9366   % footnote reference occurs in (for example) a display environment.
   9367   % So reset some parameters.
   9368   \hsize=\txipagewidth
   9369   \interlinepenalty\interfootnotelinepenalty
   9370   \splittopskip\ht\strutbox % top baseline for broken footnotes
   9371   \splitmaxdepth\dp\strutbox
   9372   \floatingpenalty\@MM
   9373   \leftskip\z@skip
   9374   \rightskip\z@skip
   9375   \spaceskip\z@skip
   9376   \xspaceskip\z@skip
   9377   \parindent\defaultparindent
   9378   %
   9379   \smallfonts \rm
   9380   %
   9381   % Because we use hanging indentation in footnotes, a @noindent appears
   9382   % to exdent this text, so make it be a no-op.  makeinfo does not use
   9383   % hanging indentation so @noindent can still be needed within footnote
   9384   % text after an @example or the like (not that this is good style).
   9385   \let\noindent = \relax
   9386   %
   9387   % Hang the footnote text off the number.  Use \everypar in case the
   9388   % footnote extends for more than one paragraph.
   9389   \everypar = {\hang}%
   9390   \textindent{\thisfootno}%
   9391   %
   9392   % Don't crash into the line above the footnote text.  Since this
   9393   % expands into a box, it must come within the paragraph, lest it
   9394   % provide a place where TeX can split the footnote.
   9395   \footstrut
   9396   %
   9397   % Invoke rest of plain TeX footnote routine.
   9398   \futurelet\next\fo@t
   9399 }
   9400 }%end \catcode `\@=11
   9401 
   9402 \def\errfootnotenest{%
   9403   \errhelp=\EMsimple
   9404   \errmessage{Nested footnotes not supported in texinfo.tex,
   9405     even though they work in makeinfo; sorry}
   9406 }
   9407 
   9408 \def\errfootnoteheading{%
   9409   \errhelp=\EMsimple
   9410   \errmessage{Footnotes in chapters, sections, etc., are not supported}
   9411 }
   9412 
   9413 % In case a @footnote appears in a vbox, save the footnote text and create
   9414 % the real \insert just after the vbox finished.  Otherwise, the insertion
   9415 % would be lost.
   9416 % Similarly, if a @footnote appears inside an alignment, save the footnote
   9417 % text to a box and make the \insert when a row of the table is finished.
   9418 % And the same can be done for other insert classes.  --kasal, 16nov03.
   9419 %
   9420 % Replace the \insert primitive by a cheating macro.
   9421 % Deeper inside, just make sure that the saved insertions are not spilled
   9422 % out prematurely.
   9423 %
   9424 \def\startsavinginserts{%
   9425   \ifx \insert\ptexinsert
   9426     \let\insert\saveinsert
   9427   \else
   9428     \let\checkinserts\relax
   9429   \fi
   9430 }
   9431 
   9432 % This \insert replacement works for both \insert\footins{foo} and
   9433 % \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}.
   9434 %
   9435 \def\saveinsert#1{%
   9436   \edef\next{\noexpand\savetobox \makeSAVEname#1}%
   9437   \afterassignment\next
   9438   % swallow the left brace
   9439   \let\temp =
   9440 }
   9441 \def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}}
   9442 \def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1}
   9443 
   9444 \def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi}
   9445 
   9446 \def\placesaveins#1{%
   9447   \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname
   9448     {\box#1}%
   9449 }
   9450 
   9451 % eat @SAVE -- beware, all of them have catcode \other:
   9452 {
   9453   \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials  %  ;-)
   9454   \gdef\gobblesave @SAVE{}
   9455 }
   9456 
   9457 % initialization:
   9458 \def\newsaveins #1{%
   9459   \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}%
   9460   \next
   9461 }
   9462 \def\newsaveinsX #1{%
   9463   \csname newbox\endcsname #1%
   9464   \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts
   9465     \checksaveins #1}%
   9466 }
   9467 
   9468 % initialize:
   9469 \let\checkinserts\empty
   9470 \newsaveins\footins
   9471 \newsaveins\margin
   9472 
   9473 
   9474 % @image.  We use the macros from epsf.tex to support this.
   9475 % If epsf.tex is not installed and @image is used, we complain.
   9476 %
   9477 % Check for and read epsf.tex up front.  If we read it only at @image
   9478 % time, we might be inside a group, and then its definitions would get
   9479 % undone and the next image would fail.
   9480 \openin 1 = epsf.tex
   9481 \ifeof 1 \else
   9482   % Do not bother showing banner with epsf.tex v2.7k (available in
   9483   % doc/epsf.tex and on ctan).
   9484   \def\epsfannounce{\toks0 = }%
   9485   \input epsf.tex
   9486 \fi
   9487 \closein 1
   9488 %
   9489 % We will only complain once about lack of epsf.tex.
   9490 \newif\ifwarnednoepsf
   9491 \newhelp\noepsfhelp{epsf.tex must be installed for images to
   9492   work.  It is also included in the Texinfo distribution, or you can get
   9493   it from https://ctan.org/texarchive/macros/texinfo/texinfo/doc/epsf.tex.}
   9494 %
   9495 \def\image#1{%
   9496   \ifx\epsfbox\thisisundefined
   9497     \ifwarnednoepsf \else
   9498       \errhelp = \noepsfhelp
   9499       \errmessage{epsf.tex not found, images will be ignored}%
   9500       \global\warnednoepsftrue
   9501     \fi
   9502   \else
   9503     \imagexxx #1,,,,,\finish
   9504   \fi
   9505 }
   9506 
   9507 % Approximate height of a line in the standard text font.
   9508 \newdimen\capheight
   9509 \setbox0=\vbox{\tenrm H}
   9510 \capheight=\ht0
   9511 
   9512 %
   9513 % Arguments to @image:
   9514 % #1 is (mandatory) image filename; we tack on .eps extension.
   9515 % #2 is (optional) width, #3 is (optional) height.
   9516 % #4 is (ignored optional) html alt text.
   9517 % #5 is (ignored optional) extension.
   9518 % #6 is just the usual extra ignored arg for parsing stuff.
   9519 \newif\ifimagevmode
   9520 \def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup
   9521   \catcode`\^^M = 5     % in case we're inside an example
   9522   \normalturnoffactive  % allow _ et al. in names
   9523   \makevalueexpandable
   9524   \ifvmode
   9525     \imagevmodetrue
   9526     \medskip
   9527     % Usually we'll have text after the image which will insert
   9528     % \parskip glue, so insert it here too to equalize the space
   9529     % above and below.
   9530     \vskip\parskip
   9531     %
   9532     % Place image in a \vtop for a top page margin that is (close to) correct,
   9533     % as \topskip glue is relative to the first baseline.
   9534     \vtop\bgroup \kern -\capheight \vskip-\parskip
   9535   \fi
   9536   %
   9537   \ifx\centersub\centerV
   9538     % For @center @image, enter vertical mode and add vertical space
   9539     % Enter an extra \parskip because @center doesn't add space itself.
   9540     \vbox\bgroup\vskip\parskip\medskip\vskip\parskip
   9541   \else
   9542     % Enter horizontal mode so that indentation from an enclosing
   9543     %  environment such as @quotation is respected.
   9544     % However, if we're at the top level, we don't want the
   9545     %  normal paragraph indentation.
   9546     \imageindent
   9547   \fi
   9548   %
   9549   % Output the image.
   9550   \ifpdf
   9551     % For pdfTeX and LuaTeX <= 0.80
   9552     \dopdfimage{#1}{#2}{#3}%
   9553   \else
   9554     \ifx\XeTeXrevision\thisisundefined
   9555       % For epsf.tex
   9556       % \epsfbox itself resets \epsf?size at each figure.
   9557       \setbox0 = \hbox{\ignorespaces #2}%
   9558         \ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi
   9559       \setbox0 = \hbox{\ignorespaces #3}%
   9560         \ifdim\wd0 > 0pt \epsfysize=#3\relax \fi
   9561       \epsfbox{#1.eps}%
   9562     \else
   9563       % For XeTeX
   9564       \doxeteximage{#1}{#2}{#3}%
   9565     \fi
   9566   \fi
   9567   %
   9568   \ifimagevmode
   9569     \egroup
   9570     \medskip  % space after a standalone image
   9571   \fi
   9572   \ifx\centersub\centerV % @center @image
   9573     \medskip
   9574     \egroup % close \vbox
   9575   \fi
   9576 \endgroup}
   9577 
   9578 
   9579 % @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables,
   9580 % etc.  We don't actually implement floating yet, we always include the
   9581 % float "here".  But it seemed the best name for the future.
   9582 %
   9583 \envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish}
   9584 
   9585 % There may be a space before second and/or third parameter; delete it.
   9586 \def\eatcommaspace#1, {#1,}
   9587 
   9588 % #1 is the optional FLOATTYPE, the text label for this float, typically
   9589 % "Figure", "Table", "Example", etc.  Can't contain commas.  If omitted,
   9590 % this float will not be numbered and cannot be referred to.
   9591 %
   9592 % #2 is the optional xref label.  Also must be present for the float to
   9593 % be referable.
   9594 %
   9595 % #3 is the optional positioning argument; for now, it is ignored.  It
   9596 % will somehow specify the positions allowed to float to (here, top, bottom).
   9597 %
   9598 % We keep a separate counter for each FLOATTYPE, which we reset at each
   9599 % chapter-level command.
   9600 \let\resetallfloatnos=\empty
   9601 %
   9602 \def\dofloat#1,#2,#3,#4\finish{%
   9603   \let\thiscaption=\empty
   9604   \let\thisshortcaption=\empty
   9605   %
   9606   % don't lose footnotes inside @float.
   9607   %
   9608   % BEWARE: when the floats start float, we have to issue warning whenever an
   9609   % insert appears inside a float which could possibly float. --kasal, 26may04
   9610   %
   9611   \startsavinginserts
   9612   %
   9613   % We can't be used inside a paragraph.
   9614   \par
   9615   %
   9616   \vtop\bgroup
   9617     \def\floattype{#1}%
   9618     \def\floatlabel{#2}%
   9619     \def\floatloc{#3}% we do nothing with this yet.
   9620     %
   9621     \ifx\floattype\empty
   9622       \let\safefloattype=\empty
   9623     \else
   9624       {%
   9625         % the floattype might have accents or other special characters,
   9626         % but we need to use it in a control sequence name.
   9627         \indexnofonts
   9628         \turnoffactive
   9629         \xdef\safefloattype{\floattype}%
   9630       }%
   9631     \fi
   9632     %
   9633     % If label is given but no type, we handle that as the empty type.
   9634     \ifx\floatlabel\empty \else
   9635       % We want each FLOATTYPE to be numbered separately (Figure 1,
   9636       % Table 1, Figure 2, ...).  (And if no label, no number.)
   9637       %
   9638       \expandafter\getfloatno\csname\safefloattype floatno\endcsname
   9639       \global\advance\floatno by 1
   9640       %
   9641       {%
   9642         % This magic value for \currentsection is output by \setref as the
   9643         % XREFLABEL-title value.  \xrefX uses it to distinguish float
   9644         % labels (which have a completely different output format) from
   9645         % node and anchor labels.  And \xrdef uses it to construct the
   9646         % lists of floats.
   9647         %
   9648         \edef\currentsection{\floatmagic=\safefloattype}%
   9649         \setref{\floatlabel}{Yfloat}%
   9650       }%
   9651     \fi
   9652     %
   9653     % start with \parskip glue, I guess.
   9654     \vskip\parskip
   9655     %
   9656     % Don't suppress indentation if a float happens to start a section.
   9657     \restorefirstparagraphindent
   9658 }
   9659 
   9660 % we have these possibilities:
   9661 % @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap
   9662 % @float Foo,lbl & no caption:    Foo 1.1
   9663 % @float Foo & @caption{Cap}:     Foo: Cap
   9664 % @float Foo & no caption:        Foo
   9665 % @float ,lbl & Caption{Cap}:     1.1: Cap
   9666 % @float ,lbl & no caption:       1.1
   9667 % @float & @caption{Cap}:         Cap
   9668 % @float & no caption:
   9669 %
   9670 \def\Efloat{%
   9671     \let\floatident = \empty
   9672     %
   9673     % In all cases, if we have a float type, it comes first.
   9674     \ifx\floattype\empty \else \def\floatident{\floattype}\fi
   9675     %
   9676     % If we have an xref label, the number comes next.
   9677     \ifx\floatlabel\empty \else
   9678       \ifx\floattype\empty \else % if also had float type, need tie first.
   9679         \appendtomacro\floatident{\tie}%
   9680       \fi
   9681       % the number.
   9682       \appendtomacro\floatident{\chaplevelprefix\the\floatno}%
   9683     \fi
   9684     %
   9685     % Start the printed caption with what we've constructed in
   9686     % \floatident, but keep it separate; we need \floatident again.
   9687     \let\captionline = \floatident
   9688     %
   9689     \ifx\thiscaption\empty \else
   9690       \ifx\floatident\empty \else
   9691         \appendtomacro\captionline{: }% had ident, so need a colon between
   9692       \fi
   9693       %
   9694       % caption text.
   9695       \appendtomacro\captionline{\scanexp\thiscaption}%
   9696     \fi
   9697     %
   9698     % If we have anything to print, print it, with space before.
   9699     % Eventually this needs to become an \insert.
   9700     \ifx\captionline\empty \else
   9701       \vskip.5\parskip
   9702       \captionline
   9703       %
   9704       % Space below caption.
   9705       \vskip\parskip
   9706     \fi
   9707     %
   9708     % If have an xref label, write the list of floats info.  Do this
   9709     % after the caption, to avoid chance of it being a breakpoint.
   9710     \ifx\floatlabel\empty \else
   9711       % Write the text that goes in the lof to the aux file as
   9712       % \floatlabel-lof.  Besides \floatident, we include the short
   9713       % caption if specified, else the full caption if specified, else nothing.
   9714       {%
   9715         \requireauxfile
   9716         \atdummies
   9717         %
   9718         \ifx\thisshortcaption\empty
   9719           \def\gtemp{\thiscaption}%
   9720         \else
   9721           \def\gtemp{\thisshortcaption}%
   9722         \fi
   9723         \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident
   9724           \ifx\gtemp\empty \else : \gtemp \fi}}%
   9725       }%
   9726     \fi
   9727   \egroup  % end of \vtop
   9728   %
   9729   \checkinserts
   9730 }
   9731 
   9732 % Append the tokens #2 to the definition of macro #1, not expanding either.
   9733 %
   9734 \def\appendtomacro#1#2{%
   9735   \expandafter\def\expandafter#1\expandafter{#1#2}%
   9736 }
   9737 
   9738 % @caption, @shortcaption
   9739 %
   9740 \def\caption{\docaption\thiscaption}
   9741 \def\shortcaption{\docaption\thisshortcaption}
   9742 \def\docaption{\checkenv\float \bgroup\scanctxt\docaptionz}
   9743 \def\docaptionz#1#2{\egroup \def#1{#2}}
   9744 
   9745 % The parameter is the control sequence identifying the counter we are
   9746 % going to use.  Create it if it doesn't exist and assign it to \floatno.
   9747 \def\getfloatno#1{%
   9748   \ifx#1\relax
   9749       % Haven't seen this figure type before.
   9750       \csname newcount\endcsname #1%
   9751       %
   9752       % Remember to reset this floatno at the next chap.
   9753       \expandafter\gdef\expandafter\resetallfloatnos
   9754         \expandafter{\resetallfloatnos #1=0 }%
   9755   \fi
   9756   \let\floatno#1%
   9757 }
   9758 
   9759 % \setref calls this to get the XREFLABEL-snt value.  We want an @xref
   9760 % to the FLOATLABEL to expand to "Figure 3.1".  We call \setref when we
   9761 % first read the @float command.
   9762 %
   9763 \def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}%
   9764 
   9765 % Magic string used for the XREFLABEL-title value, so \xrefX can
   9766 % distinguish floats from other xref types.
   9767 \def\floatmagic{!!float!!}
   9768 
   9769 % #1 is the control sequence we are passed; we expand into a conditional
   9770 % which is true if #1 represents a float ref.  That is, the magic
   9771 % \currentsection value which we \setref above.
   9772 %
   9773 \def\iffloat#1{\expandafter\doiffloat#1==\finish}
   9774 %
   9775 % #1 is (maybe) the \floatmagic string.  If so, #2 will be the
   9776 % (safe) float type for this float.  We set \iffloattype to #2.
   9777 %
   9778 \def\doiffloat#1=#2=#3\finish{%
   9779   \def\temp{#1}%
   9780   \def\iffloattype{#2}%
   9781   \ifx\temp\floatmagic
   9782 }
   9783 
   9784 % @listoffloats FLOATTYPE - print a list of floats like a table of contents.
   9785 %
   9786 \parseargdef\listoffloats{%
   9787   \def\floattype{#1}% floattype
   9788   {%
   9789     % the floattype might have accents or other special characters,
   9790     % but we need to use it in a control sequence name.
   9791     \indexnofonts
   9792     \turnoffactive
   9793     \xdef\safefloattype{\floattype}%
   9794   }%
   9795   %
   9796   % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE.
   9797   \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax
   9798     \ifhavexrefs
   9799       % if the user said @listoffloats foo but never @float foo.
   9800       \message{\linenumber No `\safefloattype' floats to list.}%
   9801     \fi
   9802   \else
   9803     \begingroup
   9804       \leftskip=\tocindent  % indent these entries like a toc
   9805       \let\do=\listoffloatsdo
   9806       \csname floatlist\safefloattype\endcsname
   9807     \endgroup
   9808   \fi
   9809 }
   9810 
   9811 % This is called on each entry in a list of floats.  We're passed the
   9812 % xref label, in the form LABEL-title, which is how we save it in the
   9813 % aux file.  We strip off the -title and look up \XRLABEL-lof, which
   9814 % has the text we're supposed to typeset here.
   9815 %
   9816 % Figures without xref labels will not be included in the list (since
   9817 % they won't appear in the aux file).
   9818 %
   9819 \def\listoffloatsdo#1{\listoffloatsdoentry#1\finish}
   9820 \def\listoffloatsdoentry#1-title\finish{{%
   9821   % Can't fully expand XR#1-lof because it can contain anything.  Just
   9822   % pass the control sequence.  On the other hand, XR#1-pg is just the
   9823   % page number, and we want to fully expand that so we can get a link
   9824   % in pdf output.
   9825   \toksA = \expandafter{\csname XR#1-lof\endcsname}%
   9826   %
   9827   % use the same \entry macro we use to generate the TOC and index.
   9828   \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}%
   9829   \writeentry
   9830 }}
   9831 
   9832 
   9833 \message{localization,}
   9834 
   9835 % For single-language documents, @documentlanguage is usually given very
   9836 % early, just after @documentencoding.  Single argument is the language
   9837 % (de) or locale (de_DE) abbreviation.
   9838 %
   9839 {
   9840   \catcode`\_ = \active
   9841   \globaldefs=1
   9842 \parseargdef\documentlanguage{%
   9843   \tex % read txi-??.tex file in plain TeX.
   9844     % Read the file by the name they passed if it exists.
   9845     \let_ = \normalunderscore  % normal _ character for filename test
   9846     \openin 1 txi-#1.tex
   9847     \ifeof 1
   9848       \documentlanguagetrywithoutunderscore #1_\finish
   9849     \else
   9850       \globaldefs = 1  % everything in the txi-LL files needs to persist
   9851       \input txi-#1.tex
   9852     \fi
   9853     \closein 1
   9854   \endgroup % end raw TeX
   9855 }
   9856 %
   9857 % If they passed de_DE, and txi-de_DE.tex doesn't exist,
   9858 % try txi-de.tex.
   9859 %
   9860 \gdef\documentlanguagetrywithoutunderscore#1_#2\finish{%
   9861   \openin 1 txi-#1.tex
   9862   \ifeof 1
   9863     \errhelp = \nolanghelp
   9864     \errmessage{Cannot read language file txi-#1.tex}%
   9865   \else
   9866     \globaldefs = 1  % everything in the txi-LL files needs to persist
   9867     \input txi-#1.tex
   9868   \fi
   9869   \closein 1
   9870 }
   9871 }% end of special _ catcode
   9872 %
   9873 \newhelp\nolanghelp{The given language definition file cannot be found or
   9874 is empty.  Maybe you need to install it?  Putting it in the current
   9875 directory should work if nowhere else does.}
   9876 
   9877 % This macro is called from txi-??.tex files; the first argument is the
   9878 % \language name to set (without the "\lang@" prefix), the second and
   9879 % third args are \{left,right}hyphenmin.
   9880 %
   9881 % The language names to pass are determined when the format is built.
   9882 % See the etex.log file created at that time, e.g.,
   9883 % /usr/local/texlive/2008/texmf-var/web2c/pdftex/etex.log.
   9884 %
   9885 % With TeX Live 2008, etex now includes hyphenation patterns for all
   9886 % available languages.  This means we can support hyphenation in
   9887 % Texinfo, at least to some extent.  (This still doesn't solve the
   9888 % accented characters problem.)
   9889 %
   9890 \catcode`@=11
   9891 \def\txisetlanguage#1#2#3{%
   9892   % do not set the language if the name is undefined in the current TeX.
   9893   \expandafter\ifx\csname lang@#1\endcsname \relax
   9894     \message{no patterns for #1}%
   9895   \else
   9896     \global\language = \csname lang@#1\endcsname
   9897   \fi
   9898   % but there is no harm in adjusting the hyphenmin values regardless.
   9899   \global\lefthyphenmin = #2\relax
   9900   \global\righthyphenmin = #3\relax
   9901 }
   9902 
   9903 % XeTeX and LuaTeX can handle Unicode natively.
   9904 % Their default I/O uses UTF-8 sequences instead of a byte-wise operation.
   9905 % Other TeX engines' I/O (pdfTeX, etc.) is byte-wise.
   9906 %
   9907 \newif\iftxinativeunicodecapable
   9908 \newif\iftxiusebytewiseio
   9909 
   9910 \ifx\XeTeXrevision\thisisundefined
   9911   \ifx\luatexversion\thisisundefined
   9912     \txinativeunicodecapablefalse
   9913     \txiusebytewiseiotrue
   9914   \else
   9915     \txinativeunicodecapabletrue
   9916     \txiusebytewiseiofalse
   9917   \fi
   9918 \else
   9919   \txinativeunicodecapabletrue
   9920   \txiusebytewiseiofalse
   9921 \fi
   9922 
   9923 % Set I/O by bytes instead of UTF-8 sequence for XeTeX and LuaTex
   9924 % for non-UTF-8 (byte-wise) encodings.
   9925 %
   9926 \def\setbytewiseio{%
   9927   \ifx\XeTeXrevision\thisisundefined
   9928   \else
   9929     \XeTeXdefaultencoding "bytes"  % For subsequent files to be read
   9930     \XeTeXinputencoding "bytes"  % For document root file
   9931     % Unfortunately, there seems to be no corresponding XeTeX command for
   9932     % output encoding.  This is a problem for auxiliary index and TOC files.
   9933     % The only solution would be perhaps to write out @U{...} sequences in
   9934     % place of non-ASCII characters.
   9935   \fi
   9936 
   9937   \ifx\luatexversion\thisisundefined
   9938   \else
   9939     \directlua{
   9940     local utf8_char, byte, gsub = unicode.utf8.char, string.byte, string.gsub
   9941     local function convert_char (char)
   9942       return utf8_char(byte(char))
   9943     end
   9944 
   9945     local function convert_line (line)
   9946       return gsub(line, ".", convert_char)
   9947     end
   9948 
   9949     callback.register("process_input_buffer", convert_line)
   9950 
   9951     local function convert_line_out (line)
   9952       local line_out = ""
   9953       for c in string.utfvalues(line) do
   9954          line_out = line_out .. string.char(c)
   9955       end
   9956       return line_out
   9957     end
   9958 
   9959     callback.register("process_output_buffer", convert_line_out)
   9960     }
   9961   \fi
   9962 
   9963   \txiusebytewiseiotrue
   9964 }
   9965 
   9966 
   9967 % Helpers for encodings.
   9968 % Set the catcode of characters 128 through 255 to the specified number.
   9969 %
   9970 \def\setnonasciicharscatcode#1{%
   9971    \count255=128
   9972    \loop\ifnum\count255<256
   9973       \global\catcode\count255=#1\relax
   9974       \advance\count255 by 1
   9975    \repeat
   9976 }
   9977 
   9978 \def\setnonasciicharscatcodenonglobal#1{%
   9979    \count255=128
   9980    \loop\ifnum\count255<256
   9981       \catcode\count255=#1\relax
   9982       \advance\count255 by 1
   9983    \repeat
   9984 }
   9985 
   9986 % @documentencoding sets the definition of non-ASCII characters
   9987 % according to the specified encoding.
   9988 %
   9989 \def\documentencoding{\parseargusing\filenamecatcodes\documentencodingzzz}
   9990 \def\documentencodingzzz#1{%
   9991   %
   9992   % Encoding being declared for the document.
   9993   \def\declaredencoding{\csname #1.enc\endcsname}%
   9994   %
   9995   % Supported encodings: names converted to tokens in order to be able
   9996   % to compare them with \ifx.
   9997   \def\ascii{\csname US-ASCII.enc\endcsname}%
   9998   \def\latnine{\csname ISO-8859-15.enc\endcsname}%
   9999   \def\latone{\csname ISO-8859-1.enc\endcsname}%
  10000   \def\lattwo{\csname ISO-8859-2.enc\endcsname}%
  10001   \def\utfeight{\csname UTF-8.enc\endcsname}%
  10002   %
  10003   \ifx \declaredencoding \ascii
  10004      \asciichardefs
  10005   %
  10006   \else \ifx \declaredencoding \lattwo
  10007      \iftxinativeunicodecapable
  10008        \setbytewiseio
  10009      \fi
  10010      \setnonasciicharscatcode\active
  10011      \lattwochardefs
  10012   %
  10013   \else \ifx \declaredencoding \latone
  10014      \iftxinativeunicodecapable
  10015        \setbytewiseio
  10016      \fi
  10017      \setnonasciicharscatcode\active
  10018      \latonechardefs
  10019   %
  10020   \else \ifx \declaredencoding \latnine
  10021      \iftxinativeunicodecapable
  10022        \setbytewiseio
  10023      \fi
  10024      \setnonasciicharscatcode\active
  10025      \latninechardefs
  10026   %
  10027   \else \ifx \declaredencoding \utfeight
  10028      \iftxinativeunicodecapable
  10029        % For native Unicode handling (XeTeX and LuaTeX)
  10030        \nativeunicodechardefs
  10031      \else
  10032        % For treating UTF-8 as byte sequences (TeX, eTeX and pdfTeX).
  10033        % Since we already invoke \utfeightchardefs at the top level,
  10034        % making non-ascii chars active is sufficient.
  10035        \setnonasciicharscatcode\active
  10036      \fi
  10037   %
  10038   \else
  10039     \message{Ignoring unknown document encoding: #1.}%
  10040   %
  10041   \fi % utfeight
  10042   \fi % latnine
  10043   \fi % latone
  10044   \fi % lattwo
  10045   \fi % ascii
  10046   %
  10047   \ifx\XeTeXrevision\thisisundefined
  10048   \else
  10049     \ifx \declaredencoding \utfeight
  10050     \else
  10051       \ifx \declaredencoding \ascii
  10052       \else
  10053         \message{Warning: XeTeX with non-UTF-8 encodings cannot handle %
  10054         non-ASCII characters in auxiliary files.}%
  10055       \fi
  10056     \fi
  10057   \fi
  10058 }
  10059 
  10060 % A message to be logged when using a character that isn't available
  10061 % the default font encoding (OT1).
  10062 %
  10063 \def\missingcharmsg#1{\message{Character missing, sorry: #1.}}
  10064 
  10065 % Take account of \c (plain) vs. \, (Texinfo) difference.
  10066 \def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi}
  10067 
  10068 \def\gdefchar#1#2{%
  10069 \gdef#1{%
  10070    \ifpassthroughchars
  10071      \string#1%
  10072    \else
  10073      #2%
  10074    \fi
  10075 }}
  10076 
  10077 \begingroup
  10078 
  10079 % Make non-ASCII characters active for defining the character definition
  10080 % macros.
  10081 \setnonasciicharscatcode\active
  10082 
  10083 % Latin1 (ISO-8859-1) character definitions.
  10084 \gdef\latonechardefs{%
  10085   \gdefchar^^a0{\tie}
  10086   \gdefchar^^a1{\exclamdown}
  10087   \gdefchar^^a2{{\tcfont \char162}} % cent
  10088   \gdefchar^^a3{\pounds{}}
  10089   \gdefchar^^a4{{\tcfont \char164}} % currency
  10090   \gdefchar^^a5{{\tcfont \char165}} % yen
  10091   \gdefchar^^a6{{\tcfont \char166}} % broken bar
  10092   \gdefchar^^a7{\S}
  10093   \gdefchar^^a8{\"{}}
  10094   \gdefchar^^a9{\copyright{}}
  10095   \gdefchar^^aa{\ordf}
  10096   \gdefchar^^ab{\guillemetleft{}}
  10097   \gdefchar^^ac{\ensuremath\lnot}
  10098   \gdefchar^^ad{\-}
  10099   \gdefchar^^ae{\registeredsymbol{}}
  10100   \gdefchar^^af{\={}}
  10101   %
  10102   \gdefchar^^b0{\textdegree}
  10103   \gdefchar^^b1{$\pm$}
  10104   \gdefchar^^b2{$^2$}
  10105   \gdefchar^^b3{$^3$}
  10106   \gdefchar^^b4{\'{}}
  10107   \gdefchar^^b5{$\mu$}
  10108   \gdefchar^^b6{\P}
  10109   \gdefchar^^b7{\ensuremath\cdot}
  10110   \gdefchar^^b8{\cedilla\ }
  10111   \gdefchar^^b9{$^1$}
  10112   \gdefchar^^ba{\ordm}
  10113   \gdefchar^^bb{\guillemetright{}}
  10114   \gdefchar^^bc{$1\over4$}
  10115   \gdefchar^^bd{$1\over2$}
  10116   \gdefchar^^be{$3\over4$}
  10117   \gdefchar^^bf{\questiondown}
  10118   %
  10119   \gdefchar^^c0{\`A}
  10120   \gdefchar^^c1{\'A}
  10121   \gdefchar^^c2{\^A}
  10122   \gdefchar^^c3{\~A}
  10123   \gdefchar^^c4{\"A}
  10124   \gdefchar^^c5{\ringaccent A}
  10125   \gdefchar^^c6{\AE}
  10126   \gdefchar^^c7{\cedilla C}
  10127   \gdefchar^^c8{\`E}
  10128   \gdefchar^^c9{\'E}
  10129   \gdefchar^^ca{\^E}
  10130   \gdefchar^^cb{\"E}
  10131   \gdefchar^^cc{\`I}
  10132   \gdefchar^^cd{\'I}
  10133   \gdefchar^^ce{\^I}
  10134   \gdefchar^^cf{\"I}
  10135   %
  10136   \gdefchar^^d0{\DH}
  10137   \gdefchar^^d1{\~N}
  10138   \gdefchar^^d2{\`O}
  10139   \gdefchar^^d3{\'O}
  10140   \gdefchar^^d4{\^O}
  10141   \gdefchar^^d5{\~O}
  10142   \gdefchar^^d6{\"O}
  10143   \gdefchar^^d7{$\times$}
  10144   \gdefchar^^d8{\O}
  10145   \gdefchar^^d9{\`U}
  10146   \gdefchar^^da{\'U}
  10147   \gdefchar^^db{\^U}
  10148   \gdefchar^^dc{\"U}
  10149   \gdefchar^^dd{\'Y}
  10150   \gdefchar^^de{\TH}
  10151   \gdefchar^^df{\ss}
  10152   %
  10153   \gdefchar^^e0{\`a}
  10154   \gdefchar^^e1{\'a}
  10155   \gdefchar^^e2{\^a}
  10156   \gdefchar^^e3{\~a}
  10157   \gdefchar^^e4{\"a}
  10158   \gdefchar^^e5{\ringaccent a}
  10159   \gdefchar^^e6{\ae}
  10160   \gdefchar^^e7{\cedilla c}
  10161   \gdefchar^^e8{\`e}
  10162   \gdefchar^^e9{\'e}
  10163   \gdefchar^^ea{\^e}
  10164   \gdefchar^^eb{\"e}
  10165   \gdefchar^^ec{\`{\dotless i}}
  10166   \gdefchar^^ed{\'{\dotless i}}
  10167   \gdefchar^^ee{\^{\dotless i}}
  10168   \gdefchar^^ef{\"{\dotless i}}
  10169   %
  10170   \gdefchar^^f0{\dh}
  10171   \gdefchar^^f1{\~n}
  10172   \gdefchar^^f2{\`o}
  10173   \gdefchar^^f3{\'o}
  10174   \gdefchar^^f4{\^o}
  10175   \gdefchar^^f5{\~o}
  10176   \gdefchar^^f6{\"o}
  10177   \gdefchar^^f7{$\div$}
  10178   \gdefchar^^f8{\o}
  10179   \gdefchar^^f9{\`u}
  10180   \gdefchar^^fa{\'u}
  10181   \gdefchar^^fb{\^u}
  10182   \gdefchar^^fc{\"u}
  10183   \gdefchar^^fd{\'y}
  10184   \gdefchar^^fe{\th}
  10185   \gdefchar^^ff{\"y}
  10186 }
  10187 
  10188 % Latin9 (ISO-8859-15) encoding character definitions.
  10189 \gdef\latninechardefs{%
  10190   % Encoding is almost identical to Latin1.
  10191   \latonechardefs
  10192   %
  10193   \gdefchar^^a4{\euro{}}
  10194   \gdefchar^^a6{\v S}
  10195   \gdefchar^^a8{\v s}
  10196   \gdefchar^^b4{\v Z}
  10197   \gdefchar^^b8{\v z}
  10198   \gdefchar^^bc{\OE}
  10199   \gdefchar^^bd{\oe}
  10200   \gdefchar^^be{\"Y}
  10201 }
  10202 
  10203 % Latin2 (ISO-8859-2) character definitions.
  10204 \gdef\lattwochardefs{%
  10205   \gdefchar^^a0{\tie}
  10206   \gdefchar^^a1{\ogonek{A}}
  10207   \gdefchar^^a2{\u{}}
  10208   \gdefchar^^a3{\L}
  10209   \gdefchar^^a4{\missingcharmsg{CURRENCY SIGN}}
  10210   \gdefchar^^a5{\v L}
  10211   \gdefchar^^a6{\'S}
  10212   \gdefchar^^a7{\S}
  10213   \gdefchar^^a8{\"{}}
  10214   \gdefchar^^a9{\v S}
  10215   \gdefchar^^aa{\cedilla S}
  10216   \gdefchar^^ab{\v T}
  10217   \gdefchar^^ac{\'Z}
  10218   \gdefchar^^ad{\-}
  10219   \gdefchar^^ae{\v Z}
  10220   \gdefchar^^af{\dotaccent Z}
  10221   %
  10222   \gdefchar^^b0{\textdegree}
  10223   \gdefchar^^b1{\ogonek{a}}
  10224   \gdefchar^^b2{\ogonek{ }}
  10225   \gdefchar^^b3{\l}
  10226   \gdefchar^^b4{\'{}}
  10227   \gdefchar^^b5{\v l}
  10228   \gdefchar^^b6{\'s}
  10229   \gdefchar^^b7{\v{}}
  10230   \gdefchar^^b8{\cedilla\ }
  10231   \gdefchar^^b9{\v s}
  10232   \gdefchar^^ba{\cedilla s}
  10233   \gdefchar^^bb{\v t}
  10234   \gdefchar^^bc{\'z}
  10235   \gdefchar^^bd{\H{}}
  10236   \gdefchar^^be{\v z}
  10237   \gdefchar^^bf{\dotaccent z}
  10238   %
  10239   \gdefchar^^c0{\'R}
  10240   \gdefchar^^c1{\'A}
  10241   \gdefchar^^c2{\^A}
  10242   \gdefchar^^c3{\u A}
  10243   \gdefchar^^c4{\"A}
  10244   \gdefchar^^c5{\'L}
  10245   \gdefchar^^c6{\'C}
  10246   \gdefchar^^c7{\cedilla C}
  10247   \gdefchar^^c8{\v C}
  10248   \gdefchar^^c9{\'E}
  10249   \gdefchar^^ca{\ogonek{E}}
  10250   \gdefchar^^cb{\"E}
  10251   \gdefchar^^cc{\v E}
  10252   \gdefchar^^cd{\'I}
  10253   \gdefchar^^ce{\^I}
  10254   \gdefchar^^cf{\v D}
  10255   %
  10256   \gdefchar^^d0{\DH}
  10257   \gdefchar^^d1{\'N}
  10258   \gdefchar^^d2{\v N}
  10259   \gdefchar^^d3{\'O}
  10260   \gdefchar^^d4{\^O}
  10261   \gdefchar^^d5{\H O}
  10262   \gdefchar^^d6{\"O}
  10263   \gdefchar^^d7{$\times$}
  10264   \gdefchar^^d8{\v R}
  10265   \gdefchar^^d9{\ringaccent U}
  10266   \gdefchar^^da{\'U}
  10267   \gdefchar^^db{\H U}
  10268   \gdefchar^^dc{\"U}
  10269   \gdefchar^^dd{\'Y}
  10270   \gdefchar^^de{\cedilla T}
  10271   \gdefchar^^df{\ss}
  10272   %
  10273   \gdefchar^^e0{\'r}
  10274   \gdefchar^^e1{\'a}
  10275   \gdefchar^^e2{\^a}
  10276   \gdefchar^^e3{\u a}
  10277   \gdefchar^^e4{\"a}
  10278   \gdefchar^^e5{\'l}
  10279   \gdefchar^^e6{\'c}
  10280   \gdefchar^^e7{\cedilla c}
  10281   \gdefchar^^e8{\v c}
  10282   \gdefchar^^e9{\'e}
  10283   \gdefchar^^ea{\ogonek{e}}
  10284   \gdefchar^^eb{\"e}
  10285   \gdefchar^^ec{\v e}
  10286   \gdefchar^^ed{\'{\dotless{i}}}
  10287   \gdefchar^^ee{\^{\dotless{i}}}
  10288   \gdefchar^^ef{\v d}
  10289   %
  10290   \gdefchar^^f0{\dh}
  10291   \gdefchar^^f1{\'n}
  10292   \gdefchar^^f2{\v n}
  10293   \gdefchar^^f3{\'o}
  10294   \gdefchar^^f4{\^o}
  10295   \gdefchar^^f5{\H o}
  10296   \gdefchar^^f6{\"o}
  10297   \gdefchar^^f7{$\div$}
  10298   \gdefchar^^f8{\v r}
  10299   \gdefchar^^f9{\ringaccent u}
  10300   \gdefchar^^fa{\'u}
  10301   \gdefchar^^fb{\H u}
  10302   \gdefchar^^fc{\"u}
  10303   \gdefchar^^fd{\'y}
  10304   \gdefchar^^fe{\cedilla t}
  10305   \gdefchar^^ff{\dotaccent{}}
  10306 }
  10307 
  10308 \endgroup % active chars
  10309 
  10310 % UTF-8 character definitions.
  10311 %
  10312 % This code to support UTF-8 is based on LaTeX's utf8.def, with some
  10313 % changes for Texinfo conventions.  It is included here under the GPL by
  10314 % permission from Frank Mittelbach and the LaTeX team.
  10315 %
  10316 \newcount\countUTFx
  10317 \newcount\countUTFy
  10318 \newcount\countUTFz
  10319 
  10320 \gdef\UTFviiiTwoOctets#1#2{\expandafter
  10321    \UTFviiiDefined\csname u8:#1\string #2\endcsname}
  10322 %
  10323 \gdef\UTFviiiThreeOctets#1#2#3{\expandafter
  10324    \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname}
  10325 %
  10326 \gdef\UTFviiiFourOctets#1#2#3#4{\expandafter
  10327    \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname}
  10328 
  10329 \gdef\UTFviiiDefined#1{%
  10330   \ifx #1\relax
  10331     \message{\linenumber Unicode char \string #1 not defined for Texinfo}%
  10332   \else
  10333     \expandafter #1%
  10334   \fi
  10335 }
  10336 
  10337 % Give non-ASCII bytes the active definitions for processing UTF-8 sequences
  10338 \begingroup
  10339   \catcode`\~13
  10340   \catcode`\$12
  10341   \catcode`\"12
  10342 
  10343   % Loop from \countUTFx to \countUTFy, performing \UTFviiiTmp
  10344   % substituting ~ and $ with a character token of that value.
  10345   \def\UTFviiiLoop{%
  10346     \global\catcode\countUTFx\active
  10347     \uccode`\~\countUTFx
  10348     \uccode`\$\countUTFx
  10349     \uppercase\expandafter{\UTFviiiTmp}%
  10350     \advance\countUTFx by 1
  10351     \ifnum\countUTFx < \countUTFy
  10352       \expandafter\UTFviiiLoop
  10353     \fi}
  10354 
  10355   % For bytes other than the first in a UTF-8 sequence.  Not expected to
  10356   % be expanded except when writing to auxiliary files.
  10357   \countUTFx = "80
  10358   \countUTFy = "C2
  10359   \def\UTFviiiTmp{%
  10360     \gdef~{%
  10361         \ifpassthroughchars $\fi}}%
  10362   \UTFviiiLoop
  10363 
  10364   \countUTFx = "C2
  10365   \countUTFy = "E0
  10366   \def\UTFviiiTmp{%
  10367     \gdef~{%
  10368         \ifpassthroughchars $%
  10369         \else\expandafter\UTFviiiTwoOctets\expandafter$\fi}}%
  10370   \UTFviiiLoop
  10371 
  10372   \countUTFx = "E0
  10373   \countUTFy = "F0
  10374   \def\UTFviiiTmp{%
  10375     \gdef~{%
  10376         \ifpassthroughchars $%
  10377         \else\expandafter\UTFviiiThreeOctets\expandafter$\fi}}%
  10378   \UTFviiiLoop
  10379 
  10380   \countUTFx = "F0
  10381   \countUTFy = "F4
  10382   \def\UTFviiiTmp{%
  10383     \gdef~{%
  10384         \ifpassthroughchars $%
  10385         \else\expandafter\UTFviiiFourOctets\expandafter$\fi
  10386         }}%
  10387   \UTFviiiLoop
  10388 \endgroup
  10389 
  10390 \def\globallet{\global\let} % save some \expandafter's below
  10391 
  10392 % @U{xxxx} to produce U+xxxx, if we support it.
  10393 \def\U#1{%
  10394   \expandafter\ifx\csname uni:#1\endcsname \relax
  10395     \iftxinativeunicodecapable
  10396       % All Unicode characters can be used if native Unicode handling is
  10397       % active.  However, if the font does not have the glyph,
  10398       % letters are missing.
  10399       \begingroup
  10400         \uccode`\.="#1\relax
  10401         \uppercase{.}
  10402       \endgroup
  10403     \else
  10404       \errhelp = \EMsimple
  10405       \errmessage{Unicode character U+#1 not supported, sorry}%
  10406     \fi
  10407   \else
  10408     \csname uni:#1\endcsname
  10409   \fi
  10410 }
  10411 
  10412 % These macros are used here to construct the name of a control
  10413 % sequence to be defined.
  10414 \def\UTFviiiTwoOctetsName#1#2{%
  10415   \csname u8:#1\string #2\endcsname}%
  10416 \def\UTFviiiThreeOctetsName#1#2#3{%
  10417   \csname u8:#1\string #2\string #3\endcsname}%
  10418 \def\UTFviiiFourOctetsName#1#2#3#4{%
  10419   \csname u8:#1\string #2\string #3\string #4\endcsname}%
  10420 
  10421 % For UTF-8 byte sequences (TeX, e-TeX and pdfTeX),
  10422 % provide a definition macro to replace a Unicode character;
  10423 % this gets used by the @U command
  10424 %
  10425 \begingroup
  10426   \catcode`\"=12
  10427   \catcode`\<=12
  10428   \catcode`\.=12
  10429   \catcode`\,=12
  10430   \catcode`\;=12
  10431   \catcode`\!=12
  10432   \catcode`\~=13
  10433   \gdef\DeclareUnicodeCharacterUTFviii#1#2{%
  10434     \countUTFz = "#1\relax
  10435     \begingroup
  10436       \parseXMLCharref
  10437 
  10438       % Give \u8:... its definition.  The sequence of seven \expandafter's
  10439       % expands after the \gdef three times, e.g.
  10440       %
  10441       % 1.  \UTFviiTwoOctetsName B1 B2
  10442       % 2.  \csname u8:B1 \string B2 \endcsname
  10443       % 3.  \u8: B1 B2  (a single control sequence token)
  10444       %
  10445       \expandafter\expandafter
  10446       \expandafter\expandafter
  10447       \expandafter\expandafter
  10448       \expandafter\gdef       \UTFviiiTmp{#2}%
  10449       %
  10450       \expandafter\ifx\csname uni:#1\endcsname \relax \else
  10451        \message{Internal error, already defined: #1}%
  10452       \fi
  10453       %
  10454       % define an additional control sequence for this code point.
  10455       \expandafter\globallet\csname uni:#1\endcsname \UTFviiiTmp
  10456     \endgroup}
  10457   %
  10458   % Given the value in \countUTFz as a Unicode code point, set \UTFviiiTmp
  10459   % to the corresponding UTF-8 sequence.
  10460   \gdef\parseXMLCharref{%
  10461     \ifnum\countUTFz < "20\relax
  10462       \errhelp = \EMsimple
  10463       \errmessage{Cannot define Unicode char value < 0020}%
  10464     \else\ifnum\countUTFz < "800\relax
  10465       \parseUTFviiiA,%
  10466       \parseUTFviiiB C\UTFviiiTwoOctetsName.,%
  10467     \else\ifnum\countUTFz < "10000\relax
  10468       \parseUTFviiiA;%
  10469       \parseUTFviiiA,%
  10470       \parseUTFviiiB E\UTFviiiThreeOctetsName.{,;}%
  10471     \else
  10472       \parseUTFviiiA;%
  10473       \parseUTFviiiA,%
  10474       \parseUTFviiiA!%
  10475       \parseUTFviiiB F\UTFviiiFourOctetsName.{!,;}%
  10476     \fi\fi\fi
  10477   }
  10478 
  10479   % Extract a byte from the end of the UTF-8 representation of \countUTFx.
  10480   % It must be a non-initial byte in the sequence.
  10481   % Change \uccode of #1 for it to be used in \parseUTFviiiB as one
  10482   % of the bytes.
  10483   \gdef\parseUTFviiiA#1{%
  10484     \countUTFx = \countUTFz
  10485     \divide\countUTFz by 64
  10486     \countUTFy = \countUTFz  % Save to be the future value of \countUTFz.
  10487     \multiply\countUTFz by 64
  10488 
  10489     % \countUTFz is now \countUTFx with the last 5 bits cleared.  Subtract
  10490     % in order to get the last five bits.
  10491     \advance\countUTFx by -\countUTFz
  10492 
  10493     % Convert this to the byte in the UTF-8 sequence.
  10494     \advance\countUTFx by 128
  10495     \uccode `#1\countUTFx
  10496     \countUTFz = \countUTFy}
  10497 
  10498   % Used to put a UTF-8 byte sequence into \UTFviiiTmp
  10499   % #1 is the increment for \countUTFz to yield a the first byte of the UTF-8
  10500   %    sequence.
  10501   % #2 is one of the \UTFviii*OctetsName macros.
  10502   % #3 is always a full stop (.)
  10503   % #4 is a template for the other bytes in the sequence.  The values for these
  10504   %    bytes is substituted in here with \uppercase using the \uccode's.
  10505   \gdef\parseUTFviiiB#1#2#3#4{%
  10506     \advance\countUTFz by "#10\relax
  10507     \uccode `#3\countUTFz
  10508     \uppercase{\gdef\UTFviiiTmp{#2#3#4}}}
  10509 \endgroup
  10510 
  10511 % For native Unicode handling (XeTeX and LuaTeX),
  10512 % provide a definition macro that sets a catcode to `other' non-globally
  10513 %
  10514 \def\DeclareUnicodeCharacterNativeOther#1#2{%
  10515   \catcode"#1=\other
  10516 }
  10517 
  10518 % https://en.wikipedia.org/wiki/Plane_(Unicode)#Basic_M
  10519 % U+0000..U+007F = https://en.wikipedia.org/wiki/Basic_Latin_(Unicode_block)
  10520 % U+0080..U+00FF = https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)
  10521 % U+0100..U+017F = https://en.wikipedia.org/wiki/Latin_Extended-A
  10522 % U+0180..U+024F = https://en.wikipedia.org/wiki/Latin_Extended-B
  10523 %
  10524 % Many of our renditions are less than wonderful, and all the missing
  10525 % characters are available somewhere.  Loading the necessary fonts
  10526 % awaits user request.  We can't truly support Unicode without
  10527 % reimplementing everything that's been done in LaTeX for many years,
  10528 % plus probably using luatex or xetex, and who knows what else.
  10529 % We won't be doing that here in this simple file.  But we can try to at
  10530 % least make most of the characters not bomb out.
  10531 %
  10532 \def\unicodechardefs{%
  10533   \DeclareUnicodeCharacter{0020}{ } % space
  10534   \DeclareUnicodeCharacter{0021}{\char"21 }% % space to terminate number
  10535   \DeclareUnicodeCharacter{0022}{\char"22 }%
  10536   \DeclareUnicodeCharacter{0023}{\char"23 }%
  10537   \DeclareUnicodeCharacter{0024}{\char"24 }%
  10538   \DeclareUnicodeCharacter{0025}{\char"25 }%
  10539   \DeclareUnicodeCharacter{0026}{\char"26 }%
  10540   \DeclareUnicodeCharacter{0027}{\char"27 }%
  10541   \DeclareUnicodeCharacter{0028}{\char"28 }%
  10542   \DeclareUnicodeCharacter{0029}{\char"29 }%
  10543   \DeclareUnicodeCharacter{002A}{\char"2A }%
  10544   \DeclareUnicodeCharacter{002B}{\char"2B }%
  10545   \DeclareUnicodeCharacter{002C}{\char"2C }%
  10546   \DeclareUnicodeCharacter{002D}{\char"2D }%
  10547   \DeclareUnicodeCharacter{002E}{\char"2E }%
  10548   \DeclareUnicodeCharacter{002F}{\char"2F }%
  10549   \DeclareUnicodeCharacter{0030}{0}%
  10550   \DeclareUnicodeCharacter{0031}{1}%
  10551   \DeclareUnicodeCharacter{0032}{2}%
  10552   \DeclareUnicodeCharacter{0033}{3}%
  10553   \DeclareUnicodeCharacter{0034}{4}%
  10554   \DeclareUnicodeCharacter{0035}{5}%
  10555   \DeclareUnicodeCharacter{0036}{6}%
  10556   \DeclareUnicodeCharacter{0037}{7}%
  10557   \DeclareUnicodeCharacter{0038}{8}%
  10558   \DeclareUnicodeCharacter{0039}{9}%
  10559   \DeclareUnicodeCharacter{003A}{\char"3A }%
  10560   \DeclareUnicodeCharacter{003B}{\char"3B }%
  10561   \DeclareUnicodeCharacter{003C}{\char"3C }%
  10562   \DeclareUnicodeCharacter{003D}{\char"3D }%
  10563   \DeclareUnicodeCharacter{003E}{\char"3E }%
  10564   \DeclareUnicodeCharacter{003F}{\char"3F }%
  10565   \DeclareUnicodeCharacter{0040}{\char"40 }%
  10566   \DeclareUnicodeCharacter{0041}{A}%
  10567   \DeclareUnicodeCharacter{0042}{B}%
  10568   \DeclareUnicodeCharacter{0043}{C}%
  10569   \DeclareUnicodeCharacter{0044}{D}%
  10570   \DeclareUnicodeCharacter{0045}{E}%
  10571   \DeclareUnicodeCharacter{0046}{F}%
  10572   \DeclareUnicodeCharacter{0047}{G}%
  10573   \DeclareUnicodeCharacter{0048}{H}%
  10574   \DeclareUnicodeCharacter{0049}{I}%
  10575   \DeclareUnicodeCharacter{004A}{J}%
  10576   \DeclareUnicodeCharacter{004B}{K}%
  10577   \DeclareUnicodeCharacter{004C}{L}%
  10578   \DeclareUnicodeCharacter{004D}{M}%
  10579   \DeclareUnicodeCharacter{004E}{N}%
  10580   \DeclareUnicodeCharacter{004F}{O}%
  10581   \DeclareUnicodeCharacter{0050}{P}%
  10582   \DeclareUnicodeCharacter{0051}{Q}%
  10583   \DeclareUnicodeCharacter{0052}{R}%
  10584   \DeclareUnicodeCharacter{0053}{S}%
  10585   \DeclareUnicodeCharacter{0054}{T}%
  10586   \DeclareUnicodeCharacter{0055}{U}%
  10587   \DeclareUnicodeCharacter{0056}{V}%
  10588   \DeclareUnicodeCharacter{0057}{W}%
  10589   \DeclareUnicodeCharacter{0058}{X}%
  10590   \DeclareUnicodeCharacter{0059}{Y}%
  10591   \DeclareUnicodeCharacter{005A}{Z}%
  10592   \DeclareUnicodeCharacter{005B}{\char"5B }%
  10593   \DeclareUnicodeCharacter{005C}{\char"5C }%
  10594   \DeclareUnicodeCharacter{005D}{\char"5D }%
  10595   \DeclareUnicodeCharacter{005E}{\char"5E }%
  10596   \DeclareUnicodeCharacter{005F}{\char"5F }%
  10597   \DeclareUnicodeCharacter{0060}{\char"60 }%
  10598   \DeclareUnicodeCharacter{0061}{a}%
  10599   \DeclareUnicodeCharacter{0062}{b}%
  10600   \DeclareUnicodeCharacter{0063}{c}%
  10601   \DeclareUnicodeCharacter{0064}{d}%
  10602   \DeclareUnicodeCharacter{0065}{e}%
  10603   \DeclareUnicodeCharacter{0066}{f}%
  10604   \DeclareUnicodeCharacter{0067}{g}%
  10605   \DeclareUnicodeCharacter{0068}{h}%
  10606   \DeclareUnicodeCharacter{0069}{i}%
  10607   \DeclareUnicodeCharacter{006A}{j}%
  10608   \DeclareUnicodeCharacter{006B}{k}%
  10609   \DeclareUnicodeCharacter{006C}{l}%
  10610   \DeclareUnicodeCharacter{006D}{m}%
  10611   \DeclareUnicodeCharacter{006E}{n}%
  10612   \DeclareUnicodeCharacter{006F}{o}%
  10613   \DeclareUnicodeCharacter{0070}{p}%
  10614   \DeclareUnicodeCharacter{0071}{q}%
  10615   \DeclareUnicodeCharacter{0072}{r}%
  10616   \DeclareUnicodeCharacter{0073}{s}%
  10617   \DeclareUnicodeCharacter{0074}{t}%
  10618   \DeclareUnicodeCharacter{0075}{u}%
  10619   \DeclareUnicodeCharacter{0076}{v}%
  10620   \DeclareUnicodeCharacter{0077}{w}%
  10621   \DeclareUnicodeCharacter{0078}{x}%
  10622   \DeclareUnicodeCharacter{0079}{y}%
  10623   \DeclareUnicodeCharacter{007A}{z}%
  10624   \DeclareUnicodeCharacter{007B}{\char"7B }%
  10625   \DeclareUnicodeCharacter{007C}{\char"7C }%
  10626   \DeclareUnicodeCharacter{007D}{\char"7D }%
  10627   \DeclareUnicodeCharacter{007E}{\char"7E }%
  10628   % \DeclareUnicodeCharacter{007F}{} % DEL
  10629   %
  10630   \DeclareUnicodeCharacter{00A0}{\tie}%
  10631   \DeclareUnicodeCharacter{00A1}{\exclamdown}%
  10632   \DeclareUnicodeCharacter{00A2}{{\tcfont \char162}}% 0242=cent
  10633   \DeclareUnicodeCharacter{00A3}{\pounds{}}%
  10634   \DeclareUnicodeCharacter{00A4}{{\tcfont \char164}}% 0244=currency
  10635   \DeclareUnicodeCharacter{00A5}{{\tcfont \char165}}% 0245=yen
  10636   \DeclareUnicodeCharacter{00A6}{{\tcfont \char166}}% 0246=brokenbar
  10637   \DeclareUnicodeCharacter{00A7}{\S}%
  10638   \DeclareUnicodeCharacter{00A8}{\"{ }}%
  10639   \DeclareUnicodeCharacter{00A9}{\copyright{}}%
  10640   \DeclareUnicodeCharacter{00AA}{\ordf}%
  10641   \DeclareUnicodeCharacter{00AB}{\guillemetleft{}}%
  10642   \DeclareUnicodeCharacter{00AC}{\ensuremath\lnot}%
  10643   \DeclareUnicodeCharacter{00AD}{\-}%
  10644   \DeclareUnicodeCharacter{00AE}{\registeredsymbol{}}%
  10645   \DeclareUnicodeCharacter{00AF}{\={ }}%
  10646   %
  10647   \DeclareUnicodeCharacter{00B0}{\textdegree}%
  10648   \DeclareUnicodeCharacter{00B1}{\ensuremath\pm}%
  10649   \DeclareUnicodeCharacter{00B2}{$^2$}%
  10650   \DeclareUnicodeCharacter{00B3}{$^3$}%
  10651   \DeclareUnicodeCharacter{00B4}{\'{ }}%
  10652   \DeclareUnicodeCharacter{00B5}{$\mu$}%
  10653   \DeclareUnicodeCharacter{00B6}{\P}%
  10654   \DeclareUnicodeCharacter{00B7}{\ensuremath\cdot}%
  10655   \DeclareUnicodeCharacter{00B8}{\cedilla{ }}%
  10656   \DeclareUnicodeCharacter{00B9}{$^1$}%
  10657   \DeclareUnicodeCharacter{00BA}{\ordm}%
  10658   \DeclareUnicodeCharacter{00BB}{\guillemetright{}}%
  10659   \DeclareUnicodeCharacter{00BC}{$1\over4$}%
  10660   \DeclareUnicodeCharacter{00BD}{$1\over2$}%
  10661   \DeclareUnicodeCharacter{00BE}{$3\over4$}%
  10662   \DeclareUnicodeCharacter{00BF}{\questiondown}%
  10663   %
  10664   \DeclareUnicodeCharacter{00C0}{\`A}%
  10665   \DeclareUnicodeCharacter{00C1}{\'A}%
  10666   \DeclareUnicodeCharacter{00C2}{\^A}%
  10667   \DeclareUnicodeCharacter{00C3}{\~A}%
  10668   \DeclareUnicodeCharacter{00C4}{\"A}%
  10669   \DeclareUnicodeCharacter{00C5}{\AA}%
  10670   \DeclareUnicodeCharacter{00C6}{\AE}%
  10671   \DeclareUnicodeCharacter{00C7}{\cedilla{C}}%
  10672   \DeclareUnicodeCharacter{00C8}{\`E}%
  10673   \DeclareUnicodeCharacter{00C9}{\'E}%
  10674   \DeclareUnicodeCharacter{00CA}{\^E}%
  10675   \DeclareUnicodeCharacter{00CB}{\"E}%
  10676   \DeclareUnicodeCharacter{00CC}{\`I}%
  10677   \DeclareUnicodeCharacter{00CD}{\'I}%
  10678   \DeclareUnicodeCharacter{00CE}{\^I}%
  10679   \DeclareUnicodeCharacter{00CF}{\"I}%
  10680   %
  10681   \DeclareUnicodeCharacter{00D0}{\DH}%
  10682   \DeclareUnicodeCharacter{00D1}{\~N}%
  10683   \DeclareUnicodeCharacter{00D2}{\`O}%
  10684   \DeclareUnicodeCharacter{00D3}{\'O}%
  10685   \DeclareUnicodeCharacter{00D4}{\^O}%
  10686   \DeclareUnicodeCharacter{00D5}{\~O}%
  10687   \DeclareUnicodeCharacter{00D6}{\"O}%
  10688   \DeclareUnicodeCharacter{00D7}{\ensuremath\times}%
  10689   \DeclareUnicodeCharacter{00D8}{\O}%
  10690   \DeclareUnicodeCharacter{00D9}{\`U}%
  10691   \DeclareUnicodeCharacter{00DA}{\'U}%
  10692   \DeclareUnicodeCharacter{00DB}{\^U}%
  10693   \DeclareUnicodeCharacter{00DC}{\"U}%
  10694   \DeclareUnicodeCharacter{00DD}{\'Y}%
  10695   \DeclareUnicodeCharacter{00DE}{\TH}%
  10696   \DeclareUnicodeCharacter{00DF}{\ss}%
  10697   %
  10698   \DeclareUnicodeCharacter{00E0}{\`a}%
  10699   \DeclareUnicodeCharacter{00E1}{\'a}%
  10700   \DeclareUnicodeCharacter{00E2}{\^a}%
  10701   \DeclareUnicodeCharacter{00E3}{\~a}%
  10702   \DeclareUnicodeCharacter{00E4}{\"a}%
  10703   \DeclareUnicodeCharacter{00E5}{\aa}%
  10704   \DeclareUnicodeCharacter{00E6}{\ae}%
  10705   \DeclareUnicodeCharacter{00E7}{\cedilla{c}}%
  10706   \DeclareUnicodeCharacter{00E8}{\`e}%
  10707   \DeclareUnicodeCharacter{00E9}{\'e}%
  10708   \DeclareUnicodeCharacter{00EA}{\^e}%
  10709   \DeclareUnicodeCharacter{00EB}{\"e}%
  10710   \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}}%
  10711   \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}}%
  10712   \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}}%
  10713   \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}}%
  10714   %
  10715   \DeclareUnicodeCharacter{00F0}{\dh}%
  10716   \DeclareUnicodeCharacter{00F1}{\~n}%
  10717   \DeclareUnicodeCharacter{00F2}{\`o}%
  10718   \DeclareUnicodeCharacter{00F3}{\'o}%
  10719   \DeclareUnicodeCharacter{00F4}{\^o}%
  10720   \DeclareUnicodeCharacter{00F5}{\~o}%
  10721   \DeclareUnicodeCharacter{00F6}{\"o}%
  10722   \DeclareUnicodeCharacter{00F7}{\ensuremath\div}%
  10723   \DeclareUnicodeCharacter{00F8}{\o}%
  10724   \DeclareUnicodeCharacter{00F9}{\`u}%
  10725   \DeclareUnicodeCharacter{00FA}{\'u}%
  10726   \DeclareUnicodeCharacter{00FB}{\^u}%
  10727   \DeclareUnicodeCharacter{00FC}{\"u}%
  10728   \DeclareUnicodeCharacter{00FD}{\'y}%
  10729   \DeclareUnicodeCharacter{00FE}{\th}%
  10730   \DeclareUnicodeCharacter{00FF}{\"y}%
  10731   %
  10732   \DeclareUnicodeCharacter{0100}{\=A}%
  10733   \DeclareUnicodeCharacter{0101}{\=a}%
  10734   \DeclareUnicodeCharacter{0102}{\u{A}}%
  10735   \DeclareUnicodeCharacter{0103}{\u{a}}%
  10736   \DeclareUnicodeCharacter{0104}{\ogonek{A}}%
  10737   \DeclareUnicodeCharacter{0105}{\ogonek{a}}%
  10738   \DeclareUnicodeCharacter{0106}{\'C}%
  10739   \DeclareUnicodeCharacter{0107}{\'c}%
  10740   \DeclareUnicodeCharacter{0108}{\^C}%
  10741   \DeclareUnicodeCharacter{0109}{\^c}%
  10742   \DeclareUnicodeCharacter{010A}{\dotaccent{C}}%
  10743   \DeclareUnicodeCharacter{010B}{\dotaccent{c}}%
  10744   \DeclareUnicodeCharacter{010C}{\v{C}}%
  10745   \DeclareUnicodeCharacter{010D}{\v{c}}%
  10746   \DeclareUnicodeCharacter{010E}{\v{D}}%
  10747   \DeclareUnicodeCharacter{010F}{d'}%
  10748   %
  10749   \DeclareUnicodeCharacter{0110}{\DH}%
  10750   \DeclareUnicodeCharacter{0111}{\dh}%
  10751   \DeclareUnicodeCharacter{0112}{\=E}%
  10752   \DeclareUnicodeCharacter{0113}{\=e}%
  10753   \DeclareUnicodeCharacter{0114}{\u{E}}%
  10754   \DeclareUnicodeCharacter{0115}{\u{e}}%
  10755   \DeclareUnicodeCharacter{0116}{\dotaccent{E}}%
  10756   \DeclareUnicodeCharacter{0117}{\dotaccent{e}}%
  10757   \DeclareUnicodeCharacter{0118}{\ogonek{E}}%
  10758   \DeclareUnicodeCharacter{0119}{\ogonek{e}}%
  10759   \DeclareUnicodeCharacter{011A}{\v{E}}%
  10760   \DeclareUnicodeCharacter{011B}{\v{e}}%
  10761   \DeclareUnicodeCharacter{011C}{\^G}%
  10762   \DeclareUnicodeCharacter{011D}{\^g}%
  10763   \DeclareUnicodeCharacter{011E}{\u{G}}%
  10764   \DeclareUnicodeCharacter{011F}{\u{g}}%
  10765   %
  10766   \DeclareUnicodeCharacter{0120}{\dotaccent{G}}%
  10767   \DeclareUnicodeCharacter{0121}{\dotaccent{g}}%
  10768   \DeclareUnicodeCharacter{0122}{\cedilla{G}}%
  10769   \DeclareUnicodeCharacter{0123}{\cedilla{g}}%
  10770   \DeclareUnicodeCharacter{0124}{\^H}%
  10771   \DeclareUnicodeCharacter{0125}{\^h}%
  10772   \DeclareUnicodeCharacter{0126}{\missingcharmsg{H WITH STROKE}}%
  10773   \DeclareUnicodeCharacter{0127}{\missingcharmsg{h WITH STROKE}}%
  10774   \DeclareUnicodeCharacter{0128}{\~I}%
  10775   \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}}%
  10776   \DeclareUnicodeCharacter{012A}{\=I}%
  10777   \DeclareUnicodeCharacter{012B}{\={\dotless{i}}}%
  10778   \DeclareUnicodeCharacter{012C}{\u{I}}%
  10779   \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}}%
  10780   \DeclareUnicodeCharacter{012E}{\ogonek{I}}%
  10781   \DeclareUnicodeCharacter{012F}{\ogonek{i}}%
  10782   %
  10783   \DeclareUnicodeCharacter{0130}{\dotaccent{I}}%
  10784   \DeclareUnicodeCharacter{0131}{\dotless{i}}%
  10785   \DeclareUnicodeCharacter{0132}{IJ}%
  10786   \DeclareUnicodeCharacter{0133}{ij}%
  10787   \DeclareUnicodeCharacter{0134}{\^J}%
  10788   \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}}%
  10789   \DeclareUnicodeCharacter{0136}{\cedilla{K}}%
  10790   \DeclareUnicodeCharacter{0137}{\cedilla{k}}%
  10791   \DeclareUnicodeCharacter{0138}{\ensuremath\kappa}%
  10792   \DeclareUnicodeCharacter{0139}{\'L}%
  10793   \DeclareUnicodeCharacter{013A}{\'l}%
  10794   \DeclareUnicodeCharacter{013B}{\cedilla{L}}%
  10795   \DeclareUnicodeCharacter{013C}{\cedilla{l}}%
  10796   \DeclareUnicodeCharacter{013D}{L'}% should kern
  10797   \DeclareUnicodeCharacter{013E}{l'}% should kern
  10798   \DeclareUnicodeCharacter{013F}{L\U{00B7}}%
  10799   %
  10800   \DeclareUnicodeCharacter{0140}{l\U{00B7}}%
  10801   \DeclareUnicodeCharacter{0141}{\L}%
  10802   \DeclareUnicodeCharacter{0142}{\l}%
  10803   \DeclareUnicodeCharacter{0143}{\'N}%
  10804   \DeclareUnicodeCharacter{0144}{\'n}%
  10805   \DeclareUnicodeCharacter{0145}{\cedilla{N}}%
  10806   \DeclareUnicodeCharacter{0146}{\cedilla{n}}%
  10807   \DeclareUnicodeCharacter{0147}{\v{N}}%
  10808   \DeclareUnicodeCharacter{0148}{\v{n}}%
  10809   \DeclareUnicodeCharacter{0149}{'n}%
  10810   \DeclareUnicodeCharacter{014A}{\missingcharmsg{ENG}}%
  10811   \DeclareUnicodeCharacter{014B}{\missingcharmsg{eng}}%
  10812   \DeclareUnicodeCharacter{014C}{\=O}%
  10813   \DeclareUnicodeCharacter{014D}{\=o}%
  10814   \DeclareUnicodeCharacter{014E}{\u{O}}%
  10815   \DeclareUnicodeCharacter{014F}{\u{o}}%
  10816   %
  10817   \DeclareUnicodeCharacter{0150}{\H{O}}%
  10818   \DeclareUnicodeCharacter{0151}{\H{o}}%
  10819   \DeclareUnicodeCharacter{0152}{\OE}%
  10820   \DeclareUnicodeCharacter{0153}{\oe}%
  10821   \DeclareUnicodeCharacter{0154}{\'R}%
  10822   \DeclareUnicodeCharacter{0155}{\'r}%
  10823   \DeclareUnicodeCharacter{0156}{\cedilla{R}}%
  10824   \DeclareUnicodeCharacter{0157}{\cedilla{r}}%
  10825   \DeclareUnicodeCharacter{0158}{\v{R}}%
  10826   \DeclareUnicodeCharacter{0159}{\v{r}}%
  10827   \DeclareUnicodeCharacter{015A}{\'S}%
  10828   \DeclareUnicodeCharacter{015B}{\'s}%
  10829   \DeclareUnicodeCharacter{015C}{\^S}%
  10830   \DeclareUnicodeCharacter{015D}{\^s}%
  10831   \DeclareUnicodeCharacter{015E}{\cedilla{S}}%
  10832   \DeclareUnicodeCharacter{015F}{\cedilla{s}}%
  10833   %
  10834   \DeclareUnicodeCharacter{0160}{\v{S}}%
  10835   \DeclareUnicodeCharacter{0161}{\v{s}}%
  10836   \DeclareUnicodeCharacter{0162}{\cedilla{T}}%
  10837   \DeclareUnicodeCharacter{0163}{\cedilla{t}}%
  10838   \DeclareUnicodeCharacter{0164}{\v{T}}%
  10839   \DeclareUnicodeCharacter{0165}{\v{t}}%
  10840   \DeclareUnicodeCharacter{0166}{\missingcharmsg{H WITH STROKE}}%
  10841   \DeclareUnicodeCharacter{0167}{\missingcharmsg{h WITH STROKE}}%
  10842   \DeclareUnicodeCharacter{0168}{\~U}%
  10843   \DeclareUnicodeCharacter{0169}{\~u}%
  10844   \DeclareUnicodeCharacter{016A}{\=U}%
  10845   \DeclareUnicodeCharacter{016B}{\=u}%
  10846   \DeclareUnicodeCharacter{016C}{\u{U}}%
  10847   \DeclareUnicodeCharacter{016D}{\u{u}}%
  10848   \DeclareUnicodeCharacter{016E}{\ringaccent{U}}%
  10849   \DeclareUnicodeCharacter{016F}{\ringaccent{u}}%
  10850   %
  10851   \DeclareUnicodeCharacter{0170}{\H{U}}%
  10852   \DeclareUnicodeCharacter{0171}{\H{u}}%
  10853   \DeclareUnicodeCharacter{0172}{\ogonek{U}}%
  10854   \DeclareUnicodeCharacter{0173}{\ogonek{u}}%
  10855   \DeclareUnicodeCharacter{0174}{\^W}%
  10856   \DeclareUnicodeCharacter{0175}{\^w}%
  10857   \DeclareUnicodeCharacter{0176}{\^Y}%
  10858   \DeclareUnicodeCharacter{0177}{\^y}%
  10859   \DeclareUnicodeCharacter{0178}{\"Y}%
  10860   \DeclareUnicodeCharacter{0179}{\'Z}%
  10861   \DeclareUnicodeCharacter{017A}{\'z}%
  10862   \DeclareUnicodeCharacter{017B}{\dotaccent{Z}}%
  10863   \DeclareUnicodeCharacter{017C}{\dotaccent{z}}%
  10864   \DeclareUnicodeCharacter{017D}{\v{Z}}%
  10865   \DeclareUnicodeCharacter{017E}{\v{z}}%
  10866   \DeclareUnicodeCharacter{017F}{\missingcharmsg{LONG S}}%
  10867   %
  10868   \DeclareUnicodeCharacter{01C4}{D\v{Z}}%
  10869   \DeclareUnicodeCharacter{01C5}{D\v{z}}%
  10870   \DeclareUnicodeCharacter{01C6}{d\v{z}}%
  10871   \DeclareUnicodeCharacter{01C7}{LJ}%
  10872   \DeclareUnicodeCharacter{01C8}{Lj}%
  10873   \DeclareUnicodeCharacter{01C9}{lj}%
  10874   \DeclareUnicodeCharacter{01CA}{NJ}%
  10875   \DeclareUnicodeCharacter{01CB}{Nj}%
  10876   \DeclareUnicodeCharacter{01CC}{nj}%
  10877   \DeclareUnicodeCharacter{01CD}{\v{A}}%
  10878   \DeclareUnicodeCharacter{01CE}{\v{a}}%
  10879   \DeclareUnicodeCharacter{01CF}{\v{I}}%
  10880   %
  10881   \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}}%
  10882   \DeclareUnicodeCharacter{01D1}{\v{O}}%
  10883   \DeclareUnicodeCharacter{01D2}{\v{o}}%
  10884   \DeclareUnicodeCharacter{01D3}{\v{U}}%
  10885   \DeclareUnicodeCharacter{01D4}{\v{u}}%
  10886   %
  10887   \DeclareUnicodeCharacter{01E2}{\={\AE}}%
  10888   \DeclareUnicodeCharacter{01E3}{\={\ae}}%
  10889   \DeclareUnicodeCharacter{01E6}{\v{G}}%
  10890   \DeclareUnicodeCharacter{01E7}{\v{g}}%
  10891   \DeclareUnicodeCharacter{01E8}{\v{K}}%
  10892   \DeclareUnicodeCharacter{01E9}{\v{k}}%
  10893   %
  10894   \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}}%
  10895   \DeclareUnicodeCharacter{01F1}{DZ}%
  10896   \DeclareUnicodeCharacter{01F2}{Dz}%
  10897   \DeclareUnicodeCharacter{01F3}{dz}%
  10898   \DeclareUnicodeCharacter{01F4}{\'G}%
  10899   \DeclareUnicodeCharacter{01F5}{\'g}%
  10900   \DeclareUnicodeCharacter{01F8}{\`N}%
  10901   \DeclareUnicodeCharacter{01F9}{\`n}%
  10902   \DeclareUnicodeCharacter{01FC}{\'{\AE}}%
  10903   \DeclareUnicodeCharacter{01FD}{\'{\ae}}%
  10904   \DeclareUnicodeCharacter{01FE}{\'{\O}}%
  10905   \DeclareUnicodeCharacter{01FF}{\'{\o}}%
  10906   %
  10907   \DeclareUnicodeCharacter{021E}{\v{H}}%
  10908   \DeclareUnicodeCharacter{021F}{\v{h}}%
  10909   %
  10910   \DeclareUnicodeCharacter{0226}{\dotaccent{A}}%
  10911   \DeclareUnicodeCharacter{0227}{\dotaccent{a}}%
  10912   \DeclareUnicodeCharacter{0228}{\cedilla{E}}%
  10913   \DeclareUnicodeCharacter{0229}{\cedilla{e}}%
  10914   \DeclareUnicodeCharacter{022E}{\dotaccent{O}}%
  10915   \DeclareUnicodeCharacter{022F}{\dotaccent{o}}%
  10916   %
  10917   \DeclareUnicodeCharacter{0232}{\=Y}%
  10918   \DeclareUnicodeCharacter{0233}{\=y}%
  10919   \DeclareUnicodeCharacter{0237}{\dotless{j}}%
  10920   %
  10921   \DeclareUnicodeCharacter{02BC}{'}%
  10922   %
  10923   \DeclareUnicodeCharacter{02DB}{\ogonek{ }}%
  10924   %
  10925   % Greek letters upper case
  10926   \DeclareUnicodeCharacter{0391}{{\it A}}%
  10927   \DeclareUnicodeCharacter{0392}{{\it B}}%
  10928   \DeclareUnicodeCharacter{0393}{\ensuremath{\mit\Gamma}}%
  10929   \DeclareUnicodeCharacter{0394}{\ensuremath{\mit\Delta}}%
  10930   \DeclareUnicodeCharacter{0395}{{\it E}}%
  10931   \DeclareUnicodeCharacter{0396}{{\it Z}}%
  10932   \DeclareUnicodeCharacter{0397}{{\it H}}%
  10933   \DeclareUnicodeCharacter{0398}{\ensuremath{\mit\Theta}}%
  10934   \DeclareUnicodeCharacter{0399}{{\it I}}%
  10935   \DeclareUnicodeCharacter{039A}{{\it K}}%
  10936   \DeclareUnicodeCharacter{039B}{\ensuremath{\mit\Lambda}}%
  10937   \DeclareUnicodeCharacter{039C}{{\it M}}%
  10938   \DeclareUnicodeCharacter{039D}{{\it N}}%
  10939   \DeclareUnicodeCharacter{039E}{\ensuremath{\mit\Xi}}%
  10940   \DeclareUnicodeCharacter{039F}{{\it O}}%
  10941   \DeclareUnicodeCharacter{03A0}{\ensuremath{\mit\Pi}}%
  10942   \DeclareUnicodeCharacter{03A1}{{\it P}}%
  10943   %\DeclareUnicodeCharacter{03A2}{} % none - corresponds to final sigma
  10944   \DeclareUnicodeCharacter{03A3}{\ensuremath{\mit\Sigma}}%
  10945   \DeclareUnicodeCharacter{03A4}{{\it T}}%
  10946   \DeclareUnicodeCharacter{03A5}{\ensuremath{\mit\Upsilon}}%
  10947   \DeclareUnicodeCharacter{03A6}{\ensuremath{\mit\Phi}}%
  10948   \DeclareUnicodeCharacter{03A7}{{\it X}}%
  10949   \DeclareUnicodeCharacter{03A8}{\ensuremath{\mit\Psi}}%
  10950   \DeclareUnicodeCharacter{03A9}{\ensuremath{\mit\Omega}}%
  10951   %
  10952   % Vowels with accents
  10953   \DeclareUnicodeCharacter{0390}{\ensuremath{\ddot{\acute\iota}}}%
  10954   \DeclareUnicodeCharacter{03AC}{\ensuremath{\acute\alpha}}%
  10955   \DeclareUnicodeCharacter{03AD}{\ensuremath{\acute\epsilon}}%
  10956   \DeclareUnicodeCharacter{03AE}{\ensuremath{\acute\eta}}%
  10957   \DeclareUnicodeCharacter{03AF}{\ensuremath{\acute\iota}}%
  10958   \DeclareUnicodeCharacter{03B0}{\ensuremath{\acute{\ddot\upsilon}}}%
  10959   %
  10960   % Standalone accent
  10961   \DeclareUnicodeCharacter{0384}{\ensuremath{\acute{\ }}}%
  10962   %
  10963   % Greek letters lower case
  10964   \DeclareUnicodeCharacter{03B1}{\ensuremath\alpha}%
  10965   \DeclareUnicodeCharacter{03B2}{\ensuremath\beta}%
  10966   \DeclareUnicodeCharacter{03B3}{\ensuremath\gamma}%
  10967   \DeclareUnicodeCharacter{03B4}{\ensuremath\delta}%
  10968   \DeclareUnicodeCharacter{03B5}{\ensuremath\epsilon}%
  10969   \DeclareUnicodeCharacter{03B6}{\ensuremath\zeta}%
  10970   \DeclareUnicodeCharacter{03B7}{\ensuremath\eta}%
  10971   \DeclareUnicodeCharacter{03B8}{\ensuremath\theta}%
  10972   \DeclareUnicodeCharacter{03B9}{\ensuremath\iota}%
  10973   \DeclareUnicodeCharacter{03BA}{\ensuremath\kappa}%
  10974   \DeclareUnicodeCharacter{03BB}{\ensuremath\lambda}%
  10975   \DeclareUnicodeCharacter{03BC}{\ensuremath\mu}%
  10976   \DeclareUnicodeCharacter{03BD}{\ensuremath\nu}%
  10977   \DeclareUnicodeCharacter{03BE}{\ensuremath\xi}%
  10978   \DeclareUnicodeCharacter{03BF}{{\it o}}% omicron
  10979   \DeclareUnicodeCharacter{03C0}{\ensuremath\pi}%
  10980   \DeclareUnicodeCharacter{03C1}{\ensuremath\rho}%
  10981   \DeclareUnicodeCharacter{03C2}{\ensuremath\varsigma}%
  10982   \DeclareUnicodeCharacter{03C3}{\ensuremath\sigma}%
  10983   \DeclareUnicodeCharacter{03C4}{\ensuremath\tau}%
  10984   \DeclareUnicodeCharacter{03C5}{\ensuremath\upsilon}%
  10985   \DeclareUnicodeCharacter{03C6}{\ensuremath\phi}%
  10986   \DeclareUnicodeCharacter{03C7}{\ensuremath\chi}%
  10987   \DeclareUnicodeCharacter{03C8}{\ensuremath\psi}%
  10988   \DeclareUnicodeCharacter{03C9}{\ensuremath\omega}%
  10989   %
  10990   % More Greek vowels with accents
  10991   \DeclareUnicodeCharacter{03CA}{\ensuremath{\ddot\iota}}%
  10992   \DeclareUnicodeCharacter{03CB}{\ensuremath{\ddot\upsilon}}%
  10993   \DeclareUnicodeCharacter{03CC}{\ensuremath{\acute o}}%
  10994   \DeclareUnicodeCharacter{03CD}{\ensuremath{\acute\upsilon}}%
  10995   \DeclareUnicodeCharacter{03CE}{\ensuremath{\acute\omega}}%
  10996   %
  10997   % Variant Greek letters
  10998   \DeclareUnicodeCharacter{03D1}{\ensuremath\vartheta}%
  10999   \DeclareUnicodeCharacter{03D6}{\ensuremath\varpi}%
  11000   \DeclareUnicodeCharacter{03F1}{\ensuremath\varrho}%
  11001   %
  11002   \DeclareUnicodeCharacter{1E02}{\dotaccent{B}}%
  11003   \DeclareUnicodeCharacter{1E03}{\dotaccent{b}}%
  11004   \DeclareUnicodeCharacter{1E04}{\udotaccent{B}}%
  11005   \DeclareUnicodeCharacter{1E05}{\udotaccent{b}}%
  11006   \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}}%
  11007   \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}}%
  11008   \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}}%
  11009   \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}}%
  11010   \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}}%
  11011   \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}}%
  11012   \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}}%
  11013   \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}}%
  11014   %
  11015   \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}}%
  11016   \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}}%
  11017   %
  11018   \DeclareUnicodeCharacter{1E20}{\=G}%
  11019   \DeclareUnicodeCharacter{1E21}{\=g}%
  11020   \DeclareUnicodeCharacter{1E22}{\dotaccent{H}}%
  11021   \DeclareUnicodeCharacter{1E23}{\dotaccent{h}}%
  11022   \DeclareUnicodeCharacter{1E24}{\udotaccent{H}}%
  11023   \DeclareUnicodeCharacter{1E25}{\udotaccent{h}}%
  11024   \DeclareUnicodeCharacter{1E26}{\"H}%
  11025   \DeclareUnicodeCharacter{1E27}{\"h}%
  11026   %
  11027   \DeclareUnicodeCharacter{1E30}{\'K}%
  11028   \DeclareUnicodeCharacter{1E31}{\'k}%
  11029   \DeclareUnicodeCharacter{1E32}{\udotaccent{K}}%
  11030   \DeclareUnicodeCharacter{1E33}{\udotaccent{k}}%
  11031   \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}}%
  11032   \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}}%
  11033   \DeclareUnicodeCharacter{1E36}{\udotaccent{L}}%
  11034   \DeclareUnicodeCharacter{1E37}{\udotaccent{l}}%
  11035   \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}}%
  11036   \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}}%
  11037   \DeclareUnicodeCharacter{1E3E}{\'M}%
  11038   \DeclareUnicodeCharacter{1E3F}{\'m}%
  11039   %
  11040   \DeclareUnicodeCharacter{1E40}{\dotaccent{M}}%
  11041   \DeclareUnicodeCharacter{1E41}{\dotaccent{m}}%
  11042   \DeclareUnicodeCharacter{1E42}{\udotaccent{M}}%
  11043   \DeclareUnicodeCharacter{1E43}{\udotaccent{m}}%
  11044   \DeclareUnicodeCharacter{1E44}{\dotaccent{N}}%
  11045   \DeclareUnicodeCharacter{1E45}{\dotaccent{n}}%
  11046   \DeclareUnicodeCharacter{1E46}{\udotaccent{N}}%
  11047   \DeclareUnicodeCharacter{1E47}{\udotaccent{n}}%
  11048   \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}}%
  11049   \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}}%
  11050   %
  11051   \DeclareUnicodeCharacter{1E54}{\'P}%
  11052   \DeclareUnicodeCharacter{1E55}{\'p}%
  11053   \DeclareUnicodeCharacter{1E56}{\dotaccent{P}}%
  11054   \DeclareUnicodeCharacter{1E57}{\dotaccent{p}}%
  11055   \DeclareUnicodeCharacter{1E58}{\dotaccent{R}}%
  11056   \DeclareUnicodeCharacter{1E59}{\dotaccent{r}}%
  11057   \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}}%
  11058   \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}}%
  11059   \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}}%
  11060   \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}}%
  11061   %
  11062   \DeclareUnicodeCharacter{1E60}{\dotaccent{S}}%
  11063   \DeclareUnicodeCharacter{1E61}{\dotaccent{s}}%
  11064   \DeclareUnicodeCharacter{1E62}{\udotaccent{S}}%
  11065   \DeclareUnicodeCharacter{1E63}{\udotaccent{s}}%
  11066   \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}}%
  11067   \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}}%
  11068   \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}}%
  11069   \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}}%
  11070   \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}}%
  11071   \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}}%
  11072   %
  11073   \DeclareUnicodeCharacter{1E7C}{\~V}%
  11074   \DeclareUnicodeCharacter{1E7D}{\~v}%
  11075   \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}}%
  11076   \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}}%
  11077   %
  11078   \DeclareUnicodeCharacter{1E80}{\`W}%
  11079   \DeclareUnicodeCharacter{1E81}{\`w}%
  11080   \DeclareUnicodeCharacter{1E82}{\'W}%
  11081   \DeclareUnicodeCharacter{1E83}{\'w}%
  11082   \DeclareUnicodeCharacter{1E84}{\"W}%
  11083   \DeclareUnicodeCharacter{1E85}{\"w}%
  11084   \DeclareUnicodeCharacter{1E86}{\dotaccent{W}}%
  11085   \DeclareUnicodeCharacter{1E87}{\dotaccent{w}}%
  11086   \DeclareUnicodeCharacter{1E88}{\udotaccent{W}}%
  11087   \DeclareUnicodeCharacter{1E89}{\udotaccent{w}}%
  11088   \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}}%
  11089   \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}}%
  11090   \DeclareUnicodeCharacter{1E8C}{\"X}%
  11091   \DeclareUnicodeCharacter{1E8D}{\"x}%
  11092   \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}}%
  11093   \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}}%
  11094   %
  11095   \DeclareUnicodeCharacter{1E90}{\^Z}%
  11096   \DeclareUnicodeCharacter{1E91}{\^z}%
  11097   \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}}%
  11098   \DeclareUnicodeCharacter{1E93}{\udotaccent{z}}%
  11099   \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}}%
  11100   \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}}%
  11101   \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}}%
  11102   \DeclareUnicodeCharacter{1E97}{\"t}%
  11103   \DeclareUnicodeCharacter{1E98}{\ringaccent{w}}%
  11104   \DeclareUnicodeCharacter{1E99}{\ringaccent{y}}%
  11105   %
  11106   \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}}%
  11107   \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}}%
  11108   %
  11109   \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}}%
  11110   \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}}%
  11111   \DeclareUnicodeCharacter{1EBC}{\~E}%
  11112   \DeclareUnicodeCharacter{1EBD}{\~e}%
  11113   %
  11114   \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}}%
  11115   \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}}%
  11116   \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}}%
  11117   \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}}%
  11118   %
  11119   \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}}%
  11120   \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}}%
  11121   %
  11122   \DeclareUnicodeCharacter{1EF2}{\`Y}%
  11123   \DeclareUnicodeCharacter{1EF3}{\`y}%
  11124   \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}}%
  11125   %
  11126   \DeclareUnicodeCharacter{1EF8}{\~Y}%
  11127   \DeclareUnicodeCharacter{1EF9}{\~y}%
  11128   %
  11129   % Exotic spaces
  11130   \DeclareUnicodeCharacter{2007}{\hphantom{0}}%
  11131   %
  11132   % Punctuation
  11133   \DeclareUnicodeCharacter{2013}{--}%
  11134   \DeclareUnicodeCharacter{2014}{---}%
  11135   \DeclareUnicodeCharacter{2018}{\quoteleft{}}%
  11136   \DeclareUnicodeCharacter{2019}{\quoteright{}}%
  11137   \DeclareUnicodeCharacter{201A}{\quotesinglbase{}}%
  11138   \DeclareUnicodeCharacter{201C}{\quotedblleft{}}%
  11139   \DeclareUnicodeCharacter{201D}{\quotedblright{}}%
  11140   \DeclareUnicodeCharacter{201E}{\quotedblbase{}}%
  11141   \DeclareUnicodeCharacter{2020}{\ensuremath\dagger}%
  11142   \DeclareUnicodeCharacter{2021}{\ensuremath\ddagger}%
  11143   \DeclareUnicodeCharacter{2022}{\bullet{}}%
  11144   \DeclareUnicodeCharacter{202F}{\thinspace}%
  11145   \DeclareUnicodeCharacter{2026}{\dots{}}%
  11146   \DeclareUnicodeCharacter{2039}{\guilsinglleft{}}%
  11147   \DeclareUnicodeCharacter{203A}{\guilsinglright{}}%
  11148   %
  11149   \DeclareUnicodeCharacter{20AC}{\euro{}}%
  11150   %
  11151   \DeclareUnicodeCharacter{2192}{\arrow}%
  11152   \DeclareUnicodeCharacter{21D2}{\result{}}%
  11153   %
  11154   % Mathematical symbols
  11155   \DeclareUnicodeCharacter{2200}{\ensuremath\forall}%
  11156   \DeclareUnicodeCharacter{2203}{\ensuremath\exists}%
  11157   \DeclareUnicodeCharacter{2208}{\ensuremath\in}%
  11158   \DeclareUnicodeCharacter{2212}{\minus{}}%
  11159   \DeclareUnicodeCharacter{2217}{\ast}%
  11160   \DeclareUnicodeCharacter{221E}{\ensuremath\infty}%
  11161   \DeclareUnicodeCharacter{2225}{\ensuremath\parallel}%
  11162   \DeclareUnicodeCharacter{2227}{\ensuremath\wedge}%
  11163   \DeclareUnicodeCharacter{2229}{\ensuremath\cap}%
  11164   \DeclareUnicodeCharacter{2261}{\equiv{}}%
  11165   \DeclareUnicodeCharacter{2264}{\ensuremath\leq}%
  11166   \DeclareUnicodeCharacter{2265}{\ensuremath\geq}%
  11167   \DeclareUnicodeCharacter{2282}{\ensuremath\subset}%
  11168   \DeclareUnicodeCharacter{2287}{\ensuremath\supseteq}%
  11169   %
  11170   \DeclareUnicodeCharacter{2016}{\ensuremath\Vert}%
  11171   \DeclareUnicodeCharacter{2032}{\ensuremath\prime}%
  11172   \DeclareUnicodeCharacter{210F}{\ensuremath\hbar}%
  11173   \DeclareUnicodeCharacter{2111}{\ensuremath\Im}%
  11174   \DeclareUnicodeCharacter{2113}{\ensuremath\ell}%
  11175   \DeclareUnicodeCharacter{2118}{\ensuremath\wp}%
  11176   \DeclareUnicodeCharacter{211C}{\ensuremath\Re}%
  11177   \DeclareUnicodeCharacter{2135}{\ensuremath\aleph}%
  11178   \DeclareUnicodeCharacter{2190}{\ensuremath\leftarrow}%
  11179   \DeclareUnicodeCharacter{2191}{\ensuremath\uparrow}%
  11180   \DeclareUnicodeCharacter{2193}{\ensuremath\downarrow}%
  11181   \DeclareUnicodeCharacter{2194}{\ensuremath\leftrightarrow}%
  11182   \DeclareUnicodeCharacter{2195}{\ensuremath\updownarrow}%
  11183   \DeclareUnicodeCharacter{2196}{\ensuremath\nwarrow}%
  11184   \DeclareUnicodeCharacter{2197}{\ensuremath\nearrow}%
  11185   \DeclareUnicodeCharacter{2198}{\ensuremath\searrow}%
  11186   \DeclareUnicodeCharacter{2199}{\ensuremath\swarrow}%
  11187   \DeclareUnicodeCharacter{21A6}{\ensuremath\mapsto}%
  11188   \DeclareUnicodeCharacter{21A9}{\ensuremath\hookleftarrow}%
  11189   \DeclareUnicodeCharacter{21AA}{\ensuremath\hookrightarrow}%
  11190   \DeclareUnicodeCharacter{21BC}{\ensuremath\leftharpoonup}%
  11191   \DeclareUnicodeCharacter{21BD}{\ensuremath\leftharpoondown}%
  11192   \DeclareUnicodeCharacter{21C0}{\ensuremath\rightharpoonup}%
  11193   \DeclareUnicodeCharacter{21C1}{\ensuremath\rightharpoondown}%
  11194   \DeclareUnicodeCharacter{21CC}{\ensuremath\rightleftharpoons}%
  11195   \DeclareUnicodeCharacter{21D0}{\ensuremath\Leftarrow}%
  11196   \DeclareUnicodeCharacter{21D1}{\ensuremath\Uparrow}%
  11197   \DeclareUnicodeCharacter{21D3}{\ensuremath\Downarrow}%
  11198   \DeclareUnicodeCharacter{21D4}{\ensuremath\Leftrightarrow}%
  11199   \DeclareUnicodeCharacter{21D5}{\ensuremath\Updownarrow}%
  11200   \DeclareUnicodeCharacter{2202}{\ensuremath\partial}%
  11201   \DeclareUnicodeCharacter{2205}{\ensuremath\emptyset}%
  11202   \DeclareUnicodeCharacter{2207}{\ensuremath\nabla}%
  11203   \DeclareUnicodeCharacter{2209}{\ensuremath\notin}%
  11204   \DeclareUnicodeCharacter{220B}{\ensuremath\owns}%
  11205   \DeclareUnicodeCharacter{220F}{\ensuremath\prod}%
  11206   \DeclareUnicodeCharacter{2210}{\ensuremath\coprod}%
  11207   \DeclareUnicodeCharacter{2211}{\ensuremath\sum}%
  11208   \DeclareUnicodeCharacter{2213}{\ensuremath\mp}%
  11209   \DeclareUnicodeCharacter{2218}{\ensuremath\circ}%
  11210   \DeclareUnicodeCharacter{221A}{\ensuremath\surd}%
  11211   \DeclareUnicodeCharacter{221D}{\ensuremath\propto}%
  11212   \DeclareUnicodeCharacter{2220}{\ensuremath\angle}%
  11213   \DeclareUnicodeCharacter{2223}{\ensuremath\mid}%
  11214   \DeclareUnicodeCharacter{2228}{\ensuremath\vee}%
  11215   \DeclareUnicodeCharacter{222A}{\ensuremath\cup}%
  11216   \DeclareUnicodeCharacter{222B}{\ensuremath\smallint}%
  11217   \DeclareUnicodeCharacter{222E}{\ensuremath\oint}%
  11218   \DeclareUnicodeCharacter{223C}{\ensuremath\sim}%
  11219   \DeclareUnicodeCharacter{2240}{\ensuremath\wr}%
  11220   \DeclareUnicodeCharacter{2243}{\ensuremath\simeq}%
  11221   \DeclareUnicodeCharacter{2245}{\ensuremath\cong}%
  11222   \DeclareUnicodeCharacter{2248}{\ensuremath\approx}%
  11223   \DeclareUnicodeCharacter{224D}{\ensuremath\asymp}%
  11224   \DeclareUnicodeCharacter{2250}{\ensuremath\doteq}%
  11225   \DeclareUnicodeCharacter{2260}{\ensuremath\neq}%
  11226   \DeclareUnicodeCharacter{226A}{\ensuremath\ll}%
  11227   \DeclareUnicodeCharacter{226B}{\ensuremath\gg}%
  11228   \DeclareUnicodeCharacter{227A}{\ensuremath\prec}%
  11229   \DeclareUnicodeCharacter{227B}{\ensuremath\succ}%
  11230   \DeclareUnicodeCharacter{2283}{\ensuremath\supset}%
  11231   \DeclareUnicodeCharacter{2286}{\ensuremath\subseteq}%
  11232   \DeclareUnicodeCharacter{228E}{\ensuremath\uplus}%
  11233   \DeclareUnicodeCharacter{2291}{\ensuremath\sqsubseteq}%
  11234   \DeclareUnicodeCharacter{2292}{\ensuremath\sqsupseteq}%
  11235   \DeclareUnicodeCharacter{2293}{\ensuremath\sqcap}%
  11236   \DeclareUnicodeCharacter{2294}{\ensuremath\sqcup}%
  11237   \DeclareUnicodeCharacter{2295}{\ensuremath\oplus}%
  11238   \DeclareUnicodeCharacter{2296}{\ensuremath\ominus}%
  11239   \DeclareUnicodeCharacter{2297}{\ensuremath\otimes}%
  11240   \DeclareUnicodeCharacter{2298}{\ensuremath\oslash}%
  11241   \DeclareUnicodeCharacter{2299}{\ensuremath\odot}%
  11242   \DeclareUnicodeCharacter{22A2}{\ensuremath\vdash}%
  11243   \DeclareUnicodeCharacter{22A3}{\ensuremath\dashv}%
  11244   \DeclareUnicodeCharacter{22A4}{\ensuremath\ptextop}%
  11245   \DeclareUnicodeCharacter{22A5}{\ensuremath\bot}%
  11246   \DeclareUnicodeCharacter{22A8}{\ensuremath\models}%
  11247   \DeclareUnicodeCharacter{22C0}{\ensuremath\bigwedge}%
  11248   \DeclareUnicodeCharacter{22C1}{\ensuremath\bigvee}%
  11249   \DeclareUnicodeCharacter{22C2}{\ensuremath\bigcap}%
  11250   \DeclareUnicodeCharacter{22C3}{\ensuremath\bigcup}%
  11251   \DeclareUnicodeCharacter{22C4}{\ensuremath\diamond}%
  11252   \DeclareUnicodeCharacter{22C5}{\ensuremath\cdot}%
  11253   \DeclareUnicodeCharacter{22C6}{\ensuremath\star}%
  11254   \DeclareUnicodeCharacter{22C8}{\ensuremath\bowtie}%
  11255   \DeclareUnicodeCharacter{2308}{\ensuremath\lceil}%
  11256   \DeclareUnicodeCharacter{2309}{\ensuremath\rceil}%
  11257   \DeclareUnicodeCharacter{230A}{\ensuremath\lfloor}%
  11258   \DeclareUnicodeCharacter{230B}{\ensuremath\rfloor}%
  11259   \DeclareUnicodeCharacter{2322}{\ensuremath\frown}%
  11260   \DeclareUnicodeCharacter{2323}{\ensuremath\smile}%
  11261   %
  11262   \DeclareUnicodeCharacter{25B3}{\ensuremath\triangle}%
  11263   \DeclareUnicodeCharacter{25B7}{\ensuremath\triangleright}%
  11264   \DeclareUnicodeCharacter{25BD}{\ensuremath\bigtriangledown}%
  11265   \DeclareUnicodeCharacter{25C1}{\ensuremath\triangleleft}%
  11266   \DeclareUnicodeCharacter{25C7}{\ensuremath\diamond}%
  11267   \DeclareUnicodeCharacter{2660}{\ensuremath\spadesuit}%
  11268   \DeclareUnicodeCharacter{2661}{\ensuremath\heartsuit}%
  11269   \DeclareUnicodeCharacter{2662}{\ensuremath\diamondsuit}%
  11270   \DeclareUnicodeCharacter{2663}{\ensuremath\clubsuit}%
  11271   \DeclareUnicodeCharacter{266D}{\ensuremath\flat}%
  11272   \DeclareUnicodeCharacter{266E}{\ensuremath\natural}%
  11273   \DeclareUnicodeCharacter{266F}{\ensuremath\sharp}%
  11274   \DeclareUnicodeCharacter{26AA}{\ensuremath\bigcirc}%
  11275   \DeclareUnicodeCharacter{27B9}{\ensuremath\rangle}%
  11276   \DeclareUnicodeCharacter{27C2}{\ensuremath\perp}%
  11277   \DeclareUnicodeCharacter{27E8}{\ensuremath\langle}%
  11278   \DeclareUnicodeCharacter{27F5}{\ensuremath\longleftarrow}%
  11279   \DeclareUnicodeCharacter{27F6}{\ensuremath\longrightarrow}%
  11280   \DeclareUnicodeCharacter{27F7}{\ensuremath\longleftrightarrow}%
  11281   \DeclareUnicodeCharacter{27FC}{\ensuremath\longmapsto}%
  11282   \DeclareUnicodeCharacter{29F5}{\ensuremath\setminus}%
  11283   \DeclareUnicodeCharacter{2A00}{\ensuremath\bigodot}%
  11284   \DeclareUnicodeCharacter{2A01}{\ensuremath\bigoplus}%
  11285   \DeclareUnicodeCharacter{2A02}{\ensuremath\bigotimes}%
  11286   \DeclareUnicodeCharacter{2A04}{\ensuremath\biguplus}%
  11287   \DeclareUnicodeCharacter{2A06}{\ensuremath\bigsqcup}%
  11288   \DeclareUnicodeCharacter{2A3F}{\ensuremath\amalg}%
  11289   \DeclareUnicodeCharacter{2AAF}{\ensuremath\preceq}%
  11290   \DeclareUnicodeCharacter{2AB0}{\ensuremath\succeq}%
  11291   %
  11292   \global\mathchardef\checkmark="1370% actually the square root sign
  11293   \DeclareUnicodeCharacter{2713}{\ensuremath\checkmark}%
  11294 }% end of \unicodechardefs
  11295 
  11296 % UTF-8 byte sequence (pdfTeX) definitions (replacing and @U command)
  11297 % It makes the setting that replace UTF-8 byte sequence.
  11298 \def\utfeightchardefs{%
  11299   \let\DeclareUnicodeCharacter\DeclareUnicodeCharacterUTFviii
  11300   \unicodechardefs
  11301 }
  11302 
  11303 % Whether the active definitions of non-ASCII characters expand to
  11304 % non-active tokens with the same character code.  This is used to
  11305 % write characters literally, instead of using active definitions for
  11306 % printing the correct glyphs.
  11307 \newif\ifpassthroughchars
  11308 \passthroughcharsfalse
  11309 
  11310 % For native Unicode handling (XeTeX and LuaTeX),
  11311 % provide a definition macro to replace/pass-through a Unicode character
  11312 %
  11313 \def\DeclareUnicodeCharacterNative#1#2{%
  11314   \ifnum"#1>"7F % only make non-ASCII chars active
  11315     \catcode"#1=\active
  11316     \def\dodeclareunicodecharacternative##1##2##3{%
  11317       \begingroup
  11318         \uccode`\~="##2\relax
  11319         \uppercase{\gdef~}{%
  11320           \ifpassthroughchars
  11321             ##1%
  11322           \else
  11323             ##3%
  11324           \fi
  11325         }
  11326       \endgroup
  11327     }
  11328     \begingroup
  11329       \uccode`\.="#1\relax
  11330       \uppercase{\def\UTFNativeTmp{.}}%
  11331       \expandafter\dodeclareunicodecharacternative\UTFNativeTmp{#1}{#2}%
  11332     \endgroup
  11333   \fi
  11334 }
  11335 
  11336 % Native Unicode handling (XeTeX and LuaTeX) character replacing definition.
  11337 % It activates the setting that replaces Unicode characters.
  11338 \def\nativeunicodechardefs{%
  11339   \let\DeclareUnicodeCharacter\DeclareUnicodeCharacterNative
  11340   \unicodechardefs
  11341 }
  11342 
  11343 % For native Unicode handling (XeTeX and LuaTeX),
  11344 % make the character token expand
  11345 % to the sequences given in \unicodechardefs for printing.
  11346 \def\DeclareUnicodeCharacterNativeAtU#1#2{%
  11347   \def\UTFAtUTmp{#2}
  11348   \expandafter\globallet\csname uni:#1\endcsname \UTFAtUTmp
  11349 }
  11350 
  11351 % @U command definitions for native Unicode handling (XeTeX and LuaTeX).
  11352 \def\nativeunicodechardefsatu{%
  11353   \let\DeclareUnicodeCharacter\DeclareUnicodeCharacterNativeAtU
  11354   \unicodechardefs
  11355 }
  11356 
  11357 % US-ASCII character definitions.
  11358 \def\asciichardefs{% nothing need be done
  11359    \relax
  11360 }
  11361 
  11362 % Define all Unicode characters we know about
  11363 \iftxinativeunicodecapable
  11364   \nativeunicodechardefsatu
  11365 \else
  11366   \utfeightchardefs
  11367 \fi
  11368 
  11369 
  11370 \message{formatting,}
  11371 
  11372 \newdimen\defaultparindent \defaultparindent = 15pt
  11373 
  11374 \chapheadingskip = 15pt plus 4pt minus 2pt
  11375 \secheadingskip = 12pt plus 3pt minus 2pt
  11376 \subsecheadingskip = 9pt plus 2pt minus 2pt
  11377 
  11378 % Prevent underfull vbox error messages.
  11379 \vbadness = 10000
  11380 
  11381 % Don't be very finicky about underfull hboxes, either.
  11382 \hbadness = 6666
  11383 
  11384 % Following George Bush, get rid of widows and orphans.
  11385 \widowpenalty=10000
  11386 \clubpenalty=10000
  11387 
  11388 % Use TeX 3.0's \emergencystretch to help line breaking, but if we're
  11389 % using an old version of TeX, don't do anything.  We want the amount of
  11390 % stretch added to depend on the line length, hence the dependence on
  11391 % \hsize.  We call this whenever the paper size is set.
  11392 %
  11393 \def\setemergencystretch{%
  11394   \ifx\emergencystretch\thisisundefined
  11395     % Allow us to assign to \emergencystretch anyway.
  11396     \def\emergencystretch{\dimen0}%
  11397   \else
  11398     \emergencystretch = .15\hsize
  11399   \fi
  11400 }
  11401 
  11402 % Parameters in order: 1) textheight; 2) textwidth;
  11403 % 3) voffset; 4) hoffset; 5) binding offset; 6) topskip;
  11404 % 7) physical page height; 8) physical page width.
  11405 %
  11406 % We also call \setleading{\textleading}, so the caller should define
  11407 % \textleading.  The caller should also set \parskip.
  11408 %
  11409 \def\internalpagesizes#1#2#3#4#5#6#7#8{%
  11410   \voffset = #3\relax
  11411   \topskip = #6\relax
  11412   \splittopskip = \topskip
  11413   %
  11414   \vsize = #1\relax
  11415   \advance\vsize by \topskip
  11416   \txipageheight = \vsize
  11417   %
  11418   \hsize = #2\relax
  11419   \txipagewidth = \hsize
  11420   %
  11421   \normaloffset = #4\relax
  11422   \bindingoffset = #5\relax
  11423   %
  11424   \ifpdf
  11425     \pdfpageheight #7\relax
  11426     \pdfpagewidth #8\relax
  11427     % if we don't reset these, they will remain at "1 true in" of
  11428     % whatever layout pdftex was dumped with.
  11429     \pdfhorigin = 1 true in
  11430     \pdfvorigin = 1 true in
  11431   \else
  11432     \ifx\XeTeXrevision\thisisundefined
  11433       \special{papersize=#8,#7}%
  11434     \else
  11435       \pdfpageheight #7\relax
  11436       \pdfpagewidth #8\relax
  11437       % XeTeX does not have \pdfhorigin and \pdfvorigin.
  11438     \fi
  11439   \fi
  11440   %
  11441   \setleading{\textleading}
  11442   %
  11443   \parindent = \defaultparindent
  11444   \setemergencystretch
  11445 }
  11446 
  11447 % @letterpaper (the default).
  11448 \def\letterpaper{{\globaldefs = 1
  11449   \parskip = 3pt plus 2pt minus 1pt
  11450   \textleading = 13.2pt
  11451   %
  11452   % If page is nothing but text, make it come out even.
  11453   \internalpagesizes{607.2pt}{6in}% that's 46 lines
  11454                     {\voffset}{.25in}%
  11455                     {\bindingoffset}{36pt}%
  11456                     {11in}{8.5in}%
  11457 }}
  11458 
  11459 % Use @smallbook to reset parameters for 7x9.25 trim size.
  11460 \def\smallbook{{\globaldefs = 1
  11461   \parskip = 2pt plus 1pt
  11462   \textleading = 12pt
  11463   %
  11464   \internalpagesizes{7.5in}{5in}%
  11465                     {-.2in}{0in}%
  11466                     {\bindingoffset}{16pt}%
  11467                     {9.25in}{7in}%
  11468   %
  11469   \lispnarrowing = 0.3in
  11470   \tolerance = 700
  11471   \contentsrightmargin = 0pt
  11472   \defbodyindent = .5cm
  11473 }}
  11474 
  11475 % Use @afourpaper to print on European A4 paper.
  11476 \def\afourpaper{{\globaldefs = 1
  11477   \parskip = 3pt plus 2pt minus 1pt
  11478   \textleading = 13.2pt
  11479   %
  11480   % Double-side printing via postscript on Laserjet 4050
  11481   % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm.
  11482   % To change the settings for a different printer or situation, adjust
  11483   % \normaloffset until the front-side and back-side texts align.  Then
  11484   % do the same for \bindingoffset.  You can set these for testing in
  11485   % your texinfo source file like this:
  11486   % @tex
  11487   % \global\normaloffset = -6mm
  11488   % \global\bindingoffset = 10mm
  11489   % @end tex
  11490   \internalpagesizes{673.2pt}{160mm}% that's 51 lines
  11491                     {\voffset}{\hoffset}%
  11492                     {\bindingoffset}{44pt}%
  11493                     {297mm}{210mm}%
  11494   %
  11495   \tolerance = 700
  11496   \contentsrightmargin = 0pt
  11497   \defbodyindent = 5mm
  11498 }}
  11499 
  11500 % Use @afivepaper to print on European A5 paper.
  11501 % From romildo@urano.iceb.ufop.br, 2 July 2000.
  11502 % He also recommends making @example and @lisp be small.
  11503 \def\afivepaper{{\globaldefs = 1
  11504   \parskip = 2pt plus 1pt minus 0.1pt
  11505   \textleading = 12.5pt
  11506   %
  11507   \internalpagesizes{160mm}{120mm}%
  11508                     {\voffset}{-11.4mm}%
  11509                     {\bindingoffset}{8pt}%
  11510                     {210mm}{148mm}%
  11511   %
  11512   \lispnarrowing = 0.2in
  11513   \tolerance = 800
  11514   \contentsrightmargin = 0pt
  11515   \defbodyindent = 2mm
  11516   \tableindent = 12mm
  11517 }}
  11518 
  11519 % A specific text layout, 24x15cm overall, intended for A4 paper.
  11520 \def\afourlatex{{\globaldefs = 1
  11521   \afourpaper
  11522   \internalpagesizes{237mm}{150mm}%
  11523                     {\voffset}{4.6mm}%
  11524                     {\bindingoffset}{7mm}%
  11525                     {297mm}{210mm}%
  11526   %
  11527   % Must explicitly reset to 0 because we call \afourpaper.
  11528   \globaldefs = 0
  11529 }}
  11530 
  11531 % Use @afourwide to print on A4 paper in landscape format.
  11532 \def\afourwide{{\globaldefs = 1
  11533   \afourpaper
  11534   \internalpagesizes{241mm}{165mm}%
  11535                     {\voffset}{-2.95mm}%
  11536                     {\bindingoffset}{7mm}%
  11537                     {297mm}{210mm}%
  11538   \globaldefs = 0
  11539 }}
  11540 
  11541 \def\bsixpaper{{\globaldefs = 1
  11542   \afourpaper
  11543   \internalpagesizes{140mm}{100mm}%
  11544                     {-6.35mm}{-12.7mm}%
  11545                     {\bindingoffset}{14pt}%
  11546                     {176mm}{125mm}%
  11547   \let\SETdispenvsize=\smallword
  11548   \lispnarrowing = 0.2in
  11549   \globaldefs = 0
  11550 }}
  11551 
  11552 
  11553 % @pagesizes TEXTHEIGHT[,TEXTWIDTH]
  11554 % Perhaps we should allow setting the margins, \topskip, \parskip,
  11555 % and/or leading, also. Or perhaps we should compute them somehow.
  11556 %
  11557 \parseargdef\pagesizes{\pagesizesyyy #1,,\finish}
  11558 \def\pagesizesyyy#1,#2,#3\finish{{%
  11559   \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
  11560   \globaldefs = 1
  11561   %
  11562   \parskip = 3pt plus 2pt minus 1pt
  11563   \setleading{\textleading}%
  11564   %
  11565   \dimen0 = #1\relax
  11566   \advance\dimen0 by 2.5in % default 1in margin above heading line
  11567                            % and 1.5in to include heading, footing and
  11568                            % bottom margin
  11569   %
  11570   \dimen2 = \hsize
  11571   \advance\dimen2 by 2in % default to 1 inch margin on each side
  11572   %
  11573   \internalpagesizes{#1}{\hsize}%
  11574                     {\voffset}{\normaloffset}%
  11575                     {\bindingoffset}{44pt}%
  11576                     {\dimen0}{\dimen2}%
  11577 }}
  11578 
  11579 % Set default to letter.
  11580 %
  11581 \letterpaper
  11582 
  11583 % Default value of \hfuzz, for suppressing warnings about overfull hboxes.
  11584 \hfuzz = 1pt
  11585 
  11586 
  11587 \message{microtype,}
  11588 
  11589 % protrusion, from Thanh's protcode.tex.
  11590 \def\mtsetprotcode#1{%
  11591   \rpcode#1`\!=200  \rpcode#1`\,=700  \rpcode#1`\-=700  \rpcode#1`\.=700
  11592   \rpcode#1`\;=500  \rpcode#1`\:=500  \rpcode#1`\?=200
  11593   \rpcode#1`\'=700
  11594   \rpcode#1 34=500  % ''
  11595   \rpcode#1 123=300 % --
  11596   \rpcode#1 124=200 % ---
  11597   \rpcode#1`\)=50   \rpcode#1`\A=50   \rpcode#1`\F=50   \rpcode#1`\K=50
  11598   \rpcode#1`\L=50   \rpcode#1`\T=50   \rpcode#1`\V=50   \rpcode#1`\W=50
  11599   \rpcode#1`\X=50   \rpcode#1`\Y=50   \rpcode#1`\k=50   \rpcode#1`\r=50
  11600   \rpcode#1`\t=50   \rpcode#1`\v=50   \rpcode#1`\w=50   \rpcode#1`\x=50
  11601   \rpcode#1`\y=50
  11602   %
  11603   \lpcode#1`\`=700
  11604   \lpcode#1 92=500  % ``
  11605   \lpcode#1`\(=50   \lpcode#1`\A=50   \lpcode#1`\J=50   \lpcode#1`\T=50
  11606   \lpcode#1`\V=50   \lpcode#1`\W=50   \lpcode#1`\X=50   \lpcode#1`\Y=50
  11607   \lpcode#1`\v=50   \lpcode#1`\w=50   \lpcode#1`\x=50   \lpcode#1`\y=0
  11608   %
  11609   \mtadjustprotcode#1\relax
  11610 }
  11611 
  11612 \newcount\countC
  11613 \def\mtadjustprotcode#1{%
  11614   \countC=0
  11615   \loop
  11616     \ifcase\lpcode#1\countC\else
  11617       \mtadjustcp\lpcode#1\countC
  11618     \fi
  11619     \ifcase\rpcode#1\countC\else
  11620       \mtadjustcp\rpcode#1\countC
  11621     \fi
  11622     \advance\countC 1
  11623   \ifnum\countC < 256 \repeat
  11624 }
  11625 
  11626 \newcount\countB
  11627 \def\mtadjustcp#1#2#3{%
  11628   \setbox\boxA=\hbox{%
  11629     \ifx#2\font\else#2\fi
  11630     \char#3}%
  11631   \countB=\wd\boxA
  11632   \multiply\countB #1#2#3\relax
  11633   \divide\countB \fontdimen6 #2\relax
  11634   #1#2#3=\countB\relax
  11635 }
  11636 
  11637 \ifx\XeTeXrevision\thisisundefined
  11638   \ifx\luatexversion\thisisundefined
  11639     \ifpdf % pdfTeX
  11640       \mtsetprotcode\textrm
  11641       \def\mtfontexpand#1{\pdffontexpand#1 20 20 1 autoexpand\relax}
  11642     \else % TeX
  11643       \def\mtfontexpand#1{}
  11644     \fi
  11645   \else % LuaTeX
  11646     \mtsetprotcode\textrm
  11647     \def\mtfontexpand#1{\expandglyphsinfont#1 20 20 1\relax}
  11648   \fi
  11649 \else % XeTeX
  11650   \mtsetprotcode\textrm
  11651   \def\mtfontexpand#1{}
  11652 \fi
  11653 
  11654 
  11655 \newif\ifmicrotype
  11656 
  11657 \def\microtypeON{%
  11658   \microtypetrue
  11659   %
  11660   \ifx\XeTeXrevision\thisisundefined
  11661     \ifx\luatexversion\thisisundefined
  11662       \ifpdf % pdfTeX
  11663         \pdfadjustspacing=2
  11664         \pdfprotrudechars=2
  11665       \fi
  11666     \else % LuaTeX
  11667       \adjustspacing=2
  11668       \protrudechars=2
  11669     \fi
  11670   \else % XeTeX
  11671     \XeTeXprotrudechars=2
  11672   \fi
  11673   %
  11674   \mtfontexpand\textrm
  11675   \mtfontexpand\textsl
  11676   \mtfontexpand\textbf
  11677 }
  11678 
  11679 \def\microtypeOFF{%
  11680   \microtypefalse
  11681   %
  11682   \ifx\XeTeXrevision\thisisundefined
  11683     \ifx\luatexversion\thisisundefined
  11684       \ifpdf % pdfTeX
  11685         \pdfadjustspacing=0
  11686         \pdfprotrudechars=0
  11687       \fi
  11688     \else % LuaTeX
  11689       \adjustspacing=0
  11690       \protrudechars=0
  11691     \fi
  11692   \else % XeTeX
  11693     \XeTeXprotrudechars=0
  11694   \fi
  11695 }
  11696 
  11697 \microtypeOFF
  11698 
  11699 \parseargdef\microtype{%
  11700   \def\txiarg{#1}%
  11701   \ifx\txiarg\onword
  11702     \microtypeON
  11703   \else\ifx\txiarg\offword
  11704     \microtypeOFF
  11705   \else
  11706     \errhelp = \EMsimple
  11707     \errmessage{Unknown @microtype option `\txiarg', must be on|off}%
  11708   \fi\fi
  11709 }
  11710 
  11711 
  11712 \message{and turning on texinfo input format.}
  11713 
  11714 % Make UTF-8 the default encoding.
  11715 \documentencodingzzz{UTF-8}
  11716 
  11717 \def^^L{\par} % remove \outer, so ^L can appear in an @comment
  11718 \catcode`\^^K = 10 % treat vertical tab as whitespace
  11719 
  11720 % DEL is a comment character, in case @c does not suffice.
  11721 \catcode`\^^? = 14
  11722 
  11723 % Define macros to output various characters with catcode for normal text.
  11724 \catcode`\"=\other \def\normaldoublequote{"}
  11725 \catcode`\$=\other \def\normaldollar{$}%$ font-lock fix
  11726 \catcode`\+=\other \def\normalplus{+}
  11727 \catcode`\<=\other \def\normalless{<}
  11728 \catcode`\>=\other \def\normalgreater{>}
  11729 \catcode`\^=\other \def\normalcaret{^}
  11730 \catcode`\_=\other \def\normalunderscore{_}
  11731 \catcode`\|=\other \def\normalverticalbar{|}
  11732 \catcode`\~=\other \def\normaltilde{~}
  11733 
  11734 % Set catcodes for Texinfo file
  11735 
  11736 % Active characters for printing the wanted glyph.
  11737 % Most of these we simply print from the \tt font, but for some, we can
  11738 % use math or other variants that look better in normal text.
  11739 %
  11740 \catcode`\"=\active
  11741 \def\activedoublequote{{\tt\char34}}
  11742 \let"=\activedoublequote
  11743 \catcode`\~=\active \def\activetilde{{\tt\char126}} \let~ = \activetilde
  11744 \chardef\hatchar=`\^
  11745 \catcode`\^=\active \def\activehat{{\tt \hatchar}} \let^ = \activehat
  11746 
  11747 \catcode`\_=\active
  11748 \def_{\ifusingtt\normalunderscore\_}
  11749 \def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }
  11750 \let\realunder=_
  11751 
  11752 \catcode`\|=\active \def|{{\tt\char124}}
  11753 
  11754 \chardef \less=`\<
  11755 \catcode`\<=\active \def\activeless{{\tt \less}}\let< = \activeless
  11756 \chardef \gtr=`\>
  11757 \catcode`\>=\active \def\activegtr{{\tt \gtr}}\let> = \activegtr
  11758 \catcode`\+=\active \def+{{\tt \char 43}}
  11759 \catcode`\$=\active \def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix
  11760 \catcode`\-=\active \let-=\normaldash
  11761 
  11762 
  11763 % used for headline/footline in the output routine, in case the page
  11764 % breaks in the middle of an @tex block.
  11765 \def\texinfochars{%
  11766   \let< = \activeless
  11767   \let> = \activegtr
  11768   \let~ = \activetilde
  11769   \let^ = \activehat
  11770   \setregularquotes
  11771   \let\b = \strong
  11772   \let\i = \smartitalic
  11773   % in principle, all other definitions in \tex have to be undone too.
  11774 }
  11775 
  11776 % Used sometimes to turn off (effectively) the active characters even after
  11777 % parsing them.
  11778 \def\turnoffactive{%
  11779   \passthroughcharstrue
  11780   \let-=\normaldash
  11781   \let"=\normaldoublequote
  11782   \let$=\normaldollar %$ font-lock fix
  11783   \let+=\normalplus
  11784   \let<=\normalless
  11785   \let>=\normalgreater
  11786   \let^=\normalcaret
  11787   \let_=\normalunderscore
  11788   \let|=\normalverticalbar
  11789   \let~=\normaltilde
  11790   \otherbackslash
  11791   \setregularquotes
  11792   \unsepspaces
  11793 }
  11794 
  11795 % If a .fmt file is being used, characters that might appear in a file
  11796 % name cannot be active until we have parsed the command line.
  11797 % So turn them off again, and have \loadconf turn them back on.
  11798 \catcode`+=\other \catcode`\_=\other
  11799 
  11800 
  11801 % \backslashcurfont outputs one backslash character in current font,
  11802 % as in \char`\\.
  11803 \global\chardef\backslashcurfont=`\\
  11804 
  11805 % Print a typewriter backslash.  For math mode, we can't simply use
  11806 % \backslashcurfont: the story here is that in math mode, the \char
  11807 % of \backslashcurfont ends up printing the roman \ from the math symbol
  11808 % font (because \char in math mode uses the \mathcode, and plain.tex
  11809 % sets \mathcode`\\="026E).  Hence we use an explicit \mathchar,
  11810 % which is the decimal equivalent of "715c (class 7, e.g., use \fam;
  11811 % ignored family value; char position "5C).  We can't use " for the
  11812 % usual hex value because it has already been made active.
  11813 
  11814 \def\ttbackslash{{\tt \ifmmode \mathchar29020 \else \backslashcurfont \fi}}
  11815 \let\backslashchar = \ttbackslash % \backslashchar{} is for user documents.
  11816 
  11817 % These are made active for url-breaking, so need
  11818 % active definitions as the normal characters.
  11819 \def\normaldot{.}
  11820 \def\normalquest{?}
  11821 \def\normalslash{/}
  11822 
  11823 % \newlinesloadsconf - call \loadconf as soon as possible in the
  11824 % file, e.g. at the first newline.
  11825 %
  11826 {\catcode`\^=7
  11827 \catcode`\^^M=13
  11828 \gdef\newlineloadsconf{%
  11829   \catcode`\^^M=13 %
  11830   \newlineloadsconfzz%
  11831 }
  11832 \gdef\newlineloadsconfzz#1^^M{%
  11833   \def\c{\loadconf\c}%
  11834   % Definition for the first newline read in the file
  11835   \def ^^M{\loadconf}%
  11836   % In case the first line has a whole-line or environment command on it
  11837   \let\originalparsearg\parsearg%
  11838   \def\parsearg{\loadconf\originalparsearg}%
  11839   %
  11840   % \startenvironment is in the expansion of commands defined with \envdef
  11841   \let\originalstartenvironment\startenvironment%
  11842   \def\startenvironment{\loadconf\startenvironment}%
  11843 }}
  11844 
  11845 
  11846 % Emergency active definition of newline, in case an active newline token
  11847 % appears by mistake.
  11848 {\catcode`\^=7 \catcode13=13%
  11849 \gdef\enableemergencynewline{%
  11850   \gdef^^M{%
  11851     \par%
  11852     %<warning: active newline>\par%
  11853 }}}
  11854 
  11855 
  11856 % \loadconf gets called at the beginning of every Texinfo file.
  11857 % If texinfo.cnf is present on the system, read it.  Useful for site-wide
  11858 % @afourpaper, etc.  Not opening texinfo.cnf directly in texinfo.tex
  11859 % makes it possible to make a format file for Texinfo.
  11860 %
  11861 \gdef\loadconf{%
  11862   \relax  % Terminate the filename if running as "tex '&texinfo' FILE.texi".
  11863   %
  11864   % Turn off the definitions that trigger \loadconf
  11865   \everyjobreset
  11866   \catcode13=5 % regular end of line
  11867   \enableemergencynewline
  11868   \let\c=\comment
  11869   \let\parsearg\originalparsearg
  11870   \let\startenvironment\originalstartenvironment
  11871   %
  11872   % Also turn back on active characters that might appear in the input
  11873   % file name, in case not using a pre-dumped format.
  11874   \catcode`+=\active
  11875   \catcode`\_=\active
  11876   %
  11877   \openin 1 texinfo.cnf
  11878   \ifeof 1 \else \input texinfo.cnf \fi
  11879   \closein 1
  11880 }
  11881 
  11882 % Redefine some control sequences to be controlled by the \ifdummies
  11883 % and \ifindexnofonts switches.  Do this at the end so that the control
  11884 % sequences are all defined.
  11885 \definedummies
  11886 
  11887 
  11888 
  11889 
  11890 \catcode`\@=0
  11891 
  11892 % \realbackslash is an actual character `\' with catcode other.
  11893 {\catcode`\\=\other @gdef@realbackslash{\}}
  11894 
  11895 % In Texinfo, backslash is an active character; it prints the backslash
  11896 % in fixed width font.
  11897 \catcode`\\=\active  % @ for escape char from now on.
  11898 
  11899 @let\ = @ttbackslash
  11900 
  11901 % If in a .fmt file, print the version number.
  11902 % \eatinput stops the `\input texinfo' from showing up.
  11903 % After that, `\' should revert to printing a backslash.
  11904 % Turn on active characters that we couldn't do earlier because
  11905 % they might have appeared in the input file name.
  11906 %
  11907 @everyjob{@message{[Texinfo version @texinfoversion]}%
  11908   @global@let\ = @eatinput
  11909   @catcode`+=@active @catcode`@_=@active}
  11910 
  11911 {@catcode`@^=7 @catcode`@^^M=13%
  11912 @gdef@eatinput input texinfo#1^^M{@loadconf}}
  11913 
  11914 @def@everyjobreset{@ifx\@eatinput @let\ = @ttbackslash @fi}
  11915 
  11916 % \otherbackslash defines an active \ to be a literal `\' character with
  11917 % catcode other.
  11918 @gdef@otherbackslash{@let\=@realbackslash}
  11919 
  11920 % Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of
  11921 % the literal character `\'.
  11922 %
  11923 {@catcode`- = @active
  11924  @gdef@normalturnoffactive{%
  11925    @turnoffactive
  11926    @let\=@ttbackslash
  11927  }
  11928 }
  11929 
  11930 % Say @foo, not \foo, in error messages.
  11931 @escapechar = `@@
  11932 
  11933 % These look ok in all fonts, so just make them not special.
  11934 % @hashchar{} gets its own user-level command, because of #line.
  11935 @catcode`@& = @other @def@normalamp{&}
  11936 @catcode`@# = @other @def@normalhash{#}
  11937 @catcode`@% = @other @def@normalpercent{%}
  11938 
  11939 @let @hashchar = @normalhash
  11940 
  11941 @c Finally, make ` and ' active, so that txicodequoteundirected and
  11942 @c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}.  If we
  11943 @c don't make ` and ' active, @code will not get them as active chars.
  11944 @c Do this last of all since we use ` in the previous @catcode assignments.
  11945 @catcode`@'=@active
  11946 @catcode`@`=@active
  11947 
  11948 @c Local variables:
  11949 @c eval: (add-hook 'before-save-hook 'time-stamp nil t)
  11950 @c time-stamp-pattern: "texinfoversion{%Y-%02m-%02d.%02H}"
  11951 @c page-delimiter: "^\\\\message"
  11952 @c End:
  11953 
  11954 @newlineloadsconf