Imported from ../bash-2.0.tar.gz.
[platform/upstream/bash.git] / lib / termcap / grot / texinfo.tex
index d10917e..f62e9f5 100644 (file)
@@ -1,6 +1,6 @@
 %% TeX macros to handle texinfo files
 
-%   Copyright (C) 1985, 86, 88, 90, 91, 92, 1993 Free Software Foundation, Inc.
+%   Copyright (C) 1985, 86, 88, 90, 91, 92, 93, 1994 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
 %You are forbidden to forbid anyone else to use, share and improve
 %what you give them.   Help stamp out software-hoarding!
 
-\def\texinfoversion{2.104}
+
+% 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.
+\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
+
+% This automatically updates the version number based on RCS.
+\def\deftexinfoversion$#1: #2 ${\def\texinfoversion{#2}}
+\deftexinfoversion$Revision: 2.146 $
 \message{Loading texinfo package [Version \texinfoversion]:}
-\message{}
 
-% Print the version number if in a .fmt file.
-\everyjob{\message{[Texinfo version \texinfoversion]}\message{}}
+% 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{}
+  \catcode`+=\active \catcode`\_=\active}
 
 % Save some parts of plain tex whose names we will redefine.
 
+\let\ptextilde=\~
 \let\ptexlbrace=\{
 \let\ptexrbrace=\}
 \let\ptexdots=\dots
 \let\ptexl=\l
 \let\ptexL=\L
 
-\def\tie{\penalty 10000\ }     % Save plain tex definition of ~.
+% 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
+ \gdef\tie{\leavevmode\penalty\@M\ }
+}
+\let\~ = \tie                  % And make it available as @~.
 
 \message{Basics,}
 \chardef\other=12
 % 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%
+
 % Ignore a token.
-% 
+%
 \def\gobble#1{}
 
 \hyphenation{ap-pen-dix}
 % since that produces some useless output on the terminal.
 %
 \def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
-\def\loggingall{\tracingcommands2 \tracingstats2 
-   \tracingpages1 \tracingoutput1 \tracinglostchars1 
-   \tracingmacros2 \tracingparagraphs1 \tracingrestores1 
+\def\loggingall{\tracingcommands2 \tracingstats2
+   \tracingpages1 \tracingoutput1 \tracinglostchars1
+   \tracingmacros2 \tracingparagraphs1 \tracingrestores1
    \showboxbreadth\maxdimen\showboxdepth\maxdimen
 }%
 
                  \nointerlineskip
                  \vbox{\line{\ewbot\hfill\ewbot}}
        }}
-  \advancepageno 
+  \advancepageno
   \ifnum\outputpenalty>-20000 \else\dosupereject\fi}
 %
 % Do @cropmarks to get crop marks
 \def\cropmarks{\let\onepageout=\croppageout }
 
+\newinsert\margin \dimen\margin=\maxdimen
+
 \def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}
 {\catcode`\@ =11
 \gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
+% marginal hacks, juha@viisa.uucp (Juha Takala)
+\ifvoid\margin\else % marginal info is present
+  \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi
 \dimen@=\dp#1 \unvbox#1
 \ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
 \ifr@ggedbottom \kern-\dimen@ \vfil \fi}
 % here.)  But this means we cannot call \removeactivespaces as part of
 % \argremovec{,omment}, since @c uses \parsearg, and thus the argument
 % that \parsearg gets might well have any character at all in it.
-% 
+%
 \def\removeactivespaces#1{%
   \begingroup
     \ignoreactivespaces
 }
 
 % Change the active space to expand to nothing.
-% 
+%
 \begingroup
   \obeyspaces
   \gdef\ignoreactivespaces{\obeyspaces\let =\empty}
 }
 
 % There is an environment #1, but it hasn't been started.  Give an error.
-% 
+%
 \def\unmatchedenderror#1{%
   \errhelp = \EMsimple
   \errmessage{This `@end #1' doesn't have a matching `@#1'}%
 }
 
 % Define the control sequence \E#1 to give an unmatched @end error.
-% 
+%
 \def\defineunmatchedend#1{%
   \expandafter\def\csname E#1\endcsname{\unmatchedenderror{#1}}%
 }
 
 
-% Single-spacing is done by various environments.
-
-\newskip\singlespaceskip \singlespaceskip = \baselineskip
+% Single-spacing is done by various environments (specifically, in
+% \nonfillstart and \quotations).
+\newskip\singlespaceskip \singlespaceskip = 12.5pt
 \def\singlespace{%
-{\advance \baselineskip by -\singlespaceskip
-\kern \baselineskip}%
-\baselineskip=\singlespaceskip
+  % Why was this kern here?  It messes up equalizing space above and below
+  % environments.  --karl, 6may93
+  %{\advance \baselineskip by -\singlespaceskip
+  %\kern \baselineskip}%
+  \setleading \singlespaceskip
 }
 
 %% Simple single-character @ commands
 % @. 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 }
+
+% @? is an end-of-sentence query.
+\gdef\?{?\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
 % produce a whole line of output instead of starting the paragraph.
 % max (\topskip - \ht (first item), 0).  If that height is large,
 % therefore, no glue is inserted, and the space between the headline and
 % the text is small, which looks bad.
-% 
+%
 \def\group{\begingroup
   \ifnum\catcode13=\active \else
     \errhelp = \groupinvalidhelp
   % The \vtop we start below produces a box with normal height and large
   % depth; thus, TeX puts \baselineskip glue before it, and (when the
   % next line of text is done) \lineskip glue after it.  (See p.82 of
-  % the TeXbook.)  But the next line of text also gets us \parskip glue.
-  % Final result: space below is slightly more than space above.
+  % the TeXbook.)  Thus, space below is not quite equal to space
+  % above.  But it's pretty close.
   \def\Egroup{%
     \egroup           % End the \vtop.
     \endgroup         % End the \group.
     % Hence this just inserts a strut at the beginning of each line.
     \everypar = {\strut}%
     %
-    % We do @comment here in case we are called inside an environment,
-    % such as @example, where each end-of-line in the input causes an
+    % Since we have a strut on every line, we don't need any of TeX's
+    % normal interline spacing.
+    \offinterlineskip
+    %
+    % OK, but now we have to do something about blank
+    % lines in the input in @example-like environments, which normally
+    % just turn into \lisppar, which will insert no space now that we've
+    % turned off the interline space.  Simplest is to make them be an
+    % empty paragraph.
+    \ifx\par\lisppar
+      \edef\par{\leavevmode \par}%
+      %
+      % Reset ^^M's definition to new definition of \par.
+      \obeylines
+    \fi
+    %
+    % Do @comment since we are called inside an environment such as
+    % @example, where each end-of-line in the input causes an
     % end-of-line in the output.  We don't want the end-of-line after
     % the `@group' to put extra space in the output.  Since @group
     % should appear on a line by itself (according to the Texinfo
 %
 % TeX puts in an \escapechar (i.e., `@') at the beginning of the help
 % message, so this ends up printing `@group can only ...'.
-% 
+%
 \newhelp\groupinvalidhelp{%
 group can only be used in environments such as @example,^^J%
 where each line of input produces a line of output.}
@@ -414,13 +482,13 @@ where each line of input produces a line of output.}
   \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
@@ -534,8 +602,8 @@ where each line of input produces a line of output.}
 
 % 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.  
-% 
+% incorrectly.
+%
 \def\ignoremorecommands{%
   \let\defcv = \relax
   \let\deffn = \relax
@@ -561,20 +629,30 @@ where each line of input produces a line of output.}
   \let\pxref = \relax
   \let\settitle = \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
+  \let\message = \relax
 }
 
 % Ignore @ignore ... @end ignore.
-% 
+%
 \def\ignore{\doignore{ignore}}
 
-% Also ignore @ifinfo, @menu, and @direntry text.
-% 
+% Also ignore @ifinfo, @ifhtml, @html, @menu, and @direntry text.
+%
 \def\ifinfo{\doignore{ifinfo}}
+\def\ifhtml{\doignore{ifhtml}}
+\def\html{\doignore{html}}
 \def\menu{\doignore{menu}}
 \def\direntry{\doignore{direntry}}
 
 % Ignore text until a line `@end #1'.
-% 
+%
 \def\doignore#1{\begingroup
   % Don't complain about control sequences we have declared \outer.
   \ignoresections
@@ -590,7 +668,7 @@ where each line of input produces a line of output.}
 }
 
 % What we do to finish off ignored text.
-% 
+%
 \def\enddoignore{\endgroup\ignorespaces}%
 
 \newif\ifwarnedobs\warnedobsfalse
@@ -619,7 +697,7 @@ where each line of input produces a line of output.}
 
 % 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
@@ -627,7 +705,7 @@ where each line of input produces a line of output.}
   % 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
@@ -644,7 +722,7 @@ where each line of input produces a line of output.}
     % 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
@@ -656,6 +734,11 @@ where each line of input produces a line of output.}
     \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
@@ -675,7 +758,7 @@ where each line of input produces a line of output.}
 
 % @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
@@ -689,7 +772,10 @@ where each line of input produces a line of output.}
   \else \setzzz{#1}#2\endsetzzz % Remove the trailing space \setxxx inserted.
   \fi
 }
-\def\setzzz#1#2 \endsetzzz{\expandafter\xdef\csname SET#1\endcsname{#2}}
+% 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.
 %
@@ -705,7 +791,7 @@ where each line of input produces a line of output.}
 
 % @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
@@ -720,7 +806,7 @@ where each line of input produces a line of output.}
 
 % @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
