Diff for /freem/doc/texinfo.tex between versions 1.4 and 1.5

version 1.4, 2025/05/06 13:28:17 version 1.5, 2025/05/13 20:03:53
Line 3 Line 3
 % Load plain if necessary, i.e., if running under initex.  % Load plain if necessary, i.e., if running under initex.
 \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi  \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
 %  %
 \def\texinfoversion{2024-02-10.22}  \def\texinfoversion{2020-02-11.09}
 %  %
 % Copyright 1985, 1986, 1988, 1990-2024 Free Software Foundation, Inc.  % Copyright 1985, 1986, 1988, 1990-2019 Free Software Foundation, Inc.
 %  %
 % This texinfo.tex file is free software: you can redistribute it and/or  % This texinfo.tex file is free software: you can redistribute it and/or
 % modify it under the terms of the GNU General Public License as  % modify it under the terms of the GNU General Public License as
Line 33 Line 33
 % The texinfo.tex in any given distribution could well be out  % The texinfo.tex in any given distribution could well be out
 % of date, so if that's what you're using, please check.  % of date, so if that's what you're using, please check.
 %  %
 % Send bug reports to bug-texinfo@gnu.org.  Please include a  % Send bug reports to bug-texinfo@gnu.org.  Please include including a
 % complete document in each bug report with which we can reproduce the  % complete document in each bug report with which we can reproduce the
 % problem.  Patches are, of course, greatly appreciated.  % problem.  Patches are, of course, greatly appreciated.
 %  %
Line 58 Line 58
   
 \message{Loading texinfo [version \texinfoversion]:}  \message{Loading texinfo [version \texinfoversion]:}
   
   % If in a .fmt file, print the version number
   % and turn on active characters that we couldn't do earlier because
   % they might have appeared in the input file name.
   \everyjob{\message{[Texinfo version \texinfoversion]}%
     \catcode`+=\active \catcode`\_=\active}
   
 % LaTeX's \typeout.  This ensures that the messages it is used for  % LaTeX's \typeout.  This ensures that the messages it is used for
 % are identical in format to the corresponding ones from latex/pdflatex.  % are identical in format to the corresponding ones from latex/pdflatex.
 \def\typeout{\immediate\write17}%  \def\typeout{\immediate\write17}%
Line 235 Line 241
 %  %
 \def\finalout{\overfullrule=0pt }  \def\finalout{\overfullrule=0pt }
   
   \newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
   \newdimen\topandbottommargin \topandbottommargin=.75in
   
 % Output a mark which sets \thischapter, \thissection and \thiscolor.  % Output a mark which sets \thischapter, \thissection and \thiscolor.
 % We dump everything together because we only have one kind of mark.  % We dump everything together because we only have one kind of mark.
 % This works because we only use \botmark / \topmark, not \firstmark.  % This works because we only use \botmark / \topmark, not \firstmark.
Line 275 Line 284
 % \topmark doesn't work for the very first chapter (after the title  % \topmark doesn't work for the very first chapter (after the title
 % page or the contents), so we use \firstmark there -- this gets us  % page or the contents), so we use \firstmark there -- this gets us
 % the mark with the chapter defs, unless the user sneaks in, e.g.,  % the mark with the chapter defs, unless the user sneaks in, e.g.,
 % @setcolor (or @url etc.) between @contents and the very first @chapter.  % @setcolor (or @url, or @link, etc.) between @contents and the very
   % first @chapter.
 \def\gettopheadingmarks{%  \def\gettopheadingmarks{%
   \ifcase0\the\savedtopmark\fi    \ifcase0\the\savedtopmark\fi
   \ifx\thischapter\empty \ifcase0\firstmark\fi \fi    \ifx\thischapter\empty \ifcase0\firstmark\fi \fi
Line 307 Line 317
 \newbox\footlinebox  \newbox\footlinebox
   
 % When outputting the double column layout for indices, an output routine  % When outputting the double column layout for indices, an output routine
 % is run several times, hiding the original value of \topmark.  Hence, save  % is run several times, which hides the original value of \topmark.  This
 % \topmark at the beginning.  % can lead to a page heading being output and duplicating the chapter heading
   % of the index.  Hence, save the contents of \topmark at the beginning of
   % the output routine.  The saved contents are valid until we actually
   % \shipout a page.
   %
   % (We used to run a short output routine to actually set \topmark and
   % \firstmark to the right values, but if this was called with an empty page
   % containing whatsits for writing index entries, the whatsits would be thrown
   % away and the index auxiliary file would remain empty.)
 %  %
 \newtoks\savedtopmark  \newtoks\savedtopmark
 \newif\iftopmarksaved  \newif\iftopmarksaved
Line 331 Line 349
   \ifodd\pageno  \advance\hoffset by \bindingoffset    \ifodd\pageno  \advance\hoffset by \bindingoffset
   \else \advance\hoffset by -\bindingoffset\fi    \else \advance\hoffset by -\bindingoffset\fi
   %    %
   \checkchapterpage    % Retrieve the information for the headings from the marks in the page,
     % and call Plain TeX's \makeheadline and \makefootline, which use the
     % values in \headline and \footline.
     %
     % This is used to check if we are on the first page of a chapter.
     \ifcase1\the\savedtopmark\fi
     \let\prevchaptername\thischaptername
     \ifcase0\firstmark\fi
     \let\curchaptername\thischaptername
   %    %
   % Make the heading and footing.  \makeheadline and \makefootline  
   % use the contents of \headline and \footline.  
   \def\commonheadfootline{\let\hsize=\txipagewidth \texinfochars}  
   \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi    \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi
     %
     \ifx\curchaptername\prevchaptername
       \let\thischapterheading\thischapter
     \else
       % \thischapterheading is the same as \thischapter except it is blank
       % for the first page of a chapter.  This is to prevent the chapter name
       % being shown twice.
       \def\thischapterheading{}%
     \fi
     %
     % Common context changes for both heading and footing.
     % Do this outside of the \shipout so @code etc. will be expanded in
     % the headline as they should be, not taken literally (outputting ''code).
     \def\commonheadfootline{\let\hsize=\txipagewidth \texinfochars}
     %
   \global\setbox\headlinebox = \vbox{\commonheadfootline \makeheadline}%    \global\setbox\headlinebox = \vbox{\commonheadfootline \makeheadline}%
     %
   \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi    \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi
   \global\setbox\footlinebox = \vbox{\commonheadfootline \makefootline}%    \global\setbox\footlinebox = \vbox{\commonheadfootline \makefootline}%
   %    %
Line 384 Line 423
 \ifr@ggedbottom \kern-\dimen@ \vfil \fi}  \ifr@ggedbottom \kern-\dimen@ \vfil \fi}
 }  }
   
 % Check if we are on the first page of a chapter.  Used for printing headings.  
 \newif\ifchapterpage  
 \def\checkchapterpage{%  
   % Get the chapter that was current at the end of the last page  
   \ifcase1\the\savedtopmark\fi  
   \let\prevchaptername\thischaptername  
   %  
   \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi  
   \let\curchaptername\thischaptername  
   %  
   \ifx\curchaptername\prevchaptername  
     \chapterpagefalse  
   \else  
     \chapterpagetrue  
   \fi  
 }  
   
 % Argument parsing  % Argument parsing
   
Line 426 Line 449
 }  }
   
 % First remove any @comment, then any @c comment.  Pass the result on to  % First remove any @comment, then any @c comment.  Pass the result on to
 % \argremovespace.  % \argcheckspaces.
 \def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm}  \def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm}
 \def\argremovec#1\c#2\ArgTerm{\argremovespace#1$ $\ArgTerm}  \def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm}
 % \argremovec might leave us with trailing space, though; e.g.,  
   % Each occurrence of `\^^M' or `<space>\^^M' is replaced by a single space.
   %
   % \argremovec might leave us with trailing space, e.g.,
 %    @end itemize  @c foo  %    @end itemize  @c foo
 % Note that the argument cannot contain the TeX $, as its catcode is  % This space token undergoes the same procedure and is eventually removed
 % changed to \other when Texinfo source is read.  % by \finishparsearg.
 \def\argremovespace#1 $#2\ArgTerm{\finishparsearg#1$\ArgTerm}  %
   \def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M}
   \def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M}
   \def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{%
     \def\temp{#3}%
     \ifx\temp\empty
       % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp:
       \let\temp\finishparsearg
     \else
       \let\temp\argcheckspaces
     \fi
     % Put the space token in:
     \temp#1 #3\ArgTerm
   }
   
 % If a _delimited_ argument is enclosed in braces, they get stripped; so  % If a _delimited_ argument is enclosed in braces, they get stripped; so
 % to get _exactly_ the rest of the line, we had to prevent such situation.  % to get _exactly_ the rest of the line, we had to prevent such situation.
 % We prepended an \empty token at the very beginning and we expand it  % We prepended an \empty token at the very beginning and we expand it now,
 % just before passing the control to \next.  % just before passing the control to \argtorun.
 % (But first, we have to remove the remaining $ or two.)  % (Similarly, we have to think about #3 of \argcheckspacesY above: it is
 \def\finishparsearg#1$#2\ArgTerm{\expandafter\argtorun\expandafter{#1}}  % either the null string, or it ends with \^^M---thus there is no danger
   % that a pair of braces would be stripped.
   %
   % But first, we have to remove the trailing space token.
   %
   \def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}}
   
   
 % \parseargdef - define a command taking an argument on the line  % \parseargdef - define a command taking an argument on the line
Line 502 Line 546
   
 % ... but they get defined via ``\envdef\foo{...}'':  % ... but they get defined via ``\envdef\foo{...}'':
 \long\def\envdef#1#2{\def#1{\startenvironment#1#2}}  \long\def\envdef#1#2{\def#1{\startenvironment#1#2}}
 \long\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}}  \def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}}
   
 % Check whether we're in the right environment:  % Check whether we're in the right environment:
 \def\checkenv#1{%  \def\checkenv#1{%
