diff options
Diffstat (limited to 'lang/gcc/patches/patch-cp')
-rw-r--r-- | lang/gcc/patches/patch-cp | 5093 |
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: |