@@ -735,7 +821,7 @@ where each line of input produces a line of output.}
 
 % @iftex always succeeds; we read the text following, through @end
 % iftex).  But `@end iftex' should be valid only after an @iftex.
-% 
+%
 \def\iftex{\conditionalsucceed{iftex}}
 \defineunmatchedend{iftex}
 
@@ -745,7 +831,7 @@ where each line of input produces a line of output.}
 % 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.
@@ -763,7 +849,7 @@ where each line of input produces a line of output.}
 \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.
@@ -772,10 +858,10 @@ where each line of input produces a line of output.}
 % 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}
 
@@ -791,18 +877,18 @@ where each line of input produces a line of output.}
 
 \def\donoderef{\ifx\lastnode\relax\else
 \expandafter\expandafter\expandafter\setref{\lastnode}\fi
-\let\lastnode=\relax}
+\global\let\lastnode=\relax}
 
 \def\unnumbnoderef{\ifx\lastnode\relax\else
 \expandafter\expandafter\expandafter\unnumbsetref{\lastnode}\fi
-\let\lastnode=\relax}
+\global\let\lastnode=\relax}
 
 \def\appendixnoderef{\ifx\lastnode\relax\else
 \expandafter\expandafter\expandafter\appendixsetref{\lastnode}\fi
-\let\lastnode=\relax}
+\global\let\lastnode=\relax}
 
 \let\refill=\relax
-  
+
 % @setfilename is done at the beginning of every texinfo file.
 % So open here the files we need to have open while reading the input.
 % This makes it possible to make a .fmt file for texinfo.
@@ -818,7 +904,7 @@ where each line of input produces a line of output.}
 \outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
 
 \def\inforef #1{\inforefzzz #1,,,,**}
-\def\inforefzzz #1,#2,#3,#4**{See Info file \file{\ignorespaces #3{}},
+\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
   node \samp{\ignorespaces#1{}}}
 
 \message{fonts,}
@@ -834,95 +920,106 @@ where each line of input produces a line of output.}
 %% Try out Computer Modern fonts at \magstephalf
 \let\mainmagstep=\magstephalf
 
+% Set the font macro #1 to the font named #2, adding on the
+% specified font prefix (normally `cm').
+\def\setfont#1#2{\font#1=\fontprefix#2}
+
+% Use cm as the default font prefix.
+% To specify the font prefix, you must define \fontprefix
+% before you read in texinfo.tex.
+\ifx\fontprefix\undefined
+\def\fontprefix{cm}
+\fi
+
 \ifx\bigger\relax
 \let\mainmagstep=\magstep1
-\font\textrm=cmr12
-\font\texttt=cmtt12
+\setfont\textrm{r12}
+\setfont\texttt{tt12}
 \else
-\font\textrm=cmr10 scaled \mainmagstep
-\font\texttt=cmtt10 scaled \mainmagstep
+\setfont\textrm{r10 scaled \mainmagstep}
+\setfont\texttt{tt10 scaled \mainmagstep}
 \fi
 % Instead of cmb10, you many want to use cmbx10.
 % cmbx10 is a prettier font on its own, but cmb10
 % looks better when embedded in a line with cmr10.
-\font\textbf=cmb10 scaled \mainmagstep 
-\font\textit=cmti10 scaled \mainmagstep
-\font\textsl=cmsl10 scaled \mainmagstep
-\font\textsf=cmss10 scaled \mainmagstep
-\font\textsc=cmcsc10 scaled \mainmagstep
+\setfont\textbf{b10 scaled \mainmagstep}
+\setfont\textit{ti10 scaled \mainmagstep}
+\setfont\textsl{sl10 scaled \mainmagstep}
+\setfont\textsf{ss10 scaled \mainmagstep}
+\setfont\textsc{csc10 scaled \mainmagstep}
 \font\texti=cmmi10 scaled \mainmagstep
 \font\textsy=cmsy10 scaled \mainmagstep
 
 % A few fonts for @defun, etc.
-\font\defbf=cmbx10 scaled \magstep1 %was 1314
-\font\deftt=cmtt10 scaled \magstep1
+\setfont\defbf{bx10 scaled \magstep1} %was 1314
+\setfont\deftt{tt10 scaled \magstep1}
 \def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf}
 
 % Fonts for indices and small examples.
-% We actually use the slanted font rather than the italic, 
+% We actually use the slanted font rather than the italic,
 % because texinfo normally uses the slanted fonts for that.
 % Do not make many font distinctions in general in the index, since they
 % aren't very useful.
-\font\ninett=cmtt9
-\font\indrm=cmr9
-\font\indit=cmsl9
+\setfont\ninett{tt9}
+\setfont\indrm{r9}
+\setfont\indit{sl9}
 \let\indsl=\indit
 \let\indtt=\ninett
 \let\indsf=\indrm
 \let\indbf=\indrm
-\let\indsc=\indrm
+\setfont\indsc{csc10 at 9pt}
 \font\indi=cmmi9
 \font\indsy=cmsy9
 
 % Fonts for headings
-\font\chaprm=cmbx12 scaled \magstep2
-\font\chapit=cmti12 scaled \magstep2
-\font\chapsl=cmsl12 scaled \magstep2
-\font\chaptt=cmtt12 scaled \magstep2
-\font\chapsf=cmss12 scaled \magstep2
+\setfont\chaprm{bx12 scaled \magstep2}
+\setfont\chapit{ti12 scaled \magstep2}
+\setfont\chapsl{sl12 scaled \magstep2}
+\setfont\chaptt{tt12 scaled \magstep2}
+\setfont\chapsf{ss12 scaled \magstep2}
 \let\chapbf=\chaprm
-\font\chapsc=cmcsc10 scaled\magstep3
+\setfont\chapsc{csc10 scaled\magstep3}
 \font\chapi=cmmi12 scaled \magstep2
 \font\chapsy=cmsy10 scaled \magstep3
 
-\font\secrm=cmbx12 scaled \magstep1
-\font\secit=cmti12 scaled \magstep1
-\font\secsl=cmsl12 scaled \magstep1
-\font\sectt=cmtt12 scaled \magstep1
-\font\secsf=cmss12 scaled \magstep1
-\font\secbf=cmbx12 scaled \magstep1
-\font\secsc=cmcsc10 scaled\magstep2
+\setfont\secrm{bx12 scaled \magstep1}
+\setfont\secit{ti12 scaled \magstep1}
+\setfont\secsl{sl12 scaled \magstep1}
+\setfont\sectt{tt12 scaled \magstep1}
+\setfont\secsf{ss12 scaled \magstep1}
+\setfont\secbf{bx12 scaled \magstep1}
+\setfont\secsc{csc10 scaled\magstep2}
 \font\seci=cmmi12 scaled \magstep1
 \font\secsy=cmsy10 scaled \magstep2
 
-% \font\ssecrm=cmbx10 scaled \magstep1    % This size an font looked bad.
-% \font\ssecit=cmti10 scaled \magstep1    % The letters were too crowded.
-% \font\ssecsl=cmsl10 scaled \magstep1
-% \font\ssectt=cmtt10 scaled \magstep1
-% \font\ssecsf=cmss10 scaled \magstep1
+% \setfont\ssecrm{bx10 scaled \magstep1}    % This size an font looked bad.
+% \setfont\ssecit{cmti10 scaled \magstep1}    % The letters were too crowded.
+% \setfont\ssecsl{sl10 scaled \magstep1}
+% \setfont\ssectt{tt10 scaled \magstep1}
+% \setfont\ssecsf{ss10 scaled \magstep1}
 
-%\font\ssecrm=cmb10 scaled 1315        % Note the use of cmb rather than cmbx.
-%\font\ssecit=cmti10 scaled 1315       % Also, the size is a little larger than
-%\font\ssecsl=cmsl10 scaled 1315       % being scaled magstep1.
-%\font\ssectt=cmtt10 scaled 1315
-%\font\ssecsf=cmss10 scaled 1315
+%\setfont\ssecrm{b10 scaled 1315}      % Note the use of cmb rather than cmbx.
+%\setfont\ssecit{ti10 scaled 1315}     % Also, the size is a little larger than
+%\setfont\ssecsl{sl10 scaled 1315}     % being scaled magstep1.
+%\setfont\ssectt{tt10 scaled 1315}
+%\setfont\ssecsf{ss10 scaled 1315}
 
 %\let\ssecbf=\ssecrm
 
-\font\ssecrm=cmbx12 scaled \magstephalf
-\font\ssecit=cmti12 scaled \magstephalf
-\font\ssecsl=cmsl12 scaled \magstephalf
-\font\ssectt=cmtt12 scaled \magstephalf
-\font\ssecsf=cmss12 scaled \magstephalf
-\font\ssecbf=cmbx12 scaled \magstephalf
-\font\ssecsc=cmcsc10 scaled \magstep1 
+\setfont\ssecrm{bx12 scaled \magstephalf}
+\setfont\ssecit{ti12 scaled \magstephalf}
+\setfont\ssecsl{sl12 scaled \magstephalf}
+\setfont\ssectt{tt12 scaled \magstephalf}
+\setfont\ssecsf{ss12 scaled \magstephalf}
+\setfont\ssecbf{bx12 scaled \magstephalf}
+\setfont\ssecsc{csc10 scaled \magstep1}
 \font\sseci=cmmi12 scaled \magstephalf
 \font\ssecsy=cmsy10 scaled \magstep1
 % The smallcaps and symbol fonts should actually be scaled \magstep1.5,
 % but that is not a standard magnification.
 
 % Fonts for title page:
-\font\titlerm = cmbx12 scaled \magstep3
+\setfont\titlerm{bx12 scaled \magstep3}
 \let\authorrm = \secrm
 
 % In order for the font changes to affect most math symbols and letters,
@@ -930,7 +1027,7 @@ where each line of input produces a line of output.}
 % texinfo doesn't allow for producing subscripts and superscripts, we
 % don't bother to reset \scriptfont and \scriptscriptfont (which would
 % also require loading a lot more fonts).
-% 
+%
 \def\resetmathfonts{%
   \textfont0 = \tenrm \textfont1 = \teni \textfont2 = \tensy
   \textfont\itfam = \tenit \textfont\slfam = \tensl \textfont\bffam = \tenbf
@@ -943,14 +1040,14 @@ where each line of input produces a line of output.}
 % in math mode, where it is the current \fam that is relevant in most
 % cases, not the current.  Plain TeX does, for example,
 % \def\bf{\fam=\bffam \tenbf}  By redefining \tenbf, we obviate the need
