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