Diff for /freem/doc/texinfo.tex between versions 1.3 and 1.6

version 1.3, 2025/04/20 15:43:32 version 1.6, 2025/05/16 04:02:14
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{2021-04-25.21}  \def\texinfoversion{2024-02-10.22}
 %  %
 % Copyright 1985, 1986, 1988, 1990-2021 Free Software Foundation, Inc.  % Copyright 1985, 1986, 1988, 1990-2024 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 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 241 Line 235
 %  %
 \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 284 Line 275
 % \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, or @link, etc.) between @contents and the very  % @setcolor (or @url etc.) between @contents and the very first @chapter.
 % 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 317 Line 307
 \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, which hides the original value of \topmark.  This  % is run several times, hiding the original value of \topmark.  Hence, save
 % can lead to a page heading being output and duplicating the chapter heading  % \topmark at the beginning.
 % 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 351 Line 333
   %    %
   \checkchapterpage    \checkchapterpage
   %    %
   % Retrieve the information for the headings from the marks in the page,    % Make the heading and footing.  \makeheadline and \makefootline
   % and call Plain TeX's \makeheadline and \makefootline, which use the    % use the contents of \headline and \footline.
   % values in \headline and \footline.  
   %  
   % 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}    \def\commonheadfootline{\let\hsize=\txipagewidth \texinfochars}
   %  
   \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi    \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi
   \global\setbox\headlinebox = \vbox{\commonheadfootline \makeheadline}%    \global\setbox\headlinebox = \vbox{\commonheadfootline \makeheadline}%
   \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi    \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi
Line 450 Line 426
 }  }
   
 % 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
 % \argcheckspaces.  % \argremovespace.
 \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{\argcheckspaces#1\^^M\ArgTerm}  \def\argremovec#1\c#2\ArgTerm{\argremovespace#1$ $\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
 % This space token undergoes the same procedure and is eventually removed  % Note that the argument cannot contain the TeX $, as its catcode is
 % by \finishparsearg.  % changed to \other when Texinfo source is read.
 %  \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 now,  % We prepended an \empty token at the very beginning and we expand it
 % just before passing the control to \argtorun.  % just before passing the control to \next.
 % (Similarly, we have to think about #3 of \argcheckspacesY above: it is  % (But first, we have to remove the remaining $ or two.)
 % either the null string, or it ends with \^^M---thus there is no danger  \def\finishparsearg#1$#2\ArgTerm{\expandafter\argtorun\expandafter{#1}}
 % 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 547 Line 502
   
 % ... 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}}
 \def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}}  \long\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 608 Line 563
 % @/ 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 617 Line 575
 % @? 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 725  where each line of input produces a line Line 668  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.
     % Do a \strut just to make the height of this box be normal, so the      % The first penalty allows a break if the end of the page is
     % normal leading is inserted relative to the preceding line.      % not too far away.  Following penalties and skips are discarded.
     % And a page break here is fine.      % Otherwise, require at least \dimen0 of vertical space.
     \vtop to #1\mil{\strut\vfil}%      %
     %      % (We used to use a \vtop to reserve space, but this had spacing issues
     % TeX does not even consider page breaks if a penalty added to the      % when followed by a section heading, as it was not a "discardable item".
     % main vertical list is 10000 or more.  But in order to see if the      % This also has the benefit of providing glue before the page break if
     % empty box we just added fits on the page, we must make it consider      % there isn't enough space.)
     % page breaks.  On the other hand, we don't want to actually break the      \vskip0pt plus \dimen0
     % page after the empty box.  So we use a penalty of 9999.      \penalty-100
     %      \vskip0pt plus -\dimen0
     % There is an extremely small chance that TeX will actually break the      \vskip \dimen0
     % 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
     % Back up by the size of the box, whether we did a page break or not.      \penalty0\relax % this hides the above glue from \safewhatsit and \dobreak
     \kern -#1\mil  
     %  
     % Do not allow a page break right after this kern.  
     \nobreak  
   \fi    \fi
 }  }
   
Line 1147  where each line of input produces a line Line 1080  where each line of input produces a line
   
 % Output page labels information.  % Output page labels information.
 % See PDF reference v.1.7 p.594, section 8.3.1.  % See PDF reference v.1.7 p.594, section 8.3.1.
   % Page label ranges must be increasing.
 \ifpdf  \ifpdf
 \def\pagelabels{%  \def\pagelabels{%
   \def\title{0 << /P (T-) /S /D >>}%    \def\title{0 << /P (T-) /S /D >>}%
   \edef\roman{\the\romancount << /S /r >>}%  
   \edef\arabic{\the\arabiccount << /S /D >>}%  
   %  
   % Page label ranges must be increasing.  Remove any duplicates.  
   % (There is a slight chance of this being wrong if e.g. there is  
   % a @contents but no @titlepage, etc.)  
   %  
   \ifnum\romancount=0 \def\roman{}\fi  
   \ifnum\arabiccount=0 \def\title{}%  
   \else  
     \ifnum\romancount=\arabiccount \def\roman{}\fi  
   \fi  
   %    %
   \ifnum\romancount<\arabiccount    % support @contents at very end of document
     \pdfcatalog{/PageLabels << /Nums [\title \roman \arabic ] >> }\relax    \ifnum\contentsendcount=\pagecount
   \else      \ifnum\arabiccount<\romancount
     \pdfcatalog{/PageLabels << /Nums [\title \arabic \roman ] >> }\relax        \pdfcatalog{/PageLabels << /Nums
   \fi                    [\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  \else
   \let\pagelabels\relax    \let\pagelabels\relax
Line 1176  where each line of input produces a line Line 1115  where each line of input produces a line
 \newcount\pagecount \pagecount=0  \newcount\pagecount \pagecount=0
 \newcount\romancount \romancount=0  \newcount\romancount \romancount=0
 \newcount\arabiccount \arabiccount=0  \newcount\arabiccount \arabiccount=0
   \newcount\contentsendcount \contentsendcount=0
   
 \ifpdf  \ifpdf
   \let\ptxadvancepageno\advancepageno    \let\ptxadvancepageno\advancepageno
   \def\advancepageno{%    \def\advancepageno{%
Line 1239  output) for that.)} Line 1180  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{%
     \xdef\currentcolordefs{\gdef\noexpand\thiscolor{#1}}%      \ifx#1\curcolor\else
     \domark        \xdef\currentcolordefs{\gdef\noexpand\thiscolor{#1}}%
     \pdfsetcolor{#1}%        \domark
         \pdfsetcolor{#1}%
         \xdef\curcolor{#1}%
       \fi
   }    }
   %    %
   \def\maincolor{\rgbBlack}    \let\maincolor\rgbBlack
   \pdfsetcolor{\maincolor}    \pdfsetcolor{\maincolor}
   \edef\thiscolor{\maincolor}    \edef\thiscolor{\maincolor}
   \def\currentcolordefs{}    \def\currentcolordefs{}
Line 1401  output) for that.)} Line 1346  output) for that.)}
   %    %
   % by default, use black for everything.    % by default, use black for everything.
   \def\urlcolor{\rgbBlack}    \def\urlcolor{\rgbBlack}
   \def\linkcolor{\rgbBlack}    \let\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 1579  output) for that.)} Line 1524  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{%    \def\pdflink#1{\pdflinkpage{#1}{#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}#1\endlink}      \setcolor{\linkcolor}#2\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 1828  output) for that.)} Line 1774  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{%    \def\pdflink#1{\pdflinkpage{#1}{#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}#1\endlink}      \setcolor{\linkcolor}#2\endlink}
   \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}    \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
 %  %
   %    %
Line 2176  end Line 2123  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 2191  end Line 2143  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 2558  end Line 2509  end
 \def\it{\fam=\itfam \setfontstyle{it}}  \def\it{\fam=\itfam \setfontstyle{it}}
 \def\sl{\fam=\slfam \setfontstyle{sl}}  \def\sl{\fam=\slfam \setfontstyle{sl}}
 \def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf}  \def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf}
 \def\tt{\fam=\ttfam \setfontstyle{tt}}\def\ttstylename{tt}  \def\tt{\fam=\ttfam \setfontstyle{tt}}
   
 % Texinfo sort of supports the sans serif font style, which plain TeX does not.  % Texinfo sort of supports the sans serif font style, which plain TeX does not.
 % So we set up a \sf.  % So we set up a \sf.