-% to redefine \bf itself.  
+% to redefine \bf itself.
 \def\textfonts{%
   \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
   \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
   \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy
   \resetmathfonts}
 \def\chapfonts{%
-  \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl 
+  \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
   \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
   \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy
   \resetmathfonts}
@@ -971,16 +1068,16 @@ where each line of input produces a line of output.}
   \resetmathfonts}
 
 % Set up the default fonts, so we can use them for creating boxes.
-% 
+%
 \textfonts
 
 % Count depth in font-changes, for error checks
 \newcount\fontdepth \fontdepth=0
 
 % Fonts for short table of contents.
-\font\shortcontrm=cmr12
-\font\shortcontbf=cmbx12
-\font\shortcontsl=cmsl12
+\setfont\shortcontrm{r12}
+\setfont\shortcontbf{bx12}
+\setfont\shortcontsl{sl12}
 
 %% Add scribe-like font environments, plus @l for inline lisp (usually sans
 %% serif) and @ii for TeX italic
@@ -1002,16 +1099,15 @@ where each line of input produces a line of output.}
 % We can't just use \exhyphenpenalty, because that only has effect at
 % the end of a paragraph.  Restore normal hyphenation at the end of the
 % group within which \nohyphenation is presumably called.
-% 
+%
 \def\nohyphenation{\hyphenchar\font = -1  \aftergroup\restorehyphenation}
 \def\restorehyphenation{\hyphenchar\font = `- }
 
 \def\t#1{%
-  {\tt \nohyphenation \rawbackslash \frenchspacing #1}%
+  {\tt \rawbackslash \frenchspacing #1}%
   \null
 }
-\let\ttfont = \t
-%\def\samp #1{`{\tt \rawbackslash \frenchspacing #1}'\null}
+\let\ttfont=\t
 \def\samp #1{`\tclose{#1}'\null}
 \def\key #1{{\tt \nohyphenation \uppercase{#1}}\null}
 \def\ctrl #1{{\tt \rawbackslash \hat}#1}
@@ -1033,17 +1129,43 @@ where each line of input produces a line of output.}
     %
     % Turn off hyphenation.
     \nohyphenation
-    % 
+    %
     \rawbackslash
     \frenchspacing
     #1%
   }%
   \null
 }
-\let\code=\tclose
+
+% We *must* turn on hyphenation at `-' and `_' in \code.
+% Otherwise, it is too hard to avoid overful hboxes
+% in the Emacs manual, the Library manual, etc.
+
+% Unfortunately, TeX uses one parameter (\hyphenchar) to control
+% both hyphenation at - and hyphenation within words.
+% We must therefore turn them both off (\tclose does that)
+% and arrange explicitly to hyphenate an a dash.
+%  -- rms.
+{
+\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
+\global\def\indexbreaks{\catcode`\-=\active \let-\realdash \catcode`\_=\active \let_\realunder}
+}
+
+\def\realdash{-}
+\def\realunder{_}
+\def\codedash{-\discretionary{}{}{}}
+\def\codeunder{\normalunderscore\discretionary{}{}{}}
+\def\codex #1{\tclose{#1}\endgroup}
+
 %\let\exp=\tclose  %Was temporary
 
-% @kbd is like @code, except that if the argument is just one @key command, 
+% @kbd is like @code, except that if the argument is just one @key command,
 % then @kbd has no effect.
 
 \def\xkey{\key}
@@ -1055,12 +1177,12 @@ where each line of input produces a line of output.}
 % 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.
-% 
+%
 \def\dmn#1{\thinspace #1}
 
 \def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par}
 
-\def\l#1{{\li #1}\null}                % 
+\def\l#1{{\li #1}\null}                %
 
 \def\r#1{{\rm #1}}             % roman font
 % Use of \lowercase was suggested.
@@ -1099,7 +1221,7 @@ where each line of input produces a line of output.}
    \def\titlezzz##1{\leftline{\titlefont{##1}}
                    % print a rule at the page bottom also.
                    \finishedtitlepagefalse
-                   \vskip4pt \hrule height 4pt \vskip4pt}%
+                   \vskip4pt \hrule height 4pt width \hsize \vskip4pt}%
    % No rule at page bottom unless we print one at the top with @title.
    \finishedtitlepagetrue
    %
@@ -1111,7 +1233,7 @@ where each line of input produces a line of output.}
    \def\author{\parsearg\authorzzz}%
    \def\authorzzz##1{\ifseenauthor\else\vskip 0pt plus 1filll\seenauthortrue\fi
       {\authorfont \leftline{##1}}}%
-   %  
+   %
    % Most title ``pages'' are actually two pages long, with space
    % at the top of the second.  We don't want the ragged left on the second.
    \let\oldpage = \page
@@ -1139,7 +1261,7 @@ where each line of input produces a line of output.}
 }
 
 \def\finishtitlepage{%
-   \vskip4pt \hrule height 2pt
+   \vskip4pt \hrule height 2pt width \hsize
    \vskip\titlepagebottomglue
    \finishedtitlepagetrue
 }
@@ -1313,14 +1435,18 @@ July\or August\or September\or October\or November\or December\fi
 % They also define \itemindex
 % to index the item name in whatever manner is desired (perhaps none).
 
+\newif\ifitemxneedsnegativevskip
+
+\def\itemxpar{\par\ifitemxneedsnegativevskip\vskip-\parskip\nobreak\fi}
+
 \def\internalBitem{\smallbreak \parsearg\itemzzz}
-\def\internalBitemx{\par \parsearg\itemzzz}
+\def\internalBitemx{\itemxpar \parsearg\itemzzz}
 
 \def\internalBxitem "#1"{\def\xitemsubtopix{#1} \smallbreak \parsearg\xitemzzz}
-\def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \par \parsearg\xitemzzz}
+\def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \itemxpar \parsearg\xitemzzz}
 
 \def\internalBkitem{\smallbreak \parsearg\kitemzzz}
-\def\internalBkitemx{\par \parsearg\kitemzzz}
+\def\internalBkitemx{\itemxpar \parsearg\kitemzzz}
 
 \def\kitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \lastfunction}}%
                  \itemzzz {#1}}
@@ -1336,8 +1462,9 @@ July\or August\or September\or October\or November\or December\fi
   \nobreak % This prevents a break before @itemx.
   %
   % Be sure we are not still in the middle of a paragraph.
-  \parskip=0in
-  \par
+  %{\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
@@ -1345,17 +1472,36 @@ July\or August\or September\or October\or November\or December\fi
   % command is, e.g., @kindex, the whatsit would get put into the
   % horizontal list on a line by itself, resulting in extra blank space.
   \ifdim \wd0>\itemmax
-    \setbox0=\hbox{\hskip \leftskip \hskip -\tableindent \unhbox0}\box0
+    %
+    % Make this a paragraph so we get the \parskip glue and wrapping,
+    % but leave it ragged-right.
+    \begingroup
+      \advance\leftskip by-\tableindent
+      \advance\hsize by\tableindent
+      \advance\rightskip by0pt plus1fil
+      \leavevmode\unhbox0\par
+    \endgroup
+    %
+    % We're going to be starting a paragraph, but we don't want the
+    % \parskip glue -- logically it's part of the @item we just started.
+    \nobreak \vskip-\parskip
+    %
+    % Stop a page break at the \parskip glue coming up.  Unfortunately
+    % we can't prevent a possible page break at the following
+    % \baselineskip glue.
     \nobreak
+    \endgroup
+    \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.
     \noindent
-    \rlap{\hskip -\tableindent\box0}%
+    \rlap{\hskip -\tableindent\box0}\ignorespaces%
+    \endgroup%
+    \itemxneedsnegativevskiptrue%
   \fi
-  \endgroup
 }
 
 \def\item{\errmessage{@item while not in a table}}
@@ -1377,14 +1523,14 @@ July\or August\or September\or October\or November\or December\fi
 {\obeylines\obeyspaces%
 \gdef\ftablex #1^^M{%
 \tabley\fnitemindex#1        \endtabley
-\def\Eftable{\endgraf\endgroup\afterenvbreak}%
+\def\Eftable{\endgraf\afterenvbreak\endgroup}%
 \let\Etable=\relax}}
 
 \def\vtable{\begingroup\inENV\obeylines\obeyspaces\vtablex}
 {\obeylines\obeyspaces%
 \gdef\vtablex #1^^M{%
 \tabley\vritemindex#1        \endtabley
-\def\Evtable{\endgraf\endgroup\afterenvbreak}%
+\def\Evtable{\endgraf\afterenvbreak\endgroup}%
 \let\Etable=\relax}}
 
 \def\dontindex #1{}
@@ -1411,7 +1557,7 @@ July\or August\or September\or October\or November\or December\fi
 \parindent = 0pt
 \parskip = \smallskipamount
 \ifdim \parskip=0pt \parskip=2pt \fi%
-\def\Etable{\endgraf\endgroup\afterenvbreak}%
+\def\Etable{\endgraf\afterenvbreak\endgroup}%
 \let\item = \internalBitem %
 \let\itemx = \internalBitemx %
 \let\kitem = \internalBkitem %
@@ -1440,7 +1586,7 @@ July\or August\or September\or October\or November\or December\fi
 \parindent = 0pt %
 \parskip = \smallskipamount %
 \ifdim \parskip=0pt \parskip=2pt \fi%
-\def#2{\endgraf\endgroup\afterenvbreak}%
+\def#2{\endgraf\afterenvbreak\endgroup}%
 \def\itemcontents{#1}%
 \let\item=\itemizeitem}
 
@@ -1451,13 +1597,13 @@ July\or August\or September\or October\or November\or December\fi
 
 % \splitoff TOKENS\endmark defines \first to be the first token in
 % TOKENS, and \rest to be the remainder.
