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