OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [newlib/] [texinfo/] [texinfo.tex] - Diff between revs 39 and 56

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 39 Rev 56
Line 1... Line 1...
% texinfo.tex -- TeX macros to handle Texinfo files.
% texinfo.tex -- TeX macros to handle Texinfo files.
% $Id: texinfo.tex,v 1.1.1.1 2000-06-10 01:32:28 lampret Exp $
% $Id: texinfo.tex,v 1.1.1.2 2000-08-30 19:17:43 joel Exp $
%
%
% Copyright (C) 1985, 86, 88, 90, 91, 92, 93, 94, 95, 96, 97, 98
% Copyright (C) 1985, 86, 88, 90, 91, 92, 93, 94, 95, 96, 97, 98
% Free Software Foundation, Inc.
% 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
Line 23... Line 23...
% You are forbidden to forbid anyone else to use, share and improve
% You are forbidden to forbid anyone else to use, share and improve
% what you give them.   Help stamp out software-hoarding!
% what you give them.   Help stamp out software-hoarding!
%
%
% Please try the latest version of texinfo.tex before submitting bug
% Please try the latest version of texinfo.tex before submitting bug
% reports; you can get the latest version from:
% reports; you can get the latest version from:
% ftp://ftp.cs.umb.edu/pub/tex/texinfo.tex
%   ftp://ftp.gnu.org/pub/gnu/texinfo.tex
% /home/gd/gnu/doc/texinfo.tex on the GNU machines.
% /home/gd/gnu/doc/texinfo.tex on the GNU machines.
 
%   (and all GNU mirrors, see http://www.gnu.org/order/ftp.html)
 
%   ftp://tug.org/tex/texinfo.tex
 
%   ftp://ctan.org/macros/texinfo/texinfo.tex
 
%   (and all CTAN mirrors, finger ctan@ctan.org for a list).
 
% The texinfo.tex in the texinfo distribution itself could well be out
 
% of date, so if that's what you're using, please check.
%
%
% Send bug reports to bug-texinfo@gnu.org.
% Send bug reports to bug-texinfo@gnu.org.
% Please include a precise test case in each bug report,
% Please include a precise test case in each bug report,
% including a complete document with which we can reproduce the problem.
% including a complete document with which we can reproduce the problem.
%
%
% Texinfo macros (with @macro) are *not* supported by texinfo.tex.  You
% To process a Texinfo manual with TeX, it's most reliable to use the
% have to run makeinfo -E to expand macros first; the texi2dvi script
% texi2dvi shell script that comes with the distribution.  For simple
% does this.
% manuals, however, you can get away with:
 
%   tex foo.texi
 
%   texindex foo.??
 
%   tex foo.texi
 
%   tex foo.texi
 
%   dvips foo.dvi -o # or whatever, to process the dvi file.
 
% The extra runs of TeX get the cross-reference information correct.
 
% Sometimes one run after texindex suffices, and sometimes you need more
 
% than two; texi2dvi does it as many times as necessary.
 
 
 
 
% Make it possible to create a .fmt file just by loading this file:
% Make it possible to create a .fmt file just by loading this file:
% if the underlying format is not loaded, start by loading it now.
% if the underlying format is not loaded, start by loading it now.
% Added by gildea November 1993.
% Added by gildea November 1993.
\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
 
 
% This automatically updates the version number based on RCS.
% This automatically updates the version number based on RCS.
\def\deftexinfoversion$#1: #2 ${\def\texinfoversion{#2}}
\def\deftexinfoversion$#1: #2 ${\def\texinfoversion{#2}}
\deftexinfoversion$Revision: 1.1.1.1 $
\deftexinfoversion$Revision: 1.1.1.2 $
\message{Loading texinfo package [Version \texinfoversion]:}
\message{Loading texinfo package [Version \texinfoversion]:}
 
 
% If in a .fmt file, print the version number
% If in a .fmt file, print the version number
% and turn on active characters that we couldn't do earlier because
% and turn on active characters that we couldn't do earlier because
% they might have appeared in the input file name.
% they might have appeared in the input file name.
Line 68... Line 82...
\let\ptexlbrace=\{
\let\ptexlbrace=\{
\let\ptexrbrace=\}
\let\ptexrbrace=\}
\let\ptexstar=\*
\let\ptexstar=\*
\let\ptext=\t
\let\ptext=\t
 
 
% Be sure we're in horizontal mode when doing a tie, since we make space
% We never want plain's outer \+ definition in Texinfo.
% equivalent to this in @example-like environments. Otherwise, a space
% For @tex, we can use \tabalign.
% at the beginning of a line will start with \penalty -- and
\let\+ = \relax
% since \penalty is valid in vertical mode, we'd end up putting the
 
% penalty on the vertical list instead of in the new paragraph.
 
{\catcode`@ = 11
 
 % Avoid using \@M directly, because that causes trouble
 
 % if the definition is written into an index file.
 
 \global\let\tiepenalty = \@M
 
 \gdef\tie{\leavevmode\penalty\tiepenalty\ }
 
}
 
 
 
 
 
\message{Basics,}
\message{Basics,}
\chardef\other=12
\chardef\other=12
 
 
% 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.
\newlinechar = `^^J
\newlinechar = `^^J
 
 
% Set up fixed words for English.
% Set up fixed words for English if not already set.
\ifx\putwordChapter\undefined{\gdef\putwordChapter{Chapter}}\fi%
\ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi
\def\putwordInfo{Info}%
\ifx\putwordChapter\undefined  \gdef\putwordChapter{Chapter}\fi
\ifx\putwordSee\undefined{\gdef\putwordSee{See}}\fi%
\ifx\putwordfile\undefined     \gdef\putwordfile{file}\fi
\ifx\putwordsee\undefined{\gdef\putwordsee{see}}\fi%
\ifx\putwordInfo\undefined     \gdef\putwordInfo{Info}\fi
\ifx\putwordfile\undefined{\gdef\putwordfile{file}}\fi%
\ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi
\ifx\putwordpage\undefined{\gdef\putwordpage{page}}\fi%
\ifx\putwordon\undefined       \gdef\putwordon{on}\fi
\ifx\putwordsection\undefined{\gdef\putwordsection{section}}\fi%
\ifx\putwordpage\undefined     \gdef\putwordpage{page}\fi
\ifx\putwordSection\undefined{\gdef\putwordSection{Section}}\fi%
\ifx\putwordsection\undefined  \gdef\putwordsection{section}\fi
\ifx\putwordTableofContents\undefined{\gdef\putwordTableofContents{Table of Contents}}\fi%
\ifx\putwordSection\undefined  \gdef\putwordSection{Section}\fi
\ifx\putwordShortContents\undefined{\gdef\putwordShortContents{Short Contents}}\fi%
\ifx\putwordsee\undefined      \gdef\putwordsee{see}\fi
\ifx\putwordAppendix\undefined{\gdef\putwordAppendix{Appendix}}\fi%
\ifx\putwordSee\undefined      \gdef\putwordSee{See}\fi
 
\ifx\putwordShortContents\undefined  \gdef\putwordShortContents{Short Contents}\fi
 
\ifx\putwordTableofContents\undefined\gdef\putwordTableofContents{Table of Contents}\fi
 
 
% Ignore a token.
% Ignore a token.
%
%
\def\gobble#1{}
\def\gobble#1{}
 
 
Line 120... Line 128...
% 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.
% since that produces some useless output on the terminal.
%
%
\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
 
\ifx\eTeXversion\undefined
\def\loggingall{\tracingcommands2 \tracingstats2
\def\loggingall{\tracingcommands2 \tracingstats2
   \tracingpages1 \tracingoutput1 \tracinglostchars1
   \tracingpages1 \tracingoutput1 \tracinglostchars1
   \tracingmacros2 \tracingparagraphs1 \tracingrestores1
   \tracingmacros2 \tracingparagraphs1 \tracingrestores1
   \showboxbreadth\maxdimen\showboxdepth\maxdimen
   \showboxbreadth\maxdimen\showboxdepth\maxdimen
}%
}%
 
\else
 
\def\loggingall{\tracingcommands3 \tracingstats2
 
   \tracingpages1 \tracingoutput1 \tracinglostchars1
 
   \tracingmacros2 \tracingparagraphs1 \tracingrestores1
 
   \tracingscantokens1 \tracingassigns1 \tracingifs1
 
   \tracinggroups1 \tracingnesting2
 
   \showboxbreadth\maxdimen\showboxdepth\maxdimen
 
}%
 
\fi
 
 
% For @cropmarks command.
% For @cropmarks command.
% Do @cropmarks to get crop marks.
% Do @cropmarks to get crop marks.
%
%
\newif\ifcropmarks
\newif\ifcropmarks
\let\cropmarks = \cropmarkstrue
\let\cropmarks = \cropmarkstrue
%
%
% Dimensions to add cropmarks at corners.
% Dimensions to add cropmarks at corners.
% Added by P. A. MacKay, 12 Nov. 1986
% Added by P. A. MacKay, 12 Nov. 1986
%
%
\newdimen\cornerlong \newdimen\cornerthick
\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
\newdimen\topandbottommargin
\newdimen\cornerlong  \cornerlong=1pc
\newdimen\outerhsize \newdimen\outervsize
\newdimen\cornerthick \cornerthick=.3pt
\cornerlong=1pc\cornerthick=.3pt        % These set size of cropmarks
\newdimen\topandbottommargin \topandbottommargin=.75in
\outerhsize=7in
 
%\outervsize=9.5in
 
% Alternative @smallbook page size is 9.25in
 
\outervsize=9.25in
 
\topandbottommargin=.75in
 
 
 
% Main output routine.
% Main output routine.
\chardef\PAGE = 255
\chardef\PAGE = 255
\output = {\onepageout{\pagecontents\PAGE}}
\output = {\onepageout{\pagecontents\PAGE}}
 
 
Line 328... Line 341...
 
 
%% These are used to keep @begin/@end levels from running away
%% These are used to keep @begin/@end levels from running away
%% Call \inENV within environments (after a \begingroup)
%% Call \inENV within environments (after a \begingroup)
\newif\ifENV \ENVfalse \def\inENV{\ifENV\relax\else\ENVtrue\fi}
\newif\ifENV \ENVfalse \def\inENV{\ifENV\relax\else\ENVtrue\fi}
\def\ENVcheck{%
\def\ENVcheck{%
\ifENV\errmessage{Still within an environment.  Type Return to continue.}
\ifENV\errmessage{Still within an environment; press RETURN to continue}
\endgroup\fi} % This is not perfect, but it should reduce lossage
\endgroup\fi} % This is not perfect, but it should reduce lossage
 
 
% @begin foo  is the same as @foo, for now.
% @begin foo  is the same as @foo, for now.
\newhelp\EMsimple{Type <Return> to continue.}
\newhelp\EMsimple{Press RETURN to continue.}
 
 
\outer\def\begin{\parsearg\beginxxx}
\outer\def\begin{\parsearg\beginxxx}
 
 
\def\beginxxx #1{%
\def\beginxxx #1{%
\expandafter\ifx\csname #1\endcsname\relax
\expandafter\ifx\csname #1\endcsname\relax
Line 391... Line 404...
 
 
%% Simple single-character @ commands
%% Simple single-character @ commands
 
 
% @@ prints an @
% @@ prints an @
% Kludge this until the fonts are right (grr).
% Kludge this until the fonts are right (grr).
\def\@{{\tt \char '100}}
\def\@{{\tt\char64}}
 
 
% This is turned off because it was never documented
% This is turned off because it was never documented
% and you can use @w{...} around a quote to suppress ligatures.
% and you can use @w{...} around a quote to suppress ligatures.
%% Define @` and @' to be the same as ` and '
%% Define @` and @' to be the same as ` and '
%% but suppressing ligatures.
%% but suppressing ligatures.
%\def\`{{`}}
%\def\`{{`}}
%\def\'{{'}}
%\def\'{{'}}
 
 
% Used to generate quoted braces.
% Used to generate quoted braces.
\def\mylbrace {{\tt \char '173}}
\def\mylbrace {{\tt\char123}}
\def\myrbrace {{\tt \char '175}}
\def\myrbrace {{\tt\char125}}
\let\{=\mylbrace
\let\{=\mylbrace
\let\}=\myrbrace
\let\}=\myrbrace
\begingroup
\begingroup
  % Definitions to produce actual \{ & \} command in an index.
  % Definitions to produce actual \{ & \} command in an index.
  \catcode`\{ = 12 \catcode`\} = 12
  \catcode`\{ = 12 \catcode`\} = 12
Line 439... Line 452...
  \else\ifx\temp\jmacro \j
  \else\ifx\temp\jmacro \j
  \else \errmessage{@dotless can be used only with i or j}%
  \else \errmessage{@dotless can be used only with i or j}%
  \fi\fi
  \fi\fi
}
}
 
 
 
% 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
 
% at the beginning of a line will start with \penalty -- and
 
% since \penalty is valid in vertical mode, we'd end up putting the
 
% penalty on the vertical list instead of in the new paragraph.
 
{\catcode`@ = 11
 
 % Avoid using \@M directly, because that causes trouble
 
 % if the definition is written into an index file.
 
 \global\let\tiepenalty = \@M
 
 \gdef\tie{\leavevmode\penalty\tiepenalty\ }
 
}
 
 
% @: forces normal size whitespace following.
% @: forces normal size whitespace following.
\def\:{\spacefactor=1000 }
\def\:{\spacefactor=1000 }
 
 
% @* forces a line break.
% @* forces a line break.
\def\*{\hfil\break\hbox{}\ignorespaces}
\def\*{\hfil\break\hbox{}\ignorespaces}
Line 536... Line 561...
% Old definition--didn't work.
% Old definition--didn't work.
%\def\needx #1{\par %
%\def\needx #1{\par %
%% This method tries to make TeX break the page naturally
%% This method tries to make TeX break the page naturally
%% if the depth of the box does not fit.
%% if the depth of the box does not fit.
%{\baselineskip=0pt%
%{\baselineskip=0pt%
%\vtop to #1\mil{\vfil}\kern -#1\mil\penalty 10000
%\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak
%\prevdepth=-1000pt
%\prevdepth=-1000pt
%}}
%}}
 
 
\def\needx#1{%
\def\needx#1{%
  % Go into vertical mode, so we don't make a big box in the middle of a
  % Go into vertical mode, so we don't make a big box in the middle of a
Line 581... Line 606...
 
 
% @dots{} output an ellipsis using the current font.
% @dots{} output an ellipsis using the current font.
% We do .5em per period so that it has the same spacing in a typewriter
% We do .5em per period so that it has the same spacing in a typewriter
% font as three actual period characters.
% font as three actual period characters.
%
%
\def\dots{\hbox to 1.5em{%
\def\dots{%
 
  \leavevmode
 
  \hbox to 1.5em{%
  \hskip 0pt plus 0.25fil minus 0.25fil
  \hskip 0pt plus 0.25fil minus 0.25fil
  .\hss.\hss.%
  .\hss.\hss.%
  \hskip 0pt plus 0.5fil minus 0.5fil
  \hskip 0pt plus 0.5fil minus 0.5fil
}}
  }%
 
}
 
 
% @enddots{} is an end-of-sentence ellipsis.
% @enddots{} is an end-of-sentence ellipsis.
%
%
\def\enddots{%
\def\enddots{%
 
  \leavevmode
  \hbox to 2em{%
  \hbox to 2em{%
    \hskip 0pt plus 0.25fil minus 0.25fil
    \hskip 0pt plus 0.25fil minus 0.25fil
    .\hss.\hss.\hss.%
    .\hss.\hss.\hss.%
    \hskip 0pt plus 0.5fil minus 0.5fil
    \hskip 0pt plus 0.5fil minus 0.5fil
  }%
  }%
  \spacefactor=3000
  \spacefactor=3000
}
}
 
 
 
 
% @page    forces the start of a new page
% @page    forces the start of a new page
 
%
\def\page{\par\vfill\supereject}
\def\page{\par\vfill\supereject}
 
 
% @exdent text....
% @exdent text....
% outputs text on separate line in roman font, starting at standard page margin
% outputs text on separate line in roman font, starting at standard page margin
 
 
Line 667... Line 696...
 
 
% @comment ...line which is ignored...
% @comment ...line which is ignored...
% @c is the same as @comment
% @c is the same as @comment
% @ignore ... @end ignore  is another way to write a comment
% @ignore ... @end ignore  is another way to write a comment
 
 
\def\comment{\catcode 64=\other \catcode 123=\other \catcode 125=\other%
\def\comment{\begingroup \catcode`\^^M=\other%
\parsearg \commentxxx}
\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
 
\commentxxx}
\def\commentxxx #1{\catcode 64=0 \catcode 123=1 \catcode 125=2 }
{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}}
 
 
\let\c=\comment
\let\c=\comment
 
 
% @paragraphindent  is defined for the Info formatting commands only.
% @paragraphindent  is defined for the Info formatting commands only.
\let\paragraphindent=\comment
\let\paragraphindent=\comment
Line 767... Line 796...
\def\ifnottex{\doignore{ifnottex}}
\def\ifnottex{\doignore{ifnottex}}
\def\html{\doignore{html}}
\def\html{\doignore{html}}
\def\menu{\doignore{menu}}
\def\menu{\doignore{menu}}
\def\direntry{\doignore{direntry}}
\def\direntry{\doignore{direntry}}
 
 
% Also ignore @macro ... @end macro.  The user must run texi2dvi,
 
% which runs makeinfo to do macro expansion.  Ignore @unmacro, too.
 
\def\macro{\doignore{macro}}
 
\let\unmacro = \comment
 
 
 
 
 
