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