summaryrefslogtreecommitdiff
path: root/lang/gcc/patches/patch-cp
diff options
context:
space:
mode:
Diffstat (limited to 'lang/gcc/patches/patch-cp')
-rw-r--r--lang/gcc/patches/patch-cp5093
1 files changed, 5093 insertions, 0 deletions
diff --git a/lang/gcc/patches/patch-cp b/lang/gcc/patches/patch-cp
new file mode 100644
index 00000000000..647c0ce7170
--- /dev/null
+++ b/lang/gcc/patches/patch-cp
@@ -0,0 +1,5093 @@
+$NetBSD$
+
+--- ../gcc-2.95.3/texinfo/texinfo.tex.orig 2001/04/23 12:02:20 1.1.1.3
++++ ../gcc-2.95.3/texinfo/texinfo.tex 2001/08/14 03:01:31 1.1.1.4
+@@ -1,52 +1,72 @@
+-%% TeX macros to handle Texinfo files.
+-%% $Id: texinfo.tex,v 1.2 1998/03/24 17:58:28 law Exp $
+-
+-% Copyright (C) 1985, 86, 88, 90, 91, 92, 93,
+-% 94, 95, 96, 97 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 2, 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, Inc., 59 Temple Place - Suite 330,
+-%Boston, MA 02111-1307, 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!
+-
+-
+-% Send bug reports to bug-texinfo@prep.ai.mit.edu.
+-% Please include a *precise* test case in each bug report.
+-
+-
+-% Make it possible to create a .fmt file just by loading this file:
+-% if the underlying format is not loaded, start by loading it now.
+-% Added by gildea November 1993.
++% texinfo.tex -- TeX macros to handle Texinfo files.
++%
++% Load plain if necessary, i.e., if running under initex.
+ \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
++%
++\def\texinfoversion{2000-05-28.15}
++%
++% Copyright (C) 1985, 86, 88, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99
++% 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 2, 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, Inc., 59 Temple Place - Suite 330,
++% Boston, MA 02111-1307, 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!
++%
++% Please try the latest version of texinfo.tex before submitting bug
++% reports; you can get the latest version from:
++% ftp://ftp.gnu.org/gnu/texinfo.tex
++% (and all GNU mirrors, see http://www.gnu.org/order/ftp.html)
++% ftp://texinfo.org/tex/texinfo.tex
++% ftp://us.ctan.org/macros/texinfo/texinfo.tex
++% (and all CTAN mirrors, finger ctan@us.ctan.org for a list).
++% /home/gd/gnu/doc/texinfo.tex on the GNU machines.
++% The texinfo.tex in any given Texinfo distribution could well be out
++% of date, so if that's what you're using, please check.
++% Texinfo has a small home page at http://texinfo.org/.
++%
++% Send bug reports to bug-texinfo@gnu.org. Please include including a
++% complete document in each bug report with which we can reproduce the
++% problem. Patches are, of course, greatly appreciated.
++%
++% To process a Texinfo manual with TeX, it's most reliable to use the
++% texi2dvi shell script that comes with the distribution. For a simple
++% manual foo.texi, however, you can get away with this:
++% tex foo.texi
++% texindex foo.??
++% tex foo.texi
++% tex foo.texi
++% dvips foo.dvi -o # or whatever, to process the dvi file; this makes foo.ps.
++% The extra runs of TeX get the cross-reference information correct.
++% Sometimes one run after texindex suffices, and sometimes you need more
++% than two; texi2dvi does it as many times as necessary.
++%
++% It is possible to adapt texinfo.tex for other languages. You can get
++% the existing language-specific files from ftp://ftp.gnu.org/gnu/texinfo/.
+
+-% This automatically updates the version number based on RCS.
+-\def\deftexinfoversion$#1: #2 ${\def\texinfoversion{#2}}
+-\deftexinfoversion$Revision: 1.2 $
+-\message{Loading texinfo package [Version \texinfoversion]:}
++\message{Loading texinfo [version \texinfoversion]:}
+
+ % If in a .fmt file, print the version number
+ % and turn on active characters that we couldn't do earlier because
+ % they might have appeared in the input file name.
+-\everyjob{\message{[Texinfo version \texinfoversion]}\message{}
++\everyjob{\message{[Texinfo version \texinfoversion]}%
+ \catcode`+=\active \catcode`\_=\active}
+
+ % Save some parts of plain tex whose names we will redefine.
+-
+ \let\ptexb=\b
+ \let\ptexbullet=\bullet
+ \let\ptexc=\c
+@@ -54,25 +74,17 @@
+ \let\ptexdot=\.
+ \let\ptexdots=\dots
+ \let\ptexend=\end
+-\let\ptexequiv = \equiv
++\let\ptexequiv=\equiv
++\let\ptexexclam=\!
+ \let\ptexi=\i
+ \let\ptexlbrace=\{
+ \let\ptexrbrace=\}
+ \let\ptexstar=\*
+ \let\ptext=\t
+
+-% Be sure we're in horizontal mode when doing a tie, since we make space
+-% equivalent to this in @example-like environments. Otherwise, a space
+-% at the beginning of a line will start with \penalty -- and
+-% since \penalty is valid in vertical mode, we'd end up putting the
+-% penalty on the vertical list instead of in the new paragraph.
+-{\catcode`@ = 11
+- % Avoid using \@M directly, because that causes trouble
+- % if the definition is written into an index file.
+- \global\let\tiepenalty = \@M
+- \gdef\tie{\leavevmode\penalty\tiepenalty\ }
+-}
+-
++% We never want plain's outer \+ definition in Texinfo.
++% For @tex, we can use \tabalign.
++\let\+ = \relax
+
+ \message{Basics,}
+ \chardef\other=12
+@@ -81,18 +93,47 @@
+ % starts a new line in the output.
+ \newlinechar = `^^J
+
+-% Set up fixed words for English.
+-\ifx\putwordChapter\undefined{\gdef\putwordChapter{Chapter}}\fi%
+-\def\putwordInfo{Info}%
+-\ifx\putwordSee\undefined{\gdef\putwordSee{See}}\fi%
+-\ifx\putwordsee\undefined{\gdef\putwordsee{see}}\fi%
+-\ifx\putwordfile\undefined{\gdef\putwordfile{file}}\fi%
+-\ifx\putwordpage\undefined{\gdef\putwordpage{page}}\fi%
+-\ifx\putwordsection\undefined{\gdef\putwordsection{section}}\fi%
+-\ifx\putwordSection\undefined{\gdef\putwordSection{Section}}\fi%
+-\ifx\putwordTableofContents\undefined{\gdef\putwordTableofContents{Table of Contents}}\fi%
+-\ifx\putwordShortContents\undefined{\gdef\putwordShortContents{Short Contents}}\fi%
+-\ifx\putwordAppendix\undefined{\gdef\putwordAppendix{Appendix}}\fi%
++% Set up fixed words for English if not already set.
++\ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi
++\ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi
++\ifx\putwordfile\undefined \gdef\putwordfile{file}\fi
++\ifx\putwordin\undefined \gdef\putwordin{in}\fi
++\ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi
++\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi
++\ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi
++\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi
++\ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi
++\ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi
++\ifx\putwordof\undefined \gdef\putwordof{of}\fi
++\ifx\putwordon\undefined \gdef\putwordon{on}\fi
++\ifx\putwordpage\undefined \gdef\putwordpage{page}\fi
++\ifx\putwordsection\undefined \gdef\putwordsection{section}\fi
++\ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi
++\ifx\putwordsee\undefined \gdef\putwordsee{see}\fi
++\ifx\putwordSee\undefined \gdef\putwordSee{See}\fi
++\ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi
++\ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi
++%
++\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi
++\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi
++\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi
++\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi
++\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi
++\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi
++\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi
++\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi
++\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi
++\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi
++\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi
++\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi
++%
++\ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi
++\ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi
++\ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi
++\ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi
++\ifx\putwordDeftypevar\undefined\gdef\putwordDeftypevar{Variable}\fi
++\ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi
++\ifx\putwordDeftypefun\undefined\gdef\putwordDeftypefun{Function}\fi
+
+ % Ignore a token.
+ %
+@@ -113,30 +154,35 @@
+ % since that produces some useless output on the terminal.
+ %
+ \def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
++\ifx\eTeXversion\undefined
+ \def\loggingall{\tracingcommands2 \tracingstats2
+ \tracingpages1 \tracingoutput1 \tracinglostchars1
+ \tracingmacros2 \tracingparagraphs1 \tracingrestores1
+ \showboxbreadth\maxdimen\showboxdepth\maxdimen
+ }%
++\else
++\def\loggingall{\tracingcommands3 \tracingstats2
++ \tracingpages1 \tracingoutput1 \tracinglostchars1
++ \tracingmacros2 \tracingparagraphs1 \tracingrestores1
++ \tracingscantokens1 \tracingassigns1 \tracingifs1
++ \tracinggroups1 \tracingnesting2
++ \showboxbreadth\maxdimen\showboxdepth\maxdimen
++}%
++\fi
+
+ % For @cropmarks command.
+ % Do @cropmarks to get crop marks.
+-%
++%
+ \newif\ifcropmarks
+ \let\cropmarks = \cropmarkstrue
+ %
+ % Dimensions to add cropmarks at corners.
+ % Added by P. A. MacKay, 12 Nov. 1986
+ %
+-\newdimen\cornerlong \newdimen\cornerthick
+-\newdimen\topandbottommargin
+-\newdimen\outerhsize \newdimen\outervsize
+-\cornerlong=1pc\cornerthick=.3pt % These set size of cropmarks
+-\outerhsize=7in
+-%\outervsize=9.5in
+-% Alternative @smallbook page size is 9.25in
+-\outervsize=9.25in
+-\topandbottommargin=.75in
++\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
++\newdimen\cornerlong \cornerlong=1pc
++\newdimen\cornerthick \cornerthick=.3pt
++\newdimen\topandbottommargin \topandbottommargin=.75in
+
+ % Main output routine.
+ \chardef\PAGE = 255
+@@ -168,15 +214,21 @@
+ \normalturnoffactive % \ in index entries must not stay \, e.g., if
+ % the page break happens to be in the middle of an example.
+ \shipout\vbox{%
++ % Do this early so pdf references go to the beginning of the page.
++ \ifpdfmakepagedest \pdfmkdest{\the\pageno} \fi
++ %
+ \ifcropmarks \vbox to \outervsize\bgroup
+ \hsize = \outerhsize
+- \line{\ewtop\hfil\ewtop}%
+- \nointerlineskip
+- \line{%
+- \vbox{\moveleft\cornerthick\nstop}%
+- \hfill
+- \vbox{\moveright\cornerthick\nstop}%
+- }%
++ \vskip-\topandbottommargin
++ \vtop to0pt{%
++ \line{\ewtop\hfil\ewtop}%
++ \nointerlineskip
++ \line{%
++ \vbox{\moveleft\cornerthick\nstop}%
++ \hfill
++ \vbox{\moveright\cornerthick\nstop}%
++ }%
++ \vss}%
+ \vskip\topandbottommargin
+ \line\bgroup
+ \hfil % center the page within the outer (page) hsize.
+@@ -199,13 +251,15 @@
+ \hfil\egroup % end of (centering) \line\bgroup
+ \vskip\topandbottommargin plus1fill minus1fill
+ \boxmaxdepth = \cornerthick
+- \line{%
+- \vbox{\moveleft\cornerthick\nsbot}%
+- \hfill
+- \vbox{\moveright\cornerthick\nsbot}%
++ \vbox to0pt{\vss
++ \line{%
++ \vbox{\moveleft\cornerthick\nsbot}%
++ \hfill
++ \vbox{\moveright\cornerthick\nsbot}%
++ }%
++ \nointerlineskip
++ \line{\ewbot\hfil\ewbot}%
+ }%
+- \nointerlineskip
+- \line{\ewbot\hfil\ewbot}%
+ \egroup % \vbox from first cropmarks clause
+ \fi
+ }% end of \shipout\vbox
+@@ -321,11 +375,11 @@
+ %% 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.}
++\ifENV\errmessage{Still within an environment; press 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.}
++\newhelp\EMsimple{Press RETURN to continue.}
+
+ \outer\def\begin{\parsearg\beginxxx}
+
+@@ -384,7 +438,7 @@
+
+ % @@ prints an @
+ % Kludge this until the fonts are right (grr).
+-\def\@{{\tt \char '100}}
++\def\@{{\tt\char64}}
+
+ % This is turned off because it was never documented
+ % and you can use @w{...} around a quote to suppress ligatures.
+@@ -394,8 +448,8 @@
+ %\def\'{{'}}
+
+ % Used to generate quoted braces.
+-\def\mylbrace {{\tt \char '173}}
+-\def\myrbrace {{\tt \char '175}}
++\def\mylbrace {{\tt\char123}}
++\def\myrbrace {{\tt\char125}}
+ \let\{=\mylbrace
+ \let\}=\myrbrace
+ \begingroup
+@@ -432,6 +486,18 @@
+ \fi\fi
+ }
+
++% Be sure we're in horizontal mode when doing a tie, since we make space
++% equivalent to this in @example-like environments. Otherwise, a space
++% at the beginning of a line will start with \penalty -- and
++% since \penalty is valid in vertical mode, we'd end up putting the
++% penalty on the vertical list instead of in the new paragraph.
++{\catcode`@ = 11
++ % Avoid using \@M directly, because that causes trouble
++ % if the definition is written into an index file.
++ \global\let\tiepenalty = \@M
++ \gdef\tie{\leavevmode\penalty\tiepenalty\ }
++}
++
+ % @: forces normal size whitespace following.
+ \def\:{\spacefactor=1000 }
+
+@@ -441,14 +507,11 @@
+ % @. is an end-of-sentence period.
+ \def\.{.\spacefactor=3000 }
+
+-% @enddots{} is an end-of-sentence ellipsis.
+-\gdef\enddots{$\mathinner{\ldotp\ldotp\ldotp\ldotp}$\spacefactor=3000}
+-
+ % @! is an end-of-sentence bang.
+-\gdef\!{!\spacefactor=3000 }
++\def\!{!\spacefactor=3000 }
+
+ % @? is an end-of-sentence query.
+-\gdef\?{?\spacefactor=3000 }
++\def\?{?\spacefactor=3000 }
+
+ % @w prevents a word break. Without the \leavevmode, @w at the
+ % beginning of a paragraph, when TeX is still in vertical mode, would
+@@ -532,53 +595,81 @@
+ %% This method tries to make TeX break the page naturally
+ %% if the depth of the box does not fit.
+ %{\baselineskip=0pt%
+-%\vtop to #1\mil{\vfil}\kern -#1\mil\penalty 10000
++%\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak
+ %\prevdepth=-1000pt
+ %}}
+
+ \def\needx#1{%
+- % Go into vertical mode, so we don't make a big box in the middle of a
++ % Ensure vertical mode, so we don't make a big box in the middle of a
+ % paragraph.
+ \par
+ %
+- % Don't add any leading before our big empty box, but allow a page
+- % break, since the best break might be right here.
+- \allowbreak
+- \nointerlineskip
+- \vtop to #1\mil{\vfil}%
+- %
+- % TeX does not even consider page breaks if a penalty added to the
+- % main vertical list is 10000 or more. But in order to see if the
+- % empty box we just added fits on the page, we must make it consider
+- % page breaks. On the other hand, we don't want to actually break the
+- % page after the empty box. So we use a penalty of 9999.
+- %
+- % There is an extremely small chance that TeX will actually break the
+- % page at this \penalty, if there are no other feasible breakpoints in
+- % sight. (If the user is using lots of big @group commands, which
+- % almost-but-not-quite fill up a page, TeX will have a hard time doing
+- % good page breaking, for example.) However, I could not construct an
+- % example where a page broke at this \penalty; if it happens in a real
+- % document, then we can reconsider our strategy.
+- \penalty9999
+- %
+- % Back up by the size of the box, whether we did a page break or not.
+- \kern -#1\mil
+- %
+- % Do not allow a page break right after this kern.
+- \nobreak
++ % If the @need value is less than one line space, it's useless.
++ \dimen0 = #1\mil
++ \dimen2 = \ht\strutbox
++ \advance\dimen2 by \dp\strutbox
++ \ifdim\dimen0 > \dimen2
++ %
++ % Do a \strut just to make the height of this box be normal, so the
++ % normal leading is inserted relative to the preceding line.
++ % And a page break here is fine.
++ \vtop to #1\mil{\strut\vfil}%
++ %
++ % TeX does not even consider page breaks if a penalty added to the
++ % main vertical list is 10000 or more. But in order to see if the
++ % empty box we just added fits on the page, we must make it consider
++ % page breaks. On the other hand, we don't want to actually break the
++ % page after the empty box. So we use a penalty of 9999.
++ %
++ % There is an extremely small chance that TeX will actually break the
++ % page at this \penalty, if there are no other feasible breakpoints in
++ % sight. (If the user is using lots of big @group commands, which
++ % almost-but-not-quite fill up a page, TeX will have a hard time doing
++ % good page breaking, for example.) However, I could not construct an
++ % example where a page broke at this \penalty; if it happens in a real
++ % document, then we can reconsider our strategy.
++ \penalty9999
++ %
++ % Back up by the size of the box, whether we did a page break or not.
++ \kern -#1\mil
++ %
++ % Do not allow a page break right after this kern.
++ \nobreak
++ \fi
+ }
+
+ % @br forces paragraph break
+
+ \let\br = \par
++
++% @dots{} output an ellipsis using the current font.
++% We do .5em per period so that it has the same spacing in a typewriter
++% font as three actual period characters.
++%
++\def\dots{%
++ \leavevmode
++ \hbox to 1.5em{%
++ \hskip 0pt plus 0.25fil minus 0.25fil
++ .\hss.\hss.%
++ \hskip 0pt plus 0.5fil minus 0.5fil
++ }%
++}
+
+-% @dots{} output some dots
++% @enddots{} is an end-of-sentence ellipsis.
++%
++\def\enddots{%
++ \leavevmode
++ \hbox to 2em{%
++ \hskip 0pt plus 0.25fil minus 0.25fil
++ .\hss.\hss.\hss.%
++ \hskip 0pt plus 0.5fil minus 0.5fil
++ }%
++ \spacefactor=3000
++}
+
+-\def\dots{$\ldots$}
+
+ % @page forces the start of a new page
+-
++%
+ \def\page{\par\vfill\supereject}
+
+ % @exdent text....
+@@ -645,420 +736,296 @@
+ % @c is the same as @comment
+ % @ignore ... @end ignore is another way to write a comment
+
+-\def\comment{\catcode 64=\other \catcode 123=\other \catcode 125=\other%
+-\parsearg \commentxxx}
++\def\comment{\begingroup \catcode`\^^M=\other%
++\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
++\commentxxx}
++{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}}
+
+-\def\commentxxx #1{\catcode 64=0 \catcode 123=1 \catcode 125=2 }
+-
+ \let\c=\comment
+-
+-% @paragraphindent is defined for the Info formatting commands only.
+-\let\paragraphindent=\comment
+
+-% Prevent errors for section commands.
+-% Used in @ignore and in failing conditionals.
+-\def\ignoresections{%
+-\let\chapter=\relax
+-\let\unnumbered=\relax
+-\let\top=\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
++% @paragraphindent NCHARS
++% We'll use ems for NCHARS, close enough.
++% We cannot implement @paragraphindent asis, though.
++%
++\def\asisword{asis} % no translation, these are keywords
++\def\noneword{none}
++%
++\def\paragraphindent{\parsearg\doparagraphindent}
++\def\doparagraphindent#1{%
++ \def\temp{#1}%
++ \ifx\temp\asisword
++ \else
++ \ifx\temp\noneword
++ \defaultparindent = 0pt
++ \else
++ \defaultparindent = #1em
++ \fi
++ \fi
++ \parindent = \defaultparindent
+ }
+
+-% Used in nested conditionals, where we have to parse the Texinfo source
+-% and so want to turn off most commands, in case they are used
+-% incorrectly.
+-%
+-\def\ignoremorecommands{%
+- \let\defcodeindex = \relax
+- \let\defcv = \relax
+- \let\deffn = \relax
+- \let\deffnx = \relax
+- \let\defindex = \relax
+- \let\defivar = \relax
+- \let\defmac = \relax
+- \let\defmethod = \relax
+- \let\defop = \relax
+- \let\defopt = \relax
+- \let\defspec = \relax
+- \let\deftp = \relax
+- \let\deftypefn = \relax
+- \let\deftypefun = \relax
+- \let\deftypevar = \relax
+- \let\deftypevr = \relax
+- \let\defun = \relax
+- \let\defvar = \relax
+- \let\defvr = \relax
+- \let\ref = \relax
+- \let\xref = \relax
+- \let\printindex = \relax
+- \let\pxref = \relax
+- \let\settitle = \relax
+- \let\setchapternewpage = \relax
+- \let\setchapterstyle = \relax
+- \let\everyheading = \relax
+- \let\evenheading = \relax
+- \let\oddheading = \relax
+- \let\everyfooting = \relax
+- \let\evenfooting = \relax
+- \let\oddfooting = \relax
+- \let\headings = \relax
+- \let\include = \relax
+- \let\lowersections = \relax
+- \let\down = \relax
+- \let\raisesections = \relax
+- \let\up = \relax
+- \let\set = \relax
+- \let\clear = \relax
+- \let\item = \relax
++% @exampleindent NCHARS
++% We'll use ems for NCHARS like @paragraphindent.
++% It seems @exampleindent asis isn't necessary, but
++% I preserve it to make it similar to @paragraphindent.
++\def\exampleindent{\parsearg\doexampleindent}
++\def\doexampleindent#1{%
++ \def\temp{#1}%
++ \ifx\temp\asisword
++ \else
++ \ifx\temp\noneword
++ \lispnarrowing = 0pt
++ \else
++ \lispnarrowing = #1em
++ \fi
++ \fi
+ }
+
+-% Ignore @ignore ... @end ignore.
++% @asis just yields its argument. Used with @table, for example.
+ %
+-\def\ignore{\doignore{ignore}}
++\def\asis#1{#1}
+
+-% Ignore @ifinfo, @ifhtml, @ifnottex, @html, @menu, and @direntry text.
++% @math means output in 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.
+ %
+-\def\ifinfo{\doignore{ifinfo}}
+-\def\ifhtml{\doignore{ifhtml}}
+-\def\ifnottex{\doignore{ifnottex}}
+-\def\html{\doignore{html}}
+-\def\menu{\doignore{menu}}
+-\def\direntry{\doignore{direntry}}
+-
+-% Also ignore @macro ... @end macro. The user must run texi2dvi,
+-% which runs makeinfo to do macro expansion. Ignore @unmacro, too.
+-\def\macro{\doignore{macro}}
+-\let\unmacro = \comment
++% 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 #1\implicitmath}
+
++% @bullet and @minus need the same treatment as @math, just above.
++\def\bullet{\implicitmath\ptexbullet\implicitmath}
++\def\minus{\implicitmath-\implicitmath}
+
+-% @dircategory CATEGORY -- specify a category of the dir file
+-% which this file should belong to. Ignore this in TeX.
+-\let\dircategory = \comment
++% @refill is a no-op.
++\let\refill=\relax
+
+-% Ignore text until a line `@end #1'.
++% If working on a large document in chapters, it is convenient to
++% be able to disable indexing, cross-referencing, and contents, for test runs.
++% This is done with @novalidate (before @setfilename).
+ %
+-\def\doignore#1{\begingroup
+- % Don't complain about control sequences we have declared \outer.
+- \ignoresections
+- %
+- % Define a command to swallow text until we reach `@end #1'.
+- \long\def\doignoretext##1\end #1{\enddoignore}%
+- %
+- % Make sure that spaces turn into tokens that match what \doignoretext wants.
+- \catcode32 = 10
+- %
+- % Ignore braces, too, so mismatched braces don't cause trouble.
+- \catcode`\{ = 9
+- \catcode`\} = 9
+- %
+- % And now expand that command.
+- \doignoretext
++\newif\iflinks \linkstrue % by default we want the aux files.
++\let\novalidate = \linksfalse
++
++% @setfilename is done at the beginning of every texinfo file.
++% So open here the files we need to have open while reading the input.
++% This makes it possible to make a .fmt file for texinfo.
++\def\setfilename{%
++ \iflinks
++ \readauxfile
++ \fi % \openindices needs to do some work in any case.
++ \openindices
++ \fixbackslash % Turn off hack to swallow `\input texinfo'.
++ \global\let\setfilename=\comment % Ignore extra @setfilename cmds.
++ %
++ % If texinfo.cnf is present on the system, read it.
++ % Useful for site-wide @afourpaper, etc.
++ % Just to be on the safe side, close the input stream before the \input.
++ \openin 1 texinfo.cnf
++ \ifeof1 \let\temp=\relax \else \def\temp{\input texinfo.cnf }\fi
++ \closein1
++ \temp
++ %
++ \comment % Ignore the actual filename.
+ }
+
+-% What we do to finish off ignored text.
++% Called from \setfilename.
+ %
+-\def\enddoignore{\endgroup\ignorespaces}%
++\def\openindices{%
++ \newindex{cp}%
++ \newcodeindex{fn}%
++ \newcodeindex{vr}%
++ \newcodeindex{tp}%
++ \newcodeindex{ky}%
++ \newcodeindex{pg}%
++}
+
+-\newif\ifwarnedobs\warnedobsfalse
+-\def\obstexwarn{%
+- \ifwarnedobs\relax\else
+- % We need to warn folks that they may have trouble with TeX 3.0.
+- % This uses \immediate\write16 rather than \message to get newlines.
+- \immediate\write16{}
+- \immediate\write16{***WARNING*** for users of Unix TeX 3.0!}
+- \immediate\write16{This manual trips a bug in TeX version 3.0 (tex hangs).}
+- \immediate\write16{If you are running another version of TeX, relax.}
+- \immediate\write16{If you are running Unix TeX 3.0, kill this TeX process.}
+- \immediate\write16{ Then upgrade your TeX installation if you can.}
+- \immediate\write16{ (See ftp://ftp.gnu.ai.mit.edu/pub/gnu/TeX.README.)}
+- \immediate\write16{If you are stuck with version 3.0, run the}
+- \immediate\write16{ script ``tex3patch'' from the Texinfo distribution}
+- \immediate\write16{ to use a workaround.}
+- \immediate\write16{}
+- \global\warnedobstrue
++% @bye.
++\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
++
++
++\message{pdf,}
++% adobe `portable' document format
++\newcount\tempnum
++\newcount\lnkcount
++\newtoks\filename
++\newcount\filenamelength
++\newcount\pgn
++\newtoks\toksA
++\newtoks\toksB
++\newtoks\toksC
++\newtoks\toksD
++\newbox\boxA
++\newcount\countA
++\newif\ifpdf
++\newif\ifpdfmakepagedest
++
++\ifx\pdfoutput\undefined
++ \pdffalse
++ \let\pdfmkdest = \gobble
++ \let\pdfurl = \gobble
++ \let\endlink = \relax
++ \let\linkcolor = \relax
++ \let\pdfmakeoutlines = \relax
++\else
++ \pdftrue
++ \pdfoutput = 1
++ \input pdfcolor
++ \def\dopdfimage#1#2#3{%
++ \def\imagewidth{#2}%
++ \def\imageheight{#3}%
++ \ifnum\pdftexversion < 14
++ \pdfimage
++ \else
++ \pdfximage
+ \fi
+-}
++ \ifx\empty\imagewidth\else width \imagewidth \fi
++ \ifx\empty\imageheight\else height \imageheight \fi
++ {#1.pdf}%
++ \ifnum\pdftexversion < 14 \else
++ \pdfrefximage \pdflastximage
++ \fi}
++ \def\pdfmkdest#1{\pdfdest name{#1@} xyz}
++ \def\pdfmkpgn#1{#1@}
++ \let\linkcolor = \Blue % was Cyan, but that seems light?
++ \def\endlink{\Black\pdfendlink}
++ % Adding outlines to PDF; macros for calculating structure of outlines
++ % come from Petr Olsak
++ \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
++ \else \csname#1\endcsname \fi}
++ \def\advancenumber#1{\tempnum=\expnumber{#1}\relax
++ \advance\tempnum by1
++ \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
++ \def\pdfmakeoutlines{{%
++ \openin 1 \jobname.toc
++ \ifeof 1\else\bgroup
++ \closein 1
++ \indexnofonts
++ \def\tt{}
++ \let\_ = \normalunderscore
++ % Thanh's hack / proper braces in bookmarks
++ \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace
++ \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace
++ %
++ \def\chapentry ##1##2##3{}
++ \def\unnumbchapentry ##1##2{}
++ \def\secentry ##1##2##3##4{\advancenumber{chap##2}}
++ \def\unnumbsecentry ##1##2{}
++ \def\subsecentry ##1##2##3##4##5{\advancenumber{sec##2.##3}}
++ \def\unnumbsubsecentry ##1##2{}
++ \def\subsubsecentry ##1##2##3##4##5##6{\advancenumber{subsec##2.##3.##4}}
++ \def\unnumbsubsubsecentry ##1##2{}
++ \input \jobname.toc
++ \def\chapentry ##1##2##3{%
++ \pdfoutline goto name{\pdfmkpgn{##3}}count-\expnumber{chap##2}{##1}}
++ \def\unnumbchapentry ##1##2{%
++ \pdfoutline goto name{\pdfmkpgn{##2}}{##1}}
++ \def\secentry ##1##2##3##4{%
++ \pdfoutline goto name{\pdfmkpgn{##4}}count-\expnumber{sec##2.##3}{##1}}
++ \def\unnumbsecentry ##1##2{%
++ \pdfoutline goto name{\pdfmkpgn{##2}}{##1}}
++ \def\subsecentry ##1##2##3##4##5{%
++ \pdfoutline goto name{\pdfmkpgn{##5}}count-\expnumber{subsec##2.##3.##4}{##1}}
++ \def\unnumbsubsecentry ##1##2{%
++ \pdfoutline goto name{\pdfmkpgn{##2}}{##1}}
++ \def\subsubsecentry ##1##2##3##4##5##6{%
++ \pdfoutline goto name{\pdfmkpgn{##6}}{##1}}
++ \def\unnumbsubsubsecentry ##1##2{%
++ \pdfoutline goto name{\pdfmkpgn{##2}}{##1}}
++ \input \jobname.toc
++ \egroup\fi
++ }}
++ \def\makelinks #1,{%
++ \def\params{#1}\def\E{END}%
++ \ifx\params\E
++ \let\nextmakelinks=\relax
++ \else
++ \let\nextmakelinks=\makelinks
++ \ifnum\lnkcount>0,\fi
++ \picknum{#1}%
++ \startlink attr{/Border [0 0 0]}
++ goto name{\pdfmkpgn{\the\pgn}}%
++ \linkcolor #1%
++ \advance\lnkcount by 1%
++ \endlink
++ \fi
++ \nextmakelinks
++ }
++ \def\picknum#1{\expandafter\pn#1}
++ \def\pn#1{%
++ \def\p{#1}%
++ \ifx\p\lbrace
++ \let\nextpn=\ppn
++ \else
++ \let\nextpn=\ppnn
++ \def\first{#1}
++ \fi
++ \nextpn
++ }
++ \def\ppn#1{\pgn=#1\gobble}
++ \def\ppnn{\pgn=\first}
++ \def\pdfmklnk#1{\lnkcount=0\makelinks #1,END,}
++ \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
++ \def\skipspaces#1{\def\PP{#1}\def\D{|}%
++ \ifx\PP\D\let\nextsp\relax
++ \else\let\nextsp\skipspaces
++ \ifx\p\space\else\addtokens{\filename}{\PP}%
++ \advance\filenamelength by 1
++ \fi
++ \fi
++ \nextsp}
++ \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax}
++ \ifnum\pdftexversion < 14
++ \let \startlink \pdfannotlink
++ \else
++ \let \startlink \pdfstartlink
++ \fi
++ \def\pdfurl#1{%
++ \begingroup
++ \normalturnoffactive\def\@{@}%
++ \leavevmode\Red
++ \startlink attr{/Border [0 0 0]}%
++ user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
++ % #1
++ \endgroup}
++ \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
++ \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
++ \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
++ \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
++ \def\maketoks{%
++ \expandafter\poptoks\the\toksA|ENDTOKS|
++ \ifx\first0\adn0
++ \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
++ \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
++ \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9
++ \else
++ \ifnum0=\countA\else\makelink\fi
++ \ifx\first.\let\next=\done\else
++ \let\next=\maketoks
++ \addtokens{\toksB}{\the\toksD}
++ \ifx\first,\addtokens{\toksB}{\space}\fi
++ \fi
++ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
++ \next}
++ \def\makelink{\addtokens{\toksB}%
++ {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
++ \def\pdflink#1{%
++ \startlink attr{/Border [0 0 0]} goto name{\mkpgn{#1}}
++ \linkcolor #1\endlink}
++ \def\mkpgn#1{#1@}
++ \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
++\fi % \ifx\pdfoutput
+
+-% **In TeX 3.0, setting text in \nullfont hangs tex. For a
+-% workaround (which requires the file ``dummy.tfm'' to be installed),
+-% uncomment the following line:
+-%%%%%\font\nullfont=dummy\let\obstexwarn=\relax
+
+-% Ignore text, except that we keep track of conditional commands for
+-% purposes of nesting, up to an `@end #1' command.
+-%
+-\def\nestedignore#1{%
+- \obstexwarn
+- % We must actually expand the ignored text to look for the @end
+- % command, so that nested ignore constructs work. Thus, we put the
+- % text into a \vbox and then do nothing with the result. To minimize
+- % the change of memory overflow, we follow the approach outlined on
+- % page 401 of the TeXbook: make the current font be a dummy font.
+- %
+- \setbox0 = \vbox\bgroup
+- % Don't complain about control sequences we have declared \outer.
+- \ignoresections
+- %
+- % Define `@end #1' to end the box, which will in turn undefine the
+- % @end command again.
+- \expandafter\def\csname E#1\endcsname{\egroup\ignorespaces}%
+- %
+- % We are going to be parsing Texinfo commands. Most cause no
+- % trouble when they are used incorrectly, but some commands do
+- % complicated argument parsing or otherwise get confused, so we
+- % undefine them.
+- %
+- % We can't do anything about stray @-signs, unfortunately;
+- % they'll produce `undefined control sequence' errors.
+- \ignoremorecommands
+- %
+- % Set the current font to be \nullfont, a TeX primitive, and define
+- % all the font commands to also use \nullfont. We don't use
+- % dummy.tfm, as suggested in the TeXbook, because not all sites
+- % might have that installed. Therefore, math mode will still
+- % produce output, but that should be an extremely small amount of
+- % stuff compared to the main input.
+- %
+- \nullfont
+- \let\tenrm = \nullfont \let\tenit = \nullfont \let\tensl = \nullfont
+- \let\tenbf = \nullfont \let\tentt = \nullfont \let\smallcaps = \nullfont
+- \let\tensf = \nullfont
+- % Similarly for index fonts (mostly for their use in
+- % smallexample)
+- \let\indrm = \nullfont \let\indit = \nullfont \let\indsl = \nullfont
+- \let\indbf = \nullfont \let\indtt = \nullfont \let\indsc = \nullfont
+- \let\indsf = \nullfont
+- %
+- % Don't complain when characters are missing from the fonts.
+- \tracinglostchars = 0
+- %
+- % Don't bother to do space factor calculations.
+- \frenchspacing
+- %
+- % Don't report underfull hboxes.
+- \hbadness = 10000
+- %
+- % Do minimal line-breaking.
+- \pretolerance = 10000
+- %
+- % Do not execute instructions in @tex
+- \def\tex{\doignore{tex}}%
+-}
+-
+-% @set VAR sets the variable VAR to an empty value.
+-% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
+-%
+-% Since we want to separate VAR from REST-OF-LINE (which might be
+-% empty), we can't just use \parsearg; we have to insert a space of our
+-% own to delimit the rest of the line, and then take it out again if we
+-% didn't need it. Make sure the catcode of space is correct to avoid
+-% losing inside @example, for instance.
+-%
+-\def\set{\begingroup\catcode` =10
+- \catcode`\-=12 \catcode`\_=12 % Allow - and _ in VAR.
+- \parsearg\setxxx}
+-\def\setxxx#1{\setyyy#1 \endsetyyy}
+-\def\setyyy#1 #2\endsetyyy{%
+- \def\temp{#2}%
+- \ifx\temp\empty \global\expandafter\let\csname SET#1\endcsname = \empty
+- \else \setzzz{#1}#2\endsetzzz % Remove the trailing space \setxxx inserted.
+- \fi
+- \endgroup
+-}
+-% Can't use \xdef to pre-expand #2 and save some time, since \temp or
+-% \next or other control sequences that we've defined might get us into
+-% an infinite loop. Consider `@set foo @cite{bar}'.
+-\def\setzzz#1#2 \endsetzzz{\expandafter\gdef\csname SET#1\endcsname{#2}}
+-
+-% @clear VAR clears (i.e., unsets) the variable VAR.
+-%
+-\def\clear{\parsearg\clearxxx}
+-\def\clearxxx#1{\global\expandafter\let\csname SET#1\endcsname=\relax}
+-
+-% @value{foo} gets the text saved in variable foo.
+-%
+-\def\value{\begingroup
+- \catcode`\-=12 \catcode`\_=12 % Allow - and _ in VAR.
+- \valuexxx}
+-\def\valuexxx#1{%
+- \expandafter\ifx\csname SET#1\endcsname\relax
+- {\{No value for ``#1''\}}%
+- \else
+- \csname SET#1\endcsname
+- \fi
+-\endgroup}
+-
+-% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
+-% with @set.
+-%
+-\def\ifset{\parsearg\ifsetxxx}
+-\def\ifsetxxx #1{%
+- \expandafter\ifx\csname SET#1\endcsname\relax
+- \expandafter\ifsetfail
+- \else
+- \expandafter\ifsetsucceed
+- \fi
+-}
+-\def\ifsetsucceed{\conditionalsucceed{ifset}}
+-\def\ifsetfail{\nestedignore{ifset}}
+-\defineunmatchedend{ifset}
+-
+-% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been
+-% defined with @set, or has been undefined with @clear.
+-%
+-\def\ifclear{\parsearg\ifclearxxx}
+-\def\ifclearxxx #1{%
+- \expandafter\ifx\csname SET#1\endcsname\relax
+- \expandafter\ifclearsucceed
+- \else
+- \expandafter\ifclearfail
+- \fi
+-}
+-\def\ifclearsucceed{\conditionalsucceed{ifclear}}
+-\def\ifclearfail{\nestedignore{ifclear}}
+-\defineunmatchedend{ifclear}
+-
+-% @iftex, @ifnothtml, @ifnotinfo always succeed; we read the text
+-% following, through the first @end iftex (etc.). Make `@end iftex'
+-% (etc.) valid only after an @iftex.
+-%
+-\def\iftex{\conditionalsucceed{iftex}}
+-\def\ifnothtml{\conditionalsucceed{ifnothtml}}
+-\def\ifnotinfo{\conditionalsucceed{ifnotinfo}}
+-\defineunmatchedend{iftex}
+-\defineunmatchedend{ifnothtml}
+-\defineunmatchedend{ifnotinfo}
+-
+-% We can't just want to start a group at @iftex (for example) and end it
+-% at @end iftex, since then @set commands inside the conditional have no
+-% effect (they'd get reverted at the end of the group). So we must
+-% define \Eiftex to redefine itself to be its previous value. (We can't
+-% just define it to fail again with an ``unmatched end'' error, since
+-% the @ifset might be nested.)
+-%
+-\def\conditionalsucceed#1{%
+- \edef\temp{%
+- % Remember the current value of \E#1.
+- \let\nece{prevE#1} = \nece{E#1}%
+- %
+- % At the `@end #1', redefine \E#1 to be its previous value.
+- \def\nece{E#1}{\let\nece{E#1} = \nece{prevE#1}}%
+- }%
+- \temp
+-}
+-
+-% We need to expand lots of \csname's, but we don't want to expand the
+-% control sequences after we've constructed them.
+-%
+-\def\nece#1{\expandafter\noexpand\csname#1\endcsname}
+-
+-% @asis just yields its argument. Used with @table, for example.
+-%
+-\def\asis#1{#1}
+-
+-% @math means output in 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 #1\implicitmath}
+-
+-% @bullet and @minus need the same treatment as @math, just above.
+-\def\bullet{\implicitmath\ptexbullet\implicitmath}
+-\def\minus{\implicitmath-\implicitmath}
+-
+-\def\node{\ENVcheck\parsearg\nodezzz}
+-\def\nodezzz#1{\nodexxx [#1,]}
+-\def\nodexxx[#1,#2]{\gdef\lastnode{#1}}
+-\let\nwnode=\node
+-\let\lastnode=\relax
+-
+-\def\donoderef{\ifx\lastnode\relax\else
+-\expandafter\expandafter\expandafter\setref{\lastnode}\fi
+-\global\let\lastnode=\relax}
+-
+-\def\unnumbnoderef{\ifx\lastnode\relax\else
+-\expandafter\expandafter\expandafter\unnumbsetref{\lastnode}\fi
+-\global\let\lastnode=\relax}
+-
+-\def\appendixnoderef{\ifx\lastnode\relax\else
+-\expandafter\expandafter\expandafter\appendixsetref{\lastnode}\fi
+-\global\let\lastnode=\relax}
+-
+-% @refill is a no-op.
+-\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.
+-% This makes it possible to make a .fmt file for texinfo.
+-\def\setfilename{%
+- \readauxfile
+- \opencontents
+- \openindices
+- \fixbackslash % Turn off hack to swallow `\input texinfo'.
+- \global\let\setfilename=\comment % Ignore extra @setfilename cmds.
+- %
+- % If texinfo.cnf is present on the system, read it.
+- % Useful for site-wide @afourpaper, etc.
+- % Just to be on the safe side, close the input stream before the \input.
+- \openin 1 texinfo.cnf
+- \ifeof1 \let\temp=\relax \else \def\temp{\input texinfo.cnf }\fi
+- \closein1
+- \temp
+- %
+- \comment % Ignore the actual filename.
+-}
+-
+-% @bye.
+-\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
+-
+-% \def\macro#1{\begingroup\ignoresections\catcode`\#=6\def\macrotemp{#1}\parsearg\macroxxx}
+-% \def\macroxxx#1#2 \end macro{%
+-% \expandafter\gdef\macrotemp#1{#2}%
+-% \endgroup}
+-
+-%\def\linemacro#1{\begingroup\ignoresections\catcode`\#=6\def\macrotemp{#1}\parsearg\linemacroxxx}
+-%\def\linemacroxxx#1#2 \end linemacro{%
+-%\let\parsearg=\relax
+-%\edef\macrotempx{\csname M\butfirst\expandafter\string\macrotemp\endcsname}%
+-%\expandafter\xdef\macrotemp{\parsearg\macrotempx}%
+-%\expandafter\gdef\macrotempx#1{#2}%
+-%\endgroup}
+-
+-%\def\butfirst#1{}
+-
+-
+ \message{fonts,}
+-
+ % Font-change commands.
+
+-% Texinfo supports the sans serif font style, which plain TeX does not.
++% Texinfo sort of supports the sans serif font style, which plain TeX does not.
+ % So we set up a \sf analogous to plain's \rm, etc.
+ \newfam\sffam
+ \def\sf{\fam=\sffam \tensf}
+@@ -1124,22 +1091,17 @@
+ \setfont\deftt\ttshape{10}{\magstep1}
+ \def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf}
+
+-% Fonts for indices and small examples (9pt).
+-% We actually use the slanted font rather than the italic,
+-% because texinfo normally uses the slanted fonts for that.
+-% Do not make many font distinctions in general in the index, since they
+-% aren't very useful.
+-\setfont\ninett\ttshape{9}{1000}
+-\setfont\indrm\rmshape{9}{1000}
+-\setfont\indit\slshape{9}{1000}
+-\let\indsl=\indit
+-\let\indtt=\ninett
+-\let\indttsl=\ninett
+-\let\indsf=\indrm
+-\let\indbf=\indrm
+-\setfont\indsc\scshape{10}{900}
+-\font\indi=cmmi9
+-\font\indsy=cmsy9
++% Fonts for indices, footnotes, small examples (9pt).
++\setfont\smallrm\rmshape{9}{1000}
++\setfont\smalltt\ttshape{9}{1000}
++\setfont\smallbf\bfshape{10}{900}
++\setfont\smallit\itshape{9}{1000}
++\setfont\smallsl\slshape{9}{1000}
++\setfont\smallsf\sfshape{9}{1000}
++\setfont\smallsc\scshape{10}{900}
++\setfont\smallttsl\ttslshape{10}{900}
++\font\smalli=cmmi9
++\font\smallsy=cmsy9
+
+ % Fonts for title page:
+ \setfont\titlerm\rmbshape{12}{\magstep3}
+@@ -1236,7 +1198,7 @@
+ \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy
+ \let\tenttsl=\titlettsl
+ \resetmathfonts \setleading{25pt}}
+-\def\titlefont#1{{\titlefonts #1}}
++\def\titlefont#1{{\titlefonts\rm #1}}
+ \def\chapfonts{%
+ \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
+ \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
+@@ -1253,16 +1215,21 @@
+ \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl
+ \resetmathfonts \setleading{15pt}}
+ \let\subsubsecfonts = \subsecfonts % Maybe make sssec fonts scaled magstephalf?
+-\def\indexfonts{%
+- \let\tenrm=\indrm \let\tenit=\indit \let\tensl=\indsl
+- \let\tenbf=\indbf \let\tentt=\indtt \let\smallcaps=\indsc
+- \let\tensf=\indsf \let\teni=\indi \let\tensy=\indsy \let\tenttsl=\indttsl
+- \resetmathfonts \setleading{12pt}}
++\def\smallfonts{%
++ \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl
++ \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc
++ \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy
++ \let\tenttsl=\smallttsl
++ \resetmathfonts \setleading{11pt}}
+
+ % Set up the default fonts, so we can use them for creating boxes.
+ %
+ \textfonts
+
++% Define these so they can be easily changed for other fonts.
++\def\angleleft{$\langle$}
++\def\angleright{$\rangle$}
++
+ % Count depth in font-changes, for error checks
+ \newcount\fontdepth \fontdepth=0
+
+@@ -1277,13 +1244,14 @@
+ % \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}
++\def\smartslanted#1{{\sl #1}\futurelet\next\smartitalicx}
++\def\smartitalic#1{{\it #1}\futurelet\next\smartitalicx}
+
+ \let\i=\smartitalic
+-\let\var=\smartitalic
+-\let\dfn=\smartitalic
++\let\var=\smartslanted
++\let\dfn=\smartslanted
+ \let\emph=\smartitalic
+-\let\cite=\smartitalic
++\let\cite=\smartslanted
+
+ \def\b#1{{\bf #1}}
+ \let\strong=\b
+@@ -1300,20 +1268,22 @@
+ \null
+ }
+ \let\ttfont=\t
+-\def\samp #1{`\tclose{#1}'\null}
+-\setfont\smallrm\rmshape{8}{1000}
+-\font\smallsy=cmsy9
+-\def\key#1{{\smallrm\textfont2=\smallsy \leavevmode\hbox{%
+- \raise0.4pt\hbox{$\langle$}\kern-.08em\vtop{%
++\def\samp#1{`\tclose{#1}'\null}
++\setfont\keyrm\rmshape{8}{1000}
++\font\keysy=cmsy9
++\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{%
++ \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{%
+ \vbox{\hrule\kern-0.4pt
+- \hbox{\raise0.4pt\hbox{\vphantom{$\langle$}}#1}}%
++ \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}%
+ \kern-0.4pt\hrule}%
+- \kern-.06em\raise0.4pt\hbox{$\rangle$}}}}
++ \kern-.06em\raise0.4pt\hbox{\angleright}}}}
+ % The old definition, with no lozenge:
+ %\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null}
+ \def\ctrl #1{{\tt \rawbackslash \hat}#1}
+
++% @file, @option are the same as @samp.
+ \let\file=\samp
++\let\option=\samp
+
+ % @code is a modification of @t,
+ % which makes spaces the same size as normal in the surrounding text.
+@@ -1348,20 +1318,18 @@
+ % and arrange explicitly to hyphenate at a dash.
+ % -- rms.
+ {
+-\catcode`\-=\active
+-\catcode`\_=\active
+-\catcode`\|=\active
+-\global\def\code{\begingroup \catcode`\-=\active \let-\codedash \catcode`\_=\active \let_\codeunder \codex}
+-% The following is used by \doprintindex to insure that long function names
+-% wrap around. It is necessary for - and _ to be active before the index is
+-% read from the file, as \entry parses the arguments long before \code is
+-% ever called. -- mycroft
+-% _ is always active; and it shouldn't be \let = to an _ that is a
+-% subscript character anyway. Then, @cindex @samp{_} (for example)
+-% fails. --karl
+-\global\def\indexbreaks{%
+- \catcode`\-=\active \let-\realdash
+-}
++ \catcode`\-=\active
++ \catcode`\_=\active
++ %
++ \global\def\code{\begingroup
++ \catcode`\-=\active \let-\codedash
++ \catcode`\_=\active \let_\codeunder
++ \codex
++ }
++ %
++ % If we end up with any active - characters when handling the index,
++ % just treat them as a normal -.
++ \global\def\indexbreaks{\catcode`\-=\active \let-\realdash}
+ }
+
+ \def\realdash{-}
+@@ -1402,27 +1370,55 @@
+ \else{\tclose{\kbdfont\look}}\fi
+ \else{\tclose{\kbdfont\look}}\fi}
+
+-% @url. Quotes do not seem necessary, so use \code.
++% For @url, @env, @command quotes seem unnecessary, so use \code.
+ \let\url=\code
++\let\env=\code
++\let\command=\code
+
+-% @uref (abbreviation for `urlref') takes an optional second argument
+-% specifying the text to display. First (mandatory) arg is the url.
+-% Perhaps eventually put in a hypertex \special here.
+-%
+-\def\uref#1{\urefxxx #1,,\finish}
+-\def\urefxxx#1,#2,#3\finish{%
+- \setbox0 = \hbox{\ignorespaces #2}%
++% @uref (abbreviation for `urlref') takes an optional (comma-separated)
++% second argument specifying the text to display and an optional third
++% arg as text to display instead of (rather than in addition to) the url
++% itself. First (mandatory) arg is the url. Perhaps eventually put in
++% a hypertex \special here.
++%
++\def\uref#1{\douref #1,,,\finish}
++\def\douref#1,#2,#3,#4\finish{\begingroup
++ \unsepspaces
++ \pdfurl{#1}%
++ \setbox0 = \hbox{\ignorespaces #3}%
+ \ifdim\wd0 > 0pt
+- \unhbox0\ (\code{#1})%
++ \unhbox0 % third arg given, show only that
+ \else
+- \code{#1}%
++ \setbox0 = \hbox{\ignorespaces #2}%
++ \ifdim\wd0 > 0pt
++ \ifpdf
++ \unhbox0 % PDF: 2nd arg given, show only it
++ \else
++ \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url
++ \fi
++ \else
++ \code{#1}% only url given, so show it
++ \fi
+ \fi
+-}
++ \endlink
++\endgroup}
+
+-% rms does not like the angle brackets --karl, 17may97.
+-% So now @email is just like @uref.
+-%\def\email#1{$\langle${\tt #1}$\rangle$}
+-\let\email=\uref
++% rms does not like angle brackets --karl, 17may97.
++% So now @email is just like @uref, unless we are pdf.
++%
++%\def\email#1{\angleleft{\tt #1}\angleright}
++\ifpdf
++ \def\email#1{\doemail#1,,\finish}
++ \def\doemail#1,#2,#3\finish{\begingroup
++ \unsepspaces
++ \pdfurl{mailto:#1}%
++ \setbox0 = \hbox{\ignorespaces #2}%
++ \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi
++ \endlink
++ \endgroup}
++\else
++ \let\email=\uref
++\fi
+
+ % Check if we are currently using a typewriter font. Since all the
+ % Computer Modern typewriter fonts have zero interword stretch (and
+@@ -1432,8 +1428,7 @@
+ \def\ifmonospace{\ifdim\fontdimen3\font=0pt }
+
+ % Typeset a dimension, e.g., `in' or `pt'. The only reason for the
+-% argument is to make the input look right: @dmn{pt} instead of
+-% @dmn{}pt.
++% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
+ %
+ \def\dmn#1{\thinspace #1}
+
+@@ -1444,11 +1439,14 @@
+ % Polish suppressed-l. --karl, 22sep96.
+ %\def\l#1{{\li #1}\null}
+
++% Explicit font changes: @r, @sc, undocumented @ii.
+ \def\r#1{{\rm #1}} % roman font
+-% Use of \lowercase was suggested.
+ \def\sc#1{{\smallcaps#1}} % smallcaps font
+ \def\ii#1{{\it #1}} % italic font
+
++% @acronym downcases the argument and prints in smallcaps.
++\def\acronym#1{{\smallcaps \lowercase{#1}}}
++
+ % @pounds{} is a sterling sign.
+ \def\pounds{{\it\$}}
+
+@@ -1462,15 +1460,20 @@
+ \newif\ifseenauthor
+ \newif\iffinishedtitlepage
+
++% Do an implicit @contents or @shortcontents after @end titlepage if the
++% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage.
++%
++\newif\ifsetcontentsaftertitlepage
++ \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue
++\newif\ifsetshortcontentsaftertitlepage
++ \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue
++
+ \def\shorttitlepage{\parsearg\shorttitlepagezzz}
+ \def\shorttitlepagezzz #1{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%
+ \endgroup\page\hbox{}\page}
+
+ \def\titlepage{\begingroup \parindent=0pt \textfonts
+ \let\subtitlerm=\tenrm
+-% I deinstalled the following change because \cmr12 is undefined.
+-% This change was not in the ChangeLog anyway. --rms.
+-% \let\subtitlerm=\cmr12
+ \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}%
+ %
+ \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines}%
+@@ -1519,6 +1522,23 @@
+ % after the title page, which we certainly don't want.
+ \oldpage
+ \endgroup
++ %
++ % If they want short, they certainly want long too.
++ \ifsetshortcontentsaftertitlepage
++ \shortcontents
++ \contents
++ \global\let\shortcontents = \relax
++ \global\let\contents = \relax
++ \fi
++ %
++ \ifsetcontentsaftertitlepage
++ \contents
++ \global\let\contents = \relax
++ \global\let\shortcontents = \relax
++ \fi
++ %
++ \ifpdf \pdfmakepagedesttrue \fi
++ %
+ \HEADINGSon
+ }
+
+@@ -1532,10 +1552,10 @@
+
+ \let\thispage=\folio
+
+-\newtoks \evenheadline % Token sequence for heading line of even pages
+-\newtoks \oddheadline % Token sequence for heading line of odd pages
+-\newtoks \evenfootline % Token sequence for footing line of even pages
+-\newtoks \oddfootline % Token sequence for footing line of odd pages
++\newtoks\evenheadline % headline on even pages
++\newtoks\oddheadline % headline on odd pages
++\newtoks\evenfootline % footline on even pages
++\newtoks\oddfootline % footline on odd pages
+
+ % Now make Tex use those variables
+ \headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
+@@ -1652,40 +1672,28 @@
+ }
+
+ % 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 headings
+-% It generates no output of its own
++% This produces Day Month Year style of output.
++% Only define if not already defined, in case a txi-??.tex file has set
++% up a different format (e.g., txi-cs.tex does this).
++\ifx\today\undefined
++\def\today{%
++ \number\day\space
++ \ifcase\month
++ \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
++ \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
++ \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
++ \fi
++ \space\number\year}
++\fi
+
+-\def\thistitle{No Title}
++% @settitle line... specifies the title of the document, for headings.
++% It generates no output of its own.
++\def\thistitle{\putwordNoTitle}
+ \def\settitle{\parsearg\settitlezzz}
+ \def\settitlezzz #1{\gdef\thistitle{#1}}
+
+
+ \message{tables,}
+-
+-% @tabs -- simple alignment
+-
+-% These don't work. For one thing, \+ is defined as outer.
+-% So these macros cannot even be defined.
+-
+-%\def\tabs{\parsearg\tabszzz}
+-%\def\tabszzz #1{\settabs\+#1\cr}
+-%\def\tabline{\parsearg\tablinezzz}
+-%\def\tablinezzz #1{\+#1\cr}
+-%\def\&{&}
+-
+ % Tables -- @table, @ftable, @vtable, @item(x), @kitem(x), @xitem(x).
+
+ % default indentation of table text
+@@ -1729,11 +1737,6 @@
+ \itemindex{#1}%
+ \nobreak % This prevents a break before @itemx.
+ %
+- % Be sure we are not still in the middle of a paragraph.
+- %{\parskip = 0in
+- %\par
+- %}%
+- %
+ % If the item text does not fit in the space we have, put it on a line
+ % by itself, and do not allow a page break either before or after that
+ % line. We do not start a paragraph here because then if the next
+@@ -1762,13 +1765,17 @@
+ \itemxneedsnegativevskipfalse
+ \else
+ % The item text fits into the space. Start a paragraph, so that the
+- % following text (if any) will end up on the same line. Since that
+- % text will be indented by \tableindent, we make the item text be in
+- % a zero-width box.
++ % following text (if any) will end up on the same line.
+ \noindent
+- \rlap{\hskip -\tableindent\box0}\ignorespaces%
+- \endgroup%
+- \itemxneedsnegativevskiptrue%
++ % Do this with kerns and \unhbox so that if there is a footnote in
++ % the item text, it can migrate to the main vertical list and
++ % eventually be printed.
++ \nobreak\kern-\tableindent
++ \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0
++ \unhbox0
++ \nobreak\kern\dimen0
++ \endgroup
++ \itemxneedsnegativevskiptrue
+ \fi
+ }
+
+@@ -1779,9 +1786,10 @@
+ \def\xitem{\errmessage{@xitem while not in a table}}
+ \def\xitemx{\errmessage{@xitemx while not in a table}}
+
+-%% Contains a kludge to get @end[description] to work
++% Contains a kludge to get @end[description] to work.
+ \def\description{\tablez{\dontindex}{1}{}{}{}{}}
+
++% @table, @ftable, @vtable.
+ \def\table{\begingroup\inENV\obeylines\obeyspaces\tablex}
+ {\obeylines\obeyspaces%
+ \gdef\tablex #1^^M{%
+@@ -1841,7 +1849,7 @@
+ \def\itemize{\parsearg\itemizezzz}
+
+ \def\itemizezzz #1{%
+- \begingroup % ended by the @end itemsize
++ \begingroup % ended by the @end itemize
+ \itemizey {#1}{\Eitemize}
+ }
+
+@@ -2043,10 +2051,7 @@
+ % @multitablelinespace is space to leave between table items, baseline
+ % to baseline.
+ % 0pt means it depends on current normal line spacing.
+-
+-%%%%
+-% Dimensions
+-
++%
+ \newskip\multitableparskip
+ \newskip\multitableparindent
+ \newdimen\multitablecolspace
+@@ -2056,129 +2061,150 @@
+ \multitablecolspace=12pt
+ \multitablelinespace=0pt
+
+-%%%%
+ % Macros used to set up halign preamble:
++%
+ \let\endsetuptable\relax
+ \def\xendsetuptable{\endsetuptable}
+ \let\columnfractions\relax
+ \def\xcolumnfractions{\columnfractions}
+ \newif\ifsetpercent
+
+-%% 2/1/96, to allow fractions to be given with more than one digit.
+-\def\pickupwholefraction#1 {\global\advance\colcount by1 %
+-\expandafter\xdef\csname col\the\colcount\endcsname{.#1\hsize}%
+-\setuptable}
++% #1 is the part of the @columnfraction before the decimal point, which
++% is presumably either 0 or the empty string (but we don't check, we
++% just throw it away). #2 is the decimal part, which we use as the
++% percent of \hsize for this column.
++\def\pickupwholefraction#1.#2 {%
++ \global\advance\colcount by 1
++ \expandafter\xdef\csname col\the\colcount\endcsname{.#2\hsize}%
++ \setuptable
++}
+
+ \newcount\colcount
+-\def\setuptable#1{\def\firstarg{#1}%
+-\ifx\firstarg\xendsetuptable\let\go\relax%
+-\else
+- \ifx\firstarg\xcolumnfractions\global\setpercenttrue%
++\def\setuptable#1{%
++ \def\firstarg{#1}%
++ \ifx\firstarg\xendsetuptable
++ \let\go = \relax
+ \else
+- \ifsetpercent
+- \let\go\pickupwholefraction % In this case arg of setuptable
+- % is the decimal point before the
+- % number given in percent of hsize.
+- % We don't need this so we don't use it.
++ \ifx\firstarg\xcolumnfractions
++ \global\setpercenttrue
++ \else
++ \ifsetpercent
++ \let\go\pickupwholefraction
++ \else
++ \global\advance\colcount by 1
++ \setbox0=\hbox{#1\unskip }% Add a normal word space as a separator;
++ % typically that is always in the input, anyway.
++ \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
++ \fi
++ \fi
++ \ifx\go\pickupwholefraction
++ % Put the argument back for the \pickupwholefraction call, so
++ % we'll always have a period there to be parsed.
++ \def\go{\pickupwholefraction#1}%
+ \else
+- \global\advance\colcount by1
+- \setbox0=\hbox{#1 }% Add a normal word space as a separator;
+- % typically that is always in the input, anyway.
+- \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
++ \let\go = \setuptable
+ \fi%
+- \fi%
+-\ifx\go\pickupwholefraction\else\let\go\setuptable\fi%
+-\fi\go}
+-
+-%%%%
+-% multitable syntax
+-\def\tab{&\hskip1sp\relax} % 2/2/96
+- % tiny skip here makes sure this column space is
+- % maintained, even if it is never used.
++ \fi
++ \go
++}
+
++% This used to have \hskip1sp. But then the space in a template line is
++% not enough. That is bad. So let's go back to just & until we
++% encounter the problem it was intended to solve again.
++% --karl, nathan@acm.org, 20apr99.
++\def\tab{&}
+
+-%%%%
+ % @multitable ... @end multitable definitions:
+-
++%
+ \def\multitable{\parsearg\dotable}
+-
+ \def\dotable#1{\bgroup
+-\let\item\cr
+-\tolerance=9500
+-\hbadness=9500
+-\setmultitablespacing
+-\parskip=\multitableparskip
+-\parindent=\multitableparindent
+-\overfullrule=0pt
+-\global\colcount=0\relax%
+-\def\Emultitable{\global\setpercentfalse\global\everycr{}\cr\egroup\egroup}%
+- % To parse everything between @multitable and @item :
+-\setuptable#1 \endsetuptable
+- % Need to reset this to 0 after \setuptable.
+-\global\colcount=0\relax%
+- %
+- % This preamble sets up a generic column definition, which will
+- % be used as many times as user calls for columns.
+- % \vtop will set a single line and will also let text wrap and
+- % continue for many paragraphs if desired.
+-\halign\bgroup&\global\advance\colcount by 1\relax%
+-\multistrut\vtop{\hsize=\expandafter\csname col\the\colcount\endcsname
+- % In order to keep entries from bumping into each other
+- % we will add a \leftskip of \multitablecolspace to all columns after
+- % the first one.
+- % If a template has been used, we will add \multitablecolspace
+- % to the width of each template entry.
+- % If user has set preamble in terms of percent of \hsize
+- % we will use that dimension as the width of the column, and
+- % the \leftskip will keep entries from bumping into each other.
+- % Table will start at left margin and final column will justify at
+- % right margin.
+-\ifnum\colcount=1
+-\else
+- \ifsetpercent
++ \vskip\parskip
++ \let\item\crcr
++ \tolerance=9500
++ \hbadness=9500
++ \setmultitablespacing
++ \parskip=\multitableparskip
++ \parindent=\multitableparindent
++ \overfullrule=0pt
++ \global\colcount=0
++ \def\Emultitable{\global\setpercentfalse\cr\egroup\egroup}%
++ %
++ % To parse everything between @multitable and @item:
++ \setuptable#1 \endsetuptable
++ %
++ % \everycr will reset column counter, \colcount, at the end of
++ % each line. Every column entry will cause \colcount to advance by one.
++ % The table preamble
++ % looks at the current \colcount to find the correct column width.
++ \everycr{\noalign{%
++ %
++ % \filbreak%% keeps underfull box messages off when table breaks over pages.
++ % Maybe so, but it also creates really weird page breaks when the table
++ % breaks over pages. Wouldn't \vfil be better? Wait until the problem
++ % manifests itself, so it can be fixed for real --karl.
++ \global\colcount=0\relax}}%
++ %
++ % This preamble sets up a generic column definition, which will
++ % be used as many times as user calls for columns.
++ % \vtop will set a single line and will also let text wrap and
++ % continue for many paragraphs if desired.
++ \halign\bgroup&\global\advance\colcount by 1\relax
++ \multistrut\vtop{\hsize=\expandafter\csname col\the\colcount\endcsname
++ %
++ % In order to keep entries from bumping into each other
++ % we will add a \leftskip of \multitablecolspace to all columns after
++ % the first one.
++ %
++ % If a template has been used, we will add \multitablecolspace
++ % to the width of each template entry.
++ %
++ % If the user has set preamble in terms of percent of \hsize we will
++ % use that dimension as the width of the column, and the \leftskip
++ % will keep entries from bumping into each other. Table will start at
++ % left margin and final column will justify at right margin.
++ %
++ % Make sure we don't inherit \rightskip from the outer environment.
++ \rightskip=0pt
++ \ifnum\colcount=1
++ % The first column will be indented with the surrounding text.
++ \advance\hsize by\leftskip
+ \else
+- % If user has <not> set preamble in terms of percent of \hsize
+- % we will advance \hsize by \multitablecolspace
+- \advance\hsize by \multitablecolspace
++ \ifsetpercent \else
++ % If user has not set preamble in terms of percent of \hsize
++ % we will advance \hsize by \multitablecolspace.
++ \advance\hsize by \multitablecolspace
++ \fi
++ % In either case we will make \leftskip=\multitablecolspace:
++ \leftskip=\multitablecolspace
+ \fi
+- % In either case we will make \leftskip=\multitablecolspace:
+-\leftskip=\multitablecolspace
+-\fi
+- % Ignoring space at the beginning and end avoids an occasional spurious
+- % blank line, when TeX decides to break the line at the space before the
+- % box from the multistrut, so the strut ends up on a line by itself.
+- % For example:
+- % @multitable @columnfractions .11 .89
+- % @item @code{#}
+- % @tab Legal holiday which is valid in major parts of the whole country.
+- % Is automatically provided with highlighting sequences respectively marking
+- % characters.
+- \noindent\ignorespaces##\unskip\multistrut}\cr
+- % \everycr will reset column counter, \colcount, at the end of
+- % each line. Every column entry will cause \colcount to advance by one.
+- % The table preamble
+- % looks at the current \colcount to find the correct column width.
+-\global\everycr{\noalign{%
+-% \filbreak%% keeps underfull box messages off when table breaks over pages.
+-% Maybe so, but it also creates really weird page breaks when the table
+-% breaks over pages Wouldn't \vfil be better? Wait until the problem
+-% manifests itself, so it can be fixed for real --karl.
+-\global\colcount=0\relax}}
++ % Ignoring space at the beginning and end avoids an occasional spurious
++ % blank line, when TeX decides to break the line at the space before the
++ % box from the multistrut, so the strut ends up on a line by itself.
++ % For example:
++ % @multitable @columnfractions .11 .89
++ % @item @code{#}
++ % @tab Legal holiday which is valid in major parts of the whole country.
++ % Is automatically provided with highlighting sequences respectively marking
++ % characters.
++ \noindent\ignorespaces##\unskip\multistrut}\cr
+ }
+
+ \def\setmultitablespacing{% test to see if user has set \multitablelinespace.
+ % If so, do nothing. If not, give it an appropriate dimension based on
+ % current baselineskip.
+ \ifdim\multitablelinespace=0pt
++\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
++\global\advance\multitablelinespace by-\ht0
+ %% strut to put in table in case some entry doesn't have descenders,
+ %% to keep lines equally spaced
+ \let\multistrut = \strut
+-%% Test to see if parskip is larger than space between lines of
+-%% table. If not, do nothing.
+-%% If so, set to same dimension as multitablelinespace.
+ \else
++%% FIXME: what is \box0 supposed to be?
+ \gdef\multistrut{\vrule height\multitablelinespace depth\dp0
+ width0pt\relax} \fi
++%% Test to see if parskip is larger than space between lines of
++%% table. If not, do nothing.
++%% If so, set to same dimension as multitablelinespace.
+ \ifdim\multitableparskip>\multitablelinespace
+ \global\multitableparskip=\multitablelinespace
+ \global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
+@@ -2191,6 +2217,356 @@
+ \fi}
+
+
++\message{conditionals,}
++% Prevent errors for section commands.
++% Used in @ignore and in failing conditionals.
++\def\ignoresections{%
++ \let\chapter=\relax
++ \let\unnumbered=\relax
++ \let\top=\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
++}
++
++% Used in nested conditionals, where we have to parse the Texinfo source
++% and so want to turn off most commands, in case they are used
++% incorrectly.
++%
++\def\ignoremorecommands{%
++ \let\defcodeindex = \relax
++ \let\defcv = \relax
++ \let\deffn = \relax
++ \let\deffnx = \relax
++ \let\defindex = \relax
++ \let\defivar = \relax
++ \let\defmac = \relax
++ \let\defmethod = \relax
++ \let\defop = \relax
++ \let\defopt = \relax
++ \let\defspec = \relax
++ \let\deftp = \relax
++ \let\deftypefn = \relax
++ \let\deftypefun = \relax
++ \let\deftypeivar = \relax
++ \let\deftypeop = \relax
++ \let\deftypevar = \relax
++ \let\deftypevr = \relax
++ \let\defun = \relax
++ \let\defvar = \relax
++ \let\defvr = \relax
++ \let\ref = \relax
++ \let\xref = \relax
++ \let\printindex = \relax
++ \let\pxref = \relax
++ \let\settitle = \relax
++ \let\setchapternewpage = \relax
++ \let\setchapterstyle = \relax
++ \let\everyheading = \relax
++ \let\evenheading = \relax
++ \let\oddheading = \relax
++ \let\everyfooting = \relax
++ \let\evenfooting = \relax
++ \let\oddfooting = \relax
++ \let\headings = \relax
++ \let\include = \relax
++ \let\lowersections = \relax
++ \let\down = \relax
++ \let\raisesections = \relax
++ \let\up = \relax
++ \let\set = \relax
++ \let\clear = \relax
++ \let\item = \relax
++}
++
++% Ignore @ignore ... @end ignore.
++%
++\def\ignore{\doignore{ignore}}
++
++% Ignore @ifinfo, @ifhtml, @ifnottex, @html, @menu, and @direntry text.
++%
++\def\ifinfo{\doignore{ifinfo}}
++\def\ifhtml{\doignore{ifhtml}}
++\def\ifnottex{\doignore{ifnottex}}
++\def\html{\doignore{html}}
++\def\menu{\doignore{menu}}
++\def\direntry{\doignore{direntry}}
++
++% @dircategory CATEGORY -- specify a category of the dir file
++% which this file should belong to. Ignore this in TeX.
++\let\dircategory = \comment
++
++% Ignore text until a line `@end #1'.
++%
++\def\doignore#1{\begingroup
++ % Don't complain about control sequences we have declared \outer.
++ \ignoresections
++ %
++ % Define a command to swallow text until we reach `@end #1'.
++ % This @ is a catcode 12 token (that is the normal catcode of @ in
++ % this texinfo.tex file). We change the catcode of @ below to match.
++ \long\def\doignoretext##1@end #1{\enddoignore}%
++ %
++ % Make sure that spaces turn into tokens that match what \doignoretext wants.
++ \catcode32 = 10
++ %
++ % Ignore braces, too, so mismatched braces don't cause trouble.
++ \catcode`\{ = 9
++ \catcode`\} = 9
++ %
++ % We must not have @c interpreted as a control sequence.
++ \catcode`\@ = 12
++ %
++ % Make the letter c a comment character so that the rest of the line
++ % will be ignored. This way, the document can have (for example)
++ % @c @end ifinfo
++ % and the @end ifinfo will be properly ignored.
++ % (We've just changed @ to catcode 12.)
++ \catcode`\c = 14
++ %
++ % And now expand that command.
++ \doignoretext
++}
++
++% What we do to finish off ignored text.
++%
++\def\enddoignore{\endgroup\ignorespaces}%
++
++\newif\ifwarnedobs\warnedobsfalse
++\def\obstexwarn{%
++ \ifwarnedobs\relax\else
++ % We need to warn folks that they may have trouble with TeX 3.0.
++ % This uses \immediate\write16 rather than \message to get newlines.
++ \immediate\write16{}
++ \immediate\write16{WARNING: for users of Unix TeX 3.0!}
++ \immediate\write16{This manual trips a bug in TeX version 3.0 (tex hangs).}
++ \immediate\write16{If you are running another version of TeX, relax.}
++ \immediate\write16{If you are running Unix TeX 3.0, kill this TeX process.}
++ \immediate\write16{ Then upgrade your TeX installation if you can.}
++ \immediate\write16{ (See ftp://ftp.gnu.org/pub/gnu/TeX.README.)}
++ \immediate\write16{If you are stuck with version 3.0, run the}
++ \immediate\write16{ script ``tex3patch'' from the Texinfo distribution}
++ \immediate\write16{ to use a workaround.}
++ \immediate\write16{}
++ \global\warnedobstrue
++ \fi
++}
++
++% **In TeX 3.0, setting text in \nullfont hangs tex. For a
++% workaround (which requires the file ``dummy.tfm'' to be installed),
++% uncomment the following line:
++%%%%%\font\nullfont=dummy\let\obstexwarn=\relax
++
++% Ignore text, except that we keep track of conditional commands for
++% purposes of nesting, up to an `@end #1' command.
++%
++\def\nestedignore#1{%
++ \obstexwarn
++ % We must actually expand the ignored text to look for the @end
++ % command, so that nested ignore constructs work. Thus, we put the
++ % text into a \vbox and then do nothing with the result. To minimize
++ % the change of memory overflow, we follow the approach outlined on
++ % page 401 of the TeXbook: make the current font be a dummy font.
++ %
++ \setbox0 = \vbox\bgroup
++ % Don't complain about control sequences we have declared \outer.
++ \ignoresections
++ %
++ % Define `@end #1' to end the box, which will in turn undefine the
++ % @end command again.
++ \expandafter\def\csname E#1\endcsname{\egroup\ignorespaces}%
++ %
++ % We are going to be parsing Texinfo commands. Most cause no
++ % trouble when they are used incorrectly, but some commands do
++ % complicated argument parsing or otherwise get confused, so we
++ % undefine them.
++ %
++ % We can't do anything about stray @-signs, unfortunately;
++ % they'll produce `undefined control sequence' errors.
++ \ignoremorecommands
++ %
++ % Set the current font to be \nullfont, a TeX primitive, and define
++ % all the font commands to also use \nullfont. We don't use
++ % dummy.tfm, as suggested in the TeXbook, because not all sites
++ % might have that installed. Therefore, math mode will still
++ % produce output, but that should be an extremely small amount of
++ % stuff compared to the main input.
++ %
++ \nullfont
++ \let\tenrm=\nullfont \let\tenit=\nullfont \let\tensl=\nullfont
++ \let\tenbf=\nullfont \let\tentt=\nullfont \let\smallcaps=\nullfont
++ \let\tensf=\nullfont
++ % Similarly for index fonts (mostly for their use in smallexample).
++ \let\smallrm=\nullfont \let\smallit=\nullfont \let\smallsl=\nullfont
++ \let\smallbf=\nullfont \let\smalltt=\nullfont \let\smallsc=\nullfont
++ \let\smallsf=\nullfont
++ %
++ % Don't complain when characters are missing from the fonts.
++ \tracinglostchars = 0
++ %
++ % Don't bother to do space factor calculations.
++ \frenchspacing
++ %
++ % Don't report underfull hboxes.
++ \hbadness = 10000
++ %
++ % Do minimal line-breaking.
++ \pretolerance = 10000
++ %
++ % Do not execute instructions in @tex
++ \def\tex{\doignore{tex}}%
++ % Do not execute macro definitions.
++ % `c' is a comment character, so the word `macro' will get cut off.
++ \def\macro{\doignore{ma}}%
++}
++
++% @set VAR sets the variable VAR to an empty value.
++% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
++%
++% Since we want to separate VAR from REST-OF-LINE (which might be
++% empty), we can't just use \parsearg; we have to insert a space of our
++% own to delimit the rest of the line, and then take it out again if we
++% didn't need it. Make sure the catcode of space is correct to avoid
++% losing inside @example, for instance.
++%
++\def\set{\begingroup\catcode` =10
++ \catcode`\-=12 \catcode`\_=12 % Allow - and _ in VAR.
++ \parsearg\setxxx}
++\def\setxxx#1{\setyyy#1 \endsetyyy}
++\def\setyyy#1 #2\endsetyyy{%
++ \def\temp{#2}%
++ \ifx\temp\empty \global\expandafter\let\csname SET#1\endcsname = \empty
++ \else \setzzz{#1}#2\endsetzzz % Remove the trailing space \setxxx inserted.
++ \fi
++ \endgroup
++}
++% Can't use \xdef to pre-expand #2 and save some time, since \temp or
++% \next or other control sequences that we've defined might get us into
++% an infinite loop. Consider `@set foo @cite{bar}'.
++\def\setzzz#1#2 \endsetzzz{\expandafter\gdef\csname SET#1\endcsname{#2}}
++
++% @clear VAR clears (i.e., unsets) the variable VAR.
++%
++\def\clear{\parsearg\clearxxx}
++\def\clearxxx#1{\global\expandafter\let\csname SET#1\endcsname=\relax}
++
++% @value{foo} gets the text saved in variable foo.
++{
++ \catcode`\_ = \active
++ %
++ % We might end up with active _ or - characters in the argument if
++ % we're called from @code, as @code{@value{foo-bar_}}. So \let any
++ % such active characters to their normal equivalents.
++ \gdef\value{\begingroup
++ \catcode`\-=12 \catcode`\_=12
++ \indexbreaks \let_\normalunderscore
++ \valuexxx}
++}
++\def\valuexxx#1{\expandablevalue{#1}\endgroup}
++
++% We have this subroutine so that we can handle at least some @value's
++% properly in indexes (we \let\value to this in \indexdummies). Ones
++% whose names contain - or _ still won't work, but we can't do anything
++% about that. The command has to be fully expandable, since the result
++% winds up in the index file. This means that if the variable's value
++% contains other Texinfo commands, it's almost certain it will fail
++% (although perhaps we could fix that with sufficient work to do a
++% one-level expansion on the result, instead of complete).
++%
++\def\expandablevalue#1{%
++ \expandafter\ifx\csname SET#1\endcsname\relax
++ {[No value for ``#1'']}%
++ \else
++ \csname SET#1\endcsname
++ \fi
++}
++
++% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
++% with @set.
++%
++\def\ifset{\parsearg\ifsetxxx}
++\def\ifsetxxx #1{%
++ \expandafter\ifx\csname SET#1\endcsname\relax
++ \expandafter\ifsetfail
++ \else
++ \expandafter\ifsetsucceed
++ \fi
++}
++\def\ifsetsucceed{\conditionalsucceed{ifset}}
++\def\ifsetfail{\nestedignore{ifset}}
++\defineunmatchedend{ifset}
++
++% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been
++% defined with @set, or has been undefined with @clear.
++%
++\def\ifclear{\parsearg\ifclearxxx}
++\def\ifclearxxx #1{%
++ \expandafter\ifx\csname SET#1\endcsname\relax
++ \expandafter\ifclearsucceed
++ \else
++ \expandafter\ifclearfail
++ \fi
++}
++\def\ifclearsucceed{\conditionalsucceed{ifclear}}
++\def\ifclearfail{\nestedignore{ifclear}}
++\defineunmatchedend{ifclear}
++
++% @iftex, @ifnothtml, @ifnotinfo always succeed; we read the text
++% following, through the first @end iftex (etc.). Make `@end iftex'
++% (etc.) valid only after an @iftex.
++%
++\def\iftex{\conditionalsucceed{iftex}}
++\def\ifnothtml{\conditionalsucceed{ifnothtml}}
++\def\ifnotinfo{\conditionalsucceed{ifnotinfo}}
++\defineunmatchedend{iftex}
++\defineunmatchedend{ifnothtml}
++\defineunmatchedend{ifnotinfo}
++
++% We can't just want to start a group at @iftex (for example) and end it
++% at @end iftex, since then @set commands inside the conditional have no
++% effect (they'd get reverted at the end of the group). So we must
++% define \Eiftex to redefine itself to be its previous value. (We can't
++% just define it to fail again with an ``unmatched end'' error, since
++% the @ifset might be nested.)
++%
++\def\conditionalsucceed#1{%
++ \edef\temp{%
++ % Remember the current value of \E#1.
++ \let\nece{prevE#1} = \nece{E#1}%
++ %
++ % At the `@end #1', redefine \E#1 to be its previous value.
++ \def\nece{E#1}{\let\nece{E#1} = \nece{prevE#1}}%
++ }%
++ \temp
++}
++
++% We need to expand lots of \csname's, but we don't want to expand the
++% control sequences after we've constructed them.
++%
++\def\nece#1{\expandafter\noexpand\csname#1\endcsname}
++
++% @defininfoenclose.
++\let\definfoenclose=\comment
++
++
+ \message{indexing,}
+ % Index generation facilities
+
+@@ -2206,12 +2582,14 @@
+ % 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}}
++%
++\def\newindex#1{%
++ \iflinks
++ \expandafter\newwrite \csname#1indfile\endcsname
++ \openout \csname#1indfile\endcsname \jobname.#1 % Open the file
++ \fi
++ \expandafter\xdef\csname#1index\endcsname{% % Define @#1index
++ \noexpand\doindex{#1}}
+ }
+
+ % @defindex foo == \newindex{foo}
+@@ -2220,31 +2598,37 @@
+
+ % 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\newcodeindex#1{%
++ \iflinks
++ \expandafter\newwrite \csname#1indfile\endcsname
++ \openout \csname#1indfile\endcsname \jobname.#1
++ \fi
++ \expandafter\xdef\csname#1index\endcsname{%
++ \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}}%
++% The \closeout helps reduce unnecessary open files; the limit on the
++% Acorn RISC OS is a mere 16 files.
++\def\synindex#1 #2 {%
++ \expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname
++ \expandafter\closeout\csname#1indfile\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}}%
++\def\syncodeindex#1 #2 {%
++ \expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname
++ \expandafter\closeout\csname#1indfile\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.
+@@ -2265,6 +2649,7 @@
+ \def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
+
+ \def\indexdummies{%
++\def\ { }%
+ % Take care of the plain tex accent commands.
+ \def\"{\realbackslash "}%
+ \def\`{\realbackslash `}%
+@@ -2294,8 +2679,11 @@
+ % (Must be a way to avoid doing expansion at all, and thus not have to
+ % laboriously list every single command here.)
+ \def\@{@}% will be @@ when we switch to @ as escape char.
+-%\let\{ = \lbracecmd
+-%\let\} = \rbracecmd
++% Need these in case \tex is in effect and \{ is a \delimiter again.
++% But can't use \lbracecmd and \rbracecmd because texindex assumes
++% braces and backslashes are used only as delimiters.
++\let\{ = \mylbrace
++\let\} = \myrbrace
+ \def\_{{\realbackslash _}}%
+ \def\w{\realbackslash w }%
+ \def\bf{\realbackslash bf }%
+@@ -2306,7 +2694,6 @@
+ \def\gtr{\realbackslash gtr}%
+ \def\less{\realbackslash less}%
+ \def\hat{\realbackslash hat}%
+-%\def\char{\realbackslash char}%
+ \def\TeX{\realbackslash TeX}%
+ \def\dots{\realbackslash dots }%
+ \def\result{\realbackslash result}%
+@@ -2318,6 +2705,11 @@
+ \def\copyright{\realbackslash copyright}%
+ \def\tclose##1{\realbackslash tclose {##1}}%
+ \def\code##1{\realbackslash code {##1}}%
++\def\uref##1{\realbackslash uref {##1}}%
++\def\url##1{\realbackslash url {##1}}%
++\def\env##1{\realbackslash env {##1}}%
++\def\command##1{\realbackslash command {##1}}%
++\def\option##1{\realbackslash option {##1}}%
+ \def\dotless##1{\realbackslash dotless {##1}}%
+ \def\samp##1{\realbackslash samp {##1}}%
+ \def\,##1{\realbackslash ,{##1}}%
+@@ -2333,8 +2725,16 @@
+ \def\kbd##1{\realbackslash kbd {##1}}%
+ \def\dfn##1{\realbackslash dfn {##1}}%
+ \def\emph##1{\realbackslash emph {##1}}%
+-\def\value##1{\realbackslash value {##1}}%
++\def\acronym##1{\realbackslash acronym {##1}}%
++%
++% Handle some cases of @value -- where the variable name does not
++% contain - or _, and the value does not contain any
++% (non-fully-expandable) commands.
++\let\value = \expandablevalue
++%
+ \unsepspaces
++% Turn off macro expansion
++\turnoffmacros
+ }
+
+ % If an index command is used in an @example environment, any spaces
+@@ -2391,6 +2791,12 @@
+ %\let\tt=\indexdummyfont
+ \let\tclose=\indexdummyfont
+ \let\code=\indexdummyfont
++\let\url=\indexdummyfont
++\let\uref=\indexdummyfont
++\let\env=\indexdummyfont
++\let\acronym=\indexdummyfont
++\let\command=\indexdummyfont
++\let\option=\indexdummyfont
+ \let\file=\indexdummyfont
+ \let\samp=\indexdummyfont
+ \let\kbd=\indexdummyfont
+@@ -2406,14 +2812,24 @@
+ % so we do not become unable to do a definition.
+
+ {\catcode`\@=0 \catcode`\\=\other
+-@gdef@realbackslash{\}}
++ @gdef@realbackslash{\}}
+
+ \let\indexbackslash=0 %overridden during \printindex.
++\let\SETmarginindex=\relax % put index entries in margin (undocumented)?
++
++% For \ifx comparisons.
++\def\emptymacro{\empty}
+
+-\let\SETmarginindex=\relax %initialize!
+-% workhorse for all \fooindexes
+-% #1 is name of index, #2 is stuff to put there
+-\def\doind #1#2{%
++% Most index entries go through here, but \dosubind is the general case.
++%
++\def\doind#1#2{\dosubind{#1}{#2}\empty}
++
++% Workhorse for all \fooindexes.
++% #1 is name of index, #2 is stuff to put there, #3 is subentry --
++% \empty if called from \doind, as we usually are. The main exception
++% is with defuns, which call us directly.
++%
++\def\dosubind#1#2#3{%
+ % Put the index entry in the margin if desired.
+ \ifx\SETmarginindex\relax\else
+ \insert\margin{\hbox{\vrule height8pt depth3pt width0pt #2}}%
+@@ -2424,48 +2840,75 @@
+ \indexdummies % Must do this here, since \bf, etc expand at this stage
+ \escapechar=`\\
+ {%
+- \let\folio=0% We will expand all macros now EXCEPT \folio.
++ \let\folio = 0% We will expand all macros now EXCEPT \folio.
+ \def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now
+ % so it will be output as is; and it will print as backslash.
+ %
+- % First process the index-string with all font commands turned off
+- % to get the string to sort by.
+- {\indexnofonts \xdef\indexsorttmp{#2}}%
++ \def\thirdarg{#3}%
+ %
+- % Now produce the complete index entry, with both the sort key and the
+- % original text, including any font commands.
++ % If third arg is present, precede it with space in sort key.
++ \ifx\thirdarg\emptymacro
++ \let\subentry = \empty
++ \else
++ \def\subentry{ #3}%
++ \fi
++ %
++ % First process the index entry with all font commands turned
++ % off to get the string to sort by.
++ {\indexnofonts \xdef\indexsorttmp{#2\subentry}}%
++ %
++ % Now the real index entry with the fonts.
+ \toks0 = {#2}%
++ %
++ % If third (subentry) arg is present, add it to the index
++ % string. And include a space.
++ \ifx\thirdarg\emptymacro \else
++ \toks0 = \expandafter{\the\toks0 \space #3}%
++ \fi
++ %
++ % Set up the complete index entry, with both the sort key
++ % and the original text, including any font commands. We write
++ % three arguments to \entry to the .?? file, texindex reduces to
++ % two when writing the .??s sorted result.
+ \edef\temp{%
+ \write\csname#1indfile\endcsname{%
+ \realbackslash entry{\indexsorttmp}{\folio}{\the\toks0}}%
+ }%
+- \temp
++ %
++ % If a skip is the last thing on the list now, preserve it
++ % by backing up by \lastskip, doing the \write, then inserting
++ % the skip again. Otherwise, the whatsit generated by the
++ % \write will make \lastskip zero. The result is that sequences
++ % like this:
++ % @end defun
++ % @tindex whatever
++ % @defun ...
++ % will have extra space inserted, because the \medbreak in the
++ % start of the @defun won't see the skip inserted by the @end of
++ % the previous defun.
++ %
++ % But don't do any of this if we're not in vertical mode. We
++ % don't want to do a \vskip and prematurely end a paragraph.
++ %
++ % Avoid page breaks due to these extra skips, too.
++ %
++ \iflinks
++ \ifvmode
++ \skip0 = \lastskip
++ \ifdim\lastskip = 0pt \else \nobreak\vskip-\lastskip \fi
++ \fi
++ %
++ \temp % do the write
++ %
++ %
++ \ifvmode \ifdim\skip0 = 0pt \else \nobreak\vskip\skip0 \fi \fi
++ \fi
+ }%
+ }%
+ \penalty\count255
+ }%
+ }
+
+-\def\dosubind #1#2#3{%
+-{\count10=\lastpenalty %
+-{\indexdummies % Must do this here, since \bf, etc expand at this stage
+-\escapechar=`\\%
+-{\let\folio=0%
+-\def\rawbackslashxx{\indexbackslash}%
+-%
+-% Now process the index-string once, with all font commands turned off,
+-% to get the string to sort the index by.
+-{\indexnofonts
+-\xdef\temp1{#2 #3}%
+-}%
+-% Now produce the complete index entry. We process the index-string again,
+-% this time with font commands expanded, to get what to print in the index.
+-\edef\temp{%
+-\write \csname#1indfile\endcsname{%
+-\realbackslash entry {\temp1}{\folio}{#2}{#3}}}%
+-\temp }%
+-}\penalty\count10}}
+-
+ % The index entry written in the file actually looks like
+ % \entry {sortstring}{page}{topic}
+ % or
+@@ -2505,18 +2948,23 @@
+ \def\doprintindex#1{\begingroup
+ \dobreak \chapheadingskip{10000}%
+ %
+- \indexfonts \rm
++ \smallfonts \rm
+ \tolerance = 9500
+ \indexbreaks
+ %
+ % See if the index file exists and is nonempty.
++ % Change catcode of @ here so that if the index file contains
++ % \initial {@}
++ % as its first line, TeX doesn't complain about mismatched braces
++ % (because it thinks @} is a control sequence).
++ \catcode`\@ = 11
+ \openin 1 \jobname.#1s
+ \ifeof 1
+ % \enddoublecolumns gets confused if there is no text in the index,
+ % and it loses the chapter title and the aux file entries for the
+ % index. The easiest way to prevent this problem is to make sure
+ % there is some text.
+- (Index is nonexistent)
++ \putwordIndexNonexistent
+ \else
+ %
+ % If the index file exists but is empty, then \openin leaves \ifeof
+@@ -2524,14 +2972,13 @@
+ % it can discover if there is anything in it.
+ \read 1 to \temp
+ \ifeof 1
+- (Index is empty)
++ \putwordIndexIsEmpty
+ \else
+ % Index files are almost Texinfo source, but we use \ as the escape
+ % character. It would be better to use @, but that's too big a change
+ % to make right now.
+ \def\indexbackslash{\rawbackslashxx}%
+ \catcode`\\ = 0
+- \catcode`\@ = 11
+ \escapechar = `\\
+ \begindoublecolumns
+ \input \jobname.#1s
+@@ -2544,21 +2991,35 @@
+ % These macros are used by the sorted index file itself.
+ % Change them to control the appearance of the index.
+
+-% Same as \bigskipamount except no shrink.
+-% \balancecolumns gets confused if there is any shrink.
+-\newskip\initialskipamount \initialskipamount 12pt plus4pt
+-
+-\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}}
++\def\initial#1{{%
++ % Some minor font changes for the special characters.
++ \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt
++ %
++ % Remove any glue we may have, we'll be inserting our own.
++ \removelastskip
++ %
++ % We like breaks before the index initials, so insert a bonus.
++ \penalty -300
++ %
++ % Typeset the initial. Making this add up to a whole number of
++ % baselineskips increases the chance of the dots lining up from column
++ % to column. It still won't often be perfect, because of the stretch
++ % we need before each entry, but it's better.
++ %
++ % No shrink because it confuses \balancecolumns.
++ \vskip 1.67\baselineskip plus .5\baselineskip
++ \leftline{\secbf #1}%
++ \vskip .33\baselineskip plus .1\baselineskip
++ %
++ % Do our best not to break after the initial.
++ \nobreak
++}}
+
+ % This typesets a paragraph consisting of #1, dot leaders, and then #2
+ % flush to the right margin. It is used for index and table of contents
+ % entries. The paragraph is indented by \leftskip.
+ %
+-\def\entry #1#2{\begingroup
++\def\entry#1#2{\begingroup
+ %
+ % Start a new paragraph if necessary, so our assignments below can't
+ % affect previous text.
+@@ -2581,12 +3042,15 @@
+ %
+ % \hangafter is reset to 1 (which is the value we want) at the start
+ % of each paragraph, so we need not do anything with that.
+- \hangindent=2em
++ \hangindent = 2em
+ %
+ % When the entry text needs to be broken, just fill out the first line
+ % with blank space.
+ \rightskip = 0pt plus1fil
+ %
++ % A bit of stretch before each entry for the benefit of balancing columns.
++ \vskip 0pt plus1pt
++ %
+ % Start a ``paragraph'' for the index entry so the line breaking
+ % parameters we've set above will have an effect.
+ \noindent
+@@ -2611,7 +3075,11 @@
+ % The `\ ' here is removed by the implicit \unskip that TeX does as
+ % part of (the primitive) \par. Without it, a spurious underfull
+ % \hbox ensues.
+- \ #2% The page number ends the paragraph.
++ \ifpdf
++ \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
++ \else
++ \ #2% The page number ends the paragraph.
++ \fi
+ \fi%
+ \par
+ \endgroup}
+@@ -2640,24 +3108,26 @@
+
+ \def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
+ % Grab any single-column material above us.
+- \output = {\global\setbox\partialpage = \vbox{%
+- %
++ \output = {%
++ %
+ % Here is a possibility not foreseen in manmac: if we accumulate a
+ % whole lot of material, we might end up calling this \output
+ % routine twice in a row (see the doublecol-lose test, which is
+ % essentially a couple of indexes with @setchapternewpage off). In
+- % that case, we must prevent the second \partialpage from
+- % simply overwriting the first, causing us to lose the page.
+- % This will preserve it until a real output routine can ship it
+- % out. Generally, \partialpage will be empty when this runs and
+- % this will be a no-op.
+- \unvbox\partialpage
++ % that case we just ship out what is in \partialpage with the normal
++ % output routine. Generally, \partialpage will be empty when this
++ % runs and this will be a no-op. See the indexspread.tex test case.
++ \ifvoid\partialpage \else
++ \onepageout{\pagecontents\partialpage}%
++ \fi
+ %
+- % Unvbox the main output page.
+- \unvbox255
+- \kern-\topskip \kern\baselineskip
+- }}%
+- \eject
++ \global\setbox\partialpage = \vbox{%
++ % Unvbox the main output page.
++ \unvbox\PAGE
++ \kern-\topskip \kern\baselineskip
++ }%
++ }%
++ \eject % run that output routine to set \partialpage
+ %
+ % Use the double-column output routine for subsequent pages.
+ \output = {\doublecolumnout}%
+@@ -2685,14 +3155,21 @@
+ %
+ % Double the \vsize as well. (We don't need a separate register here,
+ % since nobody clobbers \vsize.)
++ \advance\vsize by -\ht\partialpage
+ \vsize = 2\vsize
+ }
++
++% The double-column output routine for all double-column pages except
++% the last.
++%
+ \def\doublecolumnout{%
+ \splittopskip=\topskip \splitmaxdepth=\maxdepth
+ % Get the available space for the double columns -- the normal
+ % (undoubled) page height minus any material left over from the
+ % previous page.
+- \dimen@=\pageheight \advance\dimen@ by-\ht\partialpage
++ \dimen@ = \vsize
++ \divide\dimen@ by 2
++ %
+ % box0 will be the left-hand column, box2 the right.
+ \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
+ \onepageout\pagesofar
+@@ -2701,42 +3178,67 @@
+ }
+ \def\pagesofar{%
+ % Re-output the contents of the output page -- any previous material,
+- % followed by the two boxes we just split.
++ % followed by the two boxes we just split, in box0 and box2.
+ \unvbox\partialpage
++ %
+ \hsize = \doublecolumnhsize
+- \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}%
++ \wd0=\hsize \wd2=\hsize
++ \hbox to\pagewidth{\box0\hfil\box2}%
+ }
+ \def\enddoublecolumns{%
+- \output = {\balancecolumns}\eject % split what we have
++ \output = {%
++ % Split the last of the double-column material. Leave it on the
++ % current page, no automatic page break.
++ \balancecolumns
++ %
++ % If we end up splitting too much material for the current page,
++ % though, there will be another page break right after this \output
++ % invocation ends. Having called \balancecolumns once, we do not
++ % want to call it again. Therefore, reset \output to its normal
++ % definition right away. (We hope \balancecolumns will never be
++ % called on to balance too much material, but if it is, this makes
++ % the output somewhat more palatable.)
++ \global\output = {\onepageout{\pagecontents\PAGE}}%
++ }%
++ \eject
+ \endgroup % started in \begindoublecolumns
+ %
+- % Back to normal single-column typesetting, but take account of the
+- % fact that we just accumulated some stuff on the output page.
++ % \pagegoal was set to the doubled \vsize above, since we restarted
++ % the current page. We're now back to normal single-column
++ % typesetting, so reset \pagegoal to the normal \vsize (after the
++ % \endgroup where \vsize got restored).
+ \pagegoal = \vsize
+ }
+ \def\balancecolumns{%
+ % Called at the end of the double column material.
+- \setbox0 = \vbox{\unvbox255}%
++ \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120.
+ \dimen@ = \ht0
+ \advance\dimen@ by \topskip
+ \advance\dimen@ by-\baselineskip
+- \divide\dimen@ by 2
++ \divide\dimen@ by 2 % target to split to
++ %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}%
+ \splittopskip = \topskip
+ % Loop until we get a decent breakpoint.
+- {\vbadness=10000 \loop
+- \global\setbox3=\copy0
+- \global\setbox1=\vsplit3 to\dimen@
+- \ifdim\ht3>\dimen@ \global\advance\dimen@ by1pt
+- \repeat}%
++ {%
++ \vbadness = 10000
++ \loop
++ \global\setbox3 = \copy0
++ \global\setbox1 = \vsplit3 to \dimen@
++ \ifdim\ht3>\dimen@
++ \global\advance\dimen@ by 1pt
++ \repeat
++ }%
++ %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}%
+ \setbox0=\vbox to\dimen@{\unvbox1}%
+ \setbox2=\vbox to\dimen@{\unvbox3}%
++ %
+ \pagesofar
+ }
+ \catcode`\@ = \other
+
+
+ \message{sectioning,}
+-% Define chapters, sections, etc.
++% Chapters, sections, etc.
+
+ \newcount\chapno
+ \newcount\secno \secno=0
+@@ -2745,59 +3247,49 @@
+
+ % 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 }
++% \def\appendixletter{\char\the\appendixno}
++% We do the following for the sake of pdftex, which needs the actual
++% letter in the expansion, not just typeset.
++\def\appendixletter{%
++ \ifnum\appendixno=`A A%
++ \else\ifnum\appendixno=`B B%
++ \else\ifnum\appendixno=`C C%
++ \else\ifnum\appendixno=`D D%
++ \else\ifnum\appendixno=`E E%
++ \else\ifnum\appendixno=`F F%
++ \else\ifnum\appendixno=`G G%
++ \else\ifnum\appendixno=`H H%
++ \else\ifnum\appendixno=`I I%
++ \else\ifnum\appendixno=`J J%
++ \else\ifnum\appendixno=`K K%
++ \else\ifnum\appendixno=`L L%
++ \else\ifnum\appendixno=`M M%
++ \else\ifnum\appendixno=`N N%
++ \else\ifnum\appendixno=`O O%
++ \else\ifnum\appendixno=`P P%
++ \else\ifnum\appendixno=`Q Q%
++ \else\ifnum\appendixno=`R R%
++ \else\ifnum\appendixno=`S S%
++ \else\ifnum\appendixno=`T T%
++ \else\ifnum\appendixno=`U U%
++ \else\ifnum\appendixno=`V V%
++ \else\ifnum\appendixno=`W W%
++ \else\ifnum\appendixno=`X X%
++ \else\ifnum\appendixno=`Y Y%
++ \else\ifnum\appendixno=`Z Z%
++ % The \the is necessary, despite appearances, because \appendixletter is
++ % expanded while writing the .toc file. \char\appendixno is not
++ % expandable, thus it is written literally, thus all appendixes come out
++ % with the same letter (or @) in the toc without it.
++ \else\char\the\appendixno
++ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
++ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
+
+ % 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{\ifnum \pageno<0
+- \errmessage{@#1 not allowed after generating table of contents}%
+-\fi}
++% page headings and footings can use it. @section does likewise.
++\def\thischapter{}
++\def\thissection{}
+
+-\def\chapternofonts{%
+- \let\rawbackslash=\relax
+- \let\frenchspacing=\relax
+- \def\result{\realbackslash result}%
+- \def\equiv{\realbackslash equiv}%
+- \def\expansion{\realbackslash expansion}%
+- \def\print{\realbackslash print}%
+- \def\TeX{\realbackslash TeX}%
+- \def\dots{\realbackslash dots}%
+- \def\result{\realbackslash result}%
+- \def\equiv{\realbackslash equiv}%
+- \def\expansion{\realbackslash expansion}%
+- \def\print{\realbackslash print}%
+- \def\error{\realbackslash error}%
+- \def\point{\realbackslash point}%
+- \def\copyright{\realbackslash copyright}%
+- \def\tt{\realbackslash tt}%
+- \def\bf{\realbackslash bf}%
+- \def\w{\realbackslash w}%
+- \def\less{\realbackslash less}%
+- \def\gtr{\realbackslash gtr}%
+- \def\hat{\realbackslash hat}%
+- \def\char{\realbackslash char}%
+- \def\tclose##1{\realbackslash tclose{##1}}%
+- \def\code##1{\realbackslash code{##1}}%
+- \def\samp##1{\realbackslash samp{##1}}%
+- \def\r##1{\realbackslash r{##1}}%
+- \def\b##1{\realbackslash b{##1}}%
+- \def\key##1{\realbackslash key{##1}}%
+- \def\file##1{\realbackslash file{##1}}%
+- \def\kbd##1{\realbackslash kbd{##1}}%
+- % These are redefined because @smartitalic wouldn't work inside xdef.
+- \def\i##1{\realbackslash i{##1}}%
+- \def\cite##1{\realbackslash cite{##1}}%
+- \def\var##1{\realbackslash var{##1}}%
+- \def\emph##1{\realbackslash emph{##1}}%
+- \def\dfn##1{\realbackslash dfn{##1}}%
+-}
+-
+ \newcount\absseclevel % used to calculate proper heading level
+ \newcount\secbase\secbase=0 % @raise/lowersections modify this count
+
+@@ -2868,59 +3360,59 @@
+ \fi
+ }
+
+-
++% @chapter, @appendix, @unnumbered.
+ \def\thischaptername{No Chapter Title}
+ \outer\def\chapter{\parsearg\chapteryyy}
+ \def\chapteryyy #1{\numhead0{#1}} % normally numhead0 calls chapterzzz
+-\def\chapterzzz #1{\seccheck{chapter}%
++\def\chapterzzz #1{%
+ \secno=0 \subsecno=0 \subsubsecno=0
+-\global\advance \chapno by 1 \message{\putwordChapter \the\chapno}%
++\global\advance \chapno by 1 \message{\putwordChapter\space \the\chapno}%
+ \chapmacro {#1}{\the\chapno}%
+ \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{\putwordChapter{} \the\chapno: \noexpand\thischaptername}%
+-{\chapternofonts%
+ \toks0 = {#1}%
+-\edef\temp{{\realbackslash chapentry{\the\toks0}{\the\chapno}{\noexpand\folio}}}%
+-\escapechar=`\\%
+-\write \contentsfile \temp %
+-\donoderef %
++\edef\temp{\noexpand\writetocentry{\realbackslash chapentry{\the\toks0}%
++ {\the\chapno}}}%
++\temp
++\donoderef
+ \global\let\section = \numberedsec
+ \global\let\subsection = \numberedsubsec
+ \global\let\subsubsection = \numberedsubsubsec
+-}}
++}
+
+ \outer\def\appendix{\parsearg\appendixyyy}
+ \def\appendixyyy #1{\apphead0{#1}} % normally apphead0 calls appendixzzz
+-\def\appendixzzz #1{\seccheck{appendix}%
++\def\appendixzzz #1{%
+ \secno=0 \subsecno=0 \subsubsecno=0
+-\global\advance \appendixno by 1 \message{Appendix \appendixletter}%
++\global\advance \appendixno by 1
++\message{\putwordAppendix\space \appendixletter}%
+ \chapmacro {#1}{\putwordAppendix{} \appendixletter}%
+ \gdef\thissection{#1}%
+ \gdef\thischaptername{#1}%
+ \xdef\thischapter{\putwordAppendix{} \appendixletter: \noexpand\thischaptername}%
+-{\chapternofonts%
+ \toks0 = {#1}%
+-\edef\temp{{\realbackslash chapentry{\the\toks0}%
+- {\putwordAppendix{} \appendixletter}{\noexpand\folio}}}%
+-\escapechar=`\\%
+-\write \contentsfile \temp %
+-\appendixnoderef %
++\edef\temp{\noexpand\writetocentry{\realbackslash chapentry{\the\toks0}%
++ {\putwordAppendix{} \appendixletter}}}%
++\temp
++\appendixnoderef
+ \global\let\section = \appendixsec
+ \global\let\subsection = \appendixsubsec
+ \global\let\subsubsection = \appendixsubsubsec
+-}}
++}
+
+ % @centerchap is like @unnumbered, but the heading is centered.
+ \outer\def\centerchap{\parsearg\centerchapyyy}
+ \def\centerchapyyy #1{{\let\unnumbchapmacro=\centerchapmacro \unnumberedyyy{#1}}}
+
++% @top is like @unnumbered.
+ \outer\def\top{\parsearg\unnumberedyyy}
++
+ \outer\def\unnumbered{\parsearg\unnumberedyyy}
+ \def\unnumberedyyy #1{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz
+-\def\unnumberedzzz #1{\seccheck{unnumbered}%
++\def\unnumberedzzz #1{%
+ \secno=0 \subsecno=0 \subsubsecno=0
+ %
+ % This used to be simply \message{#1}, but TeX fully expands the
+@@ -2932,155 +3424,139 @@
+ % Anyway, we don't want the fully-expanded definition of @cite to appear
+ % as a result of the \message, we just want `@cite' itself. We use
+ % \the<toks register> to achieve this: TeX expands \the<toks> only once,
+-% simply yielding the contents of the <toks register>.
++% simply yielding the contents of <toks register>. (We also do this for
++% the toc entries.)
+ \toks0 = {#1}\message{(\the\toks0)}%
+ %
+ \unnumbchapmacro {#1}%
+ \gdef\thischapter{#1}\gdef\thissection{#1}%
+-{\chapternofonts%
+ \toks0 = {#1}%
+-\edef\temp{{\realbackslash unnumbchapentry{\the\toks0}{\noexpand\folio}}}%
+-\escapechar=`\\%
+-\write \contentsfile \temp %
+-\unnumbnoderef %
++\edef\temp{\noexpand\writetocentry{\realbackslash unnumbchapentry{\the\toks0}}}%
++\temp
++\unnumbnoderef
+ \global\let\section = \unnumberedsec
+ \global\let\subsection = \unnumberedsubsec
+ \global\let\subsubsection = \unnumberedsubsubsec
+-}}
++}
+
++% Sections.
+ \outer\def\numberedsec{\parsearg\secyyy}
+ \def\secyyy #1{\numhead1{#1}} % normally calls seczzz
+-\def\seczzz #1{\seccheck{section}%
++\def\seczzz #1{%
+ \subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
+ \gdef\thissection{#1}\secheading {#1}{\the\chapno}{\the\secno}%
+-{\chapternofonts%
+ \toks0 = {#1}%
+-\edef\temp{{\realbackslash secentry %
+-{\the\toks0}{\the\chapno}{\the\secno}{\noexpand\folio}}}%
+-\escapechar=`\\%
+-\write \contentsfile \temp %
+-\donoderef %
+-\penalty 10000 %
+-}}
++\edef\temp{\noexpand\writetocentry{\realbackslash secentry{\the\toks0}%
++ {\the\chapno}{\the\secno}}}%
++\temp
++\donoderef
++\nobreak
++}
+
+ \outer\def\appendixsection{\parsearg\appendixsecyyy}
+ \outer\def\appendixsec{\parsearg\appendixsecyyy}
+ \def\appendixsecyyy #1{\apphead1{#1}} % normally calls appendixsectionzzz
+-\def\appendixsectionzzz #1{\seccheck{appendixsection}%
++\def\appendixsectionzzz #1{%
+ \subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
+ \gdef\thissection{#1}\secheading {#1}{\appendixletter}{\the\secno}%
+-{\chapternofonts%
+ \toks0 = {#1}%
+-\edef\temp{{\realbackslash secentry %
+-{\the\toks0}{\appendixletter}{\the\secno}{\noexpand\folio}}}%
+-\escapechar=`\\%
+-\write \contentsfile \temp %
+-\appendixnoderef %
+-\penalty 10000 %
+-}}
++\edef\temp{\noexpand\writetocentry{\realbackslash secentry{\the\toks0}%
++ {\appendixletter}{\the\secno}}}%
++\temp
++\appendixnoderef
++\nobreak
++}
+
+ \outer\def\unnumberedsec{\parsearg\unnumberedsecyyy}
+ \def\unnumberedsecyyy #1{\unnmhead1{#1}} % normally calls unnumberedseczzz
+-\def\unnumberedseczzz #1{\seccheck{unnumberedsec}%
++\def\unnumberedseczzz #1{%
+ \plainsecheading {#1}\gdef\thissection{#1}%
+-{\chapternofonts%
+ \toks0 = {#1}%
+-\edef\temp{{\realbackslash unnumbsecentry{\the\toks0}{\noexpand\folio}}}%
+-\escapechar=`\\%
+-\write \contentsfile \temp %
+-\unnumbnoderef %
+-\penalty 10000 %
+-}}
++\edef\temp{\noexpand\writetocentry{\realbackslash unnumbsecentry{\the\toks0}}}%
++\temp
++\unnumbnoderef
++\nobreak
++}
+
++% Subsections.
+ \outer\def\numberedsubsec{\parsearg\numberedsubsecyyy}
+ \def\numberedsubsecyyy #1{\numhead2{#1}} % normally calls numberedsubseczzz
+-\def\numberedsubseczzz #1{\seccheck{subsection}%
++\def\numberedsubseczzz #1{%
+ \gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
+ \subsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}%
+-{\chapternofonts%
+ \toks0 = {#1}%
+-\edef\temp{{\realbackslash subsecentry %
+-{\the\toks0}{\the\chapno}{\the\secno}{\the\subsecno}{\noexpand\folio}}}%
+-\escapechar=`\\%
+-\write \contentsfile \temp %
+-\donoderef %
+-\penalty 10000 %
+-}}
++\edef\temp{\noexpand\writetocentry{\realbackslash subsecentry{\the\toks0}%
++ {\the\chapno}{\the\secno}{\the\subsecno}}}%
++\temp
++\donoderef
++\nobreak
++}
+
+ \outer\def\appendixsubsec{\parsearg\appendixsubsecyyy}
+ \def\appendixsubsecyyy #1{\apphead2{#1}} % normally calls appendixsubseczzz
+-\def\appendixsubseczzz #1{\seccheck{appendixsubsec}%
++\def\appendixsubseczzz #1{%
+ \gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
+ \subsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}%
+-{\chapternofonts%
+ \toks0 = {#1}%
+-\edef\temp{{\realbackslash subsecentry %
+-{\the\toks0}{\appendixletter}{\the\secno}{\the\subsecno}{\noexpand\folio}}}%
+-\escapechar=`\\%
+-\write \contentsfile \temp %
+-\appendixnoderef %
+-\penalty 10000 %
+-}}
++\edef\temp{\noexpand\writetocentry{\realbackslash subsecentry{\the\toks0}%
++ {\appendixletter}{\the\secno}{\the\subsecno}}}%
++\temp
++\appendixnoderef
++\nobreak
++}
+
+ \outer\def\unnumberedsubsec{\parsearg\unnumberedsubsecyyy}
+ \def\unnumberedsubsecyyy #1{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
+-\def\unnumberedsubseczzz #1{\seccheck{unnumberedsubsec}%
++\def\unnumberedsubseczzz #1{%
+ \plainsubsecheading {#1}\gdef\thissection{#1}%
+-{\chapternofonts%
+ \toks0 = {#1}%
+-\edef\temp{{\realbackslash unnumbsubsecentry{\the\toks0}{\noexpand\folio}}}%
+-\escapechar=`\\%
+-\write \contentsfile \temp %
+-\unnumbnoderef %
+-\penalty 10000 %
+-}}
++\edef\temp{\noexpand\writetocentry{\realbackslash unnumbsubsecentry%
++ {\the\toks0}}}%
++\temp
++\unnumbnoderef
++\nobreak
++}
+
++% Subsubsections.
+ \outer\def\numberedsubsubsec{\parsearg\numberedsubsubsecyyy}
+ \def\numberedsubsubsecyyy #1{\numhead3{#1}} % normally numberedsubsubseczzz
+-\def\numberedsubsubseczzz #1{\seccheck{subsubsection}%
++\def\numberedsubsubseczzz #1{%
+ \gdef\thissection{#1}\global\advance \subsubsecno by 1 %
+ \subsubsecheading {#1}
+ {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
+-{\chapternofonts%
+ \toks0 = {#1}%
+-\edef\temp{{\realbackslash subsubsecentry{\the\toks0}
+- {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}
+- {\noexpand\folio}}}%
+-\escapechar=`\\%
+-\write \contentsfile \temp %
+-\donoderef %
+-\penalty 10000 %
+-}}
++\edef\temp{\noexpand\writetocentry{\realbackslash subsubsecentry{\the\toks0}%
++ {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}}}%
++\temp
++\donoderef
++\nobreak
++}
+
+ \outer\def\appendixsubsubsec{\parsearg\appendixsubsubsecyyy}
+ \def\appendixsubsubsecyyy #1{\apphead3{#1}} % normally appendixsubsubseczzz
+-\def\appendixsubsubseczzz #1{\seccheck{appendixsubsubsec}%
++\def\appendixsubsubseczzz #1{%
+ \gdef\thissection{#1}\global\advance \subsubsecno by 1 %
+ \subsubsecheading {#1}
+ {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
+-{\chapternofonts%
+ \toks0 = {#1}%
+-\edef\temp{{\realbackslash subsubsecentry{\the\toks0}%
+- {\appendixletter}
+- {\the\secno}{\the\subsecno}{\the\subsubsecno}{\noexpand\folio}}}%
+-\escapechar=`\\%
+-\write \contentsfile \temp %
+-\appendixnoderef %
+-\penalty 10000 %
+-}}
++\edef\temp{\noexpand\writetocentry{\realbackslash subsubsecentry{\the\toks0}%
++ {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}}}%
++\temp
++\appendixnoderef
++\nobreak
++}
+
+ \outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubsecyyy}
+ \def\unnumberedsubsubsecyyy #1{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
+-\def\unnumberedsubsubseczzz #1{\seccheck{unnumberedsubsubsec}%
++\def\unnumberedsubsubseczzz #1{%
+ \plainsubsubsecheading {#1}\gdef\thissection{#1}%
+-{\chapternofonts%
+ \toks0 = {#1}%
+-\edef\temp{{\realbackslash unnumbsubsubsecentry{\the\toks0}{\noexpand\folio}}}%
+-\escapechar=`\\%
+-\write \contentsfile \temp %
+-\unnumbnoderef %
+-\penalty 10000 %
+-}}
++\edef\temp{\noexpand\writetocentry{\realbackslash unnumbsubsubsecentry%
++ {\the\toks0}}}%
++\temp
++\unnumbnoderef
++\nobreak
++}
+
+ % These are variants which are not "outer", so they can appear in @ifinfo.
+ % Actually, they should now be obsolete; ordinary section commands should work.
+@@ -3109,8 +3585,7 @@
+
+ % Define @majorheading, @heading and @subheading
+
+-% NOTE on use of \vbox for chapter headings, section headings, and
+-% such:
++% NOTE on use of \vbox for chapter headings, section headings, and such:
+ % 1) We use \vbox rather than the earlier \line to permit
+ % overlong headings to fold.
+ % 2) \hyphenpenalty is set to 10000 because hyphenation in a
+@@ -3157,12 +3632,12 @@
+
+ \def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
+
+-\def\CHAPPAGoff{
++\def\CHAPPAGoff{%
+ \global\let\contentsalignmacro = \chappager
+ \global\let\pchapsepmacro=\chapbreak
+ \global\let\pagealignmacro=\chappager}
+
+-\def\CHAPPAGon{
++\def\CHAPPAGon{%
+ \global\let\contentsalignmacro = \chappager
+ \global\let\pchapsepmacro=\chappager
+ \global\let\pagealignmacro=\chappager
+@@ -3216,7 +3691,7 @@
+ \def\unnchfopen #1{%
+ \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+- \rm #1\hfill}}\bigskip \par\penalty 10000 %
++ \rm #1\hfill}}\bigskip \par\nobreak
+ }
+
+ \def\chfopen #1#2{\chapoddpage {\chapfonts
+@@ -3227,7 +3702,7 @@
+ \def\centerchfopen #1{%
+ \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt
+- \hfill {\rm #1}\hfill}}\bigskip \par\penalty 10000 %
++ \hfill {\rm #1}\hfill}}\bigskip \par\nobreak
+ }
+
+ \def\CHAPFopen{
+@@ -3280,24 +3755,45 @@
+ }
+
+
+-\message{toc printing,}
+-% Finish up the main text and prepare to read what we've written
+-% to \contentsfile.
++\message{toc,}
++% Table of contents.
++\newwrite\tocfile
++
++% Write an entry to the toc file, opening it if necessary.
++% Called from @chapter, etc. We supply {\folio} at the end of the
++% argument, which will end up as the last argument to the \...entry macro.
++%
++% We open the .toc file here instead of at @setfilename or any other
++% given time so that @contents can be put in the document anywhere.
++%
++\newif\iftocfileopened
++\def\writetocentry#1{%
++ \iftocfileopened\else
++ \immediate\openout\tocfile = \jobname.toc
++ \global\tocfileopenedtrue
++ \fi
++ \iflinks \write\tocfile{#1{\folio}}\fi
++}
+
+ \newskip\contentsrightmargin \contentsrightmargin=1in
++\newcount\savepageno
++\newcount\lastnegativepageno \lastnegativepageno = -1
++
++% Finish up the main text and prepare to read what we've written
++% to \tocfile.
++%
+ \def\startcontents#1{%
+ % If @setchapternewpage on, and @headings double, the contents should
+ % start on an odd page, unlike chapters. Thus, we maintain
+ % \contentsalignmacro in parallel with \pagealignmacro.
+ % From: Torbjorn Granlund <tege@matematik.su.se>
+ \contentsalignmacro
+- \immediate\closeout \contentsfile
+- \ifnum \pageno>0
+- \pageno = -1 % Request roman numbered pages.
+- \fi
++ \immediate\closeout\tocfile
++ %
+ % Don't need to put `Contents' or `Short Contents' in the headline.
+ % It is abundantly clear what they are.
+ \unnumbchapmacro{#1}\def\thischapter{}%
++ \savepageno = \pageno
+ \begingroup % Set up to handle contents files properly.
+ \catcode`\\=0 \catcode`\{=1 \catcode`\}=2 \catcode`\@=11
+ % We can't do this, because then an actual ^ in a section
+@@ -3305,20 +3801,31 @@
+ %\catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi
+ \raggedbottom % Worry more about breakpoints than the bottom.
+ \advance\hsize by -\contentsrightmargin % Don't use the full line length.
++ %
++ % Roman numerals for page numbers.
++ \ifnum \pageno>0 \pageno = \lastnegativepageno \fi
+ }
+
+
+ % Normal (long) toc.
+-\outer\def\contents{%
+- \startcontents{\putwordTableofContents}%
+- \input \jobname.toc
++\def\contents{%
++ \startcontents{\putwordTOC}%
++ \openin 1 \jobname.toc
++ \ifeof 1 \else
++ \closein 1
++ \input \jobname.toc
++ \fi
++ \vfill \eject
++ \contentsalignmacro % in case @setchapternewpage odd is in effect
++ \pdfmakeoutlines
+ \endgroup
+- \vfill \eject
++ \lastnegativepageno = \pageno
++ \pageno = \savepageno
+ }
+
+ % And just the chapters.
+-\outer\def\summarycontents{%
+- \startcontents{\putwordShortContents}%
++\def\summarycontents{%
++ \startcontents{\putwordShortTOC}%
+ %
+ \let\chapentry = \shortchapentry
+ \let\unnumbchapentry = \shortunnumberedentry
+@@ -3334,12 +3841,23 @@
+ \def\unnumbsubsecentry ##1##2{}
+ \def\subsubsecentry ##1##2##3##4##5##6{}
+ \def\unnumbsubsubsecentry ##1##2{}
+- \input \jobname.toc
++ \openin 1 \jobname.toc
++ \ifeof 1 \else
++ \closein 1
++ \input \jobname.toc
++ \fi
++ \vfill \eject
++ \contentsalignmacro % in case @setchapternewpage odd is in effect
+ \endgroup
+- \vfill \eject
++ \lastnegativepageno = \pageno
++ \pageno = \savepageno
+ }
+ \let\shortcontents = \summarycontents
+
++\ifpdf
++ \pdfcatalog{/PageMode /UseOutlines}%
++\fi
++
+ % 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.
+@@ -3350,7 +3868,7 @@
+
+ % See comments in \dochapentry re vbox and related settings
+ \def\shortchapentry#1#2#3{%
+- \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno{#3}}%
++ \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#3\egroup}%
+ }
+
+ % Typeset the label for a chapter or appendix for the short contents.
+@@ -3358,10 +3876,14 @@
+ % We could simplify the code here by writing out an \appendixentry
+ % command in the toc file for appendices, instead of using \chapentry
+ % for both, but it doesn't seem worth it.
+-\setbox0 = \hbox{\shortcontrm \putwordAppendix }
+-\newdimen\shortappendixwidth \shortappendixwidth = \wd0
+-
++%
++\newdimen\shortappendixwidth
++%
+ \def\shortchaplabel#1{%
++ % Compute width of word "Appendix", may change with language.
++ \setbox0 = \hbox{\shortcontrm \putwordAppendix}%
++ \shortappendixwidth = \wd0
++ %
+ % We typeset #1 in a box of constant width, regardless of the text of
+ % #1, so the chapter titles will come out aligned.
+ \setbox0 = \hbox{#1}%
+@@ -3376,7 +3898,7 @@
+ }
+
+ \def\unnumbchapentry#1#2{\dochapentry{#1}{#2}}
+-\def\shortunnumberedentry#1#2{\tocentry{#1}{\doshortpageno{#2}}}
++\def\shortunnumberedentry#1#2{\tocentry{#1}{\doshortpageno\bgroup#2\egroup}}
+
+ % Sections.
+ \def\secentry#1#2#3#4{\dosecentry{#2.#3\labelspace#1}{#4}}
+@@ -3403,35 +3925,36 @@
+ \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip
+ \begingroup
+ \chapentryfonts
+- \tocentry{#1}{\dopageno{#2}}%
++ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+ \endgroup
+ \nobreak\vskip .25\baselineskip plus.1\baselineskip
+ }
+
+ \def\dosecentry#1#2{\begingroup
+ \secentryfonts \leftskip=\tocindent
+- \tocentry{#1}{\dopageno{#2}}%
++ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+ \endgroup}
+
+ \def\dosubsecentry#1#2{\begingroup
+ \subsecentryfonts \leftskip=2\tocindent
+- \tocentry{#1}{\dopageno{#2}}%
++ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+ \endgroup}
+
+ \def\dosubsubsecentry#1#2{\begingroup
+ \subsubsecentryfonts \leftskip=3\tocindent
+- \tocentry{#1}{\dopageno{#2}}%
++ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+ \endgroup}
+
+ % Final typesetting of a toc entry; we use the same \entry macro as for
+ % the index entries, but we want to suppress hyphenation here. (We
+ % can't do that in the \entry macro, since index entries might consist
+ % of hyphenated-identifiers-that-do-not-fit-on-a-line-and-nothing-else.)
+-%
+-% \turnoffactive is for the sake of @" used for umlauts.
+ \def\tocentry#1#2{\begingroup
+ \vskip 0pt plus1pt % allow a little stretch for the sake of nice page breaks
+- \entry{\turnoffactive #1}{\turnoffactive #2}%
++ % Do not use \turnoffactive in these arguments. Since the toc is
++ % typeset in cmr, so characters such as _ would come out wrong; we
++ % have to do the usual translation tricks.
++ \entry{#1}{#2}%
+ \endgroup}
+
+ % Space between chapter (or whatever) number and the title.
+@@ -3447,6 +3970,7 @@
+
+
+ \message{environments,}
++% @foo ... @end foo.
+
+ % Since these characters are used in examples, it should be an even number of
+ % \tt widths. Each \tt character is 1en, so two makes it 1em.
+@@ -3497,30 +4021,36 @@
+ % 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 43=12 % plus
+-\catcode`\"=12
+-\catcode`\==12
+-\catcode`\|=12
+-\catcode`\<=12
+-\catcode`\>=12
+-\escapechar=`\\
+-%
+-\let\,=\ptexcomma
+-\let\{=\ptexlbrace
+-\let\}=\ptexrbrace
+-\let\.=\ptexdot
+-\let\*=\ptexstar
+-\let\dots=\ptexdots
+-\def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
+-\def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
+-\def\@{@}%
+-\let\bullet=\ptexbullet
+-\let\b=\ptexb \let\c=\ptexc \let\i=\ptexi \let\t=\ptext
+-%
++ \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
++ \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
++ \catcode `\^=7 \catcode `\_=8 \catcode `\~=13 \let~=\tie
++ \catcode `\%=14
++ \catcode 43=12 % plus
++ \catcode`\"=12
++ \catcode`\==12
++ \catcode`\|=12
++ \catcode`\<=12
++ \catcode`\>=12
++ \escapechar=`\\
++ %
++ \let\b=\ptexb
++ \let\bullet=\ptexbullet
++ \let\c=\ptexc
++ \let\,=\ptexcomma
++ \let\.=\ptexdot
++ \let\dots=\ptexdots
++ \let\equiv=\ptexequiv
++ \let\!=\ptexexclam
++ \let\i=\ptexi
++ \let\{=\ptexlbrace
++ \let\+=\tabalign
++ \let\}=\ptexrbrace
++ \let\*=\ptexstar
++ \let\t=\ptext
++ %
++ \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
++ \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
++ \def\@{@}%
+ \let\Etex=\endgroup}
+
+ % Define @lisp ... @endlisp.
+@@ -3565,8 +4095,8 @@
+ % \nonarrowing is a flag. If "set", @lisp etc don't narrow margins.
+ \let\nonarrowing=\relax
+
+-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-% \cartouche: draw rectangle w/rounded corners around argument
++% @cartouche ... @end cartouche: draw rectangle w/rounded corners around
++% environment contents.
+ \font\circle=lcircle10
+ \newdimen\circthick
+ \newdimen\cartouter\newdimen\cartinner
+@@ -3593,9 +4123,9 @@
+ \cartinner=\hsize \advance\cartinner by-\lskip
+ \advance\cartinner by-\rskip
+ \cartouter=\hsize
+- \advance\cartouter by 18pt % allow for 3pt kerns on either
++ \advance\cartouter by 18.4pt % allow for 3pt kerns on either
+ % side, and for 6pt waste from
+-% each corner char
++% each corner char, and rule thickness
+ \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
+ % Flag to tell @lisp, etc., not to narrow margin.
+ \let\nonarrowing=\comment
+@@ -3649,57 +4179,68 @@
+ \fi
+ }
+
+-% To ending an @example-like environment, we first end the paragraph
+-% (via \afterenvbreak's vertical glue), and then the group. That way we
+-% keep the zero \parskip that the environments set -- \parskip glue
+-% will be inserted at the beginning of the next paragraph in the
+-% document, after the environment.
++% Define the \E... control sequence only if we are inside the particular
++% environment, so the error checking in \end will work.
+ %
+-\def\nonfillfinish{\afterenvbreak\endgroup}%
++% To end an @example-like environment, we first end the paragraph (via
++% \afterenvbreak's vertical glue), and then the group. That way we keep
++% the zero \parskip that the environments set -- \parskip glue will be
++% inserted at the beginning of the next paragraph in the document, after
++% the environment.
++%
++\def\nonfillfinish{\afterenvbreak\endgroup}
+
++% @lisp: indented, narrowed, typewriter font.
+ \def\lisp{\begingroup
+ \nonfillstart
+ \let\Elisp = \nonfillfinish
+ \tt
+- % Make @kbd do something special, if requested.
+- \let\kbdfont\kbdexamplefont
+- \rawbackslash % have \ input char produce \ char from current font
+- \gobble
++ \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
++ \gobble % eat return
+ }
+
+-% Define the \E... control sequence only if we are inside the
+-% environment, so the error checking in \end will work.
+-%
+-% We must call \lisp last in the definition, since it reads the
+-% return following the @example (or whatever) command.
+-%
++% @example: Same as @lisp.
+ \def\example{\begingroup \def\Eexample{\nonfillfinish\endgroup}\lisp}
+-\def\smallexample{\begingroup \def\Esmallexample{\nonfillfinish\endgroup}\lisp}
+-\def\smalllisp{\begingroup \def\Esmalllisp{\nonfillfinish\endgroup}\lisp}
+
+-% @smallexample and @smalllisp. This is not used unless the @smallbook
+-% command is given. Originally contributed by Pavel@xerox.
+-%
++% @small... is usually equivalent to the non-small (@smallbook
++% redefines). We must call \example (or whatever) last in the
++% definition, since it reads the return following the @example (or
++% whatever) command.
++%
++% This actually allows (for example) @end display inside an
++% @smalldisplay. Too bad, but makeinfo will catch the error anyway.
++%
++\def\smalldisplay{\begingroup\def\Esmalldisplay{\nonfillfinish\endgroup}\display}
++\def\smallexample{\begingroup\def\Esmallexample{\nonfillfinish\endgroup}\lisp}
++\def\smallformat{\begingroup\def\Esmallformat{\nonfillfinish\endgroup}\format}
++\def\smalllisp{\begingroup\def\Esmalllisp{\nonfillfinish\endgroup}\lisp}
++
++% Real @smallexample and @smalllisp (when @smallbook): use smaller fonts.
++% Originally contributed by Pavel@xerox.
+ \def\smalllispx{\begingroup
+- \nonfillstart
+- \let\Esmalllisp = \nonfillfinish
+- \let\Esmallexample = \nonfillfinish
+- %
+- % Smaller fonts for small examples.
+- \indexfonts \tt
+- \rawbackslash % make \ output the \ character from the current font (tt)
+- \gobble
++ \def\Esmalllisp{\nonfillfinish\endgroup}%
++ \def\Esmallexample{\nonfillfinish\endgroup}%
++ \smallfonts
++ \lisp
+ }
+
+-% This is @display; same as @lisp except use roman font.
++% @display: same as @lisp except keep current font.
+ %
+ \def\display{\begingroup
+ \nonfillstart
+ \let\Edisplay = \nonfillfinish
+ \gobble
+ }
++
++% @smalldisplay (when @smallbook): @display plus smaller fonts.
++%
++\def\smalldisplayx{\begingroup
++ \def\Esmalldisplay{\nonfillfinish\endgroup}%
++ \smallfonts \rm
++ \display
++}
+
+-% This is @format; same as @display except don't narrow margins.
++% @format: same as @display except don't narrow margins.
+ %
+ \def\format{\begingroup
+ \let\nonarrowing = t
+@@ -3708,20 +4249,27 @@
+ \gobble
+ }
+
+-% @flushleft (same as @format) and @flushright.
++% @smallformat (when @smallbook): @format plus smaller fonts.
+ %
+-\def\flushleft{\begingroup
+- \let\nonarrowing = t
+- \nonfillstart
+- \let\Eflushleft = \nonfillfinish
+- \gobble
++\def\smallformatx{\begingroup
++ \def\Esmallformat{\nonfillfinish\endgroup}%
++ \smallfonts \rm
++ \format
+ }
++
++% @flushleft (same as @format).
++%
++\def\flushleft{\begingroup \def\Eflushleft{\nonfillfinish\endgroup}\format}
++
++% @flushright.
++%
+ \def\flushright{\begingroup
+ \let\nonarrowing = t
+ \nonfillstart
+ \let\Eflushright = \nonfillfinish
+ \advance\leftskip by 0pt plus 1fill
+- \gobble}
++ \gobble
++}
+
+ % @quotation does normal linebreaking (hence we can't use \nonfillstart)
+ % and narrows the margins.
+@@ -3744,9 +4292,11 @@
+ \fi
+ }
+
++
+ \message{defuns,}
+-% Define formatter for defuns
+-% First, allow user to change definition object font (\df) internally
++% @defun etc.
++
++% Allow user to change definition object font (\df) internally
+ \def\setdeffont #1 {\csname DEF#1\endcsname}
+
+ \newskip\defbodyindent \defbodyindent=.4in
+@@ -3800,10 +4350,16 @@
+ %% contained text. This is especially needed for [ and ]
+ \def\opnr{{\sf\char`\(}\global\advance\parencount by 1 }
+ \def\clnr{{\sf\char`\)}\global\advance\parencount by -1 }
+-\def\ampnr{\&}
++\let\ampnr = \&
+ \def\lbrb{{\bf\char`\[}}
+ \def\rbrb{{\bf\char`\]}}
+
++% Active &'s sneak into the index arguments, so make sure it's defined.
++{
++ \catcode`& = 13
++ \global\let& = \ampnr
++}
++
+ % First, defname, which formats the header line itself.
+ % #1 should be the function name.
+ % #2 should be the type of definition, such as "Function".
+@@ -3813,20 +4369,18 @@
+ % outside the @def...
+ \dimen2=\leftskip
+ \advance\dimen2 by -\defbodyindent
+-\dimen3=\rightskip
+-\advance\dimen3 by -\defbodyindent
+-\noindent %
++\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 %
++\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
+ {% Adjust \hsize to exclude the ambient margins,
+ % so that \rightline will obey them.
+-\advance \hsize by -\dimen2 \advance \hsize by -\dimen3
+-\rlap{\rightline{{\rm #2}\hskip \deftypemargin}}}%
++\advance \hsize by -\dimen2
++\rlap{\rightline{{\rm #2}\hskip -1.25pc }}}%
+ % Make all lines underfull and no complaints:
+ \tolerance=10000 \hbadness=10000
+ \advance\leftskip by -\defbodyindent
+@@ -3847,23 +4401,62 @@
+ \def#1{\endgraf\endgroup\medbreak}%
+ \def#2{\begingroup\obeylines\activeparens\spacesplit#3}%
+ \parindent=0in
+-\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
++\advance\leftskip by \defbodyindent
+ \exdentamount=\defbodyindent
+ \begingroup %
+ \catcode 61=\active % 61 is `='
+ \obeylines\activeparens\spacesplit#3}
+
+-\def\defmethparsebody #1#2#3#4 {\begingroup\inENV %
++% #1 is the \E... control sequence to end the definition (which we define).
++% #2 is the \...x control sequence for consecutive fns (which we define).
++% #3 is the control sequence to call to resume processing.
++% #4, delimited by the space, is the class name.
++%
++\def\defmethparsebody#1#2#3#4 {\begingroup\inENV %
+ \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
+-\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
++\advance\leftskip by \defbodyindent
+ \exdentamount=\defbodyindent
+ \begingroup\obeylines\activeparens\spacesplit{#3{#4}}}
+
++% Used for @deftypemethod and @deftypeivar.
++% #1 is the \E... control sequence to end the definition (which we define).
++% #2 is the \...x control sequence for consecutive fns (which we define).
++% #3 is the control sequence to call to resume processing.
++% #4, delimited by a space, is the class name.
++% #5 is the method's return type.
++%
++\def\deftypemethparsebody#1#2#3#4 #5 {\begingroup\inENV
++ \medbreak
++ \def#1{\endgraf\endgroup\medbreak}%
++ \def#2##1 ##2 {\begingroup\obeylines\activeparens\spacesplit{#3{##1}{##2}}}%
++ \parindent=0in
++ \advance\leftskip by \defbodyindent
++ \exdentamount=\defbodyindent
++ \begingroup\obeylines\activeparens\spacesplit{#3{#4}{#5}}}
++
++% Used for @deftypeop. The change from \deftypemethparsebody is an
++% extra argument at the beginning which is the `category', instead of it
++% being the hardwired string `Method' or `Instance Variable'. We have
++% to account for this both in the \...x definition and in parsing the
++% input at hand. Thus also need a control sequence (passed as #5) for
++% the \E... definition to assign the category name to.
++%
++\def\deftypeopparsebody#1#2#3#4#5 #6 {\begingroup\inENV
++ \medbreak
++ \def#1{\endgraf\endgroup\medbreak}%
++ \def#2##1 ##2 ##3 {%
++ \def#4{##1}%
++ \begingroup\obeylines\activeparens\spacesplit{#3{##2}{##3}}}%
++ \parindent=0in
++ \advance\leftskip by \defbodyindent
++ \exdentamount=\defbodyindent
++ \begingroup\obeylines\activeparens\spacesplit{#3{#5}{#6}}}
++
+ \def\defopparsebody #1#2#3#4#5 {\begingroup\inENV %
+ \medbreak %
+ % Define the end token that this defining construct specifies
+@@ -3872,7 +4465,7 @@
+ \def#2##1 ##2 {\def#4{##1}%
+ \begingroup\obeylines\activeparens\spacesplit{#3{##2}}}%
+ \parindent=0in
+-\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
++\advance\leftskip by \defbodyindent
+ \exdentamount=\defbodyindent
+ \begingroup\obeylines\activeparens\spacesplit{#3{#5}}}
+
+@@ -3887,7 +4480,7 @@
+ \def#1{\endgraf\endgroup\medbreak}%
+ \def#2{\begingroup\obeylines\spacesplit#3}%
+ \parindent=0in
+-\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
++\advance\leftskip by \defbodyindent
+ \exdentamount=\defbodyindent
+ \begingroup %
+ \catcode 61=\active %
+@@ -3904,7 +4497,7 @@
+ \def#1{\endgraf\endgroup\medbreak}%
+ \def#2##1 {\begingroup\obeylines\spacesplit{#3{##1}}}%
+ \parindent=0in
+- \advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
++ \advance\leftskip by \defbodyindent
+ \exdentamount=\defbodyindent
+ \begingroup\obeylines
+ }
+@@ -3949,7 +4542,7 @@
+ \def#2##1 ##2 {\def#4{##1}%
+ \begingroup\obeylines\spacesplit{#3{##2}}}%
+ \parindent=0in
+-\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
++\advance\leftskip by \defbodyindent
+ \exdentamount=\defbodyindent
+ \begingroup\obeylines\spacesplit{#3{#5}}}
+
+@@ -3973,16 +4566,17 @@
+ % 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
++\def\defunargs#1{\functionparens \sl
+ % Expand, preventing hyphenation at `-' chars.
+ % Note that groups don't affect changes in \hyphenchar.
+-\hyphenchar\tensl=0
++% Set the font temporarily and use \font in case \setfont made \tensl a macro.
++{\tensl\hyphenchar\font=0}%
+ #1%
+-\hyphenchar\tensl=45
++{\tensl\hyphenchar\font=45}%
+ \ifnum\parencount=0 \else \errmessage{Unbalanced parentheses in @def}\fi%
+ \interlinepenalty=10000
+ \advance\rightskip by 0pt plus 1fil
+-\endgraf\penalty 10000\vskip -\parskip\penalty 10000%
++\endgraf\nobreak\vskip -\parskip\nobreak
+ }
+
+ \def\deftypefunargs #1{%
+@@ -3993,7 +4587,7 @@
+ \tclose{#1}% avoid \code because of side effects on active chars
+ \interlinepenalty=10000
+ \advance\rightskip by 0pt plus 1fil
+-\endgraf\penalty 10000\vskip -\parskip\penalty 10000%
++\endgraf\nobreak\vskip -\parskip\nobreak
+ }
+
+ % Do complete processing of one @defun or @defunx line already parsed.
+@@ -4012,7 +4606,7 @@
+ \def\defun{\defparsebody\Edefun\defunx\defunheader}
+
+ \def\defunheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
+-\begingroup\defname {#1}{Function}%
++\begingroup\defname {#1}{\putwordDeffunc}%
+ \defunargs {#2}\endgroup %
+ \catcode 61=\other % Turn off change made in \defparsebody
+ }
+@@ -4026,7 +4620,7 @@
+ % #1 is the data type, #2 the name, #3 the args.
+ \def\deftypefunheaderx #1#2 #3\relax{%
+ \doind {fn}{\code{#2}}% Make entry in function index
+-\begingroup\defname {\defheaderxcond#1\relax$$$#2}{Function}%
++\begingroup\defname {\defheaderxcond#1\relax$$$#2}{\putwordDeftypefun}%
+ \deftypefunargs {#3}\endgroup %
+ \catcode 61=\other % Turn off change made in \defparsebody
+ }
+@@ -4057,7 +4651,7 @@
+ \def\defmac{\defparsebody\Edefmac\defmacx\defmacheader}
+
+ \def\defmacheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
+-\begingroup\defname {#1}{Macro}%
++\begingroup\defname {#1}{\putwordDefmac}%
+ \defunargs {#2}\endgroup %
+ \catcode 61=\other % Turn off change made in \defparsebody
+ }
+@@ -4067,53 +4661,78 @@
+ \def\defspec{\defparsebody\Edefspec\defspecx\defspecheader}
+
+ \def\defspecheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
+-\begingroup\defname {#1}{Special Form}%
++\begingroup\defname {#1}{\putwordDefspec}%
+ \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}}
+-\def\deftypefnx #1 {\errmessage{@deftypefnx in invalid context}}
+-\def\deftypemethodx #1 {\errmessage{@deftypemethodx in invalid context}}
+-\def\deftypeunx #1 {\errmessage{@deftypeunx in invalid context}}
+-
+-% @defmethod, and so on
+-
+-% @defop {Funny Method} foo-class frobnicate argument
+-
++% @defop CATEGORY CLASS OPERATION ARG...
++%
+ \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}%
++%
++\def\defopheader#1#2#3{%
++\dosubind {fn}{\code{#2}}{\putwordon\ #1}% Make entry in function index
++\begingroup\defname {#2}{\defoptype\ \putwordon\ #1}%
+ \defunargs {#3}\endgroup %
+ }
++
++% @deftypeop CATEGORY CLASS TYPE OPERATION ARG...
++%
++\def\deftypeop #1 {\def\deftypeopcategory{#1}%
++ \deftypeopparsebody\Edeftypeop\deftypeopx\deftypeopheader
++ \deftypeopcategory}
++%
++% #1 is the class name, #2 the data type, #3 the operation name, #4 the args.
++\def\deftypeopheader#1#2#3#4{%
++ \dosubind{fn}{\code{#3}}{\putwordon\ \code{#1}}% entry in function index
++ \begingroup
++ \defname{\defheaderxcond#2\relax$$$#3}
++ {\deftypeopcategory\ \putwordon\ \code{#1}}%
++ \deftypefunargs{#4}%
++ \endgroup
++}
+
+-% @deftypemethod foo-class return-type foo-method args
++% @deftypemethod CLASS TYPE METHOD ARG...
+ %
+ \def\deftypemethod{%
+- \defmethparsebody\Edeftypemethod\deftypemethodx\deftypemethodheader}
++ \deftypemethparsebody\Edeftypemethod\deftypemethodx\deftypemethodheader}
+ %
+ % #1 is the class name, #2 the data type, #3 the method name, #4 the args.
+ \def\deftypemethodheader#1#2#3#4{%
+- \deftypefnheaderx{Method on #1}{#2}#3 #4\relax
++ \dosubind{fn}{\code{#3}}{\putwordon\ \code{#1}}% entry in function index
++ \begingroup
++ \defname{\defheaderxcond#2\relax$$$#3}{\putwordMethodon\ \code{#1}}%
++ \deftypefunargs{#4}%
++ \endgroup
+ }
+
+-% @defmethod == @defop Method
++% @deftypeivar CLASS TYPE VARNAME
++%
++\def\deftypeivar{%
++ \deftypemethparsebody\Edeftypeivar\deftypeivarx\deftypeivarheader}
++%
++% #1 is the class name, #2 the data type, #3 the variable name.
++\def\deftypeivarheader#1#2#3{%
++ \dosubind{vr}{\code{#3}}{\putwordof\ \code{#1}}% entry in variable index
++ \begingroup
++ \defname{\defheaderxcond#2\relax$$$#3}
++ {\putwordInstanceVariableof\ \code{#1}}%
++ \defvarargs{#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}{Method on #1}%
+-\defunargs {#3}\endgroup %
++%
++% #1 is the class name, #2 the method name, #3 the args.
++\def\defmethodheader#1#2#3{%
++ \dosubind{fn}{\code{#2}}{\putwordon\ \code{#1}}% entry in function index
++ \begingroup
++ \defname{#2}{\putwordMethodon\ \code{#1}}%
++ \defunargs{#3}%
++ \endgroup
+ }
+
+ % @defcv {Class Option} foo-class foo-flag
+@@ -4122,37 +4741,30 @@
+ \defopvarparsebody\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}%
++\dosubind {vr}{\code{#2}}{\putwordof\ #1}% Make entry in var index
++\begingroup\defname {#2}{\defcvtype\ \putwordof\ #1}%
+ \defvarargs {#3}\endgroup %
+ }
+
+-% @defivar == @defcv {Instance Variable}
+-
++% @defivar CLASS VARNAME == @defcv {Instance Variable} CLASS VARNAME
++%
+ \def\defivar{\defvrparsebody\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 %
++%
++\def\defivarheader#1#2#3{%
++ \dosubind {vr}{\code{#2}}{\putwordof\ #1}% entry in var index
++ \begingroup
++ \defname{#2}{\putwordInstanceVariableof\ #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
+
++% @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}
++\endgraf\nobreak\vskip -\parskip\nobreak}
+
+ % @defvr Counter foo-count
+
+@@ -4166,7 +4778,7 @@
+ \def\defvar{\defvarparsebody\Edefvar\defvarx\defvarheader}
+
+ \def\defvarheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
+-\begingroup\defname {#1}{Variable}%
++\begingroup\defname {#1}{\putwordDefvar}%
+ \defvarargs {#2}\endgroup %
+ }
+
+@@ -4175,7 +4787,7 @@
+ \def\defopt{\defvarparsebody\Edefopt\defoptx\defoptheader}
+
+ \def\defoptheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
+-\begingroup\defname {#1}{User Option}%
++\begingroup\defname {#1}{\putwordDefopt}%
+ \defvarargs {#2}\endgroup %
+ }
+
+@@ -4187,9 +4799,9 @@
+ % is actually part of the data type, which should not be put into the index.
+ \def\deftypevarheader #1#2{%
+ \dovarind#2 \relax% Make entry in variables index
+-\begingroup\defname {\defheaderxcond#1\relax$$$#2}{Variable}%
++\begingroup\defname {\defheaderxcond#1\relax$$$#2}{\putwordDeftypevar}%
+ \interlinepenalty=10000
+-\endgraf\penalty 10000\vskip -\parskip\penalty 10000
++\endgraf\nobreak\vskip -\parskip\nobreak
+ \endgroup}
+ \def\dovarind#1 #2\relax{\doind{vr}{\code{#1}}}
+
+@@ -4200,18 +4812,9 @@
+ \def\deftypevrheader #1#2#3{\dovarind#3 \relax%
+ \begingroup\defname {\defheaderxcond#2\relax$$$#3}{#1}
+ \interlinepenalty=10000
+-\endgraf\penalty 10000\vskip -\parskip\penalty 10000
++\endgraf\nobreak\vskip -\parskip\nobreak
+ \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}}
+-\def\deftypevarx #1 {\errmessage{@deftypevarx in invalid context}}
+-\def\deftypevrx #1 {\errmessage{@deftypevrx in invalid context}}
+-
+ % Now define @deftp
+ % Args are printed in bold, a slight difference from @defvar.
+
+@@ -4223,52 +4826,395 @@
+
+ \def\deftpheader #1#2#3{\doind {tp}{\code{#2}}%
+ \begingroup\defname {#2}{#1}\deftpargs{#3}\endgroup}
++
++% These definitions are used if you use @defunx (etc.)
++% anywhere other than immediately after a @defun or @defunx.
++%
++\def\defcvx#1 {\errmessage{@defcvx in invalid context}}
++\def\deffnx#1 {\errmessage{@deffnx in invalid context}}
++\def\defivarx#1 {\errmessage{@defivarx in invalid context}}
++\def\defmacx#1 {\errmessage{@defmacx in invalid context}}
++\def\defmethodx#1 {\errmessage{@defmethodx in invalid context}}
++\def\defoptx #1 {\errmessage{@defoptx in invalid context}}
++\def\defopx#1 {\errmessage{@defopx in invalid context}}
++\def\defspecx#1 {\errmessage{@defspecx in invalid context}}
++\def\deftpx#1 {\errmessage{@deftpx in invalid context}}
++\def\deftypefnx#1 {\errmessage{@deftypefnx in invalid context}}
++\def\deftypefunx#1 {\errmessage{@deftypefunx in invalid context}}
++\def\deftypeivarx#1 {\errmessage{@deftypeivarx in invalid context}}
++\def\deftypemethodx#1 {\errmessage{@deftypemethodx in invalid context}}
++\def\deftypeopx#1 {\errmessage{@deftypeopx in invalid context}}
++\def\deftypevarx#1 {\errmessage{@deftypevarx in invalid context}}
++\def\deftypevrx#1 {\errmessage{@deftypevrx in invalid context}}
++\def\defunx#1 {\errmessage{@defunx in invalid context}}
++\def\defvarx#1 {\errmessage{@defvarx in invalid context}}
++\def\defvrx#1 {\errmessage{@defvrx in invalid context}}
++
++
++\message{macros,}
++% @macro.
++
++% To do this right we need a feature of e-TeX, \scantokens,
++% which we arrange to emulate with a temporary file in ordinary TeX.
++\ifx\eTeXversion\undefined
++ \newwrite\macscribble
++ \def\scanmacro#1{%
++ \begingroup \newlinechar`\^^M
++ % Undo catcode changes of \startcontents and \doprintindex
++ \catcode`\@=0 \catcode`\\=12 \escapechar=`\@
++ % Append \endinput to make sure that TeX does not see the ending newline.
++ \toks0={#1\endinput}%
++ \immediate\openout\macscribble=\jobname.tmp
++ \immediate\write\macscribble{\the\toks0}%
++ \immediate\closeout\macscribble
++ \let\xeatspaces\eatspaces
++ \input \jobname.tmp
++ \endgroup
++}
++\else
++\def\scanmacro#1{%
++\begingroup \newlinechar`\^^M
++% Undo catcode changes of \startcontents and \doprintindex
++\catcode`\@=0 \catcode`\\=12 \escapechar=`\@
++\let\xeatspaces\eatspaces\scantokens{#1\endinput}\endgroup}
++\fi
++
++\newcount\paramno % Count of parameters
++\newtoks\macname % Macro name
++\newif\ifrecursive % Is it recursive?
++\def\macrolist{} % List of all defined macros in the form
++ % \do\macro1\do\macro2...
++
++% Utility routines.
++% Thisdoes \let #1 = #2, except with \csnames.
++\def\cslet#1#2{%
++\expandafter\expandafter
++\expandafter\let
++\expandafter\expandafter
++\csname#1\endcsname
++\csname#2\endcsname}
++
++% Trim leading and trailing spaces off a string.
++% Concepts from aro-bend problem 15 (see CTAN).
++{\catcode`\@=11
++\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }}
++\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@}
++\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @}
++\def\unbrace#1{#1}
++\unbrace{\gdef\trim@@@ #1 } #2@{#1}
++}
++
++% Trim a single trailing ^^M off a string.
++{\catcode`\^^M=12\catcode`\Q=3%
++\gdef\eatcr #1{\eatcra #1Q^^MQ}%
++\gdef\eatcra#1^^MQ{\eatcrb#1Q}%
++\gdef\eatcrb#1Q#2Q{#1}%
++}
++
++% Macro bodies are absorbed as an argument in a context where
++% all characters are catcode 10, 11 or 12, except \ which is active
++% (as in normal texinfo). It is necessary to change the definition of \.
++
++% It's necessary to have hard CRs when the macro is executed. This is
++% done by making ^^M (\endlinechar) catcode 12 when reading the macro
++% body, and then making it the \newlinechar in \scanmacro.
++
++\def\macrobodyctxt{%
++ \catcode`\~=12
++ \catcode`\^=12
++ \catcode`\_=12
++ \catcode`\|=12
++ \catcode`\<=12
++ \catcode`\>=12
++ \catcode`\+=12
++ \catcode`\{=12
++ \catcode`\}=12
++ \catcode`\@=12
++ \catcode`\^^M=12
++ \usembodybackslash}
++
++\def\macroargctxt{%
++ \catcode`\~=12
++ \catcode`\^=12
++ \catcode`\_=12
++ \catcode`\|=12
++ \catcode`\<=12
++ \catcode`\>=12
++ \catcode`\+=12
++ \catcode`\@=12
++ \catcode`\\=12}
++
++% \mbodybackslash is the definition of \ in @macro bodies.
++% It maps \foo\ => \csname macarg.foo\endcsname => #N
++% where N is the macro parameter number.
++% We define \csname macarg.\endcsname to be \realbackslash, so
++% \\ in macro replacement text gets you a backslash.
++
++{\catcode`@=0 @catcode`@\=@active
++ @gdef@usembodybackslash{@let\=@mbodybackslash}
++ @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname}
++}
++\expandafter\def\csname macarg.\endcsname{\realbackslash}
++
++\def\macro{\recursivefalse\parsearg\macroxxx}
++\def\rmacro{\recursivetrue\parsearg\macroxxx}
++
++\def\macroxxx#1{%
++ \getargs{#1}% now \macname is the macname and \argl the arglist
++ \ifx\argl\empty % no arguments
++ \paramno=0%
++ \else
++ \expandafter\parsemargdef \argl;%
++ \fi
++ \if1\csname ismacro.\the\macname\endcsname
++ \message{Warning: redefining \the\macname}%
++ \else
++ \expandafter\ifx\csname \the\macname\endcsname \relax
++ \else \errmessage{The name \the\macname\space is reserved}\fi
++ \global\cslet{macsave.\the\macname}{\the\macname}%
++ \global\expandafter\let\csname ismacro.\the\macname\endcsname=1%
++ % Add the macroname to \macrolist
++ \toks0 = \expandafter{\macrolist\do}%
++ \xdef\macrolist{\the\toks0
++ \expandafter\noexpand\csname\the\macname\endcsname}%
++ \fi
++ \begingroup \macrobodyctxt
++ \ifrecursive \expandafter\parsermacbody
++ \else \expandafter\parsemacbody
++ \fi}
++
++\def\unmacro{\parsearg\unmacroxxx}
++\def\unmacroxxx#1{%
++ \if1\csname ismacro.#1\endcsname
++ \global\cslet{#1}{macsave.#1}%
++ \global\expandafter\let \csname ismacro.#1\endcsname=0%
++ % Remove the macro name from \macrolist
++ \begingroup
++ \edef\tempa{\expandafter\noexpand\csname#1\endcsname}%
++ \def\do##1{%
++ \def\tempb{##1}%
++ \ifx\tempa\tempb
++ % remove this
++ \else
++ \toks0 = \expandafter{\newmacrolist\do}%
++ \edef\newmacrolist{\the\toks0\expandafter\noexpand\tempa}%
++ \fi}%
++ \def\newmacrolist{}%
++ % Execute macro list to define \newmacrolist
++ \macrolist
++ \global\let\macrolist\newmacrolist
++ \endgroup
++ \else
++ \errmessage{Macro #1 not defined}%
++ \fi
++}
++
++% This makes use of the obscure feature that if the last token of a
++% <parameter list> is #, then the preceding argument is delimited by
++% an opening brace, and that opening brace is not consumed.
++\def\getargs#1{\getargsxxx#1{}}
++\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs}
++\def\getmacname #1 #2\relax{\macname={#1}}
++\def\getmacargs#1{\def\argl{#1}}
++
++% Parse the optional {params} list. Set up \paramno and \paramlist
++% so \defmacro knows what to do. Define \macarg.blah for each blah
++% in the params list, to be ##N where N is the position in that list.
++% That gets used by \mbodybackslash (above).
++
++% We need to get `macro parameter char #' into several definitions.
++% The technique used is stolen from LaTeX: let \hash be something
++% unexpandable, insert that wherever you need a #, and then redefine
++% it to # just before using the token list produced.
++%
++% The same technique is used to protect \eatspaces till just before
++% the macro is used.
++
++\def\parsemargdef#1;{\paramno=0\def\paramlist{}%
++ \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,}
++\def\parsemargdefxxx#1,{%
++ \if#1;\let\next=\relax
++ \else \let\next=\parsemargdefxxx
++ \advance\paramno by 1%
++ \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname
++ {\xeatspaces{\hash\the\paramno}}%
++ \edef\paramlist{\paramlist\hash\the\paramno,}%
++ \fi\next}
++
++% These two commands read recursive and nonrecursive macro bodies.
++% (They're different since rec and nonrec macros end differently.)
++
++\long\def\parsemacbody#1@end macro%
++{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
++\long\def\parsermacbody#1@end rmacro%
++{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
++
++% This defines the macro itself. There are six cases: recursive and
++% nonrecursive macros of zero, one, and many arguments.
++% Much magic with \expandafter here.
++% \xdef is used so that macro definitions will survive the file
++% they're defined in; @include reads the file inside a group.
++\def\defmacro{%
++ \let\hash=##% convert placeholders to macro parameter chars
++ \ifrecursive
++ \ifcase\paramno
++ % 0
++ \expandafter\xdef\csname\the\macname\endcsname{%
++ \noexpand\scanmacro{\temp}}%
++ \or % 1
++ \expandafter\xdef\csname\the\macname\endcsname{%
++ \bgroup\noexpand\macroargctxt
++ \noexpand\braceorline
++ \expandafter\noexpand\csname\the\macname xxx\endcsname}%
++ \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
++ \egroup\noexpand\scanmacro{\temp}}%
++ \else % many
++ \expandafter\xdef\csname\the\macname\endcsname{%
++ \bgroup\noexpand\macroargctxt
++ \noexpand\csname\the\macname xx\endcsname}%
++ \expandafter\xdef\csname\the\macname xx\endcsname##1{%
++ \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
++ \expandafter\expandafter
++ \expandafter\xdef
++ \expandafter\expandafter
++ \csname\the\macname xxx\endcsname
++ \paramlist{\egroup\noexpand\scanmacro{\temp}}%
++ \fi
++ \else
++ \ifcase\paramno
++ % 0
++ \expandafter\xdef\csname\the\macname\endcsname{%
++ \noexpand\norecurse{\the\macname}%
++ \noexpand\scanmacro{\temp}\egroup}%
++ \or % 1
++ \expandafter\xdef\csname\the\macname\endcsname{%
++ \bgroup\noexpand\macroargctxt
++ \noexpand\braceorline
++ \expandafter\noexpand\csname\the\macname xxx\endcsname}%
++ \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
++ \egroup
++ \noexpand\norecurse{\the\macname}%
++ \noexpand\scanmacro{\temp}\egroup}%
++ \else % many
++ \expandafter\xdef\csname\the\macname\endcsname{%
++ \bgroup\noexpand\macroargctxt
++ \expandafter\noexpand\csname\the\macname xx\endcsname}%
++ \expandafter\xdef\csname\the\macname xx\endcsname##1{%
++ \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
++ \expandafter\expandafter
++ \expandafter\xdef
++ \expandafter\expandafter
++ \csname\the\macname xxx\endcsname
++ \paramlist{%
++ \egroup
++ \noexpand\norecurse{\the\macname}%
++ \noexpand\scanmacro{\temp}\egroup}%
++ \fi
++ \fi}
++
++\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
+
+-% This definition is run if you use @deftpx, etc
+-% anywhere other than immediately after a @deftp, etc.
++% \braceorline decides whether the next nonwhitespace character is a
++% {. If so it reads up to the closing }, if not, it reads the whole
++% line. Whatever was read is then fed to the next control sequence
++% as an argument (by \parsebrace or \parsearg)
++\def\braceorline#1{\let\next=#1\futurelet\nchar\braceorlinexxx}
++\def\braceorlinexxx{%
++ \ifx\nchar\bgroup\else
++ \expandafter\parsearg
++ \fi \next}
++
++% We mant to disable all macros during \shipout so that they are not
++% expanded by \write.
++\def\turnoffmacros{\begingroup \def\do##1{\let\noexpand##1=\relax}%
++ \edef\next{\macrolist}\expandafter\endgroup\next}
++
++
++% @alias.
++% We need some trickery to remove the optional spaces around the equal
++% sign. Just make them active and then expand them all to nothing.
++\def\alias{\begingroup\obeyspaces\parsearg\aliasxxx}
++\def\aliasxxx #1{\aliasyyy#1\relax}
++\def\aliasyyy #1=#2\relax{\ignoreactivespaces
++\edef\next{\global\let\expandafter\noexpand\csname#1\endcsname=%
++ \expandafter\noexpand\csname#2\endcsname}%
++\expandafter\endgroup\next}
+
+-\def\deftpx #1 {\errmessage{@deftpx in invalid context}}
+
++\message{cross references,}
++% @xref etc.
+
+-\message{cross reference,}
+-% Define cross-reference macros
+-\newwrite \auxfile
++\newwrite\auxfile
+
+-\newif\ifhavexrefs % True if xref values are known.
++\newif\ifhavexrefs % True if xref values are known.
+ \newif\ifwarnedxrefs % True if we warned once that they aren't known.
+
+-% @inforef is simple.
++% @inforef is relatively simple.
+ \def\inforef #1{\inforefzzz #1,,,,**}
+ \def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
+ node \samp{\ignorespaces#1{}}}
++
++% @node's job is to define \lastnode.
++\def\node{\ENVcheck\parsearg\nodezzz}
++\def\nodezzz#1{\nodexxx [#1,]}
++\def\nodexxx[#1,#2]{\gdef\lastnode{#1}}
++\let\nwnode=\node
++\let\lastnode=\relax
+
+-% \setref{foo} defines a cross-reference point named foo.
++% The sectioning commands (@chapter, etc.) call these.
++\def\donoderef{%
++ \ifx\lastnode\relax\else
++ \expandafter\expandafter\expandafter\setref{\lastnode}%
++ {Ysectionnumberandtype}%
++ \global\let\lastnode=\relax
++ \fi
++}
++\def\unnumbnoderef{%
++ \ifx\lastnode\relax\else
++ \expandafter\expandafter\expandafter\setref{\lastnode}{Ynothing}%
++ \global\let\lastnode=\relax
++ \fi
++}
++\def\appendixnoderef{%
++ \ifx\lastnode\relax\else
++ \expandafter\expandafter\expandafter\setref{\lastnode}%
++ {Yappendixletterandtype}%
++ \global\let\lastnode=\relax
++ \fi
++}
++
++
++% @anchor{NAME} -- define xref target at arbitrary point.
++%
++\newcount\savesfregister
++\gdef\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
++\gdef\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
++\gdef\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}
++
++% \setref{NAME}{SNT} defines a cross-reference point NAME, namely
++% NAME-title, NAME-pg, and NAME-SNT. Called from \foonoderef. We have
++% to set \indexdummies so commands such as @code in a section title
++% aren't expanded. It would be nicer not to expand the titles in the
++% first place, but there's so many layers that that is hard to do.
++%
++\def\setref#1#2{{%
++ \indexdummies
++ \pdfmkdest{#1}%
++ \dosetq{#1-title}{Ytitle}%
++ \dosetq{#1-pg}{Ypagenumber}%
++ \dosetq{#1-snt}{#2}%
++}}
+
+-\def\setref#1{%
+-\dosetq{#1-title}{Ytitle}%
+-\dosetq{#1-pg}{Ypagenumber}%
+-\dosetq{#1-snt}{Ysectionnumberandtype}}
+-
+-\def\unnumbsetref#1{%
+-\dosetq{#1-title}{Ytitle}%
+-\dosetq{#1-pg}{Ypagenumber}%
+-\dosetq{#1-snt}{Ynothing}}
+-
+-\def\appendixsetref#1{%
+-\dosetq{#1-title}{Ytitle}%
+-\dosetq{#1-pg}{Ypagenumber}%
+-\dosetq{#1-snt}{Yappendixletterandtype}}
+-
+-% \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.
++% @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is
++% the node name, #2 the name of the Info cross-reference, #3 the printed
++% 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{\putwordsee{} \xrefX[#1,,,,,,,]}
+ \def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]}
+ \def\ref#1{\xrefX[#1,,,,,,,]}
+ \def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
++ \unsepspaces
+ \def\printedmanual{\ignorespaces #5}%
+ \def\printednodename{\ignorespaces #3}%
+ \setbox1=\hbox{\printedmanual}%
+@@ -4281,7 +5227,7 @@
+ \else
+ % Use the actual chapter/section title appear inside
+ % the square brackets. Use the real section title if we have it.
+- \ifdim \wd1>0pt%
++ \ifdim \wd1 > 0pt
+ % It is in another manual, so we don't have it.
+ \def\printednodename{\ignorespaces #1}%
+ \else
+@@ -4302,27 +5248,54 @@
+ % are best written with fairly long node names, containing hyphens, this
+ % is a loss. Therefore, we give the text of the node name again, so it
+ % is as if TeX is seeing it for the first time.
++ \ifpdf
++ \leavevmode
++ \getfilename{#4}%
++ \ifnum\filenamelength>0
++ \startlink attr{/Border [0 0 0]}%
++ goto file{\the\filename.pdf} name{#1@}%
++ \else
++ \startlink attr{/Border [0 0 0]}%
++ goto name{#1@}%
++ \fi
++ \linkcolor
++ \fi
++ %
+ \ifdim \wd1 > 0pt
+- \putwordsection{} ``\printednodename'' in \cite{\printedmanual}%
++ \putwordsection{} ``\printednodename'' \putwordin{} \cite{\printedmanual}%
+ \else
+ % _ (for example) has to be the character _ for the purposes of the
+ % control sequence corresponding to the node, but it has to expand
+ % into the usual \leavevmode...\vrule stuff for purposes of
+ % printing. So we \turnoffactive for the \refx-snt, back on for the
+ % printing, back off for the \refx-pg.
+- {\turnoffactive \refx{#1-snt}{}}%
+- \space [\printednodename],\space
++ {\normalturnoffactive
++ % Only output a following space if the -snt ref is nonempty; for
++ % @unnumbered and @anchor, it won't be.
++ \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
++ \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
++ }%
++ % [mynode],
++ [\printednodename],\space
++ % page 3
+ \turnoffactive \putwordpage\tie\refx{#1-pg}{}%
+ \fi
++ \endlink
+ \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}}
++% Use \normalturnoffactive so that punctuation chars such as underscore
++% and backslash work in node names. (\turnoffactive doesn't do \.)
++\def\dosetq#1#2{%
++ {\let\folio=0%
++ \normalturnoffactive
++ \edef\next{\write\auxfile{\internalsetq{#1}{#2}}}%
++ \iflinks
++ \next
++ \fi
++ }%
++}
+
+ % \internalsetq {foo}{page} expands into
+ % CHARACTERS 'xrdef {foo}{...expansion of \Ypage...}
+@@ -4373,13 +5346,15 @@
+ \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.}%
++ \angleleft un\-de\-fined\angleright
++ \iflinks
++ \ifhavexrefs
++ \message{\linenumber Undefined cross reference `#1'.}%
++ \else
++ \ifwarnedxrefs\else
++ \global\warnedxrefstrue
++ \message{Cross reference values unknown; you must run TeX again.}%
++ \fi
+ \fi
+ \fi
+ \else
+@@ -4390,10 +5365,13 @@
+ }
+
+ % 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\xrdef#1{\begingroup
++ % Reenable \ as an escape while reading the second argument.
++ \catcode`\\ = 0
++ \afterassignment\endgroup
++ \expandafter\gdef\csname X#1\endcsname
++}
+
+ % Read the last existing aux file, if any. No error if none exists.
+ \def\readauxfile{\begingroup
+@@ -4450,8 +5428,7 @@
+ \catcode`\$=\other
+ \catcode`\#=\other
+ \catcode`\&=\other
+- % `\+ does not work, so use 43.
+- \catcode43=\other
++ \catcode`+=\other % avoid \+ for paranoia even though we've turned it off
+ % Make the characters 128-255 be printing characters
+ {%
+ \count 1=128
+@@ -4540,6 +5517,8 @@
+ \xspaceskip\z@skip
+ \parindent\defaultparindent
+ %
++ \smallfonts \rm
++ %
+ % Hang the footnote text off the number.
+ \hang
+ \textindent{\thisfootno}%
+@@ -4554,7 +5533,7 @@
+ \else\let\next\f@t\fi \next}
+ \def\f@@t{\bgroup\aftergroup\@foot\let\next}
+ \def\f@t#1{#1\@foot}
+-\def\@foot{\strut\egroup}
++\def\@foot{\strut\par\egroup}
+
+ }%end \catcode `\@=11
+
+@@ -4613,23 +5592,25 @@
+
+ % @image. We use the macros from epsf.tex to support this.
+ % If epsf.tex is not installed and @image is used, we complain.
+-%
++%
+ % Check for and read epsf.tex up front. If we read it only at @image
+ % time, we might be inside a group, and then its definitions would get
+ % undone and the next image would fail.
+-\openin 1 = xepsf.tex
++\openin 1 = epsf.tex
+ \ifeof 1 \else
+ \closein 1
+- \def\epsfannounce{\toks0 = }% do not bother showing banner
++ % Do not bother showing banner with post-v2.7 epsf.tex (available in
++ % doc/epsf.tex until it shows up on ctan).
++ \def\epsfannounce{\toks0 = }%
+ \input epsf.tex
+ \fi
+ %
++% We will only complain once about lack of epsf.tex.
+ \newif\ifwarnednoepsf
+ \newhelp\noepsfhelp{epsf.tex must be installed for images to
+ work. It is also included in the Texinfo distribution, or you can get
+- it from ftp://ftp.tug.org/tex/epsf.tex.}
++ it from ftp://tug.org/tex/epsf.tex.}
+ %
+-% Only complain once about lack of epsf.tex.
+ \def\image#1{%
+ \ifx\epsfbox\undefined
+ \ifwarnednoepsf \else
+@@ -4647,43 +5628,80 @@
+ % #2 is (optional) width, #3 is (optional) height.
+ % #4 is just the usual extra ignored arg for parsing this stuff.
+ \def\imagexxx#1,#2,#3,#4\finish{%
+- % \epsfbox itself resets \epsf?size at each figure.
+- \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi
+- \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi
+- \epsfbox{#1.eps}%
++ \ifpdf
++ \centerline{\dopdfimage{#1}{#2}{#3}}%
++ \else
++ % \epsfbox itself resets \epsf?size at each figure.
++ \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi
++ \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi
++ \begingroup
++ \catcode`\^^M = 5 % in case we're inside an example
++ % If the image is by itself, center it.
++ \ifvmode
++ \nobreak\bigskip
++ % Usually we'll have text after the image which will insert
++ % \parskip glue, so insert it here too to equalize the space
++ % above and below.
++ \nobreak\vskip\parskip
++ \nobreak
++ \centerline{\epsfbox{#1.eps}}%
++ \bigbreak
++ \else
++ % In the middle of a paragraph, no extra space.
++ \epsfbox{#1.eps}%
++ \fi
++ \endgroup
++ \fi
+ }
+
+-% End of control word definitions.
+
++\message{localization,}
++% and i18n.
+
+-\message{and turning on texinfo input format.}
+-
+-\def\openindices{%
+- \newindex{cp}%
+- \newcodeindex{fn}%
+- \newcodeindex{vr}%
+- \newcodeindex{tp}%
+- \newcodeindex{ky}%
+- \newcodeindex{pg}%
++% @documentlanguage is usually given very early, just after
++% @setfilename. If done too late, it may not override everything
++% properly. Single argument is the language abbreviation.
++% It would be nice if we could set up a hyphenation file here.
++%
++\def\documentlanguage{\parsearg\dodocumentlanguage}
++\def\dodocumentlanguage#1{%
++ \tex % read txi-??.tex file in plain TeX.
++ % Read the file if it exists.
++ \openin 1 txi-#1.tex
++ \ifeof1
++ \errhelp = \nolanghelp
++ \errmessage{Cannot read language file txi-#1.tex}%
++ \let\temp = \relax
++ \else
++ \def\temp{\input txi-#1.tex }%
++ \fi
++ \temp
++ \endgroup
+ }
++\newhelp\nolanghelp{The given language definition file cannot be found or
++is empty. Maybe you need to install it? In the current directory
++should work if nowhere else does.}
++
+
+-% Set some numeric style parameters, for 8.5 x 11 format.
++% @documentencoding should change something in TeX eventually, most
++% likely, but for now just recognize it.
++\let\documentencoding = \comment
+
+-\hsize = 6in
+-\hoffset = .25in
++
++% Page size parameters.
++%
+ \newdimen\defaultparindent \defaultparindent = 15pt
+-\parindent = \defaultparindent
+-\parskip 3pt plus 2pt minus 1pt
+-\setleading{13.2pt}
+-\advance\topskip by 1.2cm
+
+ \chapheadingskip = 15pt plus 4pt minus 2pt
+ \secheadingskip = 12pt plus 3pt minus 2pt
+ \subsecheadingskip = 9pt plus 2pt minus 2pt
+
+ % Prevent underfull vbox error messages.
+-\vbadness=10000
++\vbadness = 10000
+
++% Don't be so finicky about underfull hboxes, either.
++\hbadness = 2000
++
+ % Following George Bush, just get rid of widows and orphans.
+ \widowpenalty=10000
+ \clubpenalty=10000
+@@ -4691,101 +5709,125 @@
+ % Use TeX 3.0's \emergencystretch to help line breaking, but if we're
+ % using an old version of TeX, don't do anything. We want the amount of
+ % stretch added to depend on the line length, hence the dependence on
+-% \hsize. This makes it come to about 9pt for the 8.5x11 format.
++% \hsize. We call this whenever the paper size is set.
+ %
+-\ifx\emergencystretch\thisisundefined
+- % Allow us to assign to \emergencystretch anyway.
+- \def\emergencystretch{\dimen0}%
+-\else
+- \emergencystretch = \hsize
+- \divide\emergencystretch by 45
+-\fi
+-
+-% Use @smallbook to reset parameters for 7x9.5 format (or else 7x9.25)
+-\def\smallbook{
+- \global\chapheadingskip = 15pt plus 4pt minus 2pt
+- \global\secheadingskip = 12pt plus 3pt minus 2pt
+- \global\subsecheadingskip = 9pt plus 2pt minus 2pt
+- %
+- \global\lispnarrowing = 0.3in
+- \setleading{12pt}
+- \advance\topskip by -1cm
+- \global\parskip 2pt plus 1pt
+- \global\hsize = 5in
+- \global\vsize=7.5in
+- \global\tolerance=700
+- \global\hfuzz=1pt
+- \global\contentsrightmargin=0pt
+- \global\deftypemargin=0pt
+- \global\defbodyindent=.5cm
+- %
+- \global\pagewidth=\hsize
+- \global\pageheight=\vsize
+- %
+- \global\let\smalllisp=\smalllispx
+- \global\let\smallexample=\smalllispx
+- \global\def\Esmallexample{\Esmalllisp}
++\def\setemergencystretch{%
++ \ifx\emergencystretch\thisisundefined
++ % Allow us to assign to \emergencystretch anyway.
++ \def\emergencystretch{\dimen0}%
++ \else
++ \emergencystretch = .15\hsize
++ \fi
+ }
+
++% Parameters in order: 1) textheight; 2) textwidth; 3) voffset;
++% 4) hoffset; 5) binding offset; 6) topskip. Then whoever calls us can
++% set \parskip and call \setleading for \baselineskip.
++%
++\def\internalpagesizes#1#2#3#4#5#6{%
++ \voffset = #3\relax
++ \topskip = #6\relax
++ \splittopskip = \topskip
++ %
++ \vsize = #1\relax
++ \advance\vsize by \topskip
++ \outervsize = \vsize
++ \advance\outervsize by 2\topandbottommargin
++ \pageheight = \vsize
++ %
++ \hsize = #2\relax
++ \outerhsize = \hsize
++ \advance\outerhsize by 0.5in
++ \pagewidth = \hsize
++ %
++ \normaloffset = #4\relax
++ \bindingoffset = #5\relax
++ %
++ \parindent = \defaultparindent
++ \setemergencystretch
++}
++
++% @letterpaper (the default).
++\def\letterpaper{{\globaldefs = 1
++ \parskip = 3pt plus 2pt minus 1pt
++ \setleading{13.2pt}%
++ %
++ % If page is nothing but text, make it come out even.
++ \internalpagesizes{46\baselineskip}{6in}{\voffset}{.25in}{\bindingoffset}{36pt}%
++}}
++
++% Use @smallbook to reset parameters for 7x9.5 (or so) format.
++\def\smallbook{{\globaldefs = 1
++ \parskip = 2pt plus 1pt
++ \setleading{12pt}%
++ %
++ \internalpagesizes{7.5in}{5.in}{\voffset}{.25in}{\bindingoffset}{16pt}%
++ %
++ \lispnarrowing = 0.3in
++ \tolerance = 700
++ \hfuzz = 1pt
++ \contentsrightmargin = 0pt
++ \deftypemargin = 0pt
++ \defbodyindent = .5cm
++ %
++ \let\smalldisplay = \smalldisplayx
++ \let\smallexample = \smalllispx
++ \let\smallformat = \smallformatx
++ \let\smalllisp = \smalllispx
++}}
++
+ % Use @afourpaper to print on European A4 paper.
+-\def\afourpaper{
+-\global\tolerance=700
+-\global\hfuzz=1pt
+-\setleading{12pt}
+-\global\parskip 15pt plus 1pt
+-
+-\global\vsize= 53\baselineskip
+-\advance\vsize by \topskip
+-%\global\hsize= 5.85in % A4 wide 10pt
+-\global\hsize= 6.5in
+-\global\outerhsize=\hsize
+-\global\advance\outerhsize by 0.5in
+-\global\outervsize=\vsize
+-\global\advance\outervsize by 0.6in
+-
+-\global\pagewidth=\hsize
+-\global\pageheight=\vsize
+-}
+-
+-\bindingoffset=0pt
+-\normaloffset=\hoffset
+-\pagewidth=\hsize
+-\pageheight=\vsize
+-
+-% Allow control of the text dimensions. Parameters in order: textheight;
+-% textwidth; voffset; hoffset; binding offset; topskip.
+-% All require a dimension;
+-% header is additional; added length extends the bottom of the page.
+-
+-\def\changepagesizes#1#2#3#4#5#6{
+- \global\vsize= #1
+- \global\topskip= #6
+- \advance\vsize by \topskip
+- \global\voffset= #3
+- \global\hsize= #2
+- \global\outerhsize=\hsize
+- \global\advance\outerhsize by 0.5in
+- \global\outervsize=\vsize
+- \global\advance\outervsize by 0.6in
+- \global\pagewidth=\hsize
+- \global\pageheight=\vsize
+- \global\normaloffset= #4
+- \global\bindingoffset= #5}
++\def\afourpaper{{\globaldefs = 1
++ \setleading{12pt}%
++ \parskip = 3pt plus 2pt minus 1pt
++ %
++ \internalpagesizes{53\baselineskip}{160mm}{\voffset}{4mm}{\bindingoffset}{44pt}%
++ %
++ \tolerance = 700
++ \hfuzz = 1pt
++}}
+
+ % A specific text layout, 24x15cm overall, intended for A4 paper. Top margin
+ % 29mm, hence bottom margin 28mm, nominal side margin 3cm.
+-\def\afourlatex
+- {\global\tolerance=700
+- \global\hfuzz=1pt
+- \setleading{12pt}
+- \global\parskip 15pt plus 1pt
+- \advance\baselineskip by 1.6pt
+- \changepagesizes{237mm}{150mm}{3.6mm}{3.6mm}{3mm}{7mm}
+- }
++\def\afourlatex{{\globaldefs = 1
++ \setleading{13.6pt}%
++ %
++ \afourpaper
++ \internalpagesizes{237mm}{150mm}{3.6mm}{3.6mm}{3mm}{7mm}%
++ %
++ \globaldefs = 0
++}}
+
+ % Use @afourwide to print on European A4 paper in wide format.
+-\def\afourwide{\afourpaper
+-\changepagesizes{9.5in}{6.5in}{\hoffset}{\normaloffset}{\bindingoffset}{7mm}}
++\def\afourwide{%
++ \afourpaper
++ \internalpagesizes{6.5in}{9.5in}{\hoffset}{\normaloffset}{\bindingoffset}{7mm}%
++ %
++ \globaldefs = 0
++}
++
++% @pagesizes TEXTHEIGHT[,TEXTWIDTH]
++% Perhaps we should allow setting the margins, \topskip, \parskip,
++% and/or leading, also. Or perhaps we should compute them somehow.
++%
++\def\pagesizes{\parsearg\pagesizesxxx}
++\def\pagesizesxxx#1{\pagesizesyyy #1,,\finish}
++\def\pagesizesyyy#1,#2,#3\finish{{%
++ \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
++ \globaldefs = 1
++ %
++ \parskip = 3pt plus 2pt minus 1pt
++ \setleading{13.2pt}%
++ %
++ \internalpagesizes{#1}{\hsize}{\voffset}{\normaloffset}{\bindingoffset}{44pt}%
++}}
++
++% Set default to letter.
++%
++\letterpaper
++
++
++\message{and turning on texinfo input format.}
+
+ % Define macros to output various characters with catcode for normal text.
+ \catcode`\"=\other
+@@ -4796,6 +5838,7 @@
+ \catcode`\<=\other
+ \catcode`\>=\other
+ \catcode`\+=\other
++\catcode`\$=\other
+ \def\normaldoublequote{"}
+ \def\normaltilde{~}
+ \def\normalcaret{^}
+@@ -4804,6 +5847,7 @@
+ \def\normalless{<}
+ \def\normalgreater{>}
+ \def\normalplus{+}
++\def\normaldollar{$}
+
+ % This macro is used to make a character print one way in ttfont
+ % where it can probably just be output, and another way in other fonts,
+@@ -4814,7 +5858,13 @@
+ % interword stretch (and shrink), and it is reasonable to expect all
+ % typewriter fonts to have this, we can check that font parameter.
+ %
+-\def\ifusingtt#1#2{\ifdim \fontdimen3\the\font=0pt #1\else #2\fi}
++\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi}
++
++% Same as above, but check for italic font. Actually this also catches
++% non-italic slanted fonts since it is impossible to distinguish them from
++% italic fonts. But since this is only used by $ and it uses \sl anyway
++% this is not a problem.
++\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi}
+
+ % Turn off all special characters except @
+ % (and those which the user can use as if they were ordinary).
+@@ -4822,10 +5872,10 @@
+ % use math or other variants that look better in normal text.
+
+ \catcode`\"=\active
+-\def\activedoublequote{{\tt \char '042}}
++\def\activedoublequote{{\tt\char34}}
+ \let"=\activedoublequote
+ \catcode`\~=\active
+-\def~{{\tt \char '176}}
++\def~{{\tt\char126}}
+ \chardef\hat=`\^
+ \catcode`\^=\active
+ \def^{{\tt \hat}}
+@@ -4836,7 +5886,7 @@
+ \def\_{\leavevmode \kern.06em \vbox{\hrule width.3em height.1ex}}
+
+ \catcode`\|=\active
+-\def|{{\tt \char '174}}
++\def|{{\tt\char124}}
+ \chardef \less=`\<
+ \catcode`\<=\active
+ \def<{{\tt \less}}
+@@ -4845,6 +5895,8 @@
+ \def>{{\tt \gtr}}
+ \catcode`\+=\active
+ \def+{{\tt \char 43}}
++\catcode`\$=\active
++\def${\ifusingit{{\sl\$}}\normaldollar}
+ %\catcode 27=\active
+ %\def^^[{$\diamondsuit$}
+
+@@ -4875,9 +5927,6 @@
+ % \normalbackslash outputs one backslash in fixed width font.
+ \def\normalbackslash{{\tt\rawbackslashxx}}
+
+-% Say @foo, not \foo, in error messages.
+-\escapechar=`\@
+-
+ % \catcode 17=0 % Define control-q
+ \catcode`\\=\active
+
+@@ -4891,7 +5940,8 @@
+ @let|=@normalverticalbar
+ @let<=@normalless
+ @let>=@normalgreater
+-@let+=@normalplus}
++@let+=@normalplus
++@let$=@normaldollar}
+
+ @def@normalturnoffactive{@let"=@normaldoublequote
+ @let\=@normalbackslash
+@@ -4901,7 +5951,8 @@
+ @let|=@normalverticalbar
+ @let<=@normalless
+ @let>=@normalgreater
+-@let+=@normalplus}
++@let+=@normalplus
++@let$=@normaldollar}
+
+ % Make _ and + \other characters, temporarily.
+ % This is canceled by @fixbackslash.
+@@ -4920,16 +5971,29 @@
+ % Also back turn on active characters that might appear in the input
+ % file name, in case not using a pre-dumped format.
+ %
+-@gdef@fixbackslash{@ifx\@eatinput @let\ = @normalbackslash @fi
+- @catcode`+=@active @catcode`@_=@active}
++@gdef@fixbackslash{%
++ @ifx\@eatinput @let\ = @normalbackslash @fi
++ @catcode`+=@active
++ @catcode`@_=@active
++}
++
++% Say @foo, not \foo, in error messages.
++@escapechar = `@@
+
+-%% These look ok in all fonts, so just make them not special. The @rm below
+-%% makes sure that the current font starts out as the newly loaded cmr10
+-@catcode`@$=@other @catcode`@%=@other @catcode`@&=@other @catcode`@#=@other
++% These look ok in all fonts, so just make them not special.
++@catcode`@& = @other
++@catcode`@# = @other
++@catcode`@% = @other
+
++@c Set initial fonts.
+ @textfonts
+ @rm
+
++
+ @c Local variables:
++@c eval: (add-hook 'write-file-hooks 'time-stamp)
+ @c page-delimiter: "^\\\\message"
++@c time-stamp-start: "def\\\\texinfoversion{"
++@c time-stamp-format: "%:y-%02m-%02d.%02H"
++@c time-stamp-end: "}"
+ @c End: