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