Line 527 Line 571
   \fi    \fi
 }  }
   
   % @end foo executes the definition of \Efoo.
 % @end foo calls \checkenv and executes the definition of \Efoo.  % But first, it executes a specialized version of \checkenv
   %
 \parseargdef\end{%  \parseargdef\end{%
   \if 1\csname iscond.#1\endcsname    \if 1\csname iscond.#1\endcsname
   \else    \else
Line 563 Line 608
 % @/ allows a line break.  % @/ allows a line break.
 \let\/=\allowbreak  \let\/=\allowbreak
   
 % @- allows explicit insertion of hyphenation points  
 \def\-{\discretionary{\normaldash}{}{}}%  
   
 % @. is an end-of-sentence period.  % @. is an end-of-sentence period.
 \def\.{.\spacefactor=\endofsentencespacefactor\space}  \def\.{.\spacefactor=\endofsentencespacefactor\space}
   
Line 575 Line 617
 % @? is an end-of-sentence query.  % @? is an end-of-sentence query.
 \def\?{?\spacefactor=\endofsentencespacefactor\space}  \def\?{?\spacefactor=\endofsentencespacefactor\space}
   
   % @frenchspacing on|off  says whether to put extra space after punctuation.
   %
   \def\onword{on}
   \def\offword{off}
   %
   \parseargdef\frenchspacing{%
     \def\temp{#1}%
     \ifx\temp\onword \plainfrenchspacing
     \else\ifx\temp\offword \plainnonfrenchspacing
     \else
       \errhelp = \EMsimple
       \errmessage{Unknown @frenchspacing option `\temp', must be on|off}%
     \fi\fi
   }
   
 % @w prevents a word break.  Without the \leavevmode, @w at the  % @w prevents a word break.  Without the \leavevmode, @w at the
 % beginning of a paragraph, when TeX is still in vertical mode, would  % beginning of a paragraph, when TeX is still in vertical mode, would
 % produce a whole line of output instead of starting the paragraph.  % produce a whole line of output instead of starting the paragraph.
Line 668  where each line of input produces a line Line 725  where each line of input produces a line
   \dimen2 = \ht\strutbox    \dimen2 = \ht\strutbox
   \advance\dimen2 by \dp\strutbox    \advance\dimen2 by \dp\strutbox
   \ifdim\dimen0 > \dimen2    \ifdim\dimen0 > \dimen2
     % This is similar to the 'needspace' module in LaTeX.      %
     % The first penalty allows a break if the end of the page is      % Do a \strut just to make the height of this box be normal, so the
     % not too far away.  Following penalties and skips are discarded.      % normal leading is inserted relative to the preceding line.
     % Otherwise, require at least \dimen0 of vertical space.      % And a page break here is fine.
     %      \vtop to #1\mil{\strut\vfil}%
     % (We used to use a \vtop to reserve space, but this had spacing issues      %
     % when followed by a section heading, as it was not a "discardable item".      % TeX does not even consider page breaks if a penalty added to the
     % This also has the benefit of providing glue before the page break if      % main vertical list is 10000 or more.  But in order to see if the
     % there isn't enough space.)      % empty box we just added fits on the page, we must make it consider
     \vskip0pt plus \dimen0      % page breaks.  On the other hand, we don't want to actually break the
     \penalty-100      % page after the empty box.  So we use a penalty of 9999.
     \vskip0pt plus -\dimen0      %
     \vskip \dimen0      % There is an extremely small chance that TeX will actually break the
       % page at this \penalty, if there are no other feasible breakpoints in
       % sight.  (If the user is using lots of big @group commands, which
       % almost-but-not-quite fill up a page, TeX will have a hard time doing
       % good page breaking, for example.)  However, I could not construct an
       % example where a page broke at this \penalty; if it happens in a real
       % document, then we can reconsider our strategy.
     \penalty9999      \penalty9999
     \vskip -\dimen0      %
     \penalty0\relax % this hides the above glue from \safewhatsit and \dobreak      % Back up by the size of the box, whether we did a page break or not.
       \kern -#1\mil
       %
       % Do not allow a page break right after this kern.
       \nobreak
   \fi    \fi
 }  }
   
Line 935  where each line of input produces a line Line 1002  where each line of input produces a line
   \global\everypar = {}%    \global\everypar = {}%
 }  }
   
 % leave vertical mode without cancelling any first paragraph indent  
 \gdef\imageindent{%  
   \toks0=\everypar  
   \everypar={}%  
   \ptexnoindent  
   \global\everypar=\toks0  
 }  
   
   
 % @refill is a no-op.  % @refill is a no-op.
 \let\refill=\relax  \let\refill=\relax
Line 951  where each line of input produces a line Line 1010  where each line of input produces a line
 \let\setfilename=\comment  \let\setfilename=\comment
   
 % @bye.  % @bye.
 \outer\def\bye{\chappager\pagelabels\tracingstats=1\ptexend}  \outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
   
   
 \message{pdf,}  \message{pdf,}
Line 1078  where each line of input produces a line Line 1137  where each line of input produces a line
 \fi  \fi
   
   
 % Output page labels information.  
 % See PDF reference v.1.7 p.594, section 8.3.1.  
 % Page label ranges must be increasing.  
 \ifpdf  
 \def\pagelabels{%  
   \def\title{0 << /P (T-) /S /D >>}%  
   %  
   % support @contents at very end of document  
   \ifnum\contentsendcount=\pagecount  
     \ifnum\arabiccount<\romancount  
       \pdfcatalog{/PageLabels << /Nums  
                   [\title  
                    \the\arabiccount << /S /D >>  
                    \the\romancount << /S /r >>  
                   ] >> }\relax  
     \fi  
   % no contents in document  
   \else\ifnum\contentsendcount=0  
     \pdfcatalog{/PageLabels << /Nums  
                 [\title  
                  \the\arabiccount << /S /D >>  
                 ] >> }\relax  
   \else  
     \pdfcatalog{/PageLabels << /Nums  
                 [\title  
                  \the\romancount << /S /r >>  
                  \the\contentsendcount << /S /D >>  
                 ] >> }\relax  
   \fi\fi  
 }  
 \else  
   \let\pagelabels\relax  
 \fi  
   
 \newcount\pagecount \pagecount=0  
 \newcount\romancount \romancount=0  
 \newcount\arabiccount \arabiccount=0  
 \newcount\contentsendcount \contentsendcount=0  
   
 \ifpdf  
   \let\ptxadvancepageno\advancepageno  
   \def\advancepageno{%  
     \ptxadvancepageno\global\advance\pagecount by 1  
   }  
 \fi  
   
   
 % PDF uses PostScript string constants for the names of xref targets,  % PDF uses PostScript string constants for the names of xref targets,
 % for display in the outlines, and in other places.  Thus, we have to  % for display in the outlines, and in other places.  Thus, we have to
 % double any backslashes.  Otherwise, a name like "\node" will be  % double any backslashes.  Otherwise, a name like "\node" will be
Line 1180  output) for that.)} Line 1192  output) for that.)}
   %    %
   % Set color, and create a mark which defines \thiscolor accordingly,    % Set color, and create a mark which defines \thiscolor accordingly,
   % so that \makeheadline knows which color to restore.    % so that \makeheadline knows which color to restore.
   \def\curcolor{0 0 0}%  
   \def\setcolor#1{%    \def\setcolor#1{%
     \ifx#1\curcolor\else      \xdef\currentcolordefs{\gdef\noexpand\thiscolor{#1}}%
       \xdef\currentcolordefs{\gdef\noexpand\thiscolor{#1}}%      \domark
       \domark      \pdfsetcolor{#1}%
       \pdfsetcolor{#1}%  
       \xdef\curcolor{#1}%  
     \fi  
   }    }
   %    %
   \let\maincolor\rgbBlack    \def\maincolor{\rgbBlack}
   \pdfsetcolor{\maincolor}    \pdfsetcolor{\maincolor}
   \edef\thiscolor{\maincolor}    \edef\thiscolor{\maincolor}
   \def\currentcolordefs{}    \def\currentcolordefs{}
Line 1346  output) for that.)} Line 1354  output) for that.)}
   %    %
   % by default, use black for everything.    % by default, use black for everything.
   \def\urlcolor{\rgbBlack}    \def\urlcolor{\rgbBlack}
   \let\linkcolor\rgbBlack    \def\linkcolor{\rgbBlack}
   \def\endlink{\setcolor{\maincolor}\pdfendlink}    \def\endlink{\setcolor{\maincolor}\pdfendlink}
   %    %
   % Adding outlines to PDF; macros for calculating structure of outlines    % Adding outlines to PDF; macros for calculating structure of outlines
Line 1419  output) for that.)} Line 1427  output) for that.)}
       % subentries, which we calculated on our first read of the .toc above.        % subentries, which we calculated on our first read of the .toc above.
       %        %
       % We use the node names as the destinations.        % We use the node names as the destinations.
       %  
       % Currently we prefix the section name with the section number  
       % for chapter and appendix headings only in order to avoid too much  
       % horizontal space being required in the PDF viewer.  
       \def\numchapentry##1##2##3##4{%        \def\numchapentry##1##2##3##4{%
         \dopdfoutline{##2 ##1}{count-\expnumber{chap##2}}{##3}{##4}}%  
       \def\unnchapentry##1##2##3##4{%  
         \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}%          \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}%
       \def\numsecentry##1##2##3##4{%        \def\numsecentry##1##2##3##4{%
         \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}%          \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}%
Line 1524  output) for that.)} Line 1526  output) for that.)}
     \next}      \next}
   \def\makelink{\addtokens{\toksB}%    \def\makelink{\addtokens{\toksB}%
     {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}      {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
   \def\pdflink#1{\pdflinkpage{#1}{#1}}%    \def\pdflink#1{%
   \def\pdflinkpage#1#2{%  
     \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}      \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}
     \setcolor{\linkcolor}#2\endlink}      \setcolor{\linkcolor}#1\endlink}
   \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}    \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
 \else  \else
   % non-pdf mode    % non-pdf mode
Line 1668  output) for that.)} Line 1669  output) for that.)}
       % Therefore, we read toc only once.        % Therefore, we read toc only once.
       %        %
       % We use node names as destinations.        % We use node names as destinations.
       %  
       % Currently we prefix the section name with the section number  
       % for chapter and appendix headings only in order to avoid too much  
       % horizontal space being required in the PDF viewer.  
       \def\partentry##1##2##3##4{}% ignore parts in the outlines        \def\partentry##1##2##3##4{}% ignore parts in the outlines
       \def\numchapentry##1##2##3##4{%        \def\numchapentry##1##2##3##4{%
         \dopdfoutline{##2 ##1}{1}{##3}{##4}}%          \dopdfoutline{##1}{1}{##3}{##4}}%
       \def\numsecentry##1##2##3##4{%        \def\numsecentry##1##2##3##4{%
         \dopdfoutline{##1}{2}{##3}{##4}}%          \dopdfoutline{##1}{2}{##3}{##4}}%
       \def\numsubsecentry##1##2##3##4{%        \def\numsubsecentry##1##2##3##4{%
Line 1686  output) for that.)} Line 1683  output) for that.)}
       \let\appsecentry\numsecentry%        \let\appsecentry\numsecentry%
       \let\appsubsecentry\numsubsecentry%        \let\appsubsecentry\numsubsecentry%
       \let\appsubsubsecentry\numsubsubsecentry%        \let\appsubsubsecentry\numsubsubsecentry%
       \def\unnchapentry##1##2##3##4{%        \let\unnchapentry\numchapentry%
         \dopdfoutline{##1}{1}{##3}{##4}}%  
       \let\unnsecentry\numsecentry%        \let\unnsecentry\numsecentry%
       \let\unnsubsecentry\numsubsecentry%        \let\unnsubsecentry\numsubsecentry%
       \let\unnsubsubsecentry\numsubsubsecentry%        \let\unnsubsubsecentry\numsubsubsecentry%
Line 1774  output) for that.)} Line 1770  output) for that.)}
     \next}      \next}
   \def\makelink{\addtokens{\toksB}%    \def\makelink{\addtokens{\toksB}%
     {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}      {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
   \def\pdflink#1{\pdflinkpage{#1}{#1}}%    \def\pdflink#1{%
   \def\pdflinkpage#1#2{%  
     \special{pdf:bann << /Border [0 0 0]      \special{pdf:bann << /Border [0 0 0]
       /Type /Annot /Subtype /Link /A << /S /GoTo /D (#1) >> >>}%        /Type /Annot /Subtype /Link /A << /S /GoTo /D (#1) >> >>}%
     \setcolor{\linkcolor}#2\endlink}      \setcolor{\linkcolor}#1\endlink}
   \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}    \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
 %  %
   %    %
Line 1817  output) for that.)} Line 1812  output) for that.)}
       \closein 1        \closein 1
     \endgroup      \endgroup
     %      %
     % Putting an \hbox around the image can prevent an over-long line      \def\xetexpdfext{pdf}%
     % after the image.      \ifx\xeteximgext\xetexpdfext
     \hbox\bgroup        \XeTeXpdffile "#1".\xeteximgext ""
       \def\xetexpdfext{pdf}%      \else
         \def\xetexpdfext{PDF}%
       \ifx\xeteximgext\xetexpdfext        \ifx\xeteximgext\xetexpdfext
         \XeTeXpdffile "#1".\xeteximgext ""          \XeTeXpdffile "#1".\xeteximgext ""
       \else        \else
         \def\xetexpdfext{PDF}%          \XeTeXpicfile "#1".\xeteximgext ""
         \ifx\xeteximgext\xetexpdfext  
           \XeTeXpdffile "#1".\xeteximgext ""  
         \else  
           \XeTeXpicfile "#1".\xeteximgext ""  
         \fi  
       \fi        \fi
       \ifdim \wd0 >0pt width \xeteximagewidth \fi      \fi
       \ifdim \wd2 >0pt height \xeteximageheight \fi \relax      \ifdim \wd0 >0pt width \xeteximagewidth \fi
     \egroup      \ifdim \wd2 >0pt height \xeteximageheight \fi \relax
   }    }
 \fi  \fi
   
Line 2123  end Line 2114  end
     \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%      \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
   }%    }%
 \fi\fi  \fi\fi
 %  
 % This is what gets called when #5 of \setfont is empty.  
 \let\cmap\gobble  
 %  
 % (end of cmaps)  
   
   
 % Set the font macro #1 to the font named \fontprefix#2.  % Set the font macro #1 to the font named \fontprefix#2.
Line 2143  end Line 2129  end
 \def\setfont#1#2#3#4#5{%  \def\setfont#1#2#3#4#5{%
   \font#1=\fontprefix#2#3 scaled #4    \font#1=\fontprefix#2#3 scaled #4
   \csname cmap#5\endcsname#1%    \csname cmap#5\endcsname#1%
   \ifx#2\ttshape\hyphenchar#1=-1 \fi  
   \ifx#2\ttbshape\hyphenchar#1=-1 \fi  
   \ifx#2\ttslshape\hyphenchar#1=-1 \fi  
 }  }
   % This is what gets called when #5 of \setfont is empty.
   \let\cmap\gobble
   %
   % (end of cmaps)
   
 % Use cm as the default font prefix.  % Use cm as the default font prefix.
 % To specify the font prefix, you must define \fontprefix  % To specify the font prefix, you must define \fontprefix
Line 2537  end Line 2524  end
   \scriptfont\sffam=\sevensf    \scriptfont\sffam=\sevensf
 }  }
   
   %
   
   % The font-changing commands (all called \...fonts) redefine the meanings
 % \defineassignfonts{SIZE} -  % of \STYLEfont, instead of just \STYLE.  We do this because \STYLE needs
 %   Define sequence \assignfontsSIZE, which switches between font sizes  % to also set the current \fam for math mode.  Our \STYLE (e.g., \rm)
 % by redefining the meanings of \STYLEfont.  (Just \STYLE additionally sets  % commands hardwire \STYLEfont to set the current font.
 % the current \fam for math mode.)  %
 %  % The fonts used for \ifont are for "math italics"  (\itfont is for italics
 \def\defineassignfonts#1{%  % in regular text).  \syfont is also used in math mode only.
   \expandafter\edef\csname assignfonts#1\endcsname{%  %
     \let\noexpand\rmfont\csname #1rm\endcsname  % Each font-changing command also sets the names \lsize (one size lower)
     \let\noexpand\itfont\csname #1it\endcsname  % and \lllsize (three sizes lower).  These relative commands are used
     \let\noexpand\slfont\csname #1sl\endcsname  % in, e.g., the LaTeX logo and acronyms.
     \let\noexpand\bffont\csname #1bf\endcsname  %
     \let\noexpand\ttfont\csname #1tt\endcsname  % This all needs generalizing, badly.
     \let\noexpand\smallcaps\csname #1sc\endcsname  %
     \let\noexpand\sffont  \csname #1sf\endcsname  
     \let\noexpand\ifont   \csname #1i\endcsname  
     \let\noexpand\syfont  \csname #1sy\endcsname  
     \let\noexpand\ttslfont\csname #1ttsl\endcsname  
   }  
 }  
   
 \def\assignfonts#1{%  \def\assignfonts#1{%
   \csname assignfonts#1\endcsname    \expandafter\let\expandafter\rmfont\csname #1rm\endcsname
     \expandafter\let\expandafter\itfont\csname #1it\endcsname
     \expandafter\let\expandafter\slfont\csname #1sl\endcsname
     \expandafter\let\expandafter\bffont\csname #1bf\endcsname
     \expandafter\let\expandafter\ttfont\csname #1tt\endcsname
     \expandafter\let\expandafter\smallcaps\csname #1sc\endcsname
     \expandafter\let\expandafter\sffont  \csname #1sf\endcsname
     \expandafter\let\expandafter\ifont   \csname #1i\endcsname
     \expandafter\let\expandafter\syfont  \csname #1sy\endcsname
     \expandafter\let\expandafter\ttslfont\csname #1ttsl\endcsname
 }  }
   
 \newif\ifrmisbold  \newif\ifrmisbold
Line 2584  end Line 2575  end
    \csname\curfontstyle\endcsname     \csname\curfontstyle\endcsname
 }%  }%
   
 % Define the font-changing commands (all called \...fonts).  
 % Each font-changing command also sets the names \lsize (one size lower)  
 % and \lllsize (three sizes lower).  These relative commands are used  
 % in, e.g., the LaTeX logo and acronyms.  
 %  
 % Note: The fonts used for \ifont are for "math italics"  (\itfont is for  
 % italics in regular text).  \syfont is also used in math mode only.  
 %  
 \def\definefontsetatsize#1#2#3#4#5{%  \def\definefontsetatsize#1#2#3#4#5{%
   \defineassignfonts{#1}%  
 \expandafter\def\csname #1fonts\endcsname{%  \expandafter\def\csname #1fonts\endcsname{%
   \def\curfontsize{#1}%    \def\curfontsize{#1}%
   \def\lsize{#2}\def\lllsize{#3}%    \def\lsize{#2}\def\lllsize{#3}%
   \csname rmisbold#5\endcsname    \csname rmisbold#5\endcsname
   \csname assignfonts#1\endcsname    \assignfonts{#1}%
   \resetmathfonts    \resetmathfonts
   \setleading{#4}%    \setleading{#4}%
 }}  }}
Line 2640  end Line 2622  end
 \definetextfontsizexi  \definetextfontsizexi
   
   
   \message{markup,}
   
 % Check if we are currently using a typewriter font.  Since all the  % Check if we are currently using a typewriter font.  Since all the
 % Computer Modern typewriter fonts have zero interword stretch (and  % Computer Modern typewriter fonts have zero interword stretch (and
 % shrink), and it is reasonable to expect all typewriter fonts to have  % shrink), and it is reasonable to expect all typewriter fonts to have
 % this property, we can check that font parameter. #1 is what to  % this property, we can check that font parameter.
 % print if we are indeed using \tt; #2 is what to print otherwise.  %
 \def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi}  \def\ifmonospace{\ifdim\fontdimen3\font=0pt }
   
 % Same as above, but check for italic font.  Actually this also catches  % Markup style infrastructure.  \defmarkupstylesetup\INITMACRO will
 % non-italic slanted fonts since it is impossible to distinguish them from  % define and register \INITMACRO to be called on markup style changes.
 % italic fonts.  But since this is only used by $ and it uses \sl anyway  % \INITMACRO can check \currentmarkupstyle for the innermost
 % this is not a problem.  % style.
 \def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi}  
   
   \let\currentmarkupstyle\empty
   
 % Check if internal flag is clear, i.e. has not been @set.  \def\setupmarkupstyle#1{%
 \def\ifflagclear#1#2#3{%    \def\currentmarkupstyle{#1}%
   \expandafter\ifx\csname SET#1\endcsname\relax    \markupstylesetup
   #2\else#3\fi  }
   
   \let\markupstylesetup\empty
   
   \def\defmarkupstylesetup#1{%
     \expandafter\def\expandafter\markupstylesetup
       \expandafter{\markupstylesetup #1}%
     \def#1%
   }
   
   % Markup style setup for left and right quotes.
   \defmarkupstylesetup\markupsetuplq{%
     \expandafter\let\expandafter \temp
       \csname markupsetuplq\currentmarkupstyle\endcsname
     \ifx\temp\relax \markupsetuplqdefault \else \temp \fi
   }
   
   \defmarkupstylesetup\markupsetuprq{%
     \expandafter\let\expandafter \temp
       \csname markupsetuprq\currentmarkupstyle\endcsname
     \ifx\temp\relax \markupsetuprqdefault \else \temp \fi
 }  }
   
 {  {
 \catcode`\'=\active  \catcode`\'=\active
 \catcode`\`=\active  \catcode`\`=\active
   
 \gdef\setcodequotes{\let`\codequoteleft \let'\codequoteright}  \gdef\markupsetuplqdefault{\let`\lq}
 \gdef\setregularquotes{\let`\lq \let'\rq}  \gdef\markupsetuprqdefault{\let'\rq}
   
   \gdef\markupsetcodequoteleft{\let`\codequoteleft}
   \gdef\markupsetcodequoteright{\let'\codequoteright}
 }  }
 \setregularquotes  
   
 % output for ' in @code  \let\markupsetuplqcode \markupsetcodequoteleft
 % in tt font hex 0D (undirected) or 27 (curly right quote)  \let\markupsetuprqcode \markupsetcodequoteright
   %
   \let\markupsetuplqexample \markupsetcodequoteleft
   \let\markupsetuprqexample \markupsetcodequoteright
   %
   \let\markupsetuplqkbd     \markupsetcodequoteleft
   \let\markupsetuprqkbd     \markupsetcodequoteright
   %
   \let\markupsetuplqsamp \markupsetcodequoteleft
   \let\markupsetuprqsamp \markupsetcodequoteright
   %
   \let\markupsetuplqverb \markupsetcodequoteleft
   \let\markupsetuprqverb \markupsetcodequoteright
   %
   \let\markupsetuplqverbatim \markupsetcodequoteleft
   \let\markupsetuprqverbatim \markupsetcodequoteright
   
   % Allow an option to not use regular directed right quote/apostrophe
   % (char 0x27), but instead the undirected quote from cmtt (char 0x0d).
   % The undirected quote is ugly, so don't make it the default, but it
   % works for pasting with more pdf viewers (at least evince), the
   % lilypond developers report.  xpdf does work with the regular 0x27.
 %  %
 \def\codequoteright{%  \def\codequoteright{%
   \ifusingtt    \ifmonospace
       {\ifflagclear{txicodequoteundirected}%      \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax
           {\ifflagclear{codequoteundirected}%        \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax
               {'}%          '%
               {\char"0D }}%        \else \char'15 \fi
           {\char"0D }}%      \else \char'15 \fi
       {'}%     \else
        '%
      \fi
 }  }
   %
 % output for ` in @code  % and a similar option for the left quote char vs. a grave accent.
 % in tt font hex 12 (grave accent) or 60 (curly left quote)  % Modern fonts display ASCII 0x60 as a grave accent, so some people like
 % \relax disables Spanish ligatures ?` and !` of \tt font.  % the code environments to do likewise.
 %  %
 \def\codequoteleft{%  \def\codequoteleft{%
   \ifusingtt    \ifmonospace
       {\ifflagclear{txicodequotebacktick}%      \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax
           {\ifflagclear{codequotebacktick}%        \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax
               {\relax`}%          % [Knuth] pp. 380,381,391
               {\char"12 }}%          % \relax disables Spanish ligatures ?` and !` of \tt font.
           {\char"12 }}%          \relax`%
       {\relax`}%        \else \char'22 \fi
       \else \char'22 \fi
      \else
        \relax`%
      \fi
 }  }
   
 % Commands to set the quote options.  % Commands to set the quote options.
Line 2711  end Line 2744  end
     \errmessage{Unknown @codequoteundirected value `\temp', must be on|off}%      \errmessage{Unknown @codequoteundirected value `\temp', must be on|off}%
   \fi\fi    \fi\fi
 }  }
   %
 \parseargdef\codequotebacktick{%  \parseargdef\codequotebacktick{%
   \def\temp{#1}%    \def\temp{#1}%
   \ifx\temp\onword    \ifx\temp\onword
Line 2726  end Line 2759  end
   \fi\fi    \fi\fi
 }  }
   
 % Turn them on by default  
 \let\SETtxicodequoteundirected = t  
 \let\SETtxicodequotebacktick = t  
   
   
 % [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font.  % [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font.
 \def\noligaturesquoteleft{\relax\lq}  \def\noligaturesquoteleft{\relax\lq}
   
Line 2745  end Line 2773  end
 \def\dosmartslant#1#2{%  \def\dosmartslant#1#2{%
   \ifusingtt    \ifusingtt
     {{\ttsl #2}\let\next=\relax}%      {{\ttsl #2}\let\next=\relax}%
     {\def\next{{#1#2}\smartitaliccorrection}}%      {\def\next{{#1#2}\futurelet\next\smartitaliccorrection}}%
   \next    \next
 }  }
 \def\smartslanted{\dosmartslant\sl}  \def\smartslanted{\dosmartslant\sl}
 \def\smartitalic{\dosmartslant\it}  \def\smartitalic{\dosmartslant\it}
   
 % Output an italic correction unless the following character is such as  % Output an italic correction unless \next (presumed to be the following
 % not to need one.  % character) is such as not to need one.
 \def\smartitaliccorrection{\futurelet\next\smartitaliccorrectionx}  \def\smartitaliccorrection{%
 \def\smartitaliccorrectionx{%  
   \ifx\next,%    \ifx\next,%
   \else\ifx\next-%    \else\ifx\next-%
   \else\ifx\next.%    \else\ifx\next.%
Line 2765  end Line 2792  end
   \aftersmartic    \aftersmartic
 }  }
   
 % @cite unconditionally uses \sl with \smartitaliccorrection.  % Unconditional use \ttsl, and no ic.  @var is set to this for defuns.
 \def\cite#1{{\sl #1}\smartitaliccorrection}  \def\ttslanted#1{{\ttsl #1}}
   
   % @cite is like \smartslanted except unconditionally use \sl.  We never want
   % ttsl for book titles, do we?
   \def\cite#1{{\sl #1}\futurelet\next\smartitaliccorrection}
   
 % @var unconditionally uses \sl.  This gives consistency for  
 % parameter names whether they are in @def, @table @code or a  
 % regular paragraph.  
 %  To get ttsl font for @var when used in code context, @set txicodevaristt.  
 % The \null is to reset \spacefactor.  
 \def\aftersmartic{}  \def\aftersmartic{}
 \def\var#1{%  \def\var#1{%
   \let\saveaftersmartic = \aftersmartic    \let\saveaftersmartic = \aftersmartic
   \def\aftersmartic{\null\let\aftersmartic=\saveaftersmartic}%    \def\aftersmartic{\null\let\aftersmartic=\saveaftersmartic}%
   %    \smartslanted{#1}%
   \ifflagclear{txicodevaristt}%  
     {\def\varnext{{{\sl #1}}\smartitaliccorrection}}%  
     {\def\varnext{\smartslanted{#1}}}%  
   \varnext  
 }  }
   
 % To be removed after next release  
 \def\SETtxicodevaristt{}% @set txicodevaristt  
   
 \let\i=\smartitalic  \let\i=\smartitalic
 \let\slanted=\smartslanted  \let\slanted=\smartslanted
 \let\dfn=\smartslanted  \let\dfn=\smartslanted
 \let\emph=\smartitalic  \let\emph=\smartitalic
   
 % @r for roman font, used for code comment  % Explicit font changes: @r, @sc, undocumented @ii.
 \def\r#1{{%  \def\r#1{{\rm #1}}              % roman font
   \usenormaldash % get --, --- ligatures even if in @code  
   \defcharsdefault  % in case on def line  
   \rm #1}}  
 {\catcode`-=\active \gdef\usenormaldash{\let-\normaldash}}  
   
 % @sc, undocumented @ii.  
 \def\sc#1{{\smallcaps#1}}       % smallcaps font  \def\sc#1{{\smallcaps#1}}       % smallcaps font
 \def\ii#1{{\it #1}}             % italic font  \def\ii#1{{\it #1}}             % italic font
   
Line 2810  end Line 2823  end
 % @sansserif, explicit sans.  % @sansserif, explicit sans.
 \def\sansserif#1{{\sf #1}}  \def\sansserif#1{{\sf #1}}
   
 \newif\iffrenchspacing  % We can't just use \exhyphenpenalty, because that only has effect at
 \frenchspacingfalse  % the end of a paragraph.  Restore normal hyphenation at the end of the
   % group within which \nohyphenation is presumably called.
   %
   \def\nohyphenation{\hyphenchar\font = -1  \aftergroup\restorehyphenation}
   \def\restorehyphenation{\hyphenchar\font = `- }
   
 % Set sfcode to normal for the chars that usually have another value.  % Set sfcode to normal for the chars that usually have another value.
 % Can't use plain's \frenchspacing because it uses the `\x notation, and  % Can't use plain's \frenchspacing because it uses the `\x notation, and
Line 2819  end Line 2836  end
 %  %
 \catcode`@=11  \catcode`@=11
   \def\plainfrenchspacing{%    \def\plainfrenchspacing{%
     \iffrenchspacing\else      \sfcode`\.=\@m \sfcode`\?=\@m \sfcode`\!=\@m
       \frenchspacingtrue      \sfcode`\:=\@m \sfcode`\;=\@m \sfcode`\,=\@m
       \sfcode`\.=\@m \sfcode`\?=\@m \sfcode`\!=\@m      \def\endofsentencespacefactor{1000}% for @. and friends
       \sfcode`\:=\@m \sfcode`\;=\@m \sfcode`\,=\@m  
       \def\endofsentencespacefactor{1000}% for @. and friends  
     \fi  
   }    }
   \def\plainnonfrenchspacing{%    \def\plainnonfrenchspacing{%
     \iffrenchspacing      \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000
       \frenchspacingfalse      \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250
        \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000      \def\endofsentencespacefactor{3000}% for @. and friends
        \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250  
        \def\endofsentencespacefactor{3000}% for @. and friends  
     \fi  
   }    }
 \catcode`@=\other  \catcode`@=\other
 \def\endofsentencespacefactor{3000}% default  \def\endofsentencespacefactor{3000}% default
   
 % @frenchspacing on|off  says whether to put extra space after punctuation.  
 %  
 \def\onword{on}  
 \def\offword{off}  
 %  
 \let\frenchspacingsetting\plainnonfrenchspacing % used in output routine  
 \parseargdef\frenchspacing{%  
   \def\temp{#1}%  
   \ifx\temp\onword \let\frenchspacingsetting\plainfrenchspacing  
   \else\ifx\temp\offword \let\frenchspacingsetting\plainnonfrenchspacing  
   \else  
     \errhelp = \EMsimple  
     \errmessage{Unknown @frenchspacing option `\temp', must be on|off}%  
   \fi\fi  
   \frenchspacingsetting  
 }  
   
   
 % @t, explicit typewriter.  % @t, explicit typewriter.
 \def\t#1{%  \def\t#1{%
   {\tt \defcharsdefault \plainfrenchspacing #1}%    {\tt \plainfrenchspacing #1}%
   \null    \null
 }  }
   
 % @samp.  % @samp.
 \def\samp#1{{\setcodequotes\lq\tclose{#1}\rq\null}}  \def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}}
   
 % @indicateurl is \samp, that is, with quotes.  % @indicateurl is \samp, that is, with quotes.
 \let\indicateurl=\samp  \let\indicateurl=\samp
Line 2878  end Line 2871  end
     % Switch to typewriter.      % Switch to typewriter.
     \tt      \tt
     %      %
     % `\ ' produces the large typewriter interword space.      % But `\ ' produces the large typewriter interword space.
     \def\ {{\spaceskip = 0pt{} }}%      \def\ {{\spaceskip = 0pt{} }}%
     %      %
       % Turn off hyphenation.
       \nohyphenation
       %
     \plainfrenchspacing      \plainfrenchspacing
     #1%      #1%
   }%    }%
   \null % reset spacefactor to 1000    \null % reset spacefactor to 1000
 }  }
   
 % This is for LuaTeX: It is not sufficient to disable hyphenation at  % We *must* turn on hyphenation at `-' and `_' in @code.
 % explicit dashes by setting `\hyphenchar` to -1.  % (But see \codedashfinish below.)
 \def\dashnobreak{%  
   \normaldash  
   \penalty 10000 }  
   
 % We must turn on hyphenation at `-' and `_' in @code.  
 % Otherwise, it is too hard to avoid overfull hboxes  % Otherwise, it is too hard to avoid overfull hboxes
 % in the Emacs manual, the Library manual, etc.  % in the Emacs manual, the Library manual, etc.
 % We explicitly allow hyphenation at these characters  
 % using \discretionary.  
 %  %
 % Hyphenation at - and hyphenation within words was turned off  % Unfortunately, TeX uses one parameter (\hyphenchar) to control
 % by default for the tt fonts using the \hyphenchar parameter of TeX.  % both hyphenation at - and hyphenation within words.
   % We must therefore turn them both off (\tclose does that)
   % and arrange explicitly to hyphenate at a dash. -- rms.
 {  {
   \catcode`\-=\active \catcode`\_=\active    \catcode`\-=\active \catcode`\_=\active
   \catcode`\'=\active \catcode`\`=\active    \catcode`\'=\active \catcode`\`=\active
   \global\let'=\rq \global\let`=\lq  % default definitions    \global\let'=\rq \global\let`=\lq  % default definitions
   %    %
   \global\def\code{\begingroup    \global\def\code{\begingroup
     \setcodequotes      \setupmarkupstyle{code}%
       % The following should really be moved into \setupmarkupstyle handlers.
     \catcode\dashChar=\active  \catcode\underChar=\active      \catcode\dashChar=\active  \catcode\underChar=\active
     \ifallowcodebreaks      \ifallowcodebreaks
      \let-\codedash       \let-\codedash
      \let_\codeunder       \let_\codeunder
     \else      \else
      \let-\dashnobreak       \let-\normaldash
      \let_\realunder       \let_\realunder
     \fi      \fi
       % Given -foo (with a single dash), we do not want to allow a break
       % after the hyphen.
       \global\let\codedashprev=\codedash
       %
     \codex      \codex
   }    }
   %    %
Line 2925  end Line 2921  end
     %      %
     % Now, output a discretionary to allow a line break, unless      % Now, output a discretionary to allow a line break, unless
     % (a) the next character is a -, or      % (a) the next character is a -, or
     % (b) the preceding character is a -, or      % (b) the preceding character is a -.
     % (c) we are at the start of the string.  
     % In both cases (b) and (c), \codedashnobreak should be set to \codedash.  
     %  
     % E.g., given --posix, we do not want to allow a break after either -.      % E.g., given --posix, we do not want to allow a break after either -.
     % Given --foo-bar, we do want to allow a break between the - and the b.      % Given --foo-bar, we do want to allow a break between the - and the b.
     \ifx\next\codedash \else      \ifx\next\codedash \else
       \ifx\codedashnobreak\codedash        \ifx\codedashprev\codedash
       \else \discretionary{}{}{}\fi        \else \discretionary{}{}{}\fi
     \fi      \fi
     % we need the space after the = for the case when \next itself is a      % we need the space after the = for the case when \next itself is a
     % space token; it would get swallowed otherwise.  As in @code{- a}.      % space token; it would get swallowed otherwise.  As in @code{- a}.
     \global\let\codedashnobreak= \next      \global\let\codedashprev= \next
   }    }
 }  }
 \def\normaldash{-}  \def\normaldash{-}
 %  %
 \def\codex #1{\tclose{%  \def\codex #1{\tclose{#1}\endgroup}
   % Given -foo (with a single dash), we do not want to allow a break  
   % after the -.  \codedashnobreak is set to the first character in  
   % @code.  
   \futurelet\codedashnobreak\relax  
   #1%  
 }\endgroup}  
   
 \def\codeunder{%  \def\codeunder{%
   % this is all so @math{@code{var_name}+1} can work.  In math mode, _    % this is all so @math{@code{var_name}+1} can work.  In math mode, _
Line 3000  end Line 2987  end
 % arg (if given), and not the url (which is then just the link target).  % arg (if given), and not the url (which is then just the link target).
 \newif\ifurefurlonlylink  \newif\ifurefurlonlylink
   
 % The default \pretolerance setting stops the penalty inserted in  
 % \urefallowbreak being a discouragement to line breaking.  Set it to  
 % a negative value for this paragraph only.  Hopefully this does not  
 % conflict with redefinitions of \par done elsewhere.  
 \def\nopretolerance{%  
 \pretolerance=-1  
 \def\par{\endgraf\pretolerance=100 \let\par\endgraf}%  
 }  
   
 % The main macro is \urefbreak, which allows breaking at expected  % The main macro is \urefbreak, which allows breaking at expected
 % places within the url.  % places within the url.  (There used to be another version, which
 \def\urefbreak{\nopretolerance \begingroup \urefcatcodes \dourefbreak}  % didn't support automatic breaking.)
   \def\urefbreak{\begingroup \urefcatcodes \dourefbreak}
 \let\uref=\urefbreak  \let\uref=\urefbreak
 %  %
 \def\dourefbreak#1{\urefbreakfinish #1,,,\finish}  \def\dourefbreak#1{\urefbreakfinish #1,,,\finish}
Line 3066  end Line 3045  end
   \urefcatcodes    \urefcatcodes
   %    %
   \global\def\urefcode{\begingroup    \global\def\urefcode{\begingroup
     \setcodequotes      \setupmarkupstyle{code}%
     \urefcatcodes      \urefcatcodes
     \let&\urefcodeamp      \let&\urefcodeamp
     \let.\urefcodedot      \let.\urefcodedot
Line 3122  end Line 3101  end
   
 % Allow a ragged right output to aid breaking long URL's.  There can  % Allow a ragged right output to aid breaking long URL's.  There can
 % be a break at the \allowbreak with no extra glue (if the existing stretch in  % be a break at the \allowbreak with no extra glue (if the existing stretch in
 % the line is sufficient), a break at the \penalty with extra glue added  % the line is sufficent), a break at the \penalty100 with extra glue added
 % at the end of the line, or no break at all here.  % at the end of the line, or no break at all here.
 %   Changing the value of the penalty and/or the amount of stretch affects how  %   Changing the value of the penalty and/or the amount of stretch affects how
 % preferable one choice is over the other.  % preferrable one choice is over the other.
 \def\urefallowbreak{%  \def\urefallowbreak{%
   \penalty0\relax    \allowbreak
   \hskip 0pt plus 2 em\relax    \hskip 0pt plus 2 em\relax
   \penalty1000\relax    \penalty300
   \hskip 0pt plus -2 em\relax    \hskip 0pt plus -2 em\relax
 }  }
   
Line 3179  end Line 3158  end
 % Default is `distinct'.  % Default is `distinct'.
 \kbdinputstyle distinct  \kbdinputstyle distinct
   
 \def\kbd#1{%  % @kbd is like @code, except that if the argument is just one @key command,
   \tclose{\kbdfont\setcodequotes#1}%  % then @kbd has no effect.
   \def\kbd#1{{\def\look{#1}\expandafter\kbdsub\look??\par}}
   
   \def\xkey{\key}
   \def\kbdsub#1#2#3\par{%
     \def\one{#1}\def\three{#3}\def\threex{??}%
     \ifx\one\xkey\ifx\threex\three \key{#2}%
     \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi
     \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi
 }  }
   
 % definition of @key that produces a lozenge.  Doesn't adjust to text size.  % definition of @key that produces a lozenge.  Doesn't adjust to text size.
Line 3193  end Line 3180  end
 %    \kern-0.4pt\hrule}%  %    \kern-0.4pt\hrule}%
 %  \kern-.06em\raise0.4pt\hbox{\angleright}}}}  %  \kern-.06em\raise0.4pt\hbox{\angleright}}}}
   
 % definition of @key with no lozenge.  % definition of @key with no lozenge.  If the current font is already
 %  % monospace, don't change it; that way, we respect @kbdinputstyle.  But
 \def\key#1{{\setregularquotes \tt #1}\null}  % if it isn't monospace, then use \tt.
   %
   \def\key#1{{\setupmarkupstyle{key}%
     \nohyphenation
     \ifmonospace\else\tt\fi
     #1}\null}
   
 % @clicksequence{File @click{} Open ...}  % @clicksequence{File @click{} Open ...}
 \def\clicksequence#1{\begingroup #1\endgroup}  \def\clicksequence#1{\begingroup #1\endgroup}
Line 3313  end Line 3305  end
 \def\sup{\ifmmode \expandafter\ptexsp \else \expandafter\finishsup\fi}  \def\sup{\ifmmode \expandafter\ptexsp \else \expandafter\finishsup\fi}
 \def\finishsup#1{$\ptexsp{\hbox{\switchtolllsize #1}}$}%  \def\finishsup#1{$\ptexsp{\hbox{\switchtolllsize #1}}$}%
   
 % provide this command from LaTeX as it is very common  
 \def\frac#1#2{{{#1}\over{#2}}}  
   
 % @displaymath.  
 % \globaldefs is needed to recognize the end lines in \tex and  
 % \end tex.  Set \thisenv as @end displaymath is seen before @end tex.  
 {\obeylines  
 \globaldefs=1  
 \envdef\displaymath{%  
 \tex%  
 \def\thisenv{\displaymath}%  
 \begingroup\let\end\displaymathend%  
 $$%  
 }  
   
 \def\displaymathend{$$\endgroup\end}%  
   
 \def\Edisplaymath{%  
 \def\thisenv{\tex}%  
 \end tex  
 }}  
   
   
 % @inlinefmt{FMTNAME,PROCESSED-TEXT} and @inlineraw{FMTNAME,RAW-TEXT}.  % @inlinefmt{FMTNAME,PROCESSED-TEXT} and @inlineraw{FMTNAME,RAW-TEXT}.
 % Ignore unless FMTNAME == tex; then it is like @iftex and @tex,  % Ignore unless FMTNAME == tex; then it is like @iftex and @tex,
 % except specified as a normal braced arg, so no newlines to worry about.  % except specified as a normal braced arg, so no newlines to worry about.
Line 3398  $$% Line 3367  $$%
 \let\atchar=\@  \let\atchar=\@
   
 % @{ @} @lbracechar{} @rbracechar{} all generate brace characters.  % @{ @} @lbracechar{} @rbracechar{} all generate brace characters.
 \def\lbracechar{{\ifusingtt{\char123}{\ensuremath\lbrace}}}  \def\lbracechar{{\ifmonospace\char123\else\ensuremath\lbrace\fi}}
 \def\rbracechar{{\ifusingtt{\char125}{\ensuremath\rbrace}}}  \def\rbracechar{{\ifmonospace\char125\else\ensuremath\rbrace\fi}}
 \let\{=\lbracechar  \let\{=\lbracechar
 \let\}=\rbracechar  \let\}=\rbracechar
   
Line 3453  $$% Line 3422  $$%
        % Revert to plain's \scriptsize, which is 7pt.         % Revert to plain's \scriptsize, which is 7pt.
        \count255=\the\fam $\fam\count255 \scriptstyle A$%         \count255=\the\fam $\fam\count255 \scriptstyle A$%
      \else       \else
        \ifx\curfontsize\smallword         % For 11pt, we can use our lllsize.
          % For footnotes and indices         \switchtolllsize A%
          \count255=\the\fam $\fam\count255 \scriptstyle A$%  
        \else  
          % For 11pt, we can use our lllsize.  
          \switchtolllsize A%  
        \fi  
      \fi       \fi
      }%       }%
      \vss       \vss
Line 3467  $$% Line 3431  $$%
   \kern-.15em    \kern-.15em
   \TeX    \TeX
 }  }
 \def\smallword{small}  
   
 % Some math mode symbols.  Define \ensuremath to switch into math mode  % Some math mode symbols.  Define \ensuremath to switch into math mode
 % unless we are already there.  Expansion tricks may not be needed here,  % unless we are already there.  Expansion tricks may not be needed here,
Line 3546  $$% Line 3509  $$%
   
 % @pounds{} is a sterling sign, which Knuth put in the CM italic font.  % @pounds{} is a sterling sign, which Knuth put in the CM italic font.
 %  %
 \def\pounds{{\ifusingtt{\ecfont\char"BF}{\it\$}}}  \def\pounds{{\it\$}}
   
 % @euro{} comes from a separate font, depending on the current style.  % @euro{} comes from a separate font, depending on the current style.
 % We use the free feym* fonts from the eurosym package by Henrik  % We use the free feym* fonts from the eurosym package by Henrik
Line 3615  $$% Line 3578  $$%
 \def\quotedblbase{{\ecfont \char"12}}  \def\quotedblbase{{\ecfont \char"12}}
 \def\quotesinglbase{{\ecfont \char"0D}}  \def\quotesinglbase{{\ecfont \char"0D}}
 %  %
 \def\L{{\ecfont \char"8A}} % L with stroke  
 \def\l{{\ecfont \char"AA}} % l with stroke  
 %  
 % This positioning is not perfect (see the ogonek LaTeX package), but  % This positioning is not perfect (see the ogonek LaTeX package), but
 % we have the precomposed glyphs for the most common cases.  We put the  % we have the precomposed glyphs for the most common cases.  We put the
 % tests to use those glyphs in the single \ogonek macro so we have fewer  % tests to use those glyphs in the single \ogonek macro so we have fewer
Line 3660  $$% Line 3620  $$%
   % hopefully nobody will notice/care.    % hopefully nobody will notice/care.
   \edef\ecsize{\csname\curfontsize ecsize\endcsname}%    \edef\ecsize{\csname\curfontsize ecsize\endcsname}%
   \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}%    \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}%
   \ifusingtt    \ifmonospace
       % typewriter:      % typewriter:
      {\font\thisecfont = #1ctt\ecsize \space at \nominalsize}%      \font\thisecfont = #1ctt\ecsize \space at \nominalsize
   % else    \else
      {\ifx\curfontstyle\bfstylename      \ifx\curfontstyle\bfstylename
         % bold:        % bold:
         \font\thisecfont = #1cb\ifusingit{i}{x}\ecsize \space at \nominalsize        \font\thisecfont = #1cb\ifusingit{i}{x}\ecsize \space at \nominalsize
       \else      \else
         % regular:        % regular:
         \font\thisecfont = #1c\ifusingit{ti}{rm}\ecsize \space at \nominalsize        \font\thisecfont = #1c\ifusingit{ti}{rm}\ecsize \space at \nominalsize
       \fi}%      \fi
     \fi
   \thisecfont    \thisecfont
 }  }
   
Line 3686  $$% Line 3647  $$%
   
 % @textdegree - the normal degrees sign.  % @textdegree - the normal degrees sign.
 %  %
 \def\textdegree{%  \def\textdegree{$^\circ$}
    \ifmmode ^\circ  
    \else {\tcfont \char 176}%  
    \fi}  
   
 % Laurent Siebenmann reports \Orb undefined with:  % Laurent Siebenmann reports \Orb undefined with:
 %  Textures 1.7.7 (preloaded format=plain 93.10.14)  (68K)  16 APR 2004 02:38  %  Textures 1.7.7 (preloaded format=plain 93.10.14)  (68K)  16 APR 2004 02:38
Line 3700  $$% Line 3658  $$%
 \fi  \fi
   
 % Quotes.  % Quotes.
   \chardef\quotedblleft="5C
   \chardef\quotedblright=`\"
 \chardef\quoteleft=`\`  \chardef\quoteleft=`\`
 \chardef\quoteright=`\'  \chardef\quoteright=`\'
   
 % only change font for tt for correct kerning and to avoid using  
 % \ecfont unless necessary.  
 \def\quotedblleft{%  
   \ifusingtt{{\ecfont\char"10}}{{\char"5C}}%  
 }  
   
 \def\quotedblright{%  
   \ifusingtt{{\ecfont\char"11}}{{\char`\"}}%  
 }  
   
   
 \message{page headings,}  \message{page headings,}
   
Line 3735  $$% Line 3685  $$%
               want the contents after the title page.}}%                want the contents after the title page.}}%
   
 \parseargdef\shorttitlepage{%  \parseargdef\shorttitlepage{%
   {\headingsoff \begingroup \hbox{}\vskip 1.5in \chaprm \centerline{#1}%    \begingroup \hbox{}\vskip 1.5in \chaprm \centerline{#1}%
   \endgroup\page\hbox{}\page}\pageone}    \endgroup\page\hbox{}\page}
   
 \envdef\titlepage{%  \envdef\titlepage{%
   % Open one extra group, as we want to close it in the middle of \Etitlepage.    % Open one extra group, as we want to close it in the middle of \Etitlepage.
   \begingroup    \begingroup
     \parindent=0pt \textfonts      \parindent=0pt \textfonts
     \headingsoff  
     % Leave some space at the very top of the page.      % Leave some space at the very top of the page.
     \vglue\titlepagetopglue      \vglue\titlepagetopglue
     % No rule at page bottom unless we print one at the top with @title.      % No rule at page bottom unless we print one at the top with @title.
Line 3770  $$% Line 3719  $$%
     % If we use the new definition of \page, we always get a blank page      % If we use the new definition of \page, we always get a blank page
     % after the title page, which we certainly don't want.      % after the title page, which we certainly don't want.
     \oldpage      \oldpage
     \pageone  
   \endgroup    \endgroup
   %    %
     % Need this before the \...aftertitlepage checks so that if they are
     % in effect the toc pages will come out with page numbers.
     \HEADINGSon
 }  }
   
 \def\finishtitlepage{%  \def\finishtitlepage{%
Line 3833  $$% Line 3784  $$%
   
 \newtoks\evenheadline    % headline on even pages  \newtoks\evenheadline    % headline on even pages
 \newtoks\oddheadline     % headline on odd pages  \newtoks\oddheadline     % headline on odd pages
 \newtoks\evenchapheadline% headline on even pages with a new chapter  
 \newtoks\oddchapheadline % headline on odd pages with a new chapter  
 \newtoks\evenfootline    % footline on even pages  \newtoks\evenfootline    % footline on even pages
 \newtoks\oddfootline     % footline on odd pages  \newtoks\oddfootline     % footline on odd pages
   
 % Now make \makeheadline and \makefootline in Plain TeX use those variables  % Now make \makeheadline and \makefootline in Plain TeX use those variables
 \headline={{\textfonts\rm\frenchspacingsetting  \headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
             \ifchapterpage                              \else \the\evenheadline \fi}}
               \ifodd\pageno\the\oddchapheadline\else\the\evenchapheadline\fi  \footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
             \else                              \else \the\evenfootline \fi}\HEADINGShook}
               \ifodd\pageno\the\oddheadline\else\the\evenheadline\fi  
             \fi}}  
   
 \footline={{\textfonts\rm\frenchspacingsetting  
             \ifodd\pageno \the\oddfootline \else \the\evenfootline \fi}%  
            \HEADINGShook}  
 \let\HEADINGShook=\relax  \let\HEADINGShook=\relax
   
 % Commands to set those variables.  % Commands to set those variables.
Line 3862  $$% Line 3805  $$%
 \def\evenheading{\parsearg\evenheadingxxx}  \def\evenheading{\parsearg\evenheadingxxx}
 \def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish}  \def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish}
 \def\evenheadingyyy #1\|#2\|#3\|#4\finish{%  \def\evenheadingyyy #1\|#2\|#3\|#4\finish{%
   \global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}  \global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
   \global\evenchapheadline=\evenheadline}  
   
 \def\oddheading{\parsearg\oddheadingxxx}  \def\oddheading{\parsearg\oddheadingxxx}
 \def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish}  \def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish}
 \def\oddheadingyyy #1\|#2\|#3\|#4\finish{%  \def\oddheadingyyy #1\|#2\|#3\|#4\finish{%
   \global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}%  \global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
   \global\oddchapheadline=\oddheadline}  
   
 \parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}%  \parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
   
Line 3936  $$% Line 3877  $$%
 \parseargdef\headings{\csname HEADINGS#1\endcsname}  \parseargdef\headings{\csname HEADINGS#1\endcsname}
   
 \def\headingsoff{% non-global headings elimination  \def\headingsoff{% non-global headings elimination
   \evenheadline={\hfil}\evenfootline={\hfil}\evenchapheadline={\hfil}%    \evenheadline={\hfil}\evenfootline={\hfil}%
    \oddheadline={\hfil}\oddfootline={\hfil}\oddchapheadline={\hfil}%     \oddheadline={\hfil}\oddfootline={\hfil}%
 }  }
   
 \def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting  \def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting
   \HEADINGSoff  % it's the default
   
 % Set the page number to 1.  % When we turn headings on, set the page number to 1.
 \def\pageone{  
   \global\pageno=1  
   \global\arabiccount = \pagecount  
 }  
   
 \let\contentsalignmacro = \chappager  
   
 % \def\HEADINGSon{\HEADINGSdouble} % defined by \CHAPPAGon  
   
 % For double-sided printing, put current file name in lower left corner,  % For double-sided printing, put current file name in lower left corner,
 % chapter name on inside top of right hand pages, document  % chapter name on inside top of right hand pages, document
 % title on inside top of left hand pages, and page numbers on outside top  % title on inside top of left hand pages, and page numbers on outside top
 % edge of all pages.  % edge of all pages.
 \def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdouble}  
 \let\HEADINGSdoubleafter=\HEADINGSafter  
 \def\HEADINGSdouble{%  \def\HEADINGSdouble{%
   \global\pageno=1
 \global\evenfootline={\hfil}  \global\evenfootline={\hfil}
 \global\oddfootline={\hfil}  \global\oddfootline={\hfil}
 \global\evenheadline={\line{\folio\hfil\thistitle}}  \global\evenheadline={\line{\folio\hfil\thistitle}}
 \global\oddheadline={\line{\thischapter\hfil\folio}}  \global\oddheadline={\line{\thischapterheading\hfil\folio}}
 \global\evenchapheadline={\line{\folio\hfil\thistitle}}  
 \global\oddchapheadline={\line{\hfil\folio}}  
 \global\let\contentsalignmacro = \chapoddpage  \global\let\contentsalignmacro = \chapoddpage
 }  }
   \let\contentsalignmacro = \chappager
   
 % For single-sided printing, chapter title goes across top left of page,  % For single-sided printing, chapter title goes across top left of page,
 % page number on top right.  % page number on top right.
 \def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsingle}  
 \def\HEADINGSsingle{%  \def\HEADINGSsingle{%
   \global\pageno=1
 \global\evenfootline={\hfil}  \global\evenfootline={\hfil}
 \global\oddfootline={\hfil}  \global\oddfootline={\hfil}
 \global\evenheadline={\line{\thischapter\hfil\folio}}  \global\evenheadline={\line{\thischapterheading\hfil\folio}}
 \global\oddheadline={\line{\thischapter\hfil\folio}}  \global\oddheadline={\line{\thischapterheading\hfil\folio}}
 \global\evenchapheadline={\line{\hfil\folio}}  
 \global\oddchapheadline={\line{\hfil\folio}}  
 \global\let\contentsalignmacro = \chappager  \global\let\contentsalignmacro = \chappager
 }  }
   \def\HEADINGSon{\HEADINGSdouble}
   
 % for @setchapternewpage off  \def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
 \def\HEADINGSsinglechapoff{%  \let\HEADINGSdoubleafter=\HEADINGSafter
   \def\HEADINGSdoublex{%
   \global\evenfootline={\hfil}
   \global\oddfootline={\hfil}
   \global\evenheadline={\line{\folio\hfil\thistitle}}
   \global\oddheadline={\line{\thischapterheading\hfil\folio}}
   \global\let\contentsalignmacro = \chapoddpage
   }
   
   \def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
   \def\HEADINGSsinglex{%
 \global\evenfootline={\hfil}  \global\evenfootline={\hfil}
 \global\oddfootline={\hfil}  \global\oddfootline={\hfil}
 \global\evenheadline={\line{\thischapter\hfil\folio}}  \global\evenheadline={\line{\thischapterheading\hfil\folio}}
 \global\oddheadline={\line{\thischapter\hfil\folio}}  \global\oddheadline={\line{\thischapterheading\hfil\folio}}
 \global\evenchapheadline=\evenheadline  
 \global\oddchapheadline=\oddheadline  
 \global\let\contentsalignmacro = \chappager  \global\let\contentsalignmacro = \chappager
 }  }
   
Line 4297  $$% Line 4235  $$%
   \doitemize{#1.}\flushcr    \doitemize{#1.}\flushcr
 }  }
   
   % @alphaenumerate and @capsenumerate are abbreviations for giving an arg
   % to @enumerate.
   %
   \def\alphaenumerate{\enumerate{a}}
   \def\capsenumerate{\enumerate{A}}
   \def\Ealphaenumerate{\Eenumerate}
   \def\Ecapsenumerate{\Eenumerate}
   
   
 % @multitable macros  % @multitable macros
   % Amy Hendrickson, 8/18/94, 3/6/96
   %
   % @multitable ... @end multitable will make as many columns as desired.
   % Contents of each column will wrap at width given in preamble.  Width
   % can be specified either with sample text given in a template line,
   % or in percent of \hsize, the current width of text on page.
   
   % Table can continue over pages but will only break between lines.
   
   % To make preamble:
   %
   % Either define widths of columns in terms of percent of \hsize:
   %   @multitable @columnfractions .25 .3 .45
   %   @item ...
   %
   %   Numbers following @columnfractions are the percent of the total
   %   current hsize to be used for each column. You may use as many
   %   columns as desired.
   
   
   % Or use a template:
   %   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
   %   @item ...
   %   using the widest term desired in each column.
   
   % Each new table line starts with @item, each subsequent new column
   % starts with @tab. Empty columns may be produced by supplying @tab's
   % with nothing between them for as many times as empty columns are needed,
   % ie, @tab@tab@tab will produce two empty columns.
   
   % @item, @tab do not need to be on their own lines, but it will not hurt
   % if they are.
   
   % Sample multitable:
   
   %   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
   %   @item first col stuff @tab second col stuff @tab third col
   %   @item
   %   first col stuff
   %   @tab
   %   second col stuff
   %   @tab
   %   third col
   %   @item first col stuff @tab second col stuff
   %   @tab Many paragraphs of text may be used in any column.
   %
   %         They will wrap at the width determined by the template.
   %   @item@tab@tab This will be in third column.
   %   @end multitable
   
   % Default dimensions may be reset by user.
   % @multitableparskip is vertical space between paragraphs in table.
   % @multitableparindent is paragraph indent in table.
   % @multitablecolmargin is horizontal space to be left between columns.
   % @multitablelinespace is space to leave between table items, baseline
   %                                                            to baseline.
   %   0pt means it depends on current normal line spacing.
   %
   \newskip\multitableparskip
   \newskip\multitableparindent
   \newdimen\multitablecolspace
   \newskip\multitablelinespace
   \multitableparskip=0pt
   \multitableparindent=6pt
   \multitablecolspace=12pt
   \multitablelinespace=0pt
   
 % Macros used to set up halign preamble:  % Macros used to set up halign preamble:
 %  %
Line 4346  $$% Line 4358  $$%
   \go    \go
 }  }
   
   % multitable-only commands.
   %
 % @headitem starts a heading row, which we typeset in bold.  Assignments  % @headitem starts a heading row, which we typeset in bold.  Assignments
 % have to be global since we are inside the implicit group of an  % have to be global since we are inside the implicit group of an
 % alignment entry.  \everycr below resets \everytab so we don't have to  % alignment entry.  \everycr below resets \everytab so we don't have to
 % undo it ourselves.  % undo it ourselves.
 \def\headitemfont{\b}% for people to use in the template row; not changeable  \def\headitemfont{\b}% for people to use in the template row; not changeable
 \def\headitem{%  \def\headitem{%
   \crcr % must appear first    \checkenv\multitable
     \crcr
   \gdef\headitemcrhook{\nobreak}% attempt to avoid page break after headings    \gdef\headitemcrhook{\nobreak}% attempt to avoid page break after headings
   \global\everytab={\bf}% can't use \headitemfont since the parsing differs    \global\everytab={\bf}% can't use \headitemfont since the parsing differs
   \the\everytab % for the first item    \the\everytab % for the first item
Line 4361  $$% Line 4376  $$%
 % default for tables with no headings.  % default for tables with no headings.
 \let\headitemcrhook=\relax  \let\headitemcrhook=\relax
 %  %
   % A \tab used to include \hskip1sp.  But then the space in a template
   % line is not enough.  That is bad.  So let's go back to just `&' until
   % we again encounter the problem the 1sp was intended to solve.
   %                                       --karl, nathan@acm.org, 20apr99.
 \def\tab{\checkenv\multitable &\the\everytab}%  \def\tab{\checkenv\multitable &\the\everytab}%
   
   % @multitable ... @end multitable definitions:
   %
 \newtoks\everytab  % insert after every tab.  \newtoks\everytab  % insert after every tab.
 %  %
 \envdef\multitable{%  \envdef\multitable{%
Line 4377  $$% Line 4398  $$%
   %    %
   \tolerance=9500    \tolerance=9500
   \hbadness=9500    \hbadness=9500
   \parskip=0pt    \setmultitablespacing
   \parindent=6pt    \parskip=\multitableparskip
     \parindent=\multitableparindent
   \overfullrule=0pt    \overfullrule=0pt
   \global\colcount=0    \global\colcount=0
   %    %
Line 4408  $$% Line 4430  $$%
   % continue for many paragraphs if desired.    % continue for many paragraphs if desired.
   \halign\bgroup &%    \halign\bgroup &%
     \global\advance\colcount by 1      \global\advance\colcount by 1
     \strut      \multistrut
     \vtop{%      \vtop{%
       \advance\hsize by -1\leftskip        % Use the current \colcount to find the correct column width:
       % Find the correct column width  
       \hsize=\expandafter\csname col\the\colcount\endcsname        \hsize=\expandafter\csname col\the\colcount\endcsname
       %        %
       \advance\rightskip by -1\rightskip % Zero leaving only any stretch        % In order to keep entries from bumping into each other
         % we will add a \leftskip of \multitablecolspace to all columns after
         % the first one.
         %
         % If a template has been used, we will add \multitablecolspace
         % to the width of each template entry.
         %
         % If the user has set preamble in terms of percent of \hsize we will
         % use that dimension as the width of the column, and the \leftskip
         % will keep entries from bumping into each other.  Table will start at
         % left margin and final column will justify at right margin.
         %
         % Make sure we don't inherit \rightskip from the outer environment.
         \rightskip=0pt
       \ifnum\colcount=1        \ifnum\colcount=1
         \advance\hsize by\leftskip % Add indent of surrounding text          % The first column will be indented with the surrounding text.
           \advance\hsize by\leftskip
       \else        \else
         % In order to keep entries from bumping into each other.          \ifsetpercent \else
         \leftskip=12pt            % If user has not set preamble in terms of percent of \hsize
         \ifsetpercent \else            % we will advance \hsize by \multitablecolspace.
           % If a template has been used            \advance\hsize by \multitablecolspace
           \advance\hsize by \leftskip          \fi
         \fi         % In either case we will make \leftskip=\multitablecolspace:
         \leftskip=\multitablecolspace
       \fi        \fi
       \noindent\ignorespaces##\unskip\strut        % Ignoring space at the beginning and end avoids an occasional spurious
         % blank line, when TeX decides to break the line at the space before the
         % box from the multistrut, so the strut ends up on a line by itself.
         % For example:
         % @multitable @columnfractions .11 .89
         % @item @code{#}
         % @tab Legal holiday which is valid in major parts of the whole country.
         % Is automatically provided with highlighting sequences respectively
         % marking characters.
         \noindent\ignorespaces##\unskip\multistrut
     }\cr      }\cr
 }  }
 \def\Emultitable{%  \def\Emultitable{%
Line 4434  $$% Line 4479  $$%
   \global\setpercentfalse    \global\setpercentfalse
 }  }
   
   \def\setmultitablespacing{%
     \def\multistrut{\strut}% just use the standard line spacing
     %
     % Compute \multitablelinespace (if not defined by user) for use in
     % \multitableparskip calculation.  We used define \multistrut based on
     % this, but (ironically) that caused the spacing to be off.
     % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100.
   \ifdim\multitablelinespace=0pt
   \setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
   \global\advance\multitablelinespace by-\ht0
   \fi
   % Test to see if parskip is larger than space between lines of
   % table. If not, do nothing.
   %        If so, set to same dimension as multitablelinespace.
   \ifdim\multitableparskip>\multitablelinespace
   \global\multitableparskip=\multitablelinespace
   \global\advance\multitableparskip-7pt % to keep parskip somewhat smaller
                                         % than skip between lines in the table.
   \fi%
   \ifdim\multitableparskip=0pt
   \global\multitableparskip=\multitablelinespace
   \global\advance\multitableparskip-7pt % to keep parskip somewhat smaller
                                         % than skip between lines in the table.
   \fi}
   
   
 \message{conditionals,}  \message{conditionals,}
   
 % @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotlatex, @ifnotplaintext,  % @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext,
 % @ifnotxml always succeed.  They currently do nothing; we don't  % @ifnotxml always succeed.  They currently do nothing; we don't
 % attempt to check whether the conditionals are properly nested.  But we  % attempt to check whether the conditionals are properly nested.  But we
 % have to remember that they are conditionals, so that @end doesn't  % have to remember that they are conditionals, so that @end doesn't
Line 4451  $$% Line 4521  $$%
 \makecond{ifnotdocbook}  \makecond{ifnotdocbook}
 \makecond{ifnothtml}  \makecond{ifnothtml}
 \makecond{ifnotinfo}  \makecond{ifnotinfo}
 \makecond{ifnotlatex}  
 \makecond{ifnotplaintext}  \makecond{ifnotplaintext}
 \makecond{ifnotxml}  \makecond{ifnotxml}
   
Line 4464  $$% Line 4533  $$%
 \def\ifdocbook{\doignore{ifdocbook}}  \def\ifdocbook{\doignore{ifdocbook}}
 \def\ifhtml{\doignore{ifhtml}}  \def\ifhtml{\doignore{ifhtml}}
 \def\ifinfo{\doignore{ifinfo}}  \def\ifinfo{\doignore{ifinfo}}
 \def\iflatex{\doignore{iflatex}}  
 \def\ifnottex{\doignore{ifnottex}}  \def\ifnottex{\doignore{ifnottex}}
 \def\ifplaintext{\doignore{ifplaintext}}  \def\ifplaintext{\doignore{ifplaintext}}
 \def\ifxml{\doignore{ifxml}}  \def\ifxml{\doignore{ifxml}}
 \def\ignore{\doignore{ignore}}  \def\ignore{\doignore{ignore}}
 \def\latex{\doignore{latex}}  
 \def\menu{\doignore{menu}}  \def\menu{\doignore{menu}}
 \def\xml{\doignore{xml}}  \def\xml{\doignore{xml}}
   
Line 4708  $$% Line 4775  $$%
 % except not \outer, so it can be used within macros and \if's.  % except not \outer, so it can be used within macros and \if's.
 \edef\newwrite{\makecsname{ptexnewwrite}}  \edef\newwrite{\makecsname{ptexnewwrite}}
   
 % \newindex {IX} defines an index named IX.  % \newindex {foo} defines an index named IX.
 % It automatically defines \IXindex such that  % It automatically defines \IXindex such that
 % \IXindex ...rest of line... puts an entry in the index IX.  % \IXindex ...rest of line... puts an entry in the index IX.
 % It also defines \IXindfile to be the number of the output channel for  % It also defines \IXindfile to be the number of the output channel for
 % the file that accumulates this index.  The file's extension is IX.  % the file that accumulates this index.  The file's extension is IX.
   % The name of an index should be no more than 2 characters long
   % for the sake of vms.
 %  %
 \def\newindex#1{%  \def\newindex#1{%
   \expandafter\chardef\csname#1indfile\endcsname=0    \expandafter\chardef\csname#1indfile\endcsname=0
Line 4772  $$% Line 4841  $$%
   
 % like the previous two, but they put @code around the argument.  % like the previous two, but they put @code around the argument.
 \def\docodeindex#1{\edef\indexname{#1}\parsearg\docodeindexxxx}  \def\docodeindex#1{\edef\indexname{#1}\parsearg\docodeindexxxx}
 \def\docodeindexxxx #1{\docind{\indexname}{#1}}  \def\docodeindexxxx #1{\doind{\indexname}{\code{#1}}}
   
   
   % Used for the aux, toc and index files to prevent expansion of Texinfo
   % commands.
   %
   \def\atdummies{%
     \definedummyletter\@%
     \definedummyletter\ %
     \definedummyletter\{%
     \definedummyletter\}%
     \definedummyletter\&%
     %
     % Do the redefinitions.
     \definedummies
     \otherbackslash
   }
   
 % \definedummyword defines \#1 as \string\#1\space, thus effectively  % \definedummyword defines \#1 as \string\#1\space, thus effectively
 % preventing its expansion.  This is used only for control words,  % preventing its expansion.  This is used only for control words,
Line 4790  $$% Line 4874  $$%
 %  %
 \def\definedummyword  #1{\def#1{\string#1\space}}%  \def\definedummyword  #1{\def#1{\string#1\space}}%
 \def\definedummyletter#1{\def#1{\string#1}}%  \def\definedummyletter#1{\def#1{\string#1}}%
   \let\definedummyaccent\definedummyletter
   
 % Used for the aux, toc and index files to prevent expansion of Texinfo  % Called from \atdummies to prevent the expansion of commands.
 % commands.  Most of the commands are controlled through the  
 % \ifdummies conditional.  
 %  %
 \def\atdummies{%  \def\definedummies{%
   \dummiestrue  
   %    %
   \definedummyletter\@%    \let\commondummyword\definedummyword
   \definedummyletter\ %    \let\commondummyletter\definedummyletter
   \definedummyletter\{%    \let\commondummyaccent\definedummyaccent
   \definedummyletter\}%    \commondummiesnofonts
   \definedummyletter\&%  
   %    %
   \definedummyletter\_%    \definedummyletter\_%
   \definedummyletter\-%    \definedummyletter\-%
   %    %
     % Non-English letters.
     \definedummyword\AA
     \definedummyword\AE
     \definedummyword\DH
     \definedummyword\L
     \definedummyword\O
     \definedummyword\OE
     \definedummyword\TH
     \definedummyword\aa
     \definedummyword\ae
     \definedummyword\dh
     \definedummyword\exclamdown
     \definedummyword\l
     \definedummyword\o
     \definedummyword\oe
     \definedummyword\ordf
     \definedummyword\ordm
     \definedummyword\questiondown
     \definedummyword\ss
     \definedummyword\th
     %
     % Although these internal commands shouldn't show up, sometimes they do.
     \definedummyword\bf
     \definedummyword\gtr
     \definedummyword\hat
     \definedummyword\less
     \definedummyword\sf
     \definedummyword\sl
     \definedummyword\tclose
     \definedummyword\tt
     %
     \definedummyword\LaTeX
     \definedummyword\TeX
     %
     % Assorted special characters.
     \definedummyword\ampchar
     \definedummyword\atchar
     \definedummyword\arrow
     \definedummyword\backslashchar
     \definedummyword\bullet
     \definedummyword\comma
     \definedummyword\copyright
     \definedummyword\registeredsymbol
     \definedummyword\dots
     \definedummyword\enddots
     \definedummyword\entrybreak
     \definedummyword\equiv
     \definedummyword\error
     \definedummyword\euro
     \definedummyword\expansion
     \definedummyword\geq
     \definedummyword\guillemetleft
     \definedummyword\guillemetright
     \definedummyword\guilsinglleft
     \definedummyword\guilsinglright
     \definedummyword\lbracechar
     \definedummyword\leq
     \definedummyword\mathopsup
     \definedummyword\minus
     \definedummyword\ogonek
     \definedummyword\pounds
     \definedummyword\point
     \definedummyword\print
     \definedummyword\quotedblbase
     \definedummyword\quotedblleft
     \definedummyword\quotedblright
     \definedummyword\quoteleft
     \definedummyword\quoteright
     \definedummyword\quotesinglbase
     \definedummyword\rbracechar
     \definedummyword\result
     \definedummyword\sub
     \definedummyword\sup
     \definedummyword\textdegree
     %
   \definedummyword\subentry    \definedummyword\subentry
   %    %
   % We want to disable all macros so that they are not expanded by \write.    % We want to disable all macros so that they are not expanded by \write.
   \let\commondummyword\definedummyword  
   \macrolist    \macrolist
   \let\value\dummyvalue    \let\value\dummyvalue
   %    %
   \turnoffactive    \normalturnoffactive
 }  }
   
 \newif\ifdummies  % \commondummiesnofonts: common to \definedummies and \indexnofonts.
 \newif\ifindexnofonts  % Define \commondummyletter, \commondummyaccent and \commondummyword before
   % using.  Used for accents, font commands, and various control letters.
 \def\commondummyletter#1{%  %
   \expandafter\let\csname\string#1:impl\endcsname#1%  \def\commondummiesnofonts{%
   \edef#1{%    % Control letters and accents.
     \noexpand\ifindexnofonts  
       % empty expansion  
     \noexpand\else  
       \noexpand\ifdummies\string#1%  
       \noexpand\else  
         \noexpand\jumptwofi % dispose of the \fi  
         \expandafter\noexpand\csname\string#1:impl\endcsname  
       \noexpand\fi  
     \noexpand\fi}%  
 }  
   
 \def\commondummyaccent#1{%  
   \expandafter\let\csname\string#1:impl\endcsname#1%  
   \edef#1{%  
     \noexpand\ifindexnofonts  
       \noexpand\expandafter % dispose of \else ... \fi  
       \noexpand\asis  
     \noexpand\else  
       \noexpand\ifdummies\string#1%  
       \noexpand\else  
         \noexpand\jumptwofi % dispose of the \fi  
         \expandafter\noexpand\csname\string#1:impl\endcsname  
       \noexpand\fi  
     \noexpand\fi}%  
 }  
   
 % Like \commondummyaccent but add a \space at the end of the dummy expansion  
 % #2 is the expansion used for \indexnofonts.  #2 is always followed by  
 % \asis to remove a pair of following braces.  
 \def\commondummyword#1#2{%  
   \expandafter\let\csname\string#1:impl\endcsname#1%  
   \expandafter\def\csname\string#1:ixnf\endcsname{#2\asis}%  
   \edef#1{%  
     \noexpand\ifindexnofonts  
       \noexpand\expandafter % dispose of \else ... \fi  
       \expandafter\noexpand\csname\string#1:ixnf\endcsname  
     \noexpand\else  
       \noexpand\ifdummies\string#1\space  
       \noexpand\else  
         \noexpand\jumptwofi % dispose of the \fi \fi  
         \expandafter\noexpand\csname\string#1:impl\endcsname  
       \noexpand\fi  
     \noexpand\fi}%  
 }  
 \def\jumptwofi#1\fi\fi{\fi\fi#1}  
   
 % For \atdummies and \indexnofonts.  \atdummies sets  
 % \dummiestrue and \indexnofonts sets \indexnofontstrue.  
 \def\definedummies{  
   % @-sign is always an escape character when reading auxiliary files  
   \escapechar = `\@  
   %  
   \commondummyletter\!%    \commondummyletter\!%
   \commondummyaccent\"%    \commondummyaccent\"%
   \commondummyaccent\'%    \commondummyaccent\'%
Line 4888  $$% Line 4991  $$%
   \commondummyaccent\^%    \commondummyaccent\^%
   \commondummyaccent\`%    \commondummyaccent\`%
   \commondummyaccent\~%    \commondummyaccent\~%
   %    \commondummyword\u
   % Control letters and accents.    \commondummyword\v
   \commondummyword\u          {}%    \commondummyword\H
   \commondummyword\v          {}%    \commondummyword\dotaccent
   \commondummyword\H          {}%    \commondummyword\ogonek
   \commondummyword\dotaccent  {}%    \commondummyword\ringaccent
   \commondummyword\ogonek     {}%    \commondummyword\tieaccent
   \commondummyword\ringaccent {}%    \commondummyword\ubaraccent
   \commondummyword\tieaccent  {}%    \commondummyword\udotaccent
   \commondummyword\ubaraccent {}%    \commondummyword\dotless
   \commondummyword\udotaccent {}%  
   \commondummyword\dotless    {}%  
   %    %
   % Texinfo font commands.    % Texinfo font commands.
   \commondummyword\b          {}%    \commondummyword\b
   \commondummyword\i          {}%    \commondummyword\i
   \commondummyword\r          {}%    \commondummyword\r
   \commondummyword\sansserif  {}%    \commondummyword\sansserif
   \commondummyword\sc         {}%    \commondummyword\sc
   \commondummyword\slanted    {}%    \commondummyword\slanted
   \commondummyword\t          {}%    \commondummyword\t
   %    %
   % Commands that take arguments.    % Commands that take arguments.
   \commondummyword\abbr       {}%    \commondummyword\abbr
   \commondummyword\acronym    {}%    \commondummyword\acronym
   \commondummyword\anchor     {}%    \commondummyword\anchor
   \commondummyword\cite       {}%    \commondummyword\cite
   \commondummyword\code       {}%    \commondummyword\code
   \commondummyword\command    {}%    \commondummyword\command
   \commondummyword\dfn        {}%    \commondummyword\dfn
   \commondummyword\dmn        {}%    \commondummyword\dmn
   \commondummyword\email      {}%    \commondummyword\email
   \commondummyword\emph       {}%    \commondummyword\emph
   \commondummyword\env        {}%    \commondummyword\env
   \commondummyword\file       {}%    \commondummyword\file
   \commondummyword\image      {}%    \commondummyword\image
   \commondummyword\indicateurl{}%    \commondummyword\indicateurl
   \commondummyword\inforef    {}%    \commondummyword\inforef
   \commondummyword\kbd        {}%    \commondummyword\kbd
   \commondummyword\key        {}%    \commondummyword\key
   \commondummyword\link       {}%    \commondummyword\math
   \commondummyword\math       {}%    \commondummyword\option
   \commondummyword\option     {}%    \commondummyword\pxref
   \commondummyword\pxref      {}%    \commondummyword\ref
   \commondummyword\ref        {}%    \commondummyword\samp
   \commondummyword\samp       {}%    \commondummyword\strong
   \commondummyword\strong     {}%    \commondummyword\tie
   \commondummyword\tie        {}%    \commondummyword\U
   \commondummyword\U          {}%    \commondummyword\uref
   \commondummyword\uref       {}%    \commondummyword\url
   \commondummyword\url        {}%    \commondummyword\var
   \commondummyword\var        {}%    \commondummyword\verb
   \commondummyword\verb       {}%    \commondummyword\w
   \commondummyword\w          {}%    \commondummyword\xref
   \commondummyword\xref       {}%  
   %  
   \commondummyword\AA               {AA}%  
   \commondummyword\AE               {AE}%  
   \commondummyword\DH               {DZZ}%  
   \commondummyword\L                {L}%  
   \commondummyword\O                {O}%  
   \commondummyword\OE               {OE}%  
   \commondummyword\TH               {TH}%  
   \commondummyword\aa               {aa}%  
   \commondummyword\ae               {ae}%  
   \commondummyword\dh               {dzz}%  
   \commondummyword\exclamdown       {!}%  
   \commondummyword\l                {l}%  
   \commondummyword\o                {o}%  
   \commondummyword\oe               {oe}%  
   \commondummyword\ordf             {a}%  
   \commondummyword\ordm             {o}%  
   \commondummyword\questiondown     {?}%  
   \commondummyword\ss               {ss}%  
   \commondummyword\th               {th}%  
   %  
   \commondummyword\LaTeX            {LaTeX}%  
   \commondummyword\TeX              {TeX}%  
   %  
   % Assorted special characters.  
   \commondummyword\ampchar          {\normalamp}%  
   \commondummyword\atchar           {\@}%  
   \commondummyword\arrow            {->}%  
   \commondummyword\backslashchar    {\realbackslash}%  
   \commondummyword\bullet           {bullet}%  
   \commondummyword\comma            {,}%  
   \commondummyword\copyright        {copyright}%  
   \commondummyword\dots             {...}%  
   \commondummyword\enddots          {...}%  
   \commondummyword\entrybreak       {}%  
   \commondummyword\equiv            {===}%  
   \commondummyword\error            {error}%  
   \commondummyword\euro             {euro}%  
   \commondummyword\expansion        {==>}%  
   \commondummyword\geq              {>=}%  
   \commondummyword\guillemetleft    {<<}%  
   \commondummyword\guillemetright   {>>}%  
   \commondummyword\guilsinglleft    {<}%  
   \commondummyword\guilsinglright   {>}%  
   \commondummyword\lbracechar       {\{}%  
   \commondummyword\leq              {<=}%  
   \commondummyword\mathopsup        {sup}%  
   \commondummyword\minus            {-}%  
   \commondummyword\pounds           {pounds}%  
   \commondummyword\point            {.}%  
   \commondummyword\print            {-|}%  
   \commondummyword\quotedblbase     {"}%  
   \commondummyword\quotedblleft     {"}%  
   \commondummyword\quotedblright    {"}%  
   \commondummyword\quoteleft        {`}%  
   \commondummyword\quoteright       {'}%  
   \commondummyword\quotesinglbase   {,}%  
   \commondummyword\rbracechar       {\}}%  
   \commondummyword\registeredsymbol {R}%  
   \commondummyword\result           {=>}%  
   \commondummyword\sub              {}%  
   \commondummyword\sup              {}%  
   \commondummyword\textdegree       {o}%  
 }  }
   
 \let\indexlbrace\relax  \let\indexlbrace\relax