Line 2586  end Line 2537  end
   \scriptfont\sffam=\sevensf    \scriptfont\sffam=\sevensf
 }  }
   
 %  
   
 % The font-changing commands (all called \...fonts) redefine the meanings  
 % of \STYLEfont, instead of just \STYLE.  We do this because \STYLE needs  % \defineassignfonts{SIZE} -
 % to also set the current \fam for math mode.  Our \STYLE (e.g., \rm)  %   Define sequence \assignfontsSIZE, which switches between font sizes
 % commands hardwire \STYLEfont to set the current font.  % by redefining the meanings of \STYLEfont.  (Just \STYLE additionally sets
 %  % the current \fam for math mode.)
 % 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\defineassignfonts#1{%
 %    \expandafter\edef\csname assignfonts#1\endcsname{%
 % Each font-changing command also sets the names \lsize (one size lower)      \let\noexpand\rmfont\csname #1rm\endcsname
 % and \lllsize (three sizes lower).  These relative commands are used      \let\noexpand\itfont\csname #1it\endcsname
 % in, e.g., the LaTeX logo and acronyms.      \let\noexpand\slfont\csname #1sl\endcsname
 %      \let\noexpand\bffont\csname #1bf\endcsname
 % This all needs generalizing, badly.      \let\noexpand\ttfont\csname #1tt\endcsname
 %      \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{%
   \expandafter\let\expandafter\rmfont\csname #1rm\endcsname    \csname assignfonts#1\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 2637  end Line 2584  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
   \assignfonts{#1}%    \csname assignfonts#1\endcsname
   \resetmathfonts    \resetmathfonts
   \setleading{#4}%    \setleading{#4}%
 }}  }}
Line 2687  end Line 2643  end
 % 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.  % this property, we can check that font parameter. #1 is what to
 %  % print if we are indeed using \tt; #2 is what to print otherwise.
 \def\ifmonospace{\ifdim\fontdimen3\font=0pt }  \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}
   
   
   % Check if internal flag is clear, i.e. has not been @set.
   \def\ifflagclear#1#2#3{%
     \expandafter\ifx\csname SET#1\endcsname\relax
     #2\else#3\fi
   }
   
 {  {
 \catcode`\'=\active  \catcode`\'=\active
Line 2698  end Line 2667  end
 \gdef\setcodequotes{\let`\codequoteleft \let'\codequoteright}  \gdef\setcodequotes{\let`\codequoteleft \let'\codequoteright}
 \gdef\setregularquotes{\let`\lq \let'\rq}  \gdef\setregularquotes{\let`\lq \let'\rq}
 }  }
   \setregularquotes
   
 % Allow an option to not use regular directed right quote/apostrophe  % output for ' in @code
 % (char 0x27), but instead the undirected quote from cmtt (char 0x0d).  % in tt font hex 0D (undirected) or 27 (curly right quote)
 % 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{%
   \ifmonospace    \ifusingtt
     \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax        {\ifflagclear{txicodequoteundirected}%
       \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax            {\ifflagclear{codequoteundirected}%
         '%                {'}%
       \else \char'15 \fi                {\char"0D }}%
     \else \char'15 \fi            {\char"0D }}%
    \else        {'}%
      '%  
    \fi  
 }  }
 %  
 % and a similar option for the left quote char vs. a grave accent.  % output for ` in @code
 % Modern fonts display ASCII 0x60 as a grave accent, so some people like  % in tt font hex 12 (grave accent) or 60 (curly left quote)
 % the code environments to do likewise.  % \relax disables Spanish ligatures ?` and !` of \tt font.
 %  %
 \def\codequoteleft{%  \def\codequoteleft{%
   \ifmonospace    \ifusingtt
     \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax        {\ifflagclear{txicodequotebacktick}%
       \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax            {\ifflagclear{codequotebacktick}%
         % [Knuth] pp. 380,381,391                {\relax`}%
         % \relax disables Spanish ligatures ?` and !` of \tt font.                {\char"12 }}%
         \relax`%            {\char"12 }}%
       \else \char'22 \fi        {\relax`}%
     \else \char'22 \fi  
    \else  
      \relax`%  
    \fi  
 }  }
   
 % Commands to set the quote options.  % Commands to set the quote options.
Line 2750  end Line 2711  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 2765  end Line 2726  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 2779  end Line 2745  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}\futurelet\next\smartitaliccorrection}}%      {\def\next{{#1#2}\smartitaliccorrection}}%
   \next    \next
 }  }
 \def\smartslanted{\dosmartslant\sl}  \def\smartslanted{\dosmartslant\sl}
 \def\smartitalic{\dosmartslant\it}  \def\smartitalic{\dosmartslant\it}
   
 % Output an italic correction unless \next (presumed to be the following  % Output an italic correction unless the following character is such as
 % character) is such as not to need one.  % not to need one.
 \def\smartitaliccorrection{%  \def\smartitaliccorrection{\futurelet\next\smartitaliccorrectionx}
   \def\smartitaliccorrectionx{%
   \ifx\next,%    \ifx\next,%
   \else\ifx\next-%    \else\ifx\next-%
   \else\ifx\next.%    \else\ifx\next.%
Line 2798  end Line 2765  end
   \aftersmartic    \aftersmartic
 }  }
   
 % Unconditional use \ttsl, and no ic.  @var is set to this for defuns.  % @cite unconditionally uses \sl with \smartitaliccorrection.
 \def\ttslanted#1{{\ttsl #1}}  \def\cite#1{{\sl #1}\smartitaliccorrection}
   
 % @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
   
 % Explicit font changes: @r, @sc, undocumented @ii.  % @r for roman font, used for code comment
 \def\r#1{{\rm #1}}              % roman font  \def\r#1{{%
     \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 2829  end Line 2810  end
 % @sansserif, explicit sans.  % @sansserif, explicit sans.
 \def\sansserif#1{{\sf #1}}  \def\sansserif#1{{\sf #1}}
   
 % We can't just use \exhyphenpenalty, because that only has effect at  \newif\iffrenchspacing
 % the end of a paragraph.  Restore normal hyphenation at the end of the  \frenchspacingfalse
 % 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 2842  end Line 2819  end
 %  %
 \catcode`@=11  \catcode`@=11
   \def\plainfrenchspacing{%    \def\plainfrenchspacing{%
     \sfcode`\.=\@m \sfcode`\?=\@m \sfcode`\!=\@m      \iffrenchspacing\else
     \sfcode`\:=\@m \sfcode`\;=\@m \sfcode`\,=\@m        \frenchspacingtrue
     \def\endofsentencespacefactor{1000}% for @. and friends        \sfcode`\.=\@m \sfcode`\?=\@m \sfcode`\!=\@m
         \sfcode`\:=\@m \sfcode`\;=\@m \sfcode`\,=\@m
         \def\endofsentencespacefactor{1000}% for @. and friends
       \fi
   }    }
   \def\plainnonfrenchspacing{%    \def\plainnonfrenchspacing{%
     \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000      \iffrenchspacing
     \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250        \frenchspacingfalse
     \def\endofsentencespacefactor{3000}% for @. and friends         \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000
          \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 \plainfrenchspacing #1}%    {\tt \defcharsdefault \plainfrenchspacing #1}%
   \null    \null
 }  }
   
Line 2877  end Line 2878  end
     % Switch to typewriter.      % Switch to typewriter.
     \tt      \tt
     %      %
     % But `\ ' produces the large typewriter interword space.      % `\ ' 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
 }  }
   
 % We *must* turn on hyphenation at `-' and `_' in @code.  % This is for LuaTeX: It is not sufficient to disable hyphenation at
 % (But see \codedashfinish below.)  % explicit dashes by setting `\hyphenchar` to -1.
   \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.
 %  %
 % Unfortunately, TeX uses one parameter (\hyphenchar) to control  % Hyphenation at - and hyphenation within words was turned off
 % both hyphenation at - and hyphenation within words.  % by default for the tt fonts using the \hyphenchar parameter of TeX.
 % 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
