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