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-03-11.15} 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\leq 4455 \definedummyword\minus 4456 \definedummyword\ogonek 4457 \definedummyword\pounds 4458 \definedummyword\point 4459 \definedummyword\print 4460 \definedummyword\quotedblbase 4461 \definedummyword\quotedblleft 4462 \definedummyword\quotedblright 4463 \definedummyword\quoteleft 4464 \definedummyword\quoteright 4465 \definedummyword\quotesinglbase 4466 \definedummyword\result 4467 \definedummyword\textdegree 4468 % 4469 % We want to disable all macros so that they are not expanded by \write. 4470 \macrolist 4471 % 4472 \normalturnoffactive 4473 % 4474 % Handle some cases of @value -- where it does not contain any 4475 % (non-fully-expandable) commands. 4476 \makevalueexpandable 4477} 4478 4479% \commondummiesnofonts: common to \commondummies and \indexnofonts. 4480% 4481\def\commondummiesnofonts{% 4482 % Control letters and accents. 4483 \definedummyletter\!% 4484 \definedummyaccent\"% 4485 \definedummyaccent\'% 4486 \definedummyletter\*% 4487 \definedummyaccent\,% 4488 \definedummyletter\.% 4489 \definedummyletter\/% 4490 \definedummyletter\:% 4491 \definedummyaccent\=% 4492 \definedummyletter\?% 4493 \definedummyaccent\^% 4494 \definedummyaccent\`% 4495 \definedummyaccent\~% 4496 \definedummyword\u 4497 \definedummyword\v 4498 \definedummyword\H 4499 \definedummyword\dotaccent 4500 \definedummyword\ogonek 4501 \definedummyword\ringaccent 4502 \definedummyword\tieaccent 4503 \definedummyword\ubaraccent 4504 \definedummyword\udotaccent 4505 \definedummyword\dotless 4506 % 4507 % Texinfo font commands. 4508 \definedummyword\b 4509 \definedummyword\i 4510 \definedummyword\r 4511 \definedummyword\sansserif 4512 \definedummyword\sc 4513 \definedummyword\slanted 4514 \definedummyword\t 4515 % 4516 % Commands that take arguments. 4517 \definedummyword\acronym 4518 \definedummyword\anchor 4519 \definedummyword\cite 4520 \definedummyword\code 4521 \definedummyword\command 4522 \definedummyword\dfn 4523 \definedummyword\dmn 4524 \definedummyword\email 4525 \definedummyword\emph 4526 \definedummyword\env 4527 \definedummyword\file 4528 \definedummyword\indicateurl 4529 \definedummyword\kbd 4530 \definedummyword\key 4531 \definedummyword\math 4532 \definedummyword\option 4533 \definedummyword\pxref 4534 \definedummyword\ref 4535 \definedummyword\samp 4536 \definedummyword\strong 4537 \definedummyword\tie 4538 \definedummyword\uref 4539 \definedummyword\url 4540 \definedummyword\var 4541 \definedummyword\verb 4542 \definedummyword\w 4543 \definedummyword\xref 4544} 4545 4546% \indexnofonts is used when outputting the strings to sort the index 4547% by, and when constructing control sequence names. It eliminates all 4548% control sequences and just writes whatever the best ASCII sort string 4549% would be for a given command (usually its argument). 4550% 4551\def\indexnofonts{% 4552 % Accent commands should become @asis. 4553 \def\definedummyaccent##1{\let##1\asis}% 4554 % We can just ignore other control letters. 4555 \def\definedummyletter##1{\let##1\empty}% 4556 % All control words become @asis by default; overrides below. 4557 \let\definedummyword\definedummyaccent 4558 % 4559 \commondummiesnofonts 4560 % 4561 % Don't no-op \tt, since it isn't a user-level command 4562 % and is used in the definitions of the active chars like <, >, |, etc. 4563 % Likewise with the other plain tex font commands. 4564 %\let\tt=\asis 4565 % 4566 \def\ { }% 4567 \def\@{@}% 4568 \def\_{\normalunderscore}% 4569 \def\-{}% @- shouldn't affect sorting 4570 % 4571 % Unfortunately, texindex is not prepared to handle braces in the 4572 % content at all. So for index sorting, we map @{ and @} to strings 4573 % starting with |, since that ASCII character is between ASCII { and }. 4574 \def\{{|a}% 4575 \def\}{|b}% 4576 % 4577 % Non-English letters. 4578 \def\AA{AA}% 4579 \def\AE{AE}% 4580 \def\DH{DZZ}% 4581 \def\L{L}% 4582 \def\OE{OE}% 4583 \def\O{O}% 4584 \def\TH{ZZZ}% 4585 \def\aa{aa}% 4586 \def\ae{ae}% 4587 \def\dh{dzz}% 4588 \def\exclamdown{!}% 4589 \def\l{l}% 4590 \def\oe{oe}% 4591 \def\ordf{a}% 4592 \def\ordm{o}% 4593 \def\o{o}% 4594 \def\questiondown{?}% 4595 \def\ss{ss}% 4596 \def\th{zzz}% 4597 % 4598 \def\LaTeX{LaTeX}% 4599 \def\TeX{TeX}% 4600 % 4601 % Assorted special characters. 4602 % (The following {} will end up in the sort string, but that's ok.) 4603 \def\arrow{->}% 4604 \def\bullet{bullet}% 4605 \def\comma{,}% 4606 \def\copyright{copyright}% 4607 \def\dots{...}% 4608 \def\enddots{...}% 4609 \def\equiv{==}% 4610 \def\error{error}% 4611 \def\euro{euro}% 4612 \def\expansion{==>}% 4613 \def\geq{>=}% 4614 \def\guillemetleft{<<}% 4615 \def\guillemetright{>>}% 4616 \def\guilsinglleft{<}% 4617 \def\guilsinglright{>}% 4618 \def\leq{<=}% 4619 \def\minus{-}% 4620 \def\point{.}% 4621 \def\pounds{pounds}% 4622 \def\print{-|}% 4623 \def\quotedblbase{"}% 4624 \def\quotedblleft{"}% 4625 \def\quotedblright{"}% 4626 \def\quoteleft{`}% 4627 \def\quoteright{'}% 4628 \def\quotesinglbase{,}% 4629 \def\registeredsymbol{R}% 4630 \def\result{=>}% 4631 \def\textdegree{o}% 4632 % 4633 \expandafter\ifx\csname SETtxiindexlquoteignore\endcsname\relax 4634 \else \indexlquoteignore \fi 4635 % 4636 % We need to get rid of all macros, leaving only the arguments (if present). 4637 % Of course this is not nearly correct, but it is the best we can do for now. 4638 % makeinfo does not expand macros in the argument to @deffn, which ends up 4639 % writing an index entry, and texindex isn't prepared for an index sort entry 4640 % that starts with \. 4641 % 4642 % Since macro invocations are followed by braces, we can just redefine them 4643 % to take a single TeX argument. The case of a macro invocation that 4644 % goes to end-of-line is not handled. 4645 % 4646 \macrolist 4647} 4648 4649% Undocumented (for FSFS 2nd ed.): @set txiindexlquoteignore makes us 4650% ignore left quotes in the sort term. 4651{\catcode`\`=\active 4652 \gdef\indexlquoteignore{\let`=\empty}} 4653 4654\let\indexbackslash=0 %overridden during \printindex. 4655\let\SETmarginindex=\relax % put index entries in margin (undocumented)? 4656 4657% Most index entries go through here, but \dosubind is the general case. 4658% #1 is the index name, #2 is the entry text. 4659\def\doind#1#2{\dosubind{#1}{#2}{}} 4660 4661% Workhorse for all \fooindexes. 4662% #1 is name of index, #2 is stuff to put there, #3 is subentry -- 4663% empty if called from \doind, as we usually are (the main exception 4664% is with most defuns, which call us directly). 4665% 4666\def\dosubind#1#2#3{% 4667 \iflinks 4668 {% 4669 % Store the main index entry text (including the third arg). 4670 \toks0 = {#2}% 4671 % If third arg is present, precede it with a space. 4672 \def\thirdarg{#3}% 4673 \ifx\thirdarg\empty \else 4674 \toks0 = \expandafter{\the\toks0 \space #3}% 4675 \fi 4676 % 4677 \edef\writeto{\csname#1indfile\endcsname}% 4678 % 4679 \safewhatsit\dosubindwrite 4680 }% 4681 \fi 4682} 4683 4684% Write the entry in \toks0 to the index file: 4685% 4686\def\dosubindwrite{% 4687 % Put the index entry in the margin if desired. 4688 \ifx\SETmarginindex\relax\else 4689 \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}% 4690 \fi 4691 % 4692 % Remember, we are within a group. 4693 \indexdummies % Must do this here, since \bf, etc expand at this stage 4694 \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now 4695 % so it will be output as is; and it will print as backslash. 4696 % 4697 % Process the index entry with all font commands turned off, to 4698 % get the string to sort by. 4699 {\indexnofonts 4700 \edef\temp{\the\toks0}% need full expansion 4701 \xdef\indexsorttmp{\temp}% 4702 }% 4703 % 4704 % Set up the complete index entry, with both the sort key and 4705 % the original text, including any font commands. We write 4706 % three arguments to \entry to the .?? file (four in the 4707 % subentry case), texindex reduces to two when writing the .??s 4708 % sorted result. 4709 \edef\temp{% 4710 \write\writeto{% 4711 \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}% 4712 }% 4713 \temp 4714} 4715 4716% Take care of unwanted page breaks/skips around a whatsit: 4717% 4718% If a skip is the last thing on the list now, preserve it 4719% by backing up by \lastskip, doing the \write, then inserting 4720% the skip again. Otherwise, the whatsit generated by the 4721% \write or \pdfdest will make \lastskip zero. The result is that 4722% sequences like this: 4723% @end defun 4724% @tindex whatever 4725% @defun ... 4726% will have extra space inserted, because the \medbreak in the 4727% start of the @defun won't see the skip inserted by the @end of 4728% the previous defun. 4729% 4730% But don't do any of this if we're not in vertical mode. We 4731% don't want to do a \vskip and prematurely end a paragraph. 4732% 4733% Avoid page breaks due to these extra skips, too. 4734% 4735% But wait, there is a catch there: 4736% We'll have to check whether \lastskip is zero skip. \ifdim is not 4737% sufficient for this purpose, as it ignores stretch and shrink parts 4738% of the skip. The only way seems to be to check the textual 4739% representation of the skip. 4740% 4741% The following is almost like \def\zeroskipmacro{0.0pt} except that 4742% the ``p'' and ``t'' characters have catcode \other, not 11 (letter). 4743% 4744\edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname} 4745% 4746\newskip\whatsitskip 4747\newcount\whatsitpenalty 4748% 4749% ..., ready, GO: 4750% 4751\def\safewhatsit#1{\ifhmode 4752 #1% 4753 \else 4754 % \lastskip and \lastpenalty cannot both be nonzero simultaneously. 4755 \whatsitskip = \lastskip 4756 \edef\lastskipmacro{\the\lastskip}% 4757 \whatsitpenalty = \lastpenalty 4758 % 4759 % If \lastskip is nonzero, that means the last item was a 4760 % skip. And since a skip is discardable, that means this 4761 % -\whatsitskip glue we're inserting is preceded by a 4762 % non-discardable item, therefore it is not a potential 4763 % breakpoint, therefore no \nobreak needed. 4764 \ifx\lastskipmacro\zeroskipmacro 4765 \else 4766 \vskip-\whatsitskip 4767 \fi 4768 % 4769 #1% 4770 % 4771 \ifx\lastskipmacro\zeroskipmacro 4772 % If \lastskip was zero, perhaps the last item was a penalty, and 4773 % perhaps it was >=10000, e.g., a \nobreak. In that case, we want 4774 % to re-insert the same penalty (values >10000 are used for various 4775 % signals); since we just inserted a non-discardable item, any 4776 % following glue (such as a \parskip) would be a breakpoint. For example: 4777 % @deffn deffn-whatever 4778 % @vindex index-whatever 4779 % Description. 4780 % would allow a break between the index-whatever whatsit 4781 % and the "Description." paragraph. 4782 \ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi 4783 \else 4784 % On the other hand, if we had a nonzero \lastskip, 4785 % this make-up glue would be preceded by a non-discardable item 4786 % (the whatsit from the \write), so we must insert a \nobreak. 4787 \nobreak\vskip\whatsitskip 4788 \fi 4789\fi} 4790 4791% The index entry written in the file actually looks like 4792% \entry {sortstring}{page}{topic} 4793% or 4794% \entry {sortstring}{page}{topic}{subtopic} 4795% The texindex program reads in these files and writes files 4796% containing these kinds of lines: 4797% \initial {c} 4798% before the first topic whose initial is c 4799% \entry {topic}{pagelist} 4800% for a topic that is used without subtopics 4801% \primary {topic} 4802% for the beginning of a topic that is used with subtopics 4803% \secondary {subtopic}{pagelist} 4804% for each subtopic. 4805 4806% Define the user-accessible indexing commands 4807% @findex, @vindex, @kindex, @cindex. 4808 4809\def\findex {\fnindex} 4810\def\kindex {\kyindex} 4811\def\cindex {\cpindex} 4812\def\vindex {\vrindex} 4813\def\tindex {\tpindex} 4814\def\pindex {\pgindex} 4815 4816\def\cindexsub {\begingroup\obeylines\cindexsub} 4817{\obeylines % 4818\gdef\cindexsub "#1" #2^^M{\endgroup % 4819\dosubind{cp}{#2}{#1}}} 4820 4821% Define the macros used in formatting output of the sorted index material. 4822 4823% @printindex causes a particular index (the ??s file) to get printed. 4824% It does not print any chapter heading (usually an @unnumbered). 4825% 4826\parseargdef\printindex{\begingroup 4827 \dobreak \chapheadingskip{10000}% 4828 % 4829 \smallfonts \rm 4830 \tolerance = 9500 4831 \plainfrenchspacing 4832 \everypar = {}% don't want the \kern\-parindent from indentation suppression. 4833 % 4834 % See if the index file exists and is nonempty. 4835 % Change catcode of @ here so that if the index file contains 4836 % \initial {@} 4837 % as its first line, TeX doesn't complain about mismatched braces 4838 % (because it thinks @} is a control sequence). 4839 \catcode`\@ = 11 4840 \openin 1 \jobname.#1s 4841 \ifeof 1 4842 % \enddoublecolumns gets confused if there is no text in the index, 4843 % and it loses the chapter title and the aux file entries for the 4844 % index. The easiest way to prevent this problem is to make sure 4845 % there is some text. 4846 \putwordIndexNonexistent 4847 \else 4848 % 4849 % If the index file exists but is empty, then \openin leaves \ifeof 4850 % false. We have to make TeX try to read something from the file, so 4851 % it can discover if there is anything in it. 4852 \read 1 to \temp 4853 \ifeof 1 4854 \putwordIndexIsEmpty 4855 \else 4856 % Index files are almost Texinfo source, but we use \ as the escape 4857 % character. It would be better to use @, but that's too big a change 4858 % to make right now. 4859 \def\indexbackslash{\backslashcurfont}% 4860 \catcode`\\ = 0 4861 \escapechar = `\\ 4862 \begindoublecolumns 4863 \input \jobname.#1s 4864 \enddoublecolumns 4865 \fi 4866 \fi 4867 \closein 1 4868\endgroup} 4869 4870% These macros are used by the sorted index file itself. 4871% Change them to control the appearance of the index. 4872 4873\def\initial#1{{% 4874 % Some minor font changes for the special characters. 4875 \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt 4876 % 4877 % Remove any glue we may have, we'll be inserting our own. 4878 \removelastskip 4879 % 4880 % We like breaks before the index initials, so insert a bonus. 4881 \nobreak 4882 \vskip 0pt plus 3\baselineskip 4883 \penalty 0 4884 \vskip 0pt plus -3\baselineskip 4885 % 4886 % Typeset the initial. Making this add up to a whole number of 4887 % baselineskips increases the chance of the dots lining up from column 4888 % to column. It still won't often be perfect, because of the stretch 4889 % we need before each entry, but it's better. 4890 % 4891 % No shrink because it confuses \balancecolumns. 4892 \vskip 1.67\baselineskip plus .5\baselineskip 4893 \leftline{\secbf #1}% 4894 % Do our best not to break after the initial. 4895 \nobreak 4896 \vskip .33\baselineskip plus .1\baselineskip 4897}} 4898 4899% \entry typesets a paragraph consisting of the text (#1), dot leaders, and 4900% then page number (#2) flushed to the right margin. It is used for index 4901% and table of contents entries. The paragraph is indented by \leftskip. 4902% 4903% A straightforward implementation would start like this: 4904% \def\entry#1#2{... 4905% But this freezes the catcodes in the argument, and can cause problems to 4906% @code, which sets - active. This problem was fixed by a kludge--- 4907% ``-'' was active throughout whole index, but this isn't really right. 4908% The right solution is to prevent \entry from swallowing the whole text. 4909% --kasal, 21nov03 4910\def\entry{% 4911 \begingroup 4912 % 4913 % Start a new paragraph if necessary, so our assignments below can't 4914 % affect previous text. 4915 \par 4916 % 4917 % Do not fill out the last line with white space. 4918 \parfillskip = 0in 4919 % 4920 % No extra space above this paragraph. 4921 \parskip = 0in 4922 % 4923 % Do not prefer a separate line ending with a hyphen to fewer lines. 4924 \finalhyphendemerits = 0 4925 % 4926 % \hangindent is only relevant when the entry text and page number 4927 % don't both fit on one line. In that case, bob suggests starting the 4928 % dots pretty far over on the line. Unfortunately, a large 4929 % indentation looks wrong when the entry text itself is broken across 4930 % lines. So we use a small indentation and put up with long leaders. 4931 % 4932 % \hangafter is reset to 1 (which is the value we want) at the start 4933 % of each paragraph, so we need not do anything with that. 4934 \hangindent = 2em 4935 % 4936 % When the entry text needs to be broken, just fill out the first line 4937 % with blank space. 4938 \rightskip = 0pt plus1fil 4939 % 4940 % A bit of stretch before each entry for the benefit of balancing 4941 % columns. 4942 \vskip 0pt plus1pt 4943 % 4944 % When reading the text of entry, convert explicit line breaks 4945 % from @* into spaces. The user might give these in long section 4946 % titles, for instance. 4947 \def\*{\unskip\space\ignorespaces}% 4948 \def\entrybreak{\hfil\break}% 4949 % 4950 % Swallow the left brace of the text (first parameter): 4951 \afterassignment\doentry 4952 \let\temp = 4953} 4954\def\entrybreak{\unskip\space\ignorespaces}% 4955\def\doentry{% 4956 \bgroup % Instead of the swallowed brace. 4957 \noindent 4958 \aftergroup\finishentry 4959 % And now comes the text of the entry. 4960} 4961\def\finishentry#1{% 4962 % #1 is the page number. 4963 % 4964 % The following is kludged to not output a line of dots in the index if 4965 % there are no page numbers. The next person who breaks this will be 4966 % cursed by a Unix daemon. 4967 \setbox\boxA = \hbox{#1}% 4968 \ifdim\wd\boxA = 0pt 4969 \ % 4970 \else 4971 % 4972 % If we must, put the page number on a line of its own, and fill out 4973 % this line with blank space. (The \hfil is overwhelmed with the 4974 % fill leaders glue in \indexdotfill if the page number does fit.) 4975 \hfil\penalty50 4976 \null\nobreak\indexdotfill % Have leaders before the page number. 4977 % 4978 % The `\ ' here is removed by the implicit \unskip that TeX does as 4979 % part of (the primitive) \par. Without it, a spurious underfull 4980 % \hbox ensues. 4981 \ifpdf 4982 \pdfgettoks#1.% 4983 \ \the\toksA 4984 \else 4985 \ #1% 4986 \fi 4987 \fi 4988 \par 4989 \endgroup 4990} 4991 4992% Like plain.tex's \dotfill, except uses up at least 1 em. 4993\def\indexdotfill{\cleaders 4994 \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1fill} 4995 4996\def\primary #1{\line{#1\hfil}} 4997 4998\newskip\secondaryindent \secondaryindent=0.5cm 4999\def\secondary#1#2{{% 5000 \parfillskip=0in 5001 \parskip=0in 5002 \hangindent=1in 5003 \hangafter=1 5004 \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill 5005 \ifpdf 5006 \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. 5007 \else 5008 #2 5009 \fi 5010 \par 5011}} 5012 5013% Define two-column mode, which we use to typeset indexes. 5014% Adapted from the TeXbook, page 416, which is to say, 5015% the manmac.tex format used to print the TeXbook itself. 5016\catcode`\@=11 5017 5018\newbox\partialpage 5019\newdimen\doublecolumnhsize 5020 5021\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns 5022 % Grab any single-column material above us. 5023 \output = {% 5024 % 5025 % Here is a possibility not foreseen in manmac: if we accumulate a 5026 % whole lot of material, we might end up calling this \output 5027 % routine twice in a row (see the doublecol-lose test, which is 5028 % essentially a couple of indexes with @setchapternewpage off). In 5029 % that case we just ship out what is in \partialpage with the normal 5030 % output routine. Generally, \partialpage will be empty when this 5031 % runs and this will be a no-op. See the indexspread.tex test case. 5032 \ifvoid\partialpage \else 5033 \onepageout{\pagecontents\partialpage}% 5034 \fi 5035 % 5036 \global\setbox\partialpage = \vbox{% 5037 % Unvbox the main output page. 5038 \unvbox\PAGE 5039 \kern-\topskip \kern\baselineskip 5040 }% 5041 }% 5042 \eject % run that output routine to set \partialpage 5043 % 5044 % Use the double-column output routine for subsequent pages. 5045 \output = {\doublecolumnout}% 5046 % 5047 % Change the page size parameters. We could do this once outside this 5048 % routine, in each of @smallbook, @afourpaper, and the default 8.5x11 5049 % format, but then we repeat the same computation. Repeating a couple 5050 % of assignments once per index is clearly meaningless for the 5051 % execution time, so we may as well do it in one place. 5052 % 5053 % First we halve the line length, less a little for the gutter between 5054 % the columns. We compute the gutter based on the line length, so it 5055 % changes automatically with the paper format. The magic constant 5056 % below is chosen so that the gutter has the same value (well, +-<1pt) 5057 % as it did when we hard-coded it. 5058 % 5059 % We put the result in a separate register, \doublecolumhsize, so we 5060 % can restore it in \pagesofar, after \hsize itself has (potentially) 5061 % been clobbered. 5062 % 5063 \doublecolumnhsize = \hsize 5064 \advance\doublecolumnhsize by -.04154\hsize 5065 \divide\doublecolumnhsize by 2 5066 \hsize = \doublecolumnhsize 5067 % 5068 % Double the \vsize as well. (We don't need a separate register here, 5069 % since nobody clobbers \vsize.) 5070 \vsize = 2\vsize 5071} 5072 5073% The double-column output routine for all double-column pages except 5074% the last. 5075% 5076\def\doublecolumnout{% 5077 \splittopskip=\topskip \splitmaxdepth=\maxdepth 5078 % Get the available space for the double columns -- the normal 5079 % (undoubled) page height minus any material left over from the 5080 % previous page. 5081 \dimen@ = \vsize 5082 \divide\dimen@ by 2 5083 \advance\dimen@ by -\ht\partialpage 5084 % 5085 % box0 will be the left-hand column, box2 the right. 5086 \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ 5087 \onepageout\pagesofar 5088 \unvbox255 5089 \penalty\outputpenalty 5090} 5091% 5092% Re-output the contents of the output page -- any previous material, 5093% followed by the two boxes we just split, in box0 and box2. 5094\def\pagesofar{% 5095 \unvbox\partialpage 5096 % 5097 \hsize = \doublecolumnhsize 5098 \wd0=\hsize \wd2=\hsize 5099 \hbox to\pagewidth{\box0\hfil\box2}% 5100} 5101% 5102% All done with double columns. 5103\def\enddoublecolumns{% 5104 % The following penalty ensures that the page builder is exercised 5105 % _before_ we change the output routine. This is necessary in the 5106 % following situation: 5107 % 5108 % The last section of the index consists only of a single entry. 5109 % Before this section, \pagetotal is less than \pagegoal, so no 5110 % break occurs before the last section starts. However, the last 5111 % section, consisting of \initial and the single \entry, does not 5112 % fit on the page and has to be broken off. Without the following 5113 % penalty the page builder will not be exercised until \eject 5114 % below, and by that time we'll already have changed the output 5115 % routine to the \balancecolumns version, so the next-to-last 5116 % double-column page will be processed with \balancecolumns, which 5117 % is wrong: The two columns will go to the main vertical list, with 5118 % the broken-off section in the recent contributions. As soon as 5119 % the output routine finishes, TeX starts reconsidering the page 5120 % break. The two columns and the broken-off section both fit on the 5121 % page, because the two columns now take up only half of the page 5122 % goal. When TeX sees \eject from below which follows the final 5123 % section, it invokes the new output routine that we've set after 5124 % \balancecolumns below; \onepageout will try to fit the two columns 5125 % and the final section into the vbox of \pageheight (see 5126 % \pagebody), causing an overfull box. 5127 % 5128 % Note that glue won't work here, because glue does not exercise the 5129 % page builder, unlike penalties (see The TeXbook, pp. 280-281). 5130 \penalty0 5131 % 5132 \output = {% 5133 % Split the last of the double-column material. Leave it on the 5134 % current page, no automatic page break. 5135 \balancecolumns 5136 % 5137 % If we end up splitting too much material for the current page, 5138 % though, there will be another page break right after this \output 5139 % invocation ends. Having called \balancecolumns once, we do not 5140 % want to call it again. Therefore, reset \output to its normal 5141 % definition right away. (We hope \balancecolumns will never be 5142 % called on to balance too much material, but if it is, this makes 5143 % the output somewhat more palatable.) 5144 \global\output = {\onepageout{\pagecontents\PAGE}}% 5145 }% 5146 \eject 5147 \endgroup % started in \begindoublecolumns 5148 % 5149 % \pagegoal was set to the doubled \vsize above, since we restarted 5150 % the current page. We're now back to normal single-column 5151 % typesetting, so reset \pagegoal to the normal \vsize (after the 5152 % \endgroup where \vsize got restored). 5153 \pagegoal = \vsize 5154} 5155% 5156% Called at the end of the double column material. 5157\def\balancecolumns{% 5158 \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120. 5159 \dimen@ = \ht0 5160 \advance\dimen@ by \topskip 5161 \advance\dimen@ by-\baselineskip 5162 \divide\dimen@ by 2 % target to split to 5163 %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}% 5164 \splittopskip = \topskip 5165 % Loop until we get a decent breakpoint. 5166 {% 5167 \vbadness = 10000 5168 \loop 5169 \global\setbox3 = \copy0 5170 \global\setbox1 = \vsplit3 to \dimen@ 5171 \ifdim\ht3>\dimen@ 5172 \global\advance\dimen@ by 1pt 5173 \repeat 5174 }% 5175 %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}% 5176 \setbox0=\vbox to\dimen@{\unvbox1}% 5177 \setbox2=\vbox to\dimen@{\unvbox3}% 5178 % 5179 \pagesofar 5180} 5181\catcode`\@ = \other 5182 5183 5184\message{sectioning,} 5185% Chapters, sections, etc. 5186 5187% Let's start with @part. 5188\outer\parseargdef\part{\partzzz{#1}} 5189\def\partzzz#1{% 5190 \chapoddpage 5191 \null 5192 \vskip.3\vsize % move it down on the page a bit 5193 \begingroup 5194 \noindent \titlefonts\rmisbold #1\par % the text 5195 \let\lastnode=\empty % no node to associate with 5196 \writetocentry{part}{#1}{}% but put it in the toc 5197 \headingsoff % no headline or footline on the part page 5198 \chapoddpage 5199 \endgroup 5200} 5201 5202% \unnumberedno is an oxymoron. But we count the unnumbered 5203% sections so that we can refer to them unambiguously in the pdf 5204% outlines by their "section number". We avoid collisions with chapter 5205% numbers by starting them at 10000. (If a document ever has 10000 5206% chapters, we're in trouble anyway, I'm sure.) 5207\newcount\unnumberedno \unnumberedno = 10000 5208\newcount\chapno 5209\newcount\secno \secno=0 5210\newcount\subsecno \subsecno=0 5211\newcount\subsubsecno \subsubsecno=0 5212 5213% This counter is funny since it counts through charcodes of letters A, B, ... 5214\newcount\appendixno \appendixno = `\@ 5215% 5216% \def\appendixletter{\char\the\appendixno} 5217% We do the following ugly conditional instead of the above simple 5218% construct for the sake of pdftex, which needs the actual 5219% letter in the expansion, not just typeset. 5220% 5221\def\appendixletter{% 5222 \ifnum\appendixno=`A A% 5223 \else\ifnum\appendixno=`B B% 5224 \else\ifnum\appendixno=`C C% 5225 \else\ifnum\appendixno=`D D% 5226 \else\ifnum\appendixno=`E E% 5227 \else\ifnum\appendixno=`F F% 5228 \else\ifnum\appendixno=`G G% 5229 \else\ifnum\appendixno=`H H% 5230 \else\ifnum\appendixno=`I I% 5231 \else\ifnum\appendixno=`J J% 5232 \else\ifnum\appendixno=`K K% 5233 \else\ifnum\appendixno=`L L% 5234 \else\ifnum\appendixno=`M M% 5235 \else\ifnum\appendixno=`N N% 5236 \else\ifnum\appendixno=`O O% 5237 \else\ifnum\appendixno=`P P% 5238 \else\ifnum\appendixno=`Q Q% 5239 \else\ifnum\appendixno=`R R% 5240 \else\ifnum\appendixno=`S S% 5241 \else\ifnum\appendixno=`T T% 5242 \else\ifnum\appendixno=`U U% 5243 \else\ifnum\appendixno=`V V% 5244 \else\ifnum\appendixno=`W W% 5245 \else\ifnum\appendixno=`X X% 5246 \else\ifnum\appendixno=`Y Y% 5247 \else\ifnum\appendixno=`Z Z% 5248 % The \the is necessary, despite appearances, because \appendixletter is 5249 % expanded while writing the .toc file. \char\appendixno is not 5250 % expandable, thus it is written literally, thus all appendixes come out 5251 % with the same letter (or @) in the toc without it. 5252 \else\char\the\appendixno 5253 \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi 5254 \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} 5255 5256% Each @chapter defines these (using marks) as the number+name, number 5257% and name of the chapter. Page headings and footings can use 5258% these. @section does likewise. 5259\def\thischapter{} 5260\def\thischapternum{} 5261\def\thischaptername{} 5262\def\thissection{} 5263\def\thissectionnum{} 5264\def\thissectionname{} 5265 5266\newcount\absseclevel % used to calculate proper heading level 5267\newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count 5268 5269% @raisesections: treat @section as chapter, @subsection as section, etc. 5270\def\raisesections{\global\advance\secbase by -1} 5271\let\up=\raisesections % original BFox name 5272 5273% @lowersections: treat @chapter as section, @section as subsection, etc. 5274\def\lowersections{\global\advance\secbase by 1} 5275\let\down=\lowersections % original BFox name 5276 5277% we only have subsub. 5278\chardef\maxseclevel = 3 5279% 5280% A numbered section within an unnumbered changes to unnumbered too. 5281% To achieve this, remember the "biggest" unnum. sec. we are currently in: 5282\chardef\unnlevel = \maxseclevel 5283% 5284% Trace whether the current chapter is an appendix or not: 5285% \chapheadtype is "N" or "A", unnumbered chapters are ignored. 5286\def\chapheadtype{N} 5287 5288% Choose a heading macro 5289% #1 is heading type 5290% #2 is heading level 5291% #3 is text for heading 5292\def\genhead#1#2#3{% 5293 % Compute the abs. sec. level: 5294 \absseclevel=#2 5295 \advance\absseclevel by \secbase 5296 % Make sure \absseclevel doesn't fall outside the range: 5297 \ifnum \absseclevel < 0 5298 \absseclevel = 0 5299 \else 5300 \ifnum \absseclevel > 3 5301 \absseclevel = 3 5302 \fi 5303 \fi 5304 % The heading type: 5305 \def\headtype{#1}% 5306 \if \headtype U% 5307 \ifnum \absseclevel < \unnlevel 5308 \chardef\unnlevel = \absseclevel 5309 \fi 5310 \else 5311 % Check for appendix sections: 5312 \ifnum \absseclevel = 0 5313 \edef\chapheadtype{\headtype}% 5314 \else 5315 \if \headtype A\if \chapheadtype N% 5316 \errmessage{@appendix... within a non-appendix chapter}% 5317 \fi\fi 5318 \fi 5319 % Check for numbered within unnumbered: 5320 \ifnum \absseclevel > \unnlevel 5321 \def\headtype{U}% 5322 \else 5323 \chardef\unnlevel = 3 5324 \fi 5325 \fi 5326 % Now print the heading: 5327 \if \headtype U% 5328 \ifcase\absseclevel 5329 \unnumberedzzz{#3}% 5330 \or \unnumberedseczzz{#3}% 5331 \or \unnumberedsubseczzz{#3}% 5332 \or \unnumberedsubsubseczzz{#3}% 5333 \fi 5334 \else 5335 \if \headtype A% 5336 \ifcase\absseclevel 5337 \appendixzzz{#3}% 5338 \or \appendixsectionzzz{#3}% 5339 \or \appendixsubseczzz{#3}% 5340 \or \appendixsubsubseczzz{#3}% 5341 \fi 5342 \else 5343 \ifcase\absseclevel 5344 \chapterzzz{#3}% 5345 \or \seczzz{#3}% 5346 \or \numberedsubseczzz{#3}% 5347 \or \numberedsubsubseczzz{#3}% 5348 \fi 5349 \fi 5350 \fi 5351 \suppressfirstparagraphindent 5352} 5353 5354% an interface: 5355\def\numhead{\genhead N} 5356\def\apphead{\genhead A} 5357\def\unnmhead{\genhead U} 5358 5359% @chapter, @appendix, @unnumbered. Increment top-level counter, reset 5360% all lower-level sectioning counters to zero. 5361% 5362% Also set \chaplevelprefix, which we prepend to @float sequence numbers 5363% (e.g., figures), q.v. By default (before any chapter), that is empty. 5364\let\chaplevelprefix = \empty 5365% 5366\outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz 5367\def\chapterzzz#1{% 5368 % section resetting is \global in case the chapter is in a group, such 5369 % as an @include file. 5370 \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 5371 \global\advance\chapno by 1 5372 % 5373 % Used for \float. 5374 \gdef\chaplevelprefix{\the\chapno.}% 5375 \resetallfloatnos 5376 % 5377 % \putwordChapter can contain complex things in translations. 5378 \toks0=\expandafter{\putwordChapter}% 5379 \message{\the\toks0 \space \the\chapno}% 5380 % 5381 % Write the actual heading. 5382 \chapmacro{#1}{Ynumbered}{\the\chapno}% 5383 % 5384 % So @section and the like are numbered underneath this chapter. 5385 \global\let\section = \numberedsec 5386 \global\let\subsection = \numberedsubsec 5387 \global\let\subsubsection = \numberedsubsubsec 5388} 5389 5390\outer\parseargdef\appendix{\apphead0{#1}} % normally calls appendixzzz 5391% 5392\def\appendixzzz#1{% 5393 \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 5394 \global\advance\appendixno by 1 5395 \gdef\chaplevelprefix{\appendixletter.}% 5396 \resetallfloatnos 5397 % 5398 % \putwordAppendix can contain complex things in translations. 5399 \toks0=\expandafter{\putwordAppendix}% 5400 \message{\the\toks0 \space \appendixletter}% 5401 % 5402 \chapmacro{#1}{Yappendix}{\appendixletter}% 5403 % 5404 \global\let\section = \appendixsec 5405 \global\let\subsection = \appendixsubsec 5406 \global\let\subsubsection = \appendixsubsubsec 5407} 5408 5409% normally unnmhead0 calls unnumberedzzz: 5410\outer\parseargdef\unnumbered{\unnmhead0{#1}} 5411\def\unnumberedzzz#1{% 5412 \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 5413 \global\advance\unnumberedno by 1 5414 % 5415 % Since an unnumbered has no number, no prefix for figures. 5416 \global\let\chaplevelprefix = \empty 5417 \resetallfloatnos 5418 % 5419 % This used to be simply \message{#1}, but TeX fully expands the 5420 % argument to \message. Therefore, if #1 contained @-commands, TeX 5421 % expanded them. For example, in `@unnumbered The @cite{Book}', TeX 5422 % expanded @cite (which turns out to cause errors because \cite is meant 5423 % to be executed, not expanded). 5424 % 5425 % Anyway, we don't want the fully-expanded definition of @cite to appear 5426 % as a result of the \message, we just want `@cite' itself. We use 5427 % \the<toks register> to achieve this: TeX expands \the<toks> only once, 5428 % simply yielding the contents of <toks register>. (We also do this for 5429 % the toc entries.) 5430 \toks0 = {#1}% 5431 \message{(\the\toks0)}% 5432 % 5433 \chapmacro{#1}{Ynothing}{\the\unnumberedno}% 5434 % 5435 \global\let\section = \unnumberedsec 5436 \global\let\subsection = \unnumberedsubsec 5437 \global\let\subsubsection = \unnumberedsubsubsec 5438} 5439 5440% @centerchap is like @unnumbered, but the heading is centered. 5441\outer\parseargdef\centerchap{% 5442 % Well, we could do the following in a group, but that would break 5443 % an assumption that \chapmacro is called at the outermost level. 5444 % Thus we are safer this way: --kasal, 24feb04 5445 \let\centerparametersmaybe = \centerparameters 5446 \unnmhead0{#1}% 5447 \let\centerparametersmaybe = \relax 5448} 5449 5450% @top is like @unnumbered. 5451\let\top\unnumbered 5452 5453% Sections. 5454% 5455\outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz 5456\def\seczzz#1{% 5457 \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 5458 \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}% 5459} 5460 5461% normally calls appendixsectionzzz: 5462\outer\parseargdef\appendixsection{\apphead1{#1}} 5463\def\appendixsectionzzz#1{% 5464 \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 5465 \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}% 5466} 5467\let\appendixsec\appendixsection 5468 5469% normally calls unnumberedseczzz: 5470\outer\parseargdef\unnumberedsec{\unnmhead1{#1}} 5471\def\unnumberedseczzz#1{% 5472 \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 5473 \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}% 5474} 5475 5476% Subsections. 5477% 5478% normally calls numberedsubseczzz: 5479\outer\parseargdef\numberedsubsec{\numhead2{#1}} 5480\def\numberedsubseczzz#1{% 5481 \global\subsubsecno=0 \global\advance\subsecno by 1 5482 \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}% 5483} 5484 5485% normally calls appendixsubseczzz: 5486\outer\parseargdef\appendixsubsec{\apphead2{#1}} 5487\def\appendixsubseczzz#1{% 5488 \global\subsubsecno=0 \global\advance\subsecno by 1 5489 \sectionheading{#1}{subsec}{Yappendix}% 5490 {\appendixletter.\the\secno.\the\subsecno}% 5491} 5492 5493% normally calls unnumberedsubseczzz: 5494\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} 5495\def\unnumberedsubseczzz#1{% 5496 \global\subsubsecno=0 \global\advance\subsecno by 1 5497 \sectionheading{#1}{subsec}{Ynothing}% 5498 {\the\unnumberedno.\the\secno.\the\subsecno}% 5499} 5500 5501% Subsubsections. 5502% 5503% normally numberedsubsubseczzz: 5504\outer\parseargdef\numberedsubsubsec{\numhead3{#1}} 5505\def\numberedsubsubseczzz#1{% 5506 \global\advance\subsubsecno by 1 5507 \sectionheading{#1}{subsubsec}{Ynumbered}% 5508 {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}% 5509} 5510 5511% normally appendixsubsubseczzz: 5512\outer\parseargdef\appendixsubsubsec{\apphead3{#1}} 5513\def\appendixsubsubseczzz#1{% 5514 \global\advance\subsubsecno by 1 5515 \sectionheading{#1}{subsubsec}{Yappendix}% 5516 {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}% 5517} 5518 5519% normally unnumberedsubsubseczzz: 5520\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} 5521\def\unnumberedsubsubseczzz#1{% 5522 \global\advance\subsubsecno by 1 5523 \sectionheading{#1}{subsubsec}{Ynothing}% 5524 {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}% 5525} 5526 5527% These macros control what the section commands do, according 5528% to what kind of chapter we are in (ordinary, appendix, or unnumbered). 5529% Define them by default for a numbered chapter. 5530\let\section = \numberedsec 5531\let\subsection = \numberedsubsec 5532\let\subsubsection = \numberedsubsubsec 5533 5534% Define @majorheading, @heading and @subheading 5535 5536% NOTE on use of \vbox for chapter headings, section headings, and such: 5537% 1) We use \vbox rather than the earlier \line to permit 5538% overlong headings to fold. 5539% 2) \hyphenpenalty is set to 10000 because hyphenation in a 5540% heading is obnoxious; this forbids it. 5541% 3) Likewise, headings look best if no \parindent is used, and 5542% if justification is not attempted. Hence \raggedright. 5543 5544\def\majorheading{% 5545 {\advance\chapheadingskip by 10pt \chapbreak }% 5546 \parsearg\chapheadingzzz 5547} 5548 5549\def\chapheading{\chapbreak \parsearg\chapheadingzzz} 5550\def\chapheadingzzz#1{% 5551 {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 5552 \parindent=0pt\ptexraggedright 5553 \rmisbold #1\hfill}}% 5554 \bigskip \par\penalty 200\relax 5555 \suppressfirstparagraphindent 5556} 5557 5558% @heading, @subheading, @subsubheading. 5559\parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{} 5560 \suppressfirstparagraphindent} 5561\parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{} 5562 \suppressfirstparagraphindent} 5563\parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{} 5564 \suppressfirstparagraphindent} 5565 5566% These macros generate a chapter, section, etc. heading only 5567% (including whitespace, linebreaking, etc. around it), 5568% given all the information in convenient, parsed form. 5569 5570% Args are the skip and penalty (usually negative) 5571\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} 5572 5573% Parameter controlling skip before chapter headings (if needed) 5574\newskip\chapheadingskip 5575 5576% Define plain chapter starts, and page on/off switching for it. 5577\def\chapbreak{\dobreak \chapheadingskip {-4000}} 5578\def\chappager{\par\vfill\supereject} 5579% Because \domark is called before \chapoddpage, the filler page will 5580% get the headings for the next chapter, which is wrong. But we don't 5581% care -- we just disable all headings on the filler page. 5582\def\chapoddpage{% 5583 \chappager 5584 \ifodd\pageno \else 5585 \begingroup 5586 \headingsoff 5587 \null 5588 \chappager 5589 \endgroup 5590 \fi 5591} 5592 5593\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} 5594 5595\def\CHAPPAGoff{% 5596\global\let\contentsalignmacro = \chappager 5597\global\let\pchapsepmacro=\chapbreak 5598\global\let\pagealignmacro=\chappager} 5599 5600\def\CHAPPAGon{% 5601\global\let\contentsalignmacro = \chappager 5602\global\let\pchapsepmacro=\chappager 5603\global\let\pagealignmacro=\chappager 5604\global\def\HEADINGSon{\HEADINGSsingle}} 5605 5606\def\CHAPPAGodd{% 5607\global\let\contentsalignmacro = \chapoddpage 5608\global\let\pchapsepmacro=\chapoddpage 5609\global\let\pagealignmacro=\chapoddpage 5610\global\def\HEADINGSon{\HEADINGSdouble}} 5611 5612\CHAPPAGon 5613 5614% Chapter opening. 5615% 5616% #1 is the text, #2 is the section type (Ynumbered, Ynothing, 5617% Yappendix, Yomitfromtoc), #3 the chapter number. 5618% 5619% To test against our argument. 5620\def\Ynothingkeyword{Ynothing} 5621\def\Yomitfromtockeyword{Yomitfromtoc} 5622\def\Yappendixkeyword{Yappendix} 5623% 5624\def\chapmacro#1#2#3{% 5625 % Insert the first mark before the heading break (see notes for \domark). 5626 \let\prevchapterdefs=\lastchapterdefs 5627 \let\prevsectiondefs=\lastsectiondefs 5628 \gdef\lastsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}% 5629 \gdef\thissection{}}% 5630 % 5631 \def\temptype{#2}% 5632 \ifx\temptype\Ynothingkeyword 5633 \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% 5634 \gdef\thischapter{\thischaptername}}% 5635 \else\ifx\temptype\Yomitfromtockeyword 5636 \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% 5637 \gdef\thischapter{}}% 5638 \else\ifx\temptype\Yappendixkeyword 5639 \toks0={#1}% 5640 \xdef\lastchapterdefs{% 5641 \gdef\noexpand\thischaptername{\the\toks0}% 5642 \gdef\noexpand\thischapternum{\appendixletter}% 5643 % \noexpand\putwordAppendix avoids expanding indigestible 5644 % commands in some of the translations. 5645 \gdef\noexpand\thischapter{\noexpand\putwordAppendix{} 5646 \noexpand\thischapternum: 5647 \noexpand\thischaptername}% 5648 }% 5649 \else 5650 \toks0={#1}% 5651 \xdef\lastchapterdefs{% 5652 \gdef\noexpand\thischaptername{\the\toks0}% 5653 \gdef\noexpand\thischapternum{\the\chapno}% 5654 % \noexpand\putwordChapter avoids expanding indigestible 5655 % commands in some of the translations. 5656 \gdef\noexpand\thischapter{\noexpand\putwordChapter{} 5657 \noexpand\thischapternum: 5658 \noexpand\thischaptername}% 5659 }% 5660 \fi\fi\fi 5661 % 5662 % Output the mark. Pass it through \safewhatsit, to take care of 5663 % the preceding space. 5664 \safewhatsit\domark 5665 % 5666 % Insert the chapter heading break. 5667 \pchapsepmacro 5668 % 5669 % Now the second mark, after the heading break. No break points 5670 % between here and the heading. 5671 \let\prevchapterdefs=\lastchapterdefs 5672 \let\prevsectiondefs=\lastsectiondefs 5673 \domark 5674 % 5675 {% 5676 \chapfonts \rmisbold 5677 % 5678 % Have to define \lastsection before calling \donoderef, because the 5679 % xref code eventually uses it. On the other hand, it has to be called 5680 % after \pchapsepmacro, or the headline will change too soon. 5681 \gdef\lastsection{#1}% 5682 % 5683 % Only insert the separating space if we have a chapter/appendix 5684 % number, and don't print the unnumbered ``number''. 5685 \ifx\temptype\Ynothingkeyword 5686 \setbox0 = \hbox{}% 5687 \def\toctype{unnchap}% 5688 \else\ifx\temptype\Yomitfromtockeyword 5689 \setbox0 = \hbox{}% contents like unnumbered, but no toc entry 5690 \def\toctype{omit}% 5691 \else\ifx\temptype\Yappendixkeyword 5692 \setbox0 = \hbox{\putwordAppendix{} #3\enspace}% 5693 \def\toctype{app}% 5694 \else 5695 \setbox0 = \hbox{#3\enspace}% 5696 \def\toctype{numchap}% 5697 \fi\fi\fi 5698 % 5699 % Write the toc entry for this chapter. Must come before the 5700 % \donoderef, because we include the current node name in the toc 5701 % entry, and \donoderef resets it to empty. 5702 \writetocentry{\toctype}{#1}{#3}% 5703 % 5704 % For pdftex, we have to write out the node definition (aka, make 5705 % the pdfdest) after any page break, but before the actual text has 5706 % been typeset. If the destination for the pdf outline is after the 5707 % text, then jumping from the outline may wind up with the text not 5708 % being visible, for instance under high magnification. 5709 \donoderef{#2}% 5710 % 5711 % Typeset the actual heading. 5712 \nobreak % Avoid page breaks at the interline glue. 5713 \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright 5714 \hangindent=\wd0 \centerparametersmaybe 5715 \unhbox0 #1\par}% 5716 }% 5717 \nobreak\bigskip % no page break after a chapter title 5718 \nobreak 5719} 5720 5721% @centerchap -- centered and unnumbered. 5722\let\centerparametersmaybe = \relax 5723\def\centerparameters{% 5724 \advance\rightskip by 3\rightskip 5725 \leftskip = \rightskip 5726 \parfillskip = 0pt 5727} 5728 5729 5730% I don't think this chapter style is supported any more, so I'm not 5731% updating it with the new noderef stuff. We'll see. --karl, 11aug03. 5732% 5733\def\setchapterstyle #1 {\csname CHAPF#1\endcsname} 5734% 5735\def\unnchfopen #1{% 5736\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 5737 \parindent=0pt\ptexraggedright 5738 \rmisbold #1\hfill}}\bigskip \par\nobreak 5739} 5740\def\chfopen #1#2{\chapoddpage {\chapfonts 5741\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% 5742\par\penalty 5000 % 5743} 5744\def\centerchfopen #1{% 5745\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 5746 \parindent=0pt 5747 \hfill {\rmisbold #1}\hfill}}\bigskip \par\nobreak 5748} 5749\def\CHAPFopen{% 5750 \global\let\chapmacro=\chfopen 5751 \global\let\centerchapmacro=\centerchfopen} 5752 5753 5754% Section titles. These macros combine the section number parts and 5755% call the generic \sectionheading to do the printing. 5756% 5757\newskip\secheadingskip 5758\def\secheadingbreak{\dobreak \secheadingskip{-1000}} 5759 5760% Subsection titles. 5761\newskip\subsecheadingskip 5762\def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}} 5763 5764% Subsubsection titles. 5765\def\subsubsecheadingskip{\subsecheadingskip} 5766\def\subsubsecheadingbreak{\subsecheadingbreak} 5767 5768 5769% Print any size, any type, section title. 5770% 5771% #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is 5772% the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the 5773% section number. 5774% 5775\def\seckeyword{sec} 5776% 5777\def\sectionheading#1#2#3#4{% 5778 {% 5779 \checkenv{}% should not be in an environment. 5780 % 5781 % Switch to the right set of fonts. 5782 \csname #2fonts\endcsname \rmisbold 5783 % 5784 \def\sectionlevel{#2}% 5785 \def\temptype{#3}% 5786 % 5787 % Insert first mark before the heading break (see notes for \domark). 5788 \let\prevsectiondefs=\lastsectiondefs 5789 \ifx\temptype\Ynothingkeyword 5790 \ifx\sectionlevel\seckeyword 5791 \gdef\lastsectiondefs{\gdef\thissectionname{#1}\gdef\thissectionnum{}% 5792 \gdef\thissection{\thissectionname}}% 5793 \fi 5794 \else\ifx\temptype\Yomitfromtockeyword 5795 % Don't redefine \thissection. 5796 \else\ifx\temptype\Yappendixkeyword 5797 \ifx\sectionlevel\seckeyword 5798 \toks0={#1}% 5799 \xdef\lastsectiondefs{% 5800 \gdef\noexpand\thissectionname{\the\toks0}% 5801 \gdef\noexpand\thissectionnum{#4}% 5802 % \noexpand\putwordSection avoids expanding indigestible 5803 % commands in some of the translations. 5804 \gdef\noexpand\thissection{\noexpand\putwordSection{} 5805 \noexpand\thissectionnum: 5806 \noexpand\thissectionname}% 5807 }% 5808 \fi 5809 \else 5810 \ifx\sectionlevel\seckeyword 5811 \toks0={#1}% 5812 \xdef\lastsectiondefs{% 5813 \gdef\noexpand\thissectionname{\the\toks0}% 5814 \gdef\noexpand\thissectionnum{#4}% 5815 % \noexpand\putwordSection avoids expanding indigestible 5816 % commands in some of the translations. 5817 \gdef\noexpand\thissection{\noexpand\putwordSection{} 5818 \noexpand\thissectionnum: 5819 \noexpand\thissectionname}% 5820 }% 5821 \fi 5822 \fi\fi\fi 5823 % 5824 % Go into vertical mode. Usually we'll already be there, but we 5825 % don't want the following whatsit to end up in a preceding paragraph 5826 % if the document didn't happen to have a blank line. 5827 \par 5828 % 5829 % Output the mark. Pass it through \safewhatsit, to take care of 5830 % the preceding space. 5831 \safewhatsit\domark 5832 % 5833 % Insert space above the heading. 5834 \csname #2headingbreak\endcsname 5835 % 5836 % Now the second mark, after the heading break. No break points 5837 % between here and the heading. 5838 \let\prevsectiondefs=\lastsectiondefs 5839 \domark 5840 % 5841 % Only insert the space after the number if we have a section number. 5842 \ifx\temptype\Ynothingkeyword 5843 \setbox0 = \hbox{}% 5844 \def\toctype{unn}% 5845 \gdef\lastsection{#1}% 5846 \else\ifx\temptype\Yomitfromtockeyword 5847 % for @headings -- no section number, don't include in toc, 5848 % and don't redefine \lastsection. 5849 \setbox0 = \hbox{}% 5850 \def\toctype{omit}% 5851 \let\sectionlevel=\empty 5852 \else\ifx\temptype\Yappendixkeyword 5853 \setbox0 = \hbox{#4\enspace}% 5854 \def\toctype{app}% 5855 \gdef\lastsection{#1}% 5856 \else 5857 \setbox0 = \hbox{#4\enspace}% 5858 \def\toctype{num}% 5859 \gdef\lastsection{#1}% 5860 \fi\fi\fi 5861 % 5862 % Write the toc entry (before \donoderef). See comments in \chapmacro. 5863 \writetocentry{\toctype\sectionlevel}{#1}{#4}% 5864 % 5865 % Write the node reference (= pdf destination for pdftex). 5866 % Again, see comments in \chapmacro. 5867 \donoderef{#3}% 5868 % 5869 % Interline glue will be inserted when the vbox is completed. 5870 % That glue will be a valid breakpoint for the page, since it'll be 5871 % preceded by a whatsit (usually from the \donoderef, or from the 5872 % \writetocentry if there was no node). We don't want to allow that 5873 % break, since then the whatsits could end up on page n while the 5874 % section is on page n+1, thus toc/etc. are wrong. Debian bug 276000. 5875 \nobreak 5876 % 5877 % Output the actual section heading. 5878 \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright 5879 \hangindent=\wd0 % zero if no section number 5880 \unhbox0 #1}% 5881 }% 5882 % Add extra space after the heading -- half of whatever came above it. 5883 % Don't allow stretch, though. 5884 \kern .5 \csname #2headingskip\endcsname 5885 % 5886 % Do not let the kern be a potential breakpoint, as it would be if it 5887 % was followed by glue. 5888 \nobreak 5889 % 5890 % We'll almost certainly start a paragraph next, so don't let that 5891 % glue accumulate. (Not a breakpoint because it's preceded by a 5892 % discardable item.) However, when a paragraph is not started next 5893 % (\startdefun, \cartouche, \center, etc.), this needs to be wiped out 5894 % or the negative glue will cause weirdly wrong output, typically 5895 % obscuring the section heading with something else. 5896 \vskip-\parskip 5897 % 5898 % This is so the last item on the main vertical list is a known 5899 % \penalty > 10000, so \startdefun, etc., can recognize the situation 5900 % and do the needful. 5901 \penalty 10001 5902} 5903 5904 5905\message{toc,} 5906% Table of contents. 5907\newwrite\tocfile 5908 5909% Write an entry to the toc file, opening it if necessary. 5910% Called from @chapter, etc. 5911% 5912% Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno} 5913% We append the current node name (if any) and page number as additional 5914% arguments for the \{chap,sec,...}entry macros which will eventually 5915% read this. The node name is used in the pdf outlines as the 5916% destination to jump to. 5917% 5918% We open the .toc file for writing here instead of at @setfilename (or 5919% any other fixed time) so that @contents can be anywhere in the document. 5920% But if #1 is `omit', then we don't do anything. This is used for the 5921% table of contents chapter openings themselves. 5922% 5923\newif\iftocfileopened 5924\def\omitkeyword{omit}% 5925% 5926\def\writetocentry#1#2#3{% 5927 \edef\writetoctype{#1}% 5928 \ifx\writetoctype\omitkeyword \else 5929 \iftocfileopened\else 5930 \immediate\openout\tocfile = \jobname.toc 5931 \global\tocfileopenedtrue 5932 \fi 5933 % 5934 \iflinks 5935 {\atdummies 5936 \edef\temp{% 5937 \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}% 5938 \temp 5939 }% 5940 \fi 5941 \fi 5942 % 5943 % Tell \shipout to create a pdf destination on each page, if we're 5944 % writing pdf. These are used in the table of contents. We can't 5945 % just write one on every page because the title pages are numbered 5946 % 1 and 2 (the page numbers aren't printed), and so are the first 5947 % two pages of the document. Thus, we'd have two destinations named 5948 % `1', and two named `2'. 5949 \ifpdf \global\pdfmakepagedesttrue \fi 5950} 5951 5952 5953% These characters do not print properly in the Computer Modern roman 5954% fonts, so we must take special care. This is more or less redundant 5955% with the Texinfo input format setup at the end of this file. 5956% 5957\def\activecatcodes{% 5958 \catcode`\"=\active 5959 \catcode`\$=\active 5960 \catcode`\<=\active 5961 \catcode`\>=\active 5962 \catcode`\\=\active 5963 \catcode`\^=\active 5964 \catcode`\_=\active 5965 \catcode`\|=\active 5966 \catcode`\~=\active 5967} 5968 5969 5970% Read the toc file, which is essentially Texinfo input. 5971\def\readtocfile{% 5972 \setupdatafile 5973 \activecatcodes 5974 \input \tocreadfilename 5975} 5976 5977\newskip\contentsrightmargin \contentsrightmargin=1in 5978\newcount\savepageno 5979\newcount\lastnegativepageno \lastnegativepageno = -1 5980 5981% Prepare to read what we've written to \tocfile. 5982% 5983\def\startcontents#1{% 5984 % If @setchapternewpage on, and @headings double, the contents should 5985 % start on an odd page, unlike chapters. Thus, we maintain 5986 % \contentsalignmacro in parallel with \pagealignmacro. 5987 % From: Torbjorn Granlund <tege@matematik.su.se> 5988 \contentsalignmacro 5989 \immediate\closeout\tocfile 5990 % 5991 % Don't need to put `Contents' or `Short Contents' in the headline. 5992 % It is abundantly clear what they are. 5993 \chapmacro{#1}{Yomitfromtoc}{}% 5994 % 5995 \savepageno = \pageno 5996 \begingroup % Set up to handle contents files properly. 5997 \raggedbottom % Worry more about breakpoints than the bottom. 5998 \advance\hsize by -\contentsrightmargin % Don't use the full line length. 5999 % 6000 % Roman numerals for page numbers. 6001 \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi 6002} 6003 6004% redefined for the two-volume lispref. We always output on 6005% \jobname.toc even if this is redefined. 6006% 6007\def\tocreadfilename{\jobname.toc} 6008 6009% Normal (long) toc. 6010% 6011\def\contents{% 6012 \startcontents{\putwordTOC}% 6013 \openin 1 \tocreadfilename\space 6014 \ifeof 1 \else 6015 \readtocfile 6016 \fi 6017 \vfill \eject 6018 \contentsalignmacro % in case @setchapternewpage odd is in effect 6019 \ifeof 1 \else 6020 \pdfmakeoutlines 6021 \fi 6022 \closein 1 6023 \endgroup 6024 \lastnegativepageno = \pageno 6025 \global\pageno = \savepageno 6026} 6027 6028% And just the chapters. 6029\def\summarycontents{% 6030 \startcontents{\putwordShortTOC}% 6031 % 6032 \let\partentry = \shortpartentry 6033 \let\numchapentry = \shortchapentry 6034 \let\appentry = \shortchapentry 6035 \let\unnchapentry = \shortunnchapentry 6036 % We want a true roman here for the page numbers. 6037 \secfonts 6038 \let\rm=\shortcontrm \let\bf=\shortcontbf 6039 \let\sl=\shortcontsl \let\tt=\shortconttt 6040 \rm 6041 \hyphenpenalty = 10000 6042 \advance\baselineskip by 1pt % Open it up a little. 6043 \def\numsecentry##1##2##3##4{} 6044 \let\appsecentry = \numsecentry 6045 \let\unnsecentry = \numsecentry 6046 \let\numsubsecentry = \numsecentry 6047 \let\appsubsecentry = \numsecentry 6048 \let\unnsubsecentry = \numsecentry 6049 \let\numsubsubsecentry = \numsecentry 6050 \let\appsubsubsecentry = \numsecentry 6051 \let\unnsubsubsecentry = \numsecentry 6052 \openin 1 \tocreadfilename\space 6053 \ifeof 1 \else 6054 \readtocfile 6055 \fi 6056 \closein 1 6057 \vfill \eject 6058 \contentsalignmacro % in case @setchapternewpage odd is in effect 6059 \endgroup 6060 \lastnegativepageno = \pageno 6061 \global\pageno = \savepageno 6062} 6063\let\shortcontents = \summarycontents 6064 6065% Typeset the label for a chapter or appendix for the short contents. 6066% The arg is, e.g., `A' for an appendix, or `3' for a chapter. 6067% 6068\def\shortchaplabel#1{% 6069 % This space should be enough, since a single number is .5em, and the 6070 % widest letter (M) is 1em, at least in the Computer Modern fonts. 6071 % But use \hss just in case. 6072 % (This space doesn't include the extra space that gets added after 6073 % the label; that gets put in by \shortchapentry above.) 6074 % 6075 % We'd like to right-justify chapter numbers, but that looks strange 6076 % with appendix letters. And right-justifying numbers and 6077 % left-justifying letters looks strange when there is less than 10 6078 % chapters. Have to read the whole toc once to know how many chapters 6079 % there are before deciding ... 6080 \hbox to 1em{#1\hss}% 6081} 6082 6083% These macros generate individual entries in the table of contents. 6084% The first argument is the chapter or section name. 6085% The last argument is the page number. 6086% The arguments in between are the chapter number, section number, ... 6087 6088% Parts, in the main contents. Replace the part number, which doesn't 6089% exist, with an empty box. Let's hope all the numbers have the same width. 6090% Also ignore the page number, which is conventionally not printed. 6091\def\numeralbox{\setbox0=\hbox{8}\hbox to \wd0{\hfil}} 6092\def\partentry#1#2#3#4{\dochapentry{\numeralbox\labelspace#1}{}} 6093% 6094% Parts, in the short toc. 6095\def\shortpartentry#1#2#3#4{% 6096 \penalty-300 6097 \vskip.5\baselineskip plus.15\baselineskip minus.1\baselineskip 6098 \shortchapentry{{\bf #1}}{\numeralbox}{}{}% 6099} 6100 6101% Chapters, in the main contents. 6102\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}} 6103% 6104% Chapters, in the short toc. 6105% See comments in \dochapentry re vbox and related settings. 6106\def\shortchapentry#1#2#3#4{% 6107 \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}% 6108} 6109 6110% Appendices, in the main contents. 6111% Need the word Appendix, and a fixed-size box. 6112% 6113\def\appendixbox#1{% 6114 % We use M since it's probably the widest letter. 6115 \setbox0 = \hbox{\putwordAppendix{} M}% 6116 \hbox to \wd0{\putwordAppendix{} #1\hss}} 6117% 6118\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}} 6119 6120% Unnumbered chapters. 6121\def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}} 6122\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}} 6123 6124% Sections. 6125\def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}} 6126\let\appsecentry=\numsecentry 6127\def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}} 6128 6129% Subsections. 6130\def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}} 6131\let\appsubsecentry=\numsubsecentry 6132\def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}} 6133 6134% And subsubsections. 6135\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}} 6136\let\appsubsubsecentry=\numsubsubsecentry 6137\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}} 6138 6139% This parameter controls the indentation of the various levels. 6140% Same as \defaultparindent. 6141\newdimen\tocindent \tocindent = 15pt 6142 6143% Now for the actual typesetting. In all these, #1 is the text and #2 is the 6144% page number. 6145% 6146% If the toc has to be broken over pages, we want it to be at chapters 6147% if at all possible; hence the \penalty. 6148\def\dochapentry#1#2{% 6149 \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip 6150 \begingroup 6151 \chapentryfonts 6152 \tocentry{#1}{\dopageno\bgroup#2\egroup}% 6153 \endgroup 6154 \nobreak\vskip .25\baselineskip plus.1\baselineskip 6155} 6156 6157\def\dosecentry#1#2{\begingroup 6158 \secentryfonts \leftskip=\tocindent 6159 \tocentry{#1}{\dopageno\bgroup#2\egroup}% 6160\endgroup} 6161 6162\def\dosubsecentry#1#2{\begingroup 6163 \subsecentryfonts \leftskip=2\tocindent 6164 \tocentry{#1}{\dopageno\bgroup#2\egroup}% 6165\endgroup} 6166 6167\def\dosubsubsecentry#1#2{\begingroup 6168 \subsubsecentryfonts \leftskip=3\tocindent 6169 \tocentry{#1}{\dopageno\bgroup#2\egroup}% 6170\endgroup} 6171 6172% We use the same \entry macro as for the index entries. 6173\let\tocentry = \entry 6174 6175% Space between chapter (or whatever) number and the title. 6176\def\labelspace{\hskip1em \relax} 6177 6178\def\dopageno#1{{\rm #1}} 6179\def\doshortpageno#1{{\rm #1}} 6180 6181\def\chapentryfonts{\secfonts \rm} 6182\def\secentryfonts{\textfonts} 6183\def\subsecentryfonts{\textfonts} 6184\def\subsubsecentryfonts{\textfonts} 6185 6186 6187\message{environments,} 6188% @foo ... @end foo. 6189 6190% @tex ... @end tex escapes into raw TeX temporarily. 6191% One exception: @ is still an escape character, so that @end tex works. 6192% But \@ or @@ will get a plain @ character. 6193 6194\envdef\tex{% 6195 \setupmarkupstyle{tex}% 6196 \catcode `\\=0 \catcode `\{=1 \catcode `\}=2 6197 \catcode `\$=3 \catcode `\&=4 \catcode `\#=6 6198 \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie 6199 \catcode `\%=14 6200 \catcode `\+=\other 6201 \catcode `\"=\other 6202 \catcode `\|=\other 6203 \catcode `\<=\other 6204 \catcode `\>=\other 6205 \catcode`\`=\other 6206 \catcode`\'=\other 6207 \escapechar=`\\ 6208 % 6209 % ' is active in math mode (mathcode"8000). So reset it, and all our 6210 % other math active characters (just in case), to plain's definitions. 6211 \mathactive 6212 % 6213 \let\b=\ptexb 6214 \let\bullet=\ptexbullet 6215 \let\c=\ptexc 6216 \let\,=\ptexcomma 6217 \let\.=\ptexdot 6218 \let\dots=\ptexdots 6219 \let\equiv=\ptexequiv 6220 \let\!=\ptexexclam 6221 \let\i=\ptexi 6222 \let\indent=\ptexindent 6223 \let\noindent=\ptexnoindent 6224 \let\{=\ptexlbrace 6225 \let\+=\tabalign 6226 \let\}=\ptexrbrace 6227 \let\/=\ptexslash 6228 \let\*=\ptexstar 6229 \let\t=\ptext 6230 \expandafter \let\csname top\endcsname=\ptextop % outer 6231 \let\frenchspacing=\plainfrenchspacing 6232 % 6233 \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% 6234 \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}% 6235 \def\@{@}% 6236} 6237% There is no need to define \Etex. 6238 6239% Define @lisp ... @end lisp. 6240% @lisp environment forms a group so it can rebind things, 6241% including the definition of @end lisp (which normally is erroneous). 6242 6243% Amount to narrow the margins by for @lisp. 6244\newskip\lispnarrowing \lispnarrowing=0.4in 6245 6246% This is the definition that ^^M gets inside @lisp, @example, and other 6247% such environments. \null is better than a space, since it doesn't 6248% have any width. 6249\def\lisppar{\null\endgraf} 6250 6251% This space is always present above and below environments. 6252\newskip\envskipamount \envskipamount = 0pt 6253 6254% Make spacing and below environment symmetrical. We use \parskip here 6255% to help in doing that, since in @example-like environments \parskip 6256% is reset to zero; thus the \afterenvbreak inserts no space -- but the 6257% start of the next paragraph will insert \parskip. 6258% 6259\def\aboveenvbreak{{% 6260 % =10000 instead of <10000 because of a special case in \itemzzz and 6261 % \sectionheading, q.v. 6262 \ifnum \lastpenalty=10000 \else 6263 \advance\envskipamount by \parskip 6264 \endgraf 6265 \ifdim\lastskip<\envskipamount 6266 \removelastskip 6267 % it's not a good place to break if the last penalty was \nobreak 6268 % or better ... 6269 \ifnum\lastpenalty<10000 \penalty-50 \fi 6270 \vskip\envskipamount 6271 \fi 6272 \fi 6273}} 6274 6275\let\afterenvbreak = \aboveenvbreak 6276 6277% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins; it will 6278% also clear it, so that its embedded environments do the narrowing again. 6279\let\nonarrowing=\relax 6280 6281% @cartouche ... @end cartouche: draw rectangle w/rounded corners around 6282% environment contents. 6283\font\circle=lcircle10 6284\newdimen\circthick 6285\newdimen\cartouter\newdimen\cartinner 6286\newskip\normbskip\newskip\normpskip\newskip\normlskip 6287\circthick=\fontdimen8\circle 6288% 6289\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth 6290\def\ctr{{\hskip 6pt\circle\char'010}} 6291\def\cbl{{\circle\char'012\hskip -6pt}} 6292\def\cbr{{\hskip 6pt\circle\char'011}} 6293\def\carttop{\hbox to \cartouter{\hskip\lskip 6294 \ctl\leaders\hrule height\circthick\hfil\ctr 6295 \hskip\rskip}} 6296\def\cartbot{\hbox to \cartouter{\hskip\lskip 6297 \cbl\leaders\hrule height\circthick\hfil\cbr 6298 \hskip\rskip}} 6299% 6300\newskip\lskip\newskip\rskip 6301 6302\envdef\cartouche{% 6303 \ifhmode\par\fi % can't be in the midst of a paragraph. 6304 \startsavinginserts 6305 \lskip=\leftskip \rskip=\rightskip 6306 \leftskip=0pt\rightskip=0pt % we want these *outside*. 6307 \cartinner=\hsize \advance\cartinner by-\lskip 6308 \advance\cartinner by-\rskip 6309 \cartouter=\hsize 6310 \advance\cartouter by 18.4pt % allow for 3pt kerns on either 6311 % side, and for 6pt waste from 6312 % each corner char, and rule thickness 6313 \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip 6314 % Flag to tell @lisp, etc., not to narrow margin. 6315 \let\nonarrowing = t% 6316 % 6317 % If this cartouche directly follows a sectioning command, we need the 6318 % \parskip glue (backspaced over by default) or the cartouche can 6319 % collide with the section heading. 6320 \ifnum\lastpenalty>10000 \vskip\parskip \penalty\lastpenalty \fi 6321 % 6322 \vbox\bgroup 6323 \baselineskip=0pt\parskip=0pt\lineskip=0pt 6324 \carttop 6325 \hbox\bgroup 6326 \hskip\lskip 6327 \vrule\kern3pt 6328 \vbox\bgroup 6329 \kern3pt 6330 \hsize=\cartinner 6331 \baselineskip=\normbskip 6332 \lineskip=\normlskip 6333 \parskip=\normpskip 6334 \vskip -\parskip 6335 \comment % For explanation, see the end of def\group. 6336} 6337\def\Ecartouche{% 6338 \ifhmode\par\fi 6339 \kern3pt 6340 \egroup 6341 \kern3pt\vrule 6342 \hskip\rskip 6343 \egroup 6344 \cartbot 6345 \egroup 6346 \checkinserts 6347} 6348 6349 6350% This macro is called at the beginning of all the @example variants, 6351% inside a group. 6352\newdimen\nonfillparindent 6353\def\nonfillstart{% 6354 \aboveenvbreak 6355 \hfuzz = 12pt % Don't be fussy 6356 \sepspaces % Make spaces be word-separators rather than space tokens. 6357 \let\par = \lisppar % don't ignore blank lines 6358 \obeylines % each line of input is a line of output 6359 \parskip = 0pt 6360 % Turn off paragraph indentation but redefine \indent to emulate 6361 % the normal \indent. 6362 \nonfillparindent=\parindent 6363 \parindent = 0pt 6364 \let\indent\nonfillindent 6365 % 6366 \emergencystretch = 0pt % don't try to avoid overfull boxes 6367 \ifx\nonarrowing\relax 6368 \advance \leftskip by \lispnarrowing 6369 \exdentamount=\lispnarrowing 6370 \else 6371 \let\nonarrowing = \relax 6372 \fi 6373 \let\exdent=\nofillexdent 6374} 6375 6376\begingroup 6377\obeyspaces 6378% We want to swallow spaces (but not other tokens) after the fake 6379% @indent in our nonfill-environments, where spaces are normally 6380% active and set to @tie, resulting in them not being ignored after 6381% @indent. 6382\gdef\nonfillindent{\futurelet\temp\nonfillindentcheck}% 6383\gdef\nonfillindentcheck{% 6384\ifx\temp % 6385\expandafter\nonfillindentgobble% 6386\else% 6387\leavevmode\nonfillindentbox% 6388\fi% 6389}% 6390\endgroup 6391\def\nonfillindentgobble#1{\nonfillindent} 6392\def\nonfillindentbox{\hbox to \nonfillparindent{\hss}} 6393 6394% If you want all examples etc. small: @set dispenvsize small. 6395% If you want even small examples the full size: @set dispenvsize nosmall. 6396% This affects the following displayed environments: 6397% @example, @display, @format, @lisp 6398% 6399\def\smallword{small} 6400\def\nosmallword{nosmall} 6401\let\SETdispenvsize\relax 6402\def\setnormaldispenv{% 6403 \ifx\SETdispenvsize\smallword 6404 % end paragraph for sake of leading, in case document has no blank 6405 % line. This is redundant with what happens in \aboveenvbreak, but 6406 % we need to do it before changing the fonts, and it's inconvenient 6407 % to change the fonts afterward. 6408 \ifnum \lastpenalty=10000 \else \endgraf \fi 6409 \smallexamplefonts \rm 6410 \fi 6411} 6412\def\setsmalldispenv{% 6413 \ifx\SETdispenvsize\nosmallword 6414 \else 6415 \ifnum \lastpenalty=10000 \else \endgraf \fi 6416 \smallexamplefonts \rm 6417 \fi 6418} 6419 6420% We often define two environments, @foo and @smallfoo. 6421% Let's do it in one command. #1 is the env name, #2 the definition. 6422\def\makedispenvdef#1#2{% 6423 \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}% 6424 \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}% 6425 \expandafter\let\csname E#1\endcsname \afterenvbreak 6426 \expandafter\let\csname Esmall#1\endcsname \afterenvbreak 6427} 6428 6429% Define two environment synonyms (#1 and #2) for an environment. 6430\def\maketwodispenvdef#1#2#3{% 6431 \makedispenvdef{#1}{#3}% 6432 \makedispenvdef{#2}{#3}% 6433} 6434% 6435% @lisp: indented, narrowed, typewriter font; 6436% @example: same as @lisp. 6437% 6438% @smallexample and @smalllisp: use smaller fonts. 6439% Originally contributed by Pavel@xerox. 6440% 6441\maketwodispenvdef{lisp}{example}{% 6442 \nonfillstart 6443 \tt\setupmarkupstyle{example}% 6444 \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. 6445 \gobble % eat return 6446} 6447% @display/@smalldisplay: same as @lisp except keep current font. 6448% 6449\makedispenvdef{display}{% 6450 \nonfillstart 6451 \gobble 6452} 6453 6454% @format/@smallformat: same as @display except don't narrow margins. 6455% 6456\makedispenvdef{format}{% 6457 \let\nonarrowing = t% 6458 \nonfillstart 6459 \gobble 6460} 6461 6462% @flushleft: same as @format, but doesn't obey \SETdispenvsize. 6463\envdef\flushleft{% 6464 \let\nonarrowing = t% 6465 \nonfillstart 6466 \gobble 6467} 6468\let\Eflushleft = \afterenvbreak 6469 6470% @flushright. 6471% 6472\envdef\flushright{% 6473 \let\nonarrowing = t% 6474 \nonfillstart 6475 \advance\leftskip by 0pt plus 1fill\relax 6476 \gobble 6477} 6478\let\Eflushright = \afterenvbreak 6479 6480 6481% @raggedright does more-or-less normal line breaking but no right 6482% justification. From plain.tex. 6483\envdef\raggedright{% 6484 \rightskip0pt plus2em \spaceskip.3333em \xspaceskip.5em\relax 6485} 6486\let\Eraggedright\par 6487 6488\envdef\raggedleft{% 6489 \parindent=0pt \leftskip0pt plus2em 6490 \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt 6491 \hbadness=10000 % Last line will usually be underfull, so turn off 6492 % badness reporting. 6493} 6494\let\Eraggedleft\par 6495 6496\envdef\raggedcenter{% 6497 \parindent=0pt \rightskip0pt plus1em \leftskip0pt plus1em 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\Eraggedcenter\par 6503 6504 6505% @quotation does normal linebreaking (hence we can't use \nonfillstart) 6506% and narrows the margins. We keep \parskip nonzero in general, since 6507% we're doing normal filling. So, when using \aboveenvbreak and 6508% \afterenvbreak, temporarily make \parskip 0. 6509% 6510\makedispenvdef{quotation}{\quotationstart} 6511% 6512\def\quotationstart{% 6513 {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip 6514 \parindent=0pt 6515 % 6516 % @cartouche defines \nonarrowing to inhibit narrowing at next level down. 6517 \ifx\nonarrowing\relax 6518 \advance\leftskip by \lispnarrowing 6519 \advance\rightskip by \lispnarrowing 6520 \exdentamount = \lispnarrowing 6521 \else 6522 \let\nonarrowing = \relax 6523 \fi 6524 \parsearg\quotationlabel 6525} 6526 6527% We have retained a nonzero parskip for the environment, since we're 6528% doing normal filling. 6529% 6530\def\Equotation{% 6531 \par 6532 \ifx\quotationauthor\thisisundefined\else 6533 % indent a bit. 6534 \leftline{\kern 2\leftskip \sl ---\quotationauthor}% 6535 \fi 6536 {\parskip=0pt \afterenvbreak}% 6537} 6538\def\Esmallquotation{\Equotation} 6539 6540% If we're given an argument, typeset it in bold with a colon after. 6541\def\quotationlabel#1{% 6542 \def\temp{#1}% 6543 \ifx\temp\empty \else 6544 {\bf #1: }% 6545 \fi 6546} 6547 6548 6549% LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>} 6550% If we want to allow any <char> as delimiter, 6551% we need the curly braces so that makeinfo sees the @verb command, eg: 6552% `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org 6553% 6554% [Knuth]: Donald Ervin Knuth, 1996. The TeXbook. 6555% 6556% [Knuth] p.344; only we need to do the other characters Texinfo sets 6557% active too. Otherwise, they get lost as the first character on a 6558% verbatim line. 6559\def\dospecials{% 6560 \do\ \do\\\do\{\do\}\do\$\do\&% 6561 \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~% 6562 \do\<\do\>\do\|\do\@\do+\do\"% 6563 % Don't do the quotes -- if we do, @set txicodequoteundirected and 6564 % @set txicodequotebacktick will not have effect on @verb and 6565 % @verbatim, and ?` and !` ligatures won't get disabled. 6566 %\do\`\do\'% 6567} 6568% 6569% [Knuth] p. 380 6570\def\uncatcodespecials{% 6571 \def\do##1{\catcode`##1=\other}\dospecials} 6572% 6573% Setup for the @verb command. 6574% 6575% Eight spaces for a tab 6576\begingroup 6577 \catcode`\^^I=\active 6578 \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }} 6579\endgroup 6580% 6581\def\setupverb{% 6582 \tt % easiest (and conventionally used) font for verbatim 6583 \def\par{\leavevmode\endgraf}% 6584 \setupmarkupstyle{verb}% 6585 \tabeightspaces 6586 % Respect line breaks, 6587 % print special symbols as themselves, and 6588 % make each space count 6589 % must do in this order: 6590 \obeylines \uncatcodespecials \sepspaces 6591} 6592 6593% Setup for the @verbatim environment 6594% 6595% Real tab expansion. 6596\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount 6597% 6598% We typeset each line of the verbatim in an \hbox, so we can handle 6599% tabs. The \global is in case the verbatim line starts with an accent, 6600% or some other command that starts with a begin-group. Otherwise, the 6601% entire \verbbox would disappear at the corresponding end-group, before 6602% it is typeset. Meanwhile, we can't have nested verbatim commands 6603% (can we?), so the \global won't be overwriting itself. 6604\newbox\verbbox 6605\def\starttabbox{\global\setbox\verbbox=\hbox\bgroup} 6606% 6607\begingroup 6608 \catcode`\^^I=\active 6609 \gdef\tabexpand{% 6610 \catcode`\^^I=\active 6611 \def^^I{\leavevmode\egroup 6612 \dimen\verbbox=\wd\verbbox % the width so far, or since the previous tab 6613 \divide\dimen\verbbox by\tabw 6614 \multiply\dimen\verbbox by\tabw % compute previous multiple of \tabw 6615 \advance\dimen\verbbox by\tabw % advance to next multiple of \tabw 6616 \wd\verbbox=\dimen\verbbox \box\verbbox \starttabbox 6617 }% 6618 } 6619\endgroup 6620 6621% start the verbatim environment. 6622\def\setupverbatim{% 6623 \let\nonarrowing = t% 6624 \nonfillstart 6625 \tt % easiest (and conventionally used) font for verbatim 6626 % The \leavevmode here is for blank lines. Otherwise, we would 6627 % never \starttabox and the \egroup would end verbatim mode. 6628 \def\par{\leavevmode\egroup\box\verbbox\endgraf}% 6629 \tabexpand 6630 \setupmarkupstyle{verbatim}% 6631 % Respect line breaks, 6632 % print special symbols as themselves, and 6633 % make each space count. 6634 % Must do in this order: 6635 \obeylines \uncatcodespecials \sepspaces 6636 \everypar{\starttabbox}% 6637} 6638 6639% Do the @verb magic: verbatim text is quoted by unique 6640% delimiter characters. Before first delimiter expect a 6641% right brace, after last delimiter expect closing brace: 6642% 6643% \def\doverb'{'<char>#1<char>'}'{#1} 6644% 6645% [Knuth] p. 382; only eat outer {} 6646\begingroup 6647 \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other 6648 \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next] 6649\endgroup 6650% 6651\def\verb{\begingroup\setupverb\doverb} 6652% 6653% 6654% Do the @verbatim magic: define the macro \doverbatim so that 6655% the (first) argument ends when '@end verbatim' is reached, ie: 6656% 6657% \def\doverbatim#1@end verbatim{#1} 6658% 6659% For Texinfo it's a lot easier than for LaTeX, 6660% because texinfo's \verbatim doesn't stop at '\end{verbatim}': 6661% we need not redefine '\', '{' and '}'. 6662% 6663% Inspired by LaTeX's verbatim command set [latex.ltx] 6664% 6665\begingroup 6666 \catcode`\ =\active 6667 \obeylines % 6668 % ignore everything up to the first ^^M, that's the newline at the end 6669 % of the @verbatim input line itself. Otherwise we get an extra blank 6670 % line in the output. 6671 \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}% 6672 % We really want {...\end verbatim} in the body of the macro, but 6673 % without the active space; thus we have to use \xdef and \gobble. 6674\endgroup 6675% 6676\envdef\verbatim{% 6677 \setupverbatim\doverbatim 6678} 6679\let\Everbatim = \afterenvbreak 6680 6681 6682% @verbatiminclude FILE - insert text of file in verbatim environment. 6683% 6684\def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude} 6685% 6686\def\doverbatiminclude#1{% 6687 {% 6688 \makevalueexpandable 6689 \setupverbatim 6690 \indexnofonts % Allow `@@' and other weird things in file names. 6691 \wlog{texinfo.tex: doing @verbatiminclude of #1^^J}% 6692 \input #1 6693 \afterenvbreak 6694 }% 6695} 6696 6697% @copying ... @end copying. 6698% Save the text away for @insertcopying later. 6699% 6700% We save the uninterpreted tokens, rather than creating a box. 6701% Saving the text in a box would be much easier, but then all the 6702% typesetting commands (@smallbook, font changes, etc.) have to be done 6703% beforehand -- and a) we want @copying to be done first in the source 6704% file; b) letting users define the frontmatter in as flexible order as 6705% possible is very desirable. 6706% 6707\def\copying{\checkenv{}\begingroup\scanargctxt\docopying} 6708\def\docopying#1@end copying{\endgroup\def\copyingtext{#1}} 6709% 6710\def\insertcopying{% 6711 \begingroup 6712 \parindent = 0pt % paragraph indentation looks wrong on title page 6713 \scanexp\copyingtext 6714 \endgroup 6715} 6716 6717 6718\message{defuns,} 6719% @defun etc. 6720 6721\newskip\defbodyindent \defbodyindent=.4in 6722\newskip\defargsindent \defargsindent=50pt 6723\newskip\deflastargmargin \deflastargmargin=18pt 6724\newcount\defunpenalty 6725 6726% Start the processing of @deffn: 6727\def\startdefun{% 6728 \ifnum\lastpenalty<10000 6729 \medbreak 6730 \defunpenalty=10003 % Will keep this @deffn together with the 6731 % following @def command, see below. 6732 \else 6733 % If there are two @def commands in a row, we'll have a \nobreak, 6734 % which is there to keep the function description together with its 6735 % header. But if there's nothing but headers, we need to allow a 6736 % break somewhere. Check specifically for penalty 10002, inserted 6737 % by \printdefunline, instead of 10000, since the sectioning 6738 % commands also insert a nobreak penalty, and we don't want to allow 6739 % a break between a section heading and a defun. 6740 % 6741 % As a further refinement, we avoid "club" headers by signalling 6742 % with penalty of 10003 after the very first @deffn in the 6743 % sequence (see above), and penalty of 10002 after any following 6744 % @def command. 6745 \ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \fi 6746 % 6747 % Similarly, after a section heading, do not allow a break. 6748 % But do insert the glue. 6749 \medskip % preceded by discardable penalty, so not a breakpoint 6750 \fi 6751 % 6752 \parindent=0in 6753 \advance\leftskip by \defbodyindent 6754 \exdentamount=\defbodyindent 6755} 6756 6757\def\dodefunx#1{% 6758 % First, check whether we are in the right environment: 6759 \checkenv#1% 6760 % 6761 % As above, allow line break if we have multiple x headers in a row. 6762 % It's not a great place, though. 6763 \ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi 6764 % 6765 % And now, it's time to reuse the body of the original defun: 6766 \expandafter\gobbledefun#1% 6767} 6768\def\gobbledefun#1\startdefun{} 6769 6770% \printdefunline \deffnheader{text} 6771% 6772\def\printdefunline#1#2{% 6773 \begingroup 6774 % call \deffnheader: 6775 #1#2 \endheader 6776 % common ending: 6777 \interlinepenalty = 10000 6778 \advance\rightskip by 0pt plus 1fil\relax 6779 \endgraf 6780 \nobreak\vskip -\parskip 6781 \penalty\defunpenalty % signal to \startdefun and \dodefunx 6782 % Some of the @defun-type tags do not enable magic parentheses, 6783 % rendering the following check redundant. But we don't optimize. 6784 \checkparencounts 6785 \endgroup 6786} 6787 6788\def\Edefun{\endgraf\medbreak} 6789 6790% \makedefun{deffn} creates \deffn, \deffnx and \Edeffn; 6791% the only thing remaining is to define \deffnheader. 6792% 6793\def\makedefun#1{% 6794 \expandafter\let\csname E#1\endcsname = \Edefun 6795 \edef\temp{\noexpand\domakedefun 6796 \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}% 6797 \temp 6798} 6799 6800% \domakedefun \deffn \deffnx \deffnheader 6801% 6802% Define \deffn and \deffnx, without parameters. 6803% \deffnheader has to be defined explicitly. 6804% 6805\def\domakedefun#1#2#3{% 6806 \envdef#1{% 6807 \startdefun 6808 \doingtypefnfalse % distinguish typed functions from all else 6809 \parseargusing\activeparens{\printdefunline#3}% 6810 }% 6811 \def#2{\dodefunx#1}% 6812 \def#3% 6813} 6814 6815\newif\ifdoingtypefn % doing typed function? 6816\newif\ifrettypeownline % typeset return type on its own line? 6817 6818% @deftypefnnewline on|off says whether the return type of typed functions 6819% are printed on their own line. This affects @deftypefn, @deftypefun, 6820% @deftypeop, and @deftypemethod. 6821% 6822\parseargdef\deftypefnnewline{% 6823 \def\temp{#1}% 6824 \ifx\temp\onword 6825 \expandafter\let\csname SETtxideftypefnnl\endcsname 6826 = \empty 6827 \else\ifx\temp\offword 6828 \expandafter\let\csname SETtxideftypefnnl\endcsname 6829 = \relax 6830 \else 6831 \errhelp = \EMsimple 6832 \errmessage{Unknown @txideftypefnnl value `\temp', 6833 must be on|off}% 6834 \fi\fi 6835} 6836 6837% Untyped functions: 6838 6839% @deffn category name args 6840\makedefun{deffn}{\deffngeneral{}} 6841 6842% @deffn category class name args 6843\makedefun{defop}#1 {\defopon{#1\ \putwordon}} 6844 6845% \defopon {category on}class name args 6846\def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } 6847 6848% \deffngeneral {subind}category name args 6849% 6850\def\deffngeneral#1#2 #3 #4\endheader{% 6851 % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}. 6852 \dosubind{fn}{\code{#3}}{#1}% 6853 \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}% 6854} 6855 6856% Typed functions: 6857 6858% @deftypefn category type name args 6859\makedefun{deftypefn}{\deftypefngeneral{}} 6860 6861% @deftypeop category class type name args 6862\makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}} 6863 6864% \deftypeopon {category on}class type name args 6865\def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } 6866 6867% \deftypefngeneral {subind}category type name args 6868% 6869\def\deftypefngeneral#1#2 #3 #4 #5\endheader{% 6870 \dosubind{fn}{\code{#4}}{#1}% 6871 \doingtypefntrue 6872 \defname{#2}{#3}{#4}\defunargs{#5\unskip}% 6873} 6874 6875% Typed variables: 6876 6877% @deftypevr category type var args 6878\makedefun{deftypevr}{\deftypecvgeneral{}} 6879 6880% @deftypecv category class type var args 6881\makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}} 6882 6883% \deftypecvof {category of}class type var args 6884\def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} } 6885 6886% \deftypecvgeneral {subind}category type var args 6887% 6888\def\deftypecvgeneral#1#2 #3 #4 #5\endheader{% 6889 \dosubind{vr}{\code{#4}}{#1}% 6890 \defname{#2}{#3}{#4}\defunargs{#5\unskip}% 6891} 6892 6893% Untyped variables: 6894 6895% @defvr category var args 6896\makedefun{defvr}#1 {\deftypevrheader{#1} {} } 6897 6898% @defcv category class var args 6899\makedefun{defcv}#1 {\defcvof{#1\ \putwordof}} 6900 6901% \defcvof {category of}class var args 6902\def\defcvof#1#2 {\deftypecvof{#1}#2 {} } 6903 6904% Types: 6905 6906% @deftp category name args 6907\makedefun{deftp}#1 #2 #3\endheader{% 6908 \doind{tp}{\code{#2}}% 6909 \defname{#1}{}{#2}\defunargs{#3\unskip}% 6910} 6911 6912% Remaining @defun-like shortcuts: 6913\makedefun{defun}{\deffnheader{\putwordDeffunc} } 6914\makedefun{defmac}{\deffnheader{\putwordDefmac} } 6915\makedefun{defspec}{\deffnheader{\putwordDefspec} } 6916\makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} } 6917\makedefun{defvar}{\defvrheader{\putwordDefvar} } 6918\makedefun{defopt}{\defvrheader{\putwordDefopt} } 6919\makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} } 6920\makedefun{defmethod}{\defopon\putwordMethodon} 6921\makedefun{deftypemethod}{\deftypeopon\putwordMethodon} 6922\makedefun{defivar}{\defcvof\putwordInstanceVariableof} 6923\makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof} 6924 6925% \defname, which formats the name of the @def (not the args). 6926% #1 is the category, such as "Function". 6927% #2 is the return type, if any. 6928% #3 is the function name. 6929% 6930% We are followed by (but not passed) the arguments, if any. 6931% 6932\def\defname#1#2#3{% 6933 \par 6934 % Get the values of \leftskip and \rightskip as they were outside the @def... 6935 \advance\leftskip by -\defbodyindent 6936 % 6937 % Determine if we are typesetting the return type of a typed function 6938 % on a line by itself. 6939 \rettypeownlinefalse 6940 \ifdoingtypefn % doing a typed function specifically? 6941 % then check user option for putting return type on its own line: 6942 \expandafter\ifx\csname SETtxideftypefnnl\endcsname\relax \else 6943 \rettypeownlinetrue 6944 \fi 6945 \fi 6946 % 6947 % How we'll format the category name. Putting it in brackets helps 6948 % distinguish it from the body text that may end up on the next line 6949 % just below it. 6950 \def\temp{#1}% 6951 \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi} 6952 % 6953 % Figure out line sizes for the paragraph shape. We'll always have at 6954 % least two. 6955 \tempnum = 2 6956 % 6957 % The first line needs space for \box0; but if \rightskip is nonzero, 6958 % we need only space for the part of \box0 which exceeds it: 6959 \dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip 6960 % 6961 % If doing a return type on its own line, we'll have another line. 6962 \ifrettypeownline 6963 \advance\tempnum by 1 6964 \def\maybeshapeline{0in \hsize}% 6965 \else 6966 \def\maybeshapeline{}% 6967 \fi 6968 % 6969 % The continuations: 6970 \dimen2=\hsize \advance\dimen2 by -\defargsindent 6971 % 6972 % The final paragraph shape: 6973 \parshape \tempnum 0in \dimen0 \maybeshapeline \defargsindent \dimen2 6974 % 6975 % Put the category name at the right margin. 6976 \noindent 6977 \hbox to 0pt{% 6978 \hfil\box0 \kern-\hsize 6979 % \hsize has to be shortened this way: 6980 \kern\leftskip 6981 % Intentionally do not respect \rightskip, since we need the space. 6982 }% 6983 % 6984 % Allow all lines to be underfull without complaint: 6985 \tolerance=10000 \hbadness=10000 6986 \exdentamount=\defbodyindent 6987 {% 6988 % defun fonts. We use typewriter by default (used to be bold) because: 6989 % . we're printing identifiers, they should be in tt in principle. 6990 % . in languages with many accents, such as Czech or French, it's 6991 % common to leave accents off identifiers. The result looks ok in 6992 % tt, but exceedingly strange in rm. 6993 % . we don't want -- and --- to be treated as ligatures. 6994 % . this still does not fix the ?` and !` ligatures, but so far no 6995 % one has made identifiers using them :). 6996 \df \tt 6997 \def\temp{#2}% text of the return type 6998 \ifx\temp\empty\else 6999 \tclose{\temp}% typeset the return type 7000 \ifrettypeownline 7001 % put return type on its own line; prohibit line break following: 7002 \hfil\vadjust{\nobreak}\break 7003 \else 7004 \space % type on same line, so just followed by a space 7005 \fi 7006 \fi % no return type 7007 #3% output function name 7008 }% 7009 {\rm\enskip}% hskip 0.5 em of \tenrm 7010 % 7011 \boldbrax 7012 % arguments will be output next, if any. 7013} 7014 7015% Print arguments in slanted roman (not ttsl), inconsistently with using 7016% tt for the name. This is because literal text is sometimes needed in 7017% the argument list (groff manual), and ttsl and tt are not very 7018% distinguishable. Prevent hyphenation at `-' chars. 7019% 7020\def\defunargs#1{% 7021 % use sl by default (not ttsl), 7022 % tt for the names. 7023 \df \sl \hyphenchar\font=0 7024 % 7025 % On the other hand, if an argument has two dashes (for instance), we 7026 % want a way to get ttsl. Let's try @var for that. 7027 \def\var##1{{\setupmarkupstyle{var}\ttslanted{##1}}}% 7028 #1% 7029 \sl\hyphenchar\font=45 7030} 7031 7032% We want ()&[] to print specially on the defun line. 7033% 7034\def\activeparens{% 7035 \catcode`\(=\active \catcode`\)=\active 7036 \catcode`\[=\active \catcode`\]=\active 7037 \catcode`\&=\active 7038} 7039 7040% Make control sequences which act like normal parenthesis chars. 7041\let\lparen = ( \let\rparen = ) 7042 7043% Be sure that we always have a definition for `(', etc. For example, 7044% if the fn name has parens in it, \boldbrax will not be in effect yet, 7045% so TeX would otherwise complain about undefined control sequence. 7046{ 7047 \activeparens 7048 \global\let(=\lparen \global\let)=\rparen 7049 \global\let[=\lbrack \global\let]=\rbrack 7050 \global\let& = \& 7051 7052 \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} 7053 \gdef\magicamp{\let&=\amprm} 7054} 7055 7056\newcount\parencount 7057 7058% If we encounter &foo, then turn on ()-hacking afterwards 7059\newif\ifampseen 7060\def\amprm#1 {\ampseentrue{\bf\ }} 7061 7062\def\parenfont{% 7063 \ifampseen 7064 % At the first level, print parens in roman, 7065 % otherwise use the default font. 7066 \ifnum \parencount=1 \rm \fi 7067 \else 7068 % The \sf parens (in \boldbrax) actually are a little bolder than 7069 % the contained text. This is especially needed for [ and ] . 7070 \sf 7071 \fi 7072} 7073\def\infirstlevel#1{% 7074 \ifampseen 7075 \ifnum\parencount=1 7076 #1% 7077 \fi 7078 \fi 7079} 7080\def\bfafterword#1 {#1 \bf} 7081 7082\def\opnr{% 7083 \global\advance\parencount by 1 7084 {\parenfont(}% 7085 \infirstlevel \bfafterword 7086} 7087\def\clnr{% 7088 {\parenfont)}% 7089 \infirstlevel \sl 7090 \global\advance\parencount by -1 7091} 7092 7093\newcount\brackcount 7094\def\lbrb{% 7095 \global\advance\brackcount by 1 7096 {\bf[}% 7097} 7098\def\rbrb{% 7099 {\bf]}% 7100 \global\advance\brackcount by -1 7101} 7102 7103\def\checkparencounts{% 7104 \ifnum\parencount=0 \else \badparencount \fi 7105 \ifnum\brackcount=0 \else \badbrackcount \fi 7106} 7107% these should not use \errmessage; the glibc manual, at least, actually 7108% has such constructs (when documenting function pointers). 7109\def\badparencount{% 7110 \message{Warning: unbalanced parentheses in @def...}% 7111 \global\parencount=0 7112} 7113\def\badbrackcount{% 7114 \message{Warning: unbalanced square brackets in @def...}% 7115 \global\brackcount=0 7116} 7117 7118 7119\message{macros,} 7120% @macro. 7121 7122% To do this right we need a feature of e-TeX, \scantokens, 7123% which we arrange to emulate with a temporary file in ordinary TeX. 7124\ifx\eTeXversion\thisisundefined 7125 \newwrite\macscribble 7126 \def\scantokens#1{% 7127 \toks0={#1}% 7128 \immediate\openout\macscribble=\jobname.tmp 7129 \immediate\write\macscribble{\the\toks0}% 7130 \immediate\closeout\macscribble 7131 \input \jobname.tmp 7132 } 7133\fi 7134 7135\def\scanmacro#1{\begingroup 7136 \newlinechar`\^^M 7137 \let\xeatspaces\eatspaces 7138 % 7139 % Undo catcode changes of \startcontents and \doprintindex 7140 % When called from @insertcopying or (short)caption, we need active 7141 % backslash to get it printed correctly. Previously, we had 7142 % \catcode`\\=\other instead. We'll see whether a problem appears 7143 % with macro expansion. --kasal, 19aug04 7144 \catcode`\@=0 \catcode`\\=\active \escapechar=`\@ 7145 % 7146 % ... and for \example: 7147 \spaceisspace 7148 % 7149 % The \empty here causes a following catcode 5 newline to be eaten as 7150 % part of reading whitespace after a control sequence. It does not 7151 % eat a catcode 13 newline. There's no good way to handle the two 7152 % cases (untried: maybe e-TeX's \everyeof could help, though plain TeX 7153 % would then have different behavior). See the Macro Details node in 7154 % the manual for the workaround we recommend for macros and 7155 % line-oriented commands. 7156 % 7157 \scantokens{#1\empty}% 7158\endgroup} 7159 7160\def\scanexp#1{% 7161 \edef\temp{\noexpand\scanmacro{#1}}% 7162 \temp 7163} 7164 7165\newcount\paramno % Count of parameters 7166\newtoks\macname % Macro name 7167\newif\ifrecursive % Is it recursive? 7168 7169% List of all defined macros in the form 7170% \definedummyword\macro1\definedummyword\macro2... 7171% Currently is also contains all @aliases; the list can be split 7172% if there is a need. 7173\def\macrolist{} 7174 7175% Add the macro to \macrolist 7176\def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname} 7177\def\addtomacrolistxxx#1{% 7178 \toks0 = \expandafter{\macrolist\definedummyword#1}% 7179 \xdef\macrolist{\the\toks0}% 7180} 7181 7182% Utility routines. 7183% This does \let #1 = #2, with \csnames; that is, 7184% \let \csname#1\endcsname = \csname#2\endcsname 7185% (except of course we have to play expansion games). 7186% 7187\def\cslet#1#2{% 7188 \expandafter\let 7189 \csname#1\expandafter\endcsname 7190 \csname#2\endcsname 7191} 7192 7193% Trim leading and trailing spaces off a string. 7194% Concepts from aro-bend problem 15 (see CTAN). 7195{\catcode`\@=11 7196\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }} 7197\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@} 7198\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @} 7199\def\unbrace#1{#1} 7200\unbrace{\gdef\trim@@@ #1 } #2@{#1} 7201} 7202 7203% Trim a single trailing ^^M off a string. 7204{\catcode`\^^M=\other \catcode`\Q=3% 7205\gdef\eatcr #1{\eatcra #1Q^^MQ}% 7206\gdef\eatcra#1^^MQ{\eatcrb#1Q}% 7207\gdef\eatcrb#1Q#2Q{#1}% 7208} 7209 7210% Macro bodies are absorbed as an argument in a context where 7211% all characters are catcode 10, 11 or 12, except \ which is active 7212% (as in normal texinfo). It is necessary to change the definition of \ 7213% to recognize macro arguments; this is the job of \mbodybackslash. 7214% 7215% Non-ASCII encodings make 8-bit characters active, so un-activate 7216% them to avoid their expansion. Must do this non-globally, to 7217% confine the change to the current group. 7218% 7219% It's necessary to have hard CRs when the macro is executed. This is 7220% done by making ^^M (\endlinechar) catcode 12 when reading the macro 7221% body, and then making it the \newlinechar in \scanmacro. 7222% 7223\def\scanctxt{% used as subroutine 7224 \catcode`\"=\other 7225 \catcode`\+=\other 7226 \catcode`\<=\other 7227 \catcode`\>=\other 7228 \catcode`\@=\other 7229 \catcode`\^=\other 7230 \catcode`\_=\other 7231 \catcode`\|=\other 7232 \catcode`\~=\other 7233 \ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi 7234} 7235 7236\def\scanargctxt{% used for copying and captions, not macros. 7237 \scanctxt 7238 \catcode`\\=\other 7239 \catcode`\^^M=\other 7240} 7241 7242\def\macrobodyctxt{% used for @macro definitions 7243 \scanctxt 7244 \catcode`\{=\other 7245 \catcode`\}=\other 7246 \catcode`\^^M=\other 7247 \usembodybackslash 7248} 7249 7250\def\macroargctxt{% used when scanning invocations 7251 \scanctxt 7252 \catcode`\\=0 7253} 7254% why catcode 0 for \ in the above? To recognize \\ \{ \} as "escapes" 7255% for the single characters \ { }. Thus, we end up with the "commands" 7256% that would be written @\ @{ @} in a Texinfo document. 7257% 7258% We already have @{ and @}. For @\, we define it here, and only for 7259% this purpose, to produce a typewriter backslash (so, the @\ that we 7260% define for @math can't be used with @macro calls): 7261% 7262\def\\{\normalbackslash}% 7263% 7264% We would like to do this for \, too, since that is what makeinfo does. 7265% But it is not possible, because Texinfo already has a command @, for a 7266% cedilla accent. Documents must use @comma{} instead. 7267% 7268% \anythingelse will almost certainly be an error of some kind. 7269 7270 7271% \mbodybackslash is the definition of \ in @macro bodies. 7272% It maps \foo\ => \csname macarg.foo\endcsname => #N 7273% where N is the macro parameter number. 7274% We define \csname macarg.\endcsname to be \realbackslash, so 7275% \\ in macro replacement text gets you a backslash. 7276% 7277{\catcode`@=0 @catcode`@\=@active 7278 @gdef@usembodybackslash{@let\=@mbodybackslash} 7279 @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname} 7280} 7281\expandafter\def\csname macarg.\endcsname{\realbackslash} 7282 7283\def\margbackslash#1{\char`\#1 } 7284 7285\def\macro{\recursivefalse\parsearg\macroxxx} 7286\def\rmacro{\recursivetrue\parsearg\macroxxx} 7287 7288\def\macroxxx#1{% 7289 \getargs{#1}% now \macname is the macname and \argl the arglist 7290 \ifx\argl\empty % no arguments 7291 \paramno=0\relax 7292 \else 7293 \expandafter\parsemargdef \argl;% 7294 \if\paramno>256\relax 7295 \ifx\eTeXversion\thisisundefined 7296 \errhelp = \EMsimple 7297 \errmessage{You need eTeX to compile a file with macros with more than 256 arguments} 7298 \fi 7299 \fi 7300 \fi 7301 \if1\csname ismacro.\the\macname\endcsname 7302 \message{Warning: redefining \the\macname}% 7303 \else 7304 \expandafter\ifx\csname \the\macname\endcsname \relax 7305 \else \errmessage{Macro name \the\macname\space already defined}\fi 7306 \global\cslet{macsave.\the\macname}{\the\macname}% 7307 \global\expandafter\let\csname ismacro.\the\macname\endcsname=1% 7308 \addtomacrolist{\the\macname}% 7309 \fi 7310 \begingroup \macrobodyctxt 7311 \ifrecursive \expandafter\parsermacbody 7312 \else \expandafter\parsemacbody 7313 \fi} 7314 7315\parseargdef\unmacro{% 7316 \if1\csname ismacro.#1\endcsname 7317 \global\cslet{#1}{macsave.#1}% 7318 \global\expandafter\let \csname ismacro.#1\endcsname=0% 7319 % Remove the macro name from \macrolist: 7320 \begingroup 7321 \expandafter\let\csname#1\endcsname \relax 7322 \let\definedummyword\unmacrodo 7323 \xdef\macrolist{\macrolist}% 7324 \endgroup 7325 \else 7326 \errmessage{Macro #1 not defined}% 7327 \fi 7328} 7329 7330% Called by \do from \dounmacro on each macro. The idea is to omit any 7331% macro definitions that have been changed to \relax. 7332% 7333\def\unmacrodo#1{% 7334 \ifx #1\relax 7335 % remove this 7336 \else 7337 \noexpand\definedummyword \noexpand#1% 7338 \fi 7339} 7340 7341% This makes use of the obscure feature that if the last token of a 7342% <parameter list> is #, then the preceding argument is delimited by 7343% an opening brace, and that opening brace is not consumed. 7344\def\getargs#1{\getargsxxx#1{}} 7345\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs} 7346\def\getmacname#1 #2\relax{\macname={#1}} 7347\def\getmacargs#1{\def\argl{#1}} 7348 7349% For macro processing make @ a letter so that we can make Texinfo private macro names. 7350\edef\texiatcatcode{\the\catcode`\@} 7351\catcode `@=11\relax 7352 7353% Parse the optional {params} list. Set up \paramno and \paramlist 7354% so \defmacro knows what to do. Define \macarg.BLAH for each BLAH 7355% in the params list to some hook where the argument si to be expanded. If 7356% there are less than 10 arguments that hook is to be replaced by ##N where N 7357% is the position in that list, that is to say the macro arguments are to be 7358% defined `a la TeX in the macro body. 7359% 7360% That gets used by \mbodybackslash (above). 7361% 7362% We need to get `macro parameter char #' into several definitions. 7363% The technique used is stolen from LaTeX: let \hash be something 7364% unexpandable, insert that wherever you need a #, and then redefine 7365% it to # just before using the token list produced. 7366% 7367% The same technique is used to protect \eatspaces till just before 7368% the macro is used. 7369% 7370% If there are 10 or more arguments, a different technique is used, where the 7371% hook remains in the body, and when macro is to be expanded the body is 7372% processed again to replace the arguments. 7373% 7374% In that case, the hook is \the\toks N-1, and we simply set \toks N-1 to the 7375% argument N value and then \edef the body (nothing else will expand because of 7376% the catcode regime underwhich the body was input). 7377% 7378% If you compile with TeX (not eTeX), and you have macros with 10 or more 7379% arguments, you need that no macro has more than 256 arguments, otherwise an 7380% error is produced. 7381\def\parsemargdef#1;{% 7382 \paramno=0\def\paramlist{}% 7383 \let\hash\relax 7384 \let\xeatspaces\relax 7385 \parsemargdefxxx#1,;,% 7386 % In case that there are 10 or more arguments we parse again the arguments 7387 % list to set new definitions for the \macarg.BLAH macros corresponding to 7388 % each BLAH argument. It was anyhow needed to parse already once this list 7389 % in order to count the arguments, and as macros with at most 9 arguments 7390 % are by far more frequent than macro with 10 or more arguments, defining 7391 % twice the \macarg.BLAH macros does not cost too much processing power. 7392 \ifnum\paramno<10\relax\else 7393 \paramno0\relax 7394 \parsemmanyargdef@@#1,;,% 10 or more arguments 7395 \fi 7396} 7397\def\parsemargdefxxx#1,{% 7398 \if#1;\let\next=\relax 7399 \else \let\next=\parsemargdefxxx 7400 \advance\paramno by 1 7401 \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname 7402 {\xeatspaces{\hash\the\paramno}}% 7403 \edef\paramlist{\paramlist\hash\the\paramno,}% 7404 \fi\next} 7405 7406\def\parsemmanyargdef@@#1,{% 7407 \if#1;\let\next=\relax 7408 \else 7409 \let\next=\parsemmanyargdef@@ 7410 \edef\tempb{\eatspaces{#1}}% 7411 \expandafter\def\expandafter\tempa 7412 \expandafter{\csname macarg.\tempb\endcsname}% 7413 % Note that we need some extra \noexpand\noexpand, this is because we 7414 % don't want \the to be expanded in the \parsermacbody as it uses an 7415 % \xdef . 7416 \expandafter\edef\tempa 7417 {\noexpand\noexpand\noexpand\the\toks\the\paramno}% 7418 \advance\paramno by 1\relax 7419 \fi\next} 7420 7421% These two commands read recursive and nonrecursive macro bodies. 7422% (They're different since rec and nonrec macros end differently.) 7423% 7424 7425\catcode `\@\texiatcatcode 7426\long\def\parsemacbody#1@end macro% 7427{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% 7428\long\def\parsermacbody#1@end rmacro% 7429{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% 7430\catcode `\@=11\relax 7431 7432\let\endargs@\relax 7433\let\nil@\relax 7434\def\nilm@{\nil@}% 7435\long\def\nillm@{\nil@}% 7436 7437% This macro is expanded during the Texinfo macro expansion, not during its 7438% definition. It gets all the arguments values and assigns them to macros 7439% macarg.ARGNAME 7440% 7441% #1 is the macro name 7442% #2 is the list of argument names 7443% #3 is the list of argument values 7444\def\getargvals@#1#2#3{% 7445 \def\macargdeflist@{}% 7446 \def\saveparamlist@{#2}% Need to keep a copy for parameter expansion. 7447 \def\paramlist{#2,\nil@}% 7448 \def\macroname{#1}% 7449 \begingroup 7450 \macroargctxt 7451 \def\argvaluelist{#3,\nil@}% 7452 \def\@tempa{#3}% 7453 \ifx\@tempa\empty 7454 \setemptyargvalues@ 7455 \else 7456 \getargvals@@ 7457 \fi 7458} 7459 7460% 7461\def\getargvals@@{% 7462 \ifx\paramlist\nilm@ 7463 % Some sanity check needed here that \argvaluelist is also empty. 7464 \ifx\argvaluelist\nillm@ 7465 \else 7466 \errhelp = \EMsimple 7467 \errmessage{Too many arguments in macro `\macroname'!}% 7468 \fi 7469 \let\next\macargexpandinbody@ 7470 \else 7471 \ifx\argvaluelist\nillm@ 7472 % No more arguments values passed to macro. Set remaining named-arg 7473 % macros to empty. 7474 \let\next\setemptyargvalues@ 7475 \else 7476 % pop current arg name into \@tempb 7477 \def\@tempa##1{\pop@{\@tempb}{\paramlist}##1\endargs@}% 7478 \expandafter\@tempa\expandafter{\paramlist}% 7479 % pop current argument value into \@tempc 7480 \def\@tempa##1{\longpop@{\@tempc}{\argvaluelist}##1\endargs@}% 7481 \expandafter\@tempa\expandafter{\argvaluelist}% 7482 % Here \@tempb is the current arg name and \@tempc is the current arg value. 7483 % First place the new argument macro definition into \@tempd 7484 \expandafter\macname\expandafter{\@tempc}% 7485 \expandafter\let\csname macarg.\@tempb\endcsname\relax 7486 \expandafter\def\expandafter\@tempe\expandafter{% 7487 \csname macarg.\@tempb\endcsname}% 7488 \edef\@tempd{\long\def\@tempe{\the\macname}}% 7489 \push@\@tempd\macargdeflist@ 7490 \let\next\getargvals@@ 7491 \fi 7492 \fi 7493 \next 7494} 7495 7496\def\push@#1#2{% 7497 \expandafter\expandafter\expandafter\def 7498 \expandafter\expandafter\expandafter#2% 7499 \expandafter\expandafter\expandafter{% 7500 \expandafter#1#2}% 7501} 7502 7503% Replace arguments by their values in the macro body, and place the result 7504% in macro \@tempa 7505\def\macvalstoargs@{% 7506 % To do this we use the property that token registers that are \the'ed 7507 % within an \edef expand only once. So we are going to place all argument 7508 % values into respective token registers. 7509 % 7510 % First we save the token context, and initialize argument numbering. 7511 \begingroup 7512 \paramno0\relax 7513 % Then, for each argument number #N, we place the corresponding argument 7514 % value into a new token list register \toks#N 7515 \expandafter\putargsintokens@\saveparamlist@,;,% 7516 % Then, we expand the body so that argument are replaced by their 7517 % values. The trick for values not to be expanded themselves is that they 7518 % are within tokens and that tokens expand only once in an \edef . 7519 \edef\@tempc{\csname mac.\macroname .body\endcsname}% 7520 % Now we restore the token stack pointer to free the token list registers 7521 % which we have used, but we make sure that expanded body is saved after 7522 % group. 7523 \expandafter 7524 \endgroup 7525 \expandafter\def\expandafter\@tempa\expandafter{\@tempc}% 7526 } 7527 7528\def\macargexpandinbody@{% 7529 %% Define the named-macro outside of this group and then close this group. 7530 \expandafter 7531 \endgroup 7532 \macargdeflist@ 7533 % First the replace in body the macro arguments by their values, the result 7534 % is in \@tempa . 7535 \macvalstoargs@ 7536 % Then we point at the \norecurse or \gobble (for recursive) macro value 7537 % with \@tempb . 7538 \expandafter\let\expandafter\@tempb\csname mac.\macroname .recurse\endcsname 7539 % Depending on whether it is recursive or not, we need some tailing 7540 % \egroup . 7541 \ifx\@tempb\gobble 7542 \let\@tempc\relax 7543 \else 7544 \let\@tempc\egroup 7545 \fi 7546 % And now we do the real job: 7547 \edef\@tempd{\noexpand\@tempb{\macroname}\noexpand\scanmacro{\@tempa}\@tempc}% 7548 \@tempd 7549} 7550 7551\def\putargsintokens@#1,{% 7552 \if#1;\let\next\relax 7553 \else 7554 \let\next\putargsintokens@ 7555 % First we allocate the new token list register, and give it a temporary 7556 % alias \@tempb . 7557 \toksdef\@tempb\the\paramno 7558 % Then we place the argument value into that token list register. 7559 \expandafter\let\expandafter\@tempa\csname macarg.#1\endcsname 7560 \expandafter\@tempb\expandafter{\@tempa}% 7561 \advance\paramno by 1\relax 7562 \fi 7563 \next 7564} 7565 7566% Save the token stack pointer into macro #1 7567\def\texisavetoksstackpoint#1{\edef#1{\the\@cclvi}} 7568% Restore the token stack pointer from number in macro #1 7569\def\texirestoretoksstackpoint#1{\expandafter\mathchardef\expandafter\@cclvi#1\relax} 7570% newtoks that can be used non \outer . 7571\def\texinonouternewtoks{\alloc@ 5\toks \toksdef \@cclvi} 7572 7573% Tailing missing arguments are set to empty 7574\def\setemptyargvalues@{% 7575 \ifx\paramlist\nilm@ 7576 \let\next\macargexpandinbody@ 7577 \else 7578 \expandafter\setemptyargvaluesparser@\paramlist\endargs@ 7579 \let\next\setemptyargvalues@ 7580 \fi 7581 \next 7582} 7583 7584\def\setemptyargvaluesparser@#1,#2\endargs@{% 7585 \expandafter\def\expandafter\@tempa\expandafter{% 7586 \expandafter\def\csname macarg.#1\endcsname{}}% 7587 \push@\@tempa\macargdeflist@ 7588 \def\paramlist{#2}% 7589} 7590 7591% #1 is the element target macro 7592% #2 is the list macro 7593% #3,#4\endargs@ is the list value 7594\def\pop@#1#2#3,#4\endargs@{% 7595 \def#1{#3}% 7596 \def#2{#4}% 7597} 7598\long\def\longpop@#1#2#3,#4\endargs@{% 7599 \long\def#1{#3}% 7600 \long\def#2{#4}% 7601} 7602 7603% This defines a Texinfo @macro. There are eight cases: recursive and 7604% nonrecursive macros of zero, one, up to nine, and many arguments. 7605% Much magic with \expandafter here. 7606% \xdef is used so that macro definitions will survive the file 7607% they're defined in; @include reads the file inside a group. 7608% 7609\def\defmacro{% 7610 \let\hash=##% convert placeholders to macro parameter chars 7611 \ifrecursive 7612 \ifcase\paramno 7613 % 0 7614 \expandafter\xdef\csname\the\macname\endcsname{% 7615 \noexpand\scanmacro{\temp}}% 7616 \or % 1 7617 \expandafter\xdef\csname\the\macname\endcsname{% 7618 \bgroup\noexpand\macroargctxt 7619 \noexpand\braceorline 7620 \expandafter\noexpand\csname\the\macname xxx\endcsname}% 7621 \expandafter\xdef\csname\the\macname xxx\endcsname##1{% 7622 \egroup\noexpand\scanmacro{\temp}}% 7623 \else 7624 \ifnum\paramno<10\relax % at most 9 7625 \expandafter\xdef\csname\the\macname\endcsname{% 7626 \bgroup\noexpand\macroargctxt 7627 \noexpand\csname\the\macname xx\endcsname}% 7628 \expandafter\xdef\csname\the\macname xx\endcsname##1{% 7629 \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% 7630 \expandafter\expandafter 7631 \expandafter\xdef 7632 \expandafter\expandafter 7633 \csname\the\macname xxx\endcsname 7634 \paramlist{\egroup\noexpand\scanmacro{\temp}}% 7635 \else % 10 or more 7636 \expandafter\xdef\csname\the\macname\endcsname{% 7637 \noexpand\getargvals@{\the\macname}{\argl}% 7638 }% 7639 \global\expandafter\let\csname mac.\the\macname .body\endcsname\temp 7640 \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\gobble 7641 \fi 7642 \fi 7643 \else 7644 \ifcase\paramno 7645 % 0 7646 \expandafter\xdef\csname\the\macname\endcsname{% 7647 \noexpand\norecurse{\the\macname}% 7648 \noexpand\scanmacro{\temp}\egroup}% 7649 \or % 1 7650 \expandafter\xdef\csname\the\macname\endcsname{% 7651 \bgroup\noexpand\macroargctxt 7652 \noexpand\braceorline 7653 \expandafter\noexpand\csname\the\macname xxx\endcsname}% 7654 \expandafter\xdef\csname\the\macname xxx\endcsname##1{% 7655 \egroup 7656 \noexpand\norecurse{\the\macname}% 7657 \noexpand\scanmacro{\temp}\egroup}% 7658 \else % at most 9 7659 \ifnum\paramno<10\relax 7660 \expandafter\xdef\csname\the\macname\endcsname{% 7661 \bgroup\noexpand\macroargctxt 7662 \expandafter\noexpand\csname\the\macname xx\endcsname}% 7663 \expandafter\xdef\csname\the\macname xx\endcsname##1{% 7664 \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% 7665 \expandafter\expandafter 7666 \expandafter\xdef 7667 \expandafter\expandafter 7668 \csname\the\macname xxx\endcsname 7669 \paramlist{% 7670 \egroup 7671 \noexpand\norecurse{\the\macname}% 7672 \noexpand\scanmacro{\temp}\egroup}% 7673 \else % 10 or more: 7674 \expandafter\xdef\csname\the\macname\endcsname{% 7675 \noexpand\getargvals@{\the\macname}{\argl}% 7676 }% 7677 \global\expandafter\let\csname mac.\the\macname .body\endcsname\temp 7678 \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\norecurse 7679 \fi 7680 \fi 7681 \fi} 7682 7683\catcode `\@\texiatcatcode\relax 7684 7685\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} 7686 7687% \braceorline decides whether the next nonwhitespace character is a 7688% {. If so it reads up to the closing }, if not, it reads the whole 7689% line. Whatever was read is then fed to the next control sequence 7690% as an argument (by \parsebrace or \parsearg). 7691% 7692\def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx} 7693\def\braceorlinexxx{% 7694 \ifx\nchar\bgroup\else 7695 \expandafter\parsearg 7696 \fi \macnamexxx} 7697 7698 7699% @alias. 7700% We need some trickery to remove the optional spaces around the equal 7701% sign. Make them active and then expand them all to nothing. 7702% 7703\def\alias{\parseargusing\obeyspaces\aliasxxx} 7704\def\aliasxxx #1{\aliasyyy#1\relax} 7705\def\aliasyyy #1=#2\relax{% 7706 {% 7707 \expandafter\let\obeyedspace=\empty 7708 \addtomacrolist{#1}% 7709 \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}% 7710 }% 7711 \next 7712} 7713 7714 7715\message{cross references,} 7716 7717\newwrite\auxfile 7718\newif\ifhavexrefs % True if xref values are known. 7719\newif\ifwarnedxrefs % True if we warned once that they aren't known. 7720 7721% @inforef is relatively simple. 7722\def\inforef #1{\inforefzzz #1,,,,**} 7723\def\inforefzzz #1,#2,#3,#4**{% 7724 \putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, 7725 node \samp{\ignorespaces#1{}}} 7726 7727% @node's only job in TeX is to define \lastnode, which is used in 7728% cross-references. The @node line might or might not have commas, and 7729% might or might not have spaces before the first comma, like: 7730% @node foo , bar , ... 7731% We don't want such trailing spaces in the node name. 7732% 7733\parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse} 7734% 7735% also remove a trailing comma, in case of something like this: 7736% @node Help-Cross, , , Cross-refs 7737\def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse} 7738\def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}} 7739 7740\let\nwnode=\node 7741\let\lastnode=\empty 7742 7743% Write a cross-reference definition for the current node. #1 is the 7744% type (Ynumbered, Yappendix, Ynothing). 7745% 7746\def\donoderef#1{% 7747 \ifx\lastnode\empty\else 7748 \setref{\lastnode}{#1}% 7749 \global\let\lastnode=\empty 7750 \fi 7751} 7752 7753% @anchor{NAME} -- define xref target at arbitrary point. 7754% 7755\newcount\savesfregister 7756% 7757\def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi} 7758\def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi} 7759\def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces} 7760 7761% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an 7762% anchor), which consists of three parts: 7763% 1) NAME-title - the current sectioning name taken from \lastsection, 7764% or the anchor name. 7765% 2) NAME-snt - section number and type, passed as the SNT arg, or 7766% empty for anchors. 7767% 3) NAME-pg - the page number. 7768% 7769% This is called from \donoderef, \anchor, and \dofloat. In the case of 7770% floats, there is an additional part, which is not written here: 7771% 4) NAME-lof - the text as it should appear in a @listoffloats. 7772% 7773\def\setref#1#2{% 7774 \pdfmkdest{#1}% 7775 \iflinks 7776 {% 7777 \atdummies % preserve commands, but don't expand them 7778 \edef\writexrdef##1##2{% 7779 \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef 7780 ##1}{##2}}% these are parameters of \writexrdef 7781 }% 7782 \toks0 = \expandafter{\lastsection}% 7783 \immediate \writexrdef{title}{\the\toks0 }% 7784 \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc. 7785 \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, at \shipout 7786 }% 7787 \fi 7788} 7789 7790% @xrefautosectiontitle on|off says whether @section(ing) names are used 7791% automatically in xrefs, if the third arg is not explicitly specified. 7792% This was provided as a "secret" @set xref-automatic-section-title 7793% variable, now it's official. 7794% 7795\parseargdef\xrefautomaticsectiontitle{% 7796 \def\temp{#1}% 7797 \ifx\temp\onword 7798 \expandafter\let\csname SETxref-automatic-section-title\endcsname 7799 = \empty 7800 \else\ifx\temp\offword 7801 \expandafter\let\csname SETxref-automatic-section-title\endcsname 7802 = \relax 7803 \else 7804 \errhelp = \EMsimple 7805 \errmessage{Unknown @xrefautomaticsectiontitle value `\temp', 7806 must be on|off}% 7807 \fi\fi 7808} 7809 7810 7811% @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is 7812% the node name, #2 the name of the Info cross-reference, #3 the printed 7813% node name, #4 the name of the Info file, #5 the name of the printed 7814% manual. All but the node name can be omitted. 7815% 7816\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]} 7817\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} 7818\def\ref#1{\xrefX[#1,,,,,,,]} 7819% 7820\newbox\topbox 7821\newbox\printedrefnamebox 7822\newbox\printedmanualbox 7823% 7824\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup 7825 \unsepspaces 7826 % 7827 \def\printedrefname{\ignorespaces #3}% 7828 \setbox\printedrefnamebox = \hbox{\printedrefname\unskip}% 7829 % 7830 \def\printedmanual{\ignorespaces #5}% 7831 \setbox\printedmanualbox = \hbox{\printedmanual\unskip}% 7832 % 7833 % If the printed reference name (arg #3) was not explicitly given in 7834 % the @xref, figure out what we want to use. 7835 \ifdim \wd\printedrefnamebox = 0pt 7836 % No printed node name was explicitly given. 7837 \expandafter\ifx\csname SETxref-automatic-section-title\endcsname \relax 7838 % Not auto section-title: use node name inside the square brackets. 7839 \def\printedrefname{\ignorespaces #1}% 7840 \else 7841 % Auto section-title: use chapter/section title inside 7842 % the square brackets if we have it. 7843 \ifdim \wd\printedmanualbox > 0pt 7844 % It is in another manual, so we don't have it; use node name. 7845 \def\printedrefname{\ignorespaces #1}% 7846 \else 7847 \ifhavexrefs 7848 % We (should) know the real title if we have the xref values. 7849 \def\printedrefname{\refx{#1-title}{}}% 7850 \else 7851 % Otherwise just copy the Info node name. 7852 \def\printedrefname{\ignorespaces #1}% 7853 \fi% 7854 \fi 7855 \fi 7856 \fi 7857 % 7858 % Make link in pdf output. 7859 \ifpdf 7860 {\indexnofonts 7861 \turnoffactive 7862 \makevalueexpandable 7863 % This expands tokens, so do it after making catcode changes, so _ 7864 % etc. don't get their TeX definitions. 7865 \getfilename{#4}% 7866 % 7867 \edef\pdfxrefdest{#1}% 7868 \txiescapepdf\pdfxrefdest 7869 % 7870 \leavevmode 7871 \startlink attr{/Border [0 0 0]}% 7872 \ifnum\filenamelength>0 7873 goto file{\the\filename.pdf} name{\pdfxrefdest}% 7874 \else 7875 goto name{\pdfmkpgn{\pdfxrefdest}}% 7876 \fi 7877 }% 7878 \setcolor{\linkcolor}% 7879 \fi 7880 % 7881 % Float references are printed completely differently: "Figure 1.2" 7882 % instead of "[somenode], p.3". We distinguish them by the 7883 % LABEL-title being set to a magic string. 7884 {% 7885 % Have to otherify everything special to allow the \csname to 7886 % include an _ in the xref name, etc. 7887 \indexnofonts 7888 \turnoffactive 7889 \expandafter\global\expandafter\let\expandafter\Xthisreftitle 7890 \csname XR#1-title\endcsname 7891 }% 7892 \iffloat\Xthisreftitle 7893 % If the user specified the print name (third arg) to the ref, 7894 % print it instead of our usual "Figure 1.2". 7895 \ifdim\wd\printedrefnamebox = 0pt 7896 \refx{#1-snt}{}% 7897 \else 7898 \printedrefname 7899 \fi 7900 % 7901 % if the user also gave the printed manual name (fifth arg), append 7902 % "in MANUALNAME". 7903 \ifdim \wd\printedmanualbox > 0pt 7904 \space \putwordin{} \cite{\printedmanual}% 7905 \fi 7906 \else 7907 % node/anchor (non-float) references. 7908 % 7909 % If we use \unhbox to print the node names, TeX does not insert 7910 % empty discretionaries after hyphens, which means that it will not 7911 % find a line break at a hyphen in a node names. Since some manuals 7912 % are best written with fairly long node names, containing hyphens, 7913 % this is a loss. Therefore, we give the text of the node name 7914 % again, so it is as if TeX is seeing it for the first time. 7915 % 7916 % Cross-manual reference. Only include the "Section ``foo'' in" if 7917 % the foo is neither missing or Top. Thus, @xref{,,,foo,The Foo Manual} 7918 % outputs simply "see The Foo Manual". 7919 \ifdim \wd\printedmanualbox > 0pt 7920 % What is the 7sp about? The idea is that we also want to omit 7921 % the Section part if we would be printing "Top", since they are 7922 % clearly trying to refer to the whole manual. But, this being 7923 % TeX, we can't easily compare strings while ignoring the possible 7924 % spaces before and after in the input. By adding the arbitrary 7925 % 7sp, we make it much less likely that a real node name would 7926 % happen to have the same width as "Top" (e.g., in a monospaced font). 7927 % I hope it will never happen in practice. 7928 % 7929 % For the same basic reason, we retypeset the "Top" at every 7930 % reference, since the current font is indeterminate. 7931 % 7932 \setbox\topbox = \hbox{Top\kern7sp}% 7933 \setbox2 = \hbox{\ignorespaces \printedrefname \unskip \kern7sp}% 7934 \ifdim \wd2 > 7sp 7935 \ifdim \wd2 = \wd\topbox \else 7936 \putwordSection{} ``\printedrefname'' \putwordin{}\space 7937 \fi 7938 \fi 7939 \cite{\printedmanual}% 7940 \else 7941 % Reference in this manual. 7942 % 7943 % _ (for example) has to be the character _ for the purposes of the 7944 % control sequence corresponding to the node, but it has to expand 7945 % into the usual \leavevmode...\vrule stuff for purposes of 7946 % printing. So we \turnoffactive for the \refx-snt, back on for the 7947 % printing, back off for the \refx-pg. 7948 {\turnoffactive 7949 % Only output a following space if the -snt ref is nonempty; for 7950 % @unnumbered and @anchor, it won't be. 7951 \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}% 7952 \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi 7953 }% 7954 % output the `[mynode]' via the macro below so it can be overridden. 7955 \xrefprintnodename\printedrefname 7956 % 7957 % But we always want a comma and a space: 7958 ,\space 7959 % 7960 % output the `page 3'. 7961 \turnoffactive \putwordpage\tie\refx{#1-pg}{}% 7962 \fi 7963 \fi 7964 \endlink 7965\endgroup} 7966 7967% This macro is called from \xrefX for the `[nodename]' part of xref 7968% output. It's a separate macro only so it can be changed more easily, 7969% since square brackets don't work well in some documents. Particularly 7970% one that Bob is working on :). 7971% 7972\def\xrefprintnodename#1{[#1]} 7973 7974% Things referred to by \setref. 7975% 7976\def\Ynothing{} 7977\def\Yomitfromtoc{} 7978\def\Ynumbered{% 7979 \ifnum\secno=0 7980 \putwordChapter@tie \the\chapno 7981 \else \ifnum\subsecno=0 7982 \putwordSection@tie \the\chapno.\the\secno 7983 \else \ifnum\subsubsecno=0 7984 \putwordSection@tie \the\chapno.\the\secno.\the\subsecno 7985 \else 7986 \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno 7987 \fi\fi\fi 7988} 7989\def\Yappendix{% 7990 \ifnum\secno=0 7991 \putwordAppendix@tie @char\the\appendixno{}% 7992 \else \ifnum\subsecno=0 7993 \putwordSection@tie @char\the\appendixno.\the\secno 7994 \else \ifnum\subsubsecno=0 7995 \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno 7996 \else 7997 \putwordSection@tie 7998 @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno 7999 \fi\fi\fi 8000} 8001 8002% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME. 8003% If its value is nonempty, SUFFIX is output afterward. 8004% 8005\def\refx#1#2{% 8006 {% 8007 \indexnofonts 8008 \otherbackslash 8009 \expandafter\global\expandafter\let\expandafter\thisrefX 8010 \csname XR#1\endcsname 8011 }% 8012 \ifx\thisrefX\relax 8013 % If not defined, say something at least. 8014 \angleleft un\-de\-fined\angleright 8015 \iflinks 8016 \ifhavexrefs 8017 {\toks0 = {#1}% avoid expansion of possibly-complex value 8018 \message{\linenumber Undefined cross reference `\the\toks0'.}}% 8019 \else 8020 \ifwarnedxrefs\else 8021 \global\warnedxrefstrue 8022 \message{Cross reference values unknown; you must run TeX again.}% 8023 \fi 8024 \fi 8025 \fi 8026 \else 8027 % It's defined, so just use it. 8028 \thisrefX 8029 \fi 8030 #2% Output the suffix in any case. 8031} 8032 8033% This is the macro invoked by entries in the aux file. Usually it's 8034% just a \def (we prepend XR to the control sequence name to avoid 8035% collisions). But if this is a float type, we have more work to do. 8036% 8037\def\xrdef#1#2{% 8038 {% The node name might contain 8-bit characters, which in our current 8039 % implementation are changed to commands like @'e. Don't let these 8040 % mess up the control sequence name. 8041 \indexnofonts 8042 \turnoffactive 8043 \xdef\safexrefname{#1}% 8044 }% 8045 % 8046 \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% remember this xref 8047 % 8048 % Was that xref control sequence that we just defined for a float? 8049 \expandafter\iffloat\csname XR\safexrefname\endcsname 8050 % it was a float, and we have the (safe) float type in \iffloattype. 8051 \expandafter\let\expandafter\floatlist 8052 \csname floatlist\iffloattype\endcsname 8053 % 8054 % Is this the first time we've seen this float type? 8055 \expandafter\ifx\floatlist\relax 8056 \toks0 = {\do}% yes, so just \do 8057 \else 8058 % had it before, so preserve previous elements in list. 8059 \toks0 = \expandafter{\floatlist\do}% 8060 \fi 8061 % 8062 % Remember this xref in the control sequence \floatlistFLOATTYPE, 8063 % for later use in \listoffloats. 8064 \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0 8065 {\safexrefname}}% 8066 \fi 8067} 8068 8069% Read the last existing aux file, if any. No error if none exists. 8070% 8071\def\tryauxfile{% 8072 \openin 1 \jobname.aux 8073 \ifeof 1 \else 8074 \readdatafile{aux}% 8075 \global\havexrefstrue 8076 \fi 8077 \closein 1 8078} 8079 8080\def\setupdatafile{% 8081 \catcode`\^^@=\other 8082 \catcode`\^^A=\other 8083 \catcode`\^^B=\other 8084 \catcode`\^^C=\other 8085 \catcode`\^^D=\other 8086 \catcode`\^^E=\other 8087 \catcode`\^^F=\other 8088 \catcode`\^^G=\other 8089 \catcode`\^^H=\other 8090 \catcode`\^^K=\other 8091 \catcode`\^^L=\other 8092 \catcode`\^^N=\other 8093 \catcode`\^^P=\other 8094 \catcode`\^^Q=\other 8095 \catcode`\^^R=\other 8096 \catcode`\^^S=\other 8097 \catcode`\^^T=\other 8098 \catcode`\^^U=\other 8099 \catcode`\^^V=\other 8100 \catcode`\^^W=\other 8101 \catcode`\^^X=\other 8102 \catcode`\^^Z=\other 8103 \catcode`\^^[=\other 8104 \catcode`\^^\=\other 8105 \catcode`\^^]=\other 8106 \catcode`\^^^=\other 8107 \catcode`\^^_=\other 8108 % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc. 8109 % in xref tags, i.e., node names. But since ^^e4 notation isn't 8110 % supported in the main text, it doesn't seem desirable. Furthermore, 8111 % that is not enough: for node names that actually contain a ^ 8112 % character, we would end up writing a line like this: 'xrdef {'hat 8113 % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first 8114 % argument, and \hat is not an expandable control sequence. It could 8115 % all be worked out, but why? Either we support ^^ or we don't. 8116 % 8117 % The other change necessary for this was to define \auxhat: 8118 % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter 8119 % and then to call \auxhat in \setq. 8120 % 8121 \catcode`\^=\other 8122 % 8123 % Special characters. Should be turned off anyway, but... 8124 \catcode`\~=\other 8125 \catcode`\[=\other 8126 \catcode`\]=\other 8127 \catcode`\"=\other 8128 \catcode`\_=\other 8129 \catcode`\|=\other 8130 \catcode`\<=\other 8131 \catcode`\>=\other 8132 \catcode`\$=\other 8133 \catcode`\#=\other 8134 \catcode`\&=\other 8135 \catcode`\%=\other 8136 \catcode`+=\other % avoid \+ for paranoia even though we've turned it off 8137 % 8138 % This is to support \ in node names and titles, since the \ 8139 % characters end up in a \csname. It's easier than 8140 % leaving it active and making its active definition an actual \ 8141 % character. What I don't understand is why it works in the *value* 8142 % of the xrdef. Seems like it should be a catcode12 \, and that 8143 % should not typeset properly. But it works, so I'm moving on for 8144 % now. --karl, 15jan04. 8145 \catcode`\\=\other 8146 % 8147 % Make the characters 128-255 be printing characters. 8148 {% 8149 \count1=128 8150 \def\loop{% 8151 \catcode\count1=\other 8152 \advance\count1 by 1 8153 \ifnum \count1<256 \loop \fi 8154 }% 8155 }% 8156 % 8157 % @ is our escape character in .aux files, and we need braces. 8158 \catcode`\{=1 8159 \catcode`\}=2 8160 \catcode`\@=0 8161} 8162 8163\def\readdatafile#1{% 8164\begingroup 8165 \setupdatafile 8166 \input\jobname.#1 8167\endgroup} 8168 8169 8170\message{insertions,} 8171% including footnotes. 8172 8173\newcount \footnoteno 8174 8175% The trailing space in the following definition for supereject is 8176% vital for proper filling; pages come out unaligned when you do a 8177% pagealignmacro call if that space before the closing brace is 8178% removed. (Generally, numeric constants should always be followed by a 8179% space to prevent strange expansion errors.) 8180\def\supereject{\par\penalty -20000\footnoteno =0 } 8181 8182% @footnotestyle is meaningful for Info output only. 8183\let\footnotestyle=\comment 8184 8185{\catcode `\@=11 8186% 8187% Auto-number footnotes. Otherwise like plain. 8188\gdef\footnote{% 8189 \let\indent=\ptexindent 8190 \let\noindent=\ptexnoindent 8191 \global\advance\footnoteno by \@ne 8192 \edef\thisfootno{$^{\the\footnoteno}$}% 8193 % 8194 % In case the footnote comes at the end of a sentence, preserve the 8195 % extra spacing after we do the footnote number. 8196 \let\@sf\empty 8197 \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi 8198 % 8199 % Remove inadvertent blank space before typesetting the footnote number. 8200 \unskip 8201 \thisfootno\@sf 8202 \dofootnote 8203}% 8204 8205% Don't bother with the trickery in plain.tex to not require the 8206% footnote text as a parameter. Our footnotes don't need to be so general. 8207% 8208% Oh yes, they do; otherwise, @ifset (and anything else that uses 8209% \parseargline) fails inside footnotes because the tokens are fixed when 8210% the footnote is read. --karl, 16nov96. 8211% 8212\gdef\dofootnote{% 8213 \insert\footins\bgroup 8214 % We want to typeset this text as a normal paragraph, even if the 8215 % footnote reference occurs in (for example) a display environment. 8216 % So reset some parameters. 8217 \hsize=\pagewidth 8218 \interlinepenalty\interfootnotelinepenalty 8219 \splittopskip\ht\strutbox % top baseline for broken footnotes 8220 \splitmaxdepth\dp\strutbox 8221 \floatingpenalty\@MM 8222 \leftskip\z@skip 8223 \rightskip\z@skip 8224 \spaceskip\z@skip 8225 \xspaceskip\z@skip 8226 \parindent\defaultparindent 8227 % 8228 \smallfonts \rm 8229 % 8230 % Because we use hanging indentation in footnotes, a @noindent appears 8231 % to exdent this text, so make it be a no-op. makeinfo does not use 8232 % hanging indentation so @noindent can still be needed within footnote 8233 % text after an @example or the like (not that this is good style). 8234 \let\noindent = \relax 8235 % 8236 % Hang the footnote text off the number. Use \everypar in case the 8237 % footnote extends for more than one paragraph. 8238 \everypar = {\hang}% 8239 \textindent{\thisfootno}% 8240 % 8241 % Don't crash into the line above the footnote text. Since this 8242 % expands into a box, it must come within the paragraph, lest it 8243 % provide a place where TeX can split the footnote. 8244 \footstrut 8245 % 8246 % Invoke rest of plain TeX footnote routine. 8247 \futurelet\next\fo@t 8248} 8249}%end \catcode `\@=11 8250 8251% In case a @footnote appears in a vbox, save the footnote text and create 8252% the real \insert just after the vbox finished. Otherwise, the insertion 8253% would be lost. 8254% Similarly, if a @footnote appears inside an alignment, save the footnote 8255% text to a box and make the \insert when a row of the table is finished. 8256% And the same can be done for other insert classes. --kasal, 16nov03. 8257 8258% Replace the \insert primitive by a cheating macro. 8259% Deeper inside, just make sure that the saved insertions are not spilled 8260% out prematurely. 8261% 8262\def\startsavinginserts{% 8263 \ifx \insert\ptexinsert 8264 \let\insert\saveinsert 8265 \else 8266 \let\checkinserts\relax 8267 \fi 8268} 8269 8270% This \insert replacement works for both \insert\footins{foo} and 8271% \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}. 8272% 8273\def\saveinsert#1{% 8274 \edef\next{\noexpand\savetobox \makeSAVEname#1}% 8275 \afterassignment\next 8276 % swallow the left brace 8277 \let\temp = 8278} 8279\def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}} 8280\def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1} 8281 8282\def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi} 8283 8284\def\placesaveins#1{% 8285 \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname 8286 {\box#1}% 8287} 8288 8289% eat @SAVE -- beware, all of them have catcode \other: 8290{ 8291 \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-) 8292 \gdef\gobblesave @SAVE{} 8293} 8294 8295% initialization: 8296\def\newsaveins #1{% 8297 \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}% 8298 \next 8299} 8300\def\newsaveinsX #1{% 8301 \csname newbox\endcsname #1% 8302 \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts 8303 \checksaveins #1}% 8304} 8305 8306% initialize: 8307\let\checkinserts\empty 8308\newsaveins\footins 8309\newsaveins\margin 8310 8311 8312% @image. We use the macros from epsf.tex to support this. 8313% If epsf.tex is not installed and @image is used, we complain. 8314% 8315% Check for and read epsf.tex up front. If we read it only at @image 8316% time, we might be inside a group, and then its definitions would get 8317% undone and the next image would fail. 8318\openin 1 = epsf.tex 8319\ifeof 1 \else 8320 % Do not bother showing banner with epsf.tex v2.7k (available in 8321 % doc/epsf.tex and on ctan). 8322 \def\epsfannounce{\toks0 = }% 8323 \input epsf.tex 8324\fi 8325\closein 1 8326% 8327% We will only complain once about lack of epsf.tex. 8328\newif\ifwarnednoepsf 8329\newhelp\noepsfhelp{epsf.tex must be installed for images to 8330 work. It is also included in the Texinfo distribution, or you can get 8331 it from ftp://tug.org/tex/epsf.tex.} 8332% 8333\def\image#1{% 8334 \ifx\epsfbox\thisisundefined 8335 \ifwarnednoepsf \else 8336 \errhelp = \noepsfhelp 8337 \errmessage{epsf.tex not found, images will be ignored}% 8338 \global\warnednoepsftrue 8339 \fi 8340 \else 8341 \imagexxx #1,,,,,\finish 8342 \fi 8343} 8344% 8345% Arguments to @image: 8346% #1 is (mandatory) image filename; we tack on .eps extension. 8347% #2 is (optional) width, #3 is (optional) height. 8348% #4 is (ignored optional) html alt text. 8349% #5 is (ignored optional) extension. 8350% #6 is just the usual extra ignored arg for parsing stuff. 8351\newif\ifimagevmode 8352\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup 8353 \catcode`\^^M = 5 % in case we're inside an example 8354 \normalturnoffactive % allow _ et al. in names 8355 % If the image is by itself, center it. 8356 \ifvmode 8357 \imagevmodetrue 8358 \else \ifx\centersub\centerV 8359 % for @center @image, we need a vbox so we can have our vertical space 8360 \imagevmodetrue 8361 \vbox\bgroup % vbox has better behavior than vtop herev 8362 \fi\fi 8363 % 8364 \ifimagevmode 8365 \nobreak\medskip 8366 % Usually we'll have text after the image which will insert 8367 % \parskip glue, so insert it here too to equalize the space 8368 % above and below. 8369 \nobreak\vskip\parskip 8370 \nobreak 8371 \fi 8372 % 8373 % Leave vertical mode so that indentation from an enclosing 8374 % environment such as @quotation is respected. 8375 % However, if we're at the top level, we don't want the 8376 % normal paragraph indentation. 8377 % On the other hand, if we are in the case of @center @image, we don't 8378 % want to start a paragraph, which will create a hsize-width box and 8379 % eradicate the centering. 8380 \ifx\centersub\centerV\else \noindent \fi 8381 % 8382 % Output the image. 8383 \ifpdf 8384 \dopdfimage{#1}{#2}{#3}% 8385 \else 8386 % \epsfbox itself resets \epsf?size at each figure. 8387 \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi 8388 \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi 8389 \epsfbox{#1.eps}% 8390 \fi 8391 % 8392 \ifimagevmode 8393 \medskip % space after a standalone image 8394 \fi 8395 \ifx\centersub\centerV \egroup \fi 8396\endgroup} 8397 8398 8399% @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables, 8400% etc. We don't actually implement floating yet, we always include the 8401% float "here". But it seemed the best name for the future. 8402% 8403\envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish} 8404 8405% There may be a space before second and/or third parameter; delete it. 8406\def\eatcommaspace#1, {#1,} 8407 8408% #1 is the optional FLOATTYPE, the text label for this float, typically 8409% "Figure", "Table", "Example", etc. Can't contain commas. If omitted, 8410% this float will not be numbered and cannot be referred to. 8411% 8412% #2 is the optional xref label. Also must be present for the float to 8413% be referable. 8414% 8415% #3 is the optional positioning argument; for now, it is ignored. It 8416% will somehow specify the positions allowed to float to (here, top, bottom). 8417% 8418% We keep a separate counter for each FLOATTYPE, which we reset at each 8419% chapter-level command. 8420\let\resetallfloatnos=\empty 8421% 8422\def\dofloat#1,#2,#3,#4\finish{% 8423 \let\thiscaption=\empty 8424 \let\thisshortcaption=\empty 8425 % 8426 % don't lose footnotes inside @float. 8427 % 8428 % BEWARE: when the floats start float, we have to issue warning whenever an 8429 % insert appears inside a float which could possibly float. --kasal, 26may04 8430 % 8431 \startsavinginserts 8432 % 8433 % We can't be used inside a paragraph. 8434 \par 8435 % 8436 \vtop\bgroup 8437 \def\floattype{#1}% 8438 \def\floatlabel{#2}% 8439 \def\floatloc{#3}% we do nothing with this yet. 8440 % 8441 \ifx\floattype\empty 8442 \let\safefloattype=\empty 8443 \else 8444 {% 8445 % the floattype might have accents or other special characters, 8446 % but we need to use it in a control sequence name. 8447 \indexnofonts 8448 \turnoffactive 8449 \xdef\safefloattype{\floattype}% 8450 }% 8451 \fi 8452 % 8453 % If label is given but no type, we handle that as the empty type. 8454 \ifx\floatlabel\empty \else 8455 % We want each FLOATTYPE to be numbered separately (Figure 1, 8456 % Table 1, Figure 2, ...). (And if no label, no number.) 8457 % 8458 \expandafter\getfloatno\csname\safefloattype floatno\endcsname 8459 \global\advance\floatno by 1 8460 % 8461 {% 8462 % This magic value for \lastsection is output by \setref as the 8463 % XREFLABEL-title value. \xrefX uses it to distinguish float 8464 % labels (which have a completely different output format) from 8465 % node and anchor labels. And \xrdef uses it to construct the 8466 % lists of floats. 8467 % 8468 \edef\lastsection{\floatmagic=\safefloattype}% 8469 \setref{\floatlabel}{Yfloat}% 8470 }% 8471 \fi 8472 % 8473 % start with \parskip glue, I guess. 8474 \vskip\parskip 8475 % 8476 % Don't suppress indentation if a float happens to start a section. 8477 \restorefirstparagraphindent 8478} 8479 8480% we have these possibilities: 8481% @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap 8482% @float Foo,lbl & no caption: Foo 1.1 8483% @float Foo & @caption{Cap}: Foo: Cap 8484% @float Foo & no caption: Foo 8485% @float ,lbl & Caption{Cap}: 1.1: Cap 8486% @float ,lbl & no caption: 1.1 8487% @float & @caption{Cap}: Cap 8488% @float & no caption: 8489% 8490\def\Efloat{% 8491 \let\floatident = \empty 8492 % 8493 % In all cases, if we have a float type, it comes first. 8494 \ifx\floattype\empty \else \def\floatident{\floattype}\fi 8495 % 8496 % If we have an xref label, the number comes next. 8497 \ifx\floatlabel\empty \else 8498 \ifx\floattype\empty \else % if also had float type, need tie first. 8499 \appendtomacro\floatident{\tie}% 8500 \fi 8501 % the number. 8502 \appendtomacro\floatident{\chaplevelprefix\the\floatno}% 8503 \fi 8504 % 8505 % Start the printed caption with what we've constructed in 8506 % \floatident, but keep it separate; we need \floatident again. 8507 \let\captionline = \floatident 8508 % 8509 \ifx\thiscaption\empty \else 8510 \ifx\floatident\empty \else 8511 \appendtomacro\captionline{: }% had ident, so need a colon between 8512 \fi 8513 % 8514 % caption text. 8515 \appendtomacro\captionline{\scanexp\thiscaption}% 8516 \fi 8517 % 8518 % If we have anything to print, print it, with space before. 8519 % Eventually this needs to become an \insert. 8520 \ifx\captionline\empty \else 8521 \vskip.5\parskip 8522 \captionline 8523 % 8524 % Space below caption. 8525 \vskip\parskip 8526 \fi 8527 % 8528 % If have an xref label, write the list of floats info. Do this 8529 % after the caption, to avoid chance of it being a breakpoint. 8530 \ifx\floatlabel\empty \else 8531 % Write the text that goes in the lof to the aux file as 8532 % \floatlabel-lof. Besides \floatident, we include the short 8533 % caption if specified, else the full caption if specified, else nothing. 8534 {% 8535 \atdummies 8536 % 8537 % since we read the caption text in the macro world, where ^^M 8538 % is turned into a normal character, we have to scan it back, so 8539 % we don't write the literal three characters "^^M" into the aux file. 8540 \scanexp{% 8541 \xdef\noexpand\gtemp{% 8542 \ifx\thisshortcaption\empty 8543 \thiscaption 8544 \else 8545 \thisshortcaption 8546 \fi 8547 }% 8548 }% 8549 \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident 8550 \ifx\gtemp\empty \else : \gtemp \fi}}% 8551 }% 8552 \fi 8553 \egroup % end of \vtop 8554 % 8555 % place the captured inserts 8556 % 8557 % BEWARE: when the floats start floating, we have to issue warning 8558 % whenever an insert appears inside a float which could possibly 8559 % float. --kasal, 26may04 8560 % 8561 \checkinserts 8562} 8563 8564% Append the tokens #2 to the definition of macro #1, not expanding either. 8565% 8566\def\appendtomacro#1#2{% 8567 \expandafter\def\expandafter#1\expandafter{#1#2}% 8568} 8569 8570% @caption, @shortcaption 8571% 8572\def\caption{\docaption\thiscaption} 8573\def\shortcaption{\docaption\thisshortcaption} 8574\def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption} 8575\def\defcaption#1#2{\egroup \def#1{#2}} 8576 8577% The parameter is the control sequence identifying the counter we are 8578% going to use. Create it if it doesn't exist and assign it to \floatno. 8579\def\getfloatno#1{% 8580 \ifx#1\relax 8581 % Haven't seen this figure type before. 8582 \csname newcount\endcsname #1% 8583 % 8584 % Remember to reset this floatno at the next chap. 8585 \expandafter\gdef\expandafter\resetallfloatnos 8586 \expandafter{\resetallfloatnos #1=0 }% 8587 \fi 8588 \let\floatno#1% 8589} 8590 8591% \setref calls this to get the XREFLABEL-snt value. We want an @xref 8592% to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we 8593% first read the @float command. 8594% 8595\def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}% 8596 8597% Magic string used for the XREFLABEL-title value, so \xrefX can 8598% distinguish floats from other xref types. 8599\def\floatmagic{!!float!!} 8600 8601% #1 is the control sequence we are passed; we expand into a conditional 8602% which is true if #1 represents a float ref. That is, the magic 8603% \lastsection value which we \setref above. 8604% 8605\def\iffloat#1{\expandafter\doiffloat#1==\finish} 8606% 8607% #1 is (maybe) the \floatmagic string. If so, #2 will be the 8608% (safe) float type for this float. We set \iffloattype to #2. 8609% 8610\def\doiffloat#1=#2=#3\finish{% 8611 \def\temp{#1}% 8612 \def\iffloattype{#2}% 8613 \ifx\temp\floatmagic 8614} 8615 8616% @listoffloats FLOATTYPE - print a list of floats like a table of contents. 8617% 8618\parseargdef\listoffloats{% 8619 \def\floattype{#1}% floattype 8620 {% 8621 % the floattype might have accents or other special characters, 8622 % but we need to use it in a control sequence name. 8623 \indexnofonts 8624 \turnoffactive 8625 \xdef\safefloattype{\floattype}% 8626 }% 8627 % 8628 % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE. 8629 \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax 8630 \ifhavexrefs 8631 % if the user said @listoffloats foo but never @float foo. 8632 \message{\linenumber No `\safefloattype' floats to list.}% 8633 \fi 8634 \else 8635 \begingroup 8636 \leftskip=\tocindent % indent these entries like a toc 8637 \let\do=\listoffloatsdo 8638 \csname floatlist\safefloattype\endcsname 8639 \endgroup 8640 \fi 8641} 8642 8643% This is called on each entry in a list of floats. We're passed the 8644% xref label, in the form LABEL-title, which is how we save it in the 8645% aux file. We strip off the -title and look up \XRLABEL-lof, which 8646% has the text we're supposed to typeset here. 8647% 8648% Figures without xref labels will not be included in the list (since 8649% they won't appear in the aux file). 8650% 8651\def\listoffloatsdo#1{\listoffloatsdoentry#1\finish} 8652\def\listoffloatsdoentry#1-title\finish{{% 8653 % Can't fully expand XR#1-lof because it can contain anything. Just 8654 % pass the control sequence. On the other hand, XR#1-pg is just the 8655 % page number, and we want to fully expand that so we can get a link 8656 % in pdf output. 8657 \toksA = \expandafter{\csname XR#1-lof\endcsname}% 8658 % 8659 % use the same \entry macro we use to generate the TOC and index. 8660 \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}% 8661 \writeentry 8662}} 8663 8664 8665\message{localization,} 8666 8667% For single-language documents, @documentlanguage is usually given very 8668% early, just after @documentencoding. Single argument is the language 8669% (de) or locale (de_DE) abbreviation. 8670% 8671{ 8672 \catcode`\_ = \active 8673 \globaldefs=1 8674\parseargdef\documentlanguage{\begingroup 8675 \let_=\normalunderscore % normal _ character for filenames 8676 \tex % read txi-??.tex file in plain TeX. 8677 % Read the file by the name they passed if it exists. 8678 \openin 1 txi-#1.tex 8679 \ifeof 1 8680 \documentlanguagetrywithoutunderscore{#1_\finish}% 8681 \else 8682 \globaldefs = 1 % everything in the txi-LL files needs to persist 8683 \input txi-#1.tex 8684 \fi 8685 \closein 1 8686 \endgroup % end raw TeX 8687\endgroup} 8688% 8689% If they passed de_DE, and txi-de_DE.tex doesn't exist, 8690% try txi-de.tex. 8691% 8692\gdef\documentlanguagetrywithoutunderscore#1_#2\finish{% 8693 \openin 1 txi-#1.tex 8694 \ifeof 1 8695 \errhelp = \nolanghelp 8696 \errmessage{Cannot read language file txi-#1.tex}% 8697 \else 8698 \globaldefs = 1 % everything in the txi-LL files needs to persist 8699 \input txi-#1.tex 8700 \fi 8701 \closein 1 8702} 8703}% end of special _ catcode 8704% 8705\newhelp\nolanghelp{The given language definition file cannot be found or 8706is empty. Maybe you need to install it? Putting it in the current 8707directory should work if nowhere else does.} 8708 8709% This macro is called from txi-??.tex files; the first argument is the 8710% \language name to set (without the "\lang@" prefix), the second and 8711% third args are \{left,right}hyphenmin. 8712% 8713% The language names to pass are determined when the format is built. 8714% See the etex.log file created at that time, e.g., 8715% /usr/local/texlive/2008/texmf-var/web2c/pdftex/etex.log. 8716% 8717% With TeX Live 2008, etex now includes hyphenation patterns for all 8718% available languages. This means we can support hyphenation in 8719% Texinfo, at least to some extent. (This still doesn't solve the 8720% accented characters problem.) 8721% 8722\catcode`@=11 8723\def\txisetlanguage#1#2#3{% 8724 % do not set the language if the name is undefined in the current TeX. 8725 \expandafter\ifx\csname lang@#1\endcsname \relax 8726 \message{no patterns for #1}% 8727 \else 8728 \global\language = \csname lang@#1\endcsname 8729 \fi 8730 % but there is no harm in adjusting the hyphenmin values regardless. 8731 \global\lefthyphenmin = #2\relax 8732 \global\righthyphenmin = #3\relax 8733} 8734 8735% Helpers for encodings. 8736% Set the catcode of characters 128 through 255 to the specified number. 8737% 8738\def\setnonasciicharscatcode#1{% 8739 \count255=128 8740 \loop\ifnum\count255<256 8741 \global\catcode\count255=#1\relax 8742 \advance\count255 by 1 8743 \repeat 8744} 8745 8746\def\setnonasciicharscatcodenonglobal#1{% 8747 \count255=128 8748 \loop\ifnum\count255<256 8749 \catcode\count255=#1\relax 8750 \advance\count255 by 1 8751 \repeat 8752} 8753 8754% @documentencoding sets the definition of non-ASCII characters 8755% according to the specified encoding. 8756% 8757\parseargdef\documentencoding{% 8758 % Encoding being declared for the document. 8759 \def\declaredencoding{\csname #1.enc\endcsname}% 8760 % 8761 % Supported encodings: names converted to tokens in order to be able 8762 % to compare them with \ifx. 8763 \def\ascii{\csname US-ASCII.enc\endcsname}% 8764 \def\latnine{\csname ISO-8859-15.enc\endcsname}% 8765 \def\latone{\csname ISO-8859-1.enc\endcsname}% 8766 \def\lattwo{\csname ISO-8859-2.enc\endcsname}% 8767 \def\utfeight{\csname UTF-8.enc\endcsname}% 8768 % 8769 \ifx \declaredencoding \ascii 8770 \asciichardefs 8771 % 8772 \else \ifx \declaredencoding \lattwo 8773 \setnonasciicharscatcode\active 8774 \lattwochardefs 8775 % 8776 \else \ifx \declaredencoding \latone 8777 \setnonasciicharscatcode\active 8778 \latonechardefs 8779 % 8780 \else \ifx \declaredencoding \latnine 8781 \setnonasciicharscatcode\active 8782 \latninechardefs 8783 % 8784 \else \ifx \declaredencoding \utfeight 8785 \setnonasciicharscatcode\active 8786 \utfeightchardefs 8787 % 8788 \else 8789 \message{Unknown document encoding #1, ignoring.}% 8790 % 8791 \fi % utfeight 8792 \fi % latnine 8793 \fi % latone 8794 \fi % lattwo 8795 \fi % ascii 8796} 8797 8798% A message to be logged when using a character that isn't available 8799% the default font encoding (OT1). 8800% 8801\def\missingcharmsg#1{\message{Character missing in OT1 encoding: #1.}} 8802 8803% Take account of \c (plain) vs. \, (Texinfo) difference. 8804\def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi} 8805 8806% First, make active non-ASCII characters in order for them to be 8807% correctly categorized when TeX reads the replacement text of 8808% macros containing the character definitions. 8809\setnonasciicharscatcode\active 8810% 8811% Latin1 (ISO-8859-1) character definitions. 8812\def\latonechardefs{% 8813 \gdef^^a0{\tie} 8814 \gdef^^a1{\exclamdown} 8815 \gdef^^a2{\missingcharmsg{CENT SIGN}} 8816 \gdef^^a3{{\pounds}} 8817 \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} 8818 \gdef^^a5{\missingcharmsg{YEN SIGN}} 8819 \gdef^^a6{\missingcharmsg{BROKEN BAR}} 8820 \gdef^^a7{\S} 8821 \gdef^^a8{\"{}} 8822 \gdef^^a9{\copyright} 8823 \gdef^^aa{\ordf} 8824 \gdef^^ab{\guillemetleft} 8825 \gdef^^ac{$\lnot$} 8826 \gdef^^ad{\-} 8827 \gdef^^ae{\registeredsymbol} 8828 \gdef^^af{\={}} 8829 % 8830 \gdef^^b0{\textdegree} 8831 \gdef^^b1{$\pm$} 8832 \gdef^^b2{$^2$} 8833 \gdef^^b3{$^3$} 8834 \gdef^^b4{\'{}} 8835 \gdef^^b5{$\mu$} 8836 \gdef^^b6{\P} 8837 % 8838 \gdef^^b7{$^.$} 8839 \gdef^^b8{\cedilla\ } 8840 \gdef^^b9{$^1$} 8841 \gdef^^ba{\ordm} 8842 % 8843 \gdef^^bb{\guillemetright} 8844 \gdef^^bc{$1\over4$} 8845 \gdef^^bd{$1\over2$} 8846 \gdef^^be{$3\over4$} 8847 \gdef^^bf{\questiondown} 8848 % 8849 \gdef^^c0{\`A} 8850 \gdef^^c1{\'A} 8851 \gdef^^c2{\^A} 8852 \gdef^^c3{\~A} 8853 \gdef^^c4{\"A} 8854 \gdef^^c5{\ringaccent A} 8855 \gdef^^c6{\AE} 8856 \gdef^^c7{\cedilla C} 8857 \gdef^^c8{\`E} 8858 \gdef^^c9{\'E} 8859 \gdef^^ca{\^E} 8860 \gdef^^cb{\"E} 8861 \gdef^^cc{\`I} 8862 \gdef^^cd{\'I} 8863 \gdef^^ce{\^I} 8864 \gdef^^cf{\"I} 8865 % 8866 \gdef^^d0{\DH} 8867 \gdef^^d1{\~N} 8868 \gdef^^d2{\`O} 8869 \gdef^^d3{\'O} 8870 \gdef^^d4{\^O} 8871 \gdef^^d5{\~O} 8872 \gdef^^d6{\"O} 8873 \gdef^^d7{$\times$} 8874 \gdef^^d8{\O} 8875 \gdef^^d9{\`U} 8876 \gdef^^da{\'U} 8877 \gdef^^db{\^U} 8878 \gdef^^dc{\"U} 8879 \gdef^^dd{\'Y} 8880 \gdef^^de{\TH} 8881 \gdef^^df{\ss} 8882 % 8883 \gdef^^e0{\`a} 8884 \gdef^^e1{\'a} 8885 \gdef^^e2{\^a} 8886 \gdef^^e3{\~a} 8887 \gdef^^e4{\"a} 8888 \gdef^^e5{\ringaccent a} 8889 \gdef^^e6{\ae} 8890 \gdef^^e7{\cedilla c} 8891 \gdef^^e8{\`e} 8892 \gdef^^e9{\'e} 8893 \gdef^^ea{\^e} 8894 \gdef^^eb{\"e} 8895 \gdef^^ec{\`{\dotless i}} 8896 \gdef^^ed{\'{\dotless i}} 8897 \gdef^^ee{\^{\dotless i}} 8898 \gdef^^ef{\"{\dotless i}} 8899 % 8900 \gdef^^f0{\dh} 8901 \gdef^^f1{\~n} 8902 \gdef^^f2{\`o} 8903 \gdef^^f3{\'o} 8904 \gdef^^f4{\^o} 8905 \gdef^^f5{\~o} 8906 \gdef^^f6{\"o} 8907 \gdef^^f7{$\div$} 8908 \gdef^^f8{\o} 8909 \gdef^^f9{\`u} 8910 \gdef^^fa{\'u} 8911 \gdef^^fb{\^u} 8912 \gdef^^fc{\"u} 8913 \gdef^^fd{\'y} 8914 \gdef^^fe{\th} 8915 \gdef^^ff{\"y} 8916} 8917 8918% Latin9 (ISO-8859-15) encoding character definitions. 8919\def\latninechardefs{% 8920 % Encoding is almost identical to Latin1. 8921 \latonechardefs 8922 % 8923 \gdef^^a4{\euro} 8924 \gdef^^a6{\v S} 8925 \gdef^^a8{\v s} 8926 \gdef^^b4{\v Z} 8927 \gdef^^b8{\v z} 8928 \gdef^^bc{\OE} 8929 \gdef^^bd{\oe} 8930 \gdef^^be{\"Y} 8931} 8932 8933% Latin2 (ISO-8859-2) character definitions. 8934\def\lattwochardefs{% 8935 \gdef^^a0{\tie} 8936 \gdef^^a1{\ogonek{A}} 8937 \gdef^^a2{\u{}} 8938 \gdef^^a3{\L} 8939 \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} 8940 \gdef^^a5{\v L} 8941 \gdef^^a6{\'S} 8942 \gdef^^a7{\S} 8943 \gdef^^a8{\"{}} 8944 \gdef^^a9{\v S} 8945 \gdef^^aa{\cedilla S} 8946 \gdef^^ab{\v T} 8947 \gdef^^ac{\'Z} 8948 \gdef^^ad{\-} 8949 \gdef^^ae{\v Z} 8950 \gdef^^af{\dotaccent Z} 8951 % 8952 \gdef^^b0{\textdegree} 8953 \gdef^^b1{\ogonek{a}} 8954 \gdef^^b2{\ogonek{ }} 8955 \gdef^^b3{\l} 8956 \gdef^^b4{\'{}} 8957 \gdef^^b5{\v l} 8958 \gdef^^b6{\'s} 8959 \gdef^^b7{\v{}} 8960 \gdef^^b8{\cedilla\ } 8961 \gdef^^b9{\v s} 8962 \gdef^^ba{\cedilla s} 8963 \gdef^^bb{\v t} 8964 \gdef^^bc{\'z} 8965 \gdef^^bd{\H{}} 8966 \gdef^^be{\v z} 8967 \gdef^^bf{\dotaccent z} 8968 % 8969 \gdef^^c0{\'R} 8970 \gdef^^c1{\'A} 8971 \gdef^^c2{\^A} 8972 \gdef^^c3{\u A} 8973 \gdef^^c4{\"A} 8974 \gdef^^c5{\'L} 8975 \gdef^^c6{\'C} 8976 \gdef^^c7{\cedilla C} 8977 \gdef^^c8{\v C} 8978 \gdef^^c9{\'E} 8979 \gdef^^ca{\ogonek{E}} 8980 \gdef^^cb{\"E} 8981 \gdef^^cc{\v E} 8982 \gdef^^cd{\'I} 8983 \gdef^^ce{\^I} 8984 \gdef^^cf{\v D} 8985 % 8986 \gdef^^d0{\DH} 8987 \gdef^^d1{\'N} 8988 \gdef^^d2{\v N} 8989 \gdef^^d3{\'O} 8990 \gdef^^d4{\^O} 8991 \gdef^^d5{\H O} 8992 \gdef^^d6{\"O} 8993 \gdef^^d7{$\times$} 8994 \gdef^^d8{\v R} 8995 \gdef^^d9{\ringaccent U} 8996 \gdef^^da{\'U} 8997 \gdef^^db{\H U} 8998 \gdef^^dc{\"U} 8999 \gdef^^dd{\'Y} 9000 \gdef^^de{\cedilla T} 9001 \gdef^^df{\ss} 9002 % 9003 \gdef^^e0{\'r} 9004 \gdef^^e1{\'a} 9005 \gdef^^e2{\^a} 9006 \gdef^^e3{\u a} 9007 \gdef^^e4{\"a} 9008 \gdef^^e5{\'l} 9009 \gdef^^e6{\'c} 9010 \gdef^^e7{\cedilla c} 9011 \gdef^^e8{\v c} 9012 \gdef^^e9{\'e} 9013 \gdef^^ea{\ogonek{e}} 9014 \gdef^^eb{\"e} 9015 \gdef^^ec{\v e} 9016 \gdef^^ed{\'{\dotless{i}}} 9017 \gdef^^ee{\^{\dotless{i}}} 9018 \gdef^^ef{\v d} 9019 % 9020 \gdef^^f0{\dh} 9021 \gdef^^f1{\'n} 9022 \gdef^^f2{\v n} 9023 \gdef^^f3{\'o} 9024 \gdef^^f4{\^o} 9025 \gdef^^f5{\H o} 9026 \gdef^^f6{\"o} 9027 \gdef^^f7{$\div$} 9028 \gdef^^f8{\v r} 9029 \gdef^^f9{\ringaccent u} 9030 \gdef^^fa{\'u} 9031 \gdef^^fb{\H u} 9032 \gdef^^fc{\"u} 9033 \gdef^^fd{\'y} 9034 \gdef^^fe{\cedilla t} 9035 \gdef^^ff{\dotaccent{}} 9036} 9037 9038% UTF-8 character definitions. 9039% 9040% This code to support UTF-8 is based on LaTeX's utf8.def, with some 9041% changes for Texinfo conventions. It is included here under the GPL by 9042% permission from Frank Mittelbach and the LaTeX team. 9043% 9044\newcount\countUTFx 9045\newcount\countUTFy 9046\newcount\countUTFz 9047 9048\gdef\UTFviiiTwoOctets#1#2{\expandafter 9049 \UTFviiiDefined\csname u8:#1\string #2\endcsname} 9050% 9051\gdef\UTFviiiThreeOctets#1#2#3{\expandafter 9052 \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname} 9053% 9054\gdef\UTFviiiFourOctets#1#2#3#4{\expandafter 9055 \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname} 9056 9057\gdef\UTFviiiDefined#1{% 9058 \ifx #1\relax 9059 \message{\linenumber Unicode char \string #1 not defined for Texinfo}% 9060 \else 9061 \expandafter #1% 9062 \fi 9063} 9064 9065\begingroup 9066 \catcode`\~13 9067 \catcode`\"12 9068 9069 \def\UTFviiiLoop{% 9070 \global\catcode\countUTFx\active 9071 \uccode`\~\countUTFx 9072 \uppercase\expandafter{\UTFviiiTmp}% 9073 \advance\countUTFx by 1 9074 \ifnum\countUTFx < \countUTFy 9075 \expandafter\UTFviiiLoop 9076 \fi} 9077 9078 \countUTFx = "C2 9079 \countUTFy = "E0 9080 \def\UTFviiiTmp{% 9081 \xdef~{\noexpand\UTFviiiTwoOctets\string~}} 9082 \UTFviiiLoop 9083 9084 \countUTFx = "E0 9085 \countUTFy = "F0 9086 \def\UTFviiiTmp{% 9087 \xdef~{\noexpand\UTFviiiThreeOctets\string~}} 9088 \UTFviiiLoop 9089 9090 \countUTFx = "F0 9091 \countUTFy = "F4 9092 \def\UTFviiiTmp{% 9093 \xdef~{\noexpand\UTFviiiFourOctets\string~}} 9094 \UTFviiiLoop 9095\endgroup 9096 9097\begingroup 9098 \catcode`\"=12 9099 \catcode`\<=12 9100 \catcode`\.=12 9101 \catcode`\,=12 9102 \catcode`\;=12 9103 \catcode`\!=12 9104 \catcode`\~=13 9105 9106 \gdef\DeclareUnicodeCharacter#1#2{% 9107 \countUTFz = "#1\relax 9108 %\wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}% 9109 \begingroup 9110 \parseXMLCharref 9111 \def\UTFviiiTwoOctets##1##2{% 9112 \csname u8:##1\string ##2\endcsname}% 9113 \def\UTFviiiThreeOctets##1##2##3{% 9114 \csname u8:##1\string ##2\string ##3\endcsname}% 9115 \def\UTFviiiFourOctets##1##2##3##4{% 9116 \csname u8:##1\string ##2\string ##3\string ##4\endcsname}% 9117 \expandafter\expandafter\expandafter\expandafter 9118 \expandafter\expandafter\expandafter 9119 \gdef\UTFviiiTmp{#2}% 9120 \endgroup} 9121 9122 \gdef\parseXMLCharref{% 9123 \ifnum\countUTFz < "A0\relax 9124 \errhelp = \EMsimple 9125 \errmessage{Cannot define Unicode char value < 00A0}% 9126 \else\ifnum\countUTFz < "800\relax 9127 \parseUTFviiiA,% 9128 \parseUTFviiiB C\UTFviiiTwoOctets.,% 9129 \else\ifnum\countUTFz < "10000\relax 9130 \parseUTFviiiA;% 9131 \parseUTFviiiA,% 9132 \parseUTFviiiB E\UTFviiiThreeOctets.{,;}% 9133 \else 9134 \parseUTFviiiA;% 9135 \parseUTFviiiA,% 9136 \parseUTFviiiA!% 9137 \parseUTFviiiB F\UTFviiiFourOctets.{!,;}% 9138 \fi\fi\fi 9139 } 9140 9141 \gdef\parseUTFviiiA#1{% 9142 \countUTFx = \countUTFz 9143 \divide\countUTFz by 64 9144 \countUTFy = \countUTFz 9145 \multiply\countUTFz by 64 9146 \advance\countUTFx by -\countUTFz 9147 \advance\countUTFx by 128 9148 \uccode `#1\countUTFx 9149 \countUTFz = \countUTFy} 9150 9151 \gdef\parseUTFviiiB#1#2#3#4{% 9152 \advance\countUTFz by "#10\relax 9153 \uccode `#3\countUTFz 9154 \uppercase{\gdef\UTFviiiTmp{#2#3#4}}} 9155\endgroup 9156 9157\def\utfeightchardefs{% 9158 \DeclareUnicodeCharacter{00A0}{\tie} 9159 \DeclareUnicodeCharacter{00A1}{\exclamdown} 9160 \DeclareUnicodeCharacter{00A3}{\pounds} 9161 \DeclareUnicodeCharacter{00A8}{\"{ }} 9162 \DeclareUnicodeCharacter{00A9}{\copyright} 9163 \DeclareUnicodeCharacter{00AA}{\ordf} 9164 \DeclareUnicodeCharacter{00AB}{\guillemetleft} 9165 \DeclareUnicodeCharacter{00AD}{\-} 9166 \DeclareUnicodeCharacter{00AE}{\registeredsymbol} 9167 \DeclareUnicodeCharacter{00AF}{\={ }} 9168 9169 \DeclareUnicodeCharacter{00B0}{\ringaccent{ }} 9170 \DeclareUnicodeCharacter{00B4}{\'{ }} 9171 \DeclareUnicodeCharacter{00B8}{\cedilla{ }} 9172 \DeclareUnicodeCharacter{00BA}{\ordm} 9173 \DeclareUnicodeCharacter{00BB}{\guillemetright} 9174 \DeclareUnicodeCharacter{00BF}{\questiondown} 9175 9176 \DeclareUnicodeCharacter{00C0}{\`A} 9177 \DeclareUnicodeCharacter{00C1}{\'A} 9178 \DeclareUnicodeCharacter{00C2}{\^A} 9179 \DeclareUnicodeCharacter{00C3}{\~A} 9180 \DeclareUnicodeCharacter{00C4}{\"A} 9181 \DeclareUnicodeCharacter{00C5}{\AA} 9182 \DeclareUnicodeCharacter{00C6}{\AE} 9183 \DeclareUnicodeCharacter{00C7}{\cedilla{C}} 9184 \DeclareUnicodeCharacter{00C8}{\`E} 9185 \DeclareUnicodeCharacter{00C9}{\'E} 9186 \DeclareUnicodeCharacter{00CA}{\^E} 9187 \DeclareUnicodeCharacter{00CB}{\"E} 9188 \DeclareUnicodeCharacter{00CC}{\`I} 9189 \DeclareUnicodeCharacter{00CD}{\'I} 9190 \DeclareUnicodeCharacter{00CE}{\^I} 9191 \DeclareUnicodeCharacter{00CF}{\"I} 9192 9193 \DeclareUnicodeCharacter{00D0}{\DH} 9194 \DeclareUnicodeCharacter{00D1}{\~N} 9195 \DeclareUnicodeCharacter{00D2}{\`O} 9196 \DeclareUnicodeCharacter{00D3}{\'O} 9197 \DeclareUnicodeCharacter{00D4}{\^O} 9198 \DeclareUnicodeCharacter{00D5}{\~O} 9199 \DeclareUnicodeCharacter{00D6}{\"O} 9200 \DeclareUnicodeCharacter{00D8}{\O} 9201 \DeclareUnicodeCharacter{00D9}{\`U} 9202 \DeclareUnicodeCharacter{00DA}{\'U} 9203 \DeclareUnicodeCharacter{00DB}{\^U} 9204 \DeclareUnicodeCharacter{00DC}{\"U} 9205 \DeclareUnicodeCharacter{00DD}{\'Y} 9206 \DeclareUnicodeCharacter{00DE}{\TH} 9207 \DeclareUnicodeCharacter{00DF}{\ss} 9208 9209 \DeclareUnicodeCharacter{00E0}{\`a} 9210 \DeclareUnicodeCharacter{00E1}{\'a} 9211 \DeclareUnicodeCharacter{00E2}{\^a} 9212 \DeclareUnicodeCharacter{00E3}{\~a} 9213 \DeclareUnicodeCharacter{00E4}{\"a} 9214 \DeclareUnicodeCharacter{00E5}{\aa} 9215 \DeclareUnicodeCharacter{00E6}{\ae} 9216 \DeclareUnicodeCharacter{00E7}{\cedilla{c}} 9217 \DeclareUnicodeCharacter{00E8}{\`e} 9218 \DeclareUnicodeCharacter{00E9}{\'e} 9219 \DeclareUnicodeCharacter{00EA}{\^e} 9220 \DeclareUnicodeCharacter{00EB}{\"e} 9221 \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}} 9222 \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}} 9223 \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}} 9224 \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}} 9225 9226 \DeclareUnicodeCharacter{00F0}{\dh} 9227 \DeclareUnicodeCharacter{00F1}{\~n} 9228 \DeclareUnicodeCharacter{00F2}{\`o} 9229 \DeclareUnicodeCharacter{00F3}{\'o} 9230 \DeclareUnicodeCharacter{00F4}{\^o} 9231 \DeclareUnicodeCharacter{00F5}{\~o} 9232 \DeclareUnicodeCharacter{00F6}{\"o} 9233 \DeclareUnicodeCharacter{00F8}{\o} 9234 \DeclareUnicodeCharacter{00F9}{\`u} 9235 \DeclareUnicodeCharacter{00FA}{\'u} 9236 \DeclareUnicodeCharacter{00FB}{\^u} 9237 \DeclareUnicodeCharacter{00FC}{\"u} 9238 \DeclareUnicodeCharacter{00FD}{\'y} 9239 \DeclareUnicodeCharacter{00FE}{\th} 9240 \DeclareUnicodeCharacter{00FF}{\"y} 9241 9242 \DeclareUnicodeCharacter{0100}{\=A} 9243 \DeclareUnicodeCharacter{0101}{\=a} 9244 \DeclareUnicodeCharacter{0102}{\u{A}} 9245 \DeclareUnicodeCharacter{0103}{\u{a}} 9246 \DeclareUnicodeCharacter{0104}{\ogonek{A}} 9247 \DeclareUnicodeCharacter{0105}{\ogonek{a}} 9248 \DeclareUnicodeCharacter{0106}{\'C} 9249 \DeclareUnicodeCharacter{0107}{\'c} 9250 \DeclareUnicodeCharacter{0108}{\^C} 9251 \DeclareUnicodeCharacter{0109}{\^c} 9252 \DeclareUnicodeCharacter{0118}{\ogonek{E}} 9253 \DeclareUnicodeCharacter{0119}{\ogonek{e}} 9254 \DeclareUnicodeCharacter{010A}{\dotaccent{C}} 9255 \DeclareUnicodeCharacter{010B}{\dotaccent{c}} 9256 \DeclareUnicodeCharacter{010C}{\v{C}} 9257 \DeclareUnicodeCharacter{010D}{\v{c}} 9258 \DeclareUnicodeCharacter{010E}{\v{D}} 9259 9260 \DeclareUnicodeCharacter{0112}{\=E} 9261 \DeclareUnicodeCharacter{0113}{\=e} 9262 \DeclareUnicodeCharacter{0114}{\u{E}} 9263 \DeclareUnicodeCharacter{0115}{\u{e}} 9264 \DeclareUnicodeCharacter{0116}{\dotaccent{E}} 9265 \DeclareUnicodeCharacter{0117}{\dotaccent{e}} 9266 \DeclareUnicodeCharacter{011A}{\v{E}} 9267 \DeclareUnicodeCharacter{011B}{\v{e}} 9268 \DeclareUnicodeCharacter{011C}{\^G} 9269 \DeclareUnicodeCharacter{011D}{\^g} 9270 \DeclareUnicodeCharacter{011E}{\u{G}} 9271 \DeclareUnicodeCharacter{011F}{\u{g}} 9272 9273 \DeclareUnicodeCharacter{0120}{\dotaccent{G}} 9274 \DeclareUnicodeCharacter{0121}{\dotaccent{g}} 9275 \DeclareUnicodeCharacter{0124}{\^H} 9276 \DeclareUnicodeCharacter{0125}{\^h} 9277 \DeclareUnicodeCharacter{0128}{\~I} 9278 \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}} 9279 \DeclareUnicodeCharacter{012A}{\=I} 9280 \DeclareUnicodeCharacter{012B}{\={\dotless{i}}} 9281 \DeclareUnicodeCharacter{012C}{\u{I}} 9282 \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}} 9283 9284 \DeclareUnicodeCharacter{0130}{\dotaccent{I}} 9285 \DeclareUnicodeCharacter{0131}{\dotless{i}} 9286 \DeclareUnicodeCharacter{0132}{IJ} 9287 \DeclareUnicodeCharacter{0133}{ij} 9288 \DeclareUnicodeCharacter{0134}{\^J} 9289 \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}} 9290 \DeclareUnicodeCharacter{0139}{\'L} 9291 \DeclareUnicodeCharacter{013A}{\'l} 9292 9293 \DeclareUnicodeCharacter{0141}{\L} 9294 \DeclareUnicodeCharacter{0142}{\l} 9295 \DeclareUnicodeCharacter{0143}{\'N} 9296 \DeclareUnicodeCharacter{0144}{\'n} 9297 \DeclareUnicodeCharacter{0147}{\v{N}} 9298 \DeclareUnicodeCharacter{0148}{\v{n}} 9299 \DeclareUnicodeCharacter{014C}{\=O} 9300 \DeclareUnicodeCharacter{014D}{\=o} 9301 \DeclareUnicodeCharacter{014E}{\u{O}} 9302 \DeclareUnicodeCharacter{014F}{\u{o}} 9303 9304 \DeclareUnicodeCharacter{0150}{\H{O}} 9305 \DeclareUnicodeCharacter{0151}{\H{o}} 9306 \DeclareUnicodeCharacter{0152}{\OE} 9307 \DeclareUnicodeCharacter{0153}{\oe} 9308 \DeclareUnicodeCharacter{0154}{\'R} 9309 \DeclareUnicodeCharacter{0155}{\'r} 9310 \DeclareUnicodeCharacter{0158}{\v{R}} 9311 \DeclareUnicodeCharacter{0159}{\v{r}} 9312 \DeclareUnicodeCharacter{015A}{\'S} 9313 \DeclareUnicodeCharacter{015B}{\'s} 9314 \DeclareUnicodeCharacter{015C}{\^S} 9315 \DeclareUnicodeCharacter{015D}{\^s} 9316 \DeclareUnicodeCharacter{015E}{\cedilla{S}} 9317 \DeclareUnicodeCharacter{015F}{\cedilla{s}} 9318 9319 \DeclareUnicodeCharacter{0160}{\v{S}} 9320 \DeclareUnicodeCharacter{0161}{\v{s}} 9321 \DeclareUnicodeCharacter{0162}{\cedilla{t}} 9322 \DeclareUnicodeCharacter{0163}{\cedilla{T}} 9323 \DeclareUnicodeCharacter{0164}{\v{T}} 9324 9325 \DeclareUnicodeCharacter{0168}{\~U} 9326 \DeclareUnicodeCharacter{0169}{\~u} 9327 \DeclareUnicodeCharacter{016A}{\=U} 9328 \DeclareUnicodeCharacter{016B}{\=u} 9329 \DeclareUnicodeCharacter{016C}{\u{U}} 9330 \DeclareUnicodeCharacter{016D}{\u{u}} 9331 \DeclareUnicodeCharacter{016E}{\ringaccent{U}} 9332 \DeclareUnicodeCharacter{016F}{\ringaccent{u}} 9333 9334 \DeclareUnicodeCharacter{0170}{\H{U}} 9335 \DeclareUnicodeCharacter{0171}{\H{u}} 9336 \DeclareUnicodeCharacter{0174}{\^W} 9337 \DeclareUnicodeCharacter{0175}{\^w} 9338 \DeclareUnicodeCharacter{0176}{\^Y} 9339 \DeclareUnicodeCharacter{0177}{\^y} 9340 \DeclareUnicodeCharacter{0178}{\"Y} 9341 \DeclareUnicodeCharacter{0179}{\'Z} 9342 \DeclareUnicodeCharacter{017A}{\'z} 9343 \DeclareUnicodeCharacter{017B}{\dotaccent{Z}} 9344 \DeclareUnicodeCharacter{017C}{\dotaccent{z}} 9345 \DeclareUnicodeCharacter{017D}{\v{Z}} 9346 \DeclareUnicodeCharacter{017E}{\v{z}} 9347 9348 \DeclareUnicodeCharacter{01C4}{D\v{Z}} 9349 \DeclareUnicodeCharacter{01C5}{D\v{z}} 9350 \DeclareUnicodeCharacter{01C6}{d\v{z}} 9351 \DeclareUnicodeCharacter{01C7}{LJ} 9352 \DeclareUnicodeCharacter{01C8}{Lj} 9353 \DeclareUnicodeCharacter{01C9}{lj} 9354 \DeclareUnicodeCharacter{01CA}{NJ} 9355 \DeclareUnicodeCharacter{01CB}{Nj} 9356 \DeclareUnicodeCharacter{01CC}{nj} 9357 \DeclareUnicodeCharacter{01CD}{\v{A}} 9358 \DeclareUnicodeCharacter{01CE}{\v{a}} 9359 \DeclareUnicodeCharacter{01CF}{\v{I}} 9360 9361 \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}} 9362 \DeclareUnicodeCharacter{01D1}{\v{O}} 9363 \DeclareUnicodeCharacter{01D2}{\v{o}} 9364 \DeclareUnicodeCharacter{01D3}{\v{U}} 9365 \DeclareUnicodeCharacter{01D4}{\v{u}} 9366 9367 \DeclareUnicodeCharacter{01E2}{\={\AE}} 9368 \DeclareUnicodeCharacter{01E3}{\={\ae}} 9369 \DeclareUnicodeCharacter{01E6}{\v{G}} 9370 \DeclareUnicodeCharacter{01E7}{\v{g}} 9371 \DeclareUnicodeCharacter{01E8}{\v{K}} 9372 \DeclareUnicodeCharacter{01E9}{\v{k}} 9373 9374 \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}} 9375 \DeclareUnicodeCharacter{01F1}{DZ} 9376 \DeclareUnicodeCharacter{01F2}{Dz} 9377 \DeclareUnicodeCharacter{01F3}{dz} 9378 \DeclareUnicodeCharacter{01F4}{\'G} 9379 \DeclareUnicodeCharacter{01F5}{\'g} 9380 \DeclareUnicodeCharacter{01F8}{\`N} 9381 \DeclareUnicodeCharacter{01F9}{\`n} 9382 \DeclareUnicodeCharacter{01FC}{\'{\AE}} 9383 \DeclareUnicodeCharacter{01FD}{\'{\ae}} 9384 \DeclareUnicodeCharacter{01FE}{\'{\O}} 9385 \DeclareUnicodeCharacter{01FF}{\'{\o}} 9386 9387 \DeclareUnicodeCharacter{021E}{\v{H}} 9388 \DeclareUnicodeCharacter{021F}{\v{h}} 9389 9390 \DeclareUnicodeCharacter{0226}{\dotaccent{A}} 9391 \DeclareUnicodeCharacter{0227}{\dotaccent{a}} 9392 \DeclareUnicodeCharacter{0228}{\cedilla{E}} 9393 \DeclareUnicodeCharacter{0229}{\cedilla{e}} 9394 \DeclareUnicodeCharacter{022E}{\dotaccent{O}} 9395 \DeclareUnicodeCharacter{022F}{\dotaccent{o}} 9396 9397 \DeclareUnicodeCharacter{0232}{\=Y} 9398 \DeclareUnicodeCharacter{0233}{\=y} 9399 \DeclareUnicodeCharacter{0237}{\dotless{j}} 9400 9401 \DeclareUnicodeCharacter{02DB}{\ogonek{ }} 9402 9403 \DeclareUnicodeCharacter{1E02}{\dotaccent{B}} 9404 \DeclareUnicodeCharacter{1E03}{\dotaccent{b}} 9405 \DeclareUnicodeCharacter{1E04}{\udotaccent{B}} 9406 \DeclareUnicodeCharacter{1E05}{\udotaccent{b}} 9407 \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}} 9408 \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}} 9409 \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}} 9410 \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}} 9411 \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}} 9412 \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}} 9413 \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}} 9414 \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}} 9415 9416 \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}} 9417 \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}} 9418 9419 \DeclareUnicodeCharacter{1E20}{\=G} 9420 \DeclareUnicodeCharacter{1E21}{\=g} 9421 \DeclareUnicodeCharacter{1E22}{\dotaccent{H}} 9422 \DeclareUnicodeCharacter{1E23}{\dotaccent{h}} 9423 \DeclareUnicodeCharacter{1E24}{\udotaccent{H}} 9424 \DeclareUnicodeCharacter{1E25}{\udotaccent{h}} 9425 \DeclareUnicodeCharacter{1E26}{\"H} 9426 \DeclareUnicodeCharacter{1E27}{\"h} 9427 9428 \DeclareUnicodeCharacter{1E30}{\'K} 9429 \DeclareUnicodeCharacter{1E31}{\'k} 9430 \DeclareUnicodeCharacter{1E32}{\udotaccent{K}} 9431 \DeclareUnicodeCharacter{1E33}{\udotaccent{k}} 9432 \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}} 9433 \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}} 9434 \DeclareUnicodeCharacter{1E36}{\udotaccent{L}} 9435 \DeclareUnicodeCharacter{1E37}{\udotaccent{l}} 9436 \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}} 9437 \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}} 9438 \DeclareUnicodeCharacter{1E3E}{\'M} 9439 \DeclareUnicodeCharacter{1E3F}{\'m} 9440 9441 \DeclareUnicodeCharacter{1E40}{\dotaccent{M}} 9442 \DeclareUnicodeCharacter{1E41}{\dotaccent{m}} 9443 \DeclareUnicodeCharacter{1E42}{\udotaccent{M}} 9444 \DeclareUnicodeCharacter{1E43}{\udotaccent{m}} 9445 \DeclareUnicodeCharacter{1E44}{\dotaccent{N}} 9446 \DeclareUnicodeCharacter{1E45}{\dotaccent{n}} 9447 \DeclareUnicodeCharacter{1E46}{\udotaccent{N}} 9448 \DeclareUnicodeCharacter{1E47}{\udotaccent{n}} 9449 \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}} 9450 \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}} 9451 9452 \DeclareUnicodeCharacter{1E54}{\'P} 9453 \DeclareUnicodeCharacter{1E55}{\'p} 9454 \DeclareUnicodeCharacter{1E56}{\dotaccent{P}} 9455 \DeclareUnicodeCharacter{1E57}{\dotaccent{p}} 9456 \DeclareUnicodeCharacter{1E58}{\dotaccent{R}} 9457 \DeclareUnicodeCharacter{1E59}{\dotaccent{r}} 9458 \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}} 9459 \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}} 9460 \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}} 9461 \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}} 9462 9463 \DeclareUnicodeCharacter{1E60}{\dotaccent{S}} 9464 \DeclareUnicodeCharacter{1E61}{\dotaccent{s}} 9465 \DeclareUnicodeCharacter{1E62}{\udotaccent{S}} 9466 \DeclareUnicodeCharacter{1E63}{\udotaccent{s}} 9467 \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}} 9468 \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}} 9469 \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}} 9470 \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}} 9471 \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}} 9472 \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}} 9473 9474 \DeclareUnicodeCharacter{1E7C}{\~V} 9475 \DeclareUnicodeCharacter{1E7D}{\~v} 9476 \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}} 9477 \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}} 9478 9479 \DeclareUnicodeCharacter{1E80}{\`W} 9480 \DeclareUnicodeCharacter{1E81}{\`w} 9481 \DeclareUnicodeCharacter{1E82}{\'W} 9482 \DeclareUnicodeCharacter{1E83}{\'w} 9483 \DeclareUnicodeCharacter{1E84}{\"W} 9484 \DeclareUnicodeCharacter{1E85}{\"w} 9485 \DeclareUnicodeCharacter{1E86}{\dotaccent{W}} 9486 \DeclareUnicodeCharacter{1E87}{\dotaccent{w}} 9487 \DeclareUnicodeCharacter{1E88}{\udotaccent{W}} 9488 \DeclareUnicodeCharacter{1E89}{\udotaccent{w}} 9489 \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}} 9490 \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}} 9491 \DeclareUnicodeCharacter{1E8C}{\"X} 9492 \DeclareUnicodeCharacter{1E8D}{\"x} 9493 \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}} 9494 \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}} 9495 9496 \DeclareUnicodeCharacter{1E90}{\^Z} 9497 \DeclareUnicodeCharacter{1E91}{\^z} 9498 \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}} 9499 \DeclareUnicodeCharacter{1E93}{\udotaccent{z}} 9500 \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}} 9501 \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}} 9502 \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}} 9503 \DeclareUnicodeCharacter{1E97}{\"t} 9504 \DeclareUnicodeCharacter{1E98}{\ringaccent{w}} 9505 \DeclareUnicodeCharacter{1E99}{\ringaccent{y}} 9506 9507 \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}} 9508 \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}} 9509 9510 \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}} 9511 \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}} 9512 \DeclareUnicodeCharacter{1EBC}{\~E} 9513 \DeclareUnicodeCharacter{1EBD}{\~e} 9514 9515 \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}} 9516 \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}} 9517 \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}} 9518 \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}} 9519 9520 \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}} 9521 \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}} 9522 9523 \DeclareUnicodeCharacter{1EF2}{\`Y} 9524 \DeclareUnicodeCharacter{1EF3}{\`y} 9525 \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}} 9526 9527 \DeclareUnicodeCharacter{1EF8}{\~Y} 9528 \DeclareUnicodeCharacter{1EF9}{\~y} 9529 9530 \DeclareUnicodeCharacter{2013}{--} 9531 \DeclareUnicodeCharacter{2014}{---} 9532 \DeclareUnicodeCharacter{2018}{\quoteleft} 9533 \DeclareUnicodeCharacter{2019}{\quoteright} 9534 \DeclareUnicodeCharacter{201A}{\quotesinglbase} 9535 \DeclareUnicodeCharacter{201C}{\quotedblleft} 9536 \DeclareUnicodeCharacter{201D}{\quotedblright} 9537 \DeclareUnicodeCharacter{201E}{\quotedblbase} 9538 \DeclareUnicodeCharacter{2022}{\bullet} 9539 \DeclareUnicodeCharacter{2026}{\dots} 9540 \DeclareUnicodeCharacter{2039}{\guilsinglleft} 9541 \DeclareUnicodeCharacter{203A}{\guilsinglright} 9542 \DeclareUnicodeCharacter{20AC}{\euro} 9543 9544 \DeclareUnicodeCharacter{2192}{\expansion} 9545 \DeclareUnicodeCharacter{21D2}{\result} 9546 9547 \DeclareUnicodeCharacter{2212}{\minus} 9548 \DeclareUnicodeCharacter{2217}{\point} 9549 \DeclareUnicodeCharacter{2261}{\equiv} 9550}% end of \utfeightchardefs 9551 9552 9553% US-ASCII character definitions. 9554\def\asciichardefs{% nothing need be done 9555 \relax 9556} 9557 9558% Make non-ASCII characters printable again for compatibility with 9559% existing Texinfo documents that may use them, even without declaring a 9560% document encoding. 9561% 9562\setnonasciicharscatcode \other 9563 9564 9565\message{formatting,} 9566 9567\newdimen\defaultparindent \defaultparindent = 15pt 9568 9569\chapheadingskip = 15pt plus 4pt minus 2pt 9570\secheadingskip = 12pt plus 3pt minus 2pt 9571\subsecheadingskip = 9pt plus 2pt minus 2pt 9572 9573% Prevent underfull vbox error messages. 9574\vbadness = 10000 9575 9576% Don't be very finicky about underfull hboxes, either. 9577\hbadness = 6666 9578 9579% Following George Bush, get rid of widows and orphans. 9580\widowpenalty=10000 9581\clubpenalty=10000 9582 9583% Use TeX 3.0's \emergencystretch to help line breaking, but if we're 9584% using an old version of TeX, don't do anything. We want the amount of 9585% stretch added to depend on the line length, hence the dependence on 9586% \hsize. We call this whenever the paper size is set. 9587% 9588\def\setemergencystretch{% 9589 \ifx\emergencystretch\thisisundefined 9590 % Allow us to assign to \emergencystretch anyway. 9591 \def\emergencystretch{\dimen0}% 9592 \else 9593 \emergencystretch = .15\hsize 9594 \fi 9595} 9596 9597% Parameters in order: 1) textheight; 2) textwidth; 9598% 3) voffset; 4) hoffset; 5) binding offset; 6) topskip; 9599% 7) physical page height; 8) physical page width. 9600% 9601% We also call \setleading{\textleading}, so the caller should define 9602% \textleading. The caller should also set \parskip. 9603% 9604\def\internalpagesizes#1#2#3#4#5#6#7#8{% 9605 \voffset = #3\relax 9606 \topskip = #6\relax 9607 \splittopskip = \topskip 9608 % 9609 \vsize = #1\relax 9610 \advance\vsize by \topskip 9611 \outervsize = \vsize 9612 \advance\outervsize by 2\topandbottommargin 9613 \pageheight = \vsize 9614 % 9615 \hsize = #2\relax 9616 \outerhsize = \hsize 9617 \advance\outerhsize by 0.5in 9618 \pagewidth = \hsize 9619 % 9620 \normaloffset = #4\relax 9621 \bindingoffset = #5\relax 9622 % 9623 \ifpdf 9624 \pdfpageheight #7\relax 9625 \pdfpagewidth #8\relax 9626 % if we don't reset these, they will remain at "1 true in" of 9627 % whatever layout pdftex was dumped with. 9628 \pdfhorigin = 1 true in 9629 \pdfvorigin = 1 true in 9630 \fi 9631 % 9632 \setleading{\textleading} 9633 % 9634 \parindent = \defaultparindent 9635 \setemergencystretch 9636} 9637 9638% @letterpaper (the default). 9639\def\letterpaper{{\globaldefs = 1 9640 \parskip = 3pt plus 2pt minus 1pt 9641 \textleading = 13.2pt 9642 % 9643 % If page is nothing but text, make it come out even. 9644 \internalpagesizes{607.2pt}{6in}% that's 46 lines 9645 {\voffset}{.25in}% 9646 {\bindingoffset}{36pt}% 9647 {11in}{8.5in}% 9648}} 9649 9650% Use @smallbook to reset parameters for 7x9.25 trim size. 9651\def\smallbook{{\globaldefs = 1 9652 \parskip = 2pt plus 1pt 9653 \textleading = 12pt 9654 % 9655 \internalpagesizes{7.5in}{5in}% 9656 {-.2in}{0in}% 9657 {\bindingoffset}{16pt}% 9658 {9.25in}{7in}% 9659 % 9660 \lispnarrowing = 0.3in 9661 \tolerance = 700 9662 \hfuzz = 1pt 9663 \contentsrightmargin = 0pt 9664 \defbodyindent = .5cm 9665}} 9666 9667% Use @smallerbook to reset parameters for 6x9 trim size. 9668% (Just testing, parameters still in flux.) 9669\def\smallerbook{{\globaldefs = 1 9670 \parskip = 1.5pt plus 1pt 9671 \textleading = 12pt 9672 % 9673 \internalpagesizes{7.4in}{4.8in}% 9674 {-.2in}{-.4in}% 9675 {0pt}{14pt}% 9676 {9in}{6in}% 9677 % 9678 \lispnarrowing = 0.25in 9679 \tolerance = 700 9680 \hfuzz = 1pt 9681 \contentsrightmargin = 0pt 9682 \defbodyindent = .4cm 9683}} 9684 9685% Use @afourpaper to print on European A4 paper. 9686\def\afourpaper{{\globaldefs = 1 9687 \parskip = 3pt plus 2pt minus 1pt 9688 \textleading = 13.2pt 9689 % 9690 % Double-side printing via postscript on Laserjet 4050 9691 % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm. 9692 % To change the settings for a different printer or situation, adjust 9693 % \normaloffset until the front-side and back-side texts align. Then 9694 % do the same for \bindingoffset. You can set these for testing in 9695 % your texinfo source file like this: 9696 % @tex 9697 % \global\normaloffset = -6mm 9698 % \global\bindingoffset = 10mm 9699 % @end tex 9700 \internalpagesizes{673.2pt}{160mm}% that's 51 lines 9701 {\voffset}{\hoffset}% 9702 {\bindingoffset}{44pt}% 9703 {297mm}{210mm}% 9704 % 9705 \tolerance = 700 9706 \hfuzz = 1pt 9707 \contentsrightmargin = 0pt 9708 \defbodyindent = 5mm 9709}} 9710 9711% Use @afivepaper to print on European A5 paper. 9712% From romildo@urano.iceb.ufop.br, 2 July 2000. 9713% He also recommends making @example and @lisp be small. 9714\def\afivepaper{{\globaldefs = 1 9715 \parskip = 2pt plus 1pt minus 0.1pt 9716 \textleading = 12.5pt 9717 % 9718 \internalpagesizes{160mm}{120mm}% 9719 {\voffset}{\hoffset}% 9720 {\bindingoffset}{8pt}% 9721 {210mm}{148mm}% 9722 % 9723 \lispnarrowing = 0.2in 9724 \tolerance = 800 9725 \hfuzz = 1.2pt 9726 \contentsrightmargin = 0pt 9727 \defbodyindent = 2mm 9728 \tableindent = 12mm 9729}} 9730 9731% A specific text layout, 24x15cm overall, intended for A4 paper. 9732\def\afourlatex{{\globaldefs = 1 9733 \afourpaper 9734 \internalpagesizes{237mm}{150mm}% 9735 {\voffset}{4.6mm}% 9736 {\bindingoffset}{7mm}% 9737 {297mm}{210mm}% 9738 % 9739 % Must explicitly reset to 0 because we call \afourpaper. 9740 \globaldefs = 0 9741}} 9742 9743% Use @afourwide to print on A4 paper in landscape format. 9744\def\afourwide{{\globaldefs = 1 9745 \afourpaper 9746 \internalpagesizes{241mm}{165mm}% 9747 {\voffset}{-2.95mm}% 9748 {\bindingoffset}{7mm}% 9749 {297mm}{210mm}% 9750 \globaldefs = 0 9751}} 9752 9753% @pagesizes TEXTHEIGHT[,TEXTWIDTH] 9754% Perhaps we should allow setting the margins, \topskip, \parskip, 9755% and/or leading, also. Or perhaps we should compute them somehow. 9756% 9757\parseargdef\pagesizes{\pagesizesyyy #1,,\finish} 9758\def\pagesizesyyy#1,#2,#3\finish{{% 9759 \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi 9760 \globaldefs = 1 9761 % 9762 \parskip = 3pt plus 2pt minus 1pt 9763 \setleading{\textleading}% 9764 % 9765 \dimen0 = #1\relax 9766 \advance\dimen0 by \voffset 9767 % 9768 \dimen2 = \hsize 9769 \advance\dimen2 by \normaloffset 9770 % 9771 \internalpagesizes{#1}{\hsize}% 9772 {\voffset}{\normaloffset}% 9773 {\bindingoffset}{44pt}% 9774 {\dimen0}{\dimen2}% 9775}} 9776 9777% Set default to letter. 9778% 9779\letterpaper 9780 9781 9782\message{and turning on texinfo input format.} 9783 9784\def^^L{\par} % remove \outer, so ^L can appear in an @comment 9785 9786% DEL is a comment character, in case @c does not suffice. 9787\catcode`\^^? = 14 9788 9789% Define macros to output various characters with catcode for normal text. 9790\catcode`\"=\other \def\normaldoublequote{"} 9791\catcode`\$=\other \def\normaldollar{$}%$ font-lock fix 9792\catcode`\+=\other \def\normalplus{+} 9793\catcode`\<=\other \def\normalless{<} 9794\catcode`\>=\other \def\normalgreater{>} 9795\catcode`\^=\other \def\normalcaret{^} 9796\catcode`\_=\other \def\normalunderscore{_} 9797\catcode`\|=\other \def\normalverticalbar{|} 9798\catcode`\~=\other \def\normaltilde{~} 9799 9800% This macro is used to make a character print one way in \tt 9801% (where it can probably be output as-is), and another way in other fonts, 9802% where something hairier probably needs to be done. 9803% 9804% #1 is what to print if we are indeed using \tt; #2 is what to print 9805% otherwise. Since all the Computer Modern typewriter fonts have zero 9806% interword stretch (and shrink), and it is reasonable to expect all 9807% typewriter fonts to have this, we can check that font parameter. 9808% 9809\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi} 9810 9811% Same as above, but check for italic font. Actually this also catches 9812% non-italic slanted fonts since it is impossible to distinguish them from 9813% italic fonts. But since this is only used by $ and it uses \sl anyway 9814% this is not a problem. 9815\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi} 9816 9817% Turn off all special characters except @ 9818% (and those which the user can use as if they were ordinary). 9819% Most of these we simply print from the \tt font, but for some, we can 9820% use math or other variants that look better in normal text. 9821 9822\catcode`\"=\active 9823\def\activedoublequote{{\tt\char34}} 9824\let"=\activedoublequote 9825\catcode`\~=\active 9826\def~{{\tt\char126}} 9827\chardef\hat=`\^ 9828\catcode`\^=\active 9829\def^{{\tt \hat}} 9830 9831\catcode`\_=\active 9832\def_{\ifusingtt\normalunderscore\_} 9833\let\realunder=_ 9834% Subroutine for the previous macro. 9835\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em } 9836 9837\catcode`\|=\active 9838\def|{{\tt\char124}} 9839\chardef \less=`\< 9840\catcode`\<=\active 9841\def<{{\tt \less}} 9842\chardef \gtr=`\> 9843\catcode`\>=\active 9844\def>{{\tt \gtr}} 9845\catcode`\+=\active 9846\def+{{\tt \char 43}} 9847\catcode`\$=\active 9848\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix 9849 9850% If a .fmt file is being used, characters that might appear in a file 9851% name cannot be active until we have parsed the command line. 9852% So turn them off again, and have \everyjob (or @setfilename) turn them on. 9853% \otherifyactive is called near the end of this file. 9854\def\otherifyactive{\catcode`+=\other \catcode`\_=\other} 9855 9856% Used sometimes to turn off (effectively) the active characters even after 9857% parsing them. 9858\def\turnoffactive{% 9859 \normalturnoffactive 9860 \otherbackslash 9861} 9862 9863\catcode`\@=0 9864 9865% \backslashcurfont outputs one backslash character in current font, 9866% as in \char`\\. 9867\global\chardef\backslashcurfont=`\\ 9868\global\let\rawbackslashxx=\backslashcurfont % let existing .??s files work 9869 9870% \realbackslash is an actual character `\' with catcode other, and 9871% \doublebackslash is two of them (for the pdf outlines). 9872{\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}} 9873 9874% In texinfo, backslash is an active character; it prints the backslash 9875% in fixed width font. 9876\catcode`\\=\active % @ for escape char from now on. 9877 9878% The story here is that in math mode, the \char of \backslashcurfont 9879% ends up printing the roman \ from the math symbol font (because \char 9880% in math mode uses the \mathcode, and plain.tex sets 9881% \mathcode`\\="026E). It seems better for @backslashchar{} to always 9882% print a typewriter backslash, hence we use an explicit \mathchar, 9883% which is the decimal equivalent of "715c (class 7, e.g., use \fam; 9884% ignored family value; char position "5C). We can't use " for the 9885% usual hex value because it has already been made active. 9886@def@normalbackslash{{@tt @ifmmode @mathchar29020 @else @backslashcurfont @fi}} 9887@let@backslashchar = @normalbackslash % @backslashchar{} is for user documents. 9888 9889% On startup, @fixbackslash assigns: 9890% @let \ = @normalbackslash 9891% \rawbackslash defines an active \ to do \backslashcurfont. 9892% \otherbackslash defines an active \ to be a literal `\' character with 9893% catcode other. We switch back and forth between these. 9894@gdef@rawbackslash{@let\=@backslashcurfont} 9895@gdef@otherbackslash{@let\=@realbackslash} 9896 9897% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of 9898% the literal character `\'. 9899% 9900@def@normalturnoffactive{% 9901 @let"=@normaldoublequote 9902 @let$=@normaldollar %$ font-lock fix 9903 @let+=@normalplus 9904 @let<=@normalless 9905 @let>=@normalgreater 9906 @let\=@normalbackslash 9907 @let^=@normalcaret 9908 @let_=@normalunderscore 9909 @let|=@normalverticalbar 9910 @let~=@normaltilde 9911 @markupsetuplqdefault 9912 @markupsetuprqdefault 9913 @unsepspaces 9914} 9915 9916% Make _ and + \other characters, temporarily. 9917% This is canceled by @fixbackslash. 9918@otherifyactive 9919 9920% If a .fmt file is being used, we don't want the `\input texinfo' to show up. 9921% That is what \eatinput is for; after that, the `\' should revert to printing 9922% a backslash. 9923% 9924@gdef@eatinput input texinfo{@fixbackslash} 9925@global@let\ = @eatinput 9926 9927% On the other hand, perhaps the file did not have a `\input texinfo'. Then 9928% the first `\' in the file would cause an error. This macro tries to fix 9929% that, assuming it is called before the first `\' could plausibly occur. 9930% Also turn back on active characters that might appear in the input 9931% file name, in case not using a pre-dumped format. 9932% 9933@gdef@fixbackslash{% 9934 @ifx\@eatinput @let\ = @normalbackslash @fi 9935 @catcode`+=@active 9936 @catcode`@_=@active 9937} 9938 9939% Say @foo, not \foo, in error messages. 9940@escapechar = `@@ 9941 9942% These (along with & and #) are made active for url-breaking, so need 9943% active definitions as the normal characters. 9944@def@normaldot{.} 9945@def@normalquest{?} 9946@def@normalslash{/} 9947 9948% These look ok in all fonts, so just make them not special. 9949% @hashchar{} gets its own user-level command, because of #line. 9950@catcode`@& = @other @def@normalamp{&} 9951@catcode`@# = @other @def@normalhash{#} 9952@catcode`@% = @other @def@normalpercent{%} 9953 9954@let @hashchar = @normalhash 9955 9956@c Finally, make ` and ' active, so that txicodequoteundirected and 9957@c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}. If we 9958@c don't make ` and ' active, @code will not get them as active chars. 9959@c Do this last of all since we use ` in the previous @catcode assignments. 9960@catcode`@'=@active 9961@catcode`@`=@active 9962@markupsetuplqdefault 9963@markupsetuprqdefault 9964 9965@c Local variables: 9966@c eval: (add-hook 'write-file-hooks 'time-stamp) 9967@c page-delimiter: "^\\\\message" 9968@c time-stamp-start: "def\\\\texinfoversion{" 9969@c time-stamp-format: "%:y-%02m-%02d.%02H" 9970@c time-stamp-end: "}" 9971@c End: 9972 9973@c vim:sw=2: 9974 9975@ignore 9976 arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115 9977@end ignore 9978