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-03-28.05} 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% Glyphs from the EC fonts. We don't use \let for the aliases, because 2910% sometimes we redefine the original macro, and the alias should reflect 2911% the redefinition. 2912% 2913% Use LaTeX names for the Icelandic letters. 2914\def\DH{{\ecfont \char"D0}} % Eth 2915\def\dh{{\ecfont \char"F0}} % eth 2916\def\TH{{\ecfont \char"DE}} % Thorn 2917\def\th{{\ecfont \char"FE}} % thorn 2918% 2919\def\guillemetleft{{\ecfont \char"13}} 2920\def\guillemotleft{\guillemetleft} 2921\def\guillemetright{{\ecfont \char"14}} 2922\def\guillemotright{\guillemetright} 2923\def\guilsinglleft{{\ecfont \char"0E}} 2924\def\guilsinglright{{\ecfont \char"0F}} 2925\def\quotedblbase{{\ecfont \char"12}} 2926\def\quotesinglbase{{\ecfont \char"0D}} 2927% 2928% This positioning is not perfect (see the ogonek LaTeX package), but 2929% we have the precomposed glyphs for the most common cases. We put the 2930% tests to use those glyphs in the single \ogonek macro so we have fewer 2931% dummy definitions to worry about for index entries, etc. 2932% 2933% ogonek is also used with other letters in Lithuanian (IOU), but using 2934% the precomposed glyphs for those is not so easy since they aren't in 2935% the same EC font. 2936\def\ogonek#1{{% 2937 \def\temp{#1}% 2938 \ifx\temp\macrocharA\Aogonek 2939 \else\ifx\temp\macrochara\aogonek 2940 \else\ifx\temp\macrocharE\Eogonek 2941 \else\ifx\temp\macrochare\eogonek 2942 \else 2943 \ecfont \setbox0=\hbox{#1}% 2944 \ifdim\ht0=1ex\accent"0C #1% 2945 \else\ooalign{\unhbox0\crcr\hidewidth\char"0C \hidewidth}% 2946 \fi 2947 \fi\fi\fi\fi 2948 }% 2949} 2950\def\Aogonek{{\ecfont \char"81}}\def\macrocharA{A} 2951\def\aogonek{{\ecfont \char"A1}}\def\macrochara{a} 2952\def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E} 2953\def\eogonek{{\ecfont \char"A6}}\def\macrochare{e} 2954% 2955% Use the ec* fonts (cm-super in outline format) for non-CM glyphs. 2956\def\ecfont{% 2957 % We can't distinguish serif/sans and italic/slanted, but this 2958 % is used for crude hacks anyway (like adding French and German 2959 % quotes to documents typeset with CM, where we lose kerning), so 2960 % hopefully nobody will notice/care. 2961 \edef\ecsize{\csname\curfontsize ecsize\endcsname}% 2962 \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}% 2963 \ifx\curfontstyle\bfstylename 2964 % bold: 2965 \font\thisecfont = ecb\ifusingit{i}{x}\ecsize \space at \nominalsize 2966 \else 2967 % regular: 2968 \font\thisecfont = ec\ifusingit{ti}{rm}\ecsize \space at \nominalsize 2969 \fi 2970 \thisecfont 2971} 2972 2973% @registeredsymbol - R in a circle. The font for the R should really 2974% be smaller yet, but lllsize is the best we can do for now. 2975% Adapted from the plain.tex definition of \copyright. 2976% 2977\def\registeredsymbol{% 2978 $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}% 2979 \hfil\crcr\Orb}}% 2980 }$% 2981} 2982 2983% @textdegree - the normal degrees sign. 2984% 2985\def\textdegree{$^\circ$} 2986 2987% Laurent Siebenmann reports \Orb undefined with: 2988% Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:38 2989% so we'll define it if necessary. 2990% 2991\ifx\Orb\undefined 2992\def\Orb{\mathhexbox20D} 2993\fi 2994 2995% Quotes. 2996\chardef\quotedblleft="5C 2997\chardef\quotedblright=`\" 2998\chardef\quoteleft=`\` 2999\chardef\quoteright=`\' 3000 3001 3002\message{page headings,} 3003 3004\newskip\titlepagetopglue \titlepagetopglue = 1.5in 3005\newskip\titlepagebottomglue \titlepagebottomglue = 2pc 3006 3007% First the title page. Must do @settitle before @titlepage. 3008\newif\ifseenauthor 3009\newif\iffinishedtitlepage 3010 3011% Do an implicit @contents or @shortcontents after @end titlepage if the 3012% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage. 3013% 3014\newif\ifsetcontentsaftertitlepage 3015 \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue 3016\newif\ifsetshortcontentsaftertitlepage 3017 \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue 3018 3019\parseargdef\shorttitlepage{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}% 3020 \endgroup\page\hbox{}\page} 3021 3022\envdef\titlepage{% 3023 % Open one extra group, as we want to close it in the middle of \Etitlepage. 3024 \begingroup 3025 \parindent=0pt \textfonts 3026 % Leave some space at the very top of the page. 3027 \vglue\titlepagetopglue 3028 % No rule at page bottom unless we print one at the top with @title. 3029 \finishedtitlepagetrue 3030 % 3031 % Most title ``pages'' are actually two pages long, with space 3032 % at the top of the second. We don't want the ragged left on the second. 3033 \let\oldpage = \page 3034 \def\page{% 3035 \iffinishedtitlepage\else 3036 \finishtitlepage 3037 \fi 3038 \let\page = \oldpage 3039 \page 3040 \null 3041 }% 3042} 3043 3044\def\Etitlepage{% 3045 \iffinishedtitlepage\else 3046 \finishtitlepage 3047 \fi 3048 % It is important to do the page break before ending the group, 3049 % because the headline and footline are only empty inside the group. 3050 % If we use the new definition of \page, we always get a blank page 3051 % after the title page, which we certainly don't want. 3052 \oldpage 3053 \endgroup 3054 % 3055 % Need this before the \...aftertitlepage checks so that if they are 3056 % in effect the toc pages will come out with page numbers. 3057 \HEADINGSon 3058 % 3059 % If they want short, they certainly want long too. 3060 \ifsetshortcontentsaftertitlepage 3061 \shortcontents 3062 \contents 3063 \global\let\shortcontents = \relax 3064 \global\let\contents = \relax 3065 \fi 3066 % 3067 \ifsetcontentsaftertitlepage 3068 \contents 3069 \global\let\contents = \relax 3070 \global\let\shortcontents = \relax 3071 \fi 3072} 3073 3074\def\finishtitlepage{% 3075 \vskip4pt \hrule height 2pt width \hsize 3076 \vskip\titlepagebottomglue 3077 \finishedtitlepagetrue 3078} 3079 3080%%% Macros to be used within @titlepage: 3081 3082\let\subtitlerm=\tenrm 3083\def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines} 3084 3085\parseargdef\title{% 3086 \checkenv\titlepage 3087 \leftline{\titlefonts\rmisbold #1} 3088 % print a rule at the page bottom also. 3089 \finishedtitlepagefalse 3090 \vskip4pt \hrule height 4pt width \hsize \vskip4pt 3091} 3092 3093\parseargdef\subtitle{% 3094 \checkenv\titlepage 3095 {\subtitlefont \rightline{#1}}% 3096} 3097 3098% @author should come last, but may come many times. 3099% It can also be used inside @quotation. 3100% 3101\parseargdef\author{% 3102 \def\temp{\quotation}% 3103 \ifx\thisenv\temp 3104 \def\quotationauthor{#1}% printed in \Equotation. 3105 \else 3106 \checkenv\titlepage 3107 \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi 3108 {\secfonts\rmisbold \leftline{#1}}% 3109 \fi 3110} 3111 3112 3113%%% Set up page headings and footings. 3114 3115\let\thispage=\folio 3116 3117\newtoks\evenheadline % headline on even pages 3118\newtoks\oddheadline % headline on odd pages 3119\newtoks\evenfootline % footline on even pages 3120\newtoks\oddfootline % footline on odd pages 3121 3122% Now make TeX use those variables 3123\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline 3124 \else \the\evenheadline \fi}} 3125\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline 3126 \else \the\evenfootline \fi}\HEADINGShook} 3127\let\HEADINGShook=\relax 3128 3129% Commands to set those variables. 3130% For example, this is what @headings on does 3131% @evenheading @thistitle|@thispage|@thischapter 3132% @oddheading @thischapter|@thispage|@thistitle 3133% @evenfooting @thisfile|| 3134% @oddfooting ||@thisfile 3135 3136 3137\def\evenheading{\parsearg\evenheadingxxx} 3138\def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish} 3139\def\evenheadingyyy #1\|#2\|#3\|#4\finish{% 3140\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} 3141 3142\def\oddheading{\parsearg\oddheadingxxx} 3143\def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish} 3144\def\oddheadingyyy #1\|#2\|#3\|#4\finish{% 3145\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} 3146 3147\parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}% 3148 3149\def\evenfooting{\parsearg\evenfootingxxx} 3150\def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish} 3151\def\evenfootingyyy #1\|#2\|#3\|#4\finish{% 3152\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} 3153 3154\def\oddfooting{\parsearg\oddfootingxxx} 3155\def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish} 3156\def\oddfootingyyy #1\|#2\|#3\|#4\finish{% 3157 \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}% 3158 % 3159 % Leave some space for the footline. Hopefully ok to assume 3160 % @evenfooting will not be used by itself. 3161 \global\advance\pageheight by -12pt 3162 \global\advance\vsize by -12pt 3163} 3164 3165\parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}} 3166 3167% @evenheadingmarks top \thischapter <- chapter at the top of a page 3168% @evenheadingmarks bottom \thischapter <- chapter at the bottom of a page 3169% 3170% The same set of arguments for: 3171% 3172% @oddheadingmarks 3173% @evenfootingmarks 3174% @oddfootingmarks 3175% @everyheadingmarks 3176% @everyfootingmarks 3177 3178\def\evenheadingmarks{\headingmarks{even}{heading}} 3179\def\oddheadingmarks{\headingmarks{odd}{heading}} 3180\def\evenfootingmarks{\headingmarks{even}{footing}} 3181\def\oddfootingmarks{\headingmarks{odd}{footing}} 3182\def\everyheadingmarks#1 {\headingmarks{even}{heading}{#1} 3183 \headingmarks{odd}{heading}{#1} } 3184\def\everyfootingmarks#1 {\headingmarks{even}{footing}{#1} 3185 \headingmarks{odd}{footing}{#1} } 3186% #1 = even/odd, #2 = heading/footing, #3 = top/bottom. 3187\def\headingmarks#1#2#3 {% 3188 \expandafter\let\expandafter\temp \csname get#3headingmarks\endcsname 3189 \global\expandafter\let\csname get#1#2marks\endcsname \temp 3190} 3191 3192\everyheadingmarks bottom 3193\everyfootingmarks bottom 3194 3195% @headings double turns headings on for double-sided printing. 3196% @headings single turns headings on for single-sided printing. 3197% @headings off turns them off. 3198% @headings on same as @headings double, retained for compatibility. 3199% @headings after turns on double-sided headings after this page. 3200% @headings doubleafter turns on double-sided headings after this page. 3201% @headings singleafter turns on single-sided headings after this page. 3202% By default, they are off at the start of a document, 3203% and turned `on' after @end titlepage. 3204 3205\def\headings #1 {\csname HEADINGS#1\endcsname} 3206 3207\def\HEADINGSoff{% 3208\global\evenheadline={\hfil} \global\evenfootline={\hfil} 3209\global\oddheadline={\hfil} \global\oddfootline={\hfil}} 3210\HEADINGSoff 3211% When we turn headings on, set the page number to 1. 3212% For double-sided printing, put current file name in lower left corner, 3213% chapter name on inside top of right hand pages, document 3214% title on inside top of left hand pages, and page numbers on outside top 3215% edge of all pages. 3216\def\HEADINGSdouble{% 3217\global\pageno=1 3218\global\evenfootline={\hfil} 3219\global\oddfootline={\hfil} 3220\global\evenheadline={\line{\folio\hfil\thistitle}} 3221\global\oddheadline={\line{\thischapter\hfil\folio}} 3222\global\let\contentsalignmacro = \chapoddpage 3223} 3224\let\contentsalignmacro = \chappager 3225 3226% For single-sided printing, chapter title goes across top left of page, 3227% page number on top right. 3228\def\HEADINGSsingle{% 3229\global\pageno=1 3230\global\evenfootline={\hfil} 3231\global\oddfootline={\hfil} 3232\global\evenheadline={\line{\thischapter\hfil\folio}} 3233\global\oddheadline={\line{\thischapter\hfil\folio}} 3234\global\let\contentsalignmacro = \chappager 3235} 3236\def\HEADINGSon{\HEADINGSdouble} 3237 3238\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex} 3239\let\HEADINGSdoubleafter=\HEADINGSafter 3240\def\HEADINGSdoublex{% 3241\global\evenfootline={\hfil} 3242\global\oddfootline={\hfil} 3243\global\evenheadline={\line{\folio\hfil\thistitle}} 3244\global\oddheadline={\line{\thischapter\hfil\folio}} 3245\global\let\contentsalignmacro = \chapoddpage 3246} 3247 3248\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} 3249\def\HEADINGSsinglex{% 3250\global\evenfootline={\hfil} 3251\global\oddfootline={\hfil} 3252\global\evenheadline={\line{\thischapter\hfil\folio}} 3253\global\oddheadline={\line{\thischapter\hfil\folio}} 3254\global\let\contentsalignmacro = \chappager 3255} 3256 3257% Subroutines used in generating headings 3258% This produces Day Month Year style of output. 3259% Only define if not already defined, in case a txi-??.tex file has set 3260% up a different format (e.g., txi-cs.tex does this). 3261\ifx\today\undefined 3262\def\today{% 3263 \number\day\space 3264 \ifcase\month 3265 \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr 3266 \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug 3267 \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec 3268 \fi 3269 \space\number\year} 3270\fi 3271 3272% @settitle line... specifies the title of the document, for headings. 3273% It generates no output of its own. 3274\def\thistitle{\putwordNoTitle} 3275\def\settitle{\parsearg{\gdef\thistitle}} 3276 3277 3278\message{tables,} 3279% Tables -- @table, @ftable, @vtable, @item(x). 3280 3281% default indentation of table text 3282\newdimen\tableindent \tableindent=.8in 3283% default indentation of @itemize and @enumerate text 3284\newdimen\itemindent \itemindent=.3in 3285% margin between end of table item and start of table text. 3286\newdimen\itemmargin \itemmargin=.1in 3287 3288% used internally for \itemindent minus \itemmargin 3289\newdimen\itemmax 3290 3291% Note @table, @ftable, and @vtable define @item, @itemx, etc., with 3292% these defs. 3293% They also define \itemindex 3294% to index the item name in whatever manner is desired (perhaps none). 3295 3296\newif\ifitemxneedsnegativevskip 3297 3298\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi} 3299 3300\def\internalBitem{\smallbreak \parsearg\itemzzz} 3301\def\internalBitemx{\itemxpar \parsearg\itemzzz} 3302 3303\def\itemzzz #1{\begingroup % 3304 \advance\hsize by -\rightskip 3305 \advance\hsize by -\tableindent 3306 \setbox0=\hbox{\itemindicate{#1}}% 3307 \itemindex{#1}% 3308 \nobreak % This prevents a break before @itemx. 3309 % 3310 % If the item text does not fit in the space we have, put it on a line 3311 % by itself, and do not allow a page break either before or after that 3312 % line. We do not start a paragraph here because then if the next 3313 % command is, e.g., @kindex, the whatsit would get put into the 3314 % horizontal list on a line by itself, resulting in extra blank space. 3315 \ifdim \wd0>\itemmax 3316 % 3317 % Make this a paragraph so we get the \parskip glue and wrapping, 3318 % but leave it ragged-right. 3319 \begingroup 3320 \advance\leftskip by-\tableindent 3321 \advance\hsize by\tableindent 3322 \advance\rightskip by0pt plus1fil 3323 \leavevmode\unhbox0\par 3324 \endgroup 3325 % 3326 % We're going to be starting a paragraph, but we don't want the 3327 % \parskip glue -- logically it's part of the @item we just started. 3328 \nobreak \vskip-\parskip 3329 % 3330 % Stop a page break at the \parskip glue coming up. However, if 3331 % what follows is an environment such as @example, there will be no 3332 % \parskip glue; then the negative vskip we just inserted would 3333 % cause the example and the item to crash together. So we use this 3334 % bizarre value of 10001 as a signal to \aboveenvbreak to insert 3335 % \parskip glue after all. Section titles are handled this way also. 3336 % 3337 \penalty 10001 3338 \endgroup 3339 \itemxneedsnegativevskipfalse 3340 \else 3341 % The item text fits into the space. Start a paragraph, so that the 3342 % following text (if any) will end up on the same line. 3343 \noindent 3344 % Do this with kerns and \unhbox so that if there is a footnote in 3345 % the item text, it can migrate to the main vertical list and 3346 % eventually be printed. 3347 \nobreak\kern-\tableindent 3348 \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0 3349 \unhbox0 3350 \nobreak\kern\dimen0 3351 \endgroup 3352 \itemxneedsnegativevskiptrue 3353 \fi 3354} 3355 3356\def\item{\errmessage{@item while not in a list environment}} 3357\def\itemx{\errmessage{@itemx while not in a list environment}} 3358 3359% @table, @ftable, @vtable. 3360\envdef\table{% 3361 \let\itemindex\gobble 3362 \tablecheck{table}% 3363} 3364\envdef\ftable{% 3365 \def\itemindex ##1{\doind {fn}{\code{##1}}}% 3366 \tablecheck{ftable}% 3367} 3368\envdef\vtable{% 3369 \def\itemindex ##1{\doind {vr}{\code{##1}}}% 3370 \tablecheck{vtable}% 3371} 3372\def\tablecheck#1{% 3373 \ifnum \the\catcode`\^^M=\active 3374 \endgroup 3375 \errmessage{This command won't work in this context; perhaps the problem is 3376 that we are \inenvironment\thisenv}% 3377 \def\next{\doignore{#1}}% 3378 \else 3379 \let\next\tablex 3380 \fi 3381 \next 3382} 3383\def\tablex#1{% 3384 \def\itemindicate{#1}% 3385 \parsearg\tabley 3386} 3387\def\tabley#1{% 3388 {% 3389 \makevalueexpandable 3390 \edef\temp{\noexpand\tablez #1\space\space\space}% 3391 \expandafter 3392 }\temp \endtablez 3393} 3394\def\tablez #1 #2 #3 #4\endtablez{% 3395 \aboveenvbreak 3396 \ifnum 0#1>0 \advance \leftskip by #1\mil \fi 3397 \ifnum 0#2>0 \tableindent=#2\mil \fi 3398 \ifnum 0#3>0 \advance \rightskip by #3\mil \fi 3399 \itemmax=\tableindent 3400 \advance \itemmax by -\itemmargin 3401 \advance \leftskip by \tableindent 3402 \exdentamount=\tableindent 3403 \parindent = 0pt 3404 \parskip = \smallskipamount 3405 \ifdim \parskip=0pt \parskip=2pt \fi 3406 \let\item = \internalBitem 3407 \let\itemx = \internalBitemx 3408} 3409\def\Etable{\endgraf\afterenvbreak} 3410\let\Eftable\Etable 3411\let\Evtable\Etable 3412\let\Eitemize\Etable 3413\let\Eenumerate\Etable 3414 3415% This is the counter used by @enumerate, which is really @itemize 3416 3417\newcount \itemno 3418 3419\envdef\itemize{\parsearg\doitemize} 3420 3421\def\doitemize#1{% 3422 \aboveenvbreak 3423 \itemmax=\itemindent 3424 \advance\itemmax by -\itemmargin 3425 \advance\leftskip by \itemindent 3426 \exdentamount=\itemindent 3427 \parindent=0pt 3428 \parskip=\smallskipamount 3429 \ifdim\parskip=0pt \parskip=2pt \fi 3430 % 3431 % Try typesetting the item mark that if the document erroneously says 3432 % something like @itemize @samp (intending @table), there's an error 3433 % right away at the @itemize. It's not the best error message in the 3434 % world, but it's better than leaving it to the @item. This means if 3435 % the user wants an empty mark, they have to say @w{} not just @w. 3436 \def\itemcontents{#1}% 3437 \setbox0 = \hbox{\itemcontents}% 3438 % 3439 % @itemize with no arg is equivalent to @itemize @bullet. 3440 \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi 3441 % 3442 \let\item=\itemizeitem 3443} 3444 3445% Definition of @item while inside @itemize and @enumerate. 3446% 3447\def\itemizeitem{% 3448 \advance\itemno by 1 % for enumerations 3449 {\let\par=\endgraf \smallbreak}% reasonable place to break 3450 {% 3451 % If the document has an @itemize directly after a section title, a 3452 % \nobreak will be last on the list, and \sectionheading will have 3453 % done a \vskip-\parskip. In that case, we don't want to zero 3454 % parskip, or the item text will crash with the heading. On the 3455 % other hand, when there is normal text preceding the item (as there 3456 % usually is), we do want to zero parskip, or there would be too much 3457 % space. In that case, we won't have a \nobreak before. At least 3458 % that's the theory. 3459 \ifnum\lastpenalty<10000 \parskip=0in \fi 3460 \noindent 3461 \hbox to 0pt{\hss \itemcontents \kern\itemmargin}% 3462 % 3463 \vadjust{\penalty 1200}}% not good to break after first line of item. 3464 \flushcr 3465} 3466 3467% \splitoff TOKENS\endmark defines \first to be the first token in 3468% TOKENS, and \rest to be the remainder. 3469% 3470\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}% 3471 3472% Allow an optional argument of an uppercase letter, lowercase letter, 3473% or number, to specify the first label in the enumerated list. No 3474% argument is the same as `1'. 3475% 3476\envparseargdef\enumerate{\enumeratey #1 \endenumeratey} 3477\def\enumeratey #1 #2\endenumeratey{% 3478 % If we were given no argument, pretend we were given `1'. 3479 \def\thearg{#1}% 3480 \ifx\thearg\empty \def\thearg{1}\fi 3481 % 3482 % Detect if the argument is a single token. If so, it might be a 3483 % letter. Otherwise, the only valid thing it can be is a number. 3484 % (We will always have one token, because of the test we just made. 3485 % This is a good thing, since \splitoff doesn't work given nothing at 3486 % all -- the first parameter is undelimited.) 3487 \expandafter\splitoff\thearg\endmark 3488 \ifx\rest\empty 3489 % Only one token in the argument. It could still be anything. 3490 % A ``lowercase letter'' is one whose \lccode is nonzero. 3491 % An ``uppercase letter'' is one whose \lccode is both nonzero, and 3492 % not equal to itself. 3493 % Otherwise, we assume it's a number. 3494 % 3495 % We need the \relax at the end of the \ifnum lines to stop TeX from 3496 % continuing to look for a <number>. 3497 % 3498 \ifnum\lccode\expandafter`\thearg=0\relax 3499 \numericenumerate % a number (we hope) 3500 \else 3501 % It's a letter. 3502 \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax 3503 \lowercaseenumerate % lowercase letter 3504 \else 3505 \uppercaseenumerate % uppercase letter 3506 \fi 3507 \fi 3508 \else 3509 % Multiple tokens in the argument. We hope it's a number. 3510 \numericenumerate 3511 \fi 3512} 3513 3514% An @enumerate whose labels are integers. The starting integer is 3515% given in \thearg. 3516% 3517\def\numericenumerate{% 3518 \itemno = \thearg 3519 \startenumeration{\the\itemno}% 3520} 3521 3522% The starting (lowercase) letter is in \thearg. 3523\def\lowercaseenumerate{% 3524 \itemno = \expandafter`\thearg 3525 \startenumeration{% 3526 % Be sure we're not beyond the end of the alphabet. 3527 \ifnum\itemno=0 3528 \errmessage{No more lowercase letters in @enumerate; get a bigger 3529 alphabet}% 3530 \fi 3531 \char\lccode\itemno 3532 }% 3533} 3534 3535% The starting (uppercase) letter is in \thearg. 3536\def\uppercaseenumerate{% 3537 \itemno = \expandafter`\thearg 3538 \startenumeration{% 3539 % Be sure we're not beyond the end of the alphabet. 3540 \ifnum\itemno=0 3541 \errmessage{No more uppercase letters in @enumerate; get a bigger 3542 alphabet} 3543 \fi 3544 \char\uccode\itemno 3545 }% 3546} 3547 3548% Call \doitemize, adding a period to the first argument and supplying the 3549% common last two arguments. Also subtract one from the initial value in 3550% \itemno, since @item increments \itemno. 3551% 3552\def\startenumeration#1{% 3553 \advance\itemno by -1 3554 \doitemize{#1.}\flushcr 3555} 3556 3557% @alphaenumerate and @capsenumerate are abbreviations for giving an arg 3558% to @enumerate. 3559% 3560\def\alphaenumerate{\enumerate{a}} 3561\def\capsenumerate{\enumerate{A}} 3562\def\Ealphaenumerate{\Eenumerate} 3563\def\Ecapsenumerate{\Eenumerate} 3564 3565 3566% @multitable macros 3567% Amy Hendrickson, 8/18/94, 3/6/96 3568% 3569% @multitable ... @end multitable will make as many columns as desired. 3570% Contents of each column will wrap at width given in preamble. Width 3571% can be specified either with sample text given in a template line, 3572% or in percent of \hsize, the current width of text on page. 3573 3574% Table can continue over pages but will only break between lines. 3575 3576% To make preamble: 3577% 3578% Either define widths of columns in terms of percent of \hsize: 3579% @multitable @columnfractions .25 .3 .45 3580% @item ... 3581% 3582% Numbers following @columnfractions are the percent of the total 3583% current hsize to be used for each column. You may use as many 3584% columns as desired. 3585 3586 3587% Or use a template: 3588% @multitable {Column 1 template} {Column 2 template} {Column 3 template} 3589% @item ... 3590% using the widest term desired in each column. 3591 3592% Each new table line starts with @item, each subsequent new column 3593% starts with @tab. Empty columns may be produced by supplying @tab's 3594% with nothing between them for as many times as empty columns are needed, 3595% ie, @tab@tab@tab will produce two empty columns. 3596 3597% @item, @tab do not need to be on their own lines, but it will not hurt 3598% if they are. 3599 3600% Sample multitable: 3601 3602% @multitable {Column 1 template} {Column 2 template} {Column 3 template} 3603% @item first col stuff @tab second col stuff @tab third col 3604% @item 3605% first col stuff 3606% @tab 3607% second col stuff 3608% @tab 3609% third col 3610% @item first col stuff @tab second col stuff 3611% @tab Many paragraphs of text may be used in any column. 3612% 3613% They will wrap at the width determined by the template. 3614% @item@tab@tab This will be in third column. 3615% @end multitable 3616 3617% Default dimensions may be reset by user. 3618% @multitableparskip is vertical space between paragraphs in table. 3619% @multitableparindent is paragraph indent in table. 3620% @multitablecolmargin is horizontal space to be left between columns. 3621% @multitablelinespace is space to leave between table items, baseline 3622% to baseline. 3623% 0pt means it depends on current normal line spacing. 3624% 3625\newskip\multitableparskip 3626\newskip\multitableparindent 3627\newdimen\multitablecolspace 3628\newskip\multitablelinespace 3629\multitableparskip=0pt 3630\multitableparindent=6pt 3631\multitablecolspace=12pt 3632\multitablelinespace=0pt 3633 3634% Macros used to set up halign preamble: 3635% 3636\let\endsetuptable\relax 3637\def\xendsetuptable{\endsetuptable} 3638\let\columnfractions\relax 3639\def\xcolumnfractions{\columnfractions} 3640\newif\ifsetpercent 3641 3642% #1 is the @columnfraction, usually a decimal number like .5, but might 3643% be just 1. We just use it, whatever it is. 3644% 3645\def\pickupwholefraction#1 {% 3646 \global\advance\colcount by 1 3647 \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}% 3648 \setuptable 3649} 3650 3651\newcount\colcount 3652\def\setuptable#1{% 3653 \def\firstarg{#1}% 3654 \ifx\firstarg\xendsetuptable 3655 \let\go = \relax 3656 \else 3657 \ifx\firstarg\xcolumnfractions 3658 \global\setpercenttrue 3659 \else 3660 \ifsetpercent 3661 \let\go\pickupwholefraction 3662 \else 3663 \global\advance\colcount by 1 3664 \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a 3665 % separator; typically that is always in the input, anyway. 3666 \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}% 3667 \fi 3668 \fi 3669 \ifx\go\pickupwholefraction 3670 % Put the argument back for the \pickupwholefraction call, so 3671 % we'll always have a period there to be parsed. 3672 \def\go{\pickupwholefraction#1}% 3673 \else 3674 \let\go = \setuptable 3675 \fi% 3676 \fi 3677 \go 3678} 3679 3680% multitable-only commands. 3681% 3682% @headitem starts a heading row, which we typeset in bold. 3683% Assignments have to be global since we are inside the implicit group 3684% of an alignment entry. \everycr resets \everytab so we don't have to 3685% undo it ourselves. 3686\def\headitemfont{\b}% for people to use in the template row; not changeable 3687\def\headitem{% 3688 \checkenv\multitable 3689 \crcr 3690 \global\everytab={\bf}% can't use \headitemfont since the parsing differs 3691 \the\everytab % for the first item 3692}% 3693% 3694% A \tab used to include \hskip1sp. But then the space in a template 3695% line is not enough. That is bad. So let's go back to just `&' until 3696% we again encounter the problem the 1sp was intended to solve. 3697% --karl, nathan@acm.org, 20apr99. 3698\def\tab{\checkenv\multitable &\the\everytab}% 3699 3700% @multitable ... @end multitable definitions: 3701% 3702\newtoks\everytab % insert after every tab. 3703% 3704\envdef\multitable{% 3705 \vskip\parskip 3706 \startsavinginserts 3707 % 3708 % @item within a multitable starts a normal row. 3709 % We use \def instead of \let so that if one of the multitable entries 3710 % contains an @itemize, we don't choke on the \item (seen as \crcr aka 3711 % \endtemplate) expanding \doitemize. 3712 \def\item{\crcr}% 3713 % 3714 \tolerance=9500 3715 \hbadness=9500 3716 \setmultitablespacing 3717 \parskip=\multitableparskip 3718 \parindent=\multitableparindent 3719 \overfullrule=0pt 3720 \global\colcount=0 3721 % 3722 \everycr = {% 3723 \noalign{% 3724 \global\everytab={}% 3725 \global\colcount=0 % Reset the column counter. 3726 % Check for saved footnotes, etc. 3727 \checkinserts 3728 % Keeps underfull box messages off when table breaks over pages. 3729 %\filbreak 3730 % Maybe so, but it also creates really weird page breaks when the 3731 % table breaks over pages. Wouldn't \vfil be better? Wait until the 3732 % problem manifests itself, so it can be fixed for real --karl. 3733 }% 3734 }% 3735 % 3736 \parsearg\domultitable 3737} 3738\def\domultitable#1{% 3739 % To parse everything between @multitable and @item: 3740 \setuptable#1 \endsetuptable 3741 % 3742 % This preamble sets up a generic column definition, which will 3743 % be used as many times as user calls for columns. 3744 % \vtop will set a single line and will also let text wrap and 3745 % continue for many paragraphs if desired. 3746 \halign\bgroup &% 3747 \global\advance\colcount by 1 3748 \multistrut 3749 \vtop{% 3750 % Use the current \colcount to find the correct column width: 3751 \hsize=\expandafter\csname col\the\colcount\endcsname 3752 % 3753 % In order to keep entries from bumping into each other 3754 % we will add a \leftskip of \multitablecolspace to all columns after 3755 % the first one. 3756 % 3757 % If a template has been used, we will add \multitablecolspace 3758 % to the width of each template entry. 3759 % 3760 % If the user has set preamble in terms of percent of \hsize we will 3761 % use that dimension as the width of the column, and the \leftskip 3762 % will keep entries from bumping into each other. Table will start at 3763 % left margin and final column will justify at right margin. 3764 % 3765 % Make sure we don't inherit \rightskip from the outer environment. 3766 \rightskip=0pt 3767 \ifnum\colcount=1 3768 % The first column will be indented with the surrounding text. 3769 \advance\hsize by\leftskip 3770 \else 3771 \ifsetpercent \else 3772 % If user has not set preamble in terms of percent of \hsize 3773 % we will advance \hsize by \multitablecolspace. 3774 \advance\hsize by \multitablecolspace 3775 \fi 3776 % In either case we will make \leftskip=\multitablecolspace: 3777 \leftskip=\multitablecolspace 3778 \fi 3779 % Ignoring space at the beginning and end avoids an occasional spurious 3780 % blank line, when TeX decides to break the line at the space before the 3781 % box from the multistrut, so the strut ends up on a line by itself. 3782 % For example: 3783 % @multitable @columnfractions .11 .89 3784 % @item @code{#} 3785 % @tab Legal holiday which is valid in major parts of the whole country. 3786 % Is automatically provided with highlighting sequences respectively 3787 % marking characters. 3788 \noindent\ignorespaces##\unskip\multistrut 3789 }\cr 3790} 3791\def\Emultitable{% 3792 \crcr 3793 \egroup % end the \halign 3794 \global\setpercentfalse 3795} 3796 3797\def\setmultitablespacing{% 3798 \def\multistrut{\strut}% just use the standard line spacing 3799 % 3800 % Compute \multitablelinespace (if not defined by user) for use in 3801 % \multitableparskip calculation. We used define \multistrut based on 3802 % this, but (ironically) that caused the spacing to be off. 3803 % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100. 3804\ifdim\multitablelinespace=0pt 3805\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip 3806\global\advance\multitablelinespace by-\ht0 3807\fi 3808%% Test to see if parskip is larger than space between lines of 3809%% table. If not, do nothing. 3810%% If so, set to same dimension as multitablelinespace. 3811\ifdim\multitableparskip>\multitablelinespace 3812\global\multitableparskip=\multitablelinespace 3813\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller 3814 %% than skip between lines in the table. 3815\fi% 3816\ifdim\multitableparskip=0pt 3817\global\multitableparskip=\multitablelinespace 3818\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller 3819 %% than skip between lines in the table. 3820\fi} 3821 3822 3823\message{conditionals,} 3824 3825% @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext, 3826% @ifnotxml always succeed. They currently do nothing; we don't 3827% attempt to check whether the conditionals are properly nested. But we 3828% have to remember that they are conditionals, so that @end doesn't 3829% attempt to close an environment group. 3830% 3831\def\makecond#1{% 3832 \expandafter\let\csname #1\endcsname = \relax 3833 \expandafter\let\csname iscond.#1\endcsname = 1 3834} 3835\makecond{iftex} 3836\makecond{ifnotdocbook} 3837\makecond{ifnothtml} 3838\makecond{ifnotinfo} 3839\makecond{ifnotplaintext} 3840\makecond{ifnotxml} 3841 3842% Ignore @ignore, @ifhtml, @ifinfo, and the like. 3843% 3844\def\direntry{\doignore{direntry}} 3845\def\documentdescription{\doignore{documentdescription}} 3846\def\docbook{\doignore{docbook}} 3847\def\html{\doignore{html}} 3848\def\ifdocbook{\doignore{ifdocbook}} 3849\def\ifhtml{\doignore{ifhtml}} 3850\def\ifinfo{\doignore{ifinfo}} 3851\def\ifnottex{\doignore{ifnottex}} 3852\def\ifplaintext{\doignore{ifplaintext}} 3853\def\ifxml{\doignore{ifxml}} 3854\def\ignore{\doignore{ignore}} 3855\def\menu{\doignore{menu}} 3856\def\xml{\doignore{xml}} 3857 3858% Ignore text until a line `@end #1', keeping track of nested conditionals. 3859% 3860% A count to remember the depth of nesting. 3861\newcount\doignorecount 3862 3863\def\doignore#1{\begingroup 3864 % Scan in ``verbatim'' mode: 3865 \obeylines 3866 \catcode`\@ = \other 3867 \catcode`\{ = \other 3868 \catcode`\} = \other 3869 % 3870 % Make sure that spaces turn into tokens that match what \doignoretext wants. 3871 \spaceisspace 3872 % 3873 % Count number of #1's that we've seen. 3874 \doignorecount = 0 3875 % 3876 % Swallow text until we reach the matching `@end #1'. 3877 \dodoignore{#1}% 3878} 3879 3880{ \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source. 3881 \obeylines % 3882 % 3883 \gdef\dodoignore#1{% 3884 % #1 contains the command name as a string, e.g., `ifinfo'. 3885 % 3886 % Define a command to find the next `@end #1'. 3887 \long\def\doignoretext##1^^M@end #1{% 3888 \doignoretextyyy##1^^M@#1\_STOP_}% 3889 % 3890 % And this command to find another #1 command, at the beginning of a 3891 % line. (Otherwise, we would consider a line `@c @ifset', for 3892 % example, to count as an @ifset for nesting.) 3893 \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}% 3894 % 3895 % And now expand that command. 3896 \doignoretext ^^M% 3897 }% 3898} 3899 3900\def\doignoreyyy#1{% 3901 \def\temp{#1}% 3902 \ifx\temp\empty % Nothing found. 3903 \let\next\doignoretextzzz 3904 \else % Found a nested condition, ... 3905 \advance\doignorecount by 1 3906 \let\next\doignoretextyyy % ..., look for another. 3907 % If we're here, #1 ends with ^^M\ifinfo (for example). 3908 \fi 3909 \next #1% the token \_STOP_ is present just after this macro. 3910} 3911 3912% We have to swallow the remaining "\_STOP_". 3913% 3914\def\doignoretextzzz#1{% 3915 \ifnum\doignorecount = 0 % We have just found the outermost @end. 3916 \let\next\enddoignore 3917 \else % Still inside a nested condition. 3918 \advance\doignorecount by -1 3919 \let\next\doignoretext % Look for the next @end. 3920 \fi 3921 \next 3922} 3923 3924% Finish off ignored text. 3925{ \obeylines% 3926 % Ignore anything after the last `@end #1'; this matters in verbatim 3927 % environments, where otherwise the newline after an ignored conditional 3928 % would result in a blank line in the output. 3929 \gdef\enddoignore#1^^M{\endgroup\ignorespaces}% 3930} 3931 3932 3933% @set VAR sets the variable VAR to an empty value. 3934% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE. 3935% 3936% Since we want to separate VAR from REST-OF-LINE (which might be 3937% empty), we can't just use \parsearg; we have to insert a space of our 3938% own to delimit the rest of the line, and then take it out again if we 3939% didn't need it. 3940% We rely on the fact that \parsearg sets \catcode`\ =10. 3941% 3942\parseargdef\set{\setyyy#1 \endsetyyy} 3943\def\setyyy#1 #2\endsetyyy{% 3944 {% 3945 \makevalueexpandable 3946 \def\temp{#2}% 3947 \edef\next{\gdef\makecsname{SET#1}}% 3948 \ifx\temp\empty 3949 \next{}% 3950 \else 3951 \setzzz#2\endsetzzz 3952 \fi 3953 }% 3954} 3955% Remove the trailing space \setxxx inserted. 3956\def\setzzz#1 \endsetzzz{\next{#1}} 3957 3958% @clear VAR clears (i.e., unsets) the variable VAR. 3959% 3960\parseargdef\clear{% 3961 {% 3962 \makevalueexpandable 3963 \global\expandafter\let\csname SET#1\endcsname=\relax 3964 }% 3965} 3966 3967% @value{foo} gets the text saved in variable foo. 3968\def\value{\begingroup\makevalueexpandable\valuexxx} 3969\def\valuexxx#1{\expandablevalue{#1}\endgroup} 3970{ 3971 \catcode`\- = \active \catcode`\_ = \active 3972 % 3973 \gdef\makevalueexpandable{% 3974 \let\value = \expandablevalue 3975 % We don't want these characters active, ... 3976 \catcode`\-=\other \catcode`\_=\other 3977 % ..., but we might end up with active ones in the argument if 3978 % we're called from @code, as @code{@value{foo-bar_}}, though. 3979 % So \let them to their normal equivalents. 3980 \let-\realdash \let_\normalunderscore 3981 } 3982} 3983 3984% We have this subroutine so that we can handle at least some @value's 3985% properly in indexes (we call \makevalueexpandable in \indexdummies). 3986% The command has to be fully expandable (if the variable is set), since 3987% the result winds up in the index file. This means that if the 3988% variable's value contains other Texinfo commands, it's almost certain 3989% it will fail (although perhaps we could fix that with sufficient work 3990% to do a one-level expansion on the result, instead of complete). 3991% 3992\def\expandablevalue#1{% 3993 \expandafter\ifx\csname SET#1\endcsname\relax 3994 {[No value for ``#1'']}% 3995 \message{Variable `#1', used in @value, is not set.}% 3996 \else 3997 \csname SET#1\endcsname 3998 \fi 3999} 4000 4001% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined 4002% with @set. 4003% 4004% To get special treatment of `@end ifset,' call \makeond and the redefine. 4005% 4006\makecond{ifset} 4007\def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}} 4008\def\doifset#1#2{% 4009 {% 4010 \makevalueexpandable 4011 \let\next=\empty 4012 \expandafter\ifx\csname SET#2\endcsname\relax 4013 #1% If not set, redefine \next. 4014 \fi 4015 \expandafter 4016 }\next 4017} 4018\def\ifsetfail{\doignore{ifset}} 4019 4020% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been 4021% defined with @set, or has been undefined with @clear. 4022% 4023% The `\else' inside the `\doifset' parameter is a trick to reuse the 4024% above code: if the variable is not set, do nothing, if it is set, 4025% then redefine \next to \ifclearfail. 4026% 4027\makecond{ifclear} 4028\def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}} 4029\def\ifclearfail{\doignore{ifclear}} 4030 4031% @dircategory CATEGORY -- specify a category of the dir file 4032% which this file should belong to. Ignore this in TeX. 4033\let\dircategory=\comment 4034 4035% @defininfoenclose. 4036\let\definfoenclose=\comment 4037 4038 4039\message{indexing,} 4040% Index generation facilities 4041 4042% Define \newwrite to be identical to plain tex's \newwrite 4043% except not \outer, so it can be used within macros and \if's. 4044\edef\newwrite{\makecsname{ptexnewwrite}} 4045 4046% \newindex {foo} defines an index named foo. 4047% It automatically defines \fooindex such that 4048% \fooindex ...rest of line... puts an entry in the index foo. 4049% It also defines \fooindfile to be the number of the output channel for 4050% the file that accumulates this index. The file's extension is foo. 4051% The name of an index should be no more than 2 characters long 4052% for the sake of vms. 4053% 4054\def\newindex#1{% 4055 \iflinks 4056 \expandafter\newwrite \csname#1indfile\endcsname 4057 \openout \csname#1indfile\endcsname \jobname.#1 % Open the file 4058 \fi 4059 \expandafter\xdef\csname#1index\endcsname{% % Define @#1index 4060 \noexpand\doindex{#1}} 4061} 4062 4063% @defindex foo == \newindex{foo} 4064% 4065\def\defindex{\parsearg\newindex} 4066 4067% Define @defcodeindex, like @defindex except put all entries in @code. 4068% 4069\def\defcodeindex{\parsearg\newcodeindex} 4070% 4071\def\newcodeindex#1{% 4072 \iflinks 4073 \expandafter\newwrite \csname#1indfile\endcsname 4074 \openout \csname#1indfile\endcsname \jobname.#1 4075 \fi 4076 \expandafter\xdef\csname#1index\endcsname{% 4077 \noexpand\docodeindex{#1}}% 4078} 4079 4080 4081% @synindex foo bar makes index foo feed into index bar. 4082% Do this instead of @defindex foo if you don't want it as a separate index. 4083% 4084% @syncodeindex foo bar similar, but put all entries made for index foo 4085% inside @code. 4086% 4087\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}} 4088\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}} 4089 4090% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo), 4091% #3 the target index (bar). 4092\def\dosynindex#1#2#3{% 4093 % Only do \closeout if we haven't already done it, else we'll end up 4094 % closing the target index. 4095 \expandafter \ifx\csname donesynindex#2\endcsname \relax 4096 % The \closeout helps reduce unnecessary open files; the limit on the 4097 % Acorn RISC OS is a mere 16 files. 4098 \expandafter\closeout\csname#2indfile\endcsname 4099 \expandafter\let\csname donesynindex#2\endcsname = 1 4100 \fi 4101 % redefine \fooindfile: 4102 \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname 4103 \expandafter\let\csname#2indfile\endcsname=\temp 4104 % redefine \fooindex: 4105 \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}% 4106} 4107 4108% Define \doindex, the driver for all \fooindex macros. 4109% Argument #1 is generated by the calling \fooindex macro, 4110% and it is "foo", the name of the index. 4111 4112% \doindex just uses \parsearg; it calls \doind for the actual work. 4113% This is because \doind is more useful to call from other macros. 4114 4115% There is also \dosubind {index}{topic}{subtopic} 4116% which makes an entry in a two-level index such as the operation index. 4117 4118\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer} 4119\def\singleindexer #1{\doind{\indexname}{#1}} 4120 4121% like the previous two, but they put @code around the argument. 4122\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} 4123\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} 4124 4125% Take care of Texinfo commands that can appear in an index entry. 4126% Since there are some commands we want to expand, and others we don't, 4127% we have to laboriously prevent expansion for those that we don't. 4128% 4129\def\indexdummies{% 4130 \escapechar = `\\ % use backslash in output files. 4131 \def\@{@}% change to @@ when we switch to @ as escape char in index files. 4132 \def\ {\realbackslash\space }% 4133 % 4134 % Need these in case \tex is in effect and \{ is a \delimiter again. 4135 % But can't use \lbracecmd and \rbracecmd because texindex assumes 4136 % braces and backslashes are used only as delimiters. 4137 \let\{ = \mylbrace 4138 \let\} = \myrbrace 4139 % 4140 % I don't entirely understand this, but when an index entry is 4141 % generated from a macro call, the \endinput which \scanmacro inserts 4142 % causes processing to be prematurely terminated. This is, 4143 % apparently, because \indexsorttmp is fully expanded, and \endinput 4144 % is an expandable command. The redefinition below makes \endinput 4145 % disappear altogether for that purpose -- although logging shows that 4146 % processing continues to some further point. On the other hand, it 4147 % seems \endinput does not hurt in the printed index arg, since that 4148 % is still getting written without apparent harm. 4149 % 4150 % Sample source (mac-idx3.tex, reported by Graham Percival to 4151 % help-texinfo, 22may06): 4152 % @macro funindex {WORD} 4153 % @findex xyz 4154 % @end macro 4155 % ... 4156 % @funindex commtest 4157 % 4158 % The above is not enough to reproduce the bug, but it gives the flavor. 4159 % 4160 % Sample whatsit resulting: 4161 % .@write3{\entry{xyz}{@folio }{@code {xyz@endinput }}} 4162 % 4163 % So: 4164 \let\endinput = \empty 4165 % 4166 % Do the redefinitions. 4167 \commondummies 4168} 4169 4170% For the aux and toc files, @ is the escape character. So we want to 4171% redefine everything using @ as the escape character (instead of 4172% \realbackslash, still used for index files). When everything uses @, 4173% this will be simpler. 4174% 4175\def\atdummies{% 4176 \def\@{@@}% 4177 \def\ {@ }% 4178 \let\{ = \lbraceatcmd 4179 \let\} = \rbraceatcmd 4180 % 4181 % Do the redefinitions. 4182 \commondummies 4183 \otherbackslash 4184} 4185 4186% Called from \indexdummies and \atdummies. 4187% 4188\def\commondummies{% 4189 % 4190 % \definedummyword defines \#1 as \string\#1\space, thus effectively 4191 % preventing its expansion. This is used only for control% words, 4192 % not control letters, because the \space would be incorrect for 4193 % control characters, but is needed to separate the control word 4194 % from whatever follows. 4195 % 4196 % For control letters, we have \definedummyletter, which omits the 4197 % space. 4198 % 4199 % These can be used both for control words that take an argument and 4200 % those that do not. If it is followed by {arg} in the input, then 4201 % that will dutifully get written to the index (or wherever). 4202 % 4203 \def\definedummyword ##1{\def##1{\string##1\space}}% 4204 \def\definedummyletter##1{\def##1{\string##1}}% 4205 \let\definedummyaccent\definedummyletter 4206 % 4207 \commondummiesnofonts 4208 % 4209 \definedummyletter\_% 4210 % 4211 % Non-English letters. 4212 \definedummyword\AA 4213 \definedummyword\AE 4214 \definedummyword\DH 4215 \definedummyword\L 4216 \definedummyword\O 4217 \definedummyword\OE 4218 \definedummyword\TH 4219 \definedummyword\aa 4220 \definedummyword\ae 4221 \definedummyword\dh 4222 \definedummyword\exclamdown 4223 \definedummyword\l 4224 \definedummyword\o 4225 \definedummyword\oe 4226 \definedummyword\ordf 4227 \definedummyword\ordm 4228 \definedummyword\questiondown 4229 \definedummyword\ss 4230 \definedummyword\th 4231 % 4232 % Although these internal commands shouldn't show up, sometimes they do. 4233 \definedummyword\bf 4234 \definedummyword\gtr 4235 \definedummyword\hat 4236 \definedummyword\less 4237 \definedummyword\sf 4238 \definedummyword\sl 4239 \definedummyword\tclose 4240 \definedummyword\tt 4241 % 4242 \definedummyword\LaTeX 4243 \definedummyword\TeX 4244 % 4245 % Assorted special characters. 4246 \definedummyword\bullet 4247 \definedummyword\comma 4248 \definedummyword\copyright 4249 \definedummyword\registeredsymbol 4250 \definedummyword\dots 4251 \definedummyword\enddots 4252 \definedummyword\equiv 4253 \definedummyword\error 4254 \definedummyword\euro 4255 \definedummyword\guillemetleft 4256 \definedummyword\guillemetright 4257 \definedummyword\guilsinglleft 4258 \definedummyword\guilsinglright 4259 \definedummyword\expansion 4260 \definedummyword\minus 4261 \definedummyword\ogonek 4262 \definedummyword\pounds 4263 \definedummyword\point 4264 \definedummyword\print 4265 \definedummyword\quotedblbase 4266 \definedummyword\quotedblleft 4267 \definedummyword\quotedblright 4268 \definedummyword\quoteleft 4269 \definedummyword\quoteright 4270 \definedummyword\quotesinglbase 4271 \definedummyword\result 4272 \definedummyword\textdegree 4273 % 4274 % We want to disable all macros so that they are not expanded by \write. 4275 \macrolist 4276 % 4277 \normalturnoffactive 4278 % 4279 % Handle some cases of @value -- where it does not contain any 4280 % (non-fully-expandable) commands. 4281 \makevalueexpandable 4282} 4283 4284% \commondummiesnofonts: common to \commondummies and \indexnofonts. 4285% 4286\def\commondummiesnofonts{% 4287 % Control letters and accents. 4288 \definedummyletter\!% 4289 \definedummyaccent\"% 4290 \definedummyaccent\'% 4291 \definedummyletter\*% 4292 \definedummyaccent\,% 4293 \definedummyletter\.% 4294 \definedummyletter\/% 4295 \definedummyletter\:% 4296 \definedummyaccent\=% 4297 \definedummyletter\?% 4298 \definedummyaccent\^% 4299 \definedummyaccent\`% 4300 \definedummyaccent\~% 4301 \definedummyword\u 4302 \definedummyword\v 4303 \definedummyword\H 4304 \definedummyword\dotaccent 4305 \definedummyword\ogonek 4306 \definedummyword\ringaccent 4307 \definedummyword\tieaccent 4308 \definedummyword\ubaraccent 4309 \definedummyword\udotaccent 4310 \definedummyword\dotless 4311 % 4312 % Texinfo font commands. 4313 \definedummyword\b 4314 \definedummyword\i 4315 \definedummyword\r 4316 \definedummyword\sc 4317 \definedummyword\t 4318 % 4319 % Commands that take arguments. 4320 \definedummyword\acronym 4321 \definedummyword\cite 4322 \definedummyword\code 4323 \definedummyword\command 4324 \definedummyword\dfn 4325 \definedummyword\emph 4326 \definedummyword\env 4327 \definedummyword\file 4328 \definedummyword\kbd 4329 \definedummyword\key 4330 \definedummyword\math 4331 \definedummyword\option 4332 \definedummyword\pxref 4333 \definedummyword\ref 4334 \definedummyword\samp 4335 \definedummyword\strong 4336 \definedummyword\tie 4337 \definedummyword\uref 4338 \definedummyword\url 4339 \definedummyword\var 4340 \definedummyword\verb 4341 \definedummyword\w 4342 \definedummyword\xref 4343} 4344 4345% \indexnofonts is used when outputting the strings to sort the index 4346% by, and when constructing control sequence names. It eliminates all 4347% control sequences and just writes whatever the best ASCII sort string 4348% would be for a given command (usually its argument). 4349% 4350\def\indexnofonts{% 4351 % Accent commands should become @asis. 4352 \def\definedummyaccent##1{\let##1\asis}% 4353 % We can just ignore other control letters. 4354 \def\definedummyletter##1{\let##1\empty}% 4355 % Hopefully, all control words can become @asis. 4356 \let\definedummyword\definedummyaccent 4357 % 4358 \commondummiesnofonts 4359 % 4360 % Don't no-op \tt, since it isn't a user-level command 4361 % and is used in the definitions of the active chars like <, >, |, etc. 4362 % Likewise with the other plain tex font commands. 4363 %\let\tt=\asis 4364 % 4365 \def\ { }% 4366 \def\@{@}% 4367 % how to handle braces? 4368 \def\_{\normalunderscore}% 4369 % 4370 % Non-English letters. 4371 \def\AA{AA}% 4372 \def\AE{AE}% 4373 \def\DH{DZZ}% 4374 \def\L{L}% 4375 \def\OE{OE}% 4376 \def\O{O}% 4377 \def\TH{ZZZ}% 4378 \def\aa{aa}% 4379 \def\ae{ae}% 4380 \def\dh{dzz}% 4381 \def\exclamdown{!}% 4382 \def\l{l}% 4383 \def\oe{oe}% 4384 \def\ordf{a}% 4385 \def\ordm{o}% 4386 \def\o{o}% 4387 \def\questiondown{?}% 4388 \def\ss{ss}% 4389 \def\th{zzz}% 4390 % 4391 \def\LaTeX{LaTeX}% 4392 \def\TeX{TeX}% 4393 % 4394 % Assorted special characters. 4395 % (The following {} will end up in the sort string, but that's ok.) 4396 \def\bullet{bullet}% 4397 \def\comma{,}% 4398 \def\copyright{copyright}% 4399 \def\registeredsymbol{R}% 4400 \def\dots{...}% 4401 \def\enddots{...}% 4402 \def\equiv{==}% 4403 \def\error{error}% 4404 \def\euro{euro}% 4405 \def\guillemetleft{<<}% 4406 \def\guillemetright{>>}% 4407 \def\guilsinglleft{<}% 4408 \def\guilsinglright{>}% 4409 \def\expansion{==>}% 4410 \def\minus{-}% 4411 \def\pounds{pounds}% 4412 \def\point{.}% 4413 \def\print{-|}% 4414 \def\quotedblbase{"}% 4415 \def\quotedblleft{"}% 4416 \def\quotedblright{"}% 4417 \def\quoteleft{`}% 4418 \def\quoteright{'}% 4419 \def\quotesinglbase{,}% 4420 \def\result{=>}% 4421 \def\textdegree{degrees}% 4422 % 4423 % We need to get rid of all macros, leaving only the arguments (if present). 4424 % Of course this is not nearly correct, but it is the best we can do for now. 4425 % makeinfo does not expand macros in the argument to @deffn, which ends up 4426 % writing an index entry, and texindex isn't prepared for an index sort entry 4427 % that starts with \. 4428 % 4429 % Since macro invocations are followed by braces, we can just redefine them 4430 % to take a single TeX argument. The case of a macro invocation that 4431 % goes to end-of-line is not handled. 4432 % 4433 \macrolist 4434} 4435 4436\let\indexbackslash=0 %overridden during \printindex. 4437\let\SETmarginindex=\relax % put index entries in margin (undocumented)? 4438 4439% Most index entries go through here, but \dosubind is the general case. 4440% #1 is the index name, #2 is the entry text. 4441\def\doind#1#2{\dosubind{#1}{#2}{}} 4442 4443% Workhorse for all \fooindexes. 4444% #1 is name of index, #2 is stuff to put there, #3 is subentry -- 4445% empty if called from \doind, as we usually are (the main exception 4446% is with most defuns, which call us directly). 4447% 4448\def\dosubind#1#2#3{% 4449 \iflinks 4450 {% 4451 % Store the main index entry text (including the third arg). 4452 \toks0 = {#2}% 4453 % If third arg is present, precede it with a space. 4454 \def\thirdarg{#3}% 4455 \ifx\thirdarg\empty \else 4456 \toks0 = \expandafter{\the\toks0 \space #3}% 4457 \fi 4458 % 4459 \edef\writeto{\csname#1indfile\endcsname}% 4460 % 4461 \safewhatsit\dosubindwrite 4462 }% 4463 \fi 4464} 4465 4466% Write the entry in \toks0 to the index file: 4467% 4468\def\dosubindwrite{% 4469 % Put the index entry in the margin if desired. 4470 \ifx\SETmarginindex\relax\else 4471 \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}% 4472 \fi 4473 % 4474 % Remember, we are within a group. 4475 \indexdummies % Must do this here, since \bf, etc expand at this stage 4476 \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now 4477 % so it will be output as is; and it will print as backslash. 4478 % 4479 % Process the index entry with all font commands turned off, to 4480 % get the string to sort by. 4481 {\indexnofonts 4482 \edef\temp{\the\toks0}% need full expansion 4483 \xdef\indexsorttmp{\temp}% 4484 }% 4485 % 4486 % Set up the complete index entry, with both the sort key and 4487 % the original text, including any font commands. We write 4488 % three arguments to \entry to the .?? file (four in the 4489 % subentry case), texindex reduces to two when writing the .??s 4490 % sorted result. 4491 \edef\temp{% 4492 \write\writeto{% 4493 \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}% 4494 }% 4495 \temp 4496} 4497 4498% Take care of unwanted page breaks/skips around a whatsit: 4499% 4500% If a skip is the last thing on the list now, preserve it 4501% by backing up by \lastskip, doing the \write, then inserting 4502% the skip again. Otherwise, the whatsit generated by the 4503% \write or \pdfdest will make \lastskip zero. The result is that 4504% sequences like this: 4505% @end defun 4506% @tindex whatever 4507% @defun ... 4508% will have extra space inserted, because the \medbreak in the 4509% start of the @defun won't see the skip inserted by the @end of 4510% the previous defun. 4511% 4512% But don't do any of this if we're not in vertical mode. We 4513% don't want to do a \vskip and prematurely end a paragraph. 4514% 4515% Avoid page breaks due to these extra skips, too. 4516% 4517% But wait, there is a catch there: 4518% We'll have to check whether \lastskip is zero skip. \ifdim is not 4519% sufficient for this purpose, as it ignores stretch and shrink parts 4520% of the skip. The only way seems to be to check the textual 4521% representation of the skip. 4522% 4523% The following is almost like \def\zeroskipmacro{0.0pt} except that 4524% the ``p'' and ``t'' characters have catcode \other, not 11 (letter). 4525% 4526\edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname} 4527% 4528\newskip\whatsitskip 4529\newcount\whatsitpenalty 4530% 4531% ..., ready, GO: 4532% 4533\def\safewhatsit#1{% 4534\ifhmode 4535 #1% 4536\else 4537 % \lastskip and \lastpenalty cannot both be nonzero simultaneously. 4538 \whatsitskip = \lastskip 4539 \edef\lastskipmacro{\the\lastskip}% 4540 \whatsitpenalty = \lastpenalty 4541 % 4542 % If \lastskip is nonzero, that means the last item was a 4543 % skip. And since a skip is discardable, that means this 4544 % -\whatsitskip glue we're inserting is preceded by a 4545 % non-discardable item, therefore it is not a potential 4546 % breakpoint, therefore no \nobreak needed. 4547 \ifx\lastskipmacro\zeroskipmacro 4548 \else 4549 \vskip-\whatsitskip 4550 \fi 4551 % 4552 #1% 4553 % 4554 \ifx\lastskipmacro\zeroskipmacro 4555 % If \lastskip was zero, perhaps the last item was a penalty, and 4556 % perhaps it was >=10000, e.g., a \nobreak. In that case, we want 4557 % to re-insert the same penalty (values >10000 are used for various 4558 % signals); since we just inserted a non-discardable item, any 4559 % following glue (such as a \parskip) would be a breakpoint. For example: 4560 % 4561 % @deffn deffn-whatever 4562 % @vindex index-whatever 4563 % Description. 4564 % would allow a break between the index-whatever whatsit 4565 % and the "Description." paragraph. 4566 \ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi 4567 \else 4568 % On the other hand, if we had a nonzero \lastskip, 4569 % this make-up glue would be preceded by a non-discardable item 4570 % (the whatsit from the \write), so we must insert a \nobreak. 4571 \nobreak\vskip\whatsitskip 4572 \fi 4573\fi 4574} 4575 4576% The index entry written in the file actually looks like 4577% \entry {sortstring}{page}{topic} 4578% or 4579% \entry {sortstring}{page}{topic}{subtopic} 4580% The texindex program reads in these files and writes files 4581% containing these kinds of lines: 4582% \initial {c} 4583% before the first topic whose initial is c 4584% \entry {topic}{pagelist} 4585% for a topic that is used without subtopics 4586% \primary {topic} 4587% for the beginning of a topic that is used with subtopics 4588% \secondary {subtopic}{pagelist} 4589% for each subtopic. 4590 4591% Define the user-accessible indexing commands 4592% @findex, @vindex, @kindex, @cindex. 4593 4594\def\findex {\fnindex} 4595\def\kindex {\kyindex} 4596\def\cindex {\cpindex} 4597\def\vindex {\vrindex} 4598\def\tindex {\tpindex} 4599\def\pindex {\pgindex} 4600 4601\def\cindexsub {\begingroup\obeylines\cindexsub} 4602{\obeylines % 4603\gdef\cindexsub "#1" #2^^M{\endgroup % 4604\dosubind{cp}{#2}{#1}}} 4605 4606% Define the macros used in formatting output of the sorted index material. 4607 4608% @printindex causes a particular index (the ??s file) to get printed. 4609% It does not print any chapter heading (usually an @unnumbered). 4610% 4611\parseargdef\printindex{\begingroup 4612 \dobreak \chapheadingskip{10000}% 4613 % 4614 \smallfonts \rm 4615 \tolerance = 9500 4616 \plainfrenchspacing 4617 \everypar = {}% don't want the \kern\-parindent from indentation suppression. 4618 % 4619 % See if the index file exists and is nonempty. 4620 % Change catcode of @ here so that if the index file contains 4621 % \initial {@} 4622 % as its first line, TeX doesn't complain about mismatched braces 4623 % (because it thinks @} is a control sequence). 4624 \catcode`\@ = 11 4625 \openin 1 \jobname.#1s 4626 \ifeof 1 4627 % \enddoublecolumns gets confused if there is no text in the index, 4628 % and it loses the chapter title and the aux file entries for the 4629 % index. The easiest way to prevent this problem is to make sure 4630 % there is some text. 4631 \putwordIndexNonexistent 4632 \else 4633 % 4634 % If the index file exists but is empty, then \openin leaves \ifeof 4635 % false. We have to make TeX try to read something from the file, so 4636 % it can discover if there is anything in it. 4637 \read 1 to \temp 4638 \ifeof 1 4639 \putwordIndexIsEmpty 4640 \else 4641 % Index files are almost Texinfo source, but we use \ as the escape 4642 % character. It would be better to use @, but that's too big a change 4643 % to make right now. 4644 \def\indexbackslash{\backslashcurfont}% 4645 \catcode`\\ = 0 4646 \escapechar = `\\ 4647 \begindoublecolumns 4648 \input \jobname.#1s 4649 \enddoublecolumns 4650 \fi 4651 \fi 4652 \closein 1 4653\endgroup} 4654 4655% These macros are used by the sorted index file itself. 4656% Change them to control the appearance of the index. 4657 4658\def\initial#1{{% 4659 % Some minor font changes for the special characters. 4660 \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt 4661 % 4662 % Remove any glue we may have, we'll be inserting our own. 4663 \removelastskip 4664 % 4665 % We like breaks before the index initials, so insert a bonus. 4666 \nobreak 4667 \vskip 0pt plus 3\baselineskip 4668 \penalty 0 4669 \vskip 0pt plus -3\baselineskip 4670 % 4671 % Typeset the initial. Making this add up to a whole number of 4672 % baselineskips increases the chance of the dots lining up from column 4673 % to column. It still won't often be perfect, because of the stretch 4674 % we need before each entry, but it's better. 4675 % 4676 % No shrink because it confuses \balancecolumns. 4677 \vskip 1.67\baselineskip plus .5\baselineskip 4678 \leftline{\secbf #1}% 4679 % Do our best not to break after the initial. 4680 \nobreak 4681 \vskip .33\baselineskip plus .1\baselineskip 4682}} 4683 4684% \entry typesets a paragraph consisting of the text (#1), dot leaders, and 4685% then page number (#2) flushed to the right margin. It is used for index 4686% and table of contents entries. The paragraph is indented by \leftskip. 4687% 4688% A straightforward implementation would start like this: 4689% \def\entry#1#2{... 4690% But this freezes the catcodes in the argument, and can cause problems to 4691% @code, which sets - active. This problem was fixed by a kludge--- 4692% ``-'' was active throughout whole index, but this isn't really right. 4693% 4694% The right solution is to prevent \entry from swallowing the whole text. 4695% --kasal, 21nov03 4696\def\entry{% 4697 \begingroup 4698 % 4699 % Start a new paragraph if necessary, so our assignments below can't 4700 % affect previous text. 4701 \par 4702 % 4703 % Do not fill out the last line with white space. 4704 \parfillskip = 0in 4705 % 4706 % No extra space above this paragraph. 4707 \parskip = 0in 4708 % 4709 % Do not prefer a separate line ending with a hyphen to fewer lines. 4710 \finalhyphendemerits = 0 4711 % 4712 % \hangindent is only relevant when the entry text and page number 4713 % don't both fit on one line. In that case, bob suggests starting the 4714 % dots pretty far over on the line. Unfortunately, a large 4715 % indentation looks wrong when the entry text itself is broken across 4716 % lines. So we use a small indentation and put up with long leaders. 4717 % 4718 % \hangafter is reset to 1 (which is the value we want) at the start 4719 % of each paragraph, so we need not do anything with that. 4720 \hangindent = 2em 4721 % 4722 % When the entry text needs to be broken, just fill out the first line 4723 % with blank space. 4724 \rightskip = 0pt plus1fil 4725 % 4726 % A bit of stretch before each entry for the benefit of balancing 4727 % columns. 4728 \vskip 0pt plus1pt 4729 % 4730 % Swallow the left brace of the text (first parameter): 4731 \afterassignment\doentry 4732 \let\temp = 4733} 4734\def\doentry{% 4735 \bgroup % Instead of the swallowed brace. 4736 \noindent 4737 \aftergroup\finishentry 4738 % And now comes the text of the entry. 4739} 4740\def\finishentry#1{% 4741 % #1 is the page number. 4742 % 4743 % The following is kludged to not output a line of dots in the index if 4744 % there are no page numbers. The next person who breaks this will be 4745 % cursed by a Unix daemon. 4746 \setbox\boxA = \hbox{#1}% 4747 \ifdim\wd\boxA = 0pt 4748 \ % 4749 \else 4750 % 4751 % If we must, put the page number on a line of its own, and fill out 4752 % this line with blank space. (The \hfil is overwhelmed with the 4753 % fill leaders glue in \indexdotfill if the page number does fit.) 4754 \hfil\penalty50 4755 \null\nobreak\indexdotfill % Have leaders before the page number. 4756 % 4757 % The `\ ' here is removed by the implicit \unskip that TeX does as 4758 % part of (the primitive) \par. Without it, a spurious underfull 4759 % \hbox ensues. 4760 \ifpdf 4761 \pdfgettoks#1.% 4762 \ \the\toksA 4763 \else 4764 \ #1% 4765 \fi 4766 \fi 4767 \par 4768 \endgroup 4769} 4770 4771% Like plain.tex's \dotfill, except uses up at least 1 em. 4772\def\indexdotfill{\cleaders 4773 \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1fill} 4774 4775\def\primary #1{\line{#1\hfil}} 4776 4777\newskip\secondaryindent \secondaryindent=0.5cm 4778\def\secondary#1#2{{% 4779 \parfillskip=0in 4780 \parskip=0in 4781 \hangindent=1in 4782 \hangafter=1 4783 \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill 4784 \ifpdf 4785 \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. 4786 \else 4787 #2 4788 \fi 4789 \par 4790}} 4791 4792% Define two-column mode, which we use to typeset indexes. 4793% Adapted from the TeXbook, page 416, which is to say, 4794% the manmac.tex format used to print the TeXbook itself. 4795\catcode`\@=11 4796 4797\newbox\partialpage 4798\newdimen\doublecolumnhsize 4799 4800\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns 4801 % Grab any single-column material above us. 4802 \output = {% 4803 % 4804 % Here is a possibility not foreseen in manmac: if we accumulate a 4805 % whole lot of material, we might end up calling this \output 4806 % routine twice in a row (see the doublecol-lose test, which is 4807 % essentially a couple of indexes with @setchapternewpage off). In 4808 % that case we just ship out what is in \partialpage with the normal 4809 % output routine. Generally, \partialpage will be empty when this 4810 % runs and this will be a no-op. See the indexspread.tex test case. 4811 \ifvoid\partialpage \else 4812 \onepageout{\pagecontents\partialpage}% 4813 \fi 4814 % 4815 \global\setbox\partialpage = \vbox{% 4816 % Unvbox the main output page. 4817 \unvbox\PAGE 4818 \kern-\topskip \kern\baselineskip 4819 }% 4820 }% 4821 \eject % run that output routine to set \partialpage 4822 % 4823 % Use the double-column output routine for subsequent pages. 4824 \output = {\doublecolumnout}% 4825 % 4826 % Change the page size parameters. We could do this once outside this 4827 % routine, in each of @smallbook, @afourpaper, and the default 8.5x11 4828 % format, but then we repeat the same computation. Repeating a couple 4829 % of assignments once per index is clearly meaningless for the 4830 % execution time, so we may as well do it in one place. 4831 % 4832 % First we halve the line length, less a little for the gutter between 4833 % the columns. We compute the gutter based on the line length, so it 4834 % changes automatically with the paper format. The magic constant 4835 % below is chosen so that the gutter has the same value (well, +-<1pt) 4836 % as it did when we hard-coded it. 4837 % 4838 % We put the result in a separate register, \doublecolumhsize, so we 4839 % can restore it in \pagesofar, after \hsize itself has (potentially) 4840 % been clobbered. 4841 % 4842 \doublecolumnhsize = \hsize 4843 \advance\doublecolumnhsize by -.04154\hsize 4844 \divide\doublecolumnhsize by 2 4845 \hsize = \doublecolumnhsize 4846 % 4847 % Double the \vsize as well. (We don't need a separate register here, 4848 % since nobody clobbers \vsize.) 4849 \vsize = 2\vsize 4850} 4851 4852% The double-column output routine for all double-column pages except 4853% the last. 4854% 4855\def\doublecolumnout{% 4856 \splittopskip=\topskip \splitmaxdepth=\maxdepth 4857 % Get the available space for the double columns -- the normal 4858 % (undoubled) page height minus any material left over from the 4859 % previous page. 4860 \dimen@ = \vsize 4861 \divide\dimen@ by 2 4862 \advance\dimen@ by -\ht\partialpage 4863 % 4864 % box0 will be the left-hand column, box2 the right. 4865 \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ 4866 \onepageout\pagesofar 4867 \unvbox255 4868 \penalty\outputpenalty 4869} 4870% 4871% Re-output the contents of the output page -- any previous material, 4872% followed by the two boxes we just split, in box0 and box2. 4873\def\pagesofar{% 4874 \unvbox\partialpage 4875 % 4876 \hsize = \doublecolumnhsize 4877 \wd0=\hsize \wd2=\hsize 4878 \hbox to\pagewidth{\box0\hfil\box2}% 4879} 4880% 4881% All done with double columns. 4882\def\enddoublecolumns{% 4883 % The following penalty ensures that the page builder is exercised 4884 % _before_ we change the output routine. This is necessary in the 4885 % following situation: 4886 % 4887 % The last section of the index consists only of a single entry. 4888 % Before this section, \pagetotal is less than \pagegoal, so no 4889 % break occurs before the last section starts. However, the last 4890 % section, consisting of \initial and the single \entry, does not 4891 % fit on the page and has to be broken off. Without the following 4892 % penalty the page builder will not be exercised until \eject 4893 % below, and by that time we'll already have changed the output 4894 % routine to the \balancecolumns version, so the next-to-last 4895 % double-column page will be processed with \balancecolumns, which 4896 % is wrong: The two columns will go to the main vertical list, with 4897 % the broken-off section in the recent contributions. As soon as 4898 % the output routine finishes, TeX starts reconsidering the page 4899 % break. The two columns and the broken-off section both fit on the 4900 % page, because the two columns now take up only half of the page 4901 % goal. When TeX sees \eject from below which follows the final 4902 % section, it invokes the new output routine that we've set after 4903 % \balancecolumns below; \onepageout will try to fit the two columns 4904 % and the final section into the vbox of \pageheight (see 4905 % \pagebody), causing an overfull box. 4906 % 4907 % Note that glue won't work here, because glue does not exercise the 4908 % page builder, unlike penalties (see The TeXbook, pp. 280-281). 4909 \penalty0 4910 % 4911 \output = {% 4912 % Split the last of the double-column material. Leave it on the 4913 % current page, no automatic page break. 4914 \balancecolumns 4915 % 4916 % If we end up splitting too much material for the current page, 4917 % though, there will be another page break right after this \output 4918 % invocation ends. Having called \balancecolumns once, we do not 4919 % want to call it again. Therefore, reset \output to its normal 4920 % definition right away. (We hope \balancecolumns will never be 4921 % called on to balance too much material, but if it is, this makes 4922 % the output somewhat more palatable.) 4923 \global\output = {\onepageout{\pagecontents\PAGE}}% 4924 }% 4925 \eject 4926 \endgroup % started in \begindoublecolumns 4927 % 4928 % \pagegoal was set to the doubled \vsize above, since we restarted 4929 % the current page. We're now back to normal single-column 4930 % typesetting, so reset \pagegoal to the normal \vsize (after the 4931 % \endgroup where \vsize got restored). 4932 \pagegoal = \vsize 4933} 4934% 4935% Called at the end of the double column material. 4936\def\balancecolumns{% 4937 \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120. 4938 \dimen@ = \ht0 4939 \advance\dimen@ by \topskip 4940 \advance\dimen@ by-\baselineskip 4941 \divide\dimen@ by 2 % target to split to 4942 %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}% 4943 \splittopskip = \topskip 4944 % Loop until we get a decent breakpoint. 4945 {% 4946 \vbadness = 10000 4947 \loop 4948 \global\setbox3 = \copy0 4949 \global\setbox1 = \vsplit3 to \dimen@ 4950 \ifdim\ht3>\dimen@ 4951 \global\advance\dimen@ by 1pt 4952 \repeat 4953 }% 4954 %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}% 4955 \setbox0=\vbox to\dimen@{\unvbox1}% 4956 \setbox2=\vbox to\dimen@{\unvbox3}% 4957 % 4958 \pagesofar 4959} 4960\catcode`\@ = \other 4961 4962 4963\message{sectioning,} 4964% Chapters, sections, etc. 4965 4966% \unnumberedno is an oxymoron, of course. But we count the unnumbered 4967% sections so that we can refer to them unambiguously in the pdf 4968% outlines by their "section number". We avoid collisions with chapter 4969% numbers by starting them at 10000. (If a document ever has 10000 4970% chapters, we're in trouble anyway, I'm sure.) 4971\newcount\unnumberedno \unnumberedno = 10000 4972\newcount\chapno 4973\newcount\secno \secno=0 4974\newcount\subsecno \subsecno=0 4975\newcount\subsubsecno \subsubsecno=0 4976 4977% This counter is funny since it counts through charcodes of letters A, B, ... 4978\newcount\appendixno \appendixno = `\@ 4979% 4980% \def\appendixletter{\char\the\appendixno} 4981% We do the following ugly conditional instead of the above simple 4982% construct for the sake of pdftex, which needs the actual 4983% letter in the expansion, not just typeset. 4984% 4985\def\appendixletter{% 4986 \ifnum\appendixno=`A A% 4987 \else\ifnum\appendixno=`B B% 4988 \else\ifnum\appendixno=`C C% 4989 \else\ifnum\appendixno=`D D% 4990 \else\ifnum\appendixno=`E E% 4991 \else\ifnum\appendixno=`F F% 4992 \else\ifnum\appendixno=`G G% 4993 \else\ifnum\appendixno=`H H% 4994 \else\ifnum\appendixno=`I I% 4995 \else\ifnum\appendixno=`J J% 4996 \else\ifnum\appendixno=`K K% 4997 \else\ifnum\appendixno=`L L% 4998 \else\ifnum\appendixno=`M M% 4999 \else\ifnum\appendixno=`N N% 5000 \else\ifnum\appendixno=`O O% 5001 \else\ifnum\appendixno=`P P% 5002 \else\ifnum\appendixno=`Q Q% 5003 \else\ifnum\appendixno=`R R% 5004 \else\ifnum\appendixno=`S S% 5005 \else\ifnum\appendixno=`T T% 5006 \else\ifnum\appendixno=`U U% 5007 \else\ifnum\appendixno=`V V% 5008 \else\ifnum\appendixno=`W W% 5009 \else\ifnum\appendixno=`X X% 5010 \else\ifnum\appendixno=`Y Y% 5011 \else\ifnum\appendixno=`Z Z% 5012 % The \the is necessary, despite appearances, because \appendixletter is 5013 % expanded while writing the .toc file. \char\appendixno is not 5014 % expandable, thus it is written literally, thus all appendixes come out 5015 % with the same letter (or @) in the toc without it. 5016 \else\char\the\appendixno 5017 \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi 5018 \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} 5019 5020% Each @chapter defines these (using marks) as the number+name, number 5021% and name of the chapter. Page headings and footings can use 5022% these. @section does likewise. 5023\def\thischapter{} 5024\def\thischapternum{} 5025\def\thischaptername{} 5026\def\thissection{} 5027\def\thissectionnum{} 5028\def\thissectionname{} 5029 5030\newcount\absseclevel % used to calculate proper heading level 5031\newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count 5032 5033% @raisesections: treat @section as chapter, @subsection as section, etc. 5034\def\raisesections{\global\advance\secbase by -1} 5035\let\up=\raisesections % original BFox name 5036 5037% @lowersections: treat @chapter as section, @section as subsection, etc. 5038\def\lowersections{\global\advance\secbase by 1} 5039\let\down=\lowersections % original BFox name 5040 5041% we only have subsub. 5042\chardef\maxseclevel = 3 5043% 5044% A numbered section within an unnumbered changes to unnumbered too. 5045% To achive this, remember the "biggest" unnum. sec. we are currently in: 5046\chardef\unmlevel = \maxseclevel 5047% 5048% Trace whether the current chapter is an appendix or not: 5049% \chapheadtype is "N" or "A", unnumbered chapters are ignored. 5050\def\chapheadtype{N} 5051 5052% Choose a heading macro 5053% #1 is heading type 5054% #2 is heading level 5055% #3 is text for heading 5056\def\genhead#1#2#3{% 5057 % Compute the abs. sec. level: 5058 \absseclevel=#2 5059 \advance\absseclevel by \secbase 5060 % Make sure \absseclevel doesn't fall outside the range: 5061 \ifnum \absseclevel < 0 5062 \absseclevel = 0 5063 \else 5064 \ifnum \absseclevel > 3 5065 \absseclevel = 3 5066 \fi 5067 \fi 5068 % The heading type: 5069 \def\headtype{#1}% 5070 \if \headtype U% 5071 \ifnum \absseclevel < \unmlevel 5072 \chardef\unmlevel = \absseclevel 5073 \fi 5074 \else 5075 % Check for appendix sections: 5076 \ifnum \absseclevel = 0 5077 \edef\chapheadtype{\headtype}% 5078 \else 5079 \if \headtype A\if \chapheadtype N% 5080 \errmessage{@appendix... within a non-appendix chapter}% 5081 \fi\fi 5082 \fi 5083 % Check for numbered within unnumbered: 5084 \ifnum \absseclevel > \unmlevel 5085 \def\headtype{U}% 5086 \else 5087 \chardef\unmlevel = 3 5088 \fi 5089 \fi 5090 % Now print the heading: 5091 \if \headtype U% 5092 \ifcase\absseclevel 5093 \unnumberedzzz{#3}% 5094 \or \unnumberedseczzz{#3}% 5095 \or \unnumberedsubseczzz{#3}% 5096 \or \unnumberedsubsubseczzz{#3}% 5097 \fi 5098 \else 5099 \if \headtype A% 5100 \ifcase\absseclevel 5101 \appendixzzz{#3}% 5102 \or \appendixsectionzzz{#3}% 5103 \or \appendixsubseczzz{#3}% 5104 \or \appendixsubsubseczzz{#3}% 5105 \fi 5106 \else 5107 \ifcase\absseclevel 5108 \chapterzzz{#3}% 5109 \or \seczzz{#3}% 5110 \or \numberedsubseczzz{#3}% 5111 \or \numberedsubsubseczzz{#3}% 5112 \fi 5113 \fi 5114 \fi 5115 \suppressfirstparagraphindent 5116} 5117 5118% an interface: 5119\def\numhead{\genhead N} 5120\def\apphead{\genhead A} 5121\def\unnmhead{\genhead U} 5122 5123% @chapter, @appendix, @unnumbered. Increment top-level counter, reset 5124% all lower-level sectioning counters to zero. 5125% 5126% Also set \chaplevelprefix, which we prepend to @float sequence numbers 5127% (e.g., figures), q.v. By default (before any chapter), that is empty. 5128\let\chaplevelprefix = \empty 5129% 5130\outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz 5131\def\chapterzzz#1{% 5132 % section resetting is \global in case the chapter is in a group, such 5133 % as an @include file. 5134 \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 5135 \global\advance\chapno by 1 5136 % 5137 % Used for \float. 5138 \gdef\chaplevelprefix{\the\chapno.}% 5139 \resetallfloatnos 5140 % 5141 % \putwordChapter can contain complex things in translations. 5142 \toks0=\expandafter{\putwordChapter}% 5143 \message{\the\toks0 \space \the\chapno}% 5144 % 5145 % Write the actual heading. 5146 \chapmacro{#1}{Ynumbered}{\the\chapno}% 5147 % 5148 % So @section and the like are numbered underneath this chapter. 5149 \global\let\section = \numberedsec 5150 \global\let\subsection = \numberedsubsec 5151 \global\let\subsubsection = \numberedsubsubsec 5152} 5153 5154\outer\parseargdef\appendix{\apphead0{#1}} % normally calls appendixzzz 5155% 5156\def\appendixzzz#1{% 5157 \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 5158 \global\advance\appendixno by 1 5159 \gdef\chaplevelprefix{\appendixletter.}% 5160 \resetallfloatnos 5161 % 5162 % \putwordAppendix can contain complex things in translations. 5163 \toks0=\expandafter{\putwordAppendix}% 5164 \message{\the\toks0 \space \appendixletter}% 5165 % 5166 \chapmacro{#1}{Yappendix}{\appendixletter}% 5167 % 5168 \global\let\section = \appendixsec 5169 \global\let\subsection = \appendixsubsec 5170 \global\let\subsubsection = \appendixsubsubsec 5171} 5172 5173\outer\parseargdef\unnumbered{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz 5174\def\unnumberedzzz#1{% 5175 \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 5176 \global\advance\unnumberedno by 1 5177 % 5178 % Since an unnumbered has no number, no prefix for figures. 5179 \global\let\chaplevelprefix = \empty 5180 \resetallfloatnos 5181 % 5182 % This used to be simply \message{#1}, but TeX fully expands the 5183 % argument to \message. Therefore, if #1 contained @-commands, TeX 5184 % expanded them. For example, in `@unnumbered The @cite{Book}', TeX 5185 % expanded @cite (which turns out to cause errors because \cite is meant 5186 % to be executed, not expanded). 5187 % 5188 % Anyway, we don't want the fully-expanded definition of @cite to appear 5189 % as a result of the \message, we just want `@cite' itself. We use 5190 % \the<toks register> to achieve this: TeX expands \the<toks> only once, 5191 % simply yielding the contents of <toks register>. (We also do this for 5192 % the toc entries.) 5193 \toks0 = {#1}% 5194 \message{(\the\toks0)}% 5195 % 5196 \chapmacro{#1}{Ynothing}{\the\unnumberedno}% 5197 % 5198 \global\let\section = \unnumberedsec 5199 \global\let\subsection = \unnumberedsubsec 5200 \global\let\subsubsection = \unnumberedsubsubsec 5201} 5202 5203% @centerchap is like @unnumbered, but the heading is centered. 5204\outer\parseargdef\centerchap{% 5205 % Well, we could do the following in a group, but that would break 5206 % an assumption that \chapmacro is called at the outermost level. 5207 % Thus we are safer this way: --kasal, 24feb04 5208 \let\centerparametersmaybe = \centerparameters 5209 \unnmhead0{#1}% 5210 \let\centerparametersmaybe = \relax 5211} 5212 5213% @top is like @unnumbered. 5214\let\top\unnumbered 5215 5216% Sections. 5217\outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz 5218\def\seczzz#1{% 5219 \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 5220 \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}% 5221} 5222 5223\outer\parseargdef\appendixsection{\apphead1{#1}} % normally calls appendixsectionzzz 5224\def\appendixsectionzzz#1{% 5225 \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 5226 \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}% 5227} 5228\let\appendixsec\appendixsection 5229 5230\outer\parseargdef\unnumberedsec{\unnmhead1{#1}} % normally calls unnumberedseczzz 5231\def\unnumberedseczzz#1{% 5232 \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 5233 \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}% 5234} 5235 5236% Subsections. 5237\outer\parseargdef\numberedsubsec{\numhead2{#1}} % normally calls numberedsubseczzz 5238\def\numberedsubseczzz#1{% 5239 \global\subsubsecno=0 \global\advance\subsecno by 1 5240 \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}% 5241} 5242 5243\outer\parseargdef\appendixsubsec{\apphead2{#1}} % normally calls appendixsubseczzz 5244\def\appendixsubseczzz#1{% 5245 \global\subsubsecno=0 \global\advance\subsecno by 1 5246 \sectionheading{#1}{subsec}{Yappendix}% 5247 {\appendixletter.\the\secno.\the\subsecno}% 5248} 5249 5250\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} %normally calls unnumberedsubseczzz 5251\def\unnumberedsubseczzz#1{% 5252 \global\subsubsecno=0 \global\advance\subsecno by 1 5253 \sectionheading{#1}{subsec}{Ynothing}% 5254 {\the\unnumberedno.\the\secno.\the\subsecno}% 5255} 5256 5257% Subsubsections. 5258\outer\parseargdef\numberedsubsubsec{\numhead3{#1}} % normally numberedsubsubseczzz 5259\def\numberedsubsubseczzz#1{% 5260 \global\advance\subsubsecno by 1 5261 \sectionheading{#1}{subsubsec}{Ynumbered}% 5262 {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}% 5263} 5264 5265\outer\parseargdef\appendixsubsubsec{\apphead3{#1}} % normally appendixsubsubseczzz 5266\def\appendixsubsubseczzz#1{% 5267 \global\advance\subsubsecno by 1 5268 \sectionheading{#1}{subsubsec}{Yappendix}% 5269 {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}% 5270} 5271 5272\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} %normally unnumberedsubsubseczzz 5273\def\unnumberedsubsubseczzz#1{% 5274 \global\advance\subsubsecno by 1 5275 \sectionheading{#1}{subsubsec}{Ynothing}% 5276 {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}% 5277} 5278 5279% These macros control what the section commands do, according 5280% to what kind of chapter we are in (ordinary, appendix, or unnumbered). 5281% Define them by default for a numbered chapter. 5282\let\section = \numberedsec 5283\let\subsection = \numberedsubsec 5284\let\subsubsection = \numberedsubsubsec 5285 5286% Define @majorheading, @heading and @subheading 5287 5288% NOTE on use of \vbox for chapter headings, section headings, and such: 5289% 1) We use \vbox rather than the earlier \line to permit 5290% overlong headings to fold. 5291% 2) \hyphenpenalty is set to 10000 because hyphenation in a 5292% heading is obnoxious; this forbids it. 5293% 3) Likewise, headings look best if no \parindent is used, and 5294% if justification is not attempted. Hence \raggedright. 5295 5296\def\majorheading{% 5297 {\advance\chapheadingskip by 10pt \chapbreak }% 5298 \parsearg\chapheadingzzz 5299} 5300 5301\def\chapheading{\chapbreak \parsearg\chapheadingzzz} 5302\def\chapheadingzzz#1{% 5303 {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 5304 \parindent=0pt\ptexraggedright 5305 \rmisbold #1\hfill}}% 5306 \bigskip \par\penalty 200\relax 5307 \suppressfirstparagraphindent 5308} 5309 5310% @heading, @subheading, @subsubheading. 5311\parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{} 5312 \suppressfirstparagraphindent} 5313\parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{} 5314 \suppressfirstparagraphindent} 5315\parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{} 5316 \suppressfirstparagraphindent} 5317 5318% These macros generate a chapter, section, etc. heading only 5319% (including whitespace, linebreaking, etc. around it), 5320% given all the information in convenient, parsed form. 5321 5322%%% Args are the skip and penalty (usually negative) 5323\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} 5324 5325%%% Define plain chapter starts, and page on/off switching for it 5326% Parameter controlling skip before chapter headings (if needed) 5327 5328\newskip\chapheadingskip 5329 5330\def\chapbreak{\dobreak \chapheadingskip {-4000}} 5331\def\chappager{\par\vfill\supereject} 5332% Because \domark is called before \chapoddpage, the filler page will 5333% get the headings for the next chapter, which is wrong. But we don't 5334% care -- we just disable all headings on the filler page. 5335\def\chapoddpage{% 5336 \chappager 5337 \ifodd\pageno \else 5338 \begingroup 5339 \evenheadline={\hfil}\evenfootline={\hfil}% 5340 \oddheadline={\hfil}\oddfootline={\hfil}% 5341 \hbox to 0pt{}% 5342 \chappager 5343 \endgroup 5344 \fi 5345} 5346 5347\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} 5348 5349\def\CHAPPAGoff{% 5350\global\let\contentsalignmacro = \chappager 5351\global\let\pchapsepmacro=\chapbreak 5352\global\let\pagealignmacro=\chappager} 5353 5354\def\CHAPPAGon{% 5355\global\let\contentsalignmacro = \chappager 5356\global\let\pchapsepmacro=\chappager 5357\global\let\pagealignmacro=\chappager 5358\global\def\HEADINGSon{\HEADINGSsingle}} 5359 5360\def\CHAPPAGodd{% 5361\global\let\contentsalignmacro = \chapoddpage 5362\global\let\pchapsepmacro=\chapoddpage 5363\global\let\pagealignmacro=\chapoddpage 5364\global\def\HEADINGSon{\HEADINGSdouble}} 5365 5366\CHAPPAGon 5367 5368% Chapter opening. 5369% 5370% #1 is the text, #2 is the section type (Ynumbered, Ynothing, 5371% Yappendix, Yomitfromtoc), #3 the chapter number. 5372% 5373% To test against our argument. 5374\def\Ynothingkeyword{Ynothing} 5375\def\Yomitfromtockeyword{Yomitfromtoc} 5376\def\Yappendixkeyword{Yappendix} 5377% 5378\def\chapmacro#1#2#3{% 5379 % Insert the first mark before the heading break (see notes for \domark). 5380 \let\prevchapterdefs=\lastchapterdefs 5381 \let\prevsectiondefs=\lastsectiondefs 5382 \gdef\lastsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}% 5383 \gdef\thissection{}}% 5384 % 5385 \def\temptype{#2}% 5386 \ifx\temptype\Ynothingkeyword 5387 \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% 5388 \gdef\thischapter{\thischaptername}}% 5389 \else\ifx\temptype\Yomitfromtockeyword 5390 \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% 5391 \gdef\thischapter{}}% 5392 \else\ifx\temptype\Yappendixkeyword 5393 \toks0={#1}% 5394 \xdef\lastchapterdefs{% 5395 \gdef\noexpand\thischaptername{\the\toks0}% 5396 \gdef\noexpand\thischapternum{\appendixletter}% 5397 % \noexpand\putwordAppendix avoids expanding indigestible 5398 % commands in some of the translations. 5399 \gdef\noexpand\thischapter{\noexpand\putwordAppendix{} 5400 \noexpand\thischapternum: 5401 \noexpand\thischaptername}% 5402 }% 5403 \else 5404 \toks0={#1}% 5405 \xdef\lastchapterdefs{% 5406 \gdef\noexpand\thischaptername{\the\toks0}% 5407 \gdef\noexpand\thischapternum{\the\chapno}% 5408 % \noexpand\putwordChapter avoids expanding indigestible 5409 % commands in some of the translations. 5410 \gdef\noexpand\thischapter{\noexpand\putwordChapter{} 5411 \noexpand\thischapternum: 5412 \noexpand\thischaptername}% 5413 }% 5414 \fi\fi\fi 5415 % 5416 % Output the mark. Pass it through \safewhatsit, to take care of 5417 % the preceding space. 5418 \safewhatsit\domark 5419 % 5420 % Insert the chapter heading break. 5421 \pchapsepmacro 5422 % 5423 % Now the second mark, after the heading break. No break points 5424 % between here and the heading. 5425 \let\prevchapterdefs=\lastchapterdefs 5426 \let\prevsectiondefs=\lastsectiondefs 5427 \domark 5428 % 5429 {% 5430 \chapfonts \rmisbold 5431 % 5432 % Have to define \lastsection before calling \donoderef, because the 5433 % xref code eventually uses it. On the other hand, it has to be called 5434 % after \pchapsepmacro, or the headline will change too soon. 5435 \gdef\lastsection{#1}% 5436 % 5437 % Only insert the separating space if we have a chapter/appendix 5438 % number, and don't print the unnumbered ``number''. 5439 \ifx\temptype\Ynothingkeyword 5440 \setbox0 = \hbox{}% 5441 \def\toctype{unnchap}% 5442 \else\ifx\temptype\Yomitfromtockeyword 5443 \setbox0 = \hbox{}% contents like unnumbered, but no toc entry 5444 \def\toctype{omit}% 5445 \else\ifx\temptype\Yappendixkeyword 5446 \setbox0 = \hbox{\putwordAppendix{} #3\enspace}% 5447 \def\toctype{app}% 5448 \else 5449 \setbox0 = \hbox{#3\enspace}% 5450 \def\toctype{numchap}% 5451 \fi\fi\fi 5452 % 5453 % Write the toc entry for this chapter. Must come before the 5454 % \donoderef, because we include the current node name in the toc 5455 % entry, and \donoderef resets it to empty. 5456 \writetocentry{\toctype}{#1}{#3}% 5457 % 5458 % For pdftex, we have to write out the node definition (aka, make 5459 % the pdfdest) after any page break, but before the actual text has 5460 % been typeset. If the destination for the pdf outline is after the 5461 % text, then jumping from the outline may wind up with the text not 5462 % being visible, for instance under high magnification. 5463 \donoderef{#2}% 5464 % 5465 % Typeset the actual heading. 5466 \nobreak % Avoid page breaks at the interline glue. 5467 \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright 5468 \hangindent=\wd0 \centerparametersmaybe 5469 \unhbox0 #1\par}% 5470 }% 5471 \nobreak\bigskip % no page break after a chapter title 5472 \nobreak 5473} 5474 5475% @centerchap -- centered and unnumbered. 5476\let\centerparametersmaybe = \relax 5477\def\centerparameters{% 5478 \advance\rightskip by 3\rightskip 5479 \leftskip = \rightskip 5480 \parfillskip = 0pt 5481} 5482 5483 5484% I don't think this chapter style is supported any more, so I'm not 5485% updating it with the new noderef stuff. We'll see. --karl, 11aug03. 5486% 5487\def\setchapterstyle #1 {\csname CHAPF#1\endcsname} 5488% 5489\def\unnchfopen #1{% 5490\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 5491 \parindent=0pt\ptexraggedright 5492 \rmisbold #1\hfill}}\bigskip \par\nobreak 5493} 5494\def\chfopen #1#2{\chapoddpage {\chapfonts 5495\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% 5496\par\penalty 5000 % 5497} 5498\def\centerchfopen #1{% 5499\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 5500 \parindent=0pt 5501 \hfill {\rmisbold #1}\hfill}}\bigskip \par\nobreak 5502} 5503\def\CHAPFopen{% 5504 \global\let\chapmacro=\chfopen 5505 \global\let\centerchapmacro=\centerchfopen} 5506 5507 5508% Section titles. These macros combine the section number parts and 5509% call the generic \sectionheading to do the printing. 5510% 5511\newskip\secheadingskip 5512\def\secheadingbreak{\dobreak \secheadingskip{-1000}} 5513 5514% Subsection titles. 5515\newskip\subsecheadingskip 5516\def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}} 5517 5518% Subsubsection titles. 5519\def\subsubsecheadingskip{\subsecheadingskip} 5520\def\subsubsecheadingbreak{\subsecheadingbreak} 5521 5522 5523% Print any size, any type, section title. 5524% 5525% #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is 5526% the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the 5527% section number. 5528% 5529\def\seckeyword{sec} 5530% 5531\def\sectionheading#1#2#3#4{% 5532 {% 5533 % Switch to the right set of fonts. 5534 \csname #2fonts\endcsname \rmisbold 5535 % 5536 \def\sectionlevel{#2}% 5537 \def\temptype{#3}% 5538 % 5539 % Insert first mark before the heading break (see notes for \domark). 5540 \let\prevsectiondefs=\lastsectiondefs 5541 \ifx\temptype\Ynothingkeyword 5542 \ifx\sectionlevel\seckeyword 5543 \gdef\lastsectiondefs{\gdef\thissectionname{#1}\gdef\thissectionnum{}% 5544 \gdef\thissection{\thissectionname}}% 5545 \fi 5546 \else\ifx\temptype\Yomitfromtockeyword 5547 % Don't redefine \thissection. 5548 \else\ifx\temptype\Yappendixkeyword 5549 \ifx\sectionlevel\seckeyword 5550 \toks0={#1}% 5551 \xdef\lastsectiondefs{% 5552 \gdef\noexpand\thissectionname{\the\toks0}% 5553 \gdef\noexpand\thissectionnum{#4}% 5554 % \noexpand\putwordSection avoids expanding indigestible 5555 % commands in some of the translations. 5556 \gdef\noexpand\thissection{\noexpand\putwordSection{} 5557 \noexpand\thissectionnum: 5558 \noexpand\thissectionname}% 5559 }% 5560 \fi 5561 \else 5562 \ifx\sectionlevel\seckeyword 5563 \toks0={#1}% 5564 \xdef\lastsectiondefs{% 5565 \gdef\noexpand\thissectionname{\the\toks0}% 5566 \gdef\noexpand\thissectionnum{#4}% 5567 % \noexpand\putwordSection avoids expanding indigestible 5568 % commands in some of the translations. 5569 \gdef\noexpand\thissection{\noexpand\putwordSection{} 5570 \noexpand\thissectionnum: 5571 \noexpand\thissectionname}% 5572 }% 5573 \fi 5574 \fi\fi\fi 5575 % 5576 % Go into vertical mode. Usually we'll already be there, but we 5577 % don't want the following whatsit to end up in a preceding paragraph 5578 % if the document didn't happen to have a blank line. 5579 \par 5580 % 5581 % Output the mark. Pass it through \safewhatsit, to take care of 5582 % the preceding space. 5583 \safewhatsit\domark 5584 % 5585 % Insert space above the heading. 5586 \csname #2headingbreak\endcsname 5587 % 5588 % Now the second mark, after the heading break. No break points 5589 % between here and the heading. 5590 \let\prevsectiondefs=\lastsectiondefs 5591 \domark 5592 % 5593 % Only insert the space after the number if we have a section number. 5594 \ifx\temptype\Ynothingkeyword 5595 \setbox0 = \hbox{}% 5596 \def\toctype{unn}% 5597 \gdef\lastsection{#1}% 5598 \else\ifx\temptype\Yomitfromtockeyword 5599 % for @headings -- no section number, don't include in toc, 5600 % and don't redefine \lastsection. 5601 \setbox0 = \hbox{}% 5602 \def\toctype{omit}% 5603 \let\sectionlevel=\empty 5604 \else\ifx\temptype\Yappendixkeyword 5605 \setbox0 = \hbox{#4\enspace}% 5606 \def\toctype{app}% 5607 \gdef\lastsection{#1}% 5608 \else 5609 \setbox0 = \hbox{#4\enspace}% 5610 \def\toctype{num}% 5611 \gdef\lastsection{#1}% 5612 \fi\fi\fi 5613 % 5614 % Write the toc entry (before \donoderef). See comments in \chapmacro. 5615 \writetocentry{\toctype\sectionlevel}{#1}{#4}% 5616 % 5617 % Write the node reference (= pdf destination for pdftex). 5618 % Again, see comments in \chapmacro. 5619 \donoderef{#3}% 5620 % 5621 % Interline glue will be inserted when the vbox is completed. 5622 % That glue will be a valid breakpoint for the page, since it'll be 5623 % preceded by a whatsit (usually from the \donoderef, or from the 5624 % \writetocentry if there was no node). We don't want to allow that 5625 % break, since then the whatsits could end up on page n while the 5626 % section is on page n+1, thus toc/etc. are wrong. Debian bug 276000. 5627 \nobreak 5628 % 5629 % Output the actual section heading. 5630 \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright 5631 \hangindent=\wd0 % zero if no section number 5632 \unhbox0 #1}% 5633 }% 5634 % Add extra space after the heading -- half of whatever came above it. 5635 % Don't allow stretch, though. 5636 \kern .5 \csname #2headingskip\endcsname 5637 % 5638 % Do not let the kern be a potential breakpoint, as it would be if it 5639 % was followed by glue. 5640 \nobreak 5641 % 5642 % We'll almost certainly start a paragraph next, so don't let that 5643 % glue accumulate. (Not a breakpoint because it's preceded by a 5644 % discardable item.) 5645 \vskip-\parskip 5646 % 5647 % This is purely so the last item on the list is a known \penalty > 5648 % 10000. This is so \startdefun can avoid allowing breakpoints after 5649 % section headings. Otherwise, it would insert a valid breakpoint between: 5650 % 5651 % @section sec-whatever 5652 % @deffn def-whatever 5653 \penalty 10001 5654} 5655 5656 5657\message{toc,} 5658% Table of contents. 5659\newwrite\tocfile 5660 5661% Write an entry to the toc file, opening it if necessary. 5662% Called from @chapter, etc. 5663% 5664% Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno} 5665% We append the current node name (if any) and page number as additional 5666% arguments for the \{chap,sec,...}entry macros which will eventually 5667% read this. The node name is used in the pdf outlines as the 5668% destination to jump to. 5669% 5670% We open the .toc file for writing here instead of at @setfilename (or 5671% any other fixed time) so that @contents can be anywhere in the document. 5672% But if #1 is `omit', then we don't do anything. This is used for the 5673% table of contents chapter openings themselves. 5674% 5675\newif\iftocfileopened 5676\def\omitkeyword{omit}% 5677% 5678\def\writetocentry#1#2#3{% 5679 \edef\writetoctype{#1}% 5680 \ifx\writetoctype\omitkeyword \else 5681 \iftocfileopened\else 5682 \immediate\openout\tocfile = \jobname.toc 5683 \global\tocfileopenedtrue 5684 \fi 5685 % 5686 \iflinks 5687 {\atdummies 5688 \edef\temp{% 5689 \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}% 5690 \temp 5691 }% 5692 \fi 5693 \fi 5694 % 5695 % Tell \shipout to create a pdf destination on each page, if we're 5696 % writing pdf. These are used in the table of contents. We can't 5697 % just write one on every page because the title pages are numbered 5698 % 1 and 2 (the page numbers aren't printed), and so are the first 5699 % two pages of the document. Thus, we'd have two destinations named 5700 % `1', and two named `2'. 5701 \ifpdf \global\pdfmakepagedesttrue \fi 5702} 5703 5704 5705% These characters do not print properly in the Computer Modern roman 5706% fonts, so we must take special care. This is more or less redundant 5707% with the Texinfo input format setup at the end of this file. 5708% 5709\def\activecatcodes{% 5710 \catcode`\"=\active 5711 \catcode`\$=\active 5712 \catcode`\<=\active 5713 \catcode`\>=\active 5714 \catcode`\\=\active 5715 \catcode`\^=\active 5716 \catcode`\_=\active 5717 \catcode`\|=\active 5718 \catcode`\~=\active 5719} 5720 5721 5722% Read the toc file, which is essentially Texinfo input. 5723\def\readtocfile{% 5724 \setupdatafile 5725 \activecatcodes 5726 \input \tocreadfilename 5727} 5728 5729\newskip\contentsrightmargin \contentsrightmargin=1in 5730\newcount\savepageno 5731\newcount\lastnegativepageno \lastnegativepageno = -1 5732 5733% Prepare to read what we've written to \tocfile. 5734% 5735\def\startcontents#1{% 5736 % If @setchapternewpage on, and @headings double, the contents should 5737 % start on an odd page, unlike chapters. Thus, we maintain 5738 % \contentsalignmacro in parallel with \pagealignmacro. 5739 % From: Torbjorn Granlund <tege@matematik.su.se> 5740 \contentsalignmacro 5741 \immediate\closeout\tocfile 5742 % 5743 % Don't need to put `Contents' or `Short Contents' in the headline. 5744 % It is abundantly clear what they are. 5745 \chapmacro{#1}{Yomitfromtoc}{}% 5746 % 5747 \savepageno = \pageno 5748 \begingroup % Set up to handle contents files properly. 5749 \raggedbottom % Worry more about breakpoints than the bottom. 5750 \advance\hsize by -\contentsrightmargin % Don't use the full line length. 5751 % 5752 % Roman numerals for page numbers. 5753 \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi 5754} 5755 5756% redefined for the two-volume lispref. We always output on 5757% \jobname.toc even if this is redefined. 5758% 5759\def\tocreadfilename{\jobname.toc} 5760 5761% Normal (long) toc. 5762% 5763\def\contents{% 5764 \startcontents{\putwordTOC}% 5765 \openin 1 \tocreadfilename\space 5766 \ifeof 1 \else 5767 \readtocfile 5768 \fi 5769 \vfill \eject 5770 \contentsalignmacro % in case @setchapternewpage odd is in effect 5771 \ifeof 1 \else 5772 \pdfmakeoutlines 5773 \fi 5774 \closein 1 5775 \endgroup 5776 \lastnegativepageno = \pageno 5777 \global\pageno = \savepageno 5778} 5779 5780% And just the chapters. 5781\def\summarycontents{% 5782 \startcontents{\putwordShortTOC}% 5783 % 5784 \let\numchapentry = \shortchapentry 5785 \let\appentry = \shortchapentry 5786 \let\unnchapentry = \shortunnchapentry 5787 % We want a true roman here for the page numbers. 5788 \secfonts 5789 \let\rm=\shortcontrm \let\bf=\shortcontbf 5790 \let\sl=\shortcontsl \let\tt=\shortconttt 5791 \rm 5792 \hyphenpenalty = 10000 5793 \advance\baselineskip by 1pt % Open it up a little. 5794 \def\numsecentry##1##2##3##4{} 5795 \let\appsecentry = \numsecentry 5796 \let\unnsecentry = \numsecentry 5797 \let\numsubsecentry = \numsecentry 5798 \let\appsubsecentry = \numsecentry 5799 \let\unnsubsecentry = \numsecentry 5800 \let\numsubsubsecentry = \numsecentry 5801 \let\appsubsubsecentry = \numsecentry 5802 \let\unnsubsubsecentry = \numsecentry 5803 \openin 1 \tocreadfilename\space 5804 \ifeof 1 \else 5805 \readtocfile 5806 \fi 5807 \closein 1 5808 \vfill \eject 5809 \contentsalignmacro % in case @setchapternewpage odd is in effect 5810 \endgroup 5811 \lastnegativepageno = \pageno 5812 \global\pageno = \savepageno 5813} 5814\let\shortcontents = \summarycontents 5815 5816% Typeset the label for a chapter or appendix for the short contents. 5817% The arg is, e.g., `A' for an appendix, or `3' for a chapter. 5818% 5819\def\shortchaplabel#1{% 5820 % This space should be enough, since a single number is .5em, and the 5821 % widest letter (M) is 1em, at least in the Computer Modern fonts. 5822 % But use \hss just in case. 5823 % (This space doesn't include the extra space that gets added after 5824 % the label; that gets put in by \shortchapentry above.) 5825 % 5826 % We'd like to right-justify chapter numbers, but that looks strange 5827 % with appendix letters. And right-justifying numbers and 5828 % left-justifying letters looks strange when there is less than 10 5829 % chapters. Have to read the whole toc once to know how many chapters 5830 % there are before deciding ... 5831 \hbox to 1em{#1\hss}% 5832} 5833 5834% These macros generate individual entries in the table of contents. 5835% The first argument is the chapter or section name. 5836% The last argument is the page number. 5837% The arguments in between are the chapter number, section number, ... 5838 5839% Chapters, in the main contents. 5840\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}} 5841% 5842% Chapters, in the short toc. 5843% See comments in \dochapentry re vbox and related settings. 5844\def\shortchapentry#1#2#3#4{% 5845 \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}% 5846} 5847 5848% Appendices, in the main contents. 5849% Need the word Appendix, and a fixed-size box. 5850% 5851\def\appendixbox#1{% 5852 % We use M since it's probably the widest letter. 5853 \setbox0 = \hbox{\putwordAppendix{} M}% 5854 \hbox to \wd0{\putwordAppendix{} #1\hss}} 5855% 5856\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}} 5857 5858% Unnumbered chapters. 5859\def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}} 5860\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}} 5861 5862% Sections. 5863\def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}} 5864\let\appsecentry=\numsecentry 5865\def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}} 5866 5867% Subsections. 5868\def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}} 5869\let\appsubsecentry=\numsubsecentry 5870\def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}} 5871 5872% And subsubsections. 5873\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}} 5874\let\appsubsubsecentry=\numsubsubsecentry 5875\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}} 5876 5877% This parameter controls the indentation of the various levels. 5878% Same as \defaultparindent. 5879\newdimen\tocindent \tocindent = 15pt 5880 5881% Now for the actual typesetting. In all these, #1 is the text and #2 is the 5882% page number. 5883% 5884% If the toc has to be broken over pages, we want it to be at chapters 5885% if at all possible; hence the \penalty. 5886\def\dochapentry#1#2{% 5887 \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip 5888 \begingroup 5889 \chapentryfonts 5890 \tocentry{#1}{\dopageno\bgroup#2\egroup}% 5891 \endgroup 5892 \nobreak\vskip .25\baselineskip plus.1\baselineskip 5893} 5894 5895\def\dosecentry#1#2{\begingroup 5896 \secentryfonts \leftskip=\tocindent 5897 \tocentry{#1}{\dopageno\bgroup#2\egroup}% 5898\endgroup} 5899 5900\def\dosubsecentry#1#2{\begingroup 5901 \subsecentryfonts \leftskip=2\tocindent 5902 \tocentry{#1}{\dopageno\bgroup#2\egroup}% 5903\endgroup} 5904 5905\def\dosubsubsecentry#1#2{\begingroup 5906 \subsubsecentryfonts \leftskip=3\tocindent 5907 \tocentry{#1}{\dopageno\bgroup#2\egroup}% 5908\endgroup} 5909 5910% We use the same \entry macro as for the index entries. 5911\let\tocentry = \entry 5912 5913% Space between chapter (or whatever) number and the title. 5914\def\labelspace{\hskip1em \relax} 5915 5916\def\dopageno#1{{\rm #1}} 5917\def\doshortpageno#1{{\rm #1}} 5918 5919\def\chapentryfonts{\secfonts \rm} 5920\def\secentryfonts{\textfonts} 5921\def\subsecentryfonts{\textfonts} 5922\def\subsubsecentryfonts{\textfonts} 5923 5924 5925\message{environments,} 5926% @foo ... @end foo. 5927 5928% @tex ... @end tex escapes into raw Tex temporarily. 5929% One exception: @ is still an escape character, so that @end tex works. 5930% But \@ or @@ will get a plain tex @ character. 5931 5932\envdef\tex{% 5933 \setupmarkupstyle{tex}% 5934 \catcode `\\=0 \catcode `\{=1 \catcode `\}=2 5935 \catcode `\$=3 \catcode `\&=4 \catcode `\#=6 5936 \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie 5937 \catcode `\%=14 5938 \catcode `\+=\other 5939 \catcode `\"=\other 5940 \catcode `\|=\other 5941 \catcode `\<=\other 5942 \catcode `\>=\other 5943 \catcode`\`=\other 5944 \catcode`\'=\other 5945 \escapechar=`\\ 5946 % 5947 \let\b=\ptexb 5948 \let\bullet=\ptexbullet 5949 \let\c=\ptexc 5950 \let\,=\ptexcomma 5951 \let\.=\ptexdot 5952 \let\dots=\ptexdots 5953 \let\equiv=\ptexequiv 5954 \let\!=\ptexexclam 5955 \let\i=\ptexi 5956 \let\indent=\ptexindent 5957 \let\noindent=\ptexnoindent 5958 \let\{=\ptexlbrace 5959 \let\+=\tabalign 5960 \let\}=\ptexrbrace 5961 \let\/=\ptexslash 5962 \let\*=\ptexstar 5963 \let\t=\ptext 5964 \expandafter \let\csname top\endcsname=\ptextop % outer 5965 \let\frenchspacing=\plainfrenchspacing 5966 % 5967 \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% 5968 \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}% 5969 \def\@{@}% 5970} 5971% There is no need to define \Etex. 5972 5973% Define @lisp ... @end lisp. 5974% @lisp environment forms a group so it can rebind things, 5975% including the definition of @end lisp (which normally is erroneous). 5976 5977% Amount to narrow the margins by for @lisp. 5978\newskip\lispnarrowing \lispnarrowing=0.4in 5979 5980% This is the definition that ^^M gets inside @lisp, @example, and other 5981% such environments. \null is better than a space, since it doesn't 5982% have any width. 5983\def\lisppar{\null\endgraf} 5984 5985% This space is always present above and below environments. 5986\newskip\envskipamount \envskipamount = 0pt 5987 5988% Make spacing and below environment symmetrical. We use \parskip here 5989% to help in doing that, since in @example-like environments \parskip 5990% is reset to zero; thus the \afterenvbreak inserts no space -- but the 5991% start of the next paragraph will insert \parskip. 5992% 5993\def\aboveenvbreak{{% 5994 % =10000 instead of <10000 because of a special case in \itemzzz and 5995 % \sectionheading, q.v. 5996 \ifnum \lastpenalty=10000 \else 5997 \advance\envskipamount by \parskip 5998 \endgraf 5999 \ifdim\lastskip<\envskipamount 6000 \removelastskip 6001 % it's not a good place to break if the last penalty was \nobreak 6002 % or better ... 6003 \ifnum\lastpenalty<10000 \penalty-50 \fi 6004 \vskip\envskipamount 6005 \fi 6006 \fi 6007}} 6008 6009\let\afterenvbreak = \aboveenvbreak 6010 6011% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins; it will 6012% also clear it, so that its embedded environments do the narrowing again. 6013\let\nonarrowing=\relax 6014 6015% @cartouche ... @end cartouche: draw rectangle w/rounded corners around 6016% environment contents. 6017\font\circle=lcircle10 6018\newdimen\circthick 6019\newdimen\cartouter\newdimen\cartinner 6020\newskip\normbskip\newskip\normpskip\newskip\normlskip 6021\circthick=\fontdimen8\circle 6022% 6023\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth 6024\def\ctr{{\hskip 6pt\circle\char'010}} 6025\def\cbl{{\circle\char'012\hskip -6pt}} 6026\def\cbr{{\hskip 6pt\circle\char'011}} 6027\def\carttop{\hbox to \cartouter{\hskip\lskip 6028 \ctl\leaders\hrule height\circthick\hfil\ctr 6029 \hskip\rskip}} 6030\def\cartbot{\hbox to \cartouter{\hskip\lskip 6031 \cbl\leaders\hrule height\circthick\hfil\cbr 6032 \hskip\rskip}} 6033% 6034\newskip\lskip\newskip\rskip 6035 6036\envdef\cartouche{% 6037 \ifhmode\par\fi % can't be in the midst of a paragraph. 6038 \startsavinginserts 6039 \lskip=\leftskip \rskip=\rightskip 6040 \leftskip=0pt\rightskip=0pt % we want these *outside*. 6041 \cartinner=\hsize \advance\cartinner by-\lskip 6042 \advance\cartinner by-\rskip 6043 \cartouter=\hsize 6044 \advance\cartouter by 18.4pt % allow for 3pt kerns on either 6045 % side, and for 6pt waste from 6046 % each corner char, and rule thickness 6047 \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip 6048 % Flag to tell @lisp, etc., not to narrow margin. 6049 \let\nonarrowing = t% 6050 \vbox\bgroup 6051 \baselineskip=0pt\parskip=0pt\lineskip=0pt 6052 \carttop 6053 \hbox\bgroup 6054 \hskip\lskip 6055 \vrule\kern3pt 6056 \vbox\bgroup 6057 \kern3pt 6058 \hsize=\cartinner 6059 \baselineskip=\normbskip 6060 \lineskip=\normlskip 6061 \parskip=\normpskip 6062 \vskip -\parskip 6063 \comment % For explanation, see the end of \def\group. 6064} 6065\def\Ecartouche{% 6066 \ifhmode\par\fi 6067 \kern3pt 6068 \egroup 6069 \kern3pt\vrule 6070 \hskip\rskip 6071 \egroup 6072 \cartbot 6073 \egroup 6074 \checkinserts 6075} 6076 6077 6078% This macro is called at the beginning of all the @example variants, 6079% inside a group. 6080\newdimen\nonfillparindent 6081\def\nonfillstart{% 6082 \aboveenvbreak 6083 \hfuzz = 12pt % Don't be fussy 6084 \sepspaces % Make spaces be word-separators rather than space tokens. 6085 \let\par = \lisppar % don't ignore blank lines 6086 \obeylines % each line of input is a line of output 6087 \parskip = 0pt 6088 % Turn off paragraph indentation but redefine \indent to emulate 6089 % the normal \indent. 6090 \nonfillparindent=\parindent 6091 \parindent = 0pt 6092 \let\indent\nonfillindent 6093 % 6094 \emergencystretch = 0pt % don't try to avoid overfull boxes 6095 \ifx\nonarrowing\relax 6096 \advance \leftskip by \lispnarrowing 6097 \exdentamount=\lispnarrowing 6098 \else 6099 \let\nonarrowing = \relax 6100 \fi 6101 \let\exdent=\nofillexdent 6102} 6103 6104\begingroup 6105\obeyspaces 6106% We want to swallow spaces (but not other tokens) after the fake 6107% @indent in our nonfill-environments, where spaces are normally 6108% active and set to @tie, resulting in them not being ignored after 6109% @indent. 6110\gdef\nonfillindent{\futurelet\temp\nonfillindentcheck}% 6111\gdef\nonfillindentcheck{% 6112\ifx\temp % 6113\expandafter\nonfillindentgobble% 6114\else% 6115\leavevmode\nonfillindentbox% 6116\fi% 6117}% 6118\endgroup 6119\def\nonfillindentgobble#1{\nonfillindent} 6120\def\nonfillindentbox{\hbox to \nonfillparindent{\hss}} 6121 6122% If you want all examples etc. small: @set dispenvsize small. 6123% If you want even small examples the full size: @set dispenvsize nosmall. 6124% This affects the following displayed environments: 6125% @example, @display, @format, @lisp 6126% 6127\def\smallword{small} 6128\def\nosmallword{nosmall} 6129\let\SETdispenvsize\relax 6130\def\setnormaldispenv{% 6131 \ifx\SETdispenvsize\smallword 6132 % end paragraph for sake of leading, in case document has no blank 6133 % line. This is redundant with what happens in \aboveenvbreak, but 6134 % we need to do it before changing the fonts, and it's inconvenient 6135 % to change the fonts afterward. 6136 \ifnum \lastpenalty=10000 \else \endgraf \fi 6137 \smallexamplefonts \rm 6138 \fi 6139} 6140\def\setsmalldispenv{% 6141 \ifx\SETdispenvsize\nosmallword 6142 \else 6143 \ifnum \lastpenalty=10000 \else \endgraf \fi 6144 \smallexamplefonts \rm 6145 \fi 6146} 6147 6148% We often define two environments, @foo and @smallfoo. 6149% Let's do it by one command: 6150\def\makedispenv #1#2{ 6151 \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2} 6152 \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2} 6153 \expandafter\let\csname E#1\endcsname \afterenvbreak 6154 \expandafter\let\csname Esmall#1\endcsname \afterenvbreak 6155} 6156 6157% Define two synonyms: 6158\def\maketwodispenvs #1#2#3{ 6159 \makedispenv{#1}{#3} 6160 \makedispenv{#2}{#3} 6161} 6162 6163% @lisp: indented, narrowed, typewriter font; @example: same as @lisp. 6164% 6165% @smallexample and @smalllisp: use smaller fonts. 6166% Originally contributed by Pavel@xerox. 6167% 6168\maketwodispenvs {lisp}{example}{% 6169 \nonfillstart 6170 \tt\setupmarkupstyle{example}% 6171 \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. 6172 \gobble % eat return 6173} 6174% @display/@smalldisplay: same as @lisp except keep current font. 6175% 6176\makedispenv {display}{% 6177 \nonfillstart 6178 \gobble 6179} 6180 6181% @format/@smallformat: same as @display except don't narrow margins. 6182% 6183\makedispenv{format}{% 6184 \let\nonarrowing = t% 6185 \nonfillstart 6186 \gobble 6187} 6188 6189% @flushleft: same as @format, but doesn't obey \SETdispenvsize. 6190\envdef\flushleft{% 6191 \let\nonarrowing = t% 6192 \nonfillstart 6193 \gobble 6194} 6195\let\Eflushleft = \afterenvbreak 6196 6197% @flushright. 6198% 6199\envdef\flushright{% 6200 \let\nonarrowing = t% 6201 \nonfillstart 6202 \advance\leftskip by 0pt plus 1fill 6203 \gobble 6204} 6205\let\Eflushright = \afterenvbreak 6206 6207 6208% @raggedright does more-or-less normal line breaking but no right 6209% justification. From plain.tex. 6210\envdef\raggedright{% 6211 \rightskip0pt plus2em \spaceskip.3333em \xspaceskip.5em\relax 6212} 6213\let\Eraggedright\par 6214 6215\envdef\raggedleft{% 6216 \parindent=0pt \leftskip0pt plus2em 6217 \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt 6218 \hbadness=10000 % Last line will usually be underfull, so turn off 6219 % badness reporting. 6220} 6221\let\Eraggedleft\par 6222 6223\envdef\raggedcenter{% 6224 \parindent=0pt \rightskip0pt plus1em \leftskip0pt plus1em 6225 \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt 6226 \hbadness=10000 % Last line will usually be underfull, so turn off 6227 % badness reporting. 6228} 6229\let\Eraggedcenter\par 6230 6231 6232% @quotation does normal linebreaking (hence we can't use \nonfillstart) 6233% and narrows the margins. We keep \parskip nonzero in general, since 6234% we're doing normal filling. So, when using \aboveenvbreak and 6235% \afterenvbreak, temporarily make \parskip 0. 6236% 6237\def\quotationstart{% 6238 {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip 6239 \parindent=0pt 6240 % 6241 % @cartouche defines \nonarrowing to inhibit narrowing at next level down. 6242 \ifx\nonarrowing\relax 6243 \advance\leftskip by \lispnarrowing 6244 \advance\rightskip by \lispnarrowing 6245 \exdentamount = \lispnarrowing 6246 \else 6247 \let\nonarrowing = \relax 6248 \fi 6249 \parsearg\quotationlabel 6250} 6251 6252\envdef\quotation{% 6253 \setnormaldispenv 6254 \quotationstart 6255} 6256 6257\envdef\smallquotation{% 6258 \setsmalldispenv 6259 \quotationstart 6260} 6261\let\Esmallquotation = \Equotation 6262 6263% We have retained a nonzero parskip for the environment, since we're 6264% doing normal filling. 6265% 6266\def\Equotation{% 6267 \par 6268 \ifx\quotationauthor\undefined\else 6269 % indent a bit. 6270 \leftline{\kern 2\leftskip \sl ---\quotationauthor}% 6271 \fi 6272 {\parskip=0pt \afterenvbreak}% 6273} 6274 6275% If we're given an argument, typeset it in bold with a colon after. 6276\def\quotationlabel#1{% 6277 \def\temp{#1}% 6278 \ifx\temp\empty \else 6279 {\bf #1: }% 6280 \fi 6281} 6282 6283 6284% LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>} 6285% If we want to allow any <char> as delimiter, 6286% we need the curly braces so that makeinfo sees the @verb command, eg: 6287% `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org 6288% 6289% [Knuth]: Donald Ervin Knuth, 1996. The TeXbook. 6290% 6291% [Knuth] p.344; only we need to do the other characters Texinfo sets 6292% active too. Otherwise, they get lost as the first character on a 6293% verbatim line. 6294\def\dospecials{% 6295 \do\ \do\\\do\{\do\}\do\$\do\&% 6296 \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~% 6297 \do\<\do\>\do\|\do\@\do+\do\"% 6298 % Don't do the quotes -- if we do, @set txicodequoteundirected and 6299 % @set txicodequotebacktick will not have effect on @verb and 6300 % @verbatim, and ?` and !` ligatures won't get disabled. 6301 %\do\`\do\'% 6302} 6303% 6304% [Knuth] p. 380 6305\def\uncatcodespecials{% 6306 \def\do##1{\catcode`##1=\other}\dospecials} 6307% 6308% Setup for the @verb command. 6309% 6310% Eight spaces for a tab 6311\begingroup 6312 \catcode`\^^I=\active 6313 \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }} 6314\endgroup 6315% 6316\def\setupverb{% 6317 \tt % easiest (and conventionally used) font for verbatim 6318 \def\par{\leavevmode\endgraf}% 6319 \setupmarkupstyle{verb}% 6320 \tabeightspaces 6321 % Respect line breaks, 6322 % print special symbols as themselves, and 6323 % make each space count 6324 % must do in this order: 6325 \obeylines \uncatcodespecials \sepspaces 6326} 6327 6328% Setup for the @verbatim environment 6329% 6330% Real tab expansion 6331\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount 6332% 6333\def\starttabbox{\setbox0=\hbox\bgroup} 6334% 6335\begingroup 6336 \catcode`\^^I=\active 6337 \gdef\tabexpand{% 6338 \catcode`\^^I=\active 6339 \def^^I{\leavevmode\egroup 6340 \dimen0=\wd0 % the width so far, or since the previous tab 6341 \divide\dimen0 by\tabw 6342 \multiply\dimen0 by\tabw % compute previous multiple of \tabw 6343 \advance\dimen0 by\tabw % advance to next multiple of \tabw 6344 \wd0=\dimen0 \box0 \starttabbox 6345 }% 6346 } 6347\endgroup 6348 6349% start the verbatim environment. 6350\def\setupverbatim{% 6351 \let\nonarrowing = t% 6352 \nonfillstart 6353 % Easiest (and conventionally used) font for verbatim 6354 \tt 6355 \def\par{\leavevmode\egroup\box0\endgraf}% 6356 \tabexpand 6357 \setupmarkupstyle{verbatim}% 6358 % Respect line breaks, 6359 % print special symbols as themselves, and 6360 % make each space count 6361 % must do in this order: 6362 \obeylines \uncatcodespecials \sepspaces 6363 \everypar{\starttabbox}% 6364} 6365 6366% Do the @verb magic: verbatim text is quoted by unique 6367% delimiter characters. Before first delimiter expect a 6368% right brace, after last delimiter expect closing brace: 6369% 6370% \def\doverb'{'<char>#1<char>'}'{#1} 6371% 6372% [Knuth] p. 382; only eat outer {} 6373\begingroup 6374 \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other 6375 \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next] 6376\endgroup 6377% 6378\def\verb{\begingroup\setupverb\doverb} 6379% 6380% 6381% Do the @verbatim magic: define the macro \doverbatim so that 6382% the (first) argument ends when '@end verbatim' is reached, ie: 6383% 6384% \def\doverbatim#1@end verbatim{#1} 6385% 6386% For Texinfo it's a lot easier than for LaTeX, 6387% because texinfo's \verbatim doesn't stop at '\end{verbatim}': 6388% we need not redefine '\', '{' and '}'. 6389% 6390% Inspired by LaTeX's verbatim command set [latex.ltx] 6391% 6392\begingroup 6393 \catcode`\ =\active 6394 \obeylines % 6395 % ignore everything up to the first ^^M, that's the newline at the end 6396 % of the @verbatim input line itself. Otherwise we get an extra blank 6397 % line in the output. 6398 \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}% 6399 % We really want {...\end verbatim} in the body of the macro, but 6400 % without the active space; thus we have to use \xdef and \gobble. 6401\endgroup 6402% 6403\envdef\verbatim{% 6404 \setupverbatim\doverbatim 6405} 6406\let\Everbatim = \afterenvbreak 6407 6408 6409% @verbatiminclude FILE - insert text of file in verbatim environment. 6410% 6411\def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude} 6412% 6413\def\doverbatiminclude#1{% 6414 {% 6415 \makevalueexpandable 6416 \setupverbatim 6417 \indexnofonts % Allow `@@' and other weird things in file names. 6418 \input #1 6419 \afterenvbreak 6420 }% 6421} 6422 6423% @copying ... @end copying. 6424% Save the text away for @insertcopying later. 6425% 6426% We save the uninterpreted tokens, rather than creating a box. 6427% Saving the text in a box would be much easier, but then all the 6428% typesetting commands (@smallbook, font changes, etc.) have to be done 6429% beforehand -- and a) we want @copying to be done first in the source 6430% file; b) letting users define the frontmatter in as flexible order as 6431% possible is very desirable. 6432% 6433\def\copying{\checkenv{}\begingroup\scanargctxt\docopying} 6434\def\docopying#1@end copying{\endgroup\def\copyingtext{#1}} 6435% 6436\def\insertcopying{% 6437 \begingroup 6438 \parindent = 0pt % paragraph indentation looks wrong on title page 6439 \scanexp\copyingtext 6440 \endgroup 6441} 6442 6443 6444\message{defuns,} 6445% @defun etc. 6446 6447\newskip\defbodyindent \defbodyindent=.4in 6448\newskip\defargsindent \defargsindent=50pt 6449\newskip\deflastargmargin \deflastargmargin=18pt 6450\newcount\defunpenalty 6451 6452% Start the processing of @deffn: 6453\def\startdefun{% 6454 \ifnum\lastpenalty<10000 6455 \medbreak 6456 \defunpenalty=10003 % Will keep this @deffn together with the 6457 % following @def command, see below. 6458 \else 6459 % If there are two @def commands in a row, we'll have a \nobreak, 6460 % which is there to keep the function description together with its 6461 % header. But if there's nothing but headers, we need to allow a 6462 % break somewhere. Check specifically for penalty 10002, inserted 6463 % by \printdefunline, instead of 10000, since the sectioning 6464 % commands also insert a nobreak penalty, and we don't want to allow 6465 % a break between a section heading and a defun. 6466 % 6467 % As a minor refinement, we avoid "club" headers by signalling 6468 % with penalty of 10003 after the very first @deffn in the 6469 % sequence (see above), and penalty of 10002 after any following 6470 % @def command. 6471 \ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \fi 6472 % 6473 % Similarly, after a section heading, do not allow a break. 6474 % But do insert the glue. 6475 \medskip % preceded by discardable penalty, so not a breakpoint 6476 \fi 6477 % 6478 \parindent=0in 6479 \advance\leftskip by \defbodyindent 6480 \exdentamount=\defbodyindent 6481} 6482 6483\def\dodefunx#1{% 6484 % First, check whether we are in the right environment: 6485 \checkenv#1% 6486 % 6487 % As above, allow line break if we have multiple x headers in a row. 6488 % It's not a great place, though. 6489 \ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi 6490 % 6491 % And now, it's time to reuse the body of the original defun: 6492 \expandafter\gobbledefun#1% 6493} 6494\def\gobbledefun#1\startdefun{} 6495 6496% \printdefunline \deffnheader{text} 6497% 6498\def\printdefunline#1#2{% 6499 \begingroup 6500 % call \deffnheader: 6501 #1#2 \endheader 6502 % common ending: 6503 \interlinepenalty = 10000 6504 \advance\rightskip by 0pt plus 1fil 6505 \endgraf 6506 \nobreak\vskip -\parskip 6507 \penalty\defunpenalty % signal to \startdefun and \dodefunx 6508 % Some of the @defun-type tags do not enable magic parentheses, 6509 % rendering the following check redundant. But we don't optimize. 6510 \checkparencounts 6511 \endgroup 6512} 6513 6514\def\Edefun{\endgraf\medbreak} 6515 6516% \makedefun{deffn} creates \deffn, \deffnx and \Edeffn; 6517% the only thing remaining is to define \deffnheader. 6518% 6519\def\makedefun#1{% 6520 \expandafter\let\csname E#1\endcsname = \Edefun 6521 \edef\temp{\noexpand\domakedefun 6522 \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}% 6523 \temp 6524} 6525 6526% \domakedefun \deffn \deffnx \deffnheader 6527% 6528% Define \deffn and \deffnx, without parameters. 6529% \deffnheader has to be defined explicitly. 6530% 6531\def\domakedefun#1#2#3{% 6532 \envdef#1{% 6533 \startdefun 6534 \parseargusing\activeparens{\printdefunline#3}% 6535 }% 6536 \def#2{\dodefunx#1}% 6537 \def#3% 6538} 6539 6540%%% Untyped functions: 6541 6542% @deffn category name args 6543\makedefun{deffn}{\deffngeneral{}} 6544 6545% @deffn category class name args 6546\makedefun{defop}#1 {\defopon{#1\ \putwordon}} 6547 6548% \defopon {category on}class name args 6549\def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } 6550 6551% \deffngeneral {subind}category name args 6552% 6553\def\deffngeneral#1#2 #3 #4\endheader{% 6554 % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}. 6555 \dosubind{fn}{\code{#3}}{#1}% 6556 \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}% 6557} 6558 6559%%% Typed functions: 6560 6561% @deftypefn category type name args 6562\makedefun{deftypefn}{\deftypefngeneral{}} 6563 6564% @deftypeop category class type name args 6565\makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}} 6566 6567% \deftypeopon {category on}class type name args 6568\def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } 6569 6570% \deftypefngeneral {subind}category type name args 6571% 6572\def\deftypefngeneral#1#2 #3 #4 #5\endheader{% 6573 \dosubind{fn}{\code{#4}}{#1}% 6574 \defname{#2}{#3}{#4}\defunargs{#5\unskip}% 6575} 6576 6577%%% Typed variables: 6578 6579% @deftypevr category type var args 6580\makedefun{deftypevr}{\deftypecvgeneral{}} 6581 6582% @deftypecv category class type var args 6583\makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}} 6584 6585% \deftypecvof {category of}class type var args 6586\def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} } 6587 6588% \deftypecvgeneral {subind}category type var args 6589% 6590\def\deftypecvgeneral#1#2 #3 #4 #5\endheader{% 6591 \dosubind{vr}{\code{#4}}{#1}% 6592 \defname{#2}{#3}{#4}\defunargs{#5\unskip}% 6593} 6594 6595%%% Untyped variables: 6596 6597% @defvr category var args 6598\makedefun{defvr}#1 {\deftypevrheader{#1} {} } 6599 6600% @defcv category class var args 6601\makedefun{defcv}#1 {\defcvof{#1\ \putwordof}} 6602 6603% \defcvof {category of}class var args 6604\def\defcvof#1#2 {\deftypecvof{#1}#2 {} } 6605 6606%%% Type: 6607% @deftp category name args 6608\makedefun{deftp}#1 #2 #3\endheader{% 6609 \doind{tp}{\code{#2}}% 6610 \defname{#1}{}{#2}\defunargs{#3\unskip}% 6611} 6612 6613% Remaining @defun-like shortcuts: 6614\makedefun{defun}{\deffnheader{\putwordDeffunc} } 6615\makedefun{defmac}{\deffnheader{\putwordDefmac} } 6616\makedefun{defspec}{\deffnheader{\putwordDefspec} } 6617\makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} } 6618\makedefun{defvar}{\defvrheader{\putwordDefvar} } 6619\makedefun{defopt}{\defvrheader{\putwordDefopt} } 6620\makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} } 6621\makedefun{defmethod}{\defopon\putwordMethodon} 6622\makedefun{deftypemethod}{\deftypeopon\putwordMethodon} 6623\makedefun{defivar}{\defcvof\putwordInstanceVariableof} 6624\makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof} 6625 6626% \defname, which formats the name of the @def (not the args). 6627% #1 is the category, such as "Function". 6628% #2 is the return type, if any. 6629% #3 is the function name. 6630% 6631% We are followed by (but not passed) the arguments, if any. 6632% 6633\def\defname#1#2#3{% 6634 % Get the values of \leftskip and \rightskip as they were outside the @def... 6635 \advance\leftskip by -\defbodyindent 6636 % 6637 % How we'll format the type name. Putting it in brackets helps 6638 % distinguish it from the body text that may end up on the next line 6639 % just below it. 6640 \def\temp{#1}% 6641 \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi} 6642 % 6643 % Figure out line sizes for the paragraph shape. 6644 % The first line needs space for \box0; but if \rightskip is nonzero, 6645 % we need only space for the part of \box0 which exceeds it: 6646 \dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip 6647 % The continuations: 6648 \dimen2=\hsize \advance\dimen2 by -\defargsindent 6649 % (plain.tex says that \dimen1 should be used only as global.) 6650 \parshape 2 0in \dimen0 \defargsindent \dimen2 6651 % 6652 % Put the type name to the right margin. 6653 \noindent 6654 \hbox to 0pt{% 6655 \hfil\box0 \kern-\hsize 6656 % \hsize has to be shortened this way: 6657 \kern\leftskip 6658 % Intentionally do not respect \rightskip, since we need the space. 6659 }% 6660 % 6661 % Allow all lines to be underfull without complaint: 6662 \tolerance=10000 \hbadness=10000 6663 \exdentamount=\defbodyindent 6664 {% 6665 % defun fonts. We use typewriter by default (used to be bold) because: 6666 % . we're printing identifiers, they should be in tt in principle. 6667 % . in languages with many accents, such as Czech or French, it's 6668 % common to leave accents off identifiers. The result looks ok in 6669 % tt, but exceedingly strange in rm. 6670 % . we don't want -- and --- to be treated as ligatures. 6671 % . this still does not fix the ?` and !` ligatures, but so far no 6672 % one has made identifiers using them :). 6673 \df \tt 6674 \def\temp{#2}% return value type 6675 \ifx\temp\empty\else \tclose{\temp} \fi 6676 #3% output function name 6677 }% 6678 {\rm\enskip}% hskip 0.5 em of \tenrm 6679 % 6680 \boldbrax 6681 % arguments will be output next, if any. 6682} 6683 6684% Print arguments in slanted roman (not ttsl), inconsistently with using 6685% tt for the name. This is because literal text is sometimes needed in 6686% the argument list (groff manual), and ttsl and tt are not very 6687% distinguishable. Prevent hyphenation at `-' chars. 6688% 6689\def\defunargs#1{% 6690 % use sl by default (not ttsl), 6691 % tt for the names. 6692 \df \sl \hyphenchar\font=0 6693 % 6694 % On the other hand, if an argument has two dashes (for instance), we 6695 % want a way to get ttsl. Let's try @var for that. 6696 \def\var##1{{\setupmarkupstyle{var}\ttslanted{##1}}}% 6697 #1% 6698 \sl\hyphenchar\font=45 6699} 6700 6701% We want ()&[] to print specially on the defun line. 6702% 6703\def\activeparens{% 6704 \catcode`\(=\active \catcode`\)=\active 6705 \catcode`\[=\active \catcode`\]=\active 6706 \catcode`\&=\active 6707} 6708 6709% Make control sequences which act like normal parenthesis chars. 6710\let\lparen = ( \let\rparen = ) 6711 6712% Be sure that we always have a definition for `(', etc. For example, 6713% if the fn name has parens in it, \boldbrax will not be in effect yet, 6714% so TeX would otherwise complain about undefined control sequence. 6715{ 6716 \activeparens 6717 \global\let(=\lparen \global\let)=\rparen 6718 \global\let[=\lbrack \global\let]=\rbrack 6719 \global\let& = \& 6720 6721 \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} 6722 \gdef\magicamp{\let&=\amprm} 6723} 6724 6725\newcount\parencount 6726 6727% If we encounter &foo, then turn on ()-hacking afterwards 6728\newif\ifampseen 6729\def\amprm#1 {\ampseentrue{\bf\ }} 6730 6731\def\parenfont{% 6732 \ifampseen 6733 % At the first level, print parens in roman, 6734 % otherwise use the default font. 6735 \ifnum \parencount=1 \rm \fi 6736 \else 6737 % The \sf parens (in \boldbrax) actually are a little bolder than 6738 % the contained text. This is especially needed for [ and ] . 6739 \sf 6740 \fi 6741} 6742\def\infirstlevel#1{% 6743 \ifampseen 6744 \ifnum\parencount=1 6745 #1% 6746 \fi 6747 \fi 6748} 6749\def\bfafterword#1 {#1 \bf} 6750 6751\def\opnr{% 6752 \global\advance\parencount by 1 6753 {\parenfont(}% 6754 \infirstlevel \bfafterword 6755} 6756\def\clnr{% 6757 {\parenfont)}% 6758 \infirstlevel \sl 6759 \global\advance\parencount by -1 6760} 6761 6762\newcount\brackcount 6763\def\lbrb{% 6764 \global\advance\brackcount by 1 6765 {\bf[}% 6766} 6767\def\rbrb{% 6768 {\bf]}% 6769 \global\advance\brackcount by -1 6770} 6771 6772\def\checkparencounts{% 6773 \ifnum\parencount=0 \else \badparencount \fi 6774 \ifnum\brackcount=0 \else \badbrackcount \fi 6775} 6776% these should not use \errmessage; the glibc manual, at least, actually 6777% has such constructs (when documenting function pointers). 6778\def\badparencount{% 6779 \message{Warning: unbalanced parentheses in @def...}% 6780 \global\parencount=0 6781} 6782\def\badbrackcount{% 6783 \message{Warning: unbalanced square brackets in @def...}% 6784 \global\brackcount=0 6785} 6786 6787 6788\message{macros,} 6789% @macro. 6790 6791% To do this right we need a feature of e-TeX, \scantokens, 6792% which we arrange to emulate with a temporary file in ordinary TeX. 6793\ifx\eTeXversion\undefined 6794 \newwrite\macscribble 6795 \def\scantokens#1{% 6796 \toks0={#1}% 6797 \immediate\openout\macscribble=\jobname.tmp 6798 \immediate\write\macscribble{\the\toks0}% 6799 \immediate\closeout\macscribble 6800 \input \jobname.tmp 6801 } 6802\fi 6803 6804\def\scanmacro#1{% 6805 \begingroup 6806 \newlinechar`\^^M 6807 \let\xeatspaces\eatspaces 6808 % Undo catcode changes of \startcontents and \doprintindex 6809 % When called from @insertcopying or (short)caption, we need active 6810 % backslash to get it printed correctly. Previously, we had 6811 % \catcode`\\=\other instead. We'll see whether a problem appears 6812 % with macro expansion. --kasal, 19aug04 6813 \catcode`\@=0 \catcode`\\=\active \escapechar=`\@ 6814 % ... and \example 6815 \spaceisspace 6816 % 6817 % Append \endinput to make sure that TeX does not see the ending newline. 6818 % I've verified that it is necessary both for e-TeX and for ordinary TeX 6819 % --kasal, 29nov03 6820 \scantokens{#1\endinput}% 6821 \endgroup 6822} 6823 6824\def\scanexp#1{% 6825 \edef\temp{\noexpand\scanmacro{#1}}% 6826 \temp 6827} 6828 6829\newcount\paramno % Count of parameters 6830\newtoks\macname % Macro name 6831\newif\ifrecursive % Is it recursive? 6832 6833% List of all defined macros in the form 6834% \definedummyword\macro1\definedummyword\macro2... 6835% Currently is also contains all @aliases; the list can be split 6836% if there is a need. 6837\def\macrolist{} 6838 6839% Add the macro to \macrolist 6840\def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname} 6841\def\addtomacrolistxxx#1{% 6842 \toks0 = \expandafter{\macrolist\definedummyword#1}% 6843 \xdef\macrolist{\the\toks0}% 6844} 6845 6846% Utility routines. 6847% This does \let #1 = #2, with \csnames; that is, 6848% \let \csname#1\endcsname = \csname#2\endcsname 6849% (except of course we have to play expansion games). 6850% 6851\def\cslet#1#2{% 6852 \expandafter\let 6853 \csname#1\expandafter\endcsname 6854 \csname#2\endcsname 6855} 6856 6857% Trim leading and trailing spaces off a string. 6858% Concepts from aro-bend problem 15 (see CTAN). 6859{\catcode`\@=11 6860\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }} 6861\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@} 6862\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @} 6863\def\unbrace#1{#1} 6864\unbrace{\gdef\trim@@@ #1 } #2@{#1} 6865} 6866 6867% Trim a single trailing ^^M off a string. 6868{\catcode`\^^M=\other \catcode`\Q=3% 6869\gdef\eatcr #1{\eatcra #1Q^^MQ}% 6870\gdef\eatcra#1^^MQ{\eatcrb#1Q}% 6871\gdef\eatcrb#1Q#2Q{#1}% 6872} 6873 6874% Macro bodies are absorbed as an argument in a context where 6875% all characters are catcode 10, 11 or 12, except \ which is active 6876% (as in normal texinfo). It is necessary to change the definition of \. 6877 6878% Non-ASCII encodings make 8-bit characters active, so un-activate 6879% them to avoid their expansion. Must do this non-globally, to 6880% confine the change to the current group. 6881 6882% It's necessary to have hard CRs when the macro is executed. This is 6883% done by making ^^M (\endlinechar) catcode 12 when reading the macro 6884% body, and then making it the \newlinechar in \scanmacro. 6885 6886\def\scanctxt{% 6887 \catcode`\"=\other 6888 \catcode`\+=\other 6889 \catcode`\<=\other 6890 \catcode`\>=\other 6891 \catcode`\@=\other 6892 \catcode`\^=\other 6893 \catcode`\_=\other 6894 \catcode`\|=\other 6895 \catcode`\~=\other 6896 \ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi 6897} 6898 6899\def\scanargctxt{% 6900 \scanctxt 6901 \catcode`\\=\other 6902 \catcode`\^^M=\other 6903} 6904 6905\def\macrobodyctxt{% 6906 \scanctxt 6907 \catcode`\{=\other 6908 \catcode`\}=\other 6909 \catcode`\^^M=\other 6910 \usembodybackslash 6911} 6912 6913\def\macroargctxt{% 6914 \scanctxt 6915 \catcode`\\=\other 6916} 6917 6918% \mbodybackslash is the definition of \ in @macro bodies. 6919% It maps \foo\ => \csname macarg.foo\endcsname => #N 6920% where N is the macro parameter number. 6921% We define \csname macarg.\endcsname to be \realbackslash, so 6922% \\ in macro replacement text gets you a backslash. 6923 6924{\catcode`@=0 @catcode`@\=@active 6925 @gdef@usembodybackslash{@let\=@mbodybackslash} 6926 @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname} 6927} 6928\expandafter\def\csname macarg.\endcsname{\realbackslash} 6929 6930\def\macro{\recursivefalse\parsearg\macroxxx} 6931\def\rmacro{\recursivetrue\parsearg\macroxxx} 6932 6933\def\macroxxx#1{% 6934 \getargs{#1}% now \macname is the macname and \argl the arglist 6935 \ifx\argl\empty % no arguments 6936 \paramno=0% 6937 \else 6938 \expandafter\parsemargdef \argl;% 6939 \fi 6940 \if1\csname ismacro.\the\macname\endcsname 6941 \message{Warning: redefining \the\macname}% 6942 \else 6943 \expandafter\ifx\csname \the\macname\endcsname \relax 6944 \else \errmessage{Macro name \the\macname\space already defined}\fi 6945 \global\cslet{macsave.\the\macname}{\the\macname}% 6946 \global\expandafter\let\csname ismacro.\the\macname\endcsname=1% 6947 \addtomacrolist{\the\macname}% 6948 \fi 6949 \begingroup \macrobodyctxt 6950 \ifrecursive \expandafter\parsermacbody 6951 \else \expandafter\parsemacbody 6952 \fi} 6953 6954\parseargdef\unmacro{% 6955 \if1\csname ismacro.#1\endcsname 6956 \global\cslet{#1}{macsave.#1}% 6957 \global\expandafter\let \csname ismacro.#1\endcsname=0% 6958 % Remove the macro name from \macrolist: 6959 \begingroup 6960 \expandafter\let\csname#1\endcsname \relax 6961 \let\definedummyword\unmacrodo 6962 \xdef\macrolist{\macrolist}% 6963 \endgroup 6964 \else 6965 \errmessage{Macro #1 not defined}% 6966 \fi 6967} 6968 6969% Called by \do from \dounmacro on each macro. The idea is to omit any 6970% macro definitions that have been changed to \relax. 6971% 6972\def\unmacrodo#1{% 6973 \ifx #1\relax 6974 % remove this 6975 \else 6976 \noexpand\definedummyword \noexpand#1% 6977 \fi 6978} 6979 6980% This makes use of the obscure feature that if the last token of a 6981% <parameter list> is #, then the preceding argument is delimited by 6982% an opening brace, and that opening brace is not consumed. 6983\def\getargs#1{\getargsxxx#1{}} 6984\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs} 6985\def\getmacname #1 #2\relax{\macname={#1}} 6986\def\getmacargs#1{\def\argl{#1}} 6987 6988% Parse the optional {params} list. Set up \paramno and \paramlist 6989% so \defmacro knows what to do. Define \macarg.blah for each blah 6990% in the params list, to be ##N where N is the position in that list. 6991% That gets used by \mbodybackslash (above). 6992 6993% We need to get `macro parameter char #' into several definitions. 6994% The technique used is stolen from LaTeX: let \hash be something 6995% unexpandable, insert that wherever you need a #, and then redefine 6996% it to # just before using the token list produced. 6997% 6998% The same technique is used to protect \eatspaces till just before 6999% the macro is used. 7000 7001\def\parsemargdef#1;{\paramno=0\def\paramlist{}% 7002 \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,} 7003\def\parsemargdefxxx#1,{% 7004 \if#1;\let\next=\relax 7005 \else \let\next=\parsemargdefxxx 7006 \advance\paramno by 1% 7007 \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname 7008 {\xeatspaces{\hash\the\paramno}}% 7009 \edef\paramlist{\paramlist\hash\the\paramno,}% 7010 \fi\next} 7011 7012% These two commands read recursive and nonrecursive macro bodies. 7013% (They're different since rec and nonrec macros end differently.) 7014 7015\long\def\parsemacbody#1@end macro% 7016{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% 7017\long\def\parsermacbody#1@end rmacro% 7018{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% 7019 7020% This defines the macro itself. There are six cases: recursive and 7021% nonrecursive macros of zero, one, and many arguments. 7022% Much magic with \expandafter here. 7023% \xdef is used so that macro definitions will survive the file 7024% they're defined in; @include reads the file inside a group. 7025\def\defmacro{% 7026 \let\hash=##% convert placeholders to macro parameter chars 7027 \ifrecursive 7028 \ifcase\paramno 7029 % 0 7030 \expandafter\xdef\csname\the\macname\endcsname{% 7031 \noexpand\scanmacro{\temp}}% 7032 \or % 1 7033 \expandafter\xdef\csname\the\macname\endcsname{% 7034 \bgroup\noexpand\macroargctxt 7035 \noexpand\braceorline 7036 \expandafter\noexpand\csname\the\macname xxx\endcsname}% 7037 \expandafter\xdef\csname\the\macname xxx\endcsname##1{% 7038 \egroup\noexpand\scanmacro{\temp}}% 7039 \else % many 7040 \expandafter\xdef\csname\the\macname\endcsname{% 7041 \bgroup\noexpand\macroargctxt 7042 \noexpand\csname\the\macname xx\endcsname}% 7043 \expandafter\xdef\csname\the\macname xx\endcsname##1{% 7044 \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% 7045 \expandafter\expandafter 7046 \expandafter\xdef 7047 \expandafter\expandafter 7048 \csname\the\macname xxx\endcsname 7049 \paramlist{\egroup\noexpand\scanmacro{\temp}}% 7050 \fi 7051 \else 7052 \ifcase\paramno 7053 % 0 7054 \expandafter\xdef\csname\the\macname\endcsname{% 7055 \noexpand\norecurse{\the\macname}% 7056 \noexpand\scanmacro{\temp}\egroup}% 7057 \or % 1 7058 \expandafter\xdef\csname\the\macname\endcsname{% 7059 \bgroup\noexpand\macroargctxt 7060 \noexpand\braceorline 7061 \expandafter\noexpand\csname\the\macname xxx\endcsname}% 7062 \expandafter\xdef\csname\the\macname xxx\endcsname##1{% 7063 \egroup 7064 \noexpand\norecurse{\the\macname}% 7065 \noexpand\scanmacro{\temp}\egroup}% 7066 \else % many 7067 \expandafter\xdef\csname\the\macname\endcsname{% 7068 \bgroup\noexpand\macroargctxt 7069 \expandafter\noexpand\csname\the\macname xx\endcsname}% 7070 \expandafter\xdef\csname\the\macname xx\endcsname##1{% 7071 \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% 7072 \expandafter\expandafter 7073 \expandafter\xdef 7074 \expandafter\expandafter 7075 \csname\the\macname xxx\endcsname 7076 \paramlist{% 7077 \egroup 7078 \noexpand\norecurse{\the\macname}% 7079 \noexpand\scanmacro{\temp}\egroup}% 7080 \fi 7081 \fi} 7082 7083\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} 7084 7085% \braceorline decides whether the next nonwhitespace character is a 7086% {. If so it reads up to the closing }, if not, it reads the whole 7087% line. Whatever was read is then fed to the next control sequence 7088% as an argument (by \parsebrace or \parsearg) 7089\def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx} 7090\def\braceorlinexxx{% 7091 \ifx\nchar\bgroup\else 7092 \expandafter\parsearg 7093 \fi \macnamexxx} 7094 7095 7096% @alias. 7097% We need some trickery to remove the optional spaces around the equal 7098% sign. Just make them active and then expand them all to nothing. 7099\def\alias{\parseargusing\obeyspaces\aliasxxx} 7100\def\aliasxxx #1{\aliasyyy#1\relax} 7101\def\aliasyyy #1=#2\relax{% 7102 {% 7103 \expandafter\let\obeyedspace=\empty 7104 \addtomacrolist{#1}% 7105 \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}% 7106 }% 7107 \next 7108} 7109 7110 7111\message{cross references,} 7112 7113\newwrite\auxfile 7114\newif\ifhavexrefs % True if xref values are known. 7115\newif\ifwarnedxrefs % True if we warned once that they aren't known. 7116 7117% @inforef is relatively simple. 7118\def\inforef #1{\inforefzzz #1,,,,**} 7119\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, 7120 node \samp{\ignorespaces#1{}}} 7121 7122% @node's only job in TeX is to define \lastnode, which is used in 7123% cross-references. The @node line might or might not have commas, and 7124% might or might not have spaces before the first comma, like: 7125% @node foo , bar , ... 7126% We don't want such trailing spaces in the node name. 7127% 7128\parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse} 7129% 7130% also remove a trailing comma, in case of something like this: 7131% @node Help-Cross, , , Cross-refs 7132\def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse} 7133\def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}} 7134 7135\let\nwnode=\node 7136\let\lastnode=\empty 7137 7138% Write a cross-reference definition for the current node. #1 is the 7139% type (Ynumbered, Yappendix, Ynothing). 7140% 7141\def\donoderef#1{% 7142 \ifx\lastnode\empty\else 7143 \setref{\lastnode}{#1}% 7144 \global\let\lastnode=\empty 7145 \fi 7146} 7147 7148% @anchor{NAME} -- define xref target at arbitrary point. 7149% 7150\newcount\savesfregister 7151% 7152\def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi} 7153\def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi} 7154\def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces} 7155 7156% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an 7157% anchor), which consists of three parts: 7158% 1) NAME-title - the current sectioning name taken from \lastsection, 7159% or the anchor name. 7160% 2) NAME-snt - section number and type, passed as the SNT arg, or 7161% empty for anchors. 7162% 3) NAME-pg - the page number. 7163% 7164% This is called from \donoderef, \anchor, and \dofloat. In the case of 7165% floats, there is an additional part, which is not written here: 7166% 4) NAME-lof - the text as it should appear in a @listoffloats. 7167% 7168\def\setref#1#2{% 7169 \pdfmkdest{#1}% 7170 \iflinks 7171 {% 7172 \atdummies % preserve commands, but don't expand them 7173 \edef\writexrdef##1##2{% 7174 \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef 7175 ##1}{##2}}% these are parameters of \writexrdef 7176 }% 7177 \toks0 = \expandafter{\lastsection}% 7178 \immediate \writexrdef{title}{\the\toks0 }% 7179 \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc. 7180 \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, during \shipout 7181 }% 7182 \fi 7183} 7184 7185% @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is 7186% the node name, #2 the name of the Info cross-reference, #3 the printed 7187% node name, #4 the name of the Info file, #5 the name of the printed 7188% manual. All but the node name can be omitted. 7189% 7190\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]} 7191\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} 7192\def\ref#1{\xrefX[#1,,,,,,,]} 7193\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup 7194 \unsepspaces 7195 \def\printedmanual{\ignorespaces #5}% 7196 \def\printedrefname{\ignorespaces #3}% 7197 \setbox1=\hbox{\printedmanual\unskip}% 7198 \setbox0=\hbox{\printedrefname\unskip}% 7199 \ifdim \wd0 = 0pt 7200 % No printed node name was explicitly given. 7201 \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax 7202 % Use the node name inside the square brackets. 7203 \def\printedrefname{\ignorespaces #1}% 7204 \else 7205 % Use the actual chapter/section title appear inside 7206 % the square brackets. Use the real section title if we have it. 7207 \ifdim \wd1 > 0pt 7208 % It is in another manual, so we don't have it. 7209 \def\printedrefname{\ignorespaces #1}% 7210 \else 7211 \ifhavexrefs 7212 % We know the real title if we have the xref values. 7213 \def\printedrefname{\refx{#1-title}{}}% 7214 \else 7215 % Otherwise just copy the Info node name. 7216 \def\printedrefname{\ignorespaces #1}% 7217 \fi% 7218 \fi 7219 \fi 7220 \fi 7221 % 7222 % Make link in pdf output. 7223 \ifpdf 7224 {\indexnofonts 7225 \turnoffactive 7226 % This expands tokens, so do it after making catcode changes, so _ 7227 % etc. don't get their TeX definitions. 7228 \getfilename{#4}% 7229 % 7230 % See comments at \activebackslashdouble. 7231 {\activebackslashdouble \xdef\pdfxrefdest{#1}% 7232 \backslashparens\pdfxrefdest}% 7233 % 7234 \leavevmode 7235 \startlink attr{/Border [0 0 0]}% 7236 \ifnum\filenamelength>0 7237 goto file{\the\filename.pdf} name{\pdfxrefdest}% 7238 \else 7239 goto name{\pdfmkpgn{\pdfxrefdest}}% 7240 \fi 7241 }% 7242 \setcolor{\linkcolor}% 7243 \fi 7244 % 7245 % Float references are printed completely differently: "Figure 1.2" 7246 % instead of "[somenode], p.3". We distinguish them by the 7247 % LABEL-title being set to a magic string. 7248 {% 7249 % Have to otherify everything special to allow the \csname to 7250 % include an _ in the xref name, etc. 7251 \indexnofonts 7252 \turnoffactive 7253 \expandafter\global\expandafter\let\expandafter\Xthisreftitle 7254 \csname XR#1-title\endcsname 7255 }% 7256 \iffloat\Xthisreftitle 7257 % If the user specified the print name (third arg) to the ref, 7258 % print it instead of our usual "Figure 1.2". 7259 \ifdim\wd0 = 0pt 7260 \refx{#1-snt}{}% 7261 \else 7262 \printedrefname 7263 \fi 7264 % 7265 % if the user also gave the printed manual name (fifth arg), append 7266 % "in MANUALNAME". 7267 \ifdim \wd1 > 0pt 7268 \space \putwordin{} \cite{\printedmanual}% 7269 \fi 7270 \else 7271 % node/anchor (non-float) references. 7272 % 7273 % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not 7274 % insert empty discretionaries after hyphens, which means that it will 7275 % not find a line break at a hyphen in a node names. Since some manuals 7276 % are best written with fairly long node names, containing hyphens, this 7277 % is a loss. Therefore, we give the text of the node name again, so it 7278 % is as if TeX is seeing it for the first time. 7279 \ifdim \wd1 > 0pt 7280 \putwordSection{} ``\printedrefname'' \putwordin{} \cite{\printedmanual}% 7281 \else 7282 % _ (for example) has to be the character _ for the purposes of the 7283 % control sequence corresponding to the node, but it has to expand 7284 % into the usual \leavevmode...\vrule stuff for purposes of 7285 % printing. So we \turnoffactive for the \refx-snt, back on for the 7286 % printing, back off for the \refx-pg. 7287 {\turnoffactive 7288 % Only output a following space if the -snt ref is nonempty; for 7289 % @unnumbered and @anchor, it won't be. 7290 \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}% 7291 \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi 7292 }% 7293 % output the `[mynode]' via a macro so it can be overridden. 7294 \xrefprintnodename\printedrefname 7295 % 7296 % But we always want a comma and a space: 7297 ,\space 7298 % 7299 % output the `page 3'. 7300 \turnoffactive \putwordpage\tie\refx{#1-pg}{}% 7301 \fi 7302 \fi 7303 \endlink 7304\endgroup} 7305 7306% This macro is called from \xrefX for the `[nodename]' part of xref 7307% output. It's a separate macro only so it can be changed more easily, 7308% since square brackets don't work well in some documents. Particularly 7309% one that Bob is working on :). 7310% 7311\def\xrefprintnodename#1{[#1]} 7312 7313% Things referred to by \setref. 7314% 7315\def\Ynothing{} 7316\def\Yomitfromtoc{} 7317\def\Ynumbered{% 7318 \ifnum\secno=0 7319 \putwordChapter@tie \the\chapno 7320 \else \ifnum\subsecno=0 7321 \putwordSection@tie \the\chapno.\the\secno 7322 \else \ifnum\subsubsecno=0 7323 \putwordSection@tie \the\chapno.\the\secno.\the\subsecno 7324 \else 7325 \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno 7326 \fi\fi\fi 7327} 7328\def\Yappendix{% 7329 \ifnum\secno=0 7330 \putwordAppendix@tie @char\the\appendixno{}% 7331 \else \ifnum\subsecno=0 7332 \putwordSection@tie @char\the\appendixno.\the\secno 7333 \else \ifnum\subsubsecno=0 7334 \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno 7335 \else 7336 \putwordSection@tie 7337 @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno 7338 \fi\fi\fi 7339} 7340 7341% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME. 7342% If its value is nonempty, SUFFIX is output afterward. 7343% 7344\def\refx#1#2{% 7345 {% 7346 \indexnofonts 7347 \otherbackslash 7348 \expandafter\global\expandafter\let\expandafter\thisrefX 7349 \csname XR#1\endcsname 7350 }% 7351 \ifx\thisrefX\relax 7352 % If not defined, say something at least. 7353 \angleleft un\-de\-fined\angleright 7354 \iflinks 7355 \ifhavexrefs 7356 \message{\linenumber Undefined cross reference `#1'.}% 7357 \else 7358 \ifwarnedxrefs\else 7359 \global\warnedxrefstrue 7360 \message{Cross reference values unknown; you must run TeX again.}% 7361 \fi 7362 \fi 7363 \fi 7364 \else 7365 % It's defined, so just use it. 7366 \thisrefX 7367 \fi 7368 #2% Output the suffix in any case. 7369} 7370 7371% This is the macro invoked by entries in the aux file. Usually it's 7372% just a \def (we prepend XR to the control sequence name to avoid 7373% collisions). But if this is a float type, we have more work to do. 7374% 7375\def\xrdef#1#2{% 7376 {% The node name might contain 8-bit characters, which in our current 7377 % implementation are changed to commands like @'e. Don't let these 7378 % mess up the control sequence name. 7379 \indexnofonts 7380 \turnoffactive 7381 \xdef\safexrefname{#1}% 7382 }% 7383 % 7384 \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% remember this xref 7385 % 7386 % Was that xref control sequence that we just defined for a float? 7387 \expandafter\iffloat\csname XR\safexrefname\endcsname 7388 % it was a float, and we have the (safe) float type in \iffloattype. 7389 \expandafter\let\expandafter\floatlist 7390 \csname floatlist\iffloattype\endcsname 7391 % 7392 % Is this the first time we've seen this float type? 7393 \expandafter\ifx\floatlist\relax 7394 \toks0 = {\do}% yes, so just \do 7395 \else 7396 % had it before, so preserve previous elements in list. 7397 \toks0 = \expandafter{\floatlist\do}% 7398 \fi 7399 % 7400 % Remember this xref in the control sequence \floatlistFLOATTYPE, 7401 % for later use in \listoffloats. 7402 \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0 7403 {\safexrefname}}% 7404 \fi 7405} 7406 7407% Read the last existing aux file, if any. No error if none exists. 7408% 7409\def\tryauxfile{% 7410 \openin 1 \jobname.aux 7411 \ifeof 1 \else 7412 \readdatafile{aux}% 7413 \global\havexrefstrue 7414 \fi 7415 \closein 1 7416} 7417 7418\def\setupdatafile{% 7419 \catcode`\^^@=\other 7420 \catcode`\^^A=\other 7421 \catcode`\^^B=\other 7422 \catcode`\^^C=\other 7423 \catcode`\^^D=\other 7424 \catcode`\^^E=\other 7425 \catcode`\^^F=\other 7426 \catcode`\^^G=\other 7427 \catcode`\^^H=\other 7428 \catcode`\^^K=\other 7429 \catcode`\^^L=\other 7430 \catcode`\^^N=\other 7431 \catcode`\^^P=\other 7432 \catcode`\^^Q=\other 7433 \catcode`\^^R=\other 7434 \catcode`\^^S=\other 7435 \catcode`\^^T=\other 7436 \catcode`\^^U=\other 7437 \catcode`\^^V=\other 7438 \catcode`\^^W=\other 7439 \catcode`\^^X=\other 7440 \catcode`\^^Z=\other 7441 \catcode`\^^[=\other 7442 \catcode`\^^\=\other 7443 \catcode`\^^]=\other 7444 \catcode`\^^^=\other 7445 \catcode`\^^_=\other 7446 % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc. 7447 % in xref tags, i.e., node names. But since ^^e4 notation isn't 7448 % supported in the main text, it doesn't seem desirable. Furthermore, 7449 % that is not enough: for node names that actually contain a ^ 7450 % character, we would end up writing a line like this: 'xrdef {'hat 7451 % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first 7452 % argument, and \hat is not an expandable control sequence. It could 7453 % all be worked out, but why? Either we support ^^ or we don't. 7454 % 7455 % The other change necessary for this was to define \auxhat: 7456 % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter 7457 % and then to call \auxhat in \setq. 7458 % 7459 \catcode`\^=\other 7460 % 7461 % Special characters. Should be turned off anyway, but... 7462 \catcode`\~=\other 7463 \catcode`\[=\other 7464 \catcode`\]=\other 7465 \catcode`\"=\other 7466 \catcode`\_=\other 7467 \catcode`\|=\other 7468 \catcode`\<=\other 7469 \catcode`\>=\other 7470 \catcode`\$=\other 7471 \catcode`\#=\other 7472 \catcode`\&=\other 7473 \catcode`\%=\other 7474 \catcode`+=\other % avoid \+ for paranoia even though we've turned it off 7475 % 7476 % This is to support \ in node names and titles, since the \ 7477 % characters end up in a \csname. It's easier than 7478 % leaving it active and making its active definition an actual \ 7479 % character. What I don't understand is why it works in the *value* 7480 % of the xrdef. Seems like it should be a catcode12 \, and that 7481 % should not typeset properly. But it works, so I'm moving on for 7482 % now. --karl, 15jan04. 7483 \catcode`\\=\other 7484 % 7485 % Make the characters 128-255 be printing characters. 7486 {% 7487 \count1=128 7488 \def\loop{% 7489 \catcode\count1=\other 7490 \advance\count1 by 1 7491 \ifnum \count1<256 \loop \fi 7492 }% 7493 }% 7494 % 7495 % @ is our escape character in .aux files, and we need braces. 7496 \catcode`\{=1 7497 \catcode`\}=2 7498 \catcode`\@=0 7499} 7500 7501\def\readdatafile#1{% 7502\begingroup 7503 \setupdatafile 7504 \input\jobname.#1 7505\endgroup} 7506 7507 7508\message{insertions,} 7509% including footnotes. 7510 7511\newcount \footnoteno 7512 7513% The trailing space in the following definition for supereject is 7514% vital for proper filling; pages come out unaligned when you do a 7515% pagealignmacro call if that space before the closing brace is 7516% removed. (Generally, numeric constants should always be followed by a 7517% space to prevent strange expansion errors.) 7518\def\supereject{\par\penalty -20000\footnoteno =0 } 7519 7520% @footnotestyle is meaningful for info output only. 7521\let\footnotestyle=\comment 7522 7523{\catcode `\@=11 7524% 7525% Auto-number footnotes. Otherwise like plain. 7526\gdef\footnote{% 7527 \let\indent=\ptexindent 7528 \let\noindent=\ptexnoindent 7529 \global\advance\footnoteno by \@ne 7530 \edef\thisfootno{$^{\the\footnoteno}$}% 7531 % 7532 % In case the footnote comes at the end of a sentence, preserve the 7533 % extra spacing after we do the footnote number. 7534 \let\@sf\empty 7535 \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi 7536 % 7537 % Remove inadvertent blank space before typesetting the footnote number. 7538 \unskip 7539 \thisfootno\@sf 7540 \dofootnote 7541}% 7542 7543% Don't bother with the trickery in plain.tex to not require the 7544% footnote text as a parameter. Our footnotes don't need to be so general. 7545% 7546% Oh yes, they do; otherwise, @ifset (and anything else that uses 7547% \parseargline) fails inside footnotes because the tokens are fixed when 7548% the footnote is read. --karl, 16nov96. 7549% 7550\gdef\dofootnote{% 7551 \insert\footins\bgroup 7552 % We want to typeset this text as a normal paragraph, even if the 7553 % footnote reference occurs in (for example) a display environment. 7554 % So reset some parameters. 7555 \hsize=\pagewidth 7556 \interlinepenalty\interfootnotelinepenalty 7557 \splittopskip\ht\strutbox % top baseline for broken footnotes 7558 \splitmaxdepth\dp\strutbox 7559 \floatingpenalty\@MM 7560 \leftskip\z@skip 7561 \rightskip\z@skip 7562 \spaceskip\z@skip 7563 \xspaceskip\z@skip 7564 \parindent\defaultparindent 7565 % 7566 \smallfonts \rm 7567 % 7568 % Because we use hanging indentation in footnotes, a @noindent appears 7569 % to exdent this text, so make it be a no-op. makeinfo does not use 7570 % hanging indentation so @noindent can still be needed within footnote 7571 % text after an @example or the like (not that this is good style). 7572 \let\noindent = \relax 7573 % 7574 % Hang the footnote text off the number. Use \everypar in case the 7575 % footnote extends for more than one paragraph. 7576 \everypar = {\hang}% 7577 \textindent{\thisfootno}% 7578 % 7579 % Don't crash into the line above the footnote text. Since this 7580 % expands into a box, it must come within the paragraph, lest it 7581 % provide a place where TeX can split the footnote. 7582 \footstrut 7583 \futurelet\next\fo@t 7584} 7585}%end \catcode `\@=11 7586 7587% In case a @footnote appears in a vbox, save the footnote text and create 7588% the real \insert just after the vbox finished. Otherwise, the insertion 7589% would be lost. 7590% Similarly, if a @footnote appears inside an alignment, save the footnote 7591% text to a box and make the \insert when a row of the table is finished. 7592% And the same can be done for other insert classes. --kasal, 16nov03. 7593 7594% Replace the \insert primitive by a cheating macro. 7595% Deeper inside, just make sure that the saved insertions are not spilled 7596% out prematurely. 7597% 7598\def\startsavinginserts{% 7599 \ifx \insert\ptexinsert 7600 \let\insert\saveinsert 7601 \else 7602 \let\checkinserts\relax 7603 \fi 7604} 7605 7606% This \insert replacement works for both \insert\footins{foo} and 7607% \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}. 7608% 7609\def\saveinsert#1{% 7610 \edef\next{\noexpand\savetobox \makeSAVEname#1}% 7611 \afterassignment\next 7612 % swallow the left brace 7613 \let\temp = 7614} 7615\def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}} 7616\def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1} 7617 7618\def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi} 7619 7620\def\placesaveins#1{% 7621 \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname 7622 {\box#1}% 7623} 7624 7625% eat @SAVE -- beware, all of them have catcode \other: 7626{ 7627 \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-) 7628 \gdef\gobblesave @SAVE{} 7629} 7630 7631% initialization: 7632\def\newsaveins #1{% 7633 \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}% 7634 \next 7635} 7636\def\newsaveinsX #1{% 7637 \csname newbox\endcsname #1% 7638 \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts 7639 \checksaveins #1}% 7640} 7641 7642% initialize: 7643\let\checkinserts\empty 7644\newsaveins\footins 7645\newsaveins\margin 7646 7647 7648% @image. We use the macros from epsf.tex to support this. 7649% If epsf.tex is not installed and @image is used, we complain. 7650% 7651% Check for and read epsf.tex up front. If we read it only at @image 7652% time, we might be inside a group, and then its definitions would get 7653% undone and the next image would fail. 7654\openin 1 = epsf.tex 7655\ifeof 1 \else 7656 % Do not bother showing banner with epsf.tex v2.7k (available in 7657 % doc/epsf.tex and on ctan). 7658 \def\epsfannounce{\toks0 = }% 7659 \input epsf.tex 7660\fi 7661\closein 1 7662% 7663% We will only complain once about lack of epsf.tex. 7664\newif\ifwarnednoepsf 7665\newhelp\noepsfhelp{epsf.tex must be installed for images to 7666 work. It is also included in the Texinfo distribution, or you can get 7667 it from ftp://tug.org/tex/epsf.tex.} 7668% 7669\def\image#1{% 7670 \ifx\epsfbox\undefined 7671 \ifwarnednoepsf \else 7672 \errhelp = \noepsfhelp 7673 \errmessage{epsf.tex not found, images will be ignored}% 7674 \global\warnednoepsftrue 7675 \fi 7676 \else 7677 \imagexxx #1,,,,,\finish 7678 \fi 7679} 7680% 7681% Arguments to @image: 7682% #1 is (mandatory) image filename; we tack on .eps extension. 7683% #2 is (optional) width, #3 is (optional) height. 7684% #4 is (ignored optional) html alt text. 7685% #5 is (ignored optional) extension. 7686% #6 is just the usual extra ignored arg for parsing this stuff. 7687\newif\ifimagevmode 7688\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup 7689 \catcode`\^^M = 5 % in case we're inside an example 7690 \normalturnoffactive % allow _ et al. in names 7691 % If the image is by itself, center it. 7692 \ifvmode 7693 \imagevmodetrue 7694 \nobreak\medskip 7695 % Usually we'll have text after the image which will insert 7696 % \parskip glue, so insert it here too to equalize the space 7697 % above and below. 7698 \nobreak\vskip\parskip 7699 \nobreak 7700 \fi 7701 % 7702 % Leave vertical mode so that indentation from an enclosing 7703 % environment such as @quotation is respected. On the other hand, if 7704 % it's at the top level, we don't want the normal paragraph indentation. 7705 \noindent 7706 % 7707 % Output the image. 7708 \ifpdf 7709 \dopdfimage{#1}{#2}{#3}% 7710 \else 7711 % \epsfbox itself resets \epsf?size at each figure. 7712 \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi 7713 \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi 7714 \epsfbox{#1.eps}% 7715 \fi 7716 % 7717 \ifimagevmode \medskip \fi % space after the standalone image 7718\endgroup} 7719 7720 7721% @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables, 7722% etc. We don't actually implement floating yet, we always include the 7723% float "here". But it seemed the best name for the future. 7724% 7725\envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish} 7726 7727% There may be a space before second and/or third parameter; delete it. 7728\def\eatcommaspace#1, {#1,} 7729 7730% #1 is the optional FLOATTYPE, the text label for this float, typically 7731% "Figure", "Table", "Example", etc. Can't contain commas. If omitted, 7732% this float will not be numbered and cannot be referred to. 7733% 7734% #2 is the optional xref label. Also must be present for the float to 7735% be referable. 7736% 7737% #3 is the optional positioning argument; for now, it is ignored. It 7738% will somehow specify the positions allowed to float to (here, top, bottom). 7739% 7740% We keep a separate counter for each FLOATTYPE, which we reset at each 7741% chapter-level command. 7742\let\resetallfloatnos=\empty 7743% 7744\def\dofloat#1,#2,#3,#4\finish{% 7745 \let\thiscaption=\empty 7746 \let\thisshortcaption=\empty 7747 % 7748 % don't lose footnotes inside @float. 7749 % 7750 % BEWARE: when the floats start float, we have to issue warning whenever an 7751 % insert appears inside a float which could possibly float. --kasal, 26may04 7752 % 7753 \startsavinginserts 7754 % 7755 % We can't be used inside a paragraph. 7756 \par 7757 % 7758 \vtop\bgroup 7759 \def\floattype{#1}% 7760 \def\floatlabel{#2}% 7761 \def\floatloc{#3}% we do nothing with this yet. 7762 % 7763 \ifx\floattype\empty 7764 \let\safefloattype=\empty 7765 \else 7766 {% 7767 % the floattype might have accents or other special characters, 7768 % but we need to use it in a control sequence name. 7769 \indexnofonts 7770 \turnoffactive 7771 \xdef\safefloattype{\floattype}% 7772 }% 7773 \fi 7774 % 7775 % If label is given but no type, we handle that as the empty type. 7776 \ifx\floatlabel\empty \else 7777 % We want each FLOATTYPE to be numbered separately (Figure 1, 7778 % Table 1, Figure 2, ...). (And if no label, no number.) 7779 % 7780 \expandafter\getfloatno\csname\safefloattype floatno\endcsname 7781 \global\advance\floatno by 1 7782 % 7783 {% 7784 % This magic value for \lastsection is output by \setref as the 7785 % XREFLABEL-title value. \xrefX uses it to distinguish float 7786 % labels (which have a completely different output format) from 7787 % node and anchor labels. And \xrdef uses it to construct the 7788 % lists of floats. 7789 % 7790 \edef\lastsection{\floatmagic=\safefloattype}% 7791 \setref{\floatlabel}{Yfloat}% 7792 }% 7793 \fi 7794 % 7795 % start with \parskip glue, I guess. 7796 \vskip\parskip 7797 % 7798 % Don't suppress indentation if a float happens to start a section. 7799 \restorefirstparagraphindent 7800} 7801 7802% we have these possibilities: 7803% @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap 7804% @float Foo,lbl & no caption: Foo 1.1 7805% @float Foo & @caption{Cap}: Foo: Cap 7806% @float Foo & no caption: Foo 7807% @float ,lbl & Caption{Cap}: 1.1: Cap 7808% @float ,lbl & no caption: 1.1 7809% @float & @caption{Cap}: Cap 7810% @float & no caption: 7811% 7812\def\Efloat{% 7813 \let\floatident = \empty 7814 % 7815 % In all cases, if we have a float type, it comes first. 7816 \ifx\floattype\empty \else \def\floatident{\floattype}\fi 7817 % 7818 % If we have an xref label, the number comes next. 7819 \ifx\floatlabel\empty \else 7820 \ifx\floattype\empty \else % if also had float type, need tie first. 7821 \appendtomacro\floatident{\tie}% 7822 \fi 7823 % the number. 7824 \appendtomacro\floatident{\chaplevelprefix\the\floatno}% 7825 \fi 7826 % 7827 % Start the printed caption with what we've constructed in 7828 % \floatident, but keep it separate; we need \floatident again. 7829 \let\captionline = \floatident 7830 % 7831 \ifx\thiscaption\empty \else 7832 \ifx\floatident\empty \else 7833 \appendtomacro\captionline{: }% had ident, so need a colon between 7834 \fi 7835 % 7836 % caption text. 7837 \appendtomacro\captionline{\scanexp\thiscaption}% 7838 \fi 7839 % 7840 % If we have anything to print, print it, with space before. 7841 % Eventually this needs to become an \insert. 7842 \ifx\captionline\empty \else 7843 \vskip.5\parskip 7844 \captionline 7845 % 7846 % Space below caption. 7847 \vskip\parskip 7848 \fi 7849 % 7850 % If have an xref label, write the list of floats info. Do this 7851 % after the caption, to avoid chance of it being a breakpoint. 7852 \ifx\floatlabel\empty \else 7853 % Write the text that goes in the lof to the aux file as 7854 % \floatlabel-lof. Besides \floatident, we include the short 7855 % caption if specified, else the full caption if specified, else nothing. 7856 {% 7857 \atdummies 7858 % 7859 % since we read the caption text in the macro world, where ^^M 7860 % is turned into a normal character, we have to scan it back, so 7861 % we don't write the literal three characters "^^M" into the aux file. 7862 \scanexp{% 7863 \xdef\noexpand\gtemp{% 7864 \ifx\thisshortcaption\empty 7865 \thiscaption 7866 \else 7867 \thisshortcaption 7868 \fi 7869 }% 7870 }% 7871 \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident 7872 \ifx\gtemp\empty \else : \gtemp \fi}}% 7873 }% 7874 \fi 7875 \egroup % end of \vtop 7876 % 7877 % place the captured inserts 7878 % 7879 % BEWARE: when the floats start floating, we have to issue warning 7880 % whenever an insert appears inside a float which could possibly 7881 % float. --kasal, 26may04 7882 % 7883 \checkinserts 7884} 7885 7886% Append the tokens #2 to the definition of macro #1, not expanding either. 7887% 7888\def\appendtomacro#1#2{% 7889 \expandafter\def\expandafter#1\expandafter{#1#2}% 7890} 7891 7892% @caption, @shortcaption 7893% 7894\def\caption{\docaption\thiscaption} 7895\def\shortcaption{\docaption\thisshortcaption} 7896\def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption} 7897\def\defcaption#1#2{\egroup \def#1{#2}} 7898 7899% The parameter is the control sequence identifying the counter we are 7900% going to use. Create it if it doesn't exist and assign it to \floatno. 7901\def\getfloatno#1{% 7902 \ifx#1\relax 7903 % Haven't seen this figure type before. 7904 \csname newcount\endcsname #1% 7905 % 7906 % Remember to reset this floatno at the next chap. 7907 \expandafter\gdef\expandafter\resetallfloatnos 7908 \expandafter{\resetallfloatnos #1=0 }% 7909 \fi 7910 \let\floatno#1% 7911} 7912 7913% \setref calls this to get the XREFLABEL-snt value. We want an @xref 7914% to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we 7915% first read the @float command. 7916% 7917\def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}% 7918 7919% Magic string used for the XREFLABEL-title value, so \xrefX can 7920% distinguish floats from other xref types. 7921\def\floatmagic{!!float!!} 7922 7923% #1 is the control sequence we are passed; we expand into a conditional 7924% which is true if #1 represents a float ref. That is, the magic 7925% \lastsection value which we \setref above. 7926% 7927\def\iffloat#1{\expandafter\doiffloat#1==\finish} 7928% 7929% #1 is (maybe) the \floatmagic string. If so, #2 will be the 7930% (safe) float type for this float. We set \iffloattype to #2. 7931% 7932\def\doiffloat#1=#2=#3\finish{% 7933 \def\temp{#1}% 7934 \def\iffloattype{#2}% 7935 \ifx\temp\floatmagic 7936} 7937 7938% @listoffloats FLOATTYPE - print a list of floats like a table of contents. 7939% 7940\parseargdef\listoffloats{% 7941 \def\floattype{#1}% floattype 7942 {% 7943 % the floattype might have accents or other special characters, 7944 % but we need to use it in a control sequence name. 7945 \indexnofonts 7946 \turnoffactive 7947 \xdef\safefloattype{\floattype}% 7948 }% 7949 % 7950 % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE. 7951 \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax 7952 \ifhavexrefs 7953 % if the user said @listoffloats foo but never @float foo. 7954 \message{\linenumber No `\safefloattype' floats to list.}% 7955 \fi 7956 \else 7957 \begingroup 7958 \leftskip=\tocindent % indent these entries like a toc 7959 \let\do=\listoffloatsdo 7960 \csname floatlist\safefloattype\endcsname 7961 \endgroup 7962 \fi 7963} 7964 7965% This is called on each entry in a list of floats. We're passed the 7966% xref label, in the form LABEL-title, which is how we save it in the 7967% aux file. We strip off the -title and look up \XRLABEL-lof, which 7968% has the text we're supposed to typeset here. 7969% 7970% Figures without xref labels will not be included in the list (since 7971% they won't appear in the aux file). 7972% 7973\def\listoffloatsdo#1{\listoffloatsdoentry#1\finish} 7974\def\listoffloatsdoentry#1-title\finish{{% 7975 % Can't fully expand XR#1-lof because it can contain anything. Just 7976 % pass the control sequence. On the other hand, XR#1-pg is just the 7977 % page number, and we want to fully expand that so we can get a link 7978 % in pdf output. 7979 \toksA = \expandafter{\csname XR#1-lof\endcsname}% 7980 % 7981 % use the same \entry macro we use to generate the TOC and index. 7982 \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}% 7983 \writeentry 7984}} 7985 7986 7987\message{localization,} 7988 7989% For single-language documents, @documentlanguage is usually given very 7990% early, just after @documentencoding. Single argument is the language 7991% (de) or locale (de_DE) abbreviation. 7992% 7993{ 7994 \catcode`\_ = \active 7995 \globaldefs=1 7996\parseargdef\documentlanguage{\begingroup 7997 \let_=\normalunderscore % normal _ character for filenames 7998 \tex % read txi-??.tex file in plain TeX. 7999 % Read the file by the name they passed if it exists. 8000 \openin 1 txi-#1.tex 8001 \ifeof 1 8002 \documentlanguagetrywithoutunderscore{#1_\finish}% 8003 \else 8004 \globaldefs = 1 % everything in the txi-LL files needs to persist 8005 \input txi-#1.tex 8006 \fi 8007 \closein 1 8008 \endgroup % end raw TeX 8009\endgroup} 8010% 8011% If they passed de_DE, and txi-de_DE.tex doesn't exist, 8012% try txi-de.tex. 8013% 8014\gdef\documentlanguagetrywithoutunderscore#1_#2\finish{% 8015 \openin 1 txi-#1.tex 8016 \ifeof 1 8017 \errhelp = \nolanghelp 8018 \errmessage{Cannot read language file txi-#1.tex}% 8019 \else 8020 \globaldefs = 1 % everything in the txi-LL files needs to persist 8021 \input txi-#1.tex 8022 \fi 8023 \closein 1 8024} 8025}% end of special _ catcode 8026% 8027\newhelp\nolanghelp{The given language definition file cannot be found or 8028is empty. Maybe you need to install it? Putting it in the current 8029directory should work if nowhere else does.} 8030 8031% This macro is called from txi-??.tex files; the first argument is the 8032% \language name to set (without the "\lang@" prefix), the second and 8033% third args are \{left,right}hyphenmin. 8034% 8035% The language names to pass are determined when the format is built. 8036% See the etex.log file created at that time, e.g., 8037% /usr/local/texlive/2008/texmf-var/web2c/pdftex/etex.log. 8038% 8039% With TeX Live 2008, etex now includes hyphenation patterns for all 8040% available languages. This means we can support hyphenation in 8041% Texinfo, at least to some extent. (This still doesn't solve the 8042% accented characters problem.) 8043% 8044\catcode`@=11 8045\def\txisetlanguage#1#2#3{% 8046 % do not set the language if the name is undefined in the current TeX. 8047 \expandafter\ifx\csname lang@#1\endcsname \relax 8048 \message{no patterns for #1}% 8049 \else 8050 \global\language = \csname lang@#1\endcsname 8051 \fi 8052 % but there is no harm in adjusting the hyphenmin values regardless. 8053 \global\lefthyphenmin = #2\relax 8054 \global\righthyphenmin = #3\relax 8055} 8056 8057% Helpers for encodings. 8058% Set the catcode of characters 128 through 255 to the specified number. 8059% 8060\def\setnonasciicharscatcode#1{% 8061 \count255=128 8062 \loop\ifnum\count255<256 8063 \global\catcode\count255=#1\relax 8064 \advance\count255 by 1 8065 \repeat 8066} 8067 8068\def\setnonasciicharscatcodenonglobal#1{% 8069 \count255=128 8070 \loop\ifnum\count255<256 8071 \catcode\count255=#1\relax 8072 \advance\count255 by 1 8073 \repeat 8074} 8075 8076% @documentencoding sets the definition of non-ASCII characters 8077% according to the specified encoding. 8078% 8079\parseargdef\documentencoding{% 8080 % Encoding being declared for the document. 8081 \def\declaredencoding{\csname #1.enc\endcsname}% 8082 % 8083 % Supported encodings: names converted to tokens in order to be able 8084 % to compare them with \ifx. 8085 \def\ascii{\csname US-ASCII.enc\endcsname}% 8086 \def\latnine{\csname ISO-8859-15.enc\endcsname}% 8087 \def\latone{\csname ISO-8859-1.enc\endcsname}% 8088 \def\lattwo{\csname ISO-8859-2.enc\endcsname}% 8089 \def\utfeight{\csname UTF-8.enc\endcsname}% 8090 % 8091 \ifx \declaredencoding \ascii 8092 \asciichardefs 8093 % 8094 \else \ifx \declaredencoding \lattwo 8095 \setnonasciicharscatcode\active 8096 \lattwochardefs 8097 % 8098 \else \ifx \declaredencoding \latone 8099 \setnonasciicharscatcode\active 8100 \latonechardefs 8101 % 8102 \else \ifx \declaredencoding \latnine 8103 \setnonasciicharscatcode\active 8104 \latninechardefs 8105 % 8106 \else \ifx \declaredencoding \utfeight 8107 \setnonasciicharscatcode\active 8108 \utfeightchardefs 8109 % 8110 \else 8111 \message{Unknown document encoding #1, ignoring.}% 8112 % 8113 \fi % utfeight 8114 \fi % latnine 8115 \fi % latone 8116 \fi % lattwo 8117 \fi % ascii 8118} 8119 8120% A message to be logged when using a character that isn't available 8121% the default font encoding (OT1). 8122% 8123\def\missingcharmsg#1{\message{Character missing in OT1 encoding: #1.}} 8124 8125% Take account of \c (plain) vs. \, (Texinfo) difference. 8126\def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi} 8127 8128% First, make active non-ASCII characters in order for them to be 8129% correctly categorized when TeX reads the replacement text of 8130% macros containing the character definitions. 8131\setnonasciicharscatcode\active 8132% 8133% Latin1 (ISO-8859-1) character definitions. 8134\def\latonechardefs{% 8135 \gdef^^a0{~} 8136 \gdef^^a1{\exclamdown} 8137 \gdef^^a2{\missingcharmsg{CENT SIGN}} 8138 \gdef^^a3{{\pounds}} 8139 \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} 8140 \gdef^^a5{\missingcharmsg{YEN SIGN}} 8141 \gdef^^a6{\missingcharmsg{BROKEN BAR}} 8142 \gdef^^a7{\S} 8143 \gdef^^a8{\"{}} 8144 \gdef^^a9{\copyright} 8145 \gdef^^aa{\ordf} 8146 \gdef^^ab{\guillemetleft} 8147 \gdef^^ac{$\lnot$} 8148 \gdef^^ad{\-} 8149 \gdef^^ae{\registeredsymbol} 8150 \gdef^^af{\={}} 8151 % 8152 \gdef^^b0{\textdegree} 8153 \gdef^^b1{$\pm$} 8154 \gdef^^b2{$^2$} 8155 \gdef^^b3{$^3$} 8156 \gdef^^b4{\'{}} 8157 \gdef^^b5{$\mu$} 8158 \gdef^^b6{\P} 8159 % 8160 \gdef^^b7{$^.$} 8161 \gdef^^b8{\cedilla\ } 8162 \gdef^^b9{$^1$} 8163 \gdef^^ba{\ordm} 8164 % 8165 \gdef^^bb{\guilletright} 8166 \gdef^^bc{$1\over4$} 8167 \gdef^^bd{$1\over2$} 8168 \gdef^^be{$3\over4$} 8169 \gdef^^bf{\questiondown} 8170 % 8171 \gdef^^c0{\`A} 8172 \gdef^^c1{\'A} 8173 \gdef^^c2{\^A} 8174 \gdef^^c3{\~A} 8175 \gdef^^c4{\"A} 8176 \gdef^^c5{\ringaccent A} 8177 \gdef^^c6{\AE} 8178 \gdef^^c7{\cedilla C} 8179 \gdef^^c8{\`E} 8180 \gdef^^c9{\'E} 8181 \gdef^^ca{\^E} 8182 \gdef^^cb{\"E} 8183 \gdef^^cc{\`I} 8184 \gdef^^cd{\'I} 8185 \gdef^^ce{\^I} 8186 \gdef^^cf{\"I} 8187 % 8188 \gdef^^d0{\DH} 8189 \gdef^^d1{\~N} 8190 \gdef^^d2{\`O} 8191 \gdef^^d3{\'O} 8192 \gdef^^d4{\^O} 8193 \gdef^^d5{\~O} 8194 \gdef^^d6{\"O} 8195 \gdef^^d7{$\times$} 8196 \gdef^^d8{\O} 8197 \gdef^^d9{\`U} 8198 \gdef^^da{\'U} 8199 \gdef^^db{\^U} 8200 \gdef^^dc{\"U} 8201 \gdef^^dd{\'Y} 8202 \gdef^^de{\TH} 8203 \gdef^^df{\ss} 8204 % 8205 \gdef^^e0{\`a} 8206 \gdef^^e1{\'a} 8207 \gdef^^e2{\^a} 8208 \gdef^^e3{\~a} 8209 \gdef^^e4{\"a} 8210 \gdef^^e5{\ringaccent a} 8211 \gdef^^e6{\ae} 8212 \gdef^^e7{\cedilla c} 8213 \gdef^^e8{\`e} 8214 \gdef^^e9{\'e} 8215 \gdef^^ea{\^e} 8216 \gdef^^eb{\"e} 8217 \gdef^^ec{\`{\dotless i}} 8218 \gdef^^ed{\'{\dotless i}} 8219 \gdef^^ee{\^{\dotless i}} 8220 \gdef^^ef{\"{\dotless i}} 8221 % 8222 \gdef^^f0{\dh} 8223 \gdef^^f1{\~n} 8224 \gdef^^f2{\`o} 8225 \gdef^^f3{\'o} 8226 \gdef^^f4{\^o} 8227 \gdef^^f5{\~o} 8228 \gdef^^f6{\"o} 8229 \gdef^^f7{$\div$} 8230 \gdef^^f8{\o} 8231 \gdef^^f9{\`u} 8232 \gdef^^fa{\'u} 8233 \gdef^^fb{\^u} 8234 \gdef^^fc{\"u} 8235 \gdef^^fd{\'y} 8236 \gdef^^fe{\th} 8237 \gdef^^ff{\"y} 8238} 8239 8240% Latin9 (ISO-8859-15) encoding character definitions. 8241\def\latninechardefs{% 8242 % Encoding is almost identical to Latin1. 8243 \latonechardefs 8244 % 8245 \gdef^^a4{\euro} 8246 \gdef^^a6{\v S} 8247 \gdef^^a8{\v s} 8248 \gdef^^b4{\v Z} 8249 \gdef^^b8{\v z} 8250 \gdef^^bc{\OE} 8251 \gdef^^bd{\oe} 8252 \gdef^^be{\"Y} 8253} 8254 8255% Latin2 (ISO-8859-2) character definitions. 8256\def\lattwochardefs{% 8257 \gdef^^a0{~} 8258 \gdef^^a1{\ogonek{A}} 8259 \gdef^^a2{\u{}} 8260 \gdef^^a3{\L} 8261 \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} 8262 \gdef^^a5{\v L} 8263 \gdef^^a6{\'S} 8264 \gdef^^a7{\S} 8265 \gdef^^a8{\"{}} 8266 \gdef^^a9{\v S} 8267 \gdef^^aa{\cedilla S} 8268 \gdef^^ab{\v T} 8269 \gdef^^ac{\'Z} 8270 \gdef^^ad{\-} 8271 \gdef^^ae{\v Z} 8272 \gdef^^af{\dotaccent Z} 8273 % 8274 \gdef^^b0{\textdegree} 8275 \gdef^^b1{\ogonek{a}} 8276 \gdef^^b2{\ogonek{ }} 8277 \gdef^^b3{\l} 8278 \gdef^^b4{\'{}} 8279 \gdef^^b5{\v l} 8280 \gdef^^b6{\'s} 8281 \gdef^^b7{\v{}} 8282 \gdef^^b8{\cedilla\ } 8283 \gdef^^b9{\v s} 8284 \gdef^^ba{\cedilla s} 8285 \gdef^^bb{\v t} 8286 \gdef^^bc{\'z} 8287 \gdef^^bd{\H{}} 8288 \gdef^^be{\v z} 8289 \gdef^^bf{\dotaccent z} 8290 % 8291 \gdef^^c0{\'R} 8292 \gdef^^c1{\'A} 8293 \gdef^^c2{\^A} 8294 \gdef^^c3{\u A} 8295 \gdef^^c4{\"A} 8296 \gdef^^c5{\'L} 8297 \gdef^^c6{\'C} 8298 \gdef^^c7{\cedilla C} 8299 \gdef^^c8{\v C} 8300 \gdef^^c9{\'E} 8301 \gdef^^ca{\ogonek{E}} 8302 \gdef^^cb{\"E} 8303 \gdef^^cc{\v E} 8304 \gdef^^cd{\'I} 8305 \gdef^^ce{\^I} 8306 \gdef^^cf{\v D} 8307 % 8308 \gdef^^d0{\DH} 8309 \gdef^^d1{\'N} 8310 \gdef^^d2{\v N} 8311 \gdef^^d3{\'O} 8312 \gdef^^d4{\^O} 8313 \gdef^^d5{\H O} 8314 \gdef^^d6{\"O} 8315 \gdef^^d7{$\times$} 8316 \gdef^^d8{\v R} 8317 \gdef^^d9{\ringaccent U} 8318 \gdef^^da{\'U} 8319 \gdef^^db{\H U} 8320 \gdef^^dc{\"U} 8321 \gdef^^dd{\'Y} 8322 \gdef^^de{\cedilla T} 8323 \gdef^^df{\ss} 8324 % 8325 \gdef^^e0{\'r} 8326 \gdef^^e1{\'a} 8327 \gdef^^e2{\^a} 8328 \gdef^^e3{\u a} 8329 \gdef^^e4{\"a} 8330 \gdef^^e5{\'l} 8331 \gdef^^e6{\'c} 8332 \gdef^^e7{\cedilla c} 8333 \gdef^^e8{\v c} 8334 \gdef^^e9{\'e} 8335 \gdef^^ea{\ogonek{e}} 8336 \gdef^^eb{\"e} 8337 \gdef^^ec{\v e} 8338 \gdef^^ed{\'\i} 8339 \gdef^^ee{\^\i} 8340 \gdef^^ef{\v d} 8341 % 8342 \gdef^^f0{\dh} 8343 \gdef^^f1{\'n} 8344 \gdef^^f2{\v n} 8345 \gdef^^f3{\'o} 8346 \gdef^^f4{\^o} 8347 \gdef^^f5{\H o} 8348 \gdef^^f6{\"o} 8349 \gdef^^f7{$\div$} 8350 \gdef^^f8{\v r} 8351 \gdef^^f9{\ringaccent u} 8352 \gdef^^fa{\'u} 8353 \gdef^^fb{\H u} 8354 \gdef^^fc{\"u} 8355 \gdef^^fd{\'y} 8356 \gdef^^fe{\cedilla t} 8357 \gdef^^ff{\dotaccent{}} 8358} 8359 8360% UTF-8 character definitions. 8361% 8362% This code to support UTF-8 is based on LaTeX's utf8.def, with some 8363% changes for Texinfo conventions. It is included here under the GPL by 8364% permission from Frank Mittelbach and the LaTeX team. 8365% 8366\newcount\countUTFx 8367\newcount\countUTFy 8368\newcount\countUTFz 8369 8370\gdef\UTFviiiTwoOctets#1#2{\expandafter 8371 \UTFviiiDefined\csname u8:#1\string #2\endcsname} 8372% 8373\gdef\UTFviiiThreeOctets#1#2#3{\expandafter 8374 \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname} 8375% 8376\gdef\UTFviiiFourOctets#1#2#3#4{\expandafter 8377 \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname} 8378 8379\gdef\UTFviiiDefined#1{% 8380 \ifx #1\relax 8381 \message{\linenumber Unicode char \string #1 not defined for Texinfo}% 8382 \else 8383 \expandafter #1% 8384 \fi 8385} 8386 8387\begingroup 8388 \catcode`\~13 8389 \catcode`\"12 8390 8391 \def\UTFviiiLoop{% 8392 \global\catcode\countUTFx\active 8393 \uccode`\~\countUTFx 8394 \uppercase\expandafter{\UTFviiiTmp}% 8395 \advance\countUTFx by 1 8396 \ifnum\countUTFx < \countUTFy 8397 \expandafter\UTFviiiLoop 8398 \fi} 8399 8400 \countUTFx = "C2 8401 \countUTFy = "E0 8402 \def\UTFviiiTmp{% 8403 \xdef~{\noexpand\UTFviiiTwoOctets\string~}} 8404 \UTFviiiLoop 8405 8406 \countUTFx = "E0 8407 \countUTFy = "F0 8408 \def\UTFviiiTmp{% 8409 \xdef~{\noexpand\UTFviiiThreeOctets\string~}} 8410 \UTFviiiLoop 8411 8412 \countUTFx = "F0 8413 \countUTFy = "F4 8414 \def\UTFviiiTmp{% 8415 \xdef~{\noexpand\UTFviiiFourOctets\string~}} 8416 \UTFviiiLoop 8417\endgroup 8418 8419\begingroup 8420 \catcode`\"=12 8421 \catcode`\<=12 8422 \catcode`\.=12 8423 \catcode`\,=12 8424 \catcode`\;=12 8425 \catcode`\!=12 8426 \catcode`\~=13 8427 8428 \gdef\DeclareUnicodeCharacter#1#2{% 8429 \countUTFz = "#1\relax 8430 \wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}% 8431 \begingroup 8432 \parseXMLCharref 8433 \def\UTFviiiTwoOctets##1##2{% 8434 \csname u8:##1\string ##2\endcsname}% 8435 \def\UTFviiiThreeOctets##1##2##3{% 8436 \csname u8:##1\string ##2\string ##3\endcsname}% 8437 \def\UTFviiiFourOctets##1##2##3##4{% 8438 \csname u8:##1\string ##2\string ##3\string ##4\endcsname}% 8439 \expandafter\expandafter\expandafter\expandafter 8440 \expandafter\expandafter\expandafter 8441 \gdef\UTFviiiTmp{#2}% 8442 \endgroup} 8443 8444 \gdef\parseXMLCharref{% 8445 \ifnum\countUTFz < "A0\relax 8446 \errhelp = \EMsimple 8447 \errmessage{Cannot define Unicode char value < 00A0}% 8448 \else\ifnum\countUTFz < "800\relax 8449 \parseUTFviiiA,% 8450 \parseUTFviiiB C\UTFviiiTwoOctets.,% 8451 \else\ifnum\countUTFz < "10000\relax 8452 \parseUTFviiiA;% 8453 \parseUTFviiiA,% 8454 \parseUTFviiiB E\UTFviiiThreeOctets.{,;}% 8455 \else 8456 \parseUTFviiiA;% 8457 \parseUTFviiiA,% 8458 \parseUTFviiiA!% 8459 \parseUTFviiiB F\UTFviiiFourOctets.{!,;}% 8460 \fi\fi\fi 8461 } 8462 8463 \gdef\parseUTFviiiA#1{% 8464 \countUTFx = \countUTFz 8465 \divide\countUTFz by 64 8466 \countUTFy = \countUTFz 8467 \multiply\countUTFz by 64 8468 \advance\countUTFx by -\countUTFz 8469 \advance\countUTFx by 128 8470 \uccode `#1\countUTFx 8471 \countUTFz = \countUTFy} 8472 8473 \gdef\parseUTFviiiB#1#2#3#4{% 8474 \advance\countUTFz by "#10\relax 8475 \uccode `#3\countUTFz 8476 \uppercase{\gdef\UTFviiiTmp{#2#3#4}}} 8477\endgroup 8478 8479\def\utfeightchardefs{% 8480 \DeclareUnicodeCharacter{00A0}{\tie} 8481 \DeclareUnicodeCharacter{00A1}{\exclamdown} 8482 \DeclareUnicodeCharacter{00A3}{\pounds} 8483 \DeclareUnicodeCharacter{00A8}{\"{ }} 8484 \DeclareUnicodeCharacter{00A9}{\copyright} 8485 \DeclareUnicodeCharacter{00AA}{\ordf} 8486 \DeclareUnicodeCharacter{00AB}{\guillemetleft} 8487 \DeclareUnicodeCharacter{00AD}{\-} 8488 \DeclareUnicodeCharacter{00AE}{\registeredsymbol} 8489 \DeclareUnicodeCharacter{00AF}{\={ }} 8490 8491 \DeclareUnicodeCharacter{00B0}{\ringaccent{ }} 8492 \DeclareUnicodeCharacter{00B4}{\'{ }} 8493 \DeclareUnicodeCharacter{00B8}{\cedilla{ }} 8494 \DeclareUnicodeCharacter{00BA}{\ordm} 8495 \DeclareUnicodeCharacter{00BB}{\guillemetright} 8496 \DeclareUnicodeCharacter{00BF}{\questiondown} 8497 8498 \DeclareUnicodeCharacter{00C0}{\`A} 8499 \DeclareUnicodeCharacter{00C1}{\'A} 8500 \DeclareUnicodeCharacter{00C2}{\^A} 8501 \DeclareUnicodeCharacter{00C3}{\~A} 8502 \DeclareUnicodeCharacter{00C4}{\"A} 8503 \DeclareUnicodeCharacter{00C5}{\AA} 8504 \DeclareUnicodeCharacter{00C6}{\AE} 8505 \DeclareUnicodeCharacter{00C7}{\cedilla{C}} 8506 \DeclareUnicodeCharacter{00C8}{\`E} 8507 \DeclareUnicodeCharacter{00C9}{\'E} 8508 \DeclareUnicodeCharacter{00CA}{\^E} 8509 \DeclareUnicodeCharacter{00CB}{\"E} 8510 \DeclareUnicodeCharacter{00CC}{\`I} 8511 \DeclareUnicodeCharacter{00CD}{\'I} 8512 \DeclareUnicodeCharacter{00CE}{\^I} 8513 \DeclareUnicodeCharacter{00CF}{\"I} 8514 8515 \DeclareUnicodeCharacter{00D0}{\DH} 8516 \DeclareUnicodeCharacter{00D1}{\~N} 8517 \DeclareUnicodeCharacter{00D2}{\`O} 8518 \DeclareUnicodeCharacter{00D3}{\'O} 8519 \DeclareUnicodeCharacter{00D4}{\^O} 8520 \DeclareUnicodeCharacter{00D5}{\~O} 8521 \DeclareUnicodeCharacter{00D6}{\"O} 8522 \DeclareUnicodeCharacter{00D8}{\O} 8523 \DeclareUnicodeCharacter{00D9}{\`U} 8524 \DeclareUnicodeCharacter{00DA}{\'U} 8525 \DeclareUnicodeCharacter{00DB}{\^U} 8526 \DeclareUnicodeCharacter{00DC}{\"U} 8527 \DeclareUnicodeCharacter{00DD}{\'Y} 8528 \DeclareUnicodeCharacter{00DE}{\TH} 8529 \DeclareUnicodeCharacter{00DF}{\ss} 8530 8531 \DeclareUnicodeCharacter{00E0}{\`a} 8532 \DeclareUnicodeCharacter{00E1}{\'a} 8533 \DeclareUnicodeCharacter{00E2}{\^a} 8534 \DeclareUnicodeCharacter{00E3}{\~a} 8535 \DeclareUnicodeCharacter{00E4}{\"a} 8536 \DeclareUnicodeCharacter{00E5}{\aa} 8537 \DeclareUnicodeCharacter{00E6}{\ae} 8538 \DeclareUnicodeCharacter{00E7}{\cedilla{c}} 8539 \DeclareUnicodeCharacter{00E8}{\`e} 8540 \DeclareUnicodeCharacter{00E9}{\'e} 8541 \DeclareUnicodeCharacter{00EA}{\^e} 8542 \DeclareUnicodeCharacter{00EB}{\"e} 8543 \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}} 8544 \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}} 8545 \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}} 8546 \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}} 8547 8548 \DeclareUnicodeCharacter{00F0}{\dh} 8549 \DeclareUnicodeCharacter{00F1}{\~n} 8550 \DeclareUnicodeCharacter{00F2}{\`o} 8551 \DeclareUnicodeCharacter{00F3}{\'o} 8552 \DeclareUnicodeCharacter{00F4}{\^o} 8553 \DeclareUnicodeCharacter{00F5}{\~o} 8554 \DeclareUnicodeCharacter{00F6}{\"o} 8555 \DeclareUnicodeCharacter{00F8}{\o} 8556 \DeclareUnicodeCharacter{00F9}{\`u} 8557 \DeclareUnicodeCharacter{00FA}{\'u} 8558 \DeclareUnicodeCharacter{00FB}{\^u} 8559 \DeclareUnicodeCharacter{00FC}{\"u} 8560 \DeclareUnicodeCharacter{00FD}{\'y} 8561 \DeclareUnicodeCharacter{00FE}{\th} 8562 \DeclareUnicodeCharacter{00FF}{\"y} 8563 8564 \DeclareUnicodeCharacter{0100}{\=A} 8565 \DeclareUnicodeCharacter{0101}{\=a} 8566 \DeclareUnicodeCharacter{0102}{\u{A}} 8567 \DeclareUnicodeCharacter{0103}{\u{a}} 8568 \DeclareUnicodeCharacter{0104}{\ogonek{A}} 8569 \DeclareUnicodeCharacter{0105}{\ogonek{a}} 8570 \DeclareUnicodeCharacter{0106}{\'C} 8571 \DeclareUnicodeCharacter{0107}{\'c} 8572 \DeclareUnicodeCharacter{0108}{\^C} 8573 \DeclareUnicodeCharacter{0109}{\^c} 8574 \DeclareUnicodeCharacter{0118}{\ogonek{E}} 8575 \DeclareUnicodeCharacter{0119}{\ogonek{e}} 8576 \DeclareUnicodeCharacter{010A}{\dotaccent{C}} 8577 \DeclareUnicodeCharacter{010B}{\dotaccent{c}} 8578 \DeclareUnicodeCharacter{010C}{\v{C}} 8579 \DeclareUnicodeCharacter{010D}{\v{c}} 8580 \DeclareUnicodeCharacter{010E}{\v{D}} 8581 8582 \DeclareUnicodeCharacter{0112}{\=E} 8583 \DeclareUnicodeCharacter{0113}{\=e} 8584 \DeclareUnicodeCharacter{0114}{\u{E}} 8585 \DeclareUnicodeCharacter{0115}{\u{e}} 8586 \DeclareUnicodeCharacter{0116}{\dotaccent{E}} 8587 \DeclareUnicodeCharacter{0117}{\dotaccent{e}} 8588 \DeclareUnicodeCharacter{011A}{\v{E}} 8589 \DeclareUnicodeCharacter{011B}{\v{e}} 8590 \DeclareUnicodeCharacter{011C}{\^G} 8591 \DeclareUnicodeCharacter{011D}{\^g} 8592 \DeclareUnicodeCharacter{011E}{\u{G}} 8593 \DeclareUnicodeCharacter{011F}{\u{g}} 8594 8595 \DeclareUnicodeCharacter{0120}{\dotaccent{G}} 8596 \DeclareUnicodeCharacter{0121}{\dotaccent{g}} 8597 \DeclareUnicodeCharacter{0124}{\^H} 8598 \DeclareUnicodeCharacter{0125}{\^h} 8599 \DeclareUnicodeCharacter{0128}{\~I} 8600 \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}} 8601 \DeclareUnicodeCharacter{012A}{\=I} 8602 \DeclareUnicodeCharacter{012B}{\={\dotless{i}}} 8603 \DeclareUnicodeCharacter{012C}{\u{I}} 8604 \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}} 8605 8606 \DeclareUnicodeCharacter{0130}{\dotaccent{I}} 8607 \DeclareUnicodeCharacter{0131}{\dotless{i}} 8608 \DeclareUnicodeCharacter{0132}{IJ} 8609 \DeclareUnicodeCharacter{0133}{ij} 8610 \DeclareUnicodeCharacter{0134}{\^J} 8611 \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}} 8612 \DeclareUnicodeCharacter{0139}{\'L} 8613 \DeclareUnicodeCharacter{013A}{\'l} 8614 8615 \DeclareUnicodeCharacter{0141}{\L} 8616 \DeclareUnicodeCharacter{0142}{\l} 8617 \DeclareUnicodeCharacter{0143}{\'N} 8618 \DeclareUnicodeCharacter{0144}{\'n} 8619 \DeclareUnicodeCharacter{0147}{\v{N}} 8620 \DeclareUnicodeCharacter{0148}{\v{n}} 8621 \DeclareUnicodeCharacter{014C}{\=O} 8622 \DeclareUnicodeCharacter{014D}{\=o} 8623 \DeclareUnicodeCharacter{014E}{\u{O}} 8624 \DeclareUnicodeCharacter{014F}{\u{o}} 8625 8626 \DeclareUnicodeCharacter{0150}{\H{O}} 8627 \DeclareUnicodeCharacter{0151}{\H{o}} 8628 \DeclareUnicodeCharacter{0152}{\OE} 8629 \DeclareUnicodeCharacter{0153}{\oe} 8630 \DeclareUnicodeCharacter{0154}{\'R} 8631 \DeclareUnicodeCharacter{0155}{\'r} 8632 \DeclareUnicodeCharacter{0158}{\v{R}} 8633 \DeclareUnicodeCharacter{0159}{\v{r}} 8634 \DeclareUnicodeCharacter{015A}{\'S} 8635 \DeclareUnicodeCharacter{015B}{\'s} 8636 \DeclareUnicodeCharacter{015C}{\^S} 8637 \DeclareUnicodeCharacter{015D}{\^s} 8638 \DeclareUnicodeCharacter{015E}{\cedilla{S}} 8639 \DeclareUnicodeCharacter{015F}{\cedilla{s}} 8640 8641 \DeclareUnicodeCharacter{0160}{\v{S}} 8642 \DeclareUnicodeCharacter{0161}{\v{s}} 8643 \DeclareUnicodeCharacter{0162}{\cedilla{t}} 8644 \DeclareUnicodeCharacter{0163}{\cedilla{T}} 8645 \DeclareUnicodeCharacter{0164}{\v{T}} 8646 8647 \DeclareUnicodeCharacter{0168}{\~U} 8648 \DeclareUnicodeCharacter{0169}{\~u} 8649 \DeclareUnicodeCharacter{016A}{\=U} 8650 \DeclareUnicodeCharacter{016B}{\=u} 8651 \DeclareUnicodeCharacter{016C}{\u{U}} 8652 \DeclareUnicodeCharacter{016D}{\u{u}} 8653 \DeclareUnicodeCharacter{016E}{\ringaccent{U}} 8654 \DeclareUnicodeCharacter{016F}{\ringaccent{u}} 8655 8656 \DeclareUnicodeCharacter{0170}{\H{U}} 8657 \DeclareUnicodeCharacter{0171}{\H{u}} 8658 \DeclareUnicodeCharacter{0174}{\^W} 8659 \DeclareUnicodeCharacter{0175}{\^w} 8660 \DeclareUnicodeCharacter{0176}{\^Y} 8661 \DeclareUnicodeCharacter{0177}{\^y} 8662 \DeclareUnicodeCharacter{0178}{\"Y} 8663 \DeclareUnicodeCharacter{0179}{\'Z} 8664 \DeclareUnicodeCharacter{017A}{\'z} 8665 \DeclareUnicodeCharacter{017B}{\dotaccent{Z}} 8666 \DeclareUnicodeCharacter{017C}{\dotaccent{z}} 8667 \DeclareUnicodeCharacter{017D}{\v{Z}} 8668 \DeclareUnicodeCharacter{017E}{\v{z}} 8669 8670 \DeclareUnicodeCharacter{01C4}{D\v{Z}} 8671 \DeclareUnicodeCharacter{01C5}{D\v{z}} 8672 \DeclareUnicodeCharacter{01C6}{d\v{z}} 8673 \DeclareUnicodeCharacter{01C7}{LJ} 8674 \DeclareUnicodeCharacter{01C8}{Lj} 8675 \DeclareUnicodeCharacter{01C9}{lj} 8676 \DeclareUnicodeCharacter{01CA}{NJ} 8677 \DeclareUnicodeCharacter{01CB}{Nj} 8678 \DeclareUnicodeCharacter{01CC}{nj} 8679 \DeclareUnicodeCharacter{01CD}{\v{A}} 8680 \DeclareUnicodeCharacter{01CE}{\v{a}} 8681 \DeclareUnicodeCharacter{01CF}{\v{I}} 8682 8683 \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}} 8684 \DeclareUnicodeCharacter{01D1}{\v{O}} 8685 \DeclareUnicodeCharacter{01D2}{\v{o}} 8686 \DeclareUnicodeCharacter{01D3}{\v{U}} 8687 \DeclareUnicodeCharacter{01D4}{\v{u}} 8688 8689 \DeclareUnicodeCharacter{01E2}{\={\AE}} 8690 \DeclareUnicodeCharacter{01E3}{\={\ae}} 8691 \DeclareUnicodeCharacter{01E6}{\v{G}} 8692 \DeclareUnicodeCharacter{01E7}{\v{g}} 8693 \DeclareUnicodeCharacter{01E8}{\v{K}} 8694 \DeclareUnicodeCharacter{01E9}{\v{k}} 8695 8696 \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}} 8697 \DeclareUnicodeCharacter{01F1}{DZ} 8698 \DeclareUnicodeCharacter{01F2}{Dz} 8699 \DeclareUnicodeCharacter{01F3}{dz} 8700 \DeclareUnicodeCharacter{01F4}{\'G} 8701 \DeclareUnicodeCharacter{01F5}{\'g} 8702 \DeclareUnicodeCharacter{01F8}{\`N} 8703 \DeclareUnicodeCharacter{01F9}{\`n} 8704 \DeclareUnicodeCharacter{01FC}{\'{\AE}} 8705 \DeclareUnicodeCharacter{01FD}{\'{\ae}} 8706 \DeclareUnicodeCharacter{01FE}{\'{\O}} 8707 \DeclareUnicodeCharacter{01FF}{\'{\o}} 8708 8709 \DeclareUnicodeCharacter{021E}{\v{H}} 8710 \DeclareUnicodeCharacter{021F}{\v{h}} 8711 8712 \DeclareUnicodeCharacter{0226}{\dotaccent{A}} 8713 \DeclareUnicodeCharacter{0227}{\dotaccent{a}} 8714 \DeclareUnicodeCharacter{0228}{\cedilla{E}} 8715 \DeclareUnicodeCharacter{0229}{\cedilla{e}} 8716 \DeclareUnicodeCharacter{022E}{\dotaccent{O}} 8717 \DeclareUnicodeCharacter{022F}{\dotaccent{o}} 8718 8719 \DeclareUnicodeCharacter{0232}{\=Y} 8720 \DeclareUnicodeCharacter{0233}{\=y} 8721 \DeclareUnicodeCharacter{0237}{\dotless{j}} 8722 8723 \DeclareUnicodeCharacter{02DB}{\ogonek{ }} 8724 8725 \DeclareUnicodeCharacter{1E02}{\dotaccent{B}} 8726 \DeclareUnicodeCharacter{1E03}{\dotaccent{b}} 8727 \DeclareUnicodeCharacter{1E04}{\udotaccent{B}} 8728 \DeclareUnicodeCharacter{1E05}{\udotaccent{b}} 8729 \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}} 8730 \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}} 8731 \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}} 8732 \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}} 8733 \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}} 8734 \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}} 8735 \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}} 8736 \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}} 8737 8738 \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}} 8739 \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}} 8740 8741 \DeclareUnicodeCharacter{1E20}{\=G} 8742 \DeclareUnicodeCharacter{1E21}{\=g} 8743 \DeclareUnicodeCharacter{1E22}{\dotaccent{H}} 8744 \DeclareUnicodeCharacter{1E23}{\dotaccent{h}} 8745 \DeclareUnicodeCharacter{1E24}{\udotaccent{H}} 8746 \DeclareUnicodeCharacter{1E25}{\udotaccent{h}} 8747 \DeclareUnicodeCharacter{1E26}{\"H} 8748 \DeclareUnicodeCharacter{1E27}{\"h} 8749 8750 \DeclareUnicodeCharacter{1E30}{\'K} 8751 \DeclareUnicodeCharacter{1E31}{\'k} 8752 \DeclareUnicodeCharacter{1E32}{\udotaccent{K}} 8753 \DeclareUnicodeCharacter{1E33}{\udotaccent{k}} 8754 \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}} 8755 \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}} 8756 \DeclareUnicodeCharacter{1E36}{\udotaccent{L}} 8757 \DeclareUnicodeCharacter{1E37}{\udotaccent{l}} 8758 \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}} 8759 \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}} 8760 \DeclareUnicodeCharacter{1E3E}{\'M} 8761 \DeclareUnicodeCharacter{1E3F}{\'m} 8762 8763 \DeclareUnicodeCharacter{1E40}{\dotaccent{M}} 8764 \DeclareUnicodeCharacter{1E41}{\dotaccent{m}} 8765 \DeclareUnicodeCharacter{1E42}{\udotaccent{M}} 8766 \DeclareUnicodeCharacter{1E43}{\udotaccent{m}} 8767 \DeclareUnicodeCharacter{1E44}{\dotaccent{N}} 8768 \DeclareUnicodeCharacter{1E45}{\dotaccent{n}} 8769 \DeclareUnicodeCharacter{1E46}{\udotaccent{N}} 8770 \DeclareUnicodeCharacter{1E47}{\udotaccent{n}} 8771 \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}} 8772 \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}} 8773 8774 \DeclareUnicodeCharacter{1E54}{\'P} 8775 \DeclareUnicodeCharacter{1E55}{\'p} 8776 \DeclareUnicodeCharacter{1E56}{\dotaccent{P}} 8777 \DeclareUnicodeCharacter{1E57}{\dotaccent{p}} 8778 \DeclareUnicodeCharacter{1E58}{\dotaccent{R}} 8779 \DeclareUnicodeCharacter{1E59}{\dotaccent{r}} 8780 \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}} 8781 \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}} 8782 \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}} 8783 \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}} 8784 8785 \DeclareUnicodeCharacter{1E60}{\dotaccent{S}} 8786 \DeclareUnicodeCharacter{1E61}{\dotaccent{s}} 8787 \DeclareUnicodeCharacter{1E62}{\udotaccent{S}} 8788 \DeclareUnicodeCharacter{1E63}{\udotaccent{s}} 8789 \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}} 8790 \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}} 8791 \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}} 8792 \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}} 8793 \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}} 8794 \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}} 8795 8796 \DeclareUnicodeCharacter{1E7C}{\~V} 8797 \DeclareUnicodeCharacter{1E7D}{\~v} 8798 \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}} 8799 \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}} 8800 8801 \DeclareUnicodeCharacter{1E80}{\`W} 8802 \DeclareUnicodeCharacter{1E81}{\`w} 8803 \DeclareUnicodeCharacter{1E82}{\'W} 8804 \DeclareUnicodeCharacter{1E83}{\'w} 8805 \DeclareUnicodeCharacter{1E84}{\"W} 8806 \DeclareUnicodeCharacter{1E85}{\"w} 8807 \DeclareUnicodeCharacter{1E86}{\dotaccent{W}} 8808 \DeclareUnicodeCharacter{1E87}{\dotaccent{w}} 8809 \DeclareUnicodeCharacter{1E88}{\udotaccent{W}} 8810 \DeclareUnicodeCharacter{1E89}{\udotaccent{w}} 8811 \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}} 8812 \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}} 8813 \DeclareUnicodeCharacter{1E8C}{\"X} 8814 \DeclareUnicodeCharacter{1E8D}{\"x} 8815 \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}} 8816 \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}} 8817 8818 \DeclareUnicodeCharacter{1E90}{\^Z} 8819 \DeclareUnicodeCharacter{1E91}{\^z} 8820 \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}} 8821 \DeclareUnicodeCharacter{1E93}{\udotaccent{z}} 8822 \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}} 8823 \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}} 8824 \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}} 8825 \DeclareUnicodeCharacter{1E97}{\"t} 8826 \DeclareUnicodeCharacter{1E98}{\ringaccent{w}} 8827 \DeclareUnicodeCharacter{1E99}{\ringaccent{y}} 8828 8829 \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}} 8830 \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}} 8831 8832 \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}} 8833 \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}} 8834 \DeclareUnicodeCharacter{1EBC}{\~E} 8835 \DeclareUnicodeCharacter{1EBD}{\~e} 8836 8837 \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}} 8838 \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}} 8839 \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}} 8840 \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}} 8841 8842 \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}} 8843 \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}} 8844 8845 \DeclareUnicodeCharacter{1EF2}{\`Y} 8846 \DeclareUnicodeCharacter{1EF3}{\`y} 8847 \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}} 8848 8849 \DeclareUnicodeCharacter{1EF8}{\~Y} 8850 \DeclareUnicodeCharacter{1EF9}{\~y} 8851 8852 \DeclareUnicodeCharacter{2013}{--} 8853 \DeclareUnicodeCharacter{2014}{---} 8854 \DeclareUnicodeCharacter{2018}{\quoteleft} 8855 \DeclareUnicodeCharacter{2019}{\quoteright} 8856 \DeclareUnicodeCharacter{201A}{\quotesinglbase} 8857 \DeclareUnicodeCharacter{201C}{\quotedblleft} 8858 \DeclareUnicodeCharacter{201D}{\quotedblright} 8859 \DeclareUnicodeCharacter{201E}{\quotedblbase} 8860 \DeclareUnicodeCharacter{2022}{\bullet} 8861 \DeclareUnicodeCharacter{2026}{\dots} 8862 \DeclareUnicodeCharacter{2039}{\guilsinglleft} 8863 \DeclareUnicodeCharacter{203A}{\guilsinglright} 8864 \DeclareUnicodeCharacter{20AC}{\euro} 8865 8866 \DeclareUnicodeCharacter{2192}{\expansion} 8867 \DeclareUnicodeCharacter{21D2}{\result} 8868 8869 \DeclareUnicodeCharacter{2212}{\minus} 8870 \DeclareUnicodeCharacter{2217}{\point} 8871 \DeclareUnicodeCharacter{2261}{\equiv} 8872}% end of \utfeightchardefs 8873 8874 8875% US-ASCII character definitions. 8876\def\asciichardefs{% nothing need be done 8877 \relax 8878} 8879 8880% Make non-ASCII characters printable again for compatibility with 8881% existing Texinfo documents that may use them, even without declaring a 8882% document encoding. 8883% 8884\setnonasciicharscatcode \other 8885 8886 8887\message{formatting,} 8888 8889\newdimen\defaultparindent \defaultparindent = 15pt 8890 8891\chapheadingskip = 15pt plus 4pt minus 2pt 8892\secheadingskip = 12pt plus 3pt minus 2pt 8893\subsecheadingskip = 9pt plus 2pt minus 2pt 8894 8895% Prevent underfull vbox error messages. 8896\vbadness = 10000 8897 8898% Don't be so finicky about underfull hboxes, either. 8899\hbadness = 2000 8900 8901% Following George Bush, get rid of widows and orphans. 8902\widowpenalty=10000 8903\clubpenalty=10000 8904 8905% Use TeX 3.0's \emergencystretch to help line breaking, but if we're 8906% using an old version of TeX, don't do anything. We want the amount of 8907% stretch added to depend on the line length, hence the dependence on 8908% \hsize. We call this whenever the paper size is set. 8909% 8910\def\setemergencystretch{% 8911 \ifx\emergencystretch\thisisundefined 8912 % Allow us to assign to \emergencystretch anyway. 8913 \def\emergencystretch{\dimen0}% 8914 \else 8915 \emergencystretch = .15\hsize 8916 \fi 8917} 8918 8919% Parameters in order: 1) textheight; 2) textwidth; 8920% 3) voffset; 4) hoffset; 5) binding offset; 6) topskip; 8921% 7) physical page height; 8) physical page width. 8922% 8923% We also call \setleading{\textleading}, so the caller should define 8924% \textleading. The caller should also set \parskip. 8925% 8926\def\internalpagesizes#1#2#3#4#5#6#7#8{% 8927 \voffset = #3\relax 8928 \topskip = #6\relax 8929 \splittopskip = \topskip 8930 % 8931 \vsize = #1\relax 8932 \advance\vsize by \topskip 8933 \outervsize = \vsize 8934 \advance\outervsize by 2\topandbottommargin 8935 \pageheight = \vsize 8936 % 8937 \hsize = #2\relax 8938 \outerhsize = \hsize 8939 \advance\outerhsize by 0.5in 8940 \pagewidth = \hsize 8941 % 8942 \normaloffset = #4\relax 8943 \bindingoffset = #5\relax 8944 % 8945 \ifpdf 8946 \pdfpageheight #7\relax 8947 \pdfpagewidth #8\relax 8948 % if we don't reset these, they will remain at "1 true in" of 8949 % whatever layout pdftex was dumped with. 8950 \pdfhorigin = 1 true in 8951 \pdfvorigin = 1 true in 8952 \fi 8953 % 8954 \setleading{\textleading} 8955 % 8956 \parindent = \defaultparindent 8957 \setemergencystretch 8958} 8959 8960% @letterpaper (the default). 8961\def\letterpaper{{\globaldefs = 1 8962 \parskip = 3pt plus 2pt minus 1pt 8963 \textleading = 13.2pt 8964 % 8965 % If page is nothing but text, make it come out even. 8966 \internalpagesizes{607.2pt}{6in}% that's 46 lines 8967 {\voffset}{.25in}% 8968 {\bindingoffset}{36pt}% 8969 {11in}{8.5in}% 8970}} 8971 8972% Use @smallbook to reset parameters for 7x9.25 trim size. 8973\def\smallbook{{\globaldefs = 1 8974 \parskip = 2pt plus 1pt 8975 \textleading = 12pt 8976 % 8977 \internalpagesizes{7.5in}{5in}% 8978 {-.2in}{0in}% 8979 {\bindingoffset}{16pt}% 8980 {9.25in}{7in}% 8981 % 8982 \lispnarrowing = 0.3in 8983 \tolerance = 700 8984 \hfuzz = 1pt 8985 \contentsrightmargin = 0pt 8986 \defbodyindent = .5cm 8987}} 8988 8989% Use @smallerbook to reset parameters for 6x9 trim size. 8990% (Just testing, parameters still in flux.) 8991\def\smallerbook{{\globaldefs = 1 8992 \parskip = 1.5pt plus 1pt 8993 \textleading = 12pt 8994 % 8995 \internalpagesizes{7.4in}{4.8in}% 8996 {-.2in}{-.4in}% 8997 {0pt}{14pt}% 8998 {9in}{6in}% 8999 % 9000 \lispnarrowing = 0.25in 9001 \tolerance = 700 9002 \hfuzz = 1pt 9003 \contentsrightmargin = 0pt 9004 \defbodyindent = .4cm 9005}} 9006 9007% Use @afourpaper to print on European A4 paper. 9008\def\afourpaper{{\globaldefs = 1 9009 \parskip = 3pt plus 2pt minus 1pt 9010 \textleading = 13.2pt 9011 % 9012 % Double-side printing via postscript on Laserjet 4050 9013 % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm. 9014 % To change the settings for a different printer or situation, adjust 9015 % \normaloffset until the front-side and back-side texts align. Then 9016 % do the same for \bindingoffset. You can set these for testing in 9017 % your texinfo source file like this: 9018 % @tex 9019 % \global\normaloffset = -6mm 9020 % \global\bindingoffset = 10mm 9021 % @end tex 9022 \internalpagesizes{673.2pt}{160mm}% that's 51 lines 9023 {\voffset}{\hoffset}% 9024 {\bindingoffset}{44pt}% 9025 {297mm}{210mm}% 9026 % 9027 \tolerance = 700 9028 \hfuzz = 1pt 9029 \contentsrightmargin = 0pt 9030 \defbodyindent = 5mm 9031}} 9032 9033% Use @afivepaper to print on European A5 paper. 9034% From romildo@urano.iceb.ufop.br, 2 July 2000. 9035% He also recommends making @example and @lisp be small. 9036\def\afivepaper{{\globaldefs = 1 9037 \parskip = 2pt plus 1pt minus 0.1pt 9038 \textleading = 12.5pt 9039 % 9040 \internalpagesizes{160mm}{120mm}% 9041 {\voffset}{\hoffset}% 9042 {\bindingoffset}{8pt}% 9043 {210mm}{148mm}% 9044 % 9045 \lispnarrowing = 0.2in 9046 \tolerance = 800 9047 \hfuzz = 1.2pt 9048 \contentsrightmargin = 0pt 9049 \defbodyindent = 2mm 9050 \tableindent = 12mm 9051}} 9052 9053% A specific text layout, 24x15cm overall, intended for A4 paper. 9054\def\afourlatex{{\globaldefs = 1 9055 \afourpaper 9056 \internalpagesizes{237mm}{150mm}% 9057 {\voffset}{4.6mm}% 9058 {\bindingoffset}{7mm}% 9059 {297mm}{210mm}% 9060 % 9061 % Must explicitly reset to 0 because we call \afourpaper. 9062 \globaldefs = 0 9063}} 9064 9065% Use @afourwide to print on A4 paper in landscape format. 9066\def\afourwide{{\globaldefs = 1 9067 \afourpaper 9068 \internalpagesizes{241mm}{165mm}% 9069 {\voffset}{-2.95mm}% 9070 {\bindingoffset}{7mm}% 9071 {297mm}{210mm}% 9072 \globaldefs = 0 9073}} 9074 9075% @pagesizes TEXTHEIGHT[,TEXTWIDTH] 9076% Perhaps we should allow setting the margins, \topskip, \parskip, 9077% and/or leading, also. Or perhaps we should compute them somehow. 9078% 9079\parseargdef\pagesizes{\pagesizesyyy #1,,\finish} 9080\def\pagesizesyyy#1,#2,#3\finish{{% 9081 \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi 9082 \globaldefs = 1 9083 % 9084 \parskip = 3pt plus 2pt minus 1pt 9085 \setleading{\textleading}% 9086 % 9087 \dimen0 = #1\relax 9088 \advance\dimen0 by \voffset 9089 % 9090 \dimen2 = \hsize 9091 \advance\dimen2 by \normaloffset 9092 % 9093 \internalpagesizes{#1}{\hsize}% 9094 {\voffset}{\normaloffset}% 9095 {\bindingoffset}{44pt}% 9096 {\dimen0}{\dimen2}% 9097}} 9098 9099% Set default to letter. 9100% 9101\letterpaper 9102 9103 9104\message{and turning on texinfo input format.} 9105 9106% DEL is a comment character, in case @c does not suffice. 9107\catcode`\^^? = 14 9108 9109% Define macros to output various characters with catcode for normal text. 9110\catcode`\"=\other 9111\catcode`\~=\other 9112\catcode`\^=\other 9113\catcode`\_=\other 9114\catcode`\|=\other 9115\catcode`\<=\other 9116\catcode`\>=\other 9117\catcode`\+=\other 9118\catcode`\$=\other 9119\def\normaldoublequote{"} 9120\def\normaltilde{~} 9121\def\normalcaret{^} 9122\def\normalunderscore{_} 9123\def\normalverticalbar{|} 9124\def\normalless{<} 9125\def\normalgreater{>} 9126\def\normalplus{+} 9127\def\normaldollar{$}%$ font-lock fix 9128 9129% This macro is used to make a character print one way in \tt 9130% (where it can probably be output as-is), and another way in other fonts, 9131% where something hairier probably needs to be done. 9132% 9133% #1 is what to print if we are indeed using \tt; #2 is what to print 9134% otherwise. Since all the Computer Modern typewriter fonts have zero 9135% interword stretch (and shrink), and it is reasonable to expect all 9136% typewriter fonts to have this, we can check that font parameter. 9137% 9138\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi} 9139 9140% Same as above, but check for italic font. Actually this also catches 9141% non-italic slanted fonts since it is impossible to distinguish them from 9142% italic fonts. But since this is only used by $ and it uses \sl anyway 9143% this is not a problem. 9144\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi} 9145 9146% Turn off all special characters except @ 9147% (and those which the user can use as if they were ordinary). 9148% Most of these we simply print from the \tt font, but for some, we can 9149% use math or other variants that look better in normal text. 9150 9151\catcode`\"=\active 9152\def\activedoublequote{{\tt\char34}} 9153\let"=\activedoublequote 9154\catcode`\~=\active 9155\def~{{\tt\char126}} 9156\chardef\hat=`\^ 9157\catcode`\^=\active 9158\def^{{\tt \hat}} 9159 9160\catcode`\_=\active 9161\def_{\ifusingtt\normalunderscore\_} 9162\let\realunder=_ 9163% Subroutine for the previous macro. 9164\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em } 9165 9166\catcode`\|=\active 9167\def|{{\tt\char124}} 9168\chardef \less=`\< 9169\catcode`\<=\active 9170\def<{{\tt \less}} 9171\chardef \gtr=`\> 9172\catcode`\>=\active 9173\def>{{\tt \gtr}} 9174\catcode`\+=\active 9175\def+{{\tt \char 43}} 9176\catcode`\$=\active 9177\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix 9178 9179% If a .fmt file is being used, characters that might appear in a file 9180% name cannot be active until we have parsed the command line. 9181% So turn them off again, and have \everyjob (or @setfilename) turn them on. 9182% \otherifyactive is called near the end of this file. 9183\def\otherifyactive{\catcode`+=\other \catcode`\_=\other} 9184 9185% Used sometimes to turn off (effectively) the active characters even after 9186% parsing them. 9187\def\turnoffactive{% 9188 \normalturnoffactive 9189 \otherbackslash 9190} 9191 9192\catcode`\@=0 9193 9194% \backslashcurfont outputs one backslash character in current font, 9195% as in \char`\\. 9196\global\chardef\backslashcurfont=`\\ 9197\global\let\rawbackslashxx=\backslashcurfont % let existing .??s files work 9198 9199% \realbackslash is an actual character `\' with catcode other, and 9200% \doublebackslash is two of them (for the pdf outlines). 9201{\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}} 9202 9203% In texinfo, backslash is an active character; it prints the backslash 9204% in fixed width font. 9205\catcode`\\=\active 9206@def@normalbackslash{{@tt@backslashcurfont}} 9207% On startup, @fixbackslash assigns: 9208% @let \ = @normalbackslash 9209 9210% \rawbackslash defines an active \ to do \backslashcurfont. 9211% \otherbackslash defines an active \ to be a literal `\' character with 9212% catcode other. 9213@gdef@rawbackslash{@let\=@backslashcurfont} 9214@gdef@otherbackslash{@let\=@realbackslash} 9215 9216% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of 9217% the literal character `\'. 9218% 9219@def@normalturnoffactive{% 9220 @let\=@normalbackslash 9221 @let"=@normaldoublequote 9222 @let~=@normaltilde 9223 @let^=@normalcaret 9224 @let_=@normalunderscore 9225 @let|=@normalverticalbar 9226 @let<=@normalless 9227 @let>=@normalgreater 9228 @let+=@normalplus 9229 @let$=@normaldollar %$ font-lock fix 9230 @markupsetuplqdefault 9231 @markupsetuprqdefault 9232 @unsepspaces 9233} 9234 9235% Make _ and + \other characters, temporarily. 9236% This is canceled by @fixbackslash. 9237@otherifyactive 9238 9239% If a .fmt file is being used, we don't want the `\input texinfo' to show up. 9240% That is what \eatinput is for; after that, the `\' should revert to printing 9241% a backslash. 9242% 9243@gdef@eatinput input texinfo{@fixbackslash} 9244@global@let\ = @eatinput 9245 9246% On the other hand, perhaps the file did not have a `\input texinfo'. Then 9247% the first `\' in the file would cause an error. This macro tries to fix 9248% that, assuming it is called before the first `\' could plausibly occur. 9249% Also turn back on active characters that might appear in the input 9250% file name, in case not using a pre-dumped format. 9251% 9252@gdef@fixbackslash{% 9253 @ifx\@eatinput @let\ = @normalbackslash @fi 9254 @catcode`+=@active 9255 @catcode`@_=@active 9256} 9257 9258% Say @foo, not \foo, in error messages. 9259@escapechar = `@@ 9260 9261% These look ok in all fonts, so just make them not special. 9262@catcode`@& = @other 9263@catcode`@# = @other 9264@catcode`@% = @other 9265 9266@c Finally, make ` and ' active, so that txicodequoteundirected and 9267@c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}. If we 9268@c don't make ` and ' active, @code will not get them as active chars. 9269@c Do this last of all since we use ` in the previous @catcode assignments. 9270@catcode`@'=@active 9271@catcode`@`=@active 9272@markupsetuplqdefault 9273@markupsetuprqdefault 9274 9275@c Gnulib now utterly and painfully insists on no trailing whitespace. 9276@c So we have to nuke it. 9277 9278@c Local variables: 9279@c eval: (add-hook 'write-file-hooks 'time-stamp) 9280@c eval: (add-hook 'write-file-hooks 'nuke-trailing-whitespace) 9281@c page-delimiter: "^\\\\message" 9282@c time-stamp-start: "def\\\\texinfoversion{" 9283@c time-stamp-format: "%:y-%02m-%02d.%02H" 9284@c time-stamp-end: "}" 9285@c End: 9286 9287@c vim:sw=2: 9288 9289@ignore 9290 arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115 9291@end ignore 9292