% @dircategory CATEGORY  -- specify a category of the dir file
% @dircategory CATEGORY  -- specify a category of the dir file
% which this file should belong to.  Ignore this in TeX.
% which this file should belong to.  Ignore this in TeX.
\let\dircategory = \comment
\let\dircategory = \comment
 
 
% Ignore text until a line `@end #1'.
% Ignore text until a line `@end #1'.
Line 784... Line 807...
\def\doignore#1{\begingroup
\def\doignore#1{\begingroup
  % Don't complain about control sequences we have declared \outer.
  % Don't complain about control sequences we have declared \outer.
  \ignoresections
  \ignoresections
  %
  %
  % Define a command to swallow text until we reach `@end #1'.
  % Define a command to swallow text until we reach `@end #1'.
  \long\def\doignoretext##1\end #1{\enddoignore}%
  % This @ is a catcode 12 token (that is the normal catcode of @ in
 
  % this texinfo.tex file).  We change the catcode of @ below to match.
 
  \long\def\doignoretext##1@end #1{\enddoignore}%
  %
  %
  % Make sure that spaces turn into tokens that match what \doignoretext wants.
  % Make sure that spaces turn into tokens that match what \doignoretext wants.
  \catcode32 = 10
  \catcode32 = 10
  %
  %
  % Ignore braces, too, so mismatched braces don't cause trouble.
  % Ignore braces, too, so mismatched braces don't cause trouble.
  \catcode`\{ = 9
  \catcode`\{ = 9
  \catcode`\} = 9
  \catcode`\} = 9
  %
  %
 
  % We must not have @c interpreted as a control sequence.
 
  \catcode`\@ = 12
 
  %
 
  % Make the letter c a comment character so that the rest of the line
 
  % will be ignored. This way, the document can have (for example)
 
  %   @c @end ifinfo
 
  % and the @end ifinfo will be properly ignored.
 
  % (We've just changed @ to catcode 12.)
 
  \catcode`\c = 14
 
  %
  % And now expand that command.
  % And now expand that command.
  \doignoretext
  \doignoretext
}
}
 
 
% What we do to finish off ignored text.
% What we do to finish off ignored text.
Line 885... Line 920...
    % Do minimal line-breaking.
    % Do minimal line-breaking.
    \pretolerance = 10000
    \pretolerance = 10000
    %
    %
    % Do not execute instructions in @tex
    % Do not execute instructions in @tex
    \def\tex{\doignore{tex}}%
    \def\tex{\doignore{tex}}%
 
    % Do not execute macro definitions.
 
    % `c' is a comment character, so the word `macro' will get cut off.
 
    \def\macro{\doignore{ma}}%
}
}
 
 
% @set VAR sets the variable VAR to an empty value.
% @set VAR sets the variable VAR to an empty value.
% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
%
%
Line 919... Line 957...
\def\clear{\parsearg\clearxxx}
\def\clear{\parsearg\clearxxx}
\def\clearxxx#1{\global\expandafter\let\csname SET#1\endcsname=\relax}
\def\clearxxx#1{\global\expandafter\let\csname SET#1\endcsname=\relax}
 
 
% @value{foo} gets the text saved in variable foo.
% @value{foo} gets the text saved in variable foo.
%
%
\def\value{\begingroup
{
  \catcode`\-=12 \catcode`\_=12 % Allow - and _ in VAR.
  \catcode`\_ = \active
 
  %
 
  % We might end up with active _ or - characters in the argument if
 
  % we're called from @code, as @code{@value{foo-bar_}}.  So \let any
 
  % such active characters to their normal equivalents.
 
  \gdef\value{\begingroup
 
    \catcode`\-=12 \catcode`\_=12
 
    \indexbreaks \let_\normalunderscore
  \valuexxx}
  \valuexxx}
\def\valuexxx#1{%
}
 
\def\valuexxx#1{\expandablevalue{#1}\endgroup}
 
 
 
% We have this subroutine so that we can handle at least some @value's
 
% properly in indexes (we \let\value to this in \indexdummies).  Ones
 
% whose names contain - or _ still won't work, but we can't do anything
 
% about that.  The command has to be fully expandable, since the result
 
% winds up in the index file.  This means that if the variable's value
 
% contains other Texinfo commands, it's almost certain it will fail
 
% (although perhaps we could fix that with sufficient work to do a
 
% one-level expansion on the result, instead of complete).
 
%
 
\def\expandablevalue#1{%
  \expandafter\ifx\csname SET#1\endcsname\relax
  \expandafter\ifx\csname SET#1\endcsname\relax
    {\{No value for ``#1''\}}%
    {[No value for ``#1'']v}%
  \else
  \else
    \csname SET#1\endcsname
    \csname SET#1\endcsname
  \fi
  \fi
\endgroup}
}
 
 
% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
% with @set.
% with @set.
%
%
\def\ifset{\parsearg\ifsetxxx}
\def\ifset{\parsearg\ifsetxxx}
Line 1015... Line 1072...
 
 
% @bullet and @minus need the same treatment as @math, just above.
% @bullet and @minus need the same treatment as @math, just above.
\def\bullet{\implicitmath\ptexbullet\implicitmath}
\def\bullet{\implicitmath\ptexbullet\implicitmath}
\def\minus{\implicitmath-\implicitmath}
\def\minus{\implicitmath-\implicitmath}
 
 
\def\node{\ENVcheck\parsearg\nodezzz}
 
\def\nodezzz#1{\nodexxx [#1,]}
 
\def\nodexxx[#1,#2]{\gdef\lastnode{#1}}
 
\let\nwnode=\node
 
\let\lastnode=\relax
 
 
 
\def\donoderef{\ifx\lastnode\relax\else
 
\expandafter\expandafter\expandafter\setref{\lastnode}\fi
 
\global\let\lastnode=\relax}
 
 
 
\def\unnumbnoderef{\ifx\lastnode\relax\else
 
\expandafter\expandafter\expandafter\unnumbsetref{\lastnode}\fi
 
\global\let\lastnode=\relax}
 
 
 
\def\appendixnoderef{\ifx\lastnode\relax\else
 
\expandafter\expandafter\expandafter\appendixsetref{\lastnode}\fi
 
\global\let\lastnode=\relax}
 
 
 
% @refill is a no-op.
% @refill is a no-op.
\let\refill=\relax
\let\refill=\relax
 
 
 
% If working on a large document in chapters, it is convenient to
 
% be able to disable indexing, cross-referencing, and contents, for test runs.
 
% This is done with @novalidate (before @setfilename).
 
%
 
\newif\iflinks \linkstrue % by default we want the aux files.
 
\let\novalidate = \linksfalse
 
 
% @setfilename is done at the beginning of every texinfo file.
% @setfilename is done at the beginning of every texinfo file.
% So open here the files we need to have open while reading the input.
% So open here the files we need to have open while reading the input.
% This makes it possible to make a .fmt file for texinfo.
% This makes it possible to make a .fmt file for texinfo.
\def\setfilename{%
\def\setfilename{%
 
   \iflinks
   \readauxfile
   \readauxfile
   \opencontents
   \fi % \openindices needs to do some work in any case.
   \openindices
   \openindices
   \fixbackslash  % Turn off hack to swallow `\input texinfo'.
   \fixbackslash  % Turn off hack to swallow `\input texinfo'.
   \global\let\setfilename=\comment % Ignore extra @setfilename cmds.
   \global\let\setfilename=\comment % Ignore extra @setfilename cmds.
   %
   %
   % If texinfo.cnf is present on the system, read it.
   % If texinfo.cnf is present on the system, read it.
Line 1057... Line 1104...
   \temp
   \temp
   %
   %
   \comment % Ignore the actual filename.
   \comment % Ignore the actual filename.
}
}
 
 
 
% Called from \setfilename.
 
%
 
\def\openindices{%
 
  \newindex{cp}%
 
  \newcodeindex{fn}%
 
  \newcodeindex{vr}%
 
  \newcodeindex{tp}%
 
  \newcodeindex{ky}%
 
  \newcodeindex{pg}%
 
}
 
 
% @bye.
% @bye.
\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
 
 
% \def\macro#1{\begingroup\ignoresections\catcode`\#=6\def\macrotemp{#1}\parsearg\macroxxx}
 
% \def\macroxxx#1#2 \end macro{%
 
% \expandafter\gdef\macrotemp#1{#2}%
 
% \endgroup}
 
 
 
%\def\linemacro#1{\begingroup\ignoresections\catcode`\#=6\def\macrotemp{#1}\parsearg\linemacroxxx}
 
%\def\linemacroxxx#1#2 \end linemacro{%
 
%\let\parsearg=\relax
 
%\edef\macrotempx{\csname M\butfirst\expandafter\string\macrotemp\endcsname}%
 
%\expandafter\xdef\macrotemp{\parsearg\macrotempx}%
 
%\expandafter\gdef\macrotempx#1{#2}%
 
%\endgroup}
 
 
 
%\def\butfirst#1{}
 
 
 
 
 
\message{fonts,}
\message{fonts,}
 
 
% Font-change commands.
% Font-change commands.
 
 
% Texinfo supports the sans serif font style, which plain TeX does not.
% Texinfo sort of supports the sans serif font style, which plain TeX does not.
% So we set up a \sf analogous to plain's \rm, etc.
% So we set up a \sf analogous to plain's \rm, etc.
\newfam\sffam
\newfam\sffam
\def\sf{\fam=\sffam \tensf}
\def\sf{\fam=\sffam \tensf}
\let\li = \sf % Sometimes we call it \li, not \sf.
\let\li = \sf % Sometimes we call it \li, not \sf.
 
 
Line 1152... Line 1194...
% We actually use the slanted font rather than the italic,
% We actually use the slanted font rather than the italic,
% because texinfo normally uses the slanted fonts for that.
% because texinfo normally uses the slanted fonts for that.
% Do not make many font distinctions in general in the index, since they
% Do not make many font distinctions in general in the index, since they
% aren't very useful.
% aren't very useful.
\setfont\ninett\ttshape{9}{1000}
\setfont\ninett\ttshape{9}{1000}
 
\setfont\ninettsl\ttslshape{10}{900}
\setfont\indrm\rmshape{9}{1000}
\setfont\indrm\rmshape{9}{1000}
\setfont\indit\slshape{9}{1000}
\setfont\indit\itshape{9}{1000}
\let\indsl=\indit
\setfont\indsl\slshape{9}{1000}
\let\indtt=\ninett
\let\indtt=\ninett
\let\indttsl=\ninett
\let\indttsl=\ninettsl
\let\indsf=\indrm
\let\indsf=\indrm
\let\indbf=\indrm
\let\indbf=\indrm
\setfont\indsc\scshape{10}{900}
\setfont\indsc\scshape{10}{900}
\font\indi=cmmi9
\font\indi=cmmi9
\font\indsy=cmsy9
\font\indsy=cmsy9
Line 1303... Line 1346...
%% serif) and @ii for TeX italic
%% serif) and @ii for TeX italic
 
 
% \smartitalic{ARG} outputs arg in italics, followed by an italic correction
% \smartitalic{ARG} outputs arg in italics, followed by an italic correction
% unless the following character is such as not to need one.
% unless the following character is such as not to need one.
\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else\/\fi\fi\fi}
\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else\/\fi\fi\fi}
\def\smartitalic#1{{\sl #1}\futurelet\next\smartitalicx}
\def\smartslanted#1{{\sl #1}\futurelet\next\smartitalicx}
 
\def\smartitalic#1{{\it #1}\futurelet\next\smartitalicx}
 
 
\let\i=\smartitalic
\let\i=\smartitalic
\let\var=\smartitalic
\let\var=\smartslanted
\let\dfn=\smartitalic
\let\dfn=\smartslanted
\let\emph=\smartitalic
\let\emph=\smartitalic
\let\cite=\smartitalic
\let\cite=\smartslanted
 
 
\def\b#1{{\bf #1}}
\def\b#1{{\bf #1}}
\let\strong=\b
\let\strong=\b
 
 
% We can't just use \exhyphenpenalty, because that only has effect at
% We can't just use \exhyphenpenalty, because that only has effect at
Line 1339... Line 1383...
  \kern-.06em\raise0.4pt\hbox{\angleright}}}}
  \kern-.06em\raise0.4pt\hbox{\angleright}}}}
% The old definition, with no lozenge:
% The old definition, with no lozenge:
%\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null}
%\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null}
\def\ctrl #1{{\tt \rawbackslash \hat}#1}
\def\ctrl #1{{\tt \rawbackslash \hat}#1}
 
 
 
% @file, @option are the same as @samp.
\let\file=\samp
\let\file=\samp
 
