Diff for /embedaddon/quagga/doc/texinfo.tex between versions 1.1.1.1 and 1.1.1.2

version 1.1.1.1, 2012/02/21 17:26:11 version 1.1.1.2, 2012/05/29 11:53:41
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{2009-08-14.15}\def\texinfoversion{2011-11-09.15}
 %  %
 % Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,  % Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
 % 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,  % 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
% 2007, 2008, 2009 Free Software Foundation, Inc.% 2007, 2008, 2009, 2010, 2011 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 65 Line 65
 \everyjob{\message{[Texinfo version \texinfoversion]}%  \everyjob{\message{[Texinfo version \texinfoversion]}%
   \catcode`+=\active \catcode`\_=\active}    \catcode`+=\active \catcode`\_=\active}
   
   
 \chardef\other=12  \chardef\other=12
   
 % We never want plain's \outer definition of \+ in Texinfo.  % We never want plain's \outer definition of \+ in Texinfo.
Line 93 Line 92
 \let\ptexnewwrite\newwrite  \let\ptexnewwrite\newwrite
 \let\ptexnoindent=\noindent  \let\ptexnoindent=\noindent
 \let\ptexplus=+  \let\ptexplus=+
   \let\ptexraggedright=\raggedright
 \let\ptexrbrace=\}  \let\ptexrbrace=\}
 \let\ptexslash=\/  \let\ptexslash=\/
 \let\ptexstar=\*  \let\ptexstar=\*
 \let\ptext=\t  \let\ptext=\t
 \let\ptextop=\top  \let\ptextop=\top
{\catcode`\'=\active{\catcode`\'=\active \global\let\ptexquoteright'}% active in plain's math mode
\global\let\ptexquoteright'}% Math-mode def from plain.tex. 
\let\ptexraggedright=\raggedright 
   
 % If this character appears in an error message or help string, it  % If this character appears in an error message or help string, it
 % starts a new line in the output.  % starts a new line in the output.
Line 118 Line 116
 % Set up fixed words for English if not already set.  % Set up fixed words for English if not already set.
 \ifx\putwordAppendix\undefined  \gdef\putwordAppendix{Appendix}\fi  \ifx\putwordAppendix\undefined  \gdef\putwordAppendix{Appendix}\fi
 \ifx\putwordChapter\undefined   \gdef\putwordChapter{Chapter}\fi  \ifx\putwordChapter\undefined   \gdef\putwordChapter{Chapter}\fi
   \ifx\putworderror\undefined     \gdef\putworderror{error}\fi
 \ifx\putwordfile\undefined      \gdef\putwordfile{file}\fi  \ifx\putwordfile\undefined      \gdef\putwordfile{file}\fi
 \ifx\putwordin\undefined        \gdef\putwordin{in}\fi  \ifx\putwordin\undefined        \gdef\putwordin{in}\fi
\ifx\putwordIndexIsEmpty\undefined     \gdef\putwordIndexIsEmpty{(Index is empty)}\fi\ifx\putwordIndexIsEmpty\undefined       \gdef\putwordIndexIsEmpty{(Index is empty)}\fi
\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi\ifx\putwordIndexNonexistent\undefined   \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi
 \ifx\putwordInfo\undefined      \gdef\putwordInfo{Info}\fi  \ifx\putwordInfo\undefined      \gdef\putwordInfo{Info}\fi
 \ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi  \ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi
 \ifx\putwordMethodon\undefined  \gdef\putwordMethodon{Method on}\fi  \ifx\putwordMethodon\undefined  \gdef\putwordMethodon{Method on}\fi
Line 160 Line 159
 \def\spaceisspace{\catcode`\ =\spacecat}  \def\spaceisspace{\catcode`\ =\spacecat}
   
 % sometimes characters are active, so we need control sequences.  % sometimes characters are active, so we need control sequences.
   \chardef\ampChar   = `\&
 \chardef\colonChar = `\:  \chardef\colonChar = `\:
 \chardef\commaChar = `\,  \chardef\commaChar = `\,
 \chardef\dashChar  = `\-  \chardef\dashChar  = `\-
 \chardef\dotChar   = `\.  \chardef\dotChar   = `\.
 \chardef\exclamChar= `\!  \chardef\exclamChar= `\!
   \chardef\hashChar  = `\#
 \chardef\lquoteChar= `\`  \chardef\lquoteChar= `\`
 \chardef\questChar = `\?  \chardef\questChar = `\?
 \chardef\rquoteChar= `\'  \chardef\rquoteChar= `\'
 \chardef\semiChar  = `\;  \chardef\semiChar  = `\;
   \chardef\slashChar = `\/
 \chardef\underChar = `\_  \chardef\underChar = `\_
   
 % Ignore a token.  % Ignore a token.
Line 199 Line 201
 % that mark overfull boxes (in case you have decided  % that mark overfull boxes (in case you have decided
 % that the text looks ok even though it passes the margin).  % that the text looks ok even though it passes the margin).
 %  %
\def\finalout{\overfullrule=0pt}\def\finalout{\overfullrule=0pt }
   
 % @| inserts a changebar to the left of the current line.  It should  
 % surround any changed text.  This approach does *not* work if the  
 % change spans more than two lines of output.  To handle that, we would  
 % have adopt a much more difficult approach (putting marks into the main  
 % vertical list for the beginning and end of each change).  
 %  
 \def\|{%  
   % \vadjust can only be used in horizontal mode.  
   \leavevmode  
   %  
   % Append this vertical mode material after the current line in the output.  
   \vadjust{%  
     % We want to insert a rule with the height and depth of the current  
     % leading; that is exactly what \strutbox is supposed to record.  
     \vskip-\baselineskip  
     %  
     % \vadjust-items are inserted at the left edge of the type.  So  
     % the \llap here moves out into the left-hand margin.  
     \llap{%  
       %  
       % For a thicker or thinner bar, change the `1pt'.  
       \vrule height\baselineskip width1pt  
       %  
       % This is the space between the bar and the text.  
       \hskip 12pt  
     }%  
   }%  
 }  
   
 % Sometimes it is convenient to have everything in the transcript file  % Sometimes it is convenient to have everything in the transcript file
 % and nothing on the terminal.  We don't just call \tracingall here,  % and nothing on the terminal.  We don't just call \tracingall here,
 % since that produces some useless output on the terminal.  We also make  % since that produces some useless output on the terminal.  We also make
Line 246 Line 219
   \tracingmacros2    \tracingmacros2
   \tracingrestores1    \tracingrestores1
   \showboxbreadth\maxdimen \showboxdepth\maxdimen    \showboxbreadth\maxdimen \showboxdepth\maxdimen
  \ifx\eTeXversion\undefined\else % etex gives us more logging  \ifx\eTeXversion\thisisundefined\else % etex gives us more logging
     \tracingscantokens1      \tracingscantokens1
     \tracingifs1      \tracingifs1
     \tracinggroups1      \tracinggroups1
Line 267 Line 240
 \def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount  \def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount
   \removelastskip\penalty-200\bigskip\fi\fi}    \removelastskip\penalty-200\bigskip\fi\fi}
   
 % For @cropmarks command.  
 % Do @cropmarks to get crop marks.  % Do @cropmarks to get crop marks.
 %  %
 \newif\ifcropmarks  \newif\ifcropmarks
Line 577 Line 549
 }  }
 \def\inenvironment#1{%  \def\inenvironment#1{%
   \ifx#1\empty    \ifx#1\empty
    out of any environment%    outside of any environment%
   \else    \else
     in environment \expandafter\string#1%      in environment \expandafter\string#1%
   \fi    \fi
Line 589 Line 561
 \parseargdef\end{%  \parseargdef\end{%
   \if 1\csname iscond.#1\endcsname    \if 1\csname iscond.#1\endcsname
   \else    \else
    % The general wording of \badenverr may not be ideal, but... --kasal, 06nov03    % The general wording of \badenverr may not be ideal.
     \expandafter\checkenv\csname#1\endcsname      \expandafter\checkenv\csname#1\endcsname
     \csname E#1\endcsname      \csname E#1\endcsname
     \endgroup      \endgroup
Line 599 Line 571
 \newhelp\EMsimple{Press RETURN to continue.}  \newhelp\EMsimple{Press RETURN to continue.}
   
   
 %% Simple single-character @ commands  
   
 % @@ prints an @  
 % Kludge this until the fonts are right (grr).  
 \def\@{{\tt\char64}}  
   
 % This is turned off because it was never documented  
 % and you can use @w{...} around a quote to suppress ligatures.  
 %% Define @` and @' to be the same as ` and '  
 %% but suppressing ligatures.  
 %\def\`{{`}}  
 %\def\'{{'}}  
   
 % Used to generate quoted braces.  
 \def\mylbrace {{\tt\char123}}  
 \def\myrbrace {{\tt\char125}}  
 \let\{=\mylbrace  
 \let\}=\myrbrace  
 \begingroup  
   % Definitions to produce \{ and \} commands for indices,  
   % and @{ and @} for the aux/toc files.  
   \catcode`\{ = \other \catcode`\} = \other  
   \catcode`\[ = 1 \catcode`\] = 2  
   \catcode`\! = 0 \catcode`\\ = \other  
   !gdef!lbracecmd[\{]%  
   !gdef!rbracecmd[\}]%  
   !gdef!lbraceatcmd[@{]%  
   !gdef!rbraceatcmd[@}]%  
 !endgroup  
   
 % @comma{} to avoid , parsing problems.  
 \let\comma = ,  
   
 % Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent  
 % Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.  
 \let\, = \c  
 \let\dotaccent = \.  
 \def\ringaccent#1{{\accent23 #1}}  
 \let\tieaccent = \t  
 \let\ubaraccent = \b  
 \let\udotaccent = \d  
   
 % Other special characters: @questiondown @exclamdown @ordf @ordm  
 % Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.  
 \def\questiondown{?`}  
 \def\exclamdown{!`}  
 \def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}}  
 \def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}}  
   
 % Dotless i and dotless j, used for accents.  
 \def\imacro{i}  
 \def\jmacro{j}  
 \def\dotless#1{%  
   \def\temp{#1}%  
   \ifx\temp\imacro \ifmmode\imath \else\ptexi \fi  
   \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi  
   \else \errmessage{@dotless can be used only with i or j}%  
   \fi\fi  
 }  
   
 % The \TeX{} logo, as in plain, but resetting the spacing so that a  
 % period following counts as ending a sentence.  (Idea found in latex.)  
 %  
 \edef\TeX{\TeX \spacefactor=1000 }  
   
 % @LaTeX{} logo.  Not quite the same results as the definition in  
 % latex.ltx, since we use a different font for the raised A; it's most  
 % convenient for us to use an explicitly smaller font, rather than using  
 % the \scriptstyle font (since we don't reset \scriptstyle and  
 % \scriptscriptstyle).  
 %  
 \def\LaTeX{%  
   L\kern-.36em  
   {\setbox0=\hbox{T}%  
    \vbox to \ht0{\hbox{\selectfonts\lllsize A}\vss}}%  
   \kern-.15em  
   \TeX  
 }  
   
 % Be sure we're in horizontal mode when doing a tie, since we make space  % Be sure we're in horizontal mode when doing a tie, since we make space
 % equivalent to this in @example-like environments. Otherwise, a space  % equivalent to this in @example-like environments. Otherwise, a space
 % at the beginning of a line will start with \penalty -- and  % at the beginning of a line will start with \penalty -- and
Line 719 Line 612
   \else\ifx\temp\offword \plainnonfrenchspacing    \else\ifx\temp\offword \plainnonfrenchspacing
   \else    \else
     \errhelp = \EMsimple      \errhelp = \EMsimple
    \errmessage{Unknown @frenchspacing option `\temp', must be on/off}%    \errmessage{Unknown @frenchspacing option `\temp', must be on|off}%
   \fi\fi    \fi\fi
 }  }
   
Line 801  where each line of input produces a line of output.} Line 694  where each line of input produces a line of output.}
   
 \newdimen\mil  \mil=0.001in  \newdimen\mil  \mil=0.001in
   
 % Old definition--didn't work.  
 %\parseargdef\need{\par %  
 %% This method tries to make TeX break the page naturally  
 %% if the depth of the box does not fit.  
 %{\baselineskip=0pt%  
 %\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak  
 %\prevdepth=-1000pt  
 %}}  
   
 \parseargdef\need{%  \parseargdef\need{%
   % Ensure vertical mode, so we don't make a big box in the middle of a    % Ensure vertical mode, so we don't make a big box in the middle of a
   % paragraph.    % paragraph.
Line 873  where each line of input produces a line of output.} Line 757  where each line of input produces a line of output.}
   
 % @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current  % @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
 % paragraph.  For more general purposes, use the \margin insertion  % paragraph.  For more general purposes, use the \margin insertion
% class.  WHICH is `l' or `r'.% class.  WHICH is `l' or `r'.  Not documented, written for gawk manual.
 %  %
 \newskip\inmarginspacing \inmarginspacing=1cm  \newskip\inmarginspacing \inmarginspacing=1cm
 \def\strutdepth{\dp\strutbox}  \def\strutdepth{\dp\strutbox}
Line 920  where each line of input produces a line of output.} Line 804  where each line of input produces a line of output.}
   \temp    \temp
 }  }
   
   % @| inserts a changebar to the left of the current line.  It should
   % surround any changed text.  This approach does *not* work if the
   % change spans more than two lines of output.  To handle that, we would
   % have adopt a much more difficult approach (putting marks into the main
   % vertical list for the beginning and end of each change).  This command
   % is not documented, not supported, and doesn't work.
   %
   \def\|{%
     % \vadjust can only be used in horizontal mode.
     \leavevmode
     %
     % Append this vertical mode material after the current line in the output.
     \vadjust{%
       % We want to insert a rule with the height and depth of the current
       % leading; that is exactly what \strutbox is supposed to record.
       \vskip-\baselineskip
       %
       % \vadjust-items are inserted at the left edge of the type.  So
       % the \llap here moves out into the left-hand margin.
       \llap{%
         %
         % For a thicker or thinner bar, change the `1pt'.
         \vrule height\baselineskip width1pt
         %
         % This is the space between the bar and the text.
         \hskip 12pt
       }%
     }%
   }
   
 % @include FILE -- \input text of FILE.  % @include FILE -- \input text of FILE.
 %  %
 \def\include{\parseargusing\filenamecatcodes\includezzz}  \def\include{\parseargusing\filenamecatcodes\includezzz}