Line 5023  $$% Line 5060  $$%
 \catcode`\-=13  \catcode`\-=13
 \catcode`\`=13  \catcode`\`=13
   \gdef\indexnonalnumdisappear{%    \gdef\indexnonalnumdisappear{%
     \ifflagclear{txiindexlquoteignore}{}{%      \expandafter\ifx\csname SETtxiindexlquoteignore\endcsname\relax\else
       % @set txiindexlquoteignore makes us ignore left quotes in the sort term.        % @set txiindexlquoteignore makes us ignore left quotes in the sort term.
       % (Introduced for FSFS 2nd ed.)        % (Introduced for FSFS 2nd ed.)
       \let`=\empty        \let`=\empty
     }%      \fi
     %      %
     \ifflagclear{txiindexbackslashignore}{}{%      \expandafter\ifx\csname SETtxiindexbackslashignore\endcsname\relax\else
       \backslashdisappear        \backslashdisappear
     }%      \fi
     \ifflagclear{txiindexhyphenignore}{}{%      %
       \expandafter\ifx\csname SETtxiindexhyphenignore\endcsname\relax\else
       \def-{}%        \def-{}%
     }%      \fi
     \ifflagclear{txiindexlessthanignore}{}{%      \expandafter\ifx\csname SETtxiindexlessthanignore\endcsname\relax\else
       \def<{}%        \def<{}%
     }%      \fi
     \ifflagclear{txiindexatsignignore}{}{%      \expandafter\ifx\csname SETtxiindexatsignignore\endcsname\relax\else
       \def\@{}%        \def\@{}%
     }%      \fi
   }    }
   
   \gdef\indexnonalnumreappear{%    \gdef\indexnonalnumreappear{%
Line 5056  $$% Line 5094  $$%
 % would be for a given command (usually its argument).  % would be for a given command (usually its argument).
 %  %
 \def\indexnofonts{%  \def\indexnofonts{%
   \indexnofontstrue    % Accent commands should become @asis.
     \def\commondummyaccent##1{\let##1\asis}%
     % We can just ignore other control letters.
     \def\commondummyletter##1{\let##1\empty}%
     % All control words become @asis by default; overrides below.
     \let\commondummyword\commondummyaccent
     \commondummiesnofonts
     %
     % Don't no-op \tt, since it isn't a user-level command
     % and is used in the definitions of the active chars like <, >, |, etc.
     % Likewise with the other plain tex font commands.
     %\let\tt=\asis
   %    %
   \def\ { }%    \def\ { }%
   \def\@{@}%    \def\@{@}%
Line 5068  $$% Line 5117  $$%
   \let\lbracechar\{%    \let\lbracechar\{%
   \let\rbracechar\}%    \let\rbracechar\}%
   %    %
     % Non-English letters.
     \def\AA{AA}%
     \def\AE{AE}%
     \def\DH{DZZ}%
     \def\L{L}%
     \def\OE{OE}%
     \def\O{O}%
     \def\TH{TH}%
     \def\aa{aa}%
     \def\ae{ae}%
     \def\dh{dzz}%
     \def\exclamdown{!}%
     \def\l{l}%
     \def\oe{oe}%
     \def\ordf{a}%
     \def\ordm{o}%
     \def\o{o}%
     \def\questiondown{?}%
     \def\ss{ss}%
     \def\th{th}%
     %
     \def\LaTeX{LaTeX}%
     \def\TeX{TeX}%
     %
     % Assorted special characters.  \defglyph gives the control sequence a
     % definition that removes the {} that follows its use.
     \defglyph\atchar{@}%
     \defglyph\arrow{->}%
     \defglyph\bullet{bullet}%
     \defglyph\comma{,}%
     \defglyph\copyright{copyright}%
     \defglyph\dots{...}%
     \defglyph\enddots{...}%
     \defglyph\equiv{==}%
     \defglyph\error{error}%
     \defglyph\euro{euro}%
     \defglyph\expansion{==>}%
     \defglyph\geq{>=}%
     \defglyph\guillemetleft{<<}%
     \defglyph\guillemetright{>>}%
     \defglyph\guilsinglleft{<}%
     \defglyph\guilsinglright{>}%
     \defglyph\leq{<=}%
     \defglyph\lbracechar{\{}%
     \defglyph\minus{-}%
     \defglyph\point{.}%
     \defglyph\pounds{pounds}%
     \defglyph\print{-|}%
     \defglyph\quotedblbase{"}%
     \defglyph\quotedblleft{"}%
     \defglyph\quotedblright{"}%
     \defglyph\quoteleft{`}%
     \defglyph\quoteright{'}%
     \defglyph\quotesinglbase{,}%
     \defglyph\rbracechar{\}}%
     \defglyph\registeredsymbol{R}%
     \defglyph\result{=>}%
     \defglyph\textdegree{o}%
   %    %
   % We need to get rid of all macros, leaving only the arguments (if present).    % We need to get rid of all macros, leaving only the arguments (if present).
   % Of course this is not nearly correct, but it is the best we can do for now.    % Of course this is not nearly correct, but it is the best we can do for now.
     % makeinfo does not expand macros in the argument to @deffn, which ends up
     % writing an index entry, and texindex isn't prepared for an index sort entry
     % that starts with \.
   %    %
   % Since macro invocations are followed by braces, we can just redefine them    % Since macro invocations are followed by braces, we can just redefine them
   % to take a single TeX argument.  The case of a macro invocation that    % to take a single TeX argument.  The case of a macro invocation that
   % goes to end-of-line is not handled.    % goes to end-of-line is not handled.
   %    %
   \def\commondummyword##1{\let##1\asis}%  
   \macrolist    \macrolist
   \let\value\indexnofontsvalue    \let\value\indexnofontsvalue
 }  }
   \def\defglyph#1#2{\def#1##1{#2}} % see above
   
   
   
