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