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\}\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