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{2012-04-06.11} 7% 8% Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, 9% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 10% 2007, 2008, 2009, 2010, 2011, 2012 Free Software 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 3 of the 15% License, or (at 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 program. If not, see <http://www.gnu.org/licenses/>. 24% 25% As a special exception, when this file is read by TeX when processing 26% a Texinfo source document, you may use the result without 27% restriction. (This has been our intent since Texinfo was invented.) 28% 29% Please try the latest version of texinfo.tex before submitting bug 30% reports; you can get the latest version from: 31% http://www.gnu.org/software/texinfo/ (the Texinfo home page), or 32% ftp://tug.org/tex/texinfo.tex 33% (and all CTAN mirrors, see http://www.ctan.org). 34% The texinfo.tex in any given distribution could well be out 35% of date, so if that's what you're using, please check. 36% 37% Send bug reports to bug-texinfo@gnu.org. Please include including a 38% complete document in each bug report with which we can reproduce the 39% problem. Patches are, of course, greatly appreciated. 40% 41% To process a Texinfo manual with TeX, it's most reliable to use the 42% texi2dvi shell script that comes with the distribution. For a simple 43% manual foo.texi, however, you can get away with this: 44% tex foo.texi 45% texindex foo.?? 46% tex foo.texi 47% tex foo.texi 48% dvips foo.dvi -o # or whatever; this makes foo.ps. 49% The extra TeX runs get the cross-reference information correct. 50% Sometimes one run after texindex suffices, and sometimes you need more 51% than two; texi2dvi does it as many times as necessary. 52% 53% It is possible to adapt texinfo.tex for other languages, to some 54% extent. You can get the existing language-specific files from the 55% full Texinfo distribution. 56% 57% The GNU Texinfo home page is http://www.gnu.org/software/texinfo. 58 59 60\message{Loading texinfo [version \texinfoversion]:} 61 62% If in a .fmt file, print the version number 63% and turn on active characters that we couldn't do earlier because 64% they might have appeared in the input file name. 65\everyjob{\message{[Texinfo version \texinfoversion]}% 66 \catcode`+=\active \catcode`\_=\active} 67 68\chardef\other=12 69 70% We never want plain's \outer definition of \+ in Texinfo. 71% For @tex, we can use \tabalign. 72\let\+ = \relax 73 74% Save some plain tex macros whose names we will redefine. 75\let\ptexb=\b 76\let\ptexbullet=\bullet 77\let\ptexc=\c 78\let\ptexcomma=\, 79\let\ptexdot=\. 80\let\ptexdots=\dots 81\let\ptexend=\end 82\let\ptexequiv=\equiv 83\let\ptexexclam=\! 84\let\ptexfootnote=\footnote 85\let\ptexgtr=> 86\let\ptexhat=^ 87\let\ptexi=\i 88\let\ptexindent=\indent 89\let\ptexinsert=\insert 90\let\ptexlbrace=\{ 91\let\ptexless=< 92\let\ptexnewwrite\newwrite 93\let\ptexnoindent=\noindent 94\let\ptexplus=+ 95\let\ptexraggedright=\raggedright 96\let\ptexrbrace=\} 97\let\ptexslash=\/ 98\let\ptexstar=\* 99\let\ptext=\t 100\let\ptextop=\top 101{\catcode`\'=\active \global\let\ptexquoteright'}% active in plain's math mode 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\putworderror\undefined \gdef\putworderror{error}\fi 120\ifx\putwordfile\undefined \gdef\putwordfile{file}\fi 121\ifx\putwordin\undefined \gdef\putwordin{in}\fi 122\ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi 123\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi 124\ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi 125\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi 126\ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi 127\ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi 128\ifx\putwordof\undefined \gdef\putwordof{of}\fi 129\ifx\putwordon\undefined \gdef\putwordon{on}\fi 130\ifx\putwordpage\undefined \gdef\putwordpage{page}\fi 131\ifx\putwordsection\undefined \gdef\putwordsection{section}\fi 132\ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi 133\ifx\putwordsee\undefined \gdef\putwordsee{see}\fi 134\ifx\putwordSee\undefined \gdef\putwordSee{See}\fi 135\ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi 136\ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi 137% 138\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi 139\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi 140\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi 141\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi 142\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi 143\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi 144\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi 145\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi 146\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi 147\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi 148\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi 149\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi 150% 151\ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi 152\ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi 153\ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi 154\ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi 155\ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi 156 157% Since the category of space is not known, we have to be careful. 158\chardef\spacecat = 10 159\def\spaceisspace{\catcode`\ =\spacecat} 160 161% sometimes characters are active, so we need control sequences. 162\chardef\ampChar = `\& 163\chardef\colonChar = `\: 164\chardef\commaChar = `\, 165\chardef\dashChar = `\- 166\chardef\dotChar = `\. 167\chardef\exclamChar= `\! 168\chardef\hashChar = `\# 169\chardef\lquoteChar= `\` 170\chardef\questChar = `\? 171\chardef\rquoteChar= `\' 172\chardef\semiChar = `\; 173\chardef\slashChar = `\/ 174\chardef\underChar = `\_ 175 176% Ignore a token. 177% 178\def\gobble#1{} 179 180% The following is used inside several \edef's. 181\def\makecsname#1{\expandafter\noexpand\csname#1\endcsname} 182 183% Hyphenation fixes. 184\hyphenation{ 185 Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script 186 ap-pen-dix bit-map bit-maps 187 data-base data-bases eshell fall-ing half-way long-est man-u-script 188 man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm 189 par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces 190 spell-ing spell-ings 191 stand-alone strong-est time-stamp time-stamps which-ever white-space 192 wide-spread wrap-around 193} 194 195% Margin to add to right of even pages, to left of odd pages. 196\newdimen\bindingoffset 197\newdimen\normaloffset 198\newdimen\pagewidth \newdimen\pageheight 199 200% For a final copy, take out the rectangles 201% that mark overfull boxes (in case you have decided 202% that the text looks ok even though it passes the margin). 203% 204\def\finalout{\overfullrule=0pt } 205 206% Sometimes it is convenient to have everything in the transcript file 207% and nothing on the terminal. We don't just call \tracingall here, 208% since that produces some useless output on the terminal. We also make 209% some effort to order the tracing commands to reduce output in the log 210% file; cf. trace.sty in LaTeX. 211% 212\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}% 213\def\loggingall{% 214 \tracingstats2 215 \tracingpages1 216 \tracinglostchars2 % 2 gives us more in etex 217 \tracingparagraphs1 218 \tracingoutput1 219 \tracingmacros2 220 \tracingrestores1 221 \showboxbreadth\maxdimen \showboxdepth\maxdimen 222 \ifx\eTeXversion\thisisundefined\else % etex gives us more logging 223 \tracingscantokens1 224 \tracingifs1 225 \tracinggroups1 226 \tracingnesting2 227 \tracingassigns1 228 \fi 229 \tracingcommands3 % 3 gives us more in etex 230 \errorcontextlines16 231}% 232 233% @errormsg{MSG}. Do the index-like expansions on MSG, but if things 234% aren't perfect, it's not the end of the world, being an error message, 235% after all. 236% 237\def\errormsg{\begingroup \indexnofonts \doerrormsg} 238\def\doerrormsg#1{\errmessage{#1}} 239 240% add check for \lastpenalty to plain's definitions. If the last thing 241% we did was a \nobreak, we don't want to insert more space. 242% 243\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount 244 \removelastskip\penalty-50\smallskip\fi\fi} 245\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount 246 \removelastskip\penalty-100\medskip\fi\fi} 247\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount 248 \removelastskip\penalty-200\bigskip\fi\fi} 249 250% Do @cropmarks to get crop marks. 251% 252\newif\ifcropmarks 253\let\cropmarks = \cropmarkstrue 254% 255% Dimensions to add cropmarks at corners. 256% Added by P. A. MacKay, 12 Nov. 1986 257% 258\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines 259\newdimen\cornerlong \cornerlong=1pc 260\newdimen\cornerthick \cornerthick=.3pt 261\newdimen\topandbottommargin \topandbottommargin=.75in 262 263% Output a mark which sets \thischapter, \thissection and \thiscolor. 264% We dump everything together because we only have one kind of mark. 265% This works because we only use \botmark / \topmark, not \firstmark. 266% 267% A mark contains a subexpression of the \ifcase ... \fi construct. 268% \get*marks macros below extract the needed part using \ifcase. 269% 270% Another complication is to let the user choose whether \thischapter 271% (\thissection) refers to the chapter (section) in effect at the top 272% of a page, or that at the bottom of a page. The solution is 273% described on page 260 of The TeXbook. It involves outputting two 274% marks for the sectioning macros, one before the section break, and 275% one after. I won't pretend I can describe this better than DEK... 276\def\domark{% 277 \toks0=\expandafter{\lastchapterdefs}% 278 \toks2=\expandafter{\lastsectiondefs}% 279 \toks4=\expandafter{\prevchapterdefs}% 280 \toks6=\expandafter{\prevsectiondefs}% 281 \toks8=\expandafter{\lastcolordefs}% 282 \mark{% 283 \the\toks0 \the\toks2 284 \noexpand\or \the\toks4 \the\toks6 285 \noexpand\else \the\toks8 286 }% 287} 288% \topmark doesn't work for the very first chapter (after the title 289% page or the contents), so we use \firstmark there -- this gets us 290% the mark with the chapter defs, unless the user sneaks in, e.g., 291% @setcolor (or @url, or @link, etc.) between @contents and the very 292% first @chapter. 293\def\gettopheadingmarks{% 294 \ifcase0\topmark\fi 295 \ifx\thischapter\empty \ifcase0\firstmark\fi \fi 296} 297\def\getbottomheadingmarks{\ifcase1\botmark\fi} 298\def\getcolormarks{\ifcase2\topmark\fi} 299 300% Avoid "undefined control sequence" errors. 301\def\lastchapterdefs{} 302\def\lastsectiondefs{} 303\def\prevchapterdefs{} 304\def\prevsectiondefs{} 305\def\lastcolordefs{} 306 307% Main output routine. 308\chardef\PAGE = 255 309\output = {\onepageout{\pagecontents\PAGE}} 310 311\newbox\headlinebox 312\newbox\footlinebox 313 314% \onepageout takes a vbox as an argument. Note that \pagecontents 315% does insertions, but you have to call it yourself. 316\def\onepageout#1{% 317 \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi 318 % 319 \ifodd\pageno \advance\hoffset by \bindingoffset 320 \else \advance\hoffset by -\bindingoffset\fi 321 % 322 % Do this outside of the \shipout so @code etc. will be expanded in 323 % the headline as they should be, not taken literally (outputting ''code). 324 \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi 325 \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}% 326 \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi 327 \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}% 328 % 329 {% 330 % Have to do this stuff outside the \shipout because we want it to 331 % take effect in \write's, yet the group defined by the \vbox ends 332 % before the \shipout runs. 333 % 334 \indexdummies % don't expand commands in the output. 335 \normalturnoffactive % \ in index entries must not stay \, e.g., if 336 % the page break happens to be in the middle of an example. 337 % We don't want .vr (or whatever) entries like this: 338 % \entry{{\tt \indexbackslash }acronym}{32}{\code {\acronym}} 339 % "\acronym" won't work when it's read back in; 340 % it needs to be 341 % {\code {{\tt \backslashcurfont }acronym} 342 \shipout\vbox{% 343 % Do this early so pdf references go to the beginning of the page. 344 \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi 345 % 346 \ifcropmarks \vbox to \outervsize\bgroup 347 \hsize = \outerhsize 348 \vskip-\topandbottommargin 349 \vtop to0pt{% 350 \line{\ewtop\hfil\ewtop}% 351 \nointerlineskip 352 \line{% 353 \vbox{\moveleft\cornerthick\nstop}% 354 \hfill 355 \vbox{\moveright\cornerthick\nstop}% 356 }% 357 \vss}% 358 \vskip\topandbottommargin 359 \line\bgroup 360 \hfil % center the page within the outer (page) hsize. 361 \ifodd\pageno\hskip\bindingoffset\fi 362 \vbox\bgroup 363 \fi 364 % 365 \unvbox\headlinebox 366 \pagebody{#1}% 367 \ifdim\ht\footlinebox > 0pt 368 % Only leave this space if the footline is nonempty. 369 % (We lessened \vsize for it in \oddfootingyyy.) 370 % The \baselineskip=24pt in plain's \makefootline has no effect. 371 \vskip 24pt 372 \unvbox\footlinebox 373 \fi 374 % 375 \ifcropmarks 376 \egroup % end of \vbox\bgroup 377 \hfil\egroup % end of (centering) \line\bgroup 378 \vskip\topandbottommargin plus1fill minus1fill 379 \boxmaxdepth = \cornerthick 380 \vbox to0pt{\vss 381 \line{% 382 \vbox{\moveleft\cornerthick\nsbot}% 383 \hfill 384 \vbox{\moveright\cornerthick\nsbot}% 385 }% 386 \nointerlineskip 387 \line{\ewbot\hfil\ewbot}% 388 }% 389 \egroup % \vbox from first cropmarks clause 390 \fi 391 }% end of \shipout\vbox 392 }% end of group with \indexdummies 393 \advancepageno 394 \ifnum\outputpenalty>-20000 \else\dosupereject\fi 395} 396 397\newinsert\margin \dimen\margin=\maxdimen 398 399\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}} 400{\catcode`\@ =11 401\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi 402% marginal hacks, juha@viisa.uucp (Juha Takala) 403\ifvoid\margin\else % marginal info is present 404 \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi 405\dimen@=\dp#1\relax \unvbox#1\relax 406\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi 407\ifr@ggedbottom \kern-\dimen@ \vfil \fi} 408} 409 410% Here are the rules for the cropmarks. Note that they are 411% offset so that the space between them is truly \outerhsize or \outervsize 412% (P. A. MacKay, 12 November, 1986) 413% 414\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong} 415\def\nstop{\vbox 416 {\hrule height\cornerthick depth\cornerlong width\cornerthick}} 417\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong} 418\def\nsbot{\vbox 419 {\hrule height\cornerlong depth\cornerthick width\cornerthick}} 420 421% Parse an argument, then pass it to #1. The argument is the rest of 422% the input line (except we remove a trailing comment). #1 should be a 423% macro which expects an ordinary undelimited TeX argument. 424% 425\def\parsearg{\parseargusing{}} 426\def\parseargusing#1#2{% 427 \def\argtorun{#2}% 428 \begingroup 429 \obeylines 430 \spaceisspace 431 #1% 432 \parseargline\empty% Insert the \empty token, see \finishparsearg below. 433} 434 435{\obeylines % 436 \gdef\parseargline#1^^M{% 437 \endgroup % End of the group started in \parsearg. 438 \argremovecomment #1\comment\ArgTerm% 439 }% 440} 441 442% First remove any @comment, then any @c comment. 443\def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm} 444\def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm} 445 446% Each occurrence of `\^^M' or `<space>\^^M' is replaced by a single space. 447% 448% \argremovec might leave us with trailing space, e.g., 449% @end itemize @c foo 450% This space token undergoes the same procedure and is eventually removed 451% by \finishparsearg. 452% 453\def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M} 454\def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M} 455\def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{% 456 \def\temp{#3}% 457 \ifx\temp\empty 458 % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp: 459 \let\temp\finishparsearg 460 \else 461 \let\temp\argcheckspaces 462 \fi 463 % Put the space token in: 464 \temp#1 #3\ArgTerm 465} 466 467% If a _delimited_ argument is enclosed in braces, they get stripped; so 468% to get _exactly_ the rest of the line, we had to prevent such situation. 469% We prepended an \empty token at the very beginning and we expand it now, 470% just before passing the control to \argtorun. 471% (Similarly, we have to think about #3 of \argcheckspacesY above: it is 472% either the null string, or it ends with \^^M---thus there is no danger 473% that a pair of braces would be stripped. 474% 475% But first, we have to remove the trailing space token. 476% 477\def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}} 478 479% \parseargdef\foo{...} 480% is roughly equivalent to 481% \def\foo{\parsearg\Xfoo} 482% \def\Xfoo#1{...} 483% 484% Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my 485% favourite TeX trick. --kasal, 16nov03 486 487\def\parseargdef#1{% 488 \expandafter \doparseargdef \csname\string#1\endcsname #1% 489} 490\def\doparseargdef#1#2{% 491 \def#2{\parsearg#1}% 492 \def#1##1% 493} 494 495% Several utility definitions with active space: 496{ 497 \obeyspaces 498 \gdef\obeyedspace{ } 499 500 % Make each space character in the input produce a normal interword 501 % space in the output. Don't allow a line break at this space, as this 502 % is used only in environments like @example, where each line of input 503 % should produce a line of output anyway. 504 % 505 \gdef\sepspaces{\obeyspaces\let =\tie} 506 507 % If an index command is used in an @example environment, any spaces 508 % therein should become regular spaces in the raw index file, not the 509 % expansion of \tie (\leavevmode \penalty \@M \ ). 510 \gdef\unsepspaces{\let =\space} 511} 512 513 514\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next} 515 516% Define the framework for environments in texinfo.tex. It's used like this: 517% 518% \envdef\foo{...} 519% \def\Efoo{...} 520% 521% It's the responsibility of \envdef to insert \begingroup before the 522% actual body; @end closes the group after calling \Efoo. \envdef also 523% defines \thisenv, so the current environment is known; @end checks 524% whether the environment name matches. The \checkenv macro can also be 525% used to check whether the current environment is the one expected. 526% 527% Non-false conditionals (@iftex, @ifset) don't fit into this, so they 528% are not treated as environments; they don't open a group. (The 529% implementation of @end takes care not to call \endgroup in this 530% special case.) 531 532 533% At run-time, environments start with this: 534\def\startenvironment#1{\begingroup\def\thisenv{#1}} 535% initialize 536\let\thisenv\empty 537 538% ... but they get defined via ``\envdef\foo{...}'': 539\long\def\envdef#1#2{\def#1{\startenvironment#1#2}} 540\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}} 541 542% Check whether we're in the right environment: 543\def\checkenv#1{% 544 \def\temp{#1}% 545 \ifx\thisenv\temp 546 \else 547 \badenverr 548 \fi 549} 550 551% Environment mismatch, #1 expected: 552\def\badenverr{% 553 \errhelp = \EMsimple 554 \errmessage{This command can appear only \inenvironment\temp, 555 not \inenvironment\thisenv}% 556} 557\def\inenvironment#1{% 558 \ifx#1\empty 559 outside of any environment% 560 \else 561 in environment \expandafter\string#1% 562 \fi 563} 564 565% @end foo executes the definition of \Efoo. 566% But first, it executes a specialized version of \checkenv 567% 568\parseargdef\end{% 569 \if 1\csname iscond.#1\endcsname 570 \else 571 % The general wording of \badenverr may not be ideal. 572 \expandafter\checkenv\csname#1\endcsname 573 \csname E#1\endcsname 574 \endgroup 575 \fi 576} 577 578\newhelp\EMsimple{Press RETURN to continue.} 579 580 581% Be sure we're in horizontal mode when doing a tie, since we make space 582% equivalent to this in @example-like environments. Otherwise, a space 583% at the beginning of a line will start with \penalty -- and 584% since \penalty is valid in vertical mode, we'd end up putting the 585% penalty on the vertical list instead of in the new paragraph. 586{\catcode`@ = 11 587 % Avoid using \@M directly, because that causes trouble 588 % if the definition is written into an index file. 589 \global\let\tiepenalty = \@M 590 \gdef\tie{\leavevmode\penalty\tiepenalty\ } 591} 592 593% @: forces normal size whitespace following. 594\def\:{\spacefactor=1000 } 595 596% @* forces a line break. 597\def\*{\hfil\break\hbox{}\ignorespaces} 598 599% @/ allows a line break. 600\let\/=\allowbreak 601 602% @. is an end-of-sentence period. 603\def\.{.\spacefactor=\endofsentencespacefactor\space} 604 605% @! is an end-of-sentence bang. 606\def\!{!\spacefactor=\endofsentencespacefactor\space} 607 608% @? is an end-of-sentence query. 609\def\?{?\spacefactor=\endofsentencespacefactor\space} 610 611% @frenchspacing on|off says whether to put extra space after punctuation. 612% 613\def\onword{on} 614\def\offword{off} 615% 616\parseargdef\frenchspacing{% 617 \def\temp{#1}% 618 \ifx\temp\onword \plainfrenchspacing 619 \else\ifx\temp\offword \plainnonfrenchspacing 620 \else 621 \errhelp = \EMsimple 622 \errmessage{Unknown @frenchspacing option `\temp', must be on|off}% 623 \fi\fi 624} 625 626% @w prevents a word break. Without the \leavevmode, @w at the 627% beginning of a paragraph, when TeX is still in vertical mode, would 628% produce a whole line of output instead of starting the paragraph. 629\def\w#1{\leavevmode\hbox{#1}} 630 631% @group ... @end group forces ... to be all on one page, by enclosing 632% it in a TeX vbox. We use \vtop instead of \vbox to construct the box 633% to keep its height that of a normal line. According to the rules for 634% \topskip (p.114 of the TeXbook), the glue inserted is 635% max (\topskip - \ht (first item), 0). If that height is large, 636% therefore, no glue is inserted, and the space between the headline and 637% the text is small, which looks bad. 638% 639% Another complication is that the group might be very large. This can 640% cause the glue on the previous page to be unduly stretched, because it 641% does not have much material. In this case, it's better to add an 642% explicit \vfill so that the extra space is at the bottom. The 643% threshold for doing this is if the group is more than \vfilllimit 644% percent of a page (\vfilllimit can be changed inside of @tex). 645% 646\newbox\groupbox 647\def\vfilllimit{0.7} 648% 649\envdef\group{% 650 \ifnum\catcode`\^^M=\active \else 651 \errhelp = \groupinvalidhelp 652 \errmessage{@group invalid in context where filling is enabled}% 653 \fi 654 \startsavinginserts 655 % 656 \setbox\groupbox = \vtop\bgroup 657 % Do @comment since we are called inside an environment such as 658 % @example, where each end-of-line in the input causes an 659 % end-of-line in the output. We don't want the end-of-line after 660 % the `@group' to put extra space in the output. Since @group 661 % should appear on a line by itself (according to the Texinfo 662 % manual), we don't worry about eating any user text. 663 \comment 664} 665% 666% The \vtop produces a box with normal height and large depth; thus, TeX puts 667% \baselineskip glue before it, and (when the next line of text is done) 668% \lineskip glue after it. Thus, space below is not quite equal to space 669% above. But it's pretty close. 670\def\Egroup{% 671 % To get correct interline space between the last line of the group 672 % and the first line afterwards, we have to propagate \prevdepth. 673 \endgraf % Not \par, as it may have been set to \lisppar. 674 \global\dimen1 = \prevdepth 675 \egroup % End the \vtop. 676 % \dimen0 is the vertical size of the group's box. 677 \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox 678 % \dimen2 is how much space is left on the page (more or less). 679 \dimen2 = \pageheight \advance\dimen2 by -\pagetotal 680 % if the group doesn't fit on the current page, and it's a big big 681 % group, force a page break. 682 \ifdim \dimen0 > \dimen2 683 \ifdim \pagetotal < \vfilllimit\pageheight 684 \page 685 \fi 686 \fi 687 \box\groupbox 688 \prevdepth = \dimen1 689 \checkinserts 690} 691% 692% TeX puts in an \escapechar (i.e., `@') at the beginning of the help 693% message, so this ends up printing `@group can only ...'. 694% 695\newhelp\groupinvalidhelp{% 696group can only be used in environments such as @example,^^J% 697where each line of input produces a line of output.} 698 699% @need space-in-mils 700% forces a page break if there is not space-in-mils remaining. 701 702\newdimen\mil \mil=0.001in 703 704\parseargdef\need{% 705 % Ensure vertical mode, so we don't make a big box in the middle of a 706 % paragraph. 707 \par 708 % 709 % If the @need value is less than one line space, it's useless. 710 \dimen0 = #1\mil 711 \dimen2 = \ht\strutbox 712 \advance\dimen2 by \dp\strutbox 713 \ifdim\dimen0 > \dimen2 714 % 715 % Do a \strut just to make the height of this box be normal, so the 716 % normal leading is inserted relative to the preceding line. 717 % And a page break here is fine. 718 \vtop to #1\mil{\strut\vfil}% 719 % 720 % TeX does not even consider page breaks if a penalty added to the 721 % main vertical list is 10000 or more. But in order to see if the 722 % empty box we just added fits on the page, we must make it consider 723 % page breaks. On the other hand, we don't want to actually break the 724 % page after the empty box. So we use a penalty of 9999. 725 % 726 % There is an extremely small chance that TeX will actually break the 727 % page at this \penalty, if there are no other feasible breakpoints in 728 % sight. (If the user is using lots of big @group commands, which 729 % almost-but-not-quite fill up a page, TeX will have a hard time doing 730 % good page breaking, for example.) However, I could not construct an 731 % example where a page broke at this \penalty; if it happens in a real 732 % document, then we can reconsider our strategy. 733 \penalty9999 734 % 735 % Back up by the size of the box, whether we did a page break or not. 736 \kern -#1\mil 737 % 738 % Do not allow a page break right after this kern. 739 \nobreak 740 \fi 741} 742 743% @br forces paragraph break (and is undocumented). 744 745\let\br = \par 746 747% @page forces the start of a new page. 748% 749\def\page{\par\vfill\supereject} 750 751% @exdent text.... 752% outputs text on separate line in roman font, starting at standard page margin 753 754% This records the amount of indent in the innermost environment. 755% That's how much \exdent should take out. 756\newskip\exdentamount 757 758% This defn is used inside fill environments such as @defun. 759\parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break} 760 761% This defn is used inside nofill environments such as @example. 762\parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount 763 \leftline{\hskip\leftskip{\rm#1}}}} 764 765% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current 766% paragraph. For more general purposes, use the \margin insertion 767% class. WHICH is `l' or `r'. Not documented, written for gawk manual. 768% 769\newskip\inmarginspacing \inmarginspacing=1cm 770\def\strutdepth{\dp\strutbox} 771% 772\def\doinmargin#1#2{\strut\vadjust{% 773 \nobreak 774 \kern-\strutdepth 775 \vtop to \strutdepth{% 776 \baselineskip=\strutdepth 777 \vss 778 % if you have multiple lines of stuff to put here, you'll need to 779 % make the vbox yourself of the appropriate size. 780 \ifx#1l% 781 \llap{\ignorespaces #2\hskip\inmarginspacing}% 782 \else 783 \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}% 784 \fi 785 \null 786 }% 787}} 788\def\inleftmargin{\doinmargin l} 789\def\inrightmargin{\doinmargin r} 790% 791% @inmargin{TEXT [, RIGHT-TEXT]} 792% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right; 793% else use TEXT for both). 794% 795\def\inmargin#1{\parseinmargin #1,,\finish} 796\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing. 797 \setbox0 = \hbox{\ignorespaces #2}% 798 \ifdim\wd0 > 0pt 799 \def\lefttext{#1}% have both texts 800 \def\righttext{#2}% 801 \else 802 \def\lefttext{#1}% have only one text 803 \def\righttext{#1}% 804 \fi 805 % 806 \ifodd\pageno 807 \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin 808 \else 809 \def\temp{\inleftmargin\lefttext}% 810 \fi 811 \temp 812} 813 814% @| inserts a changebar to the left of the current line. It should 815% surround any changed text. This approach does *not* work if the 816% change spans more than two lines of output. To handle that, we would 817% have adopt a much more difficult approach (putting marks into the main 818% vertical list for the beginning and end of each change). This command 819% is not documented, not supported, and doesn't work. 820% 821\def\|{% 822 % \vadjust can only be used in horizontal mode. 823 \leavevmode 824 % 825 % Append this vertical mode material after the current line in the output. 826 \vadjust{% 827 % We want to insert a rule with the height and depth of the current 828 % leading; that is exactly what \strutbox is supposed to record. 829 \vskip-\baselineskip 830 % 831 % \vadjust-items are inserted at the left edge of the type. So 832 % the \llap here moves out into the left-hand margin. 833 \llap{% 834 % 835 % For a thicker or thinner bar, change the `1pt'. 836 \vrule height\baselineskip width1pt 837 % 838 % This is the space between the bar and the text. 839 \hskip 12pt 840 }% 841 }% 842} 843 844% @include FILE -- \input text of FILE. 845% 846\def\include{\parseargusing\filenamecatcodes\includezzz} 847\def\includezzz#1{% 848 \pushthisfilestack 849 \def\thisfile{#1}% 850 {% 851 \makevalueexpandable % we want to expand any @value in FILE. 852 \turnoffactive % and allow special characters in the expansion 853 \indexnofonts % Allow `@@' and other weird things in file names. 854 \wlog{texinfo.tex: doing @include of #1^^J}% 855 \edef\temp{\noexpand\input #1 }% 856 % 857 % This trickery is to read FILE outside of a group, in case it makes 858 % definitions, etc. 859 \expandafter 860 }\temp 861 \popthisfilestack 862} 863\def\filenamecatcodes{% 864 \catcode`\\=\other 865 \catcode`~=\other 866 \catcode`^=\other 867 \catcode`_=\other 868 \catcode`|=\other 869 \catcode`<=\other 870 \catcode`>=\other 871 \catcode`+=\other 872 \catcode`-=\other 873 \catcode`\`=\other 874 \catcode`\'=\other 875} 876 877\def\pushthisfilestack{% 878 \expandafter\pushthisfilestackX\popthisfilestack\StackTerm 879} 880\def\pushthisfilestackX{% 881 \expandafter\pushthisfilestackY\thisfile\StackTerm 882} 883\def\pushthisfilestackY #1\StackTerm #2\StackTerm {% 884 \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}% 885} 886 887\def\popthisfilestack{\errthisfilestackempty} 888\def\errthisfilestackempty{\errmessage{Internal error: 889 the stack of filenames is empty.}} 890% 891\def\thisfile{} 892 893% @center line 894% outputs that line, centered. 895% 896\parseargdef\center{% 897 \ifhmode 898 \let\centersub\centerH 899 \else 900 \let\centersub\centerV 901 \fi 902 \centersub{\hfil \ignorespaces#1\unskip \hfil}% 903 \let\centersub\relax % don't let the definition persist, just in case 904} 905\def\centerH#1{{% 906 \hfil\break 907 \advance\hsize by -\leftskip 908 \advance\hsize by -\rightskip 909 \line{#1}% 910 \break 911}} 912% 913\newcount\centerpenalty 914\def\centerV#1{% 915 % The idea here is the same as in \startdefun, \cartouche, etc.: if 916 % @center is the first thing after a section heading, we need to wipe 917 % out the negative parskip inserted by \sectionheading, but still 918 % prevent a page break here. 919 \centerpenalty = \lastpenalty 920 \ifnum\centerpenalty>10000 \vskip\parskip \fi 921 \ifnum\centerpenalty>9999 \penalty\centerpenalty \fi 922 \line{\kern\leftskip #1\kern\rightskip}% 923} 924 925% @sp n outputs n lines of vertical space 926% 927\parseargdef\sp{\vskip #1\baselineskip} 928 929% @comment ...line which is ignored... 930% @c is the same as @comment 931% @ignore ... @end ignore is another way to write a comment 932% 933\def\comment{\begingroup \catcode`\^^M=\other% 934\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other% 935\commentxxx} 936{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}} 937% 938\let\c=\comment 939 940% @paragraphindent NCHARS 941% We'll use ems for NCHARS, close enough. 942% NCHARS can also be the word `asis' or `none'. 943% We cannot feasibly implement @paragraphindent asis, though. 944% 945\def\asisword{asis} % no translation, these are keywords 946\def\noneword{none} 947% 948\parseargdef\paragraphindent{% 949 \def\temp{#1}% 950 \ifx\temp\asisword 951 \else 952 \ifx\temp\noneword 953 \defaultparindent = 0pt 954 \else 955 \defaultparindent = #1em 956 \fi 957 \fi 958 \parindent = \defaultparindent 959} 960 961% @exampleindent NCHARS 962% We'll use ems for NCHARS like @paragraphindent. 963% It seems @exampleindent asis isn't necessary, but 964% I preserve it to make it similar to @paragraphindent. 965\parseargdef\exampleindent{% 966 \def\temp{#1}% 967 \ifx\temp\asisword 968 \else 969 \ifx\temp\noneword 970 \lispnarrowing = 0pt 971 \else 972 \lispnarrowing = #1em 973 \fi 974 \fi 975} 976 977% @firstparagraphindent WORD 978% If WORD is `none', then suppress indentation of the first paragraph 979% after a section heading. If WORD is `insert', then do indent at such 980% paragraphs. 981% 982% The paragraph indentation is suppressed or not by calling 983% \suppressfirstparagraphindent, which the sectioning commands do. 984% We switch the definition of this back and forth according to WORD. 985% By default, we suppress indentation. 986% 987\def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent} 988\def\insertword{insert} 989% 990\parseargdef\firstparagraphindent{% 991 \def\temp{#1}% 992 \ifx\temp\noneword 993 \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent 994 \else\ifx\temp\insertword 995 \let\suppressfirstparagraphindent = \relax 996 \else 997 \errhelp = \EMsimple 998 \errmessage{Unknown @firstparagraphindent option `\temp'}% 999 \fi\fi 1000} 1001 1002% Here is how we actually suppress indentation. Redefine \everypar to 1003% \kern backwards by \parindent, and then reset itself to empty. 1004% 1005% We also make \indent itself not actually do anything until the next 1006% paragraph. 1007% 1008\gdef\dosuppressfirstparagraphindent{% 1009 \gdef\indent{% 1010 \restorefirstparagraphindent 1011 \indent 1012 }% 1013 \gdef\noindent{% 1014 \restorefirstparagraphindent 1015 \noindent 1016 }% 1017 \global\everypar = {% 1018 \kern -\parindent 1019 \restorefirstparagraphindent 1020 }% 1021} 1022 1023\gdef\restorefirstparagraphindent{% 1024 \global \let \indent = \ptexindent 1025 \global \let \noindent = \ptexnoindent 1026 \global \everypar = {}% 1027} 1028 1029 1030% @refill is a no-op. 1031\let\refill=\relax 1032 1033% If working on a large document in chapters, it is convenient to 1034% be able to disable indexing, cross-referencing, and contents, for test runs. 1035% This is done with @novalidate (before @setfilename). 1036% 1037\newif\iflinks \linkstrue % by default we want the aux files. 1038\let\novalidate = \linksfalse 1039 1040% @setfilename is done at the beginning of every texinfo file. 1041% So open here the files we need to have open while reading the input. 1042% This makes it possible to make a .fmt file for texinfo. 1043\def\setfilename{% 1044 \fixbackslash % Turn off hack to swallow `\input texinfo'. 1045 \iflinks 1046 \tryauxfile 1047 % Open the new aux file. TeX will close it automatically at exit. 1048 \immediate\openout\auxfile=\jobname.aux 1049 \fi % \openindices needs to do some work in any case. 1050 \openindices 1051 \let\setfilename=\comment % Ignore extra @setfilename cmds. 1052 % 1053 % If texinfo.cnf is present on the system, read it. 1054 % Useful for site-wide @afourpaper, etc. 1055 \openin 1 texinfo.cnf 1056 \ifeof 1 \else \input texinfo.cnf \fi 1057 \closein 1 1058 % 1059 \comment % Ignore the actual filename. 1060} 1061 1062% Called from \setfilename. 1063% 1064\def\openindices{% 1065 \newindex{cp}% 1066 \newcodeindex{fn}% 1067 \newcodeindex{vr}% 1068 \newcodeindex{tp}% 1069 \newcodeindex{ky}% 1070 \newcodeindex{pg}% 1071} 1072 1073% @bye. 1074\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} 1075 1076 1077\message{pdf,} 1078% adobe `portable' document format 1079\newcount\tempnum 1080\newcount\lnkcount 1081\newtoks\filename 1082\newcount\filenamelength 1083\newcount\pgn 1084\newtoks\toksA 1085\newtoks\toksB 1086\newtoks\toksC 1087\newtoks\toksD 1088\newbox\boxA 1089\newcount\countA 1090\newif\ifpdf 1091\newif\ifpdfmakepagedest 1092 1093% when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1 1094% can be set). So we test for \relax and 0 as well as being undefined. 1095\ifx\pdfoutput\thisisundefined 1096\else 1097 \ifx\pdfoutput\relax 1098 \else 1099 \ifcase\pdfoutput 1100 \else 1101 \pdftrue 1102 \fi 1103 \fi 1104\fi 1105 1106% PDF uses PostScript string constants for the names of xref targets, 1107% for display in the outlines, and in other places. Thus, we have to 1108% double any backslashes. Otherwise, a name like "\node" will be 1109% interpreted as a newline (\n), followed by o, d, e. Not good. 1110% 1111% See http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html and 1112% related messages. The final outcome is that it is up to the TeX user 1113% to double the backslashes and otherwise make the string valid, so 1114% that's what we do. pdftex 1.30.0 (ca.2005) introduced a primitive to 1115% do this reliably, so we use it. 1116 1117% #1 is a control sequence in which to do the replacements, 1118% which we \xdef. 1119\def\txiescapepdf#1{% 1120 \ifx\pdfescapestring\relax 1121 % No primitive available; should we give a warning or log? 1122 % Many times it won't matter. 1123 \else 1124 % The expandable \pdfescapestring primitive escapes parentheses, 1125 % backslashes, and other special chars. 1126 \xdef#1{\pdfescapestring{#1}}% 1127 \fi 1128} 1129 1130\newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images 1131with PDF output, and none of those formats could be found. (.eps cannot 1132be supported due to the design of the PDF format; use regular TeX (DVI 1133output) for that.)} 1134 1135\ifpdf 1136 % 1137 % Color manipulation macros based on pdfcolor.tex, 1138 % except using rgb instead of cmyk; the latter is said to render as a 1139 % very dark gray on-screen and a very dark halftone in print, instead 1140 % of actual black. 1141 \def\rgbDarkRed{0.50 0.09 0.12} 1142 \def\rgbBlack{0 0 0} 1143 % 1144 % k sets the color for filling (usual text, etc.); 1145 % K sets the color for stroking (thin rules, e.g., normal _'s). 1146 \def\pdfsetcolor#1{\pdfliteral{#1 rg #1 RG}} 1147 % 1148 % Set color, and create a mark which defines \thiscolor accordingly, 1149 % so that \makeheadline knows which color to restore. 1150 \def\setcolor#1{% 1151 \xdef\lastcolordefs{\gdef\noexpand\thiscolor{#1}}% 1152 \domark 1153 \pdfsetcolor{#1}% 1154 } 1155 % 1156 \def\maincolor{\rgbBlack} 1157 \pdfsetcolor{\maincolor} 1158 \edef\thiscolor{\maincolor} 1159 \def\lastcolordefs{} 1160 % 1161 \def\makefootline{% 1162 \baselineskip24pt 1163 \line{\pdfsetcolor{\maincolor}\the\footline}% 1164 } 1165 % 1166 \def\makeheadline{% 1167 \vbox to 0pt{% 1168 \vskip-22.5pt 1169 \line{% 1170 \vbox to8.5pt{}% 1171 % Extract \thiscolor definition from the marks. 1172 \getcolormarks 1173 % Typeset the headline with \maincolor, then restore the color. 1174 \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}% 1175 }% 1176 \vss 1177 }% 1178 \nointerlineskip 1179 } 1180 % 1181 % 1182 \pdfcatalog{/PageMode /UseOutlines} 1183 % 1184 % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto). 1185 \def\dopdfimage#1#2#3{% 1186 \def\pdfimagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}% 1187 \def\pdfimageheight{#3}\setbox2 = \hbox{\ignorespaces #3}% 1188 % 1189 % pdftex (and the PDF format) support .pdf, .png, .jpg (among 1190 % others). Let's try in that order, PDF first since if 1191 % someone has a scalable image, presumably better to use that than a 1192 % bitmap. 1193 \let\pdfimgext=\empty 1194 \begingroup 1195 \openin 1 #1.pdf \ifeof 1 1196 \openin 1 #1.PDF \ifeof 1 1197 \openin 1 #1.png \ifeof 1 1198 \openin 1 #1.jpg \ifeof 1 1199 \openin 1 #1.jpeg \ifeof 1 1200 \openin 1 #1.JPG \ifeof 1 1201 \errhelp = \nopdfimagehelp 1202 \errmessage{Could not find image file #1 for pdf}% 1203 \else \gdef\pdfimgext{JPG}% 1204 \fi 1205 \else \gdef\pdfimgext{jpeg}% 1206 \fi 1207 \else \gdef\pdfimgext{jpg}% 1208 \fi 1209 \else \gdef\pdfimgext{png}% 1210 \fi 1211 \else \gdef\pdfimgext{PDF}% 1212 \fi 1213 \else \gdef\pdfimgext{pdf}% 1214 \fi 1215 \closein 1 1216 \endgroup 1217 % 1218 % without \immediate, ancient pdftex seg faults when the same image is 1219 % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.) 1220 \ifnum\pdftexversion < 14 1221 \immediate\pdfimage 1222 \else 1223 \immediate\pdfximage 1224 \fi 1225 \ifdim \wd0 >0pt width \pdfimagewidth \fi 1226 \ifdim \wd2 >0pt height \pdfimageheight \fi 1227 \ifnum\pdftexversion<13 1228 #1.\pdfimgext 1229 \else 1230 {#1.\pdfimgext}% 1231 \fi 1232 \ifnum\pdftexversion < 14 \else 1233 \pdfrefximage \pdflastximage 1234 \fi} 1235 % 1236 \def\pdfmkdest#1{{% 1237 % We have to set dummies so commands such as @code, and characters 1238 % such as \, aren't expanded when present in a section title. 1239 \indexnofonts 1240 \turnoffactive 1241 \makevalueexpandable 1242 \def\pdfdestname{#1}% 1243 \txiescapepdf\pdfdestname 1244 \safewhatsit{\pdfdest name{\pdfdestname} xyz}% 1245 }} 1246 % 1247 % used to mark target names; must be expandable. 1248 \def\pdfmkpgn#1{#1} 1249 % 1250 % by default, use a color that is dark enough to print on paper as 1251 % nearly black, but still distinguishable for online viewing. 1252 \def\urlcolor{\rgbDarkRed} 1253 \def\linkcolor{\rgbDarkRed} 1254 \def\endlink{\setcolor{\maincolor}\pdfendlink} 1255 % 1256 % Adding outlines to PDF; macros for calculating structure of outlines 1257 % come from Petr Olsak 1258 \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0% 1259 \else \csname#1\endcsname \fi} 1260 \def\advancenumber#1{\tempnum=\expnumber{#1}\relax 1261 \advance\tempnum by 1 1262 \expandafter\xdef\csname#1\endcsname{\the\tempnum}} 1263 % 1264 % #1 is the section text, which is what will be displayed in the 1265 % outline by the pdf viewer. #2 is the pdf expression for the number 1266 % of subentries (or empty, for subsubsections). #3 is the node text, 1267 % which might be empty if this toc entry had no corresponding node. 1268 % #4 is the page number 1269 % 1270 \def\dopdfoutline#1#2#3#4{% 1271 % Generate a link to the node text if that exists; else, use the 1272 % page number. We could generate a destination for the section 1273 % text in the case where a section has no node, but it doesn't 1274 % seem worth the trouble, since most documents are normally structured. 1275 \edef\pdfoutlinedest{#3}% 1276 \ifx\pdfoutlinedest\empty 1277 \def\pdfoutlinedest{#4}% 1278 \else 1279 \txiescapepdf\pdfoutlinedest 1280 \fi 1281 % 1282 % Also escape PDF chars in the display string. 1283 \edef\pdfoutlinetext{#1}% 1284 \txiescapepdf\pdfoutlinetext 1285 % 1286 \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}% 1287 } 1288 % 1289 \def\pdfmakeoutlines{% 1290 \begingroup 1291 % Read toc silently, to get counts of subentries for \pdfoutline. 1292 \def\partentry##1##2##3##4{}% ignore parts in the outlines 1293 \def\numchapentry##1##2##3##4{% 1294 \def\thischapnum{##2}% 1295 \def\thissecnum{0}% 1296 \def\thissubsecnum{0}% 1297 }% 1298 \def\numsecentry##1##2##3##4{% 1299 \advancenumber{chap\thischapnum}% 1300 \def\thissecnum{##2}% 1301 \def\thissubsecnum{0}% 1302 }% 1303 \def\numsubsecentry##1##2##3##4{% 1304 \advancenumber{sec\thissecnum}% 1305 \def\thissubsecnum{##2}% 1306 }% 1307 \def\numsubsubsecentry##1##2##3##4{% 1308 \advancenumber{subsec\thissubsecnum}% 1309 }% 1310 \def\thischapnum{0}% 1311 \def\thissecnum{0}% 1312 \def\thissubsecnum{0}% 1313 % 1314 % use \def rather than \let here because we redefine \chapentry et 1315 % al. a second time, below. 1316 \def\appentry{\numchapentry}% 1317 \def\appsecentry{\numsecentry}% 1318 \def\appsubsecentry{\numsubsecentry}% 1319 \def\appsubsubsecentry{\numsubsubsecentry}% 1320 \def\unnchapentry{\numchapentry}% 1321 \def\unnsecentry{\numsecentry}% 1322 \def\unnsubsecentry{\numsubsecentry}% 1323 \def\unnsubsubsecentry{\numsubsubsecentry}% 1324 \readdatafile{toc}% 1325 % 1326 % Read toc second time, this time actually producing the outlines. 1327 % The `-' means take the \expnumber as the absolute number of 1328 % subentries, which we calculated on our first read of the .toc above. 1329 % 1330 % We use the node names as the destinations. 1331 \def\numchapentry##1##2##3##4{% 1332 \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}% 1333 \def\numsecentry##1##2##3##4{% 1334 \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}% 1335 \def\numsubsecentry##1##2##3##4{% 1336 \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}% 1337 \def\numsubsubsecentry##1##2##3##4{% count is always zero 1338 \dopdfoutline{##1}{}{##3}{##4}}% 1339 % 1340 % PDF outlines are displayed using system fonts, instead of 1341 % document fonts. Therefore we cannot use special characters, 1342 % since the encoding is unknown. For example, the eogonek from 1343 % Latin 2 (0xea) gets translated to a | character. Info from 1344 % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100. 1345 % 1346 % TODO this right, we have to translate 8-bit characters to 1347 % their "best" equivalent, based on the @documentencoding. Too 1348 % much work for too little return. Just use the ASCII equivalents 1349 % we use for the index sort strings. 1350 % 1351 \indexnofonts 1352 \setupdatafile 1353 % We can have normal brace characters in the PDF outlines, unlike 1354 % Texinfo index files. So set that up. 1355 \def\{{\lbracecharliteral}% 1356 \def\}{\rbracecharliteral}% 1357 \catcode`\\=\active \otherbackslash 1358 \input \tocreadfilename 1359 \endgroup 1360 } 1361 {\catcode`[=1 \catcode`]=2 1362 \catcode`{=\other \catcode`}=\other 1363 \gdef\lbracecharliteral[{]% 1364 \gdef\rbracecharliteral[}]% 1365 ] 1366 % 1367 \def\skipspaces#1{\def\PP{#1}\def\D{|}% 1368 \ifx\PP\D\let\nextsp\relax 1369 \else\let\nextsp\skipspaces 1370 \ifx\p\space\else\addtokens{\filename}{\PP}% 1371 \advance\filenamelength by 1 1372 \fi 1373 \fi 1374 \nextsp} 1375 \def\getfilename#1{% 1376 \filenamelength=0 1377 % If we don't expand the argument now, \skipspaces will get 1378 % snagged on things like "@value{foo}". 1379 \edef\temp{#1}% 1380 \expandafter\skipspaces\temp|\relax 1381 } 1382 \ifnum\pdftexversion < 14 1383 \let \startlink \pdfannotlink 1384 \else 1385 \let \startlink \pdfstartlink 1386 \fi 1387 % make a live url in pdf output. 1388 \def\pdfurl#1{% 1389 \begingroup 1390 % it seems we really need yet another set of dummies; have not 1391 % tried to figure out what each command should do in the context 1392 % of @url. for now, just make @/ a no-op, that's the only one 1393 % people have actually reported a problem with. 1394 % 1395 \normalturnoffactive 1396 \def\@{@}% 1397 \let\/=\empty 1398 \makevalueexpandable 1399 % do we want to go so far as to use \indexnofonts instead of just 1400 % special-casing \var here? 1401 \def\var##1{##1}% 1402 % 1403 \leavevmode\setcolor{\urlcolor}% 1404 \startlink attr{/Border [0 0 0]}% 1405 user{/Subtype /Link /A << /S /URI /URI (#1) >>}% 1406 \endgroup} 1407 \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}} 1408 \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks} 1409 \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks} 1410 \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}} 1411 \def\maketoks{% 1412 \expandafter\poptoks\the\toksA|ENDTOKS|\relax 1413 \ifx\first0\adn0 1414 \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3 1415 \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6 1416 \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 1417 \else 1418 \ifnum0=\countA\else\makelink\fi 1419 \ifx\first.\let\next=\done\else 1420 \let\next=\maketoks 1421 \addtokens{\toksB}{\the\toksD} 1422 \ifx\first,\addtokens{\toksB}{\space}\fi 1423 \fi 1424 \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi 1425 \next} 1426 \def\makelink{\addtokens{\toksB}% 1427 {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} 1428 \def\pdflink#1{% 1429 \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}} 1430 \setcolor{\linkcolor}#1\endlink} 1431 \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} 1432\else 1433 % non-pdf mode 1434 \let\pdfmkdest = \gobble 1435 \let\pdfurl = \gobble 1436 \let\endlink = \relax 1437 \let\setcolor = \gobble 1438 \let\pdfsetcolor = \gobble 1439 \let\pdfmakeoutlines = \relax 1440\fi % \ifx\pdfoutput 1441 1442 1443\message{fonts,} 1444 1445% Change the current font style to #1, remembering it in \curfontstyle. 1446% For now, we do not accumulate font styles: @b{@i{foo}} prints foo in 1447% italics, not bold italics. 1448% 1449\def\setfontstyle#1{% 1450 \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd. 1451 \csname ten#1\endcsname % change the current font 1452} 1453 1454% Select #1 fonts with the current style. 1455% 1456\def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname} 1457 1458\def\rm{\fam=0 \setfontstyle{rm}} 1459\def\it{\fam=\itfam \setfontstyle{it}} 1460\def\sl{\fam=\slfam \setfontstyle{sl}} 1461\def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf} 1462\def\tt{\fam=\ttfam \setfontstyle{tt}} 1463 1464% Unfortunately, we have to override this for titles and the like, since 1465% in those cases "rm" is bold. Sigh. 1466\def\rmisbold{\rm\def\curfontstyle{bf}} 1467 1468% Texinfo sort of supports the sans serif font style, which plain TeX does not. 1469% So we set up a \sf. 1470\newfam\sffam 1471\def\sf{\fam=\sffam \setfontstyle{sf}} 1472\let\li = \sf % Sometimes we call it \li, not \sf. 1473 1474% We don't need math for this font style. 1475\def\ttsl{\setfontstyle{ttsl}} 1476 1477 1478% Default leading. 1479\newdimen\textleading \textleading = 13.2pt 1480 1481% Set the baselineskip to #1, and the lineskip and strut size 1482% correspondingly. There is no deep meaning behind these magic numbers 1483% used as factors; they just match (closely enough) what Knuth defined. 1484% 1485\def\lineskipfactor{.08333} 1486\def\strutheightpercent{.70833} 1487\def\strutdepthpercent {.29167} 1488% 1489% can get a sort of poor man's double spacing by redefining this. 1490\def\baselinefactor{1} 1491% 1492\def\setleading#1{% 1493 \dimen0 = #1\relax 1494 \normalbaselineskip = \baselinefactor\dimen0 1495 \normallineskip = \lineskipfactor\normalbaselineskip 1496 \normalbaselines 1497 \setbox\strutbox =\hbox{% 1498 \vrule width0pt height\strutheightpercent\baselineskip 1499 depth \strutdepthpercent \baselineskip 1500 }% 1501} 1502 1503% PDF CMaps. See also LaTeX's t1.cmap. 1504% 1505% do nothing with this by default. 1506\expandafter\let\csname cmapOT1\endcsname\gobble 1507\expandafter\let\csname cmapOT1IT\endcsname\gobble 1508\expandafter\let\csname cmapOT1TT\endcsname\gobble 1509 1510% if we are producing pdf, and we have \pdffontattr, then define cmaps. 1511% (\pdffontattr was introduced many years ago, but people still run 1512% older pdftex's; it's easy to conditionalize, so we do.) 1513\ifpdf \ifx\pdffontattr\thisisundefined \else 1514 \begingroup 1515 \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. 1516 \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap 1517%%DocumentNeededResources: ProcSet (CIDInit) 1518%%IncludeResource: ProcSet (CIDInit) 1519%%BeginResource: CMap (TeX-OT1-0) 1520%%Title: (TeX-OT1-0 TeX OT1 0) 1521%%Version: 1.000 1522%%EndComments 1523/CIDInit /ProcSet findresource begin 152412 dict begin 1525begincmap 1526/CIDSystemInfo 1527<< /Registry (TeX) 1528/Ordering (OT1) 1529/Supplement 0 1530>> def 1531/CMapName /TeX-OT1-0 def 1532/CMapType 2 def 15331 begincodespacerange 1534<00> <7F> 1535endcodespacerange 15368 beginbfrange 1537<00> <01> <0393> 1538<09> <0A> <03A8> 1539<23> <26> <0023> 1540<28> <3B> <0028> 1541<3F> <5B> <003F> 1542<5D> <5E> <005D> 1543<61> <7A> <0061> 1544<7B> <7C> <2013> 1545endbfrange 154640 beginbfchar 1547<02> <0398> 1548<03> <039B> 1549<04> <039E> 1550<05> <03A0> 1551<06> <03A3> 1552<07> <03D2> 1553<08> <03A6> 1554<0B> <00660066> 1555<0C> <00660069> 1556<0D> <0066006C> 1557<0E> <006600660069> 1558<0F> <00660066006C> 1559<10> <0131> 1560<11> <0237> 1561<12> <0060> 1562<13> <00B4> 1563<14> <02C7> 1564<15> <02D8> 1565<16> <00AF> 1566<17> <02DA> 1567<18> <00B8> 1568<19> <00DF> 1569<1A> <00E6> 1570<1B> <0153> 1571<1C> <00F8> 1572<1D> <00C6> 1573<1E> <0152> 1574<1F> <00D8> 1575<21> <0021> 1576<22> <201D> 1577<27> <2019> 1578<3C> <00A1> 1579<3D> <003D> 1580<3E> <00BF> 1581<5C> <201C> 1582<5F> <02D9> 1583<60> <2018> 1584<7D> <02DD> 1585<7E> <007E> 1586<7F> <00A8> 1587endbfchar 1588endcmap 1589CMapName currentdict /CMap defineresource pop 1590end 1591end 1592%%EndResource 1593%%EOF 1594 }\endgroup 1595 \expandafter\edef\csname cmapOT1\endcsname#1{% 1596 \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% 1597 }% 1598% 1599% \cmapOT1IT 1600 \begingroup 1601 \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. 1602 \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap 1603%%DocumentNeededResources: ProcSet (CIDInit) 1604%%IncludeResource: ProcSet (CIDInit) 1605%%BeginResource: CMap (TeX-OT1IT-0) 1606%%Title: (TeX-OT1IT-0 TeX OT1IT 0) 1607%%Version: 1.000 1608%%EndComments 1609/CIDInit /ProcSet findresource begin 161012 dict begin 1611begincmap 1612/CIDSystemInfo 1613<< /Registry (TeX) 1614/Ordering (OT1IT) 1615/Supplement 0 1616>> def 1617/CMapName /TeX-OT1IT-0 def 1618/CMapType 2 def 16191 begincodespacerange 1620<00> <7F> 1621endcodespacerange 16228 beginbfrange 1623<00> <01> <0393> 1624<09> <0A> <03A8> 1625<25> <26> <0025> 1626<28> <3B> <0028> 1627<3F> <5B> <003F> 1628<5D> <5E> <005D> 1629<61> <7A> <0061> 1630<7B> <7C> <2013> 1631endbfrange 163242 beginbfchar 1633<02> <0398> 1634<03> <039B> 1635<04> <039E> 1636<05> <03A0> 1637<06> <03A3> 1638<07> <03D2> 1639<08> <03A6> 1640<0B> <00660066> 1641<0C> <00660069> 1642<0D> <0066006C> 1643<0E> <006600660069> 1644<0F> <00660066006C> 1645<10> <0131> 1646<11> <0237> 1647<12> <0060> 1648<13> <00B4> 1649<14> <02C7> 1650<15> <02D8> 1651<16> <00AF> 1652<17> <02DA> 1653<18> <00B8> 1654<19> <00DF> 1655<1A> <00E6> 1656<1B> <0153> 1657<1C> <00F8> 1658<1D> <00C6> 1659<1E> <0152> 1660<1F> <00D8> 1661<21> <0021> 1662<22> <201D> 1663<23> <0023> 1664<24> <00A3> 1665<27> <2019> 1666<3C> <00A1> 1667<3D> <003D> 1668<3E> <00BF> 1669<5C> <201C> 1670<5F> <02D9> 1671<60> <2018> 1672<7D> <02DD> 1673<7E> <007E> 1674<7F> <00A8> 1675endbfchar 1676endcmap 1677CMapName currentdict /CMap defineresource pop 1678end 1679end 1680%%EndResource 1681%%EOF 1682 }\endgroup 1683 \expandafter\edef\csname cmapOT1IT\endcsname#1{% 1684 \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% 1685 }% 1686% 1687% \cmapOT1TT 1688 \begingroup 1689 \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. 1690 \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap 1691%%DocumentNeededResources: ProcSet (CIDInit) 1692%%IncludeResource: ProcSet (CIDInit) 1693%%BeginResource: CMap (TeX-OT1TT-0) 1694%%Title: (TeX-OT1TT-0 TeX OT1TT 0) 1695%%Version: 1.000 1696%%EndComments 1697/CIDInit /ProcSet findresource begin 169812 dict begin 1699begincmap 1700/CIDSystemInfo 1701<< /Registry (TeX) 1702/Ordering (OT1TT) 1703/Supplement 0 1704>> def 1705/CMapName /TeX-OT1TT-0 def 1706/CMapType 2 def 17071 begincodespacerange 1708<00> <7F> 1709endcodespacerange 17105 beginbfrange 1711<00> <01> <0393> 1712<09> <0A> <03A8> 1713<21> <26> <0021> 1714<28> <5F> <0028> 1715<61> <7E> <0061> 1716endbfrange 171732 beginbfchar 1718<02> <0398> 1719<03> <039B> 1720<04> <039E> 1721<05> <03A0> 1722<06> <03A3> 1723<07> <03D2> 1724<08> <03A6> 1725<0B> <2191> 1726<0C> <2193> 1727<0D> <0027> 1728<0E> <00A1> 1729<0F> <00BF> 1730<10> <0131> 1731<11> <0237> 1732<12> <0060> 1733<13> <00B4> 1734<14> <02C7> 1735<15> <02D8> 1736<16> <00AF> 1737<17> <02DA> 1738<18> <00B8> 1739<19> <00DF> 1740<1A> <00E6> 1741<1B> <0153> 1742<1C> <00F8> 1743<1D> <00C6> 1744<1E> <0152> 1745<1F> <00D8> 1746<20> <2423> 1747<27> <2019> 1748<60> <2018> 1749<7F> <00A8> 1750endbfchar 1751endcmap 1752CMapName currentdict /CMap defineresource pop 1753end 1754end 1755%%EndResource 1756%%EOF 1757 }\endgroup 1758 \expandafter\edef\csname cmapOT1TT\endcsname#1{% 1759 \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% 1760 }% 1761\fi\fi 1762 1763 1764% Set the font macro #1 to the font named #2, adding on the 1765% specified font prefix (normally `cm'). 1766% #3 is the font's design size, #4 is a scale factor, #5 is the CMap 1767% encoding (currently only OT1, OT1IT and OT1TT are allowed, pass 1768% empty to omit). 1769\def\setfont#1#2#3#4#5{% 1770 \font#1=\fontprefix#2#3 scaled #4 1771 \csname cmap#5\endcsname#1% 1772} 1773% This is what gets called when #5 of \setfont is empty. 1774\let\cmap\gobble 1775% emacs-page end of cmaps 1776 1777% Use cm as the default font prefix. 1778% To specify the font prefix, you must define \fontprefix 1779% before you read in texinfo.tex. 1780\ifx\fontprefix\thisisundefined 1781\def\fontprefix{cm} 1782\fi 1783% Support font families that don't use the same naming scheme as CM. 1784\def\rmshape{r} 1785\def\rmbshape{bx} %where the normal face is bold 1786\def\bfshape{b} 1787\def\bxshape{bx} 1788\def\ttshape{tt} 1789\def\ttbshape{tt} 1790\def\ttslshape{sltt} 1791\def\itshape{ti} 1792\def\itbshape{bxti} 1793\def\slshape{sl} 1794\def\slbshape{bxsl} 1795\def\sfshape{ss} 1796\def\sfbshape{ss} 1797\def\scshape{csc} 1798\def\scbshape{csc} 1799 1800% Definitions for a main text size of 11pt. This is the default in 1801% Texinfo. 1802% 1803\def\definetextfontsizexi{% 1804% Text fonts (11.2pt, magstep1). 1805\def\textnominalsize{11pt} 1806\edef\mainmagstep{\magstephalf} 1807\setfont\textrm\rmshape{10}{\mainmagstep}{OT1} 1808\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} 1809\setfont\textbf\bfshape{10}{\mainmagstep}{OT1} 1810\setfont\textit\itshape{10}{\mainmagstep}{OT1IT} 1811\setfont\textsl\slshape{10}{\mainmagstep}{OT1} 1812\setfont\textsf\sfshape{10}{\mainmagstep}{OT1} 1813\setfont\textsc\scshape{10}{\mainmagstep}{OT1} 1814\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} 1815\font\texti=cmmi10 scaled \mainmagstep 1816\font\textsy=cmsy10 scaled \mainmagstep 1817\def\textecsize{1095} 1818 1819% A few fonts for @defun names and args. 1820\setfont\defbf\bfshape{10}{\magstep1}{OT1} 1821\setfont\deftt\ttshape{10}{\magstep1}{OT1TT} 1822\setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT} 1823\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} 1824 1825% Fonts for indices, footnotes, small examples (9pt). 1826\def\smallnominalsize{9pt} 1827\setfont\smallrm\rmshape{9}{1000}{OT1} 1828\setfont\smalltt\ttshape{9}{1000}{OT1TT} 1829\setfont\smallbf\bfshape{10}{900}{OT1} 1830\setfont\smallit\itshape{9}{1000}{OT1IT} 1831\setfont\smallsl\slshape{9}{1000}{OT1} 1832\setfont\smallsf\sfshape{9}{1000}{OT1} 1833\setfont\smallsc\scshape{10}{900}{OT1} 1834\setfont\smallttsl\ttslshape{10}{900}{OT1TT} 1835\font\smalli=cmmi9 1836\font\smallsy=cmsy9 1837\def\smallecsize{0900} 1838 1839% Fonts for small examples (8pt). 1840\def\smallernominalsize{8pt} 1841\setfont\smallerrm\rmshape{8}{1000}{OT1} 1842\setfont\smallertt\ttshape{8}{1000}{OT1TT} 1843\setfont\smallerbf\bfshape{10}{800}{OT1} 1844\setfont\smallerit\itshape{8}{1000}{OT1IT} 1845\setfont\smallersl\slshape{8}{1000}{OT1} 1846\setfont\smallersf\sfshape{8}{1000}{OT1} 1847\setfont\smallersc\scshape{10}{800}{OT1} 1848\setfont\smallerttsl\ttslshape{10}{800}{OT1TT} 1849\font\smalleri=cmmi8 1850\font\smallersy=cmsy8 1851\def\smallerecsize{0800} 1852 1853% Fonts for title page (20.4pt): 1854\def\titlenominalsize{20pt} 1855\setfont\titlerm\rmbshape{12}{\magstep3}{OT1} 1856\setfont\titleit\itbshape{10}{\magstep4}{OT1IT} 1857\setfont\titlesl\slbshape{10}{\magstep4}{OT1} 1858\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} 1859\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} 1860\setfont\titlesf\sfbshape{17}{\magstep1}{OT1} 1861\let\titlebf=\titlerm 1862\setfont\titlesc\scbshape{10}{\magstep4}{OT1} 1863\font\titlei=cmmi12 scaled \magstep3 1864\font\titlesy=cmsy10 scaled \magstep4 1865\def\titleecsize{2074} 1866 1867% Chapter (and unnumbered) fonts (17.28pt). 1868\def\chapnominalsize{17pt} 1869\setfont\chaprm\rmbshape{12}{\magstep2}{OT1} 1870\setfont\chapit\itbshape{10}{\magstep3}{OT1IT} 1871\setfont\chapsl\slbshape{10}{\magstep3}{OT1} 1872\setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT} 1873\setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT} 1874\setfont\chapsf\sfbshape{17}{1000}{OT1} 1875\let\chapbf=\chaprm 1876\setfont\chapsc\scbshape{10}{\magstep3}{OT1} 1877\font\chapi=cmmi12 scaled \magstep2 1878\font\chapsy=cmsy10 scaled \magstep3 1879\def\chapecsize{1728} 1880 1881% Section fonts (14.4pt). 1882\def\secnominalsize{14pt} 1883\setfont\secrm\rmbshape{12}{\magstep1}{OT1} 1884\setfont\secit\itbshape{10}{\magstep2}{OT1IT} 1885\setfont\secsl\slbshape{10}{\magstep2}{OT1} 1886\setfont\sectt\ttbshape{12}{\magstep1}{OT1TT} 1887\setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT} 1888\setfont\secsf\sfbshape{12}{\magstep1}{OT1} 1889\let\secbf\secrm 1890\setfont\secsc\scbshape{10}{\magstep2}{OT1} 1891\font\seci=cmmi12 scaled \magstep1 1892\font\secsy=cmsy10 scaled \magstep2 1893\def\sececsize{1440} 1894 1895% Subsection fonts (13.15pt). 1896\def\ssecnominalsize{13pt} 1897\setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1} 1898\setfont\ssecit\itbshape{10}{1315}{OT1IT} 1899\setfont\ssecsl\slbshape{10}{1315}{OT1} 1900\setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT} 1901\setfont\ssecttsl\ttslshape{10}{1315}{OT1TT} 1902\setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1} 1903\let\ssecbf\ssecrm 1904\setfont\ssecsc\scbshape{10}{1315}{OT1} 1905\font\sseci=cmmi12 scaled \magstephalf 1906\font\ssecsy=cmsy10 scaled 1315 1907\def\ssececsize{1200} 1908 1909% Reduced fonts for @acro in text (10pt). 1910\def\reducednominalsize{10pt} 1911\setfont\reducedrm\rmshape{10}{1000}{OT1} 1912\setfont\reducedtt\ttshape{10}{1000}{OT1TT} 1913\setfont\reducedbf\bfshape{10}{1000}{OT1} 1914\setfont\reducedit\itshape{10}{1000}{OT1IT} 1915\setfont\reducedsl\slshape{10}{1000}{OT1} 1916\setfont\reducedsf\sfshape{10}{1000}{OT1} 1917\setfont\reducedsc\scshape{10}{1000}{OT1} 1918\setfont\reducedttsl\ttslshape{10}{1000}{OT1TT} 1919\font\reducedi=cmmi10 1920\font\reducedsy=cmsy10 1921\def\reducedecsize{1000} 1922 1923\textleading = 13.2pt % line spacing for 11pt CM 1924\textfonts % reset the current fonts 1925\rm 1926} % end of 11pt text font size definitions 1927 1928 1929% Definitions to make the main text be 10pt Computer Modern, with 1930% section, chapter, etc., sizes following suit. This is for the GNU 1931% Press printing of the Emacs 22 manual. Maybe other manuals in the 1932% future. Used with @smallbook, which sets the leading to 12pt. 1933% 1934\def\definetextfontsizex{% 1935% Text fonts (10pt). 1936\def\textnominalsize{10pt} 1937\edef\mainmagstep{1000} 1938\setfont\textrm\rmshape{10}{\mainmagstep}{OT1} 1939\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} 1940\setfont\textbf\bfshape{10}{\mainmagstep}{OT1} 1941\setfont\textit\itshape{10}{\mainmagstep}{OT1IT} 1942\setfont\textsl\slshape{10}{\mainmagstep}{OT1} 1943\setfont\textsf\sfshape{10}{\mainmagstep}{OT1} 1944\setfont\textsc\scshape{10}{\mainmagstep}{OT1} 1945\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} 1946\font\texti=cmmi10 scaled \mainmagstep 1947\font\textsy=cmsy10 scaled \mainmagstep 1948\def\textecsize{1000} 1949 1950% A few fonts for @defun names and args. 1951\setfont\defbf\bfshape{10}{\magstephalf}{OT1} 1952\setfont\deftt\ttshape{10}{\magstephalf}{OT1TT} 1953\setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT} 1954\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} 1955 1956% Fonts for indices, footnotes, small examples (9pt). 1957\def\smallnominalsize{9pt} 1958\setfont\smallrm\rmshape{9}{1000}{OT1} 1959\setfont\smalltt\ttshape{9}{1000}{OT1TT} 1960\setfont\smallbf\bfshape{10}{900}{OT1} 1961\setfont\smallit\itshape{9}{1000}{OT1IT} 1962\setfont\smallsl\slshape{9}{1000}{OT1} 1963\setfont\smallsf\sfshape{9}{1000}{OT1} 1964\setfont\smallsc\scshape{10}{900}{OT1} 1965\setfont\smallttsl\ttslshape{10}{900}{OT1TT} 1966\font\smalli=cmmi9 1967\font\smallsy=cmsy9 1968\def\smallecsize{0900} 1969 1970% Fonts for small examples (8pt). 1971\def\smallernominalsize{8pt} 1972\setfont\smallerrm\rmshape{8}{1000}{OT1} 1973\setfont\smallertt\ttshape{8}{1000}{OT1TT} 1974\setfont\smallerbf\bfshape{10}{800}{OT1} 1975\setfont\smallerit\itshape{8}{1000}{OT1IT} 1976\setfont\smallersl\slshape{8}{1000}{OT1} 1977\setfont\smallersf\sfshape{8}{1000}{OT1} 1978\setfont\smallersc\scshape{10}{800}{OT1} 1979\setfont\smallerttsl\ttslshape{10}{800}{OT1TT} 1980\font\smalleri=cmmi8 1981\font\smallersy=cmsy8 1982\def\smallerecsize{0800} 1983 1984% Fonts for title page (20.4pt): 1985\def\titlenominalsize{20pt} 1986\setfont\titlerm\rmbshape{12}{\magstep3}{OT1} 1987\setfont\titleit\itbshape{10}{\magstep4}{OT1IT} 1988\setfont\titlesl\slbshape{10}{\magstep4}{OT1} 1989\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} 1990\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} 1991\setfont\titlesf\sfbshape{17}{\magstep1}{OT1} 1992\let\titlebf=\titlerm 1993\setfont\titlesc\scbshape{10}{\magstep4}{OT1} 1994\font\titlei=cmmi12 scaled \magstep3 1995\font\titlesy=cmsy10 scaled \magstep4 1996\def\titleecsize{2074} 1997 1998% Chapter fonts (14.4pt). 1999\def\chapnominalsize{14pt} 2000\setfont\chaprm\rmbshape{12}{\magstep1}{OT1} 2001\setfont\chapit\itbshape{10}{\magstep2}{OT1IT} 2002\setfont\chapsl\slbshape{10}{\magstep2}{OT1} 2003\setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT} 2004\setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT} 2005\setfont\chapsf\sfbshape{12}{\magstep1}{OT1} 2006\let\chapbf\chaprm 2007\setfont\chapsc\scbshape{10}{\magstep2}{OT1} 2008\font\chapi=cmmi12 scaled \magstep1 2009\font\chapsy=cmsy10 scaled \magstep2 2010\def\chapecsize{1440} 2011 2012% Section fonts (12pt). 2013\def\secnominalsize{12pt} 2014\setfont\secrm\rmbshape{12}{1000}{OT1} 2015\setfont\secit\itbshape{10}{\magstep1}{OT1IT} 2016\setfont\secsl\slbshape{10}{\magstep1}{OT1} 2017\setfont\sectt\ttbshape{12}{1000}{OT1TT} 2018\setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT} 2019\setfont\secsf\sfbshape{12}{1000}{OT1} 2020\let\secbf\secrm 2021\setfont\secsc\scbshape{10}{\magstep1}{OT1} 2022\font\seci=cmmi12 2023\font\secsy=cmsy10 scaled \magstep1 2024\def\sececsize{1200} 2025 2026% Subsection fonts (10pt). 2027\def\ssecnominalsize{10pt} 2028\setfont\ssecrm\rmbshape{10}{1000}{OT1} 2029\setfont\ssecit\itbshape{10}{1000}{OT1IT} 2030\setfont\ssecsl\slbshape{10}{1000}{OT1} 2031\setfont\ssectt\ttbshape{10}{1000}{OT1TT} 2032\setfont\ssecttsl\ttslshape{10}{1000}{OT1TT} 2033\setfont\ssecsf\sfbshape{10}{1000}{OT1} 2034\let\ssecbf\ssecrm 2035\setfont\ssecsc\scbshape{10}{1000}{OT1} 2036\font\sseci=cmmi10 2037\font\ssecsy=cmsy10 2038\def\ssececsize{1000} 2039 2040% Reduced fonts for @acro in text (9pt). 2041\def\reducednominalsize{9pt} 2042\setfont\reducedrm\rmshape{9}{1000}{OT1} 2043\setfont\reducedtt\ttshape{9}{1000}{OT1TT} 2044\setfont\reducedbf\bfshape{10}{900}{OT1} 2045\setfont\reducedit\itshape{9}{1000}{OT1IT} 2046\setfont\reducedsl\slshape{9}{1000}{OT1} 2047\setfont\reducedsf\sfshape{9}{1000}{OT1} 2048\setfont\reducedsc\scshape{10}{900}{OT1} 2049\setfont\reducedttsl\ttslshape{10}{900}{OT1TT} 2050\font\reducedi=cmmi9 2051\font\reducedsy=cmsy9 2052\def\reducedecsize{0900} 2053 2054\divide\parskip by 2 % reduce space between paragraphs 2055\textleading = 12pt % line spacing for 10pt CM 2056\textfonts % reset the current fonts 2057\rm 2058} % end of 10pt text font size definitions 2059 2060 2061% We provide the user-level command 2062% @fonttextsize 10 2063% (or 11) to redefine the text font size. pt is assumed. 2064% 2065\def\xiword{11} 2066\def\xword{10} 2067\def\xwordpt{10pt} 2068% 2069\parseargdef\fonttextsize{% 2070 \def\textsizearg{#1}% 2071 %\wlog{doing @fonttextsize \textsizearg}% 2072 % 2073 % Set \globaldefs so that documents can use this inside @tex, since 2074 % makeinfo 4.8 does not support it, but we need it nonetheless. 2075 % 2076 \begingroup \globaldefs=1 2077 \ifx\textsizearg\xword \definetextfontsizex 2078 \else \ifx\textsizearg\xiword \definetextfontsizexi 2079 \else 2080 \errhelp=\EMsimple 2081 \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'} 2082 \fi\fi 2083 \endgroup 2084} 2085 2086 2087% In order for the font changes to affect most math symbols and letters, 2088% we have to define the \textfont of the standard families. Since 2089% texinfo doesn't allow for producing subscripts and superscripts except 2090% in the main text, we don't bother to reset \scriptfont and 2091% \scriptscriptfont (which would also require loading a lot more fonts). 2092% 2093\def\resetmathfonts{% 2094 \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy 2095 \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf 2096 \textfont\ttfam=\tentt \textfont\sffam=\tensf 2097} 2098 2099% The font-changing commands redefine the meanings of \tenSTYLE, instead 2100% of just \STYLE. We do this because \STYLE needs to also set the 2101% current \fam for math mode. Our \STYLE (e.g., \rm) commands hardwire 2102% \tenSTYLE to set the current font. 2103% 2104% Each font-changing command also sets the names \lsize (one size lower) 2105% and \lllsize (three sizes lower). These relative commands are used in 2106% the LaTeX logo and acronyms. 2107% 2108% This all needs generalizing, badly. 2109% 2110\def\textfonts{% 2111 \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl 2112 \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc 2113 \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy 2114 \let\tenttsl=\textttsl 2115 \def\curfontsize{text}% 2116 \def\lsize{reduced}\def\lllsize{smaller}% 2117 \resetmathfonts \setleading{\textleading}} 2118\def\titlefonts{% 2119 \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl 2120 \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc 2121 \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy 2122 \let\tenttsl=\titlettsl 2123 \def\curfontsize{title}% 2124 \def\lsize{chap}\def\lllsize{subsec}% 2125 \resetmathfonts \setleading{27pt}} 2126\def\titlefont#1{{\titlefonts\rmisbold #1}} 2127\def\chapfonts{% 2128 \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl 2129 \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc 2130 \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy 2131 \let\tenttsl=\chapttsl 2132 \def\curfontsize{chap}% 2133 \def\lsize{sec}\def\lllsize{text}% 2134 \resetmathfonts \setleading{19pt}} 2135\def\secfonts{% 2136 \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl 2137 \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc 2138 \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy 2139 \let\tenttsl=\secttsl 2140 \def\curfontsize{sec}% 2141 \def\lsize{subsec}\def\lllsize{reduced}% 2142 \resetmathfonts \setleading{16pt}} 2143\def\subsecfonts{% 2144 \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl 2145 \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc 2146 \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy 2147 \let\tenttsl=\ssecttsl 2148 \def\curfontsize{ssec}% 2149 \def\lsize{text}\def\lllsize{small}% 2150 \resetmathfonts \setleading{15pt}} 2151\let\subsubsecfonts = \subsecfonts 2152\def\reducedfonts{% 2153 \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl 2154 \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc 2155 \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy 2156 \let\tenttsl=\reducedttsl 2157 \def\curfontsize{reduced}% 2158 \def\lsize{small}\def\lllsize{smaller}% 2159 \resetmathfonts \setleading{10.5pt}} 2160\def\smallfonts{% 2161 \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl 2162 \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc 2163 \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy 2164 \let\tenttsl=\smallttsl 2165 \def\curfontsize{small}% 2166 \def\lsize{smaller}\def\lllsize{smaller}% 2167 \resetmathfonts \setleading{10.5pt}} 2168\def\smallerfonts{% 2169 \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl 2170 \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc 2171 \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy 2172 \let\tenttsl=\smallerttsl 2173 \def\curfontsize{smaller}% 2174 \def\lsize{smaller}\def\lllsize{smaller}% 2175 \resetmathfonts \setleading{9.5pt}} 2176 2177% Fonts for short table of contents. 2178\setfont\shortcontrm\rmshape{12}{1000}{OT1} 2179\setfont\shortcontbf\bfshape{10}{\magstep1}{OT1} % no cmb12 2180\setfont\shortcontsl\slshape{12}{1000}{OT1} 2181\setfont\shortconttt\ttshape{12}{1000}{OT1TT} 2182 2183% Define these just so they can be easily changed for other fonts. 2184\def\angleleft{$\langle$} 2185\def\angleright{$\rangle$} 2186 2187% Set the fonts to use with the @small... environments. 2188\let\smallexamplefonts = \smallfonts 2189 2190% About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample 2191% can fit this many characters: 2192% 8.5x11=86 smallbook=72 a4=90 a5=69 2193% If we use \scriptfonts (8pt), then we can fit this many characters: 2194% 8.5x11=90+ smallbook=80 a4=90+ a5=77 2195% For me, subjectively, the few extra characters that fit aren't worth 2196% the additional smallness of 8pt. So I'm making the default 9pt. 2197% 2198% By the way, for comparison, here's what fits with @example (10pt): 2199% 8.5x11=71 smallbook=60 a4=75 a5=58 2200% --karl, 24jan03. 2201 2202% Set up the default fonts, so we can use them for creating boxes. 2203% 2204\definetextfontsizexi 2205 2206 2207\message{markup,} 2208 2209% Check if we are currently using a typewriter font. Since all the 2210% Computer Modern typewriter fonts have zero interword stretch (and 2211% shrink), and it is reasonable to expect all typewriter fonts to have 2212% this property, we can check that font parameter. 2213% 2214\def\ifmonospace{\ifdim\fontdimen3\font=0pt } 2215 2216% Markup style infrastructure. \defmarkupstylesetup\INITMACRO will 2217% define and register \INITMACRO to be called on markup style changes. 2218% \INITMACRO can check \currentmarkupstyle for the innermost 2219% style and the set of \ifmarkupSTYLE switches for all styles 2220% currently in effect. 2221\newif\ifmarkupvar 2222\newif\ifmarkupsamp 2223\newif\ifmarkupkey 2224%\newif\ifmarkupfile % @file == @samp. 2225%\newif\ifmarkupoption % @option == @samp. 2226\newif\ifmarkupcode 2227\newif\ifmarkupkbd 2228%\newif\ifmarkupenv % @env == @code. 2229%\newif\ifmarkupcommand % @command == @code. 2230\newif\ifmarkuptex % @tex (and part of @math, for now). 2231\newif\ifmarkupexample 2232\newif\ifmarkupverb 2233\newif\ifmarkupverbatim 2234 2235\let\currentmarkupstyle\empty 2236 2237\def\setupmarkupstyle#1{% 2238 \csname markup#1true\endcsname 2239 \def\currentmarkupstyle{#1}% 2240 \markupstylesetup 2241} 2242 2243\let\markupstylesetup\empty 2244 2245\def\defmarkupstylesetup#1{% 2246 \expandafter\def\expandafter\markupstylesetup 2247 \expandafter{\markupstylesetup #1}% 2248 \def#1% 2249} 2250 2251% Markup style setup for left and right quotes. 2252\defmarkupstylesetup\markupsetuplq{% 2253 \expandafter\let\expandafter \temp 2254 \csname markupsetuplq\currentmarkupstyle\endcsname 2255 \ifx\temp\relax \markupsetuplqdefault \else \temp \fi 2256} 2257 2258\defmarkupstylesetup\markupsetuprq{% 2259 \expandafter\let\expandafter \temp 2260 \csname markupsetuprq\currentmarkupstyle\endcsname 2261 \ifx\temp\relax \markupsetuprqdefault \else \temp \fi 2262} 2263 2264{ 2265\catcode`\'=\active 2266\catcode`\`=\active 2267 2268\gdef\markupsetuplqdefault{\let`\lq} 2269\gdef\markupsetuprqdefault{\let'\rq} 2270 2271\gdef\markupsetcodequoteleft{\let`\codequoteleft} 2272\gdef\markupsetcodequoteright{\let'\codequoteright} 2273 2274\gdef\markupsetnoligaturesquoteleft{\let`\noligaturesquoteleft} 2275} 2276 2277\let\markupsetuplqcode \markupsetcodequoteleft 2278\let\markupsetuprqcode \markupsetcodequoteright 2279% 2280\let\markupsetuplqexample \markupsetcodequoteleft 2281\let\markupsetuprqexample \markupsetcodequoteright 2282% 2283\let\markupsetuplqsamp \markupsetcodequoteleft 2284\let\markupsetuprqsamp \markupsetcodequoteright 2285% 2286\let\markupsetuplqverb \markupsetcodequoteleft 2287\let\markupsetuprqverb \markupsetcodequoteright 2288% 2289\let\markupsetuplqverbatim \markupsetcodequoteleft 2290\let\markupsetuprqverbatim \markupsetcodequoteright 2291 2292\let\markupsetuplqkbd \markupsetnoligaturesquoteleft 2293 2294% Allow an option to not use regular directed right quote/apostrophe 2295% (char 0x27), but instead the undirected quote from cmtt (char 0x0d). 2296% The undirected quote is ugly, so don't make it the default, but it 2297% works for pasting with more pdf viewers (at least evince), the 2298% lilypond developers report. xpdf does work with the regular 0x27. 2299% 2300\def\codequoteright{% 2301 \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax 2302 \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax 2303 '% 2304 \else \char'15 \fi 2305 \else \char'15 \fi 2306} 2307% 2308% and a similar option for the left quote char vs. a grave accent. 2309% Modern fonts display ASCII 0x60 as a grave accent, so some people like 2310% the code environments to do likewise. 2311% 2312\def\codequoteleft{% 2313 \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax 2314 \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax 2315 % [Knuth] pp. 380,381,391 2316 % \relax disables Spanish ligatures ?` and !` of \tt font. 2317 \relax`% 2318 \else \char'22 \fi 2319 \else \char'22 \fi 2320} 2321 2322% Commands to set the quote options. 2323% 2324\parseargdef\codequoteundirected{% 2325 \def\temp{#1}% 2326 \ifx\temp\onword 2327 \expandafter\let\csname SETtxicodequoteundirected\endcsname 2328 = t% 2329 \else\ifx\temp\offword 2330 \expandafter\let\csname SETtxicodequoteundirected\endcsname 2331 = \relax 2332 \else 2333 \errhelp = \EMsimple 2334 \errmessage{Unknown @codequoteundirected value `\temp', must be on|off}% 2335 \fi\fi 2336} 2337% 2338\parseargdef\codequotebacktick{% 2339 \def\temp{#1}% 2340 \ifx\temp\onword 2341 \expandafter\let\csname SETtxicodequotebacktick\endcsname 2342 = t% 2343 \else\ifx\temp\offword 2344 \expandafter\let\csname SETtxicodequotebacktick\endcsname 2345 = \relax 2346 \else 2347 \errhelp = \EMsimple 2348 \errmessage{Unknown @codequotebacktick value `\temp', must be on|off}% 2349 \fi\fi 2350} 2351 2352% [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font. 2353\def\noligaturesquoteleft{\relax\lq} 2354 2355% Count depth in font-changes, for error checks 2356\newcount\fontdepth \fontdepth=0 2357 2358% Font commands. 2359 2360% #1 is the font command (\sl or \it), #2 is the text to slant. 2361% If we are in a monospaced environment, however, 1) always use \ttsl, 2362% and 2) do not add an italic correction. 2363\def\dosmartslant#1#2{% 2364 \ifusingtt 2365 {{\ttsl #2}\let\next=\relax}% 2366 {\def\next{{#1#2}\futurelet\next\smartitaliccorrection}}% 2367 \next 2368} 2369\def\smartslanted{\dosmartslant\sl} 2370\def\smartitalic{\dosmartslant\it} 2371 2372% Output an italic correction unless \next (presumed to be the following 2373% character) is such as not to need one. 2374\def\smartitaliccorrection{% 2375 \ifx\next,% 2376 \else\ifx\next-% 2377 \else\ifx\next.% 2378 \else\ptexslash 2379 \fi\fi\fi 2380 \aftersmartic 2381} 2382 2383% like \smartslanted except unconditionally uses \ttsl, and no ic. 2384% @var is set to this for defun arguments. 2385\def\ttslanted#1{{\ttsl #1}} 2386 2387% @cite is like \smartslanted except unconditionally use \sl. We never want 2388% ttsl for book titles, do we? 2389\def\cite#1{{\sl #1}\futurelet\next\smartitaliccorrection} 2390 2391\def\aftersmartic{} 2392\def\var#1{% 2393 \let\saveaftersmartic = \aftersmartic 2394 \def\aftersmartic{\null\let\aftersmartic=\saveaftersmartic}% 2395 \smartslanted{#1}% 2396} 2397 2398\let\i=\smartitalic 2399\let\slanted=\smartslanted 2400\let\dfn=\smartslanted 2401\let\emph=\smartitalic 2402 2403% Explicit font changes: @r, @sc, undocumented @ii. 2404\def\r#1{{\rm #1}} % roman font 2405\def\sc#1{{\smallcaps#1}} % smallcaps font 2406\def\ii#1{{\it #1}} % italic font 2407 2408% @b, explicit bold. Also @strong. 2409\def\b#1{{\bf #1}} 2410\let\strong=\b 2411 2412% @sansserif, explicit sans. 2413\def\sansserif#1{{\sf #1}} 2414 2415% We can't just use \exhyphenpenalty, because that only has effect at 2416% the end of a paragraph. Restore normal hyphenation at the end of the 2417% group within which \nohyphenation is presumably called. 2418% 2419\def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation} 2420\def\restorehyphenation{\hyphenchar\font = `- } 2421 2422% Set sfcode to normal for the chars that usually have another value. 2423% Can't use plain's \frenchspacing because it uses the `\x notation, and 2424% sometimes \x has an active definition that messes things up. 2425% 2426\catcode`@=11 2427 \def\plainfrenchspacing{% 2428 \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m 2429 \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m 2430 \def\endofsentencespacefactor{1000}% for @. and friends 2431 } 2432 \def\plainnonfrenchspacing{% 2433 \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000 2434 \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 2435 \def\endofsentencespacefactor{3000}% for @. and friends 2436 } 2437\catcode`@=\other 2438\def\endofsentencespacefactor{3000}% default 2439 2440% @t, explicit typewriter. 2441\def\t#1{% 2442 {\tt \rawbackslash \plainfrenchspacing #1}% 2443 \null 2444} 2445 2446% @samp. 2447\def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}} 2448 2449% definition of @key that produces a lozenge. Doesn't adjust to text size. 2450%\setfont\keyrm\rmshape{8}{1000}{OT1} 2451%\font\keysy=cmsy9 2452%\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{% 2453% \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% 2454% \vbox{\hrule\kern-0.4pt 2455% \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% 2456% \kern-0.4pt\hrule}% 2457% \kern-.06em\raise0.4pt\hbox{\angleright}}}} 2458 2459% definition of @key with no lozenge. If the current font is already 2460% monospace, don't change it; that way, we respect @kbdinputstyle. But 2461% if it isn't monospace, then use \tt. 2462% 2463\def\key#1{{\setupmarkupstyle{key}% 2464 \nohyphenation 2465 \ifmonospace\else\tt\fi 2466 #1}\null} 2467 2468% ctrl is no longer a Texinfo command. 2469\def\ctrl #1{{\tt \rawbackslash \hat}#1} 2470 2471% @file, @option are the same as @samp. 2472\let\file=\samp 2473\let\option=\samp 2474 2475% @code is a modification of @t, 2476% which makes spaces the same size as normal in the surrounding text. 2477\def\tclose#1{% 2478 {% 2479 % Change normal interword space to be same as for the current font. 2480 \spaceskip = \fontdimen2\font 2481 % 2482 % Switch to typewriter. 2483 \tt 2484 % 2485 % But `\ ' produces the large typewriter interword space. 2486 \def\ {{\spaceskip = 0pt{} }}% 2487 % 2488 % Turn off hyphenation. 2489 \nohyphenation 2490 % 2491 \rawbackslash 2492 \plainfrenchspacing 2493 #1% 2494 }% 2495 \null % reset spacefactor to 1000 2496} 2497 2498% We *must* turn on hyphenation at `-' and `_' in @code. 2499% Otherwise, it is too hard to avoid overfull hboxes 2500% in the Emacs manual, the Library manual, etc. 2501 2502% Unfortunately, TeX uses one parameter (\hyphenchar) to control 2503% both hyphenation at - and hyphenation within words. 2504% We must therefore turn them both off (\tclose does that) 2505% and arrange explicitly to hyphenate at a dash. 2506% -- rms. 2507{ 2508 \catcode`\-=\active \catcode`\_=\active 2509 \catcode`\'=\active \catcode`\`=\active 2510 \global\let'=\rq \global\let`=\lq % default definitions 2511 % 2512 \global\def\code{\begingroup 2513 \setupmarkupstyle{code}% 2514 % The following should really be moved into \setupmarkupstyle handlers. 2515 \catcode\dashChar=\active \catcode\underChar=\active 2516 \ifallowcodebreaks 2517 \let-\codedash 2518 \let_\codeunder 2519 \else 2520 \let-\realdash 2521 \let_\realunder 2522 \fi 2523 \codex 2524 } 2525} 2526 2527\def\codex #1{\tclose{#1}\endgroup} 2528 2529\def\realdash{-} 2530\def\codedash{-\discretionary{}{}{}} 2531\def\codeunder{% 2532 % this is all so @math{@code{var_name}+1} can work. In math mode, _ 2533 % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.) 2534 % will therefore expand the active definition of _, which is us 2535 % (inside @code that is), therefore an endless loop. 2536 \ifusingtt{\ifmmode 2537 \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_. 2538 \else\normalunderscore \fi 2539 \discretionary{}{}{}}% 2540 {\_}% 2541} 2542 2543% An additional complication: the above will allow breaks after, e.g., 2544% each of the four underscores in __typeof__. This is undesirable in 2545% some manuals, especially if they don't have long identifiers in 2546% general. @allowcodebreaks provides a way to control this. 2547% 2548\newif\ifallowcodebreaks \allowcodebreakstrue 2549 2550\def\keywordtrue{true} 2551\def\keywordfalse{false} 2552 2553\parseargdef\allowcodebreaks{% 2554 \def\txiarg{#1}% 2555 \ifx\txiarg\keywordtrue 2556 \allowcodebreakstrue 2557 \else\ifx\txiarg\keywordfalse 2558 \allowcodebreaksfalse 2559 \else 2560 \errhelp = \EMsimple 2561 \errmessage{Unknown @allowcodebreaks option `\txiarg', must be true|false}% 2562 \fi\fi 2563} 2564 2565% @uref (abbreviation for `urlref') takes an optional (comma-separated) 2566% second argument specifying the text to display and an optional third 2567% arg as text to display instead of (rather than in addition to) the url 2568% itself. First (mandatory) arg is the url. 2569% (This \urefnobreak definition isn't used now, leaving it for a while 2570% for comparison.) 2571\def\urefnobreak#1{\dourefnobreak #1,,,\finish} 2572\def\dourefnobreak#1,#2,#3,#4\finish{\begingroup 2573 \unsepspaces 2574 \pdfurl{#1}% 2575 \setbox0 = \hbox{\ignorespaces #3}% 2576 \ifdim\wd0 > 0pt 2577 \unhbox0 % third arg given, show only that 2578 \else 2579 \setbox0 = \hbox{\ignorespaces #2}% 2580 \ifdim\wd0 > 0pt 2581 \ifpdf 2582 \unhbox0 % PDF: 2nd arg given, show only it 2583 \else 2584 \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url 2585 \fi 2586 \else 2587 \code{#1}% only url given, so show it 2588 \fi 2589 \fi 2590 \endlink 2591\endgroup} 2592 2593% This \urefbreak definition is the active one. 2594\def\urefbreak{\begingroup \urefcatcodes \dourefbreak} 2595\let\uref=\urefbreak 2596\def\dourefbreak#1{\urefbreakfinish #1,,,\finish} 2597\def\urefbreakfinish#1,#2,#3,#4\finish{% doesn't work in @example 2598 \unsepspaces 2599 \pdfurl{#1}% 2600 \setbox0 = \hbox{\ignorespaces #3}% 2601 \ifdim\wd0 > 0pt 2602 \unhbox0 % third arg given, show only that 2603 \else 2604 \setbox0 = \hbox{\ignorespaces #2}% 2605 \ifdim\wd0 > 0pt 2606 \ifpdf 2607 \unhbox0 % PDF: 2nd arg given, show only it 2608 \else 2609 \unhbox0\ (\urefcode{#1})% DVI: 2nd arg given, show both it and url 2610 \fi 2611 \else 2612 \urefcode{#1}% only url given, so show it 2613 \fi 2614 \fi 2615 \endlink 2616\endgroup} 2617 2618% Allow line breaks around only a few characters (only). 2619\def\urefcatcodes{% 2620 \catcode\ampChar=\active \catcode\dotChar=\active 2621 \catcode\hashChar=\active \catcode\questChar=\active 2622 \catcode\slashChar=\active 2623} 2624{ 2625 \urefcatcodes 2626 % 2627 \global\def\urefcode{\begingroup 2628 \setupmarkupstyle{code}% 2629 \urefcatcodes 2630 \let&\urefcodeamp 2631 \let.\urefcodedot 2632 \let#\urefcodehash 2633 \let?\urefcodequest 2634 \let/\urefcodeslash 2635 \codex 2636 } 2637 % 2638 % By default, they are just regular characters. 2639 \global\def&{\normalamp} 2640 \global\def.{\normaldot} 2641 \global\def#{\normalhash} 2642 \global\def?{\normalquest} 2643 \global\def/{\normalslash} 2644} 2645 2646% we put a little stretch before and after the breakable chars, to help 2647% line breaking of long url's. The unequal skips make look better in 2648% cmtt at least, especially for dots. 2649\def\urefprestretch{\urefprebreak \hskip0pt plus.13em } 2650\def\urefpoststretch{\urefpostbreak \hskip0pt plus.1em } 2651% 2652\def\urefcodeamp{\urefprestretch \&\urefpoststretch} 2653\def\urefcodedot{\urefprestretch .\urefpoststretch} 2654\def\urefcodehash{\urefprestretch \#\urefpoststretch} 2655\def\urefcodequest{\urefprestretch ?\urefpoststretch} 2656\def\urefcodeslash{\futurelet\next\urefcodeslashfinish} 2657{ 2658 \catcode`\/=\active 2659 \global\def\urefcodeslashfinish{% 2660 \urefprestretch \slashChar 2661 % Allow line break only after the final / in a sequence of 2662 % slashes, to avoid line break between the slashes in http://. 2663 \ifx\next/\else \urefpoststretch \fi 2664 } 2665} 2666 2667% One more complication: by default we'll break after the special 2668% characters, but some people like to break before the special chars, so 2669% allow that. Also allow no breaking at all, for manual control. 2670% 2671\parseargdef\urefbreakstyle{% 2672 \def\txiarg{#1}% 2673 \ifx\txiarg\wordnone 2674 \def\urefprebreak{\nobreak}\def\urefpostbreak{\nobreak} 2675 \else\ifx\txiarg\wordbefore 2676 \def\urefprebreak{\allowbreak}\def\urefpostbreak{\nobreak} 2677 \else\ifx\txiarg\wordafter 2678 \def\urefprebreak{\nobreak}\def\urefpostbreak{\allowbreak} 2679 \else 2680 \errhelp = \EMsimple 2681 \errmessage{Unknown @urefbreakstyle setting `\txiarg'}% 2682 \fi\fi\fi 2683} 2684\def\wordafter{after} 2685\def\wordbefore{before} 2686\def\wordnone{none} 2687 2688\urefbreakstyle after 2689 2690% @url synonym for @uref, since that's how everyone uses it. 2691% 2692\let\url=\uref 2693 2694% rms does not like angle brackets --karl, 17may97. 2695% So now @email is just like @uref, unless we are pdf. 2696% 2697%\def\email#1{\angleleft{\tt #1}\angleright} 2698\ifpdf 2699 \def\email#1{\doemail#1,,\finish} 2700 \def\doemail#1,#2,#3\finish{\begingroup 2701 \unsepspaces 2702 \pdfurl{mailto:#1}% 2703 \setbox0 = \hbox{\ignorespaces #2}% 2704 \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi 2705 \endlink 2706 \endgroup} 2707\else 2708 \let\email=\uref 2709\fi 2710 2711% @kbd is like @code, except that if the argument is just one @key command, 2712% then @kbd has no effect. 2713\def\kbd#1{{\setupmarkupstyle{kbd}\def\look{#1}\expandafter\kbdfoo\look??\par}} 2714 2715% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always), 2716% `example' (@kbd uses ttsl only inside of @example and friends), 2717% or `code' (@kbd uses normal tty font always). 2718\parseargdef\kbdinputstyle{% 2719 \def\txiarg{#1}% 2720 \ifx\txiarg\worddistinct 2721 \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}% 2722 \else\ifx\txiarg\wordexample 2723 \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}% 2724 \else\ifx\txiarg\wordcode 2725 \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}% 2726 \else 2727 \errhelp = \EMsimple 2728 \errmessage{Unknown @kbdinputstyle setting `\txiarg'}% 2729 \fi\fi\fi 2730} 2731\def\worddistinct{distinct} 2732\def\wordexample{example} 2733\def\wordcode{code} 2734 2735% Default is `distinct'. 2736\kbdinputstyle distinct 2737 2738\def\xkey{\key} 2739\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}% 2740\ifx\one\xkey\ifx\threex\three \key{#2}% 2741\else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi 2742\else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi} 2743 2744% For @indicateurl, @env, @command quotes seem unnecessary, so use \code. 2745\let\indicateurl=\code 2746\let\env=\code 2747\let\command=\code 2748 2749% @clicksequence{File @click{} Open ...} 2750\def\clicksequence#1{\begingroup #1\endgroup} 2751 2752% @clickstyle @arrow (by default) 2753\parseargdef\clickstyle{\def\click{#1}} 2754\def\click{\arrow} 2755 2756% Typeset a dimension, e.g., `in' or `pt'. The only reason for the 2757% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt. 2758% 2759\def\dmn#1{\thinspace #1} 2760 2761% @l was never documented to mean ``switch to the Lisp font'', 2762% and it is not used as such in any manual I can find. We need it for 2763% Polish suppressed-l. --karl, 22sep96. 2764%\def\l#1{{\li #1}\null} 2765 2766% @acronym for "FBI", "NATO", and the like. 2767% We print this one point size smaller, since it's intended for 2768% all-uppercase. 2769% 2770\def\acronym#1{\doacronym #1,,\finish} 2771\def\doacronym#1,#2,#3\finish{% 2772 {\selectfonts\lsize #1}% 2773 \def\temp{#2}% 2774 \ifx\temp\empty \else 2775 \space ({\unsepspaces \ignorespaces \temp \unskip})% 2776 \fi 2777 \null % reset \spacefactor=1000 2778} 2779 2780% @abbr for "Comput. J." and the like. 2781% No font change, but don't do end-of-sentence spacing. 2782% 2783\def\abbr#1{\doabbr #1,,\finish} 2784\def\doabbr#1,#2,#3\finish{% 2785 {\plainfrenchspacing #1}% 2786 \def\temp{#2}% 2787 \ifx\temp\empty \else 2788 \space ({\unsepspaces \ignorespaces \temp \unskip})% 2789 \fi 2790 \null % reset \spacefactor=1000 2791} 2792 2793% @asis just yields its argument. Used with @table, for example. 2794% 2795\def\asis#1{#1} 2796 2797% @math outputs its argument in math mode. 2798% 2799% One complication: _ usually means subscripts, but it could also mean 2800% an actual _ character, as in @math{@var{some_variable} + 1}. So make 2801% _ active, and distinguish by seeing if the current family is \slfam, 2802% which is what @var uses. 2803{ 2804 \catcode`\_ = \active 2805 \gdef\mathunderscore{% 2806 \catcode`\_=\active 2807 \def_{\ifnum\fam=\slfam \_\else\sb\fi}% 2808 } 2809} 2810% Another complication: we want \\ (and @\) to output a math (or tt) \. 2811% FYI, plain.tex uses \\ as a temporary control sequence (for no 2812% particular reason), but this is not advertised and we don't care. 2813% 2814% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\. 2815\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi} 2816% 2817\def\math{% 2818 \tex 2819 \mathunderscore 2820 \let\\ = \mathbackslash 2821 \mathactive 2822 % make the texinfo accent commands work in math mode 2823 \let\"=\ddot 2824 \let\'=\acute 2825 \let\==\bar 2826 \let\^=\hat 2827 \let\`=\grave 2828 \let\u=\breve 2829 \let\v=\check 2830 \let\~=\tilde 2831 \let\dotaccent=\dot 2832 $\finishmath 2833} 2834\def\finishmath#1{#1$\endgroup} % Close the group opened by \tex. 2835 2836% Some active characters (such as <) are spaced differently in math. 2837% We have to reset their definitions in case the @math was an argument 2838% to a command which sets the catcodes (such as @item or @section). 2839% 2840{ 2841 \catcode`^ = \active 2842 \catcode`< = \active 2843 \catcode`> = \active 2844 \catcode`+ = \active 2845 \catcode`' = \active 2846 \gdef\mathactive{% 2847 \let^ = \ptexhat 2848 \let< = \ptexless 2849 \let> = \ptexgtr 2850 \let+ = \ptexplus 2851 \let' = \ptexquoteright 2852 } 2853} 2854 2855% @inlinefmt{FMTNAME,PROCESSED-TEXT} and @inlineraw{FMTNAME,RAW-TEXT}. 2856% Ignore unless FMTNAME == tex; then it is like @iftex and @tex, 2857% except specified as a normal braced arg, so no newlines to worry about. 2858% 2859\def\outfmtnametex{tex} 2860% 2861\long\def\inlinefmt#1{\doinlinefmt #1,\finish} 2862\long\def\doinlinefmt#1,#2,\finish{% 2863 \def\inlinefmtname{#1}% 2864 \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\fi 2865} 2866% For raw, must switch into @tex before parsing the argument, to avoid 2867% setting catcodes prematurely. Doing it this way means that, for 2868% example, @inlineraw{html, foo{bar} gets a parse error instead of being 2869% ignored. But this isn't important because if people want a literal 2870% *right* brace they would have to use a command anyway, so they may as 2871% well use a command to get a left brace too. We could re-use the 2872% delimiter character idea from \verb, but it seems like overkill. 2873% 2874\long\def\inlineraw{\tex \doinlineraw} 2875\long\def\doinlineraw#1{\doinlinerawtwo #1,\finish} 2876\def\doinlinerawtwo#1,#2,\finish{% 2877 \def\inlinerawname{#1}% 2878 \ifx\inlinerawname\outfmtnametex \ignorespaces #2\fi 2879 \endgroup % close group opened by \tex. 2880} 2881 2882 2883\message{glyphs,} 2884% and logos. 2885 2886% @@ prints an @, as does @atchar{}. 2887\def\@{\char64 } 2888\let\atchar=\@ 2889 2890% @{ @} @lbracechar{} @rbracechar{} all generate brace characters. 2891% Unless we're in typewriter, use \ecfont because the CM text fonts do 2892% not have braces, and we don't want to switch into math. 2893\def\mylbrace{{\ifmonospace\else\ecfont\fi \char123}} 2894\def\myrbrace{{\ifmonospace\else\ecfont\fi \char125}} 2895\let\{=\mylbrace \let\lbracechar=\{ 2896\let\}=\myrbrace \let\rbracechar=\} 2897\begingroup 2898 % Definitions to produce \{ and \} commands for indices, 2899 % and @{ and @} for the aux/toc files. 2900 \catcode`\{ = \other \catcode`\} = \other 2901 \catcode`\[ = 1 \catcode`\] = 2 2902 \catcode`\! = 0 \catcode`\\ = \other 2903 !gdef!lbracecmd[\{]% 2904 !gdef!rbracecmd[\}]% 2905 !gdef!lbraceatcmd[@{]% 2906 !gdef!rbraceatcmd[@}]% 2907!endgroup 2908 2909% @comma{} to avoid , parsing problems. 2910\let\comma = , 2911 2912% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent 2913% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H. 2914\let\, = \ptexc 2915\let\dotaccent = \ptexdot 2916\def\ringaccent#1{{\accent23 #1}} 2917\let\tieaccent = \ptext 2918\let\ubaraccent = \ptexb 2919\let\udotaccent = \d 2920 2921% Other special characters: @questiondown @exclamdown @ordf @ordm 2922% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss. 2923\def\questiondown{?`} 2924\def\exclamdown{!`} 2925\def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}} 2926\def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}} 2927 2928% Dotless i and dotless j, used for accents. 2929\def\imacro{i} 2930\def\jmacro{j} 2931\def\dotless#1{% 2932 \def\temp{#1}% 2933 \ifx\temp\imacro \ifmmode\imath \else\ptexi \fi 2934 \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi 2935 \else \errmessage{@dotless can be used only with i or j}% 2936 \fi\fi 2937} 2938 2939% The \TeX{} logo, as in plain, but resetting the spacing so that a 2940% period following counts as ending a sentence. (Idea found in latex.) 2941% 2942\edef\TeX{\TeX \spacefactor=1000 } 2943 2944% @LaTeX{} logo. Not quite the same results as the definition in 2945% latex.ltx, since we use a different font for the raised A; it's most 2946% convenient for us to use an explicitly smaller font, rather than using 2947% the \scriptstyle font (since we don't reset \scriptstyle and 2948% \scriptscriptstyle). 2949% 2950\def\LaTeX{% 2951 L\kern-.36em 2952 {\setbox0=\hbox{T}% 2953 \vbox to \ht0{\hbox{% 2954 \ifx\textnominalsize\xwordpt 2955 % for 10pt running text, \lllsize (8pt) is too small for the A in LaTeX. 2956 % Revert to plain's \scriptsize, which is 7pt. 2957 \count255=\the\fam $\fam\count255 \scriptstyle A$% 2958 \else 2959 % For 11pt, we can use our lllsize. 2960 \selectfonts\lllsize A% 2961 \fi 2962 }% 2963 \vss 2964 }}% 2965 \kern-.15em 2966 \TeX 2967} 2968 2969% Some math mode symbols. 2970\def\bullet{$\ptexbullet$} 2971\def\geq{\ifmmode \ge\else $\ge$\fi} 2972\def\leq{\ifmmode \le\else $\le$\fi} 2973\def\minus{\ifmmode -\else $-$\fi} 2974 2975% @dots{} outputs an ellipsis using the current font. 2976% We do .5em per period so that it has the same spacing in the cm 2977% typewriter fonts as three actual period characters; on the other hand, 2978% in other typewriter fonts three periods are wider than 1.5em. So do 2979% whichever is larger. 2980% 2981\def\dots{% 2982 \leavevmode 2983 \setbox0=\hbox{...}% get width of three periods 2984 \ifdim\wd0 > 1.5em 2985 \dimen0 = \wd0 2986 \else 2987 \dimen0 = 1.5em 2988 \fi 2989 \hbox to \dimen0{% 2990 \hskip 0pt plus.25fil 2991 .\hskip 0pt plus1fil 2992 .\hskip 0pt plus1fil 2993 .\hskip 0pt plus.5fil 2994 }% 2995} 2996 2997% @enddots{} is an end-of-sentence ellipsis. 2998% 2999\def\enddots{% 3000 \dots 3001 \spacefactor=\endofsentencespacefactor 3002} 3003 3004% @point{}, @result{}, @expansion{}, @print{}, @equiv{}. 3005% 3006% Since these characters are used in examples, they should be an even number of 3007% \tt widths. Each \tt character is 1en, so two makes it 1em. 3008% 3009\def\point{$\star$} 3010\def\arrow{\leavevmode\raise.05ex\hbox to 1em{\hfil$\rightarrow$\hfil}} 3011\def\result{\leavevmode\raise.05ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} 3012\def\expansion{\leavevmode\hbox to 1em{\hfil$\mapsto$\hfil}} 3013\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} 3014\def\equiv{\leavevmode\hbox to 1em{\hfil$\ptexequiv$\hfil}} 3015 3016% The @error{} command. 3017% Adapted from the TeXbook's \boxit. 3018% 3019\newbox\errorbox 3020% 3021{\tentt \global\dimen0 = 3em}% Width of the box. 3022\dimen2 = .55pt % Thickness of rules 3023% The text. (`r' is open on the right, `e' somewhat less so on the left.) 3024\setbox0 = \hbox{\kern-.75pt \reducedsf \putworderror\kern-1.5pt} 3025% 3026\setbox\errorbox=\hbox to \dimen0{\hfil 3027 \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. 3028 \advance\hsize by -2\dimen2 % Rules. 3029 \vbox{% 3030 \hrule height\dimen2 3031 \hbox{\vrule width\dimen2 \kern3pt % Space to left of text. 3032 \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. 3033 \kern3pt\vrule width\dimen2}% Space to right. 3034 \hrule height\dimen2} 3035 \hfil} 3036% 3037\def\error{\leavevmode\lower.7ex\copy\errorbox} 3038 3039% @pounds{} is a sterling sign, which Knuth put in the CM italic font. 3040% 3041\def\pounds{{\it\$}} 3042 3043% @euro{} comes from a separate font, depending on the current style. 3044% We use the free feym* fonts from the eurosym package by Henrik 3045% Theiling, which support regular, slanted, bold and bold slanted (and 3046% "outlined" (blackboard board, sort of) versions, which we don't need). 3047% It is available from http://www.ctan.org/tex-archive/fonts/eurosym. 3048% 3049% Although only regular is the truly official Euro symbol, we ignore 3050% that. The Euro is designed to be slightly taller than the regular 3051% font height. 3052% 3053% feymr - regular 3054% feymo - slanted 3055% feybr - bold 3056% feybo - bold slanted 3057% 3058% There is no good (free) typewriter version, to my knowledge. 3059% A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide. 3060% Hmm. 3061% 3062% Also doesn't work in math. Do we need to do math with euro symbols? 3063% Hope not. 3064% 3065% 3066\def\euro{{\eurofont e}} 3067\def\eurofont{% 3068 % We set the font at each command, rather than predefining it in 3069 % \textfonts and the other font-switching commands, so that 3070 % installations which never need the symbol don't have to have the 3071 % font installed. 3072 % 3073 % There is only one designed size (nominal 10pt), so we always scale 3074 % that to the current nominal size. 3075 % 3076 % By the way, simply using "at 1em" works for cmr10 and the like, but 3077 % does not work for cmbx10 and other extended/shrunken fonts. 3078 % 3079 \def\eurosize{\csname\curfontsize nominalsize\endcsname}% 3080 % 3081 \ifx\curfontstyle\bfstylename 3082 % bold: 3083 \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize 3084 \else 3085 % regular: 3086 \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize 3087 \fi 3088 \thiseurofont 3089} 3090 3091% Glyphs from the EC fonts. We don't use \let for the aliases, because 3092% sometimes we redefine the original macro, and the alias should reflect 3093% the redefinition. 3094% 3095% Use LaTeX names for the Icelandic letters. 3096\def\DH{{\ecfont \char"D0}} % Eth 3097\def\dh{{\ecfont \char"F0}} % eth 3098\def\TH{{\ecfont \char"DE}} % Thorn 3099\def\th{{\ecfont \char"FE}} % thorn 3100% 3101\def\guillemetleft{{\ecfont \char"13}} 3102\def\guillemotleft{\guillemetleft} 3103\def\guillemetright{{\ecfont \char"14}} 3104\def\guillemotright{\guillemetright} 3105\def\guilsinglleft{{\ecfont \char"0E}} 3106\def\guilsinglright{{\ecfont \char"0F}} 3107\def\quotedblbase{{\ecfont \char"12}} 3108\def\quotesinglbase{{\ecfont \char"0D}} 3109% 3110% This positioning is not perfect (see the ogonek LaTeX package), but 3111% we have the precomposed glyphs for the most common cases. We put the 3112% tests to use those glyphs in the single \ogonek macro so we have fewer 3113% dummy definitions to worry about for index entries, etc. 3114% 3115% ogonek is also used with other letters in Lithuanian (IOU), but using 3116% the precomposed glyphs for those is not so easy since they aren't in 3117% the same EC font. 3118\def\ogonek#1{{% 3119 \def\temp{#1}% 3120 \ifx\temp\macrocharA\Aogonek 3121 \else\ifx\temp\macrochara\aogonek 3122 \else\ifx\temp\macrocharE\Eogonek 3123 \else\ifx\temp\macrochare\eogonek 3124 \else 3125 \ecfont \setbox0=\hbox{#1}% 3126 \ifdim\ht0=1ex\accent"0C #1% 3127 \else\ooalign{\unhbox0\crcr\hidewidth\char"0C \hidewidth}% 3128 \fi 3129 \fi\fi\fi\fi 3130 }% 3131} 3132\def\Aogonek{{\ecfont \char"81}}\def\macrocharA{A} 3133\def\aogonek{{\ecfont \char"A1}}\def\macrochara{a} 3134\def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E} 3135\def\eogonek{{\ecfont \char"A6}}\def\macrochare{e} 3136% 3137% Use the ec* fonts (cm-super in outline format) for non-CM glyphs. 3138\def\ecfont{% 3139 % We can't distinguish serif/sans and italic/slanted, but this 3140 % is used for crude hacks anyway (like adding French and German 3141 % quotes to documents typeset with CM, where we lose kerning), so 3142 % hopefully nobody will notice/care. 3143 \edef\ecsize{\csname\curfontsize ecsize\endcsname}% 3144 \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}% 3145 \ifx\curfontstyle\bfstylename 3146 % bold: 3147 \font\thisecfont = ecb\ifusingit{i}{x}\ecsize \space at \nominalsize 3148 \else 3149 % regular: 3150 \font\thisecfont = ec\ifusingit{ti}{rm}\ecsize \space at \nominalsize 3151 \fi 3152 \thisecfont 3153} 3154 3155% @registeredsymbol - R in a circle. The font for the R should really 3156% be smaller yet, but lllsize is the best we can do for now. 3157% Adapted from the plain.tex definition of \copyright. 3158% 3159\def\registeredsymbol{% 3160 $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}% 3161 \hfil\crcr\Orb}}% 3162 }$% 3163} 3164 3165% @textdegree - the normal degrees sign. 3166% 3167\def\textdegree{$^\circ$} 3168 3169% Laurent Siebenmann reports \Orb undefined with: 3170% Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:38 3171% so we'll define it if necessary. 3172% 3173\ifx\Orb\thisisundefined 3174\def\Orb{\mathhexbox20D} 3175\fi 3176 3177% Quotes. 3178\chardef\quotedblleft="5C 3179\chardef\quotedblright=`\" 3180\chardef\quoteleft=`\` 3181\chardef\quoteright=`\' 3182 3183 3184\message{page headings,} 3185 3186\newskip\titlepagetopglue \titlepagetopglue = 1.5in 3187\newskip\titlepagebottomglue \titlepagebottomglue = 2pc 3188 3189% First the title page. Must do @settitle before @titlepage. 3190\newif\ifseenauthor 3191\newif\iffinishedtitlepage 3192 3193% Do an implicit @contents or @shortcontents after @end titlepage if the 3194% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage. 3195% 3196\newif\ifsetcontentsaftertitlepage 3197 \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue 3198\newif\ifsetshortcontentsaftertitlepage 3199 \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue 3200 3201\parseargdef\shorttitlepage{% 3202 \begingroup \hbox{}\vskip 1.5in \chaprm \centerline{#1}% 3203 \endgroup\page\hbox{}\page} 3204 3205\envdef\titlepage{% 3206 % Open one extra group, as we want to close it in the middle of \Etitlepage. 3207 \begingroup 3208 \parindent=0pt \textfonts 3209 % Leave some space at the very top of the page. 3210 \vglue\titlepagetopglue 3211 % No rule at page bottom unless we print one at the top with @title. 3212 \finishedtitlepagetrue 3213 % 3214 % Most title ``pages'' are actually two pages long, with space 3215 % at the top of the second. We don't want the ragged left on the second. 3216 \let\oldpage = \page 3217 \def\page{% 3218 \iffinishedtitlepage\else 3219 \finishtitlepage 3220 \fi 3221 \let\page = \oldpage 3222 \page 3223 \null 3224 }% 3225} 3226 3227\def\Etitlepage{% 3228 \iffinishedtitlepage\else 3229 \finishtitlepage 3230 \fi 3231 % It is important to do the page break before ending the group, 3232 % because the headline and footline are only empty inside the group. 3233 % If we use the new definition of \page, we always get a blank page 3234 % after the title page, which we certainly don't want. 3235 \oldpage 3236 \endgroup 3237 % 3238 % Need this before the \...aftertitlepage checks so that if they are 3239 % in effect the toc pages will come out with page numbers. 3240 \HEADINGSon 3241 % 3242 % If they want short, they certainly want long too. 3243 \ifsetshortcontentsaftertitlepage 3244 \shortcontents 3245 \contents 3246 \global\let\shortcontents = \relax 3247 \global\let\contents = \relax 3248 \fi 3249 % 3250 \ifsetcontentsaftertitlepage 3251 \contents 3252 \global\let\contents = \relax 3253 \global\let\shortcontents = \relax 3254 \fi 3255} 3256 3257\def\finishtitlepage{% 3258 \vskip4pt \hrule height 2pt width \hsize 3259 \vskip\titlepagebottomglue 3260 \finishedtitlepagetrue 3261} 3262 3263% Macros to be used within @titlepage: 3264 3265\let\subtitlerm=\tenrm 3266\def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines} 3267 3268\parseargdef\title{% 3269 \checkenv\titlepage 3270 \leftline{\titlefonts\rmisbold #1} 3271 % print a rule at the page bottom also. 3272 \finishedtitlepagefalse 3273 \vskip4pt \hrule height 4pt width \hsize \vskip4pt 3274} 3275 3276\parseargdef\subtitle{% 3277 \checkenv\titlepage 3278 {\subtitlefont \rightline{#1}}% 3279} 3280 3281% @author should come last, but may come many times. 3282% It can also be used inside @quotation. 3283% 3284\parseargdef\author{% 3285 \def\temp{\quotation}% 3286 \ifx\thisenv\temp 3287 \def\quotationauthor{#1}% printed in \Equotation. 3288 \else 3289 \checkenv\titlepage 3290 \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi 3291 {\secfonts\rmisbold \leftline{#1}}% 3292 \fi 3293} 3294 3295 3296% Set up page headings and footings. 3297 3298\let\thispage=\folio 3299 3300\newtoks\evenheadline % headline on even pages 3301\newtoks\oddheadline % headline on odd pages 3302\newtoks\evenfootline % footline on even pages 3303\newtoks\oddfootline % footline on odd pages 3304 3305% Now make TeX use those variables 3306\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline 3307 \else \the\evenheadline \fi}} 3308\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline 3309 \else \the\evenfootline \fi}\HEADINGShook} 3310\let\HEADINGShook=\relax 3311 3312% Commands to set those variables. 3313% For example, this is what @headings on does 3314% @evenheading @thistitle|@thispage|@thischapter 3315% @oddheading @thischapter|@thispage|@thistitle 3316% @evenfooting @thisfile|| 3317% @oddfooting ||@thisfile 3318 3319 3320\def\evenheading{\parsearg\evenheadingxxx} 3321\def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish} 3322\def\evenheadingyyy #1\|#2\|#3\|#4\finish{% 3323\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} 3324 3325\def\oddheading{\parsearg\oddheadingxxx} 3326\def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish} 3327\def\oddheadingyyy #1\|#2\|#3\|#4\finish{% 3328\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} 3329 3330\parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}% 3331 3332\def\evenfooting{\parsearg\evenfootingxxx} 3333\def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish} 3334\def\evenfootingyyy #1\|#2\|#3\|#4\finish{% 3335\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} 3336 3337\def\oddfooting{\parsearg\oddfootingxxx} 3338\def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish} 3339\def\oddfootingyyy #1\|#2\|#3\|#4\finish{% 3340 \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}% 3341 % 3342 % Leave some space for the footline. Hopefully ok to assume 3343 % @evenfooting will not be used by itself. 3344 \global\advance\pageheight by -12pt 3345 \global\advance\vsize by -12pt 3346} 3347 3348\parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}} 3349 3350% @evenheadingmarks top \thischapter <- chapter at the top of a page 3351% @evenheadingmarks bottom \thischapter <- chapter at the bottom of a page 3352% 3353% The same set of arguments for: 3354% 3355% @oddheadingmarks 3356% @evenfootingmarks 3357% @oddfootingmarks 3358% @everyheadingmarks 3359% @everyfootingmarks 3360 3361\def\evenheadingmarks{\headingmarks{even}{heading}} 3362\def\oddheadingmarks{\headingmarks{odd}{heading}} 3363\def\evenfootingmarks{\headingmarks{even}{footing}} 3364\def\oddfootingmarks{\headingmarks{odd}{footing}} 3365\def\everyheadingmarks#1 {\headingmarks{even}{heading}{#1} 3366 \headingmarks{odd}{heading}{#1} } 3367\def\everyfootingmarks#1 {\headingmarks{even}{footing}{#1} 3368 \headingmarks{odd}{footing}{#1} } 3369% #1 = even/odd, #2 = heading/footing, #3 = top/bottom. 3370\def\headingmarks#1#2#3 {% 3371 \expandafter\let\expandafter\temp \csname get#3headingmarks\endcsname 3372 \global\expandafter\let\csname get#1#2marks\endcsname \temp 3373} 3374 3375\everyheadingmarks bottom 3376\everyfootingmarks bottom 3377 3378% @headings double turns headings on for double-sided printing. 3379% @headings single turns headings on for single-sided printing. 3380% @headings off turns them off. 3381% @headings on same as @headings double, retained for compatibility. 3382% @headings after turns on double-sided headings after this page. 3383% @headings doubleafter turns on double-sided headings after this page. 3384% @headings singleafter turns on single-sided headings after this page. 3385% By default, they are off at the start of a document, 3386% and turned `on' after @end titlepage. 3387 3388\def\headings #1 {\csname HEADINGS#1\endcsname} 3389 3390\def\headingsoff{% non-global headings elimination 3391 \evenheadline={\hfil}\evenfootline={\hfil}% 3392 \oddheadline={\hfil}\oddfootline={\hfil}% 3393} 3394 3395\def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting 3396\HEADINGSoff % it's the default 3397 3398% When we turn headings on, set the page number to 1. 3399% For double-sided printing, put current file name in lower left corner, 3400% chapter name on inside top of right hand pages, document 3401% title on inside top of left hand pages, and page numbers on outside top 3402% edge of all pages. 3403\def\HEADINGSdouble{% 3404\global\pageno=1 3405\global\evenfootline={\hfil} 3406\global\oddfootline={\hfil} 3407\global\evenheadline={\line{\folio\hfil\thistitle}} 3408\global\oddheadline={\line{\thischapter\hfil\folio}} 3409\global\let\contentsalignmacro = \chapoddpage 3410} 3411\let\contentsalignmacro = \chappager 3412 3413% For single-sided printing, chapter title goes across top left of page, 3414% page number on top right. 3415\def\HEADINGSsingle{% 3416\global\pageno=1 3417\global\evenfootline={\hfil} 3418\global\oddfootline={\hfil} 3419\global\evenheadline={\line{\thischapter\hfil\folio}} 3420\global\oddheadline={\line{\thischapter\hfil\folio}} 3421\global\let\contentsalignmacro = \chappager 3422} 3423\def\HEADINGSon{\HEADINGSdouble} 3424 3425\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex} 3426\let\HEADINGSdoubleafter=\HEADINGSafter 3427\def\HEADINGSdoublex{% 3428\global\evenfootline={\hfil} 3429\global\oddfootline={\hfil} 3430\global\evenheadline={\line{\folio\hfil\thistitle}} 3431\global\oddheadline={\line{\thischapter\hfil\folio}} 3432\global\let\contentsalignmacro = \chapoddpage 3433} 3434 3435\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} 3436\def\HEADINGSsinglex{% 3437\global\evenfootline={\hfil} 3438\global\oddfootline={\hfil} 3439\global\evenheadline={\line{\thischapter\hfil\folio}} 3440\global\oddheadline={\line{\thischapter\hfil\folio}} 3441\global\let\contentsalignmacro = \chappager 3442} 3443 3444% Subroutines used in generating headings 3445% This produces Day Month Year style of output. 3446% Only define if not already defined, in case a txi-??.tex file has set 3447% up a different format (e.g., txi-cs.tex does this). 3448\ifx\today\thisisundefined 3449\def\today{% 3450 \number\day\space 3451 \ifcase\month 3452 \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr 3453 \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug 3454 \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec 3455 \fi 3456 \space\number\year} 3457\fi 3458 3459% @settitle line... specifies the title of the document, for headings. 3460% It generates no output of its own. 3461\def\thistitle{\putwordNoTitle} 3462\def\settitle{\parsearg{\gdef\thistitle}} 3463 3464 3465\message{tables,} 3466% Tables -- @table, @ftable, @vtable, @item(x). 3467 3468% default indentation of table text 3469\newdimen\tableindent \tableindent=.8in 3470% default indentation of @itemize and @enumerate text 3471\newdimen\itemindent \itemindent=.3in 3472% margin between end of table item and start of table text. 3473\newdimen\itemmargin \itemmargin=.1in 3474 3475% used internally for \itemindent minus \itemmargin 3476\newdimen\itemmax 3477 3478% Note @table, @ftable, and @vtable define @item, @itemx, etc., with 3479% these defs. 3480% They also define \itemindex 3481% to index the item name in whatever manner is desired (perhaps none). 3482 3483\newif\ifitemxneedsnegativevskip 3484 3485\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi} 3486 3487\def\internalBitem{\smallbreak \parsearg\itemzzz} 3488\def\internalBitemx{\itemxpar \parsearg\itemzzz} 3489 3490\def\itemzzz #1{\begingroup % 3491 \advance\hsize by -\rightskip 3492 \advance\hsize by -\tableindent 3493 \setbox0=\hbox{\itemindicate{#1}}% 3494 \itemindex{#1}% 3495 \nobreak % This prevents a break before @itemx. 3496 % 3497 % If the item text does not fit in the space we have, put it on a line 3498 % by itself, and do not allow a page break either before or after that 3499 % line. We do not start a paragraph here because then if the next 3500 % command is, e.g., @kindex, the whatsit would get put into the 3501 % horizontal list on a line by itself, resulting in extra blank space. 3502 \ifdim \wd0>\itemmax 3503 % 3504 % Make this a paragraph so we get the \parskip glue and wrapping, 3505 % but leave it ragged-right. 3506 \begingroup 3507 \advance\leftskip by-\tableindent 3508 \advance\hsize by\tableindent 3509 \advance\rightskip by0pt plus1fil\relax 3510 \leavevmode\unhbox0\par 3511 \endgroup 3512 % 3513 % We're going to be starting a paragraph, but we don't want the 3514 % \parskip glue -- logically it's part of the @item we just started. 3515 \nobreak \vskip-\parskip 3516 % 3517 % Stop a page break at the \parskip glue coming up. However, if 3518 % what follows is an environment such as @example, there will be no 3519 % \parskip glue; then the negative vskip we just inserted would 3520 % cause the example and the item to crash together. So we use this 3521 % bizarre value of 10001 as a signal to \aboveenvbreak to insert 3522 % \parskip glue after all. Section titles are handled this way also. 3523 % 3524 \penalty 10001 3525 \endgroup 3526 \itemxneedsnegativevskipfalse 3527 \else 3528 % The item text fits into the space. Start a paragraph, so that the 3529 % following text (if any) will end up on the same line. 3530 \noindent 3531 % Do this with kerns and \unhbox so that if there is a footnote in 3532 % the item text, it can migrate to the main vertical list and 3533 % eventually be printed. 3534 \nobreak\kern-\tableindent 3535 \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0 3536 \unhbox0 3537 \nobreak\kern\dimen0 3538 \endgroup 3539 \itemxneedsnegativevskiptrue 3540 \fi 3541} 3542 3543\def\item{\errmessage{@item while not in a list environment}} 3544\def\itemx{\errmessage{@itemx while not in a list environment}} 3545 3546% @table, @ftable, @vtable. 3547\envdef\table{% 3548 \let\itemindex\gobble 3549 \tablecheck{table}% 3550} 3551\envdef\ftable{% 3552 \def\itemindex ##1{\doind {fn}{\code{##1}}}% 3553 \tablecheck{ftable}% 3554} 3555\envdef\vtable{% 3556 \def\itemindex ##1{\doind {vr}{\code{##1}}}% 3557 \tablecheck{vtable}% 3558} 3559\def\tablecheck#1{% 3560 \ifnum \the\catcode`\^^M=\active 3561 \endgroup 3562 \errmessage{This command won't work in this context; perhaps the problem is 3563 that we are \inenvironment\thisenv}% 3564 \def\next{\doignore{#1}}% 3565 \else 3566 \let\next\tablex 3567 \fi 3568 \next 3569} 3570\def\tablex#1{% 3571 \def\itemindicate{#1}% 3572 \parsearg\tabley 3573} 3574\def\tabley#1{% 3575 {% 3576 \makevalueexpandable 3577 \edef\temp{\noexpand\tablez #1\space\space\space}% 3578 \expandafter 3579 }\temp \endtablez 3580} 3581\def\tablez #1 #2 #3 #4\endtablez{% 3582 \aboveenvbreak 3583 \ifnum 0#1>0 \advance \leftskip by #1\mil \fi 3584 \ifnum 0#2>0 \tableindent=#2\mil \fi 3585 \ifnum 0#3>0 \advance \rightskip by #3\mil \fi 3586 \itemmax=\tableindent 3587 \advance \itemmax by -\itemmargin 3588 \advance \leftskip by \tableindent 3589 \exdentamount=\tableindent 3590 \parindent = 0pt 3591 \parskip = \smallskipamount 3592 \ifdim \parskip=0pt \parskip=2pt \fi 3593 \let\item = \internalBitem 3594 \let\itemx = \internalBitemx 3595} 3596\def\Etable{\endgraf\afterenvbreak} 3597\let\Eftable\Etable 3598\let\Evtable\Etable 3599\let\Eitemize\Etable 3600\let\Eenumerate\Etable 3601 3602% This is the counter used by @enumerate, which is really @itemize 3603 3604\newcount \itemno 3605 3606\envdef\itemize{\parsearg\doitemize} 3607 3608\def\doitemize#1{% 3609 \aboveenvbreak 3610 \itemmax=\itemindent 3611 \advance\itemmax by -\itemmargin 3612 \advance\leftskip by \itemindent 3613 \exdentamount=\itemindent 3614 \parindent=0pt 3615 \parskip=\smallskipamount 3616 \ifdim\parskip=0pt \parskip=2pt \fi 3617 % 3618 % Try typesetting the item mark that if the document erroneously says 3619 % something like @itemize @samp (intending @table), there's an error 3620 % right away at the @itemize. It's not the best error message in the 3621 % world, but it's better than leaving it to the @item. This means if 3622 % the user wants an empty mark, they have to say @w{} not just @w. 3623 \def\itemcontents{#1}% 3624 \setbox0 = \hbox{\itemcontents}% 3625 % 3626 % @itemize with no arg is equivalent to @itemize @bullet. 3627 \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi 3628 % 3629 \let\item=\itemizeitem 3630} 3631 3632% Definition of @item while inside @itemize and @enumerate. 3633% 3634\def\itemizeitem{% 3635 \advance\itemno by 1 % for enumerations 3636 {\let\par=\endgraf \smallbreak}% reasonable place to break 3637 {% 3638 % If the document has an @itemize directly after a section title, a 3639 % \nobreak will be last on the list, and \sectionheading will have 3640 % done a \vskip-\parskip. In that case, we don't want to zero 3641 % parskip, or the item text will crash with the heading. On the 3642 % other hand, when there is normal text preceding the item (as there 3643 % usually is), we do want to zero parskip, or there would be too much 3644 % space. In that case, we won't have a \nobreak before. At least 3645 % that's the theory. 3646 \ifnum\lastpenalty<10000 \parskip=0in \fi 3647 \noindent 3648 \hbox to 0pt{\hss \itemcontents \kern\itemmargin}% 3649 % 3650 \vadjust{\penalty 1200}}% not good to break after first line of item. 3651 \flushcr 3652} 3653 3654% \splitoff TOKENS\endmark defines \first to be the first token in 3655% TOKENS, and \rest to be the remainder. 3656% 3657\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}% 3658 3659% Allow an optional argument of an uppercase letter, lowercase letter, 3660% or number, to specify the first label in the enumerated list. No 3661% argument is the same as `1'. 3662% 3663\envparseargdef\enumerate{\enumeratey #1 \endenumeratey} 3664\def\enumeratey #1 #2\endenumeratey{% 3665 % If we were given no argument, pretend we were given `1'. 3666 \def\thearg{#1}% 3667 \ifx\thearg\empty \def\thearg{1}\fi 3668 % 3669 % Detect if the argument is a single token. If so, it might be a 3670 % letter. Otherwise, the only valid thing it can be is a number. 3671 % (We will always have one token, because of the test we just made. 3672 % This is a good thing, since \splitoff doesn't work given nothing at 3673 % all -- the first parameter is undelimited.) 3674 \expandafter\splitoff\thearg\endmark 3675 \ifx\rest\empty 3676 % Only one token in the argument. It could still be anything. 3677 % A ``lowercase letter'' is one whose \lccode is nonzero. 3678 % An ``uppercase letter'' is one whose \lccode is both nonzero, and 3679 % not equal to itself. 3680 % Otherwise, we assume it's a number. 3681 % 3682 % We need the \relax at the end of the \ifnum lines to stop TeX from 3683 % continuing to look for a <number>. 3684 % 3685 \ifnum\lccode\expandafter`\thearg=0\relax 3686 \numericenumerate % a number (we hope) 3687 \else 3688 % It's a letter. 3689 \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax 3690 \lowercaseenumerate % lowercase letter 3691 \else 3692 \uppercaseenumerate % uppercase letter 3693 \fi 3694 \fi 3695 \else 3696 % Multiple tokens in the argument. We hope it's a number. 3697 \numericenumerate 3698 \fi 3699} 3700 3701% An @enumerate whose labels are integers. The starting integer is 3702% given in \thearg. 3703% 3704\def\numericenumerate{% 3705 \itemno = \thearg 3706 \startenumeration{\the\itemno}% 3707} 3708 3709% The starting (lowercase) letter is in \thearg. 3710\def\lowercaseenumerate{% 3711 \itemno = \expandafter`\thearg 3712 \startenumeration{% 3713 % Be sure we're not beyond the end of the alphabet. 3714 \ifnum\itemno=0 3715 \errmessage{No more lowercase letters in @enumerate; get a bigger 3716 alphabet}% 3717 \fi 3718 \char\lccode\itemno 3719 }% 3720} 3721 3722% The starting (uppercase) letter is in \thearg. 3723\def\uppercaseenumerate{% 3724 \itemno = \expandafter`\thearg 3725 \startenumeration{% 3726 % Be sure we're not beyond the end of the alphabet. 3727 \ifnum\itemno=0 3728 \errmessage{No more uppercase letters in @enumerate; get a bigger 3729 alphabet} 3730 \fi 3731 \char\uccode\itemno 3732 }% 3733} 3734 3735% Call \doitemize, adding a period to the first argument and supplying the 3736% common last two arguments. Also subtract one from the initial value in 3737% \itemno, since @item increments \itemno. 3738% 3739\def\startenumeration#1{% 3740 \advance\itemno by -1 3741 \doitemize{#1.}\flushcr 3742} 3743 3744% @alphaenumerate and @capsenumerate are abbreviations for giving an arg 3745% to @enumerate. 3746% 3747\def\alphaenumerate{\enumerate{a}} 3748\def\capsenumerate{\enumerate{A}} 3749\def\Ealphaenumerate{\Eenumerate} 3750\def\Ecapsenumerate{\Eenumerate} 3751 3752 3753% @multitable macros 3754% Amy Hendrickson, 8/18/94, 3/6/96 3755% 3756% @multitable ... @end multitable will make as many columns as desired. 3757% Contents of each column will wrap at width given in preamble. Width 3758% can be specified either with sample text given in a template line, 3759% or in percent of \hsize, the current width of text on page. 3760 3761% Table can continue over pages but will only break between lines. 3762 3763% To make preamble: 3764% 3765% Either define widths of columns in terms of percent of \hsize: 3766% @multitable @columnfractions .25 .3 .45 3767% @item ... 3768% 3769% Numbers following @columnfractions are the percent of the total 3770% current hsize to be used for each column. You may use as many 3771% columns as desired. 3772 3773 3774% Or use a template: 3775% @multitable {Column 1 template} {Column 2 template} {Column 3 template} 3776% @item ... 3777% using the widest term desired in each column. 3778 3779% Each new table line starts with @item, each subsequent new column 3780% starts with @tab. Empty columns may be produced by supplying @tab's 3781% with nothing between them for as many times as empty columns are needed, 3782% ie, @tab@tab@tab will produce two empty columns. 3783 3784% @item, @tab do not need to be on their own lines, but it will not hurt 3785% if they are. 3786 3787% Sample multitable: 3788 3789% @multitable {Column 1 template} {Column 2 template} {Column 3 template} 3790% @item first col stuff @tab second col stuff @tab third col 3791% @item 3792% first col stuff 3793% @tab 3794% second col stuff 3795% @tab 3796% third col 3797% @item first col stuff @tab second col stuff 3798% @tab Many paragraphs of text may be used in any column. 3799% 3800% They will wrap at the width determined by the template. 3801% @item@tab@tab This will be in third column. 3802% @end multitable 3803 3804% Default dimensions may be reset by user. 3805% @multitableparskip is vertical space between paragraphs in table. 3806% @multitableparindent is paragraph indent in table. 3807% @multitablecolmargin is horizontal space to be left between columns. 3808% @multitablelinespace is space to leave between table items, baseline 3809% to baseline. 3810% 0pt means it depends on current normal line spacing. 3811% 3812\newskip\multitableparskip 3813\newskip\multitableparindent 3814\newdimen\multitablecolspace 3815\newskip\multitablelinespace 3816\multitableparskip=0pt 3817\multitableparindent=6pt 3818\multitablecolspace=12pt 3819\multitablelinespace=0pt 3820 3821% Macros used to set up halign preamble: 3822% 3823\let\endsetuptable\relax 3824\def\xendsetuptable{\endsetuptable} 3825\let\columnfractions\relax 3826\def\xcolumnfractions{\columnfractions} 3827\newif\ifsetpercent 3828 3829% #1 is the @columnfraction, usually a decimal number like .5, but might 3830% be just 1. We just use it, whatever it is. 3831% 3832\def\pickupwholefraction#1 {% 3833 \global\advance\colcount by 1 3834 \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}% 3835 \setuptable 3836} 3837 3838\newcount\colcount 3839\def\setuptable#1{% 3840 \def\firstarg{#1}% 3841 \ifx\firstarg\xendsetuptable 3842 \let\go = \relax 3843 \else 3844 \ifx\firstarg\xcolumnfractions 3845 \global\setpercenttrue 3846 \else 3847 \ifsetpercent 3848 \let\go\pickupwholefraction 3849 \else 3850 \global\advance\colcount by 1 3851 \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a 3852 % separator; typically that is always in the input, anyway. 3853 \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}% 3854 \fi 3855 \fi 3856 \ifx\go\pickupwholefraction 3857 % Put the argument back for the \pickupwholefraction call, so 3858 % we'll always have a period there to be parsed. 3859 \def\go{\pickupwholefraction#1}% 3860 \else 3861 \let\go = \setuptable 3862 \fi% 3863 \fi 3864 \go 3865} 3866 3867% multitable-only commands. 3868% 3869% @headitem starts a heading row, which we typeset in bold. 3870% Assignments have to be global since we are inside the implicit group 3871% of an alignment entry. \everycr resets \everytab so we don't have to 3872% undo it ourselves. 3873\def\headitemfont{\b}% for people to use in the template row; not changeable 3874\def\headitem{% 3875 \checkenv\multitable 3876 \crcr 3877 \global\everytab={\bf}% can't use \headitemfont since the parsing differs 3878 \the\everytab % for the first item 3879}% 3880% 3881% A \tab used to include \hskip1sp. But then the space in a template 3882% line is not enough. That is bad. So let's go back to just `&' until 3883% we again encounter the problem the 1sp was intended to solve. 3884% --karl, nathan@acm.org, 20apr99. 3885\def\tab{\checkenv\multitable &\the\everytab}% 3886 3887% @multitable ... @end multitable definitions: 3888% 3889\newtoks\everytab % insert after every tab. 3890% 3891\envdef\multitable{% 3892 \vskip\parskip 3893 \startsavinginserts 3894 % 3895 % @item within a multitable starts a normal row. 3896 % We use \def instead of \let so that if one of the multitable entries 3897 % contains an @itemize, we don't choke on the \item (seen as \crcr aka 3898 % \endtemplate) expanding \doitemize. 3899 \def\item{\crcr}% 3900 % 3901 \tolerance=9500 3902 \hbadness=9500 3903 \setmultitablespacing 3904 \parskip=\multitableparskip 3905 \parindent=\multitableparindent 3906 \overfullrule=0pt 3907 \global\colcount=0 3908 % 3909 \everycr = {% 3910 \noalign{% 3911 \global\everytab={}% 3912 \global\colcount=0 % Reset the column counter. 3913 % Check for saved footnotes, etc. 3914 \checkinserts 3915 % Keeps underfull box messages off when table breaks over pages. 3916 %\filbreak 3917 % Maybe so, but it also creates really weird page breaks when the 3918 % table breaks over pages. Wouldn't \vfil be better? Wait until the 3919 % problem manifests itself, so it can be fixed for real --karl. 3920 }% 3921 }% 3922 % 3923 \parsearg\domultitable 3924} 3925\def\domultitable#1{% 3926 % To parse everything between @multitable and @item: 3927 \setuptable#1 \endsetuptable 3928 % 3929 % This preamble sets up a generic column definition, which will 3930 % be used as many times as user calls for columns. 3931 % \vtop will set a single line and will also let text wrap and 3932 % continue for many paragraphs if desired. 3933 \halign\bgroup &% 3934 \global\advance\colcount by 1 3935 \multistrut 3936 \vtop{% 3937 % Use the current \colcount to find the correct column width: 3938 \hsize=\expandafter\csname col\the\colcount\endcsname 3939 % 3940 % In order to keep entries from bumping into each other 3941 % we will add a \leftskip of \multitablecolspace to all columns after 3942 % the first one. 3943 % 3944 % If a template has been used, we will add \multitablecolspace 3945 % to the width of each template entry. 3946 % 3947 % If the user has set preamble in terms of percent of \hsize we will 3948 % use that dimension as the width of the column, and the \leftskip 3949 % will keep entries from bumping into each other. Table will start at 3950 % left margin and final column will justify at right margin. 3951 % 3952 % Make sure we don't inherit \rightskip from the outer environment. 3953 \rightskip=0pt 3954 \ifnum\colcount=1 3955 % The first column will be indented with the surrounding text. 3956 \advance\hsize by\leftskip 3957 \else 3958 \ifsetpercent \else 3959 % If user has not set preamble in terms of percent of \hsize 3960 % we will advance \hsize by \multitablecolspace. 3961 \advance\hsize by \multitablecolspace 3962 \fi 3963 % In either case we will make \leftskip=\multitablecolspace: 3964 \leftskip=\multitablecolspace 3965 \fi 3966 % Ignoring space at the beginning and end avoids an occasional spurious 3967 % blank line, when TeX decides to break the line at the space before the 3968 % box from the multistrut, so the strut ends up on a line by itself. 3969 % For example: 3970 % @multitable @columnfractions .11 .89 3971 % @item @code{#} 3972 % @tab Legal holiday which is valid in major parts of the whole country. 3973 % Is automatically provided with highlighting sequences respectively 3974 % marking characters. 3975 \noindent\ignorespaces##\unskip\multistrut 3976 }\cr 3977} 3978\def\Emultitable{% 3979 \crcr 3980 \egroup % end the \halign 3981 \global\setpercentfalse 3982} 3983 3984\def\setmultitablespacing{% 3985 \def\multistrut{\strut}% just use the standard line spacing 3986 % 3987 % Compute \multitablelinespace (if not defined by user) for use in 3988 % \multitableparskip calculation. We used define \multistrut based on 3989 % this, but (ironically) that caused the spacing to be off. 3990 % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100. 3991\ifdim\multitablelinespace=0pt 3992\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip 3993\global\advance\multitablelinespace by-\ht0 3994\fi 3995% Test to see if parskip is larger than space between lines of 3996% table. If not, do nothing. 3997% If so, set to same dimension as multitablelinespace. 3998\ifdim\multitableparskip>\multitablelinespace 3999\global\multitableparskip=\multitablelinespace 4000\global\advance\multitableparskip-7pt % to keep parskip somewhat smaller 4001 % than skip between lines in the table. 4002\fi% 4003\ifdim\multitableparskip=0pt 4004\global\multitableparskip=\multitablelinespace 4005\global\advance\multitableparskip-7pt % to keep parskip somewhat smaller 4006 % than skip between lines in the table. 4007\fi} 4008 4009 4010\message{conditionals,} 4011 4012% @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext, 4013% @ifnotxml always succeed. They currently do nothing; we don't 4014% attempt to check whether the conditionals are properly nested. But we 4015% have to remember that they are conditionals, so that @end doesn't 4016% attempt to close an environment group. 4017% 4018\def\makecond#1{% 4019 \expandafter\let\csname #1\endcsname = \relax 4020 \expandafter\let\csname iscond.#1\endcsname = 1 4021} 4022\makecond{iftex} 4023\makecond{ifnotdocbook} 4024\makecond{ifnothtml} 4025\makecond{ifnotinfo} 4026\makecond{ifnotplaintext} 4027\makecond{ifnotxml} 4028 4029% Ignore @ignore, @ifhtml, @ifinfo, and the like. 4030% 4031\def\direntry{\doignore{direntry}} 4032\def\documentdescription{\doignore{documentdescription}} 4033\def\docbook{\doignore{docbook}} 4034\def\html{\doignore{html}} 4035\def\ifdocbook{\doignore{ifdocbook}} 4036\def\ifhtml{\doignore{ifhtml}} 4037\def\ifinfo{\doignore{ifinfo}} 4038\def\ifnottex{\doignore{ifnottex}} 4039\def\ifplaintext{\doignore{ifplaintext}} 4040\def\ifxml{\doignore{ifxml}} 4041\def\ignore{\doignore{ignore}} 4042\def\menu{\doignore{menu}} 4043\def\xml{\doignore{xml}} 4044 4045% Ignore text until a line `@end #1', keeping track of nested conditionals. 4046% 4047% A count to remember the depth of nesting. 4048\newcount\doignorecount 4049 4050\def\doignore#1{\begingroup 4051 % Scan in ``verbatim'' mode: 4052 \obeylines 4053 \catcode`\@ = \other 4054 \catcode`\{ = \other 4055 \catcode`\} = \other 4056 % 4057 % Make sure that spaces turn into tokens that match what \doignoretext wants. 4058 \spaceisspace 4059 % 4060 % Count number of #1's that we've seen. 4061 \doignorecount = 0 4062 % 4063 % Swallow text until we reach the matching `@end #1'. 4064 \dodoignore{#1}% 4065} 4066 4067{ \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source. 4068 \obeylines % 4069 % 4070 \gdef\dodoignore#1{% 4071 % #1 contains the command name as a string, e.g., `ifinfo'. 4072 % 4073 % Define a command to find the next `@end #1'. 4074 \long\def\doignoretext##1^^M@end #1{% 4075 \doignoretextyyy##1^^M@#1\_STOP_}% 4076 % 4077 % And this command to find another #1 command, at the beginning of a 4078 % line. (Otherwise, we would consider a line `@c @ifset', for 4079 % example, to count as an @ifset for nesting.) 4080 \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}% 4081 % 4082 % And now expand that command. 4083 \doignoretext ^^M% 4084 }% 4085} 4086 4087\def\doignoreyyy#1{% 4088 \def\temp{#1}% 4089 \ifx\temp\empty % Nothing found. 4090 \let\next\doignoretextzzz 4091 \else % Found a nested condition, ... 4092 \advance\doignorecount by 1 4093 \let\next\doignoretextyyy % ..., look for another. 4094 % If we're here, #1 ends with ^^M\ifinfo (for example). 4095 \fi 4096 \next #1% the token \_STOP_ is present just after this macro. 4097} 4098 4099% We have to swallow the remaining "\_STOP_". 4100% 4101\def\doignoretextzzz#1{% 4102 \ifnum\doignorecount = 0 % We have just found the outermost @end. 4103 \let\next\enddoignore 4104 \else % Still inside a nested condition. 4105 \advance\doignorecount by -1 4106 \let\next\doignoretext % Look for the next @end. 4107 \fi 4108 \next 4109} 4110 4111% Finish off ignored text. 4112{ \obeylines% 4113 % Ignore anything after the last `@end #1'; this matters in verbatim 4114 % environments, where otherwise the newline after an ignored conditional 4115 % would result in a blank line in the output. 4116 \gdef\enddoignore#1^^M{\endgroup\ignorespaces}% 4117} 4118 4119 4120% @set VAR sets the variable VAR to an empty value. 4121% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE. 4122% 4123% Since we want to separate VAR from REST-OF-LINE (which might be 4124% empty), we can't just use \parsearg; we have to insert a space of our 4125% own to delimit the rest of the line, and then take it out again if we 4126% didn't need it. 4127% We rely on the fact that \parsearg sets \catcode`\ =10. 4128% 4129\parseargdef\set{\setyyy#1 \endsetyyy} 4130\def\setyyy#1 #2\endsetyyy{% 4131 {% 4132 \makevalueexpandable 4133 \def\temp{#2}% 4134 \edef\next{\gdef\makecsname{SET#1}}% 4135 \ifx\temp\empty 4136 \next{}% 4137 \else 4138 \setzzz#2\endsetzzz 4139 \fi 4140 }% 4141} 4142% Remove the trailing space \setxxx inserted. 4143\def\setzzz#1 \endsetzzz{\next{#1}} 4144 4145% @clear VAR clears (i.e., unsets) the variable VAR. 4146% 4147\parseargdef\clear{% 4148 {% 4149 \makevalueexpandable 4150 \global\expandafter\let\csname SET#1\endcsname=\relax 4151 }% 4152} 4153 4154% @value{foo} gets the text saved in variable foo. 4155\def\value{\begingroup\makevalueexpandable\valuexxx} 4156\def\valuexxx#1{\expandablevalue{#1}\endgroup} 4157{ 4158 \catcode`\- = \active \catcode`\_ = \active 4159 % 4160 \gdef\makevalueexpandable{% 4161 \let\value = \expandablevalue 4162 % We don't want these characters active, ... 4163 \catcode`\-=\other \catcode`\_=\other 4164 % ..., but we might end up with active ones in the argument if 4165 % we're called from @code, as @code{@value{foo-bar_}}, though. 4166 % So \let them to their normal equivalents. 4167 \let-\realdash \let_\normalunderscore 4168 } 4169} 4170 4171% We have this subroutine so that we can handle at least some @value's 4172% properly in indexes (we call \makevalueexpandable in \indexdummies). 4173% The command has to be fully expandable (if the variable is set), since 4174% the result winds up in the index file. This means that if the 4175% variable's value contains other Texinfo commands, it's almost certain 4176% it will fail (although perhaps we could fix that with sufficient work 4177% to do a one-level expansion on the result, instead of complete). 4178% 4179\def\expandablevalue#1{% 4180 \expandafter\ifx\csname SET#1\endcsname\relax 4181 {[No value for ``#1'']}% 4182 \message{Variable `#1', used in @value, is not set.}% 4183 \else 4184 \csname SET#1\endcsname 4185 \fi 4186} 4187 4188% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined 4189% with @set. 4190% 4191% To get special treatment of `@end ifset,' call \makeond and the redefine. 4192% 4193\makecond{ifset} 4194\def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}} 4195\def\doifset#1#2{% 4196 {% 4197 \makevalueexpandable 4198 \let\next=\empty 4199 \expandafter\ifx\csname SET#2\endcsname\relax 4200 #1% If not set, redefine \next. 4201 \fi 4202 \expandafter 4203 }\next 4204} 4205\def\ifsetfail{\doignore{ifset}} 4206 4207% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been 4208% defined with @set, or has been undefined with @clear. 4209% 4210% The `\else' inside the `\doifset' parameter is a trick to reuse the 4211% above code: if the variable is not set, do nothing, if it is set, 4212% then redefine \next to \ifclearfail. 4213% 4214\makecond{ifclear} 4215\def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}} 4216\def\ifclearfail{\doignore{ifclear}} 4217 4218% @dircategory CATEGORY -- specify a category of the dir file 4219% which this file should belong to. Ignore this in TeX. 4220\let\dircategory=\comment 4221 4222% @defininfoenclose. 4223\let\definfoenclose=\comment 4224 4225 4226\message{indexing,} 4227% Index generation facilities 4228 4229% Define \newwrite to be identical to plain tex's \newwrite 4230% except not \outer, so it can be used within macros and \if's. 4231\edef\newwrite{\makecsname{ptexnewwrite}} 4232 4233% \newindex {foo} defines an index named foo. 4234% It automatically defines \fooindex such that 4235% \fooindex ...rest of line... puts an entry in the index foo. 4236% It also defines \fooindfile to be the number of the output channel for 4237% the file that accumulates this index. The file's extension is foo. 4238% The name of an index should be no more than 2 characters long 4239% for the sake of vms. 4240% 4241\def\newindex#1{% 4242 \iflinks 4243 \expandafter\newwrite \csname#1indfile\endcsname 4244 \openout \csname#1indfile\endcsname \jobname.#1 % Open the file 4245 \fi 4246 \expandafter\xdef\csname#1index\endcsname{% % Define @#1index 4247 \noexpand\doindex{#1}} 4248} 4249 4250% @defindex foo == \newindex{foo} 4251% 4252\def\defindex{\parsearg\newindex} 4253 4254% Define @defcodeindex, like @defindex except put all entries in @code. 4255% 4256\def\defcodeindex{\parsearg\newcodeindex} 4257% 4258\def\newcodeindex#1{% 4259 \iflinks 4260 \expandafter\newwrite \csname#1indfile\endcsname 4261 \openout \csname#1indfile\endcsname \jobname.#1 4262 \fi 4263 \expandafter\xdef\csname#1index\endcsname{% 4264 \noexpand\docodeindex{#1}}% 4265} 4266 4267 4268% @synindex foo bar makes index foo feed into index bar. 4269% Do this instead of @defindex foo if you don't want it as a separate index. 4270% 4271% @syncodeindex foo bar similar, but put all entries made for index foo 4272% inside @code. 4273% 4274\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}} 4275\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}} 4276 4277% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo), 4278% #3 the target index (bar). 4279\def\dosynindex#1#2#3{% 4280 % Only do \closeout if we haven't already done it, else we'll end up 4281 % closing the target index. 4282 \expandafter \ifx\csname donesynindex#2\endcsname \relax 4283 % The \closeout helps reduce unnecessary open files; the limit on the 4284 % Acorn RISC OS is a mere 16 files. 4285 \expandafter\closeout\csname#2indfile\endcsname 4286 \expandafter\let\csname donesynindex#2\endcsname = 1 4287 \fi 4288 % redefine \fooindfile: 4289 \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname 4290 \expandafter\let\csname#2indfile\endcsname=\temp 4291 % redefine \fooindex: 4292 \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}% 4293} 4294 4295% Define \doindex, the driver for all \fooindex macros. 4296% Argument #1 is generated by the calling \fooindex macro, 4297% and it is "foo", the name of the index. 4298 4299% \doindex just uses \parsearg; it calls \doind for the actual work. 4300% This is because \doind is more useful to call from other macros. 4301 4302% There is also \dosubind {index}{topic}{subtopic} 4303% which makes an entry in a two-level index such as the operation index. 4304 4305\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer} 4306\def\singleindexer #1{\doind{\indexname}{#1}} 4307 4308% like the previous two, but they put @code around the argument. 4309\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} 4310\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} 4311 4312% Take care of Texinfo commands that can appear in an index entry. 4313% Since there are some commands we want to expand, and others we don't, 4314% we have to laboriously prevent expansion for those that we don't. 4315% 4316\def\indexdummies{% 4317 \escapechar = `\\ % use backslash in output files. 4318 \def\@{@}% change to @@ when we switch to @ as escape char in index files. 4319 \def\ {\realbackslash\space }% 4320 % 4321 % Need these unexpandable (because we define \tt as a dummy) 4322 % definitions when @{ or @} appear in index entry text. Also, more 4323 % complicated, when \tex is in effect and \{ is a \delimiter again. 4324 % We can't use \lbracecmd and \rbracecmd because texindex assumes 4325 % braces and backslashes are used only as delimiters. Perhaps we 4326 % should define @lbrace and @rbrace commands a la @comma. 4327 \def\{{{\tt\char123}}% 4328 \def\}{{\tt\char125}}% 4329 % 4330 % I don't entirely understand this, but when an index entry is 4331 % generated from a macro call, the \endinput which \scanmacro inserts 4332 % causes processing to be prematurely terminated. This is, 4333 % apparently, because \indexsorttmp is fully expanded, and \endinput 4334 % is an expandable command. The redefinition below makes \endinput 4335 % disappear altogether for that purpose -- although logging shows that 4336 % processing continues to some further point. On the other hand, it 4337 % seems \endinput does not hurt in the printed index arg, since that 4338 % is still getting written without apparent harm. 4339 % 4340 % Sample source (mac-idx3.tex, reported by Graham Percival to 4341 % help-texinfo, 22may06): 4342 % @macro funindex {WORD} 4343 % @findex xyz 4344 % @end macro 4345 % ... 4346 % @funindex commtest 4347 % 4348 % The above is not enough to reproduce the bug, but it gives the flavor. 4349 % 4350 % Sample whatsit resulting: 4351 % .@write3{\entry{xyz}{@folio }{@code {xyz@endinput }}} 4352 % 4353 % So: 4354 \let\endinput = \empty 4355 % 4356 % Do the redefinitions. 4357 \commondummies 4358} 4359 4360% For the aux and toc files, @ is the escape character. So we want to 4361% redefine everything using @ as the escape character (instead of 4362% \realbackslash, still used for index files). When everything uses @, 4363% this will be simpler. 4364% 4365\def\atdummies{% 4366 \def\@{@@}% 4367 \def\ {@ }% 4368 \let\{ = \lbraceatcmd 4369 \let\} = \rbraceatcmd 4370 % 4371 % Do the redefinitions. 4372 \commondummies 4373 \otherbackslash 4374} 4375 4376% Called from \indexdummies and \atdummies. 4377% 4378\def\commondummies{% 4379 % 4380 % \definedummyword defines \#1 as \string\#1\space, thus effectively 4381 % preventing its expansion. This is used only for control words, 4382 % not control letters, because the \space would be incorrect for 4383 % control characters, but is needed to separate the control word 4384 % from whatever follows. 4385 % 4386 % For control letters, we have \definedummyletter, which omits the 4387 % space. 4388 % 4389 % These can be used both for control words that take an argument and 4390 % those that do not. If it is followed by {arg} in the input, then 4391 % that will dutifully get written to the index (or wherever). 4392 % 4393 \def\definedummyword ##1{\def##1{\string##1\space}}% 4394 \def\definedummyletter##1{\def##1{\string##1}}% 4395 \let\definedummyaccent\definedummyletter 4396 % 4397 \commondummiesnofonts 4398 % 4399 \definedummyletter\_% 4400 \definedummyletter\-% 4401 % 4402 % Non-English letters. 4403 \definedummyword\AA 4404 \definedummyword\AE 4405 \definedummyword\DH 4406 \definedummyword\L 4407 \definedummyword\O 4408 \definedummyword\OE 4409 \definedummyword\TH 4410 \definedummyword\aa 4411 \definedummyword\ae 4412 \definedummyword\dh 4413 \definedummyword\exclamdown 4414 \definedummyword\l 4415 \definedummyword\o 4416 \definedummyword\oe 4417 \definedummyword\ordf 4418 \definedummyword\ordm 4419 \definedummyword\questiondown 4420 \definedummyword\ss 4421 \definedummyword\th 4422 % 4423 % Although these internal commands shouldn't show up, sometimes they do. 4424 \definedummyword\bf 4425 \definedummyword\gtr 4426 \definedummyword\hat 4427 \definedummyword\less 4428 \definedummyword\sf 4429 \definedummyword\sl 4430 \definedummyword\tclose 4431 \definedummyword\tt 4432 % 4433 \definedummyword\LaTeX 4434 \definedummyword\TeX 4435 % 4436 % Assorted special characters. 4437 \definedummyword\arrow 4438 \definedummyword\bullet 4439 \definedummyword\comma 4440 \definedummyword\copyright 4441 \definedummyword\registeredsymbol 4442 \definedummyword\dots 4443 \definedummyword\enddots 4444 \definedummyword\entrybreak 4445 \definedummyword\equiv 4446 \definedummyword\error 4447 \definedummyword\euro 4448 \definedummyword\expansion 4449 \definedummyword\geq 4450 \definedummyword\guillemetleft 4451 \definedummyword\guillemetright 4452 \definedummyword\guilsinglleft 4453 \definedummyword\guilsinglright 4454 \definedummyword\lbracechar 4455 \definedummyword\leq 4456 \definedummyword\minus 4457 \definedummyword\ogonek 4458 \definedummyword\pounds 4459 \definedummyword\point 4460 \definedummyword\print 4461 \definedummyword\quotedblbase 4462 \definedummyword\quotedblleft 4463 \definedummyword\quotedblright 4464 \definedummyword\quoteleft 4465 \definedummyword\quoteright 4466 \definedummyword\quotesinglbase 4467 \definedummyword\rbracechar 4468 \definedummyword\result 4469 \definedummyword\textdegree 4470 % 4471 % We want to disable all macros so that they are not expanded by \write. 4472 \macrolist 4473 % 4474 \normalturnoffactive 4475 % 4476 % Handle some cases of @value -- where it does not contain any 4477 % (non-fully-expandable) commands. 4478 \makevalueexpandable 4479} 4480 4481% \commondummiesnofonts: common to \commondummies and \indexnofonts. 4482% 4483\def\commondummiesnofonts{% 4484 % Control letters and accents. 4485 \definedummyletter\!% 4486 \definedummyaccent\"% 4487 \definedummyaccent\'% 4488 \definedummyletter\*% 4489 \definedummyaccent\,% 4490 \definedummyletter\.% 4491 \definedummyletter\/% 4492 \definedummyletter\:% 4493 \definedummyaccent\=% 4494 \definedummyletter\?% 4495 \definedummyaccent\^% 4496 \definedummyaccent\`% 4497 \definedummyaccent\~% 4498 \definedummyword\u 4499 \definedummyword\v 4500 \definedummyword\H 4501 \definedummyword\dotaccent 4502 \definedummyword\ogonek 4503 \definedummyword\ringaccent 4504 \definedummyword\tieaccent 4505 \definedummyword\ubaraccent 4506 \definedummyword\udotaccent 4507 \definedummyword\dotless 4508 % 4509 % Texinfo font commands. 4510 \definedummyword\b 4511 \definedummyword\i 4512 \definedummyword\r 4513 \definedummyword\sansserif 4514 \definedummyword\sc 4515 \definedummyword\slanted 4516 \definedummyword\t 4517 % 4518 % Commands that take arguments. 4519 \definedummyword\abbr 4520 \definedummyword\acronym 4521 \definedummyword\anchor 4522 \definedummyword\cite 4523 \definedummyword\code 4524 \definedummyword\command 4525 \definedummyword\dfn 4526 \definedummyword\dmn 4527 \definedummyword\email 4528 \definedummyword\emph 4529 \definedummyword\env 4530 \definedummyword\file 4531 \definedummyword\image 4532 \definedummyword\indicateurl 4533 \definedummyword\inforef 4534 \definedummyword\kbd 4535 \definedummyword\key 4536 \definedummyword\math 4537 \definedummyword\option 4538 \definedummyword\pxref 4539 \definedummyword\ref 4540 \definedummyword\samp 4541 \definedummyword\strong 4542 \definedummyword\tie 4543 \definedummyword\uref 4544 \definedummyword\url 4545 \definedummyword\var 4546 \definedummyword\verb 4547 \definedummyword\w 4548 \definedummyword\xref 4549} 4550 4551% \indexnofonts is used when outputting the strings to sort the index 4552% by, and when constructing control sequence names. It eliminates all 4553% control sequences and just writes whatever the best ASCII sort string 4554% would be for a given command (usually its argument). 4555% 4556\def\indexnofonts{% 4557 % Accent commands should become @asis. 4558 \def\definedummyaccent##1{\let##1\asis}% 4559 % We can just ignore other control letters. 4560 \def\definedummyletter##1{\let##1\empty}% 4561 % All control words become @asis by default; overrides below. 4562 \let\definedummyword\definedummyaccent 4563 % 4564 \commondummiesnofonts 4565 % 4566 % Don't no-op \tt, since it isn't a user-level command 4567 % and is used in the definitions of the active chars like <, >, |, etc. 4568 % Likewise with the other plain tex font commands. 4569 %\let\tt=\asis 4570 % 4571 \def\ { }% 4572 \def\@{@}% 4573 \def\_{\normalunderscore}% 4574 \def\-{}% @- shouldn't affect sorting 4575 % 4576 % Unfortunately, texindex is not prepared to handle braces in the 4577 % content at all. So for index sorting, we map @{ and @} to strings 4578 % starting with |, since that ASCII character is between ASCII { and }. 4579 \def\{{|a}% 4580 \def\lbracechar{|a}% 4581 % 4582 \def\}{|b}% 4583 \def\rbracechar{|b}% 4584 % 4585 % Non-English letters. 4586 \def\AA{AA}% 4587 \def\AE{AE}% 4588 \def\DH{DZZ}% 4589 \def\L{L}% 4590 \def\OE{OE}% 4591 \def\O{O}% 4592 \def\TH{ZZZ}% 4593 \def\aa{aa}% 4594 \def\ae{ae}% 4595 \def\dh{dzz}% 4596 \def\exclamdown{!}% 4597 \def\l{l}% 4598 \def\oe{oe}% 4599 \def\ordf{a}% 4600 \def\ordm{o}% 4601 \def\o{o}% 4602 \def\questiondown{?}% 4603 \def\ss{ss}% 4604 \def\th{zzz}% 4605 % 4606 \def\LaTeX{LaTeX}% 4607 \def\TeX{TeX}% 4608 % 4609 % Assorted special characters. 4610 % (The following {} will end up in the sort string, but that's ok.) 4611 \def\arrow{->}% 4612 \def\bullet{bullet}% 4613 \def\comma{,}% 4614 \def\copyright{copyright}% 4615 \def\dots{...}% 4616 \def\enddots{...}% 4617 \def\equiv{==}% 4618 \def\error{error}% 4619 \def\euro{euro}% 4620 \def\expansion{==>}% 4621 \def\geq{>=}% 4622 \def\guillemetleft{<<}% 4623 \def\guillemetright{>>}% 4624 \def\guilsinglleft{<}% 4625 \def\guilsinglright{>}% 4626 \def\leq{<=}% 4627 \def\minus{-}% 4628 \def\point{.}% 4629 \def\pounds{pounds}% 4630 \def\print{-|}% 4631 \def\quotedblbase{"}% 4632 \def\quotedblleft{"}% 4633 \def\quotedblright{"}% 4634 \def\quoteleft{`}% 4635 \def\quoteright{'}% 4636 \def\quotesinglbase{,}% 4637 \def\registeredsymbol{R}% 4638 \def\result{=>}% 4639 \def\textdegree{o}% 4640 % 4641 \expandafter\ifx\csname SETtxiindexlquoteignore\endcsname\relax 4642 \else \indexlquoteignore \fi 4643 % 4644 % We need to get rid of all macros, leaving only the arguments (if present). 4645 % Of course this is not nearly correct, but it is the best we can do for now. 4646 % makeinfo does not expand macros in the argument to @deffn, which ends up 4647 % writing an index entry, and texindex isn't prepared for an index sort entry 4648 % that starts with \. 4649 % 4650 % Since macro invocations are followed by braces, we can just redefine them 4651 % to take a single TeX argument. The case of a macro invocation that 4652 % goes to end-of-line is not handled. 4653 % 4654 \macrolist 4655} 4656 4657% Undocumented (for FSFS 2nd ed.): @set txiindexlquoteignore makes us 4658% ignore left quotes in the sort term. 4659{\catcode`\`=\active 4660 \gdef\indexlquoteignore{\let`=\empty}} 4661 4662\let\indexbackslash=0 %overridden during \printindex. 4663\let\SETmarginindex=\relax % put index entries in margin (undocumented)? 4664 4665% Most index entries go through here, but \dosubind is the general case. 4666% #1 is the index name, #2 is the entry text. 4667\def\doind#1#2{\dosubind{#1}{#2}{}} 4668 4669% Workhorse for all \fooindexes. 4670% #1 is name of index, #2 is stuff to put there, #3 is subentry -- 4671% empty if called from \doind, as we usually are (the main exception 4672% is with most defuns, which call us directly). 4673% 4674\def\dosubind#1#2#3{% 4675 \iflinks 4676 {% 4677 % Store the main index entry text (including the third arg). 4678 \toks0 = {#2}% 4679 % If third arg is present, precede it with a space. 4680 \def\thirdarg{#3}% 4681 \ifx\thirdarg\empty \else 4682 \toks0 = \expandafter{\the\toks0 \space #3}% 4683 \fi 4684 % 4685 \edef\writeto{\csname#1indfile\endcsname}% 4686 % 4687 \safewhatsit\dosubindwrite 4688 }% 4689 \fi 4690} 4691 4692% Write the entry in \toks0 to the index file: 4693% 4694\def\dosubindwrite{% 4695 % Put the index entry in the margin if desired. 4696 \ifx\SETmarginindex\relax\else 4697 \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}% 4698 \fi 4699 % 4700 % Remember, we are within a group. 4701 \indexdummies % Must do this here, since \bf, etc expand at this stage 4702 \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now 4703 % so it will be output as is; and it will print as backslash. 4704 % 4705 % Process the index entry with all font commands turned off, to 4706 % get the string to sort by. 4707 {\indexnofonts 4708 \edef\temp{\the\toks0}% need full expansion 4709 \xdef\indexsorttmp{\temp}% 4710 }% 4711 % 4712 % Set up the complete index entry, with both the sort key and 4713 % the original text, including any font commands. We write 4714 % three arguments to \entry to the .?? file (four in the 4715 % subentry case), texindex reduces to two when writing the .??s 4716 % sorted result. 4717 \edef\temp{% 4718 \write\writeto{% 4719 \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}% 4720 }% 4721 \temp 4722} 4723 4724% Take care of unwanted page breaks/skips around a whatsit: 4725% 4726% If a skip is the last thing on the list now, preserve it 4727% by backing up by \lastskip, doing the \write, then inserting 4728% the skip again. Otherwise, the whatsit generated by the 4729% \write or \pdfdest will make \lastskip zero. The result is that 4730% sequences like this: 4731% @end defun 4732% @tindex whatever 4733% @defun ... 4734% will have extra space inserted, because the \medbreak in the 4735% start of the @defun won't see the skip inserted by the @end of 4736% the previous defun. 4737% 4738% But don't do any of this if we're not in vertical mode. We 4739% don't want to do a \vskip and prematurely end a paragraph. 4740% 4741% Avoid page breaks due to these extra skips, too. 4742% 4743% But wait, there is a catch there: 4744% We'll have to check whether \lastskip is zero skip. \ifdim is not 4745% sufficient for this purpose, as it ignores stretch and shrink parts 4746% of the skip. The only way seems to be to check the textual 4747% representation of the skip. 4748% 4749% The following is almost like \def\zeroskipmacro{0.0pt} except that 4750% the ``p'' and ``t'' characters have catcode \other, not 11 (letter). 4751% 4752\edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname} 4753% 4754\newskip\whatsitskip 4755\newcount\whatsitpenalty 4756% 4757% ..., ready, GO: 4758% 4759\def\safewhatsit#1{\ifhmode 4760 #1% 4761 \else 4762 % \lastskip and \lastpenalty cannot both be nonzero simultaneously. 4763 \whatsitskip = \lastskip 4764 \edef\lastskipmacro{\the\lastskip}% 4765 \whatsitpenalty = \lastpenalty 4766 % 4767 % If \lastskip is nonzero, that means the last item was a 4768 % skip. And since a skip is discardable, that means this 4769 % -\whatsitskip glue we're inserting is preceded by a 4770 % non-discardable item, therefore it is not a potential 4771 % breakpoint, therefore no \nobreak needed. 4772 \ifx\lastskipmacro\zeroskipmacro 4773 \else 4774 \vskip-\whatsitskip 4775 \fi 4776 % 4777 #1% 4778 % 4779 \ifx\lastskipmacro\zeroskipmacro 4780 % If \lastskip was zero, perhaps the last item was a penalty, and 4781 % perhaps it was >=10000, e.g., a \nobreak. In that case, we want 4782 % to re-insert the same penalty (values >10000 are used for various 4783 % signals); since we just inserted a non-discardable item, any 4784 % following glue (such as a \parskip) would be a breakpoint. For example: 4785 % @deffn deffn-whatever 4786 % @vindex index-whatever 4787 % Description. 4788 % would allow a break between the index-whatever whatsit 4789 % and the "Description." paragraph. 4790 \ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi 4791 \else 4792 % On the other hand, if we had a nonzero \lastskip, 4793 % this make-up glue would be preceded by a non-discardable item 4794 % (the whatsit from the \write), so we must insert a \nobreak. 4795 \nobreak\vskip\whatsitskip 4796 \fi 4797\fi} 4798 4799% The index entry written in the file actually looks like 4800% \entry {sortstring}{page}{topic} 4801% or 4802% \entry {sortstring}{page}{topic}{subtopic} 4803% The texindex program reads in these files and writes files 4804% containing these kinds of lines: 4805% \initial {c} 4806% before the first topic whose initial is c 4807% \entry {topic}{pagelist} 4808% for a topic that is used without subtopics 4809% \primary {topic} 4810% for the beginning of a topic that is used with subtopics 4811% \secondary {subtopic}{pagelist} 4812% for each subtopic. 4813 4814% Define the user-accessible indexing commands 4815% @findex, @vindex, @kindex, @cindex. 4816 4817\def\findex {\fnindex} 4818\def\kindex {\kyindex} 4819\def\cindex {\cpindex} 4820\def\vindex {\vrindex} 4821\def\tindex {\tpindex} 4822\def\pindex {\pgindex} 4823 4824\def\cindexsub {\begingroup\obeylines\cindexsub} 4825{\obeylines % 4826\gdef\cindexsub "#1" #2^^M{\endgroup % 4827\dosubind{cp}{#2}{#1}}} 4828 4829% Define the macros used in formatting output of the sorted index material. 4830 4831% @printindex causes a particular index (the ??s file) to get printed. 4832% It does not print any chapter heading (usually an @unnumbered). 4833% 4834\parseargdef\printindex{\begingroup 4835 \dobreak \chapheadingskip{10000}% 4836 % 4837 \smallfonts \rm 4838 \tolerance = 9500 4839 \plainfrenchspacing 4840 \everypar = {}% don't want the \kern\-parindent from indentation suppression. 4841 % 4842 % See if the index file exists and is nonempty. 4843 % Change catcode of @ here so that if the index file contains 4844 % \initial {@} 4845 % as its first line, TeX doesn't complain about mismatched braces 4846 % (because it thinks @} is a control sequence). 4847 \catcode`\@ = 11 4848 \openin 1 \jobname.#1s 4849 \ifeof 1 4850 % \enddoublecolumns gets confused if there is no text in the index, 4851 % and it loses the chapter title and the aux file entries for the 4852 % index. The easiest way to prevent this problem is to make sure 4853 % there is some text. 4854 \putwordIndexNonexistent 4855 \else 4856 % 4857 % If the index file exists but is empty, then \openin leaves \ifeof 4858 % false. We have to make TeX try to read something from the file, so 4859 % it can discover if there is anything in it. 4860 \read 1 to \temp 4861 \ifeof 1 4862 \putwordIndexIsEmpty 4863 \else 4864 % Index files are almost Texinfo source, but we use \ as the escape 4865 % character. It would be better to use @, but that's too big a change 4866 % to make right now. 4867 \def\indexbackslash{\backslashcurfont}% 4868 \catcode`\\ = 0 4869 \escapechar = `\\ 4870 \begindoublecolumns 4871 \input \jobname.#1s 4872 \enddoublecolumns 4873 \fi 4874 \fi 4875 \closein 1 4876\endgroup} 4877 4878% These macros are used by the sorted index file itself. 4879% Change them to control the appearance of the index. 4880 4881\def\initial#1{{% 4882 % Some minor font changes for the special characters. 4883 \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt 4884 % 4885 % Remove any glue we may have, we'll be inserting our own. 4886 \removelastskip 4887 % 4888 % We like breaks before the index initials, so insert a bonus. 4889 \nobreak 4890 \vskip 0pt plus 3\baselineskip 4891 \penalty 0 4892 \vskip 0pt plus -3\baselineskip 4893 % 4894 % Typeset the initial. Making this add up to a whole number of 4895 % baselineskips increases the chance of the dots lining up from column 4896 % to column. It still won't often be perfect, because of the stretch 4897 % we need before each entry, but it's better. 4898 % 4899 % No shrink because it confuses \balancecolumns. 4900 \vskip 1.67\baselineskip plus .5\baselineskip 4901 \leftline{\secbf #1}% 4902 % Do our best not to break after the initial. 4903 \nobreak 4904 \vskip .33\baselineskip plus .1\baselineskip 4905}} 4906 4907% \entry typesets a paragraph consisting of the text (#1), dot leaders, and 4908% then page number (#2) flushed to the right margin. It is used for index 4909% and table of contents entries. The paragraph is indented by \leftskip. 4910% 4911% A straightforward implementation would start like this: 4912% \def\entry#1#2{... 4913% But this freezes the catcodes in the argument, and can cause problems to 4914% @code, which sets - active. This problem was fixed by a kludge--- 4915% ``-'' was active throughout whole index, but this isn't really right. 4916% The right solution is to prevent \entry from swallowing the whole text. 4917% --kasal, 21nov03 4918\def\entry{% 4919 \begingroup 4920 % 4921 % Start a new paragraph if necessary, so our assignments below can't 4922 % affect previous text. 4923 \par 4924 % 4925 % Do not fill out the last line with white space. 4926 \parfillskip = 0in 4927 % 4928 % No extra space above this paragraph. 4929 \parskip = 0in 4930 % 4931 % Do not prefer a separate line ending with a hyphen to fewer lines. 4932 \finalhyphendemerits = 0 4933 % 4934 % \hangindent is only relevant when the entry text and page number 4935 % don't both fit on one line. In that case, bob suggests starting the 4936 % dots pretty far over on the line. Unfortunately, a large 4937 % indentation looks wrong when the entry text itself is broken across 4938 % lines. So we use a small indentation and put up with long leaders. 4939 % 4940 % \hangafter is reset to 1 (which is the value we want) at the start 4941 % of each paragraph, so we need not do anything with that. 4942 \hangindent = 2em 4943 % 4944 % When the entry text needs to be broken, just fill out the first line 4945 % with blank space. 4946 \rightskip = 0pt plus1fil 4947 % 4948 % A bit of stretch before each entry for the benefit of balancing 4949 % columns. 4950 \vskip 0pt plus1pt 4951 % 4952 % When reading the text of entry, convert explicit line breaks 4953 % from @* into spaces. The user might give these in long section 4954 % titles, for instance. 4955 \def\*{\unskip\space\ignorespaces}% 4956 \def\entrybreak{\hfil\break}% 4957 % 4958 % Swallow the left brace of the text (first parameter): 4959 \afterassignment\doentry 4960 \let\temp = 4961} 4962\def\entrybreak{\unskip\space\ignorespaces}% 4963\def\doentry{% 4964 \bgroup % Instead of the swallowed brace. 4965 \noindent 4966 \aftergroup\finishentry 4967 % And now comes the text of the entry. 4968} 4969\def\finishentry#1{% 4970 % #1 is the page number. 4971 % 4972 % The following is kludged to not output a line of dots in the index if 4973 % there are no page numbers. The next person who breaks this will be 4974 % cursed by a Unix daemon. 4975 \setbox\boxA = \hbox{#1}% 4976 \ifdim\wd\boxA = 0pt 4977 \ % 4978 \else 4979 % 4980 % If we must, put the page number on a line of its own, and fill out 4981 % this line with blank space. (The \hfil is overwhelmed with the 4982 % fill leaders glue in \indexdotfill if the page number does fit.) 4983 \hfil\penalty50 4984 \null\nobreak\indexdotfill % Have leaders before the page number. 4985 % 4986 % The `\ ' here is removed by the implicit \unskip that TeX does as 4987 % part of (the primitive) \par. Without it, a spurious underfull 4988 % \hbox ensues. 4989 \ifpdf 4990 \pdfgettoks#1.% 4991 \ \the\toksA 4992 \else 4993 \ #1% 4994 \fi 4995 \fi 4996 \par 4997 \endgroup 4998} 4999 5000% Like plain.tex's \dotfill, except uses up at least 1 em. 5001\def\indexdotfill{\cleaders 5002 \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1fill} 5003 5004\def\primary #1{\line{#1\hfil}} 5005 5006\newskip\secondaryindent \secondaryindent=0.5cm 5007\def\secondary#1#2{{% 5008 \parfillskip=0in 5009 \parskip=0in 5010 \hangindent=1in 5011 \hangafter=1 5012 \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill 5013 \ifpdf 5014 \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. 5015 \else 5016 #2 5017 \fi 5018 \par 5019}} 5020 5021% Define two-column mode, which we use to typeset indexes. 5022% Adapted from the TeXbook, page 416, which is to say, 5023% the manmac.tex format used to print the TeXbook itself. 5024\catcode`\@=11 5025 5026\newbox\partialpage 5027\newdimen\doublecolumnhsize 5028 5029\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns 5030 % Grab any single-column material above us. 5031 \output = {% 5032 % 5033 % Here is a possibility not foreseen in manmac: if we accumulate a 5034 % whole lot of material, we might end up calling this \output 5035 % routine twice in a row (see the doublecol-lose test, which is 5036 % essentially a couple of indexes with @setchapternewpage off). In 5037 % that case we just ship out what is in \partialpage with the normal 5038 % output routine. Generally, \partialpage will be empty when this 5039 % runs and this will be a no-op. See the indexspread.tex test case. 5040 \ifvoid\partialpage \else 5041 \onepageout{\pagecontents\partialpage}% 5042 \fi 5043 % 5044 \global\setbox\partialpage = \vbox{% 5045 % Unvbox the main output page. 5046 \unvbox\PAGE 5047 \kern-\topskip \kern\baselineskip 5048 }% 5049 }% 5050 \eject % run that output routine to set \partialpage 5051 % 5052 % Use the double-column output routine for subsequent pages. 5053 \output = {\doublecolumnout}% 5054 % 5055 % Change the page size parameters. We could do this once outside this 5056 % routine, in each of @smallbook, @afourpaper, and the default 8.5x11 5057 % format, but then we repeat the same computation. Repeating a couple 5058 % of assignments once per index is clearly meaningless for the 5059 % execution time, so we may as well do it in one place. 5060 % 5061 % First we halve the line length, less a little for the gutter between 5062 % the columns. We compute the gutter based on the line length, so it 5063 % changes automatically with the paper format. The magic constant 5064 % below is chosen so that the gutter has the same value (well, +-<1pt) 5065 % as it did when we hard-coded it. 5066 % 5067 % We put the result in a separate register, \doublecolumhsize, so we 5068 % can restore it in \pagesofar, after \hsize itself has (potentially) 5069 % been clobbered. 5070 % 5071 \doublecolumnhsize = \hsize 5072 \advance\doublecolumnhsize by -.04154\hsize 5073 \divide\doublecolumnhsize by 2 5074 \hsize = \doublecolumnhsize 5075 % 5076 % Double the \vsize as well. (We don't need a separate register here, 5077 % since nobody clobbers \vsize.) 5078 \vsize = 2\vsize 5079} 5080 5081% The double-column output routine for all double-column pages except 5082% the last. 5083% 5084\def\doublecolumnout{% 5085 \splittopskip=\topskip \splitmaxdepth=\maxdepth 5086 % Get the available space for the double columns -- the normal 5087 % (undoubled) page height minus any material left over from the 5088 % previous page. 5089 \dimen@ = \vsize 5090 \divide\dimen@ by 2 5091 \advance\dimen@ by -\ht\partialpage 5092 % 5093 % box0 will be the left-hand column, box2 the right. 5094 \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ 5095 \onepageout\pagesofar 5096 \unvbox255 5097 \penalty\outputpenalty 5098} 5099% 5100% Re-output the contents of the output page -- any previous material, 5101% followed by the two boxes we just split, in box0 and box2. 5102\def\pagesofar{% 5103 \unvbox\partialpage 5104 % 5105 \hsize = \doublecolumnhsize 5106 \wd0=\hsize \wd2=\hsize 5107 \hbox to\pagewidth{\box0\hfil\box2}% 5108} 5109% 5110% All done with double columns. 5111\def\enddoublecolumns{% 5112 % The following penalty ensures that the page builder is exercised 5113 % _before_ we change the output routine. This is necessary in the 5114 % following situation: 5115 % 5116 % The last section of the index consists only of a single entry. 5117 % Before this section, \pagetotal is less than \pagegoal, so no 5118 % break occurs before the last section starts. However, the last 5119 % section, consisting of \initial and the single \entry, does not 5120 % fit on the page and has to be broken off. Without the following 5121 % penalty the page builder will not be exercised until \eject 5122 % below, and by that time we'll already have changed the output 5123 % routine to the \balancecolumns version, so the next-to-last 5124 % double-column page will be processed with \balancecolumns, which 5125 % is wrong: The two columns will go to the main vertical list, with 5126 % the broken-off section in the recent contributions. As soon as 5127 % the output routine finishes, TeX starts reconsidering the page 5128 % break. The two columns and the broken-off section both fit on the 5129 % page, because the two columns now take up only half of the page 5130 % goal. When TeX sees \eject from below which follows the final 5131 % section, it invokes the new output routine that we've set after 5132 % \balancecolumns below; \onepageout will try to fit the two columns 5133 % and the final section into the vbox of \pageheight (see 5134 % \pagebody), causing an overfull box. 5135 % 5136 % Note that glue won't work here, because glue does not exercise the 5137 % page builder, unlike penalties (see The TeXbook, pp. 280-281). 5138 \penalty0 5139 % 5140 \output = {% 5141 % Split the last of the double-column material. Leave it on the 5142 % current page, no automatic page break. 5143 \balancecolumns 5144 % 5145 % If we end up splitting too much material for the current page, 5146 % though, there will be another page break right after this \output 5147 % invocation ends. Having called \balancecolumns once, we do not 5148 % want to call it again. Therefore, reset \output to its normal 5149 % definition right away. (We hope \balancecolumns will never be 5150 % called on to balance too much material, but if it is, this makes 5151 % the output somewhat more palatable.) 5152 \global\output = {\onepageout{\pagecontents\PAGE}}% 5153 }% 5154 \eject 5155 \endgroup % started in \begindoublecolumns 5156 % 5157 % \pagegoal was set to the doubled \vsize above, since we restarted 5158 % the current page. We're now back to normal single-column 5159 % typesetting, so reset \pagegoal to the normal \vsize (after the 5160 % \endgroup where \vsize got restored). 5161 \pagegoal = \vsize 5162} 5163% 5164% Called at the end of the double column material. 5165\def\balancecolumns{% 5166 \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120. 5167 \dimen@ = \ht0 5168 \advance\dimen@ by \topskip 5169 \advance\dimen@ by-\baselineskip 5170 \divide\dimen@ by 2 % target to split to 5171 %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}% 5172 \splittopskip = \topskip 5173 % Loop until we get a decent breakpoint. 5174 {% 5175 \vbadness = 10000 5176 \loop 5177 \global\setbox3 = \copy0 5178 \global\setbox1 = \vsplit3 to \dimen@ 5179 \ifdim\ht3>\dimen@ 5180 \global\advance\dimen@ by 1pt 5181 \repeat 5182 }% 5183 %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}% 5184 \setbox0=\vbox to\dimen@{\unvbox1}% 5185 \setbox2=\vbox to\dimen@{\unvbox3}% 5186 % 5187 \pagesofar 5188} 5189\catcode`\@ = \other 5190 5191 5192\message{sectioning,} 5193% Chapters, sections, etc. 5194 5195% Let's start with @part. 5196\outer\parseargdef\part{\partzzz{#1}} 5197\def\partzzz#1{% 5198 \chapoddpage 5199 \null 5200 \vskip.3\vsize % move it down on the page a bit 5201 \begingroup 5202 \noindent \titlefonts\rmisbold #1\par % the text 5203 \let\lastnode=\empty % no node to associate with 5204 \writetocentry{part}{#1}{}% but put it in the toc 5205 \headingsoff % no headline or footline on the part page 5206 \chapoddpage 5207 \endgroup 5208} 5209 5210% \unnumberedno is an oxymoron. But we count the unnumbered 5211% sections so that we can refer to them unambiguously in the pdf 5212% outlines by their "section number". We avoid collisions with chapter 5213% numbers by starting them at 10000. (If a document ever has 10000 5214% chapters, we're in trouble anyway, I'm sure.) 5215\newcount\unnumberedno \unnumberedno = 10000 5216\newcount\chapno 5217\newcount\secno \secno=0 5218\newcount\subsecno \subsecno=0 5219\newcount\subsubsecno \subsubsecno=0 5220 5221% This counter is funny since it counts through charcodes of letters A, B, ... 5222\newcount\appendixno \appendixno = `\@ 5223% 5224% \def\appendixletter{\char\the\appendixno} 5225% We do the following ugly conditional instead of the above simple 5226% construct for the sake of pdftex, which needs the actual 5227% letter in the expansion, not just typeset. 5228% 5229\def\appendixletter{% 5230 \ifnum\appendixno=`A A% 5231 \else\ifnum\appendixno=`B B% 5232 \else\ifnum\appendixno=`C C% 5233 \else\ifnum\appendixno=`D D% 5234 \else\ifnum\appendixno=`E E% 5235 \else\ifnum\appendixno=`F F% 5236 \else\ifnum\appendixno=`G G% 5237 \else\ifnum\appendixno=`H H% 5238 \else\ifnum\appendixno=`I I% 5239 \else\ifnum\appendixno=`J J% 5240 \else\ifnum\appendixno=`K K% 5241 \else\ifnum\appendixno=`L L% 5242 \else\ifnum\appendixno=`M M% 5243 \else\ifnum\appendixno=`N N% 5244 \else\ifnum\appendixno=`O O% 5245 \else\ifnum\appendixno=`P P% 5246 \else\ifnum\appendixno=`Q Q% 5247 \else\ifnum\appendixno=`R R% 5248 \else\ifnum\appendixno=`S S% 5249 \else\ifnum\appendixno=`T T% 5250 \else\ifnum\appendixno=`U U% 5251 \else\ifnum\appendixno=`V V% 5252 \else\ifnum\appendixno=`W W% 5253 \else\ifnum\appendixno=`X X% 5254 \else\ifnum\appendixno=`Y Y% 5255 \else\ifnum\appendixno=`Z Z% 5256 % The \the is necessary, despite appearances, because \appendixletter is 5257 % expanded while writing the .toc file. \char\appendixno is not 5258 % expandable, thus it is written literally, thus all appendixes come out 5259 % with the same letter (or @) in the toc without it. 5260 \else\char\the\appendixno 5261 \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi 5262 \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} 5263 5264% Each @chapter defines these (using marks) as the number+name, number 5265% and name of the chapter. Page headings and footings can use 5266% these. @section does likewise. 5267\def\thischapter{} 5268\def\thischapternum{} 5269\def\thischaptername{} 5270\def\thissection{} 5271\def\thissectionnum{} 5272\def\thissectionname{} 5273 5274\newcount\absseclevel % used to calculate proper heading level 5275\newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count 5276 5277% @raisesections: treat @section as chapter, @subsection as section, etc. 5278\def\raisesections{\global\advance\secbase by -1} 5279\let\up=\raisesections % original BFox name 5280 5281% @lowersections: treat @chapter as section, @section as subsection, etc. 5282\def\lowersections{\global\advance\secbase by 1} 5283\let\down=\lowersections % original BFox name 5284 5285% we only have subsub. 5286\chardef\maxseclevel = 3 5287% 5288% A numbered section within an unnumbered changes to unnumbered too. 5289% To achieve this, remember the "biggest" unnum. sec. we are currently in: 5290\chardef\unnlevel = \maxseclevel 5291% 5292% Trace whether the current chapter is an appendix or not: 5293% \chapheadtype is "N" or "A", unnumbered chapters are ignored. 5294\def\chapheadtype{N} 5295 5296% Choose a heading macro 5297% #1 is heading type 5298% #2 is heading level 5299% #3 is text for heading 5300\def\genhead#1#2#3{% 5301 % Compute the abs. sec. level: 5302 \absseclevel=#2 5303 \advance\absseclevel by \secbase 5304 % Make sure \absseclevel doesn't fall outside the range: 5305 \ifnum \absseclevel < 0 5306 \absseclevel = 0 5307 \else 5308 \ifnum \absseclevel > 3 5309 \absseclevel = 3 5310 \fi 5311 \fi 5312 % The heading type: 5313 \def\headtype{#1}% 5314 \if \headtype U% 5315 \ifnum \absseclevel < \unnlevel 5316 \chardef\unnlevel = \absseclevel 5317 \fi 5318 \else 5319 % Check for appendix sections: 5320 \ifnum \absseclevel = 0 5321 \edef\chapheadtype{\headtype}% 5322 \else 5323 \if \headtype A\if \chapheadtype N% 5324 \errmessage{@appendix... within a non-appendix chapter}% 5325 \fi\fi 5326 \fi 5327 % Check for numbered within unnumbered: 5328 \ifnum \absseclevel > \unnlevel 5329 \def\headtype{U}% 5330 \else 5331 \chardef\unnlevel = 3 5332 \fi 5333 \fi 5334 % Now print the heading: 5335 \if \headtype U% 5336 \ifcase\absseclevel 5337 \unnumberedzzz{#3}% 5338 \or \unnumberedseczzz{#3}% 5339 \or \unnumberedsubseczzz{#3}% 5340 \or \unnumberedsubsubseczzz{#3}% 5341 \fi 5342 \else 5343 \if \headtype A% 5344 \ifcase\absseclevel 5345 \appendixzzz{#3}% 5346 \or \appendixsectionzzz{#3}% 5347 \or \appendixsubseczzz{#3}% 5348 \or \appendixsubsubseczzz{#3}% 5349 \fi 5350 \else 5351 \ifcase\absseclevel 5352 \chapterzzz{#3}% 5353 \or \seczzz{#3}% 5354 \or \numberedsubseczzz{#3}% 5355 \or \numberedsubsubseczzz{#3}% 5356 \fi 5357 \fi 5358 \fi 5359 \suppressfirstparagraphindent 5360} 5361 5362% an interface: 5363\def\numhead{\genhead N} 5364\def\apphead{\genhead A} 5365\def\unnmhead{\genhead U} 5366 5367% @chapter, @appendix, @unnumbered. Increment top-level counter, reset 5368% all lower-level sectioning counters to zero. 5369% 5370% Also set \chaplevelprefix, which we prepend to @float sequence numbers 5371% (e.g., figures), q.v. By default (before any chapter), that is empty. 5372\let\chaplevelprefix = \empty 5373% 5374\outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz 5375\def\chapterzzz#1{% 5376 % section resetting is \global in case the chapter is in a group, such 5377 % as an @include file. 5378 \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 5379 \global\advance\chapno by 1 5380 % 5381 % Used for \float. 5382 \gdef\chaplevelprefix{\the\chapno.}% 5383 \resetallfloatnos 5384 % 5385 % \putwordChapter can contain complex things in translations. 5386 \toks0=\expandafter{\putwordChapter}% 5387 \message{\the\toks0 \space \the\chapno}% 5388 % 5389 % Write the actual heading. 5390 \chapmacro{#1}{Ynumbered}{\the\chapno}% 5391 % 5392 % So @section and the like are numbered underneath this chapter. 5393 \global\let\section = \numberedsec 5394 \global\let\subsection = \numberedsubsec 5395 \global\let\subsubsection = \numberedsubsubsec 5396} 5397 5398\outer\parseargdef\appendix{\apphead0{#1}} % normally calls appendixzzz 5399% 5400\def\appendixzzz#1{% 5401 \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 5402 \global\advance\appendixno by 1 5403 \gdef\chaplevelprefix{\appendixletter.}% 5404 \resetallfloatnos 5405 % 5406 % \putwordAppendix can contain complex things in translations. 5407 \toks0=\expandafter{\putwordAppendix}% 5408 \message{\the\toks0 \space \appendixletter}% 5409 % 5410 \chapmacro{#1}{Yappendix}{\appendixletter}% 5411 % 5412 \global\let\section = \appendixsec 5413 \global\let\subsection = \appendixsubsec 5414 \global\let\subsubsection = \appendixsubsubsec 5415} 5416 5417% normally unnmhead0 calls unnumberedzzz: 5418\outer\parseargdef\unnumbered{\unnmhead0{#1}} 5419\def\unnumberedzzz#1{% 5420 \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 5421 \global\advance\unnumberedno by 1 5422 % 5423 % Since an unnumbered has no number, no prefix for figures. 5424 \global\let\chaplevelprefix = \empty 5425 \resetallfloatnos 5426 % 5427 % This used to be simply \message{#1}, but TeX fully expands the 5428 % argument to \message. Therefore, if #1 contained @-commands, TeX 5429 % expanded them. For example, in `@unnumbered The @cite{Book}', TeX 5430 % expanded @cite (which turns out to cause errors because \cite is meant 5431 % to be executed, not expanded). 5432 % 5433 % Anyway, we don't want the fully-expanded definition of @cite to appear 5434 % as a result of the \message, we just want `@cite' itself. We use 5435 % \the<toks register> to achieve this: TeX expands \the<toks> only once, 5436 % simply yielding the contents of <toks register>. (We also do this for 5437 % the toc entries.) 5438 \toks0 = {#1}% 5439 \message{(\the\toks0)}% 5440 % 5441 \chapmacro{#1}{Ynothing}{\the\unnumberedno}% 5442 % 5443 \global\let\section = \unnumberedsec 5444 \global\let\subsection = \unnumberedsubsec 5445 \global\let\subsubsection = \unnumberedsubsubsec 5446} 5447 5448% @centerchap is like @unnumbered, but the heading is centered. 5449\outer\parseargdef\centerchap{% 5450 % Well, we could do the following in a group, but that would break 5451 % an assumption that \chapmacro is called at the outermost level. 5452 % Thus we are safer this way: --kasal, 24feb04 5453 \let\centerparametersmaybe = \centerparameters 5454 \unnmhead0{#1}% 5455 \let\centerparametersmaybe = \relax 5456} 5457 5458% @top is like @unnumbered. 5459\let\top\unnumbered 5460 5461% Sections. 5462% 5463\outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz 5464\def\seczzz#1{% 5465 \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 5466 \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}% 5467} 5468 5469% normally calls appendixsectionzzz: 5470\outer\parseargdef\appendixsection{\apphead1{#1}} 5471\def\appendixsectionzzz#1{% 5472 \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 5473 \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}% 5474} 5475\let\appendixsec\appendixsection 5476 5477% normally calls unnumberedseczzz: 5478\outer\parseargdef\unnumberedsec{\unnmhead1{#1}} 5479\def\unnumberedseczzz#1{% 5480 \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 5481 \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}% 5482} 5483 5484% Subsections. 5485% 5486% normally calls numberedsubseczzz: 5487\outer\parseargdef\numberedsubsec{\numhead2{#1}} 5488\def\numberedsubseczzz#1{% 5489 \global\subsubsecno=0 \global\advance\subsecno by 1 5490 \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}% 5491} 5492 5493% normally calls appendixsubseczzz: 5494\outer\parseargdef\appendixsubsec{\apphead2{#1}} 5495\def\appendixsubseczzz#1{% 5496 \global\subsubsecno=0 \global\advance\subsecno by 1 5497 \sectionheading{#1}{subsec}{Yappendix}% 5498 {\appendixletter.\the\secno.\the\subsecno}% 5499} 5500 5501% normally calls unnumberedsubseczzz: 5502\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} 5503\def\unnumberedsubseczzz#1{% 5504 \global\subsubsecno=0 \global\advance\subsecno by 1 5505 \sectionheading{#1}{subsec}{Ynothing}% 5506 {\the\unnumberedno.\the\secno.\the\subsecno}% 5507} 5508 5509% Subsubsections. 5510% 5511% normally numberedsubsubseczzz: 5512\outer\parseargdef\numberedsubsubsec{\numhead3{#1}} 5513\def\numberedsubsubseczzz#1{% 5514 \global\advance\subsubsecno by 1 5515 \sectionheading{#1}{subsubsec}{Ynumbered}% 5516 {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}% 5517} 5518 5519% normally appendixsubsubseczzz: 5520\outer\parseargdef\appendixsubsubsec{\apphead3{#1}} 5521\def\appendixsubsubseczzz#1{% 5522 \global\advance\subsubsecno by 1 5523 \sectionheading{#1}{subsubsec}{Yappendix}% 5524 {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}% 5525} 5526 5527% normally unnumberedsubsubseczzz: 5528\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} 5529\def\unnumberedsubsubseczzz#1{% 5530 \global\advance\subsubsecno by 1 5531 \sectionheading{#1}{subsubsec}{Ynothing}% 5532 {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}% 5533} 5534 5535% These macros control what the section commands do, according 5536% to what kind of chapter we are in (ordinary, appendix, or unnumbered). 5537% Define them by default for a numbered chapter. 5538\let\section = \numberedsec 5539\let\subsection = \numberedsubsec 5540\let\subsubsection = \numberedsubsubsec 5541 5542% Define @majorheading, @heading and @subheading 5543 5544% NOTE on use of \vbox for chapter headings, section headings, and such: 5545% 1) We use \vbox rather than the earlier \line to permit 5546% overlong headings to fold. 5547% 2) \hyphenpenalty is set to 10000 because hyphenation in a 5548% heading is obnoxious; this forbids it. 5549% 3) Likewise, headings look best if no \parindent is used, and 5550% if justification is not attempted. Hence \raggedright. 5551 5552\def\majorheading{% 5553 {\advance\chapheadingskip by 10pt \chapbreak }% 5554 \parsearg\chapheadingzzz 5555} 5556 5557\def\chapheading{\chapbreak \parsearg\chapheadingzzz} 5558\def\chapheadingzzz#1{% 5559 {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 5560 \parindent=0pt\ptexraggedright 5561 \rmisbold #1\hfill}}% 5562 \bigskip \par\penalty 200\relax 5563 \suppressfirstparagraphindent 5564} 5565 5566% @heading, @subheading, @subsubheading. 5567\parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{} 5568 \suppressfirstparagraphindent} 5569\parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{} 5570 \suppressfirstparagraphindent} 5571\parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{} 5572 \suppressfirstparagraphindent} 5573 5574% These macros generate a chapter, section, etc. heading only 5575% (including whitespace, linebreaking, etc. around it), 5576% given all the information in convenient, parsed form. 5577 5578% Args are the skip and penalty (usually negative) 5579\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} 5580 5581% Parameter controlling skip before chapter headings (if needed) 5582\newskip\chapheadingskip 5583 5584% Define plain chapter starts, and page on/off switching for it. 5585\def\chapbreak{\dobreak \chapheadingskip {-4000}} 5586\def\chappager{\par\vfill\supereject} 5587% Because \domark is called before \chapoddpage, the filler page will 5588% get the headings for the next chapter, which is wrong. But we don't 5589% care -- we just disable all headings on the filler page. 5590\def\chapoddpage{% 5591 \chappager 5592 \ifodd\pageno \else 5593 \begingroup 5594 \headingsoff 5595 \null 5596 \chappager 5597 \endgroup 5598 \fi 5599} 5600 5601\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} 5602 5603\def\CHAPPAGoff{% 5604\global\let\contentsalignmacro = \chappager 5605\global\let\pchapsepmacro=\chapbreak 5606\global\let\pagealignmacro=\chappager} 5607 5608\def\CHAPPAGon{% 5609\global\let\contentsalignmacro = \chappager 5610\global\let\pchapsepmacro=\chappager 5611\global\let\pagealignmacro=\chappager 5612\global\def\HEADINGSon{\HEADINGSsingle}} 5613 5614\def\CHAPPAGodd{% 5615\global\let\contentsalignmacro = \chapoddpage 5616\global\let\pchapsepmacro=\chapoddpage 5617\global\let\pagealignmacro=\chapoddpage 5618\global\def\HEADINGSon{\HEADINGSdouble}} 5619 5620\CHAPPAGon 5621 5622% Chapter opening. 5623% 5624% #1 is the text, #2 is the section type (Ynumbered, Ynothing, 5625% Yappendix, Yomitfromtoc), #3 the chapter number. 5626% 5627% To test against our argument. 5628\def\Ynothingkeyword{Ynothing} 5629\def\Yomitfromtockeyword{Yomitfromtoc} 5630\def\Yappendixkeyword{Yappendix} 5631% 5632\def\chapmacro#1#2#3{% 5633 % Insert the first mark before the heading break (see notes for \domark). 5634 \let\prevchapterdefs=\lastchapterdefs 5635 \let\prevsectiondefs=\lastsectiondefs 5636 \gdef\lastsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}% 5637 \gdef\thissection{}}% 5638 % 5639 \def\temptype{#2}% 5640 \ifx\temptype\Ynothingkeyword 5641 \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% 5642 \gdef\thischapter{\thischaptername}}% 5643 \else\ifx\temptype\Yomitfromtockeyword 5644 \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% 5645 \gdef\thischapter{}}% 5646 \else\ifx\temptype\Yappendixkeyword 5647 \toks0={#1}% 5648 \xdef\lastchapterdefs{% 5649 \gdef\noexpand\thischaptername{\the\toks0}% 5650 \gdef\noexpand\thischapternum{\appendixletter}% 5651 % \noexpand\putwordAppendix avoids expanding indigestible 5652 % commands in some of the translations. 5653 \gdef\noexpand\thischapter{\noexpand\putwordAppendix{} 5654 \noexpand\thischapternum: 5655 \noexpand\thischaptername}% 5656 }% 5657 \else 5658 \toks0={#1}% 5659 \xdef\lastchapterdefs{% 5660 \gdef\noexpand\thischaptername{\the\toks0}% 5661 \gdef\noexpand\thischapternum{\the\chapno}% 5662 % \noexpand\putwordChapter avoids expanding indigestible 5663 % commands in some of the translations. 5664 \gdef\noexpand\thischapter{\noexpand\putwordChapter{} 5665 \noexpand\thischapternum: 5666 \noexpand\thischaptername}% 5667 }% 5668 \fi\fi\fi 5669 % 5670 % Output the mark. Pass it through \safewhatsit, to take care of 5671 % the preceding space. 5672 \safewhatsit\domark 5673 % 5674 % Insert the chapter heading break. 5675 \pchapsepmacro 5676 % 5677 % Now the second mark, after the heading break. No break points 5678 % between here and the heading. 5679 \let\prevchapterdefs=\lastchapterdefs 5680 \let\prevsectiondefs=\lastsectiondefs 5681 \domark 5682 % 5683 {% 5684 \chapfonts \rmisbold 5685 % 5686 % Have to define \lastsection before calling \donoderef, because the 5687 % xref code eventually uses it. On the other hand, it has to be called 5688 % after \pchapsepmacro, or the headline will change too soon. 5689 \gdef\lastsection{#1}% 5690 % 5691 % Only insert the separating space if we have a chapter/appendix 5692 % number, and don't print the unnumbered ``number''. 5693 \ifx\temptype\Ynothingkeyword 5694 \setbox0 = \hbox{}% 5695 \def\toctype{unnchap}% 5696 \else\ifx\temptype\Yomitfromtockeyword 5697 \setbox0 = \hbox{}% contents like unnumbered, but no toc entry 5698 \def\toctype{omit}% 5699 \else\ifx\temptype\Yappendixkeyword 5700 \setbox0 = \hbox{\putwordAppendix{} #3\enspace}% 5701 \def\toctype{app}% 5702 \else 5703 \setbox0 = \hbox{#3\enspace}% 5704 \def\toctype{numchap}% 5705 \fi\fi\fi 5706 % 5707 % Write the toc entry for this chapter. Must come before the 5708 % \donoderef, because we include the current node name in the toc 5709 % entry, and \donoderef resets it to empty. 5710 \writetocentry{\toctype}{#1}{#3}% 5711 % 5712 % For pdftex, we have to write out the node definition (aka, make 5713 % the pdfdest) after any page break, but before the actual text has 5714 % been typeset. If the destination for the pdf outline is after the 5715 % text, then jumping from the outline may wind up with the text not 5716 % being visible, for instance under high magnification. 5717 \donoderef{#2}% 5718 % 5719 % Typeset the actual heading. 5720 \nobreak % Avoid page breaks at the interline glue. 5721 \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright 5722 \hangindent=\wd0 \centerparametersmaybe 5723 \unhbox0 #1\par}% 5724 }% 5725 \nobreak\bigskip % no page break after a chapter title 5726 \nobreak 5727} 5728 5729% @centerchap -- centered and unnumbered. 5730\let\centerparametersmaybe = \relax 5731\def\centerparameters{% 5732 \advance\rightskip by 3\rightskip 5733 \leftskip = \rightskip 5734 \parfillskip = 0pt 5735} 5736 5737 5738% I don't think this chapter style is supported any more, so I'm not 5739% updating it with the new noderef stuff. We'll see. --karl, 11aug03. 5740% 5741\def\setchapterstyle #1 {\csname CHAPF#1\endcsname} 5742% 5743\def\unnchfopen #1{% 5744\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 5745 \parindent=0pt\ptexraggedright 5746 \rmisbold #1\hfill}}\bigskip \par\nobreak 5747} 5748\def\chfopen #1#2{\chapoddpage {\chapfonts 5749\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% 5750\par\penalty 5000 % 5751} 5752\def\centerchfopen #1{% 5753\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 5754 \parindent=0pt 5755 \hfill {\rmisbold #1}\hfill}}\bigskip \par\nobreak 5756} 5757\def\CHAPFopen{% 5758 \global\let\chapmacro=\chfopen 5759 \global\let\centerchapmacro=\centerchfopen} 5760 5761 5762% Section titles. These macros combine the section number parts and 5763% call the generic \sectionheading to do the printing. 5764% 5765\newskip\secheadingskip 5766\def\secheadingbreak{\dobreak \secheadingskip{-1000}} 5767 5768% Subsection titles. 5769\newskip\subsecheadingskip 5770\def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}} 5771 5772% Subsubsection titles. 5773\def\subsubsecheadingskip{\subsecheadingskip} 5774\def\subsubsecheadingbreak{\subsecheadingbreak} 5775 5776 5777% Print any size, any type, section title. 5778% 5779% #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is 5780% the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the 5781% section number. 5782% 5783\def\seckeyword{sec} 5784% 5785\def\sectionheading#1#2#3#4{% 5786 {% 5787 \checkenv{}% should not be in an environment. 5788 % 5789 % Switch to the right set of fonts. 5790 \csname #2fonts\endcsname \rmisbold 5791 % 5792 \def\sectionlevel{#2}% 5793 \def\temptype{#3}% 5794 % 5795 % Insert first mark before the heading break (see notes for \domark). 5796 \let\prevsectiondefs=\lastsectiondefs 5797 \ifx\temptype\Ynothingkeyword 5798 \ifx\sectionlevel\seckeyword 5799 \gdef\lastsectiondefs{\gdef\thissectionname{#1}\gdef\thissectionnum{}% 5800 \gdef\thissection{\thissectionname}}% 5801 \fi 5802 \else\ifx\temptype\Yomitfromtockeyword 5803 % Don't redefine \thissection. 5804 \else\ifx\temptype\Yappendixkeyword 5805 \ifx\sectionlevel\seckeyword 5806 \toks0={#1}% 5807 \xdef\lastsectiondefs{% 5808 \gdef\noexpand\thissectionname{\the\toks0}% 5809 \gdef\noexpand\thissectionnum{#4}% 5810 % \noexpand\putwordSection avoids expanding indigestible 5811 % commands in some of the translations. 5812 \gdef\noexpand\thissection{\noexpand\putwordSection{} 5813 \noexpand\thissectionnum: 5814 \noexpand\thissectionname}% 5815 }% 5816 \fi 5817 \else 5818 \ifx\sectionlevel\seckeyword 5819 \toks0={#1}% 5820 \xdef\lastsectiondefs{% 5821 \gdef\noexpand\thissectionname{\the\toks0}% 5822 \gdef\noexpand\thissectionnum{#4}% 5823 % \noexpand\putwordSection avoids expanding indigestible 5824 % commands in some of the translations. 5825 \gdef\noexpand\thissection{\noexpand\putwordSection{} 5826 \noexpand\thissectionnum: 5827 \noexpand\thissectionname}% 5828 }% 5829 \fi 5830 \fi\fi\fi 5831 % 5832 % Go into vertical mode. Usually we'll already be there, but we 5833 % don't want the following whatsit to end up in a preceding paragraph 5834 % if the document didn't happen to have a blank line. 5835 \par 5836 % 5837 % Output the mark. Pass it through \safewhatsit, to take care of 5838 % the preceding space. 5839 \safewhatsit\domark 5840 % 5841 % Insert space above the heading. 5842 \csname #2headingbreak\endcsname 5843 % 5844 % Now the second mark, after the heading break. No break points 5845 % between here and the heading. 5846 \let\prevsectiondefs=\lastsectiondefs 5847 \domark 5848 % 5849 % Only insert the space after the number if we have a section number. 5850 \ifx\temptype\Ynothingkeyword 5851 \setbox0 = \hbox{}% 5852 \def\toctype{unn}% 5853 \gdef\lastsection{#1}% 5854 \else\ifx\temptype\Yomitfromtockeyword 5855 % for @headings -- no section number, don't include in toc, 5856 % and don't redefine \lastsection. 5857 \setbox0 = \hbox{}% 5858 \def\toctype{omit}% 5859 \let\sectionlevel=\empty 5860 \else\ifx\temptype\Yappendixkeyword 5861 \setbox0 = \hbox{#4\enspace}% 5862 \def\toctype{app}% 5863 \gdef\lastsection{#1}% 5864 \else 5865 \setbox0 = \hbox{#4\enspace}% 5866 \def\toctype{num}% 5867 \gdef\lastsection{#1}% 5868 \fi\fi\fi 5869 % 5870 % Write the toc entry (before \donoderef). See comments in \chapmacro. 5871 \writetocentry{\toctype\sectionlevel}{#1}{#4}% 5872 % 5873 % Write the node reference (= pdf destination for pdftex). 5874 % Again, see comments in \chapmacro. 5875 \donoderef{#3}% 5876 % 5877 % Interline glue will be inserted when the vbox is completed. 5878 % That glue will be a valid breakpoint for the page, since it'll be 5879 % preceded by a whatsit (usually from the \donoderef, or from the 5880 % \writetocentry if there was no node). We don't want to allow that 5881 % break, since then the whatsits could end up on page n while the 5882 % section is on page n+1, thus toc/etc. are wrong. Debian bug 276000. 5883 \nobreak 5884 % 5885 % Output the actual section heading. 5886 \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright 5887 \hangindent=\wd0 % zero if no section number 5888 \unhbox0 #1}% 5889 }% 5890 % Add extra space after the heading -- half of whatever came above it. 5891 % Don't allow stretch, though. 5892 \kern .5 \csname #2headingskip\endcsname 5893 % 5894 % Do not let the kern be a potential breakpoint, as it would be if it 5895 % was followed by glue. 5896 \nobreak 5897 % 5898 % We'll almost certainly start a paragraph next, so don't let that 5899 % glue accumulate. (Not a breakpoint because it's preceded by a 5900 % discardable item.) However, when a paragraph is not started next 5901 % (\startdefun, \cartouche, \center, etc.), this needs to be wiped out 5902 % or the negative glue will cause weirdly wrong output, typically 5903 % obscuring the section heading with something else. 5904 \vskip-\parskip 5905 % 5906 % This is so the last item on the main vertical list is a known 5907 % \penalty > 10000, so \startdefun, etc., can recognize the situation 5908 % and do the needful. 5909 \penalty 10001 5910} 5911 5912 5913\message{toc,} 5914% Table of contents. 5915\newwrite\tocfile 5916 5917% Write an entry to the toc file, opening it if necessary. 5918% Called from @chapter, etc. 5919% 5920% Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno} 5921% We append the current node name (if any) and page number as additional 5922% arguments for the \{chap,sec,...}entry macros which will eventually 5923% read this. The node name is used in the pdf outlines as the 5924% destination to jump to. 5925% 5926% We open the .toc file for writing here instead of at @setfilename (or 5927% any other fixed time) so that @contents can be anywhere in the document. 5928% But if #1 is `omit', then we don't do anything. This is used for the 5929% table of contents chapter openings themselves. 5930% 5931\newif\iftocfileopened 5932\def\omitkeyword{omit}% 5933% 5934\def\writetocentry#1#2#3{% 5935 \edef\writetoctype{#1}% 5936 \ifx\writetoctype\omitkeyword \else 5937 \iftocfileopened\else 5938 \immediate\openout\tocfile = \jobname.toc 5939 \global\tocfileopenedtrue 5940 \fi 5941 % 5942 \iflinks 5943 {\atdummies 5944 \edef\temp{% 5945 \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}% 5946 \temp 5947 }% 5948 \fi 5949 \fi 5950 % 5951 % Tell \shipout to create a pdf destination on each page, if we're 5952 % writing pdf. These are used in the table of contents. We can't 5953 % just write one on every page because the title pages are numbered 5954 % 1 and 2 (the page numbers aren't printed), and so are the first 5955 % two pages of the document. Thus, we'd have two destinations named 5956 % `1', and two named `2'. 5957 \ifpdf \global\pdfmakepagedesttrue \fi 5958} 5959 5960 5961% These characters do not print properly in the Computer Modern roman 5962% fonts, so we must take special care. This is more or less redundant 5963% with the Texinfo input format setup at the end of this file. 5964% 5965\def\activecatcodes{% 5966 \catcode`\"=\active 5967 \catcode`\$=\active 5968 \catcode`\<=\active 5969 \catcode`\>=\active 5970 \catcode`\\=\active 5971 \catcode`\^=\active 5972 \catcode`\_=\active 5973 \catcode`\|=\active 5974 \catcode`\~=\active 5975} 5976 5977 5978% Read the toc file, which is essentially Texinfo input. 5979\def\readtocfile{% 5980 \setupdatafile 5981 \activecatcodes 5982 \input \tocreadfilename 5983} 5984 5985\newskip\contentsrightmargin \contentsrightmargin=1in 5986\newcount\savepageno 5987\newcount\lastnegativepageno \lastnegativepageno = -1 5988 5989% Prepare to read what we've written to \tocfile. 5990% 5991\def\startcontents#1{% 5992 % If @setchapternewpage on, and @headings double, the contents should 5993 % start on an odd page, unlike chapters. Thus, we maintain 5994 % \contentsalignmacro in parallel with \pagealignmacro. 5995 % From: Torbjorn Granlund <tege@matematik.su.se> 5996 \contentsalignmacro 5997 \immediate\closeout\tocfile 5998 % 5999 % Don't need to put `Contents' or `Short Contents' in the headline. 6000 % It is abundantly clear what they are. 6001 \chapmacro{#1}{Yomitfromtoc}{}% 6002 % 6003 \savepageno = \pageno 6004 \begingroup % Set up to handle contents files properly. 6005 \raggedbottom % Worry more about breakpoints than the bottom. 6006 \advance\hsize by -\contentsrightmargin % Don't use the full line length. 6007 % 6008 % Roman numerals for page numbers. 6009 \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi 6010} 6011 6012% redefined for the two-volume lispref. We always output on 6013% \jobname.toc even if this is redefined. 6014% 6015\def\tocreadfilename{\jobname.toc} 6016 6017% Normal (long) toc. 6018% 6019\def\contents{% 6020 \startcontents{\putwordTOC}% 6021 \openin 1 \tocreadfilename\space 6022 \ifeof 1 \else 6023 \readtocfile 6024 \fi 6025 \vfill \eject 6026 \contentsalignmacro % in case @setchapternewpage odd is in effect 6027 \ifeof 1 \else 6028 \pdfmakeoutlines 6029 \fi 6030 \closein 1 6031 \endgroup 6032 \lastnegativepageno = \pageno 6033 \global\pageno = \savepageno 6034} 6035 6036% And just the chapters. 6037\def\summarycontents{% 6038 \startcontents{\putwordShortTOC}% 6039 % 6040 \let\partentry = \shortpartentry 6041 \let\numchapentry = \shortchapentry 6042 \let\appentry = \shortchapentry 6043 \let\unnchapentry = \shortunnchapentry 6044 % We want a true roman here for the page numbers. 6045 \secfonts 6046 \let\rm=\shortcontrm \let\bf=\shortcontbf 6047 \let\sl=\shortcontsl \let\tt=\shortconttt 6048 \rm 6049 \hyphenpenalty = 10000 6050 \advance\baselineskip by 1pt % Open it up a little. 6051 \def\numsecentry##1##2##3##4{} 6052 \let\appsecentry = \numsecentry 6053 \let\unnsecentry = \numsecentry 6054 \let\numsubsecentry = \numsecentry 6055 \let\appsubsecentry = \numsecentry 6056 \let\unnsubsecentry = \numsecentry 6057 \let\numsubsubsecentry = \numsecentry 6058 \let\appsubsubsecentry = \numsecentry 6059 \let\unnsubsubsecentry = \numsecentry 6060 \openin 1 \tocreadfilename\space 6061 \ifeof 1 \else 6062 \readtocfile 6063 \fi 6064 \closein 1 6065 \vfill \eject 6066 \contentsalignmacro % in case @setchapternewpage odd is in effect 6067 \endgroup 6068 \lastnegativepageno = \pageno 6069 \global\pageno = \savepageno 6070} 6071\let\shortcontents = \summarycontents 6072 6073% Typeset the label for a chapter or appendix for the short contents. 6074% The arg is, e.g., `A' for an appendix, or `3' for a chapter. 6075% 6076\def\shortchaplabel#1{% 6077 % This space should be enough, since a single number is .5em, and the 6078 % widest letter (M) is 1em, at least in the Computer Modern fonts. 6079 % But use \hss just in case. 6080 % (This space doesn't include the extra space that gets added after 6081 % the label; that gets put in by \shortchapentry above.) 6082 % 6083 % We'd like to right-justify chapter numbers, but that looks strange 6084 % with appendix letters. And right-justifying numbers and 6085 % left-justifying letters looks strange when there is less than 10 6086 % chapters. Have to read the whole toc once to know how many chapters 6087 % there are before deciding ... 6088 \hbox to 1em{#1\hss}% 6089} 6090 6091% These macros generate individual entries in the table of contents. 6092% The first argument is the chapter or section name. 6093% The last argument is the page number. 6094% The arguments in between are the chapter number, section number, ... 6095 6096% Parts, in the main contents. Replace the part number, which doesn't 6097% exist, with an empty box. Let's hope all the numbers have the same width. 6098% Also ignore the page number, which is conventionally not printed. 6099\def\numeralbox{\setbox0=\hbox{8}\hbox to \wd0{\hfil}} 6100\def\partentry#1#2#3#4{\dochapentry{\numeralbox\labelspace#1}{}} 6101% 6102% Parts, in the short toc. 6103\def\shortpartentry#1#2#3#4{% 6104 \penalty-300 6105 \vskip.5\baselineskip plus.15\baselineskip minus.1\baselineskip 6106 \shortchapentry{{\bf #1}}{\numeralbox}{}{}% 6107} 6108 6109% Chapters, in the main contents. 6110\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}} 6111% 6112% Chapters, in the short toc. 6113% See comments in \dochapentry re vbox and related settings. 6114\def\shortchapentry#1#2#3#4{% 6115 \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}% 6116} 6117 6118% Appendices, in the main contents. 6119% Need the word Appendix, and a fixed-size box. 6120% 6121\def\appendixbox#1{% 6122 % We use M since it's probably the widest letter. 6123 \setbox0 = \hbox{\putwordAppendix{} M}% 6124 \hbox to \wd0{\putwordAppendix{} #1\hss}} 6125% 6126\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}} 6127 6128% Unnumbered chapters. 6129\def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}} 6130\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}} 6131 6132% Sections. 6133\def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}} 6134\let\appsecentry=\numsecentry 6135\def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}} 6136 6137% Subsections. 6138\def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}} 6139\let\appsubsecentry=\numsubsecentry 6140\def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}} 6141 6142% And subsubsections. 6143\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}} 6144\let\appsubsubsecentry=\numsubsubsecentry 6145\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}} 6146 6147% This parameter controls the indentation of the various levels. 6148% Same as \defaultparindent. 6149\newdimen\tocindent \tocindent = 15pt 6150 6151% Now for the actual typesetting. In all these, #1 is the text and #2 is the 6152% page number. 6153% 6154% If the toc has to be broken over pages, we want it to be at chapters 6155% if at all possible; hence the \penalty. 6156\def\dochapentry#1#2{% 6157 \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip 6158 \begingroup 6159 \chapentryfonts 6160 \tocentry{#1}{\dopageno\bgroup#2\egroup}% 6161 \endgroup 6162 \nobreak\vskip .25\baselineskip plus.1\baselineskip 6163} 6164 6165\def\dosecentry#1#2{\begingroup 6166 \secentryfonts \leftskip=\tocindent 6167 \tocentry{#1}{\dopageno\bgroup#2\egroup}% 6168\endgroup} 6169 6170\def\dosubsecentry#1#2{\begingroup 6171 \subsecentryfonts \leftskip=2\tocindent 6172 \tocentry{#1}{\dopageno\bgroup#2\egroup}% 6173\endgroup} 6174 6175\def\dosubsubsecentry#1#2{\begingroup 6176 \subsubsecentryfonts \leftskip=3\tocindent 6177 \tocentry{#1}{\dopageno\bgroup#2\egroup}% 6178\endgroup} 6179 6180% We use the same \entry macro as for the index entries. 6181\let\tocentry = \entry 6182 6183% Space between chapter (or whatever) number and the title. 6184\def\labelspace{\hskip1em \relax} 6185 6186\def\dopageno#1{{\rm #1}} 6187\def\doshortpageno#1{{\rm #1}} 6188 6189\def\chapentryfonts{\secfonts \rm} 6190\def\secentryfonts{\textfonts} 6191\def\subsecentryfonts{\textfonts} 6192\def\subsubsecentryfonts{\textfonts} 6193 6194 6195\message{environments,} 6196% @foo ... @end foo. 6197 6198% @tex ... @end tex escapes into raw TeX temporarily. 6199% One exception: @ is still an escape character, so that @end tex works. 6200% But \@ or @@ will get a plain @ character. 6201 6202\envdef\tex{% 6203 \setupmarkupstyle{tex}% 6204 \catcode `\\=0 \catcode `\{=1 \catcode `\}=2 6205 \catcode `\$=3 \catcode `\&=4 \catcode `\#=6 6206 \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie 6207 \catcode `\%=14 6208 \catcode `\+=\other 6209 \catcode `\"=\other 6210 \catcode `\|=\other 6211 \catcode `\<=\other 6212 \catcode `\>=\other 6213 \catcode`\`=\other 6214 \catcode`\'=\other 6215 \escapechar=`\\ 6216 % 6217 % ' is active in math mode (mathcode"8000). So reset it, and all our 6218 % other math active characters (just in case), to plain's definitions. 6219 \mathactive 6220 % 6221 \let\b=\ptexb 6222 \let\bullet=\ptexbullet 6223 \let\c=\ptexc 6224 \let\,=\ptexcomma 6225 \let\.=\ptexdot 6226 \let\dots=\ptexdots 6227 \let\equiv=\ptexequiv 6228 \let\!=\ptexexclam 6229 \let\i=\ptexi 6230 \let\indent=\ptexindent 6231 \let\noindent=\ptexnoindent 6232 \let\{=\ptexlbrace 6233 \let\+=\tabalign 6234 \let\}=\ptexrbrace 6235 \let\/=\ptexslash 6236 \let\*=\ptexstar 6237 \let\t=\ptext 6238 \expandafter \let\csname top\endcsname=\ptextop % outer 6239 \let\frenchspacing=\plainfrenchspacing 6240 % 6241 \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% 6242 \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}% 6243 \def\@{@}% 6244} 6245% There is no need to define \Etex. 6246 6247% Define @lisp ... @end lisp. 6248% @lisp environment forms a group so it can rebind things, 6249% including the definition of @end lisp (which normally is erroneous). 6250 6251% Amount to narrow the margins by for @lisp. 6252\newskip\lispnarrowing \lispnarrowing=0.4in 6253 6254% This is the definition that ^^M gets inside @lisp, @example, and other 6255% such environments. \null is better than a space, since it doesn't 6256% have any width. 6257\def\lisppar{\null\endgraf} 6258 6259% This space is always present above and below environments. 6260\newskip\envskipamount \envskipamount = 0pt 6261 6262% Make spacing and below environment symmetrical. We use \parskip here 6263% to help in doing that, since in @example-like environments \parskip 6264% is reset to zero; thus the \afterenvbreak inserts no space -- but the 6265% start of the next paragraph will insert \parskip. 6266% 6267\def\aboveenvbreak{{% 6268 % =10000 instead of <10000 because of a special case in \itemzzz and 6269 % \sectionheading, q.v. 6270 \ifnum \lastpenalty=10000 \else 6271 \advance\envskipamount by \parskip 6272 \endgraf 6273 \ifdim\lastskip<\envskipamount 6274 \removelastskip 6275 % it's not a good place to break if the last penalty was \nobreak 6276 % or better ... 6277 \ifnum\lastpenalty<10000 \penalty-50 \fi 6278 \vskip\envskipamount 6279 \fi 6280 \fi 6281}} 6282 6283\let\afterenvbreak = \aboveenvbreak 6284 6285% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins; it will 6286% also clear it, so that its embedded environments do the narrowing again. 6287\let\nonarrowing=\relax 6288 6289% @cartouche ... @end cartouche: draw rectangle w/rounded corners around 6290% environment contents. 6291\font\circle=lcircle10 6292\newdimen\circthick 6293\newdimen\cartouter\newdimen\cartinner 6294\newskip\normbskip\newskip\normpskip\newskip\normlskip 6295\circthick=\fontdimen8\circle 6296% 6297\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth 6298\def\ctr{{\hskip 6pt\circle\char'010}} 6299\def\cbl{{\circle\char'012\hskip -6pt}} 6300\def\cbr{{\hskip 6pt\circle\char'011}} 6301\def\carttop{\hbox to \cartouter{\hskip\lskip 6302 \ctl\leaders\hrule height\circthick\hfil\ctr 6303 \hskip\rskip}} 6304\def\cartbot{\hbox to \cartouter{\hskip\lskip 6305 \cbl\leaders\hrule height\circthick\hfil\cbr 6306 \hskip\rskip}} 6307% 6308\newskip\lskip\newskip\rskip 6309 6310\envdef\cartouche{% 6311 \ifhmode\par\fi % can't be in the midst of a paragraph. 6312 \startsavinginserts 6313 \lskip=\leftskip \rskip=\rightskip 6314 \leftskip=0pt\rightskip=0pt % we want these *outside*. 6315 \cartinner=\hsize \advance\cartinner by-\lskip 6316 \advance\cartinner by-\rskip 6317 \cartouter=\hsize 6318 \advance\cartouter by 18.4pt % allow for 3pt kerns on either 6319 % side, and for 6pt waste from 6320 % each corner char, and rule thickness 6321 \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip 6322 % Flag to tell @lisp, etc., not to narrow margin. 6323 \let\nonarrowing = t% 6324 % 6325 % If this cartouche directly follows a sectioning command, we need the 6326 % \parskip glue (backspaced over by default) or the cartouche can 6327 % collide with the section heading. 6328 \ifnum\lastpenalty>10000 \vskip\parskip \penalty\lastpenalty \fi 6329 % 6330 \vbox\bgroup 6331 \baselineskip=0pt\parskip=0pt\lineskip=0pt 6332 \carttop 6333 \hbox\bgroup 6334 \hskip\lskip 6335 \vrule\kern3pt 6336 \vbox\bgroup 6337 \kern3pt 6338 \hsize=\cartinner 6339 \baselineskip=\normbskip 6340 \lineskip=\normlskip 6341 \parskip=\normpskip 6342 \vskip -\parskip 6343 \comment % For explanation, see the end of def\group. 6344} 6345\def\Ecartouche{% 6346 \ifhmode\par\fi 6347 \kern3pt 6348 \egroup 6349 \kern3pt\vrule 6350 \hskip\rskip 6351 \egroup 6352 \cartbot 6353 \egroup 6354 \checkinserts 6355} 6356 6357 6358% This macro is called at the beginning of all the @example variants, 6359% inside a group. 6360\newdimen\nonfillparindent 6361\def\nonfillstart{% 6362 \aboveenvbreak 6363 \hfuzz = 12pt % Don't be fussy 6364 \sepspaces % Make spaces be word-separators rather than space tokens. 6365 \let\par = \lisppar % don't ignore blank lines 6366 \obeylines % each line of input is a line of output 6367 \parskip = 0pt 6368 % Turn off paragraph indentation but redefine \indent to emulate 6369 % the normal \indent. 6370 \nonfillparindent=\parindent 6371 \parindent = 0pt 6372 \let\indent\nonfillindent 6373 % 6374 \emergencystretch = 0pt % don't try to avoid overfull boxes 6375 \ifx\nonarrowing\relax 6376 \advance \leftskip by \lispnarrowing 6377 \exdentamount=\lispnarrowing 6378 \else 6379 \let\nonarrowing = \relax 6380 \fi 6381 \let\exdent=\nofillexdent 6382} 6383 6384\begingroup 6385\obeyspaces 6386% We want to swallow spaces (but not other tokens) after the fake 6387% @indent in our nonfill-environments, where spaces are normally 6388% active and set to @tie, resulting in them not being ignored after 6389% @indent. 6390\gdef\nonfillindent{\futurelet\temp\nonfillindentcheck}% 6391\gdef\nonfillindentcheck{% 6392\ifx\temp % 6393\expandafter\nonfillindentgobble% 6394\else% 6395\leavevmode\nonfillindentbox% 6396\fi% 6397}% 6398\endgroup 6399\def\nonfillindentgobble#1{\nonfillindent} 6400\def\nonfillindentbox{\hbox to \nonfillparindent{\hss}} 6401 6402% If you want all examples etc. small: @set dispenvsize small. 6403% If you want even small examples the full size: @set dispenvsize nosmall. 6404% This affects the following displayed environments: 6405% @example, @display, @format, @lisp 6406% 6407\def\smallword{small} 6408\def\nosmallword{nosmall} 6409\let\SETdispenvsize\relax 6410\def\setnormaldispenv{% 6411 \ifx\SETdispenvsize\smallword 6412 % end paragraph for sake of leading, in case document has no blank 6413 % line. This is redundant with what happens in \aboveenvbreak, but 6414 % we need to do it before changing the fonts, and it's inconvenient 6415 % to change the fonts afterward. 6416 \ifnum \lastpenalty=10000 \else \endgraf \fi 6417 \smallexamplefonts \rm 6418 \fi 6419} 6420\def\setsmalldispenv{% 6421 \ifx\SETdispenvsize\nosmallword 6422 \else 6423 \ifnum \lastpenalty=10000 \else \endgraf \fi 6424 \smallexamplefonts \rm 6425 \fi 6426} 6427 6428% We often define two environments, @foo and @smallfoo. 6429% Let's do it in one command. #1 is the env name, #2 the definition. 6430\def\makedispenvdef#1#2{% 6431 \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}% 6432 \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}% 6433 \expandafter\let\csname E#1\endcsname \afterenvbreak 6434 \expandafter\let\csname Esmall#1\endcsname \afterenvbreak 6435} 6436 6437% Define two environment synonyms (#1 and #2) for an environment. 6438\def\maketwodispenvdef#1#2#3{% 6439 \makedispenvdef{#1}{#3}% 6440 \makedispenvdef{#2}{#3}% 6441} 6442% 6443% @lisp: indented, narrowed, typewriter font; 6444% @example: same as @lisp. 6445% 6446% @smallexample and @smalllisp: use smaller fonts. 6447% Originally contributed by Pavel@xerox. 6448% 6449\maketwodispenvdef{lisp}{example}{% 6450 \nonfillstart 6451 \tt\setupmarkupstyle{example}% 6452 \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. 6453 \gobble % eat return 6454} 6455% @display/@smalldisplay: same as @lisp except keep current font. 6456% 6457\makedispenvdef{display}{% 6458 \nonfillstart 6459 \gobble 6460} 6461 6462% @format/@smallformat: same as @display except don't narrow margins. 6463% 6464\makedispenvdef{format}{% 6465 \let\nonarrowing = t% 6466 \nonfillstart 6467 \gobble 6468} 6469 6470% @flushleft: same as @format, but doesn't obey \SETdispenvsize. 6471\envdef\flushleft{% 6472 \let\nonarrowing = t% 6473 \nonfillstart 6474 \gobble 6475} 6476\let\Eflushleft = \afterenvbreak 6477 6478% @flushright. 6479% 6480\envdef\flushright{% 6481 \let\nonarrowing = t% 6482 \nonfillstart 6483 \advance\leftskip by 0pt plus 1fill\relax 6484 \gobble 6485} 6486\let\Eflushright = \afterenvbreak 6487 6488 6489% @raggedright does more-or-less normal line breaking but no right 6490% justification. From plain.tex. 6491\envdef\raggedright{% 6492 \rightskip0pt plus2em \spaceskip.3333em \xspaceskip.5em\relax 6493} 6494\let\Eraggedright\par 6495 6496\envdef\raggedleft{% 6497 \parindent=0pt \leftskip0pt plus2em 6498 \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt 6499 \hbadness=10000 % Last line will usually be underfull, so turn off 6500 % badness reporting. 6501} 6502\let\Eraggedleft\par 6503 6504\envdef\raggedcenter{% 6505 \parindent=0pt \rightskip0pt plus1em \leftskip0pt plus1em 6506 \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt 6507 \hbadness=10000 % Last line will usually be underfull, so turn off 6508 % badness reporting. 6509} 6510\let\Eraggedcenter\par 6511 6512 6513% @quotation does normal linebreaking (hence we can't use \nonfillstart) 6514% and narrows the margins. We keep \parskip nonzero in general, since 6515% we're doing normal filling. So, when using \aboveenvbreak and 6516% \afterenvbreak, temporarily make \parskip 0. 6517% 6518\makedispenvdef{quotation}{\quotationstart} 6519% 6520\def\quotationstart{% 6521 {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip 6522 \parindent=0pt 6523 % 6524 % @cartouche defines \nonarrowing to inhibit narrowing at next level down. 6525 \ifx\nonarrowing\relax 6526 \advance\leftskip by \lispnarrowing 6527 \advance\rightskip by \lispnarrowing 6528 \exdentamount = \lispnarrowing 6529 \else 6530 \let\nonarrowing = \relax 6531 \fi 6532 \parsearg\quotationlabel 6533} 6534 6535% We have retained a nonzero parskip for the environment, since we're 6536% doing normal filling. 6537% 6538\def\Equotation{% 6539 \par 6540 \ifx\quotationauthor\thisisundefined\else 6541 % indent a bit. 6542 \leftline{\kern 2\leftskip \sl ---\quotationauthor}% 6543 \fi 6544 {\parskip=0pt \afterenvbreak}% 6545} 6546\def\Esmallquotation{\Equotation} 6547 6548% If we're given an argument, typeset it in bold with a colon after. 6549\def\quotationlabel#1{% 6550 \def\temp{#1}% 6551 \ifx\temp\empty \else 6552 {\bf #1: }% 6553 \fi 6554} 6555 6556 6557% LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>} 6558% If we want to allow any <char> as delimiter, 6559% we need the curly braces so that makeinfo sees the @verb command, eg: 6560% `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org 6561% 6562% [Knuth]: Donald Ervin Knuth, 1996. The TeXbook. 6563% 6564% [Knuth] p.344; only we need to do the other characters Texinfo sets 6565% active too. Otherwise, they get lost as the first character on a 6566% verbatim line. 6567\def\dospecials{% 6568 \do\ \do\\\do\{\do\}\do\$\do\&% 6569 \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~% 6570 \do\<\do\>\do\|\do\@\do+\do\"% 6571 % Don't do the quotes -- if we do, @set txicodequoteundirected and 6572 % @set txicodequotebacktick will not have effect on @verb and 6573 % @verbatim, and ?` and !` ligatures won't get disabled. 6574 %\do\`\do\'% 6575} 6576% 6577% [Knuth] p. 380 6578\def\uncatcodespecials{% 6579 \def\do##1{\catcode`##1=\other}\dospecials} 6580% 6581% Setup for the @verb command. 6582% 6583% Eight spaces for a tab 6584\begingroup 6585 \catcode`\^^I=\active 6586 \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }} 6587\endgroup 6588% 6589\def\setupverb{% 6590 \tt % easiest (and conventionally used) font for verbatim 6591 \def\par{\leavevmode\endgraf}% 6592 \setupmarkupstyle{verb}% 6593 \tabeightspaces 6594 % Respect line breaks, 6595 % print special symbols as themselves, and 6596 % make each space count 6597 % must do in this order: 6598 \obeylines \uncatcodespecials \sepspaces 6599} 6600 6601% Setup for the @verbatim environment 6602% 6603% Real tab expansion. 6604\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount 6605% 6606% We typeset each line of the verbatim in an \hbox, so we can handle 6607% tabs. The \global is in case the verbatim line starts with an accent, 6608% or some other command that starts with a begin-group. Otherwise, the 6609% entire \verbbox would disappear at the corresponding end-group, before 6610% it is typeset. Meanwhile, we can't have nested verbatim commands 6611% (can we?), so the \global won't be overwriting itself. 6612\newbox\verbbox 6613\def\starttabbox{\global\setbox\verbbox=\hbox\bgroup} 6614% 6615\begingroup 6616 \catcode`\^^I=\active 6617 \gdef\tabexpand{% 6618 \catcode`\^^I=\active 6619 \def^^I{\leavevmode\egroup 6620 \dimen\verbbox=\wd\verbbox % the width so far, or since the previous tab 6621 \divide\dimen\verbbox by\tabw 6622 \multiply\dimen\verbbox by\tabw % compute previous multiple of \tabw 6623 \advance\dimen\verbbox by\tabw % advance to next multiple of \tabw 6624 \wd\verbbox=\dimen\verbbox \box\verbbox \starttabbox 6625 }% 6626 } 6627\endgroup 6628 6629% start the verbatim environment. 6630\def\setupverbatim{% 6631 \let\nonarrowing = t% 6632 \nonfillstart 6633 \tt % easiest (and conventionally used) font for verbatim 6634 % The \leavevmode here is for blank lines. Otherwise, we would 6635 % never \starttabox and the \egroup would end verbatim mode. 6636 \def\par{\leavevmode\egroup\box\verbbox\endgraf}% 6637 \tabexpand 6638 \setupmarkupstyle{verbatim}% 6639 % Respect line breaks, 6640 % print special symbols as themselves, and 6641 % make each space count. 6642 % Must do in this order: 6643 \obeylines \uncatcodespecials \sepspaces 6644 \everypar{\starttabbox}% 6645} 6646 6647% Do the @verb magic: verbatim text is quoted by unique 6648% delimiter characters. Before first delimiter expect a 6649% right brace, after last delimiter expect closing brace: 6650% 6651% \def\doverb'{'<char>#1<char>'}'{#1} 6652% 6653% [Knuth] p. 382; only eat outer {} 6654\begingroup 6655 \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other 6656 \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next] 6657\endgroup 6658% 6659\def\verb{\begingroup\setupverb\doverb} 6660% 6661% 6662% Do the @verbatim magic: define the macro \doverbatim so that 6663% the (first) argument ends when '@end verbatim' is reached, ie: 6664% 6665% \def\doverbatim#1@end verbatim{#1} 6666% 6667% For Texinfo it's a lot easier than for LaTeX, 6668% because texinfo's \verbatim doesn't stop at '\end{verbatim}': 6669% we need not redefine '\', '{' and '}'. 6670% 6671% Inspired by LaTeX's verbatim command set [latex.ltx] 6672% 6673\begingroup 6674 \catcode`\ =\active 6675 \obeylines % 6676 % ignore everything up to the first ^^M, that's the newline at the end 6677 % of the @verbatim input line itself. Otherwise we get an extra blank 6678 % line in the output. 6679 \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}% 6680 % We really want {...\end verbatim} in the body of the macro, but 6681 % without the active space; thus we have to use \xdef and \gobble. 6682\endgroup 6683% 6684\envdef\verbatim{% 6685 \setupverbatim\doverbatim 6686} 6687\let\Everbatim = \afterenvbreak 6688 6689 6690% @verbatiminclude FILE - insert text of file in verbatim environment. 6691% 6692\def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude} 6693% 6694\def\doverbatiminclude#1{% 6695 {% 6696 \makevalueexpandable 6697 \setupverbatim 6698 \indexnofonts % Allow `@@' and other weird things in file names. 6699 \wlog{texinfo.tex: doing @verbatiminclude of #1^^J}% 6700 \input #1 6701 \afterenvbreak 6702 }% 6703} 6704 6705% @copying ... @end copying. 6706% Save the text away for @insertcopying later. 6707% 6708% We save the uninterpreted tokens, rather than creating a box. 6709% Saving the text in a box would be much easier, but then all the 6710% typesetting commands (@smallbook, font changes, etc.) have to be done 6711% beforehand -- and a) we want @copying to be done first in the source 6712% file; b) letting users define the frontmatter in as flexible order as 6713% possible is very desirable. 6714% 6715\def\copying{\checkenv{}\begingroup\scanargctxt\docopying} 6716\def\docopying#1@end copying{\endgroup\def\copyingtext{#1}} 6717% 6718\def\insertcopying{% 6719 \begingroup 6720 \parindent = 0pt % paragraph indentation looks wrong on title page 6721 \scanexp\copyingtext 6722 \endgroup 6723} 6724 6725 6726\message{defuns,} 6727% @defun etc. 6728 6729\newskip\defbodyindent \defbodyindent=.4in 6730\newskip\defargsindent \defargsindent=50pt 6731\newskip\deflastargmargin \deflastargmargin=18pt 6732\newcount\defunpenalty 6733 6734% Start the processing of @deffn: 6735\def\startdefun{% 6736 \ifnum\lastpenalty<10000 6737 \medbreak 6738 \defunpenalty=10003 % Will keep this @deffn together with the 6739 % following @def command, see below. 6740 \else 6741 % If there are two @def commands in a row, we'll have a \nobreak, 6742 % which is there to keep the function description together with its 6743 % header. But if there's nothing but headers, we need to allow a 6744 % break somewhere. Check specifically for penalty 10002, inserted 6745 % by \printdefunline, instead of 10000, since the sectioning 6746 % commands also insert a nobreak penalty, and we don't want to allow 6747 % a break between a section heading and a defun. 6748 % 6749 % As a further refinement, we avoid "club" headers by signalling 6750 % with penalty of 10003 after the very first @deffn in the 6751 % sequence (see above), and penalty of 10002 after any following 6752 % @def command. 6753 \ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \fi 6754 % 6755 % Similarly, after a section heading, do not allow a break. 6756 % But do insert the glue. 6757 \medskip % preceded by discardable penalty, so not a breakpoint 6758 \fi 6759 % 6760 \parindent=0in 6761 \advance\leftskip by \defbodyindent 6762 \exdentamount=\defbodyindent 6763} 6764 6765\def\dodefunx#1{% 6766 % First, check whether we are in the right environment: 6767 \checkenv#1% 6768 % 6769 % As above, allow line break if we have multiple x headers in a row. 6770 % It's not a great place, though. 6771 \ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi 6772 % 6773 % And now, it's time to reuse the body of the original defun: 6774 \expandafter\gobbledefun#1% 6775} 6776\def\gobbledefun#1\startdefun{} 6777 6778% \printdefunline \deffnheader{text} 6779% 6780\def\printdefunline#1#2{% 6781 \begingroup 6782 % call \deffnheader: 6783 #1#2 \endheader 6784 % common ending: 6785 \interlinepenalty = 10000 6786 \advance\rightskip by 0pt plus 1fil\relax 6787 \endgraf 6788 \nobreak\vskip -\parskip 6789 \penalty\defunpenalty % signal to \startdefun and \dodefunx 6790 % Some of the @defun-type tags do not enable magic parentheses, 6791 % rendering the following check redundant. But we don't optimize. 6792 \checkparencounts 6793 \endgroup 6794} 6795 6796\def\Edefun{\endgraf\medbreak} 6797 6798% \makedefun{deffn} creates \deffn, \deffnx and \Edeffn; 6799% the only thing remaining is to define \deffnheader. 6800% 6801\def\makedefun#1{% 6802 \expandafter\let\csname E#1\endcsname = \Edefun 6803 \edef\temp{\noexpand\domakedefun 6804 \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}% 6805 \temp 6806} 6807 6808% \domakedefun \deffn \deffnx \deffnheader 6809% 6810% Define \deffn and \deffnx, without parameters. 6811% \deffnheader has to be defined explicitly. 6812% 6813\def\domakedefun#1#2#3{% 6814 \envdef#1{% 6815 \startdefun 6816 \doingtypefnfalse % distinguish typed functions from all else 6817 \parseargusing\activeparens{\printdefunline#3}% 6818 }% 6819 \def#2{\dodefunx#1}% 6820 \def#3% 6821} 6822 6823\newif\ifdoingtypefn % doing typed function? 6824\newif\ifrettypeownline % typeset return type on its own line? 6825 6826% @deftypefnnewline on|off says whether the return type of typed functions 6827% are printed on their own line. This affects @deftypefn, @deftypefun, 6828% @deftypeop, and @deftypemethod. 6829% 6830\parseargdef\deftypefnnewline{% 6831 \def\temp{#1}% 6832 \ifx\temp\onword 6833 \expandafter\let\csname SETtxideftypefnnl\endcsname 6834 = \empty 6835 \else\ifx\temp\offword 6836 \expandafter\let\csname SETtxideftypefnnl\endcsname 6837 = \relax 6838 \else 6839 \errhelp = \EMsimple 6840 \errmessage{Unknown @txideftypefnnl value `\temp', 6841 must be on|off}% 6842 \fi\fi 6843} 6844 6845% Untyped functions: 6846 6847% @deffn category name args 6848\makedefun{deffn}{\deffngeneral{}} 6849 6850% @deffn category class name args 6851\makedefun{defop}#1 {\defopon{#1\ \putwordon}} 6852 6853% \defopon {category on}class name args 6854\def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } 6855 6856% \deffngeneral {subind}category name args 6857% 6858\def\deffngeneral#1#2 #3 #4\endheader{% 6859 % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}. 6860 \dosubind{fn}{\code{#3}}{#1}% 6861 \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}% 6862} 6863 6864% Typed functions: 6865 6866% @deftypefn category type name args 6867\makedefun{deftypefn}{\deftypefngeneral{}} 6868 6869% @deftypeop category class type name args 6870\makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}} 6871 6872% \deftypeopon {category on}class type name args 6873\def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } 6874 6875% \deftypefngeneral {subind}category type name args 6876% 6877\def\deftypefngeneral#1#2 #3 #4 #5\endheader{% 6878 \dosubind{fn}{\code{#4}}{#1}% 6879 \doingtypefntrue 6880 \defname{#2}{#3}{#4}\defunargs{#5\unskip}% 6881} 6882 6883% Typed variables: 6884 6885% @deftypevr category type var args 6886\makedefun{deftypevr}{\deftypecvgeneral{}} 6887 6888% @deftypecv category class type var args 6889\makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}} 6890 6891% \deftypecvof {category of}class type var args 6892\def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} } 6893 6894% \deftypecvgeneral {subind}category type var args 6895% 6896\def\deftypecvgeneral#1#2 #3 #4 #5\endheader{% 6897 \dosubind{vr}{\code{#4}}{#1}% 6898 \defname{#2}{#3}{#4}\defunargs{#5\unskip}% 6899} 6900 6901% Untyped variables: 6902 6903% @defvr category var args 6904\makedefun{defvr}#1 {\deftypevrheader{#1} {} } 6905 6906% @defcv category class var args 6907\makedefun{defcv}#1 {\defcvof{#1\ \putwordof}} 6908 6909% \defcvof {category of}class var args 6910\def\defcvof#1#2 {\deftypecvof{#1}#2 {} } 6911 6912% Types: 6913 6914% @deftp category name args 6915\makedefun{deftp}#1 #2 #3\endheader{% 6916 \doind{tp}{\code{#2}}% 6917 \defname{#1}{}{#2}\defunargs{#3\unskip}% 6918} 6919 6920% Remaining @defun-like shortcuts: 6921\makedefun{defun}{\deffnheader{\putwordDeffunc} } 6922\makedefun{defmac}{\deffnheader{\putwordDefmac} } 6923\makedefun{defspec}{\deffnheader{\putwordDefspec} } 6924\makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} } 6925\makedefun{defvar}{\defvrheader{\putwordDefvar} } 6926\makedefun{defopt}{\defvrheader{\putwordDefopt} } 6927\makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} } 6928\makedefun{defmethod}{\defopon\putwordMethodon} 6929\makedefun{deftypemethod}{\deftypeopon\putwordMethodon} 6930\makedefun{defivar}{\defcvof\putwordInstanceVariableof} 6931\makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof} 6932 6933% \defname, which formats the name of the @def (not the args). 6934% #1 is the category, such as "Function". 6935% #2 is the return type, if any. 6936% #3 is the function name. 6937% 6938% We are followed by (but not passed) the arguments, if any. 6939% 6940\def\defname#1#2#3{% 6941 \par 6942 % Get the values of \leftskip and \rightskip as they were outside the @def... 6943 \advance\leftskip by -\defbodyindent 6944 % 6945 % Determine if we are typesetting the return type of a typed function 6946 % on a line by itself. 6947 \rettypeownlinefalse 6948 \ifdoingtypefn % doing a typed function specifically? 6949 % then check user option for putting return type on its own line: 6950 \expandafter\ifx\csname SETtxideftypefnnl\endcsname\relax \else 6951 \rettypeownlinetrue 6952 \fi 6953 \fi 6954 % 6955 % How we'll format the category name. Putting it in brackets helps 6956 % distinguish it from the body text that may end up on the next line 6957 % just below it. 6958 \def\temp{#1}% 6959 \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi} 6960 % 6961 % Figure out line sizes for the paragraph shape. We'll always have at 6962 % least two. 6963 \tempnum = 2 6964 % 6965 % The first line needs space for \box0; but if \rightskip is nonzero, 6966 % we need only space for the part of \box0 which exceeds it: 6967 \dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip 6968 % 6969 % If doing a return type on its own line, we'll have another line. 6970 \ifrettypeownline 6971 \advance\tempnum by 1 6972 \def\maybeshapeline{0in \hsize}% 6973 \else 6974 \def\maybeshapeline{}% 6975 \fi 6976 % 6977 % The continuations: 6978 \dimen2=\hsize \advance\dimen2 by -\defargsindent 6979 % 6980 % The final paragraph shape: 6981 \parshape \tempnum 0in \dimen0 \maybeshapeline \defargsindent \dimen2 6982 % 6983 % Put the category name at the right margin. 6984 \noindent 6985 \hbox to 0pt{% 6986 \hfil\box0 \kern-\hsize 6987 % \hsize has to be shortened this way: 6988 \kern\leftskip 6989 % Intentionally do not respect \rightskip, since we need the space. 6990 }% 6991 % 6992 % Allow all lines to be underfull without complaint: 6993 \tolerance=10000 \hbadness=10000 6994 \exdentamount=\defbodyindent 6995 {% 6996 % defun fonts. We use typewriter by default (used to be bold) because: 6997 % . we're printing identifiers, they should be in tt in principle. 6998 % . in languages with many accents, such as Czech or French, it's 6999 % common to leave accents off identifiers. The result looks ok in 7000 % tt, but exceedingly strange in rm. 7001 % . we don't want -- and --- to be treated as ligatures. 7002 % . this still does not fix the ?` and !` ligatures, but so far no 7003 % one has made identifiers using them :). 7004 \df \tt 7005 \def\temp{#2}% text of the return type 7006 \ifx\temp\empty\else 7007 \tclose{\temp}% typeset the return type 7008 \ifrettypeownline 7009 % put return type on its own line; prohibit line break following: 7010 \hfil\vadjust{\nobreak}\break 7011 \else 7012 \space % type on same line, so just followed by a space 7013 \fi 7014 \fi % no return type 7015 #3% output function name 7016 }% 7017 {\rm\enskip}% hskip 0.5 em of \tenrm 7018 % 7019 \boldbrax 7020 % arguments will be output next, if any. 7021} 7022 7023% Print arguments in slanted roman (not ttsl), inconsistently with using 7024% tt for the name. This is because literal text is sometimes needed in 7025% the argument list (groff manual), and ttsl and tt are not very 7026% distinguishable. Prevent hyphenation at `-' chars. 7027% 7028\def\defunargs#1{% 7029 % use sl by default (not ttsl), 7030 % tt for the names. 7031 \df \sl \hyphenchar\font=0 7032 % 7033 % On the other hand, if an argument has two dashes (for instance), we 7034 % want a way to get ttsl. Let's try @var for that. 7035 \def\var##1{{\setupmarkupstyle{var}\ttslanted{##1}}}% 7036 #1% 7037 \sl\hyphenchar\font=45 7038} 7039 7040% We want ()&[] to print specially on the defun line. 7041% 7042\def\activeparens{% 7043 \catcode`\(=\active \catcode`\)=\active 7044 \catcode`\[=\active \catcode`\]=\active 7045 \catcode`\&=\active 7046} 7047 7048% Make control sequences which act like normal parenthesis chars. 7049\let\lparen = ( \let\rparen = ) 7050 7051% Be sure that we always have a definition for `(', etc. For example, 7052% if the fn name has parens in it, \boldbrax will not be in effect yet, 7053% so TeX would otherwise complain about undefined control sequence. 7054{ 7055 \activeparens 7056 \global\let(=\lparen \global\let)=\rparen 7057 \global\let[=\lbrack \global\let]=\rbrack 7058 \global\let& = \& 7059 7060 \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} 7061 \gdef\magicamp{\let&=\amprm} 7062} 7063 7064\newcount\parencount 7065 7066% If we encounter &foo, then turn on ()-hacking afterwards 7067\newif\ifampseen 7068\def\amprm#1 {\ampseentrue{\bf\ }} 7069 7070\def\parenfont{% 7071 \ifampseen 7072 % At the first level, print parens in roman, 7073 % otherwise use the default font. 7074 \ifnum \parencount=1 \rm \fi 7075 \else 7076 % The \sf parens (in \boldbrax) actually are a little bolder than 7077 % the contained text. This is especially needed for [ and ] . 7078 \sf 7079 \fi 7080} 7081\def\infirstlevel#1{% 7082 \ifampseen 7083 \ifnum\parencount=1 7084 #1% 7085 \fi 7086 \fi 7087} 7088\def\bfafterword#1 {#1 \bf} 7089 7090\def\opnr{% 7091 \global\advance\parencount by 1 7092 {\parenfont(}% 7093 \infirstlevel \bfafterword 7094} 7095\def\clnr{% 7096 {\parenfont)}% 7097 \infirstlevel \sl 7098 \global\advance\parencount by -1 7099} 7100 7101\newcount\brackcount 7102\def\lbrb{% 7103 \global\advance\brackcount by 1 7104 {\bf[}% 7105} 7106\def\rbrb{% 7107 {\bf]}% 7108 \global\advance\brackcount by -1 7109} 7110 7111\def\checkparencounts{% 7112 \ifnum\parencount=0 \else \badparencount \fi 7113 \ifnum\brackcount=0 \else \badbrackcount \fi 7114} 7115% these should not use \errmessage; the glibc manual, at least, actually 7116% has such constructs (when documenting function pointers). 7117\def\badparencount{% 7118 \message{Warning: unbalanced parentheses in @def...}% 7119 \global\parencount=0 7120} 7121\def\badbrackcount{% 7122 \message{Warning: unbalanced square brackets in @def...}% 7123 \global\brackcount=0 7124} 7125 7126 7127\message{macros,} 7128% @macro. 7129 7130% To do this right we need a feature of e-TeX, \scantokens, 7131% which we arrange to emulate with a temporary file in ordinary TeX. 7132\ifx\eTeXversion\thisisundefined 7133 \newwrite\macscribble 7134 \def\scantokens#1{% 7135 \toks0={#1}% 7136 \immediate\openout\macscribble=\jobname.tmp 7137 \immediate\write\macscribble{\the\toks0}% 7138 \immediate\closeout\macscribble 7139 \input \jobname.tmp 7140 } 7141\fi 7142 7143\def\scanmacro#1{\begingroup 7144 \newlinechar`\^^M 7145 \let\xeatspaces\eatspaces 7146 % 7147 % Undo catcode changes of \startcontents and \doprintindex 7148 % When called from @insertcopying or (short)caption, we need active 7149 % backslash to get it printed correctly. Previously, we had 7150 % \catcode`\\=\other instead. We'll see whether a problem appears 7151 % with macro expansion. --kasal, 19aug04 7152 \catcode`\@=0 \catcode`\\=\active \escapechar=`\@ 7153 % 7154 % ... and for \example: 7155 \spaceisspace 7156 % 7157 % The \empty here causes a following catcode 5 newline to be eaten as 7158 % part of reading whitespace after a control sequence. It does not 7159 % eat a catcode 13 newline. There's no good way to handle the two 7160 % cases (untried: maybe e-TeX's \everyeof could help, though plain TeX 7161 % would then have different behavior). See the Macro Details node in 7162 % the manual for the workaround we recommend for macros and 7163 % line-oriented commands. 7164 % 7165 \scantokens{#1\empty}% 7166\endgroup} 7167 7168\def\scanexp#1{% 7169 \edef\temp{\noexpand\scanmacro{#1}}% 7170 \temp 7171} 7172 7173\newcount\paramno % Count of parameters 7174\newtoks\macname % Macro name 7175\newif\ifrecursive % Is it recursive? 7176 7177% List of all defined macros in the form 7178% \definedummyword\macro1\definedummyword\macro2... 7179% Currently is also contains all @aliases; the list can be split 7180% if there is a need. 7181\def\macrolist{} 7182 7183% Add the macro to \macrolist 7184\def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname} 7185\def\addtomacrolistxxx#1{% 7186 \toks0 = \expandafter{\macrolist\definedummyword#1}% 7187 \xdef\macrolist{\the\toks0}% 7188} 7189 7190% Utility routines. 7191% This does \let #1 = #2, with \csnames; that is, 7192% \let \csname#1\endcsname = \csname#2\endcsname 7193% (except of course we have to play expansion games). 7194% 7195\def\cslet#1#2{% 7196 \expandafter\let 7197 \csname#1\expandafter\endcsname 7198 \csname#2\endcsname 7199} 7200 7201% Trim leading and trailing spaces off a string. 7202% Concepts from aro-bend problem 15 (see CTAN). 7203{\catcode`\@=11 7204\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }} 7205\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@} 7206\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @} 7207\def\unbrace#1{#1} 7208\unbrace{\gdef\trim@@@ #1 } #2@{#1} 7209} 7210 7211% Trim a single trailing ^^M off a string. 7212{\catcode`\^^M=\other \catcode`\Q=3% 7213\gdef\eatcr #1{\eatcra #1Q^^MQ}% 7214\gdef\eatcra#1^^MQ{\eatcrb#1Q}% 7215\gdef\eatcrb#1Q#2Q{#1}% 7216} 7217 7218% Macro bodies are absorbed as an argument in a context where 7219% all characters are catcode 10, 11 or 12, except \ which is active 7220% (as in normal texinfo). It is necessary to change the definition of \ 7221% to recognize macro arguments; this is the job of \mbodybackslash. 7222% 7223% Non-ASCII encodings make 8-bit characters active, so un-activate 7224% them to avoid their expansion. Must do this non-globally, to 7225% confine the change to the current group. 7226% 7227% It's necessary to have hard CRs when the macro is executed. This is 7228% done by making ^^M (\endlinechar) catcode 12 when reading the macro 7229% body, and then making it the \newlinechar in \scanmacro. 7230% 7231\def\scanctxt{% used as subroutine 7232 \catcode`\"=\other 7233 \catcode`\+=\other 7234 \catcode`\<=\other 7235 \catcode`\>=\other 7236 \catcode`\@=\other 7237 \catcode`\^=\other 7238 \catcode`\_=\other 7239 \catcode`\|=\other 7240 \catcode`\~=\other 7241 \ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi 7242} 7243 7244\def\scanargctxt{% used for copying and captions, not macros. 7245 \scanctxt 7246 \catcode`\\=\other 7247 \catcode`\^^M=\other 7248} 7249 7250\def\macrobodyctxt{% used for @macro definitions 7251 \scanctxt 7252 \catcode`\{=\other 7253 \catcode`\}=\other 7254 \catcode`\^^M=\other 7255 \usembodybackslash 7256} 7257 7258\def\macroargctxt{% used when scanning invocations 7259 \scanctxt 7260 \catcode`\\=0 7261} 7262% why catcode 0 for \ in the above? To recognize \\ \{ \} as "escapes" 7263% for the single characters \ { }. Thus, we end up with the "commands" 7264% that would be written @\ @{ @} in a Texinfo document. 7265% 7266% We already have @{ and @}. For @\, we define it here, and only for 7267% this purpose, to produce a typewriter backslash (so, the @\ that we 7268% define for @math can't be used with @macro calls): 7269% 7270\def\\{\normalbackslash}% 7271% 7272% We would like to do this for \, too, since that is what makeinfo does. 7273% But it is not possible, because Texinfo already has a command @, for a 7274% cedilla accent. Documents must use @comma{} instead. 7275% 7276% \anythingelse will almost certainly be an error of some kind. 7277 7278 7279% \mbodybackslash is the definition of \ in @macro bodies. 7280% It maps \foo\ => \csname macarg.foo\endcsname => #N 7281% where N is the macro parameter number. 7282% We define \csname macarg.\endcsname to be \realbackslash, so 7283% \\ in macro replacement text gets you a backslash. 7284% 7285{\catcode`@=0 @catcode`@\=@active 7286 @gdef@usembodybackslash{@let\=@mbodybackslash} 7287 @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname} 7288} 7289\expandafter\def\csname macarg.\endcsname{\realbackslash} 7290 7291\def\margbackslash#1{\char`\#1 } 7292 7293\def\macro{\recursivefalse\parsearg\macroxxx} 7294\def\rmacro{\recursivetrue\parsearg\macroxxx} 7295 7296\def\macroxxx#1{% 7297 \getargs{#1}% now \macname is the macname and \argl the arglist 7298 \ifx\argl\empty % no arguments 7299 \paramno=0\relax 7300 \else 7301 \expandafter\parsemargdef \argl;% 7302 \if\paramno>256\relax 7303 \ifx\eTeXversion\thisisundefined 7304 \errhelp = \EMsimple 7305 \errmessage{You need eTeX to compile a file with macros with more than 256 arguments} 7306 \fi 7307 \fi 7308 \fi 7309 \if1\csname ismacro.\the\macname\endcsname 7310 \message{Warning: redefining \the\macname}% 7311 \else 7312 \expandafter\ifx\csname \the\macname\endcsname \relax 7313 \else \errmessage{Macro name \the\macname\space already defined}\fi 7314 \global\cslet{macsave.\the\macname}{\the\macname}% 7315 \global\expandafter\let\csname ismacro.\the\macname\endcsname=1% 7316 \addtomacrolist{\the\macname}% 7317 \fi 7318 \begingroup \macrobodyctxt 7319 \ifrecursive \expandafter\parsermacbody 7320 \else \expandafter\parsemacbody 7321 \fi} 7322 7323\parseargdef\unmacro{% 7324 \if1\csname ismacro.#1\endcsname 7325 \global\cslet{#1}{macsave.#1}% 7326 \global\expandafter\let \csname ismacro.#1\endcsname=0% 7327 % Remove the macro name from \macrolist: 7328 \begingroup 7329 \expandafter\let\csname#1\endcsname \relax 7330 \let\definedummyword\unmacrodo 7331 \xdef\macrolist{\macrolist}% 7332 \endgroup 7333 \else 7334 \errmessage{Macro #1 not defined}% 7335 \fi 7336} 7337 7338% Called by \do from \dounmacro on each macro. The idea is to omit any 7339% macro definitions that have been changed to \relax. 7340% 7341\def\unmacrodo#1{% 7342 \ifx #1\relax 7343 % remove this 7344 \else 7345 \noexpand\definedummyword \noexpand#1% 7346 \fi 7347} 7348 7349% This makes use of the obscure feature that if the last token of a 7350% <parameter list> is #, then the preceding argument is delimited by 7351% an opening brace, and that opening brace is not consumed. 7352\def\getargs#1{\getargsxxx#1{}} 7353\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs} 7354\def\getmacname#1 #2\relax{\macname={#1}} 7355\def\getmacargs#1{\def\argl{#1}} 7356 7357% For macro processing make @ a letter so that we can make Texinfo private macro names. 7358\edef\texiatcatcode{\the\catcode`\@} 7359\catcode `@=11\relax 7360 7361% Parse the optional {params} list. Set up \paramno and \paramlist 7362% so \defmacro knows what to do. Define \macarg.BLAH for each BLAH 7363% in the params list to some hook where the argument si to be expanded. If 7364% there are less than 10 arguments that hook is to be replaced by ##N where N 7365% is the position in that list, that is to say the macro arguments are to be 7366% defined `a la TeX in the macro body. 7367% 7368% That gets used by \mbodybackslash (above). 7369% 7370% We need to get `macro parameter char #' into several definitions. 7371% The technique used is stolen from LaTeX: let \hash be something 7372% unexpandable, insert that wherever you need a #, and then redefine 7373% it to # just before using the token list produced. 7374% 7375% The same technique is used to protect \eatspaces till just before 7376% the macro is used. 7377% 7378% If there are 10 or more arguments, a different technique is used, where the 7379% hook remains in the body, and when macro is to be expanded the body is 7380% processed again to replace the arguments. 7381% 7382% In that case, the hook is \the\toks N-1, and we simply set \toks N-1 to the 7383% argument N value and then \edef the body (nothing else will expand because of 7384% the catcode regime underwhich the body was input). 7385% 7386% If you compile with TeX (not eTeX), and you have macros with 10 or more 7387% arguments, you need that no macro has more than 256 arguments, otherwise an 7388% error is produced. 7389\def\parsemargdef#1;{% 7390 \paramno=0\def\paramlist{}% 7391 \let\hash\relax 7392 \let\xeatspaces\relax 7393 \parsemargdefxxx#1,;,% 7394 % In case that there are 10 or more arguments we parse again the arguments 7395 % list to set new definitions for the \macarg.BLAH macros corresponding to 7396 % each BLAH argument. It was anyhow needed to parse already once this list 7397 % in order to count the arguments, and as macros with at most 9 arguments 7398 % are by far more frequent than macro with 10 or more arguments, defining 7399 % twice the \macarg.BLAH macros does not cost too much processing power. 7400 \ifnum\paramno<10\relax\else 7401 \paramno0\relax 7402 \parsemmanyargdef@@#1,;,% 10 or more arguments 7403 \fi 7404} 7405\def\parsemargdefxxx#1,{% 7406 \if#1;\let\next=\relax 7407 \else \let\next=\parsemargdefxxx 7408 \advance\paramno by 1 7409 \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname 7410 {\xeatspaces{\hash\the\paramno}}% 7411 \edef\paramlist{\paramlist\hash\the\paramno,}% 7412 \fi\next} 7413 7414\def\parsemmanyargdef@@#1,{% 7415 \if#1;\let\next=\relax 7416 \else 7417 \let\next=\parsemmanyargdef@@ 7418 \edef\tempb{\eatspaces{#1}}% 7419 \expandafter\def\expandafter\tempa 7420 \expandafter{\csname macarg.\tempb\endcsname}% 7421 % Note that we need some extra \noexpand\noexpand, this is because we 7422 % don't want \the to be expanded in the \parsermacbody as it uses an 7423 % \xdef . 7424 \expandafter\edef\tempa 7425 {\noexpand\noexpand\noexpand\the\toks\the\paramno}% 7426 \advance\paramno by 1\relax 7427 \fi\next} 7428 7429% These two commands read recursive and nonrecursive macro bodies. 7430% (They're different since rec and nonrec macros end differently.) 7431% 7432 7433\catcode `\@\texiatcatcode 7434\long\def\parsemacbody#1@end macro% 7435{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% 7436\long\def\parsermacbody#1@end rmacro% 7437{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% 7438\catcode `\@=11\relax 7439 7440\let\endargs@\relax 7441\let\nil@\relax 7442\def\nilm@{\nil@}% 7443\long\def\nillm@{\nil@}% 7444 7445% This macro is expanded during the Texinfo macro expansion, not during its 7446% definition. It gets all the arguments values and assigns them to macros 7447% macarg.ARGNAME 7448% 7449% #1 is the macro name 7450% #2 is the list of argument names 7451% #3 is the list of argument values 7452\def\getargvals@#1#2#3{% 7453 \def\macargdeflist@{}% 7454 \def\saveparamlist@{#2}% Need to keep a copy for parameter expansion. 7455 \def\paramlist{#2,\nil@}% 7456 \def\macroname{#1}% 7457 \begingroup 7458 \macroargctxt 7459 \def\argvaluelist{#3,\nil@}% 7460 \def\@tempa{#3}% 7461 \ifx\@tempa\empty 7462 \setemptyargvalues@ 7463 \else 7464 \getargvals@@ 7465 \fi 7466} 7467 7468% 7469\def\getargvals@@{% 7470 \ifx\paramlist\nilm@ 7471 % Some sanity check needed here that \argvaluelist is also empty. 7472 \ifx\argvaluelist\nillm@ 7473 \else 7474 \errhelp = \EMsimple 7475 \errmessage{Too many arguments in macro `\macroname'!}% 7476 \fi 7477 \let\next\macargexpandinbody@ 7478 \else 7479 \ifx\argvaluelist\nillm@ 7480 % No more arguments values passed to macro. Set remaining named-arg 7481 % macros to empty. 7482 \let\next\setemptyargvalues@ 7483 \else 7484 % pop current arg name into \@tempb 7485 \def\@tempa##1{\pop@{\@tempb}{\paramlist}##1\endargs@}% 7486 \expandafter\@tempa\expandafter{\paramlist}% 7487 % pop current argument value into \@tempc 7488 \def\@tempa##1{\longpop@{\@tempc}{\argvaluelist}##1\endargs@}% 7489 \expandafter\@tempa\expandafter{\argvaluelist}% 7490 % Here \@tempb is the current arg name and \@tempc is the current arg value. 7491 % First place the new argument macro definition into \@tempd 7492 \expandafter\macname\expandafter{\@tempc}% 7493 \expandafter\let\csname macarg.\@tempb\endcsname\relax 7494 \expandafter\def\expandafter\@tempe\expandafter{% 7495 \csname macarg.\@tempb\endcsname}% 7496 \edef\@tempd{\long\def\@tempe{\the\macname}}% 7497 \push@\@tempd\macargdeflist@ 7498 \let\next\getargvals@@ 7499 \fi 7500 \fi 7501 \next 7502} 7503 7504\def\push@#1#2{% 7505 \expandafter\expandafter\expandafter\def 7506 \expandafter\expandafter\expandafter#2% 7507 \expandafter\expandafter\expandafter{% 7508 \expandafter#1#2}% 7509} 7510 7511% Replace arguments by their values in the macro body, and place the result 7512% in macro \@tempa 7513\def\macvalstoargs@{% 7514 % To do this we use the property that token registers that are \the'ed 7515 % within an \edef expand only once. So we are going to place all argument 7516 % values into respective token registers. 7517 % 7518 % First we save the token context, and initialize argument numbering. 7519 \begingroup 7520 \paramno0\relax 7521 % Then, for each argument number #N, we place the corresponding argument 7522 % value into a new token list register \toks#N 7523 \expandafter\putargsintokens@\saveparamlist@,;,% 7524 % Then, we expand the body so that argument are replaced by their 7525 % values. The trick for values not to be expanded themselves is that they 7526 % are within tokens and that tokens expand only once in an \edef . 7527 \edef\@tempc{\csname mac.\macroname .body\endcsname}% 7528 % Now we restore the token stack pointer to free the token list registers 7529 % which we have used, but we make sure that expanded body is saved after 7530 % group. 7531 \expandafter 7532 \endgroup 7533 \expandafter\def\expandafter\@tempa\expandafter{\@tempc}% 7534 } 7535 7536\def\macargexpandinbody@{% 7537 %% Define the named-macro outside of this group and then close this group. 7538 \expandafter 7539 \endgroup 7540 \macargdeflist@ 7541 % First the replace in body the macro arguments by their values, the result 7542 % is in \@tempa . 7543 \macvalstoargs@ 7544 % Then we point at the \norecurse or \gobble (for recursive) macro value 7545 % with \@tempb . 7546 \expandafter\let\expandafter\@tempb\csname mac.\macroname .recurse\endcsname 7547 % Depending on whether it is recursive or not, we need some tailing 7548 % \egroup . 7549 \ifx\@tempb\gobble 7550 \let\@tempc\relax 7551 \else 7552 \let\@tempc\egroup 7553 \fi 7554 % And now we do the real job: 7555 \edef\@tempd{\noexpand\@tempb{\macroname}\noexpand\scanmacro{\@tempa}\@tempc}% 7556 \@tempd 7557} 7558 7559\def\putargsintokens@#1,{% 7560 \if#1;\let\next\relax 7561 \else 7562 \let\next\putargsintokens@ 7563 % First we allocate the new token list register, and give it a temporary 7564 % alias \@tempb . 7565 \toksdef\@tempb\the\paramno 7566 % Then we place the argument value into that token list register. 7567 \expandafter\let\expandafter\@tempa\csname macarg.#1\endcsname 7568 \expandafter\@tempb\expandafter{\@tempa}% 7569 \advance\paramno by 1\relax 7570 \fi 7571 \next 7572} 7573 7574% Save the token stack pointer into macro #1 7575\def\texisavetoksstackpoint#1{\edef#1{\the\@cclvi}} 7576% Restore the token stack pointer from number in macro #1 7577\def\texirestoretoksstackpoint#1{\expandafter\mathchardef\expandafter\@cclvi#1\relax} 7578% newtoks that can be used non \outer . 7579\def\texinonouternewtoks{\alloc@ 5\toks \toksdef \@cclvi} 7580 7581% Tailing missing arguments are set to empty 7582\def\setemptyargvalues@{% 7583 \ifx\paramlist\nilm@ 7584 \let\next\macargexpandinbody@ 7585 \else 7586 \expandafter\setemptyargvaluesparser@\paramlist\endargs@ 7587 \let\next\setemptyargvalues@ 7588 \fi 7589 \next 7590} 7591 7592\def\setemptyargvaluesparser@#1,#2\endargs@{% 7593 \expandafter\def\expandafter\@tempa\expandafter{% 7594 \expandafter\def\csname macarg.#1\endcsname{}}% 7595 \push@\@tempa\macargdeflist@ 7596 \def\paramlist{#2}% 7597} 7598 7599% #1 is the element target macro 7600% #2 is the list macro 7601% #3,#4\endargs@ is the list value 7602\def\pop@#1#2#3,#4\endargs@{% 7603 \def#1{#3}% 7604 \def#2{#4}% 7605} 7606\long\def\longpop@#1#2#3,#4\endargs@{% 7607 \long\def#1{#3}% 7608 \long\def#2{#4}% 7609} 7610 7611% This defines a Texinfo @macro. There are eight cases: recursive and 7612% nonrecursive macros of zero, one, up to nine, and many arguments. 7613% Much magic with \expandafter here. 7614% \xdef is used so that macro definitions will survive the file 7615% they're defined in; @include reads the file inside a group. 7616% 7617\def\defmacro{% 7618 \let\hash=##% convert placeholders to macro parameter chars 7619 \ifrecursive 7620 \ifcase\paramno 7621 % 0 7622 \expandafter\xdef\csname\the\macname\endcsname{% 7623 \noexpand\scanmacro{\temp}}% 7624 \or % 1 7625 \expandafter\xdef\csname\the\macname\endcsname{% 7626 \bgroup\noexpand\macroargctxt 7627 \noexpand\braceorline 7628 \expandafter\noexpand\csname\the\macname xxx\endcsname}% 7629 \expandafter\xdef\csname\the\macname xxx\endcsname##1{% 7630 \egroup\noexpand\scanmacro{\temp}}% 7631 \else 7632 \ifnum\paramno<10\relax % at most 9 7633 \expandafter\xdef\csname\the\macname\endcsname{% 7634 \bgroup\noexpand\macroargctxt 7635 \noexpand\csname\the\macname xx\endcsname}% 7636 \expandafter\xdef\csname\the\macname xx\endcsname##1{% 7637 \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% 7638 \expandafter\expandafter 7639 \expandafter\xdef 7640 \expandafter\expandafter 7641 \csname\the\macname xxx\endcsname 7642 \paramlist{\egroup\noexpand\scanmacro{\temp}}% 7643 \else % 10 or more 7644 \expandafter\xdef\csname\the\macname\endcsname{% 7645 \noexpand\getargvals@{\the\macname}{\argl}% 7646 }% 7647 \global\expandafter\let\csname mac.\the\macname .body\endcsname\temp 7648 \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\gobble 7649 \fi 7650 \fi 7651 \else 7652 \ifcase\paramno 7653 % 0 7654 \expandafter\xdef\csname\the\macname\endcsname{% 7655 \noexpand\norecurse{\the\macname}% 7656 \noexpand\scanmacro{\temp}\egroup}% 7657 \or % 1 7658 \expandafter\xdef\csname\the\macname\endcsname{% 7659 \bgroup\noexpand\macroargctxt 7660 \noexpand\braceorline 7661 \expandafter\noexpand\csname\the\macname xxx\endcsname}% 7662 \expandafter\xdef\csname\the\macname xxx\endcsname##1{% 7663 \egroup 7664 \noexpand\norecurse{\the\macname}% 7665 \noexpand\scanmacro{\temp}\egroup}% 7666 \else % at most 9 7667 \ifnum\paramno<10\relax 7668 \expandafter\xdef\csname\the\macname\endcsname{% 7669 \bgroup\noexpand\macroargctxt 7670 \expandafter\noexpand\csname\the\macname xx\endcsname}% 7671 \expandafter\xdef\csname\the\macname xx\endcsname##1{% 7672 \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% 7673 \expandafter\expandafter 7674 \expandafter\xdef 7675 \expandafter\expandafter 7676 \csname\the\macname xxx\endcsname 7677 \paramlist{% 7678 \egroup 7679 \noexpand\norecurse{\the\macname}% 7680 \noexpand\scanmacro{\temp}\egroup}% 7681 \else % 10 or more: 7682 \expandafter\xdef\csname\the\macname\endcsname{% 7683 \noexpand\getargvals@{\the\macname}{\argl}% 7684 }% 7685 \global\expandafter\let\csname mac.\the\macname .body\endcsname\temp 7686 \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\norecurse 7687 \fi 7688 \fi 7689 \fi} 7690 7691\catcode `\@\texiatcatcode\relax 7692 7693\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} 7694 7695% \braceorline decides whether the next nonwhitespace character is a 7696% {. If so it reads up to the closing }, if not, it reads the whole 7697% line. Whatever was read is then fed to the next control sequence 7698% as an argument (by \parsebrace or \parsearg). 7699% 7700\def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx} 7701\def\braceorlinexxx{% 7702 \ifx\nchar\bgroup\else 7703 \expandafter\parsearg 7704 \fi \macnamexxx} 7705 7706 7707% @alias. 7708% We need some trickery to remove the optional spaces around the equal 7709% sign. Make them active and then expand them all to nothing. 7710% 7711\def\alias{\parseargusing\obeyspaces\aliasxxx} 7712\def\aliasxxx #1{\aliasyyy#1\relax} 7713\def\aliasyyy #1=#2\relax{% 7714 {% 7715 \expandafter\let\obeyedspace=\empty 7716 \addtomacrolist{#1}% 7717 \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}% 7718 }% 7719 \next 7720} 7721 7722 7723\message{cross references,} 7724 7725\newwrite\auxfile 7726\newif\ifhavexrefs % True if xref values are known. 7727\newif\ifwarnedxrefs % True if we warned once that they aren't known. 7728 7729% @inforef is relatively simple. 7730\def\inforef #1{\inforefzzz #1,,,,**} 7731\def\inforefzzz #1,#2,#3,#4**{% 7732 \putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, 7733 node \samp{\ignorespaces#1{}}} 7734 7735% @node's only job in TeX is to define \lastnode, which is used in 7736% cross-references. The @node line might or might not have commas, and 7737% might or might not have spaces before the first comma, like: 7738% @node foo , bar , ... 7739% We don't want such trailing spaces in the node name. 7740% 7741\parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse} 7742% 7743% also remove a trailing comma, in case of something like this: 7744% @node Help-Cross, , , Cross-refs 7745\def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse} 7746\def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}} 7747 7748\let\nwnode=\node 7749\let\lastnode=\empty 7750 7751% Write a cross-reference definition for the current node. #1 is the 7752% type (Ynumbered, Yappendix, Ynothing). 7753% 7754\def\donoderef#1{% 7755 \ifx\lastnode\empty\else 7756 \setref{\lastnode}{#1}% 7757 \global\let\lastnode=\empty 7758 \fi 7759} 7760 7761% @anchor{NAME} -- define xref target at arbitrary point. 7762% 7763\newcount\savesfregister 7764% 7765\def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi} 7766\def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi} 7767\def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces} 7768 7769% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an 7770% anchor), which consists of three parts: 7771% 1) NAME-title - the current sectioning name taken from \lastsection, 7772% or the anchor name. 7773% 2) NAME-snt - section number and type, passed as the SNT arg, or 7774% empty for anchors. 7775% 3) NAME-pg - the page number. 7776% 7777% This is called from \donoderef, \anchor, and \dofloat. In the case of 7778% floats, there is an additional part, which is not written here: 7779% 4) NAME-lof - the text as it should appear in a @listoffloats. 7780% 7781\def\setref#1#2{% 7782 \pdfmkdest{#1}% 7783 \iflinks 7784 {% 7785 \atdummies % preserve commands, but don't expand them 7786 \edef\writexrdef##1##2{% 7787 \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef 7788 ##1}{##2}}% these are parameters of \writexrdef 7789 }% 7790 \toks0 = \expandafter{\lastsection}% 7791 \immediate \writexrdef{title}{\the\toks0 }% 7792 \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc. 7793 \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, at \shipout 7794 }% 7795 \fi 7796} 7797 7798% @xrefautosectiontitle on|off says whether @section(ing) names are used 7799% automatically in xrefs, if the third arg is not explicitly specified. 7800% This was provided as a "secret" @set xref-automatic-section-title 7801% variable, now it's official. 7802% 7803\parseargdef\xrefautomaticsectiontitle{% 7804 \def\temp{#1}% 7805 \ifx\temp\onword 7806 \expandafter\let\csname SETxref-automatic-section-title\endcsname 7807 = \empty 7808 \else\ifx\temp\offword 7809 \expandafter\let\csname SETxref-automatic-section-title\endcsname 7810 = \relax 7811 \else 7812 \errhelp = \EMsimple 7813 \errmessage{Unknown @xrefautomaticsectiontitle value `\temp', 7814 must be on|off}% 7815 \fi\fi 7816} 7817 7818% 7819% @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is 7820% the node name, #2 the name of the Info cross-reference, #3 the printed 7821% node name, #4 the name of the Info file, #5 the name of the printed 7822% manual. All but the node name can be omitted. 7823% 7824\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]} 7825\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} 7826\def\ref#1{\xrefX[#1,,,,,,,]} 7827% 7828\newbox\toprefbox 7829\newbox\printedrefnamebox 7830\newbox\infofilenamebox 7831\newbox\printedmanualbox 7832% 7833\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup 7834 \unsepspaces 7835 % 7836 % Get args without leading/trailing spaces. 7837 \def\printedrefname{\ignorespaces #3}% 7838 \setbox\printedrefnamebox = \hbox{\printedrefname\unskip}% 7839 % 7840 \def\infofilename{\ignorespaces #4}% 7841 \setbox\infofilenamebox = \hbox{\infofilename\unskip}% 7842 % 7843 \def\printedmanual{\ignorespaces #5}% 7844 \setbox\printedmanualbox = \hbox{\printedmanual\unskip}% 7845 % 7846 % If the printed reference name (arg #3) was not explicitly given in 7847 % the @xref, figure out what we want to use. 7848 \ifdim \wd\printedrefnamebox = 0pt 7849 % No printed node name was explicitly given. 7850 \expandafter\ifx\csname SETxref-automatic-section-title\endcsname \relax 7851 % Not auto section-title: use node name inside the square brackets. 7852 \def\printedrefname{\ignorespaces #1}% 7853 \else 7854 % Auto section-title: use chapter/section title inside 7855 % the square brackets if we have it. 7856 \ifdim \wd\printedmanualbox > 0pt 7857 % It is in another manual, so we don't have it; use node name. 7858 \def\printedrefname{\ignorespaces #1}% 7859 \else 7860 \ifhavexrefs 7861 % We (should) know the real title if we have the xref values. 7862 \def\printedrefname{\refx{#1-title}{}}% 7863 \else 7864 % Otherwise just copy the Info node name. 7865 \def\printedrefname{\ignorespaces #1}% 7866 \fi% 7867 \fi 7868 \fi 7869 \fi 7870 % 7871 % Make link in pdf output. 7872 \ifpdf 7873 {\indexnofonts 7874 \turnoffactive 7875 \makevalueexpandable 7876 % This expands tokens, so do it after making catcode changes, so _ 7877 % etc. don't get their TeX definitions. This ignores all spaces in 7878 % #4, including (wrongly) those in the middle of the filename. 7879 \getfilename{#4}% 7880 % 7881 % This (wrongly) does not take account of leading or trailing 7882 % spaces in #1, which should be ignored. 7883 \edef\pdfxrefdest{#1}% 7884 \ifx\pdfxrefdest\empty 7885 \def\pdfxrefdest{Top}% no empty targets 7886 \else 7887 \txiescapepdf\pdfxrefdest % escape PDF special chars 7888 \fi 7889 % 7890 \leavevmode 7891 \startlink attr{/Border [0 0 0]}% 7892 \ifnum\filenamelength>0 7893 goto file{\the\filename.pdf} name{\pdfxrefdest}% 7894 \else 7895 goto name{\pdfmkpgn{\pdfxrefdest}}% 7896 \fi 7897 }% 7898 \setcolor{\linkcolor}% 7899 \fi 7900 % 7901 % Float references are printed completely differently: "Figure 1.2" 7902 % instead of "[somenode], p.3". We distinguish them by the 7903 % LABEL-title being set to a magic string. 7904 {% 7905 % Have to otherify everything special to allow the \csname to 7906 % include an _ in the xref name, etc. 7907 \indexnofonts 7908 \turnoffactive 7909 \expandafter\global\expandafter\let\expandafter\Xthisreftitle 7910 \csname XR#1-title\endcsname 7911 }% 7912 \iffloat\Xthisreftitle 7913 % If the user specified the print name (third arg) to the ref, 7914 % print it instead of our usual "Figure 1.2". 7915 \ifdim\wd\printedrefnamebox = 0pt 7916 \refx{#1-snt}{}% 7917 \else 7918 \printedrefname 7919 \fi 7920 % 7921 % If the user also gave the printed manual name (fifth arg), append 7922 % "in MANUALNAME". 7923 \ifdim \wd\printedmanualbox > 0pt 7924 \space \putwordin{} \cite{\printedmanual}% 7925 \fi 7926 \else 7927 % node/anchor (non-float) references. 7928 % 7929 % If we use \unhbox to print the node names, TeX does not insert 7930 % empty discretionaries after hyphens, which means that it will not 7931 % find a line break at a hyphen in a node names. Since some manuals 7932 % are best written with fairly long node names, containing hyphens, 7933 % this is a loss. Therefore, we give the text of the node name 7934 % again, so it is as if TeX is seeing it for the first time. 7935 % 7936 \ifdim \wd\printedmanualbox > 0pt 7937 % Cross-manual reference with a printed manual name. 7938 % 7939 \crossmanualxref{\cite{\printedmanual\unskip}}% 7940 % 7941 \else\ifdim \wd\infofilenamebox > 0pt 7942 % Cross-manual reference with only an info filename (arg 4), no 7943 % printed manual name (arg 5). This is essentially the same as 7944 % the case above; we output the filename, since we have nothing else. 7945 % 7946 \crossmanualxref{\code{\infofilename\unskip}}% 7947 % 7948 \else 7949 % Reference within this manual. 7950 % 7951 % _ (for example) has to be the character _ for the purposes of the 7952 % control sequence corresponding to the node, but it has to expand 7953 % into the usual \leavevmode...\vrule stuff for purposes of 7954 % printing. So we \turnoffactive for the \refx-snt, back on for the 7955 % printing, back off for the \refx-pg. 7956 {\turnoffactive 7957 % Only output a following space if the -snt ref is nonempty; for 7958 % @unnumbered and @anchor, it won't be. 7959 \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}% 7960 \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi 7961 }% 7962 % output the `[mynode]' via the macro below so it can be overridden. 7963 \xrefprintnodename\printedrefname 7964 % 7965 % But we always want a comma and a space: 7966 ,\space 7967 % 7968 % output the `page 3'. 7969 \turnoffactive \putwordpage\tie\refx{#1-pg}{}% 7970 \fi\fi 7971 \fi 7972 \endlink 7973\endgroup} 7974 7975% Output a cross-manual xref to #1. Used just above (twice). 7976% 7977% Only include the text "Section ``foo'' in" if the foo is neither 7978% missing or Top. Thus, @xref{,,,foo,The Foo Manual} outputs simply 7979% "see The Foo Manual", the idea being to refer to the whole manual. 7980% 7981% But, this being TeX, we can't easily compare our node name against the 7982% string "Top" while ignoring the possible spaces before and after in 7983% the input. By adding the arbitrary 7sp below, we make it much less 7984% likely that a real node name would have the same width as "Top" (e.g., 7985% in a monospaced font). Hopefully it will never happen in practice. 7986% 7987% For the same basic reason, we retypeset the "Top" at every 7988% reference, since the current font is indeterminate. 7989% 7990\def\crossmanualxref#1{% 7991 \setbox\toprefbox = \hbox{Top\kern7sp}% 7992 \setbox2 = \hbox{\ignorespaces \printedrefname \unskip \kern7sp}% 7993 \ifdim \wd2 > 7sp % nonempty? 7994 \ifdim \wd2 = \wd\toprefbox \else % same as Top? 7995 \putwordSection{} ``\printedrefname'' \putwordin{}\space 7996 \fi 7997 \fi 7998 #1% 7999} 8000 8001% This macro is called from \xrefX for the `[nodename]' part of xref 8002% output. It's a separate macro only so it can be changed more easily, 8003% since square brackets don't work well in some documents. Particularly 8004% one that Bob is working on :). 8005% 8006\def\xrefprintnodename#1{[#1]} 8007 8008% Things referred to by \setref. 8009% 8010\def\Ynothing{} 8011\def\Yomitfromtoc{} 8012\def\Ynumbered{% 8013 \ifnum\secno=0 8014 \putwordChapter@tie \the\chapno 8015 \else \ifnum\subsecno=0 8016 \putwordSection@tie \the\chapno.\the\secno 8017 \else \ifnum\subsubsecno=0 8018 \putwordSection@tie \the\chapno.\the\secno.\the\subsecno 8019 \else 8020 \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno 8021 \fi\fi\fi 8022} 8023\def\Yappendix{% 8024 \ifnum\secno=0 8025 \putwordAppendix@tie @char\the\appendixno{}% 8026 \else \ifnum\subsecno=0 8027 \putwordSection@tie @char\the\appendixno.\the\secno 8028 \else \ifnum\subsubsecno=0 8029 \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno 8030 \else 8031 \putwordSection@tie 8032 @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno 8033 \fi\fi\fi 8034} 8035 8036% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME. 8037% If its value is nonempty, SUFFIX is output afterward. 8038% 8039\def\refx#1#2{% 8040 {% 8041 \indexnofonts 8042 \otherbackslash 8043 \expandafter\global\expandafter\let\expandafter\thisrefX 8044 \csname XR#1\endcsname 8045 }% 8046 \ifx\thisrefX\relax 8047 % If not defined, say something at least. 8048 \angleleft un\-de\-fined\angleright 8049 \iflinks 8050 \ifhavexrefs 8051 {\toks0 = {#1}% avoid expansion of possibly-complex value 8052 \message{\linenumber Undefined cross reference `\the\toks0'.}}% 8053 \else 8054 \ifwarnedxrefs\else 8055 \global\warnedxrefstrue 8056 \message{Cross reference values unknown; you must run TeX again.}% 8057 \fi 8058 \fi 8059 \fi 8060 \else 8061 % It's defined, so just use it. 8062 \thisrefX 8063 \fi 8064 #2% Output the suffix in any case. 8065} 8066 8067% This is the macro invoked by entries in the aux file. Usually it's 8068% just a \def (we prepend XR to the control sequence name to avoid 8069% collisions). But if this is a float type, we have more work to do. 8070% 8071\def\xrdef#1#2{% 8072 {% The node name might contain 8-bit characters, which in our current 8073 % implementation are changed to commands like @'e. Don't let these 8074 % mess up the control sequence name. 8075 \indexnofonts 8076 \turnoffactive 8077 \xdef\safexrefname{#1}% 8078 }% 8079 % 8080 \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% remember this xref 8081 % 8082 % Was that xref control sequence that we just defined for a float? 8083 \expandafter\iffloat\csname XR\safexrefname\endcsname 8084 % it was a float, and we have the (safe) float type in \iffloattype. 8085 \expandafter\let\expandafter\floatlist 8086 \csname floatlist\iffloattype\endcsname 8087 % 8088 % Is this the first time we've seen this float type? 8089 \expandafter\ifx\floatlist\relax 8090 \toks0 = {\do}% yes, so just \do 8091 \else 8092 % had it before, so preserve previous elements in list. 8093 \toks0 = \expandafter{\floatlist\do}% 8094 \fi 8095 % 8096 % Remember this xref in the control sequence \floatlistFLOATTYPE, 8097 % for later use in \listoffloats. 8098 \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0 8099 {\safexrefname}}% 8100 \fi 8101} 8102 8103% Read the last existing aux file, if any. No error if none exists. 8104% 8105\def\tryauxfile{% 8106 \openin 1 \jobname.aux 8107 \ifeof 1 \else 8108 \readdatafile{aux}% 8109 \global\havexrefstrue 8110 \fi 8111 \closein 1 8112} 8113 8114\def\setupdatafile{% 8115 \catcode`\^^@=\other 8116 \catcode`\^^A=\other 8117 \catcode`\^^B=\other 8118 \catcode`\^^C=\other 8119 \catcode`\^^D=\other 8120 \catcode`\^^E=\other 8121 \catcode`\^^F=\other 8122 \catcode`\^^G=\other 8123 \catcode`\^^H=\other 8124 \catcode`\^^K=\other 8125 \catcode`\^^L=\other 8126 \catcode`\^^N=\other 8127 \catcode`\^^P=\other 8128 \catcode`\^^Q=\other 8129 \catcode`\^^R=\other 8130 \catcode`\^^S=\other 8131 \catcode`\^^T=\other 8132 \catcode`\^^U=\other 8133 \catcode`\^^V=\other 8134 \catcode`\^^W=\other 8135 \catcode`\^^X=\other 8136 \catcode`\^^Z=\other 8137 \catcode`\^^[=\other 8138 \catcode`\^^\=\other 8139 \catcode`\^^]=\other 8140 \catcode`\^^^=\other 8141 \catcode`\^^_=\other 8142 % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc. 8143 % in xref tags, i.e., node names. But since ^^e4 notation isn't 8144 % supported in the main text, it doesn't seem desirable. Furthermore, 8145 % that is not enough: for node names that actually contain a ^ 8146 % character, we would end up writing a line like this: 'xrdef {'hat 8147 % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first 8148 % argument, and \hat is not an expandable control sequence. It could 8149 % all be worked out, but why? Either we support ^^ or we don't. 8150 % 8151 % The other change necessary for this was to define \auxhat: 8152 % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter 8153 % and then to call \auxhat in \setq. 8154 % 8155 \catcode`\^=\other 8156 % 8157 % Special characters. Should be turned off anyway, but... 8158 \catcode`\~=\other 8159 \catcode`\[=\other 8160 \catcode`\]=\other 8161 \catcode`\"=\other 8162 \catcode`\_=\other 8163 \catcode`\|=\other 8164 \catcode`\<=\other 8165 \catcode`\>=\other 8166 \catcode`\$=\other 8167 \catcode`\#=\other 8168 \catcode`\&=\other 8169 \catcode`\%=\other 8170 \catcode`+=\other % avoid \+ for paranoia even though we've turned it off 8171 % 8172 % This is to support \ in node names and titles, since the \ 8173 % characters end up in a \csname. It's easier than 8174 % leaving it active and making its active definition an actual \ 8175 % character. What I don't understand is why it works in the *value* 8176 % of the xrdef. Seems like it should be a catcode12 \, and that 8177 % should not typeset properly. But it works, so I'm moving on for 8178 % now. --karl, 15jan04. 8179 \catcode`\\=\other 8180 % 8181 % Make the characters 128-255 be printing characters. 8182 {% 8183 \count1=128 8184 \def\loop{% 8185 \catcode\count1=\other 8186 \advance\count1 by 1 8187 \ifnum \count1<256 \loop \fi 8188 }% 8189 }% 8190 % 8191 % @ is our escape character in .aux files, and we need braces. 8192 \catcode`\{=1 8193 \catcode`\}=2 8194 \catcode`\@=0 8195} 8196 8197\def\readdatafile#1{% 8198\begingroup 8199 \setupdatafile 8200 \input\jobname.#1 8201\endgroup} 8202 8203 8204\message{insertions,} 8205% including footnotes. 8206 8207\newcount \footnoteno 8208 8209% The trailing space in the following definition for supereject is 8210% vital for proper filling; pages come out unaligned when you do a 8211% pagealignmacro call if that space before the closing brace is 8212% removed. (Generally, numeric constants should always be followed by a 8213% space to prevent strange expansion errors.) 8214\def\supereject{\par\penalty -20000\footnoteno =0 } 8215 8216% @footnotestyle is meaningful for Info output only. 8217\let\footnotestyle=\comment 8218 8219{\catcode `\@=11 8220% 8221% Auto-number footnotes. Otherwise like plain. 8222\gdef\footnote{% 8223 \let\indent=\ptexindent 8224 \let\noindent=\ptexnoindent 8225 \global\advance\footnoteno by \@ne 8226 \edef\thisfootno{$^{\the\footnoteno}$}% 8227 % 8228 % In case the footnote comes at the end of a sentence, preserve the 8229 % extra spacing after we do the footnote number. 8230 \let\@sf\empty 8231 \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi 8232 % 8233 % Remove inadvertent blank space before typesetting the footnote number. 8234 \unskip 8235 \thisfootno\@sf 8236 \dofootnote 8237}% 8238 8239% Don't bother with the trickery in plain.tex to not require the 8240% footnote text as a parameter. Our footnotes don't need to be so general. 8241% 8242% Oh yes, they do; otherwise, @ifset (and anything else that uses 8243% \parseargline) fails inside footnotes because the tokens are fixed when 8244% the footnote is read. --karl, 16nov96. 8245% 8246\gdef\dofootnote{% 8247 \insert\footins\bgroup 8248 % We want to typeset this text as a normal paragraph, even if the 8249 % footnote reference occurs in (for example) a display environment. 8250 % So reset some parameters. 8251 \hsize=\pagewidth 8252 \interlinepenalty\interfootnotelinepenalty 8253 \splittopskip\ht\strutbox % top baseline for broken footnotes 8254 \splitmaxdepth\dp\strutbox 8255 \floatingpenalty\@MM 8256 \leftskip\z@skip 8257 \rightskip\z@skip 8258 \spaceskip\z@skip 8259 \xspaceskip\z@skip 8260 \parindent\defaultparindent 8261 % 8262 \smallfonts \rm 8263 % 8264 % Because we use hanging indentation in footnotes, a @noindent appears 8265 % to exdent this text, so make it be a no-op. makeinfo does not use 8266 % hanging indentation so @noindent can still be needed within footnote 8267 % text after an @example or the like (not that this is good style). 8268 \let\noindent = \relax 8269 % 8270 % Hang the footnote text off the number. Use \everypar in case the 8271 % footnote extends for more than one paragraph. 8272 \everypar = {\hang}% 8273 \textindent{\thisfootno}% 8274 % 8275 % Don't crash into the line above the footnote text. Since this 8276 % expands into a box, it must come within the paragraph, lest it 8277 % provide a place where TeX can split the footnote. 8278 \footstrut 8279 % 8280 % Invoke rest of plain TeX footnote routine. 8281 \futurelet\next\fo@t 8282} 8283}%end \catcode `\@=11 8284 8285% In case a @footnote appears in a vbox, save the footnote text and create 8286% the real \insert just after the vbox finished. Otherwise, the insertion 8287% would be lost. 8288% Similarly, if a @footnote appears inside an alignment, save the footnote 8289% text to a box and make the \insert when a row of the table is finished. 8290% And the same can be done for other insert classes. --kasal, 16nov03. 8291 8292% Replace the \insert primitive by a cheating macro. 8293% Deeper inside, just make sure that the saved insertions are not spilled 8294% out prematurely. 8295% 8296\def\startsavinginserts{% 8297 \ifx \insert\ptexinsert 8298 \let\insert\saveinsert 8299 \else 8300 \let\checkinserts\relax 8301 \fi 8302} 8303 8304% This \insert replacement works for both \insert\footins{foo} and 8305% \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}. 8306% 8307\def\saveinsert#1{% 8308 \edef\next{\noexpand\savetobox \makeSAVEname#1}% 8309 \afterassignment\next 8310 % swallow the left brace 8311 \let\temp = 8312} 8313\def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}} 8314\def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1} 8315 8316\def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi} 8317 8318\def\placesaveins#1{% 8319 \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname 8320 {\box#1}% 8321} 8322 8323% eat @SAVE -- beware, all of them have catcode \other: 8324{ 8325 \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-) 8326 \gdef\gobblesave @SAVE{} 8327} 8328 8329% initialization: 8330\def\newsaveins #1{% 8331 \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}% 8332 \next 8333} 8334\def\newsaveinsX #1{% 8335 \csname newbox\endcsname #1% 8336 \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts 8337 \checksaveins #1}% 8338} 8339 8340% initialize: 8341\let\checkinserts\empty 8342\newsaveins\footins 8343\newsaveins\margin 8344 8345 8346% @image. We use the macros from epsf.tex to support this. 8347% If epsf.tex is not installed and @image is used, we complain. 8348% 8349% Check for and read epsf.tex up front. If we read it only at @image 8350% time, we might be inside a group, and then its definitions would get 8351% undone and the next image would fail. 8352\openin 1 = epsf.tex 8353\ifeof 1 \else 8354 % Do not bother showing banner with epsf.tex v2.7k (available in 8355 % doc/epsf.tex and on ctan). 8356 \def\epsfannounce{\toks0 = }% 8357 \input epsf.tex 8358\fi 8359\closein 1 8360% 8361% We will only complain once about lack of epsf.tex. 8362\newif\ifwarnednoepsf 8363\newhelp\noepsfhelp{epsf.tex must be installed for images to 8364 work. It is also included in the Texinfo distribution, or you can get 8365 it from ftp://tug.org/tex/epsf.tex.} 8366% 8367\def\image#1{% 8368 \ifx\epsfbox\thisisundefined 8369 \ifwarnednoepsf \else 8370 \errhelp = \noepsfhelp 8371 \errmessage{epsf.tex not found, images will be ignored}% 8372 \global\warnednoepsftrue 8373 \fi 8374 \else 8375 \imagexxx #1,,,,,\finish 8376 \fi 8377} 8378% 8379% Arguments to @image: 8380% #1 is (mandatory) image filename; we tack on .eps extension. 8381% #2 is (optional) width, #3 is (optional) height. 8382% #4 is (ignored optional) html alt text. 8383% #5 is (ignored optional) extension. 8384% #6 is just the usual extra ignored arg for parsing stuff. 8385\newif\ifimagevmode 8386\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup 8387 \catcode`\^^M = 5 % in case we're inside an example 8388 \normalturnoffactive % allow _ et al. in names 8389 % If the image is by itself, center it. 8390 \ifvmode 8391 \imagevmodetrue 8392 \else \ifx\centersub\centerV 8393 % for @center @image, we need a vbox so we can have our vertical space 8394 \imagevmodetrue 8395 \vbox\bgroup % vbox has better behavior than vtop herev 8396 \fi\fi 8397 % 8398 \ifimagevmode 8399 \nobreak\medskip 8400 % Usually we'll have text after the image which will insert 8401 % \parskip glue, so insert it here too to equalize the space 8402 % above and below. 8403 \nobreak\vskip\parskip 8404 \nobreak 8405 \fi 8406 % 8407 % Leave vertical mode so that indentation from an enclosing 8408 % environment such as @quotation is respected. 8409 % However, if we're at the top level, we don't want the 8410 % normal paragraph indentation. 8411 % On the other hand, if we are in the case of @center @image, we don't 8412 % want to start a paragraph, which will create a hsize-width box and 8413 % eradicate the centering. 8414 \ifx\centersub\centerV\else \noindent \fi 8415 % 8416 % Output the image. 8417 \ifpdf 8418 \dopdfimage{#1}{#2}{#3}% 8419 \else 8420 % \epsfbox itself resets \epsf?size at each figure. 8421 \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi 8422 \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi 8423 \epsfbox{#1.eps}% 8424 \fi 8425 % 8426 \ifimagevmode 8427 \medskip % space after a standalone image 8428 \fi 8429 \ifx\centersub\centerV \egroup \fi 8430\endgroup} 8431 8432 8433% @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables, 8434% etc. We don't actually implement floating yet, we always include the 8435% float "here". But it seemed the best name for the future. 8436% 8437\envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish} 8438 8439% There may be a space before second and/or third parameter; delete it. 8440\def\eatcommaspace#1, {#1,} 8441 8442% #1 is the optional FLOATTYPE, the text label for this float, typically 8443% "Figure", "Table", "Example", etc. Can't contain commas. If omitted, 8444% this float will not be numbered and cannot be referred to. 8445% 8446% #2 is the optional xref label. Also must be present for the float to 8447% be referable. 8448% 8449% #3 is the optional positioning argument; for now, it is ignored. It 8450% will somehow specify the positions allowed to float to (here, top, bottom). 8451% 8452% We keep a separate counter for each FLOATTYPE, which we reset at each 8453% chapter-level command. 8454\let\resetallfloatnos=\empty 8455% 8456\def\dofloat#1,#2,#3,#4\finish{% 8457 \let\thiscaption=\empty 8458 \let\thisshortcaption=\empty 8459 % 8460 % don't lose footnotes inside @float. 8461 % 8462 % BEWARE: when the floats start float, we have to issue warning whenever an 8463 % insert appears inside a float which could possibly float. --kasal, 26may04 8464 % 8465 \startsavinginserts 8466 % 8467 % We can't be used inside a paragraph. 8468 \par 8469 % 8470 \vtop\bgroup 8471 \def\floattype{#1}% 8472 \def\floatlabel{#2}% 8473 \def\floatloc{#3}% we do nothing with this yet. 8474 % 8475 \ifx\floattype\empty 8476 \let\safefloattype=\empty 8477 \else 8478 {% 8479 % the floattype might have accents or other special characters, 8480 % but we need to use it in a control sequence name. 8481 \indexnofonts 8482 \turnoffactive 8483 \xdef\safefloattype{\floattype}% 8484 }% 8485 \fi 8486 % 8487 % If label is given but no type, we handle that as the empty type. 8488 \ifx\floatlabel\empty \else 8489 % We want each FLOATTYPE to be numbered separately (Figure 1, 8490 % Table 1, Figure 2, ...). (And if no label, no number.) 8491 % 8492 \expandafter\getfloatno\csname\safefloattype floatno\endcsname 8493 \global\advance\floatno by 1 8494 % 8495 {% 8496 % This magic value for \lastsection is output by \setref as the 8497 % XREFLABEL-title value. \xrefX uses it to distinguish float 8498 % labels (which have a completely different output format) from 8499 % node and anchor labels. And \xrdef uses it to construct the 8500 % lists of floats. 8501 % 8502 \edef\lastsection{\floatmagic=\safefloattype}% 8503 \setref{\floatlabel}{Yfloat}% 8504 }% 8505 \fi 8506 % 8507 % start with \parskip glue, I guess. 8508 \vskip\parskip 8509 % 8510 % Don't suppress indentation if a float happens to start a section. 8511 \restorefirstparagraphindent 8512} 8513 8514% we have these possibilities: 8515% @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap 8516% @float Foo,lbl & no caption: Foo 1.1 8517% @float Foo & @caption{Cap}: Foo: Cap 8518% @float Foo & no caption: Foo 8519% @float ,lbl & Caption{Cap}: 1.1: Cap 8520% @float ,lbl & no caption: 1.1 8521% @float & @caption{Cap}: Cap 8522% @float & no caption: 8523% 8524\def\Efloat{% 8525 \let\floatident = \empty 8526 % 8527 % In all cases, if we have a float type, it comes first. 8528 \ifx\floattype\empty \else \def\floatident{\floattype}\fi 8529 % 8530 % If we have an xref label, the number comes next. 8531 \ifx\floatlabel\empty \else 8532 \ifx\floattype\empty \else % if also had float type, need tie first. 8533 \appendtomacro\floatident{\tie}% 8534 \fi 8535 % the number. 8536 \appendtomacro\floatident{\chaplevelprefix\the\floatno}% 8537 \fi 8538 % 8539 % Start the printed caption with what we've constructed in 8540 % \floatident, but keep it separate; we need \floatident again. 8541 \let\captionline = \floatident 8542 % 8543 \ifx\thiscaption\empty \else 8544 \ifx\floatident\empty \else 8545 \appendtomacro\captionline{: }% had ident, so need a colon between 8546 \fi 8547 % 8548 % caption text. 8549 \appendtomacro\captionline{\scanexp\thiscaption}% 8550 \fi 8551 % 8552 % If we have anything to print, print it, with space before. 8553 % Eventually this needs to become an \insert. 8554 \ifx\captionline\empty \else 8555 \vskip.5\parskip 8556 \captionline 8557 % 8558 % Space below caption. 8559 \vskip\parskip 8560 \fi 8561 % 8562 % If have an xref label, write the list of floats info. Do this 8563 % after the caption, to avoid chance of it being a breakpoint. 8564 \ifx\floatlabel\empty \else 8565 % Write the text that goes in the lof to the aux file as 8566 % \floatlabel-lof. Besides \floatident, we include the short 8567 % caption if specified, else the full caption if specified, else nothing. 8568 {% 8569 \atdummies 8570 % 8571 % since we read the caption text in the macro world, where ^^M 8572 % is turned into a normal character, we have to scan it back, so 8573 % we don't write the literal three characters "^^M" into the aux file. 8574 \scanexp{% 8575 \xdef\noexpand\gtemp{% 8576 \ifx\thisshortcaption\empty 8577 \thiscaption 8578 \else 8579 \thisshortcaption 8580 \fi 8581 }% 8582 }% 8583 \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident 8584 \ifx\gtemp\empty \else : \gtemp \fi}}% 8585 }% 8586 \fi 8587 \egroup % end of \vtop 8588 % 8589 % place the captured inserts 8590 % 8591 % BEWARE: when the floats start floating, we have to issue warning 8592 % whenever an insert appears inside a float which could possibly 8593 % float. --kasal, 26may04 8594 % 8595 \checkinserts 8596} 8597 8598% Append the tokens #2 to the definition of macro #1, not expanding either. 8599% 8600\def\appendtomacro#1#2{% 8601 \expandafter\def\expandafter#1\expandafter{#1#2}% 8602} 8603 8604% @caption, @shortcaption 8605% 8606\def\caption{\docaption\thiscaption} 8607\def\shortcaption{\docaption\thisshortcaption} 8608\def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption} 8609\def\defcaption#1#2{\egroup \def#1{#2}} 8610 8611% The parameter is the control sequence identifying the counter we are 8612% going to use. Create it if it doesn't exist and assign it to \floatno. 8613\def\getfloatno#1{% 8614 \ifx#1\relax 8615 % Haven't seen this figure type before. 8616 \csname newcount\endcsname #1% 8617 % 8618 % Remember to reset this floatno at the next chap. 8619 \expandafter\gdef\expandafter\resetallfloatnos 8620 \expandafter{\resetallfloatnos #1=0 }% 8621 \fi 8622 \let\floatno#1% 8623} 8624 8625% \setref calls this to get the XREFLABEL-snt value. We want an @xref 8626% to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we 8627% first read the @float command. 8628% 8629\def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}% 8630 8631% Magic string used for the XREFLABEL-title value, so \xrefX can 8632% distinguish floats from other xref types. 8633\def\floatmagic{!!float!!} 8634 8635% #1 is the control sequence we are passed; we expand into a conditional 8636% which is true if #1 represents a float ref. That is, the magic 8637% \lastsection value which we \setref above. 8638% 8639\def\iffloat#1{\expandafter\doiffloat#1==\finish} 8640% 8641% #1 is (maybe) the \floatmagic string. If so, #2 will be the 8642% (safe) float type for this float. We set \iffloattype to #2. 8643% 8644\def\doiffloat#1=#2=#3\finish{% 8645 \def\temp{#1}% 8646 \def\iffloattype{#2}% 8647 \ifx\temp\floatmagic 8648} 8649 8650% @listoffloats FLOATTYPE - print a list of floats like a table of contents. 8651% 8652\parseargdef\listoffloats{% 8653 \def\floattype{#1}% floattype 8654 {% 8655 % the floattype might have accents or other special characters, 8656 % but we need to use it in a control sequence name. 8657 \indexnofonts 8658 \turnoffactive 8659 \xdef\safefloattype{\floattype}% 8660 }% 8661 % 8662 % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE. 8663 \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax 8664 \ifhavexrefs 8665 % if the user said @listoffloats foo but never @float foo. 8666 \message{\linenumber No `\safefloattype' floats to list.}% 8667 \fi 8668 \else 8669 \begingroup 8670 \leftskip=\tocindent % indent these entries like a toc 8671 \let\do=\listoffloatsdo 8672 \csname floatlist\safefloattype\endcsname 8673 \endgroup 8674 \fi 8675} 8676 8677% This is called on each entry in a list of floats. We're passed the 8678% xref label, in the form LABEL-title, which is how we save it in the 8679% aux file. We strip off the -title and look up \XRLABEL-lof, which 8680% has the text we're supposed to typeset here. 8681% 8682% Figures without xref labels will not be included in the list (since 8683% they won't appear in the aux file). 8684% 8685\def\listoffloatsdo#1{\listoffloatsdoentry#1\finish} 8686\def\listoffloatsdoentry#1-title\finish{{% 8687 % Can't fully expand XR#1-lof because it can contain anything. Just 8688 % pass the control sequence. On the other hand, XR#1-pg is just the 8689 % page number, and we want to fully expand that so we can get a link 8690 % in pdf output. 8691 \toksA = \expandafter{\csname XR#1-lof\endcsname}% 8692 % 8693 % use the same \entry macro we use to generate the TOC and index. 8694 \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}% 8695 \writeentry 8696}} 8697 8698 8699\message{localization,} 8700 8701% For single-language documents, @documentlanguage is usually given very 8702% early, just after @documentencoding. Single argument is the language 8703% (de) or locale (de_DE) abbreviation. 8704% 8705{ 8706 \catcode`\_ = \active 8707 \globaldefs=1 8708\parseargdef\documentlanguage{\begingroup 8709 \let_=\normalunderscore % normal _ character for filenames 8710 \tex % read txi-??.tex file in plain TeX. 8711 % Read the file by the name they passed if it exists. 8712 \openin 1 txi-#1.tex 8713 \ifeof 1 8714 \documentlanguagetrywithoutunderscore{#1_\finish}% 8715 \else 8716 \globaldefs = 1 % everything in the txi-LL files needs to persist 8717 \input txi-#1.tex 8718 \fi 8719 \closein 1 8720 \endgroup % end raw TeX 8721\endgroup} 8722% 8723% If they passed de_DE, and txi-de_DE.tex doesn't exist, 8724% try txi-de.tex. 8725% 8726\gdef\documentlanguagetrywithoutunderscore#1_#2\finish{% 8727 \openin 1 txi-#1.tex 8728 \ifeof 1 8729 \errhelp = \nolanghelp 8730 \errmessage{Cannot read language file txi-#1.tex}% 8731 \else 8732 \globaldefs = 1 % everything in the txi-LL files needs to persist 8733 \input txi-#1.tex 8734 \fi 8735 \closein 1 8736} 8737}% end of special _ catcode 8738% 8739\newhelp\nolanghelp{The given language definition file cannot be found or 8740is empty. Maybe you need to install it? Putting it in the current 8741directory should work if nowhere else does.} 8742 8743% This macro is called from txi-??.tex files; the first argument is the 8744% \language name to set (without the "\lang@" prefix), the second and 8745% third args are \{left,right}hyphenmin. 8746% 8747% The language names to pass are determined when the format is built. 8748% See the etex.log file created at that time, e.g., 8749% /usr/local/texlive/2008/texmf-var/web2c/pdftex/etex.log. 8750% 8751% With TeX Live 2008, etex now includes hyphenation patterns for all 8752% available languages. This means we can support hyphenation in 8753% Texinfo, at least to some extent. (This still doesn't solve the 8754% accented characters problem.) 8755% 8756\catcode`@=11 8757\def\txisetlanguage#1#2#3{% 8758 % do not set the language if the name is undefined in the current TeX. 8759 \expandafter\ifx\csname lang@#1\endcsname \relax 8760 \message{no patterns for #1}% 8761 \else 8762 \global\language = \csname lang@#1\endcsname 8763 \fi 8764 % but there is no harm in adjusting the hyphenmin values regardless. 8765 \global\lefthyphenmin = #2\relax 8766 \global\righthyphenmin = #3\relax 8767} 8768 8769% Helpers for encodings. 8770% Set the catcode of characters 128 through 255 to the specified number. 8771% 8772\def\setnonasciicharscatcode#1{% 8773 \count255=128 8774 \loop\ifnum\count255<256 8775 \global\catcode\count255=#1\relax 8776 \advance\count255 by 1 8777 \repeat 8778} 8779 8780\def\setnonasciicharscatcodenonglobal#1{% 8781 \count255=128 8782 \loop\ifnum\count255<256 8783 \catcode\count255=#1\relax 8784 \advance\count255 by 1 8785 \repeat 8786} 8787 8788% @documentencoding sets the definition of non-ASCII characters 8789% according to the specified encoding. 8790% 8791\parseargdef\documentencoding{% 8792 % Encoding being declared for the document. 8793 \def\declaredencoding{\csname #1.enc\endcsname}% 8794 % 8795 % Supported encodings: names converted to tokens in order to be able 8796 % to compare them with \ifx. 8797 \def\ascii{\csname US-ASCII.enc\endcsname}% 8798 \def\latnine{\csname ISO-8859-15.enc\endcsname}% 8799 \def\latone{\csname ISO-8859-1.enc\endcsname}% 8800 \def\lattwo{\csname ISO-8859-2.enc\endcsname}% 8801 \def\utfeight{\csname UTF-8.enc\endcsname}% 8802 % 8803 \ifx \declaredencoding \ascii 8804 \asciichardefs 8805 % 8806 \else \ifx \declaredencoding \lattwo 8807 \setnonasciicharscatcode\active 8808 \lattwochardefs 8809 % 8810 \else \ifx \declaredencoding \latone 8811 \setnonasciicharscatcode\active 8812 \latonechardefs 8813 % 8814 \else \ifx \declaredencoding \latnine 8815 \setnonasciicharscatcode\active 8816 \latninechardefs 8817 % 8818 \else \ifx \declaredencoding \utfeight 8819 \setnonasciicharscatcode\active 8820 \utfeightchardefs 8821 % 8822 \else 8823 \message{Unknown document encoding #1, ignoring.}% 8824 % 8825 \fi % utfeight 8826 \fi % latnine 8827 \fi % latone 8828 \fi % lattwo 8829 \fi % ascii 8830} 8831 8832% A message to be logged when using a character that isn't available 8833% the default font encoding (OT1). 8834% 8835\def\missingcharmsg#1{\message{Character missing in OT1 encoding: #1.}} 8836 8837% Take account of \c (plain) vs. \, (Texinfo) difference. 8838\def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi} 8839 8840% First, make active non-ASCII characters in order for them to be 8841% correctly categorized when TeX reads the replacement text of 8842% macros containing the character definitions. 8843\setnonasciicharscatcode\active 8844% 8845% Latin1 (ISO-8859-1) character definitions. 8846\def\latonechardefs{% 8847 \gdef^^a0{\tie} 8848 \gdef^^a1{\exclamdown} 8849 \gdef^^a2{\missingcharmsg{CENT SIGN}} 8850 \gdef^^a3{{\pounds}} 8851 \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} 8852 \gdef^^a5{\missingcharmsg{YEN SIGN}} 8853 \gdef^^a6{\missingcharmsg{BROKEN BAR}} 8854 \gdef^^a7{\S} 8855 \gdef^^a8{\"{}} 8856 \gdef^^a9{\copyright} 8857 \gdef^^aa{\ordf} 8858 \gdef^^ab{\guillemetleft} 8859 \gdef^^ac{$\lnot$} 8860 \gdef^^ad{\-} 8861 \gdef^^ae{\registeredsymbol} 8862 \gdef^^af{\={}} 8863 % 8864 \gdef^^b0{\textdegree} 8865 \gdef^^b1{$\pm$} 8866 \gdef^^b2{$^2$} 8867 \gdef^^b3{$^3$} 8868 \gdef^^b4{\'{}} 8869 \gdef^^b5{$\mu$} 8870 \gdef^^b6{\P} 8871 % 8872 \gdef^^b7{$^.$} 8873 \gdef^^b8{\cedilla\ } 8874 \gdef^^b9{$^1$} 8875 \gdef^^ba{\ordm} 8876 % 8877 \gdef^^bb{\guillemetright} 8878 \gdef^^bc{$1\over4$} 8879 \gdef^^bd{$1\over2$} 8880 \gdef^^be{$3\over4$} 8881 \gdef^^bf{\questiondown} 8882 % 8883 \gdef^^c0{\`A} 8884 \gdef^^c1{\'A} 8885 \gdef^^c2{\^A} 8886 \gdef^^c3{\~A} 8887 \gdef^^c4{\"A} 8888 \gdef^^c5{\ringaccent A} 8889 \gdef^^c6{\AE} 8890 \gdef^^c7{\cedilla C} 8891 \gdef^^c8{\`E} 8892 \gdef^^c9{\'E} 8893 \gdef^^ca{\^E} 8894 \gdef^^cb{\"E} 8895 \gdef^^cc{\`I} 8896 \gdef^^cd{\'I} 8897 \gdef^^ce{\^I} 8898 \gdef^^cf{\"I} 8899 % 8900 \gdef^^d0{\DH} 8901 \gdef^^d1{\~N} 8902 \gdef^^d2{\`O} 8903 \gdef^^d3{\'O} 8904 \gdef^^d4{\^O} 8905 \gdef^^d5{\~O} 8906 \gdef^^d6{\"O} 8907 \gdef^^d7{$\times$} 8908 \gdef^^d8{\O} 8909 \gdef^^d9{\`U} 8910 \gdef^^da{\'U} 8911 \gdef^^db{\^U} 8912 \gdef^^dc{\"U} 8913 \gdef^^dd{\'Y} 8914 \gdef^^de{\TH} 8915 \gdef^^df{\ss} 8916 % 8917 \gdef^^e0{\`a} 8918 \gdef^^e1{\'a} 8919 \gdef^^e2{\^a} 8920 \gdef^^e3{\~a} 8921 \gdef^^e4{\"a} 8922 \gdef^^e5{\ringaccent a} 8923 \gdef^^e6{\ae} 8924 \gdef^^e7{\cedilla c} 8925 \gdef^^e8{\`e} 8926 \gdef^^e9{\'e} 8927 \gdef^^ea{\^e} 8928 \gdef^^eb{\"e} 8929 \gdef^^ec{\`{\dotless i}} 8930 \gdef^^ed{\'{\dotless i}} 8931 \gdef^^ee{\^{\dotless i}} 8932 \gdef^^ef{\"{\dotless i}} 8933 % 8934 \gdef^^f0{\dh} 8935 \gdef^^f1{\~n} 8936 \gdef^^f2{\`o} 8937 \gdef^^f3{\'o} 8938 \gdef^^f4{\^o} 8939 \gdef^^f5{\~o} 8940 \gdef^^f6{\"o} 8941 \gdef^^f7{$\div$} 8942 \gdef^^f8{\o} 8943 \gdef^^f9{\`u} 8944 \gdef^^fa{\'u} 8945 \gdef^^fb{\^u} 8946 \gdef^^fc{\"u} 8947 \gdef^^fd{\'y} 8948 \gdef^^fe{\th} 8949 \gdef^^ff{\"y} 8950} 8951 8952% Latin9 (ISO-8859-15) encoding character definitions. 8953\def\latninechardefs{% 8954 % Encoding is almost identical to Latin1. 8955 \latonechardefs 8956 % 8957 \gdef^^a4{\euro} 8958 \gdef^^a6{\v S} 8959 \gdef^^a8{\v s} 8960 \gdef^^b4{\v Z} 8961 \gdef^^b8{\v z} 8962 \gdef^^bc{\OE} 8963 \gdef^^bd{\oe} 8964 \gdef^^be{\"Y} 8965} 8966 8967% Latin2 (ISO-8859-2) character definitions. 8968\def\lattwochardefs{% 8969 \gdef^^a0{\tie} 8970 \gdef^^a1{\ogonek{A}} 8971 \gdef^^a2{\u{}} 8972 \gdef^^a3{\L} 8973 \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} 8974 \gdef^^a5{\v L} 8975 \gdef^^a6{\'S} 8976 \gdef^^a7{\S} 8977 \gdef^^a8{\"{}} 8978 \gdef^^a9{\v S} 8979 \gdef^^aa{\cedilla S} 8980 \gdef^^ab{\v T} 8981 \gdef^^ac{\'Z} 8982 \gdef^^ad{\-} 8983 \gdef^^ae{\v Z} 8984 \gdef^^af{\dotaccent Z} 8985 % 8986 \gdef^^b0{\textdegree} 8987 \gdef^^b1{\ogonek{a}} 8988 \gdef^^b2{\ogonek{ }} 8989 \gdef^^b3{\l} 8990 \gdef^^b4{\'{}} 8991 \gdef^^b5{\v l} 8992 \gdef^^b6{\'s} 8993 \gdef^^b7{\v{}} 8994 \gdef^^b8{\cedilla\ } 8995 \gdef^^b9{\v s} 8996 \gdef^^ba{\cedilla s} 8997 \gdef^^bb{\v t} 8998 \gdef^^bc{\'z} 8999 \gdef^^bd{\H{}} 9000 \gdef^^be{\v z} 9001 \gdef^^bf{\dotaccent z} 9002 % 9003 \gdef^^c0{\'R} 9004 \gdef^^c1{\'A} 9005 \gdef^^c2{\^A} 9006 \gdef^^c3{\u A} 9007 \gdef^^c4{\"A} 9008 \gdef^^c5{\'L} 9009 \gdef^^c6{\'C} 9010 \gdef^^c7{\cedilla C} 9011 \gdef^^c8{\v C} 9012 \gdef^^c9{\'E} 9013 \gdef^^ca{\ogonek{E}} 9014 \gdef^^cb{\"E} 9015 \gdef^^cc{\v E} 9016 \gdef^^cd{\'I} 9017 \gdef^^ce{\^I} 9018 \gdef^^cf{\v D} 9019 % 9020 \gdef^^d0{\DH} 9021 \gdef^^d1{\'N} 9022 \gdef^^d2{\v N} 9023 \gdef^^d3{\'O} 9024 \gdef^^d4{\^O} 9025 \gdef^^d5{\H O} 9026 \gdef^^d6{\"O} 9027 \gdef^^d7{$\times$} 9028 \gdef^^d8{\v R} 9029 \gdef^^d9{\ringaccent U} 9030 \gdef^^da{\'U} 9031 \gdef^^db{\H U} 9032 \gdef^^dc{\"U} 9033 \gdef^^dd{\'Y} 9034 \gdef^^de{\cedilla T} 9035 \gdef^^df{\ss} 9036 % 9037 \gdef^^e0{\'r} 9038 \gdef^^e1{\'a} 9039 \gdef^^e2{\^a} 9040 \gdef^^e3{\u a} 9041 \gdef^^e4{\"a} 9042 \gdef^^e5{\'l} 9043 \gdef^^e6{\'c} 9044 \gdef^^e7{\cedilla c} 9045 \gdef^^e8{\v c} 9046 \gdef^^e9{\'e} 9047 \gdef^^ea{\ogonek{e}} 9048 \gdef^^eb{\"e} 9049 \gdef^^ec{\v e} 9050 \gdef^^ed{\'{\dotless{i}}} 9051 \gdef^^ee{\^{\dotless{i}}} 9052 \gdef^^ef{\v d} 9053 % 9054 \gdef^^f0{\dh} 9055 \gdef^^f1{\'n} 9056 \gdef^^f2{\v n} 9057 \gdef^^f3{\'o} 9058 \gdef^^f4{\^o} 9059 \gdef^^f5{\H o} 9060 \gdef^^f6{\"o} 9061 \gdef^^f7{$\div$} 9062 \gdef^^f8{\v r} 9063 \gdef^^f9{\ringaccent u} 9064 \gdef^^fa{\'u} 9065 \gdef^^fb{\H u} 9066 \gdef^^fc{\"u} 9067 \gdef^^fd{\'y} 9068 \gdef^^fe{\cedilla t} 9069 \gdef^^ff{\dotaccent{}} 9070} 9071 9072% UTF-8 character definitions. 9073% 9074% This code to support UTF-8 is based on LaTeX's utf8.def, with some 9075% changes for Texinfo conventions. It is included here under the GPL by 9076% permission from Frank Mittelbach and the LaTeX team. 9077% 9078\newcount\countUTFx 9079\newcount\countUTFy 9080\newcount\countUTFz 9081 9082\gdef\UTFviiiTwoOctets#1#2{\expandafter 9083 \UTFviiiDefined\csname u8:#1\string #2\endcsname} 9084% 9085\gdef\UTFviiiThreeOctets#1#2#3{\expandafter 9086 \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname} 9087% 9088\gdef\UTFviiiFourOctets#1#2#3#4{\expandafter 9089 \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname} 9090 9091\gdef\UTFviiiDefined#1{% 9092 \ifx #1\relax 9093 \message{\linenumber Unicode char \string #1 not defined for Texinfo}% 9094 \else 9095 \expandafter #1% 9096 \fi 9097} 9098 9099\begingroup 9100 \catcode`\~13 9101 \catcode`\"12 9102 9103 \def\UTFviiiLoop{% 9104 \global\catcode\countUTFx\active 9105 \uccode`\~\countUTFx 9106 \uppercase\expandafter{\UTFviiiTmp}% 9107 \advance\countUTFx by 1 9108 \ifnum\countUTFx < \countUTFy 9109 \expandafter\UTFviiiLoop 9110 \fi} 9111 9112 \countUTFx = "C2 9113 \countUTFy = "E0 9114 \def\UTFviiiTmp{% 9115 \xdef~{\noexpand\UTFviiiTwoOctets\string~}} 9116 \UTFviiiLoop 9117 9118 \countUTFx = "E0 9119 \countUTFy = "F0 9120 \def\UTFviiiTmp{% 9121 \xdef~{\noexpand\UTFviiiThreeOctets\string~}} 9122 \UTFviiiLoop 9123 9124 \countUTFx = "F0 9125 \countUTFy = "F4 9126 \def\UTFviiiTmp{% 9127 \xdef~{\noexpand\UTFviiiFourOctets\string~}} 9128 \UTFviiiLoop 9129\endgroup 9130 9131\begingroup 9132 \catcode`\"=12 9133 \catcode`\<=12 9134 \catcode`\.=12 9135 \catcode`\,=12 9136 \catcode`\;=12 9137 \catcode`\!=12 9138 \catcode`\~=13 9139 9140 \gdef\DeclareUnicodeCharacter#1#2{% 9141 \countUTFz = "#1\relax 9142 %\wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}% 9143 \begingroup 9144 \parseXMLCharref 9145 \def\UTFviiiTwoOctets##1##2{% 9146 \csname u8:##1\string ##2\endcsname}% 9147 \def\UTFviiiThreeOctets##1##2##3{% 9148 \csname u8:##1\string ##2\string ##3\endcsname}% 9149 \def\UTFviiiFourOctets##1##2##3##4{% 9150 \csname u8:##1\string ##2\string ##3\string ##4\endcsname}% 9151 \expandafter\expandafter\expandafter\expandafter 9152 \expandafter\expandafter\expandafter 9153 \gdef\UTFviiiTmp{#2}% 9154 \endgroup} 9155 9156 \gdef\parseXMLCharref{% 9157 \ifnum\countUTFz < "A0\relax 9158 \errhelp = \EMsimple 9159 \errmessage{Cannot define Unicode char value < 00A0}% 9160 \else\ifnum\countUTFz < "800\relax 9161 \parseUTFviiiA,% 9162 \parseUTFviiiB C\UTFviiiTwoOctets.,% 9163 \else\ifnum\countUTFz < "10000\relax 9164 \parseUTFviiiA;% 9165 \parseUTFviiiA,% 9166 \parseUTFviiiB E\UTFviiiThreeOctets.{,;}% 9167 \else 9168 \parseUTFviiiA;% 9169 \parseUTFviiiA,% 9170 \parseUTFviiiA!% 9171 \parseUTFviiiB F\UTFviiiFourOctets.{!,;}% 9172 \fi\fi\fi 9173 } 9174 9175 \gdef\parseUTFviiiA#1{% 9176 \countUTFx = \countUTFz 9177 \divide\countUTFz by 64 9178 \countUTFy = \countUTFz 9179 \multiply\countUTFz by 64 9180 \advance\countUTFx by -\countUTFz 9181 \advance\countUTFx by 128 9182 \uccode `#1\countUTFx 9183 \countUTFz = \countUTFy} 9184 9185 \gdef\parseUTFviiiB#1#2#3#4{% 9186 \advance\countUTFz by "#10\relax 9187 \uccode `#3\countUTFz 9188 \uppercase{\gdef\UTFviiiTmp{#2#3#4}}} 9189\endgroup 9190 9191\def\utfeightchardefs{% 9192 \DeclareUnicodeCharacter{00A0}{\tie} 9193 \DeclareUnicodeCharacter{00A1}{\exclamdown} 9194 \DeclareUnicodeCharacter{00A3}{\pounds} 9195 \DeclareUnicodeCharacter{00A8}{\"{ }} 9196 \DeclareUnicodeCharacter{00A9}{\copyright} 9197 \DeclareUnicodeCharacter{00AA}{\ordf} 9198 \DeclareUnicodeCharacter{00AB}{\guillemetleft} 9199 \DeclareUnicodeCharacter{00AD}{\-} 9200 \DeclareUnicodeCharacter{00AE}{\registeredsymbol} 9201 \DeclareUnicodeCharacter{00AF}{\={ }} 9202 9203 \DeclareUnicodeCharacter{00B0}{\ringaccent{ }} 9204 \DeclareUnicodeCharacter{00B4}{\'{ }} 9205 \DeclareUnicodeCharacter{00B8}{\cedilla{ }} 9206 \DeclareUnicodeCharacter{00BA}{\ordm} 9207 \DeclareUnicodeCharacter{00BB}{\guillemetright} 9208 \DeclareUnicodeCharacter{00BF}{\questiondown} 9209 9210 \DeclareUnicodeCharacter{00C0}{\`A} 9211 \DeclareUnicodeCharacter{00C1}{\'A} 9212 \DeclareUnicodeCharacter{00C2}{\^A} 9213 \DeclareUnicodeCharacter{00C3}{\~A} 9214 \DeclareUnicodeCharacter{00C4}{\"A} 9215 \DeclareUnicodeCharacter{00C5}{\AA} 9216 \DeclareUnicodeCharacter{00C6}{\AE} 9217 \DeclareUnicodeCharacter{00C7}{\cedilla{C}} 9218 \DeclareUnicodeCharacter{00C8}{\`E} 9219 \DeclareUnicodeCharacter{00C9}{\'E} 9220 \DeclareUnicodeCharacter{00CA}{\^E} 9221 \DeclareUnicodeCharacter{00CB}{\"E} 9222 \DeclareUnicodeCharacter{00CC}{\`I} 9223 \DeclareUnicodeCharacter{00CD}{\'I} 9224 \DeclareUnicodeCharacter{00CE}{\^I} 9225 \DeclareUnicodeCharacter{00CF}{\"I} 9226 9227 \DeclareUnicodeCharacter{00D0}{\DH} 9228 \DeclareUnicodeCharacter{00D1}{\~N} 9229 \DeclareUnicodeCharacter{00D2}{\`O} 9230 \DeclareUnicodeCharacter{00D3}{\'O} 9231 \DeclareUnicodeCharacter{00D4}{\^O} 9232 \DeclareUnicodeCharacter{00D5}{\~O} 9233 \DeclareUnicodeCharacter{00D6}{\"O} 9234 \DeclareUnicodeCharacter{00D8}{\O} 9235 \DeclareUnicodeCharacter{00D9}{\`U} 9236 \DeclareUnicodeCharacter{00DA}{\'U} 9237 \DeclareUnicodeCharacter{00DB}{\^U} 9238 \DeclareUnicodeCharacter{00DC}{\"U} 9239 \DeclareUnicodeCharacter{00DD}{\'Y} 9240 \DeclareUnicodeCharacter{00DE}{\TH} 9241 \DeclareUnicodeCharacter{00DF}{\ss} 9242 9243 \DeclareUnicodeCharacter{00E0}{\`a} 9244 \DeclareUnicodeCharacter{00E1}{\'a} 9245 \DeclareUnicodeCharacter{00E2}{\^a} 9246 \DeclareUnicodeCharacter{00E3}{\~a} 9247 \DeclareUnicodeCharacter{00E4}{\"a} 9248 \DeclareUnicodeCharacter{00E5}{\aa} 9249 \DeclareUnicodeCharacter{00E6}{\ae} 9250 \DeclareUnicodeCharacter{00E7}{\cedilla{c}} 9251 \DeclareUnicodeCharacter{00E8}{\`e} 9252 \DeclareUnicodeCharacter{00E9}{\'e} 9253 \DeclareUnicodeCharacter{00EA}{\^e} 9254 \DeclareUnicodeCharacter{00EB}{\"e} 9255 \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}} 9256 \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}} 9257 \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}} 9258 \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}} 9259 9260 \DeclareUnicodeCharacter{00F0}{\dh} 9261 \DeclareUnicodeCharacter{00F1}{\~n} 9262 \DeclareUnicodeCharacter{00F2}{\`o} 9263 \DeclareUnicodeCharacter{00F3}{\'o} 9264 \DeclareUnicodeCharacter{00F4}{\^o} 9265 \DeclareUnicodeCharacter{00F5}{\~o} 9266 \DeclareUnicodeCharacter{00F6}{\"o} 9267 \DeclareUnicodeCharacter{00F8}{\o} 9268 \DeclareUnicodeCharacter{00F9}{\`u} 9269 \DeclareUnicodeCharacter{00FA}{\'u} 9270 \DeclareUnicodeCharacter{00FB}{\^u} 9271 \DeclareUnicodeCharacter{00FC}{\"u} 9272 \DeclareUnicodeCharacter{00FD}{\'y} 9273 \DeclareUnicodeCharacter{00FE}{\th} 9274 \DeclareUnicodeCharacter{00FF}{\"y} 9275 9276 \DeclareUnicodeCharacter{0100}{\=A} 9277 \DeclareUnicodeCharacter{0101}{\=a} 9278 \DeclareUnicodeCharacter{0102}{\u{A}} 9279 \DeclareUnicodeCharacter{0103}{\u{a}} 9280 \DeclareUnicodeCharacter{0104}{\ogonek{A}} 9281 \DeclareUnicodeCharacter{0105}{\ogonek{a}} 9282 \DeclareUnicodeCharacter{0106}{\'C} 9283 \DeclareUnicodeCharacter{0107}{\'c} 9284 \DeclareUnicodeCharacter{0108}{\^C} 9285 \DeclareUnicodeCharacter{0109}{\^c} 9286 \DeclareUnicodeCharacter{0118}{\ogonek{E}} 9287 \DeclareUnicodeCharacter{0119}{\ogonek{e}} 9288 \DeclareUnicodeCharacter{010A}{\dotaccent{C}} 9289 \DeclareUnicodeCharacter{010B}{\dotaccent{c}} 9290 \DeclareUnicodeCharacter{010C}{\v{C}} 9291 \DeclareUnicodeCharacter{010D}{\v{c}} 9292 \DeclareUnicodeCharacter{010E}{\v{D}} 9293 9294 \DeclareUnicodeCharacter{0112}{\=E} 9295 \DeclareUnicodeCharacter{0113}{\=e} 9296 \DeclareUnicodeCharacter{0114}{\u{E}} 9297 \DeclareUnicodeCharacter{0115}{\u{e}} 9298 \DeclareUnicodeCharacter{0116}{\dotaccent{E}} 9299 \DeclareUnicodeCharacter{0117}{\dotaccent{e}} 9300 \DeclareUnicodeCharacter{011A}{\v{E}} 9301 \DeclareUnicodeCharacter{011B}{\v{e}} 9302 \DeclareUnicodeCharacter{011C}{\^G} 9303 \DeclareUnicodeCharacter{011D}{\^g} 9304 \DeclareUnicodeCharacter{011E}{\u{G}} 9305 \DeclareUnicodeCharacter{011F}{\u{g}} 9306 9307 \DeclareUnicodeCharacter{0120}{\dotaccent{G}} 9308 \DeclareUnicodeCharacter{0121}{\dotaccent{g}} 9309 \DeclareUnicodeCharacter{0124}{\^H} 9310 \DeclareUnicodeCharacter{0125}{\^h} 9311 \DeclareUnicodeCharacter{0128}{\~I} 9312 \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}} 9313 \DeclareUnicodeCharacter{012A}{\=I} 9314 \DeclareUnicodeCharacter{012B}{\={\dotless{i}}} 9315 \DeclareUnicodeCharacter{012C}{\u{I}} 9316 \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}} 9317 9318 \DeclareUnicodeCharacter{0130}{\dotaccent{I}} 9319 \DeclareUnicodeCharacter{0131}{\dotless{i}} 9320 \DeclareUnicodeCharacter{0132}{IJ} 9321 \DeclareUnicodeCharacter{0133}{ij} 9322 \DeclareUnicodeCharacter{0134}{\^J} 9323 \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}} 9324 \DeclareUnicodeCharacter{0139}{\'L} 9325 \DeclareUnicodeCharacter{013A}{\'l} 9326 9327 \DeclareUnicodeCharacter{0141}{\L} 9328 \DeclareUnicodeCharacter{0142}{\l} 9329 \DeclareUnicodeCharacter{0143}{\'N} 9330 \DeclareUnicodeCharacter{0144}{\'n} 9331 \DeclareUnicodeCharacter{0147}{\v{N}} 9332 \DeclareUnicodeCharacter{0148}{\v{n}} 9333 \DeclareUnicodeCharacter{014C}{\=O} 9334 \DeclareUnicodeCharacter{014D}{\=o} 9335 \DeclareUnicodeCharacter{014E}{\u{O}} 9336 \DeclareUnicodeCharacter{014F}{\u{o}} 9337 9338 \DeclareUnicodeCharacter{0150}{\H{O}} 9339 \DeclareUnicodeCharacter{0151}{\H{o}} 9340 \DeclareUnicodeCharacter{0152}{\OE} 9341 \DeclareUnicodeCharacter{0153}{\oe} 9342 \DeclareUnicodeCharacter{0154}{\'R} 9343 \DeclareUnicodeCharacter{0155}{\'r} 9344 \DeclareUnicodeCharacter{0158}{\v{R}} 9345 \DeclareUnicodeCharacter{0159}{\v{r}} 9346 \DeclareUnicodeCharacter{015A}{\'S} 9347 \DeclareUnicodeCharacter{015B}{\'s} 9348 \DeclareUnicodeCharacter{015C}{\^S} 9349 \DeclareUnicodeCharacter{015D}{\^s} 9350 \DeclareUnicodeCharacter{015E}{\cedilla{S}} 9351 \DeclareUnicodeCharacter{015F}{\cedilla{s}} 9352 9353 \DeclareUnicodeCharacter{0160}{\v{S}} 9354 \DeclareUnicodeCharacter{0161}{\v{s}} 9355 \DeclareUnicodeCharacter{0162}{\cedilla{t}} 9356 \DeclareUnicodeCharacter{0163}{\cedilla{T}} 9357 \DeclareUnicodeCharacter{0164}{\v{T}} 9358 9359 \DeclareUnicodeCharacter{0168}{\~U} 9360 \DeclareUnicodeCharacter{0169}{\~u} 9361 \DeclareUnicodeCharacter{016A}{\=U} 9362 \DeclareUnicodeCharacter{016B}{\=u} 9363 \DeclareUnicodeCharacter{016C}{\u{U}} 9364 \DeclareUnicodeCharacter{016D}{\u{u}} 9365 \DeclareUnicodeCharacter{016E}{\ringaccent{U}} 9366 \DeclareUnicodeCharacter{016F}{\ringaccent{u}} 9367 9368 \DeclareUnicodeCharacter{0170}{\H{U}} 9369 \DeclareUnicodeCharacter{0171}{\H{u}} 9370 \DeclareUnicodeCharacter{0174}{\^W} 9371 \DeclareUnicodeCharacter{0175}{\^w} 9372 \DeclareUnicodeCharacter{0176}{\^Y} 9373 \DeclareUnicodeCharacter{0177}{\^y} 9374 \DeclareUnicodeCharacter{0178}{\"Y} 9375 \DeclareUnicodeCharacter{0179}{\'Z} 9376 \DeclareUnicodeCharacter{017A}{\'z} 9377 \DeclareUnicodeCharacter{017B}{\dotaccent{Z}} 9378 \DeclareUnicodeCharacter{017C}{\dotaccent{z}} 9379 \DeclareUnicodeCharacter{017D}{\v{Z}} 9380 \DeclareUnicodeCharacter{017E}{\v{z}} 9381 9382 \DeclareUnicodeCharacter{01C4}{D\v{Z}} 9383 \DeclareUnicodeCharacter{01C5}{D\v{z}} 9384 \DeclareUnicodeCharacter{01C6}{d\v{z}} 9385 \DeclareUnicodeCharacter{01C7}{LJ} 9386 \DeclareUnicodeCharacter{01C8}{Lj} 9387 \DeclareUnicodeCharacter{01C9}{lj} 9388 \DeclareUnicodeCharacter{01CA}{NJ} 9389 \DeclareUnicodeCharacter{01CB}{Nj} 9390 \DeclareUnicodeCharacter{01CC}{nj} 9391 \DeclareUnicodeCharacter{01CD}{\v{A}} 9392 \DeclareUnicodeCharacter{01CE}{\v{a}} 9393 \DeclareUnicodeCharacter{01CF}{\v{I}} 9394 9395 \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}} 9396 \DeclareUnicodeCharacter{01D1}{\v{O}} 9397 \DeclareUnicodeCharacter{01D2}{\v{o}} 9398 \DeclareUnicodeCharacter{01D3}{\v{U}} 9399 \DeclareUnicodeCharacter{01D4}{\v{u}} 9400 9401 \DeclareUnicodeCharacter{01E2}{\={\AE}} 9402 \DeclareUnicodeCharacter{01E3}{\={\ae}} 9403 \DeclareUnicodeCharacter{01E6}{\v{G}} 9404 \DeclareUnicodeCharacter{01E7}{\v{g}} 9405 \DeclareUnicodeCharacter{01E8}{\v{K}} 9406 \DeclareUnicodeCharacter{01E9}{\v{k}} 9407 9408 \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}} 9409 \DeclareUnicodeCharacter{01F1}{DZ} 9410 \DeclareUnicodeCharacter{01F2}{Dz} 9411 \DeclareUnicodeCharacter{01F3}{dz} 9412 \DeclareUnicodeCharacter{01F4}{\'G} 9413 \DeclareUnicodeCharacter{01F5}{\'g} 9414 \DeclareUnicodeCharacter{01F8}{\`N} 9415 \DeclareUnicodeCharacter{01F9}{\`n} 9416 \DeclareUnicodeCharacter{01FC}{\'{\AE}} 9417 \DeclareUnicodeCharacter{01FD}{\'{\ae}} 9418 \DeclareUnicodeCharacter{01FE}{\'{\O}} 9419 \DeclareUnicodeCharacter{01FF}{\'{\o}} 9420 9421 \DeclareUnicodeCharacter{021E}{\v{H}} 9422 \DeclareUnicodeCharacter{021F}{\v{h}} 9423 9424 \DeclareUnicodeCharacter{0226}{\dotaccent{A}} 9425 \DeclareUnicodeCharacter{0227}{\dotaccent{a}} 9426 \DeclareUnicodeCharacter{0228}{\cedilla{E}} 9427 \DeclareUnicodeCharacter{0229}{\cedilla{e}} 9428 \DeclareUnicodeCharacter{022E}{\dotaccent{O}} 9429 \DeclareUnicodeCharacter{022F}{\dotaccent{o}} 9430 9431 \DeclareUnicodeCharacter{0232}{\=Y} 9432 \DeclareUnicodeCharacter{0233}{\=y} 9433 \DeclareUnicodeCharacter{0237}{\dotless{j}} 9434 9435 \DeclareUnicodeCharacter{02DB}{\ogonek{ }} 9436 9437 \DeclareUnicodeCharacter{1E02}{\dotaccent{B}} 9438 \DeclareUnicodeCharacter{1E03}{\dotaccent{b}} 9439 \DeclareUnicodeCharacter{1E04}{\udotaccent{B}} 9440 \DeclareUnicodeCharacter{1E05}{\udotaccent{b}} 9441 \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}} 9442 \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}} 9443 \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}} 9444 \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}} 9445 \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}} 9446 \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}} 9447 \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}} 9448 \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}} 9449 9450 \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}} 9451 \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}} 9452 9453 \DeclareUnicodeCharacter{1E20}{\=G} 9454 \DeclareUnicodeCharacter{1E21}{\=g} 9455 \DeclareUnicodeCharacter{1E22}{\dotaccent{H}} 9456 \DeclareUnicodeCharacter{1E23}{\dotaccent{h}} 9457 \DeclareUnicodeCharacter{1E24}{\udotaccent{H}} 9458 \DeclareUnicodeCharacter{1E25}{\udotaccent{h}} 9459 \DeclareUnicodeCharacter{1E26}{\"H} 9460 \DeclareUnicodeCharacter{1E27}{\"h} 9461 9462 \DeclareUnicodeCharacter{1E30}{\'K} 9463 \DeclareUnicodeCharacter{1E31}{\'k} 9464 \DeclareUnicodeCharacter{1E32}{\udotaccent{K}} 9465 \DeclareUnicodeCharacter{1E33}{\udotaccent{k}} 9466 \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}} 9467 \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}} 9468 \DeclareUnicodeCharacter{1E36}{\udotaccent{L}} 9469 \DeclareUnicodeCharacter{1E37}{\udotaccent{l}} 9470 \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}} 9471 \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}} 9472 \DeclareUnicodeCharacter{1E3E}{\'M} 9473 \DeclareUnicodeCharacter{1E3F}{\'m} 9474 9475 \DeclareUnicodeCharacter{1E40}{\dotaccent{M}} 9476 \DeclareUnicodeCharacter{1E41}{\dotaccent{m}} 9477 \DeclareUnicodeCharacter{1E42}{\udotaccent{M}} 9478 \DeclareUnicodeCharacter{1E43}{\udotaccent{m}} 9479 \DeclareUnicodeCharacter{1E44}{\dotaccent{N}} 9480 \DeclareUnicodeCharacter{1E45}{\dotaccent{n}} 9481 \DeclareUnicodeCharacter{1E46}{\udotaccent{N}} 9482 \DeclareUnicodeCharacter{1E47}{\udotaccent{n}} 9483 \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}} 9484 \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}} 9485 9486 \DeclareUnicodeCharacter{1E54}{\'P} 9487 \DeclareUnicodeCharacter{1E55}{\'p} 9488 \DeclareUnicodeCharacter{1E56}{\dotaccent{P}} 9489 \DeclareUnicodeCharacter{1E57}{\dotaccent{p}} 9490 \DeclareUnicodeCharacter{1E58}{\dotaccent{R}} 9491 \DeclareUnicodeCharacter{1E59}{\dotaccent{r}} 9492 \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}} 9493 \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}} 9494 \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}} 9495 \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}} 9496 9497 \DeclareUnicodeCharacter{1E60}{\dotaccent{S}} 9498 \DeclareUnicodeCharacter{1E61}{\dotaccent{s}} 9499 \DeclareUnicodeCharacter{1E62}{\udotaccent{S}} 9500 \DeclareUnicodeCharacter{1E63}{\udotaccent{s}} 9501 \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}} 9502 \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}} 9503 \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}} 9504 \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}} 9505 \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}} 9506 \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}} 9507 9508 \DeclareUnicodeCharacter{1E7C}{\~V} 9509 \DeclareUnicodeCharacter{1E7D}{\~v} 9510 \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}} 9511 \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}} 9512 9513 \DeclareUnicodeCharacter{1E80}{\`W} 9514 \DeclareUnicodeCharacter{1E81}{\`w} 9515 \DeclareUnicodeCharacter{1E82}{\'W} 9516 \DeclareUnicodeCharacter{1E83}{\'w} 9517 \DeclareUnicodeCharacter{1E84}{\"W} 9518 \DeclareUnicodeCharacter{1E85}{\"w} 9519 \DeclareUnicodeCharacter{1E86}{\dotaccent{W}} 9520 \DeclareUnicodeCharacter{1E87}{\dotaccent{w}} 9521 \DeclareUnicodeCharacter{1E88}{\udotaccent{W}} 9522 \DeclareUnicodeCharacter{1E89}{\udotaccent{w}} 9523 \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}} 9524 \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}} 9525 \DeclareUnicodeCharacter{1E8C}{\"X} 9526 \DeclareUnicodeCharacter{1E8D}{\"x} 9527 \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}} 9528 \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}} 9529 9530 \DeclareUnicodeCharacter{1E90}{\^Z} 9531 \DeclareUnicodeCharacter{1E91}{\^z} 9532 \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}} 9533 \DeclareUnicodeCharacter{1E93}{\udotaccent{z}} 9534 \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}} 9535 \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}} 9536 \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}} 9537 \DeclareUnicodeCharacter{1E97}{\"t} 9538 \DeclareUnicodeCharacter{1E98}{\ringaccent{w}} 9539 \DeclareUnicodeCharacter{1E99}{\ringaccent{y}} 9540 9541 \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}} 9542 \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}} 9543 9544 \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}} 9545 \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}} 9546 \DeclareUnicodeCharacter{1EBC}{\~E} 9547 \DeclareUnicodeCharacter{1EBD}{\~e} 9548 9549 \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}} 9550 \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}} 9551 \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}} 9552 \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}} 9553 9554 \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}} 9555 \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}} 9556 9557 \DeclareUnicodeCharacter{1EF2}{\`Y} 9558 \DeclareUnicodeCharacter{1EF3}{\`y} 9559 \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}} 9560 9561 \DeclareUnicodeCharacter{1EF8}{\~Y} 9562 \DeclareUnicodeCharacter{1EF9}{\~y} 9563 9564 \DeclareUnicodeCharacter{2013}{--} 9565 \DeclareUnicodeCharacter{2014}{---} 9566 \DeclareUnicodeCharacter{2018}{\quoteleft} 9567 \DeclareUnicodeCharacter{2019}{\quoteright} 9568 \DeclareUnicodeCharacter{201A}{\quotesinglbase} 9569 \DeclareUnicodeCharacter{201C}{\quotedblleft} 9570 \DeclareUnicodeCharacter{201D}{\quotedblright} 9571 \DeclareUnicodeCharacter{201E}{\quotedblbase} 9572 \DeclareUnicodeCharacter{2022}{\bullet} 9573 \DeclareUnicodeCharacter{2026}{\dots} 9574 \DeclareUnicodeCharacter{2039}{\guilsinglleft} 9575 \DeclareUnicodeCharacter{203A}{\guilsinglright} 9576 \DeclareUnicodeCharacter{20AC}{\euro} 9577 9578 \DeclareUnicodeCharacter{2192}{\expansion} 9579 \DeclareUnicodeCharacter{21D2}{\result} 9580 9581 \DeclareUnicodeCharacter{2212}{\minus} 9582 \DeclareUnicodeCharacter{2217}{\point} 9583 \DeclareUnicodeCharacter{2261}{\equiv} 9584}% end of \utfeightchardefs 9585 9586 9587% US-ASCII character definitions. 9588\def\asciichardefs{% nothing need be done 9589 \relax 9590} 9591 9592% Make non-ASCII characters printable again for compatibility with 9593% existing Texinfo documents that may use them, even without declaring a 9594% document encoding. 9595% 9596\setnonasciicharscatcode \other 9597 9598 9599\message{formatting,} 9600 9601\newdimen\defaultparindent \defaultparindent = 15pt 9602 9603\chapheadingskip = 15pt plus 4pt minus 2pt 9604\secheadingskip = 12pt plus 3pt minus 2pt 9605\subsecheadingskip = 9pt plus 2pt minus 2pt 9606 9607% Prevent underfull vbox error messages. 9608\vbadness = 10000 9609 9610% Don't be very finicky about underfull hboxes, either. 9611\hbadness = 6666 9612 9613% Following George Bush, get rid of widows and orphans. 9614\widowpenalty=10000 9615\clubpenalty=10000 9616 9617% Use TeX 3.0's \emergencystretch to help line breaking, but if we're 9618% using an old version of TeX, don't do anything. We want the amount of 9619% stretch added to depend on the line length, hence the dependence on 9620% \hsize. We call this whenever the paper size is set. 9621% 9622\def\setemergencystretch{% 9623 \ifx\emergencystretch\thisisundefined 9624 % Allow us to assign to \emergencystretch anyway. 9625 \def\emergencystretch{\dimen0}% 9626 \else 9627 \emergencystretch = .15\hsize 9628 \fi 9629} 9630 9631% Parameters in order: 1) textheight; 2) textwidth; 9632% 3) voffset; 4) hoffset; 5) binding offset; 6) topskip; 9633% 7) physical page height; 8) physical page width. 9634% 9635% We also call \setleading{\textleading}, so the caller should define 9636% \textleading. The caller should also set \parskip. 9637% 9638\def\internalpagesizes#1#2#3#4#5#6#7#8{% 9639 \voffset = #3\relax 9640 \topskip = #6\relax 9641 \splittopskip = \topskip 9642 % 9643 \vsize = #1\relax 9644 \advance\vsize by \topskip 9645 \outervsize = \vsize 9646 \advance\outervsize by 2\topandbottommargin 9647 \pageheight = \vsize 9648 % 9649 \hsize = #2\relax 9650 \outerhsize = \hsize 9651 \advance\outerhsize by 0.5in 9652 \pagewidth = \hsize 9653 % 9654 \normaloffset = #4\relax 9655 \bindingoffset = #5\relax 9656 % 9657 \ifpdf 9658 \pdfpageheight #7\relax 9659 \pdfpagewidth #8\relax 9660 % if we don't reset these, they will remain at "1 true in" of 9661 % whatever layout pdftex was dumped with. 9662 \pdfhorigin = 1 true in 9663 \pdfvorigin = 1 true in 9664 \fi 9665 % 9666 \setleading{\textleading} 9667 % 9668 \parindent = \defaultparindent 9669 \setemergencystretch 9670} 9671 9672% @letterpaper (the default). 9673\def\letterpaper{{\globaldefs = 1 9674 \parskip = 3pt plus 2pt minus 1pt 9675 \textleading = 13.2pt 9676 % 9677 % If page is nothing but text, make it come out even. 9678 \internalpagesizes{607.2pt}{6in}% that's 46 lines 9679 {\voffset}{.25in}% 9680 {\bindingoffset}{36pt}% 9681 {11in}{8.5in}% 9682}} 9683 9684% Use @smallbook to reset parameters for 7x9.25 trim size. 9685\def\smallbook{{\globaldefs = 1 9686 \parskip = 2pt plus 1pt 9687 \textleading = 12pt 9688 % 9689 \internalpagesizes{7.5in}{5in}% 9690 {-.2in}{0in}% 9691 {\bindingoffset}{16pt}% 9692 {9.25in}{7in}% 9693 % 9694 \lispnarrowing = 0.3in 9695 \tolerance = 700 9696 \hfuzz = 1pt 9697 \contentsrightmargin = 0pt 9698 \defbodyindent = .5cm 9699}} 9700 9701% Use @smallerbook to reset parameters for 6x9 trim size. 9702% (Just testing, parameters still in flux.) 9703\def\smallerbook{{\globaldefs = 1 9704 \parskip = 1.5pt plus 1pt 9705 \textleading = 12pt 9706 % 9707 \internalpagesizes{7.4in}{4.8in}% 9708 {-.2in}{-.4in}% 9709 {0pt}{14pt}% 9710 {9in}{6in}% 9711 % 9712 \lispnarrowing = 0.25in 9713 \tolerance = 700 9714 \hfuzz = 1pt 9715 \contentsrightmargin = 0pt 9716 \defbodyindent = .4cm 9717}} 9718 9719% Use @afourpaper to print on European A4 paper. 9720\def\afourpaper{{\globaldefs = 1 9721 \parskip = 3pt plus 2pt minus 1pt 9722 \textleading = 13.2pt 9723 % 9724 % Double-side printing via postscript on Laserjet 4050 9725 % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm. 9726 % To change the settings for a different printer or situation, adjust 9727 % \normaloffset until the front-side and back-side texts align. Then 9728 % do the same for \bindingoffset. You can set these for testing in 9729 % your texinfo source file like this: 9730 % @tex 9731 % \global\normaloffset = -6mm 9732 % \global\bindingoffset = 10mm 9733 % @end tex 9734 \internalpagesizes{673.2pt}{160mm}% that's 51 lines 9735 {\voffset}{\hoffset}% 9736 {\bindingoffset}{44pt}% 9737 {297mm}{210mm}% 9738 % 9739 \tolerance = 700 9740 \hfuzz = 1pt 9741 \contentsrightmargin = 0pt 9742 \defbodyindent = 5mm 9743}} 9744 9745% Use @afivepaper to print on European A5 paper. 9746% From romildo@urano.iceb.ufop.br, 2 July 2000. 9747% He also recommends making @example and @lisp be small. 9748\def\afivepaper{{\globaldefs = 1 9749 \parskip = 2pt plus 1pt minus 0.1pt 9750 \textleading = 12.5pt 9751 % 9752 \internalpagesizes{160mm}{120mm}% 9753 {\voffset}{\hoffset}% 9754 {\bindingoffset}{8pt}% 9755 {210mm}{148mm}% 9756 % 9757 \lispnarrowing = 0.2in 9758 \tolerance = 800 9759 \hfuzz = 1.2pt 9760 \contentsrightmargin = 0pt 9761 \defbodyindent = 2mm 9762 \tableindent = 12mm 9763}} 9764 9765% A specific text layout, 24x15cm overall, intended for A4 paper. 9766\def\afourlatex{{\globaldefs = 1 9767 \afourpaper 9768 \internalpagesizes{237mm}{150mm}% 9769 {\voffset}{4.6mm}% 9770 {\bindingoffset}{7mm}% 9771 {297mm}{210mm}% 9772 % 9773 % Must explicitly reset to 0 because we call \afourpaper. 9774 \globaldefs = 0 9775}} 9776 9777% Use @afourwide to print on A4 paper in landscape format. 9778\def\afourwide{{\globaldefs = 1 9779 \afourpaper 9780 \internalpagesizes{241mm}{165mm}% 9781 {\voffset}{-2.95mm}% 9782 {\bindingoffset}{7mm}% 9783 {297mm}{210mm}% 9784 \globaldefs = 0 9785}} 9786 9787% @pagesizes TEXTHEIGHT[,TEXTWIDTH] 9788% Perhaps we should allow setting the margins, \topskip, \parskip, 9789% and/or leading, also. Or perhaps we should compute them somehow. 9790% 9791\parseargdef\pagesizes{\pagesizesyyy #1,,\finish} 9792\def\pagesizesyyy#1,#2,#3\finish{{% 9793 \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi 9794 \globaldefs = 1 9795 % 9796 \parskip = 3pt plus 2pt minus 1pt 9797 \setleading{\textleading}% 9798 % 9799 \dimen0 = #1\relax 9800 \advance\dimen0 by \voffset 9801 % 9802 \dimen2 = \hsize 9803 \advance\dimen2 by \normaloffset 9804 % 9805 \internalpagesizes{#1}{\hsize}% 9806 {\voffset}{\normaloffset}% 9807 {\bindingoffset}{44pt}% 9808 {\dimen0}{\dimen2}% 9809}} 9810 9811% Set default to letter. 9812% 9813\letterpaper 9814 9815 9816\message{and turning on texinfo input format.} 9817 9818\def^^L{\par} % remove \outer, so ^L can appear in an @comment 9819 9820% DEL is a comment character, in case @c does not suffice. 9821\catcode`\^^? = 14 9822 9823% Define macros to output various characters with catcode for normal text. 9824\catcode`\"=\other \def\normaldoublequote{"} 9825\catcode`\$=\other \def\normaldollar{$}%$ font-lock fix 9826\catcode`\+=\other \def\normalplus{+} 9827\catcode`\<=\other \def\normalless{<} 9828\catcode`\>=\other \def\normalgreater{>} 9829\catcode`\^=\other \def\normalcaret{^} 9830\catcode`\_=\other \def\normalunderscore{_} 9831\catcode`\|=\other \def\normalverticalbar{|} 9832\catcode`\~=\other \def\normaltilde{~} 9833 9834% This macro is used to make a character print one way in \tt 9835% (where it can probably be output as-is), and another way in other fonts, 9836% where something hairier probably needs to be done. 9837% 9838% #1 is what to print if we are indeed using \tt; #2 is what to print 9839% otherwise. Since all the Computer Modern typewriter fonts have zero 9840% interword stretch (and shrink), and it is reasonable to expect all 9841% typewriter fonts to have this, we can check that font parameter. 9842% 9843\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi} 9844 9845% Same as above, but check for italic font. Actually this also catches 9846% non-italic slanted fonts since it is impossible to distinguish them from 9847% italic fonts. But since this is only used by $ and it uses \sl anyway 9848% this is not a problem. 9849\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi} 9850 9851% Turn off all special characters except @ 9852% (and those which the user can use as if they were ordinary). 9853% Most of these we simply print from the \tt font, but for some, we can 9854% use math or other variants that look better in normal text. 9855 9856\catcode`\"=\active 9857\def\activedoublequote{{\tt\char34}} 9858\let"=\activedoublequote 9859\catcode`\~=\active 9860\def~{{\tt\char126}} 9861\chardef\hat=`\^ 9862\catcode`\^=\active 9863\def^{{\tt \hat}} 9864 9865\catcode`\_=\active 9866\def_{\ifusingtt\normalunderscore\_} 9867\let\realunder=_ 9868% Subroutine for the previous macro. 9869\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em } 9870 9871\catcode`\|=\active 9872\def|{{\tt\char124}} 9873\chardef \less=`\< 9874\catcode`\<=\active 9875\def<{{\tt \less}} 9876\chardef \gtr=`\> 9877\catcode`\>=\active 9878\def>{{\tt \gtr}} 9879\catcode`\+=\active 9880\def+{{\tt \char 43}} 9881\catcode`\$=\active 9882\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix 9883 9884% If a .fmt file is being used, characters that might appear in a file 9885% name cannot be active until we have parsed the command line. 9886% So turn them off again, and have \everyjob (or @setfilename) turn them on. 9887% \otherifyactive is called near the end of this file. 9888\def\otherifyactive{\catcode`+=\other \catcode`\_=\other} 9889 9890% Used sometimes to turn off (effectively) the active characters even after 9891% parsing them. 9892\def\turnoffactive{% 9893 \normalturnoffactive 9894 \otherbackslash 9895} 9896 9897\catcode`\@=0 9898 9899% \backslashcurfont outputs one backslash character in current font, 9900% as in \char`\\. 9901\global\chardef\backslashcurfont=`\\ 9902\global\let\rawbackslashxx=\backslashcurfont % let existing .??s files work 9903 9904% \realbackslash is an actual character `\' with catcode other, and 9905% \doublebackslash is two of them (for the pdf outlines). 9906{\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}} 9907 9908% In texinfo, backslash is an active character; it prints the backslash 9909% in fixed width font. 9910\catcode`\\=\active % @ for escape char from now on. 9911 9912% The story here is that in math mode, the \char of \backslashcurfont 9913% ends up printing the roman \ from the math symbol font (because \char 9914% in math mode uses the \mathcode, and plain.tex sets 9915% \mathcode`\\="026E). It seems better for @backslashchar{} to always 9916% print a typewriter backslash, hence we use an explicit \mathchar, 9917% which is the decimal equivalent of "715c (class 7, e.g., use \fam; 9918% ignored family value; char position "5C). We can't use " for the 9919% usual hex value because it has already been made active. 9920@def@normalbackslash{{@tt @ifmmode @mathchar29020 @else @backslashcurfont @fi}} 9921@let@backslashchar = @normalbackslash % @backslashchar{} is for user documents. 9922 9923% On startup, @fixbackslash assigns: 9924% @let \ = @normalbackslash 9925% \rawbackslash defines an active \ to do \backslashcurfont. 9926% \otherbackslash defines an active \ to be a literal `\' character with 9927% catcode other. We switch back and forth between these. 9928@gdef@rawbackslash{@let\=@backslashcurfont} 9929@gdef@otherbackslash{@let\=@realbackslash} 9930 9931% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of 9932% the literal character `\'. 9933% 9934@def@normalturnoffactive{% 9935 @let"=@normaldoublequote 9936 @let$=@normaldollar %$ font-lock fix 9937 @let+=@normalplus 9938 @let<=@normalless 9939 @let>=@normalgreater 9940 @let\=@normalbackslash 9941 @let^=@normalcaret 9942 @let_=@normalunderscore 9943 @let|=@normalverticalbar 9944 @let~=@normaltilde 9945 @markupsetuplqdefault 9946 @markupsetuprqdefault 9947 @unsepspaces 9948} 9949 9950% Make _ and + \other characters, temporarily. 9951% This is canceled by @fixbackslash. 9952@otherifyactive 9953 9954% If a .fmt file is being used, we don't want the `\input texinfo' to show up. 9955% That is what \eatinput is for; after that, the `\' should revert to printing 9956% a backslash. 9957% 9958@gdef@eatinput input texinfo{@fixbackslash} 9959@global@let\ = @eatinput 9960 9961% On the other hand, perhaps the file did not have a `\input texinfo'. Then 9962% the first `\' in the file would cause an error. This macro tries to fix 9963% that, assuming it is called before the first `\' could plausibly occur. 9964% Also turn back on active characters that might appear in the input 9965% file name, in case not using a pre-dumped format. 9966% 9967@gdef@fixbackslash{% 9968 @ifx\@eatinput @let\ = @normalbackslash @fi 9969 @catcode`+=@active 9970 @catcode`@_=@active 9971} 9972 9973% Say @foo, not \foo, in error messages. 9974@escapechar = `@@ 9975 9976% These (along with & and #) are made active for url-breaking, so need 9977% active definitions as the normal characters. 9978@def@normaldot{.} 9979@def@normalquest{?} 9980@def@normalslash{/} 9981 9982% These look ok in all fonts, so just make them not special. 9983% @hashchar{} gets its own user-level command, because of #line. 9984@catcode`@& = @other @def@normalamp{&} 9985@catcode`@# = @other @def@normalhash{#} 9986@catcode`@% = @other @def@normalpercent{%} 9987 9988@let @hashchar = @normalhash 9989 9990@c Finally, make ` and ' active, so that txicodequoteundirected and 9991@c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}. If we 9992@c don't make ` and ' active, @code will not get them as active chars. 9993@c Do this last of all since we use ` in the previous @catcode assignments. 9994@catcode`@'=@active 9995@catcode`@`=@active 9996@markupsetuplqdefault 9997@markupsetuprqdefault 9998 9999@c Local variables: 10000@c eval: (add-hook 'write-file-hooks 'time-stamp) 10001@c page-delimiter: "^\\\\message" 10002@c time-stamp-start: "def\\\\texinfoversion{" 10003@c time-stamp-format: "%:y-%02m-%02d.%02H" 10004@c time-stamp-end: "}" 10005@c End: 10006 10007@c vim:sw=2: 10008 10009@ignore 10010 arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115 10011@end ignore 10012