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