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