%% TeX macros to handle texinfo files

%   Copyright (C) 1985, 1986, 1988, 1990 Free Software Foundation, Inc.

%This texinfo.tex file is free software; you can redistribute it and/or
%modify it under the terms of the GNU General Public License as
%published by the Free Software Foundation; either version 1, or (at
%your option) any later version.

%This texinfo.tex file is distributed in the hope that it will be
%useful, but WITHOUT ANY WARRANTY; without even the implied warranty
%of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
%General Public License for more details.

%You should have received a copy of the GNU General Public License
%along with this texinfo.tex file; see the file COPYING.  If not, write
%to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139,
%USA.


%In other words, you are welcome to use, share and improve this program.
%You are forbidden to forbid anyone else to use, share and improve
%what you give them.   Help stamp out software-hoarding!

\def\texinfoversion{2.16}
\message{Loading texinfo package [Version \texinfoversion]:}

% Print the version number if in a .fmt file.
\everyjob = {\message{[Texinfo version \texinfoversion]}}

% Save some parts of plain TeX that we redefine.

\let\ptexlbrace=\{
\let\ptexrbrace=\}
\let\ptexdot=\.
\let\ptexstar=\*
\let\ptexend=\end
\let\ptexbullet=\bullet
\let\ptexequiv=\equiv
\let\ptexb=\b
\let\ptexc=\c
\let\ptexi=\i
\let\ptext=\t
\let\ptexl=\l
\let\ptexL=\L

\def\tie{\penalty 10000\ }     % Save plain tex definition of ~.



\message{Basics,}
\chardef\other=12

\hyphenation{ap-pen-dix}
\hyphenation{mini-buf-fer mini-buf-fers}
\hyphenation{eshell}

% Margin to add to right of even pages, to left of odd pages.
\newdimen \bindingoffset  \bindingoffset=0pt

% We assign these in the last section of this file, after \hsize and
% \vsize have been set.
\newdimen\pagewidth \newdimen\pageheight


% Dimensions to add cropmarks at corners.
% (P. A. MacKay, 12 Nov. 1986)
%
\newdimen\cornerlong \newdimen\cornerthick
% These set the size of cropmarks:
\cornerlong=1pc \cornerthick=.3pt

% The page size including cropmarks:
\newdimen\outerhsize \newdimen\outervsize
\outerhsize=7in \outervsize=9.5in

\newdimen\topandbottommargin
\topandbottommargin=.75in


% \onepageout takes a vbox as an argument.  Note that \pagecontents
% does insertions itself, but you have to call it yourself.
\chardef\PAGE=255
\output = {\onepageout{\pagecontents\PAGE}}
\def\onepageout#1{%
  \ifodd\pageno
    \advance\hoffset by \bindingoffset
  \else
    \advance\hoffset by -\bindingoffset
  \fi
  % Use backslash in output files (the assignment is local to the
  % \output group).
  \escapechar = `\\
  \shipout\vbox{%
    {\let\hsize=\pagewidth \makeheadline}%
    \pagebody{#1}%
    {\let\hsize=\pagewidth \makefootline}%
  }%
  \advancepageno
  \ifnum\outputpenalty>-20000 \else\dosupereject\fi
}


% Here is a modification of the main output routine for Near East Publications
% This provides right-angle cropmarks at all four corners.
% The contents of the page are centerlined into the cropmarks,
% and any desired binding offset is added as an \hskip on either
% site of the centerlined box.  (P. A. MacKay, 12 November, 1986)
%
\def\croppageout#1{\hoffset=0pt % make sure this doesn't mess things up
		 \shipout
		 \vbox to \outervsize{\hsize=\outerhsize
                 \vbox{\line{\ewtop\hfill\ewtop}}
                 \nointerlineskip
                 \line{\vbox{\moveleft\cornerthick\nstop}
                       \hfill
                       \vbox{\moveright\cornerthick\nstop}}
                 \vskip \topandbottommargin
                 \centerline{\ifodd\pageno\hskip\bindingoffset\fi
			\vbox{
			{\let\hsize=\pagewidth \makeheadline}
			\pagebody{#1}
			{\let\hsize=\pagewidth \makefootline}}
			\ifodd\pageno\else\hskip\bindingoffset\fi}
		 \vskip \topandbottommargin plus1fill minus1fill
                 \boxmaxdepth\cornerthick
                 \line{\vbox{\moveleft\cornerthick\nsbot}
                       \hfill
                       \vbox{\moveright\cornerthick\nsbot}}
                 \nointerlineskip
                 \vbox{\line{\ewbot\hfill\ewbot}}
	}
  \advancepageno 
  \ifnum\outputpenalty>-20000 \else\dosupereject\fi}
%
% Do @cropmarks to get crop marks
\def\cropmarks{\let\onepageout=\croppageout }

\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}
{\catcode`\@ =11
\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
\dimen@=\dp#1 \unvbox#1
\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
\ifr@ggedbottom \kern-\dimen@ \vfil \fi}
}

%
% Here are the rules for the cropmarks.  Note that they are
% offset so that the space between them is truly \outerhsize or \outervsize
% (P. A. MacKay, 12 November, 1986)
%
\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}
\def\nstop{\vbox
  {\hrule height\cornerthick depth\cornerlong width\cornerthick}}
\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}
\def\nsbot{\vbox
  {\hrule height\cornerlong depth\cornerthick width\cornerthick}}

% Parse an argument, then pass it to #1.
% The argument can be delimited with [...] or with "..." or braces
% or it can be a whole line.
% #1 should be a macro which expects
% an ordinary undelimited TeX argument.

\def\parsearg #1{\let\next=#1\begingroup\obeylines\futurelet\temp\parseargx}

\def\parseargx{%
\ifx \obeyedspace\temp \aftergroup\parseargdiscardspace \else%
\aftergroup \parseargline %
\fi \endgroup}

{\obeyspaces %
\gdef\parseargdiscardspace {\begingroup\obeylines\futurelet\temp\parseargx}}

\gdef\obeyedspace{\ }

\def\parseargline{\begingroup \obeylines \parsearglinex}
{\obeylines %
\gdef\parsearglinex #1^^M{\endgroup \next {#1}}}

\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}

%% These are used to keep @begin/@end levels from running away
%% Call \inENV within environments (after a \begingroup)
\newif\ifENV \ENVfalse \def\inENV{\ifENV\relax\else\ENVtrue\fi}
\def\ENVcheck{%
\ifENV\errmessage{Still within an environment.  Type Return to continue.}
\endgroup\fi} % This is not perfect, but it should reduce lossage

% @begin foo  is the same as @foo, for now.
\newhelp\EMsimple{Type <Return> to continue}

\outer\def\begin{\parsearg\beginxxx}