\let\option=\samp
 
 
% @code is a modification of @t,
% @code is a modification of @t,
% which makes spaces the same size as normal in the surrounding text.
% which makes spaces the same size as normal in the surrounding text.
\def\tclose#1{%
\def\tclose#1{%
  {%
  {%
Line 1376... Line 1422...
% and arrange explicitly to hyphenate at a dash.
% and arrange explicitly to hyphenate at a dash.
%  -- rms.
%  -- rms.
{
{
\catcode`\-=\active
\catcode`\-=\active
\catcode`\_=\active
\catcode`\_=\active
\catcode`\|=\active
  %
\global\def\code{\begingroup \catcode`\-=\active \let-\codedash \catcode`\_=\active \let_\codeunder \codex}
  \global\def\code{\begingroup
% The following is used by \doprintindex to insure that long function names
    \catcode`\-=\active \let-\codedash
% wrap around.  It is necessary for - and _ to be active before the index is
    \catcode`\_=\active \let_\codeunder
% read from the file, as \entry parses the arguments long before \code is
    \codex
% ever called.  -- mycroft
 
% _ is always active; and it shouldn't be \let = to an _ that is a
 
% subscript character anyway. Then, @cindex @samp{_} (for example)
 
% fails.  --karl
 
\global\def\indexbreaks{%
 
  \catcode`\-=\active \let-\realdash
 
}
}
 
  %
 
  % If we end up with any active - characters when handling the index,
 
  % just treat them as a normal -.
 
  \global\def\indexbreaks{\catcode`\-=\active \let-\realdash}
}
}
 
 
\def\realdash{-}
\def\realdash{-}
\def\codedash{-\discretionary{}{}{}}
\def\codedash{-\discretionary{}{}{}}
\def\codeunder{\ifusingtt{\normalunderscore\discretionary{}{}{}}{\_}}
\def\codeunder{\ifusingtt{\normalunderscore\discretionary{}{}{}}{\_}}
Line 1428... Line 1472...
\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
\ifx\one\xkey\ifx\threex\three \key{#2}%
\ifx\one\xkey\ifx\threex\three \key{#2}%
\else{\tclose{\kbdfont\look}}\fi
\else{\tclose{\kbdfont\look}}\fi
\else{\tclose{\kbdfont\look}}\fi}
\else{\tclose{\kbdfont\look}}\fi}
 
 
% @url.  Quotes do not seem necessary, so use \code.
% For @url, @env, @command quotes seem unnecessary, so use \code.
\let\url=\code
\let\url=\code
 
\let\env=\code
 
\let\command=\code
 
 
% @uref (abbreviation for `urlref') takes an optional second argument
% @uref (abbreviation for `urlref') takes an optional second argument
% specifying the text to display.  First (mandatory) arg is the url.
% specifying the text to display.  First (mandatory) arg is the url.
% Perhaps eventually put in a hypertex \special here.
% Perhaps eventually put in a hypertex \special here.
%
%
Line 1458... Line 1504...
% this property, we can check that font parameter.
% this property, we can check that font parameter.
%
%
\def\ifmonospace{\ifdim\fontdimen3\font=0pt }
\def\ifmonospace{\ifdim\fontdimen3\font=0pt }
 
 
% 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
% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
% @dmn{}pt.
 
%
%
\def\dmn#1{\thinspace #1}
\def\dmn#1{\thinspace #1}
 
 
\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par}
\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par}
 
 
% @l was never documented to mean ``switch to the Lisp font'',
% @l was never documented to mean ``switch to the Lisp font'',
% and it is not used as such in any manual I can find.  We need it for
% and it is not used as such in any manual I can find.  We need it for
% Polish suppressed-l.  --karl, 22sep96.
% Polish suppressed-l.  --karl, 22sep96.
%\def\l#1{{\li #1}\null}
%\def\l#1{{\li #1}\null}
 
 
 
% Explicit font changes: @r, @sc, undocumented @ii.
\def\r#1{{\rm #1}}              % roman font
\def\r#1{{\rm #1}}              % roman font
% Use of \lowercase was suggested.
 
\def\sc#1{{\smallcaps#1}}       % smallcaps font
\def\sc#1{{\smallcaps#1}}       % smallcaps font
\def\ii#1{{\it #1}}             % italic font
\def\ii#1{{\it #1}}             % italic font
 
 
 
% @acronym downcases the argument and prints in smallcaps.
 
\def\acronym#1{{\smallcaps \lowercase{#1}}}
 
 
% @pounds{} is a sterling sign.
% @pounds{} is a sterling sign.
\def\pounds{{\it\$}}
\def\pounds{{\it\$}}
 
 
 
 
\message{page headings,}
\message{page headings,}
Line 1488... Line 1536...
 
 
% First the title page.  Must do @settitle before @titlepage.
% First the title page.  Must do @settitle before @titlepage.
\newif\ifseenauthor
\newif\ifseenauthor
\newif\iffinishedtitlepage
\newif\iffinishedtitlepage
 
 
 
% Do an implicit @contents or @shortcontents after @end titlepage if the
 
% user says @contentsaftertitlepage or @shortcontentsaftertitlepage.
 
%
 
\newif\ifsetcontentsaftertitlepage
 
 \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue
 
\newif\ifsetshortcontentsaftertitlepage
 
 \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue
 
 
\def\shorttitlepage{\parsearg\shorttitlepagezzz}
\def\shorttitlepage{\parsearg\shorttitlepagezzz}
\def\shorttitlepagezzz #1{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%
\def\shorttitlepagezzz #1{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%
        \endgroup\page\hbox{}\page}
        \endgroup\page\hbox{}\page}
 
 
\def\titlepage{\begingroup \parindent=0pt \textfonts
\def\titlepage{\begingroup \parindent=0pt \textfonts
   \let\subtitlerm=\tenrm
   \let\subtitlerm=\tenrm
% I deinstalled the following change because \cmr12 is undefined.
 
% This change was not in the ChangeLog anyway.  --rms.
 
%   \let\subtitlerm=\cmr12
 
   \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}%
   \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}%
   %
   %
   \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines}%
   \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines}%
   %
   %
   % Leave some space at the very top of the page.
   % Leave some space at the very top of the page.
Line 1545... Line 1598...
   % because the headline and footline are only empty inside the group.
   % because the headline and footline are only empty inside the group.
   % If we use the new definition of \page, we always get a blank page
   % If we use the new definition of \page, we always get a blank page
   % after the title page, which we certainly don't want.
   % after the title page, which we certainly don't want.
   \oldpage
   \oldpage
   \endgroup
   \endgroup
 
   %
 
   % If they want short, they certainly want long too.
 
   \ifsetshortcontentsaftertitlepage
 
     \shortcontents
 
     \contents
 
     \global\let\shortcontents = \relax
 
     \global\let\contents = \relax
 
   \fi
 
   %
 
   \ifsetcontentsaftertitlepage
 
     \contents
 
     \global\let\contents = \relax
 
     \global\let\shortcontents = \relax
 
   \fi
 
   %
   \HEADINGSon
   \HEADINGSon
}
}
 
 
\def\finishtitlepage{%
\def\finishtitlepage{%
   \vskip4pt \hrule height 2pt width \hsize
   \vskip4pt \hrule height 2pt width \hsize
Line 1558... Line 1626...
 
 
%%% Set up page headings and footings.
%%% Set up page headings and footings.
 
 
\let\thispage=\folio
\let\thispage=\folio
 
 
\newtoks \evenheadline    % Token sequence for heading line of even pages
\newtoks\evenheadline    % headline on even pages
\newtoks \oddheadline     % Token sequence for heading line of odd pages
\newtoks\oddheadline     % headline on odd pages
\newtoks \evenfootline    % Token sequence for footing line of even pages
\newtoks\evenfootline    % footline on even pages
\newtoks \oddfootline     % Token sequence for footing line of odd pages
\newtoks\oddfootline     % footline on odd pages
 
 
% Now make Tex use those variables
% Now make Tex use those variables
\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
                            \else \the\evenheadline \fi}}
                            \else \the\evenheadline \fi}}
\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
Line 1700... Line 1768...
\def\settitle{\parsearg\settitlezzz}
\def\settitle{\parsearg\settitlezzz}
\def\settitlezzz #1{\gdef\thistitle{#1}}
\def\settitlezzz #1{\gdef\thistitle{#1}}
 
 
 
 
\message{tables,}
\message{tables,}
 
 
% @tabs -- simple alignment
 
 
 
% These don't work.  For one thing, \+ is defined as outer.
 
% So these macros cannot even be defined.
 
 
 
%\def\tabs{\parsearg\tabszzz}
 
%\def\tabszzz #1{\settabs\+#1\cr}
 
%\def\tabline{\parsearg\tablinezzz}
 
%\def\tablinezzz #1{\+#1\cr}
 
%\def\&{&}
 
 
 
% Tables -- @table, @ftable, @vtable, @item(x), @kitem(x), @xitem(x).
% Tables -- @table, @ftable, @vtable, @item(x), @kitem(x), @xitem(x).
 
 
% default indentation of table text
% default indentation of table text
\newdimen\tableindent \tableindent=.8in
\newdimen\tableindent \tableindent=.8in
% default indentation of @itemize and @enumerate text
% default indentation of @itemize and @enumerate text
Line 1755... Line 1811...
  \advance\hsize by -\tableindent
  \advance\hsize by -\tableindent
  \setbox0=\hbox{\itemfont{#1}}%
  \setbox0=\hbox{\itemfont{#1}}%
  \itemindex{#1}%
  \itemindex{#1}%
  \nobreak % This prevents a break before @itemx.
  \nobreak % This prevents a break before @itemx.
  %
  %
  % Be sure we are not still in the middle of a paragraph.
 
  %{\parskip = 0in
 
  %\par
 
  %}%
 
  %
 
  % If the item text does not fit in the space we have, put it on a line
  % If the item text does not fit in the space we have, put it on a line
  % by itself, and do not allow a page break either before or after that
  % by itself, and do not allow a page break either before or after that
  % line.  We do not start a paragraph here because then if the next
  % line.  We do not start a paragraph here because then if the next
  % command is, e.g., @kindex, the whatsit would get put into the
  % command is, e.g., @kindex, the whatsit would get put into the
  % horizontal list on a line by itself, resulting in extra blank space.
  % horizontal list on a line by itself, resulting in extra blank space.
Line 1788... Line 1839...
    \nobreak
    \nobreak
    \endgroup
    \endgroup
    \itemxneedsnegativevskipfalse
    \itemxneedsnegativevskipfalse
  \else
  \else
    % The item text fits into the space.  Start a paragraph, so that the
    % The item text fits into the space.  Start a paragraph, so that the
    % following text (if any) will end up on the same line.  Since that
    % following text (if any) will end up on the same line.
    % text will be indented by \tableindent, we make the item text be in
 
    % a zero-width box.
 
    \noindent
    \noindent
    \rlap{\hskip -\tableindent\box0}\ignorespaces%
    % Do this with kerns and \unhbox so that if there is a footnote in
    \endgroup%
    % the item text, it can migrate to the main vertical list and
    \itemxneedsnegativevskiptrue%
    % eventually be printed.
 
    \nobreak\kern-\tableindent
 
    \dimen0 = \itemmax  \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0
 
    \unhbox0
 
    \nobreak\kern\dimen0
 
    \endgroup
 
    \itemxneedsnegativevskiptrue
  \fi
  \fi
}
}
 
 
\def\item{\errmessage{@item while not in a table}}
\def\item{\errmessage{@item while not in a table}}
\def\itemx{\errmessage{@itemx while not in a table}}
\def\itemx{\errmessage{@itemx while not in a table}}
\def\kitem{\errmessage{@kitem while not in a table}}
\def\kitem{\errmessage{@kitem while not in a table}}
\def\kitemx{\errmessage{@kitemx while not in a table}}
\def\kitemx{\errmessage{@kitemx while not in a table}}
\def\xitem{\errmessage{@xitem while not in a table}}
\def\xitem{\errmessage{@xitem while not in a table}}
\def\xitemx{\errmessage{@xitemx while not in a table}}
\def\xitemx{\errmessage{@xitemx while not in a table}}
 
 
%% Contains a kludge to get @end[description] to work
% Contains a kludge to get @end[description] to work.
\def\description{\tablez{\dontindex}{1}{}{}{}{}}
\def\description{\tablez{\dontindex}{1}{}{}{}{}}
 
 
 
% @table, @ftable, @vtable.
\def\table{\begingroup\inENV\obeylines\obeyspaces\tablex}
\def\table{\begingroup\inENV\obeylines\obeyspaces\tablex}
{\obeylines\obeyspaces%
{\obeylines\obeyspaces%
\gdef\tablex #1^^M{%
\gdef\tablex #1^^M{%
\tabley\dontindex#1        \endtabley}}
\tabley\dontindex#1        \endtabley}}
 
 
Line 1867... Line 1923...
\newcount \itemno
\newcount \itemno
 
 
\def\itemize{\parsearg\itemizezzz}
\def\itemize{\parsearg\itemizezzz}
 
 
\def\itemizezzz #1{%
\def\itemizezzz #1{%
  \begingroup % ended by the @end itemsize
  \begingroup % ended by the @end itemize
  \itemizey {#1}{\Eitemize}
  \itemizey {#1}{\Eitemize}
}
}
 
 
\def\itemizey #1#2{%
\def\itemizey #1#2{%
\aboveenvbreak %
\aboveenvbreak %
Line 2233... Line 2289...
% \fooindex ...rest of line... puts an entry in the index foo.
% \fooindex ...rest of line... puts an entry in the index foo.
% It also defines \fooindfile to be the number of the output channel for
% It also defines \fooindfile to be the number of the output channel for
% the file that accumulates this index.  The file's extension is foo.
% the file that accumulates this index.  The file's extension is foo.
% The name of an index should be no more than 2 characters long
% The name of an index should be no more than 2 characters long
% for the sake of vms.
% for the sake of vms.
 
%
\def\newindex #1{
\def\newindex#1{%
\expandafter\newwrite \csname#1indfile\endcsname% Define number for output file
  \iflinks
 
    \expandafter\newwrite \csname#1indfile\endcsname
\openout \csname#1indfile\endcsname \jobname.#1 % Open the file
\openout \csname#1indfile\endcsname \jobname.#1 % Open the file
\expandafter\xdef\csname#1index\endcsname{%     % Define \xxxindex
  \fi
 
  \expandafter\xdef\csname#1index\endcsname{%     % Define @#1index
\noexpand\doindex {#1}}
\noexpand\doindex {#1}}
}
}
 
 
% @defindex foo  ==  \newindex{foo}
% @defindex foo  ==  \newindex{foo}
 
 
\def\defindex{\parsearg\newindex}
\def\defindex{\parsearg\newindex}
 
 
% Define @defcodeindex, like @defindex except put all entries in @code.
% Define @defcodeindex, like @defindex except put all entries in @code.
 
 
\def\newcodeindex #1{
\def\newcodeindex#1{%
\expandafter\newwrite \csname#1indfile\endcsname% Define number for output file
  \iflinks
\openout \csname#1indfile\endcsname \jobname.#1 % Open the file
    \expandafter\newwrite \csname#1indfile\endcsname
\expandafter\xdef\csname#1index\endcsname{%     % Define \xxxindex
    \openout \csname#1indfile\endcsname \jobname.#1
 
  \fi
 
  \expandafter\xdef\csname#1index\endcsname{%
\noexpand\docodeindex {#1}}
\noexpand\docodeindex {#1}}
}
}
 
 
\def\defcodeindex{\parsearg\newcodeindex}
\def\defcodeindex{\parsearg\newcodeindex}
 
 
% @synindex foo bar    makes index foo feed into index bar.
% @synindex foo bar    makes index foo feed into index bar.
% Do this instead of @defindex foo if you don't want it as a separate index.
% Do this instead of @defindex foo if you don't want it as a separate index.
 
% The \closeout helps reduce unnecessary open files; the limit on the
 
% Acorn RISC OS is a mere 16 files.
\def\synindex #1 #2 {%
\def\synindex #1 #2 {%
\expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname
\expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname
 
  \expandafter\closeout\csname#1indfile\endcsname
\expandafter\let\csname#1indfile\endcsname=\synindexfoo
\expandafter\let\csname#1indfile\endcsname=\synindexfoo
\expandafter\xdef\csname#1index\endcsname{%     % Define \xxxindex
  \expandafter\xdef\csname#1index\endcsname{% define \xxxindex
\noexpand\doindex {#2}}%
\noexpand\doindex {#2}}%
}
}
 
 
% @syncodeindex foo bar   similar, but put all entries made for index foo
% @syncodeindex foo bar   similar, but put all entries made for index foo
% inside @code.
% inside @code.
\def\syncodeindex #1 #2 {%
\def\syncodeindex #1 #2 {%
\expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname
\expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname
 
  \expandafter\closeout\csname#1indfile\endcsname
\expandafter\let\csname#1indfile\endcsname=\synindexfoo
\expandafter\let\csname#1indfile\endcsname=\synindexfoo
\expandafter\xdef\csname#1index\endcsname{%     % Define \xxxindex
  \expandafter\xdef\csname#1index\endcsname{% define \xxxindex
\noexpand\docodeindex {#2}}%
\noexpand\docodeindex {#2}}%
}
}
 
 
% Define \doindex, the driver for all \fooindex macros.
% Define \doindex, the driver for all \fooindex macros.
% Argument #1 is generated by the calling \fooindex macro,
% Argument #1 is generated by the calling \fooindex macro,
Line 2292... Line 2356...
% like the previous two, but they put @code around the argument.
% like the previous two, but they put @code around the argument.
\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}
\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}
\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
 
 
\def\indexdummies{%
\def\indexdummies{%
 
\def\ { }%
% Take care of the plain tex accent commands.
% Take care of the plain tex accent commands.
\def\"{\realbackslash "}%
\def\"{\realbackslash "}%
\def\`{\realbackslash `}%
\def\`{\realbackslash `}%
\def\'{\realbackslash '}%
\def\'{\realbackslash '}%
\def\^{\realbackslash ^}%
\def\^{\realbackslash ^}%
Line 2333... Line 2398...
\def\sf{\realbackslash sf}%
\def\sf{\realbackslash sf}%
\def\tt{\realbackslash tt}%
\def\tt{\realbackslash tt}%
\def\gtr{\realbackslash gtr}%
\def\gtr{\realbackslash gtr}%
\def\less{\realbackslash less}%
\def\less{\realbackslash less}%
\def\hat{\realbackslash hat}%
\def\hat{\realbackslash hat}%
%\def\char{\realbackslash char}%
 
\def\TeX{\realbackslash TeX}%
\def\TeX{\realbackslash TeX}%
\def\dots{\realbackslash dots }%
\def\dots{\realbackslash dots }%
\def\result{\realbackslash result}%
\def\result{\realbackslash result}%
\def\equiv{\realbackslash equiv}%
\def\equiv{\realbackslash equiv}%
\def\expansion{\realbackslash expansion}%
\def\expansion{\realbackslash expansion}%
Line 2360... Line 2424...
\def\file##1{\realbackslash file {##1}}%
\def\file##1{\realbackslash file {##1}}%
\def\var##1{\realbackslash var {##1}}%
\def\var##1{\realbackslash var {##1}}%
\def\kbd##1{\realbackslash kbd {##1}}%
\def\kbd##1{\realbackslash kbd {##1}}%
\def\dfn##1{\realbackslash dfn {##1}}%
\def\dfn##1{\realbackslash dfn {##1}}%
\def\emph##1{\realbackslash emph {##1}}%
\def\emph##1{\realbackslash emph {##1}}%
\def\value##1{\realbackslash value {##1}}%
%
 
% Handle some cases of @value -- where the variable name does not
 
% contain - or _, and the value does not contain any
 
% (non-fully-expandable) commands.
 
\let\value = \expandablevalue
 
%
\unsepspaces
\unsepspaces
}
}
 
 
% If an index command is used in an @example environment, any spaces
% If an index command is used in an @example environment, any spaces
% therein should become regular spaces in the raw index file, not the
% therein should become regular spaces in the raw index file, not the
Line 2436... Line 2505...
 
 
{\catcode`\@=0 \catcode`\\=\other
{\catcode`\@=0 \catcode`\\=\other
@gdef@realbackslash{\}}
@gdef@realbackslash{\}}
 
 
\let\indexbackslash=0  %overridden during \printindex.
\let\indexbackslash=0  %overridden during \printindex.
 
\let\SETmarginindex=\relax % put index entries in margin (undocumented)?
 
 
 
% For \ifx comparisons.
 
\def\emptymacro{\empty}
 
 
\let\SETmarginindex=\relax %initialize!
% Most index entries go through here, but \dosubind is the general case.
% workhorse for all \fooindexes
%
% #1 is name of index, #2 is stuff to put there
\def\doind#1#2{\dosubind{#1}{#2}\empty}
\def\doind #1#2{%
 
 
% Workhorse for all \fooindexes.
 
% #1 is name of index, #2 is stuff to put there, #3 is subentry --
 
% \empty if called from \doind, as we usually are.  The main exception
 
% is with defuns, which call us directly.
 
%
 