-% 
+%
 \def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}%
 
 % Allow an optional argument of an uppercase letter, lowercase letter,
 % or number, to specify the first label in the enumerated list.  No
 % argument is the same as `1'.
-% 
+%
 \def\enumerate{\parsearg\enumeratezzz}
 \def\enumeratezzz #1{\enumeratey #1  \endenumeratey}
 \def\enumeratey #1 #2\endenumeratey{%
@@ -1479,11 +1625,11 @@ July\or August\or September\or October\or November\or December\fi
     % An ``uppercase letter'' is one whose \lccode is both nonzero, and
     %   not equal to itself.
     % Otherwise, we assume it's a number.
-    % 
+    %
     % We need the \relax at the end of the \ifnum lines to stop TeX from
     % continuing to look for a <number>.
-    % 
-    \ifnum\lccode\expandafter`\thearg=0\relax 
+    %
+    \ifnum\lccode\expandafter`\thearg=0\relax
       \numericenumerate % a number (we hope)
     \else
       % It's a letter.
@@ -1501,7 +1647,7 @@ July\or August\or September\or October\or November\or December\fi
 
 % An @enumerate whose labels are integers.  The starting integer is
 % given in \thearg.
-% 
+%
 \def\numericenumerate{%
   \itemno = \thearg
   \startenumeration{\the\itemno}%
@@ -1536,7 +1682,7 @@ July\or August\or September\or October\or November\or December\fi
 % Call itemizey, adding a period to the first argument and supplying the
 % common last two arguments.  Also subtract one from the initial value in
 % \itemno, since @item increments \itemno.
-% 
+%
 \def\startenumeration#1{%
   \advance\itemno by -1
   \itemizey{#1.}\Eenumerate\flushcr
@@ -1544,7 +1690,7 @@ July\or August\or September\or October\or November\or December\fi
 
 % @alphaenumerate and @capsenumerate are abbreviations for giving an arg
 % to @enumerate.
-% 
+%
 \def\alphaenumerate{\enumerate{a}}
 \def\capsenumerate{\enumerate{A}}
 \def\Ealphaenumerate{\Eenumerate}
@@ -1561,6 +1707,159 @@ July\or August\or September\or October\or November\or December\fi
 \vadjust{\penalty 1200}}%
 \flushcr}
 
+% @multitable macros
+% Amy Hendrickson, 8/18/94
+%
+% @multitable ... @endmultitable will make as many columns as desired.
+% Contents of each column will wrap at width given in preamble. Width
+% can be specified either with sample text given in a template line,
+% or in percent of \hsize, the current width of text on page.
+
+% Table can continue over pages but will only break between lines.
+
+% To make preamble:
+%
+% Either define widths of columns in terms of percent of \hsize: 
+%   @multitable @percentofhsize .2 .3 .5
+%   @item ...
+%
+%   Numbers following @percentofhsize are the percent of the total
+%   current hsize to be used for each column. You may use as many
+%   columns as desired.
+
+% Or use a template:
+%   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+%   @item ...
+%   using the widest term desired in each column.
+
+
+% Each new table line starts with @item, each subsequent new column 
+% starts with @tab. Empty columns may be produced by supplying @tab's
+% with nothing between them for as many times as empty columns are needed,
+% ie, @tab@tab@tab will produce two empty columns.
+
+% @item, @tab, @multicolumn or @endmulticolumn do not need to be on their
+% own lines, but it will not hurt if they are.
+
+% Sample multitable:
+
+%   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+%   @item first col stuff @tab second col stuff @tab third col
+%   @item 
+%   first col stuff 
+%   @tab 
+%   second col stuff 
+%   @tab 
+%   third col 
+%   @item first col stuff @tab second col stuff 
+%   @tab Many paragraphs of text may be used in any column.
+%     
+%         They will wrap at the width determined by the template.
+%   @item@tab@tab This will be in third column.
+%   @endmultitable
+
+% Default dimensions may be reset by user.
+% @intableparskip will set vertical space between paragraphs in table.
+% @intableparindent will set paragraph indent in table.
+% @spacebetweencols will set horizontal space to be left between columns.
+% @spacebetweenlines will set vertical space to be left between lines.
+
+%%%%
+% Dimensions 
+
+\newdimen\intableparskip
+\newdimen\intableparindent
+\newdimen\spacebetweencols
+\newdimen\spacebetweenlines
+\intableparskip=0pt
+\intableparindent=6pt
+\spacebetweencols=12pt
+\spacebetweenlines=12pt
+
+%%%%
+% Macros used to set up halign preamble:
+\let\endsetuptable\relax
+\def\xendsetuptable{\endsetuptable}
+\let\percentofhsize\relax
+\def\xpercentofhsize{\percentofhsize}
+\newif\ifsetpercent
+
+\newcount\colcount
+\def\setuptable#1{\def\firstarg{#1}%
+\ifx\firstarg\xendsetuptable\let\go\relax%
+\else
+  \ifx\firstarg\xpercentofhsize\global\setpercenttrue%
+  \else
+    \ifsetpercent
+       \if#1.\else%
+       \global\advance\colcount by1 %
+       \expandafter\xdef\csname col\the\colcount\endcsname{.#1\hsize}%
+       \fi
+    \else
+       \global\advance\colcount by1
+       \setbox0=\hbox{#1}%
+       \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
+    \fi%
+  \fi%
+  \let\go\setuptable%
+\fi\go}
+%%%%
+% multitable syntax
+\def\tab{&}
+
+%%%%
+% @multitable ... @endmultitable definitions:
+
+\def\multitable#1\item{\bgroup
+\let\item\cr
+\tolerance=9500
+\hbadness=9500
+\parskip=\intableparskip
+\parindent=\intableparindent
+\overfullrule=0pt
+\global\colcount=0\relax%
+\def\Emultitable{\global\setpercentfalse\global\everycr{}\cr\egroup\egroup}%
+ % To parse everything between @multitable and @item :
+\def\one{#1}\expandafter\setuptable\one\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%
+\vtop{\hsize=\expandafter\csname col\the\colcount\endcsname
+ % In order to keep entries from bumping into each other
+ % we will add a \leftskip of \spacebetweencols to all columns after
+ % the first one.
+ %  If a template has been used, we will add \spacebetweencols 
+ % 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
+  \else
+   % If user has <not> set preamble in terms of percent of \hsize
+   % we will advance \hsize by \spacebetweencols 
+  \advance\hsize by \spacebetweencols
+  \fi
+ % In either case we will make \leftskip=\spacebetweencols:
+\leftskip=\spacebetweencols
+\fi
+\noindent##}\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{\nointerlineskip\vskip\spacebetweenlines
+\filbreak%% keeps underfull box messages off when table breaks over pages.
+\global\colcount=0\relax}}}
+
 \message{indexing,}
 % Index generation facilities
 
@@ -1635,6 +1934,32 @@ July\or August\or September\or October\or November\or December\fi
 \def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
 
 \def\indexdummies{%
+% Take care of the plain tex accent commands.
+\def\"{\realbackslash "}%
+\def\`{\realbackslash `}%
+\def\'{\realbackslash '}%
+\def\^{\realbackslash ^}%
+\def\~{\realbackslash ~}%
+\def\={\realbackslash =}%
+\def\b{\realbackslash b}%
+\def\c{\realbackslash c}%
+\def\d{\realbackslash d}%
+\def\u{\realbackslash u}%
+\def\v{\realbackslash v}%
+\def\H{\realbackslash H}%
+% Take care of the plain tex special European modified letters.
+\def\oe{\realbackslash oe}%
+\def\ae{\realbackslash ae}%
+\def\aa{\realbackslash aa}%
+\def\OE{\realbackslash OE}%
+\def\AE{\realbackslash AE}%
+\def\AA{\realbackslash AA}%
+\def\o{\realbackslash o}%
+\def\O{\realbackslash O}%
+\def\l{\realbackslash l}%
+\def\L{\realbackslash L}%
+\def\ss{\realbackslash ss}%
+% Take care of texinfo commands likely to appear in an index entry.
 \def\_{{\realbackslash _}}%
 \def\w{\realbackslash w }%
 \def\bf{\realbackslash bf }%