\def\beginxxx #1{%
\expandafter\ifx\csname #1\endcsname\relax
{\errhelp=\EMsimple \errmessage{Undefined command @begin #1}}\else
\csname #1\endcsname\fi}

%% @end foo executes the definition of \Efoo.
%% foo can be delimited by doublequotes or brackets.

\def\end{\parsearg\endxxx}

\def\endxxx #1{%
\expandafter\ifx\csname E#1\endcsname\relax
\expandafter\ifx\csname #1\endcsname\relax
\errmessage{Undefined command @end #1}\else
\errorE{#1}\fi\fi
\csname E#1\endcsname}
\def\errorE#1{
{\errhelp=\EMsimple \errmessage{@end #1 not within #1 environment}}}

% Single-spacing is done by various environments.

\newskip\singlespaceskip \singlespaceskip = \baselineskip
\def\singlespace{%
{\advance \baselineskip by -\singlespaceskip
\kern \baselineskip}%
\baselineskip=\singlespaceskip
}

%% Simple single-character @ commands

% @@ prints an @
% Kludge this until the fonts are right (grr).
\def\@{{\tt \char '100}}

% Define @` and @' to be the same as ` and '
% but suppressing ligatures.
\def\`{{`}}
\def\'{{'}}

% Used to generate quoted braces.

\def\mylbrace {{\tt \char '173}}
\def\myrbrace {{\tt \char '175}}
\let\{=\mylbrace
\let\}=\myrbrace

% @: forces normal size whitespace following.
\def\:{\spacefactor=1000 }

% @* forces a line break.
\def\*{\hfil\break}

% @. is an end-of-sentence period.
\def\.{.\spacefactor=3000 }

% @w prevents a word break
\def\w #1{\hbox{#1}}

% @group ... @end group  forces ... to be all on one page.

\def\group{\begingroup% \inENV ???
\def \Egroup{\egroup\endgroup}
\vbox\bgroup}

% @need space-in-mils
% forces a page break if there is not space-in-mils remaining.

\newdimen\mil  \mil=0.001in

\def\need{\parsearg\needx}

\def\needx #1{\par %
\begingroup %
\dimen0=\pagetotal %
\advance \dimen0 by #1\mil %
\ifdim \dimen0>\pagegoal \vfill\eject \fi %
\endgroup}


% @br   forces paragraph break

\let\br = \par

% @dots{} produces an ellipsis.
%
\def\dots{$\ldots$}

% @bullet{} produces a bullet.
% 
\def\bullet{$\ptexbullet$}

% @minus{} produces a minus sign.
% 
\def\minus{$-$}

% Set sfcode to normal for the chars that usually have another value,
% thus stopping TeX from inserting end-of-sentence spaces.
% 
% Because this is called from inside an \edef, we must not use the
% `\<char> notation; the `\<char>' will be expanded as if it was a real
% control sequence.  So we use numbers.
% 
% These characters are `.?!:;,'
% 
\def\frenchspacing{\sfcode46=1000 \sfcode63=1000 \sfcode33=1000
  \sfcode58=1000 \sfcode59=1000 \sfcode44=1000 }


% @page    forces the start of a new page

\def\page{\par\vfill\supereject}

% @exdent text....
% outputs text on separate line in roman font, starting at standard page margin

\def\exdent{\errmessage{@exdent in filled text}}
  % @lisp, etc, define \exdent locally from \internalexdent

{\obeyspaces
\gdef\internalexdent{\parsearg\exdentzzz}}

\def\exdentzzz #1{{\advance \leftskip by -\lispnarrowing
\advance \hsize by -\leftskip
\advance \hsize by -\rightskip
\leftline{{\rm#1}}}}

% @include file    insert text of that file as input.

\def\include{\parsearg\includezzz}
\def\includezzz #1{{\def\thisfile{#1}\input #1
}}

\def\thisfile{}

% @center line   outputs that line, centered

\def\center{\parsearg\centerzzz}
\def\centerzzz #1{{\advance\hsize by -\leftskip
\advance\hsize by -\rightskip
\centerline{#1}}}

% @sp n   outputs n lines of vertical space

\def\sp{\parsearg\spxxx}
\def\spxxx #1{\par \vskip #1\baselineskip}

% @comment ...line which is ignored...
% @c is the same as @comment
% @ignore ... @end ignore  is another way to write a comment

\def\comment{\parsearg \commentxxx}

\def\commentxxx #1{}

\let\c=\comment

% Prevent errors for section commands.
% Used in @ignore and in failing conditionals.
\def\ignoresections{%
  \let\chapter = \relax
  \let\unnumbered = \relax
  \let\unnumberedsec = \relax
  \let\unnumberedsection = \relax
  \let\unnumberedsubsec = \relax
  \let\unnumberedsubsection = \relax
  \let\unnumberedsubsubsec = \relax
  \let\unnumberedsubsubsection = \relax
  \let\section = \relax
  \let\subsec = \relax
  \let\subsubsec = \relax
  \let\subsection = \relax
  \let\subsubsection = \relax
  \let\appendix = \relax
  \let\appendixsec = \relax
  \let\appendixsection = \relax
  \let\appendixsubsec = \relax
  \let\appendixsubsection = \relax
  \let\appendixsubsubsec = \relax
  \let\appendixsubsubsection = \relax
  \let\contents = \relax
  \let\smallbook = \relax
  \let\titlepage = \relax
}

\def\ignore{\begingroup\ignoresections\ignorexxx}
\long\def\ignorexxx #1\end ignore{\endgroup\ignorespaces}

\def\direntry{\begingroup\direntryxxx}
\long\def\direntryxxx #1\end direntry{\endgroup\ignorespaces}

% Conditionals to test whether a flag is set.

\outer\def\ifset{\begingroup\ignoresections\parsearg\ifsetxxx}

\def\ifsetxxx #1{\endgroup
\expandafter\ifx\csname IF#1\endcsname\relax \let\temp=\ifsetfail
\else \let\temp=\relax \fi
\temp}
\def\Eifset{}
\def\ifsetfail{\begingroup\ignoresections\ifsetfailxxx}
\long\def\ifsetfailxxx #1\end ifset{\endgroup\ignorespaces}

\outer\def\ifclear{\begingroup\ignoresections\parsearg\ifclearxxx}

\def\ifclearxxx #1{\endgroup
\expandafter\ifx\csname IF#1\endcsname\relax \let\temp=\relax
\else \let\temp=\ifclearfail \fi
\temp}
\def\Eifclear{}
\def\ifclearfail{\begingroup\ignoresections\ifclearfailxxx}
\long\def\ifclearfailxxx #1\end ifclear{\endgroup\ignorespaces}

% Some texinfo constructs that are trivial in tex

\def\iftex{}
\def\Eiftex{}
\def\ifinfo{\begingroup\ignoresections\ifinfoxxx}
\long\def\ifinfoxxx #1\end ifinfo{\endgroup\ignorespaces}

\long\def\menu #1\end menu{}
\def\asis#1{#1}

\def\node{\ENVcheck\parsearg\nodezzz}
\def\nodezzz#1{\nodexxx [#1,]}
\def\nodexxx[#1,#2]{\gdef\lastnode{#1}}
\let\lastnode=\relax

\def\donoderef{\ifx\lastnode\relax\else
\expandafter\expandafter\expandafter\setref{\lastnode}\fi
\let\lastnode=\relax}

\def\unnumbnoderef{\ifx\lastnode\relax\else
\expandafter\expandafter\expandafter\unnumbsetref{\lastnode}\fi
\let\lastnode=\relax}

\def\appendixnoderef{\ifx\lastnode\relax\else
\expandafter\expandafter\expandafter\appendixsetref{\lastnode}\fi
\let\lastnode=\relax}

\let\refill=\relax
  
% @setfilename is done at the beginning of every Texinfo file.
% So open here the files we need to have open while reading the input,
% instead of opening them at the outer level.
% This makes it possible to make a format file for texinfo.
% 
\def\setfilename{%
   \readauxfile
   \opencontents
   \openindices
   \fixbackslash  % Turn off hack to swallow `\input texinfo'.
   \global\let\setfilename=\comment % Ignore extra @setfilename cmds.
   \comment % Ignore the actual filename.
}

\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}



\message{fonts,}

% Font-change commands.
% 

% We use two font families that plain TeX does not: sans serif and caps
% and small caps.  The actual font files that we use are defined later.
% 
\let\tensf=\relax   \newfam\sffam   \def\sf{\fam=\sffam \tensf}
\let\tencpsc=\relax \newfam\cpscfam \def\cpsc{\fam=\cpscfam \tencpsc} 

% \definefonts{PREFIX}{DEFAULT} defines a group of fonts to be invoked as
% `\PREFIXfonts', with the font starting out as DEFAULT.  For example,
% PREFIX might be `text' and DEFAULT `\rm'.  It takes
% advantage of the fact that we typically want to define the various
% styles in basically the same way: by saying, for example,
% \font\textrm = cmr10
% \font\textsl = cmsl10
% \font\textit = cmti10
% ...
% Naturally, if we had lots of exceptions for each set of fonts, there
% wouldn't be any point to making this definition.  But we don't.
% We do allow fairly conveniently for a few exceptions, as described
% below.
% 
% To do this, we first define the fonts \PREFIX<style> (for the styles
% `rm', `sl', `it', and so on) to be cmr\PREFIXscale. If PREFIX is
% `text', this is like saying
% \font\textrm = cmr\textscale \font\textsl = cmsl\textscale
% and so on.
% 
% Actually, that is an oversimplification.  If a macro \textrmscale is
% defined, we do the equivalent of
% \font\textrm = cmr\textrmscale
% instead.  This allows us to use \definefonts even for a set of fonts
% that doesn't quite fall into the usual pattern.
% 
% Then we define the control sequence \PREFIXfonts to set each of the
% \ten<style> parameters to 
% \PREFIX<style>.  For example, we define \textfonts to say
% \let\tenrm = \textrm \let\tensl = \textsl, and so on.
% 
% The reason for so many levels of indirection is that we have several
% sets of fonts to define, and we want to be able to define them in
% different ways for different output formats.  For example, the fonts
% for 8.5x11 output should not necessarily be the same as the ones for
% 7x9.25 output.  These definitions make experimenting with different fonts
% relatively easy.
% 
% Although it seems strange to have \tenrm mean something other than
% 10-point roman, this minimizes the number of control sequences hanging
% around, and, more importantly, makes it easier to define the math fonts
% correctly.  If you think of `\tenrm' as `\mainrm', it doesn't seem so
% bad.
% 
\def\definefonts#1#2{%
  \def\prefix{#1}%
  \definefont{rm}{cmr}% roman
  \definefont{sl}{cmsl}% slanted
  \definefont{it}{cmti}% text italic
  \definefont{tt}{cmtt}% typewriter
  \definefont{sf}{cmss}% sans serif
  \definefont{cpsc}{cmcsc}% caps and small caps
  \definefont{bf}{cmbx}% bold
  \definefont{sy}{cmsy}% math symbol
  \definefont{mi}{cmmi}% math italic
  \expandafter\edef\csname #1fonts\endcsname{%
    \let\tenrm=\xfont{rm}\let\tensl=\xfont{sl}\let\tenit=\xfont{it}%
    \let\tentt=\xfont{tt}\let\tensf=\xfont{sf}\let\tencpsc=\xfont{cpsc}%
    \let\tenbf=\xfont{bf}\let\tensy=\xfont{sy}\let\teni=\xfont{mi}%
    #2% Select the default font.
    % Change the math fonts so that @math will work in titles.  We don't
    % need to worry about the script and scriptscript fonts, since
    % Texinfo has no way to produce superscripts or subscripts.
    \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy
    \textfont\slfam=\tensl \textfont\itfam=\tenit
    \textfont\ttfam=\tentt \textfont\sffam=\tensf
    \textfont\cpscfam=\tencpsc \textfont\bffam=\tenbf
  }%
}

% \definefont{STYLE}{FONT-PREFIX} usually defines \xfont{STYLE} to be
% the font FONT-PREFIX\scale, where \xfont{STYLE} expands to the
% globally defined \prefix followed by STYLE, and \scale is also
% globally defined.  For example, \definefont{rm}{cmr}, with \scale
% defined as `10' and \prefix defined as `text', is equivalent to
% \font\textrm = cmr10
% 
% But sometimes we want to override the FONT-PREFIX for a particular
% \prefix and a particular style.  So, if the control sequence
% `FONT-PREFIX\prefix font' exists, we use its expansion instead of
% FONT-PREFIX\scale.  In the case above, if \textrmfont is defined, we
% do the equivalent of \font\textrm = \textrmfont\scale.
% 
\def\definefont#1#2{%
  \edef\fontcs{\xfont{#1}}%
  \expandafter\ifx\csname #2\prefix font\endcsname\relax
    \edef\fontfilename{#2\scale{#1}}%
  \else
    \edef\fontfilename{\csname #2\prefix font\endcsname\scale{#1}}%
  \fi
  \expandafter\font\fontcs = \fontfilename\space % TeX eats that space.
}

% \scale{STYLE} finds the point size and scaling factor for the font
% `\prefix STYLE', by first looking for a control sequence `\prefix
% STYLEscale', and, if that is not defined, using `\prefix scale'.  For
% example, if \prefix is defined as `text', and STYLE as `rm', we expand
% \textrmscale if that is defined, and \textscale if it isn't.
% 
\def\scale#1{%
  \expandafter\ifx\csname\prefix #1scale\endcsname\relax
    \csname\prefix scale\endcsname
  \else
    \csname\prefix #1scale\endcsname
  \fi
}

% \xfont{STYLE} expands into \prefix STYLE.  For example, if \prefix is
% defined to be `text', and SYLE to be `rm', this expands to the control
% sequence \textrm.
% 
\def\xfont#1{\csname \prefix #1\endcsname}

% The \textscale macro and its friends are defined at the end of the
% file, where we set all the rest of the style parameters.  We therefore
% define a macro to define all the fonts, instead of defining them here,
% at the outer level.
% 
\def\defineallfonts{%
  \definefonts{index}\rm
  \definefonts{text}\rm
  \definefonts{subsubsec}\bf
  \definefonts{subsec}\bf
  \definefonts{sec}\bf
  \definefonts{chap}\bf
  \definetitlepagefonts
}

% The fonts for the titlepage don't fall into the scheme above at all.
% 
\def\definetitlepagefonts{%
  \font\titlerm = cmbx12 scaled \magstep3
  \font\authorrm = cmbx12 scaled \magstep1
}

% Define the user-level commands that change fonts.

% \smartitalic{ARG} outputs arg in italics, followed by an italic correction
% 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\smartitalic#1{{\sl #1}\futurelet\next\smartitalicx}

\let\i=\smartitalic
\let\var=\smartitalic
\let\dfn=\smartitalic
\let\emph=\smartitalic
\let\cite=\smartitalic

\def\b#1{{\bf #1}}
\let\strong=\b

\def\t#1{{\tt \rawbackslash \frenchspacing #1}\null}
\let\ttfont = \t
%\def\samp #1{`{\tt \rawbackslash \frenchspacing #1}'\null}
\def\samp #1{`\tclose{#1}'\null}
\def\key #1{{\tt \uppercase{#1}}\null}
\def\ctrl #1{{\tt \rawbackslash \hat}#1}

\let\file=\samp

% @code is a modification of @t,
% which makes spaces the same size as normal in the surrounding text.
\newdimen\tclosesave
\newdimen\tcloserm
\def\tclose#1{{\rm \tcloserm=\fontdimen2\font \tt \tclosesave=\fontdimen2\font
\fontdimen2\font=\tcloserm
\def\ {{\fontdimen2\font=\tclosesave{} }}%
 \rawbackslash \frenchspacing #1\fontdimen2\font=\tclosesave}\null}
\let\code=\tclose
%\let\exp=\tclose  %Was temporary

% @kbd is like @code, except that if the argument is just one @key command, 
% then @kbd has no effect.

\def\xkey{\key}
\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
\ifx\one\xkey\ifx\threex\three \key{#2}%
\else\tclose{\look}\fi
\else\tclose{\look}\fi}

\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par}


% Inline lisp is printed in sans serif.  (The @l command is
% undocumented, though.)
% 
\def\l#1{{\sf #1}\null}

\def\r#1{{\rm #1}}		% roman font
% Use of \lowercase was suggested.
\def\sc#1{{\cpsc #1}}	% smallcaps font
\def\ii#1{{\it #1}}		% italic font

% @math goes into math mode.
% We don't use $'s directly in the definition of \math because control
% sequences like \math are expanded when the toc file is written.  Then,
% we read the toc file back, the $'s will be normal characters (as they
% should be, according to the definition of Texinfo).  So we must use a
% control sequence to switch into and out of math mode.
% 
% This isn't quite enough for @math to work properly in indices, but it
% seems unlikely it will ever be needed there.
% 
\let\implicitmath = $
\def\math#1{\implicitmath\turnoffmathactive #1\implicitmath}



\message{page headings,}

\newskip\titlepagetopglue \newskip\titlepagebottomglue

% First the title page.  Must do @settitle before @titlepage.
\def\titlefont#1{{\titlerm #1}}

\newtoks\realeverypar
\newif\ifseenauthor
\newif\iffinishedtitlepage

\outer\def\titlepage{\begingroup \parindent=0pt \textfonts
   % No headings until after `@end titlepage'.
   \headline = {\hfil}%
   \footline = {\hfil}%
   % Leave some space at the very top of the page.
   \vglue\titlepagetopglue
   %
   % Now you can print the title using @title.
   \def\title{\parsearg\titlezzz}%
   \def\titlezzz##1{\leftline{\titlefont{##1}}
		    % print a rule at the page bottom also.
		    \finishedtitlepagefalse
		    \vskip4pt \hrule height 4pt \vskip4pt}%
   % No rule at page bottom unless we print one at the top with @title.
   \finishedtitlepagetrue
   %
   % Now you can put text using @subtitle.
   \def\subtitle{\parsearg\subtitlezzz}%
   \def\subtitlezzz##1{\rightline{\textfonts ##1}}%
   %
   % @author should come last, but may come many times.
   \def\author{\parsearg\authorzzz}%
   \def\authorzzz##1{\ifseenauthor\else\vskip 0pt plus 1filll\seenauthortrue\fi
      \leftline{\authorrm ##1}}%
   %  
   % Most title ``pages'' are actually two pages long, with space
   % at the top of the second.  We don't want the ragged left on the second.
   \let\oldpage = \page
   \def\page{%
      \iffinishedtitlepage\else
	 \finishtitlepage
      \fi
      \oldpage
      \let\page = \oldpage
      \hbox{}}%
}

\def\Etitlepage{%
   \iffinishedtitlepage\else
      \finishtitlepage
   \fi
   % It is important to do the page break before ending 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
   % after the title page, which we certainly don't want.
   \oldpage
   \endgroup
}

\def\finishtitlepage{%
   \vskip4pt \hrule height 2pt
   \vskip\titlepagebottomglue
   \finishedtitlepagetrue
}

%%% Set up page headings and footings.

\let\thispage=\folio

% Token registers for headers and footers.
\newtoks\evenheadline \newtoks\oddheadline
\newtoks\evenfootline \newtoks\oddfootline

% Make TeX use those variables.
\headline={{\textfonts
            \ifodd\pageno \the\oddheadline \else \the\evenheadline \fi}}
\footline={{\textfonts
            \ifodd\pageno \the\oddfootline \else \the\evenfootline \fi}\HEADINGShook}
\let\HEADINGShook=\relax

% Both the header and the footer are made up of three parts, any of
% which can be empty.  The parts are left-justified, centered, and
% right-justified on the line, respectively.  This macro typesets such a
% construction.  We don't need any \line command, because the output
% routine already says \line{\the\headline}.
% 
\def\doreferenceline#1#2#3{#1\hfil#2\hfil#3}

% Commands to set those variables.
% For example, this is equivalent to what `@headings double' does:
% 
% @evenheading @thispage @| @| @thistitle
% @oddheading @thischapter @| @| @thispage
%
\def\evenheading{\parsearg\evenheadingxxx}
\def\oddheading{\parsearg\oddheadingxxx}
\def\everyheading{\parsearg\everyheadingxxx}

\def\evenfooting{\parsearg\evenfootingxxx}
\def\oddfooting{\parsearg\oddfootingxxx}
\def\everyfooting{\parsearg\everyfootingxxx}

{
  % Set the catcode of `@', so that if the user puts `@'s in the
  % arguments, TeX will parse them correctly.
  % 
  \catcode`\@=0 

  \gdef\evenheadingxxx#1{\evenheadingyyy #1@|@|@|@|\finish}
  \gdef\evenheadingyyy#1@|#2@|#3@|#4\finish{%
    \global\evenheadline={\doreferenceline{#1}{#2}{#3}}}

  \gdef\oddheadingxxx#1{\oddheadingyyy #1@|@|@|@|\finish}
  \gdef\oddheadingyyy#1@|#2@|#3@|#4\finish{%
    \global\oddheadline={\doreferenceline{#1}{#2}{3}}}

  \gdef\everyheadingxxx#1{\everyheadingyyy #1@|@|@|@|\finish}
  \gdef\everyheadingyyy#1@|#2@|#3@|#4\finish{%
    \global\evenheadline={\doreferenceline{#1}{#2}{#3}}%
    \global\oddheadline={\doreferenceline{#1}{#2}{#3}}}

  \gdef\evenfootingxxx#1{\evenfootingyyy #1@|@|@|@|\finish}
  \gdef\evenfootingyyy#1@|#2@|#3@|#4\finish{%
    \global\evenfootline={\doreferenceline{#1}{#2}{#3}}}

  \gdef\oddfootingxxx#1{\oddfootingyyy #1@|@|@|@|\finish}
  \gdef\oddfootingyyy#1@|#2@|#3@|#4\finish{%
    \global\oddfootline={\doreferenceline{#1}{#2}{#3}}}

  \gdef\everyfootingxxx#1{\everyfootingyyy #1@|@|@|@|\finish}
  \gdef\everyfootingyyy#1@|#2@|#3@|#4\finish{%
    \global\evenfootline={\doreferenceline{#1}{#2}{#3}}
    \global\oddfootline={\doreferenceline{#1}{#2}{#3}}}
}% Reset the catcode of @.


% @headings double	turns headings on for double-sided printing.
% @headings single	turns headings on for single-sided printing.
% @headings off		turns them off.
% @headings on		same as @headings double, retained for compatibility.

% This definition of @headings delimits the argument with a space,
% instead of using \parsearg.
% 
\def\headings#1 {\csname HEADINGS#1\endcsname}

\def\HEADINGSoff{%
  \global\evenheadline = {\hfil}%
  \global\evenfootline = {\hfil}%
  \global\oddheadline = {\hfil}%
  \global\oddfootline = {\hfil}%
}

% If we turn headings on, set the page number to 1.
%
% For double-sided printing, put current file name in lower left corner,
% chapter name on inside top of right hand pages, document title on
% inside top of left hand pages, and page numbers on outside top edge of
% all pages.
% 
\def\HEADINGSdouble{%
  \global\pageno = 1
  \global\evenfootline = {\hfil}%
  \global\oddfootline = {\hfil}%
  \global\evenheadline = {\thispage\hfil\thistitle}%
  \global\oddheadline = {\thischapter\hfil\thispage}%
}
\let\HEADINGSon = \HEADINGSdouble

% For single-sided printing, chapter title goes across top left of page,
% page number on top right.
% 
\def\HEADINGSsingle{%
  \global\pageno = 1
  \global\evenfootline = {\hfil}%
  \global\oddfootline = {\hfil}%
  \global\evenheadline = {\thischapter\hfil\thispage}%
  \global\oddheadline = {\thischapter\hfil\thispage}%
}

\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
\let\HEADINGSdoubleafter=\HEADINGSafter
\def\HEADINGSdoublex{%
\global\evenfootline={\hfil}
\global\oddfootline={\hfil}
\global\evenheadline={\line{\folio\hfil\thistitle}}
\global\oddheadline={\line{\thischapter\hfil\folio}}
}

\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
\def\HEADINGSsinglex{%
\global\evenfootline={\hfil}
\global\oddfootline={\hfil}
\global\evenheadline={\line{\thischapter\hfil\folio}}
\global\oddheadline={\line{\thischapter\hfil\folio}}
}

% Subroutines used in generating headings
% Produces Day Month Year style of output.
\def\today{\number\day\space
\ifcase\month\or
January\or February\or March\or April\or May\or June\or
July\or August\or September\or October\or November\or December\fi
\space\number\year}

% Use this if you want the Month Day, Year style of output.
%\def\today{\ifcase\month\or
%January\or February\or March\or April\or May\or June\or
%July\or August\or September\or October\or November\or December\fi
%\space\number\day, \number\year}

% @settitle line...  specifies the title of the document, for use in
% headings via @thistitle.  It generates no output of its own.
%
\def\settitle{\parsearg\settitlezzz}
\def\settitlezzz#1{\gdef\thistitle{#1}}

\def\thistitle{\settitlezzz{Untitled}}



\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, @item(x), @kitem(x), @xitem(x).

% The values for all these parameters are set in the last section of
% this file.
% 
% Default indentation for @table.
\newdimen\tableindent

% Default indentation for @itemize and @enumerate.
\newdimen\itemindent

% Space between end of item in @table and start of item text.
\newdimen\itemmargin

% used internally for \itemindent minus \itemmargin
\newdimen\itemmax

% Note @table and @ftable define @item, @itemx, etc., with these defs.
% They also define \itemindex
% to index the item name in whatever manner is desired (perhaps none).

\def\internalBitem{\smallbreak \parsearg\itemzzz}
\def\internalBitemx{\par \parsearg\itemzzz}

\def\internalBxitem "#1"{\def\xitemsubtopix{#1} \smallbreak \parsearg\xitemzzz}
\def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \par \parsearg\xitemzzz}

\def\internalBkitem{\smallbreak \parsearg\kitemzzz}
\def\internalBkitemx{\par \parsearg\kitemzzz}

\def\kitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \lastfunction}}\itemzzz {#1}}

\def\xitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \xitemsubtopic}}\itemzzz {#1}}

\def\itemzzz #1{\begingroup %
\advance \hsize by -\rightskip %
\advance \hsize by -\leftskip %
\setbox0=\hbox{\itemfont{#1}}%
\itemindex{#1}%
\parskip=0in %
\noindent %
\ifdim \wd0>\itemmax %
\vadjust{\penalty 10000}%
\hbox to \hsize{\hskip -\tableindent\box0\hss}\ %
\else %
\hbox to 0pt{\hskip -\tableindent\box0\hss}%
\fi %
\endgroup %
}

\def\item{\errmessage{@item while not in a table}}
\def\itemx{\errmessage{@itemx while not in a table}}
\def\kitem{\errmessage{@kitem while not in a table}}
\def\kitemx{\errmessage{@kitemx while not in a table}}
\def\xitem{\errmessage{@xitem while not in a table}}
\def\xitemx{\errmessage{@xitemx while not in a table}}

% @description is not a documented command, and, more important, this
% definition produces a numeral `1' for every @item.  So it's commented
% out.
% \def\description{\tablez{\dontindex}{1}{}{}{}{}}

% The definition of @table.
\def\table{\begingroup\inENV\obeylines\obeyspaces\tablex}
{\obeylines\obeyspaces%
\gdef\tablex #1^^M{\tabley\dontindex{#1}\Etable   \endtabley}}

% @ftable puts an entry in the function index for each of the items.
% 
\def\ftable{\begingroup\inENV\obeylines\obeyspaces\ftablex}
{\obeylines\obeyspaces%
\gdef\ftablex #1^^M{\tabley\fnitemindex{#1}\Eftable   \endtabley}}

\def\dontindex #1{}
\def\fnitemindex #1{\doind {fn}{\code{#1}}}%

% \tabley just passes its arguments along to \tablez.
% 
{\obeyspaces%
\gdef\tabley#1#2#3 #4 #5 #6\endtabley{%
\endgroup\tablez{#1}{#2}{#3}{#4}{#5}{#6}}%
}

% \tablez{INDEX-CMD}{ITEM-CMD}{END-CMD}{LEFT}{INDENT}{RIGHT} sets
% up for a table.  \itemzzz invokes INDEX-CMD on each item text.  When
% \itemzzz produces the item text, it calls ITEM-CMD on the item text.
% END-CMD is defined to be the end of the table.  The remainder of the
% arguments are never used in the current user-level commands, but are
% retained for generality's sake: FONT determines the font the item is
% produced in, LEFT is additional space (in mils) to add to the left
% margin, INDENT a new setting for \tableindent, and RIGHT additional
% space to add to the right margin.
% 
\def\tablez#1#2#3#4#5#6{%
  \aboveenvbreak
  \begingroup  % Group ends when END-CMD is expanded.
    \let\itemindex = #1%
    \def\itemfont{#2}%
    \def#3{\endgraf\endgroup\afterenvbreak}%
    \ifnum 0#4>0 \advance \leftskip by #3\mil \fi
    \ifnum 0#5>0 \tableindent=#4\mil \fi
    \ifnum 0#6>0 \advance \rightskip by #5\mil \fi
    \itemmax = \tableindent \advance \itemmax by -\itemmargin
    \advance \leftskip by \tableindent
    \parindent = 0pt \parskip = \smallskipamount
    \let\item = \internalBitem
    \let\itemx = \internalBitemx
    \let\kitem = \internalBkitem
    \let\kitemx = \internalBkitemx
    \let\xitem = \internalBxitem
    \let\xitemx = \internalBxitemx
}

% This is the counter used by @enumerate, which is really @itemize

\newcount \itemno

\def\itemize{\parsearg\itemizezzz}

\def\itemizezzz #1{\itemizey {#1}{\Eitemize}}

\def\itemizey #1#2{%
\aboveenvbreak %
\begingroup %
\itemno = 0 %
\itemmax=\itemindent %
\advance \itemmax by -\itemmargin %
\advance \leftskip by \itemindent %
\parindent = 0pt
\parskip = \smallskipamount
\ifdim \parskip=0pt \parskip=2pt \fi%
\def#2{\endgraf\endgroup\afterenvbreak}%
\def\itemcontents{#1}%
\let\item=\itemizeitem}

\def\enumerate{\itemizey{\the\itemno.}\Eenumerate\flushcr}

% Definition of @item while inside @itemize.

\def\itemizeitem{%
\advance\itemno by 1
{\let\par=\endgraf \smallbreak}%
\ifhmode \errmessage{\in hmode at itemizeitem}\fi
{\parskip=0in \hskip 0pt
\hbox to 0pt{\hss \itemcontents\hskip \itemmargin}%
\vadjust{\penalty 300}}%
\flushcr}



\message{indexing,}
% Index generation facilities

% Define \newwrite to be identical to plain tex's \newwrite
% except not \outer, so it can be used within \newindex.
{\catcode`\@=11
\gdef\newwrite{\alloc@7\write\chardef\sixt@@n}}

% \newindex {foo} defines an index named foo.
% It automatically defines \fooindex such that
% \fooindex ...rest of line... puts an entry in the index foo.
% 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 name of an index should be no more than 2 characters long
% for the sake of vms.

\def\newindex #1{
\expandafter\newwrite \csname#1indfile\endcsname% Define number for output file
\openout \csname#1indfile\endcsname \jobname.#1	% Open the file
\expandafter\xdef\csname#1index\endcsname{%	% Define \xxxindex
\noexpand\doindex {#1}}
}

% @defindex foo  ==  \newindex{foo}

\def\defindex{\parsearg\newindex}

% Define @defcodeindex, like @defindex except put all entries in @code.

\def\newcodeindex #1{
\expandafter\newwrite \csname#1indfile\endcsname% Define number for output file
\openout \csname#1indfile\endcsname \jobname.#1	% Open the file
\expandafter\xdef\csname#1index\endcsname{%	% Define \xxxindex
\noexpand\docodeindex {#1}}
}

\def\defcodeindex{\parsearg\newcodeindex}

% @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.
\def\synindex #1 #2 {%
\expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname
\expandafter\let\csname#1indfile\endcsname=\synindexfoo
\expandafter\xdef\csname#1index\endcsname{%	% Define \xxxindex
\noexpand\doindex {#2}}%
}

% @syncodeindex foo bar   similar, but put all entries made for index foo
% inside @code.
\def\syncodeindex #1 #2 {%
\expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname
\expandafter\let\csname#1indfile\endcsname=\synindexfoo
\expandafter\xdef\csname#1index\endcsname{%	% Define \xxxindex
\noexpand\docodeindex {#2}}%
}

% Define \doindex, the driver for all \fooindex macros.
% Argument #1 is generated by the calling \fooindex macro,
%  and it is "foo", the name of the index.

% \doindex just uses \parsearg; it calls \doind for the actual work.
% This is because \doind is more useful to call from other macros.

% There is also \dosubind {index}{topic}{subtopic}
% which makes an entry in a two-level index such as the operation index.

\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer}
\def\singleindexer #1{\doind{\indexname}{#1}}

% like the previous two, but they put @code around the argument.
\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}
\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}

% This macro prevents unwanted expansion of control sequences when
% writing the \entry lines to the index.  We put a space after the
% control sequences we output that are not followed by arguments.
% 
\def\indexdummies{%
  \def\w{\realbackslash w }%
  \def\bf{\realbackslash bf }%
  \def\rm{\realbackslash rm }%
  \def\sl{\realbackslash sl }%
  \def\sf{\realbackslash sf }%
  \def\tt{\realbackslash tt }%
  \def\cpsc{\realbackslash sc }%
  \def\gtr{\realbackslash gtr }%
  \def\less{\realbackslash less }%
  \def\_{{\realbackslash tt\realbackslash char95}}%
  \def\hat{\realbackslash hat }%
  \def\char{\realbackslash char }%
  \def\TeX{\realbackslash TeX }%
  \def\dots{\realbackslash dots }%
  \def\copyright{\realbackslash copyright }%
  \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\i##1{\realbackslash i{##1}}%
  \def\b##1{\realbackslash b{##1}}%
  \def\t##1{\realbackslash t{##1}}%
  \def\sc##1{\realbackslash sc{##1}}%
  \def\cite##1{\realbackslash cite{##1}}%
  \def\key##1{\realbackslash key{##1}}%
  \def\file##1{\realbackslash file{##1}}%
  \def\var##1{\realbackslash var{##1}}%
  \def\kbd##1{\realbackslash kbd{##1}}%
  \def\emph##1{\realbackslash emph{##1}}%
  \def\strong##1{\realbackslash strong{##1}}%
}

% \indexnofonts no-ops all font-change commands.
% 
% This is used when outputting the strings by which the index is sorted;
% otherwise, the font change commands get in the way of the sorting. 
% (In fact, an error results: output like `\initial {\}' is produced
% from input like `\entry {\t{_}}{1}{\code{\t{_}}}', which in turn is
% output by the Texinfo command `@kindex @t{_}'.)  The same applies to
% commands like @TeX{} and @copyright{} that produce special characters,
% but those kind of commands will probably never occur in a real index.
% 
\def\indexdummyfont#1{#1}

\def\indexnofonts{%
  \let\w=\indexdummyfont
  \let\r=\indexdummyfont
  \let\i=\indexdummyfont
  \let\b=\indexdummyfont
  \let\t=\indexdummyfont
  \let\sc=\indexdummyfont
  \let\emph=\indexdummyfont
  \let\strong=\indexdummyfont
  \let\cite=\indexdummyfont
  % Don't no-op \tt, since it isn't a user-level command
  % and is used in the definitions of the actuve chars like <, >, |...
  %\let\tt=\indexdummyfont
  \let\tclose=\indexdummyfont
  \let\code=\indexdummyfont
  \let\file=\indexdummyfont
  \let\samp=\indexdummyfont
  \let\kbd=\indexdummyfont
  \let\key=\indexdummyfont
  \let\var=\indexdummyfont
}

% To define \realbackslash, we must make \ not be an escape.
% We must first make another character (@) an escape
% so we do not become unable to do a definition.

{\catcode`\@=0 \catcode`\\=\other
@gdef@realbackslash{\}}

\let\indexbackslash=0  %overridden during \printindex.

\def\doind #1#2{%
{\indexdummies % Must do this here, since \bf, etc expand at this stage
\count10=\lastpenalty %
\escapechar=`\\%
{\let\folio=0% Expand all macros now EXCEPT \folio
\def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now
% so it will be output as is; and it will print as backslash in the indx.
%
% 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}%
}%
% 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}}}%
\temp }%
\penalty\count10}}

\def\dosubind #1#2#3{%
{\indexdummies % Must do this here, since \bf, etc expand at this stage
\count10=\lastpenalty %
\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
%  \entry {sortstring}{page}{topic}
% or
%  \entry {sortstring}{page}{topic}{subtopic}
% The texindex program reads in these files and writes files
% containing these kinds of lines:
%  \initial {c}
%     before the first topic whose initial is c
%  \entry {topic}{pagelist}
%     for a topic that is used without subtopics
% 
% (Texinfo doesn't support \primary and \secondary entries.)
%  \primary {topic}
%     for the beginning of a topic that is used with subtopics
%  \secondary {subtopic}{pagelist}
%     for each subtopic.

% Define the user-accessible indexing commands 
% @findex, @vindex, @kindex, @cindex.

\def\findex {\fnindex}
\def\kindex {\kyindex}
\def\cindex {\cpindex}
\def\vindex {\vrindex}
\def\tindex {\tpindex}
\def\pindex {\pgindex}

\def\cindexsub {\begingroup\obeylines\cindexsub}
{\obeylines %
\gdef\cindexsub "#1" #2^^M{\endgroup %
\dosubind{cp}{#2}{#1}}}

% Define the macros used in formatting output of the sorted index material.

% This is what you call to cause a particular index to get printed.
% Write
% @unnumbered Function Index
% @printindex fn

\def\printindex{\parsearg\doprintindex}

% Space by which we change the leading in the index.
\newdimen\indexleadingoffset

% This sets up to print an index #1.
\def\doprintindex#1{\tex % This starts a group.
  \catcode`\%=\other\catcode`\&=\other\catcode`\#=\other
  \catcode`\$=\other\catcode`\_=\other
  \catcode`\~=\other
  % The following don't help, since the chars were translated
  % when the raw index was written, and their fonts were discarded
  % due to \indexnofonts.
  %\catcode`\"=\active
  %\catcode`\^=\active
  %\catcode`\_=\active
  %\catcode`\|=\active
  %\catcode`\<=\active
  %\catcode`\>=\active
  \def\indexbackslash{\rawbackslashxx}%
  \indexfonts
  \tolerance = 9500 \parfillskip = 0in \parskip = 0in \parindent = 0in
  \everypar = {\hangindent = 1in}
  \openup\indexleadingoffset
  \begindoublecolumns
    \openin 1 \jobname.#1s
    \ifeof 1 \else
      \closein1
      \input \jobname.#1s
    \fi
  \enddoublecolumns
  \Etex
}

% These macros are used by the sorted index file itself; they control
% the appearance of the index.

% Glue before each group; assigned in the last section of this file.
% 
\newskip\initialskipamount

\outer\def\initial #1{%
{\let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt
\ifdim\lastskip<\initialskipamount
\removelastskip \penalty-200 \vskip \initialskipamount\fi
\line{\secbf#1\hfill}\kern 2pt\penalty10000}}

% \entry{ENTRY}{PAGE} produces the output for a single index entry ENTRY
% on page number PAGE.  This command is by far the most common in the
% index files we output.
% 
\outer\def\entry#1#2{{%
  \noindent\hbox{#1}\enspace\dotfill\enspace #2\par
}}

% Subtopics on index entries aren't supported.
% 
% Space by which secondary entries are indented.
% \newdimen\secondaryindent \secondaryindent = 0.5cm
%
% \def\primary #1{\line{#1\hfil}}
% 
% \def\secondary #1#2{
% {\parfillskip=0in \parskip=0in
% \hangindent =1in \hangafter=1
% \noindent\hskip\secondaryindent\hbox{#1}\dotfill #2\par
% }}

%% Define two-column mode, which is used in indexes.
%% Adapted from the TeXBook, page 416
\catcode `\@=11

\newbox\partialpage

% These are defined near the bottom of the file, after the \hsize and
% \vsize are established.
\newdimen\doublecolumnhsize \newdimen\doublecolumnvsize

% This is the space between columns, when printing in double-column
% format. 
\newdimen\gutter

\newdimen\availdimen@

\def\begindoublecolumns{\begingroup
  \output={\global\setbox\partialpage=\vbox{\unvbox255\kern -\topskip \kern \baselineskip}}\eject
  \output={\doublecolumnout} \hsize=\doublecolumnhsize \vsize=\doublecolumnvsize}
\def\enddoublecolumns{\output={\balancecolumns}\eject
  \endgroup \pagegoal=\vsize}

\def\doublecolumnout{\splittopskip=\topskip \splitmaxdepth=\maxdepth
  \dimen@=\pageheight \advance\dimen@ by-\ht\partialpage
  \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
  \onepageout\pagesofar \unvbox255 \penalty\outputpenalty}
\def\pagesofar{\unvbox\partialpage %
  \hsize=\doublecolumnhsize % have to restore this since output routine
%	      changes it to set cropmarks (P. A. MacKay, 12 Nov. 1986)
  \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}}
\def\balancecolumns{%
% Unset the glue.
  \setbox255=\vbox{\unvbox255}
  \dimen@=\ht255
  \advance\dimen@ by\topskip \advance\dimen@ by-\baselineskip
  \divide\dimen@ by2
  \availdimen@=\pageheight \advance\availdimen@ by-\ht\partialpage
% If the remaining data is too big for one page,
% output one page normally, then work with what remains.
  \ifdim \dimen@>\availdimen@
   {
     \splittopskip=\topskip \splitmaxdepth=\maxdepth
     \dimen@=\pageheight \advance\dimen@ by-\ht\partialpage
     \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
     \onepageout\pagesofar
   }
% Recompute size of what remains, in case we just output some of it.
  \dimen@=\ht255
  \advance\dimen@ by\topskip \advance\dimen@ by-\baselineskip
  \divide\dimen@ by2
  \fi
  \setbox0=\vbox{\unvbox255}
  \splittopskip=\topskip
  {\vbadness=10000 \loop \global\setbox3=\copy0
    \global\setbox1=\vsplit3 to\dimen@
    \ifdim\ht3>\dimen@ \global\advance\dimen@ by1pt \repeat}
  \setbox0=\vbox to\dimen@{\unvbox1}  \setbox2=\vbox to\dimen@{\unvbox3}
  \pagesofar}

\catcode `\@=\other

% We open the indices inside a macro instead of at the outer level so
% that we can make a format file.  See comments at \setfilename.
% 
\def\openindices{%
  \newindex{cp}%
  \newcodeindex{fn}%
  \newcodeindex{vr}%
  \newcodeindex{tp}%
  \newcodeindex{ky}%
  \newcodeindex{pg}%
}



\message{sectioning,}
% Define chapters, sections, etc.

\newcount \chapno
\newcount \secno
\newcount \subsecno
\newcount \subsubsecno

% This counter is funny since it counts through charcodes of letters A, B, ...
\newcount \appendixno  \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.
% page headings and footings can use it.  @section does likewise

\def\thischapter{} \def\thissection{}
\def\seccheck#1{\if \pageno<0 %
\errmessage{@#1 not allowed after generating table of contents}\fi
%
}

\def\chapternofonts{%
\let\rawbackslash=\relax%
\let\frenchspacing=\relax%
\def\TeX{\realbackslash TeX}
\def\dots{\realbackslash dots}
\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}}
}

\outer\def\chapter{\parsearg\chapterzzz}
\def\chapterzzz #1{\seccheck{chapter}%
\secno=0 \subsecno=0 \subsubsecno=0 \global\advance \chapno by 1 \message{Chapter \the\chapno}%
\chapmacro {#1}{\the\chapno}%
\gdef\thissection{#1}%
\gdef\thischaptername{#1}%
% We don't substitute the actual chapter name into \thischapter
% because we don't want its macros evaluated now.
\xdef\thischapter{Chapter \the\chapno: \noexpand\thischaptername}%
{\chapternofonts%
\edef\temp{{\realbackslash chapentry {#1}{\the\chapno}{\noexpand\folio}}}%
\escapechar=`\\%
\write \contentsfile \temp  %
\donoderef %
}}

\outer\def\appendix{\parsearg\appendixzzz}
\def\appendixzzz #1{\seccheck{appendix}%
\secno=0 \subsecno=0 \subsubsecno=0 \global\advance \appendixno by 1 \message{Appendix \appendixletter}%
\chapmacro {#1}{Appendix \appendixletter}%
\gdef\thissection{#1}%
\gdef\thischaptername{#1}%
\xdef\thischapter{Appendix \appendixletter: \noexpand\thischaptername}%
{\chapternofonts%
\edef\temp{{\realbackslash chapentry {#1}{Appendix \appendixletter}{\noexpand\folio}}}%
\escapechar=`\\%
\write \contentsfile \temp  %
\appendixnoderef %
}}

\outer\def\unnumbered{\parsearg\unnumberedzzz}
\def\unnumberedzzz #1{\seccheck{unnumbered}%
\secno=0 \subsecno=0 \subsubsecno=0 \message{(#1)}
\unnumbchapmacro {#1}%
\gdef\thischapter{#1}\gdef\thissection{#1}%
{\chapternofonts%
\edef\temp{{\realbackslash unnumbchapentry {#1}{\noexpand\folio}}}%
\escapechar=`\\%
\write \contentsfile \temp  %
\unnumbnoderef %
}}

\outer\def\section{\parsearg\sectionzzz}
\def\sectionzzz #1{\seccheck{section}%
\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
\gdef\thissection{#1}\secheading {#1}{\the\chapno}{\the\secno}%
{\chapternofonts%
\edef\temp{{\realbackslash secentry %
{#1}{\the\chapno}{\the\secno}{\noexpand\folio}}}%
\escapechar=`\\%
\write \contentsfile \temp %
\donoderef %
\penalty 10000 %
}}

\outer\def\appendixsection{\parsearg\appendixsectionzzz}
\outer\def\appendixsec{\parsearg\appendixsectionzzz}
\def\appendixsectionzzz #1{\seccheck{appendixsection}%
\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
\gdef\thissection{#1}\secheading {#1}{\appendixletter}{\the\secno}%
{\chapternofonts%
\edef\temp{{\realbackslash secentry %
{#1}{\appendixletter}{\the\secno}{\noexpand\folio}}}%
\escapechar=`\\%
\write \contentsfile \temp %
\appendixnoderef %
\penalty 10000 %
}}

\outer\def\unnumberedsec{\parsearg\unnumberedseczzz}
\def\unnumberedseczzz #1{\seccheck{unnumberedsec}%
\secheadingi{#1}\gdef\thissection{#1}%
{\chapternofonts%
\edef\temp{{\realbackslash unnumbsecentry{#1}{\noexpand\folio}}}%
\escapechar=`\\%
\write \contentsfile \temp %
\unnumbnoderef %
\penalty 10000 %
}}

\outer\def\subsection{\parsearg\subsectionzzz}
\def\subsectionzzz #1{\seccheck{subsection}%
\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
\subsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}%
{\chapternofonts%
\edef\temp{{\realbackslash subsecentry %
{#1}{\the\chapno}{\the\secno}{\the\subsecno}{\noexpand\folio}}}%
\escapechar=`\\%
\write \contentsfile \temp %
\donoderef %
\penalty 10000 %
}}

\outer\def\appendixsubsec{\parsearg\appendixsubseczzz}
\def\appendixsubseczzz #1{\seccheck{appendixsubsec}%
\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
\subsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}%
{\chapternofonts%
\edef\temp{{\realbackslash subsecentry %
{#1}{\appendixletter}{\the\secno}{\the\subsecno}{\noexpand\folio}}}%
\escapechar=`\\%
\write \contentsfile \temp %
\appendixnoderef %
\penalty 10000 %
}}

\outer\def\unnumberedsubsec{\parsearg\unnumberedsubseczzz}
\def\unnumberedsubseczzz #1{\seccheck{unnumberedsubsec}%
\subsecheadingi{#1}\gdef\thissection{#1}%
{\chapternofonts%
\edef\temp{{\realbackslash unnumbsubsecentry{#1}{\noexpand\folio}}}%
\escapechar=`\\%
\write \contentsfile \temp %
\unnumbnoderef %
\penalty 10000 %
}}

\outer\def\subsubsection{\parsearg\subsubsectionzzz}
\def\subsubsectionzzz #1{\seccheck{subsubsection}%
\gdef\thissection{#1}\global\advance \subsubsecno by 1 %
\subsubsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
{\chapternofonts%
\edef\temp{{\realbackslash subsubsecentry %
{#1}{\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}{\noexpand\folio}}}%\
\escapechar=`\\%
\write \contentsfile \temp %
\donoderef %
\penalty 10000 %
}}

\outer\def\appendixsubsubsec{\parsearg\appendixsubsubseczzz}
\def\appendixsubsubseczzz #1{\seccheck{appendixsubsubsec}%
\gdef\thissection{#1}\global\advance \subsubsecno by 1 %
\subsubsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
{\chapternofonts%
\edef\temp{{\realbackslash subsubsecentry{#1}%
{\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}{\noexpand\folio}}}%\
\escapechar=`\\%
\write \contentsfile \temp %
\appendixnoderef %
\penalty 10000 %
}}

\outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz}
\def\unnumberedsubsubseczzz #1{\seccheck{unnumberedsubsubsec}%
\subsubsecheadingi{#1}\gdef\thissection{#1}%
{\chapternofonts%
\edef\temp{{\realbackslash unnumbsubsubsecentry{#1}{\noexpand\folio}}}%
\escapechar=`\\%
\write \contentsfile \temp %
\unnumbnoderef %
\penalty 10000 %
}}

% These are variants which are not "outer", so they can appear in @ifinfo.
\def\infounnumbered{\parsearg\unnumberedzzz}
\def\infounnumberedsec{\parsearg\unnumberedseczzz}
\def\infounnumberedsubsec{\parsearg\unnumberedsubseczzz}
\def\infounnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz}

\def\infoappendix{\parsearg\appendixzzz}
\def\infoappendixsec{\parsearg\appendixseczzz}
\def\infoappendixsubsec{\parsearg\appendixsubseczzz}
\def\infoappendixsubsubsec{\parsearg\appendixsubsubseczzz}

\def\infochapter{\parsearg\chapterzzz}
\def\infosection{\parsearg\sectionzzz}
\def\infosubsection{\parsearg\subsectionzzz}
\def\infosubsubsection{\parsearg\subsubsectionzzz}

% Define heading commands.
%
% @majorheading
% 
\newskip\majorheadingskip \newskip\belowmajorheadingskip
\def\majorheadingbreak{\dobreak\majorheadingskip{-4000}}

\def\majorheading{\parsearg\majorheadingi}%
\def\majorheadingi#1{\genericheading{major}{#1}}


% @chapheading
% 
\newskip\chapheadingskip \newskip\belowchapheadingskip
\def\chapbreak{\dobreak \chapheadingskip {-4000}}

\def\chapheading{\parsearg\chapheadingi}%
\def\chapheadingi#1{\genericheading{chap}{#1}}%


% @heading
% These macros are also used by the section-level commands.
% 
\newskip\secheadingskip \newskip\belowsecheadingskip
\def\secheadingbreak{\dobreak\secheadingskip{-1000}}

\def\heading{\parsearg\secheadingi}
\def\secheading#1#2#3{\secheadingi {#2.#3\enspace #1}}
\def\secheadingi#1{\genericheading{sec}{#1}}


% @subheading
% These macros are also used by the subsection-level commands.
% 
\newskip\subsecheadingskip \newskip\belowsubsecheadingskip
\def\subsecheadingbreak{\dobreak\subsecheadingskip{-500}}

\def\subheading{\parsearg\subsecheadingi}
\def\subsecheading#1#2#3#4{\subsecheadingi{#2.#3.#4\enspace #1}}
\def\subsecheadingi#1{\genericheading{subsec}{#1}}%


% @subsubheading
% And these by the subsubsection-level commands.
% 
\newskip\subsubsecheadingskip \newskip\belowsubsubsecheadingskip
\def\subsubsecheadingbreak{\dobreak\subsecheadingskip{-250}}

\def\subsubheading{\parsearg\subsubsecheadingi}
\def\subsubsecheading#1#2#3#4#5{\subsubsecheadingi{#2.#3.#4.#5\enspace #1}}
\def\subsubsecheadingi#1{\genericheading{subsubsec}{#1}}


% Chapter openings need a little more work, because we allow the user to
% exercise some control over them.  They might start on the same page,
% with extra space, as all the other sectioning commands do; or they
% might start on a new page; or they might start on the next
% odd-numbered page.
% 
\def\chappager{\par\vfill\supereject}
\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi}

% Invoking @setchapternewpage determines the heading style as well as
% the way in which new chapters are started.
% 
\def\setchapternewpage{\parsearg\setchapternewpagezzz}
\def\setchapternewpagezzz#1{\csname CHAPPAG#1\endcsname}

\def\CHAPPAGoff{%
  \let\pchapsepmacro = \chapbreak
  \let\pagealignmacro = \chappager
}

% `@setchapternewpage on' is intended for single-sided printing.
\def\CHAPPAGon{%
  \let\pchapsepmacro = \chappager
  \let\pagealignmacro = \chappager
  \HEADINGSsingle
}

% `@setchapternewpage odd' is intended for double-sided printing.
\def\CHAPPAGodd{%
  \let\pchapsepmacro = \chapoddpage
  \let\pagealignmacro = \chapoddpage
  \HEADINGSdouble
}


% The (undocumented) @setchapterstyle command.
\def\setchapterstyle#1 {\csname CHAPF#1\endcsname}


% The `plain' chapter style.
% 
\def\CHAPFplain{%
  \global\let\chapmacro=\chfplain
  \global\let\unnumbchapmacro=\unnchfplain
}

% #1 is the chapter title, #2 the chapter number.
% 
\def\chfplain#1#2{\unnchfplain{#2\enspace #1}}

% #1 is the title.
% 
\def\unnchfplain#1{%
  \pchapsepmacro
  \leftline{\chapfonts #1}%
  \bigskip
  \penalty5000
}


% The `open' chapter style.
% 
\def\CHAPFopen{
\global\let\chapmacro=\chfopen
\global\let\unnumbchapmacro=\unnchfopen}


\def\unnchfopen #1{%
\chapoddpage {\chapfonts \line{\rm #1\hfill}}\bigskip \par\penalty 10000 %
}

\def\chfopen #1#2{\chapoddpage {\chapfonts
\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
\par\penalty 5000 %
}


% \dobreak{SKIP}{PENALTY} makes sure the last glue on the page is at
% least SKIP, and then inserts a penalty of PENALTY.
% 
\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}

% \genericheading{LEVEL}{TEXT} does the actual printing of a LEVEL
% heading with the text TEXT.  For example, LEVEL might be `subsec'.
% 
\def\genericheading#1#2{%
  \csname #1headingbreak\endcsname
  \leftline{\csname #1fonts\endcsname #2}%
  \nobreak
  \vskip\csname below#1headingskip\endcsname
  \nobreak
}



\message{toc printing,}

% Finish up the main text and prepare to read what we've written
% to \contentsfile.
%
\newdimen\tochsizeoffset

% Space above and below chapter-level entries.
\newskip\abovetocchapentryskip
\newskip\belowtocchapentryskip

% This parameter controls the indentation of the various levels.
\newdimen\tocindent

\def\startcontents#1{%
   \ifnum \pageno>0
      \pagealignmacro
      \immediate\closeout \contentsfile
      \pageno = -1		% Request roman numbered pages.
   \fi
   % Don't need to put `Contents' or `Short Contents' in the headline. 
   % It is abundantly clear what they are.
   \unnumbchapmacro{#1}\def\thischapter{}%
   \begingroup   		% Set up to handle contents files properly.
      \catcode`\\=0  \catcode`\{=1  \catcode`\}=2  \catcode`\@=11
      \raggedbottom             % Worry more about breakpoints than the bottom.
      \advance\hsize by \tochsizeoffset   % Don't use the full line length.
}

  
% Normal (long) toc, produced with @contents.
% 
\outer\def\contents{%
   \startcontents{Table of Contents}%
      \input \jobname.toc
   \endgroup
   \vfill \eject
}

% And just the chapters, produced with @summarycontents or
% @shortcontents.
\newdimen\shorttocleadingoffset

\outer\def\summarycontents{%
   \startcontents{Short Contents}%
      \openup\shorttocleadingoffset % Increase leading a little.
      \let\chapentryfonts = \shorttocfonts
      \abovetocchapentryskip = 0pt
      \belowtocchapentryskip = 0pt
      \def\secentry##1##2##3##4{}
      \def\unnumbsecentry##1##2{}
      \def\subsecentry##1##2##3##4##5{}
      \def\unnumbsubsecentry##1##2{}
      \def\subsubsecentry##1##2##3##4##5##6{}
      \def\unnumbsubsubsecentry##1##2{}
      \input \jobname.toc
   \endgroup
   \vfill \eject
}
\let\shortcontents = \summarycontents

% These macros generate individual entries in the table of contents.
% The first argument is the chapter or section name.
% The last argument is the page number.
% The arguments in between are the chapter number, section number, ...

% Chapter-level things, for both the long and short contents.
\def\chapentry#1#2#3{\dochapentry{#2\kern\toclabelspace}{#1}{#3}}
\def\unnumbchapentry#1#2{\dochapentry{}{#1}{#2}}

% Sections.  (These and lower elements do not appear in the short toc.)
\def\secentry#1#2#3#4{\dosecentry{#2.#3\kern\toclabelspace}{#1}{#4}}
\def\unnumbsecentry#1#2{\dosecentry{}{#1}{#2}}

% Subsections.
\def\subsecentry#1#2#3#4#5{\dosubsecentry{#2.#3.#4\kern\toclabelspace}{#1}{#5}}
\def\unnumbsubsecentry#1#2{\dosubsecentry{}{#1}{#2}}

% And subsubsections.
\def\subsubsecentry#1#2#3#4#5#6{%
  \dosubsubsecentry{#2.#3.#4.#5\kern\toclabelspace}{#1}{#6}}
\def\unnumbsubsubsecentry#1#2{\dosubsubsecentry{}{#1}{#2}}


% Now for the actual typesetting. In all these, #1 is the chapter number
% (or whatever), followed by whatever space is necessary, #2 is the text
% of the title, and #3 is the page number.  We put #1 right next to #2;
% this makes the numbers be flush left, and the titles of unnumbered
% chapters also flush left.
%
% If the toc has to be broken over pages, we would want to be at chapters 
% if at all possible; hence the negative \penalty.
% 
\def\dochapentry#1#2#3{%
   \penalty-300
   \vskip\abovetocchapentryskip
   \line{\chapentryfonts #1#2\dotfill \dopageno{#3}}%
   \nobreak\vskip\belowtocchapentryskip
   \nobreak
}

\def\dosecentry#1#2#3{%
   \line{\secentryfonts \hskip\tocindent #1#2\dotfill \dopageno{#3}}%
}

\def\dosubsecentry#1#2#3{%
   \line{\subsecentryfonts \hskip2\tocindent #1#2\dotfill \dopageno{#3}}%
}

\def\dosubsubsecentry#1#2#3{%
   \line{\subsubsecentryfonts \hskip3\tocindent #1#2\dotfill \dopageno{#3}}%
}

\def\dopageno#1{{\rm #1}}
\def\doshortpageno#1{{\rm #1}}



\message{environments,}

% Since these characters are used in examples, they should be an even
% number of \tt widths. Each \tt character is 1en, so two makes it 1em;
% that value is \fontdimen6.
% 
% Furthermore, these definitions must come after we define our fonts, so
% that we take the dimension from the font that will actually be used.
% So we define the characters in a macro, instead of at the outer level.
% 
\newbox\dblarrowbox    \newbox\longdblarrowbox
\newbox\pushcharbox    \newbox\bullbox
\newbox\equivbox       \newbox\errorbox

\def\mathcharbox#1{\hbox to \fontdimen6\tentt{\hfil$#1$\hfil}}

\def\definechars{%
  \global\setbox\dblarrowbox = \mathcharbox{\Rightarrow}%
  \global\setbox\longdblarrowbox = \mathcharbox{\mapsto}%
  \global\setbox\pushcharbox = \mathcharbox{\dashv}%
  \global\setbox\equivbox = \mathcharbox{\ptexequiv}%
  \global\setbox\errorbox = \hbox to 3\fontdimen6\tentt{\hfil
    \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
    \dimen2 = .55pt % Thickness of rules.
    % The text. (`r' is open on the right, `e' somewhat less so on the left.)
    \setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt}%
    \advance\hsize by -2\dimen2 % Account for rules.
    \vbox{%
       \hrule height\dimen2
       \hbox{\vrule width\dimen2 \kern3pt          % Space to left of text.
          \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
          \kern3pt\vrule width\dimen2}% Space to right.
       \hrule height\dimen2}
    \hfil}
}

% Define @point{}, @result{}, @expansion{}, @print{}, @equiv{}, and
% @error{} to copy the boxes we have made.
% 
\def\point{$\star$}
\def\result{\leavevmode\raise.15ex\copy\dblarrowbox}
\def\expansion{\leavevmode\raise.1ex\copy\longdblarrowbox}
\def\print{\leavevmode\lower.1ex\copy\pushcharbox}
\def\equiv{\leavevmode\lower.1ex\copy\equivbox}
\def\error{\leavevmode\lower.7ex\copy\errorbox}

% @tex ... @end tex    escapes into raw TeX.
% One exception: @ is still an escape character, so that @end tex works.
% But \@ or @@ will get a plain TeX @ character.

\def\tex{\begingroup
\catcode `\\=0 \catcode `\{=1 \catcode `\}=2
\catcode `\$=3 \catcode `\&=4 \catcode `\#=6
\catcode `\^=7 \catcode `\_=8 \catcode `\~=13 \let~=\tie
\catcode `\%=14
\catcode`\"=12
\catcode`\==12
\catcode`\|=12
\catcode`\<=12
\catcode`\>=12
\escapechar=`\\
%
\let\{=\ptexlbrace
\let\}=\ptexrbrace
\let\.=\ptexdot
\let\*=\ptexstar
\def\@={@}%
\let\bullet=\ptexbullet
\let\b=\ptexb \let\c=\ptexc \let\i=\ptexi \let\t=\ptext \let\l=\ptexl
\let\L=\ptexL
%
\let\Etex=\endgroup}

% Space by which @lisp and other environments are indented, sometimes
% only on the left, sometimes on both sides.
\newdimen\lispnarrowing

% This is the definition that ^M gets inside @lisp
% phr: changed space to \null, to avoid overfull hbox problems.
{\obeyspaces%
\gdef\lisppar{\null\endgraf}}

% Cause \obeyspaces to make each Space cause a word-separation
% rather than the default which is that it acts punctuation.
% This is because space in tt font looks funny.
{\obeyspaces %
\gdef\sepspaces{\def {\ }}}

\newskip\aboveenvskip \newskip\belowenvskip
\def\aboveenvbreak{{%
  \advance\aboveenvskip by \parskip  % why?
  \endgraf
  \ifdim\lastskip<\aboveenvskip
    \removelastskip
    \penalty-50
    \vskip\aboveenvskip
  \fi
}}

\def\afterenvbreak{\endgraf
  \ifdim\lastskip<\belowenvskip
    \removelastskip
    \penalty-50
    \vskip\belowenvskip
  \fi
}

% @lisp ... @end lisp.
% 
% @lisp does a \begingroup so it can redefine things,
% including the definition of @endlisp (which is normally erroneous). 
% The group ends at the `@end lisp'.
% 
\def\lisp{\aboveenvbreak\begingroup\inENV
\hfuzz=12truept % Don't be fussy
% Make spaces be word-separators rather than space tokens.
\sepspaces %
% Single space lines
\singlespace %
% The following causes blank lines not to be ignored
% by adding a space to the end of each line.
\let\par=\lisppar
\def\Elisp{\endgroup\afterenvbreak}%
\parskip=0pt
\advance \leftskip by \lispnarrowing
\parindent=0pt
\let\exdent=\internalexdent
\obeyspaces \obeylines \tt \rawbackslash
\def\next##1{}\next}


% We define @example ... @end example to be the same as @lisp.
% 
\let\example=\lisp
\def\Eexample{\Elisp}


% Ditto for @smallexample ... @end smallexample.  @smallbook redefines
% this.
% 
\let\smallexample=\lisp
\def\Esmallexample{\Elisp}


% This macro, from pavel@xerox, is used for @smallexample if @smallbook
% is in effect. 

\def\smalllispx{\aboveenvbreak\begingroup\inENV
%			This group ends at the end of the @lisp body
\hfuzz=12truept % Don't be fussy
% Make spaces be word-separators rather than space tokens.
\sepspaces %
% Single space lines
\singlespace %
% The following causes blank lines not to be ignored
% by adding a space to the end of each line.
\let\par=\lisppar
\def\Esmalllisp{\endgroup\afterenvbreak}%
\parskip=0pt
\advance \leftskip by \lispnarrowing
\parindent=0pt
\let\exdent=\internalexdent
\obeyspaces \obeylines \smallexamplefonts \rawbackslash
\def\next##1{}\next}

% This is @display; same as @lisp except use roman font.

\def\display{\begingroup\inENV %This group ends at the end of the @display body
\aboveenvbreak
% Make spaces be word-separators rather than space tokens.
\sepspaces %
% Single space lines
\singlespace %
% The following causes blank lines not to be ignored
% by adding a space to the end of each line.
\let\par=\lisppar
\def\Edisplay{\endgroup\afterenvbreak}%
\parskip=0pt
\advance \leftskip by \lispnarrowing
\parindent=0pt
\let\exdent=\internalexdent
\obeyspaces \obeylines
\def\next##1{}\next}

% This is @format; same as @lisp except use roman font and don't narrow margins

\def\format{\begingroup\inENV %This group ends at the end of the @format body
\aboveenvbreak
% Make spaces be word-separators rather than space tokens.
\sepspaces %
\singlespace %
% The following causes blank lines not to be ignored
% by adding a space to the end of each line.
\let\par=\lisppar
\def\Eformat{\endgroup\afterenvbreak}
\parskip=0pt \parindent=0pt
\obeyspaces \obeylines
\def\next##1{}\next}

% @flushleft and @flushright

\def\flushleft{\begingroup\inENV %This group ends at the end of the @format body
\aboveenvbreak
% Make spaces be word-separators rather than space tokens.
\sepspaces %
% The following causes blank lines not to be ignored
% by adding a space to the end of each line.
% This also causes @ to work when the directive name
% is terminated by end of line.
\let\par=\lisppar
\def\Eflushleft{\endgroup\afterenvbreak}%
\parskip=0pt \parindent=0pt
\obeyspaces \obeylines
\def\next##1{}\next}

\def\flushright{\begingroup\inENV %This group ends at the end of the @format body
\aboveenvbreak
% Make spaces be word-separators rather than space tokens.
\sepspaces %
% The following causes blank lines not to be ignored
% by adding a space to the end of each line.
% This also causes @ to work when the directive name
% is terminated by end of line.
\let\par=\lisppar
\def\Eflushright{\endgroup\afterenvbreak}%
\parskip=0pt \parindent=0pt
\advance \leftskip by 0pt plus 1fill
\obeyspaces \obeylines
\def\next##1{}\next}

% @quotation - narrow the margins.

\def\quotation{\begingroup\inENV %This group ends at the end of the @quotation body
{\parskip=0pt  % because we will skip by \parskip too, later
\aboveenvbreak}%
\singlespace
\parindent=0pt
\def\Equotation{\par\endgroup\afterenvbreak}%
\advance \rightskip by \lispnarrowing 
\advance \leftskip by \lispnarrowing}



\message{defuns,}
% Define formatter for defuns

\newdimen\defbodyindent
\newdimen\defargsindent
\newdimen\deftypemargin
\newdimen\deflastargmargin

\newcount\parencount
% define \functionparens, which makes ( and ) and & do special things.
% \functionparens affects the group it is contained in.
\def\activeparens{%
\catcode`\(=\active \catcode`\)=\active \catcode`\&=\active
\catcode`\[=\active \catcode`\]=\active}
{\activeparens % Now, smart parens don't turn on until &foo (see \amprm)
\gdef\functionparens{\boldbrax\let&=\amprm\parencount=0 }
\gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}

% Definitions of (, ) and & used in args for functions.
% This is the definition of ( outside of all parentheses.
\gdef\oprm#1 {{\rm\char`\(}#1 \bf \let(=\opnested %
\global\advance\parencount by 1 }
%
% This is the definition of ( when already inside a level of parens.
\gdef\opnested{\char`\(\global\advance\parencount by 1 }
%
\gdef\clrm{% Print a paren in roman if it is taking us back to depth of 0.
% also in that case restore the outer-level definition of (.
\ifnum \parencount=1 {\rm \char `\)}\sl \let(=\oprm \else \char `\) \fi
\global\advance \parencount by -1 }
% If we encounter &foo, then turn on ()-hacking afterwards
\gdef\amprm#1 {{\rm\&#1}\let(=\oprm \let)=\clrm\ }
%
\gdef\normalparens{\boldbrax\let&=\ampnr}
} % End of definition inside \activeparens
%% These parens (in \boldbrax) actually are a little bolder than the
%% contained text.  This is especially needed for [ and ]
\def\opnr{{\sf\char`\(}} \def\clnr{{\sf\char`\)}} \def\ampnr{\&}
\def\lbrb{{\bf\char`\[}} \def\rbrb{{\bf\char`\]}}

% First, defname, which formats the header line itself.
% #1 should be the function name.
% #2 should be the type of definition, such as "Function".

\def\defname #1#2{%
\leftskip = 0in  %
\noindent        %
\setbox0=\hbox{\hskip \deflastargmargin{\rm #2}\hskip \deftypemargin}%
\dimen0=\hsize \advance \dimen0 by -\wd0 % compute size for first line
\dimen1=\hsize \advance \dimen1 by -\defargsindent %size for continuations
\parshape 2 0in \dimen0 \defargsindent \dimen1     %
% Now output arg 2 ("Function" or some such)
% ending at \deftypemargin from the right margin,
% but stuck inside a box of width 0 so it does not interfere with linebreaking
\rlap{\rightline{{\rm #2}\hskip \deftypemargin}}%
\tolerance=10000 \hbadness=10000    % Make all lines underfull and no complaints
{\defunfonts #1}\enskip        % Generate function name
}

% Actually process the body of a definition
% #1 should be the terminating control sequence, such as \Edefun.
% #2 should be the "another name" control sequence, such as \defunx.
% #3 should be the control sequence that actually processes the header,
%    such as \defunheader.

\def\defparsebody #1#2#3{\begingroup\inENV% Environment for definitionbody
\medbreak %
% Define the end token that this defining construct specifies
% so that it will exit this group.
\def#1{\endgraf\endgroup\medbreak}%
\def#2{\begingroup\obeylines\activeparens\spacesplit#3}%
\parindent=0in \leftskip=\defbodyindent \rightskip=\defbodyindent %
\begingroup %
\catcode 61=\active %
\obeylines\activeparens\spacesplit#3}

\def\defmethparsebody #1#2#3#4 {\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 {\begingroup\obeylines\activeparens\spacesplit{#3{##1}}}%
\parindent=0in \leftskip=\defbodyindent \rightskip=\defbodyindent %
\begingroup\obeylines\activeparens\spacesplit{#3{#4}}}

\def\defopparsebody #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 {\def#4{##1}%
\begingroup\obeylines\activeparens\spacesplit{#3{##2}}}%
\parindent=0in \leftskip=\defbodyindent %
\begingroup\obeylines\activeparens\spacesplit{#3{#5}}}

% Split up #2 at the first space token.
% call #1 with two arguments:
%  the first is all of #2 before the space token,
%  the second is all of #2 after that space token.
% If #2 contains no space token, all of it is passed as the first arg
% and the second is passed as empty.

{\obeylines
\gdef\spacesplit#1#2^^M{\endgroup\spacesplitfoo{#1}#2 \relax\spacesplitfoo}%
\long\gdef\spacesplitfoo#1#2 #3#4\spacesplitfoo{%
\ifx\relax #3%
#1{#2}{}\else #1{#2}{#3#4}\fi}}

% So much for the things common to all kinds of definitions.

% Define @defun.

% First, define the processing that is wanted for arguments of \defun
% Use this to expand the args and terminate the paragraph they make up

\def\defunargs #1{\functionparens \sl
% Expand, preventing hyphenation at `-' chars.
% Note that groups don't affect changes in \hyphenchar.
\hyphenchar\tensl=0
#1%
\hyphenchar\tensl=45
\ifnum\parencount=0 \else \errmessage{unbalanced parens in @def arguments}\fi%
\interlinepenalty=10000
\advance\rightskip by 0pt plus 1fil
\endgraf\penalty 10000\vskip -\parskip\penalty 10000%
}

% Do complete processing of one @defun or @defunx line already parsed.

% @deffn Command forward-char nchars

\def\deffn{\defmethparsebody\Edeffn\deffnx\deffnheader}

\def\deffnheader #1#2#3{\doind {fn}{\code{#2}}%
\begingroup\defname {#2}{#1}\defunargs{#3}\endgroup %
\catcode 61=\other % Turn off change made in \defparsebody
}

% @defun == @deffn Function

\def\defun{\defparsebody\Edefun\defunx\defunheader}

\def\defunheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
\begingroup\defname {#1}{Function}%
\defunargs {#2}\endgroup %
\catcode 61=\other % Turn off change made in \defparsebody
}

% @defmac == @deffn Macro

\def\defmac{\defparsebody\Edefmac\defmacx\defmacheader}

\def\defmacheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
\begingroup\defname {#1}{Macro}%
\defunargs {#2}\endgroup %
\catcode 61=\other % Turn off change made in \defparsebody
}

% @defspec == @deffn Special Form

\def\defspec{\defparsebody\Edefspec\defspecx\defspecheader}

\def\defspecheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
\begingroup\defname {#1}{Special Form}%
\defunargs {#2}\endgroup %
\catcode 61=\other % Turn off change made in \defparsebody
}

% This definition is run if you use @defunx
% anywhere other than immediately after a @defun or @defunx.

\def\deffnx #1 {\errmessage{@deffnx in invalid context}}
\def\defunx #1 {\errmessage{@defunx in invalid context}}
\def\defmacx #1 {\errmessage{@defmacx in invalid context}}
\def\defspecx #1 {\errmessage{@defspecx in invalid context}}

% @defmethod, and so on

% @defop {Funny Method} foo-class frobnicate argument

\def\defop #1 {\def\defoptype{#1}%
\defopparsebody\Edefop\defopx\defopheader\defoptype}

\def\defopheader #1#2#3{\dosubind {fn}{\code{#2}}{on #1}% Make entry in function index
\begingroup\defname {#2}{\defoptype{} on #1}%
\defunargs {#3}\endgroup %
}

% @defmethod == @defop Method

\def\defmethod{\defmethparsebody\Edefmethod\defmethodx\defmethodheader}

\def\defmethodheader #1#2#3{\dosubind {fn}{\code{#2}}{on #1}% entry in function index
\begingroup\defname {#2}{Operation on #1}%
\defunargs {#3}\endgroup %
}

% @defcv {Class Option} foo-class foo-flag

\def\defcv #1 {\def\defcvtype{#1}%
\defopparsebody\Edefcv\defcvx\defcvarheader\defcvtype}

\def\defcvarheader #1#2#3{%
\dosubind {vr}{\code{#2}}{of #1}% Make entry in var index
\begingroup\defname {#2}{\defcvtype{} of #1}%
\defvarargs {#3}\endgroup %
}

% @defivar == @defcv {Instance Variable}

\def\defivar{\defmethparsebody\Edefivar\defivarx\defivarheader}

\def\defivarheader #1#2#3{%
\dosubind {vr}{\code{#2}}{of #1}% Make entry in var index
\begingroup\defname {#2}{Instance variable of #1}%
\defvarargs {#3}\endgroup %
}

% These definitions are run if you use @defmethodx, etc.,
% anywhere other than immediately after a @defmethod, etc.

\def\defopx #1 {\errmessage{@defopx in invalid context}}
\def\defmethodx #1 {\errmessage{@defmethodx in invalid context}}
\def\defcvx #1 {\errmessage{@defcvx in invalid context}}
\def\defivarx #1 {\errmessage{@defivarx in invalid context}}

% Now @defvar

% First, define the processing that is wanted for arguments of @defvar.
% This is actually simple: just print them in roman.
% This must expand the args and terminate the paragraph they make up
\def\defvarargs #1{\normalparens #1%
\interlinepenalty=10000
\endgraf\penalty 10000\vskip -\parskip\penalty 10000}

% @defvr Counter foo-count

\def\defvr{\defmethparsebody\Edefvr\defvrx\defvrheader}

\def\defvrheader #1#2#3{\doind {vr}{\code{#2}}%
\begingroup\defname {#2}{#1}\defvarargs{#3}\endgroup}

% @defvar == @defvr Variable

\def\defvar{\defparsebody\Edefvar\defvarx\defvarheader}

\def\defvarheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
\begingroup\defname {#1}{Variable}%
\defvarargs {#2}\endgroup %
}

% @defopt == @defvr {User Option}

\def\defopt{\defparsebody\Edefopt\defoptx\defoptheader}

\def\defoptheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
\begingroup\defname {#1}{User Option}%
\defvarargs {#2}\endgroup %
}

% This definition is run if you use @defvarx
% anywhere other than immediately after a @defvar or @defvarx.

\def\defvrx #1 {\errmessage{@defvrx in invalid context}}
\def\defvarx #1 {\errmessage{@defvarx in invalid context}}
\def\defoptx #1 {\errmessage{@defoptx in invalid context}}

% Now define @deftp
% Args are printed in bold, a slight difference from @defvar.

\def\deftpargs #1{\bf \defvarargs{#1}}

% @deftp Class window height width ...

\def\deftp{\defmethparsebody\Edeftp\deftpx\deftpheader}

\def\deftpheader #1#2#3{\doind {tp}{\code{#2}}%
\begingroup\defname {#2}{#1}\deftpargs{#3}\endgroup}

% This definition is run if you use @deftpx, etc
% anywhere other than immediately after a @deftp, etc.

\def\deftpx #1 {\errmessage{@deftpx in invalid context}}



\message{cross-references,}
% Define cross-reference macros
\newwrite \auxfile

\newif\ifhavexrefs  % True if xref values are known.
\newif\ifwarnedxrefs  % True if we warned once that they aren't known.

% \setref{foo} defines a cross-reference point named foo.

\def\setref#1{%
\dosetq{#1-pg}{Ypagenumber}%
\dosetq{#1-snt}{Ysectionnumberandtype}}

\def\unnumbsetref#1{%
\dosetq{#1-pg}{Ypagenumber}%
\dosetq{#1-snt}{Ynothing}}

\def\appendixsetref#1{%
\dosetq{#1-pg}{Ypagenumber}%
\dosetq{#1-snt}{Yappendixletterandtype}}

% @inforef generates a cross-reference to an Info file that does not
% have an associated printed manual.
\def\inforef#1{\inforefzzz #1,,,,**}
\def\inforefzzz#1,#2,#3,#4**{%
  See Info file \file{\ignorespaces#3}, node `\ignorespaces#1'}

% @xref, @pxref, and @ref generate cross-references to specified points.
% For \xrefX, #1 is the node name, #2 the name of the Info
% cross-reference, #3 the printed node name, #4 the name of the Info
% file, #5 the name of the printed manual.  All but the node name can be
% omitted.
% 
\def\pxref#1{see \xrefX[#1,,,,,,,]}
\def\xref#1{See \xrefX[#1,,,,,,,]}
\def\ref#1{\xrefX[#1,,,,,,,]}
\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
  \def\printedmanual{\cite{\ignorespaces #5}}%
  \def\printednodename{\ignorespaces #3}%
  %
  \setbox1=\hbox{\printedmanual}%
  \setbox0=\hbox{\printednodename}%
  \ifdim \wd0=0pt
    \def\printednodename{\ignorespaces #1}%
  \fi
  %
  % If we use \unhbox0 and \unhbox1 to print the node names, TeX does
  % not insert empty discretionaries after hyphens, which means that it
  % will not find a line break at a hyphen in a node names.  Since some
  % manuals are best written with fairly long node names, containing
  % hyphens, this is a loss.  Therefore, we simply give the text of
  % the node name again, so it is as if TeX is seeing it for the first
  % time.
  \ifdim \wd1>0pt
    section `\printednodename' in \printedmanual
  \else
    \turnoffactive
    \refx{#1-snt}{} [\printednodename], page\tie\refx{#1-pg}{}%
  \fi
\endgroup}

% \dosetq is the interface for calls from other macros

% Use \turnoffactive so that punctuation chars such as underscore
% work in node names.
\def\dosetq #1#2{{\let\folio=0 \turnoffactive%
\edef\next{\write\auxfile{\internalsetq {#1}{#2}}}%
\next}}

% \internalsetq {foo}{page} expands into CHARACTERS 'xrdef {foo}{...expansion of \Ypage...}
% When the aux file is read, ' is the escape character

\def\internalsetq #1#2{'xrdef {#1}{\csname #2\endcsname}}

% Things to be expanded by \internalsetq

\def\Ypagenumber{\folio}

\def\Ynothing{}

\def\Ysectionnumberandtype{%
\ifnum\secno=0 Chapter\xreftie\the\chapno %
\else \ifnum \subsecno=0 Section\xreftie\the\chapno.\the\secno %
\else \ifnum \subsubsecno=0 %
Section\xreftie\the\chapno.\the\secno.\the\subsecno %
\else %
Section\xreftie\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno %
\fi \fi \fi }

\def\Yappendixletterandtype{%
\ifnum\secno=0 Appendix\xreftie'char\the\appendixno %
\else \ifnum \subsecno=0 Section\xreftie'char\the\appendixno.\the\secno %
\else \ifnum \subsubsecno=0 %
Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno %
\else %
Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %
\fi \fi \fi }

\gdef\xreftie{'tie}

% Use TeX 3.0's \inputlineno to get the line number, for better error
% messages, but if we're using an old version of TeX, don't do anything.
% 
\ifx\inputlineno\relax
  \let\linenumber = \empty % Non-3.0.
\else
  \def\linenumber{\the\inputlineno:\space}
\fi

% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME.
% If its value is nonempty, SUFFIX is output afterward.

\def\refx#1#2{%
  \expandafter\ifx\csname X#1\endcsname\relax
    % If not defined, say something at least.
    $\langle$un\-de\-fined$\rangle$%
    \ifhavexrefs
      \message{\linenumber Undefined cross reference `#1'.}%
    \else
      \ifwarnedxrefs\else
        \global\warnedxrefstrue
        \message{Cross-reference values unknown; you must run TeX again.}%
      \fi
    \fi
  \else
    % It's defined, so just use it.
    \csname X#1\endcsname
  \fi
  #2% Output the suffix in any case.
}

% Read the last existing aux file, if any.  No error if none exists.

% This is the macro invoked by entries in the aux file.
\def\xrdef #1#2{
{\catcode`\'=\other\expandafter \gdef \csname X#1\endcsname {#2}}}

\def\readauxfile{%
\begingroup
\catcode `\^^@=\other
\catcode `\=\other
\catcode `\=\other
\catcode `\^^C=\other
\catcode `\^^D=\other
\catcode `\^^E=\other
\catcode `\^^F=\other
\catcode `\^^G=\other
\catcode `\^^H=\other
\catcode `\=\other
\catcode `\^^L=\other
\catcode `\=\other
\catcode `\=\other
\catcode `\=\other
\catcode `\=\other
\catcode `\=\other
\catcode `\=\other
\catcode `\=\other
\catcode `\=\other
\catcode `\=\other
\catcode `\=\other
\catcode `\=\other
\catcode `\=\other
\catcode `\=\other
\catcode `\^^[=\other
\catcode `\^^\=\other
\catcode `\^^]=\other
\catcode `\^^^=\other
\catcode `\^^_=\other
\catcode `\@=\other
\catcode `\^=\other
\catcode `\~=\other
\catcode `\[=\other
\catcode `\]=\other
\catcode`\"=\other
\catcode`\_=\other
\catcode`\|=\other
\catcode`\<=\other
\catcode`\>=\other
\catcode `\$=\other
\catcode `\#=\other
\catcode `\&=\other
% the aux file uses ' as the escape.
% Turn off \ as an escape so we do not lose on
% entries which were dumped with control sequences in their names.
% For example, 'xrdef {$\leq $-fun}{page ...} made by @defun ^^
% Reference to such entries still does not work the way one would wish,
% but at least they do not bomb out when the aux file is read in.
\catcode `\{=1 \catcode `\}=2
\catcode `\%=\other
\catcode `\'=0
\catcode `\\=\other
\openin 1 \jobname.aux
\ifeof 1 \else \closein 1 \input \jobname.aux \global\havexrefstrue
\fi
% Open the new aux file.  TeX will close it automatically at exit.
\openout \auxfile=\jobname.aux
\endgroup}


% Footnotes.

\newcount \footnoteno

\def\supereject{\par\penalty -20000\footnoteno =0 }

\let\ptexfootnote=\footnote

{\catcode `\@=11
\long\gdef\footnote #1{\global\advance \footnoteno by \@ne
\edef\thisfootno{$^{\the\footnoteno}$}%
\let\@sf\empty
\ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi
\thisfootno\@sf \footnotezzz{#1}}
% \parsearg\footnotezzz}

\long\gdef\footnotezzz #1{\insert\footins{
\interlinepenalty\interfootnotelinepenalty
\splittopskip\ht\strutbox % top baseline for broken footnotes
\splitmaxdepth\dp\strutbox \floatingpenalty\@MM
\leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip
\footstrut\hang\textindent{\thisfootno}#1\strut}}

}%end \catcode `\@=11

% End of control word definitions.



\message{and turning on texinfo input format.}

% Default to the standard style for single-sided printing.
\CHAPPAGon

% The chapter style is `plain'.
\CHAPFplain


% Point sizes and scaling factors for the fonts.
% 
% Unfortunately, the index fonts don't fall perfectly into the scheme
% described at \definefonts, above, because cmcsc9 and cmbx9 are not
% standard sizes that Knuth defined.  (The American Mathematical Society
% has created a cmcsc9, and it is freely available, but we cannot assume
% everyone has it.)  Therefore, we must make an exception for \indexcsc
% and \indexbf.
% 
\def\indexscale{9}
  \def\indexcpscscale{10 at 9pt}
  \def\indexbfscale{10 at 9pt}
\def\textscale{12}
  \def\textbfscale{10 scaled \magstep1}
  \let\textcpscscale = \textbfscale
  \let\textsyscale = \textbfscale
  \def\textbffont{cmb}
\def\subsubsecscale{10 scaled 1315}
\let\subsecscale = \subsubsecscale
\def\secscale{10 scaled \magstep2}
\def\chapscale{10 scaled\magstep3}
\defineallfonts

% Fonts for @defun, et al.  If we used \let instead of \def we would
% have to redefine this inside \smallbook.  We may as well avoid that.
% 
\def\defunfonts{\subsecfonts}

% We have one sectioning command whose fonts haven't been defined by the
% above: @majorheading.
\def\majorfonts{\chapfonts}

% Define fonts for the tables of the contents.
% 
% We want roman, not bold, in the short toc.
% 
\def\shorttocfonts{\secfonts \rm}
\def\chapentryfonts{\secfonts}
\def\secentryfonts{\textfonts}
\def\subsecentryfonts{\textfonts}
\def\subsubsecentryfonts{\textfonts}

% Select the default fonts, so we can use em's and ex's in the
% definitions below.
% 
\textfonts

% Now that the fonts are defined, we can define the special characters.
% 
\definechars


% Basic text parameters, set for 8.5x11 format.
% 
% Original settings (85 chars/line):
%\hsize = 6.5in
%\parindent = 15pt
%\baselineskip = 15pt
%\parskip = 18pt plus1pt
%\advance\topskip by 1.2cm

% 12pt settings (68 chars/line);
\hsize = 6in
\hoffset = .25in
\parindent = 12pt
\baselineskip = 14pt
\parskip = .5\baselineskip plus.33\baselineskip minus.25\baselineskip
\topskip = 2\baselineskip
\tolerance = 500

% Parameters for sectioning commands.
% 
% 
% \chapheadingskip is used for @chapheading, and for chapter openings if
% `@setchapternewpage off' has been set.
% 
\chapheadingskip = 30pt plus 8pt minus 4pt
\belowchapheadingskip = 10pt

\majorheadingskip = 40pt plus 10pt minus 5pt
\belowmajorheadingskip = 12pt

\secheadingskip = 21pt plus 8pt minus 4pt
%\advance\secheadingskip by \parskip
\belowsecheadingskip = 8pt

\subsecheadingskip = 17pt plus 8pt minus 4pt
%\advance\subsecheadingskip by \parskip
\belowsubsecheadingskip = 6pt

% Since subsubsections use the same fonts as subsections, use the same
% skips, too.
\subsubsecheadingskip = \subsecheadingskip
\belowsubsecheadingskip = \belowsubsecheadingskip

% Glue at the top and bottom of the title page.
\titlepagetopglue = 1.5in
\titlepagebottomglue = 2pc


% Parameters for lists.
% 
% 
% Indentation for @table and the like.
\tableindent = .8in

% Indentation for @itemize and @enumerate.
\itemindent = .3in

% Space between end of item in @table and start of item text.
\itemmargin = .1in


% Parameters for the tables of contents.
% 
% 
% Space by which the leading is changed in the short contents.
\shorttocleadingoffset = 1pt

% Indentation of each level in the table of contents.
\tocindent = 3pc

% Space by which \hsize is increased (or decreased, if negative) in both
% kinds of contents.
\tochsizeoffset = 0pt

% Glue put above and below chapter entries in the long toc.
\abovetocchapentryskip = 12pt plus 3pt minus 1pt
\belowtocchapentryskip = 4pt

% Space put between numbers and titles in both kinds of contents.
% Since this is used for all the kinds of toc entries, and we are
% possibly using different fonts for the different kinds, we use \def
% instead of a straight assignment.  
\def\toclabelspace{1em}


% Parameters for environments.
% 
% 
% Space by which environments are indented, sometimes on both sides,
% sometimes only on the left.
\lispnarrowing = 0.4in

% Glue put above and below environments in addition to \parskip.
\aboveenvskip = 0pt
\belowenvskip = 0pt


% Parameters for the index.
% 
% Glue at the beginning of each group in the index, e.g., above the `A'
% that is printed before the all the entries beginning with `a'.
% Don't define this to have any shrink, or \balancecolumns will get
% confused.
\initialskipamount = 12pt plus4pt

% Space by which the leading is changed in the index.
\indexleadingoffset = -1pt

% Space between the columns.
\gutter = .2in

% Parameters for defuns.
% 
% Space by which the margins of all @defun-like commands are decreased.
\defbodyindent = .4in

% Space by which header lines after the first are indented. ??
\defargsindent = 50pt

% Additional space by which the type of the @defun (`Function' or `User
% Option' or like) is indented from the right margin.
\deftypemargin = 12pt

% ??
\deflastargmargin = 18pt


% Use @smallbook to reset parameters for 7x9.25 format.
% 
\outer\def\smallbook{%
  % We want to use 11pt, not 12pt, in @smallbook format.
  \def\textscale{10 scaled\magstephalf}
  \definefonts{text}\rm
  \textfonts
  %
  \hsize = 5in
  \baselineskip = 13pt
  \parskip = 3pt plus 1pt
  \topskip = 2\baselineskip
  \tolerance = 700
  \hfuzz = 1pt
  %
  \lispnarrowing = 0.3in
  \vsize = 7.5in
  % 
  % We want somewhat different spacing around environments.
  \aboveenvskip = 12pt plus 2pt minus 1pt
  \belowenvskip = 8pt plus 1pt minus 1pt
  %
  \let\smalllisp = \smalllispx
  \let\smallexample = \smalllispx
  \def\Esmallexample{\Esmalllisp}%
  \def\smallexamplefonts{\indexfonts \tt}%
  %
  \computeotherparameters
}

% After we've defined the page layout, this sets various secondary
% parameters that depend on it.
% 
\def\computeotherparameters{%
  \pagewidth = \hsize \pageheight = \vsize
  \doublecolumnhsize = \hsize
    \advance\doublecolumnhsize by -\gutter
    \divide\doublecolumnhsize by 2
  \doublecolumnvsize = 2\vsize
}

% This sets up the defaults for the secondary parameters in 8.5x11 format.
% 
\computeotherparameters


%% For a final copy, take out the rectangles
%% that mark overfull boxes (in case you have decided
%% that the text looks ok even though it passes the margin).
\def\finalout{\overfullrule=0pt}

% Prevent underfull vbox warnings, since they are common, harmless, and
% unavoidable without significant effort.
\vbadness=10000

% Define macros to output various characters with catcode for normal text.
\catcode`\"=\other
\catcode`\~=\other
\catcode`\^=\other
\catcode`\_=\other
\catcode`\|=\other
\catcode`\<=\other
\catcode`\>=\other
\catcode`\+=\other
\def\normaldoublequote{"}
\def\normaltilde{~}
\def\normalcaret{^}
\def\normalunderscore{_}
\def\normalverticalbar{|}
\def\normalless{<}
\def\normalgreater{>}
\def\normalplus{+}

% Turn off all special characters except @
% (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
% use math or other variants that look better in normal text.

% #1 is what to print if we are indeed using \tt; #2 is what to print
% otherwise.  Since all the Computer Modern typewriter fonts have zero
% interword stretch (and shrink), and it is reasonable to expect all
% typewriter fonts to have this property, we can check that font parameter.
% 
\def\ifusingtt#1#2{\ifdim \fontdimen3\the\font=0pt #1\else #2\fi}

\catcode`\"=\active
\def\activedoublequote{{\tt \char '042}}
\let"=\activedoublequote
\catcode`\~=\active
\def~{{\tt \char '176}}
\chardef\hat=`\^
\catcode`\^=\active
\def^{{\tt \hat}}
\catcode`\_=\active
  \def_{\ifusingtt{{\tt\char '137}}\_}
  % The ex dimension here is different from the definition in plain TeX;
  % it makes the thickness of the underscore dependent on the current
  % font, as it should be.  The particular value makes the rule
  % thickness be 0.4pt for cmr10, as it is in plain TeX.
  \def\_{\leavevmode \kern.06em \vbox{\hrule width.3em height.0929ex}}
\catcode`\|=\active
\def|{{\tt \char '174}}
\chardef \less=`\<
\catcode`\<=\active
\def<{{\tt \less}}
\chardef \gtr=`\>
\catcode`\>=\active
\def>{{\tt \gtr}}
\catcode`\+=\active
\def+{{\tt \char 43}}
%\catcode 27=\active
%\def^^[{$\diamondsuit$}

% Used sometimes to turn off (effectively) the active characters
% even after parsing them.
\def\turnoffactive{%
  \let" = \normaldoublequote
  \let~ = \normaltilde
  \let^ = \normalcaret
  \let_ = \normalunderscore
  \turnoffmathactive
}

% Turns off the characters that should be `normal' in @math.
\def\turnoffmathactive{%
  \let| = \normalverticalbar
  \let< = \normalless
  \let> = \normalgreater
  \let+ = \normalplus
}

% Set up an active definition for =, but don't enable it most of the time.
{\catcode`\==\active
\global\def={{\tt \char 61}}}

\catcode`\@=0

% \rawbackslashxx output one backslash character in current font
\global\chardef\rawbackslashxx=`\\
%{\catcode`\\=\other
%@gdef@rawbackslashxx{\}}

% \rawbackslash redefines \ as input to do \rawbackslashxx.
{\catcode`\\=\active
@gdef@rawbackslash{@let\=@rawbackslashxx }}

% \normalbackslash outputs one backslash in fixed width font.
\def\normalbackslash{{\tt\rawbackslashxx}}

% Say @foo, not \foo, in error messages.
\escapechar=`\@

% \ isn't an escape any more.
\catcode`\\=\active

% If a .fmt file is being used, we don't want the `\input texinfo' to show up.
% That is what \eatinput is for; after that, the `\' should revert to printing 
% a backslash.
%
@def@eatinput input texinfo{@fixbackslash}
@let\ = @eatinput

% On the other hand, perhaps the file did not have a `\input texinfo'. Then
% the first `\' in the file would cause an error. This macro tries to fix 
% that, assuming it is called before the first `\' could plausibly occur.
% 
@def@fixbackslash{@ifx\@eatinput @let\ = @normalbackslash @fi}

% These look ok in all fonts, so just make them not special.
@catcode`@$=@other @catcode`@%=@other @catcode`@&=@other @catcode`@#=@other