Line 930  where each line of input produces a line of output.} Line 844  where each line of input produces a line of output.}
     \makevalueexpandable  % we want to expand any @value in FILE.      \makevalueexpandable  % we want to expand any @value in FILE.
     \turnoffactive        % and allow special characters in the expansion      \turnoffactive        % and allow special characters in the expansion
     \indexnofonts         % Allow `@@' and other weird things in file names.      \indexnofonts         % Allow `@@' and other weird things in file names.
       \wlog{texinfo.tex: doing @include of #1^^J}%
     \edef\temp{\noexpand\input #1 }%      \edef\temp{\noexpand\input #1 }%
     %      %
     % This trickery is to read FILE outside of a group, in case it makes      % This trickery is to read FILE outside of a group, in case it makes
Line 1095  where each line of input produces a line of output.} Line 1010  where each line of input produces a line of output.}
 }  }
   
   
 % @asis just yields its argument.  Used with @table, for example.  
 %  
 \def\asis#1{#1}  
   
 % @math outputs its argument in math mode.  
 %  
 % One complication: _ usually means subscripts, but it could also mean  
 % an actual _ character, as in @math{@var{some_variable} + 1}.  So make  
 % _ active, and distinguish by seeing if the current family is \slfam,  
 % which is what @var uses.  
 {  
   \catcode`\_ = \active  
   \gdef\mathunderscore{%  
     \catcode`\_=\active  
     \def_{\ifnum\fam=\slfam \_\else\sb\fi}%  
   }  
 }  
 % Another complication: we want \\ (and @\) to output a \ character.  
 % FYI, plain.tex uses \\ as a temporary control sequence (why?), but  
 % this is not advertised and we don't care.  Texinfo does not  
 % otherwise define @\.  
 %  
 % The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\.  
 \def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}  
 %  
 \def\math{%  
   \tex  
   \mathunderscore  
   \let\\ = \mathbackslash  
   \mathactive  
   % make the texinfo accent commands work in math mode  
   \let\"=\ddot  
   \let\'=\acute  
   \let\==\bar  
   \let\^=\hat  
   \let\`=\grave  
   \let\u=\breve  
   \let\v=\check  
   \let\~=\tilde  
   \let\dotaccent=\dot  
   $\finishmath  
 }  
 \def\finishmath#1{#1$\endgroup}  % Close the group opened by \tex.  
   
 % Some active characters (such as <) are spaced differently in math.  
 % We have to reset their definitions in case the @math was an argument  
 % to a command which sets the catcodes (such as @item or @section).  
 %  
 {  
   \catcode`^ = \active  
   \catcode`< = \active  
   \catcode`> = \active  
   \catcode`+ = \active  
   \catcode`' = \active  
   \gdef\mathactive{%  
     \let^ = \ptexhat  
     \let< = \ptexless  
     \let> = \ptexgtr  
     \let+ = \ptexplus  
     \let' = \ptexquoteright  
   }  
 }  
   
 % Some math mode symbols.  
 \def\bullet{$\ptexbullet$}  
 \def\geq{\ifmmode \ge\else $\ge$\fi}  
 \def\leq{\ifmmode \le\else $\le$\fi}  
 \def\minus{\ifmmode -\else $-$\fi}  
   
 % @dots{} outputs an ellipsis using the current font.  
 % We do .5em per period so that it has the same spacing in the cm  
 % typewriter fonts as three actual period characters; on the other hand,  
 % in other typewriter fonts three periods are wider than 1.5em.  So do  
 % whichever is larger.  
 %  
 \def\dots{%  
   \leavevmode  
   \setbox0=\hbox{...}% get width of three periods  
   \ifdim\wd0 > 1.5em  
     \dimen0 = \wd0  
   \else  
     \dimen0 = 1.5em  
   \fi  
   \hbox to \dimen0{%  
     \hskip 0pt plus.25fil  
     .\hskip 0pt plus1fil  
     .\hskip 0pt plus1fil  
     .\hskip 0pt plus.5fil  
   }%  
 }  
   
 % @enddots{} is an end-of-sentence ellipsis.  
 %  
 \def\enddots{%  
   \dots  
   \spacefactor=\endofsentencespacefactor  
 }  
   
 % @comma{} is so commas can be inserted into text without messing up  
 % Texinfo's parsing.  
 %  
 \let\comma = ,  
   
 % @refill is a no-op.  % @refill is a no-op.
 \let\refill=\relax  \let\refill=\relax
   
Line 1262  where each line of input produces a line of output.} Line 1074  where each line of input produces a line of output.}
 \newif\ifpdfmakepagedest  \newif\ifpdfmakepagedest
   
 % when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1  % when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1
% can be set).  So we test for \relax and 0 as well as \undefined,% can be set).  So we test for \relax and 0 as well as being undefined.
% borrowed from ifpdf.sty.\ifx\pdfoutput\thisisundefined
\ifx\pdfoutput\undefined 
 \else  \else
   \ifx\pdfoutput\relax    \ifx\pdfoutput\relax
   \else    \else
Line 1384  output) for that.)} Line 1195  output) for that.)}
     \def\imagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}%      \def\imagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}%
     \def\imageheight{#3}\setbox2 = \hbox{\ignorespaces #3}%      \def\imageheight{#3}\setbox2 = \hbox{\ignorespaces #3}%
     %      %
    % pdftex (and the PDF format) support .png, .jpg, .pdf (among    % pdftex (and the PDF format) support .pdf, .png, .jpg (among
    % others).  Let's try in that order.    % others).  Let's try in that order, PDF first since if
     % someone has a scalable image, presumably better to use that than a
     % bitmap.
     \let\pdfimgext=\empty      \let\pdfimgext=\empty
     \begingroup      \begingroup
      \openin 1 #1.png \ifeof 1      \openin 1 #1.pdf \ifeof 1
        \openin 1 #1.jpg \ifeof 1        \openin 1 #1.PDF \ifeof 1
          \openin 1 #1.jpeg \ifeof 1          \openin 1 #1.png \ifeof 1
            \openin 1 #1.JPG \ifeof 1            \openin 1 #1.jpg \ifeof 1
              \openin 1 #1.pdf \ifeof 1              \openin 1 #1.jpeg \ifeof 1
                \openin 1 #1.PDF \ifeof 1                \openin 1 #1.JPG \ifeof 1
                   \errhelp = \nopdfimagehelp                    \errhelp = \nopdfimagehelp
                   \errmessage{Could not find image file #1 for pdf}%                    \errmessage{Could not find image file #1 for pdf}%
                \else \gdef\pdfimgext{PDF}%                \else \gdef\pdfimgext{JPG}%
                 \fi                  \fi
              \else \gdef\pdfimgext{pdf}%              \else \gdef\pdfimgext{jpeg}%
               \fi                \fi
            \else \gdef\pdfimgext{JPG}%            \else \gdef\pdfimgext{jpg}%
             \fi              \fi
          \else \gdef\pdfimgext{jpeg}%          \else \gdef\pdfimgext{png}%
           \fi            \fi
        \else \gdef\pdfimgext{jpg}%        \else \gdef\pdfimgext{PDF}%
         \fi          \fi
      \else \gdef\pdfimgext{png}%      \else \gdef\pdfimgext{pdf}%
       \fi        \fi
       \closein 1        \closein 1
     \endgroup      \endgroup
Line 1492  output) for that.)} Line 1305  output) for that.)}
       \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace        \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace
       %        %
       % Read toc silently, to get counts of subentries for \pdfoutline.        % Read toc silently, to get counts of subentries for \pdfoutline.
         \def\partentry##1##2##3##4{}% ignore parts in the outlines
       \def\numchapentry##1##2##3##4{%        \def\numchapentry##1##2##3##4{%
         \def\thischapnum{##2}%          \def\thischapnum{##2}%
         \def\thissecnum{0}%          \def\thissecnum{0}%
Line 1695  output) for that.)} Line 1509  output) for that.)}
 % if we are producing pdf, and we have \pdffontattr, then define cmaps.  % if we are producing pdf, and we have \pdffontattr, then define cmaps.
 % (\pdffontattr was introduced many years ago, but people still run  % (\pdffontattr was introduced many years ago, but people still run
 % older pdftex's; it's easy to conditionalize, so we do.)  % older pdftex's; it's easy to conditionalize, so we do.)
\ifpdf \ifx\pdffontattr\undefined \else\ifpdf \ifx\pdffontattr\thisisundefined \else
   \begingroup    \begingroup
     \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.      \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
     \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap      \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
Line 1962  end Line 1776  end
 % 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
 % before you read in texinfo.tex.  % before you read in texinfo.tex.
\ifx\fontprefix\undefined\ifx\fontprefix\thisisundefined
 \def\fontprefix{cm}  \def\fontprefix{cm}
 \fi  \fi
 % Support font families that don't use the same naming scheme as CM.  % Support font families that don't use the same naming scheme as CM.
Line 2105  end Line 1919  end
 \font\reducedsy=cmsy10  \font\reducedsy=cmsy10
 \def\reducedecsize{1000}  \def\reducedecsize{1000}
   
% reset the current fonts\textleading = 13.2pt % line spacing for 11pt CM
\textfonts\textfonts            % reset the current fonts
 \rm  \rm
 } % end of 11pt text font size definitions  } % end of 11pt text font size definitions
   
Line 2236  end Line 2050  end
 \font\reducedsy=cmsy9  \font\reducedsy=cmsy9
 \def\reducedecsize{0900}  \def\reducedecsize{0900}
   
% reduce space between paragraphs\divide\parskip by 2  % reduce space between paragraphs
\divide\parskip by 2\textleading = 12pt   % line spacing for 10pt CM
\textfonts            % reset the current fonts
% reset the current fonts 
\textfonts 
 \rm  \rm
 } % end of 10pt text font size definitions  } % end of 10pt text font size definitions
   
