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