\def\dosubind#1#2#3{%
  % Put the index entry in the margin if desired.
  % Put the index entry in the margin if desired.
  \ifx\SETmarginindex\relax\else
  \ifx\SETmarginindex\relax\else
    \insert\margin{\hbox{\vrule height8pt depth3pt width0pt #2}}%
    \insert\margin{\hbox{\vrule height8pt depth3pt width0pt #2}}%
  \fi
  \fi
  {%
  {%
Line 2455... Line 2534...
      {%
      {%
        \let\folio=0% We will expand all macros now EXCEPT \folio.
        \let\folio=0% We will expand all macros now EXCEPT \folio.
        \def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now
        \def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now
        % so it will be output as is; and it will print as backslash.
        % so it will be output as is; and it will print as backslash.
        %
        %
 
        \def\thirdarg{#3}%
 
        %
 
        % If third arg is present, precede it with space in sort key.
 
        \ifx\thirdarg\emptymacro
 
          \let\subentry = \empty
 
        \else
 
          \def\subentry{ #3}%
 
        \fi
 
        %
        % First process the index-string with all font commands turned off
        % First process the index-string with all font commands turned off
        % to get the string to sort by.
        % to get the string to sort by.
        {\indexnofonts \xdef\indexsorttmp{#2}}%
        {\indexnofonts \xdef\indexsorttmp{#2\subentry}}%
        %
        %
        % Now produce the complete index entry, with both the sort key and the
        % Now produce the complete index entry, with both the sort key and the
        % original text, including any font commands.
        % original text, including any font commands.
        \toks0 = {#2}%
        \toks0 = {#2}%
        \edef\temp{%
        \edef\temp{%
          \write\csname#1indfile\endcsname{%
          \write\csname#1indfile\endcsname{%
            \realbackslash entry{\indexsorttmp}{\folio}{\the\toks0}}%
            \realbackslash entry{\indexsorttmp}{\folio}{\the\toks0}}%
        }%
        }%
        \temp
        %
 
        % If third (subentry) arg is present, add it to the index string.
 
        \ifx\thirdarg\emptymacro \else
 
          \toks0 = {#3}%
 
          \edef\temp{\temp{\the\toks0}}%
 
        \fi
 
        %
 
        % If a skip is the last thing on the list now, preserve it
 
        % by backing up by \lastskip, doing the \write, then inserting
 
        % the skip again.  Otherwise, the whatsit generated by the
 
        % \write will make \lastskip zero.  The result is that sequences
 
        % like this:
 
        % @end defun
 
        % @tindex whatever
 
        % @defun ...
 
        % will have extra space inserted, because the \medbreak in the
 
        % start of the @defun won't see the skip inserted by the @end of
 
        % the previous defun.
 
        %
 
        % But don't do any of this if we're not in vertical mode.  We
 
        % don't want to do a \vskip and prematurely end a paragraph.
 
        %
 
        % Avoid page breaks due to these extra skips, too.
 
        %
 
        \iflinks
 
          \ifvmode
 
            \skip0 = \lastskip
 
            \ifdim\lastskip = 0pt \else \nobreak\vskip-\lastskip \fi
 
          \fi
 
          %
 
          \temp % do the write
 
          %
 
          %
 
          \ifvmode \ifdim\skip0 = 0pt \else \nobreak\vskip\skip0 \fi \fi
 
        \fi
      }%
      }%
    }%
    }%
    \penalty\count255
    \penalty\count255
  }%
  }%
}
}
 
 
\def\dosubind #1#2#3{%
 
{\count10=\lastpenalty %
 
{\indexdummies % Must do this here, since \bf, etc expand at this stage
 
\escapechar=`\\%
 
{\let\folio=0%
 
\def\rawbackslashxx{\indexbackslash}%
 
%
 
% Now process the index-string once, with all font commands turned off,
 
% to get the string to sort the index by.
 
{\indexnofonts
 
\xdef\temp1{#2 #3}%
 
}%
 
% Now produce the complete index entry.  We process the index-string again,
 
% this time with font commands expanded, to get what to print in the index.
 
\edef\temp{%
 
\write \csname#1indfile\endcsname{%
 
\realbackslash entry {\temp1}{\folio}{#2}{#3}}}%
 
\temp }%
 
}\penalty\count10}}
 
 
 
% The index entry written in the file actually looks like
% The index entry written in the file actually looks like
%  \entry {sortstring}{page}{topic}
%  \entry {sortstring}{page}{topic}
% or
% or
%  \entry {sortstring}{page}{topic}{subtopic}
%  \entry {sortstring}{page}{topic}{subtopic}
% The texindex program reads in these files and writes files
% The texindex program reads in these files and writes files
Line 2575... Line 2677...
\endgroup}
\endgroup}
 
 
% These macros are used by the sorted index file itself.
% These macros are used by the sorted index file itself.
% Change them to control the appearance of the index.
% Change them to control the appearance of the index.
 
 
% Same as \bigskipamount except no shrink.
\def\initial#1{{%
% \balancecolumns gets confused if there is any shrink.
  % Some minor font changes for the special characters.
\newskip\initialskipamount \initialskipamount 12pt plus4pt
  \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt
 
  %
\def\initial #1{%
  % Remove any glue we may have, we'll be inserting our own.
{\let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt
  \removelastskip
\ifdim\lastskip<\initialskipamount
  %
\removelastskip \penalty-200 \vskip \initialskipamount\fi
  % We like breaks before the index initials, so insert a bonus.
\line{\secbf#1\hfill}\kern 2pt\penalty10000}}
  \penalty -300
 
  %
 
  % Typeset the initial.  Making this add up to a whole number of
 
  % baselineskips increases the chance of the dots lining up from column
 
  % to column.  It still won't often be perfect, because of the stretch
 
  % we need before each entry, but it's better.
 
  %
 
  % No shrink because it confuses \balancecolumns.
 
  \vskip 1.67\baselineskip plus .5\baselineskip
 
  \leftline{\secbf #1}%
 
  \vskip .33\baselineskip plus .1\baselineskip
 
  %
 
  % Do our best not to break after the initial.
 
  \nobreak
 
}}
 
 
% This typesets a paragraph consisting of #1, dot leaders, and then #2
% This typesets a paragraph consisting of #1, dot leaders, and then #2
% flush to the right margin.  It is used for index and table of contents
% flush to the right margin.  It is used for index and table of contents
% entries.  The paragraph is indented by \leftskip.
% entries.  The paragraph is indented by \leftskip.
%
%
Line 2618... Line 2734...
  %
  %
  % When the entry text needs to be broken, just fill out the first line
  % When the entry text needs to be broken, just fill out the first line
  % with blank space.
  % with blank space.
  \rightskip = 0pt plus1fil
  \rightskip = 0pt plus1fil
  %
  %
 
  % A bit of stretch before each entry for the benefit of balancing columns.
 
  \vskip 0pt plus1pt
 
  %
  % Start a ``paragraph'' for the index entry so the line breaking
  % Start a ``paragraph'' for the index entry so the line breaking
  % parameters we've set above will have an effect.
  % parameters we've set above will have an effect.
  \noindent
  \noindent
  %
  %
  % Insert the text of the index entry.  TeX will do line-breaking on it.
  % Insert the text of the index entry.  TeX will do line-breaking on it.
Line 2716... Line 2835...
    \divide\doublecolumnhsize by 2
    \divide\doublecolumnhsize by 2
  \hsize = \doublecolumnhsize
  \hsize = \doublecolumnhsize
  %
  %
  % Double the \vsize as well.  (We don't need a separate register here,
  % Double the \vsize as well.  (We don't need a separate register here,
  % since nobody clobbers \vsize.)
  % since nobody clobbers \vsize.)
 
  \advance\vsize by -\ht\partialpage
  \vsize = 2\vsize
  \vsize = 2\vsize
}
}
 
 
 
% The double-column output routine for all double-column pages except
 
% the last.
 
%
\def\doublecolumnout{%
\def\doublecolumnout{%
  \splittopskip=\topskip \splitmaxdepth=\maxdepth
  \splittopskip=\topskip \splitmaxdepth=\maxdepth
  % Get the available space for the double columns -- the normal
  % Get the available space for the double columns -- the normal
  % (undoubled) page height minus any material left over from the
  % (undoubled) page height minus any material left over from the
  % previous page.
  % previous page.
  \dimen@=\pageheight \advance\dimen@ by-\ht\partialpage
  \dimen@ = \vsize
 
  \divide\dimen@ by 2
 
  %
  % box0 will be the left-hand column, box2 the right.
  % box0 will be the left-hand column, box2 the right.
  \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
  \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
  \onepageout\pagesofar
  \onepageout\pagesofar
  \unvbox255
  \unvbox255
  \penalty\outputpenalty
  \penalty\outputpenalty
}
}
\def\pagesofar{%
\def\pagesofar{%
  % Re-output the contents of the output page -- any previous material,
  % Re-output the contents of the output page -- any previous material,
  % followed by the two boxes we just split.
  % followed by the two boxes we just split, in box0 and box2.
 
  \advance\vsize by \ht\partialpage
  \unvbox\partialpage
  \unvbox\partialpage
 
  %
  \hsize = \doublecolumnhsize
  \hsize = \doublecolumnhsize
  \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}%
  \wd0=\hsize \wd2=\hsize
 
  \hbox to\pagewidth{\box0\hfil\box2}%
}
}
\def\enddoublecolumns{%
\def\enddoublecolumns{%
  \output = {\balancecolumns}\eject % split what we have
  \output = {%
  \endgroup % started in \begindoublecolumns
    % Split the last of the double-column material.  Leave on the
  %
    % current page, no automatic page break.
  % Back to normal single-column typesetting, but take account of the
    \balancecolumns
  % fact that we just accumulated some stuff on the output page.
    %
 
    % If we end up splitting too much material for the current page,
 
    % though, there will be another page break right after this \output
 
    % invocation ends.  Having called \balancecolumns once, we do not
 
    % want to call it again.  Therefore, reset \output to its normal
 
    % definition right away.  (We hope \balancecolumns will never be
 
    % called on to balance too much material, but if it is, this makes
 
    % the output somewhat more palatable.)
 
    \global\output = {\onepageout{\pagecontents\PAGE}}%
 
    %
 
    % \pagegoal was set to the doubled \vsize above, since we restarted
 
    % the current page.  We're now back to normal single-column
 
    % typesetting, so reset \pagegoal to the normal \vsize.
  \pagegoal = \vsize
  \pagegoal = \vsize
 
  }%
 
  \eject
 
  \endgroup % started in \begindoublecolumns
}
}
\def\balancecolumns{%
\def\balancecolumns{%
  % Called at the end of the double column material.
  % Called at the end of the double column material.
  \setbox0 = \vbox{\unvbox255}%
  \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120.
  \dimen@ = \ht0
  \dimen@ = \ht0
  \advance\dimen@ by \topskip
  \advance\dimen@ by \topskip
  \advance\dimen@ by-\baselineskip
  \advance\dimen@ by-\baselineskip
  \divide\dimen@ by 2
  \divide\dimen@ by 2 % target to split to
 
  %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}%
  \splittopskip = \topskip
  \splittopskip = \topskip
  % Loop until we get a decent breakpoint.
  % Loop until we get a decent breakpoint.
  {\vbadness=10000 \loop
  {%
 
    \vbadness = 10000
 
    \loop
    \global\setbox3=\copy0
    \global\setbox3=\copy0
    \global\setbox1=\vsplit3 to\dimen@
    \global\setbox1=\vsplit3 to\dimen@
    \ifdim\ht3>\dimen@ \global\advance\dimen@ by1pt
    \ifdim\ht3>\dimen@
   \repeat}%
      \global\advance\dimen@ by 1pt
 
    \repeat
 
  }%
 
  %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}%
  \setbox0=\vbox to\dimen@{\unvbox1}%
  \setbox0=\vbox to\dimen@{\unvbox1}%
  \setbox2=\vbox to\dimen@{\unvbox3}%
  \setbox2=\vbox to\dimen@{\unvbox3}%
 
  %
  \pagesofar
  \pagesofar
}
}
\catcode`\@ = \other
\catcode`\@ = \other
 
 
 
 
Line 2778... Line 2929...
 
 
% This counter is funny since it counts through charcodes of letters A, B, ...
% This counter is funny since it counts through charcodes of letters A, B, ...
\newcount\appendixno  \appendixno = `\@
\newcount\appendixno  \appendixno = `\@
\def\appendixletter{\char\the\appendixno}
\def\appendixletter{\char\the\appendixno}
 
 
\newwrite\contentsfile
 
% This is called from \setfilename.
 
\def\opencontents{\openout\contentsfile = \jobname.toc }
 
 
 
% Each @chapter defines this as the name of the chapter.
% Each @chapter defines this as the name of the chapter.
% page headings and footings can use it.  @section does likewise
% page headings and footings can use it.  @section does likewise.
 
\def\thischapter{}
\def\thischapter{} \def\thissection{}
\def\thissection{}
\def\seccheck#1{\ifnum \pageno<0
 
  \errmessage{@#1 not allowed after generating table of contents}%
 
\fi}
 
 
 
\def\chapternofonts{%
 
  \let\rawbackslash=\relax
 
  \let\frenchspacing=\relax
 
  \def\result{\realbackslash result}%
 
  \def\equiv{\realbackslash equiv}%
 
  \def\expansion{\realbackslash expansion}%
 
  \def\print{\realbackslash print}%
 
  \def\TeX{\realbackslash TeX}%
 
  \def\dots{\realbackslash dots}%
 
  \def\result{\realbackslash result}%
 
  \def\equiv{\realbackslash equiv}%
 
  \def\expansion{\realbackslash expansion}%
 
  \def\print{\realbackslash print}%
 
  \def\error{\realbackslash error}%
 
  \def\point{\realbackslash point}%
 
  \def\copyright{\realbackslash copyright}%
 
  \def\tt{\realbackslash tt}%
 
  \def\bf{\realbackslash bf}%
 
  \def\w{\realbackslash w}%
 
  \def\less{\realbackslash less}%
 
  \def\gtr{\realbackslash gtr}%
 
  \def\hat{\realbackslash hat}%
 
  \def\char{\realbackslash char}%
 
  \def\tclose##1{\realbackslash tclose{##1}}%
 
  \def\code##1{\realbackslash code{##1}}%
 
  \def\samp##1{\realbackslash samp{##1}}%
 
  \def\r##1{\realbackslash r{##1}}%
 
  \def\b##1{\realbackslash b{##1}}%
 
  \def\key##1{\realbackslash key{##1}}%
 
  \def\file##1{\realbackslash file{##1}}%
 
  \def\kbd##1{\realbackslash kbd{##1}}%
 
  % These are redefined because @smartitalic wouldn't work inside xdef.
 
  \def\i##1{\realbackslash i{##1}}%
 
  \def\cite##1{\realbackslash cite{##1}}%
 
  \def\var##1{\realbackslash var{##1}}%
 
  \def\emph##1{\realbackslash emph{##1}}%
 
  \def\dfn##1{\realbackslash dfn{##1}}%
 
}
 
 
 
\newcount\absseclevel % used to calculate proper heading level
\newcount\absseclevel % used to calculate proper heading level
\newcount\secbase\secbase=0 % @raise/lowersections modify this count
\newcount\secbase\secbase=0 % @raise/lowersections modify this count
 
 
% @raisesections: treat @section as chapter, @subsection as section, etc.
% @raisesections: treat @section as chapter, @subsection as section, etc.
Line 2899... Line 3004...
    \unnumberedsubsubseczzz{#2}
    \unnumberedsubsubseczzz{#2}
  \fi
  \fi
\fi
\fi
}
}
 
 
 
% @chapter, @appendix, @unnumbered.
\def\thischaptername{No Chapter Title}
\def\thischaptername{No Chapter Title}
\outer\def\chapter{\parsearg\chapteryyy}
\outer\def\chapter{\parsearg\chapteryyy}
\def\chapteryyy #1{\numhead0{#1}} % normally numhead0 calls chapterzzz
\def\chapteryyy #1{\numhead0{#1}} % normally numhead0 calls chapterzzz
\def\chapterzzz #1{\seccheck{chapter}%
\def\chapterzzz #1{%
\secno=0 \subsecno=0 \subsubsecno=0
\secno=0 \subsecno=0 \subsubsecno=0
\global\advance \chapno by 1 \message{\putwordChapter \the\chapno}%
\global\advance \chapno by 1 \message{\putwordChapter\space \the\chapno}%
\chapmacro {#1}{\the\chapno}%
\chapmacro {#1}{\the\chapno}%
\gdef\thissection{#1}%
\gdef\thissection{#1}%
\gdef\thischaptername{#1}%
\gdef\thischaptername{#1}%
% We don't substitute the actual chapter name into \thischapter
% We don't substitute the actual chapter name into \thischapter
% because we don't want its macros evaluated now.
% because we don't want its macros evaluated now.
\xdef\thischapter{\putwordChapter{} \the\chapno: \noexpand\thischaptername}%
\xdef\thischapter{\putwordChapter{} \the\chapno: \noexpand\thischaptername}%
{\chapternofonts%
 
\toks0 = {#1}%
\toks0 = {#1}%
\edef\temp{{\realbackslash chapentry{\the\toks0}{\the\chapno}{\noexpand\folio}}}%
\edef\temp{\noexpand\writetocentry{\realbackslash chapentry{\the\toks0}%
\escapechar=`\\%
                                  {\the\chapno}}}%
\write \contentsfile \temp  %
\temp
\donoderef %
\donoderef
\global\let\section = \numberedsec
\global\let\section = \numberedsec
\global\let\subsection = \numberedsubsec
\global\let\subsection = \numberedsubsec
\global\let\subsubsection = \numberedsubsubsec
\global\let\subsubsection = \numberedsubsubsec
}}
}
 
 
\outer\def\appendix{\parsearg\appendixyyy}
\outer\def\appendix{\parsearg\appendixyyy}
\def\appendixyyy #1{\apphead0{#1}} % normally apphead0 calls appendixzzz
\def\appendixyyy #1{\apphead0{#1}} % normally apphead0 calls appendixzzz
\def\appendixzzz #1{\seccheck{appendix}%
\def\appendixzzz #1{%
\secno=0 \subsecno=0 \subsubsecno=0
\secno=0 \subsecno=0 \subsubsecno=0
\global\advance \appendixno by 1 \message{Appendix \appendixletter}%
\global\advance \appendixno by 1
 
\message{\putwordAppendix\space \appendixletter}%
\chapmacro {#1}{\putwordAppendix{} \appendixletter}%
\chapmacro {#1}{\putwordAppendix{} \appendixletter}%
\gdef\thissection{#1}%
\gdef\thissection{#1}%
\gdef\thischaptername{#1}%
\gdef\thischaptername{#1}%
\xdef\thischapter{\putwordAppendix{} \appendixletter: \noexpand\thischaptername}%
\xdef\thischapter{\putwordAppendix{} \appendixletter: \noexpand\thischaptername}%
{\chapternofonts%
 
\toks0 = {#1}%
\toks0 = {#1}%
\edef\temp{{\realbackslash chapentry{\the\toks0}%
\edef\temp{\noexpand\writetocentry{\realbackslash chapentry{\the\toks0}%
  {\putwordAppendix{} \appendixletter}{\noexpand\folio}}}%
                       {\putwordAppendix{} \appendixletter}}}%
\escapechar=`\\%
\temp
\write \contentsfile \temp  %
\appendixnoderef
\appendixnoderef %
 
\global\let\section = \appendixsec
\global\let\section = \appendixsec
\global\let\subsection = \appendixsubsec
\global\let\subsection = \appendixsubsec
\global\let\subsubsection = \appendixsubsubsec
\global\let\subsubsection = \appendixsubsubsec
}}
}
 
 
% @centerchap is like @unnumbered, but the heading is centered.
% @centerchap is like @unnumbered, but the heading is centered.
\outer\def\centerchap{\parsearg\centerchapyyy}
\outer\def\centerchap{\parsearg\centerchapyyy}
\def\centerchapyyy #1{{\let\unnumbchapmacro=\centerchapmacro \unnumberedyyy{#1}}}
\def\centerchapyyy #1{{\let\unnumbchapmacro=\centerchapmacro \unnumberedyyy{#1}}}
 
 
 
% @top is like @unnumbered.
\outer\def\top{\parsearg\unnumberedyyy}
\outer\def\top{\parsearg\unnumberedyyy}
 
 
\outer\def\unnumbered{\parsearg\unnumberedyyy}
\outer\def\unnumbered{\parsearg\unnumberedyyy}
\def\unnumberedyyy #1{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz
\def\unnumberedyyy #1{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz
\def\unnumberedzzz #1{\seccheck{unnumbered}%
\def\unnumberedzzz #1{%
\secno=0 \subsecno=0 \subsubsecno=0
\secno=0 \subsecno=0 \subsubsecno=0
%
%
% This used to be simply \message{#1}, but TeX fully expands the
% This used to be simply \message{#1}, but TeX fully expands the
% argument to \message.  Therefore, if #1 contained @-commands, TeX
% argument to \message.  Therefore, if #1 contained @-commands, TeX
% expanded them.  For example, in `@unnumbered The @cite{Book}', TeX
% expanded them.  For example, in `@unnumbered The @cite{Book}', TeX
Line 2963... Line 3068...
% to be executed, not expanded).
% to be executed, not expanded).
%
%
% Anyway, we don't want the fully-expanded definition of @cite to appear
% Anyway, we don't want the fully-expanded definition of @cite to appear
% as a result of the \message, we just want `@cite' itself.  We use
% as a result of the \message, we just want `@cite' itself.  We use
% \the<toks register> to achieve this: TeX expands \the<toks> only once,
% \the<toks register> to achieve this: TeX expands \the<toks> only once,
% simply yielding the contents of the <toks register>.
% simply yielding the contents of <toks register>.  (We also do this for
 
% the toc entries.)
\toks0 = {#1}\message{(\the\toks0)}%
\toks0 = {#1}\message{(\the\toks0)}%
%
%
\unnumbchapmacro {#1}%
\unnumbchapmacro {#1}%
\gdef\thischapter{#1}\gdef\thissection{#1}%
\gdef\thischapter{#1}\gdef\thissection{#1}%
{\chapternofonts%
 
\toks0 = {#1}%
\toks0 = {#1}%
\edef\temp{{\realbackslash unnumbchapentry{\the\toks0}{\noexpand\folio}}}%
\edef\temp{\noexpand\writetocentry{\realbackslash unnumbchapentry{\the\toks0}}}%
\escapechar=`\\%
\temp
\write \contentsfile \temp  %
\unnumbnoderef
\unnumbnoderef %
 
\global\let\section = \unnumberedsec
\global\let\section = \unnumberedsec
\global\let\subsection = \unnumberedsubsec
\global\let\subsection = \unnumberedsubsec
\global\let\subsubsection = \unnumberedsubsubsec
\global\let\subsubsection = \unnumberedsubsubsec
}}
}
 
 
 
% Sections.
\outer\def\numberedsec{\parsearg\secyyy}
\outer\def\numberedsec{\parsearg\secyyy}
\def\secyyy #1{\numhead1{#1}} % normally calls seczzz
\def\secyyy #1{\numhead1{#1}} % normally calls seczzz
\def\seczzz #1{\seccheck{section}%
\def\seczzz #1{%
\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
\gdef\thissection{#1}\secheading {#1}{\the\chapno}{\the\secno}%
\gdef\thissection{#1}\secheading {#1}{\the\chapno}{\the\secno}%
{\chapternofonts%
 
\toks0 = {#1}%
\toks0 = {#1}%
\edef\temp{{\realbackslash secentry %
\edef\temp{\noexpand\writetocentry{\realbackslash secentry{\the\toks0}%
{\the\toks0}{\the\chapno}{\the\secno}{\noexpand\folio}}}%
                                  {\the\chapno}{\the\secno}}}%
\escapechar=`\\%
\temp
\write \contentsfile \temp %
\donoderef
\donoderef %
\nobreak
\penalty 10000 %
}
}}
 
 
 
\outer\def\appendixsection{\parsearg\appendixsecyyy}
\outer\def\appendixsection{\parsearg\appendixsecyyy}
\outer\def\appendixsec{\parsearg\appendixsecyyy}
\outer\def\appendixsec{\parsearg\appendixsecyyy}
\def\appendixsecyyy #1{\apphead1{#1}} % normally calls appendixsectionzzz
\def\appendixsecyyy #1{\apphead1{#1}} % normally calls appendixsectionzzz
\def\appendixsectionzzz #1{\seccheck{appendixsection}%
\def\appendixsectionzzz #1{%
\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
\gdef\thissection{#1}\secheading {#1}{\appendixletter}{\the\secno}%
\gdef\thissection{#1}\secheading {#1}{\appendixletter}{\the\secno}%
{\chapternofonts%
 
\toks0 = {#1}%
\toks0 = {#1}%
\edef\temp{{\realbackslash secentry %
\edef\temp{\noexpand\writetocentry{\realbackslash secentry{\the\toks0}%
{\the\toks0}{\appendixletter}{\the\secno}{\noexpand\folio}}}%
                                  {\appendixletter}{\the\secno}}}%
\escapechar=`\\%
\temp
\write \contentsfile \temp %
\appendixnoderef
\appendixnoderef %
\nobreak
\penalty 10000 %
}
}}
 
 
 
\outer\def\unnumberedsec{\parsearg\unnumberedsecyyy}
\outer\def\unnumberedsec{\parsearg\unnumberedsecyyy}
\def\unnumberedsecyyy #1{\unnmhead1{#1}} % normally calls unnumberedseczzz
\def\unnumberedsecyyy #1{\unnmhead1{#1}} % normally calls unnumberedseczzz
\def\unnumberedseczzz #1{\seccheck{unnumberedsec}%
\def\unnumberedseczzz #1{%
\plainsecheading {#1}\gdef\thissection{#1}%
\plainsecheading {#1}\gdef\thissection{#1}%
{\chapternofonts%
 
\toks0 = {#1}%
\toks0 = {#1}%
\edef\temp{{\realbackslash unnumbsecentry{\the\toks0}{\noexpand\folio}}}%
\edef\temp{\noexpand\writetocentry{\realbackslash unnumbsecentry{\the\toks0}}}%
\escapechar=`\\%
\temp
\write \contentsfile \temp %
\unnumbnoderef
\unnumbnoderef %
\nobreak
\penalty 10000 %
}
}}
 
 
 
 
% Subsections.
\outer\def\numberedsubsec{\parsearg\numberedsubsecyyy}
\outer\def\numberedsubsec{\parsearg\numberedsubsecyyy}
\def\numberedsubsecyyy #1{\numhead2{#1}} % normally calls numberedsubseczzz
\def\numberedsubsecyyy #1{\numhead2{#1}} % normally calls numberedsubseczzz
\def\numberedsubseczzz #1{\seccheck{subsection}%
\def\numberedsubseczzz #1{%
\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
\subsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}%
\subsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}%
{\chapternofonts%
 
\toks0 = {#1}%
\toks0 = {#1}%
\edef\temp{{\realbackslash subsecentry %
\edef\temp{\noexpand\writetocentry{\realbackslash subsecentry{\the\toks0}%
{\the\toks0}{\the\chapno}{\the\secno}{\the\subsecno}{\noexpand\folio}}}%
                                    {\the\chapno}{\the\secno}{\the\subsecno}}}%
\escapechar=`\\%
\temp
\write \contentsfile \temp %
\donoderef
\donoderef %
\nobreak
\penalty 10000 %
}
}}
 
 
 
\outer\def\appendixsubsec{\parsearg\appendixsubsecyyy}
\outer\def\appendixsubsec{\parsearg\appendixsubsecyyy}
\def\appendixsubsecyyy #1{\apphead2{#1}} % normally calls appendixsubseczzz
\def\appendixsubsecyyy #1{\apphead2{#1}} % normally calls appendixsubseczzz
\def\appendixsubseczzz #1{\seccheck{appendixsubsec}%
\def\appendixsubseczzz #1{%
\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
\subsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}%
\subsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}%
{\chapternofonts%
 
\toks0 = {#1}%
\toks0 = {#1}%
\edef\temp{{\realbackslash subsecentry %
\edef\temp{\noexpand\writetocentry{\realbackslash subsecentry{\the\toks0}%
{\the\toks0}{\appendixletter}{\the\secno}{\the\subsecno}{\noexpand\folio}}}%
                                {\appendixletter}{\the\secno}{\the\subsecno}}}%
\escapechar=`\\%
\temp
\write \contentsfile \temp %
\appendixnoderef
\appendixnoderef %
\nobreak
\penalty 10000 %
}
}}
 
 
 
\outer\def\unnumberedsubsec{\parsearg\unnumberedsubsecyyy}
\outer\def\unnumberedsubsec{\parsearg\unnumberedsubsecyyy}
\def\unnumberedsubsecyyy #1{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
\def\unnumberedsubsecyyy #1{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
\def\unnumberedsubseczzz #1{\seccheck{unnumberedsubsec}%
\def\unnumberedsubseczzz #1{%
\plainsubsecheading {#1}\gdef\thissection{#1}%
\plainsubsecheading {#1}\gdef\thissection{#1}%
{\chapternofonts%
 
\toks0 = {#1}%
\toks0 = {#1}%
\edef\temp{{\realbackslash unnumbsubsecentry{\the\toks0}{\noexpand\folio}}}%
\edef\temp{\noexpand\writetocentry{\realbackslash unnumbsubsecentry%
\escapechar=`\\%
                                    {\the\toks0}}}%
\write \contentsfile \temp %
\temp
\unnumbnoderef %
\unnumbnoderef
\penalty 10000 %
\nobreak
}}
}
 
 
 
% Subsubsections.
\outer\def\numberedsubsubsec{\parsearg\numberedsubsubsecyyy}
\outer\def\numberedsubsubsec{\parsearg\numberedsubsubsecyyy}
\def\numberedsubsubsecyyy #1{\numhead3{#1}} % normally numberedsubsubseczzz
\def\numberedsubsubsecyyy #1{\numhead3{#1}} % normally numberedsubsubseczzz
\def\numberedsubsubseczzz #1{\seccheck{subsubsection}%
\def\numberedsubsubseczzz #1{%
\gdef\thissection{#1}\global\advance \subsubsecno by 1 %
\gdef\thissection{#1}\global\advance \subsubsecno by 1 %
\subsubsecheading {#1}
\subsubsecheading {#1}
  {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
  {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
{\chapternofonts%
 
\toks0 = {#1}%
\toks0 = {#1}%
\edef\temp{{\realbackslash subsubsecentry{\the\toks0}
\edef\temp{\noexpand\writetocentry{\realbackslash subsubsecentry{\the\toks0}%
  {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}
  {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}}}%
  {\noexpand\folio}}}%
\temp
\escapechar=`\\%
\donoderef
\write \contentsfile \temp %
\nobreak
\donoderef %
}
\penalty 10000 %
 
}}
 
 
 
\outer\def\appendixsubsubsec{\parsearg\appendixsubsubsecyyy}
\outer\def\appendixsubsubsec{\parsearg\appendixsubsubsecyyy}
\def\appendixsubsubsecyyy #1{\apphead3{#1}} % normally appendixsubsubseczzz
\def\appendixsubsubsecyyy #1{\apphead3{#1}} % normally appendixsubsubseczzz
\def\appendixsubsubseczzz #1{\seccheck{appendixsubsubsec}%
\def\appendixsubsubseczzz #1{%
\gdef\thissection{#1}\global\advance \subsubsecno by 1 %
\gdef\thissection{#1}\global\advance \subsubsecno by 1 %
\subsubsecheading {#1}
\subsubsecheading {#1}
  {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
  {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
{\chapternofonts%
 
\toks0 = {#1}%
\toks0 = {#1}%
\edef\temp{{\realbackslash subsubsecentry{\the\toks0}%
\edef\temp{\noexpand\writetocentry{\realbackslash subsubsecentry{\the\toks0}%
  {\appendixletter}
  {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}}}%
  {\the\secno}{\the\subsecno}{\the\subsubsecno}{\noexpand\folio}}}%
\temp
\escapechar=`\\%
\appendixnoderef
\write \contentsfile \temp %
\nobreak
\appendixnoderef %
}
\penalty 10000 %
 
}}
 
 
 
\outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubsecyyy}
\outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubsecyyy}
\def\unnumberedsubsubsecyyy #1{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
\def\unnumberedsubsubsecyyy #1{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
\def\unnumberedsubsubseczzz #1{\seccheck{unnumberedsubsubsec}%
\def\unnumberedsubsubseczzz #1{%
\plainsubsubsecheading {#1}\gdef\thissection{#1}%
\plainsubsubsecheading {#1}\gdef\thissection{#1}%
{\chapternofonts%
 
\toks0 = {#1}%
\toks0 = {#1}%
\edef\temp{{\realbackslash unnumbsubsubsecentry{\the\toks0}{\noexpand\folio}}}%
\edef\temp{\noexpand\writetocentry{\realbackslash unnumbsubsubsecentry%
\escapechar=`\\%
                                    {\the\toks0}}}%
\write \contentsfile \temp %
\temp
\unnumbnoderef %
\unnumbnoderef
\penalty 10000 %
\nobreak
}}
}
 
 
% These are variants which are not "outer", so they can appear in @ifinfo.
% These are variants which are not "outer", so they can appear in @ifinfo.
% Actually, they should now be obsolete; ordinary section commands should work.
% Actually, they should now be obsolete; ordinary section commands should work.
\def\infotop{\parsearg\unnumberedzzz}
\def\infotop{\parsearg\unnumberedzzz}
\def\infounnumbered{\parsearg\unnumberedzzz}
\def\infounnumbered{\parsearg\unnumberedzzz}
Line 3140... Line 3229...
\global\let\subsection = \numberedsubsec
\global\let\subsection = \numberedsubsec
\global\let\subsubsection = \numberedsubsubsec
\global\let\subsubsection = \numberedsubsubsec
 
 
% Define @majorheading, @heading and @subheading
% Define @majorheading, @heading and @subheading
 
 
% NOTE on use of \vbox for chapter headings, section headings, and
% NOTE on use of \vbox for chapter headings, section headings, and such:
% such:
 
%       1) We use \vbox rather than the earlier \line to permit
%       1) We use \vbox rather than the earlier \line to permit
%          overlong headings to fold.
%          overlong headings to fold.
%       2) \hyphenpenalty is set to 10000 because hyphenation in a
%       2) \hyphenpenalty is set to 10000 because hyphenation in a
%          heading is obnoxious; this forbids it.
%          heading is obnoxious; this forbids it.
%       3) Likewise, headings look best if no \parindent is used, and
%       3) Likewise, headings look best if no \parindent is used, and
Line 3188... Line 3276...
\def\chappager{\par\vfill\supereject}
\def\chappager{\par\vfill\supereject}
\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi}
\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi}
 
 
\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
 
 
\def\CHAPPAGoff{
\def\CHAPPAGoff{%
\global\let\contentsalignmacro = \chappager
\global\let\contentsalignmacro = \chappager
\global\let\pchapsepmacro=\chapbreak
\global\let\pchapsepmacro=\chapbreak
\global\let\pagealignmacro=\chappager}
\global\let\pagealignmacro=\chappager}
 
 
\def\CHAPPAGon{
\def\CHAPPAGon{%
\global\let\contentsalignmacro = \chappager
\global\let\contentsalignmacro = \chappager
\global\let\pchapsepmacro=\chappager
\global\let\pchapsepmacro=\chappager
\global\let\pagealignmacro=\chappager
\global\let\pagealignmacro=\chappager
\global\def\HEADINGSon{\HEADINGSsingle}}
\global\def\HEADINGSon{\HEADINGSsingle}}
 
 
Line 3247... Line 3335...
\CHAPFplain % The default
\CHAPFplain % The default
 
 
\def\unnchfopen #1{%
\def\unnchfopen #1{%
\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
                       \parindent=0pt\raggedright
                       \parindent=0pt\raggedright
                       \rm #1\hfill}}\bigskip \par\penalty 10000 %
                       \rm #1\hfill}}\bigskip \par\nobreak
}
}
 
 
\def\chfopen #1#2{\chapoddpage {\chapfonts
\def\chfopen #1#2{\chapoddpage {\chapfonts
\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
\par\penalty 5000 %
\par\penalty 5000 %
}
}
 
 
\def\centerchfopen #1{%
\def\centerchfopen #1{%
\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
                       \parindent=0pt
                       \parindent=0pt
                       \hfill {\rm #1}\hfill}}\bigskip \par\penalty 10000 %
                       \hfill {\rm #1}\hfill}}\bigskip \par\nobreak
}
}
 
 
\def\CHAPFopen{
\def\CHAPFopen{
\global\let\chapmacro=\chfopen
\global\let\chapmacro=\chfopen
\global\let\unnumbchapmacro=\unnchfopen
\global\let\unnumbchapmacro=\unnchfopen
Line 3311... Line 3399...
  }%
  }%
  \ifdim\parskip<10pt \nobreak\kern10pt\nobreak\kern-\parskip\fi \nobreak
  \ifdim\parskip<10pt \nobreak\kern10pt\nobreak\kern-\parskip\fi \nobreak
}
}
 
 
 
 
\message{toc printing,}
\message{toc,}
% Finish up the main text and prepare to read what we've written
\newwrite\tocfile
% to \contentsfile.
 
 
% Write an entry to the toc file, opening it if necessary.
 
% Called from @chapter, etc.  We supply {\folio} at the end of the
 
% argument, which will end up as the last argument to the \...entry macro.
 
%
 
% We open the .toc file here instead of at @setfilename or any other
 
% given time so that @contents can be put in the document anywhere.
 
%
 
\newif\iftocfileopened
 
\def\writetocentry#1{%
 
  \iftocfileopened\else
 
    \immediate\openout\tocfile = \jobname.toc
 
    \global\tocfileopenedtrue
 
  \fi
 
  \iflinks \write\tocfile{#1{\folio}}\fi
 
}
 
 
\newskip\contentsrightmargin \contentsrightmargin=1in
\newskip\contentsrightmargin \contentsrightmargin=1in
 
\newcount\savepageno
 
\newcount\lastnegativepageno \lastnegativepageno = -1
 
 
 
% Finish up the main text and prepare to read what we've written
 
% to \tocfile.
 
%
\def\startcontents#1{%
\def\startcontents#1{%
   % If @setchapternewpage on, and @headings double, the contents should
   % If @setchapternewpage on, and @headings double, the contents should
   % start on an odd page, unlike chapters.  Thus, we maintain
   % start on an odd page, unlike chapters.  Thus, we maintain
   % \contentsalignmacro in parallel with \pagealignmacro.
   % \contentsalignmacro in parallel with \pagealignmacro.
   % From: Torbjorn Granlund <tege@matematik.su.se>
   % From: Torbjorn Granlund <tege@matematik.su.se>
   \contentsalignmacro
   \contentsalignmacro
   \immediate\closeout \contentsfile
   \immediate\closeout\tocfile
   \ifnum \pageno>0
   %
      \pageno = -1              % Request roman numbered pages.
 
   \fi
 
   % Don't need to put `Contents' or `Short Contents' in the headline.
   % Don't need to put `Contents' or `Short Contents' in the headline.
   % It is abundantly clear what they are.
   % It is abundantly clear what they are.
   \unnumbchapmacro{#1}\def\thischapter{}%
   \unnumbchapmacro{#1}\def\thischapter{}%
 
   \savepageno = \pageno
   \begingroup                  % Set up to handle contents files properly.
   \begingroup                  % Set up to handle contents files properly.
      \catcode`\\=0  \catcode`\{=1  \catcode`\}=2  \catcode`\@=11
      \catcode`\\=0  \catcode`\{=1  \catcode`\}=2  \catcode`\@=11
      % We can't do this, because then an actual ^ in a section
      % We can't do this, because then an actual ^ in a section
      % title fails, e.g., @chapter ^ -- exponentiation.  --karl, 9jul97.
      % title fails, e.g., @chapter ^ -- exponentiation.  --karl, 9jul97.
      %\catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi
      %\catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi
      \raggedbottom             % Worry more about breakpoints than the bottom.
      \raggedbottom             % Worry more about breakpoints than the bottom.
      \advance\hsize by -\contentsrightmargin % Don't use the full line length.
      \advance\hsize by -\contentsrightmargin % Don't use the full line length.
 
      %
 
      % Roman numerals for page numbers.
 
      \ifnum \pageno>0 \pageno = \lastnegativepageno \fi
}
}
 
 
 
 
% Normal (long) toc.
% Normal (long) toc.
\outer\def\contents{%
\def\contents{%
   \startcontents{\putwordTableofContents}%
   \startcontents{\putwordTableofContents}%
 
     \openin 1 \jobname.toc
 
     \ifeof 1 \else
 
       \closein 1
      \input \jobname.toc
      \input \jobname.toc
   \endgroup
     \fi
   \vfill \eject
   \vfill \eject
 
   \endgroup
 
   \lastnegativepageno = \pageno
 
   \pageno = \savepageno
}
}
 
 
% And just the chapters.
% And just the chapters.
\outer\def\summarycontents{%
\def\summarycontents{%
   \startcontents{\putwordShortContents}%
   \startcontents{\putwordShortContents}%
      %
      %
      \let\chapentry = \shortchapentry
      \let\chapentry = \shortchapentry
      \let\unnumbchapentry = \shortunnumberedentry
      \let\unnumbchapentry = \shortunnumberedentry
      % We want a true roman here for the page numbers.
      % We want a true roman here for the page numbers.
Line 3365... Line 3482...
      \def\unnumbsecentry ##1##2{}
      \def\unnumbsecentry ##1##2{}
      \def\subsecentry ##1##2##3##4##5{}
      \def\subsecentry ##1##2##3##4##5{}
      \def\unnumbsubsecentry ##1##2{}
      \def\unnumbsubsecentry ##1##2{}
      \def\subsubsecentry ##1##2##3##4##5##6{}
      \def\subsubsecentry ##1##2##3##4##5##6{}
      \def\unnumbsubsubsecentry ##1##2{}
      \def\unnumbsubsubsecentry ##1##2{}
 
      \openin 1 \jobname.toc
 
      \ifeof 1 \else
 
        \closein 1
      \input \jobname.toc
      \input \jobname.toc
   \endgroup
      \fi
   \vfill \eject
   \vfill \eject
 
   \endgroup
 
   \lastnegativepageno = \pageno
 
   \pageno = \savepageno
}
}
\let\shortcontents = \summarycontents
\let\shortcontents = \summarycontents
 
 
% These macros generate individual entries in the table of contents.
% These macros generate individual entries in the table of contents.
% The first argument is the chapter or section name.
% The first argument is the chapter or section name.
Line 3551... Line 3674...
  \let\dots=\ptexdots
  \let\dots=\ptexdots
  \let\equiv=\ptexequiv
  \let\equiv=\ptexequiv
  \let\!=\ptexexclam
  \let\!=\ptexexclam
  \let\i=\ptexi
  \let\i=\ptexi
  \let\{=\ptexlbrace
  \let\{=\ptexlbrace
 
  \let\+=\tabalign
  \let\}=\ptexrbrace
  \let\}=\ptexrbrace
  \let\*=\ptexstar
  \let\*=\ptexstar
  \let\t=\ptext
  \let\t=\ptext
  %
  %
  \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
  \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
Line 3602... Line 3726...
\let\afterenvbreak = \aboveenvbreak
\let\afterenvbreak = \aboveenvbreak
 
 
% \nonarrowing is a flag.  If "set", @lisp etc don't narrow margins.
% \nonarrowing is a flag.  If "set", @lisp etc don't narrow margins.
\let\nonarrowing=\relax
\let\nonarrowing=\relax
 
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% @cartouche ... @end cartouche: draw rectangle w/rounded corners around
% \cartouche: draw rectangle w/rounded corners around argument
% environment contents.
\font\circle=lcircle10
\font\circle=lcircle10
\newdimen\circthick
\newdimen\circthick
\newdimen\cartouter\newdimen\cartinner
\newdimen\cartouter\newdimen\cartinner
\newskip\normbskip\newskip\normpskip\newskip\normlskip
\newskip\normbskip\newskip\normpskip\newskip\normlskip
\circthick=\fontdimen8\circle
\circthick=\fontdimen8\circle
Line 3630... Line 3754...
        \lskip=\leftskip \rskip=\rightskip
        \lskip=\leftskip \rskip=\rightskip
        \leftskip=0pt\rightskip=0pt %we want these *outside*.
        \leftskip=0pt\rightskip=0pt %we want these *outside*.
        \cartinner=\hsize \advance\cartinner by-\lskip
        \cartinner=\hsize \advance\cartinner by-\lskip
                          \advance\cartinner by-\rskip
                          \advance\cartinner by-\rskip
        \cartouter=\hsize
        \cartouter=\hsize
        \advance\cartouter by 18pt % allow for 3pt kerns on either
        \advance\cartouter by 18.4pt % allow for 3pt kerns on either
%                                    side, and for 6pt waste from
%                                    side, and for 6pt waste from
%                                    each corner char
%                                    each corner char, and rule thickness
        \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=\comment
        \let\nonarrowing=\comment
        \vbox\bgroup
        \vbox\bgroup
                \baselineskip=0pt\parskip=0pt\lineskip=0pt
                \baselineskip=0pt\parskip=0pt\lineskip=0pt
Line 3686... Line 3810...
    \let\exdent=\nofillexdent
    \let\exdent=\nofillexdent
    \let\nonarrowing=\relax
    \let\nonarrowing=\relax
  \fi
  \fi
}
}
 
 
% To ending an @example-like environment, we first end the paragraph
% Define the \E... control sequence only if we are inside the particular
% (via \afterenvbreak's vertical glue), and then the group.  That way we
% environment, so the error checking in \end will work.
% keep the zero \parskip that the environments set -- \parskip glue
%
% will be inserted at the beginning of the next paragraph in the
% To end an @example-like environment, we first end the paragraph (via
% document, after the environment.
% \afterenvbreak's vertical glue), and then the group.  That way we keep
 
% the zero \parskip that the environments set -- \parskip glue will be
 
% inserted at the beginning of the next paragraph in the document, after
 
% the environment.
%
%
\def\nonfillfinish{\afterenvbreak\endgroup}%
\def\nonfillfinish{\afterenvbreak\endgroup}
 
 
 
% @lisp: indented, narrowed, typewriter font.
\def\lisp{\begingroup
\def\lisp{\begingroup
  \nonfillstart
  \nonfillstart
  \let\Elisp = \nonfillfinish
  \let\Elisp = \nonfillfinish
  \tt
  \tt
  % Make @kbd do something special, if requested.
  \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
  \let\kbdfont\kbdexamplefont
  \gobble       % eat return
  \rawbackslash % have \ input char produce \ char from current font
 
  \gobble
 
}
}
 
 
% Define the \E... control sequence only if we are inside the
% @example: Same as @lisp.
% environment, so the error checking in \end will work.
\def\example{\begingroup \def\Eexample{\nonfillfinish\endgroup}\lisp}
 
 
 
% @small... is usually equivalent to the non-small (@smallbook
 
% redefines).  We must call \example (or whatever) last in the
 
% definition, since it reads the return following the @example (or
 
% whatever) command.
%
%
% We must call \lisp last in the definition, since it reads the
% This actually allows (for example) @end display inside an
% return following the @example (or whatever) command.
% @smalldisplay.  Too bad, but makeinfo will catch the error anyway.
%
%
\def\example{\begingroup \def\Eexample{\nonfillfinish\endgroup}\lisp}
\def\smalldisplay{\begingroup\def\Esmalldisplay{\nonfillfinish\endgroup}\display}
\def\smallexample{\begingroup \def\Esmallexample{\nonfillfinish\endgroup}\lisp}
\def\smallexample{\begingroup \def\Esmallexample{\nonfillfinish\endgroup}\lisp}
 
\def\smallformat{\begingroup\def\Esmallformat{\nonfillfinish\endgroup}\format}
\def\smalllisp{\begingroup \def\Esmalllisp{\nonfillfinish\endgroup}\lisp}
\def\smalllisp{\begingroup \def\Esmalllisp{\nonfillfinish\endgroup}\lisp}
 
 
% @smallexample and @smalllisp.  This is not used unless the @smallbook
% Real @smallexample and @smalllisp (when @smallbook): use smaller fonts.
% command is given.  Originally contributed by Pavel@xerox.
% Originally contributed by Pavel@xerox.
%
 
\def\smalllispx{\begingroup
\def\smalllispx{\begingroup
  \nonfillstart
  \def\Esmalllisp{\nonfillfinish\endgroup}%
  \let\Esmalllisp = \nonfillfinish
  \def\Esmallexample{\nonfillfinish\endgroup}%
  \let\Esmallexample = \nonfillfinish
  \indexfonts
  %
  \lisp
  % Smaller fonts for small examples.
 
  \indexfonts \tt
 
  \rawbackslash % make \ output the \ character from the current font (tt)
 
  \gobble
 
}
}
 
 
% This is @display; same as @lisp except use roman font.
% @display: same as @lisp except keep current font.
%
%
\def\display{\begingroup
\def\display{\begingroup
  \nonfillstart
  \nonfillstart
  \let\Edisplay = \nonfillfinish
  \let\Edisplay = \nonfillfinish
  \gobble
  \gobble
}
}
 
 
% This is @format; same as @display except don't narrow margins.
% @smalldisplay (when @smallbook): @display plus smaller fonts.
 
%
 
\def\smalldisplayx{\begingroup
 
  \def\Esmalldisplay{\nonfillfinish\endgroup}%
 
  \indexfonts \rm
 
  \display
 
}
 
 
 
% @format: same as @display except don't narrow margins.
%
%
\def\format{\begingroup
\def\format{\begingroup
  \let\nonarrowing = t
  \let\nonarrowing = t
  \nonfillstart
  \nonfillstart
  \let\Eformat = \nonfillfinish
  \let\Eformat = \nonfillfinish
  \gobble
  \gobble
}
}
 
 
% @flushleft (same as @format) and @flushright.
% @smallformat (when @smallbook): @format plus smaller fonts.
%
%
\def\flushleft{\begingroup
\def\smallformatx{\begingroup
  \let\nonarrowing = t
  \def\Esmallformat{\nonfillfinish\endgroup}%
  \nonfillstart
  \indexfonts \rm
  \let\Eflushleft = \nonfillfinish
  \format
  \gobble
 
}
}
 
 
 
% @flushleft (same as @format).
 
%
 
\def\flushleft{\begingroup \def\Eflushleft{\nonfillfinish\endgroup}\format}
 
 
 
% @flushright.
 
%
\def\flushright{\begingroup
\def\flushright{\begingroup
  \let\nonarrowing = t
  \let\nonarrowing = t
  \nonfillstart
  \nonfillstart
  \let\Eflushright = \nonfillfinish
  \let\Eflushright = \nonfillfinish
  \advance\leftskip by 0pt plus 1fill
  \advance\leftskip by 0pt plus 1fill
  \gobble}
  \gobble
 
}
 
 
% @quotation does normal linebreaking (hence we can't use \nonfillstart)
% @quotation does normal linebreaking (hence we can't use \nonfillstart)
% and narrows the margins.
% and narrows the margins.
%
%
\def\quotation{%
\def\quotation{%
Line 3781... Line 3923...
    \exdentamount = \lispnarrowing
    \exdentamount = \lispnarrowing
    \let\nonarrowing = \relax
    \let\nonarrowing = \relax
  \fi
  \fi
}
}
 
 
 
 
\message{defuns,}
\message{defuns,}
% Define formatter for defuns
% Define formatter for defuns
% First, allow user to change definition object font (\df) internally
% First, allow user to change definition object font (\df) internally
\def\setdeffont #1 {\csname DEF#1\endcsname}
\def\setdeffont #1 {\csname DEF#1\endcsname}
 
 
Line 3850... Line 3993...
\def\defname #1#2{%
\def\defname #1#2{%
% Get the values of \leftskip and \rightskip as they were
% Get the values of \leftskip and \rightskip as they were
% outside the @def...
% outside the @def...
\dimen2=\leftskip
\dimen2=\leftskip
\advance\dimen2 by -\defbodyindent
\advance\dimen2 by -\defbodyindent
\dimen3=\rightskip
\noindent
\advance\dimen3 by -\defbodyindent
 
\noindent        %
 
\setbox0=\hbox{\hskip \deflastargmargin{\rm #2}\hskip \deftypemargin}%
\setbox0=\hbox{\hskip \deflastargmargin{\rm #2}\hskip \deftypemargin}%
\dimen0=\hsize \advance \dimen0 by -\wd0 % compute size for first line
\dimen0=\hsize \advance \dimen0 by -\wd0 % compute size for first line
\dimen1=\hsize \advance \dimen1 by -\defargsindent %size for continuations
\dimen1=\hsize \advance \dimen1 by -\defargsindent %size for continuations
\parshape 2 0in \dimen0 \defargsindent \dimen1     %
\parshape 2 0in \dimen0 \defargsindent \dimen1
% Now output arg 2 ("Function" or some such)
% Now output arg 2 ("Function" or some such)
% ending at \deftypemargin from the right margin,
% ending at \deftypemargin from the right margin,
% but stuck inside a box of width 0 so it does not interfere with linebreaking
% but stuck inside a box of width 0 so it does not interfere with linebreaking
{% Adjust \hsize to exclude the ambient margins,
{% Adjust \hsize to exclude the ambient margins,
% so that \rightline will obey them.
% so that \rightline will obey them.
\advance \hsize by -\dimen2 \advance \hsize by -\dimen3
\advance \hsize by -\dimen2
\rlap{\rightline{{\rm #2}\hskip \deftypemargin}}}%
\rlap{\rightline{{\rm #2}\hskip -1.25pc }}}%
% Make all lines underfull and no complaints:
% Make all lines underfull and no complaints:
\tolerance=10000 \hbadness=10000
\tolerance=10000 \hbadness=10000
\advance\leftskip by -\defbodyindent
\advance\leftskip by -\defbodyindent
\exdentamount=\defbodyindent
\exdentamount=\defbodyindent
{\df #1}\enskip        % Generate function name
{\df #1}\enskip        % Generate function name
Line 3884... Line 4025...
% Define the end token that this defining construct specifies
% Define the end token that this defining construct specifies
% so that it will exit this group.
% so that it will exit this group.
\def#1{\endgraf\endgroup\medbreak}%
\def#1{\endgraf\endgroup\medbreak}%
\def#2{\begingroup\obeylines\activeparens\spacesplit#3}%
\def#2{\begingroup\obeylines\activeparens\spacesplit#3}%
\parindent=0in
\parindent=0in
\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
\advance\leftskip by \defbodyindent
\exdentamount=\defbodyindent
\exdentamount=\defbodyindent
\begingroup %
\begingroup %
\catcode 61=\active % 61 is `='
\catcode 61=\active % 61 is `='
\obeylines\activeparens\spacesplit#3}
\obeylines\activeparens\spacesplit#3}
 
 
 
% #1 is the \E... control sequence to end the definition (which we define).
 
% #2 is the \...x control sequence for consecutive fns (which we define).
 
% #3 is the control sequence to call to resume processing.
 
% #4, delimited by the space, is the class name.
 
%
\def\defmethparsebody #1#2#3#4 {\begingroup\inENV %
\def\defmethparsebody #1#2#3#4 {\begingroup\inENV %
\medbreak %
\medbreak %
% Define the end token that this defining construct specifies
% Define the end token that this defining construct specifies
% so that it will exit this group.
% so that it will exit this group.
\def#1{\endgraf\endgroup\medbreak}%
\def#1{\endgraf\endgroup\medbreak}%
\def#2##1 {\begingroup\obeylines\activeparens\spacesplit{#3{##1}}}%
\def#2##1 {\begingroup\obeylines\activeparens\spacesplit{#3{##1}}}%
\parindent=0in
\parindent=0in
\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
\advance\leftskip by \defbodyindent
\exdentamount=\defbodyindent
\exdentamount=\defbodyindent
\begingroup\obeylines\activeparens\spacesplit{#3{#4}}}
\begingroup\obeylines\activeparens\spacesplit{#3{#4}}}
 
 
 
% @deftypemethod has an extra argument that nothing else does.  Sigh.
 
% #1 is the \E... control sequence to end the definition (which we define).
 
% #2 is the \...x control sequence for consecutive fns (which we define).
 
% #3 is the control sequence to call to resume processing.
 
% #4, delimited by the space, is the class name.
 
% #5 is the method's return type.
 
%
 
\def\deftypemethparsebody#1#2#3#4 #5 {\begingroup\inENV %
 
\medbreak %
 
% Define the end token that this defining construct specifies
 
% so that it will exit this group.
 
\def#1{\endgraf\endgroup\medbreak}%
 
\def#2##1 ##2 {\begingroup\obeylines\activeparens\spacesplit{#3{##1}{##2}}}%
 
\parindent=0in
 
\advance\leftskip by \defbodyindent
 
\exdentamount=\defbodyindent
 
\begingroup\obeylines\activeparens\spacesplit{#3{#4}{#5}}}
 
 
\def\defopparsebody #1#2#3#4#5 {\begingroup\inENV %
\def\defopparsebody #1#2#3#4#5 {\begingroup\inENV %
\medbreak %
\medbreak %
% Define the end token that this defining construct specifies
% Define the end token that this defining construct specifies
% so that it will exit this group.
% so that it will exit this group.
\def#1{\endgraf\endgroup\medbreak}%
\def#1{\endgraf\endgroup\medbreak}%
\def#2##1 ##2 {\def#4{##1}%
\def#2##1 ##2 {\def#4{##1}%
\begingroup\obeylines\activeparens\spacesplit{#3{##2}}}%
\begingroup\obeylines\activeparens\spacesplit{#3{##2}}}%
\parindent=0in
\parindent=0in
\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
\advance\leftskip by \defbodyindent
\exdentamount=\defbodyindent
\exdentamount=\defbodyindent
\begingroup\obeylines\activeparens\spacesplit{#3{#5}}}
\begingroup\obeylines\activeparens\spacesplit{#3{#5}}}
 
 
% These parsing functions are similar to the preceding ones
% These parsing functions are similar to the preceding ones
% except that they do not make parens into active characters.
% except that they do not make parens into active characters.
Line 3924... Line 4088...
% Define the end token that this defining construct specifies
% Define the end token that this defining construct specifies
% so that it will exit this group.
% so that it will exit this group.
\def#1{\endgraf\endgroup\medbreak}%
\def#1{\endgraf\endgroup\medbreak}%
\def#2{\begingroup\obeylines\spacesplit#3}%
\def#2{\begingroup\obeylines\spacesplit#3}%
\parindent=0in
\parindent=0in
\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
\advance\leftskip by \defbodyindent
\exdentamount=\defbodyindent
\exdentamount=\defbodyindent
\begingroup %
\begingroup %
\catcode 61=\active %
\catcode 61=\active %
\obeylines\spacesplit#3}
\obeylines\spacesplit#3}
 
 
Line 3941... Line 4105...
  % Define the end token that this defining construct specifies
  % Define the end token that this defining construct specifies
  % so that it will exit this group.
  % so that it will exit this group.
  \def#1{\endgraf\endgroup\medbreak}%
  \def#1{\endgraf\endgroup\medbreak}%
  \def#2##1 {\begingroup\obeylines\spacesplit{#3{##1}}}%
  \def#2##1 {\begingroup\obeylines\spacesplit{#3{##1}}}%
  \parindent=0in
  \parindent=0in
  \advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
  \advance\leftskip by \defbodyindent
  \exdentamount=\defbodyindent
  \exdentamount=\defbodyindent
  \begingroup\obeylines
  \begingroup\obeylines
}
}
 
 
\def\defvrparsebody#1#2#3#4 {%
\def\defvrparsebody#1#2#3#4 {%
Line 3986... Line 4150...
% so that it will exit this group.
% so that it will exit this group.
\def#1{\endgraf\endgroup\medbreak}%
\def#1{\endgraf\endgroup\medbreak}%
\def#2##1 ##2 {\def#4{##1}%
\def#2##1 ##2 {\def#4{##1}%
\begingroup\obeylines\spacesplit{#3{##2}}}%
\begingroup\obeylines\spacesplit{#3{##2}}}%
\parindent=0in
\parindent=0in
\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
\advance\leftskip by \defbodyindent
\exdentamount=\defbodyindent
\exdentamount=\defbodyindent
\begingroup\obeylines\spacesplit{#3{#5}}}
\begingroup\obeylines\spacesplit{#3{#5}}}
 
 
% Split up #2 at the first space token.
% Split up #2 at the first space token.
% call #1 with two arguments:
% call #1 with two arguments:
Line 4019... Line 4183...
#1%
#1%
\hyphenchar\tensl=45
\hyphenchar\tensl=45
\ifnum\parencount=0 \else \errmessage{Unbalanced parentheses in @def}\fi%
\ifnum\parencount=0 \else \errmessage{Unbalanced parentheses in @def}\fi%
\interlinepenalty=10000
\interlinepenalty=10000
\advance\rightskip by 0pt plus 1fil
\advance\rightskip by 0pt plus 1fil
\endgraf\penalty 10000\vskip -\parskip\penalty 10000%
\endgraf\nobreak\vskip -\parskip\nobreak
}
}
 
 
\def\deftypefunargs #1{%
\def\deftypefunargs #1{%
% Expand, preventing hyphenation at `-' chars.
% Expand, preventing hyphenation at `-' chars.
% Note that groups don't affect changes in \hyphenchar.
% Note that groups don't affect changes in \hyphenchar.
% Use \boldbraxnoamp, not \functionparens, so that & is not special.
% Use \boldbraxnoamp, not \functionparens, so that & is not special.
\boldbraxnoamp
\boldbraxnoamp
\tclose{#1}% avoid \code because of side effects on active chars
\tclose{#1}% avoid \code because of side effects on active chars
\interlinepenalty=10000
\interlinepenalty=10000
\advance\rightskip by 0pt plus 1fil
\advance\rightskip by 0pt plus 1fil
\endgraf\penalty 10000\vskip -\parskip\penalty 10000%
\endgraf\nobreak\vskip -\parskip\nobreak
}
}
 
 
% Do complete processing of one @defun or @defunx line already parsed.
% Do complete processing of one @defun or @defunx line already parsed.
 
 
% @deffn Command forward-char nchars
% @deffn Command forward-char nchars
Line 4118... Line 4282...
\def\defunx #1 {\errmessage{@defunx in invalid context}}
\def\defunx #1 {\errmessage{@defunx in invalid context}}
\def\defmacx #1 {\errmessage{@defmacx in invalid context}}
\def\defmacx #1 {\errmessage{@defmacx in invalid context}}
\def\defspecx #1 {\errmessage{@defspecx in invalid context}}
\def\defspecx #1 {\errmessage{@defspecx in invalid context}}
\def\deftypefnx #1 {\errmessage{@deftypefnx in invalid context}}
\def\deftypefnx #1 {\errmessage{@deftypefnx in invalid context}}
\def\deftypemethodx #1 {\errmessage{@deftypemethodx in invalid context}}
\def\deftypemethodx #1 {\errmessage{@deftypemethodx in invalid context}}
\def\deftypeunx #1 {\errmessage{@deftypeunx in invalid context}}
\def\deftypefunx #1 {\errmessage{@deftypefunx in invalid context}}
 
 
% @defmethod, and so on
% @defmethod, and so on
 
 
% @defop {Funny Method} foo-class frobnicate argument
% @defop CATEGORY CLASS OPERATION ARG...
 
 
\def\defop #1 {\def\defoptype{#1}%
\def\defop #1 {\def\defoptype{#1}%
\defopparsebody\Edefop\defopx\defopheader\defoptype}
\defopparsebody\Edefop\defopx\defopheader\defoptype}
 
 
\def\defopheader #1#2#3{%
\def\defopheader #1#2#3{%
\dosubind {fn}{\code{#2}}{on #1}% Make entry in function index
\dosubind {fn}{\code{#2}}{\putwordon\ #1}% Make entry in function index
\begingroup\defname {#2}{\defoptype{} on #1}%
\begingroup\defname {#2}{\defoptype{} on #1}%
\defunargs {#3}\endgroup %
\defunargs {#3}\endgroup %
}
}
 
 
% @deftypemethod foo-class return-type foo-method args
% @deftypemethod CLASS RETURN-TYPE METHOD ARG...
%
%
\def\deftypemethod{%
\def\deftypemethod{%
  \defmethparsebody\Edeftypemethod\deftypemethodx\deftypemethodheader}
  \deftypemethparsebody\Edeftypemethod\deftypemethodx\deftypemethodheader}
%
%
% #1 is the class name, #2 the data type, #3 the method name, #4 the args.
% #1 is the class name, #2 the data type, #3 the method name, #4 the args.
\def\deftypemethodheader#1#2#3#4{%
\def\deftypemethodheader#1#2#3#4{%
  \deftypefnheaderx{Method on #1}{#2}#3 #4\relax
  \dosubind{fn}{\code{#3}}{\putwordon\ \code{#1}}% entry in function index
 
  \begingroup
 
    \defname{\defheaderxcond#2\relax$$$#3}{\putwordMethodon\ \code{#1}}%
 
    \deftypefunargs{#4}%
 
  \endgroup
}
}
 
 
% @defmethod == @defop Method
% @defmethod == @defop Method
 
%
\def\defmethod{\defmethparsebody\Edefmethod\defmethodx\defmethodheader}
\def\defmethod{\defmethparsebody\Edefmethod\defmethodx\defmethodheader}
 
%
 
% #1 is the class name, #2 the method name, #3 the args.
\def\defmethodheader #1#2#3{%
\def\defmethodheader #1#2#3{%
\dosubind {fn}{\code{#2}}{on #1}% entry in function index
  \dosubind{fn}{\code{#2}}{\putwordon\ \code{#1}}% entry in function index
\begingroup\defname {#2}{Method on #1}%
  \begingroup
\defunargs {#3}\endgroup %
    \defname{#2}{\putwordMethodon\ \code{#1}}%
 
    \defunargs{#3}%
 
  \endgroup
}
}
 
 
% @defcv {Class Option} foo-class foo-flag
% @defcv {Class Option} foo-class foo-flag
 
 
\def\defcv #1 {\def\defcvtype{#1}%
\def\defcv #1 {\def\defcvtype{#1}%
Line 4189... Line 4360...
% First, define the processing that is wanted for arguments of @defvar.
% First, define the processing that is wanted for arguments of @defvar.
% This is actually simple: just print them in roman.
% This is actually simple: just print them in roman.
% This must expand the args and terminate the paragraph they make up
% This must expand the args and terminate the paragraph they make up
\def\defvarargs #1{\normalparens #1%
\def\defvarargs #1{\normalparens #1%
\interlinepenalty=10000
\interlinepenalty=10000
\endgraf\penalty 10000\vskip -\parskip\penalty 10000}
\endgraf\nobreak\vskip -\parskip\nobreak}
 
 
% @defvr Counter foo-count
% @defvr Counter foo-count
 
 
\def\defvr{\defvrparsebody\Edefvr\defvrx\defvrheader}
\def\defvr{\defvrparsebody\Edefvr\defvrx\defvrheader}
 
 
Line 4226... Line 4397...
% is actually part of the data type, which should not be put into the index.
% is actually part of the data type, which should not be put into the index.
\def\deftypevarheader #1#2{%
\def\deftypevarheader #1#2{%
\dovarind#2 \relax% Make entry in variables index
\dovarind#2 \relax% Make entry in variables index
\begingroup\defname {\defheaderxcond#1\relax$$$#2}{Variable}%
\begingroup\defname {\defheaderxcond#1\relax$$$#2}{Variable}%
\interlinepenalty=10000
\interlinepenalty=10000
\endgraf\penalty 10000\vskip -\parskip\penalty 10000
\endgraf\nobreak\vskip -\parskip\nobreak
\endgroup}
\endgroup}
\def\dovarind#1 #2\relax{\doind{vr}{\code{#1}}}
\def\dovarind#1 #2\relax{\doind{vr}{\code{#1}}}
 
 
% @deftypevr {Global Flag} int enable
% @deftypevr {Global Flag} int enable
 
 
\def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader}
\def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader}
 
 
\def\deftypevrheader #1#2#3{\dovarind#3 \relax%
\def\deftypevrheader #1#2#3{\dovarind#3 \relax%
\begingroup\defname {\defheaderxcond#2\relax$$$#3}{#1}
\begingroup\defname {\defheaderxcond#2\relax$$$#3}{#1}
\interlinepenalty=10000
\interlinepenalty=10000
\endgraf\penalty 10000\vskip -\parskip\penalty 10000
\endgraf\nobreak\vskip -\parskip\nobreak
\endgroup}
\endgroup}
 
 
% This definition is run if you use @defvarx
% This definition is run if you use @defvarx
% anywhere other than immediately after a @defvar or @defvarx.
% anywhere other than immediately after a @defvar or @defvarx.
 
 
Line 4267... Line 4438...
% anywhere other than immediately after a @deftp, etc.
% anywhere other than immediately after a @deftp, etc.
 
 
\def\deftpx #1 {\errmessage{@deftpx in invalid context}}
\def\deftpx #1 {\errmessage{@deftpx in invalid context}}
 
 
 
 
\message{cross reference,}
\message{macros,}
% Define cross-reference macros
% @macro.
 
 
 
% To do this right we need a feature of e-TeX, \scantokens,
 
% which we arrange to emulate with a temporary file in ordinary TeX.
 
\ifx\eTeXversion\undefined
 
 \newwrite\macscribble
 
 \def\scanmacro#1{%
 
   \begingroup \newlinechar`\^^M
 
   \immediate\openout\macscribble=\jobname.tmp
 
   \immediate\write\macscribble{#1}%
 
   \immediate\closeout\macscribble
 
   \let\xeatspaces\eatspaces
 
   \input \jobname.tmp
 
   \endgroup
 
}
 
\else
 
\def\scanmacro#1{%
 
\begingroup \newlinechar`\^^M
 
\let\xeatspaces\eatspaces\scantokens{#1}\endgroup}
 
\fi
 
 
 
\newcount\paramno   % Count of parameters
 
\newtoks\macname    % Macro name
 
\newif\ifrecursive  % Is it recursive?
 
 
 
% Utility routines.
 
% Thisdoes \let #1 = #2, except with \csnames.
 
\def\cslet#1#2{%
 
\expandafter\expandafter
 
\expandafter\let
 
\expandafter\expandafter
 
\csname#1\endcsname
 
\csname#2\endcsname}
 
 
 
% Trim leading and trailing spaces off a string.
 
% Concepts from aro-bend problem 15 (see CTAN).
 
{\catcode`\@=11
 
\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }}
 
\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@}
 
\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @}
 
\def\unbrace#1{#1}
 
\unbrace{\gdef\trim@@@ #1 } #2@{#1}
 
}
 
 
 
% Trim a single trailing ^^M off a string.
 
{\catcode`\^^M=12\catcode`\Q=3%
 
\gdef\eatcr #1{\eatcra #1Q^^MQ}%
 
\gdef\eatcra#1^^MQ{\eatcrb#1Q}%
 
\gdef\eatcrb#1Q#2Q{#1}%
 
}
 
 
 
% Macro bodies are absorbed as an argument in a context where
 
% all characters are catcode 10, 11 or 12, except \ which is active
 
% (as in normal texinfo). It is necessary to change the definition of \.
 
 
 
% 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
 
% body, and then making it the \newlinechar in \scanmacro.
 
 
 
\def\macrobodyctxt{%
 
  \catcode`\~=12
 
  \catcode`\^=12
 
  \catcode`\_=12
 
  \catcode`\|=12
 
  \catcode`\<=12
 
  \catcode`\>=12
 
  \catcode`\+=12
 
  \catcode`\{=12
 
  \catcode`\}=12
 
  \catcode`\@=12
 
  \catcode`\^^M=12
 
  \usembodybackslash}
 
 
 
% \mbodybackslash is the definition of \ in @macro bodies.
 
% It maps \foo\ => \csname macarg.foo\endcsname => #N
 
% where N is the macro parameter number.
 
% We define \csname macarg.\endcsname to be \realbackslash, so
 
% \\ in macro replacement text gets you a backslash.
 
 
 
{\catcode`@=0 @catcode`@\=@active
 
 @gdef@usembodybackslash{@let\=@mbodybackslash}
 
 @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname}
 
}
 
\expandafter\def\csname macarg.\endcsname{\realbackslash}
 
 
 
\def\macro{\recursivefalse\parsearg\macroxxx}
 
\def\rmacro{\recursivetrue\parsearg\macroxxx}
 
 
 
\def\macroxxx#1{%
 
  \getargs{#1}%           now \macname is the macname and \argl the arglist
 
  \ifx\argl\empty       % no arguments
 
     \paramno=0%
 
  \else
 
     \expandafter\parsemargdef \argl;%
 
  \fi
 
  \expandafter\ifx \csname macsave.\the\macname\endcsname \relax
 
     \cslet{macsave.\the\macname}{\the\macname}%
 
  \else
 
     \message{Warning: redefining \the\macname}%
 
  \fi
 
  \begingroup \macrobodyctxt
 
  \ifrecursive \expandafter\parsermacbody
 
  \else \expandafter\parsemacbody
 
  \fi}
 
 
 
\def\unmacro{\parsearg\unmacroxxx}
 
\def\unmacroxxx#1{%
 
  \expandafter\ifx \csname macsave.\the\macname\endcsname \relax
 
    \errmessage{Macro \the\macname\ not defined.}%
 
  \else
 
    \cslet{#1}{macsave.#1}%
 
    \expandafter\let \csname macsave.\the\macname\endcsname \undefined
 
  \fi
 
}
 
 
 
% This makes use of the obscure feature that if the last token of a
 
% <parameter list> is #, then the preceding argument is delimited by
 
% an opening brace, and that opening brace is not consumed.
 
\def\getargs#1{\getargsxxx#1{}}
 
\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs}
 
\def\getmacname #1 #2\relax{\macname={#1}}
 
\def\getmacargs#1{\def\argl{#1}}
 
 
 
% Parse the optional {params} list.  Set up \paramno and \paramlist
 
% 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.
 
% That gets used by \mbodybackslash (above).
 
 
 
% We need to get `macro parameter char #' into several definitions.
 
% The technique used is stolen from LaTeX:  let \hash be something
 
% unexpandable, insert that wherever you need a #, and then redefine
 
% it to # just before using the token list produced.
 
%
 
% The same technique is used to protect \eatspaces till just before
 
% the macro is used.
 
 
 
\def\parsemargdef#1;{\paramno=0\def\paramlist{}%
 
        \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,}
 
\def\parsemargdefxxx#1,{%
 
  \if#1;\let\next=\relax
 
  \else \let\next=\parsemargdefxxx
 
    \advance\paramno by 1%
 
    \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname
 
        {\xeatspaces{\hash\the\paramno}}%
 
    \edef\paramlist{\paramlist\hash\the\paramno,}%
 
  \fi\next}
 
 
 
% These two commands read recursive and nonrecursive macro bodies.
 
% (They're different since rec and nonrec macros end differently.)
 
 
 
\long\def\parsemacbody#1@end macro%
 
{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
 
\long\def\parsermacbody#1@end rmacro%
 
{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
 
 
 
% This defines the macro itself. There are six cases: recursive and
 
% nonrecursive macros of zero, one, and many arguments.
 
% Much magic with \expandafter here.
 
% \xdef is used so that macro definitions will survive the file
 
% they're defined in; @include reads the file inside a group.
 
\def\defmacro{%
 
  \let\hash=##% convert placeholders to macro parameter chars
 
  \ifrecursive
 
    \ifcase\paramno
 
    % 0
 
      \expandafter\xdef\csname\the\macname\endcsname{%
 
        \noexpand\scanmacro{\temp}}%
 
    \or % 1
 
      \expandafter\xdef\csname\the\macname\endcsname{%
 
         \noexpand\braceorline\csname\the\macname xxx\endcsname}%
 
      \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
 
         \noexpand\scanmacro{\temp}}%
 
    \else % many
 
      \expandafter\xdef\csname\the\macname\endcsname##1{%
 
          \csname\the\macname xxx\endcsname ##1,}%
 
      \expandafter\expandafter
 
      \expandafter\xdef
 
      \expandafter\expandafter
 
        \csname\the\macname xxx\endcsname
 
          \paramlist{\noexpand\scanmacro{\temp}}%
 
    \fi
 
  \else
 
    \ifcase\paramno
 
    % 0
 
      \expandafter\xdef\csname\the\macname\endcsname{%
 
        \noexpand\norecurse{\the\macname}%
 
        \noexpand\scanmacro{\temp}\egroup}%
 
    \or % 1
 
      \expandafter\xdef\csname\the\macname\endcsname{%
 
         \noexpand\braceorline\csname\the\macname xxx\endcsname}%
 
      \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
 
        \noexpand\norecurse{\the\macname}%
 
        \noexpand\scanmacro{\temp}\egroup}%
 
    \else % many
 
      \expandafter\xdef\csname\the\macname\endcsname##1{%
 
          \csname\the\macname xxx\endcsname ##1,}%
 
      \expandafter\expandafter
 
      \expandafter\xdef
 
      \expandafter\expandafter
 
      \csname\the\macname xxx\endcsname
 
      \paramlist{%
 
          \noexpand\norecurse{\the\macname}%
 
          \noexpand\scanmacro{\temp}\egroup}%
 
    \fi
 
  \fi}
 
 
 
\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
 
 
 
% \braceorline decides whether the next nonwhitespace character is a
 
% {.  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
 
% as an argument (by \parsebrace or \parsearg)
 
\def\braceorline#1{\let\next=#1\futurelet\nchar\braceorlinexxx}
 
\def\braceorlinexxx{%
 
  \ifx\nchar\bgroup\else
 
    \expandafter\parsearg
 
  \fi \next}
 
 
 
 
 
\message{cross references,}
\newwrite \auxfile
\newwrite \auxfile
 
 
\newif\ifhavexrefs  % True if xref values are known.
\newif\ifhavexrefs  % True if xref values are known.
\newif\ifwarnedxrefs  % True if we warned once that they aren't known.
\newif\ifwarnedxrefs  % True if we warned once that they aren't known.
 
 
% @inforef is 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{}}}
 
 
% \setref{foo} defines a cross-reference point named foo.
% @node's job is to define \lastnode.
 
\def\node{\ENVcheck\parsearg\nodezzz}
 
\def\nodezzz#1{\nodexxx [#1,]}
 
\def\nodexxx[#1,#2]{\gdef\lastnode{#1}}
 
\let\nwnode=\node
 
\let\lastnode=\relax
 
 
\def\setref#1{%
% The sectioning commands (@chapter, etc.) call these.
\dosetq{#1-title}{Ytitle}%
\def\donoderef{%
\dosetq{#1-pg}{Ypagenumber}%
  \ifx\lastnode\relax\else
\dosetq{#1-snt}{Ysectionnumberandtype}}
    \expandafter\expandafter\expandafter\setref{\lastnode}%
 
      {Ysectionnumberandtype}%
 
    \global\let\lastnode=\relax
 
  \fi
 
}
 
\def\unnumbnoderef{%
 
  \ifx\lastnode\relax\else
 
    \expandafter\expandafter\expandafter\setref{\lastnode}{Ynothing}%
 
    \global\let\lastnode=\relax
 
  \fi
 
}
 
\def\appendixnoderef{%
 
  \ifx\lastnode\relax\else
 
    \expandafter\expandafter\expandafter\setref{\lastnode}%
 
      {Yappendixletterandtype}%
 
    \global\let\lastnode=\relax
 
  \fi
 
}
 
 
 
 
 
% @anchor{NAME} -- define xref target at arbitrary point.
 
%
 
\def\anchor#1{\setref{#1}{Ynothing}}
 
 
\def\unnumbsetref#1{%
 
\dosetq{#1-title}{Ytitle}%
 
\dosetq{#1-pg}{Ypagenumber}%
 
\dosetq{#1-snt}{Ynothing}}
 
 
 
\def\appendixsetref#1{%
% \setref{NAME}{SNT} defines a cross-reference point NAME, namely
 
% NAME-title, NAME-pg, and NAME-SNT.  Called from \foonoderef.  We have
 
% to set \indexdummies so commands such as @code in a section title
 
% aren't expanded.  It would be nicer not to expand the titles in the
 
% first place, but there's so many layers that that is hard to do.
 
%
 
\def\setref#1#2{{%
 
  \indexdummies
\dosetq{#1-title}{Ytitle}%
\dosetq{#1-title}{Ytitle}%
\dosetq{#1-pg}{Ypagenumber}%
\dosetq{#1-pg}{Ypagenumber}%
\dosetq{#1-snt}{Yappendixletterandtype}}
  \dosetq{#1-snt}{#2}
 
}}
 
 
% \xref, \pxref, and \ref generate cross-references to specified points.
% @xref, @pxref, and @ref generate cross-references.  For \xrefX, #1 is
% For \xrefX, #1 is the node name, #2 the name of the Info
% the node name, #2 the name of the Info cross-reference, #3 the printed
% cross-reference, #3 the printed node name, #4 the name of the Info
% node name, #4 the name of the Info file, #5 the name of the printed
% file, #5 the name of the printed manual.  All but the node name can be
% manual.  All but the node name can be omitted.
% omitted.
 
%
%
\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]}
\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]}
\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]}
\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]}
\def\ref#1{\xrefX[#1,,,,,,,]}
\def\ref#1{\xrefX[#1,,,,,,,]}
\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
Line 4318... Line 4738...
      % Use the node name inside the square brackets.
      % Use the node name inside the square brackets.
      \def\printednodename{\ignorespaces #1}%
      \def\printednodename{\ignorespaces #1}%
    \else
    \else
      % Use the actual chapter/section title appear inside
      % Use the actual chapter/section title appear inside
      % the square brackets.  Use the real section title if we have it.
      % the square brackets.  Use the real section title if we have it.
      \ifdim \wd1>0pt%
      \ifdim \wd1 > 0pt
        % It is in another manual, so we don't have it.
        % It is in another manual, so we don't have it.
        \def\printednodename{\ignorespaces #1}%
        \def\printednodename{\ignorespaces #1}%
      \else
      \else
        \ifhavexrefs
        \ifhavexrefs
          % We know the real title if we have the xref values.
          % We know the real title if we have the xref values.
Line 4347... Line 4767...
    % _ (for example) has to be the character _ for the purposes of the
    % _ (for example) has to be the character _ for the purposes of the
    % control sequence corresponding to the node, but it has to expand
    % control sequence corresponding to the node, but it has to expand
    % into the usual \leavevmode...\vrule stuff for purposes of
    % into the usual \leavevmode...\vrule stuff for purposes of
    % printing. So we \turnoffactive for the \refx-snt, back on for the
    % printing. So we \turnoffactive for the \refx-snt, back on for the
    % printing, back off for the \refx-pg.
    % printing, back off for the \refx-pg.
    {\turnoffactive \refx{#1-snt}{}}%
    {\normalturnoffactive
    \space [\printednodename],\space
     % Only output a following space if the -snt ref is nonempty; for
 
     % @unnumbered and @anchor, it won't be.
 
     \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
 
     \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
 
    }%
 
    % [mynode],
 
    [\printednodename],\space
 
    % page 3
    \turnoffactive \putwordpage\tie\refx{#1-pg}{}%
    \turnoffactive \putwordpage\tie\refx{#1-pg}{}%
  \fi
  \fi
\endgroup}
\endgroup}
 
 
% \dosetq is the interface for calls from other macros
% \dosetq is the interface for calls from other macros
 
 
% Use \turnoffactive so that punctuation chars such as underscore
% Use \normalturnoffactive so that punctuation chars such as underscore
% work in node names.
% and backslash work in node names.  (\turnoffactive doesn't do \.)
\def\dosetq #1#2{{\let\folio=0 \turnoffactive
\def\dosetq#1#2{%
 
  {\let\folio=0
 
   \normalturnoffactive
\edef\next{\write\auxfile{\internalsetq {#1}{#2}}}%
\edef\next{\write\auxfile{\internalsetq {#1}{#2}}}%
\next}}
   \iflinks
 
     \next
 
   \fi
 
  }%
 
}
 
 
% \internalsetq {foo}{page} expands into
% \internalsetq {foo}{page} expands into
% CHARACTERS 'xrdef {foo}{...expansion of \Ypage...}
% CHARACTERS 'xrdef {foo}{...expansion of \Ypage...}
% When the aux file is read, ' is the escape character
% When the aux file is read, ' is the escape character
 
 
Line 4411... Line 4844...
 
 
\def\refx#1#2{%
\def\refx#1#2{%
  \expandafter\ifx\csname X#1\endcsname\relax
  \expandafter\ifx\csname X#1\endcsname\relax
    % If not defined, say something at least.
    % If not defined, say something at least.
    \angleleft un\-de\-fined\angleright
    \angleleft un\-de\-fined\angleright
 
    \iflinks
    \ifhavexrefs
    \ifhavexrefs
      \message{\linenumber Undefined cross reference `#1'.}%
      \message{\linenumber Undefined cross reference `#1'.}%
    \else
    \else
      \ifwarnedxrefs\else
      \ifwarnedxrefs\else
        \global\warnedxrefstrue
        \global\warnedxrefstrue
        \message{Cross reference values unknown; you must run TeX again.}%
        \message{Cross reference values unknown; you must run TeX again.}%
      \fi
      \fi
    \fi
    \fi
 
    \fi
  \else
  \else
    % It's defined, so just use it.
    % It's defined, so just use it.
    \csname X#1\endcsname
    \csname X#1\endcsname
  \fi
  \fi
  #2% Output the suffix in any case.
  #2% Output the suffix in any case.
Line 4490... Line 4925...
  \catcode`\<=\other
  \catcode`\<=\other
  \catcode`\>=\other
  \catcode`\>=\other
  \catcode`\$=\other
  \catcode`\$=\other
  \catcode`\#=\other
  \catcode`\#=\other
  \catcode`\&=\other
  \catcode`\&=\other
  % `\+ does not work, so use 43.
  \catcode`+=\other % avoid \+ for paranoia even though we've turned it off
  \catcode43=\other
 
  % Make the characters 128-255 be printing characters
  % Make the characters 128-255 be printing characters
  {%
  {%
    \count 1=128
    \count 1=128
    \def\loop{%
    \def\loop{%
      \catcode\count 1=\other
      \catcode\count 1=\other
Line 4660... Line 5094...
% time, we might be inside a group, and then its definitions would get
% time, we might be inside a group, and then its definitions would get
% undone and the next image would fail.
% undone and the next image would fail.
\openin 1 = epsf.tex
\openin 1 = epsf.tex
\ifeof 1 \else
\ifeof 1 \else
  \closein 1
  \closein 1
  \def\epsfannounce{\toks0 = }% do not bother showing banner
  % Do not bother showing banner with post-v2.7 epsf.tex (available in
 
  % doc/epsf.tex until it shows up on ctan).
 
  \def\epsfannounce{\toks0 = }%
  \input epsf.tex
  \input epsf.tex
\fi
\fi
%
%
\newif\ifwarnednoepsf
\newif\ifwarnednoepsf
\newhelp\noepsfhelp{epsf.tex must be installed for images to
\newhelp\noepsfhelp{epsf.tex must be installed for images to
Line 4690... Line 5126...
% #4 is just the usual extra ignored arg for parsing this stuff.
% #4 is just the usual extra ignored arg for parsing this stuff.
\def\imagexxx#1,#2,#3,#4\finish{%
\def\imagexxx#1,#2,#3,#4\finish{%
  % \epsfbox itself resets \epsf?size at each figure.
  % \epsfbox itself resets \epsf?size at each figure.
  \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi
  \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi
  \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi
  \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi
 
  % If the image is by itself, center it.
 
  \ifvmode
 
    \nobreak\medskip
 
    \nobreak
 
    \centerline{\epsfbox{#1.eps}}%
 
    \bigbreak
 
  \else
  \epsfbox{#1.eps}%
  \epsfbox{#1.eps}%
 
  \fi
}
}
 
 
% End of control word definitions.
 
 
 
 
 
\message{and turning on texinfo input format.}
 
 
 
\def\openindices{%
\message{paper sizes,}
   \newindex{cp}%
% And other related parameters.
   \newcodeindex{fn}%
 
   \newcodeindex{vr}%
 
   \newcodeindex{tp}%
 
   \newcodeindex{ky}%
 
   \newcodeindex{pg}%
 
}
 
 
 
% Set some numeric style parameters, for 8.5 x 11 format.
 
 
 
\hsize = 6in
 
\hoffset = .25in
 
\newdimen\defaultparindent \defaultparindent = 15pt
\newdimen\defaultparindent \defaultparindent = 15pt
\parindent = \defaultparindent
 
\parskip 3pt plus 2pt minus 1pt
 
\setleading{13.2pt}
 
\advance\topskip by 1.2cm
 
 
 
\chapheadingskip = 15pt plus 4pt minus 2pt
\chapheadingskip = 15pt plus 4pt minus 2pt
\secheadingskip = 12pt plus 3pt minus 2pt
\secheadingskip = 12pt plus 3pt minus 2pt
\subsecheadingskip = 9pt plus 2pt minus 2pt
\subsecheadingskip = 9pt plus 2pt minus 2pt
 
 
% Prevent underfull vbox error messages.
% Prevent underfull vbox error messages.
\vbadness=10000
\vbadness=10000
 
 
 
% Don't be so finicky about underfull hboxes, either.
 
\hbadness = 2000
 
 
% Following George Bush, just get rid of widows and orphans.
% Following George Bush, just get rid of widows and orphans.
\widowpenalty=10000
\widowpenalty=10000
\clubpenalty=10000
\clubpenalty=10000
 
 
% Use TeX 3.0's \emergencystretch to help line breaking, but if we're
% Use TeX 3.0's \emergencystretch to help line breaking, but if we're
% using an old version of TeX, don't do anything.  We want the amount of
% using an old version of TeX, don't do anything.  We want the amount of
% stretch added to depend on the line length, hence the dependence on
% stretch added to depend on the line length, hence the dependence on
% \hsize.  This makes it come to about 9pt for the 8.5x11 format.
% \hsize.  This makes it come to about 9pt for the 8.5x11 format.  We
 
% call this whenever the paper size is set.
%
%
 
\def\setemergencystretch{%
\ifx\emergencystretch\thisisundefined
\ifx\emergencystretch\thisisundefined
  % Allow us to assign to \emergencystretch anyway.
  % Allow us to assign to \emergencystretch anyway.
  \def\emergencystretch{\dimen0}%
  \def\emergencystretch{\dimen0}%
\else
\else
  \emergencystretch = \hsize
  \emergencystretch = \hsize
  \divide\emergencystretch by 45
  \divide\emergencystretch by 45
\fi
\fi
 
 
% Use @smallbook to reset parameters for 7x9.5 format  (or else 7x9.25)
 
\def\smallbook{
 
  \global\chapheadingskip = 15pt plus 4pt minus 2pt
 
  \global\secheadingskip = 12pt plus 3pt minus 2pt
 
  \global\subsecheadingskip = 9pt plus 2pt minus 2pt
 
  %
 
  \global\lispnarrowing = 0.3in
 
  \setleading{12pt}
 
  \advance\topskip by -1cm
 
  \global\parskip 2pt plus 1pt
 
  \global\hsize = 5in
 
  \global\vsize=7.5in
 
  \global\tolerance=700
 
  \global\hfuzz=1pt
 
  \global\contentsrightmargin=0pt
 
  \global\deftypemargin=0pt
 
  \global\defbodyindent=.5cm
 
  %
 
  \global\pagewidth=\hsize
 
  \global\pageheight=\vsize
 
  %
 
  \global\let\smalllisp=\smalllispx
 
  \global\let\smallexample=\smalllispx
 
  \global\def\Esmallexample{\Esmalllisp}
 
}
}
 
 
% Use @afourpaper to print on European A4 paper.
% Parameters in order: 1) textheight; 2) textwidth; 3) voffset;
\def\afourpaper{
% 4) hoffset; 5) binding offset; 6) topskip.  Then whoever calls us can
\global\tolerance=700
% set \parskip and call \setleading for \baselineskip.
\global\hfuzz=1pt
%
\setleading{12pt}
\def\internalpagesizes#1#2#3#4#5#6{%
\global\parskip 15pt plus 1pt
  \voffset = #3\relax
 
  \topskip = #6\relax
\global\vsize= 53\baselineskip
  \splittopskip = \topskip
 
  %
 
  \vsize = #1\relax
\advance\vsize by \topskip
\advance\vsize by \topskip
%\global\hsize=   5.85in     % A4 wide 10pt
  \outervsize = \vsize
\global\hsize=  6.5in
  \advance\outervsize by 0.6in
\global\outerhsize=\hsize
  \pageheight = \vsize
\global\advance\outerhsize by 0.5in
  %
\global\outervsize=\vsize
  \hsize = #2\relax
\global\advance\outervsize by 0.6in
  \outerhsize = \hsize
 
  \advance\outerhsize by 0.5in
\global\pagewidth=\hsize
  \pagewidth = \hsize
\global\pageheight=\vsize
  %
 
  \normaloffset = #4\relax
 
  \bindingoffset = #5\relax
 
  %
 
  \parindent = \defaultparindent
 
  \setemergencystretch
}
}
 
 
\bindingoffset=0pt
% @letterpaper (the default).
\normaloffset=\hoffset
\def\letterpaper{{\globaldefs = 1
\pagewidth=\hsize
  \parskip = 3pt plus 2pt minus 1pt
\pageheight=\vsize
  \setleading{13.2pt}%
 
  %
 
  % If page is nothing but text, make it come out even.
 
  \internalpagesizes{46\baselineskip}{6in}{\voffset}{.25in}{\bindingoffset}{36pt}%
 
}}
 
 
% Allow control of the text dimensions.  Parameters in order: textheight;
% Use @smallbook to reset parameters for 7x9.5 (or so) format.
% textwidth; voffset; hoffset; binding offset; topskip.
\def\smallbook{{\globaldefs = 1
% All require a dimension;
  \parskip = 2pt plus 1pt
% header is additional; added length extends the bottom of the page.
  \setleading{12pt}%
 
  %
\def\changepagesizes#1#2#3#4#5#6{
  \internalpagesizes{7.5in}{5.in}{\voffset}{.25in}{\bindingoffset}{16pt}%
 \global\vsize= #1
  %
 \global\topskip= #6
  \lispnarrowing = 0.3in
 \advance\vsize by \topskip
  \tolerance = 700
 \global\voffset= #3
  \hfuzz = 1pt
 \global\hsize= #2
  \contentsrightmargin = 0pt
 \global\outerhsize=\hsize
  \deftypemargin = 0pt
 \global\advance\outerhsize by 0.5in
  \defbodyindent = .5cm
 \global\outervsize=\vsize
  %
 \global\advance\outervsize by 0.6in
  \let\smalldisplay = \smalldisplayx
 \global\pagewidth=\hsize
  \let\smallexample = \smalllispx
 \global\pageheight=\vsize
  \let\smallformat = \smallformatx
 \global\normaloffset= #4
  \let\smalllisp = \smalllispx
 \global\bindingoffset= #5}
}}
 
 
 
% Use @afourpaper to print on European A4 paper.
 
\def\afourpaper{{\globaldefs = 1
 
  \setleading{12pt}%
 
  \parskip = 3pt plus 2pt minus 1pt
 
  %
 
  \internalpagesizes{53\baselineskip}{160mm}{\voffset}{4mm}{\bindingoffset}{44pt}%
 
  %
 
  \tolerance = 700
 
  \hfuzz = 1pt
 
}}
 
 
% A specific text layout, 24x15cm overall, intended for A4 paper.  Top margin
% A specific text layout, 24x15cm overall, intended for A4 paper.  Top margin
% 29mm, hence bottom margin 28mm, nominal side margin 3cm.
% 29mm, hence bottom margin 28mm, nominal side margin 3cm.
\def\afourlatex
\def\afourlatex{{\globaldefs = 1
        {\global\tolerance=700
  \setleading{13.6pt}%
        \global\hfuzz=1pt
  %
        \setleading{12pt}
  \afourpaper
        \global\parskip 15pt plus 1pt
  \internalpagesizes{237mm}{150mm}{3.6mm}{3.6mm}{3mm}{7mm}%
        \advance\baselineskip by 1.6pt
  %
        \changepagesizes{237mm}{150mm}{3.6mm}{3.6mm}{3mm}{7mm}
  \globaldefs = 0
        }
}}
 
 
% Use @afourwide to print on European A4 paper in wide format.
% Use @afourwide to print on European A4 paper in wide format.
\def\afourwide{\afourpaper
\def\afourwide{%
\changepagesizes{9.5in}{6.5in}{\hoffset}{\normaloffset}{\bindingoffset}{7mm}}
  \afourpaper
 
  \internalpagesizes{9.5in}{6.5in}{\hoffset}{\normaloffset}{\bindingoffset}{7mm}%
 
  %
 
  \globaldefs = 0
 
}
 
 
 
% @pagesizes TEXTHEIGHT[,TEXTWIDTH]
 
% Perhaps we should allow setting the margins, \topskip, \parskip,
 
% and/or leading, also. Or perhaps we should compute them somehow.
 
%
 
\def\pagesizes{\parsearg\pagesizesxxx}
 
\def\pagesizesxxx#1{\pagesizesyyy #1,,\finish}
 
\def\pagesizesyyy#1,#2,#3\finish{{%
 
  \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
 
  \globaldefs = 1
 
  %
 
  \parskip = 3pt plus 2pt minus 1pt
 
  \setleading{13.2pt}%
 
  %
 
  \internalpagesizes{#1}{\hsize}{\voffset}{\normaloffset}{\bindingoffset}{44pt}%
 
}}
 
 
 
% Set default to letter.
 
%
 
\letterpaper
 
 
 
\message{and turning on texinfo input format.}
 
 
% 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
\catcode`\~=\other
\catcode`\~=\other
\catcode`\^=\other
\catcode`\^=\other
Line 4862... Line 5316...
% (and those which the user can use as if they were ordinary).
% (and those which the user can use as if they were ordinary).
% Most of these we simply print from the \tt font, but for some, we can
% Most of these we simply print from the \tt font, but for some, we can
% use math or other variants that look better in normal text.
% use math or other variants that look better in normal text.
 
 
\catcode`\"=\active
\catcode`\"=\active
\def\activedoublequote{{\tt \char '042}}
\def\activedoublequote{{\tt\char34}}
\let"=\activedoublequote
\let"=\activedoublequote
\catcode`\~=\active
\catcode`\~=\active
\def~{{\tt \char '176}}
\def~{{\tt\char126}}
\chardef\hat=`\^
\chardef\hat=`\^
\catcode`\^=\active
\catcode`\^=\active
\def^{{\tt \hat}}
\def^{{\tt \hat}}
 
 
\catcode`\_=\active
\catcode`\_=\active
\def_{\ifusingtt\normalunderscore\_}
\def_{\ifusingtt\normalunderscore\_}
% Subroutine for the previous macro.
% Subroutine for the previous macro.
\def\_{\leavevmode \kern.06em \vbox{\hrule width.3em height.1ex}}
\def\_{\leavevmode \kern.06em \vbox{\hrule width.3em height.1ex}}
 
 
\catcode`\|=\active
\catcode`\|=\active
\def|{{\tt \char '174}}
\def|{{\tt\char124}}
\chardef \less=`\<
\chardef \less=`\<
\catcode`\<=\active
\catcode`\<=\active
\def<{{\tt \less}}
\def<{{\tt \less}}
\chardef \gtr=`\>
\chardef \gtr=`\>
\catcode`\>=\active
\catcode`\>=\active
Line 4963... Line 5417...
% file name, in case not using a pre-dumped format.
% file name, in case not using a pre-dumped format.
%
%
@gdef@fixbackslash{@ifx\@eatinput @let\ = @normalbackslash @fi
@gdef@fixbackslash{@ifx\@eatinput @let\ = @normalbackslash @fi
  @catcode`+=@active @catcode`@_=@active}
  @catcode`+=@active @catcode`@_=@active}
 
 
%% These look ok in all fonts, so just make them not special.  The @rm below
% These look ok in all fonts, so just make them not special.  The @rm below
%% makes sure that the current font starts out as the newly loaded cmr10
% makes sure that the current font starts out as the newly loaded cmr10
@catcode`@$=@other @catcode`@%=@other @catcode`@&=@other @catcode`@#=@other
@catcode`@$=@other @catcode`@%=@other @catcode`@&=@other @catcode`@#=@other
 
 
@textfonts
@textfonts
@rm
@rm
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.