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