Line 2249  end Line 2061  end
 %   @fonttextsize 10  %   @fonttextsize 10
 % (or 11) to redefine the text font size.  pt is assumed.  % (or 11) to redefine the text font size.  pt is assumed.
 %  %
 \def\xword{10}  
 \def\xiword{11}  \def\xiword{11}
   \def\xword{10}
   \def\xwordpt{10pt}
 %  %
 \parseargdef\fonttextsize{%  \parseargdef\fonttextsize{%
   \def\textsizearg{#1}%    \def\textsizearg{#1}%
  \wlog{doing @fonttextsize \textsizearg}%  %\wlog{doing @fonttextsize \textsizearg}%
   %    %
   % Set \globaldefs so that documents can use this inside @tex, since    % Set \globaldefs so that documents can use this inside @tex, since
   % makeinfo 4.8 does not support it, but we need it nonetheless.    % makeinfo 4.8 does not support it, but we need it nonetheless.
Line 2308  end Line 2121  end
   \let\tenttsl=\titlettsl    \let\tenttsl=\titlettsl
   \def\curfontsize{title}%    \def\curfontsize{title}%
   \def\lsize{chap}\def\lllsize{subsec}%    \def\lsize{chap}\def\lllsize{subsec}%
  \resetmathfonts \setleading{25pt}}  \resetmathfonts \setleading{27pt}}
 \def\titlefont#1{{\titlefonts\rmisbold #1}}  \def\titlefont#1{{\titlefonts\rmisbold #1}}
 \def\chapfonts{%  \def\chapfonts{%
   \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl    \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
Line 2436  end Line 2249  end
   
 % Markup style setup for left and right quotes.  % Markup style setup for left and right quotes.
 \defmarkupstylesetup\markupsetuplq{%  \defmarkupstylesetup\markupsetuplq{%
  \expandafter\let\expandafter \temp \csname markupsetuplq\currentmarkupstyle\endcsname  \expandafter\let\expandafter \temp
     \csname markupsetuplq\currentmarkupstyle\endcsname
   \ifx\temp\relax \markupsetuplqdefault \else \temp \fi    \ifx\temp\relax \markupsetuplqdefault \else \temp \fi
 }  }
   
 \defmarkupstylesetup\markupsetuprq{%  \defmarkupstylesetup\markupsetuprq{%
  \expandafter\let\expandafter \temp \csname markupsetuprq\currentmarkupstyle\endcsname  \expandafter\let\expandafter \temp
     \csname markupsetuprq\currentmarkupstyle\endcsname
   \ifx\temp\relax \markupsetuprqdefault \else \temp \fi    \ifx\temp\relax \markupsetuprqdefault \else \temp \fi
 }  }
   
Line 2460  end Line 2275  end
   
 \let\markupsetuplqcode \markupsetcodequoteleft  \let\markupsetuplqcode \markupsetcodequoteleft
 \let\markupsetuprqcode \markupsetcodequoteright  \let\markupsetuprqcode \markupsetcodequoteright
   %
 \let\markupsetuplqexample \markupsetcodequoteleft  \let\markupsetuplqexample \markupsetcodequoteleft
 \let\markupsetuprqexample \markupsetcodequoteright  \let\markupsetuprqexample \markupsetcodequoteright
   %
   \let\markupsetuplqsamp \markupsetcodequoteleft
   \let\markupsetuprqsamp \markupsetcodequoteright
   %
 \let\markupsetuplqverb \markupsetcodequoteleft  \let\markupsetuplqverb \markupsetcodequoteleft
 \let\markupsetuprqverb \markupsetcodequoteright  \let\markupsetuprqverb \markupsetcodequoteright
   %
 \let\markupsetuplqverbatim \markupsetcodequoteleft  \let\markupsetuplqverbatim \markupsetcodequoteleft
 \let\markupsetuprqverbatim \markupsetcodequoteright  \let\markupsetuprqverbatim \markupsetcodequoteright
   
 \let\markupsetuplqsamp \markupsetnoligaturesquoteleft  
 \let\markupsetuplqkbd \markupsetnoligaturesquoteleft  \let\markupsetuplqkbd \markupsetnoligaturesquoteleft
   
% Allow an option to not replace quotes with a regular directed right% Allow an option to not use regular directed right quote/apostrophe
% quote/apostrophe (char 0x27), but instead use the undirected quote% (char 0x27), but instead the undirected quote from cmtt (char 0x0d).
% from cmtt (char 0x0d).  The undirected quote is ugly, so don't make it% The undirected quote is ugly, so don't make it the default, but it
% the default, but it works for pasting with more pdf viewers (at least% works for pasting with more pdf viewers (at least evince), the
% evince), the lilypond developers report.  xpdf does work with the% lilypond developers report.  xpdf does work with the regular 0x27.
% regular 0x27. 
 %  %
 \def\codequoteright{%  \def\codequoteright{%
   \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax    \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax
Line 2499  end Line 2318  end
   \else \char'22 \fi    \else \char'22 \fi
 }  }
   
   % Commands to set the quote options.
   % 
   \parseargdef\codequoteundirected{%
     \def\temp{#1}%
     \ifx\temp\onword
       \expandafter\let\csname SETtxicodequoteundirected\endcsname
         = t%
     \else\ifx\temp\offword
       \expandafter\let\csname SETtxicodequoteundirected\endcsname
         = \relax
     \else
       \errhelp = \EMsimple
       \errmessage{Unknown @codequoteundirected value `\temp', must be on|off}%
     \fi\fi
   }
   %
   \parseargdef\codequotebacktick{%
     \def\temp{#1}%
     \ifx\temp\onword
       \expandafter\let\csname SETtxicodequotebacktick\endcsname
         = t%
     \else\ifx\temp\offword
       \expandafter\let\csname SETtxicodequotebacktick\endcsname
         = \relax
     \else
       \errhelp = \EMsimple
       \errmessage{Unknown @codequotebacktick value `\temp', must be on|off}%
     \fi\fi
   }
   
 % [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}
   
 % Count depth in font-changes, for error checks  % Count depth in font-changes, for error checks
 \newcount\fontdepth \fontdepth=0  \newcount\fontdepth \fontdepth=0
   
%% Add scribe-like font environments, plus @l for inline lisp (usually sans% Font commands.
%% serif) and @ii for TeX italic 
   
% \smartitalic{ARG} outputs arg in italics, followed by an italic correction% #1 is the font command (\sl or \it), #2 is the text to slant.
% unless the following character is such as not to need one.% If we are in a monospaced environment, however, 1) always use \ttsl,
\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else% and 2) do not add an italic correction.
                    \ptexslash\fi\fi\fi}\def\dosmartslant#1#2{%
\def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx}  \ifusingtt 
\def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx}    {{\ttsl #2}\let\next=\relax}%
     {\def\next{{#1#2}\futurelet\next\smartitaliccorrection}}%
   \next
 }
 \def\smartslanted{\dosmartslant\sl}
 \def\smartitalic{\dosmartslant\it}
   
% like \smartslanted except unconditionally uses \ttsl.% Output an italic correction unless \next (presumed to be the following
 % character) is such as not to need one.
 \def\smartitaliccorrection{%
   \ifx\next,%
   \else\ifx\next-%
   \else\ifx\next.%
   \else\ptexslash
   \fi\fi\fi
   \aftersmartic
 }
 
 % like \smartslanted except unconditionally uses \ttsl, and no ic.
 % @var is set to this for defun arguments.  % @var is set to this for defun arguments.
\def\ttslanted#1{{\ttsl #1}\futurelet\next\smartitalicx}\def\ttslanted#1{{\ttsl #1}}
   
 % @cite is like \smartslanted except unconditionally use \sl.  We never want  % @cite is like \smartslanted except unconditionally use \sl.  We never want
 % ttsl for book titles, do we?  % ttsl for book titles, do we?
\def\cite#1{{\sl #1}\futurelet\next\smartitalicx}\def\cite#1{{\sl #1}\futurelet\next\smartitaliccorrection}
   
   \def\aftersmartic{}
   \def\var#1{%
     \let\saveaftersmartic = \aftersmartic
     \def\aftersmartic{\null\let\aftersmartic=\saveaftersmartic}%
     \smartslanted{#1}%
   }
   
 \let\i=\smartitalic  \let\i=\smartitalic
 \let\slanted=\smartslanted  \let\slanted=\smartslanted
 \def\var#1{{\setupmarkupstyle{var}\smartslanted{#1}}}  
 \let\dfn=\smartslanted  \let\dfn=\smartslanted
 \let\emph=\smartitalic  \let\emph=\smartitalic
   
Line 2621  end Line 2491  end
     \plainfrenchspacing      \plainfrenchspacing
     #1%      #1%
   }%    }%
  \null  \null % reset spacefactor to 1000
 }  }
   
 % We *must* turn on hyphenation at `-' and `_' in @code.  % We *must* turn on hyphenation at `-' and `_' in @code.
Line 2653  end Line 2523  end
   }    }
 }  }
   
   \def\codex #1{\tclose{#1}\endgroup}
   
 \def\realdash{-}  \def\realdash{-}
 \def\codedash{-\discretionary{}{}{}}  \def\codedash{-\discretionary{}{}{}}
 \def\codeunder{%  \def\codeunder{%
Line 2666  end Line 2538  end
              \discretionary{}{}{}}%               \discretionary{}{}{}}%
             {\_}%              {\_}%
 }  }
 \def\codex #1{\tclose{#1}\endgroup}  
   
 % An additional complication: the above will allow breaks after, e.g.,  % An additional complication: the above will allow breaks after, e.g.,
 % each of the four underscores in __typeof__.  This is undesirable in  % each of the four underscores in __typeof__.  This is undesirable in
Line 2686  end Line 2557  end
     \allowcodebreaksfalse      \allowcodebreaksfalse
   \else    \else
     \errhelp = \EMsimple      \errhelp = \EMsimple
    \errmessage{Unknown @allowcodebreaks option `\txiarg'}%    \errmessage{Unknown @allowcodebreaks option `\txiarg', must be true|false}%
   \fi\fi    \fi\fi
 }  }
   
 % @kbd is like @code, except that if the argument is just one @key command,  
 % then @kbd has no effect.  
 \def\kbd#1{{\setupmarkupstyle{kbd}\def\look{#1}\expandafter\kbdfoo\look??\par}}  
   
 % @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),  
 %   `example' (@kbd uses ttsl only inside of @example and friends),  
 %   or `code' (@kbd uses normal tty font always).  
 \parseargdef\kbdinputstyle{%  
   \def\txiarg{#1}%  
   \ifx\txiarg\worddistinct  
     \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%  
   \else\ifx\txiarg\wordexample  
     \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%  
   \else\ifx\txiarg\wordcode  
     \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%  
   \else  
     \errhelp = \EMsimple  
     \errmessage{Unknown @kbdinputstyle option `\txiarg'}%  
   \fi\fi\fi  
 }  
 \def\worddistinct{distinct}  
 \def\wordexample{example}  
 \def\wordcode{code}  
   
 % Default is `distinct'.  
 \kbdinputstyle distinct  
   
 \def\xkey{\key}  
 \def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%  
 \ifx\one\xkey\ifx\threex\three \key{#2}%  
 \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi  
 \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi}  
   
 % For @indicateurl, @env, @command quotes seem unnecessary, so use \code.  
 \let\indicateurl=\code  
 \let\env=\code  
 \let\command=\code  
   
 % @clicksequence{File @click{} Open ...}  
 \def\clicksequence#1{\begingroup #1\endgroup}  
   
 % @clickstyle @arrow   (by default)  
 \parseargdef\clickstyle{\def\click{#1}}  
 \def\click{\arrow}  
   
 % @uref (abbreviation for `urlref') takes an optional (comma-separated)  % @uref (abbreviation for `urlref') takes an optional (comma-separated)
 % second argument specifying the text to display and an optional third  % second argument specifying the text to display and an optional third
 % arg as text to display instead of (rather than in addition to) the url  % arg as text to display instead of (rather than in addition to) the url
% itself.  First (mandatory) arg is the url.  Perhaps eventually put in% itself.  First (mandatory) arg is the url.
% a hypertex \special here.% (This \urefnobreak definition isn't used now, leaving it for a while
%% for comparison.)
\def\uref#1{\douref #1,,,\finish}\def\urefnobreak#1{\dourefnobreak #1,,,\finish}
\def\douref#1,#2,#3,#4\finish{\begingroup\def\dourefnobreak#1,#2,#3,#4\finish{\begingroup
   \unsepspaces    \unsepspaces
   \pdfurl{#1}%    \pdfurl{#1}%
   \setbox0 = \hbox{\ignorespaces #3}%    \setbox0 = \hbox{\ignorespaces #3}%
Line 2763  end Line 2589  end
   \endlink    \endlink
 \endgroup}  \endgroup}
   
   % This \urefbreak definition is the active one.
   \def\urefbreak{\begingroup \urefcatcodes \dourefbreak}
   \let\uref=\urefbreak
   \def\dourefbreak#1{\urefbreakfinish #1,,,\finish}
   \def\urefbreakfinish#1,#2,#3,#4\finish{% doesn't work in @example
     \unsepspaces
     \pdfurl{#1}%
     \setbox0 = \hbox{\ignorespaces #3}%
     \ifdim\wd0 > 0pt
       \unhbox0 % third arg given, show only that
     \else
       \setbox0 = \hbox{\ignorespaces #2}%
       \ifdim\wd0 > 0pt
         \ifpdf
           \unhbox0             % PDF: 2nd arg given, show only it
         \else
           \unhbox0\ (\urefcode{#1})% DVI: 2nd arg given, show both it and url
         \fi
       \else
         \urefcode{#1}% only url given, so show it
       \fi
     \fi
     \endlink
   \endgroup}
   
   % Allow line breaks around only a few characters (only).
   \def\urefcatcodes{%
     \catcode\ampChar=\active   \catcode\dotChar=\active
     \catcode\hashChar=\active  \catcode\questChar=\active
     \catcode\slashChar=\active
   }
   {
     \urefcatcodes
     %
     \global\def\urefcode{\begingroup
       \setupmarkupstyle{code}%
       \urefcatcodes
       \let&\urefcodeamp
       \let.\urefcodedot
       \let#\urefcodehash
       \let?\urefcodequest
       \let/\urefcodeslash
       \codex
     }
     %
     % By default, they are just regular characters.
     \global\def&{\normalamp}
     \global\def.{\normaldot}
     \global\def#{\normalhash}
     \global\def?{\normalquest}
     \global\def/{\normalslash}
   }
   
   % we put a little stretch before and after the breakable chars, to help
   % line breaking of long url's.  The unequal skips make look better in
   % cmtt at least, especially for dots.
   \def\urefprestretch{\urefprebreak \hskip0pt plus.13em }
   \def\urefpoststretch{\urefpostbreak \hskip0pt plus.1em }
   %
   \def\urefcodeamp{\urefprestretch \&\urefpoststretch}
   \def\urefcodedot{\urefprestretch .\urefpoststretch}
   \def\urefcodehash{\urefprestretch \#\urefpoststretch}
   \def\urefcodequest{\urefprestretch ?\urefpoststretch}
   \def\urefcodeslash{\futurelet\next\urefcodeslashfinish}
   {
     \catcode`\/=\active
     \global\def\urefcodeslashfinish{%
       \urefprestretch \slashChar
       % Allow line break only after the final / in a sequence of
       % slashes, to avoid line break between the slashes in http://.
       \ifx\next/\else \urefpoststretch \fi
     }
   }
   
   % One more complication: by default we'll break after the special
   % characters, but some people like to break before the special chars, so
   % allow that.  Also allow no breaking at all, for manual control.
   % 
   \parseargdef\urefbreakstyle{%
     \def\txiarg{#1}%
     \ifx\txiarg\wordnone
       \def\urefprebreak{\nobreak}\def\urefpostbreak{\nobreak}
     \else\ifx\txiarg\wordbefore
       \def\urefprebreak{\allowbreak}\def\urefpostbreak{\nobreak}
     \else\ifx\txiarg\wordafter
       \def\urefprebreak{\nobreak}\def\urefpostbreak{\allowbreak}
     \else
       \errhelp = \EMsimple
       \errmessage{Unknown @urefbreakstyle setting `\txiarg'}%
     \fi\fi\fi
   }
   \def\wordafter{after}
   \def\wordbefore{before}
   \def\wordnone{none}
   
   \urefbreakstyle after
   
 % @url synonym for @uref, since that's how everyone uses it.  % @url synonym for @uref, since that's how everyone uses it.
 %  %
 \let\url=\uref  \let\url=\uref
Line 2784  end Line 2707  end
   \let\email=\uref    \let\email=\uref
 \fi  \fi
   
   % @kbd is like @code, except that if the argument is just one @key command,
   % then @kbd has no effect.
   \def\kbd#1{{\setupmarkupstyle{kbd}\def\look{#1}\expandafter\kbdfoo\look??\par}}
   
   % @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
   %   `example' (@kbd uses ttsl only inside of @example and friends),
   %   or `code' (@kbd uses normal tty font always).
   \parseargdef\kbdinputstyle{%
     \def\txiarg{#1}%
     \ifx\txiarg\worddistinct
       \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
     \else\ifx\txiarg\wordexample
       \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%
     \else\ifx\txiarg\wordcode
       \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
     \else
       \errhelp = \EMsimple
       \errmessage{Unknown @kbdinputstyle setting `\txiarg'}%
     \fi\fi\fi
   }
   \def\worddistinct{distinct}
   \def\wordexample{example}
   \def\wordcode{code}
   
   % Default is `distinct'.
   \kbdinputstyle distinct
   
   \def\xkey{\key}
   \def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
   \ifx\one\xkey\ifx\threex\three \key{#2}%
   \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi
   \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi}
   
   % For @indicateurl, @env, @command quotes seem unnecessary, so use \code.
   \let\indicateurl=\code
   \let\env=\code
   \let\command=\code
   
   % @clicksequence{File @click{} Open ...}
   \def\clicksequence#1{\begingroup #1\endgroup}
   
   % @clickstyle @arrow   (by default)
   \parseargdef\clickstyle{\def\click{#1}}
   \def\click{\arrow}
   
 % Typeset a dimension, e.g., `in' or `pt'.  The only reason for the  % Typeset a dimension, e.g., `in' or `pt'.  The only reason for the
 % argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.  % argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
 %  %
Line 2805  end Line 2773  end
   \ifx\temp\empty \else    \ifx\temp\empty \else
     \space ({\unsepspaces \ignorespaces \temp \unskip})%      \space ({\unsepspaces \ignorespaces \temp \unskip})%
   \fi    \fi
     \null % reset \spacefactor=1000
 }  }
   
 % @abbr for "Comput. J." and the like.  % @abbr for "Comput. J." and the like.
Line 2817  end Line 2786  end
   \ifx\temp\empty \else    \ifx\temp\empty \else
     \space ({\unsepspaces \ignorespaces \temp \unskip})%      \space ({\unsepspaces \ignorespaces \temp \unskip})%
   \fi    \fi
     \null % reset \spacefactor=1000
 }  }
   
   % @asis just yields its argument.  Used with @table, for example.
   %
   \def\asis#1{#1}
   
   % @math outputs its argument in math mode.
   %
   % One complication: _ usually means subscripts, but it could also mean
   % an actual _ character, as in @math{@var{some_variable} + 1}.  So make
   % _ active, and distinguish by seeing if the current family is \slfam,
   % which is what @var uses.
   {
     \catcode`\_ = \active
     \gdef\mathunderscore{%
       \catcode`\_=\active
       \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
     }
   }
   % Another complication: we want \\ (and @\) to output a math (or tt) \.
   % FYI, plain.tex uses \\ as a temporary control sequence (for no
   % particular reason), but this is not advertised and we don't care.
   %
   % The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\.
   \def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}
   %
   \def\math{%
     \tex
     \mathunderscore
     \let\\ = \mathbackslash
     \mathactive
     % make the texinfo accent commands work in math mode
     \let\"=\ddot
     \let\'=\acute
     \let\==\bar
     \let\^=\hat
     \let\`=\grave
     \let\u=\breve
     \let\v=\check
     \let\~=\tilde
     \let\dotaccent=\dot
     $\finishmath
   }
   \def\finishmath#1{#1$\endgroup}  % Close the group opened by \tex.
   
   % Some active characters (such as <) are spaced differently in math.
   % We have to reset their definitions in case the @math was an argument
   % to a command which sets the catcodes (such as @item or @section).
   %
   {
     \catcode`^ = \active
     \catcode`< = \active
     \catcode`> = \active
     \catcode`+ = \active
     \catcode`' = \active
     \gdef\mathactive{%
       \let^ = \ptexhat
       \let< = \ptexless
       \let> = \ptexgtr
       \let+ = \ptexplus
       \let' = \ptexquoteright
     }
   }
   
   
 \message{glyphs,}  \message{glyphs,}
   % and logos.
   
   % @@ prints an @.
   \def\@{\char64 }
   
   % Used to generate quoted braces.  Unless we're in typewriter, use
   % \ecfont because the CM text fonts do not have braces, and we don't
   % want to switch into math.
   \def\mylbrace{{\ifmonospace\else\ecfont\fi \char123}}
   \def\myrbrace{{\ifmonospace\else\ecfont\fi \char125}}
   \let\{=\mylbrace
   \let\}=\myrbrace
   \begingroup
     % Definitions to produce \{ and \} commands for indices,
     % and @{ and @} for the aux/toc files.
     \catcode`\{ = \other \catcode`\} = \other
     \catcode`\[ = 1 \catcode`\] = 2
     \catcode`\! = 0 \catcode`\\ = \other
     !gdef!lbracecmd[\{]%
     !gdef!rbracecmd[\}]%
     !gdef!lbraceatcmd[@{]%
     !gdef!rbraceatcmd[@}]%
   !endgroup
   
   % @comma{} to avoid , parsing problems.
   \let\comma = ,
   
   % Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
   % Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
   \let\, = \ptexc
   \let\dotaccent = \ptexdot
   \def\ringaccent#1{{\accent23 #1}}
   \let\tieaccent = \ptext
   \let\ubaraccent = \ptexb
   \let\udotaccent = \d
   
   % Other special characters: @questiondown @exclamdown @ordf @ordm
   % Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
   \def\questiondown{?`}
   \def\exclamdown{!`}
   \def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}}
   \def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}}
   
   % Dotless i and dotless j, used for accents.
   \def\imacro{i}
   \def\jmacro{j}
   \def\dotless#1{%
     \def\temp{#1}%
     \ifx\temp\imacro \ifmmode\imath \else\ptexi \fi
     \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi
     \else \errmessage{@dotless can be used only with i or j}%
     \fi\fi
   }
   
   % The \TeX{} logo, as in plain, but resetting the spacing so that a
   % period following counts as ending a sentence.  (Idea found in latex.)
   %
   \edef\TeX{\TeX \spacefactor=1000 }
   
   % @LaTeX{} logo.  Not quite the same results as the definition in
   % latex.ltx, since we use a different font for the raised A; it's most
   % convenient for us to use an explicitly smaller font, rather than using
   % the \scriptstyle font (since we don't reset \scriptstyle and
   % \scriptscriptstyle).
   %
   \def\LaTeX{%
     L\kern-.36em
     {\setbox0=\hbox{T}%
      \vbox to \ht0{\hbox{%
        \ifx\textnominalsize\xwordpt
          % for 10pt running text, \lllsize (8pt) is too small for the A in LaTeX.
          % Revert to plain's \scriptsize, which is 7pt.
          \count255=\the\fam $\fam\count255 \scriptstyle A$%
        \else
          % For 11pt, we can use our lllsize.
          \selectfonts\lllsize A%
        \fi
        }%
        \vss
     }}%
     \kern-.15em
     \TeX
   }
   
   % Some math mode symbols.
   \def\bullet{$\ptexbullet$}
   \def\geq{\ifmmode \ge\else $\ge$\fi}
   \def\leq{\ifmmode \le\else $\le$\fi}
   \def\minus{\ifmmode -\else $-$\fi}
   
   % @dots{} outputs an ellipsis using the current font.
   % We do .5em per period so that it has the same spacing in the cm
   % typewriter fonts as three actual period characters; on the other hand,
   % in other typewriter fonts three periods are wider than 1.5em.  So do
   % whichever is larger.
   %
   \def\dots{%
     \leavevmode
     \setbox0=\hbox{...}% get width of three periods
     \ifdim\wd0 > 1.5em
       \dimen0 = \wd0
     \else
       \dimen0 = 1.5em
     \fi
     \hbox to \dimen0{%
       \hskip 0pt plus.25fil
       .\hskip 0pt plus1fil
       .\hskip 0pt plus1fil
       .\hskip 0pt plus.5fil
     }%
   }
   
   % @enddots{} is an end-of-sentence ellipsis.
   %
   \def\enddots{%
     \dots
     \spacefactor=\endofsentencespacefactor
   }
   
 % @point{}, @result{}, @expansion{}, @print{}, @equiv{}.  % @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
 %  %
 % Since these characters are used in examples, they should be an even number of  % Since these characters are used in examples, they should be an even number of
Line 2842  end Line 2992  end
 {\tentt \global\dimen0 = 3em}% Width of the box.  {\tentt \global\dimen0 = 3em}% Width of the box.
 \dimen2 = .55pt % Thickness of rules  \dimen2 = .55pt % Thickness of rules
 % The text. (`r' is open on the right, `e' somewhat less so on the left.)  % The text. (`r' is open on the right, `e' somewhat less so on the left.)
\setbox0 = \hbox{\kern-.75pt \reducedsf error\kern-1.5pt}\setbox0 = \hbox{\kern-.75pt \reducedsf \putworderror\kern-1.5pt}
 %  %
 \setbox\errorbox=\hbox to \dimen0{\hfil  \setbox\errorbox=\hbox to \dimen0{\hfil
    \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.     \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
Line 2991  end Line 3141  end
 %  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
 % so we'll define it if necessary.  % so we'll define it if necessary.
 %  %
\ifx\Orb\undefined\ifx\Orb\thisisundefined
 \def\Orb{\mathhexbox20D}  \def\Orb{\mathhexbox20D}
 \fi  \fi
   
Line 3019  end Line 3169  end
 \newif\ifsetshortcontentsaftertitlepage  \newif\ifsetshortcontentsaftertitlepage
  \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue   \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue
   
\parseargdef\shorttitlepage{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%\parseargdef\shorttitlepage{%
        \endgroup\page\hbox{}\page}  \begingroup \hbox{}\vskip 1.5in \chaprm \centerline{#1}%
   \endgroup\page\hbox{}\page}
   
 \envdef\titlepage{%  \envdef\titlepage{%
   % Open one extra group, as we want to close it in the middle of \Etitlepage.    % Open one extra group, as we want to close it in the middle of \Etitlepage.
Line 3080  end Line 3231  end
   \finishedtitlepagetrue    \finishedtitlepagetrue
 }  }
   
%%% Macros to be used within @titlepage:% Macros to be used within @titlepage:
   
 \let\subtitlerm=\tenrm  \let\subtitlerm=\tenrm
 \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}  \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}
Line 3113  end Line 3264  end
 }  }
   
   
%%% Set up page headings and footings.% Set up page headings and footings.
   
 \let\thispage=\folio  \let\thispage=\folio
   
Line 3207  end Line 3358  end
   
 \def\headings #1 {\csname HEADINGS#1\endcsname}  \def\headings #1 {\csname HEADINGS#1\endcsname}
   
\def\HEADINGSoff{%\def\headingsoff{% non-global headings elimination
\global\evenheadline={\hfil} \global\evenfootline={\hfil}  \evenheadline={\hfil}\evenfootline={\hfil}%
\global\oddheadline={\hfil} \global\oddfootline={\hfil}}   \oddheadline={\hfil}\oddfootline={\hfil}%
\HEADINGSoff}
 
 \def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting
 \HEADINGSoff  % it's the default
 
 % When we turn headings on, set the page number to 1.  % When we turn headings on, set the page number to 1.
 % 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
Line 3261  end Line 3416  end
 % This produces Day Month Year style of output.  % This produces Day Month Year style of output.
 % Only define if not already defined, in case a txi-??.tex file has set  % Only define if not already defined, in case a txi-??.tex file has set
 % up a different format (e.g., txi-cs.tex does this).  % up a different format (e.g., txi-cs.tex does this).
\ifx\today\undefined\ifx\today\thisisundefined
 \def\today{%  \def\today{%
   \number\day\space    \number\day\space
   \ifcase\month    \ifcase\month
Line 3322  end Line 3477  end
     \begingroup      \begingroup
       \advance\leftskip by-\tableindent        \advance\leftskip by-\tableindent
       \advance\hsize by\tableindent        \advance\hsize by\tableindent
      \advance\rightskip by0pt plus1fil      \advance\rightskip by0pt plus1fil\relax
       \leavevmode\unhbox0\par        \leavevmode\unhbox0\par
     \endgroup      \endgroup
     %      %
Line 3808  end Line 3963  end
 \setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip  \setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
 \global\advance\multitablelinespace by-\ht0  \global\advance\multitablelinespace by-\ht0
 \fi  \fi
%% Test to see if parskip is larger than space between lines of% Test to see if parskip is larger than space between lines of
%% table. If not, do nothing.table. If not, do nothing.
%%        If so, set to same dimension as multitablelinespace.%        If so, set to same dimension as multitablelinespace.
 \ifdim\multitableparskip>\multitablelinespace  \ifdim\multitableparskip>\multitablelinespace
 \global\multitableparskip=\multitablelinespace  \global\multitableparskip=\multitablelinespace
\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller\global\advance\multitableparskip-7pt % to keep parskip somewhat smaller
                                      %% than skip between lines in the table.                                      % than skip between lines in the table.
 \fi%  \fi%
 \ifdim\multitableparskip=0pt  \ifdim\multitableparskip=0pt
 \global\multitableparskip=\multitablelinespace  \global\multitableparskip=\multitablelinespace
\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller\global\advance\multitableparskip-7pt % to keep parskip somewhat smaller
                                      %% than skip between lines in the table.                                      % than skip between lines in the table.
 \fi}  \fi}
   
   
Line 4134  end Line 4289  end
   \def\@{@}% change to @@ when we switch to @ as escape char in index files.    \def\@{@}% change to @@ when we switch to @ as escape char in index files.
   \def\ {\realbackslash\space }%    \def\ {\realbackslash\space }%
   %    %
  % Need these in case \tex is in effect and \{ is a \delimiter again.  % Need these unexpandable (because we define \tt as a dummy)
  % But can't use \lbracecmd and \rbracecmd because texindex assumes  % definitions when @{ or @} appear in index entry text.  Also, more
  % braces and backslashes are used only as delimiters.  % complicated, when \tex is in effect and \{ is a \delimiter again.
  \let\{ = \mylbrace  % We can't use \lbracecmd and \rbracecmd because texindex assumes
  \let\} = \myrbrace  % braces and backslashes are used only as delimiters.  Perhaps we
   % should define @lbrace and @rbrace commands a la @comma.
   \def\{{{\tt\char123}}%
   \def\}{{\tt\char125}}%
   %    %
   % I don't entirely understand this, but when an index entry is    % I don't entirely understand this, but when an index entry is
   % generated from a macro call, the \endinput which \scanmacro inserts    % generated from a macro call, the \endinput which \scanmacro inserts
Line 4191  end Line 4349  end
 \def\commondummies{%  \def\commondummies{%
   %    %
   % \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
   % control characters, but is needed to separate the control word    % control characters, but is needed to separate the control word
   % from whatever follows.    % from whatever follows.
Line 4210  end Line 4368  end
   \commondummiesnofonts    \commondummiesnofonts
   %    %
   \definedummyletter\_%    \definedummyletter\_%
     \definedummyletter\-%
   %    %
   % Non-English letters.    % Non-English letters.
   \definedummyword\AA    \definedummyword\AA
Line 4246  end Line 4405  end
   \definedummyword\TeX    \definedummyword\TeX
   %    %
   % Assorted special characters.    % Assorted special characters.
     \definedummyword\arrow
   \definedummyword\bullet    \definedummyword\bullet
   \definedummyword\comma    \definedummyword\comma
   \definedummyword\copyright    \definedummyword\copyright
   \definedummyword\registeredsymbol    \definedummyword\registeredsymbol
   \definedummyword\dots    \definedummyword\dots
   \definedummyword\enddots    \definedummyword\enddots
     \definedummyword\entrybreak
   \definedummyword\equiv    \definedummyword\equiv
   \definedummyword\error    \definedummyword\error
   \definedummyword\euro    \definedummyword\euro
     \definedummyword\expansion
     \definedummyword\geq
   \definedummyword\guillemetleft    \definedummyword\guillemetleft
   \definedummyword\guillemetright    \definedummyword\guillemetright
   \definedummyword\guilsinglleft    \definedummyword\guilsinglleft
   \definedummyword\guilsinglright    \definedummyword\guilsinglright
  \definedummyword\expansion  \definedummyword\leq
   \definedummyword\minus    \definedummyword\minus
   \definedummyword\ogonek    \definedummyword\ogonek
   \definedummyword\pounds    \definedummyword\pounds
Line 4316  end Line 4479  end
   \definedummyword\b    \definedummyword\b
   \definedummyword\i    \definedummyword\i
   \definedummyword\r    \definedummyword\r
     \definedummyword\sansserif
   \definedummyword\sc    \definedummyword\sc
     \definedummyword\slanted
   \definedummyword\t    \definedummyword\t
   %    %
   % Commands that take arguments.    % Commands that take arguments.
Line 4325  end Line 4490  end
   \definedummyword\code    \definedummyword\code
   \definedummyword\command    \definedummyword\command
   \definedummyword\dfn    \definedummyword\dfn
     \definedummyword\dmn
   \definedummyword\email    \definedummyword\email
   \definedummyword\emph    \definedummyword\emph
   \definedummyword\env    \definedummyword\env
   \definedummyword\file    \definedummyword\file
     \definedummyword\indicateurl
   \definedummyword\kbd    \definedummyword\kbd
   \definedummyword\key    \definedummyword\key
   \definedummyword\math    \definedummyword\math
Line 4356  end Line 4523  end
   \def\definedummyaccent##1{\let##1\asis}%    \def\definedummyaccent##1{\let##1\asis}%
   % We can just ignore other control letters.    % We can just ignore other control letters.
   \def\definedummyletter##1{\let##1\empty}%    \def\definedummyletter##1{\let##1\empty}%
  % Hopefully, all control words can become @asis.  % All control words become @asis by default; overrides below.
   \let\definedummyword\definedummyaccent    \let\definedummyword\definedummyaccent
   %    %
   \commondummiesnofonts    \commondummiesnofonts
Line 4368  end Line 4535  end
   %    %
   \def\ { }%    \def\ { }%
   \def\@{@}%    \def\@{@}%
   % how to handle braces?  
   \def\_{\normalunderscore}%    \def\_{\normalunderscore}%
     \def\-{}% @- shouldn't affect sorting
   %    %
     % Unfortunately, texindex is not prepared to handle braces in the
     % content at all.  So for index sorting, we map @{ and @} to strings
     % starting with |, since that ASCII character is between ASCII { and }.
     \def\{{|a}%
     \def\}{|b}%
     %
   % Non-English letters.    % Non-English letters.
   \def\AA{AA}%    \def\AA{AA}%
   \def\AE{AE}%    \def\AE{AE}%
Line 4397  end Line 4570  end
   %    %
   % Assorted special characters.    % Assorted special characters.
   % (The following {} will end up in the sort string, but that's ok.)    % (The following {} will end up in the sort string, but that's ok.)
     \def\arrow{->}%
   \def\bullet{bullet}%    \def\bullet{bullet}%
   \def\comma{,}%    \def\comma{,}%
   \def\copyright{copyright}%    \def\copyright{copyright}%
Line 4406  end Line 4580  end
   \def\error{error}%    \def\error{error}%
   \def\euro{euro}%    \def\euro{euro}%
   \def\expansion{==>}%    \def\expansion{==>}%
     \def\geq{>=}%
   \def\guillemetleft{<<}%    \def\guillemetleft{<<}%
   \def\guillemetright{>>}%    \def\guillemetright{>>}%
   \def\guilsinglleft{<}%    \def\guilsinglleft{<}%
   \def\guilsinglright{>}%    \def\guilsinglright{>}%
     \def\leq{<=}%
   \def\minus{-}%    \def\minus{-}%
   \def\point{.}%    \def\point{.}%
   \def\pounds{pounds}%    \def\pounds{pounds}%
Line 4424  end Line 4600  end
   \def\result{=>}%    \def\result{=>}%
   \def\textdegree{o}%    \def\textdegree{o}%
   %    %
     \expandafter\ifx\csname SETtxiindexlquoteignore\endcsname\relax
     \else \indexlquoteignore \fi
     %
   % 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    % makeinfo does not expand macros in the argument to @deffn, which ends up
Line 4437  end Line 4616  end
   \macrolist    \macrolist
 }  }
   
   % Undocumented (for FSFS 2nd ed.): @set txiindexlquoteignore makes us
   % ignore left quotes in the sort term.
   {\catcode`\`=\active
    \gdef\indexlquoteignore{\let`=\empty}}
   
 \let\indexbackslash=0  %overridden during \printindex.  \let\indexbackslash=0  %overridden during \printindex.
 \let\SETmarginindex=\relax % put index entries in margin (undocumented)?  \let\SETmarginindex=\relax % put index entries in margin (undocumented)?
   
Line 4694  end Line 4878  end
 % But this freezes the catcodes in the argument, and can cause problems to  % But this freezes the catcodes in the argument, and can cause problems to
 % @code, which sets - active.  This problem was fixed by a kludge---  % @code, which sets - active.  This problem was fixed by a kludge---
 % ``-'' was active throughout whole index, but this isn't really right.  % ``-'' was active throughout whole index, but this isn't really right.
 %  
 % The right solution is to prevent \entry from swallowing the whole text.  % The right solution is to prevent \entry from swallowing the whole text.
 %                                 --kasal, 21nov03  %                                 --kasal, 21nov03
 \def\entry{%  \def\entry{%
Line 4731  end Line 4914  end
     % columns.      % columns.
     \vskip 0pt plus1pt      \vskip 0pt plus1pt
     %      %
       % When reading the text of entry, convert explicit line breaks
       % from @* into spaces.  The user might give these in long section
       % titles, for instance.
       \def\*{\unskip\space\ignorespaces}%
       \def\entrybreak{\hfil\break}%
       %
     % Swallow the left brace of the text (first parameter):      % Swallow the left brace of the text (first parameter):
     \afterassignment\doentry      \afterassignment\doentry
     \let\temp =      \let\temp =
 }  }
   \def\entrybreak{\unskip\space\ignorespaces}%
 \def\doentry{%  \def\doentry{%
     \bgroup % Instead of the swallowed brace.      \bgroup % Instead of the swallowed brace.
       \noindent        \noindent
Line 4967  end Line 5157  end
 \message{sectioning,}  \message{sectioning,}
 % Chapters, sections, etc.  % Chapters, sections, etc.
   
% \unnumberedno is an oxymoron, of course.  But we count the unnumbered% Let's start with @part.
 \outer\parseargdef\part{\partzzz{#1}}
 \def\partzzz#1{%
   \chapoddpage
   \null
   \vskip.3\vsize  % move it down on the page a bit
   \begingroup
     \noindent \titlefonts\rmisbold #1\par % the text
     \let\lastnode=\empty      % no node to associate with
     \writetocentry{part}{#1}{}% but put it in the toc
     \headingsoff              % no headline or footline on the part page
     \chapoddpage
   \endgroup
 }
 
 % \unnumberedno is an oxymoron.  But we count the unnumbered
 % sections so that we can refer to them unambiguously in the pdf  % sections so that we can refer to them unambiguously in the pdf
 % outlines by their "section number".  We avoid collisions with chapter  % outlines by their "section number".  We avoid collisions with chapter
 % numbers by starting them at 10000.  (If a document ever has 10000  % numbers by starting them at 10000.  (If a document ever has 10000
Line 5046  end Line 5251  end
 \chardef\maxseclevel = 3  \chardef\maxseclevel = 3
 %  %
 % A numbered section within an unnumbered changes to unnumbered too.  % A numbered section within an unnumbered changes to unnumbered too.
% To achive this, remember the "biggest" unnum. sec. we are currently in:% To achieve this, remember the "biggest" unnum. sec. we are currently in:
\chardef\unmlevel = \maxseclevel\chardef\unnlevel = \maxseclevel
 %  %
 % Trace whether the current chapter is an appendix or not:  % Trace whether the current chapter is an appendix or not:
 % \chapheadtype is "N" or "A", unnumbered chapters are ignored.  % \chapheadtype is "N" or "A", unnumbered chapters are ignored.
Line 5072  end Line 5277  end
   % The heading type:    % The heading type:
   \def\headtype{#1}%    \def\headtype{#1}%
   \if \headtype U%    \if \headtype U%
    \ifnum \absseclevel < \unmlevel    \ifnum \absseclevel < \unnlevel
      \chardef\unmlevel = \absseclevel      \chardef\unnlevel = \absseclevel
     \fi      \fi
   \else    \else
     % Check for appendix sections:      % Check for appendix sections:
Line 5085  end Line 5290  end
       \fi\fi        \fi\fi
     \fi      \fi
     % Check for numbered within unnumbered:      % Check for numbered within unnumbered:
    \ifnum \absseclevel > \unmlevel    \ifnum \absseclevel > \unnlevel
       \def\headtype{U}%        \def\headtype{U}%
     \else      \else
      \chardef\unmlevel = 3      \chardef\unnlevel = 3
     \fi      \fi
   \fi    \fi
   % Now print the heading:    % Now print the heading:
Line 5174  end Line 5379  end
   \global\let\subsubsection = \appendixsubsubsec    \global\let\subsubsection = \appendixsubsubsec
 }  }
   
\outer\parseargdef\unnumbered{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz% normally unnmhead0 calls unnumberedzzz:
 \outer\parseargdef\unnumbered{\unnmhead0{#1}}
 \def\unnumberedzzz#1{%  \def\unnumberedzzz#1{%
   \global\secno=0 \global\subsecno=0 \global\subsubsecno=0    \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
     \global\advance\unnumberedno by 1      \global\advance\unnumberedno by 1
Line 5218  end Line 5424  end
 \let\top\unnumbered  \let\top\unnumbered
   
 % Sections.  % Sections.
   % 
 \outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz  \outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz
 \def\seczzz#1{%  \def\seczzz#1{%
   \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1    \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
   \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}%    \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}%
 }  }
   
\outer\parseargdef\appendixsection{\apphead1{#1}} % normally calls appendixsectionzzz% normally calls appendixsectionzzz:
 \outer\parseargdef\appendixsection{\apphead1{#1}}
 \def\appendixsectionzzz#1{%  \def\appendixsectionzzz#1{%
   \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1    \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
   \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}%    \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}%
 }  }
 \let\appendixsec\appendixsection  \let\appendixsec\appendixsection
   
\outer\parseargdef\unnumberedsec{\unnmhead1{#1}} % normally calls unnumberedseczzz% normally calls unnumberedseczzz:
 \outer\parseargdef\unnumberedsec{\unnmhead1{#1}}
 \def\unnumberedseczzz#1{%  \def\unnumberedseczzz#1{%
   \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1    \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
   \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}%    \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}%
 }  }
   
 % Subsections.  % Subsections.
\outer\parseargdef\numberedsubsec{\numhead2{#1}} % normally calls numberedsubseczzz
 % normally calls numberedsubseczzz:
 \outer\parseargdef\numberedsubsec{\numhead2{#1}}
 \def\numberedsubseczzz#1{%  \def\numberedsubseczzz#1{%
   \global\subsubsecno=0  \global\advance\subsecno by 1    \global\subsubsecno=0  \global\advance\subsecno by 1
   \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}%    \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}%
 }  }
   
\outer\parseargdef\appendixsubsec{\apphead2{#1}} % normally calls appendixsubseczzz% normally calls appendixsubseczzz:
 \outer\parseargdef\appendixsubsec{\apphead2{#1}}
 \def\appendixsubseczzz#1{%  \def\appendixsubseczzz#1{%
   \global\subsubsecno=0  \global\advance\subsecno by 1    \global\subsubsecno=0  \global\advance\subsecno by 1
   \sectionheading{#1}{subsec}{Yappendix}%    \sectionheading{#1}{subsec}{Yappendix}%
                  {\appendixletter.\the\secno.\the\subsecno}%                   {\appendixletter.\the\secno.\the\subsecno}%
 }  }
   
\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} %normally calls unnumberedsubseczzz% normally calls unnumberedsubseczzz:
 \outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}}
 \def\unnumberedsubseczzz#1{%  \def\unnumberedsubseczzz#1{%
   \global\subsubsecno=0  \global\advance\subsecno by 1    \global\subsubsecno=0  \global\advance\subsecno by 1
   \sectionheading{#1}{subsec}{Ynothing}%    \sectionheading{#1}{subsec}{Ynothing}%
Line 5259  end Line 5472  end
 }  }
   
 % Subsubsections.  % Subsubsections.
\outer\parseargdef\numberedsubsubsec{\numhead3{#1}} % normally numberedsubsubseczzz
 % normally numberedsubsubseczzz:
 \outer\parseargdef\numberedsubsubsec{\numhead3{#1}}
 \def\numberedsubsubseczzz#1{%  \def\numberedsubsubseczzz#1{%
   \global\advance\subsubsecno by 1    \global\advance\subsubsecno by 1
   \sectionheading{#1}{subsubsec}{Ynumbered}%    \sectionheading{#1}{subsubsec}{Ynumbered}%
                  {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}%                   {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}%
 }  }
   
\outer\parseargdef\appendixsubsubsec{\apphead3{#1}} % normally appendixsubsubseczzz% normally appendixsubsubseczzz:
 \outer\parseargdef\appendixsubsubsec{\apphead3{#1}}
 \def\appendixsubsubseczzz#1{%  \def\appendixsubsubseczzz#1{%
   \global\advance\subsubsecno by 1    \global\advance\subsubsecno by 1
   \sectionheading{#1}{subsubsec}{Yappendix}%    \sectionheading{#1}{subsubsec}{Yappendix}%
                  {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}%                   {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}%
 }  }
   
\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} %normally unnumberedsubsubseczzz% normally unnumberedsubsubseczzz:
 \outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}}
 \def\unnumberedsubsubseczzz#1{%  \def\unnumberedsubsubseczzz#1{%
   \global\advance\subsubsecno by 1    \global\advance\subsubsecno by 1
   \sectionheading{#1}{subsubsec}{Ynothing}%    \sectionheading{#1}{subsubsec}{Ynothing}%
Line 5323  end Line 5540  end
 % (including whitespace, linebreaking, etc. around it),  % (including whitespace, linebreaking, etc. around it),
 % given all the information in convenient, parsed form.  % given all the information in convenient, parsed form.
   
%%% Args are the skip and penalty (usually negative)% Args are the skip and penalty (usually negative)
 \def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}  \def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
   
 %%% Define plain chapter starts, and page on/off switching for it  
 % Parameter controlling skip before chapter headings (if needed)  % Parameter controlling skip before chapter headings (if needed)
   
 \newskip\chapheadingskip  \newskip\chapheadingskip
   
   % Define plain chapter starts, and page on/off switching for it.
 \def\chapbreak{\dobreak \chapheadingskip {-4000}}  \def\chapbreak{\dobreak \chapheadingskip {-4000}}
 \def\chappager{\par\vfill\supereject}  \def\chappager{\par\vfill\supereject}
 % Because \domark is called before \chapoddpage, the filler page will  % Because \domark is called before \chapoddpage, the filler page will
Line 5340  end Line 5556  end
   \chappager    \chappager
   \ifodd\pageno \else    \ifodd\pageno \else
     \begingroup      \begingroup
      \evenheadline={\hfil}\evenfootline={\hfil}%      \headingsoff
      \oddheadline={\hfil}\oddfootline={\hfil}%      \null
      \hbox to 0pt{}% 
       \chappager        \chappager
     \endgroup      \endgroup
   \fi    \fi
Line 5534  end Line 5749  end
 %  %
 \def\sectionheading#1#2#3#4{%  \def\sectionheading#1#2#3#4{%
   {%    {%
       \checkenv{}% should not be in an environment.
       %
     % Switch to the right set of fonts.      % Switch to the right set of fonts.
     \csname #2fonts\endcsname \rmisbold      \csname #2fonts\endcsname \rmisbold
     %      %
Line 5651  end Line 5868  end
   % This is purely so the last item on the list is a known \penalty >    % This is purely so the last item on the list is a known \penalty >
   % 10000.  This is so \startdefun can avoid allowing breakpoints after    % 10000.  This is so \startdefun can avoid allowing breakpoints after
   % section headings.  Otherwise, it would insert a valid breakpoint between:    % section headings.  Otherwise, it would insert a valid breakpoint between:
   %  
   %   @section sec-whatever    %   @section sec-whatever
   %   @deffn def-whatever    %   @deffn def-whatever
   \penalty 10001    \penalty 10001
Line 5785  end Line 6001  end
 \def\summarycontents{%  \def\summarycontents{%
   \startcontents{\putwordShortTOC}%    \startcontents{\putwordShortTOC}%
     %      %
       \let\partentry = \shortpartentry
     \let\numchapentry = \shortchapentry      \let\numchapentry = \shortchapentry
     \let\appentry = \shortchapentry      \let\appentry = \shortchapentry
     \let\unnchapentry = \shortunnchapentry      \let\unnchapentry = \shortunnchapentry
Line 5840  end Line 6057  end
 % The last argument is the page number.  % The last argument is the page number.
 % The arguments in between are the chapter number, section number, ...  % The arguments in between are the chapter number, section number, ...
   
   % 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.
   % Also ignore the page number, which is conventionally not printed.
   \def\numeralbox{\setbox0=\hbox{8}\hbox to \wd0{\hfil}}
   \def\partentry#1#2#3#4{\dochapentry{\numeralbox\labelspace#1}{}}
   %
   % Parts, in the short toc.
   \def\shortpartentry#1#2#3#4{%
     \penalty-300
     \vskip.5\baselineskip plus.15\baselineskip minus.1\baselineskip
     \shortchapentry{{\bf #1}}{\numeralbox}{}{}%
   }
   
 % 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{\dochapentry{#2\labelspace#1}{#4}}
 %  %
Line 5929  end Line 6159  end
 \message{environments,}  \message{environments,}
 % @foo ... @end foo.  % @foo ... @end foo.
   
% @tex ... @end tex    escapes into raw Tex temporarily.% @tex ... @end tex    escapes into raw TeX temporarily.
 % One exception: @ is still an escape character, so that @end tex works.  % One exception: @ is still an escape character, so that @end tex works.
% But \@ or @@ will get a plain tex @ character.% But \@ or @@ will get a plain @ character.
   
 \envdef\tex{%  \envdef\tex{%
   \setupmarkupstyle{tex}%    \setupmarkupstyle{tex}%
Line 5948  end Line 6178  end
   \catcode`\'=\other    \catcode`\'=\other
   \escapechar=`\\    \escapechar=`\\
   %    %
     % ' is active in math mode (mathcode"8000).  So reset it, and all our
     % other math active characters (just in case), to plain's definitions.
     \mathactive
     %
   \let\b=\ptexb    \let\b=\ptexb
   \let\bullet=\ptexbullet    \let\bullet=\ptexbullet
   \let\c=\ptexc    \let\c=\ptexc
Line 6051  end Line 6285  end
   \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip    \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
   % Flag to tell @lisp, etc., not to narrow margin.    % Flag to tell @lisp, etc., not to narrow margin.
   \let\nonarrowing = t%    \let\nonarrowing = t%
     %
     % If this cartouche directly follows a sectioning command, we need the
     % \parskip glue (backspaced over by default) or the cartouche can
     % collide with the section heading.
     \ifnum\lastpenalty>10000 \vskip\parskip \fi
     %
   \vbox\bgroup    \vbox\bgroup
       \baselineskip=0pt\parskip=0pt\lineskip=0pt        \baselineskip=0pt\parskip=0pt\lineskip=0pt
       \carttop        \carttop
Line 6064  end Line 6304  end
               \lineskip=\normlskip                \lineskip=\normlskip
               \parskip=\normpskip                \parskip=\normpskip
               \vskip -\parskip                \vskip -\parskip
              \comment % For explanation, see the end of \def\group.              \comment % For explanation, see the end of def\group.
 }  }
 \def\Ecartouche{%  \def\Ecartouche{%
               \ifhmode\par\fi                \ifhmode\par\fi
Line 6150  end Line 6390  end
 }  }
   
 % We often define two environments, @foo and @smallfoo.  % We often define two environments, @foo and @smallfoo.
% Let's do it by one command:% Let's do it in one command.  #1 is the env name, #2 the definition.
\def\makedispenv #1#2{\def\makedispenvdef#1#2{%
  \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}  \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}%
  \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}  \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}%
   \expandafter\let\csname E#1\endcsname \afterenvbreak    \expandafter\let\csname E#1\endcsname \afterenvbreak
   \expandafter\let\csname Esmall#1\endcsname \afterenvbreak    \expandafter\let\csname Esmall#1\endcsname \afterenvbreak
 }  }
   
% Define two synonyms:% Define two environment synonyms (#1 and #2) for an environment.
\def\maketwodispenvs #1#2#3{\def\maketwodispenvdef#1#2#3{%
  \makedispenv{#1}{#3}  \makedispenvdef{#1}{#3}%
  \makedispenv{#2}{#3}  \makedispenvdef{#2}{#3}%
 }  }
   
 % @lisp: indented, narrowed, typewriter font; @example: same as @lisp.  
 %  %
   % @lisp: indented, narrowed, typewriter font;
   % @example: same as @lisp.
   %
 % @smallexample and @smalllisp: use smaller fonts.  % @smallexample and @smalllisp: use smaller fonts.
 % Originally contributed by Pavel@xerox.  % Originally contributed by Pavel@xerox.
 %  %
\maketwodispenvs {lisp}{example}{%\maketwodispenvdef{lisp}{example}{%
   \nonfillstart    \nonfillstart
   \tt\setupmarkupstyle{example}%    \tt\setupmarkupstyle{example}%
   \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.    \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
  \gobble       % eat return  \gobble % eat return
 }  }
 % @display/@smalldisplay: same as @lisp except keep current font.  % @display/@smalldisplay: same as @lisp except keep current font.
 %  %
\makedispenv {display}{%\makedispenvdef{display}{%
   \nonfillstart    \nonfillstart
   \gobble    \gobble
 }  }
   
 % @format/@smallformat: same as @display except don't narrow margins.  % @format/@smallformat: same as @display except don't narrow margins.
 %  %
\makedispenv{format}{%\makedispenvdef{format}{%
   \let\nonarrowing = t%    \let\nonarrowing = t%
   \nonfillstart    \nonfillstart
   \gobble    \gobble
Line 6203  end Line 6444  end
 \envdef\flushright{%  \envdef\flushright{%
   \let\nonarrowing = t%    \let\nonarrowing = t%
   \nonfillstart    \nonfillstart
  \advance\leftskip by 0pt plus 1fill  \advance\leftskip by 0pt plus 1fill\relax
   \gobble    \gobble
 }  }
 \let\Eflushright = \afterenvbreak  \let\Eflushright = \afterenvbreak
Line 6238  end Line 6479  end
 % we're doing normal filling.  So, when using \aboveenvbreak and  % we're doing normal filling.  So, when using \aboveenvbreak and
 % \afterenvbreak, temporarily make \parskip 0.  % \afterenvbreak, temporarily make \parskip 0.
 %  %
   \makedispenvdef{quotation}{\quotationstart}
   %
 \def\quotationstart{%  \def\quotationstart{%
   {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip    {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
   \parindent=0pt    \parindent=0pt
Line 6253  end Line 6496  end
   \parsearg\quotationlabel    \parsearg\quotationlabel
 }  }
   
 \envdef\quotation{%  
   \setnormaldispenv  
   \quotationstart  
 }  
   
 \envdef\smallquotation{%  
   \setsmalldispenv  
   \quotationstart  
 }  
 \let\Esmallquotation = \Equotation  
   
 % We have retained a nonzero parskip for the environment, since we're  % We have retained a nonzero parskip for the environment, since we're
 % doing normal filling.  % doing normal filling.
 %  %
 \def\Equotation{%  \def\Equotation{%
   \par    \par
  \ifx\quotationauthor\undefined\else  \ifx\quotationauthor\thisisundefined\else
     % indent a bit.      % indent a bit.
     \leftline{\kern 2\leftskip \sl ---\quotationauthor}%      \leftline{\kern 2\leftskip \sl ---\quotationauthor}%
   \fi    \fi
   {\parskip=0pt \afterenvbreak}%    {\parskip=0pt \afterenvbreak}%
 }  }
   \def\Esmallquotation{\Equotation}
   
 % If we're given an argument, typeset it in bold with a colon after.  % If we're given an argument, typeset it in bold with a colon after.
 \def\quotationlabel#1{%  \def\quotationlabel#1{%
Line 6331  end Line 6564  end
   
 % Setup for the @verbatim environment  % Setup for the @verbatim environment
 %  %
% Real tab expansion% Real tab expansion.
 \newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount  \newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount
 %  %
\def\starttabbox{\setbox0=\hbox\bgroup}% We typeset each line of the verbatim in an \hbox, so we can handle
 % tabs.  The \global is in case the verbatim line starts with an accent,
 % or some other command that starts with a begin-group.  Otherwise, the
 % entire \verbbox would disappear at the corresponding end-group, before
 % it is typeset.  Meanwhile, we can't have nested verbatim commands
 % (can we?), so the \global won't be overwriting itself.
 \newbox\verbbox
 \def\starttabbox{\global\setbox\verbbox=\hbox\bgroup}
 %  %
 \begingroup  \begingroup
   \catcode`\^^I=\active    \catcode`\^^I=\active
   \gdef\tabexpand{%    \gdef\tabexpand{%
     \catcode`\^^I=\active      \catcode`\^^I=\active
     \def^^I{\leavevmode\egroup      \def^^I{\leavevmode\egroup
      \dimen0=\wd0 % the width so far, or since the previous tab      \dimen\verbbox=\wd\verbbox % the width so far, or since the previous tab
      \divide\dimen0 by\tabw      \divide\dimen\verbbox by\tabw
      \multiply\dimen0 by\tabw % compute previous multiple of \tabw      \multiply\dimen\verbbox by\tabw % compute previous multiple of \tabw
      \advance\dimen0 by\tabw  % advance to next multiple of \tabw      \advance\dimen\verbbox by\tabw  % advance to next multiple of \tabw
      \wd0=\dimen0 \box0 \starttabbox      \wd\verbbox=\dimen\verbbox \box\verbbox \starttabbox
     }%      }%
   }    }
 \endgroup  \endgroup
Line 6354  end Line 6594  end
 \def\setupverbatim{%  \def\setupverbatim{%
   \let\nonarrowing = t%    \let\nonarrowing = t%
   \nonfillstart    \nonfillstart
  % Easiest (and conventionally used) font for verbatim  \tt % easiest (and conventionally used) font for verbatim
  \tt  % The \leavevmode here is for blank lines.  Otherwise, we would
  \def\par{\leavevmode\egroup\box0\endgraf}%  % never \starttabox and the \egroup would end verbatim mode.
   \def\par{\leavevmode\egroup\box\verbbox\endgraf}%
   \tabexpand    \tabexpand
   \setupmarkupstyle{verbatim}%    \setupmarkupstyle{verbatim}%
   % Respect line breaks,    % Respect line breaks,
   % print special symbols as themselves, and    % print special symbols as themselves, and
  % make each space count  % make each space count.
  % must do in this order:  % Must do in this order:
   \obeylines \uncatcodespecials \sepspaces    \obeylines \uncatcodespecials \sepspaces
   \everypar{\starttabbox}%    \everypar{\starttabbox}%
 }  }
Line 6419  end Line 6660  end
     \makevalueexpandable      \makevalueexpandable
     \setupverbatim      \setupverbatim
     \indexnofonts       % Allow `@@' and other weird things in file names.      \indexnofonts       % Allow `@@' and other weird things in file names.
       \wlog{texinfo.tex: doing @verbatiminclude of #1^^J}%
     \input #1      \input #1
     \afterenvbreak      \afterenvbreak
   }%    }%
Line 6468  end Line 6710  end
     % commands also insert a nobreak penalty, and we don't want to allow      % commands also insert a nobreak penalty, and we don't want to allow
     % a break between a section heading and a defun.      % a break between a section heading and a defun.
     %      %
    % As a minor refinement, we avoid "club" headers by signalling    % As a further refinement, we avoid "club" headers by signalling
     % with penalty of 10003 after the very first @deffn in the      % with penalty of 10003 after the very first @deffn in the
     % sequence (see above), and penalty of 10002 after any following      % sequence (see above), and penalty of 10002 after any following
     % @def command.      % @def command.
Line 6505  end Line 6747  end
     #1#2 \endheader      #1#2 \endheader
     % common ending:      % common ending:
     \interlinepenalty = 10000      \interlinepenalty = 10000
    \advance\rightskip by 0pt plus 1fil    \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 \dodefunx
Line 6535  end Line 6777  end
 \def\domakedefun#1#2#3{%  \def\domakedefun#1#2#3{%
   \envdef#1{%    \envdef#1{%
     \startdefun      \startdefun
       \doingtypefnfalse    % distinguish typed functions from all else
     \parseargusing\activeparens{\printdefunline#3}%      \parseargusing\activeparens{\printdefunline#3}%
   }%    }%
   \def#2{\dodefunx#1}%    \def#2{\dodefunx#1}%
   \def#3%    \def#3%
 }  }
   
%%% Untyped functions:\newif\ifdoingtypefn       % doing typed function?
 \newif\ifrettypeownline    % typeset return type on its own line?
   
   % @deftypefnnewline on|off says whether the return type of typed functions
   % are printed on their own line.  This affects @deftypefn, @deftypefun,
   % @deftypeop, and @deftypemethod.
   % 
   \parseargdef\deftypefnnewline{%
     \def\temp{#1}%
     \ifx\temp\onword
       \expandafter\let\csname SETtxideftypefnnl\endcsname
         = \empty
     \else\ifx\temp\offword
       \expandafter\let\csname SETtxideftypefnnl\endcsname
         = \relax
     \else
       \errhelp = \EMsimple
       \errmessage{Unknown @txideftypefnnl value `\temp',
                   must be on|off}%
     \fi\fi
   }
   
   % Untyped functions:
   
 % @deffn category name args  % @deffn category name args
 \makedefun{deffn}{\deffngeneral{}}  \makedefun{deffn}{\deffngeneral{}}
   
Line 6560  end Line 6825  end
   \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}%    \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}%
 }  }
   
%%% Typed functions:% Typed functions:
   
 % @deftypefn category type name args  % @deftypefn category type name args
 \makedefun{deftypefn}{\deftypefngeneral{}}  \makedefun{deftypefn}{\deftypefngeneral{}}
Line 6575  end Line 6840  end
 %  %
 \def\deftypefngeneral#1#2 #3 #4 #5\endheader{%  \def\deftypefngeneral#1#2 #3 #4 #5\endheader{%
   \dosubind{fn}{\code{#4}}{#1}%    \dosubind{fn}{\code{#4}}{#1}%
     \doingtypefntrue
   \defname{#2}{#3}{#4}\defunargs{#5\unskip}%    \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
 }  }
   
%%% Typed variables:% Typed variables:
   
 % @deftypevr category type var args  % @deftypevr category type var args
 \makedefun{deftypevr}{\deftypecvgeneral{}}  \makedefun{deftypevr}{\deftypecvgeneral{}}
Line 6596  end Line 6862  end
   \defname{#2}{#3}{#4}\defunargs{#5\unskip}%    \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
 }  }
   
%%% Untyped variables:% Untyped variables:
   
 % @defvr category var args  % @defvr category var args
 \makedefun{defvr}#1 {\deftypevrheader{#1} {} }  \makedefun{defvr}#1 {\deftypevrheader{#1} {} }
Line 6607  end Line 6873  end
 % \defcvof {category of}class var args  % \defcvof {category of}class var args
 \def\defcvof#1#2 {\deftypecvof{#1}#2 {} }  \def\defcvof#1#2 {\deftypecvof{#1}#2 {} }
   
%%% Type:% 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}}%
Line 6635  end Line 6902  end
 % 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\defname#1#2#3{%
     \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
   %    %
  % How we'll format the type name.  Putting it in brackets helps  % Determine if we are typesetting the return type of a typed function
   % on a line by itself.
   \rettypeownlinefalse
   \ifdoingtypefn  % doing a typed function specifically?
     % then check user option for putting return type on its own line:
     \expandafter\ifx\csname SETtxideftypefnnl\endcsname\relax \else
       \rettypeownlinetrue
     \fi
   \fi
   %
   % How we'll format the category name.  Putting it in brackets helps
   % distinguish it from the body text that may end up on the next line    % distinguish it from the body text that may end up on the next line
   % just below it.    % just below it.
   \def\temp{#1}%    \def\temp{#1}%
   \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi}    \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi}
   %    %
  % Figure out line sizes for the paragraph shape.  % Figure out line sizes for the paragraph shape.  We'll always have at
   % least two.
   \tempnum = 2
   %
   % The first line needs space for \box0; but if \rightskip is nonzero,    % The first line needs space for \box0; but if \rightskip is nonzero,
   % we need only space for the part of \box0 which exceeds it:    % we need only space for the part of \box0 which exceeds it:
   \dimen0=\hsize  \advance\dimen0 by -\wd0  \advance\dimen0 by \rightskip    \dimen0=\hsize  \advance\dimen0 by -\wd0  \advance\dimen0 by \rightskip
     %
     % If doing a return type on its own line, we'll have another line.
     \ifrettypeownline
       \advance\tempnum by 1
       \def\maybeshapeline{0in \hsize}%
     \else
       \def\maybeshapeline{}%
     \fi
     %
   % The continuations:    % The continuations:
   \dimen2=\hsize  \advance\dimen2 by -\defargsindent    \dimen2=\hsize  \advance\dimen2 by -\defargsindent
   % (plain.tex says that \dimen1 should be used only as global.)  
   \parshape 2 0in \dimen0 \defargsindent \dimen2  
   %    %
  % Put the type name to the right margin.  % The final paragraph shape:
   \parshape \tempnum  0in \dimen0  \maybeshapeline  \defargsindent \dimen2
   %
   % Put the category name at the right margin.
   \noindent    \noindent
   \hbox to 0pt{%    \hbox to 0pt{%
     \hfil\box0 \kern-\hsize      \hfil\box0 \kern-\hsize
Line 6675  end Line 6966  end
     % . this still does not fix the ?` and !` ligatures, but so far no      % . this still does not fix the ?` and !` ligatures, but so far no
     %   one has made identifiers using them :).      %   one has made identifiers using them :).
     \df \tt      \df \tt
    \def\temp{#2}% return value type    \def\temp{#2}% text of the return type
    \ifx\temp\empty\else \tclose{\temp} \fi    \ifx\temp\empty\else
       \tclose{\temp}% typeset the return type
       \ifrettypeownline
         % put return type on its own line; prohibit line break following:
         \hfil\vadjust{\nobreak}\break  
       \else
         \space  % type on same line, so just followed by a space
       \fi
     \fi           % no return type
     #3% output function name      #3% output function name
   }%    }%
   {\rm\enskip}% hskip 0.5 em of \tenrm    {\rm\enskip}% hskip 0.5 em of \tenrm
Line 6794  end Line 7093  end
   
 % To do this right we need a feature of e-TeX, \scantokens,  % To do this right we need a feature of e-TeX, \scantokens,
 % which we arrange to emulate with a temporary file in ordinary TeX.  % which we arrange to emulate with a temporary file in ordinary TeX.
\ifx\eTeXversion\undefined\ifx\eTeXversion\thisisundefined
   \newwrite\macscribble    \newwrite\macscribble
   \def\scantokens#1{%    \def\scantokens#1{%
     \toks0={#1}%      \toks0={#1}%
Line 6805  end Line 7104  end
   }    }
 \fi  \fi
   
\def\scanmacro#1{%\def\scanmacro#1{\begingroup
  \begingroup  \newlinechar`\^^M
    \newlinechar`\^^M  \let\xeatspaces\eatspaces
    \let\xeatspaces\eatspaces  %
    % Undo catcode changes of \startcontents and \doprintindex  % Undo catcode changes of \startcontents and \doprintindex
    % When called from @insertcopying or (short)caption, we need active  % When called from @insertcopying or (short)caption, we need active
    % backslash to get it printed correctly.  Previously, we had  % backslash to get it printed correctly.  Previously, we had
    % \catcode`\\=\other instead.  We'll see whether a problem appears  % \catcode`\\=\other instead.  We'll see whether a problem appears
    % with macro expansion.                             --kasal, 19aug04  % with macro expansion.                               --kasal, 19aug04
    \catcode`\@=0 \catcode`\\=\active \escapechar=`\@  \catcode`\@=0 \catcode`\\=\active \escapechar=`\@
    % ... and \example  %
    \spaceisspace  % ... and for \example:
    %  \spaceisspace
    % Append \endinput to make sure that TeX does not see the ending newline.  %
    % I've verified that it is necessary both for e-TeX and for ordinary TeX  % The \empty here causes a following catcode 5 newline to be eaten as
    %                                                   --kasal, 29nov03  % part of reading whitespace after a control sequence.  It does not
    \scantokens{#1\endinput}%  % eat a catcode 13 newline.  There's no good way to handle the two
  \endgroup  % cases (untried: maybe e-TeX's \everyeof could help, though plain TeX
}  % would then have different behavior).  See the Macro Details node in
   % the manual for the workaround we recommend for macros and
   % line-oriented commands.
   % 
   \scantokens{#1\empty}%
 \endgroup}
   
 \def\scanexp#1{%  \def\scanexp#1{%
   \edef\temp{\noexpand\scanmacro{#1}}%    \edef\temp{\noexpand\scanmacro{#1}}%
Line 6877  end Line 7181  end
   
 % Macro bodies are absorbed as an argument in a context where  % Macro bodies are absorbed as an argument in a context where
 % all characters are catcode 10, 11 or 12, except \ which is active  % all characters are catcode 10, 11 or 12, except \ which is active
% (as in normal texinfo). It is necessary to change the definition of \.% (as in normal texinfo). It is necessary to change the definition of \
% to recognize macro arguments; this is the job of \mbodybackslash.
 %
 % Non-ASCII encodings make 8-bit characters active, so un-activate  % Non-ASCII encodings make 8-bit characters active, so un-activate
 % them to avoid their expansion.  Must do this non-globally, to  % them to avoid their expansion.  Must do this non-globally, to
 % confine the change to the current group.  % confine the change to the current group.
%
 % It's necessary to have hard CRs when the macro is executed. This is  % It's necessary to have hard CRs when the macro is executed. This is
% done by  making ^^M (\endlinechar) catcode 12 when reading the macro% done by making ^^M (\endlinechar) catcode 12 when reading the macro
 % body, and then making it the \newlinechar in \scanmacro.  % body, and then making it the \newlinechar in \scanmacro.
%
\def\scanctxt{%\def\scanctxt{% used as subroutine
   \catcode`\"=\other    \catcode`\"=\other
   \catcode`\+=\other    \catcode`\+=\other
   \catcode`\<=\other    \catcode`\<=\other
Line 6900  end Line 7205  end
   \ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi    \ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi
 }  }
   
\def\scanargctxt{%\def\scanargctxt{% used for copying and captions, not macros.
   \scanctxt    \scanctxt
   \catcode`\\=\other    \catcode`\\=\other
   \catcode`\^^M=\other    \catcode`\^^M=\other
 }  }
   
\def\macrobodyctxt{%\def\macrobodyctxt{% used for @macro definitions
   \scanctxt    \scanctxt
   \catcode`\{=\other    \catcode`\{=\other
   \catcode`\}=\other    \catcode`\}=\other
Line 6914  end Line 7219  end
   \usembodybackslash    \usembodybackslash
 }  }
   
\def\macroargctxt{%\def\macroargctxt{% used when scanning invocations
   \scanctxt    \scanctxt
  \catcode`\\=\other  \catcode`\\=0
 }  }
   % why catcode 0 for \ in the above?  To recognize \\ \{ \} as "escapes"
   % for the single characters \ { }.  Thus, we end up with the "commands"
   % that would be written @\ @{ @} in a Texinfo document.
   % 
   % We already have @{ and @}.  For @\, we define it here, and only for
   % this purpose, to produce a typewriter backslash (so, the @\ that we
   % define for @math can't be used with @macro calls):
   %
   \def\\{\normalbackslash}%
   % 
   % We would like to do this for \, too, since that is what makeinfo does.
   % But it is not possible, because Texinfo already has a command @, for a
   % cedilla accent.  Documents must use @comma{} instead.
   %
   % \anythingelse will almost certainly be an error of some kind.
   
   
 % \mbodybackslash is the definition of \ in @macro bodies.  % \mbodybackslash is the definition of \ in @macro bodies.
 % It maps \foo\ => \csname macarg.foo\endcsname => #N  % It maps \foo\ => \csname macarg.foo\endcsname => #N
 % where N is the macro parameter number.  % where N is the macro parameter number.
 % We define \csname macarg.\endcsname to be \realbackslash, so  % We define \csname macarg.\endcsname to be \realbackslash, so
 % \\ in macro replacement text gets you a backslash.  % \\ in macro replacement text gets you a backslash.
%
 {\catcode`@=0 @catcode`@\=@active  {\catcode`@=0 @catcode`@\=@active
  @gdef@usembodybackslash{@let\=@mbodybackslash}   @gdef@usembodybackslash{@let\=@mbodybackslash}
  @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname}   @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname}
 }  }
 \expandafter\def\csname macarg.\endcsname{\realbackslash}  \expandafter\def\csname macarg.\endcsname{\realbackslash}
   
   \def\margbackslash#1{\char`\#1 }
   
 \def\macro{\recursivefalse\parsearg\macroxxx}  \def\macro{\recursivefalse\parsearg\macroxxx}
 \def\rmacro{\recursivetrue\parsearg\macroxxx}  \def\rmacro{\recursivetrue\parsearg\macroxxx}
   
 \def\macroxxx#1{%  \def\macroxxx#1{%
  \getargs{#1}%           now \macname is the macname and \argl the arglist  \getargs{#1}% now \macname is the macname and \argl the arglist
   \ifx\argl\empty       % no arguments    \ifx\argl\empty       % no arguments
     \paramno=0%     \paramno=0\relax
   \else    \else
      \expandafter\parsemargdef \argl;%       \expandafter\parsemargdef \argl;%
        \if\paramno>256\relax
          \ifx\eTeXversion\thisisundefined
            \errhelp = \EMsimple
            \errmessage{You need eTeX to compile a file with macros with more than 256 arguments}
          \fi
        \fi
   \fi    \fi
   \if1\csname ismacro.\the\macname\endcsname    \if1\csname ismacro.\the\macname\endcsname
      \message{Warning: redefining \the\macname}%       \message{Warning: redefining \the\macname}%
Line 6986  end Line 7315  end
 % an opening brace, and that opening brace is not consumed.  % an opening brace, and that opening brace is not consumed.
 \def\getargs#1{\getargsxxx#1{}}  \def\getargs#1{\getargsxxx#1{}}
 \def\getargsxxx#1#{\getmacname #1 \relax\getmacargs}  \def\getargsxxx#1#{\getmacname #1 \relax\getmacargs}
\def\getmacname #1 #2\relax{\macname={#1}}\def\getmacname#1 #2\relax{\macname={#1}}
 \def\getmacargs#1{\def\argl{#1}}  \def\getmacargs#1{\def\argl{#1}}
   
   % For macro processing make @ a letter so that we can make Texinfo private macro names.
   \edef\texiatcatcode{\the\catcode`\@}
   \catcode `@=11\relax
   
 % Parse the optional {params} list.  Set up \paramno and \paramlist  % Parse the optional {params} list.  Set up \paramno and \paramlist
% so \defmacro knows what to do.  Define \macarg.blah for each blah% so \defmacro knows what to do.  Define \macarg.BLAH for each BLAH
% in the params list, to be ##N where N is the position in that list.% in the params list to some hook where the argument si to be expanded.  If
 % there are less than 10 arguments that hook is to be replaced by ##N where N
 % is the position in that list, that is to say the macro arguments are to be
 % defined `a la TeX in the macro body.  
 %
 % That gets used by \mbodybackslash (above).  % That gets used by \mbodybackslash (above).
%
 % We need to get `macro parameter char #' into several definitions.  % We need to get `macro parameter char #' into several definitions.
% The technique used is stolen from LaTeX:  let \hash be something% The technique used is stolen from LaTeX: let \hash be something
 % unexpandable, insert that wherever you need a #, and then redefine  % unexpandable, insert that wherever you need a #, and then redefine
 % it to # just before using the token list produced.  % it to # just before using the token list produced.
 %  %
 % The same technique is used to protect \eatspaces till just before  % The same technique is used to protect \eatspaces till just before
 % the macro is used.  % the macro is used.
%
\def\parsemargdef#1;{\paramno=0\def\paramlist{}%% If there are 10 or more arguments, a different technique is used, where the
        \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,}% hook remains in the body, and when macro is to be expanded the body is
 % processed again to replace the arguments.
 %
 % In that case, the hook is \the\toks N-1, and we simply set \toks N-1 to the
 % argument N value and then \edef  the body (nothing else will expand because of
 % the catcode regime underwhich the body was input).
 %
 % If you compile with TeX (not eTeX), and you have macros with 10 or more
 % arguments, you need that no macro has more than 256 arguments, otherwise an
 % error is produced.
 \def\parsemargdef#1;{%
   \paramno=0\def\paramlist{}%
   \let\hash\relax
   \let\xeatspaces\relax
   \parsemargdefxxx#1,;,%
   % In case that there are 10 or more arguments we parse again the arguments
   % list to set new definitions for the \macarg.BLAH macros corresponding to
   % each BLAH argument. It was anyhow needed to parse already once this list
   % in order to count the arguments, and as macros with at most 9 arguments
   % are by far more frequent than macro with 10 or more arguments, defining
   % twice the \macarg.BLAH macros does not cost too much processing power.
   \ifnum\paramno<10\relax\else
     \paramno0\relax
     \parsemmanyargdef@@#1,;,% 10 or more arguments
   \fi
 }
 \def\parsemargdefxxx#1,{%  \def\parsemargdefxxx#1,{%
   \if#1;\let\next=\relax    \if#1;\let\next=\relax
   \else \let\next=\parsemargdefxxx    \else \let\next=\parsemargdefxxx
    \advance\paramno by 1%    \advance\paramno by 1
     \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname      \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname
         {\xeatspaces{\hash\the\paramno}}%          {\xeatspaces{\hash\the\paramno}}%
     \edef\paramlist{\paramlist\hash\the\paramno,}%      \edef\paramlist{\paramlist\hash\the\paramno,}%
   \fi\next}    \fi\next}
   
   \def\parsemmanyargdef@@#1,{%
     \if#1;\let\next=\relax
     \else 
       \let\next=\parsemmanyargdef@@
       \edef\tempb{\eatspaces{#1}}%
       \expandafter\def\expandafter\tempa
          \expandafter{\csname macarg.\tempb\endcsname}%
       % Note that we need some extra \noexpand\noexpand, this is because we
       % don't want \the  to be expanded in the \parsermacbody  as it uses an
       % \xdef .
       \expandafter\edef\tempa
         {\noexpand\noexpand\noexpand\the\toks\the\paramno}%
       \advance\paramno by 1\relax
     \fi\next}
   
 % These two commands read recursive and nonrecursive macro bodies.  % These two commands read recursive and nonrecursive macro bodies.
 % (They're different since rec and nonrec macros end differently.)  % (They're different since rec and nonrec macros end differently.)
   %
   
   \catcode `\@\texiatcatcode
 \long\def\parsemacbody#1@end macro%  \long\def\parsemacbody#1@end macro%
 {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%  {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
 \long\def\parsermacbody#1@end rmacro%  \long\def\parsermacbody#1@end rmacro%
 {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%  {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
   \catcode `\@=11\relax
   
% This defines the macro itself. There are six cases: recursive and\let\endargs@\relax
% nonrecursive macros of zero, one, and many arguments.\let\nil@\relax
 \def\nilm@{\nil@}%
 \long\def\nillm@{\nil@}%
 
 % This macro is expanded during the Texinfo macro expansion, not during its
 % definition.  It gets all the arguments values and assigns them to macros
 % macarg.ARGNAME
 %
 % #1 is the macro name
 % #2 is the list of argument names
 % #3 is the list of argument values
 \def\getargvals@#1#2#3{%
   \def\macargdeflist@{}%
   \def\saveparamlist@{#2}% Need to keep a copy for parameter expansion.
   \def\paramlist{#2,\nil@}%
   \def\macroname{#1}%
   \begingroup
   \macroargctxt
   \def\argvaluelist{#3,\nil@}%
   \def\@tempa{#3}%
   \ifx\@tempa\empty
     \setemptyargvalues@
   \else
     \getargvals@@
   \fi
 }
 
 
 \def\getargvals@@{%
   \ifx\paramlist\nilm@
       % Some sanity check needed here that \argvaluelist is also empty.
       \ifx\argvaluelist\nillm@
       \else
         \errhelp = \EMsimple
         \errmessage{Too many arguments in macro `\macroname'!}%
       \fi
       \let\next\macargexpandinbody@
   \else
     \ifx\argvaluelist\nillm@
        % No more arguments values passed to macro.  Set remaining named-arg
        % macros to empty.
        \let\next\setemptyargvalues@
     \else
       % pop current arg name into \@tempb
       \def\@tempa##1{\pop@{\@tempb}{\paramlist}##1\endargs@}%
       \expandafter\@tempa\expandafter{\paramlist}%
        % pop current argument value into \@tempc
       \def\@tempa##1{\longpop@{\@tempc}{\argvaluelist}##1\endargs@}%
       \expandafter\@tempa\expandafter{\argvaluelist}%
        % Here \@tempb is the current arg name and \@tempc is the current arg value.
        % First place the new argument macro definition into \@tempd
        \expandafter\macname\expandafter{\@tempc}%
        \expandafter\let\csname macarg.\@tempb\endcsname\relax
        \expandafter\def\expandafter\@tempe\expandafter{%
          \csname macarg.\@tempb\endcsname}%
        \edef\@tempd{\long\def\@tempe{\the\macname}}%
        \push@\@tempd\macargdeflist@
        \let\next\getargvals@@
     \fi
   \fi
   \next
 }
 
 \def\push@#1#2{%
   \expandafter\expandafter\expandafter\def
   \expandafter\expandafter\expandafter#2%
   \expandafter\expandafter\expandafter{%
   \expandafter#1#2}%
 }
 
 % Replace arguments by their values in the macro body, and place the result
 % in macro \@tempa
 \def\macvalstoargs@{%
   %  To do this we use the property that token registers that are \the'ed
   % within an \edef  expand only once. So we are going to place all argument
   % values into respective token registers.
   %
   % First we save the token context, and initialize argument numbering.
   \begingroup
     \paramno0\relax
     % Then, for each argument number #N, we place the corresponding argument
     % value into a new token list register \toks#N
     \expandafter\putargsintokens@\saveparamlist@,;,%
     % Then, we expand the body so that argument are replaced by their
     % values. The trick for values not to be expanded themselves is that they
     % are within tokens and that tokens expand only once in an \edef .
     \edef\@tempc{\csname mac.\macroname .body\endcsname}%
     % Now we restore the token stack pointer to free the token list registers
     % which we have used, but we make sure that expanded body is saved after
     % group.
     \expandafter
   \endgroup
   \expandafter\def\expandafter\@tempa\expandafter{\@tempc}%
   }
 
 \def\macargexpandinbody@{% 
   %% Define the named-macro outside of this group and then close this group. 
   \expandafter
   \endgroup
   \macargdeflist@
   % First the replace in body the macro arguments by their values, the result
   % is in \@tempa .
   \macvalstoargs@
   % Then we point at the \norecurse or \gobble (for recursive) macro value
   % with \@tempb .
   \expandafter\let\expandafter\@tempb\csname mac.\macroname .recurse\endcsname
   % Depending on whether it is recursive or not, we need some tailing
   % \egroup .
   \ifx\@tempb\gobble
      \let\@tempc\relax
   \else
      \let\@tempc\egroup
   \fi
   % And now we do the real job:
   \edef\@tempd{\noexpand\@tempb{\macroname}\noexpand\scanmacro{\@tempa}\@tempc}%
   \@tempd
 }
 
 \def\putargsintokens@#1,{%
   \if#1;\let\next\relax
   \else
     \let\next\putargsintokens@
     % First we allocate the new token list register, and give it a temporary
     % alias \@tempb .
     \toksdef\@tempb\the\paramno
     % Then we place the argument value into that token list register.
     \expandafter\let\expandafter\@tempa\csname macarg.#1\endcsname
     \expandafter\@tempb\expandafter{\@tempa}%
     \advance\paramno by 1\relax
   \fi
   \next
 }
 
 % Save the token stack pointer into macro #1
 \def\texisavetoksstackpoint#1{\edef#1{\the\@cclvi}}
 % Restore the token stack pointer from number in macro #1
 \def\texirestoretoksstackpoint#1{\expandafter\mathchardef\expandafter\@cclvi#1\relax}
 % newtoks that can be used non \outer .
 \def\texinonouternewtoks{\alloc@ 5\toks \toksdef \@cclvi}
 
 % Tailing missing arguments are set to empty
 \def\setemptyargvalues@{%
   \ifx\paramlist\nilm@
     \let\next\macargexpandinbody@
   \else
     \expandafter\setemptyargvaluesparser@\paramlist\endargs@
     \let\next\setemptyargvalues@
   \fi
   \next
 }
 
 \def\setemptyargvaluesparser@#1,#2\endargs@{%
   \expandafter\def\expandafter\@tempa\expandafter{%
     \expandafter\def\csname macarg.#1\endcsname{}}%
   \push@\@tempa\macargdeflist@
   \def\paramlist{#2}%
 }
 
 % #1 is the element target macro
 % #2 is the list macro
 % #3,#4\endargs@ is the list value
 \def\pop@#1#2#3,#4\endargs@{%
    \def#1{#3}%
    \def#2{#4}%
 }
 \long\def\longpop@#1#2#3,#4\endargs@{%
    \long\def#1{#3}%
    \long\def#2{#4}%
 }
 
 % This defines a Texinfo @macro. There are eight cases: recursive and
 % nonrecursive macros of zero, one, up to nine, and many arguments.
 % Much magic with \expandafter here.  % Much magic with \expandafter here.
 % \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\defmacro{%
   \let\hash=##% convert placeholders to macro parameter chars    \let\hash=##% convert placeholders to macro parameter chars
   \ifrecursive    \ifrecursive
Line 7040  end Line 7592  end
          \expandafter\noexpand\csname\the\macname xxx\endcsname}%           \expandafter\noexpand\csname\the\macname xxx\endcsname}%
       \expandafter\xdef\csname\the\macname xxx\endcsname##1{%        \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
          \egroup\noexpand\scanmacro{\temp}}%           \egroup\noexpand\scanmacro{\temp}}%
    \else % many    \else
      \expandafter\xdef\csname\the\macname\endcsname{%      \ifnum\paramno<10\relax % at most 9
         \bgroup\noexpand\macroargctxt        \expandafter\xdef\csname\the\macname\endcsname{%
         \noexpand\csname\the\macname xx\endcsname}%           \bgroup\noexpand\macroargctxt
      \expandafter\xdef\csname\the\macname xx\endcsname##1{%           \noexpand\csname\the\macname xx\endcsname}%
          \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%        \expandafter\xdef\csname\the\macname xx\endcsname##1{%
      \expandafter\expandafter            \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
      \expandafter\xdef        \expandafter\expandafter
      \expandafter\expandafter        \expandafter\xdef
        \csname\the\macname xxx\endcsname        \expandafter\expandafter
          \paramlist{\egroup\noexpand\scanmacro{\temp}}%          \csname\the\macname xxx\endcsname
             \paramlist{\egroup\noexpand\scanmacro{\temp}}%
       \else % 10 or more
         \expandafter\xdef\csname\the\macname\endcsname{%
           \noexpand\getargvals@{\the\macname}{\argl}%
         }%    
         \global\expandafter\let\csname mac.\the\macname .body\endcsname\temp
         \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\gobble
       \fi
     \fi      \fi
   \else    \else
     \ifcase\paramno      \ifcase\paramno
Line 7067  end Line 7627  end
         \egroup          \egroup
         \noexpand\norecurse{\the\macname}%          \noexpand\norecurse{\the\macname}%
         \noexpand\scanmacro{\temp}\egroup}%          \noexpand\scanmacro{\temp}\egroup}%
    \else % many    \else % at most 9
      \expandafter\xdef\csname\the\macname\endcsname{%      \ifnum\paramno<10\relax
         \bgroup\noexpand\macroargctxt        \expandafter\xdef\csname\the\macname\endcsname{%
         \expandafter\noexpand\csname\the\macname xx\endcsname}%           \bgroup\noexpand\macroargctxt
      \expandafter\xdef\csname\the\macname xx\endcsname##1{%           \expandafter\noexpand\csname\the\macname xx\endcsname}%
          \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%        \expandafter\xdef\csname\the\macname xx\endcsname##1{%
      \expandafter\expandafter            \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
      \expandafter\xdef        \expandafter\expandafter
      \expandafter\expandafter        \expandafter\xdef
      \csname\the\macname xxx\endcsname        \expandafter\expandafter
      \paramlist{%        \csname\the\macname xxx\endcsname
          \egroup        \paramlist{%
          \noexpand\norecurse{\the\macname}%            \egroup
          \noexpand\scanmacro{\temp}\egroup}%            \noexpand\norecurse{\the\macname}%
             \noexpand\scanmacro{\temp}\egroup}%
       \else % 10 or more:
         \expandafter\xdef\csname\the\macname\endcsname{%
           \noexpand\getargvals@{\the\macname}{\argl}%
         }%
         \global\expandafter\let\csname mac.\the\macname .body\endcsname\temp
         \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\norecurse
       \fi
     \fi      \fi
   \fi}    \fi}
   
   \catcode `\@\texiatcatcode\relax
   
 \def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}  \def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
   
 % \braceorline decides whether the next nonwhitespace character is a  % \braceorline decides whether the next nonwhitespace character is a
 % {.  If so it reads up to the closing }, if not, it reads the whole  % {.  If so it reads up to the closing }, if not, it reads the whole
 % line.  Whatever was read is then fed to the next control sequence  % line.  Whatever was read is then fed to the next control sequence
% as an argument (by \parsebrace or \parsearg)% as an argument (by \parsebrace or \parsearg).
 
 \def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx}  \def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx}
 \def\braceorlinexxx{%  \def\braceorlinexxx{%
   \ifx\nchar\bgroup\else    \ifx\nchar\bgroup\else
Line 7099  end Line 7670  end
   
 % @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.  Just make them active and then expand them all to nothing.% sign.  Make them active and then expand them all to nothing.
 %
 \def\alias{\parseargusing\obeyspaces\aliasxxx}  \def\alias{\parseargusing\obeyspaces\aliasxxx}
 \def\aliasxxx #1{\aliasyyy#1\relax}  \def\aliasxxx #1{\aliasyyy#1\relax}
 \def\aliasyyy #1=#2\relax{%  \def\aliasyyy #1=#2\relax{%
Line 7120  end Line 7692  end
   
 % @inforef is relatively simple.  % @inforef is relatively simple.
 \def\inforef #1{\inforefzzz #1,,,,**}  \def\inforef #1{\inforefzzz #1,,,,**}
\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},\def\inforefzzz #1,#2,#3,#4**{%
   \putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
   node \samp{\ignorespaces#1{}}}    node \samp{\ignorespaces#1{}}}
   
 % @node's only job in TeX is to define \lastnode, which is used in  % @node's only job in TeX is to define \lastnode, which is used in
Line 7181  end Line 7754  end
       \toks0 = \expandafter{\lastsection}%        \toks0 = \expandafter{\lastsection}%
       \immediate \writexrdef{title}{\the\toks0 }%        \immediate \writexrdef{title}{\the\toks0 }%
       \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc.        \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc.
      \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, during \shipout      \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, at \shipout
     }%      }%
   \fi    \fi
 }  }
   
   % @xrefautosectiontitle on|off says whether @section(ing) names are used
   % automatically in xrefs, if the third arg is not explicitly specified.
   % This was provided as a "secret" @set xref-automatic-section-title
   % variable, now it's official.
   % 
   \parseargdef\xrefautomaticsectiontitle{%
     \def\temp{#1}%
     \ifx\temp\onword
       \expandafter\let\csname SETxref-automatic-section-title\endcsname
         = \empty
     \else\ifx\temp\offword
       \expandafter\let\csname SETxref-automatic-section-title\endcsname
         = \relax
     \else
       \errhelp = \EMsimple
       \errmessage{Unknown @xrefautomaticsectiontitle value `\temp',
                   must be on|off}%
     \fi\fi
   }
   
   
 % @xref, @pxref, and @ref generate cross-references.  For \xrefX, #1 is  % @xref, @pxref, and @ref generate cross-references.  For \xrefX, #1 is
 % the node name, #2 the name of the Info cross-reference, #3 the printed  % the node name, #2 the name of the Info cross-reference, #3 the printed
 % node name, #4 the name of the Info file, #5 the name of the printed  % node name, #4 the name of the Info file, #5 the name of the printed
Line 7202  end Line 7796  end
   \setbox0=\hbox{\printedrefname\unskip}%    \setbox0=\hbox{\printedrefname\unskip}%
   \ifdim \wd0 = 0pt    \ifdim \wd0 = 0pt
     % No printed node name was explicitly given.      % No printed node name was explicitly given.
    \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax    \expandafter\ifx\csname SETxref-automatic-section-title\endcsname \relax
       % Use the node name inside the square brackets.        % Use the node name inside the square brackets.
       \def\printedrefname{\ignorespaces #1}%        \def\printedrefname{\ignorespaces #1}%
     \else      \else
Line 7357  end Line 7951  end
     \angleleft un\-de\-fined\angleright      \angleleft un\-de\-fined\angleright
     \iflinks      \iflinks
       \ifhavexrefs        \ifhavexrefs
        \message{\linenumber Undefined cross reference `#1'.}%        {\toks0 = {#1}% avoid expansion of possibly-complex value
          \message{\linenumber Undefined cross reference `\the\toks0'.}}%
       \else        \else
         \ifwarnedxrefs\else          \ifwarnedxrefs\else
           \global\warnedxrefstrue            \global\warnedxrefstrue
Line 7521  end Line 8116  end
 % space to prevent strange expansion errors.)  % space to prevent strange expansion errors.)
 \def\supereject{\par\penalty -20000\footnoteno =0 }  \def\supereject{\par\penalty -20000\footnoteno =0 }
   
% @footnotestyle is meaningful for info output only.% @footnotestyle is meaningful for Info output only.
 \let\footnotestyle=\comment  \let\footnotestyle=\comment
   
 {\catcode `\@=11  {\catcode `\@=11
Line 7584  end Line 8179  end
   % expands into a box, it must come within the paragraph, lest it    % expands into a box, it must come within the paragraph, lest it
   % provide a place where TeX can split the footnote.    % provide a place where TeX can split the footnote.
   \footstrut    \footstrut
     %
     % Invoke rest of plain TeX footnote routine.
   \futurelet\next\fo@t    \futurelet\next\fo@t
 }  }
 }%end \catcode `\@=11  }%end \catcode `\@=11
Line 7671  end Line 8268  end
   it from ftp://tug.org/tex/epsf.tex.}    it from ftp://tug.org/tex/epsf.tex.}
 %  %
 \def\image#1{%  \def\image#1{%
  \ifx\epsfbox\undefined  \ifx\epsfbox\thisiundefined
     \ifwarnednoepsf \else      \ifwarnednoepsf \else
       \errhelp = \noepsfhelp        \errhelp = \noepsfhelp
       \errmessage{epsf.tex not found, images will be ignored}%        \errmessage{epsf.tex not found, images will be ignored}%
Line 7687  end Line 8284  end
 % #2 is (optional) width, #3 is (optional) height.  % #2 is (optional) width, #3 is (optional) height.
 % #4 is (ignored optional) html alt text.  % #4 is (ignored optional) html alt text.
 % #5 is (ignored optional) extension.  % #5 is (ignored optional) extension.
% #6 is just the usual extra ignored arg for parsing this stuff.% #6 is just the usual extra ignored arg for parsing stuff.
 \newif\ifimagevmode  \newif\ifimagevmode
 \def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup  \def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup
   \catcode`\^^M = 5     % in case we're inside an example    \catcode`\^^M = 5     % in case we're inside an example
Line 8136  directory should work if nowhere else does.} Line 8733  directory should work if nowhere else does.}
 %  %
 % Latin1 (ISO-8859-1) character definitions.  % Latin1 (ISO-8859-1) character definitions.
 \def\latonechardefs{%  \def\latonechardefs{%
  \gdef^^a0{~}  \gdef^^a0{\tie}
   \gdef^^a1{\exclamdown}    \gdef^^a1{\exclamdown}
   \gdef^^a2{\missingcharmsg{CENT SIGN}}    \gdef^^a2{\missingcharmsg{CENT SIGN}}
   \gdef^^a3{{\pounds}}    \gdef^^a3{{\pounds}}
Line 8166  directory should work if nowhere else does.} Line 8763  directory should work if nowhere else does.}
   \gdef^^b9{$^1$}    \gdef^^b9{$^1$}
   \gdef^^ba{\ordm}    \gdef^^ba{\ordm}
   %    %
  \gdef^^bb{\guilletright}  \gdef^^bb{\guillemetright}
   \gdef^^bc{$1\over4$}    \gdef^^bc{$1\over4$}
   \gdef^^bd{$1\over2$}    \gdef^^bd{$1\over2$}
   \gdef^^be{$3\over4$}    \gdef^^be{$3\over4$}
Line 8258  directory should work if nowhere else does.} Line 8855  directory should work if nowhere else does.}
   
 % Latin2 (ISO-8859-2) character definitions.  % Latin2 (ISO-8859-2) character definitions.
 \def\lattwochardefs{%  \def\lattwochardefs{%
  \gdef^^a0{~}  \gdef^^a0{\tie}
   \gdef^^a1{\ogonek{A}}    \gdef^^a1{\ogonek{A}}
   \gdef^^a2{\u{}}    \gdef^^a2{\u{}}
   \gdef^^a3{\L}    \gdef^^a3{\L}
Line 8339  directory should work if nowhere else does.} Line 8936  directory should work if nowhere else does.}
   \gdef^^ea{\ogonek{e}}    \gdef^^ea{\ogonek{e}}
   \gdef^^eb{\"e}    \gdef^^eb{\"e}
   \gdef^^ec{\v e}    \gdef^^ec{\v e}
  \gdef^^ed{\'\i}  \gdef^^ed{\'{\dotless{i}}}
  \gdef^^ee{\^\i}  \gdef^^ee{\^{\dotless{i}}}
   \gdef^^ef{\v d}    \gdef^^ef{\v d}
   %    %
   \gdef^^f0{\dh}    \gdef^^f0{\dh}
Line 8431  directory should work if nowhere else does.} Line 9028  directory should work if nowhere else does.}
   
   \gdef\DeclareUnicodeCharacter#1#2{%    \gdef\DeclareUnicodeCharacter#1#2{%
     \countUTFz = "#1\relax      \countUTFz = "#1\relax
    \wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}%    %\wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}%
     \begingroup      \begingroup
       \parseXMLCharref        \parseXMLCharref
       \def\UTFviiiTwoOctets##1##2{%        \def\UTFviiiTwoOctets##1##2{%
Line 8899  directory should work if nowhere else does.} Line 9496  directory should work if nowhere else does.}
 % Prevent underfull vbox error messages.  % Prevent underfull vbox error messages.
 \vbadness = 10000  \vbadness = 10000
   
% Don't be so finicky about underfull hboxes, either.% Don't be very finicky about underfull hboxes, either.
\hbadness = 2000\hbadness = 6666
   
 % Following George Bush, get rid of widows and orphans.  % Following George Bush, get rid of widows and orphans.
 \widowpenalty=10000  \widowpenalty=10000
Line 9107  directory should work if nowhere else does.} Line 9704  directory should work if nowhere else does.}
   
 \message{and turning on texinfo input format.}  \message{and turning on texinfo input format.}
   
   \def^^L{\par} % remove \outer, so ^L can appear in an @comment
   
 % 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
   
 % Define macros to output various characters with catcode for normal text.  % Define macros to output various characters with catcode for normal text.
\catcode`\"=\other\catcode`\"=\other \def\normaldoublequote{"}
\catcode`\~=\other\catcode`\$=\other \def\normaldollar{$}%$ font-lock fix
\catcode`\^=\other\catcode`\+=\other \def\normalplus{+}
\catcode`\_=\other\catcode`\<=\other \def\normalless{<}
\catcode`\|=\other\catcode`\>=\other \def\normalgreater{>}
\catcode`\<=\other\catcode`\^=\other \def\normalcaret{^}
\catcode`\>=\other\catcode`\_=\other \def\normalunderscore{_}
\catcode`\+=\other\catcode`\|=\other \def\normalverticalbar{|}
\catcode`\$=\other\catcode`\~=\other \def\normaltilde{~}
\def\normaldoublequote{"} 
\def\normaltilde{~} 
\def\normalcaret{^} 
\def\normalunderscore{_} 
\def\normalverticalbar{|} 
\def\normalless{<} 
\def\normalgreater{>} 
\def\normalplus{+} 
\def\normaldollar{$}%$ font-lock fix 
   
 % This macro is used to make a character print one way in \tt  % 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 it can probably be output as-is), and another way in other fonts,
Line 9221  directory should work if nowhere else does.} Line 9811  directory should work if nowhere else does.}
 % the literal character `\'.  % the literal character `\'.
 %  %
 @def@normalturnoffactive{%  @def@normalturnoffactive{%
   @let\=@normalbackslash  
   @let"=@normaldoublequote    @let"=@normaldoublequote
  @let~=@normaltilde  @let$=@normaldollar %$ font-lock fix
   @let+=@normalplus
   @let<=@normalless
   @let>=@normalgreater
   @let\=@normalbackslash
   @let^=@normalcaret    @let^=@normalcaret
   @let_=@normalunderscore    @let_=@normalunderscore
   @let|=@normalverticalbar    @let|=@normalverticalbar
  @let<=@normalless  @let~=@normaltilde
  @let>=@normalgreater 
  @let+=@normalplus 
  @let$=@normaldollar %$ font-lock fix 
   @markupsetuplqdefault    @markupsetuplqdefault
   @markupsetuprqdefault    @markupsetuprqdefault
   @unsepspaces    @unsepspaces
Line 9262  directory should work if nowhere else does.} Line 9852  directory should work if nowhere else does.}
 % 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.
@catcode`@& = @other@catcode`@& = @other @def@normalamp{&}
@catcode`@# = @other@catcode`@# = @other @def@normalhash{#}
@catcode`@% = @other@catcode`@% = @other @def@normalpercent{%}
   
 @c Finally, make ` and ' active, so that txicodequoteundirected and  @c Finally, make ` and ' active, so that txicodequoteundirected and
 @c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}.  If we  @c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}.  If we

Removed from v.1.1.1.1  
changed lines
  Added in v.1.1.1.2


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