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