xref: /csrg-svn/usr.sbin/amd/doc/texinfo.tex (revision 61792)
1*47504Spendry%% TeX macros to handle texinfo files
2*47504Spendry
3*47504Spendry%   Copyright (C) 1985, 1986, 1988 Free Software Foundation, Inc.
4*47504Spendry
5*47504Spendry%GNU CC is free software; you can redistribute it and/or modify
6*47504Spendry%it under the terms of the GNU General Public License as published by
7*47504Spendry%the Free Software Foundation; either version 1, or (at your option)
8*47504Spendry%any later version.
9*47504Spendry
10*47504Spendry%GNU CC is distributed in the hope that it will be useful,
11*47504Spendry%but WITHOUT ANY WARRANTY; without even the implied warranty of
12*47504Spendry%MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13*47504Spendry%GNU General Public License for more details.
14*47504Spendry
15*47504Spendry%You should have received a copy of the GNU General Public License
16*47504Spendry%along with GNU CC; see the file COPYING.  If not, write to
17*47504Spendry%the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
18*47504Spendry
19*47504Spendry
20*47504Spendry%In other words, you are welcome to use, share and improve this program.
21*47504Spendry%You are forbidden to forbid anyone else to use, share and improve
22*47504Spendry%what you give them.   Help stamp out software-hoarding!
23*47504Spendry
24*47504Spendry\def\texinfoversion{1.26}
25*47504Spendry\message{Loading texinfo package [Version \texinfoversion]:}
26*47504Spendry\message{}
27*47504Spendry
28*47504Spendry% Save some parts of plain tex whose names we will redefine.
29*47504Spendry
30*47504Spendry\let\ptexlbrace=\{
31*47504Spendry\let\ptexrbrace=\}
32*47504Spendry\let\ptexdot=\.
33*47504Spendry\let\ptexstar=\*
34*47504Spendry\let\ptexend=\end
35*47504Spendry\let\ptexbullet=\bullet
36*47504Spendry\let\ptexb=\b
37*47504Spendry\let\ptexc=\c
38*47504Spendry\let\ptexi=\i
39*47504Spendry\let\ptext=\t
40*47504Spendry\let\ptexl=\l
41*47504Spendry\let\ptexL=\L
42*47504Spendry
43*47504Spendry\def\tie{\penalty 10000\ }     % Save plain tex definition of ~.
44*47504Spendry
45*47504Spendry\message{Basics,}
46*47504Spendry\chardef\other=12
47*47504Spendry
48*47504Spendry\hyphenation{ap-pen-dix}
49*47504Spendry\hyphenation{mini-buf-fer mini-buf-fers}
50*47504Spendry\hyphenation{eshell}
51*47504Spendry
52*47504Spendry% Margin to add to right of even pages, to left of odd pages.
53*47504Spendry\newdimen \bindingoffset  \bindingoffset=0pt
54*47504Spendry\newdimen \normaloffset   \normaloffset=\hoffset
55*47504Spendry\newdimen\pagewidth \newdimen\pageheight
56*47504Spendry\pagewidth=\hsize \pageheight=\vsize
57*47504Spendry
58*47504Spendry%---------------------Begin change-----------------------
59*47504Spendry%
60*47504Spendry% Dimensions to add cropmarks at corners Added by P. A. MacKay, 12 Nov. 1986
61*47504Spendry%
62*47504Spendry\newdimen\cornerlong \newdimen\cornerthick
63*47504Spendry\newdimen \topandbottommargin
64*47504Spendry\newdimen \outerhsize \newdimen \outervsize
65*47504Spendry\cornerlong=1pc\cornerthick=.3pt	% These set size of cropmarks
66*47504Spendry\outerhsize=7in
67*47504Spendry\outervsize=9.5in
68*47504Spendry\topandbottommargin=.75in
69*47504Spendry%
70*47504Spendry%---------------------End change-----------------------
71*47504Spendry
72*47504Spendry% \onepageout takes a vbox as an argument.  Note that \pagecontents
73*47504Spendry% does insertions itself, but you have to call it yourself.
74*47504Spendry\chardef\PAGE=255  \output={\onepageout{\pagecontents\PAGE}}
75*47504Spendry\def\onepageout#1{\hoffset=\normaloffset
76*47504Spendry\ifodd\pageno  \advance\hoffset by \bindingoffset
77*47504Spendry\else \advance\hoffset by -\bindingoffset\fi
78*47504Spendry\shipout\vbox{{\let\hsize=\pagewidth \makeheadline} \pagebody{#1}%
79*47504Spendry {\let\hsize=\pagewidth \makefootline}}
80*47504Spendry\advancepageno \ifnum\outputpenalty>-20000 \else\dosupereject\fi}
81*47504Spendry
82*47504Spendry
83*47504Spendry% Here is a modification of the main output routine for Near East Publications
84*47504Spendry% This provides right-angle cropmarks at all four corners.
85*47504Spendry% The contents of the page are centerlined into the cropmarks,
86*47504Spendry% and any desired binding offset is added as an \hskip on either
87*47504Spendry% site of the centerlined box.  (P. A. MacKay, 12 November, 1986)
88*47504Spendry%
89*47504Spendry\def\croppageout#1{\hoffset=0pt % make sure this doesn't mess things up
90*47504Spendry		 \shipout
91*47504Spendry		 \vbox to \outervsize{\hsize=\outerhsize
92*47504Spendry                 \vbox{\line{\ewtop\hfill\ewtop}}
93*47504Spendry                 \nointerlineskip
94*47504Spendry                 \line{\vbox{\moveleft\cornerthick\nstop}
95*47504Spendry                       \hfill
96*47504Spendry                       \vbox{\moveright\cornerthick\nstop}}
97*47504Spendry                 \vskip \topandbottommargin
98*47504Spendry                 \centerline{\ifodd\pageno\hskip\bindingoffset\fi
99*47504Spendry			\vbox{
100*47504Spendry			{\let\hsize=\pagewidth \makeheadline}
101*47504Spendry			\pagebody{#1}
102*47504Spendry			{\let\hsize=\pagewidth \makefootline}}
103*47504Spendry			\ifodd\pageno\else\hskip\bindingoffset\fi}
104*47504Spendry		 \vskip \topandbottommargin plus1fill minus1fill
105*47504Spendry                 \boxmaxdepth\cornerthick
106*47504Spendry                 \line{\vbox{\moveleft\cornerthick\nsbot}
107*47504Spendry                       \hfill
108*47504Spendry                       \vbox{\moveright\cornerthick\nsbot}}
109*47504Spendry                 \nointerlineskip
110*47504Spendry                 \vbox{\line{\ewbot\hfill\ewbot}}
111*47504Spendry	}
112*47504Spendry  \advancepageno
113*47504Spendry  \ifnum\outputpenalty>-20000 \else\dosupereject\fi}
114*47504Spendry%
115*47504Spendry% Do @cropmarks to get crop marks
116*47504Spendry\def\cropmarks{\let\onepageout=\croppageout }
117*47504Spendry
118*47504Spendry\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}
119*47504Spendry{\catcode`\@ =11
120*47504Spendry\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
121*47504Spendry\dimen@=\dp#1 \unvbox#1
122*47504Spendry\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
123*47504Spendry\ifr@ggedbottom \kern-\dimen@ \vfil \fi}
124*47504Spendry}
125*47504Spendry
126*47504Spendry%
127*47504Spendry% Here are the rules for the cropmarks.  Note that they are
128*47504Spendry% offset so that the space between them is truly \outerhsize or \outervsize
129*47504Spendry% (P. A. MacKay, 12 November, 1986)
130*47504Spendry%
131*47504Spendry\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}
132*47504Spendry\def\nstop{\vbox
133*47504Spendry  {\hrule height\cornerthick depth\cornerlong width\cornerthick}}
134*47504Spendry\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}
135*47504Spendry\def\nsbot{\vbox
136*47504Spendry  {\hrule height\cornerlong depth\cornerthick width\cornerthick}}
137*47504Spendry
138*47504Spendry% Parse an argument, then pass it to #1.
139*47504Spendry% The argument can be delimited with [...] or with "..." or braces
140*47504Spendry% or it can be a whole line.
141*47504Spendry% #1 should be a macro which expects
142*47504Spendry% an ordinary undelimited TeX argument.
143*47504Spendry
144*47504Spendry\def\parsearg #1{\let\next=#1\begingroup\obeylines\futurelet\temp\parseargx}
145*47504Spendry
146*47504Spendry\def\parseargx{%
147*47504Spendry\ifx \obeyedspace\temp \aftergroup\parseargdiscardspace \else%
148*47504Spendry\aftergroup \parseargline %
149*47504Spendry\fi \endgroup}
150*47504Spendry
151*47504Spendry{\obeyspaces %
152*47504Spendry\gdef\parseargdiscardspace {\begingroup\obeylines\futurelet\temp\parseargx}}
153*47504Spendry
154*47504Spendry\gdef\obeyedspace{\ }
155*47504Spendry
156*47504Spendry\def\parseargline{\begingroup \obeylines \parsearglinex}
157*47504Spendry{\obeylines %
158*47504Spendry\gdef\parsearglinex #1^^M{\endgroup \next {#1}}}
159*47504Spendry
160*47504Spendry\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
161*47504Spendry
162*47504Spendry%% These are used to keep @begin/@end levels from running away
163*47504Spendry%% Call \inENV within environments (after a \begingroup)
164*47504Spendry\newif\ifENV \ENVfalse \def\inENV{\ifENV\relax\else\ENVtrue\fi}
165*47504Spendry\def\ENVcheck{%
166*47504Spendry\ifENV\errmessage{Still within an environment.  Type Return to continue.}
167*47504Spendry\endgroup\fi} % This is not perfect, but it should reduce lossage
168*47504Spendry
169*47504Spendry% @begin foo  is the same as @foo, for now.
170*47504Spendry\newhelp\EMsimple{Type <Return> to continue}
171*47504Spendry
172*47504Spendry\outer\def\begin{\parsearg\beginxxx}
173*47504Spendry
174*47504Spendry\def\beginxxx #1{%
175*47504Spendry\expandafter\ifx\csname #1\endcsname\relax
176*47504Spendry{\errhelp=\EMsimple \errmessage{Undefined command @begin #1}}\else
177*47504Spendry\csname #1\endcsname\fi}
178*47504Spendry
179*47504Spendry%% @end foo executes the definition of \Efoo.
180*47504Spendry%% foo can be delimited by doublequotes or brackets.
181*47504Spendry
182*47504Spendry\def\end{\parsearg\endxxx}
183*47504Spendry
184*47504Spendry\def\endxxx #1{%
185*47504Spendry\expandafter\ifx\csname E#1\endcsname\relax
186*47504Spendry\expandafter\ifx\csname #1\endcsname\relax
187*47504Spendry\errmessage{Undefined command @end #1}\else
188*47504Spendry\errorE{#1}\fi\fi
189*47504Spendry\csname E#1\endcsname}
190*47504Spendry\def\errorE#1{
191*47504Spendry{\errhelp=\EMsimple \errmessage{@end #1 not within #1 environment}}}
192*47504Spendry
193*47504Spendry% Single-spacing is done by various environments.
194*47504Spendry
195*47504Spendry\newskip\singlespaceskip \singlespaceskip = \baselineskip
196*47504Spendry\def\singlespace{%
197*47504Spendry{\advance \baselineskip by -\singlespaceskip
198*47504Spendry\kern \baselineskip}%
199*47504Spendry\baselineskip=\singlespaceskip
200*47504Spendry}
201*47504Spendry
202*47504Spendry%% Simple single-character @ commands
203*47504Spendry
204*47504Spendry% @@ prints an @
205*47504Spendry% Kludge this until the fonts are right (grr).
206*47504Spendry\def\@{{\sf \char '100}}
207*47504Spendry
208*47504Spendry% Define @` and @' to be the same as ` and '
209*47504Spendry% but suppressing ligatures.
210*47504Spendry\def\`{{`}}
211*47504Spendry\def\'{{'}}
212*47504Spendry
213*47504Spendry% Used to generate quoted braces.
214*47504Spendry
215*47504Spendry\def\mylbrace {{\tt \char '173}}
216*47504Spendry\def\myrbrace {{\tt \char '175}}
217*47504Spendry\let\{=\mylbrace
218*47504Spendry\let\}=\myrbrace
219*47504Spendry
220*47504Spendry% @: forces normal size whitespace following.
221*47504Spendry\def\:{\spacefactor=1000 }
222*47504Spendry
223*47504Spendry% @* forces a line break.
224*47504Spendry\def\*{\hfil\break}
225*47504Spendry
226*47504Spendry% @. is an end-of-sentence period.
227*47504Spendry\def\.{.\spacefactor=3000 }
228*47504Spendry
229*47504Spendry% @w prevents a word break
230*47504Spendry\def\w #1{\hbox{#1}}
231*47504Spendry
232*47504Spendry% @group ... @end group  forces ... to be all on one page.
233*47504Spendry
234*47504Spendry\def\group{\begingroup% \inENV ???
235*47504Spendry\def \Egroup{\egroup\endgroup}
236*47504Spendry\vbox\bgroup}
237*47504Spendry
238*47504Spendry% @br   forces paragraph break
239*47504Spendry
240*47504Spendry\let\br = \par
241*47504Spendry
242*47504Spendry% @dots{}  output some dots
243*47504Spendry
244*47504Spendry\def\dots{$\ldots$}
245*47504Spendry
246*47504Spendry% @page    forces the start of a new page
247*47504Spendry
248*47504Spendry\def\page{\par\vfill\supereject}
249*47504Spendry
250*47504Spendry% @exdent text....
251*47504Spendry% outputs text on separate line in roman font, starting at standard page margin
252*47504Spendry
253*47504Spendry\def\exdent{\errmessage{@exdent in filled text}}
254*47504Spendry  % @lisp, etc, define \exdent locally from \internalexdent
255*47504Spendry
256*47504Spendry{\obeyspaces
257*47504Spendry\gdef\internalexdent{\parsearg\exdentzzz}}
258*47504Spendry
259*47504Spendry\def\exdentzzz #1{{\advance \leftskip by -\lispnarrowing
260*47504Spendry\advance \hsize by -\leftskip
261*47504Spendry\advance \hsize by -\rightskip
262*47504Spendry\leftline{{\rm#1}}}}
263*47504Spendry
264*47504Spendry% @include file    insert text of that file as input.
265*47504Spendry
266*47504Spendry\def\include{\parsearg\includezzz}
267*47504Spendry\def\includezzz #1{{\def\thisfile{#1}\input #1
268*47504Spendry}}
269*47504Spendry
270*47504Spendry\def\thisfile{}
271*47504Spendry
272*47504Spendry% @center line   outputs that line, centered
273*47504Spendry
274*47504Spendry\def\center{\parsearg\centerzzz}
275*47504Spendry\def\centerzzz #1{{\advance\hsize by -\leftskip
276*47504Spendry\advance\hsize by -\rightskip
277*47504Spendry\centerline{#1}}}
278*47504Spendry
279*47504Spendry% @sp n   outputs n lines of vertical space
280*47504Spendry
281*47504Spendry\def\sp{\parsearg\spxxx}
282*47504Spendry\def\spxxx #1{\par \vskip #1\baselineskip}
283*47504Spendry
284*47504Spendry% @comment ...line which is ignored...
285*47504Spendry% @c is the same as @comment
286*47504Spendry% @ignore ... @end ignore  is another way to write a comment
287*47504Spendry
288*47504Spendry\def\comment{\parsearg \commentxxx}
289*47504Spendry
290*47504Spendry\def\commentxxx #1{}
291*47504Spendry
292*47504Spendry\let\c=\comment
293*47504Spendry
294*47504Spendry% Prevent errors for section commands.
295*47504Spendry% Used in @ignore and in failing conditionals.
296*47504Spendry\def\ignoresections{%
297*47504Spendry\let\chapter=\relax
298*47504Spendry\let\unnumbered=\relax
299*47504Spendry\let\unnumberedsec=\relax
300*47504Spendry\let\unnumberedsection=\relax
301*47504Spendry\let\unnumberedsubsec=\relax
302*47504Spendry\let\unnumberedsubsection=\relax
303*47504Spendry\let\unnumberedsubsubsec=\relax
304*47504Spendry\let\unnumberedsubsubsection=\relax
305*47504Spendry\let\section=\relax
306*47504Spendry\let\subsec=\relax
307*47504Spendry\let\subsubsec=\relax
308*47504Spendry\let\subsection=\relax
309*47504Spendry\let\subsubsection=\relax
310*47504Spendry\let\appendix=\relax
311*47504Spendry\let\appendixsec=\relax
312*47504Spendry\let\appendixsection=\relax
313*47504Spendry\let\appendixsubsec=\relax
314*47504Spendry\let\appendixsubsection=\relax
315*47504Spendry\let\appendixsubsubsec=\relax
316*47504Spendry\let\appendixsubsubsection=\relax
317*47504Spendry}
318*47504Spendry
319*47504Spendry\def\ignore{\begingroup\ignoresections\ignorexxx}
320*47504Spendry\long\def\ignorexxx #1\end ignore{\endgroup}
321*47504Spendry
322*47504Spendry% Conditionals to test whether a flag is set.
323*47504Spendry
324*47504Spendry\outer\def\ifset{\begingroup\ignoresections\parsearg\ifsetxxx}
325*47504Spendry
326*47504Spendry\def\ifsetxxx #1{\endgroup
327*47504Spendry\expandafter\ifx\csname IF#1\endcsname\relax \let\temp=\ifsetfail
328*47504Spendry\else \let\temp=\relax \fi
329*47504Spendry\temp}
330*47504Spendry\def\Eifset{}
331*47504Spendry\def\ifsetfail{\begingroup\ignoresections\ifsetfailxxx}
332*47504Spendry\long\def\ifsetfailxxx #1\end ifset{\endgroup}
333*47504Spendry
334*47504Spendry\outer\def\ifclear{\begingroup\ignoresections\parsearg\ifclearxxx}
335*47504Spendry
336*47504Spendry\def\ifclearxxx #1{\endgroup
337*47504Spendry\expandafter\ifx\csname IF#1\endcsname\relax \let\temp=\relax
338*47504Spendry\else \let\temp=\ifclearfail \fi
339*47504Spendry\temp}
340*47504Spendry\def\Eifclear{}
341*47504Spendry\def\ifclearfail{\begingroup\ignoresections\ifclearfailxxx}
342*47504Spendry\long\def\ifclearfailxxx #1\end ifclear{\endgroup}
343*47504Spendry
344*47504Spendry% Some texinfo constructs that are trivial in tex
345*47504Spendry
346*47504Spendry\def\iftex{}
347*47504Spendry\def\Eiftex{}
348*47504Spendry\def\ifinfo{\begingroup\ignoresections\ifinfoxxx}
349*47504Spendry\long\def\ifinfoxxx #1\end ifinfo{\endgroup}
350*47504Spendry\long\def\menu #1\end menu{}
351*47504Spendry\def\asis#1{#1}
352*47504Spendry
353*47504Spendry\def\node{\parsearg\nodezzz}
354*47504Spendry\def\nodezzz#1{\nodexxx [#1,]}
355*47504Spendry\def\nodexxx[#1,#2]{\gdef\lastnode{#1}}
356*47504Spendry\let\lastnode=\relax
357*47504Spendry
358*47504Spendry\def\donoderef{\ifx\lastnode\relax\else
359*47504Spendry\expandafter\expandafter\expandafter\setref{\lastnode}\fi
360*47504Spendry\let\lastnode=\relax}
361*47504Spendry
362*47504Spendry\def\unnumbnoderef{\ifx\lastnode\relax\else
363*47504Spendry\expandafter\expandafter\expandafter\unnumbsetref{\lastnode}\fi
364*47504Spendry\let\lastnode=\relax}
365*47504Spendry
366*47504Spendry\let\refill=\relax
367*47504Spendry
368*47504Spendry% @setfilename is done at the beginning of every texinfo file.
369*47504Spendry% So open here the files we need to have open while reading the input.
370*47504Spendry% This makes it possible to make a .fmt file for texinfo.
371*47504Spendry\def\setfilename{%
372*47504Spendry   \readauxfile
373*47504Spendry   \opencontents
374*47504Spendry   \openindices
375*47504Spendry   \fixbackslash  % Turn off hack to swallow `\input texinfo'.
376*47504Spendry   \comment % Ignore the actual filename.
377*47504Spendry}
378*47504Spendry
379*47504Spendry\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
380*47504Spendry
381*47504Spendry\def\inforef #1{\inforefzzz #1,,,,**}
382*47504Spendry\def\inforefzzz #1,#2,#3,#4**{See Info file \file{\losespace#3{}}, node `\losespace#1{}'}
383*47504Spendry\def\losespace #1{#1}
384*47504Spendry
385*47504Spendry\message{fonts,}
386*47504Spendry
387*47504Spendry% Font-change commands.
388*47504Spendry
389*47504Spendry%% Try out Computer Modern fonts at \magstephalf
390*47504Spendry\font\tenrm=cmr10 scaled \magstephalf
391*47504Spendry\font\tentt=cmtt10 scaled \magstephalf
392*47504Spendry% Instead of cmb10, you many want to use cmbx10.
393*47504Spendry% cmbx10 is a prettier font on its own, but cmb10
394*47504Spendry% looks better when embedded in a line with cmr10.
395*47504Spendry\font\tenbf=cmb10 scaled \magstephalf
396*47504Spendry\font\tenit=cmti10 scaled \magstephalf
397*47504Spendry\font\tensl=cmsl10 scaled \magstephalf
398*47504Spendry\font\tensf=cmss10 scaled \magstephalf
399*47504Spendry\def\li{\sf}
400*47504Spendry\font\tensc=cmcsc10 scaled \magstephalf
401*47504Spendry
402*47504Spendry% Fonts for @defun, etc.
403*47504Spendry\font\defbf=cmbx10 scaled \magstep1 %was 1314
404*47504Spendry\let\deftt=\tentt
405*47504Spendry\def\df{\let\tt=\deftt \defbf}
406*47504Spendry
407*47504Spendry% Font for title
408*47504Spendry\font\titlerm = cmbx10 scaled \magstep5
409*47504Spendry
410*47504Spendry% Fonts for indices
411*47504Spendry\font\indit=cmti9 \font\indrm=cmr9
412*47504Spendry\def\indbf{\indrm} \def\indsl{\indit}
413*47504Spendry\def\indexfonts{\let\it=\indit \let\sl=\indsl \let\bf=\indbf \let\rm=\indrm}
414*47504Spendry
415*47504Spendry% Fonts for headings
416*47504Spendry\font\chaprm=cmbx10 scaled \magstep3
417*47504Spendry\font\chapit=cmti10 scaled \magstep3
418*47504Spendry\font\chapsl=cmsl10 scaled \magstep3
419*47504Spendry\font\chaptt=cmtt10 scaled \magstep3
420*47504Spendry\font\chapsf=cmss10 scaled \magstep3
421*47504Spendry\let\chapbf=\chaprm
422*47504Spendry
423*47504Spendry\font\secrm=cmbx10 scaled \magstep2
424*47504Spendry\font\secit=cmti10 scaled \magstep2
425*47504Spendry\font\secsl=cmsl10 scaled \magstep2
426*47504Spendry\font\sectt=cmtt10 scaled \magstep2
427*47504Spendry\font\secsf=cmss10 scaled \magstep2
428*47504Spendry\let\secbf=\secrm
429*47504Spendry
430*47504Spendry% \font\ssecrm=cmbx10 scaled \magstep1    % This size an fontlooked bad.
431*47504Spendry% \font\ssecit=cmti10 scaled \magstep1    % The letters were too crowded.
432*47504Spendry% \font\ssecsl=cmsl10 scaled \magstep1
433*47504Spendry% \font\ssectt=cmtt10 scaled \magstep1
434*47504Spendry% \font\ssecsf=cmss10 scaled \magstep1
435*47504Spendry
436*47504Spendry\font\ssecrm=cmb10 at 13pt	% Note the use of cmb rather than cmbx.
437*47504Spendry\font\ssecit=cmti10 at 13pt	% Also, the size is a little larger than
438*47504Spendry\font\ssecsl=cmsl10 at 13pt	% being scaled magstep1.
439*47504Spendry\font\ssectt=cmtt10 at 13pt
440*47504Spendry\font\ssecsf=cmss10 at 13pt
441*47504Spendry
442*47504Spendry\let\ssecbf=\ssecrm
443*47504Spendry
444*47504Spendry\def\textfonts{\let\rm=\tenrm\let\it=\tenit\let\sl=\tensl\let\bf=\tenbf%
445*47504Spendry\let\smallcaps=\tensc\let\sf=\tensf}
446*47504Spendry\def\chapfonts{\let\rm=\chaprm\let\it=\chapit\let\sl=\chapsl\let\bf=\chapbf\let\tt=\chaptt\let\sf=\chapsf}
447*47504Spendry\def\secfonts{\let\rm=\secrm\let\it=\secit\let\sl=\secsl\let\bf=\secbf\let\tt=\sectt\let\sf=\secsf}
448*47504Spendry\def\subsecfonts{\let\rm=\ssecrm\let\it=\ssecit\let\sl=\ssecsl\let\bf=\ssecbf\let\tt=\ssectt\let\sf=\ssecsf}
449*47504Spendry% Count depth in font-changes, for error checks
450*47504Spendry\newcount\fontdepth \fontdepth=0
451*47504Spendry
452*47504Spendry% Font for table of contents.
453*47504Spendry\font\truesecrm=cmr12
454*47504Spendry
455*47504Spendry%% Add scribe-like font environments, plus @l for inline lisp (usually sans
456*47504Spendry%% serif) and @ii for TeX italic
457*47504Spendry
458*47504Spendry\def\i#1{{\sl #1}}
459*47504Spendry\let\var=\i
460*47504Spendry\let\dfn=\i
461*47504Spendry\let\emph=\i
462*47504Spendry\let\cite=\i
463*47504Spendry
464*47504Spendry\def\b#1{{\bf #1}}
465*47504Spendry\let\strong=\b
466*47504Spendry
467*47504Spendry\def\t#1{{\tt \rawbackslash \frenchspacing #1}\null}
468*47504Spendry\let\ttfont = \t
469*47504Spendry\let\kbd=\t
470*47504Spendry\let\code=\t
471*47504Spendry\def\samp #1{`{\tt \rawbackslash \frenchspacing #1}'\null}
472*47504Spendry\def\key #1{{\tt \uppercase{#1}}\null}
473*47504Spendry\def\ctrl #1{{\tt \rawbackslash \hat}#1}
474*47504Spendry
475*47504Spendry\let\file=\samp
476*47504Spendry
477*47504Spendry\def\l#1{{\li #1}\null}		%
478*47504Spendry
479*47504Spendry\def\r#1{{\rm #1}}		% roman font
480*47504Spendry\def\sc#1{{\\smallcaps #1}}	% smallcaps font
481*47504Spendry\def\ii#1{{\it #1}}		% italic font
482*47504Spendry
483*47504Spendry\def\titlefont#1{{\titlerm #1}}
484*47504Spendry
485*47504Spendry% Make altmode in file print out right
486*47504Spendry
487*47504Spendry\catcode `\^^[=\active \def^^[{$\diamondsuit$}
488*47504Spendry
489*47504Spendry\message{page headings,}
490*47504Spendry
491*47504Spendry\newskip\titlepagetopglue \titlepagetopglue = 1.5in
492*47504Spendry\newskip\titlepagebottomglue \titlepagebottomglue = 2pc
493*47504Spendry
494*47504Spendry% First the title page.  Must do @settitle before @titlepage.
495*47504Spendry\font\titlerm = cmbx12 scaled \magstep2
496*47504Spendry\def\titlefont#1{{\titlerm #1}}
497*47504Spendry
498*47504Spendry\newtoks\realeverypar
499*47504Spendry\newif\ifseenauthor
500*47504Spendry
501*47504Spendry\def\titlepage{\begingroup \parindent=0pt \textfonts
502*47504Spendry   \font\subtitlerm = cmr10 scaled \magstephalf
503*47504Spendry   \def\subtitlefont{\subtitlerm \normalbaselineskip = 12pt \normalbaselines}%
504*47504Spendry   %
505*47504Spendry   \font\authorrm = cmbx12 scaled \magstep1
506*47504Spendry   \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines}%
507*47504Spendry   %
508*47504Spendry   % The first subtitle should have some space before it, but not the
509*47504Spendry   % others.  They all should be ragged left.
510*47504Spendry% ??? This code turned off because (1) it is wrong for all old title
511*47504Spendry% pages, and (2) it makes an extra group which never is ended.
512*47504Spendry%   \begingroup \realeverypar = {\leftskip = 2in plus 3em minus 1em
513*47504Spendry%                    \parfillskip = 0pt}%
514*47504Spendry%   \everypar = {\vglue \baselineskip \the\realeverypar
515*47504Spendry%                \everypar={\the\realeverypar}}%
516*47504Spendry   %
517*47504Spendry   % Now you can print the title using @title.
518*47504Spendry   \def\title{\parsearg\titlezzz}%
519*47504Spendry   \def\titlezzz##1{\leftline{\titlefont{##1}
520*47504Spendry		    \vskip4pt \hrule height 4pt \vskip4pt}%
521*47504Spendry   \vglue\titlepagetopglue
522*47504Spendry   %
523*47504Spendry   % Now you can put text using @subtitle.
524*47504Spendry   \def\subtitle{\parsearg\subtitlezzz}%
525*47504Spendry   \def\subtitlezzz##1{{\subtitlefont \rightline{##1}}}%
526*47504Spendry   %
527*47504Spendry   % @author should come last, but may come many times.
528*47504Spendry   \def\author{\parsearg\authorzzz}%
529*47504Spendry   \def\authorzzz##1{\ifseenauthor\else\vskip 0pt plus 1filll\seenauthortrue\fi
530*47504Spendry      {\authorfont \leftline{##1}}}%
531*47504Spendry   %
532*47504Spendry   % Most title ``pages'' are actually two pages long, with space
533*47504Spendry   % at the top of the second.  We don't want the ragged left on the second.
534*47504Spendry   \let\oldpage = \page
535*47504Spendry%   \def\page{\vskip4pt \hrule height 2pt \vskip\titlepagebottomglue
536*47504Spendry%      \oldpage \endgroup\hrule height0pt\relax}%
537*47504Spendry   \def\page{\oldpage \hbox{}}}
538*47504Spendry}
539*47504Spendry
540*47504Spendry\def\Etitlepage{\endgroup\page\HEADINGSon}
541*47504Spendry
542*47504Spendry%%% Set up page headings and footings.
543*47504Spendry
544*47504Spendry\let\thispage=\folio
545*47504Spendry
546*47504Spendry\newtoks \evenheadline    % Token sequence for heading line of even pages
547*47504Spendry\newtoks \oddheadline     % Token sequence for heading line of odd pages
548*47504Spendry\newtoks \evenfootline    % Token sequence for footing line of even pages
549*47504Spendry\newtoks \oddfootline     % Token sequence for footing line of odd pages
550*47504Spendry
551*47504Spendry% Now make Tex use those variables
552*47504Spendry\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline \else \the\evenheadline \fi}}
553*47504Spendry\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline \else \the\evenfootline \fi}}
554*47504Spendry
555*47504Spendry% Commands to set those variables.
556*47504Spendry% For example, this is what  @headings on  does
557*47504Spendry% @evenheading @thistitle|@thispage|@thischapter
558*47504Spendry% @oddheading @thischapter|@thispage|@thistitle
559*47504Spendry% @evenfooting @thisfile||
560*47504Spendry% @oddfooting ||@thisfile
561*47504Spendry
562*47504Spendry\def\evenheading{\parsearg\evenheadingxxx}
563*47504Spendry\def\oddheading{\parsearg\oddheadingxxx}
564*47504Spendry\def\everyheading{\parsearg\everyheadingxxx}
565*47504Spendry
566*47504Spendry\def\evenfooting{\parsearg\evenfootingxxx}
567*47504Spendry\def\oddfooting{\parsearg\oddfootingxxx}
568*47504Spendry\def\everyfooting{\parsearg\everyfootingxxx}
569*47504Spendry
570*47504Spendry{\catcode`\@=0 %
571*47504Spendry
572*47504Spendry\gdef\evenheadingxxx #1{\evenheadingyyy #1@|@|@|@|\finish}
573*47504Spendry\gdef\evenheadingyyy #1@|#2@|#3@|#4\finish{%
574*47504Spendry\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
575*47504Spendry
576*47504Spendry\gdef\oddheadingxxx #1{\oddheadingyyy #1@|@|@|@|\finish}
577*47504Spendry\gdef\oddheadingyyy #1@|#2@|#3@|#4\finish{%
578*47504Spendry\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
579*47504Spendry
580*47504Spendry\gdef\everyheadingxxx #1{\everyheadingyyy #1@|@|@|@|\finish}
581*47504Spendry\gdef\everyheadingyyy #1@|#2@|#3@|#4\finish{%
582*47504Spendry\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}
583*47504Spendry\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
584*47504Spendry
585*47504Spendry\gdef\evenfootingxxx #1{\evenfootingyyy #1@|@|@|@|\finish}
586*47504Spendry\gdef\evenfootingyyy #1@|#2@|#3@|#4\finish{%
587*47504Spendry\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
588*47504Spendry
589*47504Spendry\gdef\oddfootingxxx #1{\oddfootingyyy #1@|@|@|@|\finish}
590*47504Spendry\gdef\oddfootingyyy #1@|#2@|#3@|#4\finish{%
591*47504Spendry\global\oddfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
592*47504Spendry
593*47504Spendry\gdef\everyfootingxxx #1{\everyfootingyyy #1@|@|@|@|\finish}
594*47504Spendry\gdef\everyfootingyyy #1@|#2@|#3@|#4\finish{%
595*47504Spendry\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}
596*47504Spendry\global\oddfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
597*47504Spendry%
598*47504Spendry}% unbind the catcode of @.
599*47504Spendry
600*47504Spendry% @headings double	turns headings on for double-sided printing.
601*47504Spendry% @headings single	turns headings on for single-sided printing.
602*47504Spendry% @headings off		turns them off.
603*47504Spendry% @headings on		same as @headings double, retained for compatibility.
604*47504Spendry% By default, they are off.
605*47504Spendry
606*47504Spendry\def\headings #1 {\csname HEADINGS#1\endcsname}
607*47504Spendry
608*47504Spendry\def\HEADINGSoff{
609*47504Spendry\global\evenheadline={\hfil} \global\evenfootline={\hfil}
610*47504Spendry\global\oddheadline={\hfil} \global\oddfootline={\hfil}}
611*47504Spendry\HEADINGSoff
612*47504Spendry% When we turn headings on, set the page number to 1.
613*47504Spendry% For double-sided printing, put current file name in lower left corner,
614*47504Spendry% chapter name on inside top of right hand pages, document
615*47504Spendry% title on inside top of left hand pages, and page numbers on outside top
616*47504Spendry% edge of all pages.
617*47504Spendry\def\HEADINGSdouble{
618*47504Spendry%\pagealignmacro
619*47504Spendry\global\pageno=1
620*47504Spendry\global\evenfootline={\hfil}
621*47504Spendry\global\oddfootline={\hfil}
622*47504Spendry\global\evenheadline={\line{\folio\hfil\thistitle}}
623*47504Spendry\global\oddheadline={\line{\thischapter\hfil\folio}}
624*47504Spendry}
625*47504Spendry% For single-sided printing, chapter title goes across top left of page,
626*47504Spendry% page number on top right.
627*47504Spendry\def\HEADINGSsingle{
628*47504Spendry%\pagealignmacro
629*47504Spendry\global\pageno=1
630*47504Spendry\global\evenfootline={\hfil}
631*47504Spendry\global\oddfootline={\hfil}
632*47504Spendry\global\evenheadline={\line{\thischapter\hfil\folio}}
633*47504Spendry\global\oddheadline={\line{\thischapter\hfil\folio}}
634*47504Spendry}
635*47504Spendry\def\HEADINGSon{\HEADINGSdouble}
636*47504Spendry
637*47504Spendry% Subroutines used in generating headings
638*47504Spendry% Produces Day Month Year style of output.
639*47504Spendry\def\today{\number\day\space
640*47504Spendry\ifcase\month\or
641*47504SpendryJanuary\or February\or March\or April\or May\or June\or
642*47504SpendryJuly\or August\or September\or October\or November\or December\fi
643*47504Spendry\space\number\year}
644*47504Spendry
645*47504Spendry% Use this if you want the Month Day, Year style of output.
646*47504Spendry%\def\today{\ifcase\month\or
647*47504Spendry%January\or February\or March\or April\or May\or June\or
648*47504Spendry%July\or August\or September\or October\or November\or December\fi
649*47504Spendry%\space\number\day, \number\year}
650*47504Spendry
651*47504Spendry% @settitle line...  specifies the title of the document, for headings
652*47504Spendry% It generates no output of its own
653*47504Spendry
654*47504Spendry\def\thistitle{No Title}
655*47504Spendry\def\settitle{\parsearg\settitlezzz}
656*47504Spendry\def\settitlezzz #1{\gdef\thistitle{#1}}
657*47504Spendry
658*47504Spendry\message{tables,}
659*47504Spendry
660*47504Spendry% Tables -- @table, @ftable, @item(x), @kitem(x), @xitem(x).
661*47504Spendry
662*47504Spendry% default indentation of table text
663*47504Spendry\newdimen\tableindent \tableindent=.8in
664*47504Spendry% default indentation of @itemize and @enumerate text
665*47504Spendry\newdimen\itemindent  \itemindent=.3in
666*47504Spendry% margin between end of table item and start of table text.
667*47504Spendry\newdimen\itemmargin  \itemmargin=.1in
668*47504Spendry
669*47504Spendry% used internally for \itemindent minus \itemmargin
670*47504Spendry\newdimen\itemmax
671*47504Spendry
672*47504Spendry% Note @table and @ftable define @item, @itemx, etc., with these defs.
673*47504Spendry% They also define \itemindex
674*47504Spendry% to index the item name in whatever manner is desired (perhaps none).
675*47504Spendry
676*47504Spendry\def\internalBitem{\smallbreak \parsearg\itemzzz}
677*47504Spendry\def\internalBitemx{\par \parsearg\itemzzz}
678*47504Spendry
679*47504Spendry\def\internalBxitem "#1"{\def\xitemsubtopix{#1} \smallbreak \parsearg\xitemzzz}
680*47504Spendry\def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \par \parsearg\xitemzzz}
681*47504Spendry
682*47504Spendry\def\internalBkitem{\smallbreak \parsearg\kitemzzz}
683*47504Spendry\def\internalBkitemx{\par \parsearg\kitemzzz}
684*47504Spendry
685*47504Spendry\def\kitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \lastfunction}}\itemzzz {#1}}
686*47504Spendry
687*47504Spendry\def\xitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \xitemsubtopic}}\itemzzz {#1}}
688*47504Spendry
689*47504Spendry\def\itemzzz #1{\begingroup %
690*47504Spendry\advance \hsize by -\rightskip %
691*47504Spendry\advance \hsize by -\leftskip %
692*47504Spendry\setbox0=\hbox{\itemfont{#1}}%
693*47504Spendry\itemindex{#1}%
694*47504Spendry\parskip=0in %
695*47504Spendry\noindent %
696*47504Spendry\ifdim \wd0>\itemmax %
697*47504Spendry\vadjust{\penalty 10000}%
698*47504Spendry\hbox to \hsize{\hskip -\tableindent\box0\hss}\ %
699*47504Spendry\else %
700*47504Spendry\hbox to 0pt{\hskip -\tableindent\box0\hss}%
701*47504Spendry\fi %
702*47504Spendry\endgroup %
703*47504Spendry}
704*47504Spendry
705*47504Spendry\def\item{\errmessage{@item while not in a table}}
706*47504Spendry\def\itemx{\errmessage{@itemx while not in a table}}
707*47504Spendry\def\kitem{\errmessage{@kitem while not in a table}}
708*47504Spendry\def\kitemx{\errmessage{@kitemx while not in a table}}
709*47504Spendry\def\xitem{\errmessage{@xitem while not in a table}}
710*47504Spendry\def\xitemx{\errmessage{@xitemx while not in a table}}
711*47504Spendry
712*47504Spendry%% Contains a kludge to get @end[description] to work
713*47504Spendry\def\description{\tablez{\dontindex}{1}{}{}{}{}}
714*47504Spendry
715*47504Spendry\def\table{\begingroup\inENV\obeylines\obeyspaces\tablex}
716*47504Spendry{\obeylines\obeyspaces%
717*47504Spendry\gdef\tablex #1^^M{%
718*47504Spendry\tabley\dontindex#1        \endtabley}}
719*47504Spendry
720*47504Spendry\def\ftable{\begingroup\inENV\obeylines\obeyspaces\ftablex}
721*47504Spendry{\obeylines\obeyspaces%
722*47504Spendry\gdef\ftablex #1^^M{%
723*47504Spendry\tabley\fnitemindex#1        \endtabley}}
724*47504Spendry
725*47504Spendry\def\dontindex #1{}
726*47504Spendry\def\fnitemindex #1{\doind {fn}{\code{#1}}}%
727*47504Spendry
728*47504Spendry{\obeyspaces %
729*47504Spendry\gdef\tabley#1#2 #3 #4 #5 #6 #7\endtabley{\endgroup%
730*47504Spendry\tablez{#1}{#2}{#3}{#4}{#5}{#6}}}
731*47504Spendry
732*47504Spendry\def\tablez #1#2#3#4#5#6{%
733*47504Spendry\aboveenvbreak %
734*47504Spendry\begingroup %
735*47504Spendry\def\Edescription{\Etable}% Neccessary kludge.
736*47504Spendry\let\itemindex=#1%
737*47504Spendry\ifnum 0#3>0 \advance \leftskip by #3\mil \fi %
738*47504Spendry\ifnum 0#4>0 \tableindent=#4\mil \fi %
739*47504Spendry\ifnum 0#5>0 \advance \rightskip by #5\mil \fi %
740*47504Spendry\def\itemfont{#2}%
741*47504Spendry\itemmax=\tableindent %
742*47504Spendry\advance \itemmax by -\itemmargin %
743*47504Spendry\advance \leftskip by \tableindent %
744*47504Spendry\parindent = 0pt
745*47504Spendry\parskip = \smallskipamount
746*47504Spendry\ifdim \parskip=0pt \parskip=2pt \fi%
747*47504Spendry\def\Etable{\endgraf\endgroup\afterenvbreak}%
748*47504Spendry\let\item = \internalBitem %
749*47504Spendry\let\itemx = \internalBitemx %
750*47504Spendry\let\kitem = \internalBkitem %
751*47504Spendry\let\kitemx = \internalBkitemx %
752*47504Spendry\let\xitem = \internalBxitem %
753*47504Spendry\let\xitemx = \internalBxitemx %
754*47504Spendry}
755*47504Spendry
756*47504Spendry% This is the counter used by @enumerate, which is really @itemize
757*47504Spendry
758*47504Spendry\newcount \itemno
759*47504Spendry
760*47504Spendry\def\itemize{\parsearg\itemizezzz}
761*47504Spendry
762*47504Spendry\def\itemizezzz #1{\itemizey {#1}{\Eitemize}}
763*47504Spendry
764*47504Spendry\def\itemizey #1#2{%
765*47504Spendry\aboveenvbreak %
766*47504Spendry\begingroup %
767*47504Spendry\itemno = 0 %
768*47504Spendry\itemmax=\itemindent %
769*47504Spendry\advance \itemmax by -\itemmargin %
770*47504Spendry\advance \leftskip by \itemindent %
771*47504Spendry\parindent = 0pt
772*47504Spendry\parskip = \smallskipamount
773*47504Spendry\ifdim \parskip=0pt \parskip=2pt \fi%
774*47504Spendry\def#2{\endgraf\endgroup\afterenvbreak}%
775*47504Spendry\def\itemcontents{#1}%
776*47504Spendry\let\item=\itemizeitem}
777*47504Spendry
778*47504Spendry\def\bullet{$\ptexbullet$}
779*47504Spendry\def\minus{$-$}
780*47504Spendry
781*47504Spendry\def\enumerate{\itemizey{\the\itemno.}\Eenumerate\flushcr}
782*47504Spendry
783*47504Spendry% Definition of @item while inside @itemize.
784*47504Spendry
785*47504Spendry\def\itemizeitem{%
786*47504Spendry\advance\itemno by 1
787*47504Spendry{\let\par=\endgraf \smallbreak}%
788*47504Spendry\ifhmode \errmessage{\in hmode at itemizeitem}\fi
789*47504Spendry{\parskip=0in \hskip 0pt
790*47504Spendry\hbox to 0pt{\hss \itemcontents\hskip \itemmargin}%
791*47504Spendry\vadjust{\penalty 300}}%
792*47504Spendry\flushcr}
793*47504Spendry
794*47504Spendry\message{indexing,}
795*47504Spendry% Index generation facilities
796*47504Spendry
797*47504Spendry% Define \newwrite to be identical to plain tex's \newwrite
798*47504Spendry% except not \outer, so it can be used within \newindex.
799*47504Spendry{\catcode`\@=11
800*47504Spendry\gdef\newwrite{\alloc@7\write\chardef\sixt@@n}}
801*47504Spendry
802*47504Spendry% \newindex {foo} defines an index named foo.
803*47504Spendry% It automatically defines \fooindex such that
804*47504Spendry% \fooindex ...rest of line... puts an entry in the index foo.
805*47504Spendry% It also defines \fooindfile to be the number of the output channel for
806*47504Spendry% the file that	accumulates this index.  The file's extension is foo.
807*47504Spendry% The name of an index should be no more than 2 characters long
808*47504Spendry% for the sake of vms.
809*47504Spendry
810*47504Spendry\def\newindex #1{
811*47504Spendry\expandafter\newwrite \csname#1indfile\endcsname% Define number for output file
812*47504Spendry\openout \csname#1indfile\endcsname \jobname.#1	% Open the file
813*47504Spendry\expandafter\xdef\csname#1index\endcsname{%	% Define \xxxindex
814*47504Spendry\noexpand\doindex {#1}}
815*47504Spendry}
816*47504Spendry
817*47504Spendry% @defindex foo  ==  \newindex{foo}
818*47504Spendry
819*47504Spendry\def\defindex{\parsearg\newindex}
820*47504Spendry
821*47504Spendry% Define @defcodeindex, like @defindex except put all entries in @code.
822*47504Spendry
823*47504Spendry\def\newcodeindex #1{
824*47504Spendry\expandafter\newwrite \csname#1indfile\endcsname% Define number for output file
825*47504Spendry\openout \csname#1indfile\endcsname \jobname.#1	% Open the file
826*47504Spendry\expandafter\xdef\csname#1index\endcsname{%	% Define \xxxindex
827*47504Spendry\noexpand\docodeindex {#1}}
828*47504Spendry}
829*47504Spendry
830*47504Spendry\def\defcodeindex{\parsearg\newcodeindex}
831*47504Spendry
832*47504Spendry% @synindex foo bar    makes index foo feed into index bar.
833*47504Spendry% Do this instead of @defindex foo if you don't want it as a separate index.
834*47504Spendry\def\synindex #1 #2 {%
835*47504Spendry\expandafter\xdef\csname#1index\endcsname{%	% Define \xxxindex
836*47504Spendry\noexpand\doindex {#2}}%
837*47504Spendry}
838*47504Spendry
839*47504Spendry% @syncodeindex foo bar   similar, but put all entries made for index foo
840*47504Spendry% inside @code.
841*47504Spendry\def\syncodeindex #1 #2 {%
842*47504Spendry\expandafter\xdef\csname#1index\endcsname{%	% Define \xxxindex
843*47504Spendry\noexpand\docodeindex {#2}}%
844*47504Spendry}
845*47504Spendry
846*47504Spendry% Define \doindex, the driver for all \fooindex macros.
847*47504Spendry% Argument #1 is generated by the calling \fooindex macro,
848*47504Spendry%  and it is "foo", the name of the index.
849*47504Spendry
850*47504Spendry% \doindex just uses \parsearg; it calls \doind for the actual work.
851*47504Spendry% This is because \doind is more useful to call from other macros.
852*47504Spendry
853*47504Spendry% There is also \dosubind {index}{topic}{subtopic}
854*47504Spendry% which makes an entry in a two-level index such as the operation index.
855*47504Spendry
856*47504Spendry\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer}
857*47504Spendry\def\singleindexer #1{\doind{\indexname}{#1}}
858*47504Spendry
859*47504Spendry% like the previous two, but they put @code around the argument.
860*47504Spendry\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}
861*47504Spendry\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
862*47504Spendry
863*47504Spendry\def\indexdummies{%
864*47504Spendry\def\bf{\realbackslash bf }%
865*47504Spendry\def\rm{\realbackslash rm }%
866*47504Spendry\def\sl{\realbackslash sl }%
867*47504Spendry\def\dots{\realbackslash dots }%
868*47504Spendry\def\copyright{\realbackslash copyright }%
869*47504Spendry}
870*47504Spendry
871*47504Spendry% \indexnofonts no-ops all font-change commands.
872*47504Spendry% This is used when outputting the strings to sort the index by.
873*47504Spendry\def\indexdummyfont#1{#1}
874*47504Spendry\def\indexnofonts{%
875*47504Spendry\let\code=\indexdummyfont
876*47504Spendry\let\samp=\indexdummyfont
877*47504Spendry\let\kbd=\indexdummyfont
878*47504Spendry\let\key=\indexdummyfont
879*47504Spendry\let\var=\indexdummyfont
880*47504Spendry}
881*47504Spendry
882*47504Spendry% To define \realbackslash, we must make \ not be an escape.
883*47504Spendry% We must first make another character (@) an escape
884*47504Spendry% so we do not become unable to do a definition.
885*47504Spendry
886*47504Spendry{\catcode`\@=0 \catcode`\\=\other
887*47504Spendry@gdef@realbackslash{\}}
888*47504Spendry
889*47504Spendry\let\indexbackslash=0  %overridden during \printindex.
890*47504Spendry
891*47504Spendry\def\doind #1#2{%
892*47504Spendry{\indexdummies % Must do this here, since \bf, etc expand at this stage
893*47504Spendry\count10=\lastpenalty %
894*47504Spendry\escapechar=`\\%
895*47504Spendry{\let\folio=0% Expand all macros now EXCEPT \folio
896*47504Spendry\def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now
897*47504Spendry% so it will be output as is; and it will print as backslash in the indx.
898*47504Spendry%
899*47504Spendry% Now process the index-string once, with all font commands turned off,
900*47504Spendry% to get the string to sort the index by.
901*47504Spendry{\indexnofonts
902*47504Spendry\xdef\temp1{#2}%
903*47504Spendry}%
904*47504Spendry% Now produce the complete index entry.  We process the index-string again,
905*47504Spendry% this time with font commands expanded, to get what to print in the index.
906*47504Spendry\edef\temp{%
907*47504Spendry\write \csname#1indfile\endcsname{%
908*47504Spendry\realbackslash entry {\temp1}{\folio}{#2}}}%
909*47504Spendry\temp }%
910*47504Spendry\penalty\count10}}
911*47504Spendry
912*47504Spendry\def\dosubind #1#2#3{%
913*47504Spendry{\indexdummies % Must do this here, since \bf, etc expand at this stage
914*47504Spendry\count10=\lastpenalty %
915*47504Spendry\escapechar=`\\%
916*47504Spendry{\let\folio=0%
917*47504Spendry\def\rawbackslashxx{\indexbackslash}%
918*47504Spendry%
919*47504Spendry% Now process the index-string once, with all font commands turned off,
920*47504Spendry% to get the string to sort the index by.
921*47504Spendry{\indexnofonts
922*47504Spendry\xdef\temp1{#2 #3}%
923*47504Spendry}%
924*47504Spendry% Now produce the complete index entry.  We process the index-string again,
925*47504Spendry% this time with font commands expanded, to get what to print in the index.
926*47504Spendry\edef\temp{%
927*47504Spendry\write \csname#1indfile\endcsname{%
928*47504Spendry\realbackslash entry {\temp1}{\folio}{#2}{#3}}}%
929*47504Spendry\temp }%
930*47504Spendry\penalty\count10}}
931*47504Spendry
932*47504Spendry% The index entry written in the file actually looks like
933*47504Spendry%  \entry {sortstring}{page}{topic}
934*47504Spendry% or
935*47504Spendry%  \entry {sortstring}{page}{topic}{subtopic}
936*47504Spendry% The texindex program reads in these files and writes files
937*47504Spendry% containing these kinds of lines:
938*47504Spendry%  \initial {c}
939*47504Spendry%     before the first topic whose initial is c
940*47504Spendry%  \entry {topic}{pagelist}
941*47504Spendry%     for a topic that is used without subtopics
942*47504Spendry%  \primary {topic}
943*47504Spendry%     for the beginning of a topic that is used with subtopics
944*47504Spendry%  \secondary {subtopic}{pagelist}
945*47504Spendry%     for each subtopic.
946*47504Spendry
947*47504Spendry% Define the user-accessible indexing commands
948*47504Spendry% @findex, @vindex, @kindex, @cindex.
949*47504Spendry
950*47504Spendry\def\findex {\fnindex}
951*47504Spendry\def\kindex {\kyindex}
952*47504Spendry\def\cindex {\cpindex}
953*47504Spendry\def\vindex {\vrindex}
954*47504Spendry\def\tindex {\tpindex}
955*47504Spendry\def\pindex {\pgindex}
956*47504Spendry
957*47504Spendry\def\cindexsub {\begingroup\obeylines\cindexsub}
958*47504Spendry{\obeylines %
959*47504Spendry\gdef\cindexsub "#1" #2^^M{\endgroup %
960*47504Spendry\dosubind{cp}{#2}{#1}}}
961*47504Spendry
962*47504Spendry% Define the macros used in formatting output of the sorted index material.
963*47504Spendry
964*47504Spendry% This is what you call to cause a particular index to get printed.
965*47504Spendry% Write
966*47504Spendry% @unnumbered Function Index
967*47504Spendry% @printindex fn
968*47504Spendry
969*47504Spendry\def\printindex{\parsearg\doprintindex}
970*47504Spendry
971*47504Spendry\def\doprintindex#1{\tex %
972*47504Spendry\catcode`\%=\other\catcode`\&=\other\catcode`\#=\other
973*47504Spendry\catcode`\$=\other\catcode`\_=\other
974*47504Spendry\catcode`\~=\other
975*47504Spendry\def\indexbackslash{\rawbackslashxx}
976*47504Spendry\indexfonts\rm \tolerance=9500 \advance\baselineskip -1pt
977*47504Spendry\begindoublecolumns
978*47504Spendry\openin 1 \jobname.#1s
979*47504Spendry\ifeof 1 \else \closein 1 \input \jobname.#1s
980*47504Spendry\fi
981*47504Spendry\enddoublecolumns
982*47504Spendry\Etex}
983*47504Spendry
984*47504Spendry% These macros are used by the sorted index file itself.
985*47504Spendry% Change them to control the appearance of the index.
986*47504Spendry
987*47504Spendry% Same as \bigskipamount except no shrink.
988*47504Spendry% \balancecolumns gets confused if there is any shrink.
989*47504Spendry\newskip\initialskipamount \initialskipamount 12pt plus4pt
990*47504Spendry
991*47504Spendry\outer\def\initial #1{%
992*47504Spendry{\let\tentt=\sectt \let\sf=\sectt
993*47504Spendry\ifdim\lastskip<\initialskipamount
994*47504Spendry\removelastskip \penalty-200 \vskip \initialskipamount\fi
995*47504Spendry\line{\secbf#1\hfill}\kern 2pt\penalty3000}}
996*47504Spendry
997*47504Spendry\outer\def\entry #1#2{
998*47504Spendry{\parfillskip=0in \parskip=0in \parindent=0in
999*47504Spendry\hangindent=1in \hangafter=1%
1000*47504Spendry\noindent\hbox{#1}\dotfill #2\par
1001*47504Spendry}}
1002*47504Spendry
1003*47504Spendry\def\primary #1{\line{#1\hfil}}
1004*47504Spendry
1005*47504Spendry\newskip\secondaryindent \secondaryindent=0.5cm
1006*47504Spendry
1007*47504Spendry\def\secondary #1#2{
1008*47504Spendry{\parfillskip=0in \parskip=0in
1009*47504Spendry\hangindent =1in \hangafter=1
1010*47504Spendry\noindent\hskip\secondaryindent\hbox{#1}\dotfill #2\par
1011*47504Spendry}}
1012*47504Spendry
1013*47504Spendry%% Define two-column mode, which is used in indexes.
1014*47504Spendry%% Adapted from the TeXBook, page 416
1015*47504Spendry\catcode `\@=11
1016*47504Spendry
1017*47504Spendry\newbox\partialpage
1018*47504Spendry
1019*47504Spendry\newdimen\doublecolumnhsize  \doublecolumnhsize = 3.11in
1020*47504Spendry\newdimen\doublecolumnvsize  \doublecolumnvsize = 19.1in
1021*47504Spendry
1022*47504Spendry\def\begindoublecolumns{\begingroup
1023*47504Spendry  \output={\global\setbox\partialpage=\vbox{\unvbox255\kern -\topskip \kern \baselineskip}}\eject
1024*47504Spendry  \output={\doublecolumnout} \hsize=\doublecolumnhsize \vsize=\doublecolumnvsize}
1025*47504Spendry\def\enddoublecolumns{\output={\balancecolumns}\eject
1026*47504Spendry  \endgroup \pagegoal=\vsize}
1027*47504Spendry
1028*47504Spendry\def\doublecolumnout{\splittopskip=\topskip \splitmaxdepth=\maxdepth
1029*47504Spendry  \dimen@=\pageheight \advance\dimen@ by-\ht\partialpage
1030*47504Spendry  \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
1031*47504Spendry  \onepageout\pagesofar \unvbox255 \penalty\outputpenalty}
1032*47504Spendry\def\pagesofar{\unvbox\partialpage %
1033*47504Spendry  \hsize=\doublecolumnhsize % have to restore this since output routine
1034*47504Spendry%	      changes it to set cropmarks (P. A. MacKay, 12 Nov. 1986)
1035*47504Spendry  \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}}
1036*47504Spendry\def\balancecolumns{\setbox0=\vbox{\unvbox255} \dimen@=\ht0
1037*47504Spendry  \advance\dimen@ by\topskip \advance\dimen@ by-\baselineskip
1038*47504Spendry  \divide\dimen@ by2 \splittopskip=\topskip
1039*47504Spendry  {\vbadness=10000 \loop \global\setbox3=\copy0
1040*47504Spendry    \global\setbox1=\vsplit3 to\dimen@
1041*47504Spendry    \ifdim\ht3>\dimen@ \global\advance\dimen@ by1pt \repeat}
1042*47504Spendry  \setbox0=\vbox to\dimen@{\unvbox1}  \setbox2=\vbox to\dimen@{\unvbox3}
1043*47504Spendry  \pagesofar}
1044*47504Spendry
1045*47504Spendry\catcode `\@=\other
1046*47504Spendry\message{sectioning,}
1047*47504Spendry% Define chapters, sections, etc.
1048*47504Spendry
1049*47504Spendry\newcount \chapno
1050*47504Spendry\newcount \secno
1051*47504Spendry\newcount \subsecno
1052*47504Spendry\newcount \subsubsecno
1053*47504Spendry
1054*47504Spendry% This counter is funny since it counts through charcodes of letters A, B, ...
1055*47504Spendry\newcount \appendixno  \appendixno = `\@
1056*47504Spendry\def\appendixletter{\char\the\appendixno}
1057*47504Spendry
1058*47504Spendry\newwrite \contentsfile
1059*47504Spendry% This is called from \setfilename.
1060*47504Spendry\def\opencontents{\openout \contentsfile = \jobname.toc}
1061*47504Spendry
1062*47504Spendry% Each @chapter defines this as the name of the chapter.
1063*47504Spendry% page headings and footings can use it.  @section does likewise
1064*47504Spendry
1065*47504Spendry\def\thischapter{} \def\thissection{}
1066*47504Spendry\def\seccheck#1{\if \pageno<0 %
1067*47504Spendry\errmessage{@#1 not allowed after generating table of contents}\fi
1068*47504Spendry%
1069*47504Spendry}
1070*47504Spendry
1071*47504Spendry\outer\def\chapter{\parsearg\chapterzzz}
1072*47504Spendry\def\chapterzzz #1{\seccheck{chapter}%
1073*47504Spendry\secno=0 \subsecno=0 \subsubsecno=0 \global\advance \chapno by 1 \message{Chapter \the\chapno}%
1074*47504Spendry\chapmacro {#1}{\the\chapno}%
1075*47504Spendry\gdef\thissection{#1}\gdef\thischapter{#1}%
1076*47504Spendry\let\rawbackslash=\relax%
1077*47504Spendry\let\frenchspacing=\relax%
1078*47504Spendry\edef\temp{{\realbackslash chapentry {#1}{\the\chapno}{\noexpand\folio}}}%
1079*47504Spendry\escapechar=`\\%
1080*47504Spendry\write \contentsfile \temp  %
1081*47504Spendry\donoderef %
1082*47504Spendry}
1083*47504Spendry
1084*47504Spendry\outer\def\appendix{\parsearg\appendixzzz}
1085*47504Spendry\def\appendixzzz #1{\seccheck{appendix}%
1086*47504Spendry\secno=0 \subsecno=0 \subsubsecno=0 \global\advance \appendixno by 1 \message{Appendix \appendixletter}%
1087*47504Spendry\chapmacro {#1}{Appendix \appendixletter}%
1088*47504Spendry\gdef\thischapter{#1}\gdef\thissection{#1}%
1089*47504Spendry\let\rawbackslash=\relax%
1090*47504Spendry\let\frenchspacing=\relax%
1091*47504Spendry\edef\temp{{\realbackslash chapentry {#1}{Appendix \appendixletter}{\noexpand\folio}}}%
1092*47504Spendry\escapechar=`\\%
1093*47504Spendry\write \contentsfile \temp  %
1094*47504Spendry\unnumbnoderef %
1095*47504Spendry}
1096*47504Spendry
1097*47504Spendry\outer\def\unnumbered{\parsearg\unnumberedzzz}
1098*47504Spendry\def\unnumberedzzz #1{\seccheck{unnumbered}%
1099*47504Spendry\secno=0 \subsecno=0 \subsubsecno=0 \message{(#1)}
1100*47504Spendry\unnumbchapmacro {#1}%
1101*47504Spendry\gdef\thischapter{#1}\gdef\thissection{#1}%
1102*47504Spendry\let\rawbackslash=\relax%
1103*47504Spendry\let\frenchspacing=\relax%
1104*47504Spendry\edef\temp{{\realbackslash unnumbchapentry {#1}{\noexpand\folio}}}%
1105*47504Spendry\escapechar=`\\%
1106*47504Spendry\write \contentsfile \temp  %
1107*47504Spendry\unnumbnoderef %
1108*47504Spendry}
1109*47504Spendry
1110*47504Spendry\outer\def\section{\parsearg\sectionzzz}
1111*47504Spendry\def\sectionzzz #1{\seccheck{section}%
1112*47504Spendry\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
1113*47504Spendry\gdef\thissection{#1}\secheading {#1}{\the\chapno}{\the\secno}%
1114*47504Spendry\let\rawbackslash=\relax%
1115*47504Spendry\let\frenchspacing=\relax%
1116*47504Spendry\edef\temp{{\realbackslash secentry %
1117*47504Spendry{#1}{\the\chapno}{\the\secno}{\noexpand\folio}}}%
1118*47504Spendry\escapechar=`\\%
1119*47504Spendry\write \contentsfile \temp %
1120*47504Spendry\donoderef %
1121*47504Spendry\penalty 10000 %
1122*47504Spendry}
1123*47504Spendry
1124*47504Spendry\outer\def\appendixsection{\parsearg\appendixsectionzzz}
1125*47504Spendry\outer\def\appendixsec{\parsearg\appendixsectionzzz}
1126*47504Spendry\def\appendixsectionzzz #1{\seccheck{appendixsection}%
1127*47504Spendry\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
1128*47504Spendry\gdef\thissection{#1}\secheading {#1}{\appendixletter}{\the\secno}%
1129*47504Spendry\let\rawbackslash=\relax%
1130*47504Spendry\let\frenchspacing=\relax%
1131*47504Spendry\edef\temp{{\realbackslash secentry %
1132*47504Spendry{#1}{\appendixletter}{\the\secno}{\noexpand\folio}}}%
1133*47504Spendry\escapechar=`\\%
1134*47504Spendry\write \contentsfile \temp %
1135*47504Spendry\unnumbnoderef %
1136*47504Spendry\penalty 10000 %
1137*47504Spendry}
1138*47504Spendry
1139*47504Spendry\outer\def\unnumberedsec{\parsearg\unnumberedseczzz}
1140*47504Spendry\def\unnumberedseczzz #1{\seccheck{unnumberedsec}%
1141*47504Spendry\plainsecheading {#1}\gdef\thissection{#1}%
1142*47504Spendry\let\rawbackslash=\relax%
1143*47504Spendry\let\frenchspacing=\relax%
1144*47504Spendry\edef\temp{{\realbackslash unnumbsecentry{#1}{\noexpand\folio}}}%
1145*47504Spendry\escapechar=`\\%
1146*47504Spendry\write \contentsfile \temp %
1147*47504Spendry\unnumbnoderef %
1148*47504Spendry\penalty 10000 %
1149*47504Spendry}
1150*47504Spendry
1151*47504Spendry\outer\def\subsection{\parsearg\subsectionzzz}
1152*47504Spendry\def\subsectionzzz #1{\seccheck{subsection}%
1153*47504Spendry\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
1154*47504Spendry\subsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}%
1155*47504Spendry\let\rawbackslash=\relax%
1156*47504Spendry\let\frenchspacing=\relax%
1157*47504Spendry\edef\temp{{\realbackslash subsecentry %
1158*47504Spendry{#1}{\the\chapno}{\the\secno}{\the\subsecno}{\noexpand\folio}}}%
1159*47504Spendry\escapechar=`\\%
1160*47504Spendry\write \contentsfile \temp %
1161*47504Spendry\donoderef %
1162*47504Spendry\penalty 10000 %
1163*47504Spendry}
1164*47504Spendry
1165*47504Spendry\outer\def\appendixsubsec{\parsearg\appendixsubseczzz}
1166*47504Spendry\def\appendixsubseczzz #1{\seccheck{appendixsubsec}%
1167*47504Spendry\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
1168*47504Spendry\subsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}%
1169*47504Spendry\let\rawbackslash=\relax%
1170*47504Spendry\let\frenchspacing=\relax%
1171*47504Spendry\edef\temp{{\realbackslash subsecentry %
1172*47504Spendry{#1}{\appendixletter}{\the\secno}{\the\subsecno}{\noexpand\folio}}}%
1173*47504Spendry\escapechar=`\\%
1174*47504Spendry\write \contentsfile \temp %
1175*47504Spendry\unnumbnoderef %
1176*47504Spendry\penalty 10000 %
1177*47504Spendry}
1178*47504Spendry
1179*47504Spendry\outer\def\unnumberedsubsec{\parsearg\unnumberedsubseczzz}
1180*47504Spendry\def\unnumberedsubseczzz #1{\seccheck{unnumberedsubsec}%
1181*47504Spendry\plainsecheading {#1}\gdef\thissection{#1}%
1182*47504Spendry\let\rawbackslash=\relax%
1183*47504Spendry\let\frenchspacing=\relax%
1184*47504Spendry\edef\temp{{\realbackslash unnumbsubsecentry{#1}{\noexpand\folio}}}%
1185*47504Spendry\escapechar=`\\%
1186*47504Spendry\write \contentsfile \temp %
1187*47504Spendry\unnumbnoderef %
1188*47504Spendry\penalty 10000 %
1189*47504Spendry}
1190*47504Spendry
1191*47504Spendry\outer\def\subsubsection{\parsearg\subsubsectionzzz}
1192*47504Spendry\def\subsubsectionzzz #1{\seccheck{subsubsection}%
1193*47504Spendry\gdef\thissection{#1}\global\advance \subsubsecno by 1 %
1194*47504Spendry\subsubsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
1195*47504Spendry\let\rawbackslash=\relax%
1196*47504Spendry\let\frenchspacing=\relax%
1197*47504Spendry\edef\temp{{\realbackslash subsubsecentry %
1198*47504Spendry{#1}{\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}{\noexpand\folio}}}%\
1199*47504Spendry\escapechar=`\\%
1200*47504Spendry\write \contentsfile \temp %
1201*47504Spendry\donoderef %
1202*47504Spendry\penalty 10000 %
1203*47504Spendry}
1204*47504Spendry
1205*47504Spendry\outer\def\appendixsubsubsec{\parsearg\appendixsubsubseczzz}
1206*47504Spendry\def\appendixsubsubseczzz #1{\seccheck{appendixsubsubsec}%
1207*47504Spendry\gdef\thissection{#1}\global\advance \subsubsecno by 1 %
1208*47504Spendry\subsubsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
1209*47504Spendry\let\rawbackslash=\relax%
1210*47504Spendry\let\frenchspacing=\relax%
1211*47504Spendry\edef\temp{{\realbackslash subsubsecentry{#1}%
1212*47504Spendry{\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}{\noexpand\folio}}}%\
1213*47504Spendry\escapechar=`\\%
1214*47504Spendry\write \contentsfile \temp %
1215*47504Spendry\unnumbnoderef %
1216*47504Spendry\penalty 10000 %
1217*47504Spendry}
1218*47504Spendry
1219*47504Spendry\outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz}
1220*47504Spendry\def\unnumberedsubsubseczzz #1{\seccheck{unnumberedsubsubsec}%
1221*47504Spendry\plainsecheading {#1}\gdef\thissection{#1}%
1222*47504Spendry\let\rawbackslash=\relax%
1223*47504Spendry\let\frenchspacing=\relax%
1224*47504Spendry\edef\temp{{\realbackslash unnumbsubsubsecentry{#1}{\noexpand\folio}}}%
1225*47504Spendry\escapechar=`\\%
1226*47504Spendry\write \contentsfile \temp %
1227*47504Spendry\unnumbnoderef %
1228*47504Spendry\penalty 10000 %
1229*47504Spendry}
1230*47504Spendry
1231*47504Spendry% These are variants which are not "outer", so they can appear in @ifinfo.
1232*47504Spendry\def\infounnumbered{\parsearg\unnumberedzzz}
1233*47504Spendry\def\infounnumberedsec{\parsearg\unnumberedseczzz}
1234*47504Spendry\def\infounnumberedsubsec{\parsearg\unnumberedsubseczzz}
1235*47504Spendry\def\infounnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz}
1236*47504Spendry
1237*47504Spendry\def\infoappendix{\parsearg\appendixzzz}
1238*47504Spendry\def\infoappendixsec{\parsearg\appendixseczzz}
1239*47504Spendry\def\infoappendixsubsec{\parsearg\appendixsubseczzz}
1240*47504Spendry\def\infoappendixsubsubsec{\parsearg\appendixsubsubseczzz}
1241*47504Spendry
1242*47504Spendry\def\infochapter{\parsearg\chapterzzz}
1243*47504Spendry\def\infosection{\parsearg\sectionzzz}
1244*47504Spendry\def\infosubsection{\parsearg\subsectionzzz}
1245*47504Spendry\def\infosubsubsection{\parsearg\subsubsectionzzz}
1246*47504Spendry
1247*47504Spendry% Define @majorheading, @heading and @subheading
1248*47504Spendry
1249*47504Spendry\def\majorheading #1{%
1250*47504Spendry{\advance\chapheadingskip by 10pt \chapbreak }%
1251*47504Spendry{\chapfonts \line{\rm #1\hfill}}\bigskip \par\penalty 200}
1252*47504Spendry
1253*47504Spendry\def\chapheading #1{\chapbreak %
1254*47504Spendry{\chapfonts \line{\rm #1\hfill}}\bigskip \par\penalty 200}
1255*47504Spendry
1256*47504Spendry\def\heading{\parsearg\secheadingi}
1257*47504Spendry
1258*47504Spendry% These macros generate a chapter, section, etc. heading only
1259*47504Spendry% (including whitespace, linebreaking, etc. around it),
1260*47504Spendry% given all the information in convenient, parsed form.
1261*47504Spendry
1262*47504Spendry%%% Args are the skip and penalty (usually negative)
1263*47504Spendry\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
1264*47504Spendry
1265*47504Spendry\def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
1266*47504Spendry
1267*47504Spendry%%% Define plain chapter starts, and page on/off switching for it
1268*47504Spendry% Parameter controlling skip before chapter headings (if needed)
1269*47504Spendry
1270*47504Spendry\newskip \chapheadingskip \chapheadingskip = 30pt plus 8pt minus 4pt
1271*47504Spendry
1272*47504Spendry\def\chapbreak{\dobreak \chapheadingskip {-4000}}
1273*47504Spendry\def\chappager{\par\vfill\supereject}
1274*47504Spendry\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi}
1275*47504Spendry
1276*47504Spendry\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
1277*47504Spendry
1278*47504Spendry\def\CHAPPAGoff{
1279*47504Spendry\global\let\pchapsepmacro=\chapbreak
1280*47504Spendry\global\let\pagealignmacro=\chappager}
1281*47504Spendry
1282*47504Spendry\def\CHAPPAGon{
1283*47504Spendry\global\let\pchapsepmacro=\chappager
1284*47504Spendry\global\let\pagealignmacro=\chappager
1285*47504Spendry\global\def\HEADINGSon{\HEADINGSsingle}}
1286*47504Spendry
1287*47504Spendry\def\CHAPPAGodd{
1288*47504Spendry\global\let\pchapsepmacro=\chapoddpage
1289*47504Spendry\global\let\pagealignmacro=\chapoddpage
1290*47504Spendry\global\def\HEADINGSon{\HEADINGSdouble}}
1291*47504Spendry
1292*47504Spendry\CHAPPAGon
1293*47504Spendry
1294*47504Spendry\def\CHAPFplain{
1295*47504Spendry\global\let\chapmacro=\chfplain
1296*47504Spendry\global\let\unnumbchapmacro=\unnchfplain}
1297*47504Spendry
1298*47504Spendry\def\chfplain #1#2{%
1299*47504Spendry\pchapsepmacro %
1300*47504Spendry{\chapfonts \line{\rm #2.\enspace #1\hfill}}\bigskip \par\penalty 5000 %
1301*47504Spendry}
1302*47504Spendry
1303*47504Spendry\def\unnchfplain #1{%
1304*47504Spendry\pchapsepmacro %
1305*47504Spendry{\chapfonts \line{\rm #1\hfill}}\bigskip \par\penalty 10000 %
1306*47504Spendry}
1307*47504Spendry\CHAPFplain % The default
1308*47504Spendry
1309*47504Spendry\def\unnchfopen #1{%
1310*47504Spendry\chapoddpage {\chapfonts \line{\rm #1\hfill}}\bigskip \par\penalty 10000 %
1311*47504Spendry}
1312*47504Spendry
1313*47504Spendry\def\chfopen #1#2{\chapoddpage {\chapfonts
1314*47504Spendry\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
1315*47504Spendry\par\penalty 5000 %
1316*47504Spendry}
1317*47504Spendry
1318*47504Spendry\def\CHAPFopen{
1319*47504Spendry\global\let\chapmacro=\chfopen
1320*47504Spendry\global\let\unnumbchapmacro=\unnchfopen}
1321*47504Spendry
1322*47504Spendry% Parameter controlling skip before section headings.
1323*47504Spendry
1324*47504Spendry\newskip \subsecheadingskip  \subsecheadingskip = 17pt plus 8pt minus 4pt
1325*47504Spendry\def\subsecheadingbreak{\dobreak \subsecheadingskip {-500}}
1326*47504Spendry
1327*47504Spendry\newskip \secheadingskip  \secheadingskip = 21pt plus 8pt minus 4pt
1328*47504Spendry\def\secheadingbreak{\dobreak \secheadingskip {-1000}}
1329*47504Spendry
1330*47504Spendry
1331*47504Spendry% Section fonts are the base font at magstep2, which produces
1332*47504Spendry% a size a bit more than 14 points in the default situation.
1333*47504Spendry
1334*47504Spendry\def\secheading #1#2#3{\secheadingi {#2.#3\enspace #1}}
1335*47504Spendry\def\plainsecheading #1{\secheadingi {#1}}
1336*47504Spendry\def\secheadingi #1{{\advance \secheadingskip by \parskip %
1337*47504Spendry\secheadingbreak}%
1338*47504Spendry{\secfonts \line{\rm #1\hfill}}%
1339*47504Spendry\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000 }
1340*47504Spendry
1341*47504Spendry
1342*47504Spendry% Subsection fonts are the base font at magstep1,
1343*47504Spendry% which produces a size of 12 points.
1344*47504Spendry
1345*47504Spendry\def\subsecheading #1#2#3#4{{\advance \subsecheadingskip by \parskip %
1346*47504Spendry\subsecheadingbreak}%
1347*47504Spendry{\subsecfonts \line{\rm#2.#3.#4\enspace #1\hfill}}%
1348*47504Spendry\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000 }
1349*47504Spendry
1350*47504Spendry\def\subsubsecfonts{\subsecfonts} % Maybe this should change:
1351*47504Spendry				  % Perhaps make sssec fonts scaled
1352*47504Spendry				  % magstep half
1353*47504Spendry\def\subsubsecheading #1#2#3#4#5{{\advance \subsecheadingskip by \parskip %
1354*47504Spendry\subsecheadingbreak}%
1355*47504Spendry{\subsubsecfonts \line{\rm#2.#3.#4.#5\enspace #1\hfill}}%
1356*47504Spendry\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000}
1357*47504Spendry
1358*47504Spendry
1359*47504Spendry\message{toc printing,}
1360*47504Spendry
1361*47504Spendry% Finish up the main text and prepare to read what we've written
1362*47504Spendry% to \contentsfile.
1363*47504Spendry
1364*47504Spendry\def\startcontents#1{%
1365*47504Spendry   \ifnum \pageno>0
1366*47504Spendry      \pagealignmacro
1367*47504Spendry      \immediate\closeout \contentsfile
1368*47504Spendry      \pageno = -1		% Request roman numbered pages.
1369*47504Spendry   \fi
1370*47504Spendry   \unnumbchapmacro{#1}\def\thischapter{#1}%
1371*47504Spendry   \begingroup   		% Set up to handle contents files properly.
1372*47504Spendry      \catcode`\\=0  \catcode`\{=1  \catcode`\}=2  \catcode`\@=11
1373*47504Spendry      \raggedbottom             % Worry more about breakpoints than the bottom.
1374*47504Spendry      \advance\hsize by -1in    % Don't use the full line length.
1375*47504Spendry}
1376*47504Spendry
1377*47504Spendry
1378*47504Spendry% Normal (long) toc.
1379*47504Spendry\outer\def\contents{%
1380*47504Spendry   \startcontents{Table of Contents}%
1381*47504Spendry      \input \jobname.toc
1382*47504Spendry   \endgroup
1383*47504Spendry   \vfill \eject
1384*47504Spendry}
1385*47504Spendry
1386*47504Spendry% And just the chapters.
1387*47504Spendry\outer\def\summarycontents{%
1388*47504Spendry   \startcontents{Short Contents}%
1389*47504Spendry      %
1390*47504Spendry      \let\chapentry = \shortchapentry
1391*47504Spendry      \let\unnumbchapentry = \shortunnumberedentry
1392*47504Spendry      % We want a true roman here for the page numbers.
1393*47504Spendry      \secfonts \let\rm = \truesecrm \rm
1394*47504Spendry      \advance\baselineskip by 1pt % Open it up a little.
1395*47504Spendry      \def\secentry ##1##2##3##4{}
1396*47504Spendry      \def\unnumbsecentry ##1##2{}
1397*47504Spendry      \def\subsecentry ##1##2##3##4##5{}
1398*47504Spendry      \def\unnumbsubsecentry ##1##2{}
1399*47504Spendry      \def\subsubsecentry ##1##2##3##4##5##6{}
1400*47504Spendry      \def\unnumbsubsubsecentry ##1##2{}
1401*47504Spendry      \input \jobname.toc
1402*47504Spendry   \endgroup
1403*47504Spendry   \vfill \eject
1404*47504Spendry}
1405*47504Spendry\let\shortcontents = \summarycontents
1406*47504Spendry
1407*47504Spendry% These macros generate individual entries in the table of contents.
1408*47504Spendry% The first argument is the chapter or section name.
1409*47504Spendry% The last argument is the page number.
1410*47504Spendry% The arguments in between are the chapter number, section number, ...
1411*47504Spendry
1412*47504Spendry% Chapter-level things, for both the long and short contents.
1413*47504Spendry\def\chapentry#1#2#3{\dochapentry{#2\labelspace#1}{#3}}
1414*47504Spendry\def\shortchapentry#1#2#3{%
1415*47504Spendry   \line{{#2\labelspace #1}\dotfill\doshortpageno{#3}}%
1416*47504Spendry}
1417*47504Spendry
1418*47504Spendry\def\unnumbchapentry#1#2{\dochapentry{#1}{#2}}
1419*47504Spendry\def\shortunnumberedentry#1#2{%
1420*47504Spendry   \line{#1\dotfill\doshortpageno{#2}}%
1421*47504Spendry}
1422*47504Spendry
1423*47504Spendry% Sections.
1424*47504Spendry\def\secentry#1#2#3#4{\dosecentry{#2.#3\labelspace#1}{#4}}
1425*47504Spendry\def\unnumbsecentry#1#2{\dosecentry{#1}{#2}}
1426*47504Spendry
1427*47504Spendry% Subsections.
1428*47504Spendry\def\subsecentry#1#2#3#4#5{\dosubsecentry{#2.#3.#4\labelspace#1}{#5}}
1429*47504Spendry\def\unnumbsubsecentry#1#2{\dosubsecentry{#1}{#2}}
1430*47504Spendry
1431*47504Spendry% And subsubsections.
1432*47504Spendry\def\subsubsecentry#1#2#3#4#5#6{\dosubsubsecentry{#2.#3.#4.#5\labelspace#1}{#6}}
1433*47504Spendry\def\unnumbsubsecentry#1#2{\dosubsubsecentry{#1}{#2}}
1434*47504Spendry
1435*47504Spendry
1436*47504Spendry% This parameter controls the indentation of the various levels.
1437*47504Spendry\newdimen\tocindent \tocindent = 3pc
1438*47504Spendry
1439*47504Spendry% Now for the actual typesetting. In all these, #1 is the text and #2 is the
1440*47504Spendry% page number.
1441*47504Spendry%
1442*47504Spendry% If the toc has to be broken over pages, we would want to be at chapters
1443*47504Spendry% if at all possible; hence the \penalty.
1444*47504Spendry\def\dochapentry#1#2{%
1445*47504Spendry   \penalty-300 \vskip\baselineskip
1446*47504Spendry   \line{\chapentryfonts #1\dotfill \dopageno{#2}}%
1447*47504Spendry   \nobreak\vskip .25\baselineskip
1448*47504Spendry}
1449*47504Spendry
1450*47504Spendry\def\dosecentry#1#2{%
1451*47504Spendry   \line{\secentryfonts \hskip\tocindent #1\dotfill \dopageno{#2}}%
1452*47504Spendry}
1453*47504Spendry
1454*47504Spendry\def\dosubsecentry#1#2{%
1455*47504Spendry   \line{\subsecentryfonts \hskip2\tocindent #1\dotfill \dopageno{#2}}%
1456*47504Spendry}
1457*47504Spendry
1458*47504Spendry\def\dosubsubsecentry#1#2{%
1459*47504Spendry   \line{\subsubsecentryfonts \hskip3\tocindent #1\dotfill \dopageno{#2}}%
1460*47504Spendry}
1461*47504Spendry
1462*47504Spendry% Space between chapter (or whatever) number and the title.
1463*47504Spendry\def\labelspace{\hskip1em \relax}
1464*47504Spendry
1465*47504Spendry\def\dopageno#1{{\rm #1}}
1466*47504Spendry\def\doshortpageno#1{{\rm #1}}
1467*47504Spendry
1468*47504Spendry\def\chapentryfonts{\secfonts \let\rm = \sf \sf}
1469*47504Spendry\def\secentryfonts{\textfonts}
1470*47504Spendry\let\subsecentryfonts = \textfonts
1471*47504Spendry\let\subsubsecentryfonts = \textfonts
1472*47504Spendry
1473*47504Spendry
1474*47504Spendry\message{environments,}
1475*47504Spendry
1476*47504Spendry% @tex ... @end tex    escapes into raw Tex temporarily.
1477*47504Spendry% One exception: @ is still an escape character, so that @end tex works.
1478*47504Spendry% But \@ or @@ will get a plain tex @ character.
1479*47504Spendry
1480*47504Spendry\def\tex{\begingroup
1481*47504Spendry\catcode `\\=0 \catcode `\{=1 \catcode `\}=2
1482*47504Spendry\catcode `\$=3 \catcode `\&=4 \catcode `\#=6
1483*47504Spendry\catcode `\^=7 \catcode `\_=8 \catcode `\~=13 \let~=\tie
1484*47504Spendry\catcode `\%=14
1485*47504Spendry\catcode`\"=12
1486*47504Spendry\catcode`\|=12
1487*47504Spendry\catcode`\<=12
1488*47504Spendry\catcode`\>=12
1489*47504Spendry\escapechar=`\\
1490*47504Spendry%
1491*47504Spendry\let\{=\ptexlbrace
1492*47504Spendry\let\}=\ptexrbrace
1493*47504Spendry\let\.=\ptexdot
1494*47504Spendry\let\*=\ptexstar
1495*47504Spendry\def\@={@}%
1496*47504Spendry\let\bullet=\ptexbullet
1497*47504Spendry\let\b=\ptexb \let\c=\ptexc \let\i=\ptexi \let\t=\ptext \let\l=\ptexl
1498*47504Spendry\let\L=\ptexL
1499*47504Spendry%
1500*47504Spendry\let\Etex=\endgroup}
1501*47504Spendry
1502*47504Spendry% Define @lisp ... @endlisp.
1503*47504Spendry% @lisp does a \begingroup so it can rebind things,
1504*47504Spendry% including the definition of @endlisp (which normally is erroneous).
1505*47504Spendry
1506*47504Spendry% Amount to narrow the margins by for @lisp.
1507*47504Spendry\newskip\lispnarrowing \lispnarrowing=0.4in
1508*47504Spendry
1509*47504Spendry% This is the definition that ^M gets inside @lisp
1510*47504Spendry% phr: changed space to \null, to avoid overfull hbox problems.
1511*47504Spendry{\obeyspaces%
1512*47504Spendry\gdef\lisppar{\null\endgraf}}
1513*47504Spendry
1514*47504Spendry% Cause \obeyspaces to make each Space cause a word-separation
1515*47504Spendry% rather than the default which is that it acts punctuation.
1516*47504Spendry% This is because space in tt font looks funny.
1517*47504Spendry{\obeyspaces %
1518*47504Spendry\gdef\sepspaces{\def {\ }}}
1519*47504Spendry
1520*47504Spendry\newskip\aboveenvskipamount \aboveenvskipamount= 0pt
1521*47504Spendry\def\aboveenvbreak{{\advance\aboveenvskipamount by \parskip
1522*47504Spendry\endgraf \ifdim\lastskip<\aboveenvskipamount
1523*47504Spendry\removelastskip \penalty-50 \vskip\aboveenvskipamount \fi}}
1524*47504Spendry
1525*47504Spendry\def\afterenvbreak{\endgraf \ifdim\lastskip<\aboveenvskipamount
1526*47504Spendry\removelastskip \penalty-50 \vskip\aboveenvskipamount \fi}
1527*47504Spendry
1528*47504Spendry\def\lisp{\aboveenvbreak\begingroup\inENV %This group ends at the end of the @lisp body
1529*47504Spendry\hfuzz=12truept % Don't be fussy
1530*47504Spendry% Make spaces be word-separators rather than space tokens.
1531*47504Spendry\sepspaces %
1532*47504Spendry% Single space lines
1533*47504Spendry\singlespace %
1534*47504Spendry% The following causes blank lines not to be ignored
1535*47504Spendry% by adding a space to the end of each line.
1536*47504Spendry\let\par=\lisppar
1537*47504Spendry\def\Elisp{\endgroup\afterenvbreak}%
1538*47504Spendry\parskip=0pt
1539*47504Spendry\advance \leftskip by \lispnarrowing
1540*47504Spendry\parindent=0pt
1541*47504Spendry\let\exdent=\internalexdent
1542*47504Spendry\obeyspaces \obeylines \tt \rawbackslash
1543*47504Spendry\def\next##1{}\next}
1544*47504Spendry
1545*47504Spendry
1546*47504Spendry\let\example=\lisp
1547*47504Spendry\def\Eexample{\Elisp}
1548*47504Spendry
1549*47504Spendry\let\smallexample=\lisp
1550*47504Spendry\def\Esmallexample{\Elisp}
1551*47504Spendry
1552*47504Spendry% Macro for 9 pt. examples, necessary to print with 5" lines.
1553*47504Spendry% From Pavel@xerox.  This is not really used unless the
1554*47504Spendry% @smallbook command is given.
1555*47504Spendry
1556*47504Spendry\def\smalllispx{\aboveenvbreak\begingroup\inENV
1557*47504Spendry%			This group ends at the end of the @lisp body
1558*47504Spendry\hfuzz=12truept % Don't be fussy
1559*47504Spendry% Make spaces be word-separators rather than space tokens.
1560*47504Spendry\sepspaces %
1561*47504Spendry% Single space lines
1562*47504Spendry\singlespace %
1563*47504Spendry% The following causes blank lines not to be ignored
1564*47504Spendry% by adding a space to the end of each line.
1565*47504Spendry\let\par=\lisppar
1566*47504Spendry\def\Esmalllisp{\endgroup\afterenvbreak}%
1567*47504Spendry\parskip=0pt
1568*47504Spendry\advance \leftskip by \lispnarrowing
1569*47504Spendry\parindent=0pt
1570*47504Spendry\let\exdent=\internalexdent
1571*47504Spendry\obeyspaces \obeylines \ninett \rawbackslash
1572*47504Spendry\def\next##1{}\next}
1573*47504Spendry
1574*47504Spendry% This is @display; same as @lisp except use roman font.
1575*47504Spendry
1576*47504Spendry\def\display{\begingroup\inENV %This group ends at the end of the @display body
1577*47504Spendry\aboveenvbreak
1578*47504Spendry% Make spaces be word-separators rather than space tokens.
1579*47504Spendry\sepspaces %
1580*47504Spendry% Single space lines
1581*47504Spendry\singlespace %
1582*47504Spendry% The following causes blank lines not to be ignored
1583*47504Spendry% by adding a space to the end of each line.
1584*47504Spendry\let\par=\lisppar
1585*47504Spendry\def\Edisplay{\endgroup\afterenvbreak}%
1586*47504Spendry\parskip=0pt
1587*47504Spendry\advance \leftskip by \lispnarrowing
1588*47504Spendry\parindent=0pt
1589*47504Spendry\let\exdent=\internalexdent
1590*47504Spendry\obeyspaces \obeylines
1591*47504Spendry\def\next##1{}\next}
1592*47504Spendry
1593*47504Spendry% This is @format; same as @lisp except use roman font and don't narrow margins
1594*47504Spendry
1595*47504Spendry\def\format{\begingroup\inENV %This group ends at the end of the @format body
1596*47504Spendry\aboveenvbreak
1597*47504Spendry% Make spaces be word-separators rather than space tokens.
1598*47504Spendry\sepspaces %
1599*47504Spendry\singlespace %
1600*47504Spendry% The following causes blank lines not to be ignored
1601*47504Spendry% by adding a space to the end of each line.
1602*47504Spendry\let\par=\lisppar
1603*47504Spendry\def\Eformat{\endgroup\afterenvbreak}
1604*47504Spendry\parskip=0pt \parindent=0pt
1605*47504Spendry\obeyspaces \obeylines
1606*47504Spendry\def\next##1{}\next}
1607*47504Spendry
1608*47504Spendry% @flushleft and @flushright
1609*47504Spendry
1610*47504Spendry\def\flushleft{\begingroup\inENV %This group ends at the end of the @format body
1611*47504Spendry\aboveenvbreak
1612*47504Spendry% Make spaces be word-separators rather than space tokens.
1613*47504Spendry\sepspaces %
1614*47504Spendry% The following causes blank lines not to be ignored
1615*47504Spendry% by adding a space to the end of each line.
1616*47504Spendry% This also causes @ to work when the directive name
1617*47504Spendry% is terminated by end of line.
1618*47504Spendry\let\par=\lisppar
1619*47504Spendry\def\Eflushleft{\endgroup\afterenvbreak}%
1620*47504Spendry\parskip=0pt \parindent=0pt
1621*47504Spendry\obeyspaces \obeylines
1622*47504Spendry\def\next##1{}\next}
1623*47504Spendry
1624*47504Spendry\def\flushright{\begingroup\inENV %This group ends at the end of the @format body
1625*47504Spendry\aboveenvbreak
1626*47504Spendry% Make spaces be word-separators rather than space tokens.
1627*47504Spendry\sepspaces %
1628*47504Spendry% The following causes blank lines not to be ignored
1629*47504Spendry% by adding a space to the end of each line.
1630*47504Spendry% This also causes @ to work when the directive name
1631*47504Spendry% is terminated by end of line.
1632*47504Spendry\let\par=\lisppar
1633*47504Spendry\def\Eflushright{\endgroup\afterenvbreak}%
1634*47504Spendry\parskip=0pt \parindent=0pt
1635*47504Spendry\advance \leftskip by 0pt plus 1fill
1636*47504Spendry\obeyspaces \obeylines
1637*47504Spendry\def\next##1{}\next}
1638*47504Spendry
1639*47504Spendry% @quotation - narrow the margins.
1640*47504Spendry
1641*47504Spendry\def\quotation{\begingroup\inENV %This group ends at the end of the @quotation body
1642*47504Spendry{\parskip=0pt  % because we will skip by \parskip too, later
1643*47504Spendry\aboveenvbreak}%
1644*47504Spendry\singlespace
1645*47504Spendry\parindent=0pt
1646*47504Spendry\def\Equotation{\par\endgroup\afterenvbreak}%
1647*47504Spendry\advance \rightskip by \lispnarrowing
1648*47504Spendry\advance \leftskip by \lispnarrowing}
1649*47504Spendry
1650*47504Spendry\message{defuns,}
1651*47504Spendry% Define formatter for defuns
1652*47504Spendry% First, allow user to change definition object font (\df) internally
1653*47504Spendry\def\setdeffont #1 {\csname DEF#1\endcsname}
1654*47504Spendry
1655*47504Spendry\newskip\defbodyindent \defbodyindent=36pt
1656*47504Spendry\newskip\defargsindent \defargsindent=50pt
1657*47504Spendry\newskip\deftypemargin \deftypemargin=12pt
1658*47504Spendry\newskip\deflastargmargin \deflastargmargin=18pt
1659*47504Spendry
1660*47504Spendry\newcount\parencount
1661*47504Spendry% define \functionparens, which makes ( and ) and & do special things.
1662*47504Spendry% \functionparens affects the group it is contained in.
1663*47504Spendry\def\activeparens{%
1664*47504Spendry\catcode`\(=\active \catcode`\)=\active \catcode`\&=\active
1665*47504Spendry\catcode`\[=\active \catcode`\]=\active}
1666*47504Spendry{\activeparens % Now, smart parens don't turn on until &foo (see \amprm)
1667*47504Spendry\gdef\functionparens{\boldbrax\let&=\amprm\parencount=0 }
1668*47504Spendry\gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
1669*47504Spendry
1670*47504Spendry% Definitions of (, ) and & used in args for functions.
1671*47504Spendry% This is the definition of ( outside of all parentheses.
1672*47504Spendry\gdef\oprm#1 {{\rm\char`\(}#1 \bf \let(=\opnested %
1673*47504Spendry\global\advance\parencount by 1 }
1674*47504Spendry%
1675*47504Spendry% This is the definition of ( when already inside a level of parens.
1676*47504Spendry\gdef\opnested{\char`\(\global\advance\parencount by 1 }
1677*47504Spendry%
1678*47504Spendry\gdef\clrm{% Print a paren in roman if it is taking us back to depth of 0.
1679*47504Spendry% also in that case restore the outer-level definition of (.
1680*47504Spendry\ifnum \parencount=1 {\rm \char `\)}\sl \let(=\oprm \else \char `\) \fi
1681*47504Spendry\global\advance \parencount by -1 }
1682*47504Spendry% If we encounter &foo, then turn on ()-hacking afterwards
1683*47504Spendry\gdef\amprm#1 {{\rm\&#1}\let(=\oprm \let)=\clrm\ }
1684*47504Spendry%
1685*47504Spendry\gdef\normalparens{\boldbrax\let&=\ampnr}
1686*47504Spendry} % End of definition inside \activeparens
1687*47504Spendry%% These parens (in \boldbrax) actually are a little bolder than the
1688*47504Spendry%% contained text.  This is especially needed for [ and ]
1689*47504Spendry\def\opnr{{\sf\char`\(}} \def\clnr{{\sf\char`\)}} \def\ampnr{\&}
1690*47504Spendry\def\lbrb{{\tt\char`\[}} \def\rbrb{{\tt\char`\]}}
1691*47504Spendry
1692*47504Spendry% First, defname, which formats the header line itself.
1693*47504Spendry% #1 should be the function name.
1694*47504Spendry% #2 should be the type of definition, such as "Function".
1695*47504Spendry
1696*47504Spendry\def\defname #1#2{%
1697*47504Spendry\leftskip = 0in  %
1698*47504Spendry\noindent        %
1699*47504Spendry\setbox0=\hbox{\hskip \deflastargmargin{\rm #2}\hskip \deftypemargin}%
1700*47504Spendry\dimen0=\hsize \advance \dimen0 by -\wd0 % compute size for first line
1701*47504Spendry\dimen1=\hsize \advance \dimen1 by -\defargsindent %size for continuations
1702*47504Spendry\parshape 2 0in \dimen0 \defargsindent \dimen1     %
1703*47504Spendry% Now output arg 2 ("Function" or some such)
1704*47504Spendry% ending at \deftypemargin from the right margin,
1705*47504Spendry% but stuck inside a box of width 0 so it does not interfere with linebreaking
1706*47504Spendry\rlap{\rightline{{\rm #2}\hskip \deftypemargin}}%
1707*47504Spendry\tolerance=10000 \hbadness=10000    % Make all lines underfull and no complaints
1708*47504Spendry{\df #1}\enskip        % Generate function name
1709*47504Spendry}
1710*47504Spendry
1711*47504Spendry% Actually process the body of a definition
1712*47504Spendry% #1 should be the terminating control sequence, such as \Edefun.
1713*47504Spendry% #2 should be the "another name" control sequence, such as \defunx.
1714*47504Spendry% #3 should be the control sequence that actually processes the header,
1715*47504Spendry%    such as \defunheader.
1716*47504Spendry
1717*47504Spendry\def\defparsebody #1#2#3{\begingroup\inENV% Environment for definitionbody
1718*47504Spendry\medbreak %
1719*47504Spendry% Define the end token that this defining construct specifies
1720*47504Spendry% so that it will exit this group.
1721*47504Spendry\def#1{\endgraf\endgroup\medbreak}%
1722*47504Spendry\def#2{\begingroup\obeylines\activeparens\spacesplit#3}%
1723*47504Spendry\parindent=0in \leftskip=\defbodyindent %
1724*47504Spendry\begingroup\obeylines\activeparens\spacesplit#3}
1725*47504Spendry
1726*47504Spendry\def\defmethparsebody #1#2#3#4 {\begingroup\inENV %
1727*47504Spendry\medbreak %
1728*47504Spendry% Define the end token that this defining construct specifies
1729*47504Spendry% so that it will exit this group.
1730*47504Spendry\def#1{\endgraf\endgroup\medbreak}%
1731*47504Spendry\def#2##1 {\begingroup\obeylines\activeparens\spacesplit{#3{##1}}}%
1732*47504Spendry\parindent=0in \leftskip=\defbodyindent %
1733*47504Spendry\begingroup\obeylines\activeparens\spacesplit{#3{#4}}}
1734*47504Spendry
1735*47504Spendry\def\defopparsebody #1#2#3#4#5 {\begingroup\inENV %
1736*47504Spendry\medbreak %
1737*47504Spendry% Define the end token that this defining construct specifies
1738*47504Spendry% so that it will exit this group.
1739*47504Spendry\def#1{\endgraf\endgroup\medbreak}%
1740*47504Spendry\def#2##1 ##2 {\def#4{##1}%
1741*47504Spendry\begingroup\obeylines\activeparens\spacesplit{#3{##2}}}%
1742*47504Spendry\parindent=0in \leftskip=\defbodyindent %
1743*47504Spendry\begingroup\obeylines\activeparens\spacesplit{#3{#5}}}
1744*47504Spendry
1745*47504Spendry% Split up #2 at the first space token.
1746*47504Spendry% call #1 with two arguments:
1747*47504Spendry%  the first is all of #2 before the space token,
1748*47504Spendry%  the second is all of #2 after that space token.
1749*47504Spendry% If #2 contains no space token, all of it is passed as the first arg
1750*47504Spendry% and the second is passed as empty.
1751*47504Spendry
1752*47504Spendry{\obeylines
1753*47504Spendry\gdef\spacesplit#1#2^^M{\endgroup\spacesplitfoo{#1}#2 \relax\spacesplitfoo}%
1754*47504Spendry\long\gdef\spacesplitfoo#1#2 #3#4\spacesplitfoo{%
1755*47504Spendry\ifx\relax #3%
1756*47504Spendry#1{#2}{}\else #1{#2}{#3#4}\fi}}
1757*47504Spendry
1758*47504Spendry% So much for the things common to all kinds of definitions.
1759*47504Spendry
1760*47504Spendry% Define @defun.
1761*47504Spendry
1762*47504Spendry% First, define the processing that is wanted for arguments of \defun
1763*47504Spendry% Use this to expand the args and terminate the paragraph they make up
1764*47504Spendry
1765*47504Spendry\def\defunargs #1{\functionparens \sl #1%
1766*47504Spendry\ifnum\parencount=0 \else \errmessage{unbalanced parens in @def arguments}\fi%
1767*47504Spendry\interlinepenalty=10000
1768*47504Spendry\endgraf\vskip -\parskip \penalty 10000}
1769*47504Spendry
1770*47504Spendry% Do complete processing of one @defun or @defunx line already parsed.
1771*47504Spendry
1772*47504Spendry% @deffn Command forward-char nchars
1773*47504Spendry
1774*47504Spendry\def\deffn{\defmethparsebody\Edeffn\deffnx\deffnheader}
1775*47504Spendry
1776*47504Spendry\def\deffnheader #1#2#3{\doind {fn}{\code{#2}}%
1777*47504Spendry\begingroup\defname {#2}{#1}\defunargs{#3}\endgroup}
1778*47504Spendry
1779*47504Spendry% @defun == @deffn Function
1780*47504Spendry
1781*47504Spendry\def\defun{\defparsebody\Edefun\defunx\defunheader}
1782*47504Spendry
1783*47504Spendry\def\defunheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
1784*47504Spendry\begingroup\defname {#1}{Function}%
1785*47504Spendry\defunargs {#2}\endgroup %
1786*47504Spendry}
1787*47504Spendry
1788*47504Spendry% @defmac == @deffn Macro
1789*47504Spendry
1790*47504Spendry\def\defmac{\defparsebody\Edefmac\defmacx\defmacheader}
1791*47504Spendry
1792*47504Spendry\def\defmacheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
1793*47504Spendry\begingroup\defname {#1}{Macro}%
1794*47504Spendry\defunargs {#2}\endgroup %
1795*47504Spendry}
1796*47504Spendry
1797*47504Spendry% @defspec == @deffn Special Form
1798*47504Spendry
1799*47504Spendry\def\defspec{\defparsebody\Edefspec\defspecx\defspecheader}
1800*47504Spendry
1801*47504Spendry\def\defspecheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
1802*47504Spendry\begingroup\defname {#1}{Special form}%
1803*47504Spendry\defunargs {#2}\endgroup %
1804*47504Spendry}
1805*47504Spendry
1806*47504Spendry% This definition is run if you use @defunx
1807*47504Spendry% anywhere other than immediately after a @defun or @defunx.
1808*47504Spendry
1809*47504Spendry\def\deffnx #1 {\errmessage{@deffnx in invalid context}}
1810*47504Spendry\def\defunx #1 {\errmessage{@defunx in invalid context}}
1811*47504Spendry\def\defmacx #1 {\errmessage{@defmacx in invalid context}}
1812*47504Spendry\def\defspecx #1 {\errmessage{@defspecx in invalid context}}
1813*47504Spendry
1814*47504Spendry% @defmethod, and so on
1815*47504Spendry
1816*47504Spendry% @defop {Funny Method} foo-class frobnicate argument
1817*47504Spendry
1818*47504Spendry\def\defop #1 {\def\defoptype{#1}%
1819*47504Spendry\defopparsebody\Edefop\defopx\defopheader\defoptype}
1820*47504Spendry
1821*47504Spendry\def\defopheader #1#2#3{\dosubind {fn}{\code{#2}}{on #1}% Make entry in function index
1822*47504Spendry\begingroup\defname {#2}{\defoptype{} on #1}%
1823*47504Spendry\defunargs {#3}\endgroup %
1824*47504Spendry}
1825*47504Spendry
1826*47504Spendry% @defmethod == @defop Method
1827*47504Spendry
1828*47504Spendry\def\defmethod{\defmethparsebody\Edefmethod\defmethodx\defmethodheader}
1829*47504Spendry
1830*47504Spendry\def\defmethodheader #1#2#3{\dosubind {fn}{\code{#2}}{on #1}% entry in function index
1831*47504Spendry\begingroup\defname {#2}{Operation on #1}%
1832*47504Spendry\defunargs {#3}\endgroup %
1833*47504Spendry}
1834*47504Spendry
1835*47504Spendry% @defcv {Class Option} foo-class foo-flag
1836*47504Spendry
1837*47504Spendry\def\defcv #1 {\def\defcvtype{#1}%
1838*47504Spendry\defopparsebody\Edefcv\defcvx\defcvheader\defcvtype}
1839*47504Spendry
1840*47504Spendry\def\defcvarheader #1#2#3{%
1841*47504Spendry\dosubind {vr}{\code{#2}}{of #1}% Make entry in var index
1842*47504Spendry\begingroup\defname {#2}{\defcvtype of #1}%
1843*47504Spendry\defvarargs {#3}\endgroup %
1844*47504Spendry}
1845*47504Spendry
1846*47504Spendry% @defivar == @defcv {Instance Variable}
1847*47504Spendry
1848*47504Spendry\def\defivar{\defmethparsebody\Edefivar\defivarx\defivarheader}
1849*47504Spendry
1850*47504Spendry\def\defivarheader #1#2#3{%
1851*47504Spendry\dosubind {vr}{\code{#2}}{of #1}% Make entry in var index
1852*47504Spendry\begingroup\defname {#2}{Instance variable of #1}%
1853*47504Spendry\defvarargs {#3}\endgroup %
1854*47504Spendry}
1855*47504Spendry
1856*47504Spendry% These definitions are run if you use @defmethodx, etc.,
1857*47504Spendry% anywhere other than immediately after a @defmethod, etc.
1858*47504Spendry
1859*47504Spendry\def\defopx #1 {\errmessage{@defopx in invalid context}}
1860*47504Spendry\def\defmethodx #1 {\errmessage{@defmethodx in invalid context}}
1861*47504Spendry\def\defcvx #1 {\errmessage{@defcvx in invalid context}}
1862*47504Spendry\def\defivarx #1 {\errmessage{@defivarx in invalid context}}
1863*47504Spendry
1864*47504Spendry% Now @defvar
1865*47504Spendry
1866*47504Spendry% First, define the processing that is wanted for arguments of @defvar.
1867*47504Spendry% This is actually simple: just print them in roman.
1868*47504Spendry% This must expand the args and terminate the paragraph they make up
1869*47504Spendry\def\defvarargs #1{\normalparens #1%
1870*47504Spendry\interlinepenalty=10000
1871*47504Spendry\endgraf\vskip -\parskip \penalty 10000}
1872*47504Spendry
1873*47504Spendry% @defvr Counter foo-count
1874*47504Spendry
1875*47504Spendry\def\defvr{\defmethparsebody\Edefvr\defvrx\defvrheader}
1876*47504Spendry
1877*47504Spendry\def\defvrheader #1#2#3{\doind {vr}{\code{#2}}%
1878*47504Spendry\begingroup\defname {#2}{#1}\defvarargs{#3}\endgroup}
1879*47504Spendry
1880*47504Spendry% @defvar == @defvr Variable
1881*47504Spendry
1882*47504Spendry\def\defvar{\defparsebody\Edefvar\defvarx\defvarheader}
1883*47504Spendry
1884*47504Spendry\def\defvarheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
1885*47504Spendry\begingroup\defname {#1}{Variable}%
1886*47504Spendry\defvarargs {#2}\endgroup %
1887*47504Spendry}
1888*47504Spendry
1889*47504Spendry% @defopt == @defvr {User Option}
1890*47504Spendry
1891*47504Spendry\def\defopt{\defparsebody\Edefopt\defoptx\defoptheader}
1892*47504Spendry
1893*47504Spendry\def\defoptheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
1894*47504Spendry\begingroup\defname {#1}{User Option}%
1895*47504Spendry\defvarargs {#2}\endgroup %
1896*47504Spendry}
1897*47504Spendry
1898*47504Spendry% This definition is run if you use @defvarx
1899*47504Spendry% anywhere other than immediately after a @defvar or @defvarx.
1900*47504Spendry
1901*47504Spendry\def\defvrx #1 {\errmessage{@defvrx in invalid context}}
1902*47504Spendry\def\defvarx #1 {\errmessage{@defvarx in invalid context}}
1903*47504Spendry\def\defoptx #1 {\errmessage{@defoptx in invalid context}}
1904*47504Spendry
1905*47504Spendry% Now define @deftp
1906*47504Spendry% Args are printed in bold, a slight difference from @defvar.
1907*47504Spendry
1908*47504Spendry\def\deftpargs #1{\bf \defvarargs{#1}}
1909*47504Spendry
1910*47504Spendry% @deftp Class window height width ...
1911*47504Spendry
1912*47504Spendry\def\deftp{\defmethparsebody\Edeftp\deftpx\deftpheader}
1913*47504Spendry
1914*47504Spendry\def\deftpheader #1#2#3{\doind {tp}{\code{#2}}%
1915*47504Spendry\begingroup\defname {#2}{#1}\deftpargs{#3}\endgroup}
1916*47504Spendry
1917*47504Spendry% This definition is run if you use @deftpx, etc
1918*47504Spendry% anywhere other than immediately after a @deftp, etc.
1919*47504Spendry
1920*47504Spendry\def\deftpx #1 {\errmessage{@deftpx in invalid context}}
1921*47504Spendry
1922*47504Spendry\message{cross reference,}
1923*47504Spendry% Define cross-reference macros
1924*47504Spendry\newwrite \auxfile
1925*47504Spendry
1926*47504Spendry% \setref{foo} defines a cross-reference point named foo.
1927*47504Spendry
1928*47504Spendry\def\setref#1{%
1929*47504Spendry\dosetq{#1-pg}{Ypagenumber}%
1930*47504Spendry\dosetq{#1-snt}{Ysectionnumberandtype}}
1931*47504Spendry
1932*47504Spendry\def\unnumbsetref#1{%
1933*47504Spendry\dosetq{#1-pg}{Ypagenumber}%
1934*47504Spendry\dosetq{#1-snt}{Ynothing}}
1935*47504Spendry
1936*47504Spendry% \xref and \pxref generate cross references to specified points.
1937*47504Spendry
1938*47504Spendry\def\pxref #1{see \xrefX [#1,,,,,,,]}
1939*47504Spendry\def\xref #1{See \xrefX [#1,,,,,,,]}
1940*47504Spendry\def\xrefX [#1,#2,#3,#4,#5,#6]{%
1941*47504Spendry\setbox1=\hbox{\i{\losespace#5{}}}%
1942*47504Spendry\setbox0=\hbox{\losespace#3{}}%
1943*47504Spendry\ifdim \wd0 =0pt \setbox0=\hbox{\losespace#1{}}\fi%
1944*47504Spendry\ifdim \wd1 >0pt%
1945*47504Spendrysection \unhbox0{} in \unhbox1%
1946*47504Spendry\else%
1947*47504Spendry\refx{#1-snt} [\unhbox0], page\tie \refx{#1-pg}%
1948*47504Spendry\fi }
1949*47504Spendry
1950*47504Spendry% \dosetq is the interface for calls from other macros
1951*47504Spendry
1952*47504Spendry\def\dosetq #1#2{{\let\folio=0%
1953*47504Spendry\edef\next{\write\auxfile{\internalsetq {#1}{#2}}}%
1954*47504Spendry\next}}
1955*47504Spendry
1956*47504Spendry% \internalsetq {foo}{page} expands into CHARACTERS 'xrdef {foo}{...expansion of \Ypage...}
1957*47504Spendry% When the aux file is read, ' is the escape character
1958*47504Spendry
1959*47504Spendry\def\internalsetq #1#2{'xrdef {#1}{\csname #2\endcsname}}
1960*47504Spendry
1961*47504Spendry% Things to be expanded by \internalsetq
1962*47504Spendry
1963*47504Spendry\def\Ypagenumber{\folio}
1964*47504Spendry
1965*47504Spendry\def\Ynothing{}
1966*47504Spendry
1967*47504Spendry\def\Ysectionnumberandtype{%
1968*47504Spendry\ifnum\secno=0 chapter\xreftie\the\chapno %
1969*47504Spendry\else \ifnum \subsecno=0 section\xreftie\the\chapno.\the\secno %
1970*47504Spendry\else \ifnum \subsubsecno=0 %
1971*47504Spendrysection\xreftie\the\chapno.\the\secno.\the\subsecno %
1972*47504Spendry\else %
1973*47504Spendrysection\xreftie\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno %
1974*47504Spendry\fi \fi \fi }
1975*47504Spendry
1976*47504Spendry\gdef\xreftie{'tie}
1977*47504Spendry
1978*47504Spendry% Define @refx to reference a specific cross-reference string.
1979*47504Spendry
1980*47504Spendry\def\refx#1{%
1981*47504Spendry{%
1982*47504Spendry\expandafter\ifx\csname X#1\endcsname\relax
1983*47504Spendry% If not defined, say something at least.
1984*47504Spendry\expandafter\gdef\csname X#1\endcsname {$<$undefined$>$}%
1985*47504Spendry\message {WARNING: Cross-reference "#1" used but not yet defined}%
1986*47504Spendry\message {}%
1987*47504Spendry\fi %
1988*47504Spendry\csname X#1\endcsname %It's defined, so just use it.
1989*47504Spendry}}
1990*47504Spendry
1991*47504Spendry% Read the last existing aux file, if any.  No error if none exists.
1992*47504Spendry
1993*47504Spendry% This is the macro invoked by entries in the aux file.
1994*47504Spendry\def\xrdef #1#2{
1995*47504Spendry{\catcode`\'=\other\expandafter \gdef \csname X#1\endcsname {#2}}}
1996*47504Spendry
1997*47504Spendry\def\readauxfile{%
1998*47504Spendry\begingroup
1999*47504Spendry\catcode `\^^@=\other
2000*47504Spendry\catcode `\=\other
2001*47504Spendry\catcode `\=\other
2002*47504Spendry\catcode `\^^C=\other
2003*47504Spendry\catcode `\^^D=\other
2004*47504Spendry\catcode `\^^E=\other
2005*47504Spendry\catcode `\^^F=\other
2006*47504Spendry\catcode `\^^G=\other
2007*47504Spendry\catcode `\^^H=\other
2008*47504Spendry\catcode `\=\other
2009*47504Spendry\catcode `\^^L=\other
2010*47504Spendry\catcode `\=\other
2011*47504Spendry\catcode `\=\other
2012*47504Spendry\catcode `\=\other
2013*47504Spendry\catcode `\=\other
2014*47504Spendry\catcode `\=\other
2015*47504Spendry\catcode `\=\other
2016*47504Spendry\catcode `\=\other
2017*47504Spendry\catcode `\=\other
2018*47504Spendry\catcode `\=\other
2019*47504Spendry\catcode `\=\other
2020*47504Spendry\catcode `\=\other
2021*47504Spendry\catcode `\=\other
2022*47504Spendry\catcode `\=\other
2023*47504Spendry\catcode `\^^[=\other
2024*47504Spendry\catcode `\^^\=\other
2025*47504Spendry\catcode `\^^]=\other
2026*47504Spendry\catcode `\^^^=\other
2027*47504Spendry\catcode `\^^_=\other
2028*47504Spendry\catcode `\@=\other
2029*47504Spendry\catcode `\^=\other
2030*47504Spendry\catcode `\~=\other
2031*47504Spendry\catcode `\[=\other
2032*47504Spendry\catcode `\]=\other
2033*47504Spendry\catcode`\"=\other
2034*47504Spendry\catcode`\_=\other
2035*47504Spendry\catcode`\|=\other
2036*47504Spendry\catcode`\<=\other
2037*47504Spendry\catcode`\>=\other
2038*47504Spendry\catcode `\$=\other
2039*47504Spendry\catcode `\#=\other
2040*47504Spendry\catcode `\&=\other
2041*47504Spendry% the aux file uses ' as the escape.
2042*47504Spendry% Turn off \ as an escape so we do not lose on
2043*47504Spendry% entries which were dumped with control sequences in their names.
2044*47504Spendry% For example, 'xrdef {$\leq $-fun}{page ...} made by @defun ^^
2045*47504Spendry% Reference to such entries still does not work the way one would wish,
2046*47504Spendry% but at least they do not bomb out when the aux file is read in.
2047*47504Spendry\catcode `\{=1 \catcode `\}=2
2048*47504Spendry\catcode `\%=\other
2049*47504Spendry\catcode `\'=0
2050*47504Spendry\catcode `\\=\other
2051*47504Spendry\openin 1 \jobname.aux
2052*47504Spendry\ifeof 1 \else \closein 1 \input \jobname.aux
2053*47504Spendry\fi
2054*47504Spendry% Open the new aux file.  Tex will close it automatically at exit.
2055*47504Spendry\openout \auxfile=\jobname.aux
2056*47504Spendry\endgroup}
2057*47504Spendry
2058*47504Spendry
2059*47504Spendry% Footnotes.
2060*47504Spendry
2061*47504Spendry\newcount \footnoteno
2062*47504Spendry
2063*47504Spendry\def\supereject{\par\penalty -20000\footnoteno =0 }
2064*47504Spendry
2065*47504Spendry\let\ptexfootnote=\footnote
2066*47504Spendry
2067*47504Spendry{\catcode `\@=11
2068*47504Spendry\gdef\footnote{\global\advance \footnoteno by \@ne
2069*47504Spendry\edef\thisfootno{$^{\the\footnoteno}$}%
2070*47504Spendry\let\@sf\empty
2071*47504Spendry\ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi
2072*47504Spendry\thisfootno\@sf\parsearg\footnotezzz}
2073*47504Spendry
2074*47504Spendry\gdef\footnotezzz #1{\insert\footins{
2075*47504Spendry\interlinepenalty\interfootnotelinepenalty
2076*47504Spendry\splittopskip\ht\strutbox % top baseline for broken footnotes
2077*47504Spendry\splitmaxdepth\dp\strutbox \floatingpenalty\@MM
2078*47504Spendry\leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip
2079*47504Spendry\footstrut\hang\textindent{\thisfootno}#1\strut}}
2080*47504Spendry
2081*47504Spendry}%end \catcode `\@=11
2082*47504Spendry
2083*47504Spendry% End of control word definitions.
2084*47504Spendry
2085*47504Spendry\message{and turning on texinfo input format.}
2086*47504Spendry
2087*47504Spendry\def\openindices{%
2088*47504Spendry   \newindex{cp}%
2089*47504Spendry   \newcodeindex{fn}%
2090*47504Spendry   \newcodeindex{vr}%
2091*47504Spendry   \newcodeindex{tp}%
2092*47504Spendry   \newcodeindex{ky}%
2093*47504Spendry   \newcodeindex{pg}%
2094*47504Spendry}
2095*47504Spendry
2096*47504Spendry% Set some numeric style parameters, for 8.5 x 11 format.
2097*47504Spendry
2098*47504Spendry\hsize = 6.5in
2099*47504Spendry\parindent 15pt
2100*47504Spendry\parskip 18pt plus 1pt
2101*47504Spendry\baselineskip 15pt
2102*47504Spendry\advance\topskip by 1.2cm
2103*47504Spendry
2104*47504Spendry% Prevent underfull vbox error messages.
2105*47504Spendry\vbadness=10000
2106*47504Spendry
2107*47504Spendry% Use @smallbook to reset parameters for 7x9.5 format
2108*47504Spendry\def\smallbook{
2109*47504Spendry\global\lispnarrowing = 0.3in
2110*47504Spendry\global\baselineskip 12pt
2111*47504Spendry\global\parskip 3pt plus 1pt
2112*47504Spendry\global\hsize = 5in
2113*47504Spendry\global\doublecolumnhsize=2.4in \global\doublecolumnvsize=15.0in
2114*47504Spendry\global\vsize=7.5in
2115*47504Spendry\global\tolerance=700
2116*47504Spendry\global\hfuzz=1pt
2117*47504Spendry
2118*47504Spendry\global\pagewidth=\hsize
2119*47504Spendry\global\pageheight=\vsize
2120*47504Spendry\global\font\ninett=cmtt9
2121*47504Spendry
2122*47504Spendry\global\let\smalllisp=\smalllispx
2123*47504Spendry\global\let\smallexample=\smalllispx
2124*47504Spendry\global\def\Esmallexample{\Esmalllisp}
2125*47504Spendry}
2126*47504Spendry
2127*47504Spendry%% For a final copy, take out the rectangles
2128*47504Spendry%% that mark overfull boxes (in case you have decided
2129*47504Spendry%% that the text looks ok even though it passes the margin).
2130*47504Spendry\def\finalout{\overfullrule=0pt}
2131*47504Spendry
2132*47504Spendry% Turn off all special characters except @
2133*47504Spendry% (and those which the user can use as if they were ordinary)
2134*47504Spendry% Define certain chars to be always in tt font.
2135*47504Spendry
2136*47504Spendry\catcode`\"=\active
2137*47504Spendry\def\activedoublequote{{\tt \char '042}}
2138*47504Spendry\let"=\activedoublequote
2139*47504Spendry\catcode`\~=\active
2140*47504Spendry\def~{{\tt \char '176}}
2141*47504Spendry\chardef\hat=`\^
2142*47504Spendry\catcode`\^=\active
2143*47504Spendry\def^{{\tt \hat}}
2144*47504Spendry\catcode`\_=\active
2145*47504Spendry\def_{{\tt \char '137}}
2146*47504Spendry\catcode`\|=\active
2147*47504Spendry\def|{{\tt \char '174}}
2148*47504Spendry\chardef \less=`\<
2149*47504Spendry\catcode`\<=\active
2150*47504Spendry\def<{{\tt \less}}
2151*47504Spendry\chardef \gtr=`\>
2152*47504Spendry\catcode`\>=\active
2153*47504Spendry\def>{{\tt \gtr}}
2154*47504Spendry
2155*47504Spendry\catcode`\@=0
2156*47504Spendry
2157*47504Spendry% \rawbackslashxx output one backslash character in current font
2158*47504Spendry{\catcode`\\=\other
2159*47504Spendry@gdef@rawbackslashxx{\}}
2160*47504Spendry
2161*47504Spendry% \rawbackslash redefines \ as input to do \rawbackslashxx.
2162*47504Spendry{\catcode`\\=\active
2163*47504Spendry@gdef@rawbackslash{@let\=@rawbackslashxx }}
2164*47504Spendry
2165*47504Spendry% \normalbackslash outputs one backslash in fixed width font.
2166*47504Spendry\def\normalbackslash{{\tt\rawbackslashxx}}
2167*47504Spendry
2168*47504Spendry% Say @foo, not \foo, in error messages.
2169*47504Spendry\escapechar=`\@
2170*47504Spendry
2171*47504Spendry@c \catcode 17=0   @c Define control-q
2172*47504Spendry\catcode`\\=\active
2173*47504Spendry
2174*47504Spendry% If a .fmt file is being used, we don't want the `\input texinfo' to show up.
2175*47504Spendry% That is what \eatinput is for; after that, the `\' should revert to printing
2176*47504Spendry% a backslash.
2177*47504Spendry%
2178*47504Spendry@gdef@eatinput input texinfo{@fixbackslash}
2179*47504Spendry@global@let\ = @eatinput
2180*47504Spendry
2181*47504Spendry% On the other hand, perhaps the file did not have a `\input texinfo'. Then
2182*47504Spendry% the first `\{ in the file would cause an error. This macro tries to fix
2183*47504Spendry% that, assuming it is called before the first `\' could plausibly occur.
2184*47504Spendry%
2185*47504Spendry@gdef@fixbackslash{@ifx\@eatinput @let\ = @normalbackslash @fi}
2186*47504Spendry
2187*47504Spendry%% These look ok in all fonts, so just make them not special.  The @rm below
2188*47504Spendry%% makes sure that the current font starts out as the newly loaded cmr10
2189*47504Spendry@catcode`@$=@other @catcode`@%=@other @catcode`@&=@other @catcode`@#=@other
2190*47504Spendry
2191*47504Spendry@textfonts
2192*47504Spendry@rm
2193