Line 5098  $$% Line 5208  $$%
   \fi    \fi
 }  }
   
 % Same as \doind, but for code indices  
 \def\docind#1#2{%  
   \iflinks  
   {%  
     %  
     \requireopenindexfile{#1}%  
     \edef\writeto{\csname#1indfile\endcsname}%  
     %  
     \def\indextext{#2}%  
     \safewhatsit\docindwrite  
   }%  
   \fi  
 }  
   
 % Check if an index file has been opened, and if not, open it.  % Check if an index file has been opened, and if not, open it.
 \def\requireopenindexfile#1{%  \def\requireopenindexfile#1{%
 \ifnum\csname #1indfile\endcsname=0  \ifnum\csname #1indfile\endcsname=0
Line 5178  $$% Line 5274  $$%
     % trim spaces.      % trim spaces.
     \edef\trimmed{\segment}%      \edef\trimmed{\segment}%
     \edef\trimmed{\expandafter\eatspaces\expandafter{\trimmed}}%      \edef\trimmed{\expandafter\eatspaces\expandafter{\trimmed}}%
     \ifincodeindex  
       \edef\trimmed{\noexpand\code{\trimmed}}%  
     \fi  
     %      %
     \xdef\bracedtext{\bracedtext{\trimmed}}%      \xdef\bracedtext{\bracedtext{\trimmed}}%
     %      %
Line 5211  $$% Line 5304  $$%
         \xdef\trimmed{\segment}%          \xdef\trimmed{\segment}%
         \xdef\trimmed{\expandafter\eatspaces\expandafter{\trimmed}}%          \xdef\trimmed{\expandafter\eatspaces\expandafter{\trimmed}}%
         \xdef\indexsortkey{\trimmed}%          \xdef\indexsortkey{\trimmed}%
         \ifx\indexsortkey\empty          \ifx\indexsortkey\empty\xdef\indexsortkey{ }\fi
           \message{Empty index sort key near line \the\inputlineno}%  
           \xdef\indexsortkey{ }%  
         \fi  
       }\fi        }\fi
       %        %
       % Append to \fullindexsortkey.        % Append to \fullindexsortkey.
Line 5238  $$% Line 5328  $$%
 % the current value of \escapechar.  % the current value of \escapechar.
 \def\escapeisbackslash{\escapechar=`\\}  \def\escapeisbackslash{\escapechar=`\\}
   
 % Uncomment to use \ in index files by default.  Old texi2dvi (before 2019)  % Use \ in index files by default.  texi2dvi didn't support @ as the escape
 % didn't support @ as the escape character (as it checked for "\entry" in  % character (as it checked for "\entry" in the files, and not "@entry").  When
 % the files, and not "@entry").  % the new version of texi2dvi has had a chance to become more prevalent, then
 %   In the future we can remove this flag and simplify the code for  % the escape character can change back to @ again.  This should be an easy
 % index files and backslashes, once the support is no longer likely to be  % change to make now because both @ and \ are only used as escape characters in
 % useful.  % index files, never standing for themselves.
 %  %
 % \set txiindexescapeisbackslash  \set txiindexescapeisbackslash
   
 % Write the entry in \indextext to the index file.  % Write the entry in \indextext to the index file.
 %  %
   \def\doindwrite{%
 \newif\ifincodeindex  
 \def\doindwrite{\incodeindexfalse\doindwritex}  
 \def\docindwrite{\incodeindextrue\doindwritex}  
   
 \def\doindwritex{%  
   \maybemarginindex    \maybemarginindex
   %    %
   \atdummies    \atdummies
   %    %
   \ifflagclear{txiindexescapeisbackslash}{}{\escapeisbackslash}%    \expandafter\ifx\csname SETtxiindexescapeisbackslash\endcsname\relax\else
       \escapeisbackslash
     \fi
   %    %
   % For texindex which always views { and } as separators.    % For texindex which always views { and } as separators.
   \def\{{\lbracechar{}}%    \def\{{\lbracechar{}}%
Line 5443  $$% Line 5530  $$%
 % old index files using \ as the escape character.  Reading this would  % old index files using \ as the escape character.  Reading this would
 % at best lead to typesetting garbage, at worst a TeX syntax error.  % at best lead to typesetting garbage, at worst a TeX syntax error.
 \def\printindexzz#1#2\finish{%  \def\printindexzz#1#2\finish{%
   \ifflagclear{txiindexescapeisbackslash}{%    \expandafter\ifx\csname SETtxiindexescapeisbackslash\endcsname\relax
     \uccode`\~=`\\ \uppercase{\if\noexpand~}\noexpand#1      \uccode`\~=`\\ \uppercase{\if\noexpand~}\noexpand#1
       \ifflagclear{txiskipindexfileswithbackslash}{%        \expandafter\ifx\csname SETtxiskipindexfileswithbackslash\endcsname\relax
 \errmessage{%  \errmessage{%
 ERROR: A sorted index file in an obsolete format was skipped.  ERROR: A sorted index file in an obsolete format was skipped.
 To fix this problem, please upgrade your version of 'texi2dvi'  To fix this problem, please upgrade your version of 'texi2dvi'
Line 5461  this, Texinfo will try to use index file Line 5548  this, Texinfo will try to use index file
 If you continue to have problems, deleting the index files and starting again  If you continue to have problems, deleting the index files and starting again
 might help (with 'rm \jobname.?? \jobname.??s')%  might help (with 'rm \jobname.?? \jobname.??s')%
 }%  }%
       }{%        \else
         (Skipped sorted index file in obsolete format)          (Skipped sorted index file in obsolete format)
       }%        \fi
     \else      \else
       \begindoublecolumns        \begindoublecolumns
       \input \jobname.\indexname s        \input \jobname.\indexname s
       \enddoublecolumns        \enddoublecolumns
     \fi      \fi
   }{%    \else
     \begindoublecolumns      \begindoublecolumns
     \catcode`\\=0\relax      \catcode`\\=0\relax
     %      \catcode`\@=12\relax
     % Make @ an escape character to give macros a chance to work.  This  
     % should work because we (hopefully) don't otherwise use @ in index files.  
     %\catcode`\@=12\relax  
     \catcode`\@=0\relax  
     \input \jobname.\indexname s      \input \jobname.\indexname s
     \enddoublecolumns      \enddoublecolumns
   }%    \fi
 }  }
   
 % These macros are used by the sorted index file itself.  % These macros are used by the sorted index file itself.
Line 5554  might help (with 'rm \jobname.?? \jobnam Line 5637  might help (with 'rm \jobname.?? \jobnam
 \newdimen\entryrightmargin  \newdimen\entryrightmargin
 \entryrightmargin=0pt  \entryrightmargin=0pt
   
 % amount to indent subsequent lines in an entry when it spans more than  
 % one line.  
 \newdimen\entrycontskip  
 \entrycontskip=1em  
   
 % for PDF output, whether to make the text of the entry a link to the page  
 % number.  set for @contents and @shortcontents where there is only one  
 % page number.  
 \newif\iflinkentrytext  
   
 % \entry typesets a paragraph consisting of the text (#1), dot leaders, and  % \entry typesets a paragraph consisting of the text (#1), dot leaders, and
 % then page number (#2) flushed to the right margin.  It is used for index  % then page number (#2) flushed to the right margin.  It is used for index
 % and table of contents entries.  The paragraph is indented by \leftskip.  % and table of contents entries.  The paragraph is indented by \leftskip.
Line 5590  might help (with 'rm \jobname.?? \jobnam Line 5663  might help (with 'rm \jobname.?? \jobnam
 }  }
 \def\entrybreak{\unskip\space\ignorespaces}%  \def\entrybreak{\unskip\space\ignorespaces}%
 \def\doentry{%  \def\doentry{%
     % Save the text of the entry in \boxA      % Save the text of the entry
     \global\setbox\boxA=\hbox\bgroup      \global\setbox\boxA=\hbox\bgroup
     \bgroup % Instead of the swallowed brace.      \bgroup % Instead of the swallowed brace.
       \noindent        \noindent
Line 5600  might help (with 'rm \jobname.?? \jobnam Line 5673  might help (with 'rm \jobname.?? \jobnam
       % with catcodes occurring.        % with catcodes occurring.
 }  }
 {\catcode`\@=11  {\catcode`\@=11
 % #1 is the page number  
 \gdef\finishentry#1{%  \gdef\finishentry#1{%
     \egroup % end \boxA      \egroup % end box A
     \dimen@ = \wd\boxA % Length of text of entry      \dimen@ = \wd\boxA % Length of text of entry
     % add any leaders and page number to \boxA.  
     \global\setbox\boxA=\hbox\bgroup      \global\setbox\boxA=\hbox\bgroup
       \ifpdforxetex        \unhbox\boxA
         \iflinkentrytext        % #1 is the page number.
           \pdflinkpage{#1}{\unhbox\boxA}%  
         \else  
           \unhbox\boxA  
         \fi  
       \else  
         \unhbox\boxA  
       \fi  
       %        %
       % Get the width of the page numbers, and only use        % Get the width of the page numbers, and only use
       % leaders if they are present.        % leaders if they are present.
Line 5633  might help (with 'rm \jobname.?? \jobnam Line 5697  might help (with 'rm \jobname.?? \jobnam
         \fi          \fi
       \fi        \fi
     \egroup % end \boxA      \egroup % end \boxA
     %  
     % now output  
     \ifdim\wd\boxB = 0pt      \ifdim\wd\boxB = 0pt
       \noindent\unhbox\boxA\par        \noindent\unhbox\boxA\par
       \nobreak        \nobreak
Line 5652  might help (with 'rm \jobname.?? \jobnam Line 5714  might help (with 'rm \jobname.?? \jobnam
       \parfillskip=0pt plus -1fill        \parfillskip=0pt plus -1fill
       %        %
       \advance\rightskip by \entryrightmargin        \advance\rightskip by \entryrightmargin
         % Determine how far we can stretch into the margin.
         % This allows, e.g., "Appendix H  GNU Free Documentation License" to
         % fit on one line in @letterpaper format.
         \ifdim\entryrightmargin>2.1em
           \dimen@i=2.1em
         \else
           \dimen@i=0em
         \fi
         \advance \parfillskip by 0pt minus 1\dimen@i
       %        %
       \dimen@ii = \hsize        \dimen@ii = \hsize
       \advance\dimen@ii by -1\leftskip        \advance\dimen@ii by -1\leftskip
       \advance\dimen@ii by -1\entryrightmargin        \advance\dimen@ii by -1\entryrightmargin
         \advance\dimen@ii by 1\dimen@i
       \ifdim\wd\boxA > \dimen@ii % If the entry doesn't fit in one line        \ifdim\wd\boxA > \dimen@ii % If the entry doesn't fit in one line
       \ifdim\dimen@ > 0.8\dimen@ii   % due to long index text        \ifdim\dimen@ > 0.8\dimen@ii   % due to long index text
           % Try to split the text roughly evenly.  \dimen@ will be the length of
           % the first line.
           \dimen@ = 0.7\dimen@
           \dimen@ii = \hsize
           \ifnum\dimen@>\dimen@ii
             % If the entry is too long (for example, if it needs more than
             % two lines), use all the space in the first line.
             \dimen@ = \dimen@ii
           \fi
         \advance\leftskip by 0pt plus 1fill % ragged right          \advance\leftskip by 0pt plus 1fill % ragged right
           \advance \dimen@ by 1\rightskip
           \parshape = 2 0pt \dimen@ 0em \dimen@ii
           % Ideally we'd add a finite glue at the end of the first line only,
           % instead of using \parshape with explicit line lengths, but TeX
           % doesn't seem to provide a way to do such a thing.
         %          %
         % Indent all lines but the first one.          % Indent all lines but the first one.
         \advance\leftskip by \entrycontskip          \advance\leftskip by 1em
         \advance\parindent by -\entrycontskip          \advance\parindent by -1em
       \fi\fi        \fi\fi
       \indent % start paragraph        \indent % start paragraph
       \unhbox\boxA        \unhbox\boxA
Line 5685  might help (with 'rm \jobname.?? \jobnam Line 5771  might help (with 'rm \jobname.?? \jobnam
 \newskip\thinshrinkable  \newskip\thinshrinkable
 \skip\thinshrinkable=.15em minus .15em  \skip\thinshrinkable=.15em minus .15em
   
 % Like plain.tex's \dotfill, except uses up at least 0.5 em.  % Like plain.tex's \dotfill, except uses up at least 1 em.
 % The filll stretch here overpowers both the fil and fill stretch to push  % The filll stretch here overpowers both the fil and fill stretch to push
 % the page number to the right.  % the page number to the right.
 \def\indexdotfill{\cleaders  \def\indexdotfill{\cleaders
   \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 0.5em plus 1filll}    \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1filll}
   
   
 \def\primary #1{\line{#1\hfil}}  \def\primary #1{\line{#1\hfil}}
   
Line 5742  might help (with 'rm \jobname.?? \jobnam Line 5829  might help (with 'rm \jobname.?? \jobnam
   % below is chosen so that the gutter has the same value (well, +-<1pt)    % below is chosen so that the gutter has the same value (well, +-<1pt)
   % as it did when we hard-coded it.    % as it did when we hard-coded it.
   %    %
   % We put the result in a separate register, \doublecolumnhsize, so we    % We put the result in a separate register, \doublecolumhsize, so we
   % can restore it in \pagesofar, after \hsize itself has (potentially)    % can restore it in \pagesofar, after \hsize itself has (potentially)
   % been clobbered.    % been clobbered.
   %    %
Line 5911  might help (with 'rm \jobname.?? \jobnam Line 5998  might help (with 'rm \jobname.?? \jobnam
 % Chapters, sections, etc.  % Chapters, sections, etc.
   
 % Let's start with @part.  % Let's start with @part.
 \parseargdef\part{\partzzz{#1}}  \outer\parseargdef\part{\partzzz{#1}}
 \def\partzzz#1{%  \def\partzzz#1{%
   \chapoddpage    \chapoddpage
   \null    \null
Line 6137  might help (with 'rm \jobname.?? \jobnam Line 6224  might help (with 'rm \jobname.?? \jobnam
 % normally unnmhead0 calls unnumberedzzz:  % normally unnmhead0 calls unnumberedzzz:
 \outer\parseargdef\unnumbered{\unnmhead0{#1}}  \outer\parseargdef\unnumbered{\unnmhead0{#1}}
 \def\unnumberedzzz#1{%  \def\unnumberedzzz#1{%
   \global\advance\unnumberedno by 1    \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
       \global\advance\unnumberedno by 1
   %    %
   % Since an unnumbered has no number, no prefix for figures.    % Since an unnumbered has no number, no prefix for figures.
   \global\let\chaplevelprefix = \empty    \global\let\chaplevelprefix = \empty
Line 6193  might help (with 'rm \jobname.?? \jobnam Line 6281  might help (with 'rm \jobname.?? \jobnam
 % normally calls unnumberedseczzz:  % normally calls unnumberedseczzz:
 \outer\parseargdef\unnumberedsec{\unnmhead1{#1}}  \outer\parseargdef\unnumberedsec{\unnmhead1{#1}}
 \def\unnumberedseczzz#1{%  \def\unnumberedseczzz#1{%
   \global\advance\unnumberedno by 1    \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
   \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno}%    \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}%
 }  }
   
 % Subsections.  % Subsections.
Line 6217  might help (with 'rm \jobname.?? \jobnam Line 6305  might help (with 'rm \jobname.?? \jobnam
 % normally calls unnumberedsubseczzz:  % normally calls unnumberedsubseczzz:
 \outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}}  \outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}}
 \def\unnumberedsubseczzz#1{%  \def\unnumberedsubseczzz#1{%
   \global\advance\unnumberedno by 1    \global\subsubsecno=0  \global\advance\subsecno by 1
   \sectionheading{#1}{subsec}{Ynothing}{\the\unnumberedno}%    \sectionheading{#1}{subsec}{Ynothing}%
                    {\the\unnumberedno.\the\secno.\the\subsecno}%
 }  }
   
 % Subsubsections.  % Subsubsections.
Line 6242  might help (with 'rm \jobname.?? \jobnam Line 6331  might help (with 'rm \jobname.?? \jobnam
 % normally unnumberedsubsubseczzz:  % normally unnumberedsubsubseczzz:
 \outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}}  \outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}}
 \def\unnumberedsubsubseczzz#1{%  \def\unnumberedsubsubseczzz#1{%
   \global\advance\unnumberedno by 1    \global\advance\subsubsecno by 1
   \sectionheading{#1}{subsubsec}{Ynothing}{\the\unnumberedno}%    \sectionheading{#1}{subsubsec}{Ynothing}%
                    {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}%
 }  }
   
 % These macros control what the section commands do, according  % These macros control what the section commands do, according
Line 6306  might help (with 'rm \jobname.?? \jobnam Line 6396  might help (with 'rm \jobname.?? \jobnam
   \fi    \fi
 }  }
   
 \parseargdef\setchapternewpage{\csname CHAPPAG#1\endcsname\HEADINGSon}  \parseargdef\setchapternewpage{\csname CHAPPAG#1\endcsname}
   
 \def\CHAPPAGoff{%  \def\CHAPPAGoff{%
 \global\let\contentsalignmacro = \chappager  \global\let\contentsalignmacro = \chappager
 \global\let\pchapsepmacro=\chapbreak  \global\let\pchapsepmacro=\chapbreak
 \global\def\HEADINGSon{\HEADINGSsinglechapoff}}  \global\let\pagealignmacro=\chappager}
   
 \def\CHAPPAGon{%  \def\CHAPPAGon{%
 \global\let\contentsalignmacro = \chappager  \global\let\contentsalignmacro = \chappager
 \global\let\pchapsepmacro=\chappager  \global\let\pchapsepmacro=\chappager
   \global\let\pagealignmacro=\chappager
 \global\def\HEADINGSon{\HEADINGSsingle}}  \global\def\HEADINGSon{\HEADINGSsingle}}
   
 \def\CHAPPAGodd{%  \def\CHAPPAGodd{%
 \global\let\contentsalignmacro = \chapoddpage  \global\let\contentsalignmacro = \chapoddpage
 \global\let\pchapsepmacro=\chapoddpage  \global\let\pchapsepmacro=\chapoddpage
   \global\let\pagealignmacro=\chapoddpage
 \global\def\HEADINGSon{\HEADINGSdouble}}  \global\def\HEADINGSon{\HEADINGSdouble}}
   
 \setchapternewpage on  \CHAPPAGon
   
 % \chapmacro - Chapter opening.  % \chapmacro - Chapter opening.
 %  %
Line 6336  might help (with 'rm \jobname.?? \jobnam Line 6428  might help (with 'rm \jobname.?? \jobnam
 \def\Yappendixkeyword{Yappendix}  \def\Yappendixkeyword{Yappendix}
 \def\Yomitfromtockeyword{Yomitfromtoc}  \def\Yomitfromtockeyword{Yomitfromtoc}
 %  %
 %  
 % Definitions for @thischapter. These can be overridden in translation  
 % files.  
 \def\thischapterAppendix{%  
   \putwordAppendix{} \thischapternum: \thischaptername}  
   
 \def\thischapterChapter{%  
   \putwordChapter{} \thischapternum: \thischaptername}  
 %  
 %  
 \def\chapmacro#1#2#3{%  \def\chapmacro#1#2#3{%
   \expandafter\ifx\thisenv\titlepage\else    \expandafter\ifx\thisenv\titlepage\else
     \checkenv{}% chapters, etc., should not start inside an environment.      \checkenv{}% chapters, etc., should not start inside an environment.
Line 6368  might help (with 'rm \jobname.?? \jobnam Line 6450  might help (with 'rm \jobname.?? \jobnam
     \xdef\currentchapterdefs{%      \xdef\currentchapterdefs{%
       \gdef\noexpand\thischaptername{\the\toks0}%        \gdef\noexpand\thischaptername{\the\toks0}%
       \gdef\noexpand\thischapternum{\appendixletter}%        \gdef\noexpand\thischapternum{\appendixletter}%
       \let\noexpand\thischapter\noexpand\thischapterAppendix        % \noexpand\putwordAppendix avoids expanding indigestible
         % commands in some of the translations.
         \gdef\noexpand\thischapter{\noexpand\putwordAppendix{}
                                    \noexpand\thischapternum:
                                    \noexpand\thischaptername}%
     }%      }%
   \else    \else
     \toks0={#1}%      \toks0={#1}%
     \xdef\currentchapterdefs{%      \xdef\currentchapterdefs{%
       \gdef\noexpand\thischaptername{\the\toks0}%        \gdef\noexpand\thischaptername{\the\toks0}%
       \gdef\noexpand\thischapternum{\the\chapno}%        \gdef\noexpand\thischapternum{\the\chapno}%
       \let\noexpand\thischapter\noexpand\thischapterChapter        % \noexpand\putwordChapter avoids expanding indigestible
         % commands in some of the translations.
         \gdef\noexpand\thischapter{\noexpand\putwordChapter{}
                                    \noexpand\thischapternum:
                                    \noexpand\thischaptername}%
     }%      }%
   \fi\fi\fi    \fi\fi\fi
   %    %
Line 6461  might help (with 'rm \jobname.?? \jobnam Line 6551  might help (with 'rm \jobname.?? \jobnam
 \def\subsubsecheadingskip{\subsecheadingskip}  \def\subsubsecheadingskip{\subsecheadingskip}
 \def\subsubsecheadingbreak{\subsecheadingbreak}  \def\subsubsecheadingbreak{\subsecheadingbreak}
   
 % Definition for @thissection. This can be overridden in translation  
 % files.  
 \def\thissectionDef{%  
   \putwordSection{} \thissectionnum: \thissectionname}  
 %  
   
   
 % Print any size, any type, section title.  % Print any size, any type, section title.
 %  %
Line 6508  might help (with 'rm \jobname.?? \jobnam Line 6592  might help (with 'rm \jobname.?? \jobnam
         \xdef\currentsectiondefs{%          \xdef\currentsectiondefs{%
           \gdef\noexpand\thissectionname{\the\toks0}%            \gdef\noexpand\thissectionname{\the\toks0}%
           \gdef\noexpand\thissectionnum{#4}%            \gdef\noexpand\thissectionnum{#4}%
           \let\noexpand\thissection\noexpand\thissectionDef            % \noexpand\putwordSection avoids expanding indigestible
             % commands in some of the translations.
             \gdef\noexpand\thissection{\noexpand\putwordSection{}
                                        \noexpand\thissectionnum:
                                        \noexpand\thissectionname}%
         }%          }%
       \fi        \fi
     \else      \else
Line 6517  might help (with 'rm \jobname.?? \jobnam Line 6605  might help (with 'rm \jobname.?? \jobnam
         \xdef\currentsectiondefs{%          \xdef\currentsectiondefs{%
           \gdef\noexpand\thissectionname{\the\toks0}%            \gdef\noexpand\thissectionname{\the\toks0}%
           \gdef\noexpand\thissectionnum{#4}%            \gdef\noexpand\thissectionnum{#4}%
           \let\noexpand\thissection\noexpand\thissectionDef            % \noexpand\putwordSection avoids expanding indigestible
             % commands in some of the translations.
             \gdef\noexpand\thissection{\noexpand\putwordSection{}
                                        \noexpand\thissectionnum:
                                        \noexpand\thissectionname}%
         }%          }%
       \fi        \fi
     \fi\fi\fi      \fi\fi\fi
Line 6677  might help (with 'rm \jobname.?? \jobnam Line 6769  might help (with 'rm \jobname.?? \jobnam
   \input \tocreadfilename    \input \tocreadfilename
 }  }
   
 % process toc file to find the maximum width of the section numbers for  
 % each chapter  
 \def\findsecnowidths{%  
   \begingroup  
   \setupdatafile  
   \activecatcodes  
   \secentryfonts  
   % Redefinitions  
   \def\numchapentry##1##2##3##4{%  
     \def\curchapname{secnowidth-##2}%  
     \curchapmax=0pt  
   }%  
   \let\appentry\numchapentry  
   %  
   \def\numsecentry##1##2##3##4{%  
     \def\cursecname{secnowidth-##2}%  
     \cursecmax=0pt  
     %  
     \setbox0=\hbox{##2}%  
     \ifdim\wd0>\curchapmax  
       \curchapmax=\wd0  
       \expandafter\xdef\csname\curchapname\endcsname{\the\wd0}%  
     \fi  
   }%  
   \let\appsecentry\numsecentry  
   %  
   \def\numsubsecentry##1##2##3##4{%  
     \def\curssecname{secnowidth-##2}%  
     \curssecmax=0pt  
     %  
     \setbox0=\hbox{##2}%  
     \ifdim\wd0>\cursecmax  
       \cursecmax=\wd0  
       \expandafter\xdef\csname\cursecname\endcsname{\the\wd0}%  
     \fi  
   }%  
   \let\appsubsecentry\numsubsecentry  
   %  
   \def\numsubsubsecentry##1##2##3##4{%  
     \setbox0=\hbox{##2}%  
     \ifdim\wd0>\curssecmax  
       \curssecmax=\wd0  
       \expandafter\xdef\csname\curssecname\endcsname{\the\wd0}%  
     \fi  
   }%  
   \let\appsubsubsecentry\numsubsubsecentry  
   %  
   % Discard any output by outputting to dummy vbox, in case the toc file  
   % contains macros that we have not redefined above.  
   \setbox\dummybox\vbox\bgroup  
     \input \tocreadfilename\relax  
   \egroup  
   \endgroup  
 }  
 \newdimen\curchapmax  
 \newdimen\cursecmax  
 \newdimen\curssecmax  
   
   
 % set #1 to the maximum section width for #2  
 \def\retrievesecnowidth#1#2{%  
   \expandafter\let\expandafter\savedsecnowidth \csname secnowidth-#2\endcsname  
   \ifx\savedsecnowidth\relax  
     #1=0pt  
   \else  
     #1=\savedsecnowidth  
   \fi  
 }  
 \newdimen\secnowidthchap  
 \secnowidthchap=0pt  
 \newdimen\secnowidthsec  
 \secnowidthsec=0pt  
 \newdimen\secnowidthssec  
 \secnowidthssec=0pt  
   
   
 \newskip\contentsrightmargin \contentsrightmargin=1in  \newskip\contentsrightmargin \contentsrightmargin=1in
 \newcount\savepageno  \newcount\savepageno
 \newcount\lastnegativepageno \lastnegativepageno = -1  \newcount\lastnegativepageno \lastnegativepageno = -1
Line 6761  might help (with 'rm \jobname.?? \jobnam Line 6777  might help (with 'rm \jobname.?? \jobnam
 %  %
 \def\startcontents#1{%  \def\startcontents#1{%
   % If @setchapternewpage on, and @headings double, the contents should    % If @setchapternewpage on, and @headings double, the contents should
   % start on an odd page, unlike chapters.    % start on an odd page, unlike chapters.  Thus, we maintain
     % \contentsalignmacro in parallel with \pagealignmacro.
     % From: Torbjorn Granlund <tege@matematik.su.se>
   \contentsalignmacro    \contentsalignmacro
   \immediate\closeout\tocfile    \immediate\closeout\tocfile
   %    %
Line 6776  might help (with 'rm \jobname.?? \jobnam Line 6794  might help (with 'rm \jobname.?? \jobnam
     %      %
     % Roman numerals for page numbers.      % Roman numerals for page numbers.
     \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi      \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi
     \def\thistitle{}% no title in double-sided headings  
     % Record where the Roman numerals started.  
     \ifnum\romancount=0 \global\romancount=\pagecount \fi  
     \linkentrytexttrue  
 }  }
   
 % \raggedbottom in plain.tex hardcodes \topskip so override it  
 \catcode`\@=11  
 \def\raggedbottom{\advance\topskip by 0pt plus60pt \r@ggedbottomtrue}  
 \catcode`\@=\other  
   
 % redefined for the two-volume lispref.  We always output on  % redefined for the two-volume lispref.  We always output on
 % \jobname.toc even if this is redefined.  % \jobname.toc even if this is redefined.
 %  %
Line 6798  might help (with 'rm \jobname.?? \jobnam Line 6807  might help (with 'rm \jobname.?? \jobnam
   \startcontents{\putwordTOC}%    \startcontents{\putwordTOC}%
     \openin 1 \tocreadfilename\space      \openin 1 \tocreadfilename\space
     \ifeof 1 \else      \ifeof 1 \else
       \findsecnowidths  
       \readtocfile        \readtocfile
     \fi      \fi
     \vfill \eject      \vfill \eject
Line 6808  might help (with 'rm \jobname.?? \jobnam Line 6816  might help (with 'rm \jobname.?? \jobnam
     \fi      \fi
     \closein 1      \closein 1
   \endgroup    \endgroup
   \contentsendroman    \lastnegativepageno = \pageno
     \global\pageno = \savepageno
 }  }
   
 % And just the chapters.  % And just the chapters.
Line 6826  might help (with 'rm \jobname.?? \jobnam Line 6835  might help (with 'rm \jobname.?? \jobnam
     \rm      \rm
     \hyphenpenalty = 10000      \hyphenpenalty = 10000
     \advance\baselineskip by 1pt % Open it up a little.      \advance\baselineskip by 1pt % Open it up a little.
     \extrasecnoskip=0.4pt  
     \def\numsecentry##1##2##3##4{}      \def\numsecentry##1##2##3##4{}
     \let\appsecentry = \numsecentry      \let\appsecentry = \numsecentry
     \let\unnsecentry = \numsecentry      \let\unnsecentry = \numsecentry
Line 6844  might help (with 'rm \jobname.?? \jobnam Line 6852  might help (with 'rm \jobname.?? \jobnam
     \vfill \eject      \vfill \eject
     \contentsalignmacro % in case @setchapternewpage odd is in effect      \contentsalignmacro % in case @setchapternewpage odd is in effect
   \endgroup    \endgroup
   \contentsendroman  
 }  
 \let\shortcontents = \summarycontents  
   
 % Get ready to use Arabic numerals again  
 \def\contentsendroman{%  
   \lastnegativepageno = \pageno    \lastnegativepageno = \pageno
   \global\pageno=1    \global\pageno = \savepageno
   \contentsendcount = \pagecount  
 }  }
   \let\shortcontents = \summarycontents
   
 % Typeset the label for a chapter or appendix for the short contents.  % Typeset the label for a chapter or appendix for the short contents.
 % The arg is, e.g., `A' for an appendix, or `3' for a chapter.  % The arg is, e.g., `A' for an appendix, or `3' for a chapter.
Line 6862  might help (with 'rm \jobname.?? \jobnam Line 6864  might help (with 'rm \jobname.?? \jobnam
   % This space should be enough, since a single number is .5em, and the    % This space should be enough, since a single number is .5em, and the
   % widest letter (M) is 1em, at least in the Computer Modern fonts.    % widest letter (M) is 1em, at least in the Computer Modern fonts.
   % But use \hss just in case.    % But use \hss just in case.
     % (This space doesn't include the extra space that gets added after
     % the label; that gets put in by \shortchapentry above.)
   %    %
   % We'd like to right-justify chapter numbers, but that looks strange    % We'd like to right-justify chapter numbers, but that looks strange
   % with appendix letters.  And right-justifying numbers and    % with appendix letters.  And right-justifying numbers and
Line 6871  might help (with 'rm \jobname.?? \jobnam Line 6875  might help (with 'rm \jobname.?? \jobnam
   \hbox to 1em{#1\hss}%    \hbox to 1em{#1\hss}%
 }  }
   
 % These macros generate individual entries in the table of contents,  % These macros generate individual entries in the table of contents.
 % and are read in from the *.toc file.  % The first argument is the chapter or section name.
 %  % The last argument is the page number.
 % The arguments are like:  % The arguments in between are the chapter number, section number, ...
 % \def\numchapentry#1#2#3#4  
 %   #1 - the chapter or section name.  
 %   #2 - section number  
 %   #3 - level of section (e.g "chap", "sec")  
 %   #4 - page number  
   
 % Parts, in the main contents.  Replace the part number, which doesn't  % Parts, in the main contents.  Replace the part number, which doesn't
 % exist, with an empty box.  Let's hope all the numbers have the same width.  % exist, with an empty box.  Let's hope all the numbers have the same width.
Line 6892  might help (with 'rm \jobname.?? \jobnam Line 6891  might help (with 'rm \jobname.?? \jobnam
   \vskip 0pt plus 5\baselineskip    \vskip 0pt plus 5\baselineskip
   \penalty-300    \penalty-300
   \vskip 0pt plus -5\baselineskip    \vskip 0pt plus -5\baselineskip
   \dochapentry{#1}{\numeralbox}{}%    \dochapentry{\numeralbox\labelspace#1}{}%
 }  }
 %  %
 % Parts, in the short toc.  % Parts, in the short toc.
Line 6903  might help (with 'rm \jobname.?? \jobnam Line 6902  might help (with 'rm \jobname.?? \jobnam
 }  }
   
 % Chapters, in the main contents.  % Chapters, in the main contents.
 \def\numchapentry#1#2#3#4{%  \def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}}
   \retrievesecnowidth\secnowidthchap{#2}%  
   \dochapentry{#1}{#2}{#4}%  
 }  
   
 % Chapters, in the short toc.  % Chapters, in the short toc.
   % See comments in \dochapentry re vbox and related settings.
 \def\shortchapentry#1#2#3#4{%  \def\shortchapentry#1#2#3#4{%
   \tocentry{#1}{\shortchaplabel{#2}}{#4}%    \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}%
 }  }
   
 % Appendices, in the main contents.  % Appendices, in the main contents.
Line 6921  might help (with 'rm \jobname.?? \jobnam Line 6918  might help (with 'rm \jobname.?? \jobnam
   \setbox0 = \hbox{\putwordAppendix{} M}%    \setbox0 = \hbox{\putwordAppendix{} M}%
   \hbox to \wd0{\putwordAppendix{} #1\hss}}    \hbox to \wd0{\putwordAppendix{} #1\hss}}
 %  %
 \def\appentry#1#2#3#4{%  \def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\hskip.7em#1}{#4}}
   \retrievesecnowidth\secnowidthchap{#2}%  
   \dochapentry{\appendixbox{#2}\hskip.7em#1}{}{#4}%  
 }  
   
 % Unnumbered chapters.  % Unnumbered chapters.
 \def\unnchapentry#1#2#3#4{\dochapentry{#1}{}{#4}}  \def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}}
 \def\shortunnchapentry#1#2#3#4{\tocentry{#1}{}{#4}}  \def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}}
   
 % Sections.  % Sections.
 \def\numsecentry#1#2#3#4{\dosecentry{#1}{#2}{#4}}  \def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}}
   
 \def\numsecentry#1#2#3#4{%  
   \retrievesecnowidth\secnowidthsec{#2}%  
   \dosecentry{#1}{#2}{#4}%  
 }  
 \let\appsecentry=\numsecentry  \let\appsecentry=\numsecentry
 \def\unnsecentry#1#2#3#4{%  \def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}}
   \retrievesecnowidth\secnowidthsec{#2}%  
   \dosecentry{#1}{}{#4}%  
 }  
   
 % Subsections.  % Subsections.
 \def\numsubsecentry#1#2#3#4{%  \def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}}
   \retrievesecnowidth\secnowidthssec{#2}%  
   \dosubsecentry{#1}{#2}{#4}%  
 }  
 \let\appsubsecentry=\numsubsecentry  \let\appsubsecentry=\numsubsecentry
 \def\unnsubsecentry#1#2#3#4{%  \def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}}
   \retrievesecnowidth\secnowidthssec{#2}%  
   \dosubsecentry{#1}{}{#4}%  
 }  
   
 % And subsubsections.  % And subsubsections.
 \def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#2}{#4}}  \def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}}
 \let\appsubsubsecentry=\numsubsubsecentry  \let\appsubsubsecentry=\numsubsubsecentry
 \def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{}{#4}}  \def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}}
   
 % This parameter controls the indentation of the various levels.  % This parameter controls the indentation of the various levels.
 % Same as \defaultparindent.  % Same as \defaultparindent.
 \newdimen\tocindent \tocindent = 15pt  \newdimen\tocindent \tocindent = 15pt
   
 % Now for the actual typesetting. In all these, #1 is the text, #2 is  % Now for the actual typesetting. In all these, #1 is the text and #2 is the
 % a section number if present, and #3 is the page number.  % page number.
 %  %
 % If the toc has to be broken over pages, we want it to be at chapters  % If the toc has to be broken over pages, we want it to be at chapters
 % if at all possible; hence the \penalty.  % if at all possible; hence the \penalty.
 \def\dochapentry#1#2#3{%  \def\dochapentry#1#2{%
    \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip     \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip
    \begingroup     \begingroup
      % Move the page numbers slightly to the right       % Move the page numbers slightly to the right
      \advance\entryrightmargin by -0.05em       \advance\entryrightmargin by -0.05em
      \chapentryfonts       \chapentryfonts
      \extrasecnoskip=0.4em % separate chapter number more       \tocentry{#1}{\dopageno\bgroup#2\egroup}%
      \tocentry{#1}{#2}{#3}%  
    \endgroup     \endgroup
    \nobreak\vskip .25\baselineskip plus.1\baselineskip     \nobreak\vskip .25\baselineskip plus.1\baselineskip
 }  }
   
 \def\dosecentry#1#2#3{\begingroup  \def\dosecentry#1#2{\begingroup
   \secnowidth=\secnowidthchap  
   \secentryfonts \leftskip=\tocindent    \secentryfonts \leftskip=\tocindent
   \tocentry{#1}{#2}{#3}%    \tocentry{#1}{\dopageno\bgroup#2\egroup}%
 \endgroup}  \endgroup}
   
 \def\dosubsecentry#1#2#3{\begingroup  \def\dosubsecentry#1#2{\begingroup
   \secnowidth=\secnowidthsec  
   \subsecentryfonts \leftskip=2\tocindent    \subsecentryfonts \leftskip=2\tocindent
   \tocentry{#1}{#2}{#3}%    \tocentry{#1}{\dopageno\bgroup#2\egroup}%
 \endgroup}  \endgroup}
   
 \def\dosubsubsecentry#1#2#3{\begingroup  \def\dosubsubsecentry#1#2{\begingroup
   \secnowidth=\secnowidthssec  
   \subsubsecentryfonts \leftskip=3\tocindent    \subsubsecentryfonts \leftskip=3\tocindent
   \tocentry{#1}{#2}{#3}%    \tocentry{#1}{\dopageno\bgroup#2\egroup}%
 \endgroup}  \endgroup}
   
 % Used for the maximum width of a section number so we can align  % We use the same \entry macro as for the index entries.
 % section titles.  \let\tocentry = \entry
 \newdimen\secnowidth  
 \secnowidth=0pt  % Space between chapter (or whatever) number and the title.
 \newdimen\extrasecnoskip  \def\labelspace{\hskip1em \relax}
 \extrasecnoskip=0pt  
   \def\dopageno#1{{\rm #1}}
 % \tocentry{TITLE}{SEC NO}{PAGE}  \def\doshortpageno#1{{\rm #1}}
 %  
 \def\tocentry#1#2#3{%  
   \def\secno{#2}%  
   \ifx\empty\secno  
     \entry{#1}{#3}%  
   \else  
     \ifdim 0pt=\secnowidth  
       \setbox0=\hbox{#2\hskip\labelspace\hskip\extrasecnoskip}%  
     \else  
       \advance\secnowidth by \labelspace  
       \advance\secnowidth by \extrasecnoskip  
       \setbox0=\hbox to \secnowidth{%  
         #2\hskip\labelspace\hskip\extrasecnoskip\hfill}%  
     \fi  
     \entrycontskip=\wd0  
     \entry{\box0 #1}{#3}%  
   \fi  
 }  
 \newdimen\labelspace  
 \labelspace=0.6em  
   
 \def\chapentryfonts{\secfonts \rm}  \def\chapentryfonts{\secfonts \rm}
 \def\secentryfonts{\textfonts}  \def\secentryfonts{\textfonts}
Line 7041  might help (with 'rm \jobname.?? \jobnam Line 6997  might help (with 'rm \jobname.?? \jobnam
 % But \@ or @@ will get a plain @ character.  % But \@ or @@ will get a plain @ character.
   
 \envdef\tex{%  \envdef\tex{%
   \setregularquotes    \setupmarkupstyle{tex}%
   \catcode `\\=0 \catcode `\{=1 \catcode `\}=2    \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
   \catcode `\$=3 \catcode `\&=4 \catcode `\#=6    \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
   \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie    \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie
Line 7171  might help (with 'rm \jobname.?? \jobnam Line 7127  might help (with 'rm \jobname.?? \jobnam
 \newdimen\cartouter\newdimen\cartinner  \newdimen\cartouter\newdimen\cartinner
 \newskip\normbskip\newskip\normpskip\newskip\normlskip  \newskip\normbskip\newskip\normpskip\newskip\normlskip
   
 \envparseargdef\cartouche{%  
   \envdef\cartouche{%
   \cartouchefontdefs    \cartouchefontdefs
   \ifhmode\par\fi  % can't be in the midst of a paragraph.    \ifhmode\par\fi  % can't be in the midst of a paragraph.
   \startsavinginserts    \startsavinginserts
   \lskip=\leftskip \rskip=\rightskip    \lskip=\leftskip \rskip=\rightskip
   \leftskip=0pt\rightskip=0pt % we want these *outside*.    \leftskip=0pt\rightskip=0pt % we want these *outside*.
   %  
   % Set paragraph width for text inside cartouche.  There are  
   % left and right margins of 3pt each plus two vrules 0.4pt each.  
   \cartinner=\hsize \advance\cartinner by-\lskip    \cartinner=\hsize \advance\cartinner by-\lskip
   \advance\cartinner by-\rskip    \advance\cartinner by-\rskip
   \advance\cartinner by -6.8pt  
   %  
   % For drawing top and bottom of cartouche.  Each corner char  
   % adds 6pt and we take off the width of a rule to line up with the  
   % right boundary perfectly.  
   \cartouter=\hsize    \cartouter=\hsize
   \advance\cartouter by 11.6pt    \advance\cartouter by 18.4pt  % allow for 3pt kerns on either
   %                                  % side, and for 6pt waste from
                                   % each corner char, and rule thickness
   \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip    \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
   %    %
   % If this cartouche directly follows a sectioning command, we need the    % If this cartouche directly follows a sectioning command, we need the
Line 7197  might help (with 'rm \jobname.?? \jobnam Line 7147  might help (with 'rm \jobname.?? \jobnam
   % collide with the section heading.    % collide with the section heading.
   \ifnum\lastpenalty>10000 \vskip\parskip \penalty\lastpenalty \fi    \ifnum\lastpenalty>10000 \vskip\parskip \penalty\lastpenalty \fi
   %    %
   \setbox\groupbox=\vtop\bgroup    \setbox\groupbox=\vbox\bgroup
       \baselineskip=0pt\parskip=0pt\lineskip=0pt        \baselineskip=0pt\parskip=0pt\lineskip=0pt
       \carttop        \carttop
       \hbox\bgroup        \hbox\bgroup
           \hskip\lskip            \hskip\lskip
           \vrule\kern3pt            \vrule\kern3pt
           \vbox\bgroup            \vbox\bgroup
               \hsize=\cartinner                \kern3pt
               \baselineskip=\normbskip                \hsize=\cartinner
               \lineskip=\normlskip                \baselineskip=\normbskip
               \parskip=\normpskip                \lineskip=\normlskip
               \def\arg{#1}%                \parskip=\normpskip
               \ifx\arg\empty\else                \vskip -\parskip
                 \centerV{\hfil \bf #1 \hfil}%                \comment % For explanation, see the end of def\group.
               \fi  
               \kern3pt  
               \vskip -\parskip  
 }  }
 \def\Ecartouche{%  \def\Ecartouche{%
               \ifhmode\par\fi                \ifhmode\par\fi
Line 7276  might help (with 'rm \jobname.?? \jobnam Line 7223  might help (with 'rm \jobname.?? \jobnam
 % If you want all examples etc. small: @set dispenvsize small.  % If you want all examples etc. small: @set dispenvsize small.
 % If you want even small examples the full size: @set dispenvsize nosmall.  % If you want even small examples the full size: @set dispenvsize nosmall.
 % This affects the following displayed environments:  % This affects the following displayed environments:
 %    @example, @display, @format, @lisp, @verbatim  %    @example, @display, @format, @lisp
 %  %
 \def\smallword{small}  \def\smallword{small}
 \def\nosmallword{nosmall}  \def\nosmallword{nosmall}
Line 7322  might help (with 'rm \jobname.?? \jobnam Line 7269  might help (with 'rm \jobname.?? \jobnam
 %  %
 \maketwodispenvdef{lisp}{example}{%  \maketwodispenvdef{lisp}{example}{%
   \nonfillstart    \nonfillstart
   \tt\setcodequotes    \tt\setupmarkupstyle{example}%
   \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.    \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
   \parsearg\gobble    \gobble % eat return
 }  }
 % @display/@smalldisplay: same as @lisp except keep current font.  % @display/@smalldisplay: same as @lisp except keep current font.
 %  %
Line 7367  might help (with 'rm \jobname.?? \jobnam Line 7314  might help (with 'rm \jobname.?? \jobnam
 }  }
 \let\Eraggedright\par  \let\Eraggedright\par
   
   \envdef\raggedleft{%
     \parindent=0pt \leftskip0pt plus2em
     \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt
     \hbadness=10000 % Last line will usually be underfull, so turn off
                     % badness reporting.
   }
   \let\Eraggedleft\par
   
   \envdef\raggedcenter{%
     \parindent=0pt \rightskip0pt plus1em \leftskip0pt plus1em
     \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt
     \hbadness=10000 % Last line will usually be underfull, so turn off
                     % badness reporting.
   }
   \let\Eraggedcenter\par
   
   
 % @quotation does normal linebreaking (hence we can't use \nonfillstart)  % @quotation does normal linebreaking (hence we can't use \nonfillstart)
 % and narrows the margins.  We keep \parskip nonzero in general, since  % and narrows the margins.  We keep \parskip nonzero in general, since
Line 7464  might help (with 'rm \jobname.?? \jobnam Line 7427  might help (with 'rm \jobname.?? \jobnam
 \endgroup  \endgroup
 %  %
 \def\setupverb{%  \def\setupverb{%
   \tt    \tt  % easiest (and conventionally used) font for verbatim
   \def\par{\leavevmode\endgraf}%    \def\par{\leavevmode\endgraf}%
   \parindent = 0pt    \setupmarkupstyle{verb}%
   \setcodequotes  
   \tabeightspaces    \tabeightspaces
   % Respect line breaks,    % Respect line breaks,
   % print special symbols as themselves, and    % print special symbols as themselves, and
Line 7482  might help (with 'rm \jobname.?? \jobnam Line 7444  might help (with 'rm \jobname.?? \jobnam
 \newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount  \newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount
 %  %
 % We typeset each line of the verbatim in an \hbox, so we can handle  % We typeset each line of the verbatim in an \hbox, so we can handle
 % tabs.  % tabs.  The \global is in case the verbatim line starts with an accent,
   % or some other command that starts with a begin-group.  Otherwise, the
   % entire \verbbox would disappear at the corresponding end-group, before
   % it is typeset.  Meanwhile, we can't have nested verbatim commands
   % (can we?), so the \global won't be overwriting itself.
 \newbox\verbbox  \newbox\verbbox
 \def\starttabbox{\setbox\verbbox=\hbox\bgroup}  \def\starttabbox{\global\setbox\verbbox=\hbox\bgroup}
 %  %
 \begingroup  \begingroup
   \catcode`\^^I=\active    \catcode`\^^I=\active
Line 7495  might help (with 'rm \jobname.?? \jobnam Line 7461  might help (with 'rm \jobname.?? \jobnam
       \divide\dimen\verbbox by\tabw        \divide\dimen\verbbox by\tabw
       \multiply\dimen\verbbox by\tabw % compute previous multiple of \tabw        \multiply\dimen\verbbox by\tabw % compute previous multiple of \tabw
       \advance\dimen\verbbox by\tabw  % advance to next multiple of \tabw        \advance\dimen\verbbox by\tabw  % advance to next multiple of \tabw
       \wd\verbbox=\dimen\verbbox        \wd\verbbox=\dimen\verbbox \box\verbbox \starttabbox
       \leavevmode\box\verbbox \starttabbox  
     }%      }%
   }    }
 \endgroup  \endgroup
Line 7506  might help (with 'rm \jobname.?? \jobnam Line 7471  might help (with 'rm \jobname.?? \jobnam
   \let\nonarrowing = t%    \let\nonarrowing = t%
   \nonfillstart    \nonfillstart
   \tt % easiest (and conventionally used) font for verbatim    \tt % easiest (and conventionally used) font for verbatim
   \def\par{\egroup\leavevmode\box\verbbox\endgraf\starttabbox}%    % The \leavevmode here is for blank lines.  Otherwise, we would
     % never \starttabbox and the \egroup would end verbatim mode.
     \def\par{\leavevmode\egroup\box\verbbox\endgraf}%
   \tabexpand    \tabexpand
   \setcodequotes    \setupmarkupstyle{verbatim}%
   % Respect line breaks,    % Respect line breaks,
   % print special symbols as themselves, and    % print special symbols as themselves, and
   % make each space count.    % make each space count.
   % Must do in this order:    % Must do in this order:
   \obeylines \uncatcodespecials \sepspaces    \obeylines \uncatcodespecials \sepspaces
     \everypar{\starttabbox}%
 }  }
   
 % Do the @verb magic: verbatim text is quoted by unique  % Do the @verb magic: verbatim text is quoted by unique
Line 7548  might help (with 'rm \jobname.?? \jobnam Line 7516  might help (with 'rm \jobname.?? \jobnam
   % ignore everything up to the first ^^M, that's the newline at the end    % ignore everything up to the first ^^M, that's the newline at the end
   % of the @verbatim input line itself.  Otherwise we get an extra blank    % of the @verbatim input line itself.  Otherwise we get an extra blank
   % line in the output.    % line in the output.
   \xdef\doverbatim#1^^M#2@end verbatim{%    \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}%
     \starttabbox#2\egroup\noexpand\end\gobble verbatim}%  
   % We really want {...\end verbatim} in the body of the macro, but    % We really want {...\end verbatim} in the body of the macro, but
   % without the active space; thus we have to use \xdef and \gobble.    % without the active space; thus we have to use \xdef and \gobble.
   % The \egroup ends the \verbbox started at the end of the last line in  
   % the block.  
 \endgroup  \endgroup
 %  %
 \envdef\verbatim{%  \envdef\verbatim{%
     \setnormaldispenv\setupverbatim\doverbatim      \setupverbatim\doverbatim
 }  }
 \let\Everbatim = \afterenvbreak  \let\Everbatim = \afterenvbreak
   
Line 7575  might help (with 'rm \jobname.?? \jobnam Line 7540  might help (with 'rm \jobname.?? \jobnam
       \wlog{texinfo.tex: doing @verbatiminclude of #1^^J}%        \wlog{texinfo.tex: doing @verbatiminclude of #1^^J}%
       \edef\tmp{\noexpand\input #1 }        \edef\tmp{\noexpand\input #1 }
       \expandafter        \expandafter
     }\expandafter\starttabbox\tmp\egroup      }\tmp
     \afterenvbreak      \afterenvbreak
   }%    }%
 }  }
Line 7590  might help (with 'rm \jobname.?? \jobnam Line 7555  might help (with 'rm \jobname.?? \jobnam
 % file; b) letting users define the frontmatter in as flexible order as  % file; b) letting users define the frontmatter in as flexible order as
 % possible is desirable.  % possible is desirable.
 %  %
 \def\copying{\checkenv{}\begingroup\macrobodyctxt\docopying}  \def\copying{\checkenv{}\begingroup\scanargctxt\docopying}
 {\catcode`\ =\other  \def\docopying#1@end copying{\endgroup\def\copyingtext{#1}}
 \gdef\docopying#1@end copying{\endgroup\def\copyingtext{#1}}  %
 }  
   
 \def\insertcopying{%  \def\insertcopying{%
   \begingroup    \begingroup
     \parindent = 0pt  % paragraph indentation looks wrong on title page      \parindent = 0pt  % paragraph indentation looks wrong on title page
Line 7642  might help (with 'rm \jobname.?? \jobnam Line 7605  might help (with 'rm \jobname.?? \jobnam
   \exdentamount=\defbodyindent    \exdentamount=\defbodyindent
 }  }
   
 % Called as \printdefunline \deffooheader{text}  \def\dodefunx#1{%
     % First, check whether we are in the right environment:
     \checkenv#1%
     %
     % As above, allow line break if we have multiple x headers in a row.
     % It's not a great place, though.
     \ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi
     %
     % And now, it's time to reuse the body of the original defun:
     \expandafter\gobbledefun#1%
   }
   \def\gobbledefun#1\startdefun{}
   
   % \printdefunline \deffnheader{text}
 %  %
 \def\printdefunline#1#2{%  \def\printdefunline#1#2{%
   \begingroup    \begingroup
     \plainfrenchspacing      % call \deffnheader:
     % call \deffooheader:  
     #1#2 \endheader      #1#2 \endheader
     % common ending:      % common ending:
     \interlinepenalty = 10000      \interlinepenalty = 10000
     \advance\rightskip by 0pt plus 1fil\relax      \advance\rightskip by 0pt plus 1fil\relax
     \endgraf      \endgraf
     \nobreak\vskip -\parskip      \nobreak\vskip -\parskip
     \penalty\defunpenalty  % signal to \startdefun and \deffoox      \penalty\defunpenalty  % signal to \startdefun and \dodefunx
     % Some of the @defun-type tags do not enable magic parentheses,      % Some of the @defun-type tags do not enable magic parentheses,
     % rendering the following check redundant.  But we don't optimize.      % rendering the following check redundant.  But we don't optimize.
     \checkparencounts      \checkparencounts
Line 7663  might help (with 'rm \jobname.?? \jobnam Line 7638  might help (with 'rm \jobname.?? \jobnam
   
 \def\Edefun{\endgraf\medbreak}  \def\Edefun{\endgraf\medbreak}
   
 % @defblock, @defline do not automatically create index entries  % \makedefun{deffn} creates \deffn, \deffnx and \Edeffn;
 \envdef\defblock{%  % the only thing remaining is to define \deffnheader.
   \startdefun  
 }  
 \let\Edefblock\Edefun  
   
 \def\defline{%  
   \doingtypefnfalse  
   \parseargusing\activeparens{\printdefunline\deflineheader}%  
 }  
 \def\deflineheader#1 #2 #3\endheader{%  
   \printdefname{#1}{}{#2}\magicamp\defunargs{#3\unskip}%  
 }  
   
 \def\deftypeline{%  
   \doingtypefntrue  
   \parseargusing\activeparens{\printdefunline\deftypelineheader}%  
 }  
 \def\deftypelineheader#1 #2 #3 #4\endheader{%  
   \printdefname{#1}{#2}{#3}\magicamp\defunargs{#4\unskip}%  
 }  
   
 % \makedefun{deffoo} (\deffooheader parameters) { (\deffooheader expansion) }  
 %  %
 % Define \deffoo, \deffoox  \Edeffoo and \deffooheader.  
 \def\makedefun#1{%  \def\makedefun#1{%
   \expandafter\let\csname E#1\endcsname = \Edefun    \expandafter\let\csname E#1\endcsname = \Edefun
   \edef\temp{\noexpand\domakedefun    \edef\temp{\noexpand\domakedefun
     \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}%      \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}%
   \temp    \temp
 }  }
   
   % \domakedefun \deffn \deffnx \deffnheader { (defn. of \deffnheader) }
   %
   % Define \deffn and \deffnx, without parameters.
   % \deffnheader has to be defined explicitly.
   %
 \def\domakedefun#1#2#3{%  \def\domakedefun#1#2#3{%
   \envdef#1{%    \envdef#1{%
     \startdefun      \startdefun
     \doingtypefnfalse    % distinguish typed functions from all else      \doingtypefnfalse    % distinguish typed functions from all else
     \parseargusing\activeparens{\printdefunline#3}%      \parseargusing\activeparens{\printdefunline#3}%
   }%    }%
   \def#2{%    \def#2{\dodefunx#1}%
     % First, check whether we are in the right environment:    \def#3%
     \checkenv#1%  
     %  
     % As in \startdefun, allow line break if we have multiple x headers  
     % in a row.  It's not a great place, though.  
     \ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi  
     %  
     \doingtypefnfalse    % distinguish typed functions from all else  
     \parseargusing\activeparens{\printdefunline#3}%  
   }%  
   \def#3% definition of \deffooheader follows  
 }  }
   
 \newif\ifdoingtypefn       % doing typed function?  \newif\ifdoingtypefn       % doing typed function?
Line 7736  might help (with 'rm \jobname.?? \jobnam Line 7685  might help (with 'rm \jobname.?? \jobnam
   \fi\fi    \fi\fi
 }  }
   
   % \dosubind {index}{topic}{subtopic}
   %
   % If SUBTOPIC is present, precede it with a space, and call \doind.
   % (At some time during the 20th century, this made a two-level entry in an
   % index such as the operation index.  Nobody seemed to notice the change in
   % behaviour though.)
   \def\dosubind#1#2#3{%
     \def\thirdarg{#3}%
     \ifx\thirdarg\empty
       \doind{#1}{#2}%
     \else
       \doind{#1}{#2\space#3}%
     \fi
   }
   
 % Untyped functions:  % Untyped functions:
   
 % @deffn category name args  % @deffn category name args
 \makedefun{deffn}#1 #2 #3\endheader{%  \makedefun{deffn}{\deffngeneral{}}
   \doind{fn}{\code{#2}}%  
   \printdefname{#1}{}{#2}\magicamp\defunargs{#3\unskip}%  % @deffn category class name args
 }  \makedefun{defop}#1 {\defopon{#1\ \putwordon}}
   
   % \defopon {category on}class name args
   \def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
   
 % @defop category class name args  % \deffngeneral {subind}category name args
 \makedefun{defop}#1 {\defopheaderx{#1\ \putwordon}}  %
 \def\defopheaderx#1#2 #3 #4\endheader{%  \def\deffngeneral#1#2 #3 #4\endheader{%
   \doind{fn}{\code{#3}\space\putwordon\ \code{#2}}%    \dosubind{fn}{\code{#3}}{#1}%
   \printdefname{#1\ \code{#2}}{}{#3}\magicamp\defunargs{#4\unskip}%    \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}%
 }  }
   
 % Typed functions:  % Typed functions:
   
 % @deftypefn category type name args  % @deftypefn category type name args
 \makedefun{deftypefn}#1 #2 #3 #4\endheader{%  \makedefun{deftypefn}{\deftypefngeneral{}}
   \doind{fn}{\code{#3}}%  
   \doingtypefntrue  
   \printdefname{#1}{#2}{#3}\defunargs{#4\unskip}%  
 }  
   
 % @deftypeop category class type name args  % @deftypeop category class type name args
 \makedefun{deftypeop}#1 {\deftypeopheaderx{#1\ \putwordon}}  \makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}}
 \def\deftypeopheaderx#1#2 #3 #4 #5\endheader{%  
   \doind{fn}{\code{#4}\space\putwordon\ \code{#1\ \code{#2}}}%  % \deftypeopon {category on}class type name args
   \def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
   
   % \deftypefngeneral {subind}category type name args
   %
   \def\deftypefngeneral#1#2 #3 #4 #5\endheader{%
     \dosubind{fn}{\code{#4}}{#1}%
   \doingtypefntrue    \doingtypefntrue
   \printdefname{#1\ \code{#2}}{#3}{#4}\defunargs{#5\unskip}%    \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
 }  }
   
 % Typed variables:  % Typed variables:
   
 % @deftypevr category type var args  % @deftypevr category type var args
 \makedefun{deftypevr}#1 #2 #3 #4\endheader{%  \makedefun{deftypevr}{\deftypecvgeneral{}}
   \doind{vr}{\code{#3}}%  
   \printdefname{#1}{#2}{#3}\defunargs{#4\unskip}%  
 }  
   
 % @deftypecv category class type var args  % @deftypecv category class type var args
 \makedefun{deftypecv}#1 {\deftypecvheaderx{#1\ \putwordof}}  \makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}}
 \def\deftypecvheaderx#1#2 #3 #4 #5\endheader{%  
   \doind{vr}{\code{#4}\space\putwordof\ \code{#2}}%  % \deftypecvof {category of}class type var args
   \printdefname{#1\ \code{#2}}{#3}{#4}\defunargs{#5\unskip}%  \def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} }
   
   % \deftypecvgeneral {subind}category type var args
   %
   \def\deftypecvgeneral#1#2 #3 #4 #5\endheader{%
     \dosubind{vr}{\code{#4}}{#1}%
     \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
 }  }
   
 % Untyped variables:  % Untyped variables:
Line 7789  might help (with 'rm \jobname.?? \jobnam Line 7761  might help (with 'rm \jobname.?? \jobnam
 \makedefun{defvr}#1 {\deftypevrheader{#1} {} }  \makedefun{defvr}#1 {\deftypevrheader{#1} {} }
   
 % @defcv category class var args  % @defcv category class var args
 \makedefun{defcv}#1 {\defcvheaderx{#1\ \putwordof}}  \makedefun{defcv}#1 {\defcvof{#1\ \putwordof}}
 \def\defcvheaderx#1#2 {\deftypecvheaderx{#1}#2 {} }  
   % \defcvof {category of}class var args
   \def\defcvof#1#2 {\deftypecvof{#1}#2 {} }
   
 % Types:  % Types:
   
 % @deftp category name args  % @deftp category name args
 \makedefun{deftp}#1 #2 #3\endheader{%  \makedefun{deftp}#1 #2 #3\endheader{%
   \doind{tp}{\code{#2}}%    \doind{tp}{\code{#2}}%
   \printdefname{#1}{}{#2}\defunargs{#3\unskip}%    \defname{#1}{}{#2}\defunargs{#3\unskip}%
 }  }
   
 % Remaining @defun-like shortcuts:  % Remaining @defun-like shortcuts:
Line 7808  might help (with 'rm \jobname.?? \jobnam Line 7782  might help (with 'rm \jobname.?? \jobnam
 \makedefun{defvar}{\defvrheader{\putwordDefvar} }  \makedefun{defvar}{\defvrheader{\putwordDefvar} }
 \makedefun{defopt}{\defvrheader{\putwordDefopt} }  \makedefun{defopt}{\defvrheader{\putwordDefopt} }
 \makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} }  \makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} }
 \makedefun{defmethod}{\defopheaderx\putwordMethodon}  \makedefun{defmethod}{\defopon\putwordMethodon}
 \makedefun{deftypemethod}{\deftypeopheaderx\putwordMethodon}  \makedefun{deftypemethod}{\deftypeopon\putwordMethodon}
 \makedefun{defivar}{\defcvheaderx\putwordInstanceVariableof}  \makedefun{defivar}{\defcvof\putwordInstanceVariableof}
 \makedefun{deftypeivar}{\deftypecvheaderx\putwordInstanceVariableof}  \makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof}
   
 % \printdefname, which formats the name of the @def (not the args).  % \defname, which formats the name of the @def (not the args).
 % #1 is the category, such as "Function".  % #1 is the category, such as "Function".
 % #2 is the return type, if any.  % #2 is the return type, if any.
 % #3 is the function name.  % #3 is the function name.
 %  %
 % We are followed by (but not passed) the arguments, if any.  % We are followed by (but not passed) the arguments, if any.
 %  %
 \def\printdefname#1#2#3{%  \def\defname#1#2#3{%
   \par    \par
   % Get the values of \leftskip and \rightskip as they were outside the @def...    % Get the values of \leftskip and \rightskip as they were outside the @def...
   \advance\leftskip by -\defbodyindent    \advance\leftskip by -\defbodyindent
Line 7830  might help (with 'rm \jobname.?? \jobnam Line 7804  might help (with 'rm \jobname.?? \jobnam
   \rettypeownlinefalse    \rettypeownlinefalse
   \ifdoingtypefn  % doing a typed function specifically?    \ifdoingtypefn  % doing a typed function specifically?
     % then check user option for putting return type on its own line:      % then check user option for putting return type on its own line:
     \ifflagclear{txideftypefnnl}{}{\rettypeownlinetrue}%      \expandafter\ifx\csname SETtxideftypefnnl\endcsname\relax \else
         \rettypeownlinetrue
       \fi
   \fi    \fi
   %    %
   % How we'll format the category name.  Putting it in brackets helps    % How we'll format the category name.  Putting it in brackets helps
Line 7874  might help (with 'rm \jobname.?? \jobnam Line 7850  might help (with 'rm \jobname.?? \jobnam
   \tolerance=10000 \hbadness=10000    \tolerance=10000 \hbadness=10000
   \exdentamount=\defbodyindent    \exdentamount=\defbodyindent
   {%    {%
     \def\^^M{}% for line continuation  
     %  
     % defun fonts. We use typewriter by default (used to be bold) because:      % defun fonts. We use typewriter by default (used to be bold) because:
     % . we're printing identifiers, they should be in tt in principle.      % . we're printing identifiers, they should be in tt in principle.
     % . in languages with many accents, such as Czech or French, it's      % . in languages with many accents, such as Czech or French, it's
Line 7897  might help (with 'rm \jobname.?? \jobnam Line 7871  might help (with 'rm \jobname.?? \jobnam
     \fi           % no return type      \fi           % no return type
     #3% output function name      #3% output function name
   }%    }%
   \ifflagclear{txidefnamenospace}{%    {\rm\enskip}% hskip 0.5 em of \rmfont
     {\rm\enskip}% hskip 0.5 em of \rmfont  
   }{}%  
   %    %
   \boldbrax    \boldbrax
   % arguments will be output next, if any.    % arguments will be output next, if any.
 }  }
   
 % Print arguments.  Use slanted for @def*, typewriter for @deftype*.  % Print arguments in slanted roman (not ttsl), inconsistently with using
   % tt for the name.  This is because literal text is sometimes needed in
   % the argument list (groff manual), and ttsl and tt are not very
   % distinguishable.  Prevent hyphenation at `-' chars.
   %
 \def\defunargs#1{%  \def\defunargs#1{%
   \bgroup    % use sl by default (not ttsl),
     \def\^^M{}% for line continuation    % tt for the names.
     \df \ifdoingtypefn \tt \else \sl \fi    \df \sl \hyphenchar\font=0
     \ifflagclear{txicodevaristt}{}%    %
        {\def\var##1{{\setregularquotes \ttsl ##1}}}%    % On the other hand, if an argument has two dashes (for instance), we
     #1%    % want a way to get ttsl.  We used to recommend @var for that, so
   \egroup    % leave the code in, but it's strange for @var to lead to typewriter.
     % Nowadays we recommend @code, since the difference between a ttsl hyphen
     % and a tt hyphen is pretty tiny.  @code also disables ?` !`.
     \def\var##1{{\setupmarkupstyle{var}\ttslanted{##1}}}%
     #1%
     \sl\hyphenchar\font=45
 }  }
   
 % We want ()&[] to print specially on the defun line.  % We want ()&[] to print specially on the defun line.
Line 7932  might help (with 'rm \jobname.?? \jobnam Line 7913  might help (with 'rm \jobname.?? \jobnam
 % so TeX would otherwise complain about undefined control sequence.  % so TeX would otherwise complain about undefined control sequence.
 {  {
   \activeparens    \activeparens
   \gdef\defcharsdefault{%    \global\let(=\lparen \global\let)=\rparen
     \let(=\lparen \let)=\rparen    \global\let[=\lbrack \global\let]=\rbrack
     \let[=\lbrack \let]=\rbrack    \global\let& = \&
     \let& = \&%  
   }  
   \globaldefs=1 \defcharsdefault  
   
   \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}    \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
   \gdef\magicamp{\let&=\amprm}    \gdef\magicamp{\let&=\amprm}
Line 7948  might help (with 'rm \jobname.?? \jobnam Line 7926  might help (with 'rm \jobname.?? \jobnam
   
 % If we encounter &foo, then turn on ()-hacking afterwards  % If we encounter &foo, then turn on ()-hacking afterwards
 \newif\ifampseen  \newif\ifampseen
 \def\amprm#1 {\ampseentrue{\rm\&#1 }}  \def\amprm#1 {\ampseentrue{\bf\&#1 }}
   
 \def\parenfont{%  \def\parenfont{%
   \ifampseen    \ifampseen
Line 8023  might help (with 'rm \jobname.?? \jobnam Line 8001  might help (with 'rm \jobname.?? \jobnam
   }    }
 \fi  \fi
   
 \let\E=\expandafter  
   
 % Used at the time of macro expansion.  % Used at the time of macro expansion.
 % Argument is macro body with arguments substituted  % Argument is macro body with arguments substituted
 \def\scanmacro#1{%  \def\scanmacro#1{%
   \newlinechar`\^^M    \newlinechar`\^^M
   % expand the expansion of \eatleadingcr twice to maybe remove a leading    \def\xeatspaces{\eatspaces}%
   % newline (and \else and \fi tokens), then call \eatspaces on the result.  
   \def\xeatspaces##1{%  
     \E\E\E\E\E\E\E\eatspaces\E\E\E\E\E\E\E{\eatleadingcr##1%  
   }}%  
   \def\xempty##1{}%  
   %    %
   % Process the macro body under the current catcode regime.    % Process the macro body under the current catcode regime.
   \scantokens{#1@comment}%    \scantokens{#1@comment}%
Line 8087  might help (with 'rm \jobname.?? \jobnam Line 8058  might help (with 'rm \jobname.?? \jobnam
 \unbrace{\gdef\trim@@@ #1 } #2@{#1}  \unbrace{\gdef\trim@@@ #1 } #2@{#1}
 }  }
   
 {\catcode`\^^M=\other%  
 \gdef\eatleadingcr#1{\if\noexpand#1\noexpand^^M\else\E#1\fi}}%  
 % Warning: this won't work for a delimited argument  
 % or for an empty argument  
   
 % Trim a single trailing ^^M off a string.  % Trim a single trailing ^^M off a string.
 {\catcode`\^^M=\other \catcode`\Q=3%  {\catcode`\^^M=\other \catcode`\Q=3%
 \gdef\eatcr #1{\eatcra #1Q^^MQ}%  \gdef\eatcr #1{\eatcra #1Q^^MQ}%
Line 8121  might help (with 'rm \jobname.?? \jobnam Line 8087  might help (with 'rm \jobname.?? \jobnam
   \catcode`\_=\other    \catcode`\_=\other
   \catcode`\|=\other    \catcode`\|=\other
   \catcode`\~=\other    \catcode`\~=\other
     \passthroughcharstrue
   }
   
   \def\scanargctxt{% used for copying and captions, not macros.
     \scanctxt
   \catcode`\@=\other    \catcode`\@=\other
     \catcode`\\=\other
   \catcode`\^^M=\other    \catcode`\^^M=\other
   \catcode`\\=\active  
   \passthroughcharstrue  
 }  }
   
 \def\macrobodyctxt{% used for @macro definitions and @copying  \def\macrobodyctxt{% used for @macro definitions
   \scanctxt    \scanctxt
   \catcode`\ =\other    \catcode`\ =\other
     \catcode`\@=\other
   \catcode`\{=\other    \catcode`\{=\other
   \catcode`\}=\other    \catcode`\}=\other
     \catcode`\^^M=\other
     \usembodybackslash
 }  }
   
 % Used when scanning braced macro arguments.  Note, however, that catcode  % Used when scanning braced macro arguments.  Note, however, that catcode
Line 8140  might help (with 'rm \jobname.?? \jobnam Line 8113  might help (with 'rm \jobname.?? \jobnam
 \def\macroargctxt{%  \def\macroargctxt{%
   \scanctxt    \scanctxt
   \catcode`\ =\active    \catcode`\ =\active
     \catcode`\@=\other
     \catcode`\^^M=\other
     \catcode`\\=\active
 }  }
   
 \def\macrolineargctxt{% used for whole-line arguments without braces  \def\macrolineargctxt{% used for whole-line arguments without braces
   \scanctxt    \scanctxt
     \catcode`\@=\other
   \catcode`\{=\other    \catcode`\{=\other
   \catcode`\}=\other    \catcode`\}=\other
 }  }
Line 8187  might help (with 'rm \jobname.?? \jobnam Line 8164  might help (with 'rm \jobname.?? \jobnam
      \global\expandafter\let\csname ismacro.\the\macname\endcsname=1%       \global\expandafter\let\csname ismacro.\the\macname\endcsname=1%
      \addtomacrolist{\the\macname}%       \addtomacrolist{\the\macname}%
   \fi    \fi
   \begingroup \macrobodyctxt \usembodybackslash    \begingroup \macrobodyctxt
   \ifrecursive \expandafter\parsermacbody    \ifrecursive \expandafter\parsermacbody
   \else \expandafter\parsemacbody    \else \expandafter\parsemacbody
   \fi}    \fi}
Line 8202  might help (with 'rm \jobname.?? \jobnam Line 8179  might help (with 'rm \jobname.?? \jobnam
       \let\commondummyword\unmacrodo        \let\commondummyword\unmacrodo
       \xdef\macrolist{\macrolist}%        \xdef\macrolist{\macrolist}%
     \endgroup      \endgroup
     \else
       \errmessage{Macro #1 not defined}%
   \fi    \fi
 }  }
   
Line 8245  might help (with 'rm \jobname.?? \jobnam Line 8224  might help (with 'rm \jobname.?? \jobnam
   \let\hash\relax    \let\hash\relax
   % \hash is redefined to `#' later to get it into definitions    % \hash is redefined to `#' later to get it into definitions
   \let\xeatspaces\relax    \let\xeatspaces\relax
   \let\xempty\relax  
   \parsemargdefxxx#1,;,%    \parsemargdefxxx#1,;,%
   \ifnum\paramno<10\relax\else    \ifnum\paramno<10\relax\else
     \paramno0\relax      \paramno0\relax
Line 8257  might help (with 'rm \jobname.?? \jobnam Line 8235  might help (with 'rm \jobname.?? \jobnam
   \else \let\next=\parsemargdefxxx    \else \let\next=\parsemargdefxxx
     \advance\paramno by 1      \advance\paramno by 1
     \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname      \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname
         {\xeatspaces{\hash\the\paramno\noexpand\xempty{}}}%          {\xeatspaces{\hash\the\paramno}}%
     \edef\paramlist{\paramlist\hash\the\paramno,}%      \edef\paramlist{\paramlist\hash\the\paramno,}%
   \fi\next}    \fi\next}
 % the \xempty{} is to give \eatleadingcr an argument in the case of an  
 % empty macro argument.  
   
 % \parsemacbody, \parsermacbody  % \parsemacbody, \parsermacbody
 %  %
 % Read recursive and nonrecursive macro bodies. (They're different since  % Read recursive and nonrecursive macro bodies. (They're different since
 % rec and nonrec macros end differently.)  % rec and nonrec macros end differently.)
 %  %
 % We are in \macrobodyctxt, and the \xdef causes backslashes in the macro  % We are in \macrobodyctxt, and the \xdef causes backslashshes in the macro
 % body to be transformed.  % body to be transformed.
 % Set \macrobody to the body of the macro, and call \macrodef.  % Set \macrobody to the body of the macro, and call \defmacro.
 %  %
 {\catcode`\ =\other\long\gdef\parsemacbody#1@end macro{%  {\catcode`\ =\other\long\gdef\parsemacbody#1@end macro{%
 \xdef\macrobody{\eatcr{#1}}\endgroup\macrodef}}%  \xdef\macrobody{\eatcr{#1}}\endgroup\defmacro}}%
 {\catcode`\ =\other\long\gdef\parsermacbody#1@end rmacro{%  {\catcode`\ =\other\long\gdef\parsermacbody#1@end rmacro{%
 \xdef\macrobody{\eatcr{#1}}\endgroup\macrodef}}%  \xdef\macrobody{\eatcr{#1}}\endgroup\defmacro}}%
   
 % Make @ a letter, so that we can make private-to-Texinfo macro names.  % Make @ a letter, so that we can make private-to-Texinfo macro names.
 \edef\texiatcatcode{\the\catcode`\@}  \edef\texiatcatcode{\the\catcode`\@}
Line 8494  might help (with 'rm \jobname.?? \jobnam Line 8470  might help (with 'rm \jobname.?? \jobnam
 % \xdef is used so that macro definitions will survive the file  % \xdef is used so that macro definitions will survive the file
 % they're defined in: @include reads the file inside a group.  % they're defined in: @include reads the file inside a group.
 %  %
 \def\macrodef{%  \def\defmacro{%
   \let\hash=##% convert placeholders to macro parameter chars    \let\hash=##% convert placeholders to macro parameter chars
   \ifnum\paramno=1    \ifnum\paramno=1
     \long\def\xeatspaces##1{##1}%      \def\xeatspaces##1{##1}%
     % We don't use \xeatspaces for single-argument macros, because we      % This removes the pair of braces around the argument.  We don't
     % want to keep ends of lines.  This definition removes \xeatspaces      % use \eatspaces, because this can cause ends of lines to be lost
     % when \macrobody is expanded below.      % when the argument to \eatspaces is read, leading to line-based
   \else      % commands like "@itemize" not being read correctly.
     \def\xeatspaces{\string\xeatspaces}%    \else
     % This expands \xeatspaces as a sequence of character tokens, which      \let\xeatspaces\relax % suppress expansion
     % stops \scantokens inserting an extra space after the control sequence.  
   \fi    \fi
   \ifcase\paramno    \ifcase\paramno
   % 0    % 0
     \expandafter\xdef\csname\the\macname\endcsname{%      \expandafter\xdef\csname\the\macname\endcsname{%
       \begingroup        \bgroup
         \noexpand\spaceisspace          \noexpand\spaceisspace
         \noexpand\endlineisspace          \noexpand\endlineisspace
         \noexpand\expandafter % skip any whitespace after the macro name.          \noexpand\expandafter % skip any whitespace after the macro name.
         \expandafter\noexpand\csname\the\macname @@@\endcsname}%          \expandafter\noexpand\csname\the\macname @@@\endcsname}%
     \expandafter\xdef\csname\the\macname @@@\endcsname{%      \expandafter\xdef\csname\the\macname @@@\endcsname{%
       \endgroup        \egroup
       \noexpand\scanmacro{\macrobody}}%        \noexpand\scanmacro{\macrobody}}%
   \or % 1    \or % 1
     \expandafter\xdef\csname\the\macname\endcsname{%      \expandafter\xdef\csname\the\macname\endcsname{%
        \begingroup         \bgroup
        \noexpand\braceorline         \noexpand\braceorline
        \expandafter\noexpand\csname\the\macname @@@\endcsname}%         \expandafter\noexpand\csname\the\macname @@@\endcsname}%
     \expandafter\xdef\csname\the\macname @@@\endcsname##1{%      \expandafter\xdef\csname\the\macname @@@\endcsname##1{%
       \endgroup        \egroup
       \noexpand\scanmacro{\macrobody}%        \noexpand\scanmacro{\macrobody}%
       }%        }%
   \else % at most 9    \else % at most 9
Line 8534  might help (with 'rm \jobname.?? \jobnam Line 8509  might help (with 'rm \jobname.?? \jobnam
       % @MACNAME@@@ removes braces surrounding the argument list.        % @MACNAME@@@ removes braces surrounding the argument list.
       % @MACNAME@@@@ scans the macro body with arguments substituted.        % @MACNAME@@@@ scans the macro body with arguments substituted.
       \expandafter\xdef\csname\the\macname\endcsname{%        \expandafter\xdef\csname\the\macname\endcsname{%
         \begingroup          \bgroup
         \noexpand\expandafter  % This \expandafter skip any spaces after the          \noexpand\expandafter  % This \expandafter skip any spaces after the
         \noexpand\macroargctxt % macro before we change the catcode of space.          \noexpand\macroargctxt % macro before we change the catcode of space.
         \noexpand\expandafter          \noexpand\expandafter
Line 8548  might help (with 'rm \jobname.?? \jobnam Line 8523  might help (with 'rm \jobname.?? \jobnam
       \expandafter\xdef        \expandafter\xdef
       \expandafter\expandafter        \expandafter\expandafter
         \csname\the\macname @@@@\endcsname\paramlist{%          \csname\the\macname @@@@\endcsname\paramlist{%
           \endgroup\noexpand\scanmacro{\macrobody}}%            \egroup\noexpand\scanmacro{\macrobody}}%
     \else % 10 or more:      \else % 10 or more:
       \expandafter\xdef\csname\the\macname\endcsname{%        \expandafter\xdef\csname\the\macname\endcsname{%
         \noexpand\getargvals@{\the\macname}{\argl}%          \noexpand\getargvals@{\the\macname}{\argl}%
Line 8670  might help (with 'rm \jobname.?? \jobnam Line 8645  might help (with 'rm \jobname.?? \jobnam
   \fi \macnamexxx}    \fi \macnamexxx}
   
   
 % @linemacro  
   
 \parseargdef\linemacro{%  
   \getargs{#1}% now \macname is the macname and \argl the arglist  
   \ifx\argl\empty  
     \paramno=0  
     \let\hash\relax  
     \def\paramlist{\hash 1\endlinemacro}%  
   \else  
     \expandafter\linegetparamlist\argl;%  
   \fi  
   \begingroup \macrobodyctxt \usembodybackslash  
   \parselinemacrobody  
 }  
   
 % Build up \paramlist which will be used as the parameter text for the macro.  
 % At the end it will be like "#1 #2 #3\endlinemacro".  
 \def\linegetparamlist#1;{%  
   \paramno=0\def\paramlist{}%  
   \let\hash\relax  
   \linegetparamlistxxx#1,;,%  
 }  
 \def\linegetparamlistxxx#1,{%  
   \if#1;\let\next=\linegetparamlistxxxx  
   \else \let\next=\linegetparamlistxxx  
     \advance\paramno by 1  
     \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname  
         {\hash\the\paramno}%  
     \edef\paramlist{\paramlist\hash\the\paramno\space}%  
   \fi\next}  
 \def\linegetparamlistxxxx{%  
   \expandafter\fixparamlist\paramlist\fixparamlist  
 }  
 % Replace final space token  
 \def\fixparamlist#1 \fixparamlist{%  
   \def\paramlist{#1\endlinemacro}%  
 }  
   
 % Read the body of the macro, replacing backslash-surrounded variables  
 %  
 {\catcode`\ =\other\long\gdef\parselinemacrobody#1@end linemacro{%  
 \xdef\macrobody{#1}%  
 \endgroup  
 \linemacrodef  
 }}  
   
 % Make the definition  
 \def\linemacrodef{%  
   \let\hash=##%  
   \expandafter\xdef\csname\the\macname\endcsname{%  
     \bgroup  
     \noexpand\parsearg  
     \expandafter\noexpand\csname\the\macname @@\endcsname  
   }  
   \expandafter\xdef\csname\the\macname @@\endcsname##1{%  
     \egroup  
     \expandafter\noexpand  
     \csname\the\macname @@@\endcsname##1\noexpand\endlinemacro  
   }  
   \expandafter\expandafter  
   \expandafter\xdef  
   \expandafter\expandafter\csname\the\macname @@@\endcsname\paramlist{%  
     \newlinechar=13 % split \macrobody into lines  
     \noexpand\scantokens{\macrobody}%  
   }  
 }  
   
   
   
 % @alias.  % @alias.
 % We need some trickery to remove the optional spaces around the equal  % We need some trickery to remove the optional spaces around the equal
 % sign.  Make them active and then expand them all to nothing.  % sign.  Make them active and then expand them all to nothing.
Line 8790  might help (with 'rm \jobname.?? \jobnam Line 8696  might help (with 'rm \jobname.?? \jobnam
 }  }
 \def\wordTop{Top}  \def\wordTop{Top}
   
 % Until the next @node, @part or @bye command, divert output to a box that  % Until the next @node or @bye command, divert output to a box that is not
 % is not output.  % output.
 \def\ignorenode{\setbox\dummybox\vbox\bgroup  \def\ignorenode{\setbox\dummybox\vbox\bgroup\def\node{\egroup\node}%
 \def\part{\egroup\part}%  
 \def\node{\egroup\node}%  
 \ignorenodebye  \ignorenodebye
 }  }
   
Line 8815  might help (with 'rm \jobname.?? \jobnam Line 8719  might help (with 'rm \jobname.?? \jobnam
   \fi    \fi
 }  }
   
 % @nodedescription, @nodedescriptionblock - do nothing for TeX  
 \parseargdef\nodedescription{}  
 \def\nodedescriptionblock{\doignore{nodedescriptionblock}}  
   
   
 % @anchor{NAME} -- define xref target at arbitrary point.  % @anchor{NAME} -- define xref target at arbitrary point.
 %  %
 \newcount\savesfregister  \newcount\savesfregister
Line 8901  might help (with 'rm \jobname.?? \jobnam Line 8800  might help (with 'rm \jobname.?? \jobnam
 \def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup  \def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
   \unsepspaces    \unsepspaces
   %    %
   \getprintedrefname{#1}{#3}{#5}%    % Get args without leading/trailing spaces.
     \def\printedrefname{\ignorespaces #3}%
     \setbox\printedrefnamebox = \hbox{\printedrefname\unskip}%
     %
   \def\infofilename{\ignorespaces #4}%    \def\infofilename{\ignorespaces #4}%
   \setbox\infofilenamebox = \hbox{\infofilename\unskip}%    \setbox\infofilenamebox = \hbox{\infofilename\unskip}%
   %    %
   \startxreflink{#1}{#4}%    \def\printedmanual{\ignorespaces #5}%
     \setbox\printedmanualbox  = \hbox{\printedmanual\unskip}%
     %
     % If the printed reference name (arg #3) was not explicitly given in
     % the @xref, figure out what we want to use.
     \ifdim \wd\printedrefnamebox = 0pt
       % No printed node name was explicitly given.
       \expandafter\ifx\csname SETxref-automatic-section-title\endcsname \relax
         % Not auto section-title: use node name inside the square brackets.
         \def\printedrefname{\ignorespaces #1}%
       \else
         % Auto section-title: use chapter/section title inside
         % the square brackets if we have it.
         \ifdim \wd\printedmanualbox > 0pt
           % It is in another manual, so we don't have it; use node name.
           \def\printedrefname{\ignorespaces #1}%
         \else
           \ifhavexrefs
             % We (should) know the real title if we have the xref values.
             \def\printedrefname{\refx{#1-title}{}}%
           \else
             % Otherwise just copy the Info node name.
             \def\printedrefname{\ignorespaces #1}%
           \fi%
         \fi
       \fi
     \fi
     %
     % Make link in pdf output.
     \ifpdf
       % For pdfTeX and LuaTeX
       {\indexnofonts
        \makevalueexpandable
        \turnoffactive
        % This expands tokens, so do it after making catcode changes, so _
        % etc. don't get their TeX definitions.  This ignores all spaces in
        % #4, including (wrongly) those in the middle of the filename.
        \getfilename{#4}%
        %
        % This (wrongly) does not take account of leading or trailing
        % spaces in #1, which should be ignored.
        \setpdfdestname{#1}%
        %
        \ifx\pdfdestname\empty
          \def\pdfdestname{Top}% no empty targets
        \fi
        %
        \leavevmode
        \startlink attr{/Border [0 0 0]}%
        \ifnum\filenamelength>0
          goto file{\the\filename.pdf} name{\pdfdestname}%
        \else
          goto name{\pdfmkpgn{\pdfdestname}}%
        \fi
       }%
       \setcolor{\linkcolor}%
     \else
       \ifx\XeTeXrevision\thisisundefined
       \else
         % For XeTeX
         {\indexnofonts
          \makevalueexpandable
          \turnoffactive
          % This expands tokens, so do it after making catcode changes, so _
          % etc. don't get their TeX definitions.  This ignores all spaces in
          % #4, including (wrongly) those in the middle of the filename.
          \getfilename{#4}%
          %
          % This (wrongly) does not take account of leading or trailing
          % spaces in #1, which should be ignored.
          \setpdfdestname{#1}%
          %
          \ifx\pdfdestname\empty
            \def\pdfdestname{Top}% no empty targets
          \fi
          %
          \leavevmode
          \ifnum\filenamelength>0
            % With default settings,
            % XeTeX (xdvipdfmx) replaces link destination names with integers.
            % In this case, the replaced destination names of
            % remote PDFs are no longer known.  In order to avoid a replacement,
            % you can use xdvipdfmx's command line option `-C 0x0010'.
            % If you use XeTeX 0.99996+ (TeX Live 2016+),
            % this command line option is no longer necessary
            % because we can use the `dvipdfmx:config' special.
            \special{pdf:bann << /Border [0 0 0] /Type /Annot /Subtype /Link /A
              << /S /GoToR /F (\the\filename.pdf) /D (\pdfdestname) >> >>}%
          \else
            \special{pdf:bann << /Border [0 0 0] /Type /Annot /Subtype /Link /A
              << /S /GoTo /D (\pdfdestname) >> >>}%
          \fi
         }%
         \setcolor{\linkcolor}%
       \fi
     \fi
   {%    {%
     % Have to otherify everything special to allow the \csname to      % Have to otherify everything special to allow the \csname to
     % include an _ in the xref name, etc.      % include an _ in the xref name, etc.
Line 8923  might help (with 'rm \jobname.?? \jobnam Line 8920  might help (with 'rm \jobname.?? \jobnam
     % If the user specified the print name (third arg) to the ref,      % If the user specified the print name (third arg) to the ref,
     % print it instead of our usual "Figure 1.2".      % print it instead of our usual "Figure 1.2".
     \ifdim\wd\printedrefnamebox = 0pt      \ifdim\wd\printedrefnamebox = 0pt
       \refx{#1-snt}%        \refx{#1-snt}{}%
     \else      \else
       \printedrefname        \printedrefname
     \fi      \fi
Line 8958  might help (with 'rm \jobname.?? \jobnam Line 8955  might help (with 'rm \jobname.?? \jobnam
     \else      \else
       % Reference within this manual.        % Reference within this manual.
       %        %
       % Only output a following space if the -snt ref is nonempty, as the ref        % Only output a following space if the -snt ref is nonempty; for
       % will be empty for @unnumbered and @anchor.        % @unnumbered and @anchor, it won't be.
       \setbox2 = \hbox{\ignorespaces \refx{#1-snt}}%        \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
       \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi        \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
       %        %
       % output the `[mynode]' via the macro below so it can be overridden.        % output the `[mynode]' via the macro below so it can be overridden.
       \xrefprintnodename\printedrefname        \xrefprintnodename\printedrefname
       %        %
       \ifflagclear{txiomitxrefpg}{%        % But we always want a comma and a space:
         % We always want a comma        ,\space
         ,%        %
         % output the `page 3'.        % output the `page 3'.
         \turnoffactive \putpageref{#1}%        \turnoffactive \putwordpage\tie\refx{#1-pg}{}%
         % Add a , if xref followed by a space        % Add a , if xref followed by a space
         \if\space\noexpand\tokenafterxref ,%        \if\space\noexpand\tokenafterxref ,%
         \else\ifx\      \tokenafterxref ,% @TAB        \else\ifx\        \tokenafterxref ,% @TAB
         \else\ifx\*\tokenafterxref ,%   @*        \else\ifx\*\tokenafterxref ,%   @*
         \else\ifx\ \tokenafterxref ,%   @SPACE        \else\ifx\ \tokenafterxref ,%   @SPACE
         \else\ifx\        \else\ifx\
                   \tokenafterxref ,%    @NL                  \tokenafterxref ,%    @NL
         \else\ifx\tie\tokenafterxref ,% @tie        \else\ifx\tie\tokenafterxref ,% @tie
         \fi\fi\fi\fi\fi\fi        \fi\fi\fi\fi\fi\fi
       }{}%  
     \fi\fi      \fi\fi
   \fi    \fi
   \endlink    \endlink
 \endgroup}  \endgroup}
   
 % \getprintedrefname{NODE}{LABEL}{MANUAL}  
 % - set \printedrefname and \printedmanual  
 %  
 \def\getprintedrefname#1#2#3{%  
   % Get args without leading/trailing spaces.  
   \def\printedrefname{\ignorespaces #2}%  
   \setbox\printedrefnamebox = \hbox{\printedrefname\unskip}%  
   %  
   \def\printedmanual{\ignorespaces #3}%  
   \setbox\printedmanualbox  = \hbox{\printedmanual\unskip}%  
   %  
   % If the printed reference name (arg #2) was not explicitly given in  
   % the @xref, figure out what we want to use.  
   \ifdim \wd\printedrefnamebox = 0pt  
     % No printed node name was explicitly given.  
     \expandafter\ifx\csname SETxref-automatic-section-title\endcsname \relax  
       % Not auto section-title: use node name inside the square brackets.  
       \def\printedrefname{\ignorespaces #1}%  
     \else  
       % Auto section-title: use chapter/section title inside  
       % the square brackets if we have it.  
       \ifdim \wd\printedmanualbox > 0pt  
         % It is in another manual, so we don't have it; use node name.  
         \def\printedrefname{\ignorespaces #1}%  
       \else  
         \ifhavexrefs  
           % We (should) know the real title if we have the xref values.  
           \def\printedrefname{\refx{#1-title}}%  
         \else  
           % Otherwise just copy the Info node name.  
           \def\printedrefname{\ignorespaces #1}%  
         \fi%  
       \fi  
     \fi  
   \fi  
 }  
   
 % \startxreflink{NODE}{FILE} - start link in pdf output.  
 \def\startxreflink#1#2{%  
   \ifpdforxetex  
     % For pdfTeX and LuaTeX  
     {\indexnofonts  
      \makevalueexpandable  
      \turnoffactive  
      % This expands tokens, so do it after making catcode changes, so _  
      % etc. don't get their TeX definitions.  This ignores all spaces in  
      % #2, including (wrongly) those in the middle of the filename.  
      \getfilename{#2}%  
      %  
      % This (wrongly) does not take account of leading or trailing  
      % spaces in #1, which should be ignored.  
      \setpdfdestname{#1}%  
      %  
      \ifx\pdfdestname\empty  
        \def\pdfdestname{Top}% no empty targets  
      \fi  
      %  
      \leavevmode  
      \ifpdf  
        \startlink attr{/Border [0 0 0]}%  
        \ifnum\filenamelength>0  
          goto file{\the\filename.pdf} name{\pdfdestname}%  
        \else  
          goto name{\pdfmkpgn{\pdfdestname}}%  
        \fi  
      \else % XeTeX  
        \ifnum\filenamelength>0  
          % With default settings,  
          % XeTeX (xdvipdfmx) replaces link destination names with integers.  
          % In this case, the replaced destination names of  
          % remote PDFs are no longer known.  In order to avoid a replacement,  
          % you can use xdvipdfmx's command line option `-C 0x0010'.  
          % If you use XeTeX 0.99996+ (TeX Live 2016+),  
          % this command line option is no longer necessary  
          % because we can use the `dvipdfmx:config' special.  
          \special{pdf:bann << /Border [0 0 0] /Type /Annot /Subtype /Link /A  
            << /S /GoToR /F (\the\filename.pdf) /D (\pdfdestname) >> >>}%  
        \else  
          \special{pdf:bann << /Border [0 0 0] /Type /Annot /Subtype /Link /A  
            << /S /GoTo /D (\pdfdestname) >> >>}%  
        \fi  
      \fi  
     }%  
     \setcolor{\linkcolor}%  
   \fi  
 }  
   
 % can be overridden in translation files  
 \def\putpageref#1{%  
   \space\putwordpage\tie\refx{#1-pg}}  
   
 % Output a cross-manual xref to #1.  Used just above (twice).  % Output a cross-manual xref to #1.  Used just above (twice).
 %  %
 % Only include the text "Section ``foo'' in" if the foo is neither  % Only include the text "Section ``foo'' in" if the foo is neither
Line 9110  might help (with 'rm \jobname.?? \jobnam Line 9015  might help (with 'rm \jobname.?? \jobnam
 %  %
 \def\xrefprintnodename#1{[#1]}  \def\xrefprintnodename#1{[#1]}
   
 % @link{NODENAME, LABEL, MANUAL} - create a "plain" link, with no  
 % page number.  Not useful if printed on paper.  
 %  
 \def\link#1{\linkX[#1,,,]}  
 \def\linkX[#1,#2,#3,#4]{%  
   \begingroup  
   \unsepspaces  
   \getprintedrefname{#1}{#2}{#3}%  
   \startxreflink{#1}{#3}%  
   \printedrefname  
   \endlink  
   \endgroup  
 }  
   
   
 % Things referred to by \setref.  % Things referred to by \setref.
 %  %
 \def\Ynothing{}  \def\Ynothing{}
Line 9153  might help (with 'rm \jobname.?? \jobnam Line 9043  might help (with 'rm \jobname.?? \jobnam
   \fi\fi\fi    \fi\fi\fi
 }  }
   
 % \refx{NAME} - reference a cross-reference string named NAME.  % \refx{NAME}{SUFFIX} - reference a cross-reference string named NAME.  SUFFIX
 \def\refx#1{%  % is output afterwards if non-empty.
   \def\refx#1#2{%
   \requireauxfile    \requireauxfile
   {%    {%
     \indexnofonts      \indexnofonts
Line 9181  might help (with 'rm \jobname.?? \jobnam Line 9072  might help (with 'rm \jobname.?? \jobnam
     % It's defined, so just use it.      % It's defined, so just use it.
     \thisrefX      \thisrefX
   \fi    \fi
     #2% Output the suffix in any case.
 }  }
   
 % This is the macro invoked by entries in the aux file.  Define a control  % This is the macro invoked by entries in the aux file.  Define a control
Line 9290  might help (with 'rm \jobname.?? \jobnam Line 9182  might help (with 'rm \jobname.?? \jobnam
   \catcode`\[=\other    \catcode`\[=\other
   \catcode`\]=\other    \catcode`\]=\other
   \catcode`\"=\other    \catcode`\"=\other
   \catcode`\_=\active    \catcode`\_=\other
   \catcode`\|=\active    \catcode`\|=\other
   \catcode`\<=\active    \catcode`\<=\other
   \catcode`\>=\active    \catcode`\>=\other
   \catcode`\$=\other    \catcode`\$=\other
   \catcode`\#=\other    \catcode`\#=\other
   \catcode`\&=\other    \catcode`\&=\other
Line 9503  might help (with 'rm \jobname.?? \jobnam Line 9395  might help (with 'rm \jobname.?? \jobnam
     \imagexxx #1,,,,,\finish      \imagexxx #1,,,,,\finish
   \fi    \fi
 }  }
   
 % Approximate height of a line in the standard text font.  
 \newdimen\capheight  
 \setbox0=\vbox{\tenrm H}  
 \capheight=\ht0  
   
 %  %
 % Arguments to @image:  % Arguments to @image:
 % #1 is (mandatory) image filename; we tack on .eps extension.  % #1 is (mandatory) image filename; we tack on .eps extension.
Line 9520  might help (with 'rm \jobname.?? \jobnam Line 9406  might help (with 'rm \jobname.?? \jobnam
 \def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup  \def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup
   \catcode`\^^M = 5     % in case we're inside an example    \catcode`\^^M = 5     % in case we're inside an example
   \normalturnoffactive  % allow _ et al. in names    \normalturnoffactive  % allow _ et al. in names
   \makevalueexpandable    \def\xprocessmacroarg{\eatspaces}% in case we are being used via a macro
     % If the image is by itself, center it.
   \ifvmode    \ifvmode
     \imagevmodetrue      \imagevmodetrue
     \medskip    \else \ifx\centersub\centerV
       % for @center @image, we need a vbox so we can have our vertical space
       \imagevmodetrue
       \vbox\bgroup % vbox has better behavior than vtop herev
     \fi\fi
     %
     \ifimagevmode
       \nobreak\medskip
     % Usually we'll have text after the image which will insert      % Usually we'll have text after the image which will insert
     % \parskip glue, so insert it here too to equalize the space      % \parskip glue, so insert it here too to equalize the space
     % above and below.      % above and below.
     \vskip\parskip      \nobreak\vskip\parskip
     %      \nobreak
     % Place image in a \vtop for a top page margin that is (close to) correct,  
     % as \topskip glue is relative to the first baseline.  
     \vtop\bgroup \kern -\capheight \vskip-\parskip  
   \fi    \fi
   %    %
   \ifx\centersub\centerV    % Leave vertical mode so that indentation from an enclosing
     % For @center @image, enter vertical mode and add vertical space    %  environment such as @quotation is respected.
     % Enter an extra \parskip because @center doesn't add space itself.    % However, if we're at the top level, we don't want the
     \vbox\bgroup\vskip\parskip\medskip\vskip\parskip    %  normal paragraph indentation.
   \else    % On the other hand, if we are in the case of @center @image, we don't
     % Enter horizontal mode so that indentation from an enclosing    %  want to start a paragraph, which will create a hsize-width box and
     %  environment such as @quotation is respected.    %  eradicate the centering.
     % However, if we're at the top level, we don't want the    \ifx\centersub\centerV\else \noindent \fi
     %  normal paragraph indentation.  
     \imageindent  
   \fi  
   %    %
   % Output the image.    % Output the image.
   \ifpdf    \ifpdf
Line 9566  might help (with 'rm \jobname.?? \jobnam Line 9454  might help (with 'rm \jobname.?? \jobnam
   \fi    \fi
   %    %
   \ifimagevmode    \ifimagevmode
     \egroup  
     \medskip  % space after a standalone image      \medskip  % space after a standalone image
   \fi    \fi
   \ifx\centersub\centerV % @center @image    \ifx\centersub\centerV \egroup \fi
     \medskip  
     \egroup % close \vbox  
   \fi  
 \endgroup}  \endgroup}
   
   
Line 9739  might help (with 'rm \jobname.?? \jobnam Line 9623  might help (with 'rm \jobname.?? \jobnam
 %  %
 \def\caption{\docaption\thiscaption}  \def\caption{\docaption\thiscaption}
 \def\shortcaption{\docaption\thisshortcaption}  \def\shortcaption{\docaption\thisshortcaption}
 \def\docaption{\checkenv\float \bgroup\scanctxt\docaptionz}  \def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption}
 \def\docaptionz#1#2{\egroup \def#1{#2}}  \def\defcaption#1#2{\egroup \def#1{#2}}
   
 % The parameter is the control sequence identifying the counter we are  % The parameter is the control sequence identifying the counter we are
 % going to use.  Create it if it doesn't exist and assign it to \floatno.  % going to use.  Create it if it doesn't exist and assign it to \floatno.
Line 10029  directory should work if nowhere else do Line 9913  directory should work if nowhere else do
        % For native Unicode handling (XeTeX and LuaTeX)         % For native Unicode handling (XeTeX and LuaTeX)
        \nativeunicodechardefs         \nativeunicodechardefs
      \else       \else
        % For treating UTF-8 as byte sequences (TeX, eTeX and pdfTeX).         % For treating UTF-8 as byte sequences (TeX, eTeX and pdfTeX)
        % Since we already invoke \utfeightchardefs at the top level,  
        % making non-ascii chars active is sufficient.  
        \setnonasciicharscatcode\active         \setnonasciicharscatcode\active
          % since we already invoked \utfeightchardefs at the top level
          % (below), do not re-invoke it, otherwise our check for duplicated
          % definitions gets triggered.  Making non-ascii chars active is
          % sufficient.
      \fi       \fi
   %    %
   \else    \else
Line 10057  directory should work if nowhere else do Line 9943  directory should work if nowhere else do
   \fi    \fi
 }  }
   
   % emacs-page
 % A message to be logged when using a character that isn't available  % A message to be logged when using a character that isn't available
 % the default font encoding (OT1).  % the default font encoding (OT1).
 %  %
Line 10065  directory should work if nowhere else do Line 9952  directory should work if nowhere else do
 % Take account of \c (plain) vs. \, (Texinfo) difference.  % Take account of \c (plain) vs. \, (Texinfo) difference.
 \def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi}  \def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi}
   
   % First, make active non-ASCII characters in order for them to be
   % correctly categorized when TeX reads the replacement text of
   % macros containing the character definitions.
   \setnonasciicharscatcode\active
   %
   
 \def\gdefchar#1#2{%  \def\gdefchar#1#2{%
 \gdef#1{%  \gdef#1{%
    \ifpassthroughchars     \ifpassthroughchars
Line 10074  directory should work if nowhere else do Line 9967  directory should work if nowhere else do
    \fi     \fi
 }}  }}
   
 \begingroup  
   
 % Make non-ASCII characters active for defining the character definition  
 % macros.  
 \setnonasciicharscatcode\active  
   
 % Latin1 (ISO-8859-1) character definitions.  % Latin1 (ISO-8859-1) character definitions.
 \gdef\latonechardefs{%  \def\latonechardefs{%
   \gdefchar^^a0{\tie}    \gdefchar^^a0{\tie}
   \gdefchar^^a1{\exclamdown}    \gdefchar^^a1{\exclamdown}
   \gdefchar^^a2{{\tcfont \char162}} % cent    \gdefchar^^a2{{\tcfont \char162}} % cent
Line 10186  directory should work if nowhere else do Line 10073  directory should work if nowhere else do
 }  }
   
 % Latin9 (ISO-8859-15) encoding character definitions.  % Latin9 (ISO-8859-15) encoding character definitions.
 \gdef\latninechardefs{%  \def\latninechardefs{%
   % Encoding is almost identical to Latin1.    % Encoding is almost identical to Latin1.
   \latonechardefs    \latonechardefs
   %    %
Line 10201  directory should work if nowhere else do Line 10088  directory should work if nowhere else do
 }  }
   
 % Latin2 (ISO-8859-2) character definitions.  % Latin2 (ISO-8859-2) character definitions.
 \gdef\lattwochardefs{%  \def\lattwochardefs{%
   \gdefchar^^a0{\tie}    \gdefchar^^a0{\tie}
   \gdefchar^^a1{\ogonek{A}}    \gdefchar^^a1{\ogonek{A}}
   \gdefchar^^a2{\u{}}    \gdefchar^^a2{\u{}}
Line 10219  directory should work if nowhere else do Line 10106  directory should work if nowhere else do
   \gdefchar^^ae{\v Z}    \gdefchar^^ae{\v Z}
   \gdefchar^^af{\dotaccent Z}    \gdefchar^^af{\dotaccent Z}
   %    %
   \gdefchar^^b0{\textdegree}    \gdefchar^^b0{\textdegree{}}
   \gdefchar^^b1{\ogonek{a}}    \gdefchar^^b1{\ogonek{a}}
   \gdefchar^^b2{\ogonek{ }}    \gdefchar^^b2{\ogonek{ }}
   \gdefchar^^b3{\l}    \gdefchar^^b3{\l}
Line 10305  directory should work if nowhere else do Line 10192  directory should work if nowhere else do
   \gdefchar^^ff{\dotaccent{}}    \gdefchar^^ff{\dotaccent{}}
 }  }
   
 \endgroup % active chars  
   
 % UTF-8 character definitions.  % UTF-8 character definitions.
 %  %
 % This code to support UTF-8 is based on LaTeX's utf8.def, with some  % This code to support UTF-8 is based on LaTeX's utf8.def, with some
Line 10458  directory should work if nowhere else do Line 10343  directory should work if nowhere else do
   % Given the value in \countUTFz as a Unicode code point, set \UTFviiiTmp    % Given the value in \countUTFz as a Unicode code point, set \UTFviiiTmp
   % to the corresponding UTF-8 sequence.    % to the corresponding UTF-8 sequence.
   \gdef\parseXMLCharref{%    \gdef\parseXMLCharref{%
     \ifnum\countUTFz < "20\relax      \ifnum\countUTFz < "A0\relax
       \errhelp = \EMsimple        \errhelp = \EMsimple
       \errmessage{Cannot define Unicode char value < 0020}%        \errmessage{Cannot define Unicode char value < 00A0}%
     \else\ifnum\countUTFz < "800\relax      \else\ifnum\countUTFz < "800\relax
       \parseUTFviiiA,%        \parseUTFviiiA,%
       \parseUTFviiiB C\UTFviiiTwoOctetsName.,%        \parseUTFviiiB C\UTFviiiTwoOctetsName.,%
Line 10530  directory should work if nowhere else do Line 10415  directory should work if nowhere else do
 % least make most of the characters not bomb out.  % least make most of the characters not bomb out.
 %  %
 \def\unicodechardefs{%  \def\unicodechardefs{%
   \DeclareUnicodeCharacter{0020}{ } % space  
   \DeclareUnicodeCharacter{0021}{\char"21 }% % space to terminate number  
   \DeclareUnicodeCharacter{0022}{\char"22 }%  
   \DeclareUnicodeCharacter{0023}{\char"23 }%  
   \DeclareUnicodeCharacter{0024}{\char"24 }%  
   \DeclareUnicodeCharacter{0025}{\char"25 }%  
   \DeclareUnicodeCharacter{0026}{\char"26 }%  
   \DeclareUnicodeCharacter{0027}{\char"27 }%  
   \DeclareUnicodeCharacter{0028}{\char"28 }%  
   \DeclareUnicodeCharacter{0029}{\char"29 }%  
   \DeclareUnicodeCharacter{002A}{\char"2A }%  
   \DeclareUnicodeCharacter{002B}{\char"2B }%  
   \DeclareUnicodeCharacter{002C}{\char"2C }%  
   \DeclareUnicodeCharacter{002D}{\char"2D }%  
   \DeclareUnicodeCharacter{002E}{\char"2E }%  
   \DeclareUnicodeCharacter{002F}{\char"2F }%  
   \DeclareUnicodeCharacter{0030}{0}%  
   \DeclareUnicodeCharacter{0031}{1}%  
   \DeclareUnicodeCharacter{0032}{2}%  
   \DeclareUnicodeCharacter{0033}{3}%  
   \DeclareUnicodeCharacter{0034}{4}%  
   \DeclareUnicodeCharacter{0035}{5}%  
   \DeclareUnicodeCharacter{0036}{6}%  
   \DeclareUnicodeCharacter{0037}{7}%  
   \DeclareUnicodeCharacter{0038}{8}%  
   \DeclareUnicodeCharacter{0039}{9}%  
   \DeclareUnicodeCharacter{003A}{\char"3A }%  
   \DeclareUnicodeCharacter{003B}{\char"3B }%  
   \DeclareUnicodeCharacter{003C}{\char"3C }%  
   \DeclareUnicodeCharacter{003D}{\char"3D }%  
   \DeclareUnicodeCharacter{003E}{\char"3E }%  
   \DeclareUnicodeCharacter{003F}{\char"3F }%  
   \DeclareUnicodeCharacter{0040}{\char"40 }%  
   \DeclareUnicodeCharacter{0041}{A}%  
   \DeclareUnicodeCharacter{0042}{B}%  
   \DeclareUnicodeCharacter{0043}{C}%  
   \DeclareUnicodeCharacter{0044}{D}%  
   \DeclareUnicodeCharacter{0045}{E}%  
   \DeclareUnicodeCharacter{0046}{F}%  
   \DeclareUnicodeCharacter{0047}{G}%  
   \DeclareUnicodeCharacter{0048}{H}%  
   \DeclareUnicodeCharacter{0049}{I}%  
   \DeclareUnicodeCharacter{004A}{J}%  
   \DeclareUnicodeCharacter{004B}{K}%  
   \DeclareUnicodeCharacter{004C}{L}%  
   \DeclareUnicodeCharacter{004D}{M}%  
   \DeclareUnicodeCharacter{004E}{N}%  
   \DeclareUnicodeCharacter{004F}{O}%  
   \DeclareUnicodeCharacter{0050}{P}%  
   \DeclareUnicodeCharacter{0051}{Q}%  
   \DeclareUnicodeCharacter{0052}{R}%  
   \DeclareUnicodeCharacter{0053}{S}%  
   \DeclareUnicodeCharacter{0054}{T}%  
   \DeclareUnicodeCharacter{0055}{U}%  
   \DeclareUnicodeCharacter{0056}{V}%  
   \DeclareUnicodeCharacter{0057}{W}%  
   \DeclareUnicodeCharacter{0058}{X}%  
   \DeclareUnicodeCharacter{0059}{Y}%  
   \DeclareUnicodeCharacter{005A}{Z}%  
   \DeclareUnicodeCharacter{005B}{\char"5B }%  
   \DeclareUnicodeCharacter{005C}{\char"5C }%  
   \DeclareUnicodeCharacter{005D}{\char"5D }%  
   \DeclareUnicodeCharacter{005E}{\char"5E }%  
   \DeclareUnicodeCharacter{005F}{\char"5F }%  
   \DeclareUnicodeCharacter{0060}{\char"60 }%  
   \DeclareUnicodeCharacter{0061}{a}%  
   \DeclareUnicodeCharacter{0062}{b}%  
   \DeclareUnicodeCharacter{0063}{c}%  
   \DeclareUnicodeCharacter{0064}{d}%  
   \DeclareUnicodeCharacter{0065}{e}%  
   \DeclareUnicodeCharacter{0066}{f}%  
   \DeclareUnicodeCharacter{0067}{g}%  
   \DeclareUnicodeCharacter{0068}{h}%  
   \DeclareUnicodeCharacter{0069}{i}%  
   \DeclareUnicodeCharacter{006A}{j}%  
   \DeclareUnicodeCharacter{006B}{k}%  
   \DeclareUnicodeCharacter{006C}{l}%  
   \DeclareUnicodeCharacter{006D}{m}%  
   \DeclareUnicodeCharacter{006E}{n}%  
   \DeclareUnicodeCharacter{006F}{o}%  
   \DeclareUnicodeCharacter{0070}{p}%  
   \DeclareUnicodeCharacter{0071}{q}%  
   \DeclareUnicodeCharacter{0072}{r}%  
   \DeclareUnicodeCharacter{0073}{s}%  
   \DeclareUnicodeCharacter{0074}{t}%  
   \DeclareUnicodeCharacter{0075}{u}%  
   \DeclareUnicodeCharacter{0076}{v}%  
   \DeclareUnicodeCharacter{0077}{w}%  
   \DeclareUnicodeCharacter{0078}{x}%  
   \DeclareUnicodeCharacter{0079}{y}%  
   \DeclareUnicodeCharacter{007A}{z}%  
   \DeclareUnicodeCharacter{007B}{\char"7B }%  
   \DeclareUnicodeCharacter{007C}{\char"7C }%  
   \DeclareUnicodeCharacter{007D}{\char"7D }%  
   \DeclareUnicodeCharacter{007E}{\char"7E }%  
   % \DeclareUnicodeCharacter{007F}{} % DEL  
   %  
   \DeclareUnicodeCharacter{00A0}{\tie}%    \DeclareUnicodeCharacter{00A0}{\tie}%
   \DeclareUnicodeCharacter{00A1}{\exclamdown}%    \DeclareUnicodeCharacter{00A1}{\exclamdown}%
   \DeclareUnicodeCharacter{00A2}{{\tcfont \char162}}% 0242=cent    \DeclareUnicodeCharacter{00A2}{{\tcfont \char162}}% 0242=cent
Line 10644  directory should work if nowhere else do Line 10432  directory should work if nowhere else do
   \DeclareUnicodeCharacter{00AE}{\registeredsymbol{}}%    \DeclareUnicodeCharacter{00AE}{\registeredsymbol{}}%
   \DeclareUnicodeCharacter{00AF}{\={ }}%    \DeclareUnicodeCharacter{00AF}{\={ }}%
   %    %
   \DeclareUnicodeCharacter{00B0}{\textdegree}%    \DeclareUnicodeCharacter{00B0}{\ringaccent{ }}%
   \DeclareUnicodeCharacter{00B1}{\ensuremath\pm}%    \DeclareUnicodeCharacter{00B1}{\ensuremath\pm}%
   \DeclareUnicodeCharacter{00B2}{$^2$}%    \DeclareUnicodeCharacter{00B2}{$^2$}%
   \DeclareUnicodeCharacter{00B3}{$^3$}%    \DeclareUnicodeCharacter{00B3}{$^3$}%
Line 10918  directory should work if nowhere else do Line 10706  directory should work if nowhere else do
   \DeclareUnicodeCharacter{0233}{\=y}%    \DeclareUnicodeCharacter{0233}{\=y}%
   \DeclareUnicodeCharacter{0237}{\dotless{j}}%    \DeclareUnicodeCharacter{0237}{\dotless{j}}%
   %    %
   \DeclareUnicodeCharacter{02BC}{'}%  
   %  
   \DeclareUnicodeCharacter{02DB}{\ogonek{ }}%    \DeclareUnicodeCharacter{02DB}{\ogonek{ }}%
   %    %
   % Greek letters upper case    % Greek letters upper case
Line 11126  directory should work if nowhere else do Line 10912  directory should work if nowhere else do
   \DeclareUnicodeCharacter{1EF8}{\~Y}%    \DeclareUnicodeCharacter{1EF8}{\~Y}%
   \DeclareUnicodeCharacter{1EF9}{\~y}%    \DeclareUnicodeCharacter{1EF9}{\~y}%
   %    %
   % Exotic spaces  
   \DeclareUnicodeCharacter{2007}{\hphantom{0}}%  
   %  
   % Punctuation    % Punctuation
   \DeclareUnicodeCharacter{2013}{--}%    \DeclareUnicodeCharacter{2013}{--}%
   \DeclareUnicodeCharacter{2014}{---}%    \DeclareUnicodeCharacter{2014}{---}%
Line 11148  directory should work if nowhere else do Line 10931  directory should work if nowhere else do
   %    %
   \DeclareUnicodeCharacter{20AC}{\euro{}}%    \DeclareUnicodeCharacter{20AC}{\euro{}}%
   %    %
   \DeclareUnicodeCharacter{2192}{\arrow}%    \DeclareUnicodeCharacter{2192}{\expansion{}}%
   \DeclareUnicodeCharacter{21D2}{\result{}}%    \DeclareUnicodeCharacter{21D2}{\result{}}%
   %    %
   % Mathematical symbols    % Mathematical symbols
Line 11311  directory should work if nowhere else do Line 11094  directory should work if nowhere else do
 % provide a definition macro to replace/pass-through a Unicode character  % provide a definition macro to replace/pass-through a Unicode character
 %  %
 \def\DeclareUnicodeCharacterNative#1#2{%  \def\DeclareUnicodeCharacterNative#1#2{%
   \ifnum"#1>"7F % only make non-ASCII chars active    \catcode"#1=\active
     \catcode"#1=\active    \def\dodeclareunicodecharacternative##1##2##3{%
     \def\dodeclareunicodecharacternative##1##2##3{%  
       \begingroup  
         \uccode`\~="##2\relax  
         \uppercase{\gdef~}{%  
           \ifpassthroughchars  
             ##1%  
           \else  
             ##3%  
           \fi  
         }  
       \endgroup  
     }  
     \begingroup      \begingroup
       \uccode`\.="#1\relax        \uccode`\~="##2\relax
       \uppercase{\def\UTFNativeTmp{.}}%        \uppercase{\gdef~}{%
       \expandafter\dodeclareunicodecharacternative\UTFNativeTmp{#1}{#2}%          \ifpassthroughchars
             ##1%
           \else
             ##3%
           \fi
         }
     \endgroup      \endgroup
   \fi    }
     \begingroup
       \uccode`\.="#1\relax
       \uppercase{\def\UTFNativeTmp{.}}%
       \expandafter\dodeclareunicodecharacternative\UTFNativeTmp{#1}{#2}%
     \endgroup
 }  }
   
 % Native Unicode handling (XeTeX and LuaTeX) character replacing definition.  % Native Unicode handling (XeTeX and LuaTeX) character replacing definition.
Line 11359  directory should work if nowhere else do Line 11140  directory should work if nowhere else do
    \relax     \relax
 }  }
   
 % Define all Unicode characters we know about  % Define all Unicode characters we know about.  This makes UTF-8 the default
   % input encoding and allows @U to work.
 \iftxinativeunicodecapable  \iftxinativeunicodecapable
   \nativeunicodechardefsatu    \nativeunicodechardefsatu
 \else  \else
   \utfeightchardefs    \utfeightchardefs
 \fi  \fi
   
   
 \message{formatting,}  \message{formatting,}
   
 \newdimen\defaultparindent \defaultparindent = 15pt  \newdimen\defaultparindent \defaultparindent = 15pt
Line 11413  directory should work if nowhere else do Line 11194  directory should work if nowhere else do
   %    %
   \vsize = #1\relax    \vsize = #1\relax
   \advance\vsize by \topskip    \advance\vsize by \topskip
     \outervsize = \vsize
     \advance\outervsize by 2\topandbottommargin
   \txipageheight = \vsize    \txipageheight = \vsize
   %    %
   \hsize = #2\relax    \hsize = #2\relax
     \outerhsize = \hsize
     \advance\outerhsize by 0.5in
   \txipagewidth = \hsize    \txipagewidth = \hsize
   %    %
   \normaloffset = #4\relax    \normaloffset = #4\relax
Line 11472  directory should work if nowhere else do Line 11257  directory should work if nowhere else do
   \defbodyindent = .5cm    \defbodyindent = .5cm
 }}  }}
   
   % Use @smallerbook to reset parameters for 6x9 trim size.
   % (Just testing, parameters still in flux.)
   \def\smallerbook{{\globaldefs = 1
     \parskip = 1.5pt plus 1pt
     \textleading = 12pt
     %
     \internalpagesizes{7.4in}{4.8in}%
                       {-.2in}{-.4in}%
                       {0pt}{14pt}%
                       {9in}{6in}%
     %
     \lispnarrowing = 0.25in
     \tolerance = 700
     \contentsrightmargin = 0pt
     \defbodyindent = .4cm
   }}
   
 % Use @afourpaper to print on European A4 paper.  % Use @afourpaper to print on European A4 paper.
 \def\afourpaper{{\globaldefs = 1  \def\afourpaper{{\globaldefs = 1
   \parskip = 3pt plus 2pt minus 1pt    \parskip = 3pt plus 2pt minus 1pt
Line 11505  directory should work if nowhere else do Line 11307  directory should work if nowhere else do
   \textleading = 12.5pt    \textleading = 12.5pt
   %    %
   \internalpagesizes{160mm}{120mm}%    \internalpagesizes{160mm}{120mm}%
                     {\voffset}{-11.4mm}%                      {\voffset}{\hoffset}%
                     {\bindingoffset}{8pt}%                      {\bindingoffset}{8pt}%
                     {210mm}{148mm}%                      {210mm}{148mm}%
   %    %
Line 11538  directory should work if nowhere else do Line 11340  directory should work if nowhere else do
   \globaldefs = 0    \globaldefs = 0
 }}  }}
   
 \def\bsixpaper{{\globaldefs = 1  
   \afourpaper  
   \internalpagesizes{140mm}{100mm}%  
                     {-6.35mm}{-12.7mm}%  
                     {\bindingoffset}{14pt}%  
                     {176mm}{125mm}%  
   \let\SETdispenvsize=\smallword  
   \lispnarrowing = 0.2in  
   \globaldefs = 0  
 }}  
   
   
 % @pagesizes TEXTHEIGHT[,TEXTWIDTH]  % @pagesizes TEXTHEIGHT[,TEXTWIDTH]
 % Perhaps we should allow setting the margins, \topskip, \parskip,  % Perhaps we should allow setting the margins, \topskip, \parskip,
 % and/or leading, also. Or perhaps we should compute them somehow.  % and/or leading, also. Or perhaps we should compute them somehow.
Line 11563  directory should work if nowhere else do Line 11353  directory should work if nowhere else do
   \setleading{\textleading}%    \setleading{\textleading}%
   %    %
   \dimen0 = #1\relax    \dimen0 = #1\relax
   \advance\dimen0 by 2.5in % default 1in margin above heading line    \advance\dimen0 by \voffset
                            % and 1.5in to include heading, footing and    \advance\dimen0 by 1in % reference point for DVI is 1 inch from top of page
                            % bottom margin  
   %    %
   \dimen2 = \hsize    \dimen2 = \hsize
   \advance\dimen2 by 2in % default to 1 inch margin on each side    \advance\dimen2 by \normaloffset
     \advance\dimen2 by 1in % reference point is 1 inch from left edge of page
   %    %
   \internalpagesizes{#1}{\hsize}%    \internalpagesizes{#1}{\hsize}%
                     {\voffset}{\normaloffset}%                      {\voffset}{\normaloffset}%
Line 11584  directory should work if nowhere else do Line 11374  directory should work if nowhere else do
 \hfuzz = 1pt  \hfuzz = 1pt
   
   
 \message{microtype,}  
   
 % protrusion, from Thanh's protcode.tex.  
 \def\mtsetprotcode#1{%  
   \rpcode#1`\!=200  \rpcode#1`\,=700  \rpcode#1`\-=700  \rpcode#1`\.=700  
   \rpcode#1`\;=500  \rpcode#1`\:=500  \rpcode#1`\?=200  
   \rpcode#1`\'=700  
   \rpcode#1 34=500  % ''  
   \rpcode#1 123=300 % --  
   \rpcode#1 124=200 % ---  
   \rpcode#1`\)=50   \rpcode#1`\A=50   \rpcode#1`\F=50   \rpcode#1`\K=50  
   \rpcode#1`\L=50   \rpcode#1`\T=50   \rpcode#1`\V=50   \rpcode#1`\W=50  
   \rpcode#1`\X=50   \rpcode#1`\Y=50   \rpcode#1`\k=50   \rpcode#1`\r=50  
   \rpcode#1`\t=50   \rpcode#1`\v=50   \rpcode#1`\w=50   \rpcode#1`\x=50  
   \rpcode#1`\y=50  
   %  
   \lpcode#1`\`=700  
   \lpcode#1 92=500  % ``  
   \lpcode#1`\(=50   \lpcode#1`\A=50   \lpcode#1`\J=50   \lpcode#1`\T=50  
   \lpcode#1`\V=50   \lpcode#1`\W=50   \lpcode#1`\X=50   \lpcode#1`\Y=50  
   \lpcode#1`\v=50   \lpcode#1`\w=50   \lpcode#1`\x=50   \lpcode#1`\y=0  
   %  
   \mtadjustprotcode#1\relax  
 }  
   
 \newcount\countC  
 \def\mtadjustprotcode#1{%  
   \countC=0  
   \loop  
     \ifcase\lpcode#1\countC\else  
       \mtadjustcp\lpcode#1\countC  
     \fi  
     \ifcase\rpcode#1\countC\else  
       \mtadjustcp\rpcode#1\countC  
     \fi  
     \advance\countC 1  
   \ifnum\countC < 256 \repeat  
 }  
   
 \newcount\countB  
 \def\mtadjustcp#1#2#3{%  
   \setbox\boxA=\hbox{%  
     \ifx#2\font\else#2\fi  
     \char#3}%  
   \countB=\wd\boxA  
   \multiply\countB #1#2#3\relax  
   \divide\countB \fontdimen6 #2\relax  
   #1#2#3=\countB\relax  
 }  
   
 \ifx\XeTeXrevision\thisisundefined  
   \ifx\luatexversion\thisisundefined  
     \ifpdf % pdfTeX  
       \mtsetprotcode\textrm  
       \def\mtfontexpand#1{\pdffontexpand#1 20 20 1 autoexpand\relax}  
     \else % TeX  
       \def\mtfontexpand#1{}  
     \fi  
   \else % LuaTeX  
     \mtsetprotcode\textrm  
     \def\mtfontexpand#1{\expandglyphsinfont#1 20 20 1\relax}  
   \fi  
 \else % XeTeX  
   \mtsetprotcode\textrm  
   \def\mtfontexpand#1{}  
 \fi  
   
   
 \newif\ifmicrotype  
   
 \def\microtypeON{%  
   \microtypetrue  
   %  
   \ifx\XeTeXrevision\thisisundefined  
     \ifx\luatexversion\thisisundefined  
       \ifpdf % pdfTeX  
         \pdfadjustspacing=2  
         \pdfprotrudechars=2  
       \fi  
     \else % LuaTeX  
       \adjustspacing=2  
       \protrudechars=2  
     \fi  
   \else % XeTeX  
     \XeTeXprotrudechars=2  
   \fi  
   %  
   \mtfontexpand\textrm  
   \mtfontexpand\textsl  
   \mtfontexpand\textbf  
 }  
   
 \def\microtypeOFF{%  
   \microtypefalse  
   %  
   \ifx\XeTeXrevision\thisisundefined  
     \ifx\luatexversion\thisisundefined  
       \ifpdf % pdfTeX  
         \pdfadjustspacing=0  
         \pdfprotrudechars=0  
       \fi  
     \else % LuaTeX  
       \adjustspacing=0  
       \protrudechars=0  
     \fi  
   \else % XeTeX  
     \XeTeXprotrudechars=0  
   \fi  
 }  
   
 \microtypeOFF  
   
 \parseargdef\microtype{%  
   \def\txiarg{#1}%  
   \ifx\txiarg\onword  
     \microtypeON  
   \else\ifx\txiarg\offword  
     \microtypeOFF  
   \else  
     \errhelp = \EMsimple  
     \errmessage{Unknown @microtype option `\txiarg', must be on|off}%  
   \fi\fi  
 }  
   
   
 \message{and turning on texinfo input format.}  \message{and turning on texinfo input format.}
   
 % Make UTF-8 the default encoding.  
 \documentencodingzzz{UTF-8}  
   
 \def^^L{\par} % remove \outer, so ^L can appear in an @comment  \def^^L{\par} % remove \outer, so ^L can appear in an @comment
 \catcode`\^^K = 10 % treat vertical tab as whitespace  
   
 % DEL is a comment character, in case @c does not suffice.  % DEL is a comment character, in case @c does not suffice.
 \catcode`\^^? = 14  \catcode`\^^? = 14
Line 11731  directory should work if nowhere else do Line 11392  directory should work if nowhere else do
 \catcode`\|=\other \def\normalverticalbar{|}  \catcode`\|=\other \def\normalverticalbar{|}
 \catcode`\~=\other \def\normaltilde{~}  \catcode`\~=\other \def\normaltilde{~}
   
   % This macro is used to make a character print one way in \tt
   % (where it can probably be output as-is), and another way in other fonts,
   % where something hairier probably needs to be done.
   %
   % #1 is what to print if we are indeed using \tt; #2 is what to print
   % otherwise.  Since all the Computer Modern typewriter fonts have zero
   % interword stretch (and shrink), and it is reasonable to expect all
   % typewriter fonts to have this, we can check that font parameter.
   %
   \def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi}
   
   % Same as above, but check for italic font.  Actually this also catches
   % non-italic slanted fonts since it is impossible to distinguish them from
   % italic fonts.  But since this is only used by $ and it uses \sl anyway
   % this is not a problem.
   \def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi}
   
 % Set catcodes for Texinfo file  % Set catcodes for Texinfo file
   
 % Active characters for printing the wanted glyph.  % Active characters for printing the wanted glyph.
Line 11767  directory should work if nowhere else do Line 11445  directory should work if nowhere else do
   \let> = \activegtr    \let> = \activegtr
   \let~ = \activetilde    \let~ = \activetilde
   \let^ = \activehat    \let^ = \activehat
   \setregularquotes    \markupsetuplqdefault \markupsetuprqdefault
   \let\b = \strong    \let\b = \strong
   \let\i = \smartitalic    \let\i = \smartitalic
   % in principle, all other definitions in \tex have to be undone too.    % in principle, all other definitions in \tex have to be undone too.
Line 11776  directory should work if nowhere else do Line 11454  directory should work if nowhere else do
 % Used sometimes to turn off (effectively) the active characters even after  % Used sometimes to turn off (effectively) the active characters even after
 % parsing them.  % parsing them.
 \def\turnoffactive{%  \def\turnoffactive{%
   \passthroughcharstrue    \normalturnoffactive
   \let-=\normaldash  
   \let"=\normaldoublequote  
   \let$=\normaldollar %$ font-lock fix  
   \let+=\normalplus  
   \let<=\normalless  
   \let>=\normalgreater  
   \let^=\normalcaret  
   \let_=\normalunderscore  
   \let|=\normalverticalbar  
   \let~=\normaltilde  
   \otherbackslash    \otherbackslash
   \setregularquotes  
   \unsepspaces  
 }  }
   
 % If a .fmt file is being used, characters that might appear in a file  \catcode`\@=0
 % name cannot be active until we have parsed the command line.  
 % So turn them off again, and have \loadconf turn them back on.  
 \catcode`+=\other \catcode`\_=\other  
   
   
 % \backslashcurfont outputs one backslash character in current font,  % \backslashcurfont outputs one backslash character in current font,
 % as in \char`\\.  % as in \char`\\.
 \global\chardef\backslashcurfont=`\\  \global\chardef\backslashcurfont=`\\
   
   % \realbackslash is an actual character `\' with catcode other.
   {\catcode`\\=\other @gdef@realbackslash{\}}
   
   % In Texinfo, backslash is an active character; it prints the backslash
   % in fixed width font.
   \catcode`\\=\active  % @ for escape char from now on.
   
 % Print a typewriter backslash.  For math mode, we can't simply use  % Print a typewriter backslash.  For math mode, we can't simply use
 % \backslashcurfont: the story here is that in math mode, the \char  % \backslashcurfont: the story here is that in math mode, the \char
 % of \backslashcurfont ends up printing the roman \ from the math symbol  % of \backslashcurfont ends up printing the roman \ from the math symbol
Line 11811  directory should work if nowhere else do Line 11480  directory should work if nowhere else do
 % ignored family value; char position "5C).  We can't use " for the  % ignored family value; char position "5C).  We can't use " for the
 % usual hex value because it has already been made active.  % usual hex value because it has already been made active.
   
 \def\ttbackslash{{\tt \ifmmode \mathchar29020 \else \backslashcurfont \fi}}  @def@ttbackslash{{@tt @ifmmode @mathchar29020 @else @backslashcurfont @fi}}
 \let\backslashchar = \ttbackslash % \backslashchar{} is for user documents.  @let@backslashchar = @ttbackslash % @backslashchar{} is for user documents.
   
 % These are made active for url-breaking, so need  % \otherbackslash defines an active \ to be a literal `\' character with
 % active definitions as the normal characters.  % catcode other.
 \def\normaldot{.}  @gdef@otherbackslash{@let\=@realbackslash}
 \def\normalquest{?}  
 \def\normalslash{/}  % Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of
   % the literal character `\'.
 % \newlinesloadsconf - call \loadconf as soon as possible in the  %
 % file, e.g. at the first newline.  {@catcode`- = @active
 %   @gdef@normalturnoffactive{%
 {\catcode`\^=7     @passthroughcharstrue
 \catcode`\^^M=13     @let-=@normaldash
 \gdef\newlineloadsconf{%     @let"=@normaldoublequote
   \catcode`\^^M=13 %     @let$=@normaldollar %$ font-lock fix
   \newlineloadsconfzz%     @let+=@normalplus
 }     @let<=@normalless
 \gdef\newlineloadsconfzz#1^^M{%     @let>=@normalgreater
   \def\c{\loadconf\c}%     @let^=@normalcaret
   % Definition for the first newline read in the file     @let_=@normalunderscore
   \def ^^M{\loadconf}%     @let|=@normalverticalbar
   % In case the first line has a whole-line or environment command on it     @let~=@normaltilde
   \let\originalparsearg\parsearg%     @let\=@ttbackslash
   \def\parsearg{\loadconf\originalparsearg}%     @markupsetuplqdefault
   %     @markupsetuprqdefault
   % \startenvironment is in the expansion of commands defined with \envdef     @unsepspaces
   \let\originalstartenvironment\startenvironment%   }
   \def\startenvironment{\loadconf\startenvironment}%  }
   
   % If a .fmt file is being used, characters that might appear in a file
   % name cannot be active until we have parsed the command line.
   % So turn them off again, and have @fixbackslash turn them back on.
   @catcode`+=@other @catcode`@_=@other
   
   % \enablebackslashhack - allow file to begin `\input texinfo'
   %
   % If a .fmt file is being used, we don't want the `\input texinfo' to show up.
   % That is what \eatinput is for; after that, the `\' should revert to printing
   % a backslash.
   % If the file did not have a `\input texinfo', then it is turned off after
   % the first line; otherwise the first `\' in the file would cause an error.
   % This is used on the very last line of this file, texinfo.tex.
   % We also use @c to call @fixbackslash, in case ends of lines are hidden.
   {
   @catcode`@^=7
   @catcode`@^^M=13@gdef@enablebackslashhack{%
     @global@let\ = @eatinput%
     @catcode`@^^M=13%
     @def@c{@fixbackslash@c}%
     % Definition for the newline at the end of this file.
     @def ^^M{@let^^M@secondlinenl}%
     % Definition for a newline in the main Texinfo file.
     @gdef @secondlinenl{@fixbackslash}%
     % In case the first line has a whole-line command on it
     @let@originalparsearg@parsearg
     @def@parsearg{@fixbackslash@originalparsearg}
 }}  }}
   
   {@catcode`@^=7 @catcode`@^^M=13%
   @gdef@eatinput input texinfo#1^^M{@fixbackslash}}
   
 % Emergency active definition of newline, in case an active newline token  % Emergency active definition of newline, in case an active newline token
 % appears by mistake.  % appears by mistake.
 {\catcode`\^=7 \catcode13=13%  {@catcode`@^=7 @catcode13=13%
 \gdef\enableemergencynewline{%  @gdef@enableemergencynewline{%
   \gdef^^M{%    @gdef^^M{%
     \par%      @par%
     %<warning: active newline>\par%      %<warning: active newline>@par%
 }}}  }}}
   
   
 % \loadconf gets called at the beginning of every Texinfo file.  @gdef@fixbackslash{%
 % If texinfo.cnf is present on the system, read it.  Useful for site-wide    @ifx\@eatinput @let\ = @ttbackslash @fi
 % @afourpaper, etc.  Not opening texinfo.cnf directly in texinfo.tex    @catcode13=5 % regular end of line
 % makes it possible to make a format file for Texinfo.    @enableemergencynewline
 %    @let@c=@comment
 \gdef\loadconf{%    @let@parsearg@originalparsearg
   \relax  % Terminate the filename if running as "tex '&texinfo' FILE.texi".  
   %  
   % Turn off the definitions that trigger \loadconf  
   \everyjobreset  
   \catcode13=5 % regular end of line  
   \enableemergencynewline  
   \let\c=\comment  
   \let\parsearg\originalparsearg  
   \let\startenvironment\originalstartenvironment  
   %  
   % Also turn back on active characters that might appear in the input    % Also turn back on active characters that might appear in the input
   % file name, in case not using a pre-dumped format.    % file name, in case not using a pre-dumped format.
   \catcode`+=\active    @catcode`+=@active
   \catcode`\_=\active    @catcode`@_=@active
   %    %
   \openin 1 texinfo.cnf    % If texinfo.cnf is present on the system, read it.
   \ifeof 1 \else \input texinfo.cnf \fi    % Useful for site-wide @afourpaper, etc.  This macro, @fixbackslash, gets
   \closein 1    % called at the beginning of every Texinfo file.  Not opening texinfo.cnf
     % directly in this file, texinfo.tex, makes it possible to make a format
     % file for Texinfo.
     %
     @openin 1 texinfo.cnf
     @ifeof 1 @else @input texinfo.cnf @fi
     @closein 1
 }  }
   
 % Redefine some control sequences to be controlled by the \ifdummies  
 % and \ifindexnofonts switches.  Do this at the end so that the control  
 % sequences are all defined.  
 \definedummies  
   
   
   
   
 \catcode`\@=0  
   
 % \realbackslash is an actual character `\' with catcode other.  
 {\catcode`\\=\other @gdef@realbackslash{\}}  
   
 % In Texinfo, backslash is an active character; it prints the backslash  
 % in fixed width font.  
 \catcode`\\=\active  % @ for escape char from now on.  
   
 @let\ = @ttbackslash  
   
 % If in a .fmt file, print the version number.  
 % \eatinput stops the `\input texinfo' from showing up.  
 % After that, `\' should revert to printing a backslash.  
 % Turn on active characters that we couldn't do earlier because  
 % they might have appeared in the input file name.  
 %  
 @everyjob{@message{[Texinfo version @texinfoversion]}%  
   @global@let\ = @eatinput  
   @catcode`+=@active @catcode`@_=@active}  
   
 {@catcode`@^=7 @catcode`@^^M=13%  
 @gdef@eatinput input texinfo#1^^M{@loadconf}}  
   
 @def@everyjobreset{@ifx\@eatinput @let\ = @ttbackslash @fi}  
   
 % \otherbackslash defines an active \ to be a literal `\' character with  
 % catcode other.  
 @gdef@otherbackslash{@let\=@realbackslash}  
   
 % Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of  
 % the literal character `\'.  
 %  
 {@catcode`- = @active  
  @gdef@normalturnoffactive{%  
    @turnoffactive  
    @let\=@ttbackslash  
  }  
 }  
   
 % Say @foo, not \foo, in error messages.  % Say @foo, not \foo, in error messages.
 @escapechar = `@@  @escapechar = `@@
   
   % These (along with & and #) are made active for url-breaking, so need
   % active definitions as the normal characters.
   @def@normaldot{.}
   @def@normalquest{?}
   @def@normalslash{/}
   
 % These look ok in all fonts, so just make them not special.  % These look ok in all fonts, so just make them not special.
 % @hashchar{} gets its own user-level command, because of #line.  % @hashchar{} gets its own user-level command, because of #line.
 @catcode`@& = @other @def@normalamp{&}  @catcode`@& = @other @def@normalamp{&}
Line 11944  directory should work if nowhere else do Line 11598  directory should work if nowhere else do
 @c Do this last of all since we use ` in the previous @catcode assignments.  @c Do this last of all since we use ` in the previous @catcode assignments.
 @catcode`@'=@active  @catcode`@'=@active
 @catcode`@`=@active  @catcode`@`=@active
   @markupsetuplqdefault
   @markupsetuprqdefault
   
 @c Local variables:  @c Local variables:
 @c eval: (add-hook 'before-save-hook 'time-stamp nil t)  @c eval: (add-hook 'before-save-hook 'time-stamp)
 @c time-stamp-pattern: "texinfoversion{%Y-%02m-%02d.%02H}"  @c page-delimiter: "^\\\\message\\|emacs-page"
 @c page-delimiter: "^\\\\message"  @c time-stamp-start: "def\\\\texinfoversion{"
   @c time-stamp-format: "%:y-%02m-%02d.%02H"
   @c time-stamp-end: "}"
 @c End:  @c End:
   
 @newlineloadsconf  @c vim:sw=2:
   
   @enablebackslashhack

Removed from v.1.4  
changed lines
  Added in v.1.5


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>