/[gnats]/gnats/texinfo/texinfo.tex
ViewVC logotype

Diff of /gnats/texinfo/texinfo.tex

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.1.1.1 by brendan, Thu Nov 5 19:54:14 1998 UTC revision 1.2 by chewie, Thu Feb 24 21:36:54 2005 UTC
# Line 1  Line 1 
1  %% TeX macros to handle Texinfo files.  % texinfo.tex -- TeX macros to handle Texinfo files.
2  %% $Id$  %
3    % Load plain if necessary, i.e., if running under initex.
 %  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.  
4  \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi  \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
5    %
6    \def\texinfoversion{2004-04-07.08}
7    %
8    % Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
9    % 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software
10    % Foundation, Inc.
11    %
12    % This texinfo.tex file is free software; you can redistribute it and/or
13    % modify it under the terms of the GNU General Public License as
14    % published by the Free Software Foundation; either version 2, or (at
15    % your option) any later version.
16    %
17    % This texinfo.tex file is distributed in the hope that it will be
18    % useful, but WITHOUT ANY WARRANTY; without even the implied warranty
19    % of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20    % General Public License for more details.
21    %
22    % You should have received a copy of the GNU General Public License
23    % along with this texinfo.tex file; see the file COPYING.  If not, write
24    % to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
25    % Boston, MA 02111-1307, USA.
26    %
27    % As a special exception, when this file is read by TeX when processing
28    % a Texinfo source document, you may use the result without
29    % restriction.  (This has been our intent since Texinfo was invented.)
30    %
31    % Please try the latest version of texinfo.tex before submitting bug
32    % reports; you can get the latest version from:
33    %   http://www.gnu.org/software/texinfo/ (the Texinfo home page), or
34    %   ftp://tug.org/tex/texinfo.tex
35    %     (and all CTAN mirrors, see http://www.ctan.org).
36    % The texinfo.tex in any given distribution could well be out
37    % of date, so if that's what you're using, please check.
38    %
39    % Send bug reports to bug-texinfo@gnu.org.  Please include including a
40    % complete document in each bug report with which we can reproduce the
41    % problem.  Patches are, of course, greatly appreciated.
42    %
43    % To process a Texinfo manual with TeX, it's most reliable to use the
44    % texi2dvi shell script that comes with the distribution.  For a simple
45    % manual foo.texi, however, you can get away with this:
46    %   tex foo.texi
47    %   texindex foo.??
48    %   tex foo.texi
49    %   tex foo.texi
50    %   dvips foo.dvi -o  # or whatever; this makes foo.ps.
51    % The extra TeX runs get the cross-reference information correct.
52    % Sometimes one run after texindex suffices, and sometimes you need more
53    % than two; texi2dvi does it as many times as necessary.
54    %
55    % It is possible to adapt texinfo.tex for other languages, to some
56    % extent.  You can get the existing language-specific files from the
57    % full Texinfo distribution.
58    %
59    % The GNU Texinfo home page is http://www.gnu.org/software/texinfo.
60    
61  % This automatically updates the version number based on RCS.  
62  \def\deftexinfoversion$#1: #2 ${\def\texinfoversion{#2}}  \message{Loading texinfo [version \texinfoversion]:}
 \deftexinfoversion$Revision$  
 \message{Loading texinfo package [Version \texinfoversion]:}  
63    
64  % If in a .fmt file, print the version number  % If in a .fmt file, print the version number
65  % and turn on active characters that we couldn't do earlier because  % and turn on active characters that we couldn't do earlier because
66  % they might have appeared in the input file name.  % they might have appeared in the input file name.
67  \everyjob{\message{[Texinfo version \texinfoversion]}\message{}  \everyjob{\message{[Texinfo version \texinfoversion]}%
68    \catcode`+=\active \catcode`\_=\active}    \catcode`+=\active \catcode`\_=\active}
69    
70  % Save some parts of plain tex whose names we will redefine.  \message{Basics,}
71    \chardef\other=12
72    
73    % We never want plain's \outer definition of \+ in Texinfo.
74    % For @tex, we can use \tabalign.
75    \let\+ = \relax
76    
77    % Save some plain tex macros whose names we will redefine.
78  \let\ptexb=\b  \let\ptexb=\b
79  \let\ptexbullet=\bullet  \let\ptexbullet=\bullet
80  \let\ptexc=\c  \let\ptexc=\c
# Line 54  Line 82 
82  \let\ptexdot=\.  \let\ptexdot=\.
83  \let\ptexdots=\dots  \let\ptexdots=\dots
84  \let\ptexend=\end  \let\ptexend=\end
85  \let\ptexequiv = \equiv  \let\ptexequiv=\equiv
86    \let\ptexexclam=\!
87    \let\ptexfootnote=\footnote
88    \let\ptexgtr=>
89    \let\ptexhat=^
90  \let\ptexi=\i  \let\ptexi=\i
91    \let\ptexindent=\indent
92    \let\ptexnoindent=\noindent
93    \let\ptexinsert=\insert
94  \let\ptexlbrace=\{  \let\ptexlbrace=\{
95    \let\ptexless=<
96    \let\ptexplus=+
97  \let\ptexrbrace=\}  \let\ptexrbrace=\}
98    \let\ptexslash=\/
99  \let\ptexstar=\*  \let\ptexstar=\*
100  \let\ptext=\t  \let\ptext=\t
101    
 % 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\ }  
 }  
   
   
 \message{Basics,}  
 \chardef\other=12  
   
102  % If this character appears in an error message or help string, it  % If this character appears in an error message or help string, it
103  % starts a new line in the output.  % starts a new line in the output.
104  \newlinechar = `^^J  \newlinechar = `^^J
105    
106  % Set up fixed words for English.  % Use TeX 3.0's \inputlineno to get the line number, for better error
107  \ifx\putwordChapter\undefined{\gdef\putwordChapter{Chapter}}\fi%  % messages, but if we're using an old version of TeX, don't do anything.
108  \def\putwordInfo{Info}%  %
109  \ifx\putwordSee\undefined{\gdef\putwordSee{See}}\fi%  \ifx\inputlineno\thisisundefined
110  \ifx\putwordsee\undefined{\gdef\putwordsee{see}}\fi%    \let\linenumber = \empty % Pre-3.0.
111  \ifx\putwordfile\undefined{\gdef\putwordfile{file}}\fi%  \else
112  \ifx\putwordpage\undefined{\gdef\putwordpage{page}}\fi%    \def\linenumber{l.\the\inputlineno:\space}
113  \ifx\putwordsection\undefined{\gdef\putwordsection{section}}\fi%  \fi
114  \ifx\putwordSection\undefined{\gdef\putwordSection{Section}}\fi%  
115  \ifx\putwordTableofContents\undefined{\gdef\putwordTableofContents{Table of Contents}}\fi%  % Set up fixed words for English if not already set.
116  \ifx\putwordShortContents\undefined{\gdef\putwordShortContents{Short Contents}}\fi%  \ifx\putwordAppendix\undefined  \gdef\putwordAppendix{Appendix}\fi
117  \ifx\putwordAppendix\undefined{\gdef\putwordAppendix{Appendix}}\fi%  \ifx\putwordChapter\undefined   \gdef\putwordChapter{Chapter}\fi
118    \ifx\putwordfile\undefined      \gdef\putwordfile{file}\fi
119    \ifx\putwordin\undefined        \gdef\putwordin{in}\fi
120    \ifx\putwordIndexIsEmpty\undefined     \gdef\putwordIndexIsEmpty{(Index is empty)}\fi
121    \ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi
122    \ifx\putwordInfo\undefined      \gdef\putwordInfo{Info}\fi
123    \ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi
124    \ifx\putwordMethodon\undefined  \gdef\putwordMethodon{Method on}\fi
125    \ifx\putwordNoTitle\undefined   \gdef\putwordNoTitle{No Title}\fi
126    \ifx\putwordof\undefined        \gdef\putwordof{of}\fi
127    \ifx\putwordon\undefined        \gdef\putwordon{on}\fi
128    \ifx\putwordpage\undefined      \gdef\putwordpage{page}\fi
129    \ifx\putwordsection\undefined   \gdef\putwordsection{section}\fi
130    \ifx\putwordSection\undefined   \gdef\putwordSection{Section}\fi
131    \ifx\putwordsee\undefined       \gdef\putwordsee{see}\fi
132    \ifx\putwordSee\undefined       \gdef\putwordSee{See}\fi
133    \ifx\putwordShortTOC\undefined  \gdef\putwordShortTOC{Short Contents}\fi
134    \ifx\putwordTOC\undefined       \gdef\putwordTOC{Table of Contents}\fi
135    %
136    \ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi
137    \ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi
138    \ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi
139    \ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi
140    \ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi
141    \ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi
142    \ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi
143    \ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi
144    \ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi
145    \ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi
146    \ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi
147    \ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi
148    %
149    \ifx\putwordDefmac\undefined    \gdef\putwordDefmac{Macro}\fi
150    \ifx\putwordDefspec\undefined   \gdef\putwordDefspec{Special Form}\fi
151    \ifx\putwordDefvar\undefined    \gdef\putwordDefvar{Variable}\fi
152    \ifx\putwordDefopt\undefined    \gdef\putwordDefopt{User Option}\fi
153    \ifx\putwordDeffunc\undefined   \gdef\putwordDeffunc{Function}\fi
154    
155    % In some macros, we cannot use the `\? notation---the left quote is
156    % in some cases the escape char.
157    \chardef\colonChar = `\:
158    \chardef\commaChar = `\,
159    \chardef\dotChar   = `\.
160    \chardef\exclamChar= `\!
161    \chardef\questChar = `\?
162    \chardef\semiChar  = `\;
163    \chardef\underChar = `\_
164    
165    \chardef\spaceChar = `\ %
166    \chardef\spacecat = 10
167    \def\spaceisspace{\catcode\spaceChar=\spacecat}
168    
169  % Ignore a token.  % Ignore a token.
170  %  %
171  \def\gobble#1{}  \def\gobble#1{}
172    
173  \hyphenation{ap-pen-dix}  % The following is used inside several \edef's.
174  \hyphenation{mini-buf-fer mini-buf-fers}  \def\makecsname#1{\expandafter\noexpand\csname#1\endcsname}
175  \hyphenation{eshell}  
176    % Hyphenation fixes.
177    \hyphenation{
178      Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script
179      ap-pen-dix bit-map bit-maps
180      data-base data-bases eshell fall-ing half-way long-est man-u-script
181      man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm
182      par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces
183      spell-ing spell-ings
184      stand-alone strong-est time-stamp time-stamps which-ever white-space
185      wide-spread wrap-around
186    }
187    
188  % Margin to add to right of even pages, to left of odd pages.  % Margin to add to right of even pages, to left of odd pages.
189  \newdimen \bindingoffset  \newdimen\bindingoffset
190  \newdimen \normaloffset  \newdimen\normaloffset
191  \newdimen\pagewidth \newdimen\pageheight  \newdimen\pagewidth \newdimen\pageheight
192    
193    % For a final copy, take out the rectangles
194    % that mark overfull boxes (in case you have decided
195    % that the text looks ok even though it passes the margin).
196    %
197    \def\finalout{\overfullrule=0pt}
198    
199    % @| inserts a changebar to the left of the current line.  It should
200    % surround any changed text.  This approach does *not* work if the
201    % change spans more than two lines of output.  To handle that, we would
202    % have adopt a much more difficult approach (putting marks into the main
203    % vertical list for the beginning and end of each change).
204    %
205    \def\|{%
206      % \vadjust can only be used in horizontal mode.
207      \leavevmode
208      %
209      % Append this vertical mode material after the current line in the output.
210      \vadjust{%
211        % We want to insert a rule with the height and depth of the current
212        % leading; that is exactly what \strutbox is supposed to record.
213        \vskip-\baselineskip
214        %
215        % \vadjust-items are inserted at the left edge of the type.  So
216        % the \llap here moves out into the left-hand margin.
217        \llap{%
218          %
219          % For a thicker or thinner bar, change the `1pt'.
220          \vrule height\baselineskip width1pt
221          %
222          % This is the space between the bar and the text.
223          \hskip 12pt
224        }%
225      }%
226    }
227    
228  % Sometimes it is convenient to have everything in the transcript file  % Sometimes it is convenient to have everything in the transcript file
229  % and nothing on the terminal.  We don't just call \tracingall here,  % and nothing on the terminal.  We don't just call \tracingall here,
230  % since that produces some useless output on the terminal.  % since that produces some useless output on the terminal.  We also make
231    % some effort to order the tracing commands to reduce output in the log
232    % file; cf. trace.sty in LaTeX.
233  %  %
234  \def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%  \def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
235  \def\loggingall{\tracingcommands2 \tracingstats2  \def\loggingall{%
236     \tracingpages1 \tracingoutput1 \tracinglostchars1    \tracingstats2
237     \tracingmacros2 \tracingparagraphs1 \tracingrestores1    \tracingpages1
238     \showboxbreadth\maxdimen\showboxdepth\maxdimen    \tracinglostchars2  % 2 gives us more in etex
239      \tracingparagraphs1
240      \tracingoutput1
241      \tracingmacros2
242      \tracingrestores1
243      \showboxbreadth\maxdimen \showboxdepth\maxdimen
244      \ifx\eTeXversion\undefined\else % etex gives us more logging
245        \tracingscantokens1
246        \tracingifs1
247        \tracinggroups1
248        \tracingnesting2
249        \tracingassigns1
250      \fi
251      \tracingcommands3  % 3 gives us more in etex
252      \errorcontextlines16
253  }%  }%
254    
255    % add check for \lastpenalty to plain's definitions.  If the last thing
256    % we did was a \nobreak, we don't want to insert more space.
257    %
258    \def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount
259      \removelastskip\penalty-50\smallskip\fi\fi}
260    \def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount
261      \removelastskip\penalty-100\medskip\fi\fi}
262    \def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount
263      \removelastskip\penalty-200\bigskip\fi\fi}
264    
265  % For @cropmarks command.  % For @cropmarks command.
266  % Do @cropmarks to get crop marks.  % Do @cropmarks to get crop marks.
267  %  %
268  \newif\ifcropmarks  \newif\ifcropmarks
269  \let\cropmarks = \cropmarkstrue  \let\cropmarks = \cropmarkstrue
270  %  %
271  % Dimensions to add cropmarks at corners.  % Dimensions to add cropmarks at corners.
272  % Added by P. A. MacKay, 12 Nov. 1986  % Added by P. A. MacKay, 12 Nov. 1986
273  %  %
274  \newdimen\cornerlong \newdimen\cornerthick  \newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
275  \newdimen\topandbottommargin  \newdimen\cornerlong  \cornerlong=1pc
276  \newdimen\outerhsize \newdimen\outervsize  \newdimen\cornerthick \cornerthick=.3pt
277  \cornerlong=1pc\cornerthick=.3pt        % These set size of cropmarks  \newdimen\topandbottommargin \topandbottommargin=.75in
 \outerhsize=7in  
 %\outervsize=9.5in  
 % Alternative @smallbook page size is 9.25in  
 \outervsize=9.25in  
 \topandbottommargin=.75in  
278    
279  % Main output routine.  % Main output routine.
280  \chardef\PAGE = 255  \chardef\PAGE = 255
# Line 167  Line 306 
306      \normalturnoffactive  % \ in index entries must not stay \, e.g., if      \normalturnoffactive  % \ in index entries must not stay \, e.g., if
307                     % the page break happens to be in the middle of an example.                     % the page break happens to be in the middle of an example.
308      \shipout\vbox{%      \shipout\vbox{%
309          % Do this early so pdf references go to the beginning of the page.
310          \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi
311          %
312        \ifcropmarks \vbox to \outervsize\bgroup        \ifcropmarks \vbox to \outervsize\bgroup
313          \hsize = \outerhsize          \hsize = \outerhsize
314          \line{\ewtop\hfil\ewtop}%          \vskip-\topandbottommargin
315          \nointerlineskip          \vtop to0pt{%
316          \line{%            \line{\ewtop\hfil\ewtop}%
317            \vbox{\moveleft\cornerthick\nstop}%            \nointerlineskip
318            \hfill            \line{%
319            \vbox{\moveright\cornerthick\nstop}%              \vbox{\moveleft\cornerthick\nstop}%
320          }%              \hfill
321                \vbox{\moveright\cornerthick\nstop}%
322              }%
323              \vss}%
324          \vskip\topandbottommargin          \vskip\topandbottommargin
325          \line\bgroup          \line\bgroup
326            \hfil % center the page within the outer (page) hsize.            \hfil % center the page within the outer (page) hsize.
# Line 185  Line 330 
330        %        %
331        \unvbox\headlinebox        \unvbox\headlinebox
332        \pagebody{#1}%        \pagebody{#1}%
333        \unvbox\footlinebox        \ifdim\ht\footlinebox > 0pt
334            % Only leave this space if the footline is nonempty.
335            % (We lessened \vsize for it in \oddfootingxxx.)
336            % The \baselineskip=24pt in plain's \makefootline has no effect.
337            \vskip 2\baselineskip
338            \unvbox\footlinebox
339          \fi
340        %        %
341        \ifcropmarks        \ifcropmarks
342            \egroup % end of \vbox\bgroup            \egroup % end of \vbox\bgroup
343          \hfil\egroup % end of (centering) \line\bgroup          \hfil\egroup % end of (centering) \line\bgroup
344          \vskip\topandbottommargin plus1fill minus1fill          \vskip\topandbottommargin plus1fill minus1fill
345          \boxmaxdepth = \cornerthick          \boxmaxdepth = \cornerthick
346          \line{%          \vbox to0pt{\vss
347            \vbox{\moveleft\cornerthick\nsbot}%            \line{%
348            \hfill              \vbox{\moveleft\cornerthick\nsbot}%
349            \vbox{\moveright\cornerthick\nsbot}%              \hfill
350                \vbox{\moveright\cornerthick\nsbot}%
351              }%
352              \nointerlineskip
353              \line{\ewbot\hfil\ewbot}%
354          }%          }%
         \nointerlineskip  
         \line{\ewbot\hfil\ewbot}%  
355        \egroup % \vbox from first cropmarks clause        \egroup % \vbox from first cropmarks clause
356        \fi        \fi
357      }% end of \shipout\vbox      }% end of \shipout\vbox
358    }% end of group with \turnoffactive    }% end of group with \normalturnoffactive
359    \advancepageno    \advancepageno
360    \ifnum\outputpenalty>-20000 \else\dosupereject\fi    \ifnum\outputpenalty>-20000 \else\dosupereject\fi
361  }  }
# Line 235  Line 388 
388  % the input line (except we remove a trailing comment).  #1 should be a  % the input line (except we remove a trailing comment).  #1 should be a
389  % macro which expects an ordinary undelimited TeX argument.  % macro which expects an ordinary undelimited TeX argument.
390  %  %
391  \def\parsearg#1{%  \def\parsearg{\parseargusing{}}
392    \let\next = #1%  \def\parseargusing#1#2{%
393      \def\next{#2}%
394    \begingroup    \begingroup
395      \obeylines      \obeylines
396      \futurelet\temp\parseargx      \spaceisspace
397  }      #1%
398        \parseargline\empty% Insert the \empty token, see \finishparsearg below.
 % If the next token is an obeyed space (from an @example environment or  
 % the like), remove it and recurse.  Otherwise, we're done.  
 \def\parseargx{%  
   % \obeyedspace is defined far below, after the definition of \sepspaces.  
   \ifx\obeyedspace\temp  
     \expandafter\parseargdiscardspace  
   \else  
     \expandafter\parseargline  
   \fi  
399  }  }
400    
 % Remove a single space (as the delimiter token to the macro call).  
 {\obeyspaces %  
  \gdef\parseargdiscardspace {\futurelet\temp\parseargx}}  
   
401  {\obeylines %  {\obeylines %
402    \gdef\parseargline#1^^M{%    \gdef\parseargline#1^^M{%
403      \endgroup % End of the group started in \parsearg.      \endgroup % End of the group started in \parsearg.
404      %      \argremovecomment #1\comment\ArgTerm%
     % First remove any @c comment, then any @comment.  
     % Result of each macro is put in \toks0.  
     \argremovec #1\c\relax %  
     \expandafter\argremovecomment \the\toks0 \comment\relax %  
     %  
     % Call the caller's macro, saved as \next in \parsearg.  
     \expandafter\next\expandafter{\the\toks0}%  
405    }%    }%
406  }  }
407    
408  % Since all \c{,omment} does is throw away the argument, we can let TeX  % First remove any @comment, then any @c comment.
409  % do that for us.  The \relax here is matched by the \relax in the call  \def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm}
410  % in \parseargline; it could be more or less anything, its purpose is  \def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm}
 % just to delimit the argument to the \c.  
 \def\argremovec#1\c#2\relax{\toks0 = {#1}}  
 \def\argremovecomment#1\comment#2\relax{\toks0 = {#1}}  
411    
412  % \argremovec{,omment} might leave us with trailing spaces, though; e.g.,  % Each occurence of `\^^M' or `<space>\^^M' is replaced by a single space.
413    %
414    % \argremovec might leave us with trailing space, e.g.,
415  %    @end itemize  @c foo  %    @end itemize  @c foo
416  % will have two active spaces as part of the argument with the  % This space token undergoes the same procedure and is eventually removed
417  % `itemize'.  Here we remove all active spaces from #1, and assign the  % by \finishparsearg.
 % result to \toks0.  
 %  
 % This loses if there are any *other* active characters besides spaces  
 % in the argument -- _ ^ +, for example -- since they get expanded.  
 % Fortunately, Texinfo does not define any such commands.  (If it ever  
 % does, the catcode of the characters in questionwill have to be changed  
 % here.)  But this means we cannot call \removeactivespaces as part of  
 % \argremovec{,omment}, since @c uses \parsearg, and thus the argument  
 % that \parsearg gets might well have any character at all in it.  
418  %  %
419  \def\removeactivespaces#1{%  \def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M}
420    \begingroup  \def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M}
421      \ignoreactivespaces  \def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{%
422      \edef\temp{#1}%    \def\temp{#3}%
423      \global\toks0 = \expandafter{\temp}%    \ifx\temp\empty
424    \endgroup      % We cannot use \next here, as it holds the macro to run;
425        % thus we reuse \temp.
426        \let\temp\finishparsearg
427      \else
428        \let\temp\argcheckspaces
429      \fi
430      % Put the space token in:
431      \temp#1 #3\ArgTerm
432  }  }
433    
434  % Change the active space to expand to nothing.  % If a _delimited_ argument is enclosed in braces, they get stripped; so
435    % to get _exactly_ the rest of the line, we had to prevent such situation.
436    % We prepended an \empty token at the very beginning and we expand it now,
437    % just before passing the control to \next.
438    % (Similarily, we have to think about #3 of \argcheckspacesY above: it is
439    % either the null string, or it ends with \^^M---thus there is no danger
440    % that a pair of braces would be stripped.
441  %  %
442  \begingroup  % But first, we have to remove the trailing space token.
443    %
444    \def\finishparsearg#1 \ArgTerm{\expandafter\next\expandafter{#1}}
445    
446    % \parseargdef\foo{...}
447    %       is roughly equivalent to
448    % \def\foo{\parsearg\Xfoo}
449    % \def\Xfoo#1{...}
450    %
451    % Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my
452    % favourite TeX trick.  --kasal, 16nov03
453    
454    \def\parseargdef#1{%
455      \expandafter \doparseargdef \csname\string#1\endcsname #1%
456    }
457    \def\doparseargdef#1#2{%
458      \def#2{\parsearg#1}%
459      \def#1##1%
460    }
461    
462    % Several utility definitions with active space:
463    {
464    \obeyspaces    \obeyspaces
465    \gdef\ignoreactivespaces{\obeyspaces\let =\empty}    \gdef\obeyedspace{ }
466  \endgroup  
467      % Make each space character in the input produce a normal interword
468      % space in the output.  Don't allow a line break at this space, as this
469      % is used only in environments like @example, where each line of input
470      % should produce a line of output anyway.
471      %
472      \gdef\sepspaces{\obeyspaces\let =\tie}
473    
474      % If an index command is used in an @example environment, any spaces
475      % therein should become regular spaces in the raw index file, not the
476      % expansion of \tie (\leavevmode \penalty \@M \ ).
477      \gdef\unsepspaces{\let =\space}
478    }
479    
480    
481  \def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}  \def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
482    
483  %% These are used to keep @begin/@end levels from running away  % Define the framework for environments in texinfo.tex.  It's used like this:
484  %% Call \inENV within environments (after a \begingroup)  %
485  \newif\ifENV \ENVfalse \def\inENV{\ifENV\relax\else\ENVtrue\fi}  %   \envdef\foo{...}
486  \def\ENVcheck{%  %   \def\Efoo{...}
487  \ifENV\errmessage{Still within an environment.  Type Return to continue.}  %  
488  \endgroup\fi} % This is not perfect, but it should reduce lossage  % It's the responsibility of \envdef to insert \begingroup before the
489    % actual body; @end closes the group after calling \Efoo.  \envdef also
490  % @begin foo  is the same as @foo, for now.  % defines \thisenv, so the current environment is known; @end checks
491  \newhelp\EMsimple{Type <Return> to continue.}  % whether the environment name matches.  The \checkenv macro can also be
492    % used to check whether the current environment is the one expected.
493  \outer\def\begin{\parsearg\beginxxx}  %
494    % Non-false conditionals (@iftex, @ifset) don't fit into this, so they
495  \def\beginxxx #1{%  % are not treated as enviroments; they don't open a group.  (The
496  \expandafter\ifx\csname #1\endcsname\relax  % implementation of @end takes care not to call \endgroup in this
497  {\errhelp=\EMsimple \errmessage{Undefined command @begin #1}}\else  % special case.)
498  \csname #1\endcsname\fi}  
499    
500    % At runtime, environments start with this:
501    \def\startenvironment#1{\begingroup\def\thisenv{#1}}
502    % initialize
503    \let\thisenv\empty
504    
505    % ... but they get defined via ``\envdef\foo{...}'':
506    \long\def\envdef#1#2{\def#1{\startenvironment#1#2}}
507    \def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}}
508    
509  % @end foo executes the definition of \Efoo.  % Check whether we're in the right environment:
510  %  \def\checkenv#1{%
511  \def\end{\parsearg\endxxx}    \def\temp{#1}%
512  \def\endxxx #1{%    \ifx\thisenv\temp
   \removeactivespaces{#1}%  
   \edef\endthing{\the\toks0}%  
   %  
   \expandafter\ifx\csname E\endthing\endcsname\relax  
     \expandafter\ifx\csname \endthing\endcsname\relax  
       % There's no \foo, i.e., no ``environment'' foo.  
       \errhelp = \EMsimple  
       \errmessage{Undefined command `@end \endthing'}%  
     \else  
       \unmatchedenderror\endthing  
     \fi  
513    \else    \else
514      % Everything's ok; the right environment has been started.      \badenverr
     \csname E\endthing\endcsname  
515    \fi    \fi
516  }  }
517    
518  % There is an environment #1, but it hasn't been started.  Give an error.  % Evironment mismatch, #1 expected:
519  %  \def\badenverr{%
 \def\unmatchedenderror#1{%  
520    \errhelp = \EMsimple    \errhelp = \EMsimple
521    \errmessage{This `@end #1' doesn't have a matching `@#1'}%    \errmessage{This command can appear only \inenvironment\temp,
522        not \inenvironment\thisenv}%
523    }
524    \def\inenvironment#1{%
525      \ifx#1\empty
526        out of any environment%
527      \else
528        in environment \expandafter\string#1%
529      \fi
530  }  }
531    
532  % Define the control sequence \E#1 to give an unmatched @end error.  % @end foo executes the definition of \Efoo.
533    % But first, it executes a specialized version of \checkenv
534  %  %
535  \def\defineunmatchedend#1{%  \parseargdef\end{%
536    \expandafter\def\csname E#1\endcsname{\unmatchedenderror{#1}}%    \if 1\csname iscond.#1\endcsname
537      \else
538        % The general wording of \badenverr may not be ideal, but... --kasal, 06nov03
539        \expandafter\checkenv\csname#1\endcsname
540        \csname E#1\endcsname
541        \endgroup
542      \fi
543  }  }
544    
545    \newhelp\EMsimple{Press RETURN to continue.}
546    
 % Single-spacing is done by various environments (specifically, in  
 % \nonfillstart and \quotations).  
 \newskip\singlespaceskip \singlespaceskip = 12.5pt  
 \def\singlespace{%  
   % Why was this kern here?  It messes up equalizing space above and below  
   % environments.  --karl, 6may93  
   %{\advance \baselineskip by -\singlespaceskip  
   %\kern \baselineskip}%  
   \setleading \singlespaceskip  
 }  
547    
548  %% Simple single-character @ commands  %% Simple single-character @ commands
549    
550  % @@ prints an @  % @@ prints an @
551  % Kludge this until the fonts are right (grr).  % Kludge this until the fonts are right (grr).
552  \def\@{{\tt \char '100}}  \def\@{{\tt\char64}}
553    
554  % This is turned off because it was never documented  % This is turned off because it was never documented
555  % and you can use @w{...} around a quote to suppress ligatures.  % and you can use @w{...} around a quote to suppress ligatures.
# Line 387  Line 559 
559  %\def\'{{'}}  %\def\'{{'}}
560    
561  % Used to generate quoted braces.  % Used to generate quoted braces.
562  \def\mylbrace {{\tt \char '173}}  \def\mylbrace {{\tt\char123}}
563  \def\myrbrace {{\tt \char '175}}  \def\myrbrace {{\tt\char125}}
564  \let\{=\mylbrace  \let\{=\mylbrace
565  \let\}=\myrbrace  \let\}=\myrbrace
566  \begingroup  \begingroup
567    % Definitions to produce actual \{ & \} command in an index.    % Definitions to produce \{ and \} commands for indices,
568    \catcode`\{ = 12 \catcode`\} = 12    % and @{ and @} for the aux file.
569      \catcode`\{ = \other \catcode`\} = \other
570    \catcode`\[ = 1 \catcode`\] = 2    \catcode`\[ = 1 \catcode`\] = 2
571    \catcode`\@ = 0 \catcode`\\ = 12    \catcode`\! = 0 \catcode`\\ = \other
572    @gdef@lbracecmd[\{]%    !gdef!lbracecmd[\{]%
573    @gdef@rbracecmd[\}]%    !gdef!rbracecmd[\}]%
574  @endgroup    !gdef!lbraceatcmd[@{]%
575      !gdef!rbraceatcmd[@}]%
576    !endgroup
577    
578    % @comma{} to avoid , parsing problems.
579    \let\comma = ,
580    
581  % Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent  % Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
582  % Others are defined by plain TeX: @` @' @" @^ @~ @= @v @H.  % Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
583  \let\, = \c  \let\, = \c
584  \let\dotaccent = \.  \let\dotaccent = \.
585  \def\ringaccent#1{{\accent23 #1}}  \def\ringaccent#1{{\accent23 #1}}
# Line 409  Line 587 
587  \let\ubaraccent = \b  \let\ubaraccent = \b
588  \let\udotaccent = \d  \let\udotaccent = \d
589    
590  % Other special characters: @questiondown @exclamdown  % Other special characters: @questiondown @exclamdown @ordf @ordm
591  % Plain TeX defines: @AA @AE @O @OE @L (and lowercase versions) @ss.  % Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
592  \def\questiondown{?`}  \def\questiondown{?`}
593  \def\exclamdown{!`}  \def\exclamdown{!`}
594    \def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}}
595    \def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}}
596    
597  % Dotless i and dotless j, used for accents.  % Dotless i and dotless j, used for accents.
598  \def\imacro{i}  \def\imacro{i}
# Line 425  Line 605 
605    \fi\fi    \fi\fi
606  }  }
607    
608    % The \TeX{} logo, as in plain, but resetting the spacing so that a
609    % period following counts as ending a sentence.  (Idea found in latex.)
610    %
611    \edef\TeX{\TeX \spacefactor=3000 }
612    
613    % @LaTeX{} logo.  Not quite the same results as the definition in
614    % latex.ltx, since we use a different font for the raised A; it's most
615    % convenient for us to use an explicitly smaller font, rather than using
616    % the \scriptstyle font (since we don't reset \scriptstyle and
617    % \scriptscriptstyle).
618    %
619    \def\LaTeX{%
620      L\kern-.36em
621      {\setbox0=\hbox{T}%
622       \vbox to \ht0{\hbox{\selectfonts\lllsize A}\vss}}%
623      \kern-.15em
624      \TeX
625    }
626    
627    % Be sure we're in horizontal mode when doing a tie, since we make space
628    % equivalent to this in @example-like environments. Otherwise, a space
629    % at the beginning of a line will start with \penalty -- and
630    % since \penalty is valid in vertical mode, we'd end up putting the
631    % penalty on the vertical list instead of in the new paragraph.
632    {\catcode`@ = 11
633     % Avoid using \@M directly, because that causes trouble
634     % if the definition is written into an index file.
635     \global\let\tiepenalty = \@M
636     \gdef\tie{\leavevmode\penalty\tiepenalty\ }
637    }
638    
639  % @: forces normal size whitespace following.  % @: forces normal size whitespace following.
640  \def\:{\spacefactor=1000 }  \def\:{\spacefactor=1000 }
641    
642  % @* forces a line break.  % @* forces a line break.
643  \def\*{\hfil\break\hbox{}\ignorespaces}  \def\*{\hfil\break\hbox{}\ignorespaces}
644    
645    % @/ allows a line break.
646    \let\/=\allowbreak
647    
648  % @. is an end-of-sentence period.  % @. is an end-of-sentence period.
649  \def\.{.\spacefactor=3000 }  \def\.{.\spacefactor=3000 }
650    
 % @enddots{} is an end-of-sentence ellipsis.  
 \gdef\enddots{$\mathinner{\ldotp\ldotp\ldotp\ldotp}$\spacefactor=3000}  
   
651  % @! is an end-of-sentence bang.  % @! is an end-of-sentence bang.
652  \gdef\!{!\spacefactor=3000 }  \def\!{!\spacefactor=3000 }
653    
654  % @? is an end-of-sentence query.  % @? is an end-of-sentence query.
655  \gdef\?{?\spacefactor=3000 }  \def\?{?\spacefactor=3000 }
656    
657  % @w prevents a word break.  Without the \leavevmode, @w at the  % @w prevents a word break.  Without the \leavevmode, @w at the
658  % beginning of a paragraph, when TeX is still in vertical mode, would  % beginning of a paragraph, when TeX is still in vertical mode, would
# Line 456  Line 667 
667  % therefore, no glue is inserted, and the space between the headline and  % therefore, no glue is inserted, and the space between the headline and
668  % the text is small, which looks bad.  % the text is small, which looks bad.
669  %  %
670  \def\group{\begingroup  % Another complication is that the group might be very large.  This can
671    \ifnum\catcode13=\active \else  % cause the glue on the previous page to be unduly stretched, because it
672    % does not have much material.  In this case, it's better to add an
673    % explicit \vfill so that the extra space is at the bottom.  The
674    % threshold for doing this is if the group is more than \vfilllimit
675    % percent of a page (\vfilllimit can be changed inside of @tex).
676    %
677    \newbox\groupbox
678    \def\vfilllimit{0.7}
679    %
680    \envdef\group{%
681      \ifnum\catcode`\^^M=\active \else
682      \errhelp = \groupinvalidhelp      \errhelp = \groupinvalidhelp
683      \errmessage{@group invalid in context where filling is enabled}%      \errmessage{@group invalid in context where filling is enabled}%
684    \fi    \fi
685      \startsavinginserts
686    %    %
687    % The \vtop we start below produces a box with normal height and large    \setbox\groupbox = \vtop\bgroup
   % depth; thus, TeX puts \baselineskip glue before it, and (when the  
   % next line of text is done) \lineskip glue after it.  (See p.82 of  
   % the TeXbook.)  Thus, space below is not quite equal to space  
   % above.  But it's pretty close.  
   \def\Egroup{%  
     \egroup           % End the \vtop.  
     \endgroup         % End the \group.  
   }%  
   %  
   \vtop\bgroup  
     % We have to put a strut on the last line in case the @group is in  
     % the midst of an example, rather than completely enclosing it.  
     % Otherwise, the interline space between the last line of the group  
     % and the first line afterwards is too small.  But we can't put the  
     % strut in \Egroup, since there it would be on a line by itself.  
     % Hence this just inserts a strut at the beginning of each line.  
     \everypar = {\strut}%  
     %  
     % Since we have a strut on every line, we don't need any of TeX's  
     % normal interline spacing.  
     \offinterlineskip  
     %  
     % OK, but now we have to do something about blank  
     % lines in the input in @example-like environments, which normally  
     % just turn into \lisppar, which will insert no space now that we've  
     % turned off the interline space.  Simplest is to make them be an  
     % empty paragraph.  
     \ifx\par\lisppar  
       \edef\par{\leavevmode \par}%  
       %  
       % Reset ^^M's definition to new definition of \par.  
       \obeylines  
     \fi  
     %  
688      % Do @comment since we are called inside an environment such as      % Do @comment since we are called inside an environment such as
689      % @example, where each end-of-line in the input causes an      % @example, where each end-of-line in the input causes an
690      % end-of-line in the output.  We don't want the end-of-line after      % end-of-line in the output.  We don't want the end-of-line after
# Line 506  Line 694 
694      \comment      \comment
695  }  }
696  %  %
697    % The \vtop produces a box with normal height and large depth; thus, TeX puts
698    % \baselineskip glue before it, and (when the next line of text is done)
699    % \lineskip glue after it.  Thus, space below is not quite equal to space
700    % above.  But it's pretty close.
701    \def\Egroup{%
702        % To get correct interline space between the last line of the group
703        % and the first line afterwards, we have to propagate \prevdepth.
704        \endgraf % Not \par, as it may have been set to \lisppar.
705        \global\dimen1 = \prevdepth
706      \egroup           % End the \vtop.
707      % \dimen0 is the vertical size of the group's box.
708      \dimen0 = \ht\groupbox  \advance\dimen0 by \dp\groupbox
709      % \dimen2 is how much space is left on the page (more or less).
710      \dimen2 = \pageheight   \advance\dimen2 by -\pagetotal
711      % if the group doesn't fit on the current page, and it's a big big
712      % group, force a page break.
713      \ifdim \dimen0 > \dimen2
714        \ifdim \pagetotal < \vfilllimit\pageheight
715          \page
716        \fi
717      \fi
718      \box\groupbox
719      \prevdepth = \dimen1
720      \checkinserts
721    }
722    %
723  % TeX puts in an \escapechar (i.e., `@') at the beginning of the help  % TeX puts in an \escapechar (i.e., `@') at the beginning of the help
724  % message, so this ends up printing `@group can only ...'.  % message, so this ends up printing `@group can only ...'.
725  %  %
# Line 518  where each line of input produces a line Line 732  where each line of input produces a line
732    
733  \newdimen\mil  \mil=0.001in  \newdimen\mil  \mil=0.001in
734    
 \def\need{\parsearg\needx}  
   
735  % Old definition--didn't work.  % Old definition--didn't work.
736  %\def\needx #1{\par %  %\parseargdef\need{\par %
737  %% This method tries to make TeX break the page naturally  %% This method tries to make TeX break the page naturally
738  %% if the depth of the box does not fit.  %% if the depth of the box does not fit.
739  %{\baselineskip=0pt%  %{\baselineskip=0pt%
740  %\vtop to #1\mil{\vfil}\kern -#1\mil\penalty 10000  %\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak
741  %\prevdepth=-1000pt  %\prevdepth=-1000pt
742  %}}  %}}
743    
744  \def\needx#1{%  \parseargdef\need{%
745    % 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
746    % paragraph.    % paragraph.
747    \par    \par
748    %    %
749    % Don't add any leading before our big empty box, but allow a page    % If the @need value is less than one line space, it's useless.
750    % break, since the best break might be right here.    \dimen0 = #1\mil
751    \allowbreak    \dimen2 = \ht\strutbox
752    \nointerlineskip    \advance\dimen2 by \dp\strutbox
753    \vtop to #1\mil{\vfil}%    \ifdim\dimen0 > \dimen2
754    %      %
755    % TeX does not even consider page breaks if a penalty added to the      % Do a \strut just to make the height of this box be normal, so the
756    % main vertical list is 10000 or more.  But in order to see if the      % normal leading is inserted relative to the preceding line.
757    % empty box we just added fits on the page, we must make it consider      % And a page break here is fine.
758    % page breaks.  On the other hand, we don't want to actually break the      \vtop to #1\mil{\strut\vfil}%
759    % page after the empty box.  So we use a penalty of 9999.      %
760    %      % TeX does not even consider page breaks if a penalty added to the
761    % There is an extremely small chance that TeX will actually break the      % main vertical list is 10000 or more.  But in order to see if the
762    % page at this \penalty, if there are no other feasible breakpoints in      % empty box we just added fits on the page, we must make it consider
763    % sight.  (If the user is using lots of big @group commands, which      % page breaks.  On the other hand, we don't want to actually break the
764    % almost-but-not-quite fill up a page, TeX will have a hard time doing      % page after the empty box.  So we use a penalty of 9999.
765    % good page breaking, for example.)  However, I could not construct an      %
766    % example where a page broke at this \penalty; if it happens in a real      % There is an extremely small chance that TeX will actually break the
767    % document, then we can reconsider our strategy.      % page at this \penalty, if there are no other feasible breakpoints in
768    \penalty9999      % sight.  (If the user is using lots of big @group commands, which
769    %      % almost-but-not-quite fill up a page, TeX will have a hard time doing
770    % Back up by the size of the box, whether we did a page break or not.      % good page breaking, for example.)  However, I could not construct an
771    \kern -#1\mil      % example where a page broke at this \penalty; if it happens in a real
772    %      % document, then we can reconsider our strategy.
773    % Do not allow a page break right after this kern.      \penalty9999
774    \nobreak      %
775        % Back up by the size of the box, whether we did a page break or not.
776        \kern -#1\mil
777        %
778        % Do not allow a page break right after this kern.
779        \nobreak
780      \fi
781  }  }
782    
783  % @br   forces paragraph break  % @br   forces paragraph break (and is undocumented).
784    
785  \let\br = \par  \let\br = \par
786    
787  % @dots{}  output some dots  % @page forces the start of a new page.
788    %
 \def\dots{$\ldots$}  
   
 % @page    forces the start of a new page  
   
789  \def\page{\par\vfill\supereject}  \def\page{\par\vfill\supereject}
790    
791  % @exdent text....  % @exdent text....
# Line 582  where each line of input produces a line Line 796  where each line of input produces a line
796  \newskip\exdentamount  \newskip\exdentamount
797    
798  % This defn is used inside fill environments such as @defun.  % This defn is used inside fill environments such as @defun.
799  \def\exdent{\parsearg\exdentyyy}  \parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}
 \def\exdentyyy #1{{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}}  
800    
801  % This defn is used inside nofill environments such as @example.  % This defn is used inside nofill environments such as @example.
802  \def\nofillexdent{\parsearg\nofillexdentyyy}  \parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount
803  \def\nofillexdentyyy #1{{\advance \leftskip by -\exdentamount    \leftline{\hskip\leftskip{\rm#1}}}}
804  \leftline{\hskip\leftskip{\rm#1}}}}  
805    % @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
806  % @inmargin{TEXT} puts TEXT in the margin next to the current paragraph.  % paragraph.  For more general purposes, use the \margin insertion
807    % class.  WHICH is `l' or `r'.
808  \def\inmargin#1{%  %
 \strut\vadjust{\nobreak\kern-\strutdepth  
   \vtop to \strutdepth{\baselineskip\strutdepth\vss  
   \llap{\rightskip=\inmarginspacing \vbox{\noindent #1}}\null}}}  
809  \newskip\inmarginspacing \inmarginspacing=1cm  \newskip\inmarginspacing \inmarginspacing=1cm
810  \def\strutdepth{\dp\strutbox}  \def\strutdepth{\dp\strutbox}
811    %
812  %\hbox{{\rm#1}}\hfil\break}}  \def\doinmargin#1#2{\strut\vadjust{%
813      \nobreak
814      \kern-\strutdepth
815      \vtop to \strutdepth{%
816        \baselineskip=\strutdepth
817        \vss
818        % if you have multiple lines of stuff to put here, you'll need to
819        % make the vbox yourself of the appropriate size.
820        \ifx#1l%
821          \llap{\ignorespaces #2\hskip\inmarginspacing}%
822        \else
823          \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}%
824        \fi
825        \null
826      }%
827    }}
828    \def\inleftmargin{\doinmargin l}
829    \def\inrightmargin{\doinmargin r}
830    %
831    % @inmargin{TEXT [, RIGHT-TEXT]}
832    % (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right;
833    % else use TEXT for both).
834    %
835    \def\inmargin#1{\parseinmargin #1,,\finish}
836    \def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing.
837      \setbox0 = \hbox{\ignorespaces #2}%
838      \ifdim\wd0 > 0pt
839        \def\lefttext{#1}%  have both texts
840        \def\righttext{#2}%
841      \else
842        \def\lefttext{#1}%  have only one text
843        \def\righttext{#1}%
844      \fi
845      %
846      \ifodd\pageno
847        \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin
848      \else
849        \def\temp{\inleftmargin\lefttext}%
850      \fi
851      \temp
852    }
853    
854  % @include file    insert text of that file as input.  % @include file    insert text of that file as input.
855  % Allow normal characters that  we make active in the argument (a file name).  %
856  \def\include{\begingroup  \def\include{\parseargusing\filenamecatcodes\includezzz}
857    \catcode`\\=12  \def\includezzz#1{%
858    \catcode`~=12    \pushthisfilestack
   \catcode`^=12  
   \catcode`_=12  
   \catcode`|=12  
   \catcode`<=12  
   \catcode`>=12  
   \catcode`+=12  
   \parsearg\includezzz}  
 % Restore active chars for included file.  
 \def\includezzz#1{\endgroup\begingroup  
   % Read the included file in a group so nested @include's work.  
859    \def\thisfile{#1}%    \def\thisfile{#1}%
860    \input\thisfile    {%
861  \endgroup}      \makevalueexpandable
862        \def\temp{\input #1 }%
863        \expandafter
864      }\temp
865      \popthisfilestack
866    }
867    \def\filenamecatcodes{%
868      \catcode`\\=\other
869      \catcode`~=\other
870      \catcode`^=\other
871      \catcode`_=\other
872      \catcode`|=\other
873      \catcode`<=\other
874      \catcode`>=\other
875      \catcode`+=\other
876      \catcode`-=\other
877    }
878    
879  \def\thisfile{}  \def\pushthisfilestack{%
880      \expandafter\pushthisfilestackX\popthisfilestack\StackTerm
881    }
882    \def\pushthisfilestackX{%
883      \expandafter\pushthisfilestackY\thisfile\StackTerm
884    }
885    \def\pushthisfilestackY #1\StackTerm #2\StackTerm {%
886      \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}%
887    }
888    
889    \def\popthisfilestack{\errthisfilestackempty}
890    \def\errthisfilestackempty{\errmessage{Internal error:
891      the stack of filenames is empty.}}
892    
893  % @center line   outputs that line, centered  \def\thisfile{}
894    
895  \def\center{\parsearg\centerzzz}  % @center line
896  \def\centerzzz #1{{\advance\hsize by -\leftskip  % outputs that line, centered.
897  \advance\hsize by -\rightskip  %
898  \centerline{#1}}}  \parseargdef\center{%
899      \ifhmode
900        \let\next\centerH
901      \else
902        \let\next\centerV
903      \fi
904      \next{\hfil \ignorespaces#1\unskip \hfil}%
905    }
906    \def\centerH#1{%
907      {%
908        \hfil\break
909        \advance\hsize by -\leftskip
910        \advance\hsize by -\rightskip
911        \line{#1}%
912        \break
913      }%
914    }
915    \def\centerV#1{\line{\kern\leftskip #1\kern\rightskip}}
916    
917  % @sp n   outputs n lines of vertical space  % @sp n   outputs n lines of vertical space
918    
919  \def\sp{\parsearg\spxxx}  \parseargdef\sp{\vskip #1\baselineskip}
 \def\spxxx #1{\vskip #1\baselineskip}  
920    
921  % @comment ...line which is ignored...  % @comment ...line which is ignored...
922  % @c is the same as @comment  % @c is the same as @comment
923  % @ignore ... @end ignore  is another way to write a comment  % @ignore ... @end ignore  is another way to write a comment
924    
925  \def\comment{\catcode 64=\other \catcode 123=\other \catcode 125=\other%  \def\comment{\begingroup \catcode`\^^M=\other%
926  \parsearg \commentxxx}  \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
927    \commentxxx}
928  \def\commentxxx #1{\catcode 64=0 \catcode 123=1 \catcode 125=2 }  {\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}}
929    
930  \let\c=\comment  \let\c=\comment
931    
932  % @paragraphindent  is defined for the Info formatting commands only.  % @paragraphindent NCHARS
933  \let\paragraphindent=\comment  % We'll use ems for NCHARS, close enough.
934    % NCHARS can also be the word `asis' or `none'.
935  % Prevent errors for section commands.  % We cannot feasibly implement @paragraphindent asis, though.
 % 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\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.  
936  %  %
937  \def\ignore{\doignore{ignore}}  \def\asisword{asis} % no translation, these are keywords
938    \def\noneword{none}
 % Also ignore @ifinfo, @ifhtml, @html, @menu, and @direntry text.  
939  %  %
940  \def\ifinfo{\doignore{ifinfo}}  \parseargdef\paragraphindent{%
941  \def\ifhtml{\doignore{ifhtml}}    \def\temp{#1}%
942  \def\html{\doignore{html}}    \ifx\temp\asisword
 \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  
   
   
 % @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'.  
   \long\def\doignoretext##1\end #1{\enddoignore}%  
   %  
   % Make sure that spaces turn into tokens that match what \doignoretext wants.  
   \catcode32 = 10  
   %  
   % 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.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  
     \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\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''\}}%  
943    \else    \else
944      \csname SET#1\endcsname      \ifx\temp\noneword
945          \defaultparindent = 0pt
946        \else
947          \defaultparindent = #1em
948        \fi
949    \fi    \fi
950  \endgroup}    \parindent = \defaultparindent
951    }
952    
953  % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined  % @exampleindent NCHARS
954  % with @set.  % We'll use ems for NCHARS like @paragraphindent.
955  %  % It seems @exampleindent asis isn't necessary, but
956  \def\ifset{\parsearg\ifsetxxx}  % I preserve it to make it similar to @paragraphindent.
957  \def\ifsetxxx #1{%  \parseargdef\exampleindent{%
958    \expandafter\ifx\csname SET#1\endcsname\relax    \def\temp{#1}%
959      \expandafter\ifsetfail    \ifx\temp\asisword
960    \else    \else
961      \expandafter\ifsetsucceed      \ifx\temp\noneword
962          \lispnarrowing = 0pt
963        \else
964          \lispnarrowing = #1em
965        \fi
966    \fi    \fi
967  }  }
 \def\ifsetsucceed{\conditionalsucceed{ifset}}  
 \def\ifsetfail{\nestedignore{ifset}}  
 \defineunmatchedend{ifset}  
968    
969  % @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been  % @firstparagraphindent WORD
970  % defined with @set, or has been undefined with @clear.  % If WORD is `none', then suppress indentation of the first paragraph
971    % after a section heading.  If WORD is `insert', then do indent at such
972    % paragraphs.
973    %
974    % The paragraph indentation is suppressed or not by calling
975    % \suppressfirstparagraphindent, which the sectioning commands do.
976    % We switch the definition of this back and forth according to WORD.
977    % By default, we suppress indentation.
978  %  %
979  \def\ifclear{\parsearg\ifclearxxx}  \def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent}
980  \def\ifclearxxx #1{%  \def\insertword{insert}
981    \expandafter\ifx\csname SET#1\endcsname\relax  %
982      \expandafter\ifclearsucceed  \parseargdef\firstparagraphindent{%
983      \def\temp{#1}%
984      \ifx\temp\noneword
985        \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent
986      \else\ifx\temp\insertword
987        \let\suppressfirstparagraphindent = \relax
988    \else    \else
989      \expandafter\ifclearfail      \errhelp = \EMsimple
990    \fi      \errmessage{Unknown @firstparagraphindent option `\temp'}%
991      \fi\fi
992  }  }
 \def\ifclearsucceed{\conditionalsucceed{ifclear}}  
 \def\ifclearfail{\nestedignore{ifclear}}  
 \defineunmatchedend{ifclear}  
993    
994  % @iftex always succeeds; we read the text following, through @end  % Here is how we actually suppress indentation.  Redefine \everypar to
995  % iftex).  But `@end iftex' should be valid only after an @iftex.  % \kern backwards by \parindent, and then reset itself to empty.
996  %  %
997  \def\iftex{\conditionalsucceed{iftex}}  % We also make \indent itself not actually do anything until the next
998  \defineunmatchedend{iftex}  % paragraph.
   
 % 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.)  
999  %  %
1000  \def\conditionalsucceed#1{%  \gdef\dosuppressfirstparagraphindent{%
1001    \edef\temp{%    \gdef\indent{%
1002      % Remember the current value of \E#1.      \restorefirstparagraphindent
1003      \let\nece{prevE#1} = \nece{E#1}%      \indent
1004      %    }%
1005      % At the `@end #1', redefine \E#1 to be its previous value.    \gdef\noindent{%
1006      \def\nece{E#1}{\let\nece{E#1} = \nece{prevE#1}}%      \restorefirstparagraphindent
1007        \noindent
1008      }%
1009      \global\everypar = {%
1010        \kern -\parindent
1011        \restorefirstparagraphindent
1012    }%    }%
   \temp  
1013  }  }
1014    
1015  % We need to expand lots of \csname's, but we don't want to expand the  \gdef\restorefirstparagraphindent{%
1016  % control sequences after we've constructed them.    \global \let \indent = \ptexindent
1017  %    \global \let \noindent = \ptexnoindent
1018  \def\nece#1{\expandafter\noexpand\csname#1\endcsname}    \global \everypar = {}%
1019    }
1020    
1021    
1022  % @asis just yields its argument.  Used with @table, for example.  % @asis just yields its argument.  Used with @table, for example.
1023  %  %
1024  \def\asis#1{#1}  \def\asis#1{#1}
1025    
1026  % @math means output in math mode.  % @math outputs its argument 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.  
1027  %  %
1028  % This isn't quite enough for @math to work properly in indices, but it  % One complication: _ usually means subscripts, but it could also mean
1029  % seems unlikely it will ever be needed there.  % an actual _ character, as in @math{@var{some_variable} + 1}.  So make
1030    % _ active, and distinguish by seeing if the current family is \slfam,
1031    % which is what @var uses.
1032    {
1033      \catcode\underChar = \active
1034      \gdef\mathunderscore{%
1035        \catcode\underChar=\active
1036        \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
1037      }
1038    }
1039    % Another complication: we want \\ (and @\) to output a \ character.
1040    % FYI, plain.tex uses \\ as a temporary control sequence (why?), but
1041    % this is not advertised and we don't care.  Texinfo does not
1042    % otherwise define @\.
1043    %
1044    % The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\.
1045    \def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}
1046    %
1047    \def\math{%
1048      \tex
1049      \mathunderscore
1050      \let\\ = \mathbackslash
1051      \mathactive
1052      $\finishmath
1053    }
1054    \def\finishmath#1{#1$\endgroup}  % Close the group opened by \tex.
1055    
1056    % Some active characters (such as <) are spaced differently in math.
1057    % We have to reset their definitions in case the @math was an argument
1058    % to a command which sets the catcodes (such as @item or @section).
1059  %  %
1060  \let\implicitmath = $  {
1061  \def\math#1{\implicitmath #1\implicitmath}    \catcode`^ = \active
1062      \catcode`< = \active
1063      \catcode`> = \active
1064      \catcode`+ = \active
1065      \gdef\mathactive{%
1066        \let^ = \ptexhat
1067        \let< = \ptexless
1068        \let> = \ptexgtr
1069        \let+ = \ptexplus
1070      }
1071    }
1072    
1073  % @bullet and @minus need the same treatment as @math, just above.  % @bullet and @minus need the same treatment as @math, just above.
1074  \def\bullet{\implicitmath\ptexbullet\implicitmath}  \def\bullet{$\ptexbullet$}
1075  \def\minus{\implicitmath-\implicitmath}  \def\minus{$-$}
1076    
1077  \def\node{\ENVcheck\parsearg\nodezzz}  % @dots{} outputs an ellipsis using the current font.
1078  \def\nodezzz#1{\nodexxx [#1,]}  % We do .5em per period so that it has the same spacing in a typewriter
1079  \def\nodexxx[#1,#2]{\gdef\lastnode{#1}}  % font as three actual period characters.
1080  \let\nwnode=\node  %
1081  \let\lastnode=\relax  \def\dots{%
1082      \leavevmode
1083      \hbox to 1.5em{%
1084        \hskip 0pt plus 0.25fil
1085        .\hfil.\hfil.%
1086        \hskip 0pt plus 0.5fil
1087      }%
1088    }
1089    
1090  \def\donoderef{\ifx\lastnode\relax\else  % @enddots{} is an end-of-sentence ellipsis.
1091  \expandafter\expandafter\expandafter\setref{\lastnode}\fi  %
1092  \global\let\lastnode=\relax}  \def\enddots{%
1093      \dots
1094  \def\unnumbnoderef{\ifx\lastnode\relax\else    \spacefactor=3000
1095  \expandafter\expandafter\expandafter\unnumbsetref{\lastnode}\fi  }
1096  \global\let\lastnode=\relax}  
1097    % @comma{} is so commas can be inserted into text without messing up
1098  \def\appendixnoderef{\ifx\lastnode\relax\else  % Texinfo's parsing.
1099  \expandafter\expandafter\expandafter\appendixsetref{\lastnode}\fi  %
1100  \global\let\lastnode=\relax}  \let\comma = ,
1101    
1102  % @refill is a no-op.  % @refill is a no-op.
1103  \let\refill=\relax  \let\refill=\relax
1104    
1105    % If working on a large document in chapters, it is convenient to
1106    % be able to disable indexing, cross-referencing, and contents, for test runs.
1107    % This is done with @novalidate (before @setfilename).
1108    %
1109    \newif\iflinks \linkstrue % by default we want the aux files.
1110    \let\novalidate = \linksfalse
1111    
1112  % @setfilename is done at the beginning of every texinfo file.  % @setfilename is done at the beginning of every texinfo file.
1113  % So open here the files we need to have open while reading the input.  % So open here the files we need to have open while reading the input.
1114  % This makes it possible to make a .fmt file for texinfo.  % This makes it possible to make a .fmt file for texinfo.
1115  \def\setfilename{%  \def\setfilename{%
    \readauxfile  
    \opencontents  
    \openindices  
1116     \fixbackslash  % Turn off hack to swallow `\input texinfo'.     \fixbackslash  % Turn off hack to swallow `\input texinfo'.
1117     \global\let\setfilename=\comment % Ignore extra @setfilename cmds.     \iflinks
1118         \tryauxfile
1119         % Open the new aux file.  TeX will close it automatically at exit.
1120         \immediate\openout\auxfile=\jobname.aux
1121       \fi % \openindices needs to do some work in any case.
1122       \openindices
1123       \let\setfilename=\comment % Ignore extra @setfilename cmds.
1124       %
1125       % If texinfo.cnf is present on the system, read it.
1126       % Useful for site-wide @afourpaper, etc.
1127       \openin 1 texinfo.cnf
1128       \ifeof 1 \else \input texinfo.cnf \fi
1129       \closein 1
1130       %
1131     \comment % Ignore the actual filename.     \comment % Ignore the actual filename.
1132  }  }
1133    
1134    % Called from \setfilename.
1135    %
1136    \def\openindices{%
1137      \newindex{cp}%
1138      \newcodeindex{fn}%
1139      \newcodeindex{vr}%
1140      \newcodeindex{tp}%
1141      \newcodeindex{ky}%
1142      \newcodeindex{pg}%
1143    }
1144    
1145  % @bye.  % @bye.
1146  \outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}  \outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
1147    
 % \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}  
1148    
1149  %\def\butfirst#1{}  \message{pdf,}
1150    % adobe `portable' document format
1151    \newcount\tempnum
1152    \newcount\lnkcount
1153    \newtoks\filename
1154    \newcount\filenamelength
1155    \newcount\pgn
1156    \newtoks\toksA
1157    \newtoks\toksB
1158    \newtoks\toksC
1159    \newtoks\toksD
1160    \newbox\boxA
1161    \newcount\countA
1162    \newif\ifpdf
1163    \newif\ifpdfmakepagedest
1164    
1165    % when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1
1166    % can be set).  So we test for \relax and 0 as well as \undefined,
1167    % borrowed from ifpdf.sty.
1168    \ifx\pdfoutput\undefined
1169    \else
1170      \ifx\pdfoutput\relax
1171      \else
1172        \ifcase\pdfoutput
1173        \else
1174          \pdftrue
1175        \fi
1176      \fi
1177    \fi
1178    %
1179    \ifpdf
1180      \input pdfcolor
1181      \pdfcatalog{/PageMode /UseOutlines}%
1182      \def\dopdfimage#1#2#3{%
1183        \def\imagewidth{#2}%
1184        \def\imageheight{#3}%
1185        % without \immediate, pdftex seg faults when the same image is
1186        % included twice.  (Version 3.14159-pre-1.0-unofficial-20010704.)
1187        \ifnum\pdftexversion < 14
1188          \immediate\pdfimage
1189        \else
1190          \immediate\pdfximage
1191        \fi
1192          \ifx\empty\imagewidth\else width \imagewidth \fi
1193          \ifx\empty\imageheight\else height \imageheight \fi
1194          \ifnum\pdftexversion<13
1195             #1.pdf%
1196           \else
1197             {#1.pdf}%
1198           \fi
1199        \ifnum\pdftexversion < 14 \else
1200          \pdfrefximage \pdflastximage
1201        \fi}
1202      \def\pdfmkdest#1{{%
1203        % We have to set dummies so commands such as @code in a section title
1204        % aren't expanded.
1205        \atdummies
1206        \normalturnoffactive
1207        \pdfdest name{#1} xyz%
1208      }}
1209      \def\pdfmkpgn#1{#1}
1210      \let\linkcolor = \Blue  % was Cyan, but that seems light?
1211      \def\endlink{\Black\pdfendlink}
1212      % Adding outlines to PDF; macros for calculating structure of outlines
1213      % come from Petr Olsak
1214      \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
1215        \else \csname#1\endcsname \fi}
1216      \def\advancenumber#1{\tempnum=\expnumber{#1}\relax
1217        \advance\tempnum by 1
1218        \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
1219      %
1220      % #1 is the section text.  #2 is the pdf expression for the number
1221      % of subentries (or empty, for subsubsections).  #3 is the node
1222      % text, which might be empty if this toc entry had no
1223      % corresponding node.  #4 is the page number.
1224      %
1225      \def\dopdfoutline#1#2#3#4{%
1226        % Generate a link to the node text if that exists; else, use the
1227        % page number.  We could generate a destination for the section
1228        % text in the case where a section has no node, but it doesn't
1229        % seem worthwhile, since most documents are normally structured.
1230        \def\pdfoutlinedest{#3}%
1231        \ifx\pdfoutlinedest\empty \def\pdfoutlinedest{#4}\fi
1232        %
1233        \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{#1}%
1234      }
1235      %
1236      \def\pdfmakeoutlines{%
1237        \begingroup
1238          % Thanh's hack / proper braces in bookmarks
1239          \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace
1240          \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace
1241          %
1242          % Read toc silently, to get counts of subentries for \pdfoutline.
1243          \def\numchapentry##1##2##3##4{%
1244            \def\thischapnum{##2}%
1245            \let\thissecnum\empty
1246            \let\thissubsecnum\empty
1247          }%
1248          \def\numsecentry##1##2##3##4{%
1249            \advancenumber{chap\thischapnum}%
1250            \def\thissecnum{##2}%
1251            \let\thissubsecnum\empty
1252          }%
1253          \def\numsubsecentry##1##2##3##4{%
1254            \advancenumber{sec\thissecnum}%
1255            \def\thissubsecnum{##2}%
1256          }%
1257          \def\numsubsubsecentry##1##2##3##4{%
1258            \advancenumber{subsec\thissubsecnum}%
1259          }%
1260          \let\thischapnum\empty
1261          \let\thissecnum\empty
1262          \let\thissubsecnum\empty
1263          %
1264          % use \def rather than \let here because we redefine \chapentry et
1265          % al. a second time, below.
1266          \def\appentry{\numchapentry}%
1267          \def\appsecentry{\numsecentry}%
1268          \def\appsubsecentry{\numsubsecentry}%
1269          \def\appsubsubsecentry{\numsubsubsecentry}%
1270          \def\unnchapentry{\numchapentry}%
1271          \def\unnsecentry{\numsecentry}%
1272          \def\unnsubsecentry{\numsubsecentry}%
1273          \def\unnsubsubsecentry{\numsubsubsecentry}%
1274          \input \jobname.toc
1275          %
1276          % Read toc second time, this time actually producing the outlines.
1277          % The `-' means take the \expnumber as the absolute number of
1278          % subentries, which we calculated on our first read of the .toc above.
1279          %
1280          % We use the node names as the destinations.
1281          \def\numchapentry##1##2##3##4{%
1282            \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}%
1283          \def\numsecentry##1##2##3##4{%
1284            \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}%
1285          \def\numsubsecentry##1##2##3##4{%
1286            \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}%
1287          \def\numsubsubsecentry##1##2##3##4{% count is always zero
1288            \dopdfoutline{##1}{}{##3}{##4}}%
1289          %
1290          % PDF outlines are displayed using system fonts, instead of
1291          % document fonts.  Therefore we cannot use special characters,
1292          % since the encoding is unknown.  For example, the eogonek from
1293          % Latin 2 (0xea) gets translated to a | character.  Info from
1294          % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100.
1295          %
1296          % xx to do this right, we have to translate 8-bit characters to
1297          % their "best" equivalent, based on the @documentencoding.  Right
1298          % now, I guess we'll just let the pdf reader have its way.
1299          \indexnofonts
1300          \turnoffactive
1301          \input \jobname.toc
1302        \endgroup
1303      }
1304      %
1305      \def\makelinks #1,{%
1306        \def\params{#1}\def\E{END}%
1307        \ifx\params\E
1308          \let\nextmakelinks=\relax
1309        \else
1310          \let\nextmakelinks=\makelinks
1311          \ifnum\lnkcount>0,\fi
1312          \picknum{#1}%
1313          \startlink attr{/Border [0 0 0]}
1314            goto name{\pdfmkpgn{\the\pgn}}%
1315          \linkcolor #1%
1316          \advance\lnkcount by 1%
1317          \endlink
1318        \fi
1319        \nextmakelinks
1320      }
1321      \def\picknum#1{\expandafter\pn#1}
1322      \def\pn#1{%
1323        \def\p{#1}%
1324        \ifx\p\lbrace
1325          \let\nextpn=\ppn
1326        \else
1327          \let\nextpn=\ppnn
1328          \def\first{#1}
1329        \fi
1330        \nextpn
1331      }
1332      \def\ppn#1{\pgn=#1\gobble}
1333      \def\ppnn{\pgn=\first}
1334      \def\pdfmklnk#1{\lnkcount=0\makelinks #1,END,}
1335      \def\skipspaces#1{\def\PP{#1}\def\D{|}%
1336        \ifx\PP\D\let\nextsp\relax
1337        \else\let\nextsp\skipspaces
1338          \ifx\p\space\else\addtokens{\filename}{\PP}%
1339            \advance\filenamelength by 1
1340          \fi
1341        \fi
1342        \nextsp}
1343      \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax}
1344      \ifnum\pdftexversion < 14
1345        \let \startlink \pdfannotlink
1346      \else
1347        \let \startlink \pdfstartlink
1348      \fi
1349      \def\pdfurl#1{%
1350        \begingroup
1351          \normalturnoffactive\def\@{@}%
1352          \makevalueexpandable
1353          \leavevmode\Red
1354          \startlink attr{/Border [0 0 0]}%
1355            user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
1356        \endgroup}
1357      \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
1358      \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
1359      \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
1360      \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
1361      \def\maketoks{%
1362        \expandafter\poptoks\the\toksA|ENDTOKS|\relax
1363        \ifx\first0\adn0
1364        \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
1365        \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
1366        \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9
1367        \else
1368          \ifnum0=\countA\else\makelink\fi
1369          \ifx\first.\let\next=\done\else
1370            \let\next=\maketoks
1371            \addtokens{\toksB}{\the\toksD}
1372            \ifx\first,\addtokens{\toksB}{\space}\fi
1373          \fi
1374        \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
1375        \next}
1376      \def\makelink{\addtokens{\toksB}%
1377        {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
1378      \def\pdflink#1{%
1379        \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}
1380        \linkcolor #1\endlink}
1381      \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
1382    \else
1383      \let\pdfmkdest = \gobble
1384      \let\pdfurl = \gobble
1385      \let\endlink = \relax
1386      \let\linkcolor = \relax
1387      \let\pdfmakeoutlines = \relax
1388    \fi  % \ifx\pdfoutput
1389    
1390    
1391  \message{fonts,}  \message{fonts,}
1392    
1393  % Font-change commands.  % Change the current font style to #1, remembering it in \curfontstyle.
1394    % For now, we do not accumulate font styles: @b{@i{foo}} prints foo in
1395    % italics, not bold italics.
1396    %
1397    \def\setfontstyle#1{%
1398      \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd.
1399      \csname ten#1\endcsname  % change the current font
1400    }
1401    
1402    % Select #1 fonts with the current style.
1403    %
1404    \def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname}
1405    
1406    \def\rm{\fam=0 \setfontstyle{rm}}
1407    \def\it{\fam=\itfam \setfontstyle{it}}
1408    \def\sl{\fam=\slfam \setfontstyle{sl}}
1409    \def\bf{\fam=\bffam \setfontstyle{bf}}
1410    \def\tt{\fam=\ttfam \setfontstyle{tt}}
1411    
1412  % 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.
1413  % So we set up a \sf analogous to plain's \rm, etc.  % So we set up a \sf.
1414  \newfam\sffam  \newfam\sffam
1415  \def\sf{\fam=\sffam \tensf}  \def\sf{\fam=\sffam \setfontstyle{sf}}
1416  \let\li = \sf % Sometimes we call it \li, not \sf.  \let\li = \sf % Sometimes we call it \li, not \sf.
1417    
1418  % We don't need math for this one.  % We don't need math for this font style.
1419  \def\ttsl{\tenttsl}  \def\ttsl{\setfontstyle{ttsl}}
1420    
1421  %% Try out Computer Modern fonts at \magstephalf  % Default leading.
1422  \let\mainmagstep=\magstephalf  \newdimen\textleading  \textleading = 13.2pt
1423    
1424    % Set the baselineskip to #1, and the lineskip and strut size
1425    % correspondingly.  There is no deep meaning behind these magic numbers
1426    % used as factors; they just match (closely enough) what Knuth defined.
1427    %
1428    \def\lineskipfactor{.08333}
1429    \def\strutheightpercent{.70833}
1430    \def\strutdepthpercent {.29167}
1431    %
1432    \def\setleading#1{%
1433      \normalbaselineskip = #1\relax
1434      \normallineskip = \lineskipfactor\normalbaselineskip
1435      \normalbaselines
1436      \setbox\strutbox =\hbox{%
1437        \vrule width0pt height\strutheightpercent\baselineskip
1438                        depth \strutdepthpercent \baselineskip
1439      }%
1440    }
1441    
1442  % Set the font macro #1 to the font named #2, adding on the  % Set the font macro #1 to the font named #2, adding on the
1443  % specified font prefix (normally `cm').  % specified font prefix (normally `cm').
# Line 1072  where each line of input produces a line Line 1467  where each line of input produces a line
1467  \def\scshape{csc}  \def\scshape{csc}
1468  \def\scbshape{csc}  \def\scbshape{csc}
1469    
1470    % Text fonts (11.2pt, magstep1).
1471    \newcount\mainmagstep
1472  \ifx\bigger\relax  \ifx\bigger\relax
1473  \let\mainmagstep=\magstep1    % not really supported.
1474  \setfont\textrm\rmshape{12}{1000}    \mainmagstep=\magstep1
1475  \setfont\texttt\ttshape{12}{1000}    \setfont\textrm\rmshape{12}{1000}
1476      \setfont\texttt\ttshape{12}{1000}
1477  \else  \else
1478  \setfont\textrm\rmshape{10}{\mainmagstep}    \mainmagstep=\magstephalf
1479  \setfont\texttt\ttshape{10}{\mainmagstep}    \setfont\textrm\rmshape{10}{\mainmagstep}
1480      \setfont\texttt\ttshape{10}{\mainmagstep}
1481  \fi  \fi
 % Instead of cmb10, you many want to use cmbx10.  
 % cmbx10 is a prettier font on its own, but cmb10  
 % looks better when embedded in a line with cmr10.  
1482  \setfont\textbf\bfshape{10}{\mainmagstep}  \setfont\textbf\bfshape{10}{\mainmagstep}
1483  \setfont\textit\itshape{10}{\mainmagstep}  \setfont\textit\itshape{10}{\mainmagstep}
1484  \setfont\textsl\slshape{10}{\mainmagstep}  \setfont\textsl\slshape{10}{\mainmagstep}
# Line 1092  where each line of input produces a line Line 1488  where each line of input produces a line
1488  \font\texti=cmmi10 scaled \mainmagstep  \font\texti=cmmi10 scaled \mainmagstep
1489  \font\textsy=cmsy10 scaled \mainmagstep  \font\textsy=cmsy10 scaled \mainmagstep
1490    
1491  % A few fonts for @defun, etc.  % A few fonts for @defun names and args.
1492  \setfont\defbf\bxshape{10}{\magstep1} %was 1314  \setfont\defbf\bfshape{10}{\magstep1}
1493  \setfont\deftt\ttshape{10}{\magstep1}  \setfont\deftt\ttshape{10}{\magstep1}
1494  \def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf}  \setfont\defttsl\ttslshape{10}{\magstep1}
1495    \def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf}
1496    
1497    % Fonts for indices, footnotes, small examples (9pt).
1498    \setfont\smallrm\rmshape{9}{1000}
1499    \setfont\smalltt\ttshape{9}{1000}
1500    \setfont\smallbf\bfshape{10}{900}
1501    \setfont\smallit\itshape{9}{1000}
1502    \setfont\smallsl\slshape{9}{1000}
1503    \setfont\smallsf\sfshape{9}{1000}
1504    \setfont\smallsc\scshape{10}{900}
1505    \setfont\smallttsl\ttslshape{10}{900}
1506    \font\smalli=cmmi9
1507    \font\smallsy=cmsy9
1508    
1509  % Fonts for indices and small examples (9pt).  % Fonts for small examples (8pt).
1510  % We actually use the slanted font rather than the italic,  \setfont\smallerrm\rmshape{8}{1000}
1511  % because texinfo normally uses the slanted fonts for that.  \setfont\smallertt\ttshape{8}{1000}
1512  % Do not make many font distinctions in general in the index, since they  \setfont\smallerbf\bfshape{10}{800}
1513  % aren't very useful.  \setfont\smallerit\itshape{8}{1000}
1514  \setfont\ninett\ttshape{9}{1000}  \setfont\smallersl\slshape{8}{1000}
1515  \setfont\indrm\rmshape{9}{1000}  \setfont\smallersf\sfshape{8}{1000}
1516  \setfont\indit\slshape{9}{1000}  \setfont\smallersc\scshape{10}{800}
1517  \let\indsl=\indit  \setfont\smallerttsl\ttslshape{10}{800}
1518  \let\indtt=\ninett  \font\smalleri=cmmi8
1519  \let\indttsl=\ninett  \font\smallersy=cmsy8
1520  \let\indsf=\indrm  
1521  \let\indbf=\indrm  % Fonts for title page (20.4pt):
1522  \setfont\indsc\scshape{10}{900}  \setfont\titlerm\rmbshape{12}{\magstep3}
1523  \font\indi=cmmi9  \setfont\titleit\itbshape{10}{\magstep4}
1524  \font\indsy=cmsy9  \setfont\titlesl\slbshape{10}{\magstep4}
1525    \setfont\titlett\ttbshape{12}{\magstep3}
1526    \setfont\titlettsl\ttslshape{10}{\magstep4}
1527    \setfont\titlesf\sfbshape{17}{\magstep1}
1528    \let\titlebf=\titlerm
1529    \setfont\titlesc\scbshape{10}{\magstep4}
1530    \font\titlei=cmmi12 scaled \magstep3
1531    \font\titlesy=cmsy10 scaled \magstep4
1532    \def\authorrm{\secrm}
1533    \def\authortt{\sectt}
1534    
1535  % Chapter (and unnumbered) fonts (17.28pt).  % Chapter (and unnumbered) fonts (17.28pt).
1536  \setfont\chaprm\rmbshape{12}{\magstep2}  \setfont\chaprm\rmbshape{12}{\magstep2}
# Line 1120  where each line of input produces a line Line 1538  where each line of input produces a line
1538  \setfont\chapsl\slbshape{10}{\magstep3}  \setfont\chapsl\slbshape{10}{\magstep3}
1539  \setfont\chaptt\ttbshape{12}{\magstep2}  \setfont\chaptt\ttbshape{12}{\magstep2}
1540  \setfont\chapttsl\ttslshape{10}{\magstep3}  \setfont\chapttsl\ttslshape{10}{\magstep3}
1541  \setfont\chapsf\sfbshape{12}{\magstep2}  \setfont\chapsf\sfbshape{17}{1000}
1542  \let\chapbf=\chaprm  \let\chapbf=\chaprm
1543  \setfont\chapsc\scbshape{10}{\magstep3}  \setfont\chapsc\scbshape{10}{\magstep3}
1544  \font\chapi=cmmi12 scaled \magstep2  \font\chapi=cmmi12 scaled \magstep2
# Line 1138  where each line of input produces a line Line 1556  where each line of input produces a line
1556  \font\seci=cmmi12 scaled \magstep1  \font\seci=cmmi12 scaled \magstep1
1557  \font\secsy=cmsy10 scaled \magstep2  \font\secsy=cmsy10 scaled \magstep2
1558    
 % \setfont\ssecrm\bxshape{10}{\magstep1}    % This size an font looked bad.  
 % \setfont\ssecit\itshape{10}{\magstep1}    % The letters were too crowded.  
 % \setfont\ssecsl\slshape{10}{\magstep1}  
 % \setfont\ssectt\ttshape{10}{\magstep1}  
 % \setfont\ssecsf\sfshape{10}{\magstep1}  
   
 %\setfont\ssecrm\bfshape{10}{1315}      % Note the use of cmb rather than cmbx.  
 %\setfont\ssecit\itshape{10}{1315}      % Also, the size is a little larger than  
 %\setfont\ssecsl\slshape{10}{1315}      % being scaled magstep1.  
 %\setfont\ssectt\ttshape{10}{1315}  
 %\setfont\ssecsf\sfshape{10}{1315}  
   
 %\let\ssecbf=\ssecrm  
   
1559  % Subsection fonts (13.15pt).  % Subsection fonts (13.15pt).
1560  \setfont\ssecrm\rmbshape{12}{\magstephalf}  \setfont\ssecrm\rmbshape{12}{\magstephalf}
1561  \setfont\ssecit\itbshape{10}{1315}  \setfont\ssecit\itbshape{10}{1315}
1562  \setfont\ssecsl\slbshape{10}{1315}  \setfont\ssecsl\slbshape{10}{1315}
1563  \setfont\ssectt\ttbshape{12}{\magstephalf}  \setfont\ssectt\ttbshape{12}{\magstephalf}
1564  \setfont\ssecttsl\ttslshape{10}{\magstep1}  \setfont\ssecttsl\ttslshape{10}{1315}
1565  \setfont\ssecsf\sfbshape{12}{\magstephalf}  \setfont\ssecsf\sfbshape{12}{\magstephalf}
1566  \let\ssecbf\ssecrm  \let\ssecbf\ssecrm
1567  \setfont\ssecsc\scbshape{10}{\magstep1}  \setfont\ssecsc\scbshape{10}{1315}
1568  \font\sseci=cmmi12 scaled \magstephalf  \font\sseci=cmmi12 scaled \magstephalf
1569  \font\ssecsy=cmsy10 scaled \magstep1  \font\ssecsy=cmsy10 scaled 1315
 % The smallcaps and symbol fonts should actually be scaled \magstep1.5,  
 % but that is not a standard magnification.  
1570    
1571  % Fonts for title page:  % Reduced fonts for @acro in text (10pt).
1572  \setfont\titlerm\rmbshape{12}{\magstep3}  \setfont\reducedrm\rmshape{10}{1000}
1573  \let\authorrm = \secrm  \setfont\reducedtt\ttshape{10}{1000}
1574    \setfont\reducedbf\bfshape{10}{1000}
1575    \setfont\reducedit\itshape{10}{1000}
1576    \setfont\reducedsl\slshape{10}{1000}
1577    \setfont\reducedsf\sfshape{10}{1000}
1578    \setfont\reducedsc\scshape{10}{1000}
1579    \setfont\reducedttsl\ttslshape{10}{1000}
1580    \font\reducedi=cmmi10
1581    \font\reducedsy=cmsy10
1582    
1583  % In order for the font changes to affect most math symbols and letters,  % In order for the font changes to affect most math symbols and letters,
1584  % we have to define the \textfont of the standard families.  Since  % we have to define the \textfont of the standard families.  Since
1585  % texinfo doesn't allow for producing subscripts and superscripts, we  % texinfo doesn't allow for producing subscripts and superscripts except
1586  % don't bother to reset \scriptfont and \scriptscriptfont (which would  % in the main text, we don't bother to reset \scriptfont and
1587  % also require loading a lot more fonts).  % \scriptscriptfont (which would also require loading a lot more fonts).
1588  %  %
1589  \def\resetmathfonts{%  \def\resetmathfonts{%
1590    \textfont0 = \tenrm \textfont1 = \teni \textfont2 = \tensy    \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy
1591    \textfont\itfam = \tenit \textfont\slfam = \tensl \textfont\bffam = \tenbf    \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf
1592    \textfont\ttfam = \tentt \textfont\sffam = \tensf    \textfont\ttfam=\tentt \textfont\sffam=\tensf
1593  }  }
1594    
   
1595  % The font-changing commands redefine the meanings of \tenSTYLE, instead  % The font-changing commands redefine the meanings of \tenSTYLE, instead
1596  % of just \STYLE.  We do this so that font changes will continue to work  % of just \STYLE.  We do this because \STYLE needs to also set the
1597  % in math mode, where it is the current \fam that is relevant in most  % current \fam for math mode.  Our \STYLE (e.g., \rm) commands hardwire
1598  % cases, not the current font.  Plain TeX does \def\bf{\fam=\bffam  % \tenSTYLE to set the current font.
1599  % \tenbf}, for example.  By redefining \tenbf, we obviate the need to  %
1600  % redefine \bf itself.  % Each font-changing command also sets the names \lsize (one size lower)
1601    % and \lllsize (three sizes lower).  These relative commands are used in
1602    % the LaTeX logo and acronyms.
1603    %
1604    % This all needs generalizing, badly.
1605    %
1606  \def\textfonts{%  \def\textfonts{%
1607    \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl    \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
1608    \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc    \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
1609    \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy \let\tenttsl=\textttsl    \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy
1610    \resetmathfonts}    \let\tenttsl=\textttsl
1611      \def\lsize{reduced}\def\lllsize{smaller}%
1612      \resetmathfonts \setleading{\textleading}}
1613    \def\titlefonts{%
1614      \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl
1615      \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc
1616      \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy
1617      \let\tenttsl=\titlettsl
1618      \def\lsize{chap}\def\lllsize{subsec}%
1619      \resetmathfonts \setleading{25pt}}
1620    \def\titlefont#1{{\titlefonts\rm #1}}
1621  \def\chapfonts{%  \def\chapfonts{%
1622    \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl    \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
1623    \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc    \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
1624    \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl    \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl
1625      \def\lsize{sec}\def\lllsize{text}%
1626    \resetmathfonts \setleading{19pt}}    \resetmathfonts \setleading{19pt}}
1627  \def\secfonts{%  \def\secfonts{%
1628    \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl    \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
1629    \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc    \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
1630    \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy \let\tenttsl=\secttsl    \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy
1631      \let\tenttsl=\secttsl
1632      \def\lsize{subsec}\def\lllsize{reduced}%
1633    \resetmathfonts \setleading{16pt}}    \resetmathfonts \setleading{16pt}}
1634  \def\subsecfonts{%  \def\subsecfonts{%
1635    \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl    \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
1636    \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc    \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
1637    \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl    \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy
1638      \let\tenttsl=\ssecttsl
1639      \def\lsize{text}\def\lllsize{small}%
1640    \resetmathfonts \setleading{15pt}}    \resetmathfonts \setleading{15pt}}
1641  \let\subsubsecfonts = \subsecfonts % Maybe make sssec fonts scaled magstephalf?  \let\subsubsecfonts = \subsecfonts
1642  \def\indexfonts{%  \def\reducedfonts{%
1643    \let\tenrm=\indrm \let\tenit=\indit \let\tensl=\indsl    \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl
1644    \let\tenbf=\indbf \let\tentt=\indtt \let\smallcaps=\indsc    \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc
1645    \let\tensf=\indsf \let\teni=\indi \let\tensy=\indsy \let\tenttsl=\indttsl    \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy
1646    \resetmathfonts \setleading{12pt}}    \let\tenttsl=\reducedttsl
1647      \def\lsize{small}\def\lllsize{smaller}%
1648      \resetmathfonts \setleading{10.5pt}}
1649    \def\smallfonts{%
1650      \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl
1651      \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc
1652      \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy
1653      \let\tenttsl=\smallttsl
1654      \def\lsize{smaller}\def\lllsize{smaller}%
1655      \resetmathfonts \setleading{10.5pt}}
1656    \def\smallerfonts{%
1657      \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl
1658      \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc
1659      \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy
1660      \let\tenttsl=\smallerttsl
1661      \def\lsize{smaller}\def\lllsize{smaller}%
1662      \resetmathfonts \setleading{9.5pt}}
1663    
1664    % Set the fonts to use with the @small... environments.
1665    \let\smallexamplefonts = \smallfonts
1666    
1667    % About \smallexamplefonts.  If we use \smallfonts (9pt), @smallexample
1668    % can fit this many characters:
1669    %   8.5x11=86   smallbook=72  a4=90  a5=69
1670    % If we use \scriptfonts (8pt), then we can fit this many characters:
1671    %   8.5x11=90+  smallbook=80  a4=90+  a5=77
1672    % For me, subjectively, the few extra characters that fit aren't worth
1673    % the additional smallness of 8pt.  So I'm making the default 9pt.
1674    %
1675    % By the way, for comparison, here's what fits with @example (10pt):
1676    %   8.5x11=71  smallbook=60  a4=75  a5=58
1677    %
1678    % I wish the USA used A4 paper.
1679    % --karl, 24jan03.
1680    
1681    
1682  % Set up the default fonts, so we can use them for creating boxes.  % Set up the default fonts, so we can use them for creating boxes.
1683  %  %
1684  \textfonts  \textfonts \rm
1685    
1686    % Define these so they can be easily changed for other fonts.
1687    \def\angleleft{$\langle$}
1688    \def\angleright{$\rangle$}
1689    
1690  % Count depth in font-changes, for error checks  % Count depth in font-changes, for error checks
1691  \newcount\fontdepth \fontdepth=0  \newcount\fontdepth \fontdepth=0
1692    
1693  % Fonts for short table of contents.  % Fonts for short table of contents.
1694  \setfont\shortcontrm\rmshape{12}{1000}  \setfont\shortcontrm\rmshape{12}{1000}
1695  \setfont\shortcontbf\bxshape{12}{1000}  \setfont\shortcontbf\bfshape{10}{\magstep1}  % no cmb12
1696  \setfont\shortcontsl\slshape{12}{1000}  \setfont\shortcontsl\slshape{12}{1000}
1697    \setfont\shortconttt\ttshape{12}{1000}
1698    
1699  %% Add scribe-like font environments, plus @l for inline lisp (usually sans  %% Add scribe-like font environments, plus @l for inline lisp (usually sans
1700  %% serif) and @ii for TeX italic  %% serif) and @ii for TeX italic
1701    
1702  % \smartitalic{ARG} outputs arg in italics, followed by an italic correction  % \smartitalic{ARG} outputs arg in italics, followed by an italic correction
1703  % unless the following character is such as not to need one.  % unless the following character is such as not to need one.
1704  \def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else\/\fi\fi\fi}  \def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else
1705  \def\smartitalic#1{{\sl #1}\futurelet\next\smartitalicx}                      \ptexslash\fi\fi\fi}
1706    \def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx}
1707    \def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx}
1708    
1709    % like \smartslanted except unconditionally uses \ttsl.
1710    % @var is set to this for defun arguments.
1711    \def\ttslanted#1{{\ttsl #1}\futurelet\next\smartitalicx}
1712    
1713    % like \smartslanted except unconditionally use \sl.  We never want
1714    % ttsl for book titles, do we?
1715    \def\cite#1{{\sl #1}\futurelet\next\smartitalicx}
1716    
1717  \let\i=\smartitalic  \let\i=\smartitalic
1718  \let\var=\smartitalic  \let\var=\smartslanted
1719  \let\dfn=\smartitalic  \let\dfn=\smartslanted
1720  \let\emph=\smartitalic  \let\emph=\smartitalic
 \let\cite=\smartitalic  
1721    
1722  \def\b#1{{\bf #1}}  \def\b#1{{\bf #1}}
1723  \let\strong=\b  \let\strong=\b
# Line 1252  where each line of input produces a line Line 1729  where each line of input produces a line
1729  \def\nohyphenation{\hyphenchar\font = -1  \aftergroup\restorehyphenation}  \def\nohyphenation{\hyphenchar\font = -1  \aftergroup\restorehyphenation}
1730  \def\restorehyphenation{\hyphenchar\font = `- }  \def\restorehyphenation{\hyphenchar\font = `- }
1731    
1732    % Set sfcode to normal for the chars that usually have another value.
1733    % Can't use plain's \frenchspacing because it uses the `\x notation, and
1734    % sometimes \x has an active definition that messes things up.
1735    %
1736    \catcode`@=11
1737      \def\frenchspacing{%
1738        \sfcode\dotChar  =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m
1739        \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m
1740      }
1741    \catcode`@=\other
1742    
1743  \def\t#1{%  \def\t#1{%
1744    {\tt \rawbackslash \frenchspacing #1}%    {\tt \rawbackslash \frenchspacing #1}%
1745    \null    \null
1746  }  }
1747  \let\ttfont=\t  \def\samp#1{`\tclose{#1}'\null}
1748  \def\samp #1{`\tclose{#1}'\null}  \setfont\keyrm\rmshape{8}{1000}
1749  \setfont\smallrm\rmshape{8}{1000}  \font\keysy=cmsy9
1750  \font\smallsy=cmsy9  \def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{%
1751  \def\key#1{{\smallrm\textfont2=\smallsy \leavevmode\hbox{%    \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{%
   \raise0.4pt\hbox{$\langle$}\kern-.08em\vtop{%  
1752      \vbox{\hrule\kern-0.4pt      \vbox{\hrule\kern-0.4pt
1753       \hbox{\raise0.4pt\hbox{\vphantom{$\langle$}}#1}}%       \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}%
1754      \kern-0.4pt\hrule}%      \kern-0.4pt\hrule}%
1755    \kern-.06em\raise0.4pt\hbox{$\rangle$}}}}    \kern-.06em\raise0.4pt\hbox{\angleright}}}}
1756  % The old definition, with no lozenge:  % The old definition, with no lozenge:
1757  %\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null}  %\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null}
1758  \def\ctrl #1{{\tt \rawbackslash \hat}#1}  \def\ctrl #1{{\tt \rawbackslash \hat}#1}
1759    
1760    % @file, @option are the same as @samp.
1761  \let\file=\samp  \let\file=\samp
1762    \let\option=\samp
1763    
1764  % @code is a modification of @t,  % @code is a modification of @t,
1765  % which makes spaces the same size as normal in the surrounding text.  % which makes spaces the same size as normal in the surrounding text.
# Line 1295  where each line of input produces a line Line 1784  where each line of input produces a line
1784    \null    \null
1785  }  }
1786    
1787  % We *must* turn on hyphenation at `-' and `_' in \code.  % We *must* turn on hyphenation at `-' and `_' in @code.
1788  % Otherwise, it is too hard to avoid overfull hboxes  % Otherwise, it is too hard to avoid overfull hboxes
1789  % in the Emacs manual, the Library manual, etc.  % in the Emacs manual, the Library manual, etc.
1790    
# Line 1305  where each line of input produces a line Line 1794  where each line of input produces a line
1794  % and arrange explicitly to hyphenate at a dash.  % and arrange explicitly to hyphenate at a dash.
1795  %  -- rms.  %  -- rms.
1796  {  {
1797  \catcode`\-=\active    \catcode`\-=\active
1798  \catcode`\_=\active    \catcode`\_=\active
1799  \catcode`\|=\active    %
1800  \global\def\code{\begingroup \catcode`\-=\active \let-\codedash \catcode`\_=\active \let_\codeunder \codex}    \global\def\code{\begingroup
1801  % The following is used by \doprintindex to insure that long function names      \catcode`\-=\active \let-\codedash
1802  % wrap around.  It is necessary for - and _ to be active before the index is      \catcode`\_=\active \let_\codeunder
1803  % read from the file, as \entry parses the arguments long before \code is      \codex
1804  % 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  
 }  
1805  }  }
1806    
1807  \def\realdash{-}  \def\realdash{-}
1808  \def\codedash{-\discretionary{}{}{}}  \def\codedash{-\discretionary{}{}{}}
1809  \def\codeunder{\ifusingtt{\normalunderscore\discretionary{}{}{}}{\_}}  \def\codeunder{%
1810      % this is all so @math{@code{var_name}+1} can work.  In math mode, _
1811      % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.)
1812      % will therefore expand the active definition of _, which is us
1813      % (inside @code that is), therefore an endless loop.
1814      \ifusingtt{\ifmmode
1815                   \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_.
1816                 \else\normalunderscore \fi
1817                 \discretionary{}{}{}}%
1818                {\_}%
1819    }
1820  \def\codex #1{\tclose{#1}\endgroup}  \def\codex #1{\tclose{#1}\endgroup}
1821    
 %\let\exp=\tclose  %Was temporary  
   
1822  % @kbd is like @code, except that if the argument is just one @key command,  % @kbd is like @code, except that if the argument is just one @key command,
1823  % then @kbd has no effect.  % then @kbd has no effect.
1824  %  
1825    % @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
1826    %   `example' (@kbd uses ttsl only inside of @example and friends),
1827    %   or `code' (@kbd uses normal tty font always).
1828    \parseargdef\kbdinputstyle{%
1829      \def\arg{#1}%
1830      \ifx\arg\worddistinct
1831        \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
1832      \else\ifx\arg\wordexample
1833        \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%
1834      \else\ifx\arg\wordcode
1835        \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
1836      \else
1837        \errhelp = \EMsimple
1838        \errmessage{Unknown @kbdinputstyle option `\arg'}%
1839      \fi\fi\fi
1840    }
1841    \def\worddistinct{distinct}
1842    \def\wordexample{example}
1843    \def\wordcode{code}
1844    
1845    % Default is `distinct.'
1846    \kbdinputstyle distinct
1847    
1848  \def\xkey{\key}  \def\xkey{\key}
1849  \def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%  \def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
1850  \ifx\one\xkey\ifx\threex\three \key{#2}%  \ifx\one\xkey\ifx\threex\three \key{#2}%
1851  \else{\tclose{\ttsl\look}}\fi  \else{\tclose{\kbdfont\look}}\fi
1852  \else{\tclose{\ttsl\look}}\fi}  \else{\tclose{\kbdfont\look}}\fi}
1853    
1854  % @url, @email.  Quotes do not seem necessary.  % For @indicateurl, @env, @command quotes seem unnecessary, so use \code.
1855  \let\url=\code % perhaps include a hypertex \special eventually  \let\indicateurl=\code
1856  % rms does not like the angle brackets --karl, 17may97.  \let\env=\code
1857  %\def\email#1{$\langle${\tt #1}$\rangle$}  \let\command=\code
1858  \let\email=\code  
1859    % @uref (abbreviation for `urlref') takes an optional (comma-separated)
1860    % second argument specifying the text to display and an optional third
1861    % arg as text to display instead of (rather than in addition to) the url
1862    % itself.  First (mandatory) arg is the url.  Perhaps eventually put in
1863    % a hypertex \special here.
1864    %
1865    \def\uref#1{\douref #1,,,\finish}
1866    \def\douref#1,#2,#3,#4\finish{\begingroup
1867      \unsepspaces
1868      \pdfurl{#1}%
1869      \setbox0 = \hbox{\ignorespaces #3}%
1870      \ifdim\wd0 > 0pt
1871        \unhbox0 % third arg given, show only that
1872      \else
1873        \setbox0 = \hbox{\ignorespaces #2}%
1874        \ifdim\wd0 > 0pt
1875          \ifpdf
1876            \unhbox0             % PDF: 2nd arg given, show only it
1877          \else
1878            \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url
1879          \fi
1880        \else
1881          \code{#1}% only url given, so show it
1882        \fi
1883      \fi
1884      \endlink
1885    \endgroup}
1886    
1887    % @url synonym for @uref, since that's how everyone uses it.
1888    %
1889    \let\url=\uref
1890    
1891    % rms does not like angle brackets --karl, 17may97.
1892    % So now @email is just like @uref, unless we are pdf.
1893    %
1894    %\def\email#1{\angleleft{\tt #1}\angleright}
1895    \ifpdf
1896      \def\email#1{\doemail#1,,\finish}
1897      \def\doemail#1,#2,#3\finish{\begingroup
1898        \unsepspaces
1899        \pdfurl{mailto:#1}%
1900        \setbox0 = \hbox{\ignorespaces #2}%
1901        \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi
1902        \endlink
1903      \endgroup}
1904    \else
1905      \let\email=\uref
1906    \fi
1907    
1908  % Check if we are currently using a typewriter font.  Since all the  % Check if we are currently using a typewriter font.  Since all the
1909  % Computer Modern typewriter fonts have zero interword stretch (and  % Computer Modern typewriter fonts have zero interword stretch (and
# Line 1351  where each line of input produces a line Line 1913  where each line of input produces a line
1913  \def\ifmonospace{\ifdim\fontdimen3\font=0pt }  \def\ifmonospace{\ifdim\fontdimen3\font=0pt }
1914    
1915  % Typeset a dimension, e.g., `in' or `pt'.  The only reason for the  % Typeset a dimension, e.g., `in' or `pt'.  The only reason for the
1916  % argument is to make the input look right: @dmn{pt} instead of  % argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
 % @dmn{}pt.  
1917  %  %
1918  \def\dmn#1{\thinspace #1}  \def\dmn#1{\thinspace #1}
1919    
# Line 1363  where each line of input produces a line Line 1924  where each line of input produces a line
1924  % Polish suppressed-l.  --karl, 22sep96.  % Polish suppressed-l.  --karl, 22sep96.
1925  %\def\l#1{{\li #1}\null}  %\def\l#1{{\li #1}\null}
1926    
1927    % Explicit font changes: @r, @sc, undocumented @ii.
1928  \def\r#1{{\rm #1}}              % roman font  \def\r#1{{\rm #1}}              % roman font
 % Use of \lowercase was suggested.  
1929  \def\sc#1{{\smallcaps#1}}       % smallcaps font  \def\sc#1{{\smallcaps#1}}       % smallcaps font
1930  \def\ii#1{{\it #1}}             % italic font  \def\ii#1{{\it #1}}             % italic font
1931    
1932  % @pounds{} is a sterling sign.  \def\acronym#1{\doacronym #1,,\finish}
1933    \def\doacronym#1,#2,#3\finish{%
1934      {\selectfonts\lsize #1}%
1935      \def\temp{#2}%
1936      \ifx\temp\empty \else
1937        \space ({\unsepspaces \ignorespaces \temp \unskip})%
1938      \fi
1939    }
1940    
1941    % @pounds{} is a sterling sign, which is in the CM italic font.
1942    %
1943  \def\pounds{{\it\$}}  \def\pounds{{\it\$}}
1944    
1945    % @registeredsymbol - R in a circle.  The font for the R should really
1946    % be smaller yet, but lllsize is the best we can do for now.
1947    % Adapted from the plain.tex definition of \copyright.
1948    %
1949    \def\registeredsymbol{%
1950      $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}%
1951                   \hfil\crcr\Orb}}%
1952        }$%
1953    }
1954    
1955    
1956  \message{page headings,}  \message{page headings,}
1957    
# Line 1378  where each line of input produces a line Line 1959  where each line of input produces a line
1959  \newskip\titlepagebottomglue \titlepagebottomglue = 2pc  \newskip\titlepagebottomglue \titlepagebottomglue = 2pc
1960    
1961  % First the title page.  Must do @settitle before @titlepage.  % First the title page.  Must do @settitle before @titlepage.
 \def\titlefont#1{{\titlerm #1}}  
   
1962  \newif\ifseenauthor  \newif\ifseenauthor
1963  \newif\iffinishedtitlepage  \newif\iffinishedtitlepage
1964    
1965  \def\shorttitlepage{\parsearg\shorttitlepagezzz}  % Do an implicit @contents or @shortcontents after @end titlepage if the
1966  \def\shorttitlepagezzz #1{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%  % user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage.
1967    %
1968    \newif\ifsetcontentsaftertitlepage
1969     \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue
1970    \newif\ifsetshortcontentsaftertitlepage
1971     \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue
1972    
1973    \parseargdef\shorttitlepage{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%
1974          \endgroup\page\hbox{}\page}          \endgroup\page\hbox{}\page}
1975    
1976  \def\titlepage{\begingroup \parindent=0pt \textfonts  \envdef\titlepage{%
1977     \let\subtitlerm=\tenrm    % Open one extra group, as we want to close it in the middle of \Etitlepage.
1978  % I deinstalled the following change because \cmr12 is undefined.    \begingroup
1979  % This change was not in the ChangeLog anyway.  --rms.      \parindent=0pt \textfonts
1980  %   \let\subtitlerm=\cmr12      % Leave some space at the very top of the page.
1981     \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}%      \vglue\titlepagetopglue
1982     %      % No rule at page bottom unless we print one at the top with @title.
1983     \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines}%      \finishedtitlepagetrue
1984     %      %
1985     % Leave some space at the very top of the page.      % Most title ``pages'' are actually two pages long, with space
1986     \vglue\titlepagetopglue      % at the top of the second.  We don't want the ragged left on the second.
1987     %      \let\oldpage = \page
1988     % Now you can print the title using @title.      \def\page{%
    \def\title{\parsearg\titlezzz}%  
    \def\titlezzz##1{\leftline{\titlefont{##1}}  
                     % print a rule at the page bottom also.  
                     \finishedtitlepagefalse  
                     \vskip4pt \hrule height 4pt width \hsize \vskip4pt}%  
    % No rule at page bottom unless we print one at the top with @title.  
    \finishedtitlepagetrue  
    %  
    % Now you can put text using @subtitle.  
    \def\subtitle{\parsearg\subtitlezzz}%  
    \def\subtitlezzz##1{{\subtitlefont \rightline{##1}}}%  
    %  
    % @author should come last, but may come many times.  
    \def\author{\parsearg\authorzzz}%  
    \def\authorzzz##1{\ifseenauthor\else\vskip 0pt plus 1filll\seenauthortrue\fi  
       {\authorfont \leftline{##1}}}%  
    %  
    % Most title ``pages'' are actually two pages long, with space  
    % at the top of the second.  We don't want the ragged left on the second.  
    \let\oldpage = \page  
    \def\page{%  
1989        \iffinishedtitlepage\else        \iffinishedtitlepage\else
1990           \finishtitlepage           \finishtitlepage
1991        \fi        \fi
       \oldpage  
1992        \let\page = \oldpage        \let\page = \oldpage
1993        \hbox{}}%        \page
1994  %   \def\page{\oldpage \hbox{}}        \null
1995        }%
1996  }  }
1997    
1998  \def\Etitlepage{%  \def\Etitlepage{%
1999     \iffinishedtitlepage\else      \iffinishedtitlepage\else
2000        \finishtitlepage          \finishtitlepage
2001     \fi      \fi
2002     % It is important to do the page break before ending the group,      % It is important to do the page break before ending the group,
2003     % because the headline and footline are only empty inside the group.      % because the headline and footline are only empty inside the group.
2004     % If we use the new definition of \page, we always get a blank page      % If we use the new definition of \page, we always get a blank page
2005     % after the title page, which we certainly don't want.      % after the title page, which we certainly don't want.
2006     \oldpage      \oldpage
2007     \endgroup    \endgroup
2008     \HEADINGSon    %
2009      % Need this before the \...aftertitlepage checks so that if they are
2010      % in effect the toc pages will come out with page numbers.
2011      \HEADINGSon
2012      %
2013      % If they want short, they certainly want long too.
2014      \ifsetshortcontentsaftertitlepage
2015        \shortcontents
2016        \contents
2017        \global\let\shortcontents = \relax
2018        \global\let\contents = \relax
2019      \fi
2020      %
2021      \ifsetcontentsaftertitlepage
2022        \contents
2023        \global\let\contents = \relax
2024        \global\let\shortcontents = \relax
2025      \fi
2026  }  }
2027    
2028  \def\finishtitlepage{%  \def\finishtitlepage{%
2029     \vskip4pt \hrule height 2pt width \hsize    \vskip4pt \hrule height 2pt width \hsize
2030     \vskip\titlepagebottomglue    \vskip\titlepagebottomglue
2031     \finishedtitlepagetrue    \finishedtitlepagetrue
2032  }  }
2033    
2034    %%% Macros to be used within @titlepage:
2035    
2036    \let\subtitlerm=\tenrm
2037    \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}
2038    
2039    \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines
2040                    \let\tt=\authortt}
2041    
2042    \parseargdef\title{%
2043      \checkenv\titlepage
2044      \leftline{\titlefonts\rm #1}
2045      % print a rule at the page bottom also.
2046      \finishedtitlepagefalse
2047      \vskip4pt \hrule height 4pt width \hsize \vskip4pt
2048    }
2049    
2050    \parseargdef\subtitle{%
2051      \checkenv\titlepage
2052      {\subtitlefont \rightline{#1}}%
2053    }
2054    
2055    % @author should come last, but may come many times.
2056    % It can also be used inside @quotation.
2057    %
2058    \parseargdef\author{%
2059      \def\temp{\quotation}%
2060      \ifx\thisenv\temp
2061        \def\quotationauthor{#1}% printed in \Equotation.
2062      \else
2063        \checkenv\titlepage
2064        \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi
2065        {\authorfont \leftline{#1}}%
2066      \fi
2067    }
2068    
2069    
2070  %%% Set up page headings and footings.  %%% Set up page headings and footings.
2071    
2072  \let\thispage=\folio  \let\thispage=\folio
2073    
2074  \newtoks \evenheadline    % Token sequence for heading line of even pages  \newtoks\evenheadline    % headline on even pages
2075  \newtoks \oddheadline     % Token sequence for heading line of odd pages  \newtoks\oddheadline     % headline on odd pages
2076  \newtoks \evenfootline    % Token sequence for footing line of even pages  \newtoks\evenfootline    % footline on even pages
2077  \newtoks \oddfootline     % Token sequence for footing line of odd pages  \newtoks\oddfootline     % footline on odd pages
2078    
2079  % Now make Tex use those variables  % Now make TeX use those variables
2080  \headline={{\textfonts\rm \ifodd\pageno \the\oddheadline  \headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
2081                              \else \the\evenheadline \fi}}                              \else \the\evenheadline \fi}}
2082  \footline={{\textfonts\rm \ifodd\pageno \the\oddfootline  \footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
# Line 1472  where each line of input produces a line Line 2090  where each line of input produces a line
2090  % @evenfooting @thisfile||  % @evenfooting @thisfile||
2091  % @oddfooting ||@thisfile  % @oddfooting ||@thisfile
2092    
 \def\evenheading{\parsearg\evenheadingxxx}  
 \def\oddheading{\parsearg\oddheadingxxx}  
 \def\everyheading{\parsearg\everyheadingxxx}  
   
 \def\evenfooting{\parsearg\evenfootingxxx}  
 \def\oddfooting{\parsearg\oddfootingxxx}  
 \def\everyfooting{\parsearg\everyfootingxxx}  
2093    
2094  {\catcode`\@=0 %  \def\evenheading{\parsearg\evenheadingxxx}
2095    \def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish}
2096  \gdef\evenheadingxxx #1{\evenheadingyyy #1@|@|@|@|\finish}  \def\evenheadingyyy #1\|#2\|#3\|#4\finish{%
 \gdef\evenheadingyyy #1@|#2@|#3@|#4\finish{%  
2097  \global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}  \global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
2098    
2099  \gdef\oddheadingxxx #1{\oddheadingyyy #1@|@|@|@|\finish}  \def\oddheading{\parsearg\oddheadingxxx}
2100  \gdef\oddheadingyyy #1@|#2@|#3@|#4\finish{%  \def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish}
2101    \def\oddheadingyyy #1\|#2\|#3\|#4\finish{%
2102  \global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}  \global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
2103    
2104  \gdef\everyheadingxxx #1{\everyheadingyyy #1@|@|@|@|\finish}  \parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
 \gdef\everyheadingyyy #1@|#2@|#3@|#4\finish{%  
 \global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}  
 \global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}  
2105    
2106  \gdef\evenfootingxxx #1{\evenfootingyyy #1@|@|@|@|\finish}  \def\evenfooting{\parsearg\evenfootingxxx}
2107  \gdef\evenfootingyyy #1@|#2@|#3@|#4\finish{%  \def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish}
2108    \def\evenfootingyyy #1\|#2\|#3\|#4\finish{%
2109  \global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}  \global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
2110    
2111  \gdef\oddfootingxxx #1{\oddfootingyyy #1@|@|@|@|\finish}  \def\oddfooting{\parsearg\oddfootingxxx}
2112  \gdef\oddfootingyyy #1@|#2@|#3@|#4\finish{%  \def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish}
2113  \global\oddfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}  \def\oddfootingyyy #1\|#2\|#3\|#4\finish{%
2114      \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
2115  \gdef\everyfootingxxx #1{\everyfootingyyy #1@|@|@|@|\finish}    %
2116  \gdef\everyfootingyyy #1@|#2@|#3@|#4\finish{%    % Leave some space for the footline.  Hopefully ok to assume
2117  \global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}    % @evenfooting will not be used by itself.
2118  \global\oddfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}    \global\advance\pageheight by -\baselineskip
2119  %    \global\advance\vsize by -\baselineskip
2120  }% unbind the catcode of @.  }
2121    
2122    \parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}}
2123    
2124    
2125  % @headings double      turns headings on for double-sided printing.  % @headings double      turns headings on for double-sided printing.
2126  % @headings single      turns headings on for single-sided printing.  % @headings single      turns headings on for single-sided printing.
# Line 1522  where each line of input produces a line Line 2134  where each line of input produces a line
2134    
2135  \def\headings #1 {\csname HEADINGS#1\endcsname}  \def\headings #1 {\csname HEADINGS#1\endcsname}
2136    
2137  \def\HEADINGSoff{  \def\HEADINGSoff{%
2138  \global\evenheadline={\hfil} \global\evenfootline={\hfil}  \global\evenheadline={\hfil} \global\evenfootline={\hfil}
2139  \global\oddheadline={\hfil} \global\oddfootline={\hfil}}  \global\oddheadline={\hfil} \global\oddfootline={\hfil}}
2140  \HEADINGSoff  \HEADINGSoff
# Line 1531  where each line of input produces a line Line 2143  where each line of input produces a line
2143  % chapter name on inside top of right hand pages, document  % chapter name on inside top of right hand pages, document
2144  % title on inside top of left hand pages, and page numbers on outside top  % title on inside top of left hand pages, and page numbers on outside top
2145  % edge of all pages.  % edge of all pages.
2146  \def\HEADINGSdouble{  \def\HEADINGSdouble{%
2147  \global\pageno=1  \global\pageno=1
2148  \global\evenfootline={\hfil}  \global\evenfootline={\hfil}
2149  \global\oddfootline={\hfil}  \global\oddfootline={\hfil}
# Line 1543  where each line of input produces a line Line 2155  where each line of input produces a line
2155    
2156  % For single-sided printing, chapter title goes across top left of page,  % For single-sided printing, chapter title goes across top left of page,
2157  % page number on top right.  % page number on top right.
2158  \def\HEADINGSsingle{  \def\HEADINGSsingle{%
2159  \global\pageno=1  \global\pageno=1
2160  \global\evenfootline={\hfil}  \global\evenfootline={\hfil}
2161  \global\oddfootline={\hfil}  \global\oddfootline={\hfil}
# Line 1573  where each line of input produces a line Line 2185  where each line of input produces a line
2185  }  }
2186    
2187  % Subroutines used in generating headings  % Subroutines used in generating headings
2188  % Produces Day Month Year style of output.  % This produces Day Month Year style of output.
2189  \def\today{\number\day\space  % Only define if not already defined, in case a txi-??.tex file has set
2190  \ifcase\month\or  % up a different format (e.g., txi-cs.tex does this).
2191  January\or February\or March\or April\or May\or June\or  \ifx\today\undefined
2192  July\or August\or September\or October\or November\or December\fi  \def\today{%
2193  \space\number\year}    \number\day\space
2194      \ifcase\month
2195  % Use this if you want the Month Day, Year style of output.    \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
2196  %\def\today{\ifcase\month\or    \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
2197  %January\or February\or March\or April\or May\or June\or    \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
2198  %July\or August\or September\or October\or November\or December\fi    \fi
2199  %\space\number\day, \number\year}    \space\number\year}
2200    \fi
 % @settitle line...  specifies the title of the document, for headings  
 % It generates no output of its own  
   
 \def\thistitle{No Title}  
 \def\settitle{\parsearg\settitlezzz}  
 \def\settitlezzz #1{\gdef\thistitle{#1}}  
   
   
 \message{tables,}  
   
 % @tabs -- simple alignment  
2201    
2202  % These don't work.  For one thing, \+ is defined as outer.  % @settitle line...  specifies the title of the document, for headings.
2203  % So these macros cannot even be defined.  % It generates no output of its own.
2204    \def\thistitle{\putwordNoTitle}
2205    \def\settitle{\parsearg{\gdef\thistitle}}
2206    
 %\def\tabs{\parsearg\tabszzz}  
 %\def\tabszzz #1{\settabs\+#1\cr}  
 %\def\tabline{\parsearg\tablinezzz}  
 %\def\tablinezzz #1{\+#1\cr}  
 %\def\&{&}  
2207    
2208  % Tables -- @table, @ftable, @vtable, @item(x), @kitem(x), @xitem(x).  \message{tables,}
2209    % Tables -- @table, @ftable, @vtable, @item(x).
2210    
2211  % default indentation of table text  % default indentation of table text
2212  \newdimen\tableindent \tableindent=.8in  \newdimen\tableindent \tableindent=.8in
# Line 1619  July\or August\or September\or October\o Line 2218  July\or August\or September\or October\o
2218  % used internally for \itemindent minus \itemmargin  % used internally for \itemindent minus \itemmargin
2219  \newdimen\itemmax  \newdimen\itemmax
2220    
2221  % Note @table, @vtable, and @vtable define @item, @itemx, etc., with  % Note @table, @ftable, and @vtable define @item, @itemx, etc., with
2222  % these defs.  % these defs.
2223  % They also define \itemindex  % They also define \itemindex
2224  % to index the item name in whatever manner is desired (perhaps none).  % to index the item name in whatever manner is desired (perhaps none).
# Line 1631  July\or August\or September\or October\o Line 2230  July\or August\or September\or October\o
2230  \def\internalBitem{\smallbreak \parsearg\itemzzz}  \def\internalBitem{\smallbreak \parsearg\itemzzz}
2231  \def\internalBitemx{\itemxpar \parsearg\itemzzz}  \def\internalBitemx{\itemxpar \parsearg\itemzzz}
2232    
 \def\internalBxitem "#1"{\def\xitemsubtopix{#1} \smallbreak \parsearg\xitemzzz}  
 \def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \itemxpar \parsearg\xitemzzz}  
   
 \def\internalBkitem{\smallbreak \parsearg\kitemzzz}  
 \def\internalBkitemx{\itemxpar \parsearg\kitemzzz}  
   
 \def\kitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \lastfunction}}%  
                  \itemzzz {#1}}  
   
 \def\xitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \xitemsubtopic}}%  
                  \itemzzz {#1}}  
   
2233  \def\itemzzz #1{\begingroup %  \def\itemzzz #1{\begingroup %
2234    \advance\hsize by -\rightskip    \advance\hsize by -\rightskip
2235    \advance\hsize by -\tableindent    \advance\hsize by -\tableindent
2236    \setbox0=\hbox{\itemfont{#1}}%    \setbox0=\hbox{\itemindicate{#1}}%
2237    \itemindex{#1}%    \itemindex{#1}%
2238    \nobreak % This prevents a break before @itemx.    \nobreak % This prevents a break before @itemx.
2239    %    %
   % Be sure we are not still in the middle of a paragraph.  
   %{\parskip = 0in  
   %\par  
   %}%  
   %  
2240    % If the item text does not fit in the space we have, put it on a line    % If the item text does not fit in the space we have, put it on a line
2241    % by itself, and do not allow a page break either before or after that    % by itself, and do not allow a page break either before or after that
2242    % line.  We do not start a paragraph here because then if the next    % line.  We do not start a paragraph here because then if the next
# Line 1675  July\or August\or September\or October\o Line 2257  July\or August\or September\or October\o
2257      % \parskip glue -- logically it's part of the @item we just started.      % \parskip glue -- logically it's part of the @item we just started.
2258      \nobreak \vskip-\parskip      \nobreak \vskip-\parskip
2259      %      %
2260      % Stop a page break at the \parskip glue coming up.  Unfortunately      % Stop a page break at the \parskip glue coming up.  (Unfortunately
2261      % we can't prevent a possible page break at the following      % we can't prevent a possible page break at the following
2262      % \baselineskip glue.      % \baselineskip glue.)  However, if what follows is an environment
2263      \nobreak      % such as @example, there will be no \parskip glue; then
2264        % the negative vskip we just would cause the example and the item to
2265        % crash together.  So we use this bizarre value of 10001 as a signal
2266        % to \aboveenvbreak to insert \parskip glue after all.
2267        % (Possibly there are other commands that could be followed by
2268        % @example which need the same treatment, but not section titles; or
2269        % maybe section titles are the only special case and they should be
2270        % penalty 10001...)
2271        \penalty 10001
2272      \endgroup      \endgroup
2273      \itemxneedsnegativevskipfalse      \itemxneedsnegativevskipfalse
2274    \else    \else
2275      % The item text fits into the space.  Start a paragraph, so that the      % The item text fits into the space.  Start a paragraph, so that the
2276      % following text (if any) will end up on the same line.  Since that      % following text (if any) will end up on the same line.
     % text will be indented by \tableindent, we make the item text be in  
     % a zero-width box.  
2277      \noindent      \noindent
2278      \rlap{\hskip -\tableindent\box0}\ignorespaces%      % Do this with kerns and \unhbox so that if there is a footnote in
2279      \endgroup%      % the item text, it can migrate to the main vertical list and
2280      \itemxneedsnegativevskiptrue%      % eventually be printed.
2281    \fi      \nobreak\kern-\tableindent
2282  }      \dimen0 = \itemmax  \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0
2283        \unhbox0
2284  \def\item{\errmessage{@item while not in a table}}      \nobreak\kern\dimen0
2285  \def\itemx{\errmessage{@itemx while not in a table}}      \endgroup
2286  \def\kitem{\errmessage{@kitem while not in a table}}      \itemxneedsnegativevskiptrue
2287  \def\kitemx{\errmessage{@kitemx while not in a table}}    \fi
 \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  
 \def\description{\tablez{\dontindex}{1}{}{}{}{}}  
   
 \def\table{\begingroup\inENV\obeylines\obeyspaces\tablex}  
 {\obeylines\obeyspaces%  
 \gdef\tablex #1^^M{%  
 \tabley\dontindex#1        \endtabley}}  
   
 \def\ftable{\begingroup\inENV\obeylines\obeyspaces\ftablex}  
 {\obeylines\obeyspaces%  
 \gdef\ftablex #1^^M{%  
 \tabley\fnitemindex#1        \endtabley  
 \def\Eftable{\endgraf\afterenvbreak\endgroup}%  
 \let\Etable=\relax}}  
   
 \def\vtable{\begingroup\inENV\obeylines\obeyspaces\vtablex}  
 {\obeylines\obeyspaces%  
 \gdef\vtablex #1^^M{%  
 \tabley\vritemindex#1        \endtabley  
 \def\Evtable{\endgraf\afterenvbreak\endgroup}%  
 \let\Etable=\relax}}  
   
 \def\dontindex #1{}  
 \def\fnitemindex #1{\doind {fn}{\code{#1}}}%  
 \def\vritemindex #1{\doind {vr}{\code{#1}}}%  
   
 {\obeyspaces %  
 \gdef\tabley#1#2 #3 #4 #5 #6 #7\endtabley{\endgroup%  
 \tablez{#1}{#2}{#3}{#4}{#5}{#6}}}  
   
 \def\tablez #1#2#3#4#5#6{%  
 \aboveenvbreak %  
 \begingroup %  
 \def\Edescription{\Etable}% Necessary kludge.  
 \let\itemindex=#1%  
 \ifnum 0#3>0 \advance \leftskip by #3\mil \fi %  
 \ifnum 0#4>0 \tableindent=#4\mil \fi %  
 \ifnum 0#5>0 \advance \rightskip by #5\mil \fi %  
 \def\itemfont{#2}%  
 \itemmax=\tableindent %  
 \advance \itemmax by -\itemmargin %  
 \advance \leftskip by \tableindent %  
 \exdentamount=\tableindent  
 \parindent = 0pt  
 \parskip = \smallskipamount  
 \ifdim \parskip=0pt \parskip=2pt \fi%  
 \def\Etable{\endgraf\afterenvbreak\endgroup}%  
 \let\item = \internalBitem %  
 \let\itemx = \internalBitemx %  
 \let\kitem = \internalBkitem %  
 \let\kitemx = \internalBkitemx %  
 \let\xitem = \internalBxitem %  
 \let\xitemx = \internalBxitemx %  
2288  }  }
2289    
2290    \def\item{\errmessage{@item while not in a list environment}}
2291    \def\itemx{\errmessage{@itemx while not in a list environment}}
2292    
2293    % @table, @ftable, @vtable.
2294    \envdef\table{%
2295      \let\itemindex\gobble
2296      \tablex
2297    }
2298    \envdef\ftable{%
2299      \def\itemindex ##1{\doind {fn}{\code{##1}}}%
2300      \tablex
2301    }
2302    \envdef\vtable{%
2303      \def\itemindex ##1{\doind {vr}{\code{##1}}}%
2304      \tablex
2305    }
2306    \def\tablex#1{%
2307      \def\itemindicate{#1}%
2308      \parsearg\tabley
2309    }
2310    \def\tabley#1{%
2311      {%
2312        \makevalueexpandable
2313        \edef\temp{\noexpand\tablez #1\space\space\space}%
2314        \expandafter
2315      }\temp \endtablez
2316    }
2317    \def\tablez #1 #2 #3 #4\endtablez{%
2318      \aboveenvbreak
2319      \ifnum 0#1>0 \advance \leftskip by #1\mil \fi
2320      \ifnum 0#2>0 \tableindent=#2\mil \fi
2321      \ifnum 0#3>0 \advance \rightskip by #3\mil \fi
2322      \itemmax=\tableindent
2323      \advance \itemmax by -\itemmargin
2324      \advance \leftskip by \tableindent
2325      \exdentamount=\tableindent
2326      \parindent = 0pt
2327      \parskip = \smallskipamount
2328      \ifdim \parskip=0pt \parskip=2pt \fi
2329      \let\item = \internalBitem
2330      \let\itemx = \internalBitemx
2331    }
2332    \def\Etable{\endgraf\afterenvbreak}
2333    \let\Eftable\Etable
2334    \let\Evtable\Etable
2335    \let\Eitemize\Etable
2336    \let\Eenumerate\Etable
2337    
2338  % This is the counter used by @enumerate, which is really @itemize  % This is the counter used by @enumerate, which is really @itemize
2339    
2340  \newcount \itemno  \newcount \itemno
2341    
2342  \def\itemize{\parsearg\itemizezzz}  \envdef\itemize{\parsearg\doitemize}
2343    
2344  \def\itemizezzz #1{%  \def\doitemize#1{%
2345    \begingroup % ended by the @end itemsize    \aboveenvbreak
2346    \itemizey {#1}{\Eitemize}    \itemmax=\itemindent
2347  }    \advance\itemmax by -\itemmargin
2348      \advance\leftskip by \itemindent
2349  \def\itemizey #1#2{%    \exdentamount=\itemindent
2350  \aboveenvbreak %    \parindent=0pt
2351  \itemmax=\itemindent %    \parskip=\smallskipamount
2352  \advance \itemmax by -\itemmargin %    \ifdim\parskip=0pt \parskip=2pt \fi
2353  \advance \leftskip by \itemindent %    \def\itemcontents{#1}%
2354  \exdentamount=\itemindent    % @itemize with no arg is equivalent to @itemize @bullet.
2355  \parindent = 0pt %    \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi
2356  \parskip = \smallskipamount %    \let\item=\itemizeitem
2357  \ifdim \parskip=0pt \parskip=2pt \fi%  }
 \def#2{\endgraf\afterenvbreak\endgroup}%  
 \def\itemcontents{#1}%  
 \let\item=\itemizeitem}  
2358    
2359  % Set sfcode to normal for the chars that usually have another value.  % Definition of @item while inside @itemize and @enumerate.
2360  % These are `.?!:;,'  %
2361  \def\frenchspacing{\sfcode46=1000 \sfcode63=1000 \sfcode33=1000  \def\itemizeitem{%
2362    \sfcode58=1000 \sfcode59=1000 \sfcode44=1000 }    \advance\itemno by 1  % for enumerations
2363      {\let\par=\endgraf \smallbreak}% reasonable place to break
2364      {%
2365       % If the document has an @itemize directly after a section title, a
2366       % \nobreak will be last on the list, and \sectionheading will have
2367       % done a \vskip-\parskip.  In that case, we don't want to zero
2368       % parskip, or the item text will crash with the heading.  On the
2369       % other hand, when there is normal text preceding the item (as there
2370       % usually is), we do want to zero parskip, or there would be too much
2371       % space.  In that case, we won't have a \nobreak before.  At least
2372       % that's the theory.
2373       \ifnum\lastpenalty<10000 \parskip=0in \fi
2374       \noindent
2375       \hbox to 0pt{\hss \itemcontents \kern\itemmargin}%
2376       \vadjust{\penalty 1200}}% not good to break after first line of item.
2377      \flushcr
2378    }
2379    
2380  % \splitoff TOKENS\endmark defines \first to be the first token in  % \splitoff TOKENS\endmark defines \first to be the first token in
2381  % TOKENS, and \rest to be the remainder.  % TOKENS, and \rest to be the remainder.
# Line 1793  July\or August\or September\or October\o Line 2386  July\or August\or September\or October\o
2386  % or number, to specify the first label in the enumerated list.  No  % or number, to specify the first label in the enumerated list.  No
2387  % argument is the same as `1'.  % argument is the same as `1'.
2388  %  %
2389  \def\enumerate{\parsearg\enumeratezzz}  \envparseargdef\enumerate{\enumeratey #1  \endenumeratey}
 \def\enumeratezzz #1{\enumeratey #1  \endenumeratey}  
2390  \def\enumeratey #1 #2\endenumeratey{%  \def\enumeratey #1 #2\endenumeratey{%
   \begingroup % ended by the @end enumerate  
   %  
2391    % If we were given no argument, pretend we were given `1'.    % If we were given no argument, pretend we were given `1'.
2392    \def\thearg{#1}%    \def\thearg{#1}%
2393    \ifx\thearg\empty \def\thearg{1}\fi    \ifx\thearg\empty \def\thearg{1}\fi
# Line 1868  July\or August\or September\or October\o Line 2458  July\or August\or September\or October\o
2458    }%    }%
2459  }  }
2460    
2461  % Call itemizey, adding a period to the first argument and supplying the  % Call \doitemize, adding a period to the first argument and supplying the
2462  % common last two arguments.  Also subtract one from the initial value in  % common last two arguments.  Also subtract one from the initial value in
2463  % \itemno, since @item increments \itemno.  % \itemno, since @item increments \itemno.
2464  %  %
2465  \def\startenumeration#1{%  \def\startenumeration#1{%
2466    \advance\itemno by -1    \advance\itemno by -1
2467    \itemizey{#1.}\Eenumerate\flushcr    \doitemize{#1.}\flushcr
2468  }  }
2469    
2470  % @alphaenumerate and @capsenumerate are abbreviations for giving an arg  % @alphaenumerate and @capsenumerate are abbreviations for giving an arg
# Line 1885  July\or August\or September\or October\o Line 2475  July\or August\or September\or October\o
2475  \def\Ealphaenumerate{\Eenumerate}  \def\Ealphaenumerate{\Eenumerate}
2476  \def\Ecapsenumerate{\Eenumerate}  \def\Ecapsenumerate{\Eenumerate}
2477    
 % Definition of @item while inside @itemize.  
   
 \def\itemizeitem{%  
 \advance\itemno by 1  
 {\let\par=\endgraf \smallbreak}%  
 \ifhmode \errmessage{In hmode at itemizeitem}\fi  
 {\parskip=0in \hskip 0pt  
 \hbox to 0pt{\hss \itemcontents\hskip \itemmargin}%  
 \vadjust{\penalty 1200}}%  
 \flushcr}  
2478    
2479  % @multitable macros  % @multitable macros
2480  % Amy Hendrickson, 8/18/94, 3/6/96  % Amy Hendrickson, 8/18/94, 3/6/96
# Line 1921  July\or August\or September\or October\o Line 2501  July\or August\or September\or October\o
2501  %   @multitable {Column 1 template} {Column 2 template} {Column 3 template}  %   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
2502  %   @item ...  %   @item ...
2503  %   using the widest term desired in each column.  %   using the widest term desired in each column.
 %  
 % For those who want to use more than one line's worth of words in  
 % the preamble, break the line within one argument and it  
 % will parse correctly, i.e.,  
 %  
 %     @multitable {Column 1 template} {Column 2 template} {Column 3  
 %      template}  
 % Not:  
 %     @multitable {Column 1 template} {Column 2 template}  
 %      {Column 3 template}  
2504    
2505  % Each new table line starts with @item, each subsequent new column  % Each new table line starts with @item, each subsequent new column
2506  % starts with @tab. Empty columns may be produced by supplying @tab's  % starts with @tab. Empty columns may be produced by supplying @tab's
2507  % with nothing between them for as many times as empty columns are needed,  % with nothing between them for as many times as empty columns are needed,
2508  % ie, @tab@tab@tab will produce two empty columns.  % ie, @tab@tab@tab will produce two empty columns.
2509    
2510  % @item, @tab, @multitable or @end multitable do not need to be on their  % @item, @tab do not need to be on their own lines, but it will not hurt
2511  % own lines, but it will not hurt if they are.  % if they are.
2512    
2513  % Sample multitable:  % Sample multitable:
2514    
# Line 1964  July\or August\or September\or October\o Line 2534  July\or August\or September\or October\o
2534  % @multitablelinespace is space to leave between table items, baseline  % @multitablelinespace is space to leave between table items, baseline
2535  %                                                            to baseline.  %                                                            to baseline.
2536  %   0pt means it depends on current normal line spacing.  %   0pt means it depends on current normal line spacing.
2537    %
 %%%%  
 % Dimensions  
   
2538  \newskip\multitableparskip  \newskip\multitableparskip
2539  \newskip\multitableparindent  \newskip\multitableparindent
2540  \newdimen\multitablecolspace  \newdimen\multitablecolspace
# Line 1977  July\or August\or September\or October\o Line 2544  July\or August\or September\or October\o
2544  \multitablecolspace=12pt  \multitablecolspace=12pt
2545  \multitablelinespace=0pt  \multitablelinespace=0pt
2546    
 %%%%  
2547  % Macros used to set up halign preamble:  % Macros used to set up halign preamble:
2548    %
2549  \let\endsetuptable\relax  \let\endsetuptable\relax
2550  \def\xendsetuptable{\endsetuptable}  \def\xendsetuptable{\endsetuptable}
2551  \let\columnfractions\relax  \let\columnfractions\relax
2552  \def\xcolumnfractions{\columnfractions}  \def\xcolumnfractions{\columnfractions}
2553  \newif\ifsetpercent  \newif\ifsetpercent
2554    
2555  %% 2/1/96, to allow fractions to be given with more than one digit.  % #1 is the @columnfraction, usually a decimal number like .5, but might
2556  \def\pickupwholefraction#1 {\global\advance\colcount by1 %  % be just 1.  We just use it, whatever it is.
2557  \expandafter\xdef\csname col\the\colcount\endcsname{.#1\hsize}%  %
2558  \setuptable}  \def\pickupwholefraction#1 {%
2559      \global\advance\colcount by 1
2560      \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}%
2561      \setuptable
2562    }
2563    
2564  \newcount\colcount  \newcount\colcount
2565  \def\setuptable#1{\def\firstarg{#1}%  \def\setuptable#1{%
2566  \ifx\firstarg\xendsetuptable\let\go\relax%    \def\firstarg{#1}%
2567  \else    \ifx\firstarg\xendsetuptable
2568    \ifx\firstarg\xcolumnfractions\global\setpercenttrue%      \let\go = \relax
2569    \else    \else
2570      \ifsetpercent      \ifx\firstarg\xcolumnfractions
2571         \let\go\pickupwholefraction   % In this case arg of setuptable        \global\setpercenttrue
                                      % is the decimal point before the  
                                      % number given in percent of hsize.  
                                      % We don't need this so we don't use it.  
2572      \else      \else
2573         \global\advance\colcount by1        \ifsetpercent
2574         \setbox0=\hbox{#1 }% Add a normal word space as a separator;           \let\go\pickupwholefraction
2575                            % typically that is always in the input, anyway.        \else
2576         \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%           \global\advance\colcount by 1
2577             \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a
2578                       % separator; typically that is always in the input, anyway.
2579             \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
2580          \fi
2581        \fi
2582        \ifx\go\pickupwholefraction
2583          % Put the argument back for the \pickupwholefraction call, so
2584          % we'll always have a period there to be parsed.
2585          \def\go{\pickupwholefraction#1}%
2586        \else
2587          \let\go = \setuptable
2588      \fi%      \fi%
2589    \fi%    \fi
2590  \ifx\go\pickupwholefraction\else\let\go\setuptable\fi%    \go
2591  \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.  
2592    
2593    % multitable-only commands.
2594    %
2595    % @headitem starts a heading row, which we typeset in bold.
2596    % Assignments have to be global since we are inside the implicit group
2597    % of an alignment entry.  Note that \everycr resets \everytab.
2598    \def\headitem{\checkenv\multitable \crcr \global\everytab={\bf}\the\everytab}%
2599    %
2600    % A \tab used to include \hskip1sp.  But then the space in a template
2601    % line is not enough.  That is bad.  So let's go back to just `&' until
2602    % we encounter the problem it was intended to solve again.
2603    %                                       --karl, nathan@acm.org, 20apr99.
2604    \def\tab{\checkenv\multitable &\the\everytab}%
2605    
 %%%%  
2606  % @multitable ... @end multitable definitions:  % @multitable ... @end multitable definitions:
2607    %
2608  \def\multitable{\parsearg\dotable}  \newtoks\everytab  % insert after every tab.
2609    %
2610  \def\dotable#1{\bgroup  \envdef\multitable{%
2611  \let\item\cr    \vskip\parskip
2612  \tolerance=9500    \startsavinginserts
2613  \hbadness=9500    %
2614  \setmultitablespacing    % @item within a multitable starts a normal row.
2615  \parskip=\multitableparskip    \let\item\crcr
2616  \parindent=\multitableparindent    %
2617  \overfullrule=0pt    \tolerance=9500
2618  \global\colcount=0\relax%    \hbadness=9500
2619  \def\Emultitable{\global\setpercentfalse\global\everycr{}\cr\egroup\egroup}%    \setmultitablespacing
2620   % To parse everything between @multitable and @item :    \parskip=\multitableparskip
2621  \setuptable#1 \endsetuptable    \parindent=\multitableparindent
2622   % Need to reset this to 0 after \setuptable.    \overfullrule=0pt
2623  \global\colcount=0\relax%    \global\colcount=0
2624   %    %
2625   % This preamble sets up a generic column definition, which will    \everycr = {%
2626   % be used as many times as user calls for columns.      \noalign{%
2627   % \vtop will set a single line and will also let text wrap and        \global\everytab={}%
2628   % continue for many paragraphs if desired.        \global\colcount=0 % Reset the column counter.
2629  \halign\bgroup&\global\advance\colcount by 1\relax%        % Check for saved footnotes, etc.
2630  \multistrut\vtop{\hsize=\expandafter\csname col\the\colcount\endcsname        \checkinserts
2631   % In order to keep entries from bumping into each other        % Keeps underfull box messages off when table breaks over pages.
2632   % we will add a \leftskip of \multitablecolspace to all columns after        %\filbreak
2633   % the first one.          % Maybe so, but it also creates really weird page breaks when the
2634   %  If a template has been used, we will add \multitablecolspace          % table breaks over pages. Wouldn't \vfil be better?  Wait until the
2635   % to the width of each template entry.          % problem manifests itself, so it can be fixed for real --karl.
2636   %  If user has set preamble in terms of percent of \hsize      }%
2637   % we will use that dimension as the width of the column, and    }%
2638   % the \leftskip will keep entries from bumping into each other.    %
2639   % Table will start at left margin and final column will justify at    \parsearg\domultitable
2640   % right margin.  }
2641  \ifnum\colcount=1  \def\domultitable#1{%
2642  \else    % To parse everything between @multitable and @item:
2643    \ifsetpercent    \setuptable#1 \endsetuptable
2644    \else    %
2645     % If user has <not> set preamble in terms of percent of \hsize    % This preamble sets up a generic column definition, which will
2646     % we will advance \hsize by \multitablecolspace    % be used as many times as user calls for columns.
2647    \advance\hsize by \multitablecolspace    % \vtop will set a single line and will also let text wrap and
2648    \fi    % continue for many paragraphs if desired.
2649   % In either case we will make \leftskip=\multitablecolspace:    \halign\bgroup &%
2650  \leftskip=\multitablecolspace      \global\advance\colcount by 1
2651  \fi      \multistrut
2652   % Ignoring space at the beginning and end avoids an occasional spurious      \vtop{%
2653   % blank line, when TeX decides to break the line at the space before the        % Use the current \colcount to find the correct column width:
2654   % box from the multistrut, so the strut ends up on a line by itself.        \hsize=\expandafter\csname col\the\colcount\endcsname
2655   % For example:        %
2656   % @multitable @columnfractions .11 .89        % In order to keep entries from bumping into each other
2657   % @item @code{#}        % we will add a \leftskip of \multitablecolspace to all columns after
2658   % @tab Legal holiday which is valid in major parts of the whole country.        % the first one.
2659   % Is automatically provided with highlighting sequences respectively marking        %
2660   % characters.        % If a template has been used, we will add \multitablecolspace
2661   \noindent\ignorespaces##\unskip\multistrut}\cr        % to the width of each template entry.
2662   % \everycr will reset column counter, \colcount, at the end of        %
2663   % each line. Every column  entry will cause \colcount to advance by one.        % If the user has set preamble in terms of percent of \hsize we will
2664   % The table preamble        % use that dimension as the width of the column, and the \leftskip
2665   % looks at the current \colcount to find the correct column width.        % will keep entries from bumping into each other.  Table will start at
2666  \global\everycr{\noalign{%        % left margin and final column will justify at right margin.
2667  % \filbreak%% keeps underfull box messages off when table breaks over pages.        %
2668  % Maybe so, but it also creates really weird page breaks when the table        % Make sure we don't inherit \rightskip from the outer environment.
2669  % breaks over pages Wouldn't \vfil be better?  Wait until the problem        \rightskip=0pt
2670  % manifests itself, so it can be fixed for real --karl.        \ifnum\colcount=1
2671  \global\colcount=0\relax}}          % The first column will be indented with the surrounding text.
2672            \advance\hsize by\leftskip
2673          \else
2674            \ifsetpercent \else
2675              % If user has not set preamble in terms of percent of \hsize
2676              % we will advance \hsize by \multitablecolspace.
2677              \advance\hsize by \multitablecolspace
2678            \fi
2679           % In either case we will make \leftskip=\multitablecolspace:
2680          \leftskip=\multitablecolspace
2681          \fi
2682          % Ignoring space at the beginning and end avoids an occasional spurious
2683          % blank line, when TeX decides to break the line at the space before the
2684          % box from the multistrut, so the strut ends up on a line by itself.
2685          % For example:
2686          % @multitable @columnfractions .11 .89
2687          % @item @code{#}
2688          % @tab Legal holiday which is valid in major parts of the whole country.
2689          % Is automatically provided with highlighting sequences respectively
2690          % marking characters.
2691          \noindent\ignorespaces##\unskip\multistrut
2692        }\cr
2693    }
2694    \def\Emultitable{%
2695      \crcr
2696      \egroup % end the \halign
2697      \global\setpercentfalse
2698  }  }
2699    
2700  \def\setmultitablespacing{% test to see if user has set \multitablelinespace.  \def\setmultitablespacing{% test to see if user has set \multitablelinespace.
2701  % If so, do nothing. If not, give it an appropriate dimension based on  % If so, do nothing. If not, give it an appropriate dimension based on
2702  % current baselineskip.  % current baselineskip.
2703  \ifdim\multitablelinespace=0pt  \ifdim\multitablelinespace=0pt
2704    \setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
2705    \global\advance\multitablelinespace by-\ht0
2706  %% strut to put in table in case some entry doesn't have descenders,  %% strut to put in table in case some entry doesn't have descenders,
2707  %% to keep lines equally spaced  %% to keep lines equally spaced
2708  \let\multistrut = \strut  \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.  
2709  \else  \else
2710    %% FIXME: what is \box0 supposed to be?
2711  \gdef\multistrut{\vrule height\multitablelinespace depth\dp0  \gdef\multistrut{\vrule height\multitablelinespace depth\dp0
2712  width0pt\relax} \fi  width0pt\relax} \fi
2713    %% Test to see if parskip is larger than space between lines of
2714    %% table. If not, do nothing.
2715    %%        If so, set to same dimension as multitablelinespace.
2716  \ifdim\multitableparskip>\multitablelinespace  \ifdim\multitableparskip>\multitablelinespace
2717  \global\multitableparskip=\multitablelinespace  \global\multitableparskip=\multitablelinespace
2718  \global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller  \global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
# Line 2112  width0pt\relax} \fi Line 2725  width0pt\relax} \fi
2725  \fi}  \fi}
2726    
2727    
2728    \message{conditionals,}
2729    
2730    % @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext,
2731    % @ifnotxml always succeed.  They currently do nothing; we don't
2732    % attempt to check whether the conditionals are properly nested.  But we
2733    % have to remember that they are conditionals, so that @end doesn't
2734    % attempt to close an environment group.
2735    %
2736    \def\makecond#1{%
2737      \expandafter\let\csname #1\endcsname = \relax
2738      \expandafter\let\csname iscond.#1\endcsname = 1
2739    }
2740    \makecond{iftex}
2741    \makecond{ifnotdocbook}
2742    \makecond{ifnothtml}
2743    \makecond{ifnotinfo}
2744    \makecond{ifnotplaintext}
2745    \makecond{ifnotxml}
2746    
2747    % Ignore @ignore, @ifhtml, @ifinfo, and the like.
2748    %
2749    \def\direntry{\doignore{direntry}}
2750    \def\documentdescription{\doignore{documentdescription}}
2751    \def\docbook{\doignore{docbook}}
2752    \def\html{\doignore{html}}
2753    \def\ifdocbook{\doignore{ifdocbook}}
2754    \def\ifhtml{\doignore{ifhtml}}
2755    \def\ifinfo{\doignore{ifinfo}}
2756    \def\ifnottex{\doignore{ifnottex}}
2757    \def\ifplaintext{\doignore{ifplaintext}}
2758    \def\ifxml{\doignore{ifxml}}
2759    \def\ignore{\doignore{ignore}}
2760    \def\menu{\doignore{menu}}
2761    \def\xml{\doignore{xml}}
2762    
2763    % Ignore text until a line `@end #1', keeping track of nested conditionals.
2764    %
2765    % A count to remember the depth of nesting.
2766    \newcount\doignorecount
2767    
2768    \def\doignore#1{\begingroup
2769      % Scan in ``verbatim'' mode:
2770      \catcode`\@ = \other
2771      \catcode`\{ = \other
2772      \catcode`\} = \other
2773      %
2774      % Make sure that spaces turn into tokens that match what \doignoretext wants.
2775      \spaceisspace
2776      %
2777      % Count number of #1's that we've seen.
2778      \doignorecount = 0
2779      %
2780      % Swallow text until we reach the matching `@end #1'.
2781      \dodoignore {#1}%
2782    }
2783    
2784    { \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source.
2785      \obeylines %
2786      %
2787      \gdef\dodoignore#1{%
2788        % #1 contains the string `ifinfo'.
2789        %
2790        % Define a command to find the next `@end #1', which must be on a line
2791        % by itself.
2792        \long\def\doignoretext##1^^M@end #1{\doignoretextyyy##1^^M@#1\_STOP_}%
2793        % And this command to find another #1 command, at the beginning of a
2794        % line.  (Otherwise, we would consider a line `@c @ifset', for
2795        % example, to count as an @ifset for nesting.)
2796        \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}%
2797        %
2798        % And now expand that command.
2799        \obeylines %
2800        \doignoretext ^^M%
2801      }%
2802    }
2803    
2804    \def\doignoreyyy#1{%
2805      \def\temp{#1}%
2806      \ifx\temp\empty                       % Nothing found.
2807        \let\next\doignoretextzzz
2808      \else                                 % Found a nested condition, ...
2809        \advance\doignorecount by 1
2810        \let\next\doignoretextyyy           % ..., look for another.
2811        % If we're here, #1 ends with ^^M\ifinfo (for example).
2812      \fi
2813      \next #1% the token \_STOP_ is present just after this macro.
2814    }
2815    
2816    % We have to swallow the remaining "\_STOP_".
2817    %
2818    \def\doignoretextzzz#1{%
2819      \ifnum\doignorecount = 0      % We have just found the outermost @end.
2820        \let\next\enddoignore
2821      \else                         % Still inside a nested condition.
2822        \advance\doignorecount by -1
2823        \let\next\doignoretext      % Look for the next @end.
2824      \fi
2825      \next
2826    }
2827    
2828    % Finish off ignored text.
2829    \def\enddoignore{\endgroup\ignorespaces}
2830    
2831    
2832    % @set VAR sets the variable VAR to an empty value.
2833    % @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
2834    %
2835    % Since we want to separate VAR from REST-OF-LINE (which might be
2836    % empty), we can't just use \parsearg; we have to insert a space of our
2837    % own to delimit the rest of the line, and then take it out again if we
2838    % didn't need it.
2839    % We rely on the fact that \parsearg sets \catcode`\ =10.
2840    %
2841    \parseargdef\set{\setyyy#1 \endsetyyy}
2842    \def\setyyy#1 #2\endsetyyy{%
2843      {%
2844        \makevalueexpandable
2845        \def\temp{#2}%
2846        \edef\next{\gdef\makecsname{SET#1}}%
2847        \ifx\temp\empty
2848          \next{}%
2849        \else
2850          \setzzz#2\endsetzzz
2851        \fi
2852      }%
2853    }
2854    % Remove the trailing space \setxxx inserted.
2855    \def\setzzz#1 \endsetzzz{\next{#1}}
2856    
2857    % @clear VAR clears (i.e., unsets) the variable VAR.
2858    %
2859    \parseargdef\clear{%
2860      {%
2861        \makevalueexpandable
2862        \global\expandafter\let\csname SET#1\endcsname=\relax
2863      }%
2864    }
2865    
2866    % @value{foo} gets the text saved in variable foo.
2867    \def\value{\begingroup\makevalueexpandable\valuexxx}
2868    \def\valuexxx#1{\expandablevalue{#1}\endgroup}
2869    {
2870      \catcode`\- = \active \catcode`\_ = \active
2871      %
2872      \gdef\makevalueexpandable{%
2873        \let\value = \expandablevalue
2874        % We don't want these characters active, ...
2875        \catcode`\-=\other \catcode`\_=\other
2876        % ..., but we might end up with active ones in the argument if
2877        % we're called from @code, as @code{@value{foo-bar_}}, though.
2878        % So \let them to their normal equivalents.
2879        \let-\realdash \let_\normalunderscore
2880      }
2881    }
2882    
2883    % We have this subroutine so that we can handle at least some @value's
2884    % properly in indexes (we call \makevalueexpandable in \indexdummies).
2885    % The command has to be fully expandable (if the variable is set), since
2886    % the result winds up in the index file.  This means that if the
2887    % variable's value contains other Texinfo commands, it's almost certain
2888    % it will fail (although perhaps we could fix that with sufficient work
2889    % to do a one-level expansion on the result, instead of complete).
2890    %
2891    \def\expandablevalue#1{%
2892      \expandafter\ifx\csname SET#1\endcsname\relax
2893        {[No value for ``#1'']}%
2894        \message{Variable `#1', used in @value, is not set.}%
2895      \else
2896        \csname SET#1\endcsname
2897      \fi
2898    }
2899    
2900    % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
2901    % with @set.
2902    %
2903    % To get special treatment of `@end ifset,' call \makeond and the redefine.
2904    %
2905    \makecond{ifset}
2906    \def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}}
2907    \def\doifset#1#2{%
2908      {%
2909        \makevalueexpandable
2910        \let\next=\empty
2911        \expandafter\ifx\csname SET#2\endcsname\relax
2912          #1% If not set, redefine \next.
2913        \fi
2914        \expandafter
2915      }\next
2916    }
2917    \def\ifsetfail{\doignore{ifset}}
2918    
2919    % @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been
2920    % defined with @set, or has been undefined with @clear.
2921    %
2922    % The `\else' inside the `\doifset' parameter is a trick to reuse the
2923    % above code: if the variable is not set, do nothing, if it is set,
2924    % then redefine \next to \ifclearfail.
2925    %
2926    \makecond{ifclear}
2927    \def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}}
2928    \def\ifclearfail{\doignore{ifclear}}
2929    
2930    % @dircategory CATEGORY  -- specify a category of the dir file
2931    % which this file should belong to.  Ignore this in TeX.
2932    \let\dircategory=\comment
2933    
2934    % @defininfoenclose.
2935    \let\definfoenclose=\comment
2936    
2937    
2938  \message{indexing,}  \message{indexing,}
2939  % Index generation facilities  % Index generation facilities
2940    
# Line 2127  width0pt\relax} \fi Line 2950  width0pt\relax} \fi
2950  % the file that accumulates this index.  The file's extension is foo.  % the file that accumulates this index.  The file's extension is foo.
2951  % The name of an index should be no more than 2 characters long  % The name of an index should be no more than 2 characters long
2952  % for the sake of vms.  % for the sake of vms.
2953    %
2954  \def\newindex #1{  \def\newindex#1{%
2955  \expandafter\newwrite \csname#1indfile\endcsname% Define number for output file    \iflinks
2956  \openout \csname#1indfile\endcsname \jobname.#1 % Open the file      \expandafter\newwrite \csname#1indfile\endcsname
2957  \expandafter\xdef\csname#1index\endcsname{%     % Define \xxxindex      \openout \csname#1indfile\endcsname \jobname.#1 % Open the file
2958  \noexpand\doindex {#1}}    \fi
2959      \expandafter\xdef\csname#1index\endcsname{%     % Define @#1index
2960        \noexpand\doindex{#1}}
2961  }  }
2962    
2963  % @defindex foo  ==  \newindex{foo}  % @defindex foo  ==  \newindex{foo}
2964    %
2965  \def\defindex{\parsearg\newindex}  \def\defindex{\parsearg\newindex}
2966    
2967  % Define @defcodeindex, like @defindex except put all entries in @code.  % Define @defcodeindex, like @defindex except put all entries in @code.
2968    %
2969  \def\newcodeindex #1{  \def\defcodeindex{\parsearg\newcodeindex}
2970  \expandafter\newwrite \csname#1indfile\endcsname% Define number for output file  %
2971  \openout \csname#1indfile\endcsname \jobname.#1 % Open the file  \def\newcodeindex#1{%
2972  \expandafter\xdef\csname#1index\endcsname{%     % Define \xxxindex    \iflinks
2973  \noexpand\docodeindex {#1}}      \expandafter\newwrite \csname#1indfile\endcsname
2974        \openout \csname#1indfile\endcsname \jobname.#1
2975      \fi
2976      \expandafter\xdef\csname#1index\endcsname{%
2977        \noexpand\docodeindex{#1}}%
2978  }  }
2979    
 \def\defcodeindex{\parsearg\newcodeindex}  
2980    
2981  % @synindex foo bar    makes index foo feed into index bar.  % @synindex foo bar    makes index foo feed into index bar.
2982  % Do this instead of @defindex foo if you don't want it as a separate index.  % Do this instead of @defindex foo if you don't want it as a separate index.
2983  \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}}%  
 }  
   
2984  % @syncodeindex foo bar   similar, but put all entries made for index foo  % @syncodeindex foo bar   similar, but put all entries made for index foo
2985  % inside @code.  % inside @code.
2986  \def\syncodeindex #1 #2 {%  %
2987  \expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname  \def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}}
2988  \expandafter\let\csname#1indfile\endcsname=\synindexfoo  \def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}}
2989  \expandafter\xdef\csname#1index\endcsname{%     % Define \xxxindex  
2990  \noexpand\docodeindex {#2}}%  % #1 is \doindex or \docodeindex, #2 the index getting redefined (foo),
2991    % #3 the target index (bar).
2992    \def\dosynindex#1#2#3{%
2993      % Only do \closeout if we haven't already done it, else we'll end up
2994      % closing the target index.
2995      \expandafter \ifx\csname donesynindex#2\endcsname \undefined
2996        % The \closeout helps reduce unnecessary open files; the limit on the
2997        % Acorn RISC OS is a mere 16 files.
2998        \expandafter\closeout\csname#2indfile\endcsname
2999        \expandafter\let\csname\donesynindex#2\endcsname = 1
3000      \fi
3001      % redefine \fooindfile:
3002      \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname
3003      \expandafter\let\csname#2indfile\endcsname=\temp
3004      % redefine \fooindex:
3005      \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}%
3006  }  }
3007    
3008  % Define \doindex, the driver for all \fooindex macros.  % Define \doindex, the driver for all \fooindex macros.
# Line 2185  width0pt\relax} \fi Line 3022  width0pt\relax} \fi
3022  \def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}  \def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}
3023  \def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}  \def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
3024    
3025    % Take care of Texinfo commands that can appear in an index entry.
3026    % Since there are some commands we want to expand, and others we don't,
3027    % we have to laboriously prevent expansion for those that we don't.
3028    %
3029  \def\indexdummies{%  \def\indexdummies{%
3030  % Take care of the plain tex accent commands.    \def\@{@}% change to @@ when we switch to @ as escape char in index files.
3031  \def\"{\realbackslash "}%    \def\ {\realbackslash\space }%
3032  \def\`{\realbackslash `}%    % Need these in case \tex is in effect and \{ is a \delimiter again.
3033  \def\'{\realbackslash '}%    % But can't use \lbracecmd and \rbracecmd because texindex assumes
3034  \def\^{\realbackslash ^}%    % braces and backslashes are used only as delimiters.
3035  \def\~{\realbackslash ~}%    \let\{ = \mylbrace
3036  \def\={\realbackslash =}%    \let\} = \myrbrace
3037  \def\b{\realbackslash b}%    %
3038  \def\c{\realbackslash c}%    % \definedummyword defines \#1 as \realbackslash #1\space, thus
3039  \def\d{\realbackslash d}%    % effectively preventing its expansion.  This is used only for control
3040  \def\u{\realbackslash u}%    % words, not control letters, because the \space would be incorrect
3041  \def\v{\realbackslash v}%    % for control characters, but is needed to separate the control word
3042  \def\H{\realbackslash H}%    % from whatever follows.
3043  % Take care of the plain tex special European modified letters.    %
3044  \def\oe{\realbackslash oe}%    % For control letters, we have \definedummyletter, which omits the
3045  \def\ae{\realbackslash ae}%    % space.
3046  \def\aa{\realbackslash aa}%    %
3047  \def\OE{\realbackslash OE}%    % These can be used both for control words that take an argument and
3048  \def\AE{\realbackslash AE}%    % those that do not.  If it is followed by {arg} in the input, then
3049  \def\AA{\realbackslash AA}%    % that will dutifully get written to the index (or wherever).
3050  \def\o{\realbackslash o}%    %
3051  \def\O{\realbackslash O}%    \def\definedummyword##1{%
3052  \def\l{\realbackslash l}%      \expandafter\def\csname ##1\endcsname{\realbackslash ##1\space}%
3053  \def\L{\realbackslash L}%    }%
3054  \def\ss{\realbackslash ss}%    \def\definedummyletter##1{%
3055  % Take care of texinfo commands likely to appear in an index entry.      \expandafter\def\csname ##1\endcsname{\realbackslash ##1}%
3056  % (Must be a way to avoid doing expansion at all, and thus not have to    }%
3057  % laboriously list every single command here.)    %
3058  \def\@{@}% will be @@ when we switch to @ as escape char.    % Do the redefinitions.
3059  %\let\{ = \lbracecmd    \commondummies
3060  %\let\} = \rbracecmd  }
 \def\_{{\realbackslash _}}%  
 \def\w{\realbackslash w }%  
 \def\bf{\realbackslash bf }%  
 %\def\rm{\realbackslash rm }%  
 \def\sl{\realbackslash sl }%  
 \def\sf{\realbackslash sf}%  
 \def\tt{\realbackslash tt}%  
 \def\gtr{\realbackslash gtr}%  
 \def\less{\realbackslash less}%  
 \def\hat{\realbackslash hat}%  
 %\def\char{\realbackslash char}%  
 \def\TeX{\realbackslash TeX}%  
 \def\dots{\realbackslash dots }%  
 \def\copyright{\realbackslash copyright }%  
 \def\tclose##1{\realbackslash tclose {##1}}%  
 \def\code##1{\realbackslash code {##1}}%  
 \def\dotless##1{\realbackslash dotless {##1}}%  
 \def\samp##1{\realbackslash samp {##1}}%  
 \def\,##1{\realbackslash ,{##1}}%  
 \def\t##1{\realbackslash t {##1}}%  
 \def\r##1{\realbackslash r {##1}}%  
 \def\i##1{\realbackslash i {##1}}%  
 \def\b##1{\realbackslash b {##1}}%  
 \def\sc##1{\realbackslash sc {##1}}%  
 \def\cite##1{\realbackslash cite {##1}}%  
 \def\key##1{\realbackslash key {##1}}%  
 \def\file##1{\realbackslash file {##1}}%  
 \def\var##1{\realbackslash var {##1}}%  
 \def\kbd##1{\realbackslash kbd {##1}}%  
 \def\dfn##1{\realbackslash dfn {##1}}%  
 \def\emph##1{\realbackslash emph {##1}}%  
 \unsepspaces  
 }  
   
 % If an index command is used in an @example environment, any spaces  
 % therein should become regular spaces in the raw index file, not the  
 % expansion of \tie (\\leavevmode \penalty \@M \ ).  
 {\obeyspaces  
  \gdef\unsepspaces{\obeyspaces\let =\space}}  
   
 % \indexnofonts no-ops all font-change commands.  
 % This is used when outputting the strings to sort the index by.  
 \def\indexdummyfont#1{#1}  
 \def\indexdummytex{TeX}  
 \def\indexdummydots{...}  
3061    
3062  \def\indexnofonts{%  % For the aux file, @ is the escape character.  So we want to redefine
3063  % Just ignore accents.  % everything using @ instead of \realbackslash.  When everything uses
3064  \let\,=\indexdummyfont  % @, this will be simpler.
3065  \let\"=\indexdummyfont  %
3066  \let\`=\indexdummyfont  \def\atdummies{%
3067  \let\'=\indexdummyfont    \def\@{@@}%
3068  \let\^=\indexdummyfont    \def\ {@ }%
3069  \let\~=\indexdummyfont    \let\{ = \lbraceatcmd
3070  \let\==\indexdummyfont    \let\} = \rbraceatcmd
3071  \let\b=\indexdummyfont    %
3072  \let\c=\indexdummyfont    % (See comments in \indexdummies.)
3073  \let\d=\indexdummyfont    \def\definedummyword##1{%
3074  \let\u=\indexdummyfont      \expandafter\def\csname ##1\endcsname{@##1\space}%
3075  \let\v=\indexdummyfont    }%
3076  \let\H=\indexdummyfont    \def\definedummyletter##1{%
3077  \let\dotless=\indexdummyfont      \expandafter\def\csname ##1\endcsname{@##1}%
3078  % Take care of the plain tex special European modified letters.    }%
3079  \def\oe{oe}%    %
3080  \def\ae{ae}%    % Do the redefinitions.
3081  \def\aa{aa}%    \commondummies
3082  \def\OE{OE}%  }
 \def\AE{AE}%  
 \def\AA{AA}%  
 \def\o{o}%  
 \def\O{O}%  
 \def\l{l}%  
 \def\L{L}%  
 \def\ss{ss}%  
 \let\w=\indexdummyfont  
 \let\t=\indexdummyfont  
 \let\r=\indexdummyfont  
 \let\i=\indexdummyfont  
 \let\b=\indexdummyfont  
 \let\emph=\indexdummyfont  
 \let\strong=\indexdummyfont  
 \let\cite=\indexdummyfont  
 \let\sc=\indexdummyfont  
 %Don't no-op \tt, since it isn't a user-level command  
 % and is used in the definitions of the active chars like <, >, |...  
 %\let\tt=\indexdummyfont  
 \let\tclose=\indexdummyfont  
 \let\code=\indexdummyfont  
 \let\file=\indexdummyfont  
 \let\samp=\indexdummyfont  
 \let\kbd=\indexdummyfont  
 \let\key=\indexdummyfont  
 \let\var=\indexdummyfont  
 \let\TeX=\indexdummytex  
 \let\dots=\indexdummydots  
 \def\@{@}%  
 }  
   
 % To define \realbackslash, we must make \ not be an escape.  
 % We must first make another character (@) an escape  
 % so we do not become unable to do a definition.  
3083    
3084  {\catcode`\@=0 \catcode`\\=\other  % Called from \indexdummies and \atdummies.  \definedummyword and
3085  @gdef@realbackslash{\}}  % \definedummyletter must be defined first.
3086    %
3087    \def\commondummies{%
3088      %
3089      \normalturnoffactive
3090      %
3091      \commondummiesnofonts
3092      %
3093      \definedummyletter{_}%
3094      %
3095      % Non-English letters.
3096      \definedummyword{AA}%
3097      \definedummyword{AE}%
3098      \definedummyword{L}%
3099      \definedummyword{OE}%
3100      \definedummyword{O}%
3101      \definedummyword{aa}%
3102      \definedummyword{ae}%
3103      \definedummyword{l}%
3104      \definedummyword{oe}%
3105      \definedummyword{o}%
3106      \definedummyword{ss}%
3107      \definedummyword{exclamdown}%
3108      \definedummyword{questiondown}%
3109      \definedummyword{ordf}%
3110      \definedummyword{ordm}%
3111      %
3112      % Although these internal commands shouldn't show up, sometimes they do.
3113      \definedummyword{bf}%
3114      \definedummyword{gtr}%
3115      \definedummyword{hat}%
3116      \definedummyword{less}%
3117      \definedummyword{sf}%
3118      \definedummyword{sl}%
3119      \definedummyword{tclose}%
3120      \definedummyword{tt}%
3121      %
3122      \definedummyword{LaTeX}%
3123      \definedummyword{TeX}%
3124      %
3125      % Assorted special characters.
3126      \definedummyword{bullet}%
3127      \definedummyword{copyright}%
3128      \definedummyword{registeredsymbol}%
3129      \definedummyword{dots}%
3130      \definedummyword{enddots}%
3131      \definedummyword{equiv}%
3132      \definedummyword{error}%
3133      \definedummyword{expansion}%
3134      \definedummyword{minus}%
3135      \definedummyword{pounds}%
3136      \definedummyword{point}%
3137      \definedummyword{print}%
3138      \definedummyword{result}%
3139      %
3140      % Handle some cases of @value -- where it does not contain any
3141      % (non-fully-expandable) commands.
3142      \makevalueexpandable
3143      %
3144      % Normal spaces, not active ones.
3145      \unsepspaces
3146      %
3147      % No macro expansion.
3148      \turnoffmacros
3149    }
3150    
3151    % \commondummiesnofonts: common to \commondummies and \indexnofonts.
3152    %
3153    % Better have this without active chars.
3154    {
3155      \catcode`\~=\other
3156      \gdef\commondummiesnofonts{%
3157        % Control letters and accents.
3158        \definedummyletter{!}%
3159        \definedummyletter{"}%
3160        \definedummyletter{'}%
3161        \definedummyletter{*}%
3162        \definedummyletter{,}%
3163        \definedummyletter{.}%
3164        \definedummyletter{/}%
3165        \definedummyletter{:}%
3166        \definedummyletter{=}%
3167        \definedummyletter{?}%
3168        \definedummyletter{^}%
3169        \definedummyletter{`}%
3170        \definedummyletter{~}%
3171        \definedummyword{u}%
3172        \definedummyword{v}%
3173        \definedummyword{H}%
3174        \definedummyword{dotaccent}%
3175        \definedummyword{ringaccent}%
3176        \definedummyword{tieaccent}%
3177        \definedummyword{ubaraccent}%
3178        \definedummyword{udotaccent}%
3179        \definedummyword{dotless}%
3180        %
3181        % Texinfo font commands.
3182        \definedummyword{b}%
3183        \definedummyword{i}%
3184        \definedummyword{r}%
3185        \definedummyword{sc}%
3186        \definedummyword{t}%
3187        %
3188        % Commands that take arguments.
3189        \definedummyword{acronym}%
3190        \definedummyword{cite}%
3191        \definedummyword{code}%
3192        \definedummyword{command}%
3193        \definedummyword{dfn}%
3194        \definedummyword{emph}%
3195        \definedummyword{env}%
3196        \definedummyword{file}%
3197        \definedummyword{kbd}%
3198        \definedummyword{key}%
3199        \definedummyword{math}%
3200        \definedummyword{option}%
3201        \definedummyword{samp}%
3202        \definedummyword{strong}%
3203        \definedummyword{tie}%
3204        \definedummyword{uref}%
3205        \definedummyword{url}%
3206        \definedummyword{var}%
3207        \definedummyword{verb}%
3208        \definedummyword{w}%
3209      }
3210    }
3211    
3212    % \indexnofonts is used when outputting the strings to sort the index
3213    % by, and when constructing control sequence names.  It eliminates all
3214    % control sequences and just writes whatever the best ASCII sort string
3215    % would be for a given command (usually its argument).
3216    %
3217    \def\indexnofonts{%
3218      \def\definedummyword##1{%
3219        \expandafter\let\csname ##1\endcsname\asis
3220      }%
3221      % We can just ignore the accent commands and other control letters.
3222      \def\definedummyletter##1{%
3223        \expandafter\def\csname ##1\endcsname{}%
3224      }%
3225      %
3226      \commondummiesnofonts
3227      %
3228      % Don't no-op \tt, since it isn't a user-level command
3229      % and is used in the definitions of the active chars like <, >, |, etc.
3230      % Likewise with the other plain tex font commands.
3231      %\let\tt=\asis
3232      %
3233      \def\ { }%
3234      \def\@{@}%
3235      % how to handle braces?
3236      \def\_{\normalunderscore}%
3237      %
3238      % Non-English letters.
3239      \def\AA{AA}%
3240      \def\AE{AE}%
3241      \def\L{L}%
3242      \def\OE{OE}%
3243      \def\O{O}%
3244      \def\aa{aa}%
3245      \def\ae{ae}%
3246      \def\l{l}%
3247      \def\oe{oe}%
3248      \def\o{o}%
3249      \def\ss{ss}%
3250      \def\exclamdown{!}%
3251      \def\questiondown{?}%
3252      \def\ordf{a}%
3253      \def\ordm{o}%
3254      %
3255      \def\LaTeX{LaTeX}%
3256      \def\TeX{TeX}%
3257      %
3258      % Assorted special characters.
3259      % (The following {} will end up in the sort string, but that's ok.)
3260      \def\bullet{bullet}%
3261      \def\copyright{copyright}%
3262      \def\registeredsymbol{R}%
3263      \def\dots{...}%
3264      \def\enddots{...}%
3265      \def\equiv{==}%
3266      \def\error{error}%
3267      \def\expansion{==>}%
3268      \def\minus{-}%
3269      \def\pounds{pounds}%
3270      \def\point{.}%
3271      \def\print{-|}%
3272      \def\result{=>}%
3273    }
3274    
3275  \let\indexbackslash=0  %overridden during \printindex.  \let\indexbackslash=0  %overridden during \printindex.
3276    \let\SETmarginindex=\relax % put index entries in margin (undocumented)?
3277    
3278    % Most index entries go through here, but \dosubind is the general case.
3279    % #1 is the index name, #2 is the entry text.
3280    \def\doind#1#2{\dosubind{#1}{#2}{}}
3281    
3282    % Workhorse for all \fooindexes.
3283    % #1 is name of index, #2 is stuff to put there, #3 is subentry --
3284    % empty if called from \doind, as we usually are (the main exception
3285    % is with most defuns, which call us directly).
3286    %
3287    \def\dosubind#1#2#3{%
3288      \iflinks
3289      {%
3290        % Store the main index entry text (including the third arg).
3291        \toks0 = {#2}%
3292        % If third arg is present, precede it with a space.
3293        \def\thirdarg{#3}%
3294        \ifx\thirdarg\empty \else
3295          \toks0 = \expandafter{\the\toks0 \space #3}%
3296        \fi
3297        %
3298        \edef\writeto{\csname#1indfile\endcsname}%
3299        %
3300        \ifvmode
3301          \dosubindsanitize
3302        \else
3303          \dosubindwrite
3304        \fi
3305      }%
3306      \fi
3307    }
3308    
3309  \let\SETmarginindex=\relax %initialize!  % Write the entry in \toks0 to the index file:
3310  % workhorse for all \fooindexes  %
3311  % #1 is name of index, #2 is stuff to put there  \def\dosubindwrite{%
 \def\doind #1#2{%  
3312    % Put the index entry in the margin if desired.    % Put the index entry in the margin if desired.
3313    \ifx\SETmarginindex\relax\else    \ifx\SETmarginindex\relax\else
3314      \insert\margin{\hbox{\vrule height8pt depth3pt width0pt #2}}%      \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}%
3315    \fi    \fi
3316    {%    %
3317      \count255=\lastpenalty    % Remember, we are within a group.
3318      {%    \indexdummies % Must do this here, since \bf, etc expand at this stage
3319        \indexdummies % Must do this here, since \bf, etc expand at this stage    \escapechar=`\\
3320        \escapechar=`\\    \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now
3321        {%        % so it will be output as is; and it will print as backslash.
3322          \let\folio=0% We will expand all macros now EXCEPT \folio.    %
3323          \def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now    % Process the index entry with all font commands turned off, to
3324          % so it will be output as is; and it will print as backslash.    % get the string to sort by.
3325          %    {\indexnofonts
3326          % First process the index-string with all font commands turned off     \edef\temp{\the\toks0}% need full expansion
3327          % to get the string to sort by.     \xdef\indexsorttmp{\temp}%
3328          {\indexnofonts \xdef\indexsorttmp{#2}}%    }%
3329          %    %
3330          % Now produce the complete index entry, with both the sort key and the    % Set up the complete index entry, with both the sort key and
3331          % original text, including any font commands.    % the original text, including any font commands.  We write
3332          \toks0 = {#2}%    % three arguments to \entry to the .?? file (four in the
3333          \edef\temp{%    % subentry case), texindex reduces to two when writing the .??s
3334            \write\csname#1indfile\endcsname{%    % sorted result.
3335              \realbackslash entry{\indexsorttmp}{\folio}{\the\toks0}}%    \edef\temp{%
3336          }%      \write\writeto{%
3337          \temp        \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}%
       }%  
     }%  
     \penalty\count255  
3338    }%    }%
3339      \temp
3340  }  }
3341    
3342  \def\dosubind #1#2#3{%  % Take care of unwanted page breaks:
3343  {\count10=\lastpenalty %  %
3344  {\indexdummies % Must do this here, since \bf, etc expand at this stage  % If a skip is the last thing on the list now, preserve it
3345  \escapechar=`\\%  % by backing up by \lastskip, doing the \write, then inserting
3346  {\let\folio=0%  % the skip again.  Otherwise, the whatsit generated by the
3347  \def\rawbackslashxx{\indexbackslash}%  % \write will make \lastskip zero.  The result is that sequences
3348  %  % like this:
3349  % Now process the index-string once, with all font commands turned off,  % @end defun
3350  % to get the string to sort the index by.  % @tindex whatever
3351  {\indexnofonts  % @defun ...
3352  \xdef\temp1{#2 #3}%  % will have extra space inserted, because the \medbreak in the
3353  }%  % start of the @defun won't see the skip inserted by the @end of
3354  % Now produce the complete index entry.  We process the index-string again,  % the previous defun.
3355  % this time with font commands expanded, to get what to print in the index.  %
3356  \edef\temp{%  % But don't do any of this if we're not in vertical mode.  We
3357  \write \csname#1indfile\endcsname{%  % don't want to do a \vskip and prematurely end a paragraph.
3358  \realbackslash entry {\temp1}{\folio}{#2}{#3}}}%  %
3359  \temp }%  % Avoid page breaks due to these extra skips, too.
3360  }\penalty\count10}}  %
3361    % But wait, there is a catch there:
3362    % We'll have to check whether \lastskip is zero skip.  \ifdim is not
3363    % sufficient for this purpose, as it ignores stretch and shrink parts
3364    % of the skip.  The only way seems to be to check the textual
3365    % representation of the skip.
3366    %
3367    % The following is almost like \def\zeroskipmacro{0.0pt} except that
3368    % the ``p'' and ``t'' characters have catcode \other, not 11 (letter).
3369    %
3370    \edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname}
3371    %
3372    % ..., ready, GO:
3373    %
3374    \def\dosubindsanitize{%
3375      % \lastskip and \lastpenalty cannot both be nonzero simultaneously.
3376      \skip0 = \lastskip
3377      \edef\lastskipmacro{\the\lastskip}%
3378      \count255 = \lastpenalty
3379      %
3380      % If \lastskip is nonzero, that means the last item was a
3381      % skip.  And since a skip is discardable, that means this
3382      % -\skip0 glue we're inserting is preceded by a
3383      % non-discardable item, therefore it is not a potential
3384      % breakpoint, therefore no \nobreak needed.
3385      \ifx\lastskipmacro\zeroskipmacro
3386      \else
3387        \vskip-\skip0
3388      \fi
3389      %
3390      \dosubindwrite
3391      %
3392      \ifx\lastskipmacro\zeroskipmacro
3393        % if \lastskip was zero, perhaps the last item was a
3394        % penalty, and perhaps it was >=10000, e.g., a \nobreak.
3395        % In that case, we want to re-insert the penalty; since we
3396        % just inserted a non-discardable item, any following glue
3397        % (such as a \parskip) would be a breakpoint.  For example:
3398        %   @deffn deffn-whatever
3399        %   @vindex index-whatever
3400        %   Description.
3401        % would allow a break between the index-whatever whatsit
3402        % and the "Description." paragraph.
3403        \ifnum\count255>9999 \nobreak \fi
3404      \else
3405        % On the other hand, if we had a nonzero \lastskip,
3406        % this make-up glue would be preceded by a non-discardable item
3407        % (the whatsit from the \write), so we must insert a \nobreak.
3408        \nobreak\vskip\skip0
3409      \fi
3410    }
3411    
3412  % The index entry written in the file actually looks like  % The index entry written in the file actually looks like
3413  %  \entry {sortstring}{page}{topic}  %  \entry {sortstring}{page}{topic}
# Line 2415  width0pt\relax} \fi Line 3444  width0pt\relax} \fi
3444  % @printindex causes a particular index (the ??s file) to get printed.  % @printindex causes a particular index (the ??s file) to get printed.
3445  % It does not print any chapter heading (usually an @unnumbered).  % It does not print any chapter heading (usually an @unnumbered).
3446  %  %
3447  \def\printindex{\parsearg\doprintindex}  \parseargdef\printindex{\begingroup
 \def\doprintindex#1{\begingroup  
3448    \dobreak \chapheadingskip{10000}%    \dobreak \chapheadingskip{10000}%
3449    %    %
3450    \indexfonts \rm    \smallfonts \rm
3451    \tolerance = 9500    \tolerance = 9500
3452    \indexbreaks    \everypar = {}% don't want the \kern\-parindent from indentation suppression.
3453    %    %
3454    % See if the index file exists and is nonempty.    % See if the index file exists and is nonempty.
3455      % Change catcode of @ here so that if the index file contains
3456      % \initial {@}
3457      % as its first line, TeX doesn't complain about mismatched braces
3458      % (because it thinks @} is a control sequence).
3459      \catcode`\@ = 11
3460    \openin 1 \jobname.#1s    \openin 1 \jobname.#1s
3461    \ifeof 1    \ifeof 1
3462      % \enddoublecolumns gets confused if there is no text in the index,      % \enddoublecolumns gets confused if there is no text in the index,
3463      % and it loses the chapter title and the aux file entries for the      % and it loses the chapter title and the aux file entries for the
3464      % index.  The easiest way to prevent this problem is to make sure      % index.  The easiest way to prevent this problem is to make sure
3465      % there is some text.      % there is some text.
3466      (Index is nonexistent)      \putwordIndexNonexistent
3467    \else    \else
3468      %      %
3469      % If the index file exists but is empty, then \openin leaves \ifeof      % If the index file exists but is empty, then \openin leaves \ifeof
# Line 2438  width0pt\relax} \fi Line 3471  width0pt\relax} \fi
3471      % it can discover if there is anything in it.      % it can discover if there is anything in it.
3472      \read 1 to \temp      \read 1 to \temp
3473      \ifeof 1      \ifeof 1
3474        (Index is empty)        \putwordIndexIsEmpty
3475      \else      \else
3476        % Index files are almost Texinfo source, but we use \ as the escape        % Index files are almost Texinfo source, but we use \ as the escape
3477        % character.  It would be better to use @, but that's too big a change        % character.  It would be better to use @, but that's too big a change
3478        % to make right now.        % to make right now.
3479        \def\indexbackslash{\rawbackslashxx}%        \def\indexbackslash{\backslashcurfont}%
3480        \catcode`\\ = 0        \catcode`\\ = 0
       \catcode`\@ = 11  
3481        \escapechar = `\\        \escapechar = `\\
3482        \begindoublecolumns        \begindoublecolumns
3483        \input \jobname.#1s        \input \jobname.#1s
# Line 2458  width0pt\relax} \fi Line 3490  width0pt\relax} \fi
3490  % These macros are used by the sorted index file itself.  % These macros are used by the sorted index file itself.
3491  % Change them to control the appearance of the index.  % Change them to control the appearance of the index.
3492    
3493  % Same as \bigskipamount except no shrink.  \def\initial#1{{%
3494  % \balancecolumns gets confused if there is any shrink.    % Some minor font changes for the special characters.
3495  \newskip\initialskipamount \initialskipamount 12pt plus4pt    \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt
3496      %
3497  \def\initial #1{%    % Remove any glue we may have, we'll be inserting our own.
3498  {\let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt    \removelastskip
3499  \ifdim\lastskip<\initialskipamount    %
3500  \removelastskip \penalty-200 \vskip \initialskipamount\fi    % We like breaks before the index initials, so insert a bonus.
3501  \line{\secbf#1\hfill}\kern 2pt\penalty10000}}    \penalty -300
3502      %
3503  % This typesets a paragraph consisting of #1, dot leaders, and then #2    % Typeset the initial.  Making this add up to a whole number of
3504  % flush to the right margin.  It is used for index and table of contents    % baselineskips increases the chance of the dots lining up from column
3505  % entries.  The paragraph is indented by \leftskip.    % to column.  It still won't often be perfect, because of the stretch
3506  %    % we need before each entry, but it's better.
3507  \def\entry #1#2{\begingroup    %
3508    %    % No shrink because it confuses \balancecolumns.
3509    % Start a new paragraph if necessary, so our assignments below can't    \vskip 1.67\baselineskip plus .5\baselineskip
3510    % affect previous text.    \leftline{\secbf #1}%
3511    \par    \vskip .33\baselineskip plus .1\baselineskip
   %  
   % Do not fill out the last line with white space.  
   \parfillskip = 0in  
   %  
   % No extra space above this paragraph.  
   \parskip = 0in  
   %  
   % Do not prefer a separate line ending with a hyphen to fewer lines.  
   \finalhyphendemerits = 0  
3512    %    %
3513    % \hangindent is only relevant when the entry text and page number    % Do our best not to break after the initial.
3514    % don't both fit on one line.  In that case, bob suggests starting the    \nobreak
3515    % dots pretty far over on the line.  Unfortunately, a large  }}
3516    % indentation looks wrong when the entry text itself is broken across  
3517    % lines.  So we use a small indentation and put up with long leaders.  % \entry typesets a paragraph consisting of the text (#1), dot leaders, and
3518    %  % then page number (#2) flushed to the right margin.  It is used for index
3519    % \hangafter is reset to 1 (which is the value we want) at the start  % and table of contents entries.  The paragraph is indented by \leftskip.
3520    % of each paragraph, so we need not do anything with that.  %
3521    \hangindent=2em  % A straightforward implementation would start like this:
3522    %  %       \def\entry#1#2{...
3523    % When the entry text needs to be broken, just fill out the first line  % But this frozes the catcodes in the argument, and can cause problems to
3524    % with blank space.  % @code, which sets - active.  This problem was fixed by a kludge---
3525    \rightskip = 0pt plus1fil  % ``-'' was active throughout whole index, but this isn't really right.
3526    %  %
3527    % Start a ``paragraph'' for the index entry so the line breaking  % The right solution is to prevent \entry from swallowing the whole text.
3528    % parameters we've set above will have an effect.  %                                 --kasal, 21nov03
3529    \noindent  \def\entry{%
3530    %    \begingroup
3531    % Insert the text of the index entry.  TeX will do line-breaking on it.      %
3532    #1%      % Start a new paragraph if necessary, so our assignments below can't
3533    % The following is kludged to not output a line of dots in the index if      % affect previous text.
3534    % there are no page numbers.  The next person who breaks this will be      \par
3535    % cursed by a Unix daemon.      %
3536    \def\tempa{{\rm }}%      % Do not fill out the last line with white space.
3537    \def\tempb{#2}%      \parfillskip = 0in
3538    \edef\tempc{\tempa}%      %
3539    \edef\tempd{\tempb}%      % No extra space above this paragraph.
3540    \ifx\tempc\tempd\ \else%      \parskip = 0in
3541      %      %
3542      % If we must, put the page number on a line of its own, and fill out      % Do not prefer a separate line ending with a hyphen to fewer lines.
3543      % this line with blank space.  (The \hfil is overwhelmed with the      \finalhyphendemerits = 0
3544      % fill leaders glue in \indexdotfill if the page number does fit.)      %
3545      \hfil\penalty50      % \hangindent is only relevant when the entry text and page number
3546      \null\nobreak\indexdotfill % Have leaders before the page number.      % don't both fit on one line.  In that case, bob suggests starting the
3547      %      % dots pretty far over on the line.  Unfortunately, a large
3548      % The `\ ' here is removed by the implicit \unskip that TeX does as      % indentation looks wrong when the entry text itself is broken across
3549      % part of (the primitive) \par.  Without it, a spurious underfull      % lines.  So we use a small indentation and put up with long leaders.
3550      % \hbox ensues.      %
3551      \ #2% The page number ends the paragraph.      % \hangafter is reset to 1 (which is the value we want) at the start
3552    \fi%      % of each paragraph, so we need not do anything with that.
3553    \par      \hangindent = 2em
3554  \endgroup}      %
3555        % When the entry text needs to be broken, just fill out the first line
3556        % with blank space.
3557        \rightskip = 0pt plus1fil
3558        %
3559        % A bit of stretch before each entry for the benefit of balancing
3560        % columns.
3561        \vskip 0pt plus1pt
3562        %
3563        % Swallow the left brace of the text (first parameter):
3564        \afterassignment\doentry
3565        \let\temp =
3566    }
3567    \def\doentry{%
3568        \bgroup % Instead of the swallowed brace.
3569          \noindent
3570          \aftergroup\finishentry
3571          % And now comes the text of the entry.
3572    }
3573    \def\finishentry#1{%
3574        % #1 is the page number.
3575        %
3576        % The following is kludged to not output a line of dots in the index if
3577        % there are no page numbers.  The next person who breaks this will be
3578        % cursed by a Unix daemon.
3579        \def\tempa{{\rm }}%
3580        \def\tempb{#1}%
3581        \edef\tempc{\tempa}%
3582        \edef\tempd{\tempb}%
3583        \ifx\tempc\tempd
3584          \ %
3585        \else
3586          %
3587          % If we must, put the page number on a line of its own, and fill out
3588          % this line with blank space.  (The \hfil is overwhelmed with the
3589          % fill leaders glue in \indexdotfill if the page number does fit.)
3590          \hfil\penalty50
3591          \null\nobreak\indexdotfill % Have leaders before the page number.
3592          %
3593          % The `\ ' here is removed by the implicit \unskip that TeX does as
3594          % part of (the primitive) \par.  Without it, a spurious underfull
3595          % \hbox ensues.
3596          \ifpdf
3597            \pdfgettoks#1.%
3598            \ \the\toksA
3599          \else
3600            \ #1%
3601          \fi
3602        \fi
3603        \par
3604      \endgroup
3605    }
3606    
3607  % Like \dotfill except takes at least 1 em.  % Like \dotfill except takes at least 1 em.
3608  \def\indexdotfill{\cleaders  \def\indexdotfill{\cleaders
# Line 2537  width0pt\relax} \fi Line 3611  width0pt\relax} \fi
3611  \def\primary #1{\line{#1\hfil}}  \def\primary #1{\line{#1\hfil}}
3612    
3613  \newskip\secondaryindent \secondaryindent=0.5cm  \newskip\secondaryindent \secondaryindent=0.5cm
3614    \def\secondary#1#2{{%
3615  \def\secondary #1#2{    \parfillskip=0in
3616  {\parfillskip=0in \parskip=0in    \parskip=0in
3617  \hangindent =1in \hangafter=1    \hangindent=1in
3618  \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\par    \hangafter=1
3619      \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill
3620      \ifpdf
3621        \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
3622      \else
3623        #2
3624      \fi
3625      \par
3626  }}  }}
3627    
3628  % Define two-column mode, which we use to typeset indexes.  % Define two-column mode, which we use to typeset indexes.
# Line 2554  width0pt\relax} \fi Line 3635  width0pt\relax} \fi
3635    
3636  \def\begindoublecolumns{\begingroup % ended by \enddoublecolumns  \def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
3637    % Grab any single-column material above us.    % Grab any single-column material above us.
3638    \output = {\global\setbox\partialpage = \vbox{%    \output = {%
3639      %      %
3640      % Here is a possibility not foreseen in manmac: if we accumulate a      % Here is a possibility not foreseen in manmac: if we accumulate a
3641      % whole lot of material, we might end up calling this \output      % whole lot of material, we might end up calling this \output
3642      % routine twice in a row (see the doublecol-lose test, which is      % routine twice in a row (see the doublecol-lose test, which is
3643      % essentially a couple of indexes with @setchapternewpage off).  In      % essentially a couple of indexes with @setchapternewpage off).  In
3644      % that case, we must prevent the second \partialpage from      % that case we just ship out what is in \partialpage with the normal
3645      % simply overwriting the first, causing us to lose the page.      % output routine.  Generally, \partialpage will be empty when this
3646      % This will preserve it until a real output routine can ship it      % runs and this will be a no-op.  See the indexspread.tex test case.
3647      % out.  Generally, \partialpage will be empty when this runs and      \ifvoid\partialpage \else
3648      % this will be a no-op.        \onepageout{\pagecontents\partialpage}%
3649      \unvbox\partialpage      \fi
3650      %      %
3651      % Unvbox the main output page.      \global\setbox\partialpage = \vbox{%
3652      \unvbox255        % Unvbox the main output page.
3653      \kern-\topskip \kern\baselineskip        \unvbox\PAGE
3654    }}%        \kern-\topskip \kern\baselineskip
3655    \eject      }%
3656      }%
3657      \eject % run that output routine to set \partialpage
3658    %    %
3659    % Use the double-column output routine for subsequent pages.    % Use the double-column output routine for subsequent pages.
3660    \output = {\doublecolumnout}%    \output = {\doublecolumnout}%
# Line 2601  width0pt\relax} \fi Line 3684  width0pt\relax} \fi
3684    % since nobody clobbers \vsize.)    % since nobody clobbers \vsize.)
3685    \vsize = 2\vsize    \vsize = 2\vsize
3686  }  }
3687    
3688    % The double-column output routine for all double-column pages except
3689    % the last.
3690    %
3691  \def\doublecolumnout{%  \def\doublecolumnout{%
3692    \splittopskip=\topskip \splitmaxdepth=\maxdepth    \splittopskip=\topskip \splitmaxdepth=\maxdepth
3693    % Get the available space for the double columns -- the normal    % Get the available space for the double columns -- the normal
3694    % (undoubled) page height minus any material left over from the    % (undoubled) page height minus any material left over from the
3695    % previous page.    % previous page.
3696    \dimen@=\pageheight \advance\dimen@ by-\ht\partialpage    \dimen@ = \vsize
3697      \divide\dimen@ by 2
3698      \advance\dimen@ by -\ht\partialpage
3699      %
3700    % box0 will be the left-hand column, box2 the right.    % box0 will be the left-hand column, box2 the right.
3701    \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@    \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
3702    \onepageout\pagesofar    \onepageout\pagesofar
3703    \unvbox255    \unvbox255
3704    \penalty\outputpenalty    \penalty\outputpenalty
3705  }  }
3706    %
3707    % Re-output the contents of the output page -- any previous material,
3708    % followed by the two boxes we just split, in box0 and box2.
3709  \def\pagesofar{%  \def\pagesofar{%
   % Re-output the contents of the output page -- any previous material,  
   % followed by the two boxes we just split.  
3710    \unvbox\partialpage    \unvbox\partialpage
3711      %
3712    \hsize = \doublecolumnhsize    \hsize = \doublecolumnhsize
3713    \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}%    \wd0=\hsize \wd2=\hsize
3714      \hbox to\pagewidth{\box0\hfil\box2}%
3715  }  }
3716    %
3717    % All done with double columns.
3718  \def\enddoublecolumns{%  \def\enddoublecolumns{%
3719    \output = {\balancecolumns}\eject % split what we have    \output = {%
3720        % Split the last of the double-column material.  Leave it on the
3721        % current page, no automatic page break.
3722        \balancecolumns
3723        %
3724        % If we end up splitting too much material for the current page,
3725        % though, there will be another page break right after this \output
3726        % invocation ends.  Having called \balancecolumns once, we do not
3727        % want to call it again.  Therefore, reset \output to its normal
3728        % definition right away.  (We hope \balancecolumns will never be
3729        % called on to balance too much material, but if it is, this makes
3730        % the output somewhat more palatable.)
3731        \global\output = {\onepageout{\pagecontents\PAGE}}%
3732      }%
3733      \eject
3734    \endgroup % started in \begindoublecolumns    \endgroup % started in \begindoublecolumns
3735    %    %
3736    % Back to normal single-column typesetting, but take account of the    % \pagegoal was set to the doubled \vsize above, since we restarted
3737    % fact that we just accumulated some stuff on the output page.    % the current page.  We're now back to normal single-column
3738      % typesetting, so reset \pagegoal to the normal \vsize (after the
3739      % \endgroup where \vsize got restored).
3740    \pagegoal = \vsize    \pagegoal = \vsize
3741  }  }
3742    %
3743    % Called at the end of the double column material.
3744  \def\balancecolumns{%  \def\balancecolumns{%
3745    % Called at the end of the double column material.    \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120.
   \setbox0 = \vbox{\unvbox255}%  
3746    \dimen@ = \ht0    \dimen@ = \ht0
3747    \advance\dimen@ by \topskip    \advance\dimen@ by \topskip
3748    \advance\dimen@ by-\baselineskip    \advance\dimen@ by-\baselineskip
3749    \divide\dimen@ by 2    \divide\dimen@ by 2 % target to split to
3750      %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}%
3751    \splittopskip = \topskip    \splittopskip = \topskip
3752    % Loop until we get a decent breakpoint.    % Loop until we get a decent breakpoint.
3753    {\vbadness=10000 \loop    {%
3754      \global\setbox3=\copy0      \vbadness = 10000
3755      \global\setbox1=\vsplit3 to\dimen@      \loop
3756      \ifdim\ht3>\dimen@ \global\advance\dimen@ by1pt        \global\setbox3 = \copy0
3757     \repeat}%        \global\setbox1 = \vsplit3 to \dimen@
3758        \ifdim\ht3>\dimen@
3759          \global\advance\dimen@ by 1pt
3760        \repeat
3761      }%
3762      %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}%
3763    \setbox0=\vbox to\dimen@{\unvbox1}%    \setbox0=\vbox to\dimen@{\unvbox1}%
3764    \setbox2=\vbox to\dimen@{\unvbox3}%    \setbox2=\vbox to\dimen@{\unvbox3}%
3765      %
3766    \pagesofar    \pagesofar
3767  }  }
3768  \catcode`\@ = \other  \catcode`\@ = \other
3769    
3770    
3771  \message{sectioning,}  \message{sectioning,}
3772  % Define chapters, sections, etc.  % Chapters, sections, etc.
3773    
3774    % \unnumberedno is an oxymoron, of course.  But we count the unnumbered
3775    % sections so that we can refer to them unambiguously in the pdf
3776    % outlines by their "section number".  We avoid collisions with chapter
3777    % numbers by starting them at 10000.  (If a document ever has 10000
3778    % chapters, we're in trouble anyway, I'm sure.)
3779    \newcount\unnumberedno \unnumberedno = 10000
3780  \newcount\chapno  \newcount\chapno
3781  \newcount\secno        \secno=0  \newcount\secno        \secno=0
3782  \newcount\subsecno     \subsecno=0  \newcount\subsecno     \subsecno=0
# Line 2659  width0pt\relax} \fi Line 3784  width0pt\relax} \fi
3784    
3785  % This counter is funny since it counts through charcodes of letters A, B, ...  % This counter is funny since it counts through charcodes of letters A, B, ...
3786  \newcount\appendixno  \appendixno = `\@  \newcount\appendixno  \appendixno = `\@
3787  \def\appendixletter{\char\the\appendixno}  %
3788    % \def\appendixletter{\char\the\appendixno}
3789  \newwrite\contentsfile  % We do the following ugly conditional instead of the above simple
3790  % This is called from \setfilename.  % construct for the sake of pdftex, which needs the actual
3791  \def\opencontents{\openout\contentsfile = \jobname.toc }  % letter in the expansion, not just typeset.
3792    %
3793    \def\appendixletter{%
3794      \ifnum\appendixno=`A A%
3795      \else\ifnum\appendixno=`B B%
3796      \else\ifnum\appendixno=`C C%
3797      \else\ifnum\appendixno=`D D%
3798      \else\ifnum\appendixno=`E E%
3799      \else\ifnum\appendixno=`F F%
3800      \else\ifnum\appendixno=`G G%
3801      \else\ifnum\appendixno=`H H%
3802      \else\ifnum\appendixno=`I I%
3803      \else\ifnum\appendixno=`J J%
3804      \else\ifnum\appendixno=`K K%
3805      \else\ifnum\appendixno=`L L%
3806      \else\ifnum\appendixno=`M M%
3807      \else\ifnum\appendixno=`N N%
3808      \else\ifnum\appendixno=`O O%
3809      \else\ifnum\appendixno=`P P%
3810      \else\ifnum\appendixno=`Q Q%
3811      \else\ifnum\appendixno=`R R%
3812      \else\ifnum\appendixno=`S S%
3813      \else\ifnum\appendixno=`T T%
3814      \else\ifnum\appendixno=`U U%
3815      \else\ifnum\appendixno=`V V%
3816      \else\ifnum\appendixno=`W W%
3817      \else\ifnum\appendixno=`X X%
3818      \else\ifnum\appendixno=`Y Y%
3819      \else\ifnum\appendixno=`Z Z%
3820      % The \the is necessary, despite appearances, because \appendixletter is
3821      % expanded while writing the .toc file.  \char\appendixno is not
3822      % expandable, thus it is written literally, thus all appendixes come out
3823      % with the same letter (or @) in the toc without it.
3824      \else\char\the\appendixno
3825      \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
3826      \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
3827    
3828  % Each @chapter defines this as the name of the chapter.  % Each @chapter defines this as the name of the chapter.
3829  % page headings and footings can use it.  @section does likewise  % page headings and footings can use it.  @section does likewise.
3830    % However, they are not reliable, because we don't use marks.
3831  \def\thischapter{} \def\thissection{}  \def\thischapter{}
3832  \def\seccheck#1{\ifnum \pageno<0  \def\thissection{}
   \errmessage{@#1 not allowed after generating table of contents}%  
 \fi}  
   
 \def\chapternofonts{%  
   \let\rawbackslash=\relax  
   \let\frenchspacing=\relax  
   \def\result{\realbackslash result}%  
   \def\equiv{\realbackslash equiv}%  
   \def\expansion{\realbackslash expansion}%  
   \def\print{\realbackslash print}%  
   \def\TeX{\realbackslash TeX}%  
   \def\dots{\realbackslash dots}%  
   \def\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}}%  
 }  
3833    
3834  \newcount\absseclevel % used to calculate proper heading level  \newcount\absseclevel % used to calculate proper heading level
3835  \newcount\secbase\secbase=0 % @raise/lowersections modify this count  \newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count
3836    
3837  % @raisesections: treat @section as chapter, @subsection as section, etc.  % @raisesections: treat @section as chapter, @subsection as section, etc.
3838  \def\raisesections{\global\advance\secbase by -1}  \def\raisesections{\global\advance\secbase by -1}
# Line 2717  width0pt\relax} \fi Line 3842  width0pt\relax} \fi
3842  \def\lowersections{\global\advance\secbase by 1}  \def\lowersections{\global\advance\secbase by 1}
3843  \let\down=\lowersections % original BFox name  \let\down=\lowersections % original BFox name
3844    
3845  % Choose a numbered-heading macro  % we only have subsub.
3846  % #1 is heading level if unmodified by @raisesections or @lowersections  \chardef\maxseclevel = 3
3847  % #2 is text for heading  %
3848  \def\numhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1  % A numbered section within an unnumbered changes to unnumbered too.
3849  \ifcase\absseclevel  % To achive this, remember the "biggest" unnum. sec. we are currently in:
3850    \chapterzzz{#2}  \chardef\unmlevel = \maxseclevel
3851  \or  %
3852    \seczzz{#2}  % Trace whether the current chapter is an appendix or not:
3853  \or  % \chapheadtype is "N" or "A", unnumbered chapters are ignored.
3854    \numberedsubseczzz{#2}  \def\chapheadtype{N}
3855  \or  
3856    \numberedsubsubseczzz{#2}  % Choose a heading macro
3857  \else  % #1 is heading type
3858    \ifnum \absseclevel<0  % #2 is heading level
3859      \chapterzzz{#2}  % #3 is text for heading
3860    \def\genhead#1#2#3{%
3861      % Compute the abs. sec. level:
3862      \absseclevel=#2
3863      \advance\absseclevel by \secbase
3864      % Make sure \absseclevel doesn't fall outside the range:
3865      \ifnum \absseclevel < 0
3866        \absseclevel = 0
3867    \else    \else
3868      \numberedsubsubseczzz{#2}      \ifnum \absseclevel > 3
3869          \absseclevel = 3
3870        \fi
3871    \fi    \fi
3872  \fi    % The heading type:
3873  }    \def\headtype{#1}%
3874      \if \headtype U%
3875  % like \numhead, but chooses appendix heading levels      \ifnum \absseclevel < \unmlevel
3876  \def\apphead#1#2{\absseclevel=\secbase\advance\absseclevel by #1        \chardef\unmlevel = \absseclevel
3877  \ifcase\absseclevel      \fi
   \appendixzzz{#2}  
 \or  
   \appendixsectionzzz{#2}  
 \or  
   \appendixsubseczzz{#2}  
 \or  
   \appendixsubsubseczzz{#2}  
 \else  
   \ifnum \absseclevel<0  
     \appendixzzz{#2}  
3878    \else    \else
3879      \appendixsubsubseczzz{#2}      % Check for appendix sections:
3880        \ifnum \absseclevel = 0
3881          \edef\chapheadtype{\headtype}%
3882        \else
3883          \if \headtype A\if \chapheadtype N%
3884            \errmessage{@appendix... within a non-appendix chapter}%
3885          \fi\fi
3886        \fi
3887        % Check for numbered within unnumbered:
3888        \ifnum \absseclevel > \unmlevel
3889          \def\headtype{U}%
3890        \else
3891          \chardef\unmlevel = 3
3892        \fi
3893    \fi    \fi
3894  \fi    % Now print the heading:
3895  }    \if \headtype U%
3896        \ifcase\absseclevel
3897  % like \numhead, but chooses numberless heading levels          \unnumberedzzz{#3}%
3898  \def\unnmhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1      \or \unnumberedseczzz{#3}%
3899  \ifcase\absseclevel      \or \unnumberedsubseczzz{#3}%
3900    \unnumberedzzz{#2}      \or \unnumberedsubsubseczzz{#3}%
3901  \or      \fi
   \unnumberedseczzz{#2}  
 \or  
   \unnumberedsubseczzz{#2}  
 \or  
   \unnumberedsubsubseczzz{#2}  
 \else  
   \ifnum \absseclevel<0  
     \unnumberedzzz{#2}  
3902    \else    \else
3903      \unnumberedsubsubseczzz{#2}      \if \headtype A%
3904          \ifcase\absseclevel
3905              \appendixzzz{#3}%
3906          \or \appendixsectionzzz{#3}%
3907          \or \appendixsubseczzz{#3}%
3908          \or \appendixsubsubseczzz{#3}%
3909          \fi
3910        \else
3911          \ifcase\absseclevel
3912              \chapterzzz{#3}%
3913          \or \seczzz{#3}%
3914          \or \numberedsubseczzz{#3}%
3915          \or \numberedsubsubseczzz{#3}%
3916          \fi
3917        \fi
3918    \fi    \fi
3919  \fi    \suppressfirstparagraphindent
3920  }  }
3921    
3922    % an interface:
3923    \def\numhead{\genhead N}
3924    \def\apphead{\genhead A}
3925    \def\unnmhead{\genhead U}
3926    
3927  \def\thischaptername{No Chapter Title}  % @chapter, @appendix, @unnumbered.  Increment top-level counter, reset
3928  \outer\def\chapter{\parsearg\chapteryyy}  % all lower-level sectioning counters to zero.
3929  \def\chapteryyy #1{\numhead0{#1}} % normally numhead0 calls chapterzzz  %
3930  \def\chapterzzz #1{\seccheck{chapter}%  % Also set \chaplevelprefix, which we prepend to @float sequence numbers
3931  \secno=0 \subsecno=0 \subsubsecno=0  % (e.g., figures), q.v.  By default (before any chapter), that is empty.
3932  \global\advance \chapno by 1 \message{\putwordChapter \the\chapno}%  \let\chaplevelprefix = \empty
3933  \chapmacro {#1}{\the\chapno}%  %
3934  \gdef\thissection{#1}%  \outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz
3935  \gdef\thischaptername{#1}%  \def\chapterzzz#1{%
3936  % We don't substitute the actual chapter name into \thischapter    % section resetting is \global in case the chapter is in a group, such
3937  % because we don't want its macros evaluated now.    % as an @include file.
3938  \xdef\thischapter{\putwordChapter{} \the\chapno: \noexpand\thischaptername}%    \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
3939  {\chapternofonts%      \global\advance\chapno by 1
3940  \toks0 = {#1}%    %
3941  \edef\temp{{\realbackslash chapentry{\the\toks0}{\the\chapno}{\noexpand\folio}}}%    % Used for \float.
3942  \escapechar=`\\%    \gdef\chaplevelprefix{\the\chapno.}%
3943  \write \contentsfile \temp  %    \resetallfloatnos
3944  \donoderef %    %
3945  \global\let\section = \numberedsec    \message{\putwordChapter\space \the\chapno}%
3946  \global\let\subsection = \numberedsubsec    %
3947  \global\let\subsubsection = \numberedsubsubsec    % Write the actual heading.
3948  }}    \chapmacro{#1}{Ynumbered}{\the\chapno}%
3949      %
3950  \outer\def\appendix{\parsearg\appendixyyy}    % So @section and the like are numbered underneath this chapter.
3951  \def\appendixyyy #1{\apphead0{#1}} % normally apphead0 calls appendixzzz    \global\let\section = \numberedsec
3952  \def\appendixzzz #1{\seccheck{appendix}%    \global\let\subsection = \numberedsubsec
3953  \secno=0 \subsecno=0 \subsubsecno=0    \global\let\subsubsection = \numberedsubsubsec
3954  \global\advance \appendixno by 1 \message{Appendix \appendixletter}%  }
3955  \chapmacro {#1}{\putwordAppendix{} \appendixletter}%  
3956  \gdef\thissection{#1}%  \outer\parseargdef\appendix{\apphead0{#1}} % normally apphead0 calls appendixzzz
3957  \gdef\thischaptername{#1}%  \def\appendixzzz#1{%
3958  \xdef\thischapter{\putwordAppendix{} \appendixletter: \noexpand\thischaptername}%    \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
3959  {\chapternofonts%      \global\advance\appendixno by 1
3960  \toks0 = {#1}%    \gdef\chaplevelprefix{\appendixletter.}%
3961  \edef\temp{{\realbackslash chapentry{\the\toks0}%    \resetallfloatnos
3962    {\putwordAppendix{} \appendixletter}{\noexpand\folio}}}%    %
3963  \escapechar=`\\%    \def\appendixnum{\putwordAppendix\space \appendixletter}%
3964  \write \contentsfile \temp  %    \message{\appendixnum}%
3965  \appendixnoderef %    %
3966  \global\let\section = \appendixsec    \chapmacro{#1}{Yappendix}{\appendixletter}%
3967  \global\let\subsection = \appendixsubsec    %
3968  \global\let\subsubsection = \appendixsubsubsec    \global\let\section = \appendixsec
3969  }}    \global\let\subsection = \appendixsubsec
3970      \global\let\subsubsection = \appendixsubsubsec
3971    }
3972    
3973    \outer\parseargdef\unnumbered{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz
3974    \def\unnumberedzzz#1{%
3975      \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
3976        \global\advance\unnumberedno by 1
3977      %
3978      % Since an unnumbered has no number, no prefix for figures.
3979      \global\let\chaplevelprefix = \empty
3980      \resetallfloatnos
3981      %
3982      % This used to be simply \message{#1}, but TeX fully expands the
3983      % argument to \message.  Therefore, if #1 contained @-commands, TeX
3984      % expanded them.  For example, in `@unnumbered The @cite{Book}', TeX
3985      % expanded @cite (which turns out to cause errors because \cite is meant
3986      % to be executed, not expanded).
3987      %
3988      % Anyway, we don't want the fully-expanded definition of @cite to appear
3989      % as a result of the \message, we just want `@cite' itself.  We use
3990      % \the<toks register> to achieve this: TeX expands \the<toks> only once,
3991      % simply yielding the contents of <toks register>.  (We also do this for
3992      % the toc entries.)
3993      \toks0 = {#1}%
3994      \message{(\the\toks0)}%
3995      %
3996      \chapmacro{#1}{Ynothing}{\the\unnumberedno}%
3997      %
3998      \global\let\section = \unnumberedsec
3999      \global\let\subsection = \unnumberedsubsec
4000      \global\let\subsubsection = \unnumberedsubsubsec
4001    }
4002    
4003  % @centerchap is like @unnumbered, but the heading is centered.  % @centerchap is like @unnumbered, but the heading is centered.
4004  \outer\def\centerchap{\parsearg\centerchapyyy}  \outer\parseargdef\centerchap{%
4005  \def\centerchapyyy #1{{\let\unnumbchapmacro=\centerchapmacro \unnumberedyyy{#1}}}    % Well, we could do the following in a group, but that would break
4006      % an assumption that \chapmacro is called at the outermost level.
4007  \outer\def\top{\parsearg\unnumberedyyy}    % Thus we are safer this way:         --kasal, 24feb04
4008  \outer\def\unnumbered{\parsearg\unnumberedyyy}    \let\centerparametersmaybe = \centerparameters
4009  \def\unnumberedyyy #1{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz    \unnmhead0{#1}%
4010  \def\unnumberedzzz #1{\seccheck{unnumbered}%    \let\centerparametersmaybe = \relax
4011  \secno=0 \subsecno=0 \subsubsecno=0  }
 %  
 % This used to be simply \message{#1}, but TeX fully expands the  
 % argument to \message.  Therefore, if #1 contained @-commands, TeX  
 % expanded them.  For example, in `@unnumbered The @cite{Book}', TeX  
 % expanded @cite (which turns out to cause errors because \cite is meant  
 % to be executed, not expanded).  
 %  
 % 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>.  
 \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 %  
 \global\let\section = \unnumberedsec  
 \global\let\subsection = \unnumberedsubsec  
 \global\let\subsubsection = \unnumberedsubsubsec  
 }}  
   
 \outer\def\numberedsec{\parsearg\secyyy}  
 \def\secyyy #1{\numhead1{#1}} % normally calls seczzz  
 \def\seczzz #1{\seccheck{section}%  
 \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 %  
 }}  
   
 \outer\def\appendixsection{\parsearg\appendixsecyyy}  
 \outer\def\appendixsec{\parsearg\appendixsecyyy}  
 \def\appendixsecyyy #1{\apphead1{#1}} % normally calls appendixsectionzzz  
 \def\appendixsectionzzz #1{\seccheck{appendixsection}%  
 \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 %  
 }}  
   
 \outer\def\unnumberedsec{\parsearg\unnumberedsecyyy}  
 \def\unnumberedsecyyy #1{\unnmhead1{#1}} % normally calls unnumberedseczzz  
 \def\unnumberedseczzz #1{\seccheck{unnumberedsec}%  
 \plainsecheading {#1}\gdef\thissection{#1}%  
 {\chapternofonts%  
 \toks0 = {#1}%  
 \edef\temp{{\realbackslash unnumbsecentry{\the\toks0}{\noexpand\folio}}}%  
 \escapechar=`\\%  
 \write \contentsfile \temp %  
 \unnumbnoderef %  
 \penalty 10000 %  
 }}  
   
 \outer\def\numberedsubsec{\parsearg\numberedsubsecyyy}  
 \def\numberedsubsecyyy #1{\numhead2{#1}} % normally calls numberedsubseczzz  
 \def\numberedsubseczzz #1{\seccheck{subsection}%  
 \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 %  
 }}  
   
 \outer\def\appendixsubsec{\parsearg\appendixsubsecyyy}  
 \def\appendixsubsecyyy #1{\apphead2{#1}} % normally calls appendixsubseczzz  
 \def\appendixsubseczzz #1{\seccheck{appendixsubsec}%  
 \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 %  
 }}  
   
 \outer\def\unnumberedsubsec{\parsearg\unnumberedsubsecyyy}  
 \def\unnumberedsubsecyyy #1{\unnmhead2{#1}} %normally calls unnumberedsubseczzz  
 \def\unnumberedsubseczzz #1{\seccheck{unnumberedsubsec}%  
 \plainsubsecheading {#1}\gdef\thissection{#1}%  
 {\chapternofonts%  
 \toks0 = {#1}%  
 \edef\temp{{\realbackslash unnumbsubsecentry{\the\toks0}{\noexpand\folio}}}%  
 \escapechar=`\\%  
 \write \contentsfile \temp %  
 \unnumbnoderef %  
 \penalty 10000 %  
 }}  
4012    
4013  \outer\def\numberedsubsubsec{\parsearg\numberedsubsubsecyyy}  % @top is like @unnumbered.
4014  \def\numberedsubsubsecyyy #1{\numhead3{#1}} % normally numberedsubsubseczzz  \let\top\unnumbered
 \def\numberedsubsubseczzz #1{\seccheck{subsubsection}%  
 \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 %  
 }}  
4015    
4016  \outer\def\appendixsubsubsec{\parsearg\appendixsubsubsecyyy}  % Sections.
4017  \def\appendixsubsubsecyyy #1{\apphead3{#1}} % normally appendixsubsubseczzz  \outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz
4018  \def\appendixsubsubseczzz #1{\seccheck{appendixsubsubsec}%  \def\seczzz#1{%
4019  \gdef\thissection{#1}\global\advance \subsubsecno by 1 %    \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
4020  \subsubsecheading {#1}    \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}%
4021    {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}%  }
4022  {\chapternofonts%  
4023  \toks0 = {#1}%  \outer\parseargdef\appendixsection{\apphead1{#1}} % normally calls appendixsectionzzz
4024  \edef\temp{{\realbackslash subsubsecentry{\the\toks0}%  \def\appendixsectionzzz#1{%
4025    {\appendixletter}    \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
4026    {\the\secno}{\the\subsecno}{\the\subsubsecno}{\noexpand\folio}}}%    \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}%
4027  \escapechar=`\\%  }
4028  \write \contentsfile \temp %  \let\appendixsec\appendixsection
4029  \appendixnoderef %  
4030  \penalty 10000 %  \outer\parseargdef\unnumberedsec{\unnmhead1{#1}} % normally calls unnumberedseczzz
4031  }}  \def\unnumberedseczzz#1{%
4032      \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
4033  \outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubsecyyy}    \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}%
4034  \def\unnumberedsubsubsecyyy #1{\unnmhead3{#1}} %normally unnumberedsubsubseczzz  }
 \def\unnumberedsubsubseczzz #1{\seccheck{unnumberedsubsubsec}%  
 \plainsubsubsecheading {#1}\gdef\thissection{#1}%  
 {\chapternofonts%  
 \toks0 = {#1}%  
 \edef\temp{{\realbackslash unnumbsubsubsecentry{\the\toks0}{\noexpand\folio}}}%  
 \escapechar=`\\%  
 \write \contentsfile \temp %  
 \unnumbnoderef %  
 \penalty 10000 %  
 }}  
4035    
4036  % These are variants which are not "outer", so they can appear in @ifinfo.  % Subsections.
4037  % Actually, they should now be obsolete; ordinary section commands should work.  \outer\parseargdef\numberedsubsec{\numhead2{#1}} % normally calls numberedsubseczzz
4038  \def\infotop{\parsearg\unnumberedzzz}  \def\numberedsubseczzz#1{%
4039  \def\infounnumbered{\parsearg\unnumberedzzz}    \global\subsubsecno=0  \global\advance\subsecno by 1
4040  \def\infounnumberedsec{\parsearg\unnumberedseczzz}    \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}%
4041  \def\infounnumberedsubsec{\parsearg\unnumberedsubseczzz}  }
4042  \def\infounnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz}  
4043    \outer\parseargdef\appendixsubsec{\apphead2{#1}} % normally calls appendixsubseczzz
4044  \def\infoappendix{\parsearg\appendixzzz}  \def\appendixsubseczzz#1{%
4045  \def\infoappendixsec{\parsearg\appendixseczzz}    \global\subsubsecno=0  \global\advance\subsecno by 1
4046  \def\infoappendixsubsec{\parsearg\appendixsubseczzz}    \sectionheading{#1}{subsec}{Yappendix}%
4047  \def\infoappendixsubsubsec{\parsearg\appendixsubsubseczzz}                   {\appendixletter.\the\secno.\the\subsecno}%
4048    }
4049  \def\infochapter{\parsearg\chapterzzz}  
4050  \def\infosection{\parsearg\sectionzzz}  \outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
4051  \def\infosubsection{\parsearg\subsectionzzz}  \def\unnumberedsubseczzz#1{%
4052  \def\infosubsubsection{\parsearg\subsubsectionzzz}    \global\subsubsecno=0  \global\advance\subsecno by 1
4053      \sectionheading{#1}{subsec}{Ynothing}%
4054                     {\the\unnumberedno.\the\secno.\the\subsecno}%
4055    }
4056    
4057    % Subsubsections.
4058    \outer\parseargdef\numberedsubsubsec{\numhead3{#1}} % normally numberedsubsubseczzz
4059    \def\numberedsubsubseczzz#1{%
4060      \global\advance\subsubsecno by 1
4061      \sectionheading{#1}{subsubsec}{Ynumbered}%
4062                     {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}%
4063    }
4064    
4065    \outer\parseargdef\appendixsubsubsec{\apphead3{#1}} % normally appendixsubsubseczzz
4066    \def\appendixsubsubseczzz#1{%
4067      \global\advance\subsubsecno by 1
4068      \sectionheading{#1}{subsubsec}{Yappendix}%
4069                     {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}%
4070    }
4071    
4072    \outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
4073    \def\unnumberedsubsubseczzz#1{%
4074      \global\advance\subsubsecno by 1
4075      \sectionheading{#1}{subsubsec}{Ynothing}%
4076                     {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}%
4077    }
4078    
4079  % These macros control what the section commands do, according  % These macros control what the section commands do, according
4080  % to what kind of chapter we are in (ordinary, appendix, or unnumbered).  % to what kind of chapter we are in (ordinary, appendix, or unnumbered).
4081  % Define them by default for a numbered chapter.  % Define them by default for a numbered chapter.
4082  \global\let\section = \numberedsec  \let\section = \numberedsec
4083  \global\let\subsection = \numberedsubsec  \let\subsection = \numberedsubsec
4084  \global\let\subsubsection = \numberedsubsubsec  \let\subsubsection = \numberedsubsubsec
4085    
4086  % Define @majorheading, @heading and @subheading  % Define @majorheading, @heading and @subheading
4087    
4088  % NOTE on use of \vbox for chapter headings, section headings, and  % NOTE on use of \vbox for chapter headings, section headings, and such:
 % such:  
4089  %       1) We use \vbox rather than the earlier \line to permit  %       1) We use \vbox rather than the earlier \line to permit
4090  %          overlong headings to fold.  %          overlong headings to fold.
4091  %       2) \hyphenpenalty is set to 10000 because hyphenation in a  %       2) \hyphenpenalty is set to 10000 because hyphenation in a
# Line 3027  width0pt\relax} \fi Line 4094  width0pt\relax} \fi
4094  %          if justification is not attempted.  Hence \raggedright.  %          if justification is not attempted.  Hence \raggedright.
4095    
4096    
4097  \def\majorheading{\parsearg\majorheadingzzz}  \def\majorheading{%
4098  \def\majorheadingzzz #1{%    {\advance\chapheadingskip by 10pt \chapbreak }%
4099  {\advance\chapheadingskip by 10pt \chapbreak }%    \parsearg\chapheadingzzz
4100  {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000  }
4101                    \parindent=0pt\raggedright  
4102                    \rm #1\hfill}}\bigskip \par\penalty 200}  \def\chapheading{\chapbreak \parsearg\chapheadingzzz}
4103    \def\chapheadingzzz#1{%
4104  \def\chapheading{\parsearg\chapheadingzzz}    {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
4105  \def\chapheadingzzz #1{\chapbreak %                      \parindent=0pt\raggedright
4106  {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000                      \rm #1\hfill}}%
4107                    \parindent=0pt\raggedright    \bigskip \par\penalty 200\relax
4108                    \rm #1\hfill}}\bigskip \par\penalty 200}    \suppressfirstparagraphindent
4109    }
4110    
4111  % @heading, @subheading, @subsubheading.  % @heading, @subheading, @subsubheading.
4112  \def\heading{\parsearg\plainsecheading}  \parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{}
4113  \def\subheading{\parsearg\plainsubsecheading}    \suppressfirstparagraphindent}
4114  \def\subsubheading{\parsearg\plainsubsubsecheading}  \parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{}
4115      \suppressfirstparagraphindent}
4116    \parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{}
4117      \suppressfirstparagraphindent}
4118    
4119  % These macros generate a chapter, section, etc. heading only  % These macros generate a chapter, section, etc. heading only
4120  % (including whitespace, linebreaking, etc. around it),  % (including whitespace, linebreaking, etc. around it),
# Line 3052  width0pt\relax} \fi Line 4123  width0pt\relax} \fi
4123  %%% Args are the skip and penalty (usually negative)  %%% Args are the skip and penalty (usually negative)
4124  \def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}  \def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
4125    
 \def\setchapterstyle #1 {\csname CHAPF#1\endcsname}  
   
4126  %%% Define plain chapter starts, and page on/off switching for it  %%% Define plain chapter starts, and page on/off switching for it
4127  % Parameter controlling skip before chapter headings (if needed)  % Parameter controlling skip before chapter headings (if needed)
4128    
# Line 3065  width0pt\relax} \fi Line 4134  width0pt\relax} \fi
4134    
4135  \def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}  \def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
4136    
4137  \def\CHAPPAGoff{  \def\CHAPPAGoff{%
4138  \global\let\contentsalignmacro = \chappager  \global\let\contentsalignmacro = \chappager
4139  \global\let\pchapsepmacro=\chapbreak  \global\let\pchapsepmacro=\chapbreak
4140  \global\let\pagealignmacro=\chappager}  \global\let\pagealignmacro=\chappager}
4141    
4142  \def\CHAPPAGon{  \def\CHAPPAGon{%
4143  \global\let\contentsalignmacro = \chappager  \global\let\contentsalignmacro = \chappager
4144  \global\let\pchapsepmacro=\chappager  \global\let\pchapsepmacro=\chappager
4145  \global\let\pagealignmacro=\chappager  \global\let\pagealignmacro=\chappager
4146  \global\def\HEADINGSon{\HEADINGSsingle}}  \global\def\HEADINGSon{\HEADINGSsingle}}
4147    
4148  \def\CHAPPAGodd{  \def\CHAPPAGodd{%
4149  \global\let\contentsalignmacro = \chapoddpage  \global\let\contentsalignmacro = \chapoddpage
4150  \global\let\pchapsepmacro=\chapoddpage  \global\let\pchapsepmacro=\chapoddpage
4151  \global\let\pagealignmacro=\chapoddpage  \global\let\pagealignmacro=\chapoddpage
# Line 3084  width0pt\relax} \fi Line 4153  width0pt\relax} \fi
4153    
4154  \CHAPPAGon  \CHAPPAGon
4155    
4156  \def\CHAPFplain{  % Chapter opening.
4157  \global\let\chapmacro=\chfplain  %
4158  \global\let\unnumbchapmacro=\unnchfplain  % #1 is the text, #2 is the section type (Ynumbered, Ynothing,
4159  \global\let\centerchapmacro=\centerchfplain}  % Yappendix, Yomitfromtoc), #3 the chapter number.
4160    %
4161  % Plain chapter opening.  % To test against our argument.
4162  % #1 is the text, #2 the chapter number or empty if unnumbered.  \def\Ynothingkeyword{Ynothing}
4163  \def\chfplain#1#2{%  \def\Yomitfromtockeyword{Yomitfromtoc}
4164    \def\Yappendixkeyword{Yappendix}
4165    %
4166    \def\chapmacro#1#2#3{%
4167    \pchapsepmacro    \pchapsepmacro
4168    {%    {%
4169      \chapfonts \rm      \chapfonts \rm
4170      \def\chapnum{#2}%      %
4171      \setbox0 = \hbox{#2\ifx\chapnum\empty\else\enspace\fi}%      % Have to define \thissection before calling \donoderef, because the
4172        % xref code eventually uses it.  On the other hand, it has to be called
4173        % after \pchapsepmacro, or the headline will change too soon.
4174        \gdef\thissection{#1}%
4175        \gdef\thischaptername{#1}%
4176        %
4177        % Only insert the separating space if we have a chapter/appendix
4178        % number, and don't print the unnumbered ``number''.
4179        \def\temptype{#2}%
4180        \ifx\temptype\Ynothingkeyword
4181          \setbox0 = \hbox{}%
4182          \def\toctype{unnchap}%
4183          \def\thischapter{#1}%
4184        \else\ifx\temptype\Yomitfromtockeyword
4185          \setbox0 = \hbox{}% contents like unnumbered, but no toc entry
4186          \def\toctype{omit}%
4187          \xdef\thischapter{}%
4188        \else\ifx\temptype\Yappendixkeyword
4189          \setbox0 = \hbox{\putwordAppendix{} #3\enspace}%
4190          \def\toctype{app}%
4191          % We don't substitute the actual chapter name into \thischapter
4192          % because we don't want its macros evaluated now.  And we don't
4193          % use \thissection because that changes with each section.
4194          %
4195          \xdef\thischapter{\putwordAppendix{} \appendixletter:
4196                            \noexpand\thischaptername}%
4197        \else
4198          \setbox0 = \hbox{#3\enspace}%
4199          \def\toctype{numchap}%
4200          \xdef\thischapter{\putwordChapter{} \the\chapno:
4201                            \noexpand\thischaptername}%
4202        \fi\fi\fi
4203        %
4204        % Write the toc entry for this chapter.  Must come before the
4205        % \donoderef, because we include the current node name in the toc
4206        % entry, and \donoderef resets it to empty.
4207        \writetocentry{\toctype}{#1}{#3}%
4208        %
4209        % For pdftex, we have to write out the node definition (aka, make
4210        % the pdfdest) after any page break, but before the actual text has
4211        % been typeset.  If the destination for the pdf outline is after the
4212        % text, then jumping from the outline may wind up with the text not
4213        % being visible, for instance under high magnification.
4214        \donoderef{#2}%
4215        %
4216        % Typeset the actual heading.
4217      \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright      \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
4218            \hangindent = \wd0 \centerparametersmaybe            \hangindent=\wd0 \centerparametersmaybe
4219            \unhbox0 #1\par}%            \unhbox0 #1\par}%
4220    }%    }%
4221    \nobreak\bigskip % no page break after a chapter title    \nobreak\bigskip % no page break after a chapter title
4222    \nobreak    \nobreak
4223  }  }
4224    
 % Plain opening for unnumbered.  
 \def\unnchfplain#1{\chfplain{#1}{}}  
   
4225  % @centerchap -- centered and unnumbered.  % @centerchap -- centered and unnumbered.
4226  \let\centerparametersmaybe = \relax  \let\centerparametersmaybe = \relax
4227  \def\centerchfplain#1{{%  \def\centerparameters{%
4228    \def\centerparametersmaybe{%    \advance\rightskip by 3\rightskip
4229      \advance\rightskip by 3\rightskip    \leftskip = \rightskip
4230      \leftskip = \rightskip    \parfillskip = 0pt
4231      \parfillskip = 0pt  }
   }%  
   \chfplain{#1}{}%  
 }}  
4232    
 \CHAPFplain % The default  
4233    
4234    % I don't think this chapter style is supported any more, so I'm not
4235    % updating it with the new noderef stuff.  We'll see.  --karl, 11aug03.
4236    %
4237    \def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
4238    %
4239  \def\unnchfopen #1{%  \def\unnchfopen #1{%
4240  \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000  \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
4241                         \parindent=0pt\raggedright                         \parindent=0pt\raggedright
4242                         \rm #1\hfill}}\bigskip \par\penalty 10000 %                         \rm #1\hfill}}\bigskip \par\nobreak
4243  }  }
   
4244  \def\chfopen #1#2{\chapoddpage {\chapfonts  \def\chfopen #1#2{\chapoddpage {\chapfonts
4245  \vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%  \vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
4246  \par\penalty 5000 %  \par\penalty 5000 %
4247  }  }
   
4248  \def\centerchfopen #1{%  \def\centerchfopen #1{%
4249  \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000  \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
4250                         \parindent=0pt                         \parindent=0pt
4251                         \hfill {\rm #1}\hfill}}\bigskip \par\penalty 10000 %                         \hfill {\rm #1}\hfill}}\bigskip \par\nobreak
4252  }  }
4253    \def\CHAPFopen{%
4254      \global\let\chapmacro=\chfopen
4255      \global\let\centerchapmacro=\centerchfopen}
4256    
 \def\CHAPFopen{  
 \global\let\chapmacro=\chfopen  
 \global\let\unnumbchapmacro=\unnchfopen  
 \global\let\centerchapmacro=\centerchfopen}  
4257    
4258    % Section titles.  These macros combine the section number parts and
4259  % Section titles.  % call the generic \sectionheading to do the printing.
4260    %
4261  \newskip\secheadingskip  \newskip\secheadingskip
4262  \def\secheadingbreak{\dobreak \secheadingskip {-1000}}  \def\secheadingbreak{\dobreak \secheadingskip{-1000}}
 \def\secheading#1#2#3{\sectionheading{sec}{#2.#3}{#1}}  
 \def\plainsecheading#1{\sectionheading{sec}{}{#1}}  
4263    
4264  % Subsection titles.  % Subsection titles.
4265  \newskip \subsecheadingskip  \newskip\subsecheadingskip
4266  \def\subsecheadingbreak{\dobreak \subsecheadingskip {-500}}  \def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}}
 \def\subsecheading#1#2#3#4{\sectionheading{subsec}{#2.#3.#4}{#1}}  
 \def\plainsubsecheading#1{\sectionheading{subsec}{}{#1}}  
4267    
4268  % Subsubsection titles.  % Subsubsection titles.
4269  \let\subsubsecheadingskip = \subsecheadingskip  \def\subsubsecheadingskip{\subsecheadingskip}
4270  \let\subsubsecheadingbreak = \subsecheadingbreak  \def\subsubsecheadingbreak{\subsecheadingbreak}
 \def\subsubsecheading#1#2#3#4#5{\sectionheading{subsubsec}{#2.#3.#4.#5}{#1}}  
 \def\plainsubsubsecheading#1{\sectionheading{subsubsec}{}{#1}}  
4271    
4272    
4273  % Print any size section title.  % Print any size, any type, section title.
4274  %  %
4275  % #1 is the section type (sec/subsec/subsubsec), #2 is the section  % #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is
4276  % number (maybe empty), #3 the text.  % the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the
4277  \def\sectionheading#1#2#3{%  % section number.
4278    {%  %
4279      \expandafter\advance\csname #1headingskip\endcsname by \parskip  \def\sectionheading#1#2#3#4{%
     \csname #1headingbreak\endcsname  
   }%  
4280    {%    {%
4281      % Switch to the right set of fonts.      % Switch to the right set of fonts.
4282      \csname #1fonts\endcsname \rm      \csname #2fonts\endcsname \rm
4283        %
4284        % Insert space above the heading.
4285        \csname #2headingbreak\endcsname
4286      %      %
4287      % Only insert the separating space if we have a section number.      % Only insert the space after the number if we have a section number.
4288      \def\secnum{#2}%      \def\sectionlevel{#2}%
4289      \setbox0 = \hbox{#2\ifx\secnum\empty\else\enspace\fi}%      \def\temptype{#3}%
4290      %      %
4291        \ifx\temptype\Ynothingkeyword
4292          \setbox0 = \hbox{}%
4293          \def\toctype{unn}%
4294          \gdef\thissection{#1}%
4295        \else\ifx\temptype\Yomitfromtockeyword
4296          % for @headings -- no section number, don't include in toc,
4297          % and don't redefine \thissection.
4298          \setbox0 = \hbox{}%
4299          \def\toctype{omit}%
4300          \let\sectionlevel=\empty
4301        \else\ifx\temptype\Yappendixkeyword
4302          \setbox0 = \hbox{#4\enspace}%
4303          \def\toctype{app}%
4304          \gdef\thissection{#1}%
4305        \else
4306          \setbox0 = \hbox{#4\enspace}%
4307          \def\toctype{num}%
4308          \gdef\thissection{#1}%
4309        \fi\fi\fi
4310        %
4311        % Write the toc entry (before \donoderef).  See comments in \chfplain.
4312        \writetocentry{\toctype\sectionlevel}{#1}{#4}%
4313        %
4314        % Write the node reference (= pdf destination for pdftex).
4315        % Again, see comments in \chfplain.
4316        \donoderef{#3}%
4317        %
4318        % Output the actual section heading.
4319      \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright      \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
4320            \hangindent = \wd0 % zero if no section number            \hangindent=\wd0  % zero if no section number
4321            \unhbox0 #3}%            \unhbox0 #1}%
4322    }%    }%
4323    \ifdim\parskip<10pt \nobreak\kern10pt\nobreak\kern-\parskip\fi \nobreak    % Add extra space after the heading -- half of whatever came above it.
4324      % Don't allow stretch, though.
4325      \kern .5 \csname #2headingskip\endcsname
4326      %
4327      % Do not let the kern be a potential breakpoint, as it would be if it
4328      % was followed by glue.
4329      \nobreak
4330      %
4331      % We'll almost certainly start a paragraph next, so don't let that
4332      % glue accumulate.  (Not a breakpoint because it's preceded by a
4333      % discardable item.)
4334      \vskip-\parskip
4335      %
4336      % This \nobreak is purely so the last item on the list is a \penalty
4337      % of 10000.  This is so other code, for instance \parsebodycommon, can
4338      % check for and avoid allowing breakpoints.  Otherwise, it would
4339      % insert a valid breakpoint between:
4340      %   @section sec-whatever
4341      %   @deffn def-whatever
4342      \nobreak
4343  }  }
4344    
4345    
4346  \message{toc printing,}  \message{toc,}
4347  % Finish up the main text and prepare to read what we've written  % Table of contents.
4348  % to \contentsfile.  \newwrite\tocfile
4349    
4350    % Write an entry to the toc file, opening it if necessary.
4351    % Called from @chapter, etc.  
4352    %
4353    % Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno}
4354    % We append the current node name (if any) and page number as additional
4355    % arguments for the \{chap,sec,...}entry macros which will eventually
4356    % read this.  The node name is used in the pdf outlines as the
4357    % destination to jump to.
4358    %
4359    % We open the .toc file for writing here instead of at @setfilename (or
4360    % any other fixed time) so that @contents can be anywhere in the document.
4361    % But if #1 is `omit', then we don't do anything.  This is used for the
4362    % table of contents chapter openings themselves.
4363    %
4364    \newif\iftocfileopened
4365    \def\omitkeyword{omit}%
4366    %
4367    \def\writetocentry#1#2#3{%
4368      \edef\writetoctype{#1}%
4369      \ifx\writetoctype\omitkeyword \else
4370        \iftocfileopened\else
4371          \immediate\openout\tocfile = \jobname.toc
4372          \global\tocfileopenedtrue
4373        \fi
4374        %
4375        \iflinks
4376          \toks0 = {#2}%
4377          \toks2 = \expandafter{\lastnode}%
4378          \edef\temp{\write\tocfile{\realbackslash #1entry{\the\toks0}{#3}%
4379                                   {\the\toks2}{\noexpand\folio}}}%
4380          \temp
4381        \fi
4382      \fi
4383      %
4384      % Tell \shipout to create a pdf destination on each page, if we're
4385      % writing pdf.  These are used in the table of contents.  We can't
4386      % just write one on every page because the title pages are numbered
4387      % 1 and 2 (the page numbers aren't printed), and so are the first
4388      % two pages of the document.  Thus, we'd have two destinations named
4389      % `1', and two named `2'.
4390      \ifpdf \global\pdfmakepagedesttrue \fi
4391    }
4392    
4393  \newskip\contentsrightmargin \contentsrightmargin=1in  \newskip\contentsrightmargin \contentsrightmargin=1in
4394    \newcount\savepageno
4395    \newcount\lastnegativepageno \lastnegativepageno = -1
4396    
4397    % Prepare to read what we've written to \tocfile.
4398    %
4399  \def\startcontents#1{%  \def\startcontents#1{%
4400     % If @setchapternewpage on, and @headings double, the contents should    % If @setchapternewpage on, and @headings double, the contents should
4401     % start on an odd page, unlike chapters.  Thus, we maintain    % start on an odd page, unlike chapters.  Thus, we maintain
4402     % \contentsalignmacro in parallel with \pagealignmacro.    % \contentsalignmacro in parallel with \pagealignmacro.
4403     % From: Torbjorn Granlund <tege@matematik.su.se>    % From: Torbjorn Granlund <tege@matematik.su.se>
4404     \contentsalignmacro    \contentsalignmacro
4405     \immediate\closeout \contentsfile    \immediate\closeout\tocfile
4406     \ifnum \pageno>0    %
4407        \pageno = -1              % Request roman numbered pages.    % Don't need to put `Contents' or `Short Contents' in the headline.
4408     \fi    % It is abundantly clear what they are.
4409     % Don't need to put `Contents' or `Short Contents' in the headline.    \def\thischapter{}%
4410     % It is abundantly clear what they are.    \chapmacro{#1}{Yomitfromtoc}{}%
4411     \unnumbchapmacro{#1}\def\thischapter{}%    %
4412     \begingroup                  % Set up to handle contents files properly.    \savepageno = \pageno
4413        \catcode`\\=0  \catcode`\{=1  \catcode`\}=2  \catcode`\@=11    \begingroup                  % Set up to handle contents files properly.
4414        \catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi      \catcode`\\=0  \catcode`\{=1  \catcode`\}=2  \catcode`\@=11
4415        \raggedbottom             % Worry more about breakpoints than the bottom.      % We can't do this, because then an actual ^ in a section
4416        \advance\hsize by -\contentsrightmargin % Don't use the full line length.      % title fails, e.g., @chapter ^ -- exponentiation.  --karl, 9jul97.
4417        %\catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi
4418        \raggedbottom             % Worry more about breakpoints than the bottom.
4419        \advance\hsize by -\contentsrightmargin % Don't use the full line length.
4420        %
4421        % Roman numerals for page numbers.
4422        \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi
4423  }  }
4424    
4425    
4426  % Normal (long) toc.  % Normal (long) toc.
4427  \outer\def\contents{%  \def\contents{%
4428     \startcontents{\putwordTableofContents}%    \startcontents{\putwordTOC}%
4429        \openin 1 \jobname.toc
4430        \ifeof 1 \else
4431        \input \jobname.toc        \input \jobname.toc
4432     \endgroup      \fi
4433     \vfill \eject      \vfill \eject
4434        \contentsalignmacro % in case @setchapternewpage odd is in effect
4435        \ifeof 1 \else
4436          \pdfmakeoutlines
4437        \fi
4438        \closein 1
4439      \endgroup
4440      \lastnegativepageno = \pageno
4441      \global\pageno = \savepageno
4442  }  }
4443    
4444  % And just the chapters.  % And just the chapters.
4445  \outer\def\summarycontents{%  \def\summarycontents{%
4446     \startcontents{\putwordShortContents}%    \startcontents{\putwordShortTOC}%
4447        %      %
4448        \let\chapentry = \shortchapentry      \let\numchapentry = \shortchapentry
4449        \let\unnumbchapentry = \shortunnumberedentry      \let\appentry = \shortchapentry
4450        % We want a true roman here for the page numbers.      \let\unnchapentry = \shortunnchapentry
4451        \secfonts      % We want a true roman here for the page numbers.
4452        \let\rm=\shortcontrm \let\bf=\shortcontbf \let\sl=\shortcontsl      \secfonts
4453        \rm      \let\rm=\shortcontrm \let\bf=\shortcontbf
4454        \hyphenpenalty = 10000      \let\sl=\shortcontsl \let\tt=\shortconttt
4455        \advance\baselineskip by 1pt % Open it up a little.      \rm
4456        \def\secentry ##1##2##3##4{}      \hyphenpenalty = 10000
4457        \def\unnumbsecentry ##1##2{}      \advance\baselineskip by 1pt % Open it up a little.
4458        \def\subsecentry ##1##2##3##4##5{}      \def\numsecentry##1##2##3##4{}
4459        \def\unnumbsubsecentry ##1##2{}      \let\appsecentry = \numsecentry
4460        \def\subsubsecentry ##1##2##3##4##5##6{}      \let\unnsecentry = \numsecentry
4461        \def\unnumbsubsubsecentry ##1##2{}      \let\numsubsecentry = \numsecentry
4462        \let\appsubsecentry = \numsecentry
4463        \let\unnsubsecentry = \numsecentry
4464        \let\numsubsubsecentry = \numsecentry
4465        \let\appsubsubsecentry = \numsecentry
4466        \let\unnsubsubsecentry = \numsecentry
4467        \openin 1 \jobname.toc
4468        \ifeof 1 \else
4469        \input \jobname.toc        \input \jobname.toc
4470     \endgroup      \fi
4471     \vfill \eject      \closein 1
4472        \vfill \eject
4473        \contentsalignmacro % in case @setchapternewpage odd is in effect
4474      \endgroup
4475      \lastnegativepageno = \pageno
4476      \global\pageno = \savepageno
4477  }  }
4478  \let\shortcontents = \summarycontents  \let\shortcontents = \summarycontents
4479    
 % These macros generate individual entries in the table of contents.  
 % The first argument is the chapter or section name.  
 % The last argument is the page number.  
 % The arguments in between are the chapter number, section number, ...  
   
 % Chapter-level things, for both the long and short contents.  
 \def\chapentry#1#2#3{\dochapentry{#2\labelspace#1}{#3}}  
   
 % See comments in \dochapentry re vbox and related settings  
 \def\shortchapentry#1#2#3{%  
   \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno{#3}}%  
 }  
   
4480  % Typeset the label for a chapter or appendix for the short contents.  % Typeset the label for a chapter or appendix for the short contents.
4481  % The arg is, e.g. `Appendix A' for an appendix, or `3' for a chapter.  % The arg is, e.g., `A' for an appendix, or `3' for a chapter.
4482  % 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  
   
4483  \def\shortchaplabel#1{%  \def\shortchaplabel#1{%
4484    % We typeset #1 in a box of constant width, regardless of the text of    % This space should be enough, since a single number is .5em, and the
   % #1, so the chapter titles will come out aligned.  
   \setbox0 = \hbox{#1}%  
   \dimen0 = \ifdim\wd0 > \shortappendixwidth \shortappendixwidth \else 0pt \fi  
   %  
   % This space should be plenty, since a single number is .5em, and the  
4485    % widest letter (M) is 1em, at least in the Computer Modern fonts.    % widest letter (M) is 1em, at least in the Computer Modern fonts.
4486      % But use \hss just in case.
4487    % (This space doesn't include the extra space that gets added after    % (This space doesn't include the extra space that gets added after
4488    % the label; that gets put in by \shortchapentry above.)    % the label; that gets put in by \shortchapentry above.)
4489    \advance\dimen0 by 1.1em    %
4490    \hbox to \dimen0{#1\hfil}%    % We'd like to right-justify chapter numbers, but that looks strange
4491      % with appendix letters.  And right-justifying numbers and
4492      % left-justifying letters looks strange when there is less than 10
4493      % chapters.  Have to read the whole toc once to know how many chapters
4494      % there are before deciding ...
4495      \hbox to 1em{#1\hss}%
4496  }  }
4497    
4498  \def\unnumbchapentry#1#2{\dochapentry{#1}{#2}}  % These macros generate individual entries in the table of contents.
4499  \def\shortunnumberedentry#1#2{\tocentry{#1}{\doshortpageno{#2}}}  % The first argument is the chapter or section name.
4500    % The last argument is the page number.
4501    % The arguments in between are the chapter number, section number, ...
4502    
4503    % Chapters, in the main contents.
4504    \def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}}
4505    %
4506    % Chapters, in the short toc.
4507    % See comments in \dochapentry re vbox and related settings.
4508    \def\shortchapentry#1#2#3#4{%
4509      \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}%
4510    }
4511    
4512    % Appendices, in the main contents.
4513    % Need the word Appendix, and a fixed-size box.
4514    %
4515    \def\appendixbox#1{%
4516      % We use M since it's probably the widest letter.
4517      \setbox0 = \hbox{\putwordAppendix{} M}%
4518      \hbox to \wd0{\putwordAppendix{} #1\hss}}
4519    %
4520    \def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}}
4521    
4522    % Unnumbered chapters.
4523    \def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}}
4524    \def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}}
4525    
4526  % Sections.  % Sections.
4527  \def\secentry#1#2#3#4{\dosecentry{#2.#3\labelspace#1}{#4}}  \def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}}
4528  \def\unnumbsecentry#1#2{\dosecentry{#1}{#2}}  \let\appsecentry=\numsecentry
4529    \def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}}
4530    
4531  % Subsections.  % Subsections.
4532  \def\subsecentry#1#2#3#4#5{\dosubsecentry{#2.#3.#4\labelspace#1}{#5}}  \def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}}
4533  \def\unnumbsubsecentry#1#2{\dosubsecentry{#1}{#2}}  \let\appsubsecentry=\numsubsecentry
4534    \def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}}
4535    
4536  % And subsubsections.  % And subsubsections.
4537  \def\subsubsecentry#1#2#3#4#5#6{%  \def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}}
4538    \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}{#6}}  \let\appsubsubsecentry=\numsubsubsecentry
4539  \def\unnumbsubsubsecentry#1#2{\dosubsubsecentry{#1}{#2}}  \def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}}
4540    
4541  % This parameter controls the indentation of the various levels.  % This parameter controls the indentation of the various levels.
4542  \newdimen\tocindent \tocindent = 3pc  % Same as \defaultparindent.
4543    \newdimen\tocindent \tocindent = 15pt
4544    
4545  % Now for the actual typesetting. In all these, #1 is the text and #2 is the  % Now for the actual typesetting. In all these, #1 is the text and #2 is the
4546  % page number.  % page number.
# Line 3309  width0pt\relax} \fi Line 4551  width0pt\relax} \fi
4551     \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip     \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip
4552     \begingroup     \begingroup
4553       \chapentryfonts       \chapentryfonts
4554       \tocentry{#1}{\dopageno{#2}}%       \tocentry{#1}{\dopageno\bgroup#2\egroup}%
4555     \endgroup     \endgroup
4556     \nobreak\vskip .25\baselineskip plus.1\baselineskip     \nobreak\vskip .25\baselineskip plus.1\baselineskip
4557  }  }
4558    
4559  \def\dosecentry#1#2{\begingroup  \def\dosecentry#1#2{\begingroup
4560    \secentryfonts \leftskip=\tocindent    \secentryfonts \leftskip=\tocindent
4561    \tocentry{#1}{\dopageno{#2}}%    \tocentry{#1}{\dopageno\bgroup#2\egroup}%
4562  \endgroup}  \endgroup}
4563    
4564  \def\dosubsecentry#1#2{\begingroup  \def\dosubsecentry#1#2{\begingroup
4565    \subsecentryfonts \leftskip=2\tocindent    \subsecentryfonts \leftskip=2\tocindent
4566    \tocentry{#1}{\dopageno{#2}}%    \tocentry{#1}{\dopageno\bgroup#2\egroup}%
4567  \endgroup}  \endgroup}
4568    
4569  \def\dosubsubsecentry#1#2{\begingroup  \def\dosubsubsecentry#1#2{\begingroup
4570    \subsubsecentryfonts \leftskip=3\tocindent    \subsubsecentryfonts \leftskip=3\tocindent
4571    \tocentry{#1}{\dopageno{#2}}%    \tocentry{#1}{\dopageno\bgroup#2\egroup}%
4572  \endgroup}  \endgroup}
4573    
4574  % Final typesetting of a toc entry; we use the same \entry macro as for  % We use the same \entry macro as for the index entries.
4575  % the index entries, but we want to suppress hyphenation here.  (We  \let\tocentry = \entry
 % 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}%  
 \endgroup}  
4576    
4577  % Space between chapter (or whatever) number and the title.  % Space between chapter (or whatever) number and the title.
4578  \def\labelspace{\hskip1em \relax}  \def\labelspace{\hskip1em \relax}
# Line 3348  width0pt\relax} \fi Line 4582  width0pt\relax} \fi
4582    
4583  \def\chapentryfonts{\secfonts \rm}  \def\chapentryfonts{\secfonts \rm}
4584  \def\secentryfonts{\textfonts}  \def\secentryfonts{\textfonts}
4585  \let\subsecentryfonts = \textfonts  \def\subsecentryfonts{\textfonts}
4586  \let\subsubsecentryfonts = \textfonts  \def\subsubsecentryfonts{\textfonts}
4587    
4588    
4589  \message{environments,}  \message{environments,}
4590    % @foo ... @end foo.
4591    
4592    % @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
4593    %
4594  % Since these characters are used in examples, it should be an even number of  % Since these characters are used in examples, it should be an even number of
4595  % \tt widths. Each \tt character is 1en, so two makes it 1em.  % \tt widths. Each \tt character is 1en, so two makes it 1em.
4596  % Furthermore, these definitions must come after we define our fonts.  %
 \newbox\dblarrowbox    \newbox\longdblarrowbox  
 \newbox\pushcharbox    \newbox\bullbox  
 \newbox\equivbox       \newbox\errorbox  
   
 %{\tentt  
 %\global\setbox\dblarrowbox = \hbox to 1em{\hfil$\Rightarrow$\hfil}  
 %\global\setbox\longdblarrowbox = \hbox to 1em{\hfil$\mapsto$\hfil}  
 %\global\setbox\pushcharbox = \hbox to 1em{\hfil$\dashv$\hfil}  
 %\global\setbox\equivbox = \hbox to 1em{\hfil$\ptexequiv$\hfil}  
 % Adapted from the manmac format (p.420 of TeXbook)  
 %\global\setbox\bullbox = \hbox to 1em{\kern.15em\vrule height .75ex width .85ex  
 %                                      depth .1ex\hfil}  
 %}  
   
 % @point{}, @result{}, @expansion{}, @print{}, @equiv{}.  
4597  \def\point{$\star$}  \def\point{$\star$}
4598  \def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}  \def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
4599  \def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}}  \def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}}
4600  \def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}  \def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
4601  \def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}}  \def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}}
4602    
4603    % The @error{} command.
4604  % Adapted from the TeXbook's \boxit.  % Adapted from the TeXbook's \boxit.
4605    %
4606    \newbox\errorbox
4607    %
4608  {\tentt \global\dimen0 = 3em}% Width of the box.  {\tentt \global\dimen0 = 3em}% Width of the box.
4609  \dimen2 = .55pt % Thickness of rules  \dimen2 = .55pt % Thickness of rules
4610  % The text. (`r' is open on the right, `e' somewhat less so on the left.)  % The text. (`r' is open on the right, `e' somewhat less so on the left.)
4611  \setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt}  \setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt}
4612    %
4613  \global\setbox\errorbox=\hbox to \dimen0{\hfil  \setbox\errorbox=\hbox to \dimen0{\hfil
4614     \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.     \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
4615     \advance\hsize by -2\dimen2 % Rules.     \advance\hsize by -2\dimen2 % Rules.
4616     \vbox{     \vbox{%
4617        \hrule height\dimen2        \hrule height\dimen2
4618        \hbox{\vrule width\dimen2 \kern3pt          % Space to left of text.        \hbox{\vrule width\dimen2 \kern3pt          % Space to left of text.
4619           \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.           \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
4620           \kern3pt\vrule width\dimen2}% Space to right.           \kern3pt\vrule width\dimen2}% Space to right.
4621        \hrule height\dimen2}        \hrule height\dimen2}
4622      \hfil}      \hfil}
4623    %
 % The @error{} command.  
4624  \def\error{\leavevmode\lower.7ex\copy\errorbox}  \def\error{\leavevmode\lower.7ex\copy\errorbox}
4625    
4626  % @tex ... @end tex    escapes into raw Tex temporarily.  % @tex ... @end tex    escapes into raw Tex temporarily.
4627  % One exception: @ is still an escape character, so that @end tex works.  % One exception: @ is still an escape character, so that @end tex works.
4628  % But \@ or @@ will get a plain tex @ character.  % But \@ or @@ will get a plain tex @ character.
4629    
4630  \def\tex{\begingroup  \envdef\tex{%
4631  \catcode `\\=0 \catcode `\{=1 \catcode `\}=2    \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
4632  \catcode `\$=3 \catcode `\&=4 \catcode `\#=6    \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
4633  \catcode `\^=7 \catcode `\_=8 \catcode `\~=13 \let~=\tie    \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie
4634  \catcode `\%=14    \catcode `\%=14
4635  \catcode 43=12 % plus    \catcode `\+=\other
4636  \catcode`\"=12    \catcode `\"=\other
4637  \catcode`\==12    \catcode `\|=\other
4638  \catcode`\|=12    \catcode `\<=\other
4639  \catcode`\<=12    \catcode `\>=\other
4640  \catcode`\>=12    \escapechar=`\\
4641  \escapechar=`\\    %
4642  %    \let\b=\ptexb
4643  \let\,=\ptexcomma    \let\bullet=\ptexbullet
4644  \let\{=\ptexlbrace    \let\c=\ptexc
4645  \let\}=\ptexrbrace    \let\,=\ptexcomma
4646  \let\.=\ptexdot    \let\.=\ptexdot
4647  \let\*=\ptexstar    \let\dots=\ptexdots
4648  \let\dots=\ptexdots    \let\equiv=\ptexequiv
4649  \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%    \let\!=\ptexexclam
4650  \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%    \let\i=\ptexi
4651  \def\@{@}%    \let\indent=\ptexindent
4652  \let\bullet=\ptexbullet    \let\noindent=\ptexnoindent
4653  \let\b=\ptexb \let\c=\ptexc \let\i=\ptexi \let\t=\ptext    \let\{=\ptexlbrace
4654  %    \let\+=\tabalign
4655  \let\Etex=\endgroup}    \let\}=\ptexrbrace
4656      \let\/=\ptexslash
4657  % Define @lisp ... @endlisp.    \let\*=\ptexstar
4658  % @lisp does a \begingroup so it can rebind things,    \let\t=\ptext
4659  % including the definition of @endlisp (which normally is erroneous).    %
4660      \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
4661      \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
4662      \def\@{@}%
4663    }
4664    % There is no need to define \Etex.
4665    
4666    % Define @lisp ... @end lisp.
4667    % @lisp environment forms a group so it can rebind things,
4668    % including the definition of @end lisp (which normally is erroneous).
4669    
4670  % Amount to narrow the margins by for @lisp.  % Amount to narrow the margins by for @lisp.
4671  \newskip\lispnarrowing \lispnarrowing=0.4in  \newskip\lispnarrowing \lispnarrowing=0.4in
# Line 3441  width0pt\relax} \fi Line 4675  width0pt\relax} \fi
4675  % have any width.  % have any width.
4676  \def\lisppar{\null\endgraf}  \def\lisppar{\null\endgraf}
4677    
 % Make each space character in the input produce a normal interword  
 % space in the output.  Don't allow a line break at this space, as this  
 % is used only in environments like @example, where each line of input  
 % should produce a line of output anyway.  
 %  
 {\obeyspaces %  
 \gdef\sepspaces{\obeyspaces\let =\tie}}  
   
 % Define \obeyedspace to be our active space, whatever it is.  This is  
 % for use in \parsearg.  
 {\sepspaces%  
 \global\let\obeyedspace= }  
   
4678  % This space is always present above and below environments.  % This space is always present above and below environments.
4679  \newskip\envskipamount \envskipamount = 0pt  \newskip\envskipamount \envskipamount = 0pt
4680    
4681  % Make spacing and below environment symmetrical.  We use \parskip here  % Make spacing and below environment symmetrical.  We use \parskip here
4682  % to help in doing that, since in @example-like environments \parskip  % to help in doing that, since in @example-like environments \parskip
4683  % is reset to zero; thus the \afterenvbreak inserts no space -- but the  % is reset to zero; thus the \afterenvbreak inserts no space -- but the
4684  % start of the next paragraph will insert \parskip  % start of the next paragraph will insert \parskip.
4685  %  %
4686  \def\aboveenvbreak{{\advance\envskipamount by \parskip  \def\aboveenvbreak{{%
4687  \endgraf \ifdim\lastskip<\envskipamount    % =10000 instead of <10000 because of a special case in \itemzzz, q.v.
4688  \removelastskip \penalty-50 \vskip\envskipamount \fi}}    \ifnum \lastpenalty=10000 \else
4689        \advance\envskipamount by \parskip
4690        \endgraf
4691        \ifdim\lastskip<\envskipamount
4692          \removelastskip
4693          % it's not a good place to break if the last penalty was \nobreak
4694          % or better ...
4695          \ifnum\lastpenalty<10000 \penalty-50 \fi
4696          \vskip\envskipamount
4697        \fi
4698      \fi
4699    }}
4700    
4701  \let\afterenvbreak = \aboveenvbreak  \let\afterenvbreak = \aboveenvbreak
4702    
4703  % \nonarrowing is a flag.  If "set", @lisp etc don't narrow margins.  % \nonarrowing is a flag.  If "set", @lisp etc don't narrow margins.
4704  \let\nonarrowing=\relax  \let\nonarrowing=\relax
4705    
4706  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  % @cartouche ... @end cartouche: draw rectangle w/rounded corners around
4707  % \cartouche: draw rectangle w/rounded corners around argument  % environment contents.
4708  \font\circle=lcircle10  \font\circle=lcircle10
4709  \newdimen\circthick  \newdimen\circthick
4710  \newdimen\cartouter\newdimen\cartinner  \newdimen\cartouter\newdimen\cartinner
# Line 3492  width0pt\relax} \fi Line 4724  width0pt\relax} \fi
4724  %  %
4725  \newskip\lskip\newskip\rskip  \newskip\lskip\newskip\rskip
4726    
4727  \long\def\cartouche{%  \envdef\cartouche{%
4728  \begingroup    \ifhmode\par\fi  % can't be in the midst of a paragraph.
4729          \lskip=\leftskip \rskip=\rightskip    \startsavinginserts
4730          \leftskip=0pt\rightskip=0pt %we want these *outside*.    \lskip=\leftskip \rskip=\rightskip
4731          \cartinner=\hsize \advance\cartinner by-\lskip    \leftskip=0pt\rightskip=0pt % we want these *outside*.
4732                            \advance\cartinner by-\rskip    \cartinner=\hsize \advance\cartinner by-\lskip
4733          \cartouter=\hsize    \advance\cartinner by-\rskip
4734          \advance\cartouter by 18pt % allow for 3pt kerns on either    \cartouter=\hsize
4735  %                                    side, and for 6pt waste from    \advance\cartouter by 18.4pt  % allow for 3pt kerns on either
4736  %                                    each corner char                                  % side, and for 6pt waste from
4737          \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip                                  % each corner char, and rule thickness
4738          % Flag to tell @lisp, etc., not to narrow margin.    \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
4739          \let\nonarrowing=\comment    % Flag to tell @lisp, etc., not to narrow margin.
4740          \vbox\bgroup    \let\nonarrowing=\comment
4741                  \baselineskip=0pt\parskip=0pt\lineskip=0pt    \vbox\bgroup
4742                  \carttop        \baselineskip=0pt\parskip=0pt\lineskip=0pt
4743                  \hbox\bgroup        \carttop
4744                          \hskip\lskip        \hbox\bgroup
4745                          \vrule\kern3pt            \hskip\lskip
4746                          \vbox\bgroup            \vrule\kern3pt
4747                                  \hsize=\cartinner            \vbox\bgroup
4748                                  \kern3pt                \kern3pt
4749                                  \begingroup                \hsize=\cartinner
4750                                          \baselineskip=\normbskip                \baselineskip=\normbskip
4751                                          \lineskip=\normlskip                \lineskip=\normlskip
4752                                          \parskip=\normpskip                \parskip=\normpskip
4753                                          \vskip -\parskip                \vskip -\parskip
4754                  \comment % For explanation, see the end of \def\group.
4755    }
4756  \def\Ecartouche{%  \def\Ecartouche{%
4757                                  \endgroup                \ifhmode\par\fi
4758                                  \kern3pt                \kern3pt
4759                          \egroup            \egroup
4760                          \kern3pt\vrule            \kern3pt\vrule
4761                          \hskip\rskip            \hskip\rskip
4762                  \egroup        \egroup
4763                  \cartbot        \cartbot
4764          \egroup    \egroup
4765  \endgroup    \checkinserts
4766  }}  }
4767    
4768    
4769  % This macro is called at the beginning of all the @example variants,  % This macro is called at the beginning of all the @example variants,
4770  % inside a group.  % inside a group.
4771  \def\nonfillstart{%  \def\nonfillstart{%
4772    \aboveenvbreak    \aboveenvbreak
   \inENV % This group ends at the end of the body  
4773    \hfuzz = 12pt % Don't be fussy    \hfuzz = 12pt % Don't be fussy
4774    \sepspaces % Make spaces be word-separators rather than space tokens.    \sepspaces % Make spaces be word-separators rather than space tokens.
   \singlespace  
4775    \let\par = \lisppar % don't ignore blank lines    \let\par = \lisppar % don't ignore blank lines
4776    \obeylines % each line of input is a line of output    \obeylines % each line of input is a line of output
4777    \parskip = 0pt    \parskip = 0pt
# Line 3550  width0pt\relax} \fi Line 4782  width0pt\relax} \fi
4782    \ifx\nonarrowing\relax    \ifx\nonarrowing\relax
4783      \advance \leftskip by \lispnarrowing      \advance \leftskip by \lispnarrowing
4784      \exdentamount=\lispnarrowing      \exdentamount=\lispnarrowing
     \let\exdent=\nofillexdent  
     \let\nonarrowing=\relax  
4785    \fi    \fi
4786      \let\exdent=\nofillexdent
4787  }  }
4788    
4789  % To ending an @example-like environment, we first end the paragraph  % If you want all examples etc. small: @set dispenvsize small.
4790  % (via \afterenvbreak's vertical glue), and then the group.  That way we  % If you want even small examples the full size: @set dispenvsize nosmall.
4791  % keep the zero \parskip that the environments set -- \parskip glue  % This affects the following displayed environments:
4792  % will be inserted at the beginning of the next paragraph in the  %    @example, @display, @format, @lisp
4793  % document, after the environment.  %
4794  %  \def\smallword{small}
4795  \def\nonfillfinish{\afterenvbreak\endgroup}%  \def\nosmallword{nosmall}
4796    \let\SETdispenvsize\relax
4797    \def\setnormaldispenv{%
4798      \ifx\SETdispenvsize\smallword
4799        \smallexamplefonts \rm
4800      \fi
4801    }
4802    \def\setsmalldispenv{%
4803      \ifx\SETdispenvsize\nosmallword
4804      \else
4805        \smallexamplefonts \rm
4806      \fi
4807    }
4808    
4809  % This macro is  % We often define two environments, @foo and @smallfoo.
4810  \def\lisp{\begingroup  % Let's do it by one command:
4811    \nonfillstart  \def\makedispenv #1#2{
4812    \let\Elisp = \nonfillfinish    \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}
4813    \tt    \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}
4814    \rawbackslash % have \ input char produce \ char from current font    \expandafter\let\csname E#1\endcsname \afterenvbreak
4815    \gobble    \expandafter\let\csname Esmall#1\endcsname \afterenvbreak
4816  }  }
4817    
4818  % Define the \E... control sequence only if we are inside the  % Define two synonyms:
4819  % environment, so the error checking in \end will work.  \def\maketwodispenvs #1#2#3{
4820      \makedispenv{#1}{#3}
4821      \makedispenv{#2}{#3}
4822    }
4823    
4824    % @lisp: indented, narrowed, typewriter font; @example: same as @lisp.
4825  %  %
4826  % We must call \lisp last in the definition, since it reads the  % @smallexample and @smalllisp: use smaller fonts.
4827  % return following the @example (or whatever) command.  % Originally contributed by Pavel@xerox.
4828  %  %
4829  \def\example{\begingroup \def\Eexample{\nonfillfinish\endgroup}\lisp}  \maketwodispenvs {lisp}{example}{%
4830  \def\smallexample{\begingroup \def\Esmallexample{\nonfillfinish\endgroup}\lisp}    \nonfillstart
4831  \def\smalllisp{\begingroup \def\Esmalllisp{\nonfillfinish\endgroup}\lisp}    \tt
4832      \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
4833      \gobble       % eat return
4834    }
4835    
4836  % @smallexample and @smalllisp.  This is not used unless the @smallbook  % @display/@smalldisplay: same as @lisp except keep current font.
 % command is given.  Originally contributed by Pavel@xerox.  
4837  %  %
4838  \def\smalllispx{\begingroup  \makedispenv {display}{%
4839    \nonfillstart    \nonfillstart
   \let\Esmalllisp = \nonfillfinish  
   \let\Esmallexample = \nonfillfinish  
   %  
   % Smaller fonts for small examples.  
   \indexfonts \tt  
   \rawbackslash % make \ output the \ character from the current font (tt)  
4840    \gobble    \gobble
4841  }  }
4842    
4843  % This is @display; same as @lisp except use roman font.  % @format/@smallformat: same as @display except don't narrow margins.
4844  %  %
4845  \def\display{\begingroup  \makedispenv{format}{%
4846      \let\nonarrowing = t%
4847    \nonfillstart    \nonfillstart
   \let\Edisplay = \nonfillfinish  
4848    \gobble    \gobble
4849  }  }
4850    
4851  % This is @format; same as @display except don't narrow margins.  % @flushleft: same as @format, but doesn't obey \SETdispenvsize.
4852  %  \envdef\flushleft{%
4853  \def\format{\begingroup    \let\nonarrowing = t%
   \let\nonarrowing = t  
4854    \nonfillstart    \nonfillstart
   \let\Eformat = \nonfillfinish  
4855    \gobble    \gobble
4856  }  }
4857    \let\Eflushleft = \afterenvbreak
4858    
4859  % @flushleft (same as @format) and @flushright.  % @flushright.
4860  %  %
4861  \def\flushleft{\begingroup  \envdef\flushright{%
4862    \let\nonarrowing = t    \let\nonarrowing = t%
4863    \nonfillstart    \nonfillstart
4864    \let\Eflushleft = \nonfillfinish    \advance\leftskip by 0pt plus 1fill
4865    \gobble    \gobble
4866  }  }
4867  \def\flushright{\begingroup  \let\Eflushright = \afterenvbreak
4868    \let\nonarrowing = t  
   \nonfillstart  
   \let\Eflushright = \nonfillfinish  
   \advance\leftskip by 0pt plus 1fill  
   \gobble}  
4869    
4870  % @quotation does normal linebreaking (hence we can't use \nonfillstart)  % @quotation does normal linebreaking (hence we can't use \nonfillstart)
4871  % and narrows the margins.  % and narrows the margins.  We keep \parskip nonzero in general, since
4872    % we're doing normal filling.  So, when using \aboveenvbreak and
4873    % \afterenvbreak, temporarily make \parskip 0.
4874  %  %
4875  \def\quotation{%  \envdef\quotation{%
   \begingroup\inENV %This group ends at the end of the @quotation body  
4876    {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip    {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
   \singlespace  
4877    \parindent=0pt    \parindent=0pt
   % We have retained a nonzero parskip for the environment, since we're  
   % doing normal filling. So to avoid extra space below the environment...  
   \def\Equotation{\parskip = 0pt \nonfillfinish}%  
4878    %    %
4879    % @cartouche defines \nonarrowing to inhibit narrowing at next level down.    % @cartouche defines \nonarrowing to inhibit narrowing at next level down.
4880    \ifx\nonarrowing\relax    \ifx\nonarrowing\relax
# Line 3647  width0pt\relax} \fi Line 4883  width0pt\relax} \fi
4883      \exdentamount = \lispnarrowing      \exdentamount = \lispnarrowing
4884      \let\nonarrowing = \relax      \let\nonarrowing = \relax
4885    \fi    \fi
4886      \parsearg\quotationlabel
4887  }  }
4888    
4889  \message{defuns,}  % We have retained a nonzero parskip for the environment, since we're
4890  % Define formatter for defuns  % doing normal filling.
4891  % First, allow user to change definition object font (\df) internally  %
4892  \def\setdeffont #1 {\csname DEF#1\endcsname}  \def\Equotation{%
4893      \par
4894  \newskip\defbodyindent \defbodyindent=.4in    \ifx\quotationauthor\undefined\else
4895  \newskip\defargsindent \defargsindent=50pt      % indent a bit.
4896  \newskip\deftypemargin \deftypemargin=12pt      \leftline{\kern 2\leftskip \sl ---\quotationauthor}%
4897  \newskip\deflastargmargin \deflastargmargin=18pt    \fi
4898      {\parskip=0pt \afterenvbreak}%
4899  \newcount\parencount  }
 % define \functionparens, which makes ( and ) and & do special things.  
 % \functionparens affects the group it is contained in.  
 \def\activeparens{%  
 \catcode`\(=\active \catcode`\)=\active \catcode`\&=\active  
 \catcode`\[=\active \catcode`\]=\active}  
   
 % Make control sequences which act like normal parenthesis chars.  
 \let\lparen = ( \let\rparen = )  
4900    
4901  {\activeparens % Now, smart parens don't turn on until &foo (see \amprm)  % If we're given an argument, typeset it in bold with a colon after.
4902    \def\quotationlabel#1{%
4903      \def\temp{#1}%
4904      \ifx\temp\empty \else
4905        {\bf #1: }%
4906      \fi
4907    }
4908    
 % Be sure that we always have a definition for `(', etc.  For example,  
 % if the fn name has parens in it, \boldbrax will not be in effect yet,  
 % so TeX would otherwise complain about undefined control sequence.  
 \global\let(=\lparen \global\let)=\rparen  
 \global\let[=\lbrack \global\let]=\rbrack  
4909    
4910  \gdef\functionparens{\boldbrax\let&=\amprm\parencount=0 }  % LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>}
4911  \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}  % If we want to allow any <char> as delimiter,
4912  % This is used to turn on special parens  % we need the curly braces so that makeinfo sees the @verb command, eg:
4913  % but make & act ordinary (given that it's active).  % `@verbx...x' would look like the '@verbx' command.  --janneke@gnu.org
4914  \gdef\boldbraxnoamp{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb\let&=\ampnr}  %
4915    % [Knuth]: Donald Ervin Knuth, 1996.  The TeXbook.
4916  % Definitions of (, ) and & used in args for functions.  %
4917  % This is the definition of ( outside of all parentheses.  % [Knuth] p.344; only we need to do the other characters Texinfo sets
4918  \gdef\oprm#1 {{\rm\char`\(}#1 \bf \let(=\opnested  % active too.  Otherwise, they get lost as the first character on a
4919    \global\advance\parencount by 1  % verbatim line.
4920  }  \def\dospecials{%
4921      \do\ \do\\\do\{\do\}\do\$\do\&%
4922      \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~%
4923      \do\<\do\>\do\|\do\@\do+\do\"%
4924    }
4925    %
4926    % [Knuth] p. 380
4927    \def\uncatcodespecials{%
4928      \def\do##1{\catcode`##1=\other}\dospecials}
4929  %  %
4930  % This is the definition of ( when already inside a level of parens.  % [Knuth] pp. 380,381,391
4931  \gdef\opnested{\char`\(\global\advance\parencount by 1 }  % Disable Spanish ligatures ?` and !` of \tt font
4932    \begingroup
4933      \catcode`\`=\active\gdef`{\relax\lq}
4934    \endgroup
4935  %  %
4936  \gdef\clrm{% Print a paren in roman if it is taking us back to depth of 0.  % Setup for the @verb command.
   % also in that case restore the outer-level definition of (.  
   \ifnum \parencount=1 {\rm \char `\)}\sl \let(=\oprm \else \char `\) \fi  
   \global\advance \parencount by -1 }  
 % If we encounter &foo, then turn on ()-hacking afterwards  
 \gdef\amprm#1 {{\rm\&#1}\let(=\oprm \let)=\clrm\ }  
4937  %  %
4938  \gdef\normalparens{\boldbrax\let&=\ampnr}  % Eight spaces for a tab
4939  } % End of definition inside \activeparens  \begingroup
4940  %% These parens (in \boldbrax) actually are a little bolder than the    \catcode`\^^I=\active
4941  %% contained text.  This is especially needed for [ and ]    \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }}
4942  \def\opnr{{\sf\char`\(}\global\advance\parencount by 1 }  \endgroup
4943  \def\clnr{{\sf\char`\)}\global\advance\parencount by -1 }  %
4944  \def\ampnr{\&}  \def\setupverb{%
4945  \def\lbrb{{\bf\char`\[}}    \tt  % easiest (and conventionally used) font for verbatim
4946  \def\rbrb{{\bf\char`\]}}    \def\par{\leavevmode\endgraf}%
4947      \catcode`\`=\active
4948  % First, defname, which formats the header line itself.    \tabeightspaces
4949  % #1 should be the function name.    % Respect line breaks,
4950  % #2 should be the type of definition, such as "Function".    % print special symbols as themselves, and
4951      % make each space count
4952  \def\defname #1#2{%    % must do in this order:
4953  % Get the values of \leftskip and \rightskip as they were    \obeylines \uncatcodespecials \sepspaces
 % outside the @def...  
 \dimen2=\leftskip  
 \advance\dimen2 by -\defbodyindent  
 \dimen3=\rightskip  
 \advance\dimen3 by -\defbodyindent  
 \noindent        %  
 \setbox0=\hbox{\hskip \deflastargmargin{\rm #2}\hskip \deftypemargin}%  
 \dimen0=\hsize \advance \dimen0 by -\wd0 % compute size for first line  
 \dimen1=\hsize \advance \dimen1 by -\defargsindent %size for continuations  
 \parshape 2 0in \dimen0 \defargsindent \dimen1     %  
 % Now output arg 2 ("Function" or some such)  
 % ending at \deftypemargin from the right margin,  
 % but stuck inside a box of width 0 so it does not interfere with linebreaking  
 {% 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}}}%  
 % Make all lines underfull and no complaints:  
 \tolerance=10000 \hbadness=10000  
 \advance\leftskip by -\defbodyindent  
 \exdentamount=\defbodyindent  
 {\df #1}\enskip        % Generate function name  
 }  
   
 % Actually process the body of a definition  
 % #1 should be the terminating control sequence, such as \Edefun.  
 % #2 should be the "another name" control sequence, such as \defunx.  
 % #3 should be the control sequence that actually processes the header,  
 %    such as \defunheader.  
   
 \def\defparsebody #1#2#3{\begingroup\inENV% Environment for definitionbody  
 \medbreak %  
 % Define the end token that this defining construct specifies  
 % so that it will exit this group.  
 \def#1{\endgraf\endgroup\medbreak}%  
 \def#2{\begingroup\obeylines\activeparens\spacesplit#3}%  
 \parindent=0in  
 \advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent  
 \exdentamount=\defbodyindent  
 \begingroup %  
 \catcode 61=\active % 61 is `='  
 \obeylines\activeparens\spacesplit#3}  
   
 \def\defmethparsebody #1#2#3#4 {\begingroup\inENV %  
 \medbreak %  
 % Define the end token that this defining construct specifies  
 % so that it will exit this group.  
 \def#1{\endgraf\endgroup\medbreak}%  
 \def#2##1 {\begingroup\obeylines\activeparens\spacesplit{#3{##1}}}%  
 \parindent=0in  
 \advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent  
 \exdentamount=\defbodyindent  
 \begingroup\obeylines\activeparens\spacesplit{#3{#4}}}  
   
 \def\defopparsebody #1#2#3#4#5 {\begingroup\inENV %  
 \medbreak %  
 % Define the end token that this defining construct specifies  
 % so that it will exit this group.  
 \def#1{\endgraf\endgroup\medbreak}%  
 \def#2##1 ##2 {\def#4{##1}%  
 \begingroup\obeylines\activeparens\spacesplit{#3{##2}}}%  
 \parindent=0in  
 \advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent  
 \exdentamount=\defbodyindent  
 \begingroup\obeylines\activeparens\spacesplit{#3{#5}}}  
   
 % These parsing functions are similar to the preceding ones  
 % except that they do not make parens into active characters.  
 % These are used for "variables" since they have no arguments.  
   
 \def\defvarparsebody #1#2#3{\begingroup\inENV% Environment for definitionbody  
 \medbreak %  
 % Define the end token that this defining construct specifies  
 % so that it will exit this group.  
 \def#1{\endgraf\endgroup\medbreak}%  
 \def#2{\begingroup\obeylines\spacesplit#3}%  
 \parindent=0in  
 \advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent  
 \exdentamount=\defbodyindent  
 \begingroup %  
 \catcode 61=\active %  
 \obeylines\spacesplit#3}  
   
 % This is used for \def{tp,vr}parsebody.  It could probably be used for  
 % some of the others, too, with some judicious conditionals.  
 %  
 \def\parsebodycommon#1#2#3{%  
   \begingroup\inENV %  
   \medbreak %  
   % Define the end token that this defining construct specifies  
   % so that it will exit this group.  
   \def#1{\endgraf\endgroup\medbreak}%  
   \def#2##1 {\begingroup\obeylines\spacesplit{#3{##1}}}%  
   \parindent=0in  
   \advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent  
   \exdentamount=\defbodyindent  
   \begingroup\obeylines  
 }  
   
 \def\defvrparsebody#1#2#3#4 {%  
   \parsebodycommon{#1}{#2}{#3}%  
   \spacesplit{#3{#4}}%  
4954  }  }
4955    
4956  % This loses on `@deftp {Data Type} {struct termios}' -- it thinks the  % Setup for the @verbatim environment
 % type is just `struct', because we lose the braces in `{struct  
 % termios}' when \spacesplit reads its undelimited argument.  Sigh.  
 % \let\deftpparsebody=\defvrparsebody  
4957  %  %
4958  % So, to get around this, we put \empty in with the type name.  That  % Real tab expansion
4959  % way, TeX won't find exactly `{...}' as an undelimited argument, and  \newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount
 % won't strip off the braces.  
4960  %  %
4961  \def\deftpparsebody #1#2#3#4 {%  \def\starttabbox{\setbox0=\hbox\bgroup}
4962    \parsebodycommon{#1}{#2}{#3}%  \begingroup
4963    \spacesplit{\parsetpheaderline{#3{#4}}}\empty    \catcode`\^^I=\active
4964  }    \gdef\tabexpand{%
4965        \catcode`\^^I=\active
4966  % Fine, but then we have to eventually remove the \empty *and* the      \def^^I{\leavevmode\egroup
4967  % braces (if any).  That's what this does.        \dimen0=\wd0 % the width so far, or since the previous tab
4968          \divide\dimen0 by\tabw
4969          \multiply\dimen0 by\tabw % compute previous multiple of \tabw
4970          \advance\dimen0 by\tabw  % advance to next multiple of \tabw
4971          \wd0=\dimen0 \box0 \starttabbox
4972        }%
4973      }
4974    \endgroup
4975    \def\setupverbatim{%
4976      \nonfillstart
4977      \advance\leftskip by -\defbodyindent
4978      % Easiest (and conventionally used) font for verbatim
4979      \tt
4980      \def\par{\leavevmode\egroup\box0\endgraf}%
4981      \catcode`\`=\active
4982      \tabexpand
4983      % Respect line breaks,
4984      % print special symbols as themselves, and
4985      % make each space count
4986      % must do in this order:
4987      \obeylines \uncatcodespecials \sepspaces
4988      \everypar{\starttabbox}%
4989    }
4990    
4991    % Do the @verb magic: verbatim text is quoted by unique
4992    % delimiter characters.  Before first delimiter expect a
4993    % right brace, after last delimiter expect closing brace:
4994  %  %
4995  \def\removeemptybraces\empty#1\relax{#1}  %    \def\doverb'{'<char>#1<char>'}'{#1}
   
 % After \spacesplit has done its work, this is called -- #1 is the final  
 % thing to call, #2 the type name (which starts with \empty), and #3  
 % (which might be empty) the arguments.  
4996  %  %
4997  \def\parsetpheaderline#1#2#3{%  % [Knuth] p. 382; only eat outer {}
4998    #1{\removeemptybraces#2\relax}{#3}%  \begingroup
4999  }%    \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other
5000      \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next]
5001  \def\defopvarparsebody #1#2#3#4#5 {\begingroup\inENV %  \endgroup
5002  \medbreak %  %
5003  % Define the end token that this defining construct specifies  \def\verb{\begingroup\setupverb\doverb}
5004  % so that it will exit this group.  %
5005  \def#1{\endgraf\endgroup\medbreak}%  %
5006  \def#2##1 ##2 {\def#4{##1}%  % Do the @verbatim magic: define the macro \doverbatim so that
5007  \begingroup\obeylines\spacesplit{#3{##2}}}%  % the (first) argument ends when '@end verbatim' is reached, ie:
5008  \parindent=0in  %
5009  \advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent  %     \def\doverbatim#1@end verbatim{#1}
5010  \exdentamount=\defbodyindent  %
5011  \begingroup\obeylines\spacesplit{#3{#5}}}  % For Texinfo it's a lot easier than for LaTeX,
5012    % because texinfo's \verbatim doesn't stop at '\end{verbatim}':
5013    % we need not redefine '\', '{' and '}'.
5014    %
5015    % Inspired by LaTeX's verbatim command set [latex.ltx]
5016    %
5017    \begingroup
5018      \catcode`\ =\active
5019      \obeylines %
5020      % ignore everything up to the first ^^M, that's the newline at the end
5021      % of the @verbatim input line itself.  Otherwise we get an extra blank
5022      % line in the output.
5023      \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}%
5024      % We really want {...\end verbatim} in the body of the macro, but
5025      % without the active space; thus we have to use \xdef and \gobble.
5026    \endgroup
5027    %
5028    \envdef\verbatim{%
5029        \setupverbatim\doverbatim
5030    }
5031    \let\Everbatim = \afterenvbreak
5032    
 % Split up #2 at the first space token.  
 % call #1 with two arguments:  
 %  the first is all of #2 before the space token,  
 %  the second is all of #2 after that space token.  
 % If #2 contains no space token, all of it is passed as the first arg  
 % and the second is passed as empty.  
5033    
5034  {\obeylines  % @verbatiminclude FILE - insert text of file in verbatim environment.
5035  \gdef\spacesplit#1#2^^M{\endgroup\spacesplitfoo{#1}#2 \relax\spacesplitfoo}%  %
5036  \long\gdef\spacesplitfoo#1#2 #3#4\spacesplitfoo{%  \def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude}
5037  \ifx\relax #3%  %
5038  #1{#2}{}\else #1{#2}{#3#4}\fi}}  \def\doverbatiminclude#1{%
5039      {%
5040        \makevalueexpandable
5041        \setupverbatim
5042        \input #1
5043        \afterenvbreak
5044      }%
5045    }
5046    
5047  % So much for the things common to all kinds of definitions.  % @copying ... @end copying.
5048    % Save the text away for @insertcopying later.  Many commands won't be
5049    % allowed in this context, but that's ok.
5050    %
5051    % We save the uninterpreted tokens, rather than creating a box.
5052    % Saving the text in a box would be much easier, but then all the
5053    % typesetting commands (@smallbook, font changes, etc.) have to be done
5054    % beforehand -- and a) we want @copying to be done first in the source
5055    % file; b) letting users define the frontmatter in as flexible order as
5056    % possible is very desirable.
5057    %
5058    \def\copying{\begingroup
5059      % Define a command to swallow text until we reach `@end copying'.
5060      % \ is the escape char in this texinfo.tex file, so it is the
5061      % delimiter for the command; @ will be the escape char when we read
5062      % it, but that doesn't matter.
5063      \long\def\docopying##1\end copying{\gdef\copyingtext{##1}\enddocopying}%
5064      %
5065      % We must preserve ^^M's in the input file; see \insertcopying below.
5066      \catcode`\^^M = \active
5067      \docopying
5068    }
5069    
5070    % What we do to finish off the copying text.
5071    %
5072    \def\enddocopying{\endgroup\ignorespaces}
5073    
5074    % @insertcopying.  Here we must play games with ^^M's.  On the one hand,
5075    % we need them to delimit commands such as `@end quotation', so they
5076    % must be active.  On the other hand, we certainly don't want every
5077    % end-of-line to be a \par, as would happen with the normal active
5078    % definition of ^^M.  On the third hand, two ^^M's in a row should still
5079    % generate a \par.
5080    %
5081    % Our approach is to make ^^M insert a space and a penalty1 normally;
5082    % then it can also check if \lastpenalty=1.  If it does, then manually
5083    % do \par.
5084    %
5085    % This messes up the normal definitions of @c[omment], so we redefine
5086    % it.  Similarly for @ignore.  (These commands are used in the gcc
5087    % manual for man page generation.)
5088    %
5089    % Seems pretty fragile, most line-oriented commands will presumably
5090    % fail, but for the limited use of getting the copying text (which
5091    % should be quite simple) inserted, we can hope it's ok.
5092    %
5093    {\catcode`\^^M=\active %
5094    \gdef\insertcopying{\begingroup %
5095      \parindent = 0pt  % looks wrong on title page
5096      \def^^M{%
5097        \ifnum \lastpenalty=1 %
5098          \par %
5099        \else %
5100          \space \penalty 1 %
5101        \fi %
5102      }%
5103      %
5104      % Fix @c[omment] for catcode 13 ^^M's.
5105      \def\c##1^^M{\ignorespaces}%
5106      \let\comment = \c %
5107      %
5108      % Don't bother jumping through all the hoops that \doignore does, it
5109      % would be very hard since the catcodes are already set.
5110      \long\def\ignore##1\end ignore{\ignorespaces}%
5111      %
5112      \copyingtext %
5113    \endgroup}%
5114    }
5115    
5116  % Define @defun.  \message{defuns,}
5117    % @defun etc.
5118    
5119  % First, define the processing that is wanted for arguments of \defun  \newskip\defbodyindent \defbodyindent=.4in
5120  % Use this to expand the args and terminate the paragraph they make up  \newskip\defargsindent \defargsindent=50pt
5121    \newskip\deflastargmargin \deflastargmargin=18pt
5122    
5123  \def\defunargs #1{\functionparens \sl  % Start the processing of @deffn:
5124  % Expand, preventing hyphenation at `-' chars.  \def\startdefun{%
5125  % Note that groups don't affect changes in \hyphenchar.    \ifnum\lastpenalty<10000
5126  \hyphenchar\tensl=0      \medbreak
5127  #1%    \else
5128  \hyphenchar\tensl=45      % If there are two @def commands in a row, we'll have a \nobreak,
5129  \ifnum\parencount=0 \else \errmessage{Unbalanced parentheses in @def}\fi%      % which is there to keep the function description together with its
5130  \interlinepenalty=10000      % header.  But if there's nothing but headers, we need to allow a
5131  \advance\rightskip by 0pt plus 1fil      % break somewhere.  Check for penalty 10002 (inserted by
5132  \endgraf\penalty 10000\vskip -\parskip\penalty 10000%      % \defargscommonending) instead of 10000, since the sectioning
5133        % commands insert a \penalty10000, and we don't want to allow a break
5134        % between a section heading and a defun.
5135        \ifnum\lastpenalty=10002 \penalty2000 \fi
5136        %
5137        % Similarly, after a section heading, do not allow a break.
5138        % But do insert the glue.
5139        \medskip  % preceded by discardable penalty, so not a breakpoint
5140      \fi
5141      %
5142      \parindent=0in
5143      \advance\leftskip by \defbodyindent
5144      \exdentamount=\defbodyindent
5145  }  }
5146    
5147  \def\deftypefunargs #1{%  \def\dodefunx#1{%
5148  % Expand, preventing hyphenation at `-' chars.    % First, check whether we are in the right environment:
5149  % Note that groups don't affect changes in \hyphenchar.    \checkenv#1%
5150  % Use \boldbraxnoamp, not \functionparens, so that & is not special.    %
5151  \boldbraxnoamp    % As above, allow line break if we have multiple x headers in a row.
5152  \tclose{#1}% avoid \code because of side effects on active chars    % It's not a great place, though.
5153  \interlinepenalty=10000    \ifnum\lastpenalty=10002 \penalty3000 \fi
5154  \advance\rightskip by 0pt plus 1fil    %
5155  \endgraf\penalty 10000\vskip -\parskip\penalty 10000%    % And now, it's time to reuse the body of the original defun:
5156      \expandafter\gobbledefun#1%
5157  }  }
5158    \def\gobbledefun#1\startdefun{}
5159    
5160  % Do complete processing of one @defun or @defunx line already parsed.  % \printdefunline \deffnheader{text}
5161    %
5162  % @deffn Command forward-char nchars  \def\printdefunline#1#2{%
5163      \begingroup
5164        % call \deffnheader:
5165        #1#2 \endheader
5166        % common ending:
5167        \interlinepenalty = 10000
5168        \advance\rightskip by 0pt plus 1fil
5169        \endgraf
5170        \nobreak\vskip -\parskip
5171        \penalty 10002  % signal to \startdefun and \dodefunx
5172        % Some of the @defun-type tags do not enable magic parentheses,
5173        % rendering the following check redundant.  But we don't optimize.
5174        \checkparencounts
5175      \endgroup
5176    }
5177    
5178  \def\deffn{\defmethparsebody\Edeffn\deffnx\deffnheader}  \def\Edefun{\endgraf\medbreak}
5179    
5180  \def\deffnheader #1#2#3{\doind {fn}{\code{#2}}%  % \makedefun{deffn} creates \deffn, \deffnx and \Edeffn;
5181  \begingroup\defname {#2}{#1}\defunargs{#3}\endgroup %  % the only thing remainnig is to define \deffnheader.
5182  \catcode 61=\other % Turn off change made in \defparsebody  %
5183    \def\makedefun#1{%
5184      \expandafter\let\csname E#1\endcsname = \Edefun
5185      \edef\temp{\noexpand\domakedefun
5186        \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}%
5187      \temp
5188  }  }
5189    
5190  % @defun == @deffn Function  % \domakedefun \deffn \deffnx \deffnheader
5191    %
5192    % Define \deffn and \deffnx, without parameters.
5193    % \deffnheader has to be defined explicitly.
5194    %
5195    \def\domakedefun#1#2#3{%
5196      \envdef#1{%
5197        \startdefun
5198        \parseargusing\activeparens{\printdefunline#3}%
5199      }%
5200      \def#2{\dodefunx#1}%
5201      \def#3%
5202    }
5203    
5204  \def\defun{\defparsebody\Edefun\defunx\defunheader}  %%% Untyped functions:
5205    
5206  \def\defunheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index  % @deffn category name args
5207  \begingroup\defname {#1}{Function}%  \makedefun{deffn}{\deffngeneral{}}
 \defunargs {#2}\endgroup %  
 \catcode 61=\other % Turn off change made in \defparsebody  
 }  
5208    
5209  % @deftypefun int foobar (int @var{foo}, float @var{bar})  % @deffn category class name args
5210    \makedefun{defop}#1 {\defopon{#1\ \putwordon}}
5211    
5212  \def\deftypefun{\defparsebody\Edeftypefun\deftypefunx\deftypefunheader}  % \defopon {category on}class name args
5213    \def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
5214    
5215  % #1 is the data type.  #2 is the name and args.  % \deffngeneral {subind}category name args
5216  \def\deftypefunheader #1#2{\deftypefunheaderx{#1}#2 \relax}  %
5217  % #1 is the data type, #2 the name, #3 the args.  \def\deffngeneral#1#2 #3 #4\endheader{%
5218  \def\deftypefunheaderx #1#2 #3\relax{%    % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}.
5219  \doind {fn}{\code{#2}}% Make entry in function index    \dosubind{fn}{\code{#3}}{#1}%
5220  \begingroup\defname {\defheaderxcond#1\relax$$$#2}{Function}%    \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}%
 \deftypefunargs {#3}\endgroup %  
 \catcode 61=\other % Turn off change made in \defparsebody  
5221  }  }
5222    
5223  % @deftypefn {Library Function} int foobar (int @var{foo}, float @var{bar})  %%% Typed functions:
5224    
5225  \def\deftypefn{\defmethparsebody\Edeftypefn\deftypefnx\deftypefnheader}  % @deftypefn category type name args
5226    \makedefun{deftypefn}{\deftypefngeneral{}}
5227    
5228  % \defheaderxcond#1\relax$$$  % @deftypeop category class type name args
5229  % puts #1 in @code, followed by a space, but does nothing if #1 is null.  \makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}}
 \def\defheaderxcond#1#2$$${\ifx#1\relax\else\code{#1#2} \fi}  
5230    
5231  % #1 is the classification.  #2 is the data type.  #3 is the name and args.  % \deftypeopon {category on}class type name args
5232  \def\deftypefnheader #1#2#3{\deftypefnheaderx{#1}{#2}#3 \relax}  \def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
 % #1 is the classification, #2 the data type, #3 the name, #4 the args.  
 \def\deftypefnheaderx #1#2#3 #4\relax{%  
 \doind {fn}{\code{#3}}% Make entry in function index  
 \begingroup  
 \normalparens % notably, turn off `&' magic, which prevents  
 %               at least some C++ text from working  
 \defname {\defheaderxcond#2\relax$$$#3}{#1}%  
 \deftypefunargs {#4}\endgroup %  
 \catcode 61=\other % Turn off change made in \defparsebody  
 }  
5233    
5234  % @defmac == @deffn Macro  % \deftypefngeneral {subind}category type name args
5235    %
5236    \def\deftypefngeneral#1#2 #3 #4 #5\endheader{%
5237      \dosubind{fn}{\code{#4}}{#1}%
5238      \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
5239    }
5240    
5241  \def\defmac{\defparsebody\Edefmac\defmacx\defmacheader}  %%% Typed variables:
5242    
5243  \def\defmacheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index  % @deftypevr category type var args
5244  \begingroup\defname {#1}{Macro}%  \makedefun{deftypevr}{\deftypecvgeneral{}}
 \defunargs {#2}\endgroup %  
 \catcode 61=\other % Turn off change made in \defparsebody  
 }  
5245    
5246  % @defspec == @deffn Special Form  % @deftypecv category class type var args
5247    \makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}}
5248    
5249  \def\defspec{\defparsebody\Edefspec\defspecx\defspecheader}  % \deftypecvof {category of}class type var args
5250    \def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} }
5251    
5252  \def\defspecheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index  % \deftypecvgeneral {subind}category type var args
5253  \begingroup\defname {#1}{Special Form}%  %
5254  \defunargs {#2}\endgroup %  \def\deftypecvgeneral#1#2 #3 #4 #5\endheader{%
5255  \catcode 61=\other % Turn off change made in \defparsebody    \dosubind{vr}{\code{#4}}{#1}%
5256      \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
5257  }  }
5258    
5259  % This definition is run if you use @defunx  %%% Untyped variables:
 % 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}}  
5260    
5261  % @defmethod, and so on  % @defvr category var args
5262    \makedefun{defvr}#1 {\deftypevrheader{#1} {} }
5263    
5264  % @defop {Funny Method} foo-class frobnicate argument  % @defcv category class var args
5265    \makedefun{defcv}#1 {\defcvof{#1\ \putwordof}}
5266    
5267  \def\defop #1 {\def\defoptype{#1}%  % \defcvof {category of}class var args
5268  \defopparsebody\Edefop\defopx\defopheader\defoptype}  \def\defcvof#1#2 {\deftypecvof{#1}#2 {} }
5269    
5270  \def\defopheader #1#2#3{%  %%% Type:
5271  \dosubind {fn}{\code{#2}}{on #1}% Make entry in function index  % @deftp category name args
5272  \begingroup\defname {#2}{\defoptype{} on #1}%  \makedefun{deftp}#1 #2 #3\endheader{%
5273  \defunargs {#3}\endgroup %    \doind{tp}{\code{#2}}%
5274      \defname{#1}{}{#2}\defunargs{#3\unskip}%
5275  }  }
5276    
5277  % @deftypemethod foo-class return-type foo-method args  % Remaining @defun-like shortcuts:
5278  %  \makedefun{defun}{\deffnheader{\putwordDeffunc} }
5279  \def\deftypemethod{%  \makedefun{defmac}{\deffnheader{\putwordDefmac} }
5280    \defmethparsebody\Edeftypemethod\deftypemethodx\deftypemethodheader}  \makedefun{defspec}{\deffnheader{\putwordDefspec} }
5281    \makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} }
5282    \makedefun{defvar}{\defvrheader{\putwordDefvar} }
5283    \makedefun{defopt}{\defvrheader{\putwordDefopt} }
5284    \makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} }
5285    \makedefun{defmethod}{\defopon\putwordMethodon}
5286    \makedefun{deftypemethod}{\deftypeopon\putwordMethodon}
5287    \makedefun{defivar}{\defcvof\putwordInstanceVariableof}
5288    \makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof}
5289    
5290    % \defname, which formats the name of the @def (not the args).
5291    % #1 is the category, such as "Function".
5292    % #2 is the return type, if any.
5293    % #3 is the function name.
5294    %
5295    % We are followed by (but not passed) the arguments, if any.
5296  %  %
5297  % #1 is the class name, #2 the data type, #3 the method name, #4 the args.  \def\defname#1#2#3{%
5298  \def\deftypemethodheader#1#2#3#4{%    % Get the values of \leftskip and \rightskip as they were outside the @def...
5299    \deftypefnheaderx{Method on #1}{#2}#3 #4\relax    \advance\leftskip by -\defbodyindent
5300      %
5301      % How we'll format the type name.  Putting it in brackets helps
5302      % distinguish it from the body text that may end up on the next line
5303      % just below it.
5304      \def\temp{#1}%
5305      \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi}
5306      %
5307      % Figure out line sizes for the paragraph shape.
5308      % The first line needs space for \box0; but if \rightskip is nonzero,
5309      % we need only space for the part of \box0 which exceeds it:
5310      \dimen0=\hsize  \advance\dimen0 by -\wd0  \advance\dimen0 by \rightskip
5311      % The continuations:
5312      \dimen2=\hsize  \advance\dimen2 by -\defargsindent
5313      % (plain.tex says that \dimen1 should be used only as global.)
5314      \parshape 2 0in \dimen0 \defargsindent \dimen2
5315      %
5316      % Put the type name to the right margin.
5317      \noindent
5318      \hbox to 0pt{%
5319        \hfil\box0 \kern-\hsize
5320        % \hsize has to be shortened this way:
5321        \kern\leftskip
5322        % Intentionally do not respect \rightskip, since we need the space.
5323      }%
5324      %
5325      % Allow all lines to be underfull without complaint:
5326      \tolerance=10000 \hbadness=10000
5327      \exdentamount=\defbodyindent
5328      {%
5329        % defun fonts. We use typewriter by default (used to be bold) because:
5330        % . we're printing identifiers, they should be in tt in principle.
5331        % . in languages with many accents, such as Czech or French, it's
5332        %   common to leave accents off identifiers.  The result looks ok in
5333        %   tt, but exceedingly strange in rm.
5334        % . we don't want -- and --- to be treated as ligatures.
5335        % . this still does not fix the ?` and !` ligatures, but so far no
5336        %   one has made identifiers using them :).
5337        \df \tt
5338        \def\temp{#2}% return value type
5339        \ifx\temp\empty\else \tclose{\temp} \fi
5340        #3% output function name
5341      }%
5342      {\rm\enskip}% hskip 0.5 em of \tenrm
5343      %
5344      \boldbrax
5345      % arguments will be output next, if any.
5346  }  }
5347    
5348  % @defmethod == @defop Method  % Print arguments in slanted roman (not ttsl), inconsistently with using
5349    % tt for the name.  This is because literal text is sometimes needed in
5350  \def\defmethod{\defmethparsebody\Edefmethod\defmethodx\defmethodheader}  % the argument list (groff manual), and ttsl and tt are not very
5351    % distinguishable.  Prevent hyphenation at `-' chars.
5352  \def\defmethodheader #1#2#3{%  %
5353  \dosubind {fn}{\code{#2}}{on #1}% entry in function index  \def\defunargs#1{%
5354  \begingroup\defname {#2}{Method on #1}%    % use sl by default (not ttsl),
5355  \defunargs {#3}\endgroup %    % tt for the names.
5356      \df \sl \hyphenchar\font=0
5357      %
5358      % On the other hand, if an argument has two dashes (for instance), we
5359      % want a way to get ttsl.  Let's try @var for that.
5360      \let\var=\ttslanted
5361      #1%
5362      \sl\hyphenchar\font=45
5363  }  }
5364    
5365  % @defcv {Class Option} foo-class foo-flag  % We want ()&[] to print specially on the defun line.
5366    %
5367  \def\defcv #1 {\def\defcvtype{#1}%  \def\activeparens{%
5368  \defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}    \catcode`\(=\active \catcode`\)=\active
5369      \catcode`\[=\active \catcode`\]=\active
5370  \def\defcvarheader #1#2#3{%    \catcode`\&=\active
 \dosubind {vr}{\code{#2}}{of #1}% Make entry in var index  
 \begingroup\defname {#2}{\defcvtype{} of #1}%  
 \defvarargs {#3}\endgroup %  
5371  }  }
5372    
5373  % @defivar == @defcv {Instance Variable}  % Make control sequences which act like normal parenthesis chars.
5374    \let\lparen = ( \let\rparen = )
5375    
5376  \def\defivar{\defvrparsebody\Edefivar\defivarx\defivarheader}  % Be sure that we always have a definition for `(', etc.  For example,
5377    % if the fn name has parens in it, \boldbrax will not be in effect yet,
5378    % so TeX would otherwise complain about undefined control sequence.
5379    {
5380      \activeparens
5381      \global\let(=\lparen \global\let)=\rparen
5382      \global\let[=\lbrack \global\let]=\rbrack
5383      \global\let& = \&
5384    
5385  \def\defivarheader #1#2#3{%    \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
5386  \dosubind {vr}{\code{#2}}{of #1}% Make entry in var index    \gdef\magicamp{\let&=\amprm}
 \begingroup\defname {#2}{Instance Variable of #1}%  
 \defvarargs {#3}\endgroup %  
5387  }  }
5388    
5389  % These definitions are run if you use @defmethodx, etc.,  \newcount\parencount
 % anywhere other than immediately after a @defmethod, etc.  
5390    
5391  \def\defopx #1 {\errmessage{@defopx in invalid context}}  % If we encounter &foo, then turn on ()-hacking afterwards
5392  \def\defmethodx #1 {\errmessage{@defmethodx in invalid context}}  \newif\ifampseen
5393  \def\defcvx #1 {\errmessage{@defcvx in invalid context}}  \def\amprm#1 {\ampseentrue{\bf\&#1 }}
 \def\defivarx #1 {\errmessage{@defivarx in invalid context}}  
5394    
5395  % Now @defvar  \def\parenfont{%
5396      \ifampseen
5397        % At the first level, print parens in roman,
5398        % otherwise use the default font.
5399        \ifnum \parencount=1 \rm \fi
5400      \else
5401        % The \sf parens (in \boldbrax) actually are a little bolder than
5402        % the contained text.  This is especially needed for [ and ] .
5403        \sf
5404      \fi
5405    }
5406    \def\infirstlevel#1{%
5407      \ifampseen
5408        \ifnum\parencount=1
5409          #1%
5410        \fi
5411      \fi
5412    }
5413    \def\bfafterword#1 {#1 \bf}
5414    
5415  % First, define the processing that is wanted for arguments of @defvar.  \def\opnr{%
5416  % This is actually simple: just print them in roman.    \global\advance\parencount by 1
5417  % This must expand the args and terminate the paragraph they make up    {\parenfont(}%
5418  \def\defvarargs #1{\normalparens #1%    \infirstlevel \bfafterword
5419  \interlinepenalty=10000  }
5420  \endgraf\penalty 10000\vskip -\parskip\penalty 10000}  \def\clnr{%
5421      {\parenfont)}%
5422      \infirstlevel \sl
5423      \global\advance\parencount by -1
5424    }
5425    
5426  % @defvr Counter foo-count  \newcount\brackcount
5427    \def\lbrb{%
5428      \global\advance\brackcount by 1
5429      {\bf[}%
5430    }
5431    \def\rbrb{%
5432      {\bf]}%
5433      \global\advance\brackcount by -1
5434    }
5435    
5436  \def\defvr{\defvrparsebody\Edefvr\defvrx\defvrheader}  \def\checkparencounts{%
5437      \ifnum\parencount=0 \else \badparencount \fi
5438      \ifnum\brackcount=0 \else \badbrackcount \fi
5439    }
5440    \def\badparencount{%
5441      \errmessage{Unbalanced parentheses in @def}%
5442      \global\parencount=0
5443    }
5444    \def\badbrackcount{%
5445      \errmessage{Unbalanced square braces in @def}%
5446      \global\brackcount=0
5447    }
5448    
 \def\defvrheader #1#2#3{\doind {vr}{\code{#2}}%  
 \begingroup\defname {#2}{#1}\defvarargs{#3}\endgroup}  
5449    
5450  % @defvar == @defvr Variable  \message{macros,}
5451    % @macro.
5452    
5453  \def\defvar{\defvarparsebody\Edefvar\defvarx\defvarheader}  % To do this right we need a feature of e-TeX, \scantokens,
5454    % which we arrange to emulate with a temporary file in ordinary TeX.
5455    \ifx\eTeXversion\undefined
5456      \newwrite\macscribble
5457      \def\scantokens#1{%
5458        \toks0={#1\endinput}%
5459        \immediate\openout\macscribble=\jobname.tmp
5460        \immediate\write\macscribble{\the\toks0}%
5461        \immediate\closeout\macscribble
5462        \input \jobname.tmp
5463      }
5464    \fi
5465    
5466  \def\defvarheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index  \def\scanmacro#1{%
5467  \begingroup\defname {#1}{Variable}%    \begingroup
5468  \defvarargs {#2}\endgroup %      \newlinechar`\^^M
5469        \let\xeatspaces\eatspaces
5470        % Undo catcode changes of \startcontents and \doprintindex
5471        \catcode`\@=0 \catcode`\\=\other \escapechar=`\@
5472        % ... and \example
5473        \spaceisspace
5474        %
5475        % Append \endinput to make sure that TeX does not see the ending newline.
5476        %
5477        % I've verified that it is necessary both for e-TeX and for ordinary TeX
5478        %                                                   --kasal, 29nov03
5479        \scantokens{#1\endinput}%
5480      \endgroup
5481  }  }
5482    
5483  % @defopt == @defvr {User Option}  \newcount\paramno   % Count of parameters
5484    \newtoks\macname    % Macro name
5485    \newif\ifrecursive  % Is it recursive?
5486    \def\macrolist{}    % List of all defined macros in the form
5487                        % \do\macro1\do\macro2...
5488    
5489    % Utility routines.
5490    % This does \let #1 = #2, except with \csnames.
5491    \def\cslet#1#2{%
5492    \expandafter\expandafter
5493    \expandafter\let
5494    \expandafter\expandafter
5495    \csname#1\endcsname
5496    \csname#2\endcsname}
5497    
5498  \def\defopt{\defvarparsebody\Edefopt\defoptx\defoptheader}  % Trim leading and trailing spaces off a string.
5499    % Concepts from aro-bend problem 15 (see CTAN).
5500  \def\defoptheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index  {\catcode`\@=11
5501  \begingroup\defname {#1}{User Option}%  \gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }}
5502  \defvarargs {#2}\endgroup %  \gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@}
5503    \gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @}
5504    \def\unbrace#1{#1}
5505    \unbrace{\gdef\trim@@@ #1 } #2@{#1}
5506  }  }
5507    
5508  % @deftypevar int foobar  % Trim a single trailing ^^M off a string.
5509    {\catcode`\^^M=\other \catcode`\Q=3%
5510  \def\deftypevar{\defvarparsebody\Edeftypevar\deftypevarx\deftypevarheader}  \gdef\eatcr #1{\eatcra #1Q^^MQ}%
5511    \gdef\eatcra#1^^MQ{\eatcrb#1Q}%
5512  % #1 is the data type.  #2 is the name, perhaps followed by text that  \gdef\eatcrb#1Q#2Q{#1}%
5513  % 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}%  
 \interlinepenalty=10000  
 \endgraf\penalty 10000\vskip -\parskip\penalty 10000  
 \endgroup}  
 \def\dovarind#1 #2\relax{\doind{vr}{\code{#1}}}  
   
 % @deftypevr {Global Flag} int enable  
   
 \def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader}  
5514    
5515  \def\deftypevrheader #1#2#3{\dovarind#3 \relax%  % Macro bodies are absorbed as an argument in a context where
5516  \begingroup\defname {\defheaderxcond#2\relax$$$#3}{#1}  % all characters are catcode 10, 11 or 12, except \ which is active
5517  \interlinepenalty=10000  % (as in normal texinfo). It is necessary to change the definition of \.
 \endgraf\penalty 10000\vskip -\parskip\penalty 10000  
 \endgroup}  
5518    
5519  % This definition is run if you use @defvarx  % It's necessary to have hard CRs when the macro is executed. This is
5520  % anywhere other than immediately after a @defvar or @defvarx.  % done by  making ^^M (\endlinechar) catcode 12 when reading the macro
5521    % body, and then making it the \newlinechar in \scanmacro.
5522    
5523  \def\defvrx #1 {\errmessage{@defvrx in invalid context}}  \def\macrobodyctxt{%
5524  \def\defvarx #1 {\errmessage{@defvarx in invalid context}}    \catcode`\~=\other
5525  \def\defoptx #1 {\errmessage{@defoptx in invalid context}}    \catcode`\^=\other
5526  \def\deftypevarx #1 {\errmessage{@deftypevarx in invalid context}}    \catcode`\_=\other
5527  \def\deftypevrx #1 {\errmessage{@deftypevrx in invalid context}}    \catcode`\|=\other
5528      \catcode`\<=\other
5529      \catcode`\>=\other
5530      \catcode`\+=\other
5531      \catcode`\{=\other
5532      \catcode`\}=\other
5533      \catcode`\@=\other
5534      \catcode`\^^M=\other
5535      \usembodybackslash}
5536    
5537  % Now define @deftp  \def\macroargctxt{%
5538  % Args are printed in bold, a slight difference from @defvar.    \catcode`\~=\other
5539      \catcode`\^=\other
5540      \catcode`\_=\other
5541      \catcode`\|=\other
5542      \catcode`\<=\other
5543      \catcode`\>=\other
5544      \catcode`\+=\other
5545      \catcode`\@=\other
5546      \catcode`\\=\other}
5547    
5548  \def\deftpargs #1{\bf \defvarargs{#1}}  % \mbodybackslash is the definition of \ in @macro bodies.
5549    % It maps \foo\ => \csname macarg.foo\endcsname => #N
5550    % where N is the macro parameter number.
5551    % We define \csname macarg.\endcsname to be \realbackslash, so
5552    % \\ in macro replacement text gets you a backslash.
5553    
5554    {\catcode`@=0 @catcode`@\=@active
5555     @gdef@usembodybackslash{@let\=@mbodybackslash}
5556     @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname}
5557    }
5558    \expandafter\def\csname macarg.\endcsname{\realbackslash}
5559    
5560    \def\macro{\recursivefalse\parsearg\macroxxx}
5561    \def\rmacro{\recursivetrue\parsearg\macroxxx}
5562    
5563    \def\macroxxx#1{%
5564      \getargs{#1}%           now \macname is the macname and \argl the arglist
5565      \ifx\argl\empty       % no arguments
5566         \paramno=0%
5567      \else
5568         \expandafter\parsemargdef \argl;%
5569      \fi
5570      \if1\csname ismacro.\the\macname\endcsname
5571         \message{Warning: redefining \the\macname}%
5572      \else
5573         \expandafter\ifx\csname \the\macname\endcsname \relax
5574         \else \errmessage{Macro name \the\macname\space already defined}\fi
5575         \global\cslet{macsave.\the\macname}{\the\macname}%
5576         \global\expandafter\let\csname ismacro.\the\macname\endcsname=1%
5577         % Add the macroname to \macrolist
5578         \toks0 = \expandafter{\macrolist\do}%
5579         \xdef\macrolist{\the\toks0
5580           \expandafter\noexpand\csname\the\macname\endcsname}%
5581      \fi
5582      \begingroup \macrobodyctxt
5583      \ifrecursive \expandafter\parsermacbody
5584      \else \expandafter\parsemacbody
5585      \fi}
5586    
5587    \parseargdef\unmacro{%
5588      \if1\csname ismacro.#1\endcsname
5589        \global\cslet{#1}{macsave.#1}%
5590        \global\expandafter\let \csname ismacro.#1\endcsname=0%
5591        % Remove the macro name from \macrolist:
5592        \begingroup
5593          \expandafter\let\csname#1\endcsname \relax
5594          \let\do\unmacrodo
5595          \xdef\macrolist{\macrolist}%
5596        \endgroup
5597      \else
5598        \errmessage{Macro #1 not defined}%
5599      \fi
5600    }
5601    
5602  % @deftp Class window height width ...  % Called by \do from \dounmacro on each macro.  The idea is to omit any
5603    % macro definitions that have been changed to \relax.
5604    %
5605    \def\unmacrodo#1{%
5606      \ifx#1\relax
5607        % remove this
5608      \else
5609        \noexpand\do \noexpand #1%
5610      \fi
5611    }
5612    
5613  \def\deftp{\deftpparsebody\Edeftp\deftpx\deftpheader}  % This makes use of the obscure feature that if the last token of a
5614    % <parameter list> is #, then the preceding argument is delimited by
5615    % an opening brace, and that opening brace is not consumed.
5616    \def\getargs#1{\getargsxxx#1{}}
5617    \def\getargsxxx#1#{\getmacname #1 \relax\getmacargs}
5618    \def\getmacname #1 #2\relax{\macname={#1}}
5619    \def\getmacargs#1{\def\argl{#1}}
5620    
5621    % Parse the optional {params} list.  Set up \paramno and \paramlist
5622    % so \defmacro knows what to do.  Define \macarg.blah for each blah
5623    % in the params list, to be ##N where N is the position in that list.
5624    % That gets used by \mbodybackslash (above).
5625    
5626    % We need to get `macro parameter char #' into several definitions.
5627    % The technique used is stolen from LaTeX:  let \hash be something
5628    % unexpandable, insert that wherever you need a #, and then redefine
5629    % it to # just before using the token list produced.
5630    %
5631    % The same technique is used to protect \eatspaces till just before
5632    % the macro is used.
5633    
5634    \def\parsemargdef#1;{\paramno=0\def\paramlist{}%
5635            \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,}
5636    \def\parsemargdefxxx#1,{%
5637      \if#1;\let\next=\relax
5638      \else \let\next=\parsemargdefxxx
5639        \advance\paramno by 1%
5640        \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname
5641            {\xeatspaces{\hash\the\paramno}}%
5642        \edef\paramlist{\paramlist\hash\the\paramno,}%
5643      \fi\next}
5644    
5645    % These two commands read recursive and nonrecursive macro bodies.
5646    % (They're different since rec and nonrec macros end differently.)
5647    
5648    \long\def\parsemacbody#1@end macro%
5649    {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
5650    \long\def\parsermacbody#1@end rmacro%
5651    {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
5652    
5653    % This defines the macro itself. There are six cases: recursive and
5654    % nonrecursive macros of zero, one, and many arguments.
5655    % Much magic with \expandafter here.
5656    % \xdef is used so that macro definitions will survive the file
5657    % they're defined in; @include reads the file inside a group.
5658    \def\defmacro{%
5659      \let\hash=##% convert placeholders to macro parameter chars
5660      \ifrecursive
5661        \ifcase\paramno
5662        % 0
5663          \expandafter\xdef\csname\the\macname\endcsname{%
5664            \noexpand\scanmacro{\temp}}%
5665        \or % 1
5666          \expandafter\xdef\csname\the\macname\endcsname{%
5667             \bgroup\noexpand\macroargctxt
5668             \noexpand\braceorline
5669             \expandafter\noexpand\csname\the\macname xxx\endcsname}%
5670          \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
5671             \egroup\noexpand\scanmacro{\temp}}%
5672        \else % many
5673          \expandafter\xdef\csname\the\macname\endcsname{%
5674             \bgroup\noexpand\macroargctxt
5675             \noexpand\csname\the\macname xx\endcsname}%
5676          \expandafter\xdef\csname\the\macname xx\endcsname##1{%
5677              \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
5678          \expandafter\expandafter
5679          \expandafter\xdef
5680          \expandafter\expandafter
5681            \csname\the\macname xxx\endcsname
5682              \paramlist{\egroup\noexpand\scanmacro{\temp}}%
5683        \fi
5684      \else
5685        \ifcase\paramno
5686        % 0
5687          \expandafter\xdef\csname\the\macname\endcsname{%
5688            \noexpand\norecurse{\the\macname}%
5689            \noexpand\scanmacro{\temp}\egroup}%
5690        \or % 1
5691          \expandafter\xdef\csname\the\macname\endcsname{%
5692             \bgroup\noexpand\macroargctxt
5693             \noexpand\braceorline
5694             \expandafter\noexpand\csname\the\macname xxx\endcsname}%
5695          \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
5696            \egroup
5697            \noexpand\norecurse{\the\macname}%
5698            \noexpand\scanmacro{\temp}\egroup}%
5699        \else % many
5700          \expandafter\xdef\csname\the\macname\endcsname{%
5701             \bgroup\noexpand\macroargctxt
5702             \expandafter\noexpand\csname\the\macname xx\endcsname}%
5703          \expandafter\xdef\csname\the\macname xx\endcsname##1{%
5704              \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
5705          \expandafter\expandafter
5706          \expandafter\xdef
5707          \expandafter\expandafter
5708          \csname\the\macname xxx\endcsname
5709          \paramlist{%
5710              \egroup
5711              \noexpand\norecurse{\the\macname}%
5712              \noexpand\scanmacro{\temp}\egroup}%
5713        \fi
5714      \fi}
5715    
5716  \def\deftpheader #1#2#3{\doind {tp}{\code{#2}}%  \def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
 \begingroup\defname {#2}{#1}\deftpargs{#3}\endgroup}  
5717    
5718  % This definition is run if you use @deftpx, etc  % \braceorline decides whether the next nonwhitespace character is a
5719  % anywhere other than immediately after a @deftp, etc.  % {.  If so it reads up to the closing }, if not, it reads the whole
5720    % line.  Whatever was read is then fed to the next control sequence
5721    % as an argument (by \parsebrace or \parsearg)
5722    \def\braceorline#1{\let\next=#1\futurelet\nchar\braceorlinexxx}
5723    \def\braceorlinexxx{%
5724      \ifx\nchar\bgroup\else
5725        \expandafter\parsearg
5726      \fi \next}
5727    
5728    % We mant to disable all macros during \shipout so that they are not
5729    % expanded by \write.
5730    \def\turnoffmacros{\begingroup \def\do##1{\let\noexpand##1=\relax}%
5731      \edef\next{\macrolist}\expandafter\endgroup\next}
5732    
5733    
5734    % @alias.
5735    % We need some trickery to remove the optional spaces around the equal
5736    % sign.  Just make them active and then expand them all to nothing.
5737    \def\alias{\parseargusing\obeyspaces\aliasxxx}
5738    \def\aliasxxx #1{\aliasyyy#1\relax}
5739    \def\aliasyyy #1=#2\relax{%
5740      {%
5741        \expandafter\let\obeyedspace=\empty
5742        \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}%
5743      }%
5744      \next
5745    }
5746    
 \def\deftpx #1 {\errmessage{@deftpx in invalid context}}  
5747    
5748    \message{cross references,}
5749    
5750  \message{cross reference,}  \newwrite\auxfile
 % Define cross-reference macros  
 \newwrite \auxfile  
5751    
5752  \newif\ifhavexrefs  % True if xref values are known.  \newif\ifhavexrefs    % True if xref values are known.
5753  \newif\ifwarnedxrefs  % True if we warned once that they aren't known.  \newif\ifwarnedxrefs  % True if we warned once that they aren't known.
5754    
5755  % @inforef is simple.  % @inforef is relatively simple.
5756  \def\inforef #1{\inforefzzz #1,,,,**}  \def\inforef #1{\inforefzzz #1,,,,**}
5757  \def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},  \def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
5758    node \samp{\ignorespaces#1{}}}    node \samp{\ignorespaces#1{}}}
5759    
5760  % \setref{foo} defines a cross-reference point named foo.  % @node's only job in TeX is to define \lastnode, which is used in
5761    % cross-references.  The @node line might or might not have commas, and
5762    % might or might not have spaces before the first comma, like:
5763    % @node foo , bar , ...
5764    % We don't want such trailing spaces in the node name.
5765    %
5766    \parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse}
5767    %
5768    % also remove a trailing comma, in case of something like this:
5769    % @node Help-Cross,  ,  , Cross-refs
5770    \def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse}
5771    \def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}}
5772    
5773    \let\nwnode=\node
5774    \let\lastnode=\empty
5775    
5776    % Write a cross-reference definition for the current node.  #1 is the
5777    % type (Ynumbered, Yappendix, Ynothing).
5778    %
5779    \def\donoderef#1{%
5780      \ifx\lastnode\empty\else
5781        \setref{\lastnode}{#1}%
5782        \global\let\lastnode=\empty
5783      \fi
5784    }
5785    
5786    % @anchor{NAME} -- define xref target at arbitrary point.
5787    %
5788    \newcount\savesfregister
5789    %
5790    \def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
5791    \def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
5792    \def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}
5793    
5794    % \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an
5795    % anchor), which consists of three parts:
5796    % 1) NAME-title - the current sectioning name taken from \thissection,
5797    %                 or the anchor name.
5798    % 2) NAME-snt   - section number and type, passed as the SNT arg, or
5799    %                 empty for anchors.
5800    % 3) NAME-pg    - the page number.
5801    %
5802    % This is called from \donoderef, \anchor, and \dofloat.  In the case of
5803    % floats, there is an additional part, which is not written here:
5804    % 4) NAME-lof   - the text as it should appear in a @listoffloats.
5805    %
5806    \def\setref#1#2{%
5807      \pdfmkdest{#1}%
5808      \iflinks
5809        {%
5810          \atdummies  % preserve commands, but don't expand them
5811          \turnoffactive
5812          \otherbackslash
5813          \edef\writexrdef##1##2{%
5814            \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef
5815              ##1}{##2}}% these are parameters of \writexrdef
5816          }%
5817          \toks0 = \expandafter{\thissection}%
5818          \immediate \writexrdef{title}{\the\toks0 }%
5819          \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc.
5820          \writexrdef{pg}{\folio}% will be written later, during \shipout
5821        }%
5822      \fi
5823    }
5824    
5825  \def\setref#1{%  % @xref, @pxref, and @ref generate cross-references.  For \xrefX, #1 is
5826  \dosetq{#1-title}{Ytitle}%  % the node name, #2 the name of the Info cross-reference, #3 the printed
5827  \dosetq{#1-pg}{Ypagenumber}%  % node name, #4 the name of the Info file, #5 the name of the printed
5828  \dosetq{#1-snt}{Ysectionnumberandtype}}  % manual.  All but the node name can be omitted.
   
 \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.  
5829  %  %
5830  \def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]}  \def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]}
5831  \def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]}  \def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]}
5832  \def\ref#1{\xrefX[#1,,,,,,,]}  \def\ref#1{\xrefX[#1,,,,,,,]}
5833  \def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup  \def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
5834      \unsepspaces
5835    \def\printedmanual{\ignorespaces #5}%    \def\printedmanual{\ignorespaces #5}%
5836    \def\printednodename{\ignorespaces #3}%    \def\printedrefname{\ignorespaces #3}%
5837    \setbox1=\hbox{\printedmanual}%    \setbox1=\hbox{\printedmanual\unskip}%
5838    \setbox0=\hbox{\printednodename}%    \setbox0=\hbox{\printedrefname\unskip}%
5839    \ifdim \wd0 = 0pt    \ifdim \wd0 = 0pt
5840      % No printed node name was explicitly given.      % No printed node name was explicitly given.
5841      \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax      \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax
5842        % Use the node name inside the square brackets.        % Use the node name inside the square brackets.
5843        \def\printednodename{\ignorespaces #1}%        \def\printedrefname{\ignorespaces #1}%
5844      \else      \else
5845        % Use the actual chapter/section title appear inside        % Use the actual chapter/section title appear inside
5846        % the square brackets.  Use the real section title if we have it.        % the square brackets.  Use the real section title if we have it.
5847        \ifdim \wd1>0pt%        \ifdim \wd1 > 0pt
5848          % It is in another manual, so we don't have it.          % It is in another manual, so we don't have it.
5849          \def\printednodename{\ignorespaces #1}%          \def\printedrefname{\ignorespaces #1}%
5850        \else        \else
5851          \ifhavexrefs          \ifhavexrefs
5852            % We know the real title if we have the xref values.            % We know the real title if we have the xref values.
5853            \def\printednodename{\refx{#1-title}{}}%            \def\printedrefname{\refx{#1-title}{}}%
5854          \else          \else
5855            % Otherwise just copy the Info node name.            % Otherwise just copy the Info node name.
5856            \def\printednodename{\ignorespaces #1}%            \def\printedrefname{\ignorespaces #1}%
5857          \fi%          \fi%
5858        \fi        \fi
5859      \fi      \fi
5860    \fi    \fi
5861    %    %
5862    % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not    % Make link in pdf output.
5863    % insert empty discretionaries after hyphens, which means that it will    \ifpdf
5864    % not find a line break at a hyphen in a node names.  Since some manuals      \leavevmode
5865    % are best written with fairly long node names, containing hyphens, this      \getfilename{#4}%
5866    % is a loss.  Therefore, we give the text of the node name again, so it      {\turnoffactive \otherbackslash
5867    % is as if TeX is seeing it for the first time.       \ifnum\filenamelength>0
5868    \ifdim \wd1 > 0pt         \startlink attr{/Border [0 0 0]}%
5869      \putwordsection{} ``\printednodename'' in \cite{\printedmanual}%           goto file{\the\filename.pdf} name{#1}%
5870    \else       \else
5871      % _ (for example) has to be the character _ for the purposes of the         \startlink attr{/Border [0 0 0]}%
5872      % control sequence corresponding to the node, but it has to expand           goto name{\pdfmkpgn{#1}}%
5873      % into the usual \leavevmode...\vrule stuff for purposes of       \fi
5874      % printing. So we \turnoffactive for the \refx-snt, back on for the      }%
5875      % printing, back off for the \refx-pg.      \linkcolor
     {\turnoffactive \refx{#1-snt}{}}%  
     \space [\printednodename],\space  
     \turnoffactive \putwordpage\tie\refx{#1-pg}{}%  
5876    \fi    \fi
5877      %
5878      % Float references are printed completely differently: "Figure 1.2"
5879      % instead of "[somenode], p.3".  We distinguish them by the
5880      % LABEL-title being set to a magic string.
5881      {%
5882        % Have to otherify everything special to allow the \csname to
5883        % include an _ in the xref name, etc.
5884        \indexnofonts
5885        \turnoffactive
5886        \otherbackslash
5887        \expandafter\global\expandafter\let\expandafter\Xthisreftitle
5888          \csname XR#1-title\endcsname
5889      }%
5890      \iffloat\Xthisreftitle
5891        % If the user specified the print name (third arg) to the ref,
5892        % print it instead of our usual "Figure 1.2".
5893        \ifdim\wd0 = 0pt
5894          \refx{#1-snt}%
5895        \else
5896          \printedrefname
5897        \fi
5898        %
5899        % if the user also gave the printed manual name (fifth arg), append
5900        % "in MANUALNAME".
5901        \ifdim \wd1 > 0pt
5902          \space \putwordin{} \cite{\printedmanual}%
5903        \fi
5904      \else
5905        % node/anchor (non-float) references.
5906        %
5907        % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not
5908        % insert empty discretionaries after hyphens, which means that it will
5909        % not find a line break at a hyphen in a node names.  Since some manuals
5910        % are best written with fairly long node names, containing hyphens, this
5911        % is a loss.  Therefore, we give the text of the node name again, so it
5912        % is as if TeX is seeing it for the first time.
5913        \ifdim \wd1 > 0pt
5914          \putwordsection{} ``\printedrefname'' \putwordin{} \cite{\printedmanual}%
5915        \else
5916          % _ (for example) has to be the character _ for the purposes of the
5917          % control sequence corresponding to the node, but it has to expand
5918          % into the usual \leavevmode...\vrule stuff for purposes of
5919          % printing. So we \turnoffactive for the \refx-snt, back on for the
5920          % printing, back off for the \refx-pg.
5921          {\turnoffactive \otherbackslash
5922           % Only output a following space if the -snt ref is nonempty; for
5923           % @unnumbered and @anchor, it won't be.
5924           \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
5925           \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
5926          }%
5927          % output the `[mynode]' via a macro so it can be overridden.
5928          \xrefprintnodename\printedrefname
5929          %
5930          % But we always want a comma and a space:
5931          ,\space
5932          %
5933          % output the `page 3'.
5934          \turnoffactive \otherbackslash \putwordpage\tie\refx{#1-pg}{}%
5935        \fi
5936      \fi
5937      \endlink
5938  \endgroup}  \endgroup}
5939    
5940  % \dosetq is the interface for calls from other macros  % This macro is called from \xrefX for the `[nodename]' part of xref
5941    % output.  It's a separate macro only so it can be changed more easily,
5942  % Use \turnoffactive so that punctuation chars such as underscore  % since square brackets don't work well in some documents.  Particularly
5943  % work in node names.  % one that Bob is working on :).
5944  \def\dosetq #1#2{{\let\folio=0 \turnoffactive  %
5945  \edef\next{\write\auxfile{\internalsetq {#1}{#2}}}%  \def\xrefprintnodename#1{[#1]}
 \next}}  
   
 % \internalsetq {foo}{page} expands into  
 % CHARACTERS 'xrdef {foo}{...expansion of \Ypage...}  
 % When the aux file is read, ' is the escape character  
   
 \def\internalsetq #1#2{'xrdef {#1}{\csname #2\endcsname}}  
   
 % Things to be expanded by \internalsetq  
   
 \def\Ypagenumber{\folio}  
   
 \def\Ytitle{\thissection}  
   
 \def\Ynothing{}  
   
 \def\Ysectionnumberandtype{%  
 \ifnum\secno=0 \putwordChapter\xreftie\the\chapno %  
 \else \ifnum \subsecno=0 \putwordSection\xreftie\the\chapno.\the\secno %  
 \else \ifnum \subsubsecno=0 %  
 \putwordSection\xreftie\the\chapno.\the\secno.\the\subsecno %  
 \else %  
 \putwordSection\xreftie\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno %  
 \fi \fi \fi }  
   
 \def\Yappendixletterandtype{%  
 \ifnum\secno=0 \putwordAppendix\xreftie'char\the\appendixno{}%  
 \else \ifnum \subsecno=0 \putwordSection\xreftie'char\the\appendixno.\the\secno %  
 \else \ifnum \subsubsecno=0 %  
 \putwordSection\xreftie'char\the\appendixno.\the\secno.\the\subsecno %  
 \else %  
 \putwordSection\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %  
 \fi \fi \fi }  
   
 \gdef\xreftie{'tie}  
5946    
5947  % Use TeX 3.0's \inputlineno to get the line number, for better error  % Things referred to by \setref.
 % messages, but if we're using an old version of TeX, don't do anything.  
5948  %  %
5949  \ifx\inputlineno\thisisundefined  \def\Ynothing{}
5950    \let\linenumber = \empty % Non-3.0.  \def\Yomitfromtoc{}
5951  \else  \def\Ynumbered{%
5952    \def\linenumber{\the\inputlineno:\space}    \ifnum\secno=0
5953  \fi      \putwordChapter@tie \the\chapno
5954      \else \ifnum\subsecno=0
5955        \putwordSection@tie \the\chapno.\the\secno
5956      \else \ifnum\subsubsecno=0
5957        \putwordSection@tie \the\chapno.\the\secno.\the\subsecno
5958      \else
5959        \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno
5960      \fi\fi\fi
5961    }
5962    \def\Yappendix{%
5963      \ifnum\secno=0
5964         \putwordAppendix@tie @char\the\appendixno{}%
5965      \else \ifnum\subsecno=0
5966         \putwordSection@tie @char\the\appendixno.\the\secno
5967      \else \ifnum\subsubsecno=0
5968        \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno
5969      \else
5970        \putwordSection@tie
5971          @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno
5972      \fi\fi\fi
5973    }
5974    
5975  % Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME.  % Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME.
5976  % If its value is nonempty, SUFFIX is output afterward.  % If its value is nonempty, SUFFIX is output afterward.
5977    %
5978  \def\refx#1#2{%  \def\refx#1#2{%
5979    \expandafter\ifx\csname X#1\endcsname\relax    {%
5980        \indexnofonts
5981        \otherbackslash
5982        \expandafter\global\expandafter\let\expandafter\thisrefX
5983          \csname XR#1\endcsname
5984      }%
5985      \ifx\thisrefX\relax
5986      % If not defined, say something at least.      % If not defined, say something at least.
5987      $\langle$un\-de\-fined$\rangle$%      \angleleft un\-de\-fined\angleright
5988      \ifhavexrefs      \iflinks
5989        \message{\linenumber Undefined cross reference `#1'.}%        \ifhavexrefs
5990      \else          \message{\linenumber Undefined cross reference `#1'.}%
5991        \ifwarnedxrefs\else        \else
5992          \global\warnedxrefstrue          \ifwarnedxrefs\else
5993          \message{Cross reference values unknown; you must run TeX again.}%            \global\warnedxrefstrue
5994              \message{Cross reference values unknown; you must run TeX again.}%
5995            \fi
5996        \fi        \fi
5997      \fi      \fi
5998    \else    \else
5999      % It's defined, so just use it.      % It's defined, so just use it.
6000      \csname X#1\endcsname      \thisrefX
6001    \fi    \fi
6002    #2% Output the suffix in any case.    #2% Output the suffix in any case.
6003  }  }
6004    
6005  % This is the macro invoked by entries in the aux file.  % This is the macro invoked by entries in the aux file.  Usually it's
6006  \def\xrdef #1#2{{%  % just a \def (we prepend XR to the control sequence name to avoid
6007    \catcode`\'=\other  % collisions).  But if this is a float type, we have more work to do.
6008    \expandafter\gdef\csname X#1\endcsname{#2}%  %
6009  }}  \def\xrdef#1#2{%
6010      \expandafter\gdef\csname XR#1\endcsname{#2}% remember this xref value.
6011      %
6012      % Was that xref control sequence that we just defined for a float?
6013      \expandafter\iffloat\csname XR#1\endcsname
6014        % it was a float, and we have the (safe) float type in \iffloattype.
6015        \expandafter\let\expandafter\floatlist
6016          \csname floatlist\iffloattype\endcsname
6017        %
6018        % Is this the first time we've seen this float type?
6019        \expandafter\ifx\floatlist\relax
6020          \toks0 = {\do}% yes, so just \do
6021        \else
6022          % had it before, so preserve previous elements in list.
6023          \toks0 = \expandafter{\floatlist\do}%
6024        \fi
6025        %
6026        % Remember this xref in the control sequence \floatlistFLOATTYPE,
6027        % for later use in \listoffloats.
6028        \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0{#1}}%
6029      \fi
6030    }
6031    
6032  % Read the last existing aux file, if any.  No error if none exists.  % Read the last existing aux file, if any.  No error if none exists.
6033    %
6034    \def\tryauxfile{%
6035      \openin 1 \jobname.aux
6036      \ifeof 1 \else
6037        \readauxfile
6038        \global\havexrefstrue
6039      \fi
6040      \closein 1
6041    }
6042    
6043  \def\readauxfile{\begingroup  \def\readauxfile{\begingroup
6044    \catcode`\^^@=\other    \catcode`\^^@=\other
6045    \catcode`\&=\other    \catcode`\^^A=\other
6046    \catcode`\\
=\other
   \catcode`\^^B=\other
6047    \catcode`\^^C=\other    \catcode`\^^C=\other
6048    \catcode`\^^D=\other    \catcode`\^^D=\other
6049    \catcode`\^^E=\other    \catcode`\^^E=\other
6050    \catcode`\^^F=\other    \catcode`\^^F=\other
6051    \catcode`\^^G=\other    \catcode`\^^G=\other
6052    \catcode`\^^H=\other    \catcode`\^^H=\other
6053    \catcode`\ =\other    \catcode`\^^K=\other
6054    \catcode`\^^L=\other    \catcode`\^^L=\other
6055    \catcode`\=\other    \catcode`\^^N=\other
6056    \catcode`\=\other    \catcode`\^^P=\other
6057    \catcode`\=\other    \catcode`\^^Q=\other
6058    \catcode`\=\other    \catcode`\^^R=\other
6059    \catcode`\=\other    \catcode`\^^S=\other
6060    \catcode`\=\other    \catcode`\^^T=\other
6061    \catcode`\=\other    \catcode`\^^U=\other
6062    \catcode`\=\other    \catcode`\^^V=\other
6063    \catcode`\=\other    \catcode`\^^W=\other
6064    \catcode`\=\other    \catcode`\^^X=\other
6065    \catcode`\=\other    \catcode`\^^Z=\other
   \catcode`\=\other  
   \catcode26=\other  
6066    \catcode`\^^[=\other    \catcode`\^^[=\other
6067    \catcode`\^^\=\other    \catcode`\^^\=\other
6068    \catcode`\^^]=\other    \catcode`\^^]=\other
6069    \catcode`\^^^=\other    \catcode`\^^^=\other
6070    \catcode`\^^_=\other    \catcode`\^^_=\other
6071    \catcode`\@=\other    % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc.
   \catcode`\^=\other  
   % It was suggested to define this as 7, which would allow ^^e4 etc.  
6072    % in xref tags, i.e., node names.  But since ^^e4 notation isn't    % in xref tags, i.e., node names.  But since ^^e4 notation isn't
6073    % supported in the main text, it doesn't seem desirable.  Furthermore,    % supported in the main text, it doesn't seem desirable.  Furthermore,
6074    % that is not enough: for node names that actually contain a ^    % that is not enough: for node names that actually contain a ^
# Line 4346  width0pt\relax} \fi Line 6081  width0pt\relax} \fi
6081    % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter    % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter
6082    % and then to call \auxhat in \setq.    % and then to call \auxhat in \setq.
6083    %    %
6084      \catcode`\^=\other
6085      %
6086      % Special characters.  Should be turned off anyway, but...
6087    \catcode`\~=\other    \catcode`\~=\other
6088    \catcode`\[=\other    \catcode`\[=\other
6089    \catcode`\]=\other    \catcode`\]=\other
# Line 4357  width0pt\relax} \fi Line 6095  width0pt\relax} \fi
6095    \catcode`\$=\other    \catcode`\$=\other
6096    \catcode`\#=\other    \catcode`\#=\other
6097    \catcode`\&=\other    \catcode`\&=\other
6098    % `\+ does not work, so use 43.    \catcode`\%=\other
6099    \catcode43=\other    \catcode`+=\other % avoid \+ for paranoia even though we've turned it off
6100    % Make the characters 128-255 be printing characters    %
6101      % This is to support \ in node names and titles, since the \
6102      % characters end up in a \csname.  It's easier than
6103      % leaving it active and making its active definition an actual \
6104      % character.  What I don't understand is why it works in the *value*
6105      % of the xrdef.  Seems like it should be a catcode12 \, and that
6106      % should not typeset properly.  But it works, so I'm moving on for
6107      % now.  --karl, 15jan04.
6108      \catcode`\\=\other
6109      %
6110      % Make the characters 128-255 be printing characters.
6111    {%    {%
6112      \count 1=128      \count 1=128
6113      \def\loop{%      \def\loop{%
# Line 4368  width0pt\relax} \fi Line 6116  width0pt\relax} \fi
6116        \ifnum \count 1<256 \loop \fi        \ifnum \count 1<256 \loop \fi
6117      }%      }%
6118    }%    }%
6119    % The aux file uses ' as the escape (for now).    %
6120    % Turn off \ as an escape so we do not lose on    % @ is our escape character in .aux files, and we need braces.
   % entries which were dumped with control sequences in their names.  
   % For example, 'xrdef {$\leq $-fun}{page ...} made by @defun ^^  
   % Reference to such entries still does not work the way one would wish,  
   % but at least they do not bomb out when the aux file is read in.  
6121    \catcode`\{=1    \catcode`\{=1
6122    \catcode`\}=2    \catcode`\}=2
6123    \catcode`\%=\other    \catcode`\@=0
   \catcode`\'=0  
   \catcode`\\=\other  
6124    %    %
6125    \openin 1 \jobname.aux    \input \jobname.aux
   \ifeof 1 \else  
     \closein 1  
     \input \jobname.aux  
     \global\havexrefstrue  
     \global\warnedobstrue  
   \fi  
   % Open the new aux file.  TeX will close it automatically at exit.  
   \openout\auxfile=\jobname.aux  
6126  \endgroup}  \endgroup}
6127    
6128    
6129  % Footnotes.  \message{insertions,}
6130    % including footnotes.
6131    
6132  \newcount \footnoteno  \newcount \footnoteno
6133    
# Line 4403  width0pt\relax} \fi Line 6138  width0pt\relax} \fi
6138  % space to prevent strange expansion errors.)  % space to prevent strange expansion errors.)
6139  \def\supereject{\par\penalty -20000\footnoteno =0 }  \def\supereject{\par\penalty -20000\footnoteno =0 }
6140    
6141  % @footnotestyle is meaningful for info output only..  % @footnotestyle is meaningful for info output only.
6142  \let\footnotestyle=\comment  \let\footnotestyle=\comment
6143    
 \let\ptexfootnote=\footnote  
   
6144  {\catcode `\@=11  {\catcode `\@=11
6145  %  %
6146  % Auto-number footnotes.  Otherwise like plain.  % Auto-number footnotes.  Otherwise like plain.
6147  \gdef\footnote{%  \gdef\footnote{%
6148      \let\indent=\ptexindent
6149      \let\noindent=\ptexnoindent
6150    \global\advance\footnoteno by \@ne    \global\advance\footnoteno by \@ne
6151    \edef\thisfootno{$^{\the\footnoteno}$}%    \edef\thisfootno{$^{\the\footnoteno}$}%
6152    %    %
6153    % In case the footnote comes at the end of a sentence, preserve the    % In case the footnote comes at the end of a sentence, preserve the
6154    % extra spacing after we do the footnote number.    % extra spacing after we do the footnote number.
6155    \let\@sf\empty    \let\@sf\empty
6156    \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi    \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi
6157    %    %
6158    % Remove inadvertent blank space before typesetting the footnote number.    % Remove inadvertent blank space before typesetting the footnote number.
6159    \unskip    \unskip
6160    \thisfootno\@sf    \thisfootno\@sf
6161    \footnotezzz    \dofootnote
6162  }%  }%
6163    
6164  % Don't bother with the trickery in plain.tex to not require the  % Don't bother with the trickery in plain.tex to not require the
6165  % footnote text as a parameter.  Our footnotes don't need to be so general.  % footnote text as a parameter.  Our footnotes don't need to be so general.
6166  %  %
6167  % Oh yes, they do; otherwise, @ifset and anything else that uses  % Oh yes, they do; otherwise, @ifset (and anything else that uses
6168  % \parseargline fail inside footnotes because the tokens are fixed when  % \parseargline) fails inside footnotes because the tokens are fixed when
6169  % the footnote is read.  --karl, 16nov96.  % the footnote is read.  --karl, 16nov96.
6170  %  %
6171  \long\gdef\footnotezzz{\insert\footins\bgroup  \gdef\dofootnote{%
6172      \insert\footins\bgroup
6173    % We want to typeset this text as a normal paragraph, even if the    % We want to typeset this text as a normal paragraph, even if the
6174    % footnote reference occurs in (for example) a display environment.    % footnote reference occurs in (for example) a display environment.
6175    % So reset some parameters.    % So reset some parameters.
6176      \hsize=\pagewidth
6177    \interlinepenalty\interfootnotelinepenalty    \interlinepenalty\interfootnotelinepenalty
6178    \splittopskip\ht\strutbox % top baseline for broken footnotes    \splittopskip\ht\strutbox % top baseline for broken footnotes
6179    \splitmaxdepth\dp\strutbox    \splitmaxdepth\dp\strutbox
# Line 4447  width0pt\relax} \fi Line 6184  width0pt\relax} \fi
6184    \xspaceskip\z@skip    \xspaceskip\z@skip
6185    \parindent\defaultparindent    \parindent\defaultparindent
6186    %    %
6187    % Hang the footnote text off the number.    \smallfonts \rm
6188    \hang    %
6189      % Because we use hanging indentation in footnotes, a @noindent appears
6190      % to exdent this text, so make it be a no-op.  makeinfo does not use
6191      % hanging indentation so @noindent can still be needed within footnote
6192      % text after an @example or the like (not that this is good style).
6193      \let\noindent = \relax
6194      %
6195      % Hang the footnote text off the number.  Use \everypar in case the
6196      % footnote extends for more than one paragraph.
6197      \everypar = {\hang}%
6198    \textindent{\thisfootno}%    \textindent{\thisfootno}%
6199    %    %
6200    % Don't crash into the line above the footnote text.  Since this    % Don't crash into the line above the footnote text.  Since this
# Line 4457  width0pt\relax} \fi Line 6203  width0pt\relax} \fi
6203    \footstrut    \footstrut
6204    \futurelet\next\fo@t    \futurelet\next\fo@t
6205  }  }
 \def\fo@t{\ifcat\bgroup\noexpand\next \let\next\f@@t  
   \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}  
   
6206  }%end \catcode `\@=11  }%end \catcode `\@=11
6207    
6208  % Set the baselineskip to #1, and the lineskip and strut size  % In case a @footnote appears in a vbox, save the footnote text and create
6209  % correspondingly.  There is no deep meaning behind these magic numbers  % the real \insert just after the vbox finished.  Otherwise, the insertion
6210  % used as factors; they just match (closely enough) what Knuth defined.  % would be lost.
6211  %  % Similarily, if a @footnote appears inside an alignment, save the footnote
6212  \def\lineskipfactor{.08333}  % text to a box and make the \insert when a row of the table is finished.
6213  \def\strutheightpercent{.70833}  % And the same can be done for other insert classes.  --kasal, 16nov03.
6214  \def\strutdepthpercent {.29167}  
6215    % Replace the \insert primitive by a cheating macro.
6216    % Deeper inside, just make sure that the saved insertions are not spilled
6217    % out prematurely.
6218    %
6219    \def\startsavinginserts{%
6220      \ifx \insert\ptexinsert
6221        \let\insert\saveinsert
6222      \else
6223        \let\checkinserts\relax
6224      \fi
6225    }
6226    
6227    % This \insert replacement works for both \insert\footins{foo} and
6228    % \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}.
6229  %  %
6230  \def\setleading#1{%  \def\saveinsert#1{%
6231    \normalbaselineskip = #1\relax    \edef\next{\noexpand\savetobox \makeSAVEname#1}%
6232    \normallineskip = \lineskipfactor\normalbaselineskip    \afterassignment\next
6233    \normalbaselines    % swallow the left brace
6234    \setbox\strutbox =\hbox{%    \let\temp =
     \vrule width0pt height\strutheightpercent\baselineskip  
                     depth \strutdepthpercent \baselineskip  
   }%  
6235  }  }
6236    \def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}}
6237    \def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1}
6238    
6239  % @| inserts a changebar to the left of the current line.  It should  \def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi}
6240  % surround any changed text.  This approach does *not* work if the  
6241  % change spans more than two lines of output.  To handle that, we would  \def\placesaveins#1{%
6242  % have adopt a much more difficult approach (putting marks into the main    \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname
6243  % vertical list for the beginning and end of each change).      {\box#1}%
6244    }
6245    
6246    % eat @SAVE -- beware, all of them have catcode \other:
6247    {
6248      \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials  %  ;-)
6249      \gdef\gobblesave @SAVE{}
6250    }
6251    
6252    % initialization:
6253    \def\newsaveins #1{%
6254      \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}%
6255      \next
6256    }
6257    \def\newsaveinsX #1{%
6258      \csname newbox\endcsname #1%
6259      \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts
6260        \checksaveins #1}%
6261    }
6262    
6263    % initialize:
6264    \let\checkinserts\empty
6265    \newsaveins\footins
6266    \newsaveins\margin
6267    
6268    
6269    % @image.  We use the macros from epsf.tex to support this.
6270    % If epsf.tex is not installed and @image is used, we complain.
6271    %
6272    % Check for and read epsf.tex up front.  If we read it only at @image
6273    % time, we might be inside a group, and then its definitions would get
6274    % undone and the next image would fail.
6275    \openin 1 = epsf.tex
6276    \ifeof 1 \else
6277      % Do not bother showing banner with epsf.tex v2.7k (available in
6278      % doc/epsf.tex and on ctan).
6279      \def\epsfannounce{\toks0 = }%
6280      \input epsf.tex
6281    \fi
6282    \closein 1
6283  %  %
6284  \def\|{%  % We will only complain once about lack of epsf.tex.
6285    % \vadjust can only be used in horizontal mode.  \newif\ifwarnednoepsf
6286    \leavevmode  \newhelp\noepsfhelp{epsf.tex must be installed for images to
6287      work.  It is also included in the Texinfo distribution, or you can get
6288      it from ftp://tug.org/tex/epsf.tex.}
6289    %
6290    \def\image#1{%
6291      \ifx\epsfbox\undefined
6292        \ifwarnednoepsf \else
6293          \errhelp = \noepsfhelp
6294          \errmessage{epsf.tex not found, images will be ignored}%
6295          \global\warnednoepsftrue
6296        \fi
6297      \else
6298        \imagexxx #1,,,,,\finish
6299      \fi
6300    }
6301    %
6302    % Arguments to @image:
6303    % #1 is (mandatory) image filename; we tack on .eps extension.
6304    % #2 is (optional) width, #3 is (optional) height.
6305    % #4 is (ignored optional) html alt text.
6306    % #5 is (ignored optional) extension.
6307    % #6 is just the usual extra ignored arg for parsing this stuff.
6308    \newif\ifimagevmode
6309    \def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup
6310      \catcode`\^^M = 5     % in case we're inside an example
6311      \normalturnoffactive  % allow _ et al. in names
6312      % If the image is by itself, center it.
6313      \ifvmode
6314        \imagevmodetrue
6315        \nobreak\bigskip
6316        % Usually we'll have text after the image which will insert
6317        % \parskip glue, so insert it here too to equalize the space
6318        % above and below.
6319        \nobreak\vskip\parskip
6320        \nobreak
6321        \line\bgroup\hss
6322      \fi
6323    %    %
6324    % Append this vertical mode material after the current line in the output.    % Output the image.
6325    \vadjust{%    \ifpdf
6326      % We want to insert a rule with the height and depth of the current      \dopdfimage{#1}{#2}{#3}%
6327      % leading; that is exactly what \strutbox is supposed to record.    \else
6328      \vskip-\baselineskip      % \epsfbox itself resets \epsf?size at each figure.
6329        \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi
6330        \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi
6331        \epsfbox{#1.eps}%
6332      \fi
6333      %
6334      \ifimagevmode \hss \egroup \bigbreak \fi  % space after the image
6335    \endgroup}
6336    
6337    
6338    % @float FLOATTYPE,LOC ... @end float for displayed figures, tables, etc.
6339    % We don't actually implement floating yet, we just plop the float "here".
6340    % But it seemed the best name for the future.
6341    %
6342    \envparseargdef\float{\dofloat #1,,,\finish}
6343    
6344    % #1 is the optional FLOATTYPE, the text label for this float, typically
6345    % "Figure", "Table", "Example", etc.  Can't contain commas.  If omitted,
6346    % this float will not be numbered and cannot be referred to.
6347    %
6348    % #2 is the optional xref label.  Also must be present for the float to
6349    % be referable.
6350    %
6351    % #3 is the optional positioning argument; for now, it is ignored.  It
6352    % will somehow specify the positions allowed to float to (here, top, bottom).
6353    %
6354    % We keep a separate counter for each FLOATTYPE, which we reset at each
6355    % chapter-level command.
6356    \let\resetallfloatnos=\empty
6357    %
6358    \def\dofloat#1,#2,#3,#4\finish{%
6359      \let\thiscaption=\empty
6360      \let\thisshortcaption=\empty
6361      %
6362      % don't lose footnotes inside @float.
6363      \startsavinginserts
6364      %
6365      % We can't be used inside a paragraph.
6366      \par
6367      %
6368      \vtop\bgroup
6369        \def\floattype{#1}%
6370        \def\floatlabel{#2}%
6371        \def\floatloc{#3}% we do nothing with this yet.
6372      %      %
6373      % \vadjust-items are inserted at the left edge of the type.  So      \ifx\floattype\empty
6374      % the \llap here moves out into the left-hand margin.        \let\safefloattype=\empty
6375      \llap{%      \else
6376          {%
6377            % the floattype might have accents or other special characters,
6378            % but we need to use it in a control sequence name.
6379            \indexnofonts
6380            \turnoffactive
6381            \xdef\safefloattype{\floattype}%
6382          }%
6383        \fi
6384        %
6385        % If label is given but no type, we handle that as the empty type.
6386        \ifx\floatlabel\empty \else
6387          % We want each FLOATTYPE to be numbered separately (Figure 1,
6388          % Table 1, Figure 2, ...).  (And if no label, no number.)
6389          %
6390          \expandafter\getfloatno\csname\safefloattype floatno\endcsname
6391          \global\advance\floatno by 1
6392        %        %
6393        % For a thicker or thinner bar, change the `1pt'.        {%
6394        \vrule height\baselineskip width1pt          % This magic value for \thissection is output by \setref as the
6395            % XREFLABEL-title value.  \xrefX uses it to distinguish float
6396            % labels (which have a completely different output format) from
6397            % node and anchor labels.  And \xrdef uses it to construct the
6398            % lists of floats.
6399            %
6400            \edef\thissection{\floatmagic=\safefloattype}%
6401            \setref{\floatlabel}{Yfloat}%
6402          }%
6403        \fi
6404        %
6405        % start with \parskip glue, I guess.
6406        \vskip\parskip
6407        %
6408        % Don't suppress indentation if a float happens to start a section.
6409        \restorefirstparagraphindent
6410    }
6411    
6412    % we have these possibilities:
6413    % @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap
6414    % @float Foo,lbl & no caption:    Foo 1.1
6415    % @float Foo & @caption{Cap}:     Foo: Cap
6416    % @float Foo & no caption:        Foo
6417    % @float ,lbl & Caption{Cap}:     1.1: Cap
6418    % @float ,lbl & no caption:       1.1
6419    % @float & @caption{Cap}:         Cap
6420    % @float & no caption:
6421    %
6422    \def\Efloat{%
6423        \let\floatident = \empty
6424        %
6425        % In all cases, if we have a float type, it comes first.
6426        \ifx\floattype\empty \else \def\floatident{\floattype}\fi
6427        %
6428        % If we have an xref label, the number comes next.
6429        \ifx\floatlabel\empty \else
6430          \ifx\floattype\empty \else % if also had float type, need tie first.
6431            \appendtomacro\floatident{\tie}%
6432          \fi
6433          % the number.
6434          \appendtomacro\floatident{\chaplevelprefix\the\floatno}%
6435        \fi
6436        %
6437        % Start the printed caption with what we've constructed in
6438        % \floatident, but keep it separate; we need \floatident again.
6439        \let\captionline = \floatident
6440        %
6441        \ifx\thiscaption\empty \else
6442          \ifx\floatident\empty \else
6443            \appendtomacro\captionline{: }% had ident, so need a colon between
6444          \fi
6445        %        %
6446        % This is the space between the bar and the text.        % caption text.
6447        \hskip 12pt        \appendtomacro\captionline\thiscaption
6448      }%      \fi
6449    }%      %
6450        % If we have anything to print, print it, with space before.
6451        % Eventually this needs to become an \insert.
6452        \ifx\captionline\empty \else
6453          \vskip.5\parskip
6454          \captionline
6455        \fi
6456        %
6457        % If have an xref label, write the list of floats info.  Do this
6458        % after the caption, to avoid chance of it being a breakpoint.
6459        \ifx\floatlabel\empty \else
6460          % Write the text that goes in the lof to the aux file as
6461          % \floatlabel-lof.  Besides \floatident, we include the short
6462          % caption if specified, else the full caption if specified, else nothing.
6463          {%
6464            \atdummies \turnoffactive \otherbackslash
6465            \immediate\write\auxfile{@xrdef{\floatlabel-lof}{%
6466              \floatident
6467              \ifx\thisshortcaption\empty
6468                \ifx\thiscaption\empty \else : \thiscaption \fi
6469              \else
6470                : \thisshortcaption
6471              \fi
6472            }}%
6473          }%
6474        \fi
6475        %
6476        % Space below caption, if we printed anything.
6477        \ifx\printedsomething\empty \else \vskip\parskip \fi
6478      \egroup  % end of \vtop
6479      \checkinserts
6480  }  }
6481    
6482  % For a final copy, take out the rectangles  % Append the tokens #2 to the definition of macro #1, not expanding either.
6483  % that mark overfull boxes (in case you have decided  %
6484  % that the text looks ok even though it passes the margin).  \newtoks\appendtomacroAtoks
6485    \newtoks\appendtomacroBtoks
6486    \def\appendtomacro#1#2{%
6487      \appendtomacroAtoks = \expandafter{#1}%
6488      \appendtomacroBtoks = {#2}%
6489      \edef#1{\the\appendtomacroAtoks \the\appendtomacroBtoks}%
6490    }
6491    
6492    % @caption, @shortcaption are easy.
6493    %
6494    \long\def\caption#1{\checkenv\float \def\thiscaption{#1}}
6495    \def\shortcaption#1{\checkenv\float \def\thisshortcaption{#1}}
6496    
6497    % The parameter is the control sequence identifying the counter we are
6498    % going to use.  Create it if it doesn't exist and assign it to \floatno.
6499    \def\getfloatno#1{%
6500      \ifx#1\relax
6501          % Haven't seen this figure type before.
6502          \csname newcount\endcsname #1%
6503          %
6504          % Remember to reset this floatno at the next chap.
6505          \expandafter\gdef\expandafter\resetallfloatnos
6506            \expandafter{\resetallfloatnos #1=0 }%
6507      \fi
6508      \let\floatno#1%
6509    }
6510    
6511    % \setref calls this to get the XREFLABEL-snt value.  We want an @xref
6512    % to the FLOATLABEL to expand to "Figure 3.1".  We call \setref when we
6513    % first read the @float command.
6514    %
6515    \def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}%
6516    
6517    % Magic string used for the XREFLABEL-title value, so \xrefX can
6518    % distinguish floats from other xref types.
6519    \def\floatmagic{!!float!!}
6520    
6521    % #1 is the control sequence we are passed; we expand into a conditional
6522    % which is true if #1 represents a float ref.  That is, the magic
6523    % \thissection value which we \setref above.
6524    %
6525    \def\iffloat#1{\expandafter\doiffloat#1==\finish}
6526  %  %
6527  \def\finalout{\overfullrule=0pt}  % #1 is (maybe) the \floatmagic string.  If so, #2 will be the
6528    % (safe) float type for this float.  We set \iffloattype to #2.
6529    %
6530    \def\doiffloat#1=#2=#3\finish{%
6531      \def\temp{#1}%
6532      \def\iffloattype{#2}%
6533      \ifx\temp\floatmagic
6534    }
6535    
6536    % @listoffloats FLOATTYPE - print a list of floats like a table of contents.
6537    %
6538    \parseargdef\listoffloats{%
6539      \def\floattype{#1}% floattype
6540      {%
6541        % the floattype might have accents or other special characters,
6542        % but we need to use it in a control sequence name.
6543        \indexnofonts
6544        \turnoffactive
6545        \xdef\safefloattype{\floattype}%
6546      }%
6547      %
6548      % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE.
6549      \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax
6550        \ifhavexrefs
6551          % if the user said @listoffloats foo but never @float foo.
6552          \message{\linenumber No `\safefloattype' floats to list.}%
6553        \fi
6554      \else
6555        \begingroup
6556          \leftskip=\tocindent  % indent these entries like a toc
6557          \let\do=\listoffloatsdo
6558          \csname floatlist\safefloattype\endcsname
6559        \endgroup
6560      \fi
6561    }
6562    
6563  % End of control word definitions.  % This is called on each entry in a list of floats.  We're passed the
6564    % xref label, in the form LABEL-title, which is how we save it in the
6565    % aux file.  We strip off the -title and look up \XRLABEL-lof, which
6566    % has the text we're supposed to typeset here.
6567    %
6568    % Figures without xref labels will not be included in the list (since
6569    % they won't appear in the aux file).
6570    %
6571    \def\listoffloatsdo#1{\listoffloatsdoentry#1\finish}
6572    \def\listoffloatsdoentry#1-title\finish{{%
6573      % Can't fully expand XR#1-lof because it can contain anything.  Just
6574      % pass the control sequence.  On the other hand, XR#1-pg is just the
6575      % page number, and we want to fully expand that so we can get a link
6576      % in pdf output.
6577      \toksA = \expandafter{\csname XR#1-lof\endcsname}%
6578      %
6579      % use the same \entry macro we use to generate the TOC and index.
6580      \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}%
6581      \writeentry
6582    }}
6583    
6584  \message{and turning on texinfo input format.}  \message{localization,}
6585    % and i18n.
6586    
6587  \def\openindices{%  % @documentlanguage is usually given very early, just after
6588     \newindex{cp}%  % @setfilename.  If done too late, it may not override everything
6589     \newcodeindex{fn}%  % properly.  Single argument is the language abbreviation.
6590     \newcodeindex{vr}%  % It would be nice if we could set up a hyphenation file here.
6591     \newcodeindex{tp}%  %
6592     \newcodeindex{ky}%  \parseargdef\documentlanguage{%
6593     \newcodeindex{pg}%    \tex % read txi-??.tex file in plain TeX.
6594        % Read the file if it exists.
6595        \openin 1 txi-#1.tex
6596        \ifeof 1
6597          \errhelp = \nolanghelp
6598          \errmessage{Cannot read language file txi-#1.tex}%
6599        \else
6600          \input txi-#1.tex
6601        \fi
6602        \closein 1
6603      \endgroup
6604  }  }
6605    \newhelp\nolanghelp{The given language definition file cannot be found or
6606    is empty.  Maybe you need to install it?  In the current directory
6607    should work if nowhere else does.}
6608    
6609    
6610    % @documentencoding should change something in TeX eventually, most
6611    % likely, but for now just recognize it.
6612    \let\documentencoding = \comment
6613    
 % Set some numeric style parameters, for 8.5 x 11 format.  
6614    
6615  \hsize = 6in  % Page size parameters.
6616  \hoffset = .25in  %
6617  \newdimen\defaultparindent \defaultparindent = 15pt  \newdimen\defaultparindent \defaultparindent = 15pt
 \parindent = \defaultparindent  
 \parskip 3pt plus 2pt minus 1pt  
 \setleading{13.2pt}  
 \advance\topskip by 1.2cm  
6618    
6619  \chapheadingskip = 15pt plus 4pt minus 2pt  \chapheadingskip = 15pt plus 4pt minus 2pt
6620  \secheadingskip = 12pt plus 3pt minus 2pt  \secheadingskip = 12pt plus 3pt minus 2pt
6621  \subsecheadingskip = 9pt plus 2pt minus 2pt  \subsecheadingskip = 9pt plus 2pt minus 2pt
6622    
6623  % Prevent underfull vbox error messages.  % Prevent underfull vbox error messages.
6624  \vbadness=10000  \vbadness = 10000
6625    
6626    % Don't be so finicky about underfull hboxes, either.
6627    \hbadness = 2000
6628    
6629  % Following George Bush, just get rid of widows and orphans.  % Following George Bush, just get rid of widows and orphans.
6630  \widowpenalty=10000  \widowpenalty=10000
# Line 4556  width0pt\relax} \fi Line 6633  width0pt\relax} \fi
6633  % Use TeX 3.0's \emergencystretch to help line breaking, but if we're  % Use TeX 3.0's \emergencystretch to help line breaking, but if we're
6634  % using an old version of TeX, don't do anything.  We want the amount of  % using an old version of TeX, don't do anything.  We want the amount of
6635  % stretch added to depend on the line length, hence the dependence on  % stretch added to depend on the line length, hence the dependence on
6636  % \hsize.  This makes it come to about 9pt for the 8.5x11 format.  % \hsize.  We call this whenever the paper size is set.
6637  %  %
6638  \ifx\emergencystretch\thisisundefined  \def\setemergencystretch{%
6639    % Allow us to assign to \emergencystretch anyway.    \ifx\emergencystretch\thisisundefined
6640    \def\emergencystretch{\dimen0}%      % Allow us to assign to \emergencystretch anyway.
6641  \else      \def\emergencystretch{\dimen0}%
6642    \emergencystretch = \hsize    \else
6643    \divide\emergencystretch by 45      \emergencystretch = .15\hsize
6644  \fi    \fi
6645    }
6646    
6647  % Use @smallbook to reset parameters for 7x9.5 format  (or else 7x9.25)  % Parameters in order: 1) textheight; 2) textwidth; 3) voffset;
6648  \def\smallbook{  % 4) hoffset; 5) binding offset; 6) topskip; 7) physical page height; 8)
6649    \global\chapheadingskip = 15pt plus 4pt minus 2pt  % physical page width.
6650    \global\secheadingskip = 12pt plus 3pt minus 2pt  %
6651    \global\subsecheadingskip = 9pt plus 2pt minus 2pt  % We also call \setleading{\textleading}, so the caller should define
6652    %  % \textleading.  The caller should also set \parskip.
6653    \global\lispnarrowing = 0.3in  %
6654    \setleading{12pt}  \def\internalpagesizes#1#2#3#4#5#6#7#8{%
6655    \advance\topskip by -1cm    \voffset = #3\relax
6656    \global\parskip 2pt plus 1pt    \topskip = #6\relax
6657    \global\hsize = 5in    \splittopskip = \topskip
6658    \global\vsize=7.5in    %
6659    \global\tolerance=700    \vsize = #1\relax
6660    \global\hfuzz=1pt    \advance\vsize by \topskip
6661    \global\contentsrightmargin=0pt    \outervsize = \vsize
6662    \global\deftypemargin=0pt    \advance\outervsize by 2\topandbottommargin
6663    \global\defbodyindent=.5cm    \pageheight = \vsize
6664    %    %
6665    \global\pagewidth=\hsize    \hsize = #2\relax
6666    \global\pageheight=\vsize    \outerhsize = \hsize
6667    %    \advance\outerhsize by 0.5in
6668    \global\let\smalllisp=\smalllispx    \pagewidth = \hsize
6669    \global\let\smallexample=\smalllispx    %
6670    \global\def\Esmallexample{\Esmalllisp}    \normaloffset = #4\relax
6671      \bindingoffset = #5\relax
6672      %
6673      \ifpdf
6674        \pdfpageheight #7\relax
6675        \pdfpagewidth #8\relax
6676      \fi
6677      %
6678      \setleading{\textleading}
6679      %
6680      \parindent = \defaultparindent
6681      \setemergencystretch
6682  }  }
6683    
6684    % @letterpaper (the default).
6685    \def\letterpaper{{\globaldefs = 1
6686      \parskip = 3pt plus 2pt minus 1pt
6687      \textleading = 13.2pt
6688      %
6689      % If page is nothing but text, make it come out even.
6690      \internalpagesizes{46\baselineskip}{6in}%
6691                        {\voffset}{.25in}%
6692                        {\bindingoffset}{36pt}%
6693                        {11in}{8.5in}%
6694    }}
6695    
6696    % Use @smallbook to reset parameters for 7x9.5 (or so) format.
6697    \def\smallbook{{\globaldefs = 1
6698      \parskip = 2pt plus 1pt
6699      \textleading = 12pt
6700      %
6701      \internalpagesizes{7.5in}{5in}%
6702                        {\voffset}{.25in}%
6703                        {\bindingoffset}{16pt}%
6704                        {9.25in}{7in}%
6705      %
6706      \lispnarrowing = 0.3in
6707      \tolerance = 700
6708      \hfuzz = 1pt
6709      \contentsrightmargin = 0pt
6710      \defbodyindent = .5cm
6711    }}
6712    
6713  % Use @afourpaper to print on European A4 paper.  % Use @afourpaper to print on European A4 paper.
6714  \def\afourpaper{  \def\afourpaper{{\globaldefs = 1
6715  \global\tolerance=700    \parskip = 3pt plus 2pt minus 1pt
6716  \global\hfuzz=1pt    \textleading = 13.2pt
6717  \setleading{12pt}    %
6718  \global\parskip 15pt plus 1pt    % Double-side printing via postscript on Laserjet 4050
6719      % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm.
6720  \global\vsize= 53\baselineskip    % To change the settings for a different printer or situation, adjust
6721  \advance\vsize by \topskip    % \normaloffset until the front-side and back-side texts align.  Then
6722  %\global\hsize=   5.85in     % A4 wide 10pt    % do the same for \bindingoffset.  You can set these for testing in
6723  \global\hsize=  6.5in    % your texinfo source file like this:
6724  \global\outerhsize=\hsize    % @tex
6725  \global\advance\outerhsize by 0.5in    % \global\normaloffset = -6mm
6726  \global\outervsize=\vsize    % \global\bindingoffset = 10mm
6727  \global\advance\outervsize by 0.6in    % @end tex
6728      \internalpagesizes{51\baselineskip}{160mm}
6729  \global\pagewidth=\hsize                      {\voffset}{\hoffset}%
6730  \global\pageheight=\vsize                      {\bindingoffset}{44pt}%
6731  }                      {297mm}{210mm}%
6732      %
6733  \bindingoffset=0pt    \tolerance = 700
6734  \normaloffset=\hoffset    \hfuzz = 1pt
6735  \pagewidth=\hsize    \contentsrightmargin = 0pt
6736  \pageheight=\vsize    \defbodyindent = 5mm
6737    }}
6738  % Allow control of the text dimensions.  Parameters in order: textheight;  
6739  % textwidth; voffset; hoffset; binding offset; topskip.  % Use @afivepaper to print on European A5 paper.
6740  % All require a dimension;  % From romildo@urano.iceb.ufop.br, 2 July 2000.
6741  % header is additional; added length extends the bottom of the page.  % He also recommends making @example and @lisp be small.
6742    \def\afivepaper{{\globaldefs = 1
6743  \def\changepagesizes#1#2#3#4#5#6{    \parskip = 2pt plus 1pt minus 0.1pt
6744   \global\vsize= #1    \textleading = 12.5pt
6745   \global\topskip= #6    %
6746   \advance\vsize by \topskip    \internalpagesizes{160mm}{120mm}%
6747   \global\voffset= #3                      {\voffset}{\hoffset}%
6748   \global\hsize= #2                      {\bindingoffset}{8pt}%
6749   \global\outerhsize=\hsize                      {210mm}{148mm}%
6750   \global\advance\outerhsize by 0.5in    %
6751   \global\outervsize=\vsize    \lispnarrowing = 0.2in
6752   \global\advance\outervsize by 0.6in    \tolerance = 800
6753   \global\pagewidth=\hsize    \hfuzz = 1.2pt
6754   \global\pageheight=\vsize    \contentsrightmargin = 0pt
6755   \global\normaloffset= #4    \defbodyindent = 2mm
6756   \global\bindingoffset= #5}    \tableindent = 12mm
6757    }}
6758  % A specific text layout, 24x15cm overall, intended for A4 paper.  Top margin  
6759  % 29mm, hence bottom margin 28mm, nominal side margin 3cm.  % A specific text layout, 24x15cm overall, intended for A4 paper.
6760  \def\afourlatex  \def\afourlatex{{\globaldefs = 1
6761          {\global\tolerance=700    \afourpaper
6762          \global\hfuzz=1pt    \internalpagesizes{237mm}{150mm}%
6763          \setleading{12pt}                      {\voffset}{4.6mm}%
6764          \global\parskip 15pt plus 1pt                      {\bindingoffset}{7mm}%
6765          \advance\baselineskip by 1.6pt                      {297mm}{210mm}%
6766          \changepagesizes{237mm}{150mm}{3.6mm}{3.6mm}{3mm}{7mm}    %
6767          }    % Must explicitly reset to 0 because we call \afourpaper.
6768      \globaldefs = 0
6769  % Use @afourwide to print on European A4 paper in wide format.  }}
6770  \def\afourwide{\afourpaper  
6771  \changepagesizes{9.5in}{6.5in}{\hoffset}{\normaloffset}{\bindingoffset}{7mm}}  % Use @afourwide to print on A4 paper in landscape format.
6772    \def\afourwide{{\globaldefs = 1
6773      \afourpaper
6774      \internalpagesizes{241mm}{165mm}%
6775                        {\voffset}{-2.95mm}%
6776                        {\bindingoffset}{7mm}%
6777                        {297mm}{210mm}%
6778      \globaldefs = 0
6779    }}
6780    
6781    % @pagesizes TEXTHEIGHT[,TEXTWIDTH]
6782    % Perhaps we should allow setting the margins, \topskip, \parskip,
6783    % and/or leading, also. Or perhaps we should compute them somehow.
6784    %
6785    \parseargdef\pagesizes{\pagesizesyyy #1,,\finish}
6786    \def\pagesizesyyy#1,#2,#3\finish{{%
6787      \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
6788      \globaldefs = 1
6789      %
6790      \parskip = 3pt plus 2pt minus 1pt
6791      \setleading{\textleading}%
6792      %
6793      \dimen0 = #1
6794      \advance\dimen0 by \voffset
6795      %
6796      \dimen2 = \hsize
6797      \advance\dimen2 by \normaloffset
6798      %
6799      \internalpagesizes{#1}{\hsize}%
6800                        {\voffset}{\normaloffset}%
6801                        {\bindingoffset}{44pt}%
6802                        {\dimen0}{\dimen2}%
6803    }}
6804    
6805    % Set default to letter.
6806    %
6807    \letterpaper
6808    
6809    
6810    \message{and turning on texinfo input format.}
6811    
6812  % Define macros to output various characters with catcode for normal text.  % Define macros to output various characters with catcode for normal text.
6813  \catcode`\"=\other  \catcode`\"=\other
# Line 4661  width0pt\relax} \fi Line 6818  width0pt\relax} \fi
6818  \catcode`\<=\other  \catcode`\<=\other
6819  \catcode`\>=\other  \catcode`\>=\other
6820  \catcode`\+=\other  \catcode`\+=\other
6821    \catcode`\$=\other
6822  \def\normaldoublequote{"}  \def\normaldoublequote{"}
6823  \def\normaltilde{~}  \def\normaltilde{~}
6824  \def\normalcaret{^}  \def\normalcaret{^}
# Line 4669  width0pt\relax} \fi Line 6827  width0pt\relax} \fi
6827  \def\normalless{<}  \def\normalless{<}
6828  \def\normalgreater{>}  \def\normalgreater{>}
6829  \def\normalplus{+}  \def\normalplus{+}
6830    \def\normaldollar{$}%$ font-lock fix
6831    
6832  % This macro is used to make a character print one way in ttfont  % This macro is used to make a character print one way in \tt
6833  % where it can probably just be output, and another way in other fonts,  % (where it can probably be output as-is), and another way in other fonts,
6834  % where something hairier probably needs to be done.  % where something hairier probably needs to be done.
6835  %  %
6836  % #1 is what to print if we are indeed using \tt; #2 is what to print  % #1 is what to print if we are indeed using \tt; #2 is what to print
# Line 4679  width0pt\relax} \fi Line 6838  width0pt\relax} \fi
6838  % interword stretch (and shrink), and it is reasonable to expect all  % interword stretch (and shrink), and it is reasonable to expect all
6839  % typewriter fonts to have this, we can check that font parameter.  % typewriter fonts to have this, we can check that font parameter.
6840  %  %
6841  \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}
6842    
6843    % Same as above, but check for italic font.  Actually this also catches
6844    % non-italic slanted fonts since it is impossible to distinguish them from
6845    % italic fonts.  But since this is only used by $ and it uses \sl anyway
6846    % this is not a problem.
6847    \def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi}
6848    
6849  % Turn off all special characters except @  % Turn off all special characters except @
6850  % (and those which the user can use as if they were ordinary).  % (and those which the user can use as if they were ordinary).
# Line 4687  width0pt\relax} \fi Line 6852  width0pt\relax} \fi
6852  % use math or other variants that look better in normal text.  % use math or other variants that look better in normal text.
6853    
6854  \catcode`\"=\active  \catcode`\"=\active
6855  \def\activedoublequote{{\tt \char '042}}  \def\activedoublequote{{\tt\char34}}
6856  \let"=\activedoublequote  \let"=\activedoublequote
6857  \catcode`\~=\active  \catcode`\~=\active
6858  \def~{{\tt \char '176}}  \def~{{\tt\char126}}
6859  \chardef\hat=`\^  \chardef\hat=`\^
6860  \catcode`\^=\active  \catcode`\^=\active
6861  \def^{{\tt \hat}}  \def^{{\tt \hat}}
# Line 4698  width0pt\relax} \fi Line 6863  width0pt\relax} \fi
6863  \catcode`\_=\active  \catcode`\_=\active
6864  \def_{\ifusingtt\normalunderscore\_}  \def_{\ifusingtt\normalunderscore\_}
6865  % Subroutine for the previous macro.  % Subroutine for the previous macro.
6866  \def\_{\leavevmode \kern.06em \vbox{\hrule width.3em height.1ex}}  \def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }
6867    
6868  \catcode`\|=\active  \catcode`\|=\active
6869  \def|{{\tt \char '174}}  \def|{{\tt\char124}}
6870  \chardef \less=`\<  \chardef \less=`\<
6871  \catcode`\<=\active  \catcode`\<=\active
6872  \def<{{\tt \less}}  \def<{{\tt \less}}
# Line 4710  width0pt\relax} \fi Line 6875  width0pt\relax} \fi
6875  \def>{{\tt \gtr}}  \def>{{\tt \gtr}}
6876  \catcode`\+=\active  \catcode`\+=\active
6877  \def+{{\tt \char 43}}  \def+{{\tt \char 43}}
6878  %\catcode 27=\active  \catcode`\$=\active
6879  %\def^^[{$\diamondsuit$}  \def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix
   
 % Set up an active definition for =, but don't enable it most of the time.  
 {\catcode`\==\active  
 \global\def={{\tt \char 61}}}  
   
 \catcode`+=\active  
 \catcode`\_=\active  
6880    
6881  % If a .fmt file is being used, characters that might appear in a file  % If a .fmt file is being used, characters that might appear in a file
6882  % name cannot be active until we have parsed the command line.  % name cannot be active until we have parsed the command line.
# Line 4728  width0pt\relax} \fi Line 6886  width0pt\relax} \fi
6886    
6887  \catcode`\@=0  \catcode`\@=0
6888    
6889  % \rawbackslashxx output one backslash character in current font  % \backslashcurfont outputs one backslash character in current font,
6890  \global\chardef\rawbackslashxx=`\\  % as in \char`\\.
6891  %{\catcode`\\=\other  \global\chardef\backslashcurfont=`\\
6892  %@gdef@rawbackslashxx{\}}  \global\let\rawbackslashxx=\backslashcurfont  % let existing .??s files work
6893    
6894  % \rawbackslash redefines \ as input to do \rawbackslashxx.  % \rawbackslash defines an active \ to do \backslashcurfont.
6895    % \otherbackslash defines an active \ to be a literal `\' character with
6896    % catcode other.
6897  {\catcode`\\=\active  {\catcode`\\=\active
6898  @gdef@rawbackslash{@let\=@rawbackslashxx }}   @gdef@rawbackslash{@let\=@backslashcurfont}
6899     @gdef@otherbackslash{@let\=@realbackslash}
6900    }
6901    
6902  % \normalbackslash outputs one backslash in fixed width font.  % \realbackslash is an actual character `\' with catcode other.
6903  \def\normalbackslash{{\tt\rawbackslashxx}}  {\catcode`\\=\other @gdef@realbackslash{\}}
6904    
6905  % Say @foo, not \foo, in error messages.  % \normalbackslash outputs one backslash in fixed width font.
6906  \escapechar=`\@  \def\normalbackslash{{\tt\backslashcurfont}}
6907    
 % \catcode 17=0   % Define control-q  
6908  \catcode`\\=\active  \catcode`\\=\active
6909    
6910  % Used sometimes to turn off (effectively) the active characters  % Used sometimes to turn off (effectively) the active characters
6911  % even after parsing them.  % even after parsing them.
6912  @def@turnoffactive{@let"=@normaldoublequote  @def@turnoffactive{%
6913  @let\=@realbackslash    @let"=@normaldoublequote
6914  @let~=@normaltilde    @let\=@realbackslash
6915  @let^=@normalcaret    @let~=@normaltilde
6916  @let_=@normalunderscore    @let^=@normalcaret
6917  @let|=@normalverticalbar    @let_=@normalunderscore
6918  @let<=@normalless    @let|=@normalverticalbar
6919  @let>=@normalgreater    @let<=@normalless
6920  @let+=@normalplus}    @let>=@normalgreater
6921      @let+=@normalplus
6922  @def@normalturnoffactive{@let"=@normaldoublequote    @let$=@normaldollar %$ font-lock fix
6923  @let\=@normalbackslash    @unsepspaces
6924  @let~=@normaltilde  }
6925  @let^=@normalcaret  
6926  @let_=@normalunderscore  % Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of
6927  @let|=@normalverticalbar  % the literal character `\'.  (Thus, \ is not expandable when this is in
6928  @let<=@normalless  % effect.)
6929  @let>=@normalgreater  %
6930  @let+=@normalplus}  @def@normalturnoffactive{@turnoffactive @let\=@normalbackslash}
6931    
6932  % Make _ and + \other characters, temporarily.  % Make _ and + \other characters, temporarily.
6933  % This is canceled by @fixbackslash.  % This is canceled by @fixbackslash.
# Line 4785  width0pt\relax} \fi Line 6946  width0pt\relax} \fi
6946  % Also back turn on active characters that might appear in the input  % Also back turn on active characters that might appear in the input
6947  % file name, in case not using a pre-dumped format.  % file name, in case not using a pre-dumped format.
6948  %  %
6949  @gdef@fixbackslash{@ifx\@eatinput @let\ = @normalbackslash @fi  @gdef@fixbackslash{%
6950    @catcode`+=@active @catcode`@_=@active}    @ifx\@eatinput @let\ = @normalbackslash @fi
6951      @catcode`+=@active
6952      @catcode`@_=@active
6953    }
6954    
6955    % Say @foo, not \foo, in error messages.
6956    @escapechar = `@@
6957    
6958  %% These look ok in all fonts, so just make them not special.  The @rm below  % These look ok in all fonts, so just make them not special.
6959  %% makes sure that the current font starts out as the newly loaded cmr10  @catcode`@& = @other
6960  @catcode`@$=@other @catcode`@%=@other @catcode`@&=@other @catcode`@#=@other  @catcode`@# = @other
6961    @catcode`@% = @other
6962    
 @textfonts  
 @rm  
6963    
6964  @c Local variables:  @c Local variables:
6965    @c eval: (add-hook 'write-file-hooks 'time-stamp)
6966  @c page-delimiter: "^\\\\message"  @c page-delimiter: "^\\\\message"
6967    @c time-stamp-start: "def\\\\texinfoversion{"
6968    @c time-stamp-format: "%:y-%02m-%02d.%02H"
6969    @c time-stamp-end: "}"
6970  @c End:  @c End:
6971    
6972    @c vim:sw=2:
6973    
6974    @ignore
6975       arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115
6976    @end ignore

Legend:
Removed from v.1.1.1.1  
changed lines
  Added in v.1.2

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26