Line 2910  end Line 2913  end
      \let-\codedash       \let-\codedash
      \let_\codeunder       \let_\codeunder
     \else      \else
      \let-\normaldash       \let-\dashnobreak
      \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 2926  end Line 2925  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 -.      % (b) the preceding character is a -, or
       % (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\codedashprev\codedash        \ifx\codedashnobreak\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\codedashprev= \next      \global\let\codedashnobreak= \next
   }    }
 }  }
 \def\normaldash{-}  \def\normaldash{-}
 %  %
 \def\codex #1{\tclose{#1}\endgroup}  \def\codex #1{\tclose{%
     % 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 3171  end Line 3179  end
 % Default is `distinct'.  % Default is `distinct'.
 \kbdinputstyle distinct  \kbdinputstyle distinct
   
 % @kbd is like @code, except that if the argument is just one @key command,  \def\kbd#1{%
 % then @kbd has no effect.    \tclose{\kbdfont\setcodequotes#1}%
 \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\setcodequotes\look}}\fi  
   \else{\tclose{\kbdfont\setcodequotes\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 3193  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.  If the current font is already  % definition of @key with no lozenge.
 % monospace, don't change it; that way, we respect @kbdinputstyle.  But  %
 % if it isn't monospace, then use \tt.  \def\key#1{{\setregularquotes \tt #1}\null}
 %  
 \def\key#1{{\setregularquotes  
   \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 3403  $$% Line 3398  $$%
 \let\atchar=\@  \let\atchar=\@
   
 % @{ @} @lbracechar{} @rbracechar{} all generate brace characters.  % @{ @} @lbracechar{} @rbracechar{} all generate brace characters.
 \def\lbracechar{{\ifmonospace\char123\else\ensuremath\lbrace\fi}}  \def\lbracechar{{\ifusingtt{\char123}{\ensuremath\lbrace}}}
 \def\rbracechar{{\ifmonospace\char125\else\ensuremath\rbrace\fi}}  \def\rbracechar{{\ifusingtt{\char125}{\ensuremath\rbrace}}}
 \let\{=\lbracechar  \let\{=\lbracechar
 \let\}=\rbracechar  \let\}=\rbracechar
   
Line 3458  $$% Line 3453  $$%
        % 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
        % For 11pt, we can use our lllsize.         \ifx\curfontsize\smallword
        \switchtolllsize A%           % For footnotes and indices
            \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 3467  $$%
   \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 3545  $$% Line 3546  $$%
   
 % @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{\ifmonospace{\ecfont\char"BF}\else{\it\$}\fi}  \def\pounds{{\ifusingtt{\ecfont\char"BF}{\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 3614  $$% Line 3615  $$%
 \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 3656  $$% Line 3660  $$%
   % 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}%
   \ifmonospace    \ifusingtt
     % 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 3683  $$% Line 3686  $$%
   
 % @textdegree - the normal degrees sign.  % @textdegree - the normal degrees sign.
 %  %
 \def\textdegree{$^\circ$}  \def\textdegree{%
      \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 3706  $$%
 % only change font for tt for correct kerning and to avoid using  % only change font for tt for correct kerning and to avoid using
 % \ecfont unless necessary.  % \ecfont unless necessary.
 \def\quotedblleft{%  \def\quotedblleft{%
   \ifmonospace{\ecfont\char"10}\else{\char"5C}\fi    \ifusingtt{{\ecfont\char"10}}{{\char"5C}}%
 }  }
   
 \def\quotedblright{%  \def\quotedblright{%
   \ifmonospace{\ecfont\char"11}\else{\char`\"}\fi    \ifusingtt{{\ecfont\char"11}}{{\char`\"}}%
 }  }
   
   
Line 3729  $$% Line 3735  $$%
               want the contents after the title page.}}%                want the contents after the title page.}}%
   
 \parseargdef\shorttitlepage{%  \parseargdef\shorttitlepage{%
   \begingroup \hbox{}\vskip 1.5in \chaprm \centerline{#1}%    {\headingsoff \begingroup \hbox{}\vskip 1.5in \chaprm \centerline{#1}%
   \endgroup\page\hbox{}\page}    \endgroup\page\hbox{}\page}\pageone}
   
 \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 3763  $$% Line 3770  $$%
     % 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 3834  $$% Line 3839  $$%
 \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  \headline={{\textfonts\rm\frenchspacingsetting
             \ifchapterpage              \ifchapterpage
               \ifodd\pageno\the\oddchapheadline\else\the\evenchapheadline\fi                \ifodd\pageno\the\oddchapheadline\else\the\evenchapheadline\fi
             \else              \else
               \ifodd\pageno\the\oddheadline\else\the\evenheadline\fi                \ifodd\pageno\the\oddheadline\else\the\evenheadline\fi
             \fi}}              \fi}}
   
 \footline={{\textfonts\rm \ifodd\pageno \the\oddfootline  \footline={{\textfonts\rm\frenchspacingsetting
                             \else \the\evenfootline \fi}\HEADINGShook}              \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 3935  $$% Line 3941  $$%
 }  }
   
 \def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting  \def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting
 \HEADINGSoff  % it's the default  
   
 % When we turn headings on, set the page number to 1.  % Set the page number to 1.
 \def\pageone{  \def\pageone{
   \global\pageno=1    \global\pageno=1
   \global\arabiccount = \pagecount    \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\HEADINGSdouble{%  \def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdouble}
 \pageone  
 \HEADINGSdoublex  
 }  
 \let\contentsalignmacro = \chappager  
   
 % For single-sided printing, chapter title goes across top left of page,  
 % page number on top right.  
 \def\HEADINGSsingle{%  
 \pageone  
 \HEADINGSsinglex  
 }  
 \def\HEADINGSon{\HEADINGSdouble}  
   
 \def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}  
 \let\HEADINGSdoubleafter=\HEADINGSafter  \let\HEADINGSdoubleafter=\HEADINGSafter
 \def\HEADINGSdoublex{%  \def\HEADINGSdouble{%
 \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{\thischapter\hfil\folio}}
 \global\evenchapheadline={\line{\folio\hfil}}  \global\evenchapheadline={\line{\folio\hfil\thistitle}}
 \global\oddchapheadline={\line{\hfil\folio}}  \global\oddchapheadline={\line{\hfil\folio}}
 \global\let\contentsalignmacro = \chapoddpage  \global\let\contentsalignmacro = \chapoddpage
 }  }
   
 \def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}  % For single-sided printing, chapter title goes across top left of page,
 \def\HEADINGSsinglex{%  % page number on top right.
   \def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsingle}
   \def\HEADINGSsingle{%
 \global\evenfootline={\hfil}  \global\evenfootline={\hfil}
 \global\oddfootline={\hfil}  \global\oddfootline={\hfil}
 \global\evenheadline={\line{\thischapter\hfil\folio}}  \global\evenheadline={\line{\thischapter\hfil\folio}}
Line 3986  $$% Line 3983  $$%
   
 % for @setchapternewpage off  % for @setchapternewpage off
 \def\HEADINGSsinglechapoff{%  \def\HEADINGSsinglechapoff{%
 \pageone  
 \global\evenfootline={\hfil}  \global\evenfootline={\hfil}
 \global\oddfootline={\hfil}  \global\oddfootline={\hfil}
 \global\evenheadline={\line{\thischapter\hfil\folio}}  \global\evenheadline={\line{\thischapter\hfil\folio}}
Line 4356  $$% Line 4352  $$%
 % 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{%
   \checkenv\multitable    \crcr % must appear first
   \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 4419  $$% Line 4414  $$%
       % Find the correct column width        % Find the correct column width
       \hsize=\expandafter\csname col\the\colcount\endcsname        \hsize=\expandafter\csname col\the\colcount\endcsname
       %        %
       \rightskip=0pt        \advance\rightskip by -1\rightskip % Zero leaving only any stretch
       \ifnum\colcount=1        \ifnum\colcount=1
         \advance\hsize by\leftskip % Add indent of surrounding text          \advance\hsize by\leftskip % Add indent of surrounding text
       \else        \else
Line 4442  $$% Line 4437  $$%
   
 \message{conditionals,}  \message{conditionals,}
   
 % @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext,  % @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotlatex, @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 4456  $$% Line 4451  $$%
 \makecond{ifnotdocbook}  \makecond{ifnotdocbook}
 \makecond{ifnothtml}  \makecond{ifnothtml}
 \makecond{ifnotinfo}  \makecond{ifnotinfo}
   \makecond{ifnotlatex}
 \makecond{ifnotplaintext}  \makecond{ifnotplaintext}
 \makecond{ifnotxml}  \makecond{ifnotxml}
   
Line 4468  $$% Line 4464  $$%
 \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 4710  $$% Line 4708  $$%
 % 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 {foo} defines an index named IX.  % \newindex {IX} 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 4779  $$% Line 4775  $$%
 \def\docodeindexxxx #1{\docind{\indexname}{#1}}  \def\docodeindexxxx #1{\docind{\indexname}{#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,
 % not control letters, because the \space would be incorrect for  % not control letters, because the \space would be incorrect for
Line 4809  $$% Line 4790  $$%
 %  %
 \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  
   
 % Called from \atdummies to prevent the expansion of commands.  % Used for the aux, toc and index files to prevent expansion of Texinfo
   % commands.  Most of the commands are controlled through the
   % \ifdummies conditional.
 %  %
 \def\definedummies{%  \def\atdummies{%
     \dummiestrue
   %    %
   \let\commondummyword\definedummyword    \definedummyletter\@%
   \let\commondummyletter\definedummyletter    \definedummyletter\ %
   \let\commondummyaccent\definedummyaccent    \definedummyletter\{%
   \commondummiesnofonts    \definedummyletter\}%
     \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
   %    %
   \normalturnoffactive    \turnoffactive
 }  }
   
 % \commondummiesnofonts: common to \definedummies and \indexnofonts.  \newif\ifdummies
 % Define \commondummyletter, \commondummyaccent and \commondummyword before  \newif\ifindexnofonts
 % using.  Used for accents, font commands, and various control letters.  
 %  \def\commondummyletter#1{%
 \def\commondummiesnofonts{%    \expandafter\let\csname\string#1:impl\endcsname#1%
   % Control letters and accents.    \edef#1{%
       \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 4926  $$% Line 4888  $$%
   \commondummyaccent\^%    \commondummyaccent\^%
   \commondummyaccent\`%    \commondummyaccent\`%
   \commondummyaccent\~%    \commondummyaccent\~%
   \commondummyword\u    %
   \commondummyword\v    % Control letters and accents.
   \commondummyword\H    \commondummyword\u          {}%
   \commondummyword\dotaccent    \commondummyword\v          {}%
   \commondummyword\ogonek    \commondummyword\H          {}%
   \commondummyword\ringaccent    \commondummyword\dotaccent  {}%
   \commondummyword\tieaccent    \commondummyword\ogonek     {}%
   \commondummyword\ubaraccent    \commondummyword\ringaccent {}%
   \commondummyword\udotaccent    \commondummyword\tieaccent  {}%
   \commondummyword\dotless    \commondummyword\ubaraccent {}%
     \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\math    \commondummyword\link       {}%
   \commondummyword\option    \commondummyword\math       {}%
   \commondummyword\pxref    \commondummyword\option     {}%
   \commondummyword\ref    \commondummyword\pxref      {}%
   \commondummyword\samp    \commondummyword\ref        {}%
   \commondummyword\strong    \commondummyword\samp       {}%
   \commondummyword\tie    \commondummyword\strong     {}%
   \commondummyword\U    \commondummyword\tie        {}%
   \commondummyword\uref    \commondummyword\U          {}%
   \commondummyword\url    \commondummyword\uref       {}%
   \commondummyword\var    \commondummyword\url        {}%
   \commondummyword\verb    \commondummyword\var        {}%
   \commondummyword\w    \commondummyword\verb       {}%
   \commondummyword\xref    \commondummyword\w          {}%
     \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 4995  $$% Line 5023  $$%
 \catcode`\-=13  \catcode`\-=13
 \catcode`\`=13  \catcode`\`=13
   \gdef\indexnonalnumdisappear{%    \gdef\indexnonalnumdisappear{%
     \expandafter\ifx\csname SETtxiindexlquoteignore\endcsname\relax\else      \ifflagclear{txiindexlquoteignore}{}{%
       % @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      }%
     %      %
     \expandafter\ifx\csname SETtxiindexbackslashignore\endcsname\relax\else      \ifflagclear{txiindexbackslashignore}{}{%
       \backslashdisappear        \backslashdisappear
     \fi      }%
     %      \ifflagclear{txiindexhyphenignore}{}{%
     \expandafter\ifx\csname SETtxiindexhyphenignore\endcsname\relax\else  
       \def-{}%        \def-{}%
     \fi      }%
     \expandafter\ifx\csname SETtxiindexlessthanignore\endcsname\relax\else      \ifflagclear{txiindexlessthanignore}{}{%
       \def<{}%        \def<{}%
     \fi      }%
     \expandafter\ifx\csname SETtxiindexatsignignore\endcsname\relax\else      \ifflagclear{txiindexatsignignore}{}{%
       \def\@{}%        \def\@{}%
     \fi      }%
   }    }
   
   \gdef\indexnonalnumreappear{%    \gdef\indexnonalnumreappear{%
Line 5029  $$% Line 5056  $$%
 % would be for a given command (usually its argument).  % would be for a given command (usually its argument).
 %  %
 \def\indexnofonts{%  \def\indexnofonts{%
   % Accent commands should become @asis.    \indexnofontstrue
   \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 5052  $$% Line 5068  $$%
   \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}%  
   %  
   \let\do\indexnofontsdef  
   %  
   \do\LaTeX{LaTeX}%  
   \do\TeX{TeX}%  
   %  
   % Assorted special characters.  
   \do\atchar{@}%  
   \do\arrow{->}%  
   \do\bullet{bullet}%  
   \do\comma{,}%  
   \do\copyright{copyright}%  
   \do\dots{...}%  
   \do\enddots{...}%  
   \do\equiv{==}%  
   \do\error{error}%  
   \do\euro{euro}%  
   \do\expansion{==>}%  
   \do\geq{>=}%  
   \do\guillemetleft{<<}%  
   \do\guillemetright{>>}%  
   \do\guilsinglleft{<}%  
   \do\guilsinglright{>}%  
   \do\leq{<=}%  
   \do\lbracechar{\{}%  
   \do\minus{-}%  
   \do\point{.}%  
   \do\pounds{pounds}%  
   \do\print{-|}%  
   \do\quotedblbase{"}%  
   \do\quotedblleft{"}%  
   \do\quotedblright{"}%  
   \do\quoteleft{`}%  
   \do\quoteright{'}%  
   \do\quotesinglbase{,}%  
   \do\rbracechar{\}}%  
   \do\registeredsymbol{R}%  
   \do\result{=>}%  
   \do\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
 }  }
   
 % Give the control sequence a definition that removes the {} that follows  
 % its use, e.g. @AA{} -> AA  
 \def\indexnofontsdef#1#2{\def#1##1{#2}}%  
   
   
   
   
Line 5260  $$% Line 5211  $$%
         \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\xdef\indexsortkey{ }\fi          \ifx\indexsortkey\empty
             \message{Empty index sort key near line \the\inputlineno}%
             \xdef\indexsortkey{ }%
           \fi
       }\fi        }\fi
       %        %
       % Append to \fullindexsortkey.        % Append to \fullindexsortkey.
Line 5284  $$% Line 5238  $$%
 % the current value of \escapechar.  % the current value of \escapechar.
 \def\escapeisbackslash{\escapechar=`\\}  \def\escapeisbackslash{\escapechar=`\\}
   
 % Use \ in index files by default.  texi2dvi didn't support @ as the escape  % Uncomment to use \ in index files by default.  Old texi2dvi (before 2019)
 % character (as it checked for "\entry" in the files, and not "@entry").  When  % didn't support @ as the escape character (as it checked for "\entry" in
 % the new version of texi2dvi has had a chance to become more prevalent, then  % the files, and not "@entry").
 % the escape character can change back to @ again.  This should be an easy  %   In the future we can remove this flag and simplify the code for
 % change to make now because both @ and \ are only used as escape characters in  % index files and backslashes, once the support is no longer likely to be
 % index files, never standing for themselves.  % useful.
 %  %
 \set txiindexescapeisbackslash  % \set txiindexescapeisbackslash
   
 % Write the entry in \indextext to the index file.  % Write the entry in \indextext to the index file.
 %  %
Line 5305  $$% Line 5259  $$%
   %    %
   \atdummies    \atdummies
   %    %
   \expandafter\ifx\csname SETtxiindexescapeisbackslash\endcsname\relax\else    \ifflagclear{txiindexescapeisbackslash}{}{\escapeisbackslash}%
     \escapeisbackslash  
   \fi  
   %    %
   % For texindex which always views { and } as separators.    % For texindex which always views { and } as separators.
   \def\{{\lbracechar{}}%    \def\{{\lbracechar{}}%
Line 5491  $$% Line 5443  $$%
 % 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{%
   \expandafter\ifx\csname SETtxiindexescapeisbackslash\endcsname\relax    \ifflagclear{txiindexescapeisbackslash}{%
     \uccode`\~=`\\ \uppercase{\if\noexpand~}\noexpand#1      \uccode`\~=`\\ \uppercase{\if\noexpand~}\noexpand#1
       \expandafter\ifx\csname SETtxiskipindexfileswithbackslash\endcsname\relax        \ifflagclear{txiskipindexfileswithbackslash}{%
 \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 5509  this, Texinfo will try to use index file Line 5461  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
     %      %
Line 5527  might help (with 'rm \jobname.?? \jobnam Line 5479  might help (with 'rm \jobname.?? \jobnam
     \catcode`\@=0\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 5602  might help (with 'rm \jobname.?? \jobnam Line 5554  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 5628  might help (with 'rm \jobname.?? \jobnam Line 5590  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      % Save the text of the entry in \boxA
     \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 5638  might help (with 'rm \jobname.?? \jobnam Line 5600  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 box A      \egroup % end \boxA
     \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
       \unhbox\boxA        \ifpdforxetex
       % #1 is the page number.          \iflinkentrytext
             \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 5662  might help (with 'rm \jobname.?? \jobnam Line 5633  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 5679  might help (with 'rm \jobname.?? \jobnam Line 5652  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 1em          \advance\leftskip by \entrycontskip
         \advance\parindent by -1em          \advance\parindent by -\entrycontskip
       \fi\fi        \fi\fi
       \indent % start paragraph        \indent % start paragraph
       \unhbox\boxA        \unhbox\boxA
Line 5736  might help (with 'rm \jobname.?? \jobnam Line 5685  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 1 em.  % Like plain.tex's \dotfill, except uses up at least 0.5 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 1em plus 1filll}    \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 0.5em plus 1filll}
   
   
 \def\primary #1{\line{#1\hfil}}  \def\primary #1{\line{#1\hfil}}
   
Line 5794  might help (with 'rm \jobname.?? \jobnam Line 5742  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, \doublecolumhsize, so we    % We put the result in a separate register, \doublecolumnhsize, 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 5963  might help (with 'rm \jobname.?? \jobnam Line 5911  might help (with 'rm \jobname.?? \jobnam
 % Chapters, sections, etc.  % Chapters, sections, etc.
   
 % Let's start with @part.  % Let's start with @part.
 \outer\parseargdef\part{\partzzz{#1}}  \parseargdef\part{\partzzz{#1}}
 \def\partzzz#1{%  \def\partzzz#1{%
   \chapoddpage    \chapoddpage
   \null    \null
Line 6189  might help (with 'rm \jobname.?? \jobnam Line 6137  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\secno=0 \global\subsecno=0 \global\subsubsecno=0    \global\advance\unnumberedno by 1
     \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 6246  might help (with 'rm \jobname.?? \jobnam Line 6193  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\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1    \global\advance\unnumberedno by 1
   \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}%    \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno}%
 }  }
   
 % Subsections.  % Subsections.
Line 6270  might help (with 'rm \jobname.?? \jobnam Line 6217  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\subsubsecno=0  \global\advance\subsecno by 1    \global\advance\unnumberedno by 1
   \sectionheading{#1}{subsec}{Ynothing}%    \sectionheading{#1}{subsec}{Ynothing}{\the\unnumberedno}%
                  {\the\unnumberedno.\the\secno.\the\subsecno}%  
 }  }
   
 % Subsubsections.  % Subsubsections.
Line 6296  might help (with 'rm \jobname.?? \jobnam Line 6242  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\subsubsecno by 1    \global\advance\unnumberedno by 1
   \sectionheading{#1}{subsubsec}{Ynothing}%    \sectionheading{#1}{subsubsec}{Ynothing}{\the\unnumberedno}%
                  {\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 6361  might help (with 'rm \jobname.?? \jobnam Line 6306  might help (with 'rm \jobname.?? \jobnam
   \fi    \fi
 }  }
   
 \parseargdef\setchapternewpage{\csname CHAPPAG#1\endcsname}  \parseargdef\setchapternewpage{\csname CHAPPAG#1\endcsname\HEADINGSon}
   
 \def\CHAPPAGoff{%  \def\CHAPPAGoff{%
 \global\let\contentsalignmacro = \chappager  \global\let\contentsalignmacro = \chappager
Line 6378  might help (with 'rm \jobname.?? \jobnam Line 6323  might help (with 'rm \jobname.?? \jobnam
 \global\let\pchapsepmacro=\chapoddpage  \global\let\pchapsepmacro=\chapoddpage
 \global\def\HEADINGSon{\HEADINGSdouble}}  \global\def\HEADINGSon{\HEADINGSdouble}}
   
 \CHAPPAGon  \setchapternewpage on
   
 % \chapmacro - Chapter opening.  % \chapmacro - Chapter opening.
 %  %
Line 6391  might help (with 'rm \jobname.?? \jobnam Line 6336  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 6413  might help (with 'rm \jobname.?? \jobnam Line 6368  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}%
       % \noexpand\putwordAppendix avoids expanding indigestible        \let\noexpand\thischapter\noexpand\thischapterAppendix
       % 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}%
       % \noexpand\putwordChapter avoids expanding indigestible        \let\noexpand\thischapter\noexpand\thischapterChapter
       % commands in some of the translations.  
       \gdef\noexpand\thischapter{\noexpand\putwordChapter{}  
                                  \noexpand\thischapternum:  
                                  \noexpand\thischaptername}%  
     }%      }%
   \fi\fi\fi    \fi\fi\fi
   %    %
Line 6514  might help (with 'rm \jobname.?? \jobnam Line 6461  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 6555  might help (with 'rm \jobname.?? \jobnam Line 6508  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}%
           % \noexpand\putwordSection avoids expanding indigestible            \let\noexpand\thissection\noexpand\thissectionDef
           % commands in some of the translations.  
           \gdef\noexpand\thissection{\noexpand\putwordSection{}  
                                      \noexpand\thissectionnum:  
                                      \noexpand\thissectionname}%  
         }%          }%
       \fi        \fi
     \else      \else
Line 6568  might help (with 'rm \jobname.?? \jobnam Line 6517  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}%
           % \noexpand\putwordSection avoids expanding indigestible            \let\noexpand\thissection\noexpand\thissectionDef
           % commands in some of the translations.  
           \gdef\noexpand\thissection{\noexpand\putwordSection{}  
                                      \noexpand\thissectionnum:  
                                      \noexpand\thissectionname}%  
         }%          }%
       \fi        \fi
     \fi\fi\fi      \fi\fi\fi
Line 6732  might help (with 'rm \jobname.?? \jobnam Line 6677  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 6758  might help (with 'rm \jobname.?? \jobnam Line 6779  might help (with 'rm \jobname.?? \jobnam
     \def\thistitle{}% no title in double-sided headings      \def\thistitle{}% no title in double-sided headings
     % Record where the Roman numerals started.      % Record where the Roman numerals started.
     \ifnum\romancount=0 \global\romancount=\pagecount \fi      \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 6771  might help (with 'rm \jobname.?? \jobnam Line 6798  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 6798  might help (with 'rm \jobname.?? \jobnam Line 6826  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 6822  might help (with 'rm \jobname.?? \jobnam Line 6851  might help (with 'rm \jobname.?? \jobnam
 % Get ready to use Arabic numerals again  % Get ready to use Arabic numerals again
 \def\contentsendroman{%  \def\contentsendroman{%
   \lastnegativepageno = \pageno    \lastnegativepageno = \pageno
   \global\pageno = \savepageno    \global\pageno=1
   %    \contentsendcount = \pagecount
   % If \romancount > \arabiccount, the contents are at the end of the  
   % document.  Otherwise, advance where the Arabic numerals start for  
   % the page numbers.  
   \ifnum\romancount>\arabiccount\else\global\arabiccount=\pagecount\fi  
 }  }
   
 % Typeset the label for a chapter or appendix for the short contents.  % Typeset the label for a chapter or appendix for the short contents.
Line 6837  might help (with 'rm \jobname.?? \jobnam Line 6862  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 6848  might help (with 'rm \jobname.?? \jobnam Line 6871  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,
 % The first argument is the chapter or section name.  % and are read in from the *.toc file.
 % The last argument is the page number.  %
 % The arguments in between are the chapter number, section number, ...  % The arguments are like:
   % \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 6864  might help (with 'rm \jobname.?? \jobnam Line 6892  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{\numeralbox\labelspace#1}{}%    \dochapentry{#1}{\numeralbox}{}%
 }  }
 %  %
 % Parts, in the short toc.  % Parts, in the short toc.
Line 6875  might help (with 'rm \jobname.?? \jobnam Line 6903  might help (with 'rm \jobname.?? \jobnam
 }  }
   
 % Chapters, in the main contents.  % Chapters, in the main contents.
 \def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}}  \def\numchapentry#1#2#3#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{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}%    \tocentry{#1}{\shortchaplabel{#2}}{#4}%
 }  }
   
 % Appendices, in the main contents.  % Appendices, in the main contents.
Line 6891  might help (with 'rm \jobname.?? \jobnam Line 6921  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{\dochapentry{\appendixbox{#2}\hskip.7em#1}{#4}}  \def\appentry#1#2#3#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}{\doshortpageno\bgroup#4\egroup}}  \def\shortunnchapentry#1#2#3#4{\tocentry{#1}{}{#4}}
   
 % Sections.  % Sections.
 \def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}}  \def\numsecentry#1#2#3#4{\dosecentry{#1}{#2}{#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{\dosecentry{#1}{#4}}  \def\unnsecentry#1#2#3#4{%
     \retrievesecnowidth\secnowidthsec{#2}%
     \dosecentry{#1}{}{#4}%
   }
   
 % Subsections.  % Subsections.
 \def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}}  \def\numsubsecentry#1#2#3#4{%
     \retrievesecnowidth\secnowidthssec{#2}%
     \dosubsecentry{#1}{#2}{#4}%
   }
 \let\appsubsecentry=\numsubsecentry  \let\appsubsecentry=\numsubsecentry
 \def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}}  \def\unnsubsecentry#1#2#3#4{%
     \retrievesecnowidth\secnowidthssec{#2}%
     \dosubsecentry{#1}{}{#4}%
   }
   
 % And subsubsections.  % And subsubsections.
 \def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}}  \def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#2}{#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 and #2 is the  % Now for the actual typesetting. In all these, #1 is the text, #2 is
 % page number.  % a section number if present, and #3 is the 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{%  \def\dochapentry#1#2#3{%
    \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
      \tocentry{#1}{\dopageno\bgroup#2\egroup}%       \extrasecnoskip=0.4em % separate chapter number more
        \tocentry{#1}{#2}{#3}%
    \endgroup     \endgroup
    \nobreak\vskip .25\baselineskip plus.1\baselineskip     \nobreak\vskip .25\baselineskip plus.1\baselineskip
 }  }
   
 \def\dosecentry#1#2{\begingroup  \def\dosecentry#1#2#3{\begingroup
     \secnowidth=\secnowidthchap
   \secentryfonts \leftskip=\tocindent    \secentryfonts \leftskip=\tocindent
   \tocentry{#1}{\dopageno\bgroup#2\egroup}%    \tocentry{#1}{#2}{#3}%
 \endgroup}  \endgroup}
   
 \def\dosubsecentry#1#2{\begingroup  \def\dosubsecentry#1#2#3{\begingroup
     \secnowidth=\secnowidthsec
   \subsecentryfonts \leftskip=2\tocindent    \subsecentryfonts \leftskip=2\tocindent
   \tocentry{#1}{\dopageno\bgroup#2\egroup}%    \tocentry{#1}{#2}{#3}%
 \endgroup}  \endgroup}
   
 \def\dosubsubsecentry#1#2{\begingroup  \def\dosubsubsecentry#1#2#3{\begingroup
     \secnowidth=\secnowidthssec
   \subsubsecentryfonts \leftskip=3\tocindent    \subsubsecentryfonts \leftskip=3\tocindent
   \tocentry{#1}{\dopageno\bgroup#2\egroup}%    \tocentry{#1}{#2}{#3}%
 \endgroup}  \endgroup}
   
 % We use the same \entry macro as for the index entries.  % Used for the maximum width of a section number so we can align
 \let\tocentry = \entry  % section titles.
   \newdimen\secnowidth
 % Space between chapter (or whatever) number and the title.  \secnowidth=0pt
 \def\labelspace{\hskip1em \relax}  \newdimen\extrasecnoskip
   \extrasecnoskip=0pt
 \def\dopageno#1{{\rm #1}}  
 \def\doshortpageno#1{{\rm #1}}  % \tocentry{TITLE}{SEC NO}{PAGE}
   %
   \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 7100  might help (with 'rm \jobname.?? \jobnam Line 7171  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 18.4pt  % allow for 3pt kerns on either    \advance\cartouter by 11.6pt
                                 % 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 7120  might help (with 'rm \jobname.?? \jobnam Line 7197  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=\vbox\bgroup    \setbox\groupbox=\vtop\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
               \kern3pt                \hsize=\cartinner
               \hsize=\cartinner                \baselineskip=\normbskip
               \baselineskip=\normbskip                \lineskip=\normlskip
               \lineskip=\normlskip                \parskip=\normpskip
               \parskip=\normpskip                \def\arg{#1}%
               \vskip -\parskip                \ifx\arg\empty\else
               \comment % For explanation, see the end of def\group.                  \centerV{\hfil \bf #1 \hfil}%
                 \fi
                 \kern3pt
                 \vskip -\parskip
 }  }
 \def\Ecartouche{%  \def\Ecartouche{%
               \ifhmode\par\fi                \ifhmode\par\fi
Line 7287  might help (with 'rm \jobname.?? \jobnam Line 7367  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 7400  might help (with 'rm \jobname.?? \jobnam Line 7464  might help (with 'rm \jobname.?? \jobnam
 \endgroup  \endgroup
 %  %
 \def\setupverb{%  \def\setupverb{%
   \tt  % easiest (and conventionally used) font for verbatim    \tt
   \def\par{\leavevmode\endgraf}%    \def\par{\leavevmode\endgraf}%
     \parindent = 0pt
   \setcodequotes    \setcodequotes
   \tabeightspaces    \tabeightspaces
   % Respect line breaks,    % Respect line breaks,
Line 7525  might help (with 'rm \jobname.?? \jobnam Line 7590  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\scanargctxt\docopying}  \def\copying{\checkenv{}\begingroup\macrobodyctxt\docopying}
 \def\docopying#1@end copying{\endgroup\def\copyingtext{#1}}  {\catcode`\ =\other
 %  \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 7575  might help (with 'rm \jobname.?? \jobnam Line 7642  might help (with 'rm \jobname.?? \jobnam
   \exdentamount=\defbodyindent    \exdentamount=\defbodyindent
 }  }
   
 \def\dodefunx#1{%  % Called as \printdefunline \deffooheader{text}
   % 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
     % call \deffnheader:      \plainfrenchspacing
       % 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 \dodefunx      \penalty\defunpenalty  % signal to \startdefun and \deffoox
     % 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 7608  might help (with 'rm \jobname.?? \jobnam Line 7663  might help (with 'rm \jobname.?? \jobnam
   
 \def\Edefun{\endgraf\medbreak}  \def\Edefun{\endgraf\medbreak}
   
 % \makedefun{deffn} creates \deffn, \deffnx and \Edeffn;  % @defblock, @defline do not automatically create index entries
 % the only thing remaining is to define \deffnheader.  \envdef\defblock{%
     \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{\dodefunx#1}%    \def#2{%
   \def#3%      % First, check whether we are in the right environment:
       \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 7655  might help (with 'rm \jobname.?? \jobnam Line 7736  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}{\deffngeneral{}}  \makedefun{deffn}#1 #2 #3\endheader{%
     \doind{fn}{\code{#2}}%
 % @deffn category class name args    \printdefname{#1}{}{#2}\magicamp\defunargs{#3\unskip}%
 \makedefun{defop}#1 {\defopon{#1\ \putwordon}}  }
   
 % \defopon {category on}class name args  
 \def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }  
   
 % \deffngeneral {subind}category name args  % @defop category class name args
 %  \makedefun{defop}#1 {\defopheaderx{#1\ \putwordon}}
 \def\deffngeneral#1#2 #3 #4\endheader{%  \def\defopheaderx#1#2 #3 #4\endheader{%
   \dosubind{fn}{\code{#3}}{#1}%    \doind{fn}{\code{#3}\space\putwordon\ \code{#2}}%
   \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}%    \printdefname{#1\ \code{#2}}{}{#3}\magicamp\defunargs{#4\unskip}%
 }  }
   
 % Typed functions:  % Typed functions:
   
 % @deftypefn category type name args  % @deftypefn category type name args
 \makedefun{deftypefn}{\deftypefngeneral{}}  \makedefun{deftypefn}#1 #2 #3 #4\endheader{%
     \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 {\deftypeopon{#1\ \putwordon}}  \makedefun{deftypeop}#1 {\deftypeopheaderx{#1\ \putwordon}}
   \def\deftypeopheaderx#1#2 #3 #4 #5\endheader{%
 % \deftypeopon {category on}class type name args    \doind{fn}{\code{#4}\space\putwordon\ \code{#1\ \code{#2}}}%
 \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
   \defname{#2}{#3}{#4}\defunargs{#5\unskip}%    \printdefname{#1\ \code{#2}}{#3}{#4}\defunargs{#5\unskip}%
 }  }
   
 % Typed variables:  % Typed variables:
   
 % @deftypevr category type var args  % @deftypevr category type var args
 \makedefun{deftypevr}{\deftypecvgeneral{}}  \makedefun{deftypevr}#1 #2 #3 #4\endheader{%
     \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 {\deftypecvof{#1\ \putwordof}}  \makedefun{deftypecv}#1 {\deftypecvheaderx{#1\ \putwordof}}
   \def\deftypecvheaderx#1#2 #3 #4 #5\endheader{%
 % \deftypecvof {category of}class type var args    \doind{vr}{\code{#4}\space\putwordof\ \code{#2}}%
 \def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} }    \printdefname{#1\ \code{#2}}{#3}{#4}\defunargs{#5\unskip}%
   
 % \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 7731  might help (with 'rm \jobname.?? \jobnam Line 7789  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 {\defcvof{#1\ \putwordof}}  \makedefun{defcv}#1 {\defcvheaderx{#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}}%
   \defname{#1}{}{#2}\defunargs{#3\unskip}%    \printdefname{#1}{}{#2}\defunargs{#3\unskip}%
 }  }
   
 % Remaining @defun-like shortcuts:  % Remaining @defun-like shortcuts:
Line 7752  might help (with 'rm \jobname.?? \jobnam Line 7808  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}{\defopon\putwordMethodon}  \makedefun{defmethod}{\defopheaderx\putwordMethodon}
 \makedefun{deftypemethod}{\deftypeopon\putwordMethodon}  \makedefun{deftypemethod}{\deftypeopheaderx\putwordMethodon}
 \makedefun{defivar}{\defcvof\putwordInstanceVariableof}  \makedefun{defivar}{\defcvheaderx\putwordInstanceVariableof}
 \makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof}  \makedefun{deftypeivar}{\deftypecvheaderx\putwordInstanceVariableof}
   
 % \defname, which formats the name of the @def (not the args).  % \printdefname, 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\defname#1#2#3{%  \def\printdefname#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 7774  might help (with 'rm \jobname.?? \jobnam Line 7830  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:
     \expandafter\ifx\csname SETtxideftypefnnl\endcsname\relax \else      \ifflagclear{txideftypefnnl}{}{\rettypeownlinetrue}%
       \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 7820  might help (with 'rm \jobname.?? \jobnam Line 7874  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 7841  might help (with 'rm \jobname.?? \jobnam Line 7897  might help (with 'rm \jobname.?? \jobnam
     \fi           % no return type      \fi           % no return type
     #3% output function name      #3% output function name
   }%    }%
   {\rm\enskip}% hskip 0.5 em of \rmfont    \ifflagclear{txidefnamenospace}{%
       {\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 in slanted roman (not ttsl), inconsistently with using  % Print arguments.  Use slanted for @def*, typewriter for @deftype*.
 % 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{%
   % use sl by default (not ttsl),    \bgroup
   % tt for the names.      \def\^^M{}% for line continuation
   \df \sl \hyphenchar\font=0      \df \ifdoingtypefn \tt \else \sl \fi
   %      \ifflagclear{txicodevaristt}{}%
   % On the other hand, if an argument has two dashes (for instance), we         {\def\var##1{{\setregularquotes \ttsl ##1}}}%
   % want a way to get ttsl.  We used to recommend @var for that, so      #1%
   % leave the code in, but it's strange for @var to lead to typewriter.    \egroup
   % Nowadays we recommend @code, since the difference between a ttsl hyphen  
   % and a tt hyphen is pretty tiny.  @code also disables ?` !`.  
   \def\var##1{{\setregularquotes\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 7883  might help (with 'rm \jobname.?? \jobnam Line 7932  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
   \global\let(=\lparen \global\let)=\rparen    \gdef\defcharsdefault{%
   \global\let[=\lbrack \global\let]=\rbrack      \let(=\lparen \let)=\rparen
   \global\let& = \&      \let[=\lbrack \let]=\rbrack
       \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 7896  might help (with 'rm \jobname.?? \jobnam Line 7948  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{\bf\&#1 }}  \def\amprm#1 {\ampseentrue{\rm\&#1 }}
   
 \def\parenfont{%  \def\parenfont{%
   \ifampseen    \ifampseen
Line 8069  might help (with 'rm \jobname.?? \jobnam Line 8121  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  \def\macrobodyctxt{% used for @macro definitions and @copying
   \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 8095  might help (with 'rm \jobname.?? \jobnam Line 8140  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 8146  might help (with 'rm \jobname.?? \jobnam Line 8187  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    \begingroup \macrobodyctxt \usembodybackslash
   \ifrecursive \expandafter\parsermacbody    \ifrecursive \expandafter\parsermacbody
   \else \expandafter\parsemacbody    \else \expandafter\parsemacbody
   \fi}    \fi}
Line 8161  might help (with 'rm \jobname.?? \jobnam Line 8202  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 8229  might help (with 'rm \jobname.?? \jobnam Line 8268  might help (with 'rm \jobname.?? \jobnam
 % 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 backslashshes in the macro  % We are in \macrobodyctxt, and the \xdef causes backslashes in the macro
 % body to be transformed.  % body to be transformed.
 % Set \macrobody to the body of the macro, and call \defmacro.  % Set \macrobody to the body of the macro, and call \macrodef.
 %  %
 {\catcode`\ =\other\long\gdef\parsemacbody#1@end macro{%  {\catcode`\ =\other\long\gdef\parsemacbody#1@end macro{%
 \xdef\macrobody{\eatcr{#1}}\endgroup\defmacro}}%  \xdef\macrobody{\eatcr{#1}}\endgroup\macrodef}}%
 {\catcode`\ =\other\long\gdef\parsermacbody#1@end rmacro{%  {\catcode`\ =\other\long\gdef\parsermacbody#1@end rmacro{%
 \xdef\macrobody{\eatcr{#1}}\endgroup\defmacro}}%  \xdef\macrobody{\eatcr{#1}}\endgroup\macrodef}}%
   
 % 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 8455  might help (with 'rm \jobname.?? \jobnam Line 8494  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\defmacro{%  \def\macrodef{%
   \let\hash=##% convert placeholders to macro parameter chars    \let\hash=##% convert placeholders to macro parameter chars
   \ifnum\paramno=1    \ifnum\paramno=1
     \def\xeatspaces##1{##1}%      \long\def\xeatspaces##1{##1}%
     % This removes the pair of braces around the argument.  We don't      % We don't use \xeatspaces for single-argument macros, because we
     % use \eatspaces, because this can cause ends of lines to be lost      % want to keep ends of lines.  This definition removes \xeatspaces
     % when the argument to \eatspaces is read, leading to line-based      % when \macrobody is expanded below.
     % commands like "@itemize" not being read correctly.    \else
   \else      \def\xeatspaces{\string\xeatspaces}%
     \let\xeatspaces\relax % suppress expansion      % This expands \xeatspaces as a sequence of character tokens, which
       % 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{%
       \bgroup        \begingroup
         \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{%
       \egroup        \endgroup
       \noexpand\scanmacro{\macrobody}}%        \noexpand\scanmacro{\macrobody}}%
   \or % 1    \or % 1
     \expandafter\xdef\csname\the\macname\endcsname{%      \expandafter\xdef\csname\the\macname\endcsname{%
        \bgroup         \begingroup
        \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{%
       \egroup        \endgroup
       \noexpand\scanmacro{\macrobody}%        \noexpand\scanmacro{\macrobody}%
       }%        }%
   \else % at most 9    \else % at most 9
Line 8494  might help (with 'rm \jobname.?? \jobnam Line 8534  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{%
         \bgroup          \begingroup
         \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 8508  might help (with 'rm \jobname.?? \jobnam Line 8548  might help (with 'rm \jobname.?? \jobnam
       \expandafter\xdef        \expandafter\xdef
       \expandafter\expandafter        \expandafter\expandafter
         \csname\the\macname @@@@\endcsname\paramlist{%          \csname\the\macname @@@@\endcsname\paramlist{%
           \egroup\noexpand\scanmacro{\macrobody}}%            \endgroup\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 8630  might help (with 'rm \jobname.?? \jobnam Line 8670  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 8681  might help (with 'rm \jobname.?? \jobnam Line 8790  might help (with 'rm \jobname.?? \jobnam
 }  }
 \def\wordTop{Top}  \def\wordTop{Top}
   
 % Until the next @node or @bye command, divert output to a box that is not  % Until the next @node, @part or @bye command, divert output to a box that
 % output.  % is not output.
 \def\ignorenode{\setbox\dummybox\vbox\bgroup\def\node{\egroup\node}%  \def\ignorenode{\setbox\dummybox\vbox\bgroup
   \def\part{\egroup\part}%
   \def\node{\egroup\node}%
 \ignorenodebye  \ignorenodebye
 }  }
   
Line 8704  might help (with 'rm \jobname.?? \jobnam Line 8815  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 8785  might help (with 'rm \jobname.?? \jobnam Line 8901  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
   %    %
   % Get args without leading/trailing spaces.    \getprintedrefname{#1}{#3}{#5}%
   \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}%
   %    %
   \def\printedmanual{\ignorespaces #5}%    \startxreflink{#1}{#4}%
   \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 8948  might help (with 'rm \jobname.?? \jobnam Line 8966  might help (with 'rm \jobname.?? \jobnam
       % 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
       %        %
       \expandafter\ifx\csname SETtxiomitxrefpg\endcsname\relax        \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 \putwordpage\tie\refx{#1-pg}%          \turnoffactive \putpageref{#1}%
         % 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
Line 8963  might help (with 'rm \jobname.?? \jobnam Line 8980  might help (with 'rm \jobname.?? \jobnam
                   \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    \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 9002  might help (with 'rm \jobname.?? \jobnam Line 9110  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 9380  might help (with 'rm \jobname.?? \jobnam Line 9503  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 9392  might help (with 'rm \jobname.?? \jobnam Line 9521  might help (with 'rm \jobname.?? \jobnam
   \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    \makevalueexpandable
   % If the image is by itself, center it.  
   \ifvmode    \ifvmode
     \imagevmodetrue      \imagevmodetrue
   \else \ifx\centersub\centerV      \medskip
     % 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.
     \nobreak\vskip\parskip      \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
   %    %
   % Leave vertical mode so that indentation from an enclosing    \ifx\centersub\centerV
   %  environment such as @quotation is respected.      % For @center @image, enter vertical mode and add vertical space
   % However, if we're at the top level, we don't want the      % Enter an extra \parskip because @center doesn't add space itself.
   %  normal paragraph indentation.      \vbox\bgroup\vskip\parskip\medskip\vskip\parskip
   % On the other hand, if we are in the case of @center @image, we don't    \else
   %  want to start a paragraph, which will create a hsize-width box and      % Enter horizontal mode so that indentation from an enclosing
   %  eradicate the centering.      %  environment such as @quotation is respected.
   \ifx\centersub\centerV \else \imageindent \fi      % However, if we're at the top level, we don't want the
       %  normal paragraph indentation.
       \imageindent
     \fi
   %    %
   % Output the image.    % Output the image.
   \ifpdf    \ifpdf
Line 9439  might help (with 'rm \jobname.?? \jobnam Line 9566  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 \egroup \fi    \ifx\centersub\centerV % @center @image
       \medskip
       \egroup % close \vbox
     \fi
 \endgroup}  \endgroup}
   
   
Line 9608  might help (with 'rm \jobname.?? \jobnam Line 9739  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\scanargctxt\defcaption}  \def\docaption{\checkenv\float \bgroup\scanctxt\docaptionz}
 \def\defcaption#1#2{\egroup \def#1{#2}}  \def\docaptionz#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 9898  directory should work if nowhere else do Line 10029  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 9928  directory should work if nowhere else do Line 10057  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 9937  directory should work if nowhere else do Line 10065  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 9952  directory should work if nowhere else do Line 10074  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.
 \def\latonechardefs{%  \gdef\latonechardefs{%
   \gdefchar^^a0{\tie}    \gdefchar^^a0{\tie}
   \gdefchar^^a1{\exclamdown}    \gdefchar^^a1{\exclamdown}
   \gdefchar^^a2{{\tcfont \char162}} % cent    \gdefchar^^a2{{\tcfont \char162}} % cent
Line 10058  directory should work if nowhere else do Line 10186  directory should work if nowhere else do
 }  }
   
 % Latin9 (ISO-8859-15) encoding character definitions.  % Latin9 (ISO-8859-15) encoding character definitions.
 \def\latninechardefs{%  \gdef\latninechardefs{%
   % Encoding is almost identical to Latin1.    % Encoding is almost identical to Latin1.
   \latonechardefs    \latonechardefs
   %    %
Line 10073  directory should work if nowhere else do Line 10201  directory should work if nowhere else do
 }  }
   
 % Latin2 (ISO-8859-2) character definitions.  % Latin2 (ISO-8859-2) character definitions.
 \def\lattwochardefs{%  \gdef\lattwochardefs{%
   \gdefchar^^a0{\tie}    \gdefchar^^a0{\tie}
   \gdefchar^^a1{\ogonek{A}}    \gdefchar^^a1{\ogonek{A}}
   \gdefchar^^a2{\u{}}    \gdefchar^^a2{\u{}}
Line 10091  directory should work if nowhere else do Line 10219  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 10177  directory should work if nowhere else do Line 10305  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 10328  directory should work if nowhere else do Line 10458  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 < "A0\relax      \ifnum\countUTFz < "20\relax
       \errhelp = \EMsimple        \errhelp = \EMsimple
       \errmessage{Cannot define Unicode char value < 00A0}%        \errmessage{Cannot define Unicode char value < 0020}%
     \else\ifnum\countUTFz < "800\relax      \else\ifnum\countUTFz < "800\relax
       \parseUTFviiiA,%        \parseUTFviiiA,%
       \parseUTFviiiB C\UTFviiiTwoOctetsName.,%        \parseUTFviiiB C\UTFviiiTwoOctetsName.,%
Line 10400  directory should work if nowhere else do Line 10530  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 10417  directory should work if nowhere else do Line 10644  directory should work if nowhere else do
   \DeclareUnicodeCharacter{00AE}{\registeredsymbol{}}%    \DeclareUnicodeCharacter{00AE}{\registeredsymbol{}}%
   \DeclareUnicodeCharacter{00AF}{\={ }}%    \DeclareUnicodeCharacter{00AF}{\={ }}%
   %    %
   \DeclareUnicodeCharacter{00B0}{\ringaccent{ }}%    \DeclareUnicodeCharacter{00B0}{\textdegree}%
   \DeclareUnicodeCharacter{00B1}{\ensuremath\pm}%    \DeclareUnicodeCharacter{00B1}{\ensuremath\pm}%
   \DeclareUnicodeCharacter{00B2}{$^2$}%    \DeclareUnicodeCharacter{00B2}{$^2$}%
   \DeclareUnicodeCharacter{00B3}{$^3$}%    \DeclareUnicodeCharacter{00B3}{$^3$}%
Line 10899  directory should work if nowhere else do Line 11126  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 10918  directory should work if nowhere else do Line 11148  directory should work if nowhere else do
   %    %
   \DeclareUnicodeCharacter{20AC}{\euro{}}%    \DeclareUnicodeCharacter{20AC}{\euro{}}%
   %    %
   \DeclareUnicodeCharacter{2192}{\expansion{}}%    \DeclareUnicodeCharacter{2192}{\arrow}%
   \DeclareUnicodeCharacter{21D2}{\result{}}%    \DeclareUnicodeCharacter{21D2}{\result{}}%
   %    %
   % Mathematical symbols    % Mathematical symbols
Line 11081  directory should work if nowhere else do Line 11311  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{%
   \catcode"#1=\active    \ifnum"#1>"7F % only make non-ASCII chars active
   \def\dodeclareunicodecharacternative##1##2##3{%      \catcode"#1=\active
       \def\dodeclareunicodecharacternative##1##2##3{%
         \begingroup
           \uccode`\~="##2\relax
           \uppercase{\gdef~}{%
             \ifpassthroughchars
               ##1%
             \else
               ##3%
             \fi
           }
         \endgroup
       }
     \begingroup      \begingroup
       \uccode`\~="##2\relax        \uccode`\.="#1\relax
       \uppercase{\gdef~}{%        \uppercase{\def\UTFNativeTmp{.}}%
         \ifpassthroughchars        \expandafter\dodeclareunicodecharacternative\UTFNativeTmp{#1}{#2}%
           ##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 11127  directory should work if nowhere else do Line 11359  directory should work if nowhere else do
    \relax     \relax
 }  }
   
 % Define all Unicode characters we know about.  This makes UTF-8 the default  % Define all Unicode characters we know about
 % 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 11181  directory should work if nowhere else do Line 11413  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 11244  directory should work if nowhere else do Line 11472  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 11294  directory should work if nowhere else do Line 11505  directory should work if nowhere else do
   \textleading = 12.5pt    \textleading = 12.5pt
   %    %
   \internalpagesizes{160mm}{120mm}%    \internalpagesizes{160mm}{120mm}%
                     {\voffset}{\hoffset}%                      {\voffset}{-11.4mm}%
                     {\bindingoffset}{8pt}%                      {\bindingoffset}{8pt}%
                     {210mm}{148mm}%                      {210mm}{148mm}%
   %    %
Line 11373  directory should work if nowhere else do Line 11584  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 11391  directory should work if nowhere else do Line 11731  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 11453  directory should work if nowhere else do Line 11776  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{%
   \normalturnoffactive    \passthroughcharstrue
     \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
 }  }
   
 \catcode`\@=0  % 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 \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 11479  directory should work if nowhere else do Line 11811  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.
   
 % \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{%  
    @passthroughcharstrue  
    @let-=@normaldash  
    @let"=@normaldoublequote  
    @let$=@normaldollar %$ font-lock fix  
    @let+=@normalplus  
    @let<=@normalless  
    @let>=@normalgreater  
    @let^=@normalcaret  
    @let_=@normalunderscore  
    @let|=@normalverticalbar  
    @let~=@normaltilde  
    @let\=@ttbackslash  
    @setregularquotes  
    @unsepspaces  
  }  
 }  
   
 % 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'  % These are made active for url-breaking, so need
 %  % active definitions as the normal characters.
 % If a .fmt file is being used, we don't want the `\input texinfo' to show up.  \def\normaldot{.}
 % That is what \eatinput is for; after that, the `\' should revert to printing  \def\normalquest{?}
 % a backslash.  \def\normalslash{/}
 % 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.  % \newlinesloadsconf - call \loadconf as soon as possible in the
 % This is used on the very last line of this file, texinfo.tex.  % file, e.g. at the first newline.
 % We also use @c to call @fixbackslash, in case ends of lines are hidden.  %
 {  {\catcode`\^=7
 @catcode`@^=7  \catcode`\^^M=13
 @catcode`@^^M=13@gdef@enablebackslashhack{%  \gdef\newlineloadsconf{%
   @global@let\ = @eatinput%    \catcode`\^^M=13 %
   @catcode`@^^M=13%    \newlineloadsconfzz%
   @def@c{@fixbackslash@c}%  }
   % Definition for the newline at the end of this file.  \gdef\newlineloadsconfzz#1^^M{%
   @def ^^M{@let^^M@secondlinenl}%    \def\c{\loadconf\c}%
   % Definition for a newline in the main Texinfo file.    % Definition for the first newline read in the file
   @gdef @secondlinenl{@fixbackslash}%    \def ^^M{\loadconf}%
   % In case the first line has a whole-line command on it    % In case the first line has a whole-line or environment command on it
   @let@originalparsearg@parsearg    \let\originalparsearg\parsearg%
   @def@parsearg{@fixbackslash@originalparsearg}    \def\parsearg{\loadconf\originalparsearg}%
     %
     % \startenvironment is in the expansion of commands defined with \envdef
     \let\originalstartenvironment\startenvironment%
     \def\startenvironment{\loadconf\startenvironment}%
 }}  }}
   
 {@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%
 }}}  }}}
   
   
 @gdef@fixbackslash{%  % \loadconf gets called at the beginning of every Texinfo file.
   @ifx\@eatinput @let\ = @ttbackslash @fi  % If texinfo.cnf is present on the system, read it.  Useful for site-wide
   @catcode13=5 % regular end of line  % @afourpaper, etc.  Not opening texinfo.cnf directly in texinfo.tex
   @enableemergencynewline  % makes it possible to make a format file for Texinfo.
   @let@c=@comment  %
   @let@parsearg@originalparsearg  \gdef\loadconf{%
     \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
   %    %
   % If texinfo.cnf is present on the system, read it.    \openin 1 texinfo.cnf
   % Useful for site-wide @afourpaper, etc.  This macro, @fixbackslash, gets    \ifeof 1 \else \input texinfo.cnf \fi
   % called at the beginning of every Texinfo file.  Not opening texinfo.cnf    \closein 1
   % 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 11596  directory should work if nowhere else do Line 11944  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
 @setregularquotes  
   
 @c Local variables:  @c Local variables:
 @c eval: (add-hook 'before-save-hook 'time-stamp)  @c eval: (add-hook 'before-save-hook 'time-stamp nil t)
 @c page-delimiter: "^\\\\message\\|emacs-page"  @c time-stamp-pattern: "texinfoversion{%Y-%02m-%02d.%02H}"
 @c time-stamp-start: "def\\\\texinfoversion{"  @c page-delimiter: "^\\\\message"
 @c time-stamp-format: "%:y-%02m-%02d.%02H"  
 @c time-stamp-end: "}"  
 @c End:  @c End:
   
 @c vim:sw=2:  @newlineloadsconf
   
 @enablebackslashhack  
   

Removed from v.1.3  
changed lines
  Added in v.1.6


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