@@ -1672,6 +1997,31 @@ July\or August\or September\or October\or November\or December\fi
 \def\indexdummydots{...}
 
 \def\indexnofonts{%
+% Just ignore accents.
+\let\"=\indexdummyfont
+\let\`=\indexdummyfont
+\let\'=\indexdummyfont
+\let\^=\indexdummyfont
+\let\~=\indexdummyfont
+\let\==\indexdummyfont
+\let\b=\indexdummyfont
+\let\c=\indexdummyfont
+\let\d=\indexdummyfont
+\let\u=\indexdummyfont
+\let\v=\indexdummyfont
+\let\H=\indexdummyfont
+% Take care of the plain tex special European modified letters.
+\def\oe{oe}%
+\def\ae{ae}%
+\def\aa{aa}%
+\def\OE{OE}%
+\def\AE{AE}%
+\def\AA{AA}%
+\def\o{o}%
+\def\O{O}%
+\def\l{l}%
+\def\L{L}%
+\def\ss{ss}%
 \let\w=\indexdummyfont
 \let\t=\indexdummyfont
 \let\r=\indexdummyfont
@@ -1704,7 +2054,14 @@ July\or August\or September\or October\or November\or December\fi
 
 \let\indexbackslash=0  %overridden during \printindex.
 
+\let\SETmarginindex=\relax %initialize!
+% workhorse for all \fooindexes
+% #1 is name of index, #2 is stuff to put there
 \def\doind #1#2{%
+% Put the index entry in the margin if desired.
+\ifx\SETmarginindex\relax\else%
+\insert\margin{\hbox{\vrule height8pt depth3pt width0pt #2}}%
+\fi%
 {\count10=\lastpenalty %
 {\indexdummies % Must do this here, since \bf, etc expand at this stage
 \escapechar=`\\%
@@ -1760,7 +2117,7 @@ July\or August\or September\or October\or November\or December\fi
 %  \secondary {subtopic}{pagelist}
 %     for each subtopic.
 
-% Define the user-accessible indexing commands 
+% Define the user-accessible indexing commands
 % @findex, @vindex, @kindex, @cindex.
 
 \def\findex {\fnindex}
@@ -1788,8 +2145,9 @@ July\or August\or September\or October\or November\or December\fi
   \tex
   \dobreak \chapheadingskip {10000}
   \catcode`\%=\other\catcode`\&=\other\catcode`\#=\other
-  \catcode`\$=\other\catcode`\_=\other
+  \catcode`\$=\other
   \catcode`\~=\other
+  \indexbreaks
   %
   % The following don't help, since the chars were translated
   % when the raw index was written, and their fonts were discarded
@@ -1807,7 +2165,7 @@ July\or August\or September\or October\or November\or December\fi
   %
   % See if the index file exists and is nonempty.
   \openin 1 \jobname.#1s
-  \ifeof 1 
+  \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
@@ -1846,7 +2204,7 @@ July\or August\or September\or October\or November\or December\fi
 % 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
   %
   % Start a new paragraph if necessary, so our assignments below can't
@@ -1867,7 +2225,7 @@ July\or August\or September\or October\or November\or December\fi
   % dots pretty far over on the line.  Unfortunately, a large
   % indentation looks wrong when the entry text itself is broken across
   % lines.  So we use a small indentation and put up with long leaders.
-  % 
+  %
   % \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
@@ -1882,23 +2240,32 @@ July\or August\or September\or October\or November\or December\fi
   %
   % Insert the text of the index entry.  TeX will do line-breaking on it.
   #1%
-  %
-  % If we must, put the page number on a line of its own, and fill out
-  % this line with blank space.  (The \hfil is overwhelmed with the
-  % fill leaders glue in \indexdotfill if the page number does fit.)
-  \hfil\penalty50
-  \null\nobreak\indexdotfill % Have leaders before the page number.
-  %
-  % 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.
+  % The following is kluged to not output a line of dots in the index if
+  % there are no page numbers.  The next person who breaks this will be
+  % cursed by a Unix daemon.
+  \def\tempa{{\rm }}%
+  \def\tempb{#2}%
+  \edef\tempc{\tempa}%
+  \edef\tempd{\tempb}%
+  \ifx\tempc\tempd\ \else%
+    %
+    % If we must, put the page number on a line of its own, and fill out
+    % this line with blank space.  (The \hfil is overwhelmed with the
+    % fill leaders glue in \indexdotfill if the page number does fit.)
+    \hfil\penalty50
+    \null\nobreak\indexdotfill % Have leaders before the page number.
+    %
+    % 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.
+  \fi%
   \par
 \endgroup}
 
 % Like \dotfill except takes at least 1 em.
 \def\indexdotfill{\cleaders
-  \hbox{$\mathsurround=0pt \mkern1.5mu . \mkern1.5mu$}\hskip 1em plus 1fill}
+  \hbox{$\mathsurround=0pt \mkern1.5mu ${\it .}$ \mkern1.5mu$}\hskip 1em plus 1fill}
 
 \def\primary #1{\line{#1\hfil}}
 
@@ -1932,17 +2299,17 @@ July\or August\or September\or October\or November\or December\fi
   % format, but then we repeat the same computation.  Repeating a couple
   % of assignments once per index is clearly meaningless for the
   % execution time, so we may as well do it once.
-  % 
+  %
   % First we halve the line length, less a little for the gutter between
   % the columns.  We compute the gutter based on the line length, so it
   % changes automatically with the paper format.  The magic constant
   % below is chosen so that the gutter has the same value (well, +- <
   % 1pt) as it did when we hard-coded it.
-  % 
+  %
   % We put the result in a separate register, \doublecolumhsize, so we
   % can restore it in \pagesofar, after \hsize itself has (potentially)
   % been clobbered.
-  % 
+  %
   \doublecolumnhsize = \hsize
     \advance\doublecolumnhsize by -.04154\hsize
     \divide\doublecolumnhsize by 2
@@ -2130,13 +2497,13 @@ July\or August\or September\or October\or November\or December\fi
 \def\chapteryyy #1{\numhead0{#1}} % normally numhead0 calls chapterzzz
 \def\chapterzzz #1{\seccheck{chapter}%
 \secno=0 \subsecno=0 \subsubsecno=0
-\global\advance \chapno by 1 \message{Chapter \the\chapno}%
+\global\advance \chapno by 1 \message{\putwordChapter \the\chapno}%
 \chapmacro {#1}{\the\chapno}%
 \gdef\thissection{#1}%
 \gdef\thischaptername{#1}%
 % We don't substitute the actual chapter name into \thischapter
 % because we don't want its macros evaluated now.
-\xdef\thischapter{Chapter \the\chapno: \noexpand\thischaptername}%
+\xdef\thischapter{\putwordChapter{} \the\chapno: \noexpand\thischaptername}%
 {\chapternofonts%
 \edef\temp{{\realbackslash chapentry {#1}{\the\chapno}{\noexpand\folio}}}%
 \escapechar=`\\%
@@ -2152,13 +2519,13 @@ July\or August\or September\or October\or November\or December\fi
 \def\appendixzzz #1{\seccheck{appendix}%
 \secno=0 \subsecno=0 \subsubsecno=0
 \global\advance \appendixno by 1 \message{Appendix \appendixletter}%
-\chapmacro {#1}{Appendix \appendixletter}%
+\chapmacro {#1}{\putwordAppendix{} \appendixletter}%
 \gdef\thissection{#1}%
 \gdef\thischaptername{#1}%
-\xdef\thischapter{Appendix \appendixletter: \noexpand\thischaptername}%
+\xdef\thischapter{\putwordAppendix{} \appendixletter: \noexpand\thischaptername}%
 {\chapternofonts%
-\edef\temp{{\realbackslash chapentry 
-  {#1}{Appendix \appendixletter}{\noexpand\folio}}}%
+\edef\temp{{\realbackslash chapentry
+  {#1}{\putwordAppendix{} \appendixletter}{\noexpand\folio}}}%
 \escapechar=`\\%
 \write \contentsfile \temp  %
 \appendixnoderef %
@@ -2177,8 +2544,8 @@ July\or August\or September\or October\or November\or December\fi
 % argument to \message.  Therefore, if #1 contained @-commands, TeX
 % expanded them.  For example, in `@unnumbered The @cite{Book}', TeX
 % expanded @cite (which turns out to cause errors because \cite is meant
-% to be executed, not expanded).  
-% 
+% to be executed, not expanded).
+%
 % 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,
@@ -2465,7 +2832,7 @@ July\or August\or September\or October\or November\or December\fi
 \let\paragraphindent=\comment
 
 % Section fonts are the base font at magstep2, which produces
-% a size a bit more than 14 points in the default situation.   
+% a size a bit more than 14 points in the default situation.
 
 \def\secheading #1#2#3{\secheadingi {#2.#3\enspace #1}}
 \def\plainsecheading #1{\secheadingi {#1}}
@@ -2477,7 +2844,7 @@ July\or August\or September\or October\or November\or December\fi
 \ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000 }
 
 
-% Subsection fonts are the base font at magstep1, 
+% Subsection fonts are the base font at magstep1,
 % which produces a size of 12 points.
 
 \def\subsecheading #1#2#3#4{\subsecheadingi {#2.#3.#4\enspace #1}}
@@ -2512,19 +2879,20 @@ July\or August\or September\or October\or November\or December\fi
    \ifnum \pageno>0
       \pageno = -1             % Request roman numbered pages.
    \fi
-   % Don't need to put `Contents' or `Short Contents' in the headline. 
+   % Don't need to put `Contents' or `Short Contents' in the headline.
    % It is abundantly clear what they are.
    \unnumbchapmacro{#1}\def\thischapter{}%
    \begingroup                 % Set up to handle contents files properly.
       \catcode`\\=0  \catcode`\{=1  \catcode`\}=2  \catcode`\@=11
+      \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.
 }
 
-  
+
 % Normal (long) toc.
 \outer\def\contents{%
-   \startcontents{Table of Contents}%
+   \startcontents{\putwordTableofContents}%
       \input \jobname.toc
    \endgroup
    \vfill \eject
@@ -2532,7 +2900,7 @@ July\or August\or September\or October\or November\or December\fi
 
 % And just the chapters.
 \outer\def\summarycontents{%
-   \startcontents{Short Contents}%
+   \startcontents{\putwordShortContents}%
       %
       \let\chapentry = \shortchapentry
       \let\unnumbchapentry = \shortunnumberedentry
@@ -2571,7 +2939,7 @@ July\or August\or September\or October\or November\or December\fi
 % 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 Appendix }
+\setbox0 = \hbox{\shortcontrm \putwordAppendix }
 \newdimen\shortappendixwidth \shortappendixwidth = \wd0
 
 \def\shortchaplabel#1{%
@@ -2608,10 +2976,10 @@ July\or August\or September\or October\or November\or December\fi
 % This parameter controls the indentation of the various levels.
 \newdimen\tocindent \tocindent = 3pc
 
-% Now for the actual typesetting. In all these, #1 is the text and #2 is the 
+% Now for the actual typesetting. In all these, #1 is the text and #2 is the
 % page number.
 %
-% If the toc has to be broken over pages, we would want to be at chapters 
+% If the toc has to be broken over pages, we would want to be at chapters
 % if at all possible; hence the \penalty.
 \def\dochapentry#1#2{%
    \penalty-300 \vskip\baselineskip
@@ -2641,10 +3009,11 @@ July\or August\or September\or October\or November\or December\fi
 % 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
   \hyphenpenalty = 10000
-  \entry{#1}{#2}%
+  \entry{\turnoffactive #1}{\turnoffactive #2}%
 \endgroup}
 
 % Space between chapter (or whatever) number and the title.
@@ -2661,7 +3030,7 @@ July\or August\or September\or October\or November\or December\fi
 
 \message{environments,}
 
-% Since these characters are used in examples, it should be an even number of 
+% 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.
 % Furthermore, these definitions must come after we define our fonts.
 \newbox\dblarrowbox    \newbox\longdblarrowbox
@@ -2725,6 +3094,7 @@ July\or August\or September\or October\or November\or December\fi
 \catcode`\>=12
 \escapechar=`\\
 %
+\let\~=\ptextilde
 \let\{=\ptexlbrace
 \let\}=\ptexrbrace
 \let\.=\ptexdot
@@ -2744,28 +3114,32 @@ July\or August\or September\or October\or November\or December\fi
 % Amount to narrow the margins by for @lisp.
 \newskip\lispnarrowing \lispnarrowing=0.4in
 
-% This is the definition that ^M gets inside @lisp
-% phr: changed space to \null, to avoid overfull hbox problems.
-{\obeyspaces%
-\gdef\lisppar{\null\endgraf}}
+% This is the definition that ^^M gets inside @lisp, @example, and other
+% such environments.  \null is better than a space, since it doesn't
+% have any width.
+\def\lisppar{\null\endgraf}
 
 % Make each space character in the input produce a normal interword
 % space in the output.  Don't allow a line break at this space, as this
 % is used only in environments like @example, where each line of input
 % should produce a line of output anyway.
-% 
+%
 {\obeyspaces %
 \gdef\sepspaces{\obeyspaces\let =\tie}}
 
 % Define \obeyedspace to be our active space, whatever it is.  This is
 % for use in \parsearg.
-{\sepspaces %
+{\sepspaces%
 \global\let\obeyedspace= }
 
 % This space is always present above and below environments.
 \newskip\envskipamount \envskipamount = 0pt
 
-% Make spacing and below environment symmetrical.
+% Make spacing and below environment symmetrical.  We use \parskip here
+% to help in doing that, since in @example-like environments \parskip
+% is reset to zero; thus the \afterenvbreak inserts no space -- but the
+% start of the next paragraph will insert \parskip
+%
 \def\aboveenvbreak{{\advance\envskipamount by \parskip
 \endgraf \ifdim\lastskip<\envskipamount
 \removelastskip \penalty-50 \vskip\envskipamount \fi}}
@@ -2800,7 +3174,7 @@ July\or August\or September\or October\or November\or December\fi
 \begingroup
        \lskip=\leftskip \rskip=\rightskip
        \leftskip=0pt\rightskip=0pt %we want these *outside*.
-       \cartinner=\hsize \advance\cartinner by-\lskip 
+       \cartinner=\hsize \advance\cartinner by-\lskip
                          \advance\cartinner by-\rskip
        \cartouter=\hsize
        \advance\cartouter by 18pt % allow for 3pt kerns on either
@@ -2833,7 +3207,7 @@ July\or August\or September\or October\or November\or December\fi
                \cartbot
        \egroup
 \endgroup
-}}     
+}}
 
 
 % This macro is called at the beginning of all the @example variants,
@@ -2843,7 +3217,7 @@ July\or August\or September\or October\or November\or December\fi
   \inENV % This group ends at the end of the body
   \hfuzz = 12pt % Don't be fussy
   \sepspaces % Make spaces be word-separators rather than space tokens.
-  \singlespace % single space lines
+  \singlespace
   \let\par = \lisppar % don't ignore blank lines
   \obeylines % each line of input is a line of output
   \parskip = 0pt
@@ -2859,37 +3233,45 @@ July\or August\or September\or October\or November\or December\fi
   \fi
 }
 
-\def\Elisp{\endgroup\afterenvbreak}%
+% 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.
+%
+\def\nonfillfinish{\afterenvbreak\endgroup}%
 
+% This macro is
 \def\lisp{\begingroup
   \nonfillstart
-  \def\Elisp{\endgroup\afterenvbreak}%
+  \let\Elisp = \nonfillfinish
   \tt
-  \rawbackslash % output the \ character from the current font
+  \rawbackslash % have \ input char produce \ char from current font
   \gobble
 }
 
 % 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.
 %
-\def\example{\begingroup \def\Eexample{\Elisp\endgroup}\lisp}
-\def\smallexample{\begingroup \def\Esmallexample{\Elisp\endgroup}\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}
 
-% Macro for 9 pt. examples, necessary to print with 5" lines.  From
-% Pavel@xerox.  This is not used for @smallexamples unless the
-% @smallbook command is given.
+% @smallexample and @smalllisp.  This is not used unless the @smallbook
+% command is given.  Originally contributed by Pavel@xerox.
 %
 \def\smalllispx{\begingroup
   \nonfillstart
-  \def\Esmalllisp{\endgroup\afterenvbreak}%
+  \let\Esmalllisp = \nonfillfinish
+  \let\Esmallexample = \nonfillfinish
   %
   % Smaller interline space and fonts for small examples.
-  \baselineskip 10pt
+  \setleading{10pt}%
   \indexfonts \tt
-  \rawbackslash % output the \ character from the current font
+  \rawbackslash % make \ output the \ character from the current font (tt)
   \gobble
 }
 
@@ -2897,7 +3279,7 @@ July\or August\or September\or October\or November\or December\fi
 %
 \def\display{\begingroup
   \nonfillstart
-  \def\Edisplay{\endgroup\afterenvbreak}%
+  \let\Edisplay = \nonfillfinish
   \gobble
 }
 
@@ -2906,7 +3288,7 @@ July\or August\or September\or October\or November\or December\fi
 \def\format{\begingroup
   \let\nonarrowing = t
   \nonfillstart
-  \def\Eformat{\endgroup\afterenvbreak}
+  \let\Eformat = \nonfillfinish
   \gobble
 }
 
@@ -2915,33 +3297,36 @@ July\or August\or September\or October\or November\or December\fi
 \def\flushleft{\begingroup
   \let\nonarrowing = t
   \nonfillstart
-  \def\Eflushleft{\endgroup\afterenvbreak}%
+  \let\Eflushleft = \nonfillfinish
   \gobble
 }
 \def\flushright{\begingroup
   \let\nonarrowing = t
   \nonfillstart
-  \def\Eflushright{\endgroup\afterenvbreak}%
+  \let\Eflushright = \nonfillfinish
   \advance\leftskip by 0pt plus 1fill
   \gobble}
 
-% @quotation does normal linebreaking and narrows the margins.
+% @quotation does normal linebreaking (hence we can't use \nonfillstart)
+% and narrows the margins.
 %
 \def\quotation{%
-\begingroup\inENV %This group ends at the end of the @quotation body
-{\parskip=0pt  % because we will skip by \parskip too, later
-\aboveenvbreak}%
-\singlespace
-\parindent=0pt
-\def\Equotation{\par\endgroup\afterenvbreak}%
-% @cartouche defines \nonarrowing to inhibit narrowing
-% at next level down.
-\ifx\nonarrowing\relax
-\advance \leftskip by \lispnarrowing
-\advance \rightskip by \lispnarrowing
-\exdentamount=\lispnarrowing
-\let\nonarrowing=\relax
-\fi}
+  \begingroup\inENV %This group ends at the end of the @quotation body
+  {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
+  \singlespace
+  \parindent=0pt
+  % We have retained a nonzero parskip for the environment, since we're
+  % doing normal filling. So to avoid extra space below the environment...
+  \def\Equotation{\parskip = 0pt \nonfillfinish}%
+  %
+  % @cartouche defines \nonarrowing to inhibit narrowing at next level down.
+  \ifx\nonarrowing\relax
+    \advance\leftskip by \lispnarrowing
+    \advance\rightskip by \lispnarrowing
+    \exdentamount = \lispnarrowing
+    \let\nonarrowing = \relax
+  \fi
+}
 
 \message{defuns,}
 % Define formatter for defuns
@@ -2973,6 +3358,9 @@ July\or August\or September\or October\or November\or December\fi
 
 \gdef\functionparens{\boldbrax\let&=\amprm\parencount=0 }
 \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
+% This is used to turn on special parens
+% but make & act ordinary (given that it's active).
+\gdef\boldbraxnoamp{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb\let&=\ampnr}
 
 % Definitions of (, ) and & used in args for functions.
 % This is the definition of ( outside of all parentheses.
@@ -3020,7 +3408,7 @@ July\or August\or September\or October\or November\or December\fi
 \advance \hsize by -\dimen2 \advance \hsize by -\dimen3
 \rlap{\rightline{{\rm #2}\hskip \deftypemargin}}}%
 % Make all lines underfull and no complaints:
-\tolerance=10000 \hbadness=10000    
+\tolerance=10000 \hbadness=10000
 \advance\leftskip by -\defbodyindent
 \exdentamount=\defbodyindent
 {\df #1}\enskip        % Generate function name
@@ -3042,7 +3430,7 @@ July\or August\or September\or October\or November\or December\fi
 \advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
 \exdentamount=\defbodyindent
 \begingroup %
-\catcode 61=\active %
+\catcode 61=\active % 61 is `='
 \obeylines\activeparens\spacesplit#3}
 
 \def\defmethparsebody #1#2#3#4 {\begingroup\inENV %
@@ -3085,55 +3473,54 @@ July\or August\or September\or October\or November\or December\fi
 \catcode 61=\active %
 \obeylines\spacesplit#3}
 
-\def\defvrparsebody #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\spacesplit{#3{##1}}}%
-\parindent=0in
-\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
-\exdentamount=\defbodyindent
-\begingroup\obeylines\spacesplit{#3{#4}}}
-
-% This seems to work right in all cases.
-\let\deftpparsebody=\defvrparsebody
-% This fails to work.  When given `@deftp {Data Type} foo_t',
-% it thinks the type name is just `f'.
-%%% This is the same as all the others except for the last line.  We need
-%%% to parse the arguments differently for @deftp, since the ``attributes''
-%%% there are optional.
-%%% 
-%%\def\deftpparsebody #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\spacesplit{#3{##1}}}%
-%%\parindent=0in
-%%\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
-%%\exdentamount=\defbodyindent
-%%\begingroup\obeylines\parsetpheaderline{#3{#4}}}
-
-%%{\obeylines %
-%%  % Parse the type name and any attributes (field names, etc.).
-%%  % #1 is the beginning of the macro call that will produce the output,
-%%  %   i.e., \deftpheader{CLASS}; this is passed from \deftpparsebody.
-%%  % #2 is the type name, e.g., `struct termios'.
-%%  % #3 is the (possibly empty) attribute list.
-%%  % 
-%%  \gdef\parsetpheaderline#1#2#3^^M{%
-%%    \endgroup % Started in \deftpparsebody.
-%%    %
-%%    % If the attribute list is in fact empty, there will be no space after
-%%    % #2; so we can't put a space in our TeX parameter list.  But if it
-%%    % isn't empty, then #3 will begin with an unwanted space.
-%%    \def\theargs{\ignorespaces #3}%
-%%    %
-%%    % Call the macro to produce the output.
-%%    #1{#2}\theargs %
-%%  }%
-%%}
+% This is used for \def{tp,vr}parsebody.  It could probably be used for
+% some of the others, too, with some judicious conditionals.
+% 
+\def\parsebodycommon#1#2#3{%
+  \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\spacesplit{#3{##1}}}%
+  \parindent=0in
+  \advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
+  \exdentamount=\defbodyindent
+  \begingroup\obeylines
+}
+
+\def\defvrparsebody#1#2#3#4 {%
+  \parsebodycommon{#1}{#2}{#3}%
+  \spacesplit{#3{#4}}%
+}
+
+% This loses on `@deftp {Data Type} {struct termios}' -- it thinks the
+% type is just `struct', because we lose the braces in `{struct
+% termios}' when \spacesplit reads its undelimited argument.  Sigh.
+% \let\deftpparsebody=\defvrparsebody
+%
+% So, to get around this, we put \empty in with the type name.  That
+% way, TeX won't find exactly `{...}' as an undelimited argument, and
+% won't strip off the braces.
+%
+\def\deftpparsebody #1#2#3#4 {%
+  \parsebodycommon{#1}{#2}{#3}%
+  \spacesplit{\parsetpheaderline{#3{#4}}}\empty
+}
+
+% Fine, but then we have to eventually remove the \empty *and* the
+% braces (if any).  That's what this does, putting the result in \tptemp.
+% 
+\def\removeemptybraces\empty#1\relax{\def\tptemp{#1}}%
+
+% After \spacesplit has done its work, this is called -- #1 is the final
+% thing to call, #2 the type name (which starts with \empty), and #3
+% (which might be empty) the arguments.
+% 
+\def\parsetpheaderline#1#2#3{%
+  \removeemptybraces#2\relax
+  #1{\tptemp}{#3}%
+}%
 
 \def\defopvarparsebody #1#2#3#4#5 {\begingroup\inENV %
 \medbreak %
@@ -3182,8 +3569,9 @@ July\or August\or September\or October\or November\or December\fi
 \def\deftypefunargs #1{%
 % Expand, preventing hyphenation at `-' chars.
 % Note that groups don't affect changes in \hyphenchar.
-\functionparens
-\code{#1}%
+% Use \boldbraxnoamp, not \functionparens, so that & is not special.
+\boldbraxnoamp
+\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%
@@ -3219,7 +3607,7 @@ July\or August\or September\or October\or November\or December\fi
 % #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 {\code{#1} #2}{Function}%
+\begingroup\defname {\defheaderxcond#1\relax$$$#2}{Function}%
 \deftypefunargs {#3}\endgroup %
 \catcode 61=\other % Turn off change made in \defparsebody
 }
@@ -3228,12 +3616,19 @@ July\or August\or September\or October\or November\or December\fi
 
 \def\deftypefn{\defmethparsebody\Edeftypefn\deftypefnx\deftypefnheader}
 
+% \defheaderxcond#1\relax$$$
+% puts #1 in @code, followed by a space, but does nothing if #1 is null.
+\def\defheaderxcond#1#2$$${\ifx#1\relax\else\code{#1#2} \fi}
+
 % #1 is the classification.  #2 is the data type.  #3 is the name and args.
 \def\deftypefnheader #1#2#3{\deftypefnheaderx{#1}{#2}#3 \relax}
 % #1 is the classification, #2 the data type, #3 the name, #4 the args.
 \def\deftypefnheaderx #1#2#3 #4\relax{%
 \doind {fn}{\code{#3}}% Make entry in function index
-\begingroup\defname {\code{#2} #3}{#1}%
+\begingroup
+\normalparens % notably, turn off `&' magic, which prevents
+%               at least some C++ text from working
+\defname {\defheaderxcond#2\relax$$$#3}{#1}%
 \deftypefunargs {#4}\endgroup %
 \catcode 61=\other % Turn off change made in \defparsebody
 }
@@ -3361,7 +3756,7 @@ July\or August\or September\or October\or November\or December\fi
 % #1 is the data type.  #2 is the name.
 \def\deftypevarheader #1#2{%
 \doind {vr}{\code{#2}}% Make entry in variables index
-\begingroup\defname {\code{#1} #2}{Variable}%
+\begingroup\defname {\defheaderxcond#1\relax$$$#2}{Variable}%
 \interlinepenalty=10000
 \endgraf\penalty 10000\vskip -\parskip\penalty 10000
 \endgroup}
@@ -3371,7 +3766,7 @@ July\or August\or September\or October\or November\or December\fi
 \def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader}
 
 \def\deftypevrheader #1#2#3{\doind {vr}{\code{#3}}%
-\begingroup\defname {\code{#2} #3}{#1}
+\begingroup\defname {\defheaderxcond#2\relax$$$#3}{#1}
 \interlinepenalty=10000
 \endgraf\penalty 10000\vskip -\parskip\penalty 10000
 \endgroup}
@@ -3412,17 +3807,17 @@ July\or August\or September\or October\or November\or December\fi
 % \setref{foo} defines a cross-reference point named foo.
 
 \def\setref#1{%
-%\dosetq{#1-title}{Ytitle}%
+\dosetq{#1-title}{Ytitle}%
 \dosetq{#1-pg}{Ypagenumber}%
 \dosetq{#1-snt}{Ysectionnumberandtype}}
 
 \def\unnumbsetref#1{%
-%\dosetq{#1-title}{Ytitle}%
+\dosetq{#1-title}{Ytitle}%
 \dosetq{#1-pg}{Ypagenumber}%
 \dosetq{#1-snt}{Ynothing}}
 
 \def\appendixsetref#1{%
-%\dosetq{#1-title}{Ytitle}%
+\dosetq{#1-title}{Ytitle}%
 \dosetq{#1-pg}{Ypagenumber}%
 \dosetq{#1-snt}{Yappendixletterandtype}}
 
@@ -3431,44 +3826,64 @@ July\or August\or September\or October\or November\or December\fi
 % cross-reference, #3 the printed node name, #4 the name of the Info
 % file, #5 the name of the printed manual.  All but the node name can be
 % omitted.
-% 
-\def\pxref#1{see \xrefX[#1,,,,,,,]}
-\def\xref#1{See \xrefX[#1,,,,,,,]}
-\def\ref#1{\xrefX[#1,,,,,,,]}
-\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup%
-\def\printedmanual{\ignorespaces #5}%
-\def\printednodename{\ignorespaces #3}%
-%
-\setbox1=\hbox{\printedmanual}%
-\setbox0=\hbox{\printednodename}%
-\ifdim \wd0=0pt%
-\def\printednodename{\ignorespaces #1}%
-%%% Uncommment the following line to make the actual chapter or section title
-%%% appear inside the square brackets.
-%\def\printednodename{#1-title}%
-\fi%
-%
 %
-% If we use \unhbox0 and \unhbox1 to print the node names, TeX does
-% not insert empty discretionaries after hyphens, which means that it
-% will not find a line break at a hyphen in a node names.  Since some
-% manuals are best written with fairly long node names, containing
-% hyphens, this is a loss.  Therefore, we simply give the text of
-% the node name again, so it is as if TeX is seeing it for the first
-% time.
-\ifdim \wd1>0pt
-section ``\printednodename'' in \cite{\printedmanual}%
-\else%
-\turnoffactive%
-\refx{#1-snt}{} [\printednodename], page\tie\refx{#1-pg}{}%
-\fi
+\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
+  \def\printedmanual{\ignorespaces #5}%
+  \def\printednodename{\ignorespaces #3}%
+  \setbox1=\hbox{\printedmanual}%
+  \setbox0=\hbox{\printednodename}%
+  \ifdim \wd0 = 0pt
+    % No printed node name was explicitly given.
+    \ifx\SETxref-automatic-section-title\relax %
+      % Use the actual chapter/section title appear inside
+      % the square brackets.  Use the real section title if we have it.
+      \ifdim \wd1>0pt%
+        % It is in another manual, so we don't have it.
+        \def\printednodename{\ignorespaces #1}%
+      \else
+        \ifhavexrefs
+          % We know the real title if we have the xref values.
+          \def\printednodename{\refx{#1-title}}%
+        \else
+          % Otherwise just copy the Info node name.
+          \def\printednodename{\ignorespaces #1}%
+        \fi%
+      \fi
+      \def\printednodename{#1-title}%
+    \else
+      % Use the node name inside the square brackets.
+      \def\printednodename{\ignorespaces #1}%
+    \fi
+  \fi
+  %
+  % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not
+  % insert empty discretionaries after hyphens, which means that it will
+  % not find a line break at a hyphen in a node names.  Since some manuals
+  % are best written with fairly long node names, containing hyphens, this
+  % is a loss.  Therefore, we give the text of the node name again, so it
+  % is as if TeX is seeing it for the first time.
+  \ifdim \wd1 > 0pt
+    \putwordsection{} ``\printednodename'' in \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
+    \turnoffactive \putwordpage\tie\refx{#1-pg}{}%
+  \fi
 \endgroup}
 
 % \dosetq is the interface for calls from other macros
 
 % Use \turnoffactive so that punctuation chars such as underscore
 % work in node names.
-\def\dosetq #1#2{{\let\folio=0 \turnoffactive%
+\def\dosetq #1#2{{\let\folio=0 \turnoffactive \auxhat%
 \edef\next{\write\auxfile{\internalsetq {#1}{#2}}}%
 \next}}
 
@@ -3482,33 +3897,33 @@ section ``\printednodename'' in \cite{\printedmanual}%
 
 \def\Ypagenumber{\folio}
 
-\def\Ytitle{\thischapter}
+\def\Ytitle{\thissection}
 
 \def\Ynothing{}
 
 \def\Ysectionnumberandtype{%
-\ifnum\secno=0 Chapter\xreftie\the\chapno %
-\else \ifnum \subsecno=0 Section\xreftie\the\chapno.\the\secno %
+\ifnum\secno=0 \putwordChapter\xreftie\the\chapno %
+\else \ifnum \subsecno=0 \putwordSection\xreftie\the\chapno.\the\secno %
 \else \ifnum \subsubsecno=0 %
-Section\xreftie\the\chapno.\the\secno.\the\subsecno %
+\putwordSection\xreftie\the\chapno.\the\secno.\the\subsecno %
 \else %
-Section\xreftie\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno %
+\putwordSection\xreftie\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno %
 \fi \fi \fi }
 
 \def\Yappendixletterandtype{%
-\ifnum\secno=0 Appendix\xreftie'char\the\appendixno{}%
-\else \ifnum \subsecno=0 Section\xreftie'char\the\appendixno.\the\secno %
+\ifnum\secno=0 \putwordAppendix\xreftie'char\the\appendixno{}%
+\else \ifnum \subsecno=0 \putwordSection\xreftie'char\the\appendixno.\the\secno %
 \else \ifnum \subsubsecno=0 %
-Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno %
+\putwordSection\xreftie'char\the\appendixno.\the\secno.\the\subsecno %
 \else %
-Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %
+\putwordSection\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %
 \fi \fi \fi }
 
 \gdef\xreftie{'tie}
 
 % Use TeX 3.0's \inputlineno to get the line number, for better error
 % messages, but if we're using an old version of TeX, don't do anything.
-% 
+%
 \ifx\inputlineno\thisisundefined
   \let\linenumber = \empty % Non-3.0.
 \else
@@ -3589,6 +4004,15 @@ Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %
 \catcode `\&=\other
 % `\+ does not work, so use 43.
 \catcode 43=\other
+% Make the characters 128-255 be printing characters
+{%
+  \count 1=128
+  \def\loop{%
+    \catcode\count 1=\other
+    \advance\count 1 by 1
+    \ifnum \count 1<256 \loop \fi
+  }%
+}%
 % the aux file uses ' as the escape.
 % Turn off \ as an escape so we do not lose on
 % entries which were dumped with control sequences in their names.
@@ -3598,6 +4022,7 @@ Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %
 \catcode `\{=1 \catcode `\}=2
 \catcode `\%=\other
 \catcode `\'=0
+\catcode`\^=7 % to make ^^e4 etc usable in xref tags 
 \catcode `\\=\other
 \openin 1 \jobname.aux
 \ifeof 1 \else \closein 1 \input \jobname.aux \global\havexrefstrue
@@ -3643,7 +4068,7 @@ Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %
 
 % Don't bother with the trickery in plain.tex to not require the
 % footnote text as a parameter.  Our footnotes don't need to be so general.
-% 
+%
 \long\gdef\footnotezzz#1{\insert\footins{%
   % We want to typeset this text as a normal paragraph, even if the
   % footnote reference occurs in (for example) a display environment.
@@ -3674,15 +4099,15 @@ Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %
 % Set the baselineskip to #1, and the lineskip and strut size
 % correspondingly.  There is no deep meaning behind these magic numbers
 % used as factors; they just match (closely enough) what Knuth defined.
-% 
-\def\lineskipfactor{.1}
-\def\strutheightpercent{.71}
-\def\strutdepthpercent{.29}
+%
+\def\lineskipfactor{.08333}
+\def\strutheightpercent{.70833}
+\def\strutdepthpercent {.29167}
 %
 \def\setleading#1{%
-  \baselineskip = #1\relax
-  \normalbaselineskip = \baselineskip
-  \lineskip = \lineskipfactor\baselineskip
+  \normalbaselineskip = #1\relax
+  \normallineskip = \lineskipfactor\normalbaselineskip
+  \normalbaselines
   \setbox\strutbox =\hbox{%
     \vrule width0pt height\strutheightpercent\baselineskip
                     depth \strutdepthpercent \baselineskip
@@ -3694,7 +4119,7 @@ Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %
 % change spans more than two lines of output.  To handle that, we would
 % have adopt a much more difficult approach (putting marks into the main
 % vertical list for the beginning and end of each change).
-% 
+%
 \def\|{%
   % \vadjust can only be used in horizontal mode.
   \leavevmode
@@ -3721,7 +4146,7 @@ Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %
 % For a final copy, take out the rectangles
 % that mark overfull boxes (in case you have decided
 % that the text looks ok even though it passes the margin).
-% 
+%
 \def\finalout{\overfullrule=0pt}
 
 
@@ -3758,7 +4183,7 @@ Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %
 % 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.
-% 
+%
 \ifx\emergencystretch\thisisundefined
   % Allow us to assign to \emergencystretch anyway.
   \def\emergencystretch{\dimen0}%
@@ -3784,6 +4209,8 @@ Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %
 \global\tolerance=700
 \global\hfuzz=1pt
 \global\contentsrightmargin=0pt
+\global\deftypemargin=0pt
+\global\defbodyindent=.5cm
 
 \global\pagewidth=\hsize
 \global\pageheight=\vsize
@@ -3813,6 +4240,32 @@ Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %
 \global\pageheight=\vsize
 }
 
+% Allow control of the text dimensions.  Parameters in order: textheight;
+% textwidth; \voffset; \hoffset (!); binding offset.  All require a dimension;
+% header is additional; added length extends the bottom of the page.
+
+\def\changepagesizes#1#2#3#4#5{
+ \global\vsize= #1
+ \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}
+
+% This layout is compatible with Latex on A4 paper.
+
+\def\afourlatex{\changepagesizes{22cm}{15cm}{7mm}{4.6mm}{5mm}}
+
+% Use @afourwide to print on European A4 paper in wide format.
+\def\afourwide{\afourpaper
+\changepagesizes{9.5in}{6.5in}{\hoffset}{\normaloffset}{\bindingoffset}}
+
 % Define macros to output various characters with catcode for normal text.
 \catcode`\"=\other
 \catcode`\~=\other
@@ -3839,7 +4292,7 @@ Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %
 % otherwise.  Since all the Computer Modern typewriter fonts have zero
 % interword stretch (and shrink), and it is reasonable to expect all
 % typewriter fonts to have this, we can check that font parameter.
-% 
+%
 \def\ifusingtt#1#2{\ifdim \fontdimen3\the\font=0pt #1\else #2\fi}
 
 % Turn off all special characters except @
@@ -3854,6 +4307,7 @@ Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %
 \def~{{\tt \char '176}}
 \chardef\hat=`\^
 \catcode`\^=\active
+\def\auxhat{\def^{'hat}}
 \def^{{\tt \hat}}
 
 \catcode`\_=\active
@@ -3881,21 +4335,19 @@ Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %
 %\catcode 27=\active
 %\def^^[{$\diamondsuit$}
 
-% Used sometimes to turn off (effectively) the active characters
-% even after parsing them.
-\def\turnoffactive{\let"=\normaldoublequote
-\let~=\normaltilde
-\let^=\normalcaret
-\let_=\normalunderscore
-\let|=\normalverticalbar
-\let<=\normalless
-\let>=\normalgreater
-\let+=\normalplus}
-
 % Set up an active definition for =, but don't enable it most of the time.
 {\catcode`\==\active
 \global\def={{\tt \char 61}}}
 
+\catcode`+=\active
+\catcode`\_=\active
+
+% If a .fmt file is being used, characters that might appear in a file
+% name cannot be active until we have parsed the command line.
+% So turn them off again, and have \everyjob (or @setfilename) turn them on.
+% \otherifyactive is called near the end of this file.
+\def\otherifyactive{\catcode`+=\other \catcode`\_=\other}
+
 \catcode`\@=0
 
 % \rawbackslashxx output one backslash character in current font
@@ -3916,18 +4368,47 @@ Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %
 % \catcode 17=0   % Define control-q
 \catcode`\\=\active
 
+% Used sometimes to turn off (effectively) the active characters
+% even after parsing them.
+@def@turnoffactive{@let"=@normaldoublequote
+@let\=@realbackslash
+@let~=@normaltilde
+@let^=@normalcaret
+@let_=@normalunderscore
+@let|=@normalverticalbar
+@let<=@normalless
+@let>=@normalgreater
+@let+=@normalplus}
+
+@def@normalturnoffactive{@let"=@normaldoublequote
+@let\=@normalbackslash
+@let~=@normaltilde
+@let^=@normalcaret
+@let_=@normalunderscore
+@let|=@normalverticalbar
+@let<=@normalless
+@let>=@normalgreater
+@let+=@normalplus}
+
+% Make _ and + \other characters, temporarily.
+% This is canceled by @fixbackslash.
+@otherifyactive
+
 % If a .fmt file is being used, we don't want the `\input texinfo' to show up.
-% That is what \eatinput is for; after that, the `\' should revert to printing 
+% That is what \eatinput is for; after that, the `\' should revert to printing
 % a backslash.
 %
 @gdef@eatinput input texinfo{@fixbackslash}
 @global@let\ = @eatinput
 
 % On the other hand, perhaps the file did not have a `\input texinfo'. Then
-% the first `\{ in the file would cause an error. This macro tries to fix 
+% the first `\{ in the file would cause an error. This macro tries to fix
 % that, assuming it is called before the first `\' could plausibly occur.
-% 
-@gdef@fixbackslash{@ifx\@eatinput @let\ = @normalbackslash @fi}
+% 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}
 
 %% 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