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-03.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 \jobname.toc 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 \def\tempa{{\rm }}% 4305 \def\tempb{#1}% 4306 \edef\tempc{\tempa}% 4307 \edef\tempd{\tempb}% 4308 \ifx\tempc\tempd 4309 \ % 4310 \else 4311 % 4312 % If we must, put the page number on a line of its own, and fill out 4313 % this line with blank space. (The \hfil is overwhelmed with the 4314 % fill leaders glue in \indexdotfill if the page number does fit.) 4315 \hfil\penalty50 4316 \null\nobreak\indexdotfill % Have leaders before the page number. 4317 % 4318 % The `\ ' here is removed by the implicit \unskip that TeX does as 4319 % part of (the primitive) \par. Without it, a spurious underfull 4320 % \hbox ensues. 4321 \ifpdf 4322 \pdfgettoks#1.% 4323 \ \the\toksA 4324 \else 4325 \ #1% 4326 \fi 4327 \fi 4328 \par 4329 \endgroup 4330} 4331 4332% Like plain.tex's \dotfill, except uses up at least 1 em. 4333\def\indexdotfill{\cleaders 4334 \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1fill} 4335 4336\def\primary #1{\line{#1\hfil}} 4337 4338\newskip\secondaryindent \secondaryindent=0.5cm 4339\def\secondary#1#2{{% 4340 \parfillskip=0in 4341 \parskip=0in 4342 \hangindent=1in 4343 \hangafter=1 4344 \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill 4345 \ifpdf 4346 \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. 4347 \else 4348 #2 4349 \fi 4350 \par 4351}} 4352 4353% Define two-column mode, which we use to typeset indexes. 4354% Adapted from the TeXbook, page 416, which is to say, 4355% the manmac.tex format used to print the TeXbook itself. 4356\catcode`\@=11 4357 4358\newbox\partialpage 4359\newdimen\doublecolumnhsize 4360 4361\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns 4362 % Grab any single-column material above us. 4363 \output = {% 4364 % 4365 % Here is a possibility not foreseen in manmac: if we accumulate a 4366 % whole lot of material, we might end up calling this \output 4367 % routine twice in a row (see the doublecol-lose test, which is 4368 % essentially a couple of indexes with @setchapternewpage off). In 4369 % that case we just ship out what is in \partialpage with the normal 4370 % output routine. Generally, \partialpage will be empty when this 4371 % runs and this will be a no-op. See the indexspread.tex test case. 4372 \ifvoid\partialpage \else 4373 \onepageout{\pagecontents\partialpage}% 4374 \fi 4375 % 4376 \global\setbox\partialpage = \vbox{% 4377 % Unvbox the main output page. 4378 \unvbox\PAGE 4379 \kern-\topskip \kern\baselineskip 4380 }% 4381 }% 4382 \eject % run that output routine to set \partialpage 4383 % 4384 % Use the double-column output routine for subsequent pages. 4385 \output = {\doublecolumnout}% 4386 % 4387 % Change the page size parameters. We could do this once outside this 4388 % routine, in each of @smallbook, @afourpaper, and the default 8.5x11 4389 % format, but then we repeat the same computation. Repeating a couple 4390 % of assignments once per index is clearly meaningless for the 4391 % execution time, so we may as well do it in one place. 4392 % 4393 % First we halve the line length, less a little for the gutter between 4394 % the columns. We compute the gutter based on the line length, so it 4395 % changes automatically with the paper format. The magic constant 4396 % below is chosen so that the gutter has the same value (well, +-<1pt) 4397 % as it did when we hard-coded it. 4398 % 4399 % We put the result in a separate register, \doublecolumhsize, so we 4400 % can restore it in \pagesofar, after \hsize itself has (potentially) 4401 % been clobbered. 4402 % 4403 \doublecolumnhsize = \hsize 4404 \advance\doublecolumnhsize by -.04154\hsize 4405 \divide\doublecolumnhsize by 2 4406 \hsize = \doublecolumnhsize 4407 % 4408 % Double the \vsize as well. (We don't need a separate register here, 4409 % since nobody clobbers \vsize.) 4410 \vsize = 2\vsize 4411} 4412 4413% The double-column output routine for all double-column pages except 4414% the last. 4415% 4416\def\doublecolumnout{% 4417 \splittopskip=\topskip \splitmaxdepth=\maxdepth 4418 % Get the available space for the double columns -- the normal 4419 % (undoubled) page height minus any material left over from the 4420 % previous page. 4421 \dimen@ = \vsize 4422 \divide\dimen@ by 2 4423 \advance\dimen@ by -\ht\partialpage 4424 % 4425 % box0 will be the left-hand column, box2 the right. 4426 \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ 4427 \onepageout\pagesofar 4428 \unvbox255 4429 \penalty\outputpenalty 4430} 4431% 4432% Re-output the contents of the output page -- any previous material, 4433% followed by the two boxes we just split, in box0 and box2. 4434\def\pagesofar{% 4435 \unvbox\partialpage 4436 % 4437 \hsize = \doublecolumnhsize 4438 \wd0=\hsize \wd2=\hsize 4439 \hbox to\pagewidth{\box0\hfil\box2}% 4440} 4441% 4442% All done with double columns. 4443\def\enddoublecolumns{% 4444 % The following penalty ensures that the page builder is exercised 4445 % _before_ we change the output routine. This is necessary in the 4446 % following situation: 4447 % 4448 % The last section of the index consists only of a single entry. 4449 % Before this section, \pagetotal is less than \pagegoal, so no 4450 % break occurs before the last section starts. However, the last 4451 % section, consisting of \initial and the single \entry, does not 4452 % fit on the page and has to be broken off. Without the following 4453 % penalty the page builder will not be exercised until \eject 4454 % below, and by that time we'll already have changed the output 4455 % routine to the \balancecolumns version, so the next-to-last 4456 % double-column page will be processed with \balancecolumns, which 4457 % is wrong: The two columns will go to the main vertical list, with 4458 % the broken-off section in the recent contributions. As soon as 4459 % the output routine finishes, TeX starts reconsidering the page 4460 % break. The two columns and the broken-off section both fit on the 4461 % page, because the two columns now take up only half of the page 4462 % goal. When TeX sees \eject from below which follows the final 4463 % section, it invokes the new output routine that we've set after 4464 % \balancecolumns below; \onepageout will try to fit the two columns 4465 % and the final section into the vbox of \pageheight (see 4466 % \pagebody), causing an overfull box. 4467 % 4468 % Note that glue won't work here, because glue does not exercise the 4469 % page builder, unlike penalties (see The TeXbook, pp. 280-281). 4470 \penalty0 4471 % 4472 \output = {% 4473 % Split the last of the double-column material. Leave it on the 4474 % current page, no automatic page break. 4475 \balancecolumns 4476 % 4477 % If we end up splitting too much material for the current page, 4478 % though, there will be another page break right after this \output 4479 % invocation ends. Having called \balancecolumns once, we do not 4480 % want to call it again. Therefore, reset \output to its normal 4481 % definition right away. (We hope \balancecolumns will never be 4482 % called on to balance too much material, but if it is, this makes 4483 % the output somewhat more palatable.) 4484 \global\output = {\onepageout{\pagecontents\PAGE}}% 4485 }% 4486 \eject 4487 \endgroup % started in \begindoublecolumns 4488 % 4489 % \pagegoal was set to the doubled \vsize above, since we restarted 4490 % the current page. We're now back to normal single-column 4491 % typesetting, so reset \pagegoal to the normal \vsize (after the 4492 % \endgroup where \vsize got restored). 4493 \pagegoal = \vsize 4494} 4495% 4496% Called at the end of the double column material. 4497\def\balancecolumns{% 4498 \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120. 4499 \dimen@ = \ht0 4500 \advance\dimen@ by \topskip 4501 \advance\dimen@ by-\baselineskip 4502 \divide\dimen@ by 2 % target to split to 4503 %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}% 4504 \splittopskip = \topskip 4505 % Loop until we get a decent breakpoint. 4506 {% 4507 \vbadness = 10000 4508 \loop 4509 \global\setbox3 = \copy0 4510 \global\setbox1 = \vsplit3 to \dimen@ 4511 \ifdim\ht3>\dimen@ 4512 \global\advance\dimen@ by 1pt 4513 \repeat 4514 }% 4515 %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}% 4516 \setbox0=\vbox to\dimen@{\unvbox1}% 4517 \setbox2=\vbox to\dimen@{\unvbox3}% 4518 % 4519 \pagesofar 4520} 4521\catcode`\@ = \other 4522 4523 4524\message{sectioning,} 4525% Chapters, sections, etc. 4526 4527% \unnumberedno is an oxymoron, of course. But we count the unnumbered 4528% sections so that we can refer to them unambiguously in the pdf 4529% outlines by their "section number". We avoid collisions with chapter 4530% numbers by starting them at 10000. (If a document ever has 10000 4531% chapters, we're in trouble anyway, I'm sure.) 4532\newcount\unnumberedno \unnumberedno = 10000 4533\newcount\chapno 4534\newcount\secno \secno=0 4535\newcount\subsecno \subsecno=0 4536\newcount\subsubsecno \subsubsecno=0 4537 4538% This counter is funny since it counts through charcodes of letters A, B, ... 4539\newcount\appendixno \appendixno = `\@ 4540% 4541% \def\appendixletter{\char\the\appendixno} 4542% We do the following ugly conditional instead of the above simple 4543% construct for the sake of pdftex, which needs the actual 4544% letter in the expansion, not just typeset. 4545% 4546\def\appendixletter{% 4547 \ifnum\appendixno=`A A% 4548 \else\ifnum\appendixno=`B B% 4549 \else\ifnum\appendixno=`C C% 4550 \else\ifnum\appendixno=`D D% 4551 \else\ifnum\appendixno=`E E% 4552 \else\ifnum\appendixno=`F F% 4553 \else\ifnum\appendixno=`G G% 4554 \else\ifnum\appendixno=`H H% 4555 \else\ifnum\appendixno=`I I% 4556 \else\ifnum\appendixno=`J J% 4557 \else\ifnum\appendixno=`K K% 4558 \else\ifnum\appendixno=`L L% 4559 \else\ifnum\appendixno=`M M% 4560 \else\ifnum\appendixno=`N N% 4561 \else\ifnum\appendixno=`O O% 4562 \else\ifnum\appendixno=`P P% 4563 \else\ifnum\appendixno=`Q Q% 4564 \else\ifnum\appendixno=`R R% 4565 \else\ifnum\appendixno=`S S% 4566 \else\ifnum\appendixno=`T T% 4567 \else\ifnum\appendixno=`U U% 4568 \else\ifnum\appendixno=`V V% 4569 \else\ifnum\appendixno=`W W% 4570 \else\ifnum\appendixno=`X X% 4571 \else\ifnum\appendixno=`Y Y% 4572 \else\ifnum\appendixno=`Z Z% 4573 % The \the is necessary, despite appearances, because \appendixletter is 4574 % expanded while writing the .toc file. \char\appendixno is not 4575 % expandable, thus it is written literally, thus all appendixes come out 4576 % with the same letter (or @) in the toc without it. 4577 \else\char\the\appendixno 4578 \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi 4579 \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} 4580 4581% Each @chapter defines this as the name of the chapter. 4582% page headings and footings can use it. @section does likewise. 4583% However, they are not reliable, because we don't use marks. 4584\def\thischapter{} 4585\def\thissection{} 4586 4587\newcount\absseclevel % used to calculate proper heading level 4588\newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count 4589 4590% @raisesections: treat @section as chapter, @subsection as section, etc. 4591\def\raisesections{\global\advance\secbase by -1} 4592\let\up=\raisesections % original BFox name 4593 4594% @lowersections: treat @chapter as section, @section as subsection, etc. 4595\def\lowersections{\global\advance\secbase by 1} 4596\let\down=\lowersections % original BFox name 4597 4598% we only have subsub. 4599\chardef\maxseclevel = 3 4600% 4601% A numbered section within an unnumbered changes to unnumbered too. 4602% To achive this, remember the "biggest" unnum. sec. we are currently in: 4603\chardef\unmlevel = \maxseclevel 4604% 4605% Trace whether the current chapter is an appendix or not: 4606% \chapheadtype is "N" or "A", unnumbered chapters are ignored. 4607\def\chapheadtype{N} 4608 4609% Choose a heading macro 4610% #1 is heading type 4611% #2 is heading level 4612% #3 is text for heading 4613\def\genhead#1#2#3{% 4614 % Compute the abs. sec. level: 4615 \absseclevel=#2 4616 \advance\absseclevel by \secbase 4617 % Make sure \absseclevel doesn't fall outside the range: 4618 \ifnum \absseclevel < 0 4619 \absseclevel = 0 4620 \else 4621 \ifnum \absseclevel > 3 4622 \absseclevel = 3 4623 \fi 4624 \fi 4625 % The heading type: 4626 \def\headtype{#1}% 4627 \if \headtype U% 4628 \ifnum \absseclevel < \unmlevel 4629 \chardef\unmlevel = \absseclevel 4630 \fi 4631 \else 4632 % Check for appendix sections: 4633 \ifnum \absseclevel = 0 4634 \edef\chapheadtype{\headtype}% 4635 \else 4636 \if \headtype A\if \chapheadtype N% 4637 \errmessage{@appendix... within a non-appendix chapter}% 4638 \fi\fi 4639 \fi 4640 % Check for numbered within unnumbered: 4641 \ifnum \absseclevel > \unmlevel 4642 \def\headtype{U}% 4643 \else 4644 \chardef\unmlevel = 3 4645 \fi 4646 \fi 4647 % Now print the heading: 4648 \if \headtype U% 4649 \ifcase\absseclevel 4650 \unnumberedzzz{#3}% 4651 \or \unnumberedseczzz{#3}% 4652 \or \unnumberedsubseczzz{#3}% 4653 \or \unnumberedsubsubseczzz{#3}% 4654 \fi 4655 \else 4656 \if \headtype A% 4657 \ifcase\absseclevel 4658 \appendixzzz{#3}% 4659 \or \appendixsectionzzz{#3}% 4660 \or \appendixsubseczzz{#3}% 4661 \or \appendixsubsubseczzz{#3}% 4662 \fi 4663 \else 4664 \ifcase\absseclevel 4665 \chapterzzz{#3}% 4666 \or \seczzz{#3}% 4667 \or \numberedsubseczzz{#3}% 4668 \or \numberedsubsubseczzz{#3}% 4669 \fi 4670 \fi 4671 \fi 4672 \suppressfirstparagraphindent 4673} 4674 4675% an interface: 4676\def\numhead{\genhead N} 4677\def\apphead{\genhead A} 4678\def\unnmhead{\genhead U} 4679 4680% @chapter, @appendix, @unnumbered. Increment top-level counter, reset 4681% all lower-level sectioning counters to zero. 4682% 4683% Also set \chaplevelprefix, which we prepend to @float sequence numbers 4684% (e.g., figures), q.v. By default (before any chapter), that is empty. 4685\let\chaplevelprefix = \empty 4686% 4687\outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz 4688\def\chapterzzz#1{% 4689 % section resetting is \global in case the chapter is in a group, such 4690 % as an @include file. 4691 \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 4692 \global\advance\chapno by 1 4693 % 4694 % Used for \float. 4695 \gdef\chaplevelprefix{\the\chapno.}% 4696 \resetallfloatnos 4697 % 4698 \message{\putwordChapter\space \the\chapno}% 4699 % 4700 % Write the actual heading. 4701 \chapmacro{#1}{Ynumbered}{\the\chapno}% 4702 % 4703 % So @section and the like are numbered underneath this chapter. 4704 \global\let\section = \numberedsec 4705 \global\let\subsection = \numberedsubsec 4706 \global\let\subsubsection = \numberedsubsubsec 4707} 4708 4709\outer\parseargdef\appendix{\apphead0{#1}} % normally apphead0 calls appendixzzz 4710\def\appendixzzz#1{% 4711 \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 4712 \global\advance\appendixno by 1 4713 \gdef\chaplevelprefix{\appendixletter.}% 4714 \resetallfloatnos 4715 % 4716 \def\appendixnum{\putwordAppendix\space \appendixletter}% 4717 \message{\appendixnum}% 4718 % 4719 \chapmacro{#1}{Yappendix}{\appendixletter}% 4720 % 4721 \global\let\section = \appendixsec 4722 \global\let\subsection = \appendixsubsec 4723 \global\let\subsubsection = \appendixsubsubsec 4724} 4725 4726\outer\parseargdef\unnumbered{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz 4727\def\unnumberedzzz#1{% 4728 \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 4729 \global\advance\unnumberedno by 1 4730 % 4731 % Since an unnumbered has no number, no prefix for figures. 4732 \global\let\chaplevelprefix = \empty 4733 \resetallfloatnos 4734 % 4735 % This used to be simply \message{#1}, but TeX fully expands the 4736 % argument to \message. Therefore, if #1 contained @-commands, TeX 4737 % expanded them. For example, in `@unnumbered The @cite{Book}', TeX 4738 % expanded @cite (which turns out to cause errors because \cite is meant 4739 % to be executed, not expanded). 4740 % 4741 % Anyway, we don't want the fully-expanded definition of @cite to appear 4742 % as a result of the \message, we just want `@cite' itself. We use 4743 % \the<toks register> to achieve this: TeX expands \the<toks> only once, 4744 % simply yielding the contents of <toks register>. (We also do this for 4745 % the toc entries.) 4746 \toks0 = {#1}% 4747 \message{(\the\toks0)}% 4748 % 4749 \chapmacro{#1}{Ynothing}{\the\unnumberedno}% 4750 % 4751 \global\let\section = \unnumberedsec 4752 \global\let\subsection = \unnumberedsubsec 4753 \global\let\subsubsection = \unnumberedsubsubsec 4754} 4755 4756% @centerchap is like @unnumbered, but the heading is centered. 4757\outer\parseargdef\centerchap{% 4758 % Well, we could do the following in a group, but that would break 4759 % an assumption that \chapmacro is called at the outermost level. 4760 % Thus we are safer this way: --kasal, 24feb04 4761 \let\centerparametersmaybe = \centerparameters 4762 \unnmhead0{#1}% 4763 \let\centerparametersmaybe = \relax 4764} 4765 4766% @top is like @unnumbered. 4767\let\top\unnumbered 4768 4769% Sections. 4770\outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz 4771\def\seczzz#1{% 4772 \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 4773 \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}% 4774} 4775 4776\outer\parseargdef\appendixsection{\apphead1{#1}} % normally calls appendixsectionzzz 4777\def\appendixsectionzzz#1{% 4778 \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 4779 \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}% 4780} 4781\let\appendixsec\appendixsection 4782 4783\outer\parseargdef\unnumberedsec{\unnmhead1{#1}} % normally calls unnumberedseczzz 4784\def\unnumberedseczzz#1{% 4785 \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 4786 \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}% 4787} 4788 4789% Subsections. 4790\outer\parseargdef\numberedsubsec{\numhead2{#1}} % normally calls numberedsubseczzz 4791\def\numberedsubseczzz#1{% 4792 \global\subsubsecno=0 \global\advance\subsecno by 1 4793 \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}% 4794} 4795 4796\outer\parseargdef\appendixsubsec{\apphead2{#1}} % normally calls appendixsubseczzz 4797\def\appendixsubseczzz#1{% 4798 \global\subsubsecno=0 \global\advance\subsecno by 1 4799 \sectionheading{#1}{subsec}{Yappendix}% 4800 {\appendixletter.\the\secno.\the\subsecno}% 4801} 4802 4803\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} %normally calls unnumberedsubseczzz 4804\def\unnumberedsubseczzz#1{% 4805 \global\subsubsecno=0 \global\advance\subsecno by 1 4806 \sectionheading{#1}{subsec}{Ynothing}% 4807 {\the\unnumberedno.\the\secno.\the\subsecno}% 4808} 4809 4810% Subsubsections. 4811\outer\parseargdef\numberedsubsubsec{\numhead3{#1}} % normally numberedsubsubseczzz 4812\def\numberedsubsubseczzz#1{% 4813 \global\advance\subsubsecno by 1 4814 \sectionheading{#1}{subsubsec}{Ynumbered}% 4815 {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}% 4816} 4817 4818\outer\parseargdef\appendixsubsubsec{\apphead3{#1}} % normally appendixsubsubseczzz 4819\def\appendixsubsubseczzz#1{% 4820 \global\advance\subsubsecno by 1 4821 \sectionheading{#1}{subsubsec}{Yappendix}% 4822 {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}% 4823} 4824 4825\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} %normally unnumberedsubsubseczzz 4826\def\unnumberedsubsubseczzz#1{% 4827 \global\advance\subsubsecno by 1 4828 \sectionheading{#1}{subsubsec}{Ynothing}% 4829 {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}% 4830} 4831 4832% These macros control what the section commands do, according 4833% to what kind of chapter we are in (ordinary, appendix, or unnumbered). 4834% Define them by default for a numbered chapter. 4835\let\section = \numberedsec 4836\let\subsection = \numberedsubsec 4837\let\subsubsection = \numberedsubsubsec 4838 4839% Define @majorheading, @heading and @subheading 4840 4841% NOTE on use of \vbox for chapter headings, section headings, and such: 4842% 1) We use \vbox rather than the earlier \line to permit 4843% overlong headings to fold. 4844% 2) \hyphenpenalty is set to 10000 because hyphenation in a 4845% heading is obnoxious; this forbids it. 4846% 3) Likewise, headings look best if no \parindent is used, and 4847% if justification is not attempted. Hence \raggedright. 4848 4849 4850\def\majorheading{% 4851 {\advance\chapheadingskip by 10pt \chapbreak }% 4852 \parsearg\chapheadingzzz 4853} 4854 4855\def\chapheading{\chapbreak \parsearg\chapheadingzzz} 4856\def\chapheadingzzz#1{% 4857 {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 4858 \parindent=0pt\raggedright 4859 \rm #1\hfill}}% 4860 \bigskip \par\penalty 200\relax 4861 \suppressfirstparagraphindent 4862} 4863 4864% @heading, @subheading, @subsubheading. 4865\parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{} 4866 \suppressfirstparagraphindent} 4867\parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{} 4868 \suppressfirstparagraphindent} 4869\parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{} 4870 \suppressfirstparagraphindent} 4871 4872% These macros generate a chapter, section, etc. heading only 4873% (including whitespace, linebreaking, etc. around it), 4874% given all the information in convenient, parsed form. 4875 4876%%% Args are the skip and penalty (usually negative) 4877\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} 4878 4879%%% Define plain chapter starts, and page on/off switching for it 4880% Parameter controlling skip before chapter headings (if needed) 4881 4882\newskip\chapheadingskip 4883 4884\def\chapbreak{\dobreak \chapheadingskip {-4000}} 4885\def\chappager{\par\vfill\supereject} 4886\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi} 4887 4888\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} 4889 4890\def\CHAPPAGoff{% 4891\global\let\contentsalignmacro = \chappager 4892\global\let\pchapsepmacro=\chapbreak 4893\global\let\pagealignmacro=\chappager} 4894 4895\def\CHAPPAGon{% 4896\global\let\contentsalignmacro = \chappager 4897\global\let\pchapsepmacro=\chappager 4898\global\let\pagealignmacro=\chappager 4899\global\def\HEADINGSon{\HEADINGSsingle}} 4900 4901\def\CHAPPAGodd{% 4902\global\let\contentsalignmacro = \chapoddpage 4903\global\let\pchapsepmacro=\chapoddpage 4904\global\let\pagealignmacro=\chapoddpage 4905\global\def\HEADINGSon{\HEADINGSdouble}} 4906 4907\CHAPPAGon 4908 4909% Chapter opening. 4910% 4911% #1 is the text, #2 is the section type (Ynumbered, Ynothing, 4912% Yappendix, Yomitfromtoc), #3 the chapter number. 4913% 4914% To test against our argument. 4915\def\Ynothingkeyword{Ynothing} 4916\def\Yomitfromtockeyword{Yomitfromtoc} 4917\def\Yappendixkeyword{Yappendix} 4918% 4919\def\chapmacro#1#2#3{% 4920 \pchapsepmacro 4921 {% 4922 \chapfonts \rm 4923 % 4924 % Have to define \thissection before calling \donoderef, because the 4925 % xref code eventually uses it. On the other hand, it has to be called 4926 % after \pchapsepmacro, or the headline will change too soon. 4927 \gdef\thissection{#1}% 4928 \gdef\thischaptername{#1}% 4929 % 4930 % Only insert the separating space if we have a chapter/appendix 4931 % number, and don't print the unnumbered ``number''. 4932 \def\temptype{#2}% 4933 \ifx\temptype\Ynothingkeyword 4934 \setbox0 = \hbox{}% 4935 \def\toctype{unnchap}% 4936 \gdef\thischapternum{}% 4937 \gdef\thischapter{#1}% 4938 \else\ifx\temptype\Yomitfromtockeyword 4939 \setbox0 = \hbox{}% contents like unnumbered, but no toc entry 4940 \def\toctype{omit}% 4941 \gdef\thischapternum{}% 4942 \gdef\thischapter{}% 4943 \else\ifx\temptype\Yappendixkeyword 4944 \setbox0 = \hbox{\putwordAppendix{} #3\enspace}% 4945 \def\toctype{app}% 4946 \xdef\thischapternum{\appendixletter}% 4947 % We don't substitute the actual chapter name into \thischapter 4948 % because we don't want its macros evaluated now. And we don't 4949 % use \thissection because that changes with each section. 4950 % 4951 \xdef\thischapter{\putwordAppendix{} \appendixletter: 4952 \noexpand\thischaptername}% 4953 \else 4954 \setbox0 = \hbox{#3\enspace}% 4955 \def\toctype{numchap}% 4956 \xdef\thischapternum{\the\chapno}% 4957 \xdef\thischapter{\putwordChapter{} \the\chapno: 4958 \noexpand\thischaptername}% 4959 \fi\fi\fi 4960 % 4961 % Write the toc entry for this chapter. Must come before the 4962 % \donoderef, because we include the current node name in the toc 4963 % entry, and \donoderef resets it to empty. 4964 \writetocentry{\toctype}{#1}{#3}% 4965 % 4966 % For pdftex, we have to write out the node definition (aka, make 4967 % the pdfdest) after any page break, but before the actual text has 4968 % been typeset. If the destination for the pdf outline is after the 4969 % text, then jumping from the outline may wind up with the text not 4970 % being visible, for instance under high magnification. 4971 \donoderef{#2}% 4972 % 4973 % Typeset the actual heading. 4974 \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright 4975 \hangindent=\wd0 \centerparametersmaybe 4976 \unhbox0 #1\par}% 4977 }% 4978 \nobreak\bigskip % no page break after a chapter title 4979 \nobreak 4980} 4981 4982% @centerchap -- centered and unnumbered. 4983\let\centerparametersmaybe = \relax 4984\def\centerparameters{% 4985 \advance\rightskip by 3\rightskip 4986 \leftskip = \rightskip 4987 \parfillskip = 0pt 4988} 4989 4990 4991% I don't think this chapter style is supported any more, so I'm not 4992% updating it with the new noderef stuff. We'll see. --karl, 11aug03. 4993% 4994\def\setchapterstyle #1 {\csname CHAPF#1\endcsname} 4995% 4996\def\unnchfopen #1{% 4997\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 4998 \parindent=0pt\raggedright 4999 \rm #1\hfill}}\bigskip \par\nobreak 5000} 5001\def\chfopen #1#2{\chapoddpage {\chapfonts 5002\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% 5003\par\penalty 5000 % 5004} 5005\def\centerchfopen #1{% 5006\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 5007 \parindent=0pt 5008 \hfill {\rm #1}\hfill}}\bigskip \par\nobreak 5009} 5010\def\CHAPFopen{% 5011 \global\let\chapmacro=\chfopen 5012 \global\let\centerchapmacro=\centerchfopen} 5013 5014 5015% Section titles. These macros combine the section number parts and 5016% call the generic \sectionheading to do the printing. 5017% 5018\newskip\secheadingskip 5019\def\secheadingbreak{\dobreak \secheadingskip{-1000}} 5020 5021% Subsection titles. 5022\newskip\subsecheadingskip 5023\def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}} 5024 5025% Subsubsection titles. 5026\def\subsubsecheadingskip{\subsecheadingskip} 5027\def\subsubsecheadingbreak{\subsecheadingbreak} 5028 5029 5030% Print any size, any type, section title. 5031% 5032% #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is 5033% the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the 5034% section number. 5035% 5036\def\sectionheading#1#2#3#4{% 5037 {% 5038 % Switch to the right set of fonts. 5039 \csname #2fonts\endcsname \rm 5040 % 5041 % Insert space above the heading. 5042 \csname #2headingbreak\endcsname 5043 % 5044 % Only insert the space after the number if we have a section number. 5045 \def\sectionlevel{#2}% 5046 \def\temptype{#3}% 5047 % 5048 \ifx\temptype\Ynothingkeyword 5049 \setbox0 = \hbox{}% 5050 \def\toctype{unn}% 5051 \gdef\thissection{#1}% 5052 \else\ifx\temptype\Yomitfromtockeyword 5053 % for @headings -- no section number, don't include in toc, 5054 % and don't redefine \thissection. 5055 \setbox0 = \hbox{}% 5056 \def\toctype{omit}% 5057 \let\sectionlevel=\empty 5058 \else\ifx\temptype\Yappendixkeyword 5059 \setbox0 = \hbox{#4\enspace}% 5060 \def\toctype{app}% 5061 \gdef\thissection{#1}% 5062 \else 5063 \setbox0 = \hbox{#4\enspace}% 5064 \def\toctype{num}% 5065 \gdef\thissection{#1}% 5066 \fi\fi\fi 5067 % 5068 % Write the toc entry (before \donoderef). See comments in \chapmacro. 5069 \writetocentry{\toctype\sectionlevel}{#1}{#4}% 5070 % 5071 % Write the node reference (= pdf destination for pdftex). 5072 % Again, see comments in \chapmacro. 5073 \donoderef{#3}% 5074 % 5075 % Interline glue will be inserted when the vbox is completed. 5076 % That glue will be a valid breakpoint for the page, since it'll be 5077 % preceded by a whatsit (usually from the \donoderef, or from the 5078 % \writetocentry if there was no node). We don't want to allow that 5079 % break, since then the whatsits could end up on page n while the 5080 % section is on page n+1, thus toc/etc. are wrong. Debian bug 276000. 5081 \nobreak 5082 % 5083 % Output the actual section heading. 5084 \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright 5085 \hangindent=\wd0 % zero if no section number 5086 \unhbox0 #1}% 5087 }% 5088 % Add extra space after the heading -- half of whatever came above it. 5089 % Don't allow stretch, though. 5090 \kern .5 \csname #2headingskip\endcsname 5091 % 5092 % Do not let the kern be a potential breakpoint, as it would be if it 5093 % was followed by glue. 5094 \nobreak 5095 % 5096 % We'll almost certainly start a paragraph next, so don't let that 5097 % glue accumulate. (Not a breakpoint because it's preceded by a 5098 % discardable item.) 5099 \vskip-\parskip 5100 % 5101 % This is purely so the last item on the list is a known \penalty > 5102 % 10000. This is so \startdefun can avoid allowing breakpoints after 5103 % section headings. Otherwise, it would insert a valid breakpoint between: 5104 % 5105 % @section sec-whatever 5106 % @deffn def-whatever 5107 \penalty 10001 5108} 5109 5110 5111\message{toc,} 5112% Table of contents. 5113\newwrite\tocfile 5114 5115% Write an entry to the toc file, opening it if necessary. 5116% Called from @chapter, etc. 5117% 5118% Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno} 5119% We append the current node name (if any) and page number as additional 5120% arguments for the \{chap,sec,...}entry macros which will eventually 5121% read this. The node name is used in the pdf outlines as the 5122% destination to jump to. 5123% 5124% We open the .toc file for writing here instead of at @setfilename (or 5125% any other fixed time) so that @contents can be anywhere in the document. 5126% But if #1 is `omit', then we don't do anything. This is used for the 5127% table of contents chapter openings themselves. 5128% 5129\newif\iftocfileopened 5130\def\omitkeyword{omit}% 5131% 5132\def\writetocentry#1#2#3{% 5133 \edef\writetoctype{#1}% 5134 \ifx\writetoctype\omitkeyword \else 5135 \iftocfileopened\else 5136 \immediate\openout\tocfile = \jobname.toc 5137 \global\tocfileopenedtrue 5138 \fi 5139 % 5140 \iflinks 5141 {\atdummies 5142 \edef\temp{% 5143 \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}% 5144 \temp 5145 }% 5146 \fi 5147 \fi 5148 % 5149 % Tell \shipout to create a pdf destination on each page, if we're 5150 % writing pdf. These are used in the table of contents. We can't 5151 % just write one on every page because the title pages are numbered 5152 % 1 and 2 (the page numbers aren't printed), and so are the first 5153 % two pages of the document. Thus, we'd have two destinations named 5154 % `1', and two named `2'. 5155 \ifpdf \global\pdfmakepagedesttrue \fi 5156} 5157 5158 5159% These characters do not print properly in the Computer Modern roman 5160% fonts, so we must take special care. This is more or less redundant 5161% with the Texinfo input format setup at the end of this file. 5162% 5163\def\activecatcodes{% 5164 \catcode`\"=\active 5165 \catcode`\$=\active 5166 \catcode`\<=\active 5167 \catcode`\>=\active 5168 \catcode`\\=\active 5169 \catcode`\^=\active 5170 \catcode`\_=\active 5171 \catcode`\|=\active 5172 \catcode`\~=\active 5173} 5174 5175 5176% Read the toc file, which is essentially Texinfo input. 5177\def\readtocfile{% 5178 \setupdatafile 5179 \activecatcodes 5180 \input \jobname.toc 5181} 5182 5183\newskip\contentsrightmargin \contentsrightmargin=1in 5184\newcount\savepageno 5185\newcount\lastnegativepageno \lastnegativepageno = -1 5186 5187% Prepare to read what we've written to \tocfile. 5188% 5189\def\startcontents#1{% 5190 % If @setchapternewpage on, and @headings double, the contents should 5191 % start on an odd page, unlike chapters. Thus, we maintain 5192 % \contentsalignmacro in parallel with \pagealignmacro. 5193 % From: Torbjorn Granlund <tege@matematik.su.se> 5194 \contentsalignmacro 5195 \immediate\closeout\tocfile 5196 % 5197 % Don't need to put `Contents' or `Short Contents' in the headline. 5198 % It is abundantly clear what they are. 5199 \def\thischapter{}% 5200 \chapmacro{#1}{Yomitfromtoc}{}% 5201 % 5202 \savepageno = \pageno 5203 \begingroup % Set up to handle contents files properly. 5204 \raggedbottom % Worry more about breakpoints than the bottom. 5205 \advance\hsize by -\contentsrightmargin % Don't use the full line length. 5206 % 5207 % Roman numerals for page numbers. 5208 \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi 5209} 5210 5211 5212% Normal (long) toc. 5213\def\contents{% 5214 \startcontents{\putwordTOC}% 5215 \openin 1 \jobname.toc 5216 \ifeof 1 \else 5217 \readtocfile 5218 \fi 5219 \vfill \eject 5220 \contentsalignmacro % in case @setchapternewpage odd is in effect 5221 \ifeof 1 \else 5222 \pdfmakeoutlines 5223 \fi 5224 \closein 1 5225 \endgroup 5226 \lastnegativepageno = \pageno 5227 \global\pageno = \savepageno 5228} 5229 5230% And just the chapters. 5231\def\summarycontents{% 5232 \startcontents{\putwordShortTOC}% 5233 % 5234 \let\numchapentry = \shortchapentry 5235 \let\appentry = \shortchapentry 5236 \let\unnchapentry = \shortunnchapentry 5237 % We want a true roman here for the page numbers. 5238 \secfonts 5239 \let\rm=\shortcontrm \let\bf=\shortcontbf 5240 \let\sl=\shortcontsl \let\tt=\shortconttt 5241 \rm 5242 \hyphenpenalty = 10000 5243 \advance\baselineskip by 1pt % Open it up a little. 5244 \def\numsecentry##1##2##3##4{} 5245 \let\appsecentry = \numsecentry 5246 \let\unnsecentry = \numsecentry 5247 \let\numsubsecentry = \numsecentry 5248 \let\appsubsecentry = \numsecentry 5249 \let\unnsubsecentry = \numsecentry 5250 \let\numsubsubsecentry = \numsecentry 5251 \let\appsubsubsecentry = \numsecentry 5252 \let\unnsubsubsecentry = \numsecentry 5253 \openin 1 \jobname.toc 5254 \ifeof 1 \else 5255 \readtocfile 5256 \fi 5257 \closein 1 5258 \vfill \eject 5259 \contentsalignmacro % in case @setchapternewpage odd is in effect 5260 \endgroup 5261 \lastnegativepageno = \pageno 5262 \global\pageno = \savepageno 5263} 5264\let\shortcontents = \summarycontents 5265 5266% Typeset the label for a chapter or appendix for the short contents. 5267% The arg is, e.g., `A' for an appendix, or `3' for a chapter. 5268% 5269\def\shortchaplabel#1{% 5270 % This space should be enough, since a single number is .5em, and the 5271 % widest letter (M) is 1em, at least in the Computer Modern fonts. 5272 % But use \hss just in case. 5273 % (This space doesn't include the extra space that gets added after 5274 % the label; that gets put in by \shortchapentry above.) 5275 % 5276 % We'd like to right-justify chapter numbers, but that looks strange 5277 % with appendix letters. And right-justifying numbers and 5278 % left-justifying letters looks strange when there is less than 10 5279 % chapters. Have to read the whole toc once to know how many chapters 5280 % there are before deciding ... 5281 \hbox to 1em{#1\hss}% 5282} 5283 5284% These macros generate individual entries in the table of contents. 5285% The first argument is the chapter or section name. 5286% The last argument is the page number. 5287% The arguments in between are the chapter number, section number, ... 5288 5289% Chapters, in the main contents. 5290\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}} 5291% 5292% Chapters, in the short toc. 5293% See comments in \dochapentry re vbox and related settings. 5294\def\shortchapentry#1#2#3#4{% 5295 \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}% 5296} 5297 5298% Appendices, in the main contents. 5299% Need the word Appendix, and a fixed-size box. 5300% 5301\def\appendixbox#1{% 5302 % We use M since it's probably the widest letter. 5303 \setbox0 = \hbox{\putwordAppendix{} M}% 5304 \hbox to \wd0{\putwordAppendix{} #1\hss}} 5305% 5306\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}} 5307 5308% Unnumbered chapters. 5309\def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}} 5310\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}} 5311 5312% Sections. 5313\def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}} 5314\let\appsecentry=\numsecentry 5315\def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}} 5316 5317% Subsections. 5318\def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}} 5319\let\appsubsecentry=\numsubsecentry 5320\def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}} 5321 5322% And subsubsections. 5323\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}} 5324\let\appsubsubsecentry=\numsubsubsecentry 5325\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}} 5326 5327% This parameter controls the indentation of the various levels. 5328% Same as \defaultparindent. 5329\newdimen\tocindent \tocindent = 15pt 5330 5331% Now for the actual typesetting. In all these, #1 is the text and #2 is the 5332% page number. 5333% 5334% If the toc has to be broken over pages, we want it to be at chapters 5335% if at all possible; hence the \penalty. 5336\def\dochapentry#1#2{% 5337 \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip 5338 \begingroup 5339 \chapentryfonts 5340 \tocentry{#1}{\dopageno\bgroup#2\egroup}% 5341 \endgroup 5342 \nobreak\vskip .25\baselineskip plus.1\baselineskip 5343} 5344 5345\def\dosecentry#1#2{\begingroup 5346 \secentryfonts \leftskip=\tocindent 5347 \tocentry{#1}{\dopageno\bgroup#2\egroup}% 5348\endgroup} 5349 5350\def\dosubsecentry#1#2{\begingroup 5351 \subsecentryfonts \leftskip=2\tocindent 5352 \tocentry{#1}{\dopageno\bgroup#2\egroup}% 5353\endgroup} 5354 5355\def\dosubsubsecentry#1#2{\begingroup 5356 \subsubsecentryfonts \leftskip=3\tocindent 5357 \tocentry{#1}{\dopageno\bgroup#2\egroup}% 5358\endgroup} 5359 5360% We use the same \entry macro as for the index entries. 5361\let\tocentry = \entry 5362 5363% Space between chapter (or whatever) number and the title. 5364\def\labelspace{\hskip1em \relax} 5365 5366\def\dopageno#1{{\rm #1}} 5367\def\doshortpageno#1{{\rm #1}} 5368 5369\def\chapentryfonts{\secfonts \rm} 5370\def\secentryfonts{\textfonts} 5371\def\subsecentryfonts{\textfonts} 5372\def\subsubsecentryfonts{\textfonts} 5373 5374 5375\message{environments,} 5376% @foo ... @end foo. 5377 5378% @point{}, @result{}, @expansion{}, @print{}, @equiv{}. 5379% 5380% Since these characters are used in examples, it should be an even number of 5381% \tt widths. Each \tt character is 1en, so two makes it 1em. 5382% 5383\def\point{$\star$} 5384\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} 5385\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}} 5386\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} 5387\def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}} 5388 5389% The @error{} command. 5390% Adapted from the TeXbook's \boxit. 5391% 5392\newbox\errorbox 5393% 5394{\tentt \global\dimen0 = 3em}% Width of the box. 5395\dimen2 = .55pt % Thickness of rules 5396% The text. (`r' is open on the right, `e' somewhat less so on the left.) 5397\setbox0 = \hbox{\kern-.75pt \reducedsf error\kern-1.5pt} 5398% 5399\setbox\errorbox=\hbox to \dimen0{\hfil 5400 \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. 5401 \advance\hsize by -2\dimen2 % Rules. 5402 \vbox{% 5403 \hrule height\dimen2 5404 \hbox{\vrule width\dimen2 \kern3pt % Space to left of text. 5405 \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. 5406 \kern3pt\vrule width\dimen2}% Space to right. 5407 \hrule height\dimen2} 5408 \hfil} 5409% 5410\def\error{\leavevmode\lower.7ex\copy\errorbox} 5411 5412% @tex ... @end tex escapes into raw Tex temporarily. 5413% One exception: @ is still an escape character, so that @end tex works. 5414% But \@ or @@ will get a plain tex @ character. 5415 5416\envdef\tex{% 5417 \catcode `\\=0 \catcode `\{=1 \catcode `\}=2 5418 \catcode `\$=3 \catcode `\&=4 \catcode `\#=6 5419 \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie 5420 \catcode `\%=14 5421 \catcode `\+=\other 5422 \catcode `\"=\other 5423 \catcode `\|=\other 5424 \catcode `\<=\other 5425 \catcode `\>=\other 5426 \escapechar=`\\ 5427 % 5428 \let\b=\ptexb 5429 \let\bullet=\ptexbullet 5430 \let\c=\ptexc 5431 \let\,=\ptexcomma 5432 \let\.=\ptexdot 5433 \let\dots=\ptexdots 5434 \let\equiv=\ptexequiv 5435 \let\!=\ptexexclam 5436 \let\i=\ptexi 5437 \let\indent=\ptexindent 5438 \let\noindent=\ptexnoindent 5439 \let\{=\ptexlbrace 5440 \let\+=\tabalign 5441 \let\}=\ptexrbrace 5442 \let\/=\ptexslash 5443 \let\*=\ptexstar 5444 \let\t=\ptext 5445 \let\frenchspacing=\plainfrenchspacing 5446 % 5447 \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% 5448 \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}% 5449 \def\@{@}% 5450} 5451% There is no need to define \Etex. 5452 5453% Define @lisp ... @end lisp. 5454% @lisp environment forms a group so it can rebind things, 5455% including the definition of @end lisp (which normally is erroneous). 5456 5457% Amount to narrow the margins by for @lisp. 5458\newskip\lispnarrowing \lispnarrowing=0.4in 5459 5460% This is the definition that ^^M gets inside @lisp, @example, and other 5461% such environments. \null is better than a space, since it doesn't 5462% have any width. 5463\def\lisppar{\null\endgraf} 5464 5465% This space is always present above and below environments. 5466\newskip\envskipamount \envskipamount = 0pt 5467 5468% Make spacing and below environment symmetrical. We use \parskip here 5469% to help in doing that, since in @example-like environments \parskip 5470% is reset to zero; thus the \afterenvbreak inserts no space -- but the 5471% start of the next paragraph will insert \parskip. 5472% 5473\def\aboveenvbreak{{% 5474 % =10000 instead of <10000 because of a special case in \itemzzz and 5475 % \sectionheading, q.v. 5476 \ifnum \lastpenalty=10000 \else 5477 \advance\envskipamount by \parskip 5478 \endgraf 5479 \ifdim\lastskip<\envskipamount 5480 \removelastskip 5481 % it's not a good place to break if the last penalty was \nobreak 5482 % or better ... 5483 \ifnum\lastpenalty<10000 \penalty-50 \fi 5484 \vskip\envskipamount 5485 \fi 5486 \fi 5487}} 5488 5489\let\afterenvbreak = \aboveenvbreak 5490 5491% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins; it will 5492% also clear it, so that its embedded environments do the narrowing again. 5493\let\nonarrowing=\relax 5494 5495% @cartouche ... @end cartouche: draw rectangle w/rounded corners around 5496% environment contents. 5497\font\circle=lcircle10 5498\newdimen\circthick 5499\newdimen\cartouter\newdimen\cartinner 5500\newskip\normbskip\newskip\normpskip\newskip\normlskip 5501\circthick=\fontdimen8\circle 5502% 5503\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth 5504\def\ctr{{\hskip 6pt\circle\char'010}} 5505\def\cbl{{\circle\char'012\hskip -6pt}} 5506\def\cbr{{\hskip 6pt\circle\char'011}} 5507\def\carttop{\hbox to \cartouter{\hskip\lskip 5508 \ctl\leaders\hrule height\circthick\hfil\ctr 5509 \hskip\rskip}} 5510\def\cartbot{\hbox to \cartouter{\hskip\lskip 5511 \cbl\leaders\hrule height\circthick\hfil\cbr 5512 \hskip\rskip}} 5513% 5514\newskip\lskip\newskip\rskip 5515 5516\envdef\cartouche{% 5517 \ifhmode\par\fi % can't be in the midst of a paragraph. 5518 \startsavinginserts 5519 \lskip=\leftskip \rskip=\rightskip 5520 \leftskip=0pt\rightskip=0pt % we want these *outside*. 5521 \cartinner=\hsize \advance\cartinner by-\lskip 5522 \advance\cartinner by-\rskip 5523 \cartouter=\hsize 5524 \advance\cartouter by 18.4pt % allow for 3pt kerns on either 5525 % side, and for 6pt waste from 5526 % each corner char, and rule thickness 5527 \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip 5528 % Flag to tell @lisp, etc., not to narrow margin. 5529 \let\nonarrowing = t% 5530 \vbox\bgroup 5531 \baselineskip=0pt\parskip=0pt\lineskip=0pt 5532 \carttop 5533 \hbox\bgroup 5534 \hskip\lskip 5535 \vrule\kern3pt 5536 \vbox\bgroup 5537 \kern3pt 5538 \hsize=\cartinner 5539 \baselineskip=\normbskip 5540 \lineskip=\normlskip 5541 \parskip=\normpskip 5542 \vskip -\parskip 5543 \comment % For explanation, see the end of \def\group. 5544} 5545\def\Ecartouche{% 5546 \ifhmode\par\fi 5547 \kern3pt 5548 \egroup 5549 \kern3pt\vrule 5550 \hskip\rskip 5551 \egroup 5552 \cartbot 5553 \egroup 5554 \checkinserts 5555} 5556 5557 5558% This macro is called at the beginning of all the @example variants, 5559% inside a group. 5560\def\nonfillstart{% 5561 \aboveenvbreak 5562 \hfuzz = 12pt % Don't be fussy 5563 \sepspaces % Make spaces be word-separators rather than space tokens. 5564 \let\par = \lisppar % don't ignore blank lines 5565 \obeylines % each line of input is a line of output 5566 \parskip = 0pt 5567 \parindent = 0pt 5568 \emergencystretch = 0pt % don't try to avoid overfull boxes 5569 \ifx\nonarrowing\relax 5570 \advance \leftskip by \lispnarrowing 5571 \exdentamount=\lispnarrowing 5572 \else 5573 \let\nonarrowing = \relax 5574 \fi 5575 \let\exdent=\nofillexdent 5576} 5577 5578% If you want all examples etc. small: @set dispenvsize small. 5579% If you want even small examples the full size: @set dispenvsize nosmall. 5580% This affects the following displayed environments: 5581% @example, @display, @format, @lisp 5582% 5583\def\smallword{small} 5584\def\nosmallword{nosmall} 5585\let\SETdispenvsize\relax 5586\def\setnormaldispenv{% 5587 \ifx\SETdispenvsize\smallword 5588 % end paragraph for sake of leading, in case document has no blank 5589 % line. This is redundant with what happens in \aboveenvbreak, but 5590 % we need to do it before changing the fonts, and it's inconvenient 5591 % to change the fonts afterward. 5592 \ifnum \lastpenalty=10000 \else \endgraf \fi 5593 \smallexamplefonts \rm 5594 \fi 5595} 5596\def\setsmalldispenv{% 5597 \ifx\SETdispenvsize\nosmallword 5598 \else 5599 \ifnum \lastpenalty=10000 \else \endgraf \fi 5600 \smallexamplefonts \rm 5601 \fi 5602} 5603 5604% We often define two environments, @foo and @smallfoo. 5605% Let's do it by one command: 5606\def\makedispenv #1#2{ 5607 \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2} 5608 \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2} 5609 \expandafter\let\csname E#1\endcsname \afterenvbreak 5610 \expandafter\let\csname Esmall#1\endcsname \afterenvbreak 5611} 5612 5613% Define two synonyms: 5614\def\maketwodispenvs #1#2#3{ 5615 \makedispenv{#1}{#3} 5616 \makedispenv{#2}{#3} 5617} 5618 5619% @lisp: indented, narrowed, typewriter font; @example: same as @lisp. 5620% 5621% @smallexample and @smalllisp: use smaller fonts. 5622% Originally contributed by Pavel@xerox. 5623% 5624\maketwodispenvs {lisp}{example}{% 5625 \nonfillstart 5626 \tt\quoteexpand 5627 \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. 5628 \gobble % eat return 5629} 5630% @display/@smalldisplay: same as @lisp except keep current font. 5631% 5632\makedispenv {display}{% 5633 \nonfillstart 5634 \gobble 5635} 5636 5637% @format/@smallformat: same as @display except don't narrow margins. 5638% 5639\makedispenv{format}{% 5640 \let\nonarrowing = t% 5641 \nonfillstart 5642 \gobble 5643} 5644 5645% @flushleft: same as @format, but doesn't obey \SETdispenvsize. 5646\envdef\flushleft{% 5647 \let\nonarrowing = t% 5648 \nonfillstart 5649 \gobble 5650} 5651\let\Eflushleft = \afterenvbreak 5652 5653% @flushright. 5654% 5655\envdef\flushright{% 5656 \let\nonarrowing = t% 5657 \nonfillstart 5658 \advance\leftskip by 0pt plus 1fill 5659 \gobble 5660} 5661\let\Eflushright = \afterenvbreak 5662 5663 5664% @quotation does normal linebreaking (hence we can't use \nonfillstart) 5665% and narrows the margins. We keep \parskip nonzero in general, since 5666% we're doing normal filling. So, when using \aboveenvbreak and 5667% \afterenvbreak, temporarily make \parskip 0. 5668% 5669\envdef\quotation{% 5670 {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip 5671 \parindent=0pt 5672 % 5673 % @cartouche defines \nonarrowing to inhibit narrowing at next level down. 5674 \ifx\nonarrowing\relax 5675 \advance\leftskip by \lispnarrowing 5676 \advance\rightskip by \lispnarrowing 5677 \exdentamount = \lispnarrowing 5678 \else 5679 \let\nonarrowing = \relax 5680 \fi 5681 \parsearg\quotationlabel 5682} 5683 5684% We have retained a nonzero parskip for the environment, since we're 5685% doing normal filling. 5686% 5687\def\Equotation{% 5688 \par 5689 \ifx\quotationauthor\undefined\else 5690 % indent a bit. 5691 \leftline{\kern 2\leftskip \sl ---\quotationauthor}% 5692 \fi 5693 {\parskip=0pt \afterenvbreak}% 5694} 5695 5696% If we're given an argument, typeset it in bold with a colon after. 5697\def\quotationlabel#1{% 5698 \def\temp{#1}% 5699 \ifx\temp\empty \else 5700 {\bf #1: }% 5701 \fi 5702} 5703 5704 5705% LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>} 5706% If we want to allow any <char> as delimiter, 5707% we need the curly braces so that makeinfo sees the @verb command, eg: 5708% `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org 5709% 5710% [Knuth]: Donald Ervin Knuth, 1996. The TeXbook. 5711% 5712% [Knuth] p.344; only we need to do the other characters Texinfo sets 5713% active too. Otherwise, they get lost as the first character on a 5714% verbatim line. 5715\def\dospecials{% 5716 \do\ \do\\\do\{\do\}\do\$\do\&% 5717 \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~% 5718 \do\<\do\>\do\|\do\@\do+\do\"% 5719} 5720% 5721% [Knuth] p. 380 5722\def\uncatcodespecials{% 5723 \def\do##1{\catcode`##1=\other}\dospecials} 5724% 5725% [Knuth] pp. 380,381,391 5726% Disable Spanish ligatures ?` and !` of \tt font 5727\begingroup 5728 \catcode`\`=\active\gdef`{\relax\lq} 5729\endgroup 5730% 5731% Setup for the @verb command. 5732% 5733% Eight spaces for a tab 5734\begingroup 5735 \catcode`\^^I=\active 5736 \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }} 5737\endgroup 5738% 5739\def\setupverb{% 5740 \tt % easiest (and conventionally used) font for verbatim 5741 \def\par{\leavevmode\endgraf}% 5742 \catcode`\`=\active 5743 \tabeightspaces 5744 % Respect line breaks, 5745 % print special symbols as themselves, and 5746 % make each space count 5747 % must do in this order: 5748 \obeylines \uncatcodespecials \sepspaces 5749} 5750 5751% Setup for the @verbatim environment 5752% 5753% Real tab expansion 5754\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount 5755% 5756\def\starttabbox{\setbox0=\hbox\bgroup} 5757 5758% Allow an option to not replace quotes with a regular directed right 5759% quote/apostrophe (char 0x27), but instead use the undirected quote 5760% from cmtt (char 0x0d). The undirected quote is ugly, so don't make it 5761% the default, but it works for pasting with more pdf viewers (at least 5762% evince), the lilypond developers report. xpdf does work with the 5763% regular 0x27. 5764% 5765\def\codequoteright{% 5766 \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax 5767 '% 5768 \else 5769 \char'15 5770 \fi 5771} 5772% 5773% and a similar option for the left quote char vs. a grave accent. 5774% Modern fonts display ASCII 0x60 as a grave accent, so some people like 5775% the code environments to do likewise. 5776% 5777\def\codequoteleft{% 5778 \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax 5779 `% 5780 \else 5781 \char'22 5782 \fi 5783} 5784% 5785\begingroup 5786 \catcode`\^^I=\active 5787 \gdef\tabexpand{% 5788 \catcode`\^^I=\active 5789 \def^^I{\leavevmode\egroup 5790 \dimen0=\wd0 % the width so far, or since the previous tab 5791 \divide\dimen0 by\tabw 5792 \multiply\dimen0 by\tabw % compute previous multiple of \tabw 5793 \advance\dimen0 by\tabw % advance to next multiple of \tabw 5794 \wd0=\dimen0 \box0 \starttabbox 5795 }% 5796 } 5797 \catcode`\'=\active 5798 \gdef\rquoteexpand{\catcode\rquoteChar=\active \def'{\codequoteright}}% 5799 % 5800 \catcode`\`=\active 5801 \gdef\lquoteexpand{\catcode\lquoteChar=\active \def`{\codequoteleft}}% 5802 % 5803 \gdef\quoteexpand{\rquoteexpand \lquoteexpand}% 5804\endgroup 5805 5806% start the verbatim environment. 5807\def\setupverbatim{% 5808 \let\nonarrowing = t% 5809 \nonfillstart 5810 % Easiest (and conventionally used) font for verbatim 5811 \tt 5812 \def\par{\leavevmode\egroup\box0\endgraf}% 5813 \catcode`\`=\active 5814 \tabexpand 5815 \quoteexpand 5816 % Respect line breaks, 5817 % print special symbols as themselves, and 5818 % make each space count 5819 % must do in this order: 5820 \obeylines \uncatcodespecials \sepspaces 5821 \everypar{\starttabbox}% 5822} 5823 5824% Do the @verb magic: verbatim text is quoted by unique 5825% delimiter characters. Before first delimiter expect a 5826% right brace, after last delimiter expect closing brace: 5827% 5828% \def\doverb'{'<char>#1<char>'}'{#1} 5829% 5830% [Knuth] p. 382; only eat outer {} 5831\begingroup 5832 \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other 5833 \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next] 5834\endgroup 5835% 5836\def\verb{\begingroup\setupverb\doverb} 5837% 5838% 5839% Do the @verbatim magic: define the macro \doverbatim so that 5840% the (first) argument ends when '@end verbatim' is reached, ie: 5841% 5842% \def\doverbatim#1@end verbatim{#1} 5843% 5844% For Texinfo it's a lot easier than for LaTeX, 5845% because texinfo's \verbatim doesn't stop at '\end{verbatim}': 5846% we need not redefine '\', '{' and '}'. 5847% 5848% Inspired by LaTeX's verbatim command set [latex.ltx] 5849% 5850\begingroup 5851 \catcode`\ =\active 5852 \obeylines % 5853 % ignore everything up to the first ^^M, that's the newline at the end 5854 % of the @verbatim input line itself. Otherwise we get an extra blank 5855 % line in the output. 5856 \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}% 5857 % We really want {...\end verbatim} in the body of the macro, but 5858 % without the active space; thus we have to use \xdef and \gobble. 5859\endgroup 5860% 5861\envdef\verbatim{% 5862 \setupverbatim\doverbatim 5863} 5864\let\Everbatim = \afterenvbreak 5865 5866 5867% @verbatiminclude FILE - insert text of file in verbatim environment. 5868% 5869\def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude} 5870% 5871\def\doverbatiminclude#1{% 5872 {% 5873 \makevalueexpandable 5874 \setupverbatim 5875 \input #1 5876 \afterenvbreak 5877 }% 5878} 5879 5880% @copying ... @end copying. 5881% Save the text away for @insertcopying later. 5882% 5883% We save the uninterpreted tokens, rather than creating a box. 5884% Saving the text in a box would be much easier, but then all the 5885% typesetting commands (@smallbook, font changes, etc.) have to be done 5886% beforehand -- and a) we want @copying to be done first in the source 5887% file; b) letting users define the frontmatter in as flexible order as 5888% possible is very desirable. 5889% 5890\def\copying{\checkenv{}\begingroup\scanargctxt\docopying} 5891\def\docopying#1@end copying{\endgroup\def\copyingtext{#1}} 5892% 5893\def\insertcopying{% 5894 \begingroup 5895 \parindent = 0pt % paragraph indentation looks wrong on title page 5896 \scanexp\copyingtext 5897 \endgroup 5898} 5899 5900 5901\message{defuns,} 5902% @defun etc. 5903 5904\newskip\defbodyindent \defbodyindent=.4in 5905\newskip\defargsindent \defargsindent=50pt 5906\newskip\deflastargmargin \deflastargmargin=18pt 5907\newcount\defunpenalty 5908 5909% Start the processing of @deffn: 5910\def\startdefun{% 5911 \ifnum\lastpenalty<10000 5912 \medbreak 5913 \defunpenalty=10003 % Will keep this @deffn together with the 5914 % following @def command, see below. 5915 \else 5916 % If there are two @def commands in a row, we'll have a \nobreak, 5917 % which is there to keep the function description together with its 5918 % header. But if there's nothing but headers, we need to allow a 5919 % break somewhere. Check specifically for penalty 10002, inserted 5920 % by \printdefunline, instead of 10000, since the sectioning 5921 % commands also insert a nobreak penalty, and we don't want to allow 5922 % a break between a section heading and a defun. 5923 % 5924 % As a minor refinement, we avoid "club" headers by signalling 5925 % with penalty of 10003 after the very first @deffn in the 5926 % sequence (see above), and penalty of 10002 after any following 5927 % @def command. 5928 \ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \fi 5929 % 5930 % Similarly, after a section heading, do not allow a break. 5931 % But do insert the glue. 5932 \medskip % preceded by discardable penalty, so not a breakpoint 5933 \fi 5934 % 5935 \parindent=0in 5936 \advance\leftskip by \defbodyindent 5937 \exdentamount=\defbodyindent 5938} 5939 5940\def\dodefunx#1{% 5941 % First, check whether we are in the right environment: 5942 \checkenv#1% 5943 % 5944 % As above, allow line break if we have multiple x headers in a row. 5945 % It's not a great place, though. 5946 \ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi 5947 % 5948 % And now, it's time to reuse the body of the original defun: 5949 \expandafter\gobbledefun#1% 5950} 5951\def\gobbledefun#1\startdefun{} 5952 5953% \printdefunline \deffnheader{text} 5954% 5955\def\printdefunline#1#2{% 5956 \begingroup 5957 % call \deffnheader: 5958 #1#2 \endheader 5959 % common ending: 5960 \interlinepenalty = 10000 5961 \advance\rightskip by 0pt plus 1fil 5962 \endgraf 5963 \nobreak\vskip -\parskip 5964 \penalty\defunpenalty % signal to \startdefun and \dodefunx 5965 % Some of the @defun-type tags do not enable magic parentheses, 5966 % rendering the following check redundant. But we don't optimize. 5967 \checkparencounts 5968 \endgroup 5969} 5970 5971\def\Edefun{\endgraf\medbreak} 5972 5973% \makedefun{deffn} creates \deffn, \deffnx and \Edeffn; 5974% the only thing remainnig is to define \deffnheader. 5975% 5976\def\makedefun#1{% 5977 \expandafter\let\csname E#1\endcsname = \Edefun 5978 \edef\temp{\noexpand\domakedefun 5979 \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}% 5980 \temp 5981} 5982 5983% \domakedefun \deffn \deffnx \deffnheader 5984% 5985% Define \deffn and \deffnx, without parameters. 5986% \deffnheader has to be defined explicitly. 5987% 5988\def\domakedefun#1#2#3{% 5989 \envdef#1{% 5990 \startdefun 5991 \parseargusing\activeparens{\printdefunline#3}% 5992 }% 5993 \def#2{\dodefunx#1}% 5994 \def#3% 5995} 5996 5997%%% Untyped functions: 5998 5999% @deffn category name args 6000\makedefun{deffn}{\deffngeneral{}} 6001 6002% @deffn category class name args 6003\makedefun{defop}#1 {\defopon{#1\ \putwordon}} 6004 6005% \defopon {category on}class name args 6006\def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } 6007 6008% \deffngeneral {subind}category name args 6009% 6010\def\deffngeneral#1#2 #3 #4\endheader{% 6011 % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}. 6012 \dosubind{fn}{\code{#3}}{#1}% 6013 \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}% 6014} 6015 6016%%% Typed functions: 6017 6018% @deftypefn category type name args 6019\makedefun{deftypefn}{\deftypefngeneral{}} 6020 6021% @deftypeop category class type name args 6022\makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}} 6023 6024% \deftypeopon {category on}class type name args 6025\def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } 6026 6027% \deftypefngeneral {subind}category type name args 6028% 6029\def\deftypefngeneral#1#2 #3 #4 #5\endheader{% 6030 \dosubind{fn}{\code{#4}}{#1}% 6031 \defname{#2}{#3}{#4}\defunargs{#5\unskip}% 6032} 6033 6034%%% Typed variables: 6035 6036% @deftypevr category type var args 6037\makedefun{deftypevr}{\deftypecvgeneral{}} 6038 6039% @deftypecv category class type var args 6040\makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}} 6041 6042% \deftypecvof {category of}class type var args 6043\def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} } 6044 6045% \deftypecvgeneral {subind}category type var args 6046% 6047\def\deftypecvgeneral#1#2 #3 #4 #5\endheader{% 6048 \dosubind{vr}{\code{#4}}{#1}% 6049 \defname{#2}{#3}{#4}\defunargs{#5\unskip}% 6050} 6051 6052%%% Untyped variables: 6053 6054% @defvr category var args 6055\makedefun{defvr}#1 {\deftypevrheader{#1} {} } 6056 6057% @defcv category class var args 6058\makedefun{defcv}#1 {\defcvof{#1\ \putwordof}} 6059 6060% \defcvof {category of}class var args 6061\def\defcvof#1#2 {\deftypecvof{#1}#2 {} } 6062 6063%%% Type: 6064% @deftp category name args 6065\makedefun{deftp}#1 #2 #3\endheader{% 6066 \doind{tp}{\code{#2}}% 6067 \defname{#1}{}{#2}\defunargs{#3\unskip}% 6068} 6069 6070% Remaining @defun-like shortcuts: 6071\makedefun{defun}{\deffnheader{\putwordDeffunc} } 6072\makedefun{defmac}{\deffnheader{\putwordDefmac} } 6073\makedefun{defspec}{\deffnheader{\putwordDefspec} } 6074\makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} } 6075\makedefun{defvar}{\defvrheader{\putwordDefvar} } 6076\makedefun{defopt}{\defvrheader{\putwordDefopt} } 6077\makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} } 6078\makedefun{defmethod}{\defopon\putwordMethodon} 6079\makedefun{deftypemethod}{\deftypeopon\putwordMethodon} 6080\makedefun{defivar}{\defcvof\putwordInstanceVariableof} 6081\makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof} 6082 6083% \defname, which formats the name of the @def (not the args). 6084% #1 is the category, such as "Function". 6085% #2 is the return type, if any. 6086% #3 is the function name. 6087% 6088% We are followed by (but not passed) the arguments, if any. 6089% 6090\def\defname#1#2#3{% 6091 % Get the values of \leftskip and \rightskip as they were outside the @def... 6092 \advance\leftskip by -\defbodyindent 6093 % 6094 % How we'll format the type name. Putting it in brackets helps 6095 % distinguish it from the body text that may end up on the next line 6096 % just below it. 6097 \def\temp{#1}% 6098 \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi} 6099 % 6100 % Figure out line sizes for the paragraph shape. 6101 % The first line needs space for \box0; but if \rightskip is nonzero, 6102 % we need only space for the part of \box0 which exceeds it: 6103 \dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip 6104 % The continuations: 6105 \dimen2=\hsize \advance\dimen2 by -\defargsindent 6106 % (plain.tex says that \dimen1 should be used only as global.) 6107 \parshape 2 0in \dimen0 \defargsindent \dimen2 6108 % 6109 % Put the type name to the right margin. 6110 \noindent 6111 \hbox to 0pt{% 6112 \hfil\box0 \kern-\hsize 6113 % \hsize has to be shortened this way: 6114 \kern\leftskip 6115 % Intentionally do not respect \rightskip, since we need the space. 6116 }% 6117 % 6118 % Allow all lines to be underfull without complaint: 6119 \tolerance=10000 \hbadness=10000 6120 \exdentamount=\defbodyindent 6121 {% 6122 % defun fonts. We use typewriter by default (used to be bold) because: 6123 % . we're printing identifiers, they should be in tt in principle. 6124 % . in languages with many accents, such as Czech or French, it's 6125 % common to leave accents off identifiers. The result looks ok in 6126 % tt, but exceedingly strange in rm. 6127 % . we don't want -- and --- to be treated as ligatures. 6128 % . this still does not fix the ?` and !` ligatures, but so far no 6129 % one has made identifiers using them :). 6130 \df \tt 6131 \def\temp{#2}% return value type 6132 \ifx\temp\empty\else \tclose{\temp} \fi 6133 #3% output function name 6134 }% 6135 {\rm\enskip}% hskip 0.5 em of \tenrm 6136 % 6137 \boldbrax 6138 % arguments will be output next, if any. 6139} 6140 6141% Print arguments in slanted roman (not ttsl), inconsistently with using 6142% tt for the name. This is because literal text is sometimes needed in 6143% the argument list (groff manual), and ttsl and tt are not very 6144% distinguishable. Prevent hyphenation at `-' chars. 6145% 6146\def\defunargs#1{% 6147 % use sl by default (not ttsl), 6148 % tt for the names. 6149 \df \sl \hyphenchar\font=0 6150 % 6151 % On the other hand, if an argument has two dashes (for instance), we 6152 % want a way to get ttsl. Let's try @var for that. 6153 \let\var=\ttslanted 6154 #1% 6155 \sl\hyphenchar\font=45 6156} 6157 6158% We want ()&[] to print specially on the defun line. 6159% 6160\def\activeparens{% 6161 \catcode`\(=\active \catcode`\)=\active 6162 \catcode`\[=\active \catcode`\]=\active 6163 \catcode`\&=\active 6164} 6165 6166% Make control sequences which act like normal parenthesis chars. 6167\let\lparen = ( \let\rparen = ) 6168 6169% Be sure that we always have a definition for `(', etc. For example, 6170% if the fn name has parens in it, \boldbrax will not be in effect yet, 6171% so TeX would otherwise complain about undefined control sequence. 6172{ 6173 \activeparens 6174 \global\let(=\lparen \global\let)=\rparen 6175 \global\let[=\lbrack \global\let]=\rbrack 6176 \global\let& = \& 6177 6178 \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} 6179 \gdef\magicamp{\let&=\amprm} 6180} 6181 6182\newcount\parencount 6183 6184% If we encounter &foo, then turn on ()-hacking afterwards 6185\newif\ifampseen 6186\def\amprm#1 {\ampseentrue{\bf\ }} 6187 6188\def\parenfont{% 6189 \ifampseen 6190 % At the first level, print parens in roman, 6191 % otherwise use the default font. 6192 \ifnum \parencount=1 \rm \fi 6193 \else 6194 % The \sf parens (in \boldbrax) actually are a little bolder than 6195 % the contained text. This is especially needed for [ and ] . 6196 \sf 6197 \fi 6198} 6199\def\infirstlevel#1{% 6200 \ifampseen 6201 \ifnum\parencount=1 6202 #1% 6203 \fi 6204 \fi 6205} 6206\def\bfafterword#1 {#1 \bf} 6207 6208\def\opnr{% 6209 \global\advance\parencount by 1 6210 {\parenfont(}% 6211 \infirstlevel \bfafterword 6212} 6213\def\clnr{% 6214 {\parenfont)}% 6215 \infirstlevel \sl 6216 \global\advance\parencount by -1 6217} 6218 6219\newcount\brackcount 6220\def\lbrb{% 6221 \global\advance\brackcount by 1 6222 {\bf[}% 6223} 6224\def\rbrb{% 6225 {\bf]}% 6226 \global\advance\brackcount by -1 6227} 6228 6229\def\checkparencounts{% 6230 \ifnum\parencount=0 \else \badparencount \fi 6231 \ifnum\brackcount=0 \else \badbrackcount \fi 6232} 6233\def\badparencount{% 6234 \errmessage{Unbalanced parentheses in @def}% 6235 \global\parencount=0 6236} 6237\def\badbrackcount{% 6238 \errmessage{Unbalanced square braces in @def}% 6239 \global\brackcount=0 6240} 6241 6242 6243\message{macros,} 6244% @macro. 6245 6246% To do this right we need a feature of e-TeX, \scantokens, 6247% which we arrange to emulate with a temporary file in ordinary TeX. 6248\ifx\eTeXversion\undefined 6249 \newwrite\macscribble 6250 \def\scantokens#1{% 6251 \toks0={#1}% 6252 \immediate\openout\macscribble=\jobname.tmp 6253 \immediate\write\macscribble{\the\toks0}% 6254 \immediate\closeout\macscribble 6255 \input \jobname.tmp 6256 } 6257\fi 6258 6259\def\scanmacro#1{% 6260 \begingroup 6261 \newlinechar`\^^M 6262 \let\xeatspaces\eatspaces 6263 % Undo catcode changes of \startcontents and \doprintindex 6264 % When called from @insertcopying or (short)caption, we need active 6265 % backslash to get it printed correctly. Previously, we had 6266 % \catcode`\\=\other instead. We'll see whether a problem appears 6267 % with macro expansion. --kasal, 19aug04 6268 \catcode`\@=0 \catcode`\\=\active \escapechar=`\@ 6269 % ... and \example 6270 \spaceisspace 6271 % 6272 % Append \endinput to make sure that TeX does not see the ending newline. 6273 % I've verified that it is necessary both for e-TeX and for ordinary TeX 6274 % --kasal, 29nov03 6275 \scantokens{#1\endinput}% 6276 \endgroup 6277} 6278 6279\def\scanexp#1{% 6280 \edef\temp{\noexpand\scanmacro{#1}}% 6281 \temp 6282} 6283 6284\newcount\paramno % Count of parameters 6285\newtoks\macname % Macro name 6286\newif\ifrecursive % Is it recursive? 6287 6288% List of all defined macros in the form 6289% \definedummyword\macro1\definedummyword\macro2... 6290% Currently is also contains all @aliases; the list can be split 6291% if there is a need. 6292\def\macrolist{} 6293 6294% Add the macro to \macrolist 6295\def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname} 6296\def\addtomacrolistxxx#1{% 6297 \toks0 = \expandafter{\macrolist\definedummyword#1}% 6298 \xdef\macrolist{\the\toks0}% 6299} 6300 6301% Utility routines. 6302% This does \let #1 = #2, with \csnames; that is, 6303% \let \csname#1\endcsname = \csname#2\endcsname 6304% (except of course we have to play expansion games). 6305% 6306\def\cslet#1#2{% 6307 \expandafter\let 6308 \csname#1\expandafter\endcsname 6309 \csname#2\endcsname 6310} 6311 6312% Trim leading and trailing spaces off a string. 6313% Concepts from aro-bend problem 15 (see CTAN). 6314{\catcode`\@=11 6315\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }} 6316\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@} 6317\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @} 6318\def\unbrace#1{#1} 6319\unbrace{\gdef\trim@@@ #1 } #2@{#1} 6320} 6321 6322% Trim a single trailing ^^M off a string. 6323{\catcode`\^^M=\other \catcode`\Q=3% 6324\gdef\eatcr #1{\eatcra #1Q^^MQ}% 6325\gdef\eatcra#1^^MQ{\eatcrb#1Q}% 6326\gdef\eatcrb#1Q#2Q{#1}% 6327} 6328 6329% Macro bodies are absorbed as an argument in a context where 6330% all characters are catcode 10, 11 or 12, except \ which is active 6331% (as in normal texinfo). It is necessary to change the definition of \. 6332 6333% It's necessary to have hard CRs when the macro is executed. This is 6334% done by making ^^M (\endlinechar) catcode 12 when reading the macro 6335% body, and then making it the \newlinechar in \scanmacro. 6336 6337\def\scanctxt{% 6338 \catcode`\"=\other 6339 \catcode`\+=\other 6340 \catcode`\<=\other 6341 \catcode`\>=\other 6342 \catcode`\@=\other 6343 \catcode`\^=\other 6344 \catcode`\_=\other 6345 \catcode`\|=\other 6346 \catcode`\~=\other 6347} 6348 6349\def\scanargctxt{% 6350 \scanctxt 6351 \catcode`\\=\other 6352 \catcode`\^^M=\other 6353} 6354 6355\def\macrobodyctxt{% 6356 \scanctxt 6357 \catcode`\{=\other 6358 \catcode`\}=\other 6359 \catcode`\^^M=\other 6360 \usembodybackslash 6361} 6362 6363\def\macroargctxt{% 6364 \scanctxt 6365 \catcode`\\=\other 6366} 6367 6368% \mbodybackslash is the definition of \ in @macro bodies. 6369% It maps \foo\ => \csname macarg.foo\endcsname => #N 6370% where N is the macro parameter number. 6371% We define \csname macarg.\endcsname to be \realbackslash, so 6372% \\ in macro replacement text gets you a backslash. 6373 6374{\catcode`@=0 @catcode`@\=@active 6375 @gdef@usembodybackslash{@let\=@mbodybackslash} 6376 @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname} 6377} 6378\expandafter\def\csname macarg.\endcsname{\realbackslash} 6379 6380\def\macro{\recursivefalse\parsearg\macroxxx} 6381\def\rmacro{\recursivetrue\parsearg\macroxxx} 6382 6383\def\macroxxx#1{% 6384 \getargs{#1}% now \macname is the macname and \argl the arglist 6385 \ifx\argl\empty % no arguments 6386 \paramno=0% 6387 \else 6388 \expandafter\parsemargdef \argl;% 6389 \fi 6390 \if1\csname ismacro.\the\macname\endcsname 6391 \message{Warning: redefining \the\macname}% 6392 \else 6393 \expandafter\ifx\csname \the\macname\endcsname \relax 6394 \else \errmessage{Macro name \the\macname\space already defined}\fi 6395 \global\cslet{macsave.\the\macname}{\the\macname}% 6396 \global\expandafter\let\csname ismacro.\the\macname\endcsname=1% 6397 \addtomacrolist{\the\macname}% 6398 \fi 6399 \begingroup \macrobodyctxt 6400 \ifrecursive \expandafter\parsermacbody 6401 \else \expandafter\parsemacbody 6402 \fi} 6403 6404\parseargdef\unmacro{% 6405 \if1\csname ismacro.#1\endcsname 6406 \global\cslet{#1}{macsave.#1}% 6407 \global\expandafter\let \csname ismacro.#1\endcsname=0% 6408 % Remove the macro name from \macrolist: 6409 \begingroup 6410 \expandafter\let\csname#1\endcsname \relax 6411 \let\definedummyword\unmacrodo 6412 \xdef\macrolist{\macrolist}% 6413 \endgroup 6414 \else 6415 \errmessage{Macro #1 not defined}% 6416 \fi 6417} 6418 6419% Called by \do from \dounmacro on each macro. The idea is to omit any 6420% macro definitions that have been changed to \relax. 6421% 6422\def\unmacrodo#1{% 6423 \ifx #1\relax 6424 % remove this 6425 \else 6426 \noexpand\definedummyword \noexpand#1% 6427 \fi 6428} 6429 6430% This makes use of the obscure feature that if the last token of a 6431% <parameter list> is #, then the preceding argument is delimited by 6432% an opening brace, and that opening brace is not consumed. 6433\def\getargs#1{\getargsxxx#1{}} 6434\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs} 6435\def\getmacname #1 #2\relax{\macname={#1}} 6436\def\getmacargs#1{\def\argl{#1}} 6437 6438% Parse the optional {params} list. Set up \paramno and \paramlist 6439% so \defmacro knows what to do. Define \macarg.blah for each blah 6440% in the params list, to be ##N where N is the position in that list. 6441% That gets used by \mbodybackslash (above). 6442 6443% We need to get `macro parameter char #' into several definitions. 6444% The technique used is stolen from LaTeX: let \hash be something 6445% unexpandable, insert that wherever you need a #, and then redefine 6446% it to # just before using the token list produced. 6447% 6448% The same technique is used to protect \eatspaces till just before 6449% the macro is used. 6450 6451\def\parsemargdef#1;{\paramno=0\def\paramlist{}% 6452 \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,} 6453\def\parsemargdefxxx#1,{% 6454 \if#1;\let\next=\relax 6455 \else \let\next=\parsemargdefxxx 6456 \advance\paramno by 1% 6457 \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname 6458 {\xeatspaces{\hash\the\paramno}}% 6459 \edef\paramlist{\paramlist\hash\the\paramno,}% 6460 \fi\next} 6461 6462% These two commands read recursive and nonrecursive macro bodies. 6463% (They're different since rec and nonrec macros end differently.) 6464 6465\long\def\parsemacbody#1@end macro% 6466{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% 6467\long\def\parsermacbody#1@end rmacro% 6468{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% 6469 6470% This defines the macro itself. There are six cases: recursive and 6471% nonrecursive macros of zero, one, and many arguments. 6472% Much magic with \expandafter here. 6473% \xdef is used so that macro definitions will survive the file 6474% they're defined in; @include reads the file inside a group. 6475\def\defmacro{% 6476 \let\hash=##% convert placeholders to macro parameter chars 6477 \ifrecursive 6478 \ifcase\paramno 6479 % 0 6480 \expandafter\xdef\csname\the\macname\endcsname{% 6481 \noexpand\scanmacro{\temp}}% 6482 \or % 1 6483 \expandafter\xdef\csname\the\macname\endcsname{% 6484 \bgroup\noexpand\macroargctxt 6485 \noexpand\braceorline 6486 \expandafter\noexpand\csname\the\macname xxx\endcsname}% 6487 \expandafter\xdef\csname\the\macname xxx\endcsname##1{% 6488 \egroup\noexpand\scanmacro{\temp}}% 6489 \else % many 6490 \expandafter\xdef\csname\the\macname\endcsname{% 6491 \bgroup\noexpand\macroargctxt 6492 \noexpand\csname\the\macname xx\endcsname}% 6493 \expandafter\xdef\csname\the\macname xx\endcsname##1{% 6494 \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% 6495 \expandafter\expandafter 6496 \expandafter\xdef 6497 \expandafter\expandafter 6498 \csname\the\macname xxx\endcsname 6499 \paramlist{\egroup\noexpand\scanmacro{\temp}}% 6500 \fi 6501 \else 6502 \ifcase\paramno 6503 % 0 6504 \expandafter\xdef\csname\the\macname\endcsname{% 6505 \noexpand\norecurse{\the\macname}% 6506 \noexpand\scanmacro{\temp}\egroup}% 6507 \or % 1 6508 \expandafter\xdef\csname\the\macname\endcsname{% 6509 \bgroup\noexpand\macroargctxt 6510 \noexpand\braceorline 6511 \expandafter\noexpand\csname\the\macname xxx\endcsname}% 6512 \expandafter\xdef\csname\the\macname xxx\endcsname##1{% 6513 \egroup 6514 \noexpand\norecurse{\the\macname}% 6515 \noexpand\scanmacro{\temp}\egroup}% 6516 \else % many 6517 \expandafter\xdef\csname\the\macname\endcsname{% 6518 \bgroup\noexpand\macroargctxt 6519 \expandafter\noexpand\csname\the\macname xx\endcsname}% 6520 \expandafter\xdef\csname\the\macname xx\endcsname##1{% 6521 \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% 6522 \expandafter\expandafter 6523 \expandafter\xdef 6524 \expandafter\expandafter 6525 \csname\the\macname xxx\endcsname 6526 \paramlist{% 6527 \egroup 6528 \noexpand\norecurse{\the\macname}% 6529 \noexpand\scanmacro{\temp}\egroup}% 6530 \fi 6531 \fi} 6532 6533\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} 6534 6535% \braceorline decides whether the next nonwhitespace character is a 6536% {. If so it reads up to the closing }, if not, it reads the whole 6537% line. Whatever was read is then fed to the next control sequence 6538% as an argument (by \parsebrace or \parsearg) 6539\def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx} 6540\def\braceorlinexxx{% 6541 \ifx\nchar\bgroup\else 6542 \expandafter\parsearg 6543 \fi \macnamexxx} 6544 6545 6546% @alias. 6547% We need some trickery to remove the optional spaces around the equal 6548% sign. Just make them active and then expand them all to nothing. 6549\def\alias{\parseargusing\obeyspaces\aliasxxx} 6550\def\aliasxxx #1{\aliasyyy#1\relax} 6551\def\aliasyyy #1=#2\relax{% 6552 {% 6553 \expandafter\let\obeyedspace=\empty 6554 \addtomacrolist{#1}% 6555 \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}% 6556 }% 6557 \next 6558} 6559 6560 6561\message{cross references,} 6562 6563\newwrite\auxfile 6564\newif\ifhavexrefs % True if xref values are known. 6565\newif\ifwarnedxrefs % True if we warned once that they aren't known. 6566 6567% @inforef is relatively simple. 6568\def\inforef #1{\inforefzzz #1,,,,**} 6569\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, 6570 node \samp{\ignorespaces#1{}}} 6571 6572% @node's only job in TeX is to define \lastnode, which is used in 6573% cross-references. The @node line might or might not have commas, and 6574% might or might not have spaces before the first comma, like: 6575% @node foo , bar , ... 6576% We don't want such trailing spaces in the node name. 6577% 6578\parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse} 6579% 6580% also remove a trailing comma, in case of something like this: 6581% @node Help-Cross, , , Cross-refs 6582\def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse} 6583\def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}} 6584 6585\let\nwnode=\node 6586\let\lastnode=\empty 6587 6588% Write a cross-reference definition for the current node. #1 is the 6589% type (Ynumbered, Yappendix, Ynothing). 6590% 6591\def\donoderef#1{% 6592 \ifx\lastnode\empty\else 6593 \setref{\lastnode}{#1}% 6594 \global\let\lastnode=\empty 6595 \fi 6596} 6597 6598% @anchor{NAME} -- define xref target at arbitrary point. 6599% 6600\newcount\savesfregister 6601% 6602\def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi} 6603\def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi} 6604\def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces} 6605 6606% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an 6607% anchor), which consists of three parts: 6608% 1) NAME-title - the current sectioning name taken from \thissection, 6609% or the anchor name. 6610% 2) NAME-snt - section number and type, passed as the SNT arg, or 6611% empty for anchors. 6612% 3) NAME-pg - the page number. 6613% 6614% This is called from \donoderef, \anchor, and \dofloat. In the case of 6615% floats, there is an additional part, which is not written here: 6616% 4) NAME-lof - the text as it should appear in a @listoffloats. 6617% 6618\def\setref#1#2{% 6619 \pdfmkdest{#1}% 6620 \iflinks 6621 {% 6622 \atdummies % preserve commands, but don't expand them 6623 \edef\writexrdef##1##2{% 6624 \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef 6625 ##1}{##2}}% these are parameters of \writexrdef 6626 }% 6627 \toks0 = \expandafter{\thissection}% 6628 \immediate \writexrdef{title}{\the\toks0 }% 6629 \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc. 6630 \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, during \shipout 6631 }% 6632 \fi 6633} 6634 6635% @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is 6636% the node name, #2 the name of the Info cross-reference, #3 the printed 6637% node name, #4 the name of the Info file, #5 the name of the printed 6638% manual. All but the node name can be omitted. 6639% 6640\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]} 6641\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} 6642\def\ref#1{\xrefX[#1,,,,,,,]} 6643\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup 6644 \unsepspaces 6645 \def\printedmanual{\ignorespaces #5}% 6646 \def\printedrefname{\ignorespaces #3}% 6647 \setbox1=\hbox{\printedmanual\unskip}% 6648 \setbox0=\hbox{\printedrefname\unskip}% 6649 \ifdim \wd0 = 0pt 6650 % No printed node name was explicitly given. 6651 \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax 6652 % Use the node name inside the square brackets. 6653 \def\printedrefname{\ignorespaces #1}% 6654 \else 6655 % Use the actual chapter/section title appear inside 6656 % the square brackets. Use the real section title if we have it. 6657 \ifdim \wd1 > 0pt 6658 % It is in another manual, so we don't have it. 6659 \def\printedrefname{\ignorespaces #1}% 6660 \else 6661 \ifhavexrefs 6662 % We know the real title if we have the xref values. 6663 \def\printedrefname{\refx{#1-title}{}}% 6664 \else 6665 % Otherwise just copy the Info node name. 6666 \def\printedrefname{\ignorespaces #1}% 6667 \fi% 6668 \fi 6669 \fi 6670 \fi 6671 % 6672 % Make link in pdf output. 6673 \ifpdf 6674 \leavevmode 6675 \getfilename{#4}% 6676 {\indexnofonts 6677 \turnoffactive 6678 % See comments at \activebackslashdouble. 6679 {\activebackslashdouble \xdef\pdfxrefdest{#1}% 6680 \backslashparens\pdfxrefdest}% 6681 % 6682 \ifnum\filenamelength>0 6683 \startlink attr{/Border [0 0 0]}% 6684 goto file{\the\filename.pdf} name{\pdfxrefdest}% 6685 \else 6686 \startlink attr{/Border [0 0 0]}% 6687 goto name{\pdfmkpgn{\pdfxrefdest}}% 6688 \fi 6689 }% 6690 \linkcolor 6691 \fi 6692 % 6693 % Float references are printed completely differently: "Figure 1.2" 6694 % instead of "[somenode], p.3". We distinguish them by the 6695 % LABEL-title being set to a magic string. 6696 {% 6697 % Have to otherify everything special to allow the \csname to 6698 % include an _ in the xref name, etc. 6699 \indexnofonts 6700 \turnoffactive 6701 \expandafter\global\expandafter\let\expandafter\Xthisreftitle 6702 \csname XR#1-title\endcsname 6703 }% 6704 \iffloat\Xthisreftitle 6705 % If the user specified the print name (third arg) to the ref, 6706 % print it instead of our usual "Figure 1.2". 6707 \ifdim\wd0 = 0pt 6708 \refx{#1-snt}{}% 6709 \else 6710 \printedrefname 6711 \fi 6712 % 6713 % if the user also gave the printed manual name (fifth arg), append 6714 % "in MANUALNAME". 6715 \ifdim \wd1 > 0pt 6716 \space \putwordin{} \cite{\printedmanual}% 6717 \fi 6718 \else 6719 % node/anchor (non-float) references. 6720 % 6721 % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not 6722 % insert empty discretionaries after hyphens, which means that it will 6723 % not find a line break at a hyphen in a node names. Since some manuals 6724 % are best written with fairly long node names, containing hyphens, this 6725 % is a loss. Therefore, we give the text of the node name again, so it 6726 % is as if TeX is seeing it for the first time. 6727 \ifdim \wd1 > 0pt 6728 \putwordsection{} ``\printedrefname'' \putwordin{} \cite{\printedmanual}% 6729 \else 6730 % _ (for example) has to be the character _ for the purposes of the 6731 % control sequence corresponding to the node, but it has to expand 6732 % into the usual \leavevmode...\vrule stuff for purposes of 6733 % printing. So we \turnoffactive for the \refx-snt, back on for the 6734 % printing, back off for the \refx-pg. 6735 {\turnoffactive 6736 % Only output a following space if the -snt ref is nonempty; for 6737 % @unnumbered and @anchor, it won't be. 6738 \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}% 6739 \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi 6740 }% 6741 % output the `[mynode]' via a macro so it can be overridden. 6742 \xrefprintnodename\printedrefname 6743 % 6744 % But we always want a comma and a space: 6745 ,\space 6746 % 6747 % output the `page 3'. 6748 \turnoffactive \putwordpage\tie\refx{#1-pg}{}% 6749 \fi 6750 \fi 6751 \endlink 6752\endgroup} 6753 6754% This macro is called from \xrefX for the `[nodename]' part of xref 6755% output. It's a separate macro only so it can be changed more easily, 6756% since square brackets don't work well in some documents. Particularly 6757% one that Bob is working on :). 6758% 6759\def\xrefprintnodename#1{[#1]} 6760 6761% Things referred to by \setref. 6762% 6763\def\Ynothing{} 6764\def\Yomitfromtoc{} 6765\def\Ynumbered{% 6766 \ifnum\secno=0 6767 \putwordChapter@tie \the\chapno 6768 \else \ifnum\subsecno=0 6769 \putwordSection@tie \the\chapno.\the\secno 6770 \else \ifnum\subsubsecno=0 6771 \putwordSection@tie \the\chapno.\the\secno.\the\subsecno 6772 \else 6773 \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno 6774 \fi\fi\fi 6775} 6776\def\Yappendix{% 6777 \ifnum\secno=0 6778 \putwordAppendix@tie @char\the\appendixno{}% 6779 \else \ifnum\subsecno=0 6780 \putwordSection@tie @char\the\appendixno.\the\secno 6781 \else \ifnum\subsubsecno=0 6782 \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno 6783 \else 6784 \putwordSection@tie 6785 @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno 6786 \fi\fi\fi 6787} 6788 6789% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME. 6790% If its value is nonempty, SUFFIX is output afterward. 6791% 6792\def\refx#1#2{% 6793 {% 6794 \indexnofonts 6795 \otherbackslash 6796 \expandafter\global\expandafter\let\expandafter\thisrefX 6797 \csname XR#1\endcsname 6798 }% 6799 \ifx\thisrefX\relax 6800 % If not defined, say something at least. 6801 \angleleft un\-de\-fined\angleright 6802 \iflinks 6803 \ifhavexrefs 6804 \message{\linenumber Undefined cross reference `#1'.}% 6805 \else 6806 \ifwarnedxrefs\else 6807 \global\warnedxrefstrue 6808 \message{Cross reference values unknown; you must run TeX again.}% 6809 \fi 6810 \fi 6811 \fi 6812 \else 6813 % It's defined, so just use it. 6814 \thisrefX 6815 \fi 6816 #2% Output the suffix in any case. 6817} 6818 6819% This is the macro invoked by entries in the aux file. Usually it's 6820% just a \def (we prepend XR to the control sequence name to avoid 6821% collisions). But if this is a float type, we have more work to do. 6822% 6823\def\xrdef#1#2{% 6824 {% The node name might contain 8-bit characters, which in our current 6825 % implementation are changed to commands like @'e. Don't let these 6826 % mess up the control sequence name. 6827 \indexnofonts 6828 \turnoffactive 6829 \xdef\safexrefname{#1}% 6830 }% 6831 % 6832 \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% remember this xref 6833 % 6834 % Was that xref control sequence that we just defined for a float? 6835 \expandafter\iffloat\csname XR\safexrefname\endcsname 6836 % it was a float, and we have the (safe) float type in \iffloattype. 6837 \expandafter\let\expandafter\floatlist 6838 \csname floatlist\iffloattype\endcsname 6839 % 6840 % Is this the first time we've seen this float type? 6841 \expandafter\ifx\floatlist\relax 6842 \toks0 = {\do}% yes, so just \do 6843 \else 6844 % had it before, so preserve previous elements in list. 6845 \toks0 = \expandafter{\floatlist\do}% 6846 \fi 6847 % 6848 % Remember this xref in the control sequence \floatlistFLOATTYPE, 6849 % for later use in \listoffloats. 6850 \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0 6851 {\safexrefname}}% 6852 \fi 6853} 6854 6855% Read the last existing aux file, if any. No error if none exists. 6856% 6857\def\tryauxfile{% 6858 \openin 1 \jobname.aux 6859 \ifeof 1 \else 6860 \readdatafile{aux}% 6861 \global\havexrefstrue 6862 \fi 6863 \closein 1 6864} 6865 6866\def\setupdatafile{% 6867 \catcode`\^^@=\other 6868 \catcode`\^^A=\other 6869 \catcode`\^^B=\other 6870 \catcode`\^^C=\other 6871 \catcode`\^^D=\other 6872 \catcode`\^^E=\other 6873 \catcode`\^^F=\other 6874 \catcode`\^^G=\other 6875 \catcode`\^^H=\other 6876 \catcode`\^^K=\other 6877 \catcode`\^^L=\other 6878 \catcode`\^^N=\other 6879 \catcode`\^^P=\other 6880 \catcode`\^^Q=\other 6881 \catcode`\^^R=\other 6882 \catcode`\^^S=\other 6883 \catcode`\^^T=\other 6884 \catcode`\^^U=\other 6885 \catcode`\^^V=\other 6886 \catcode`\^^W=\other 6887 \catcode`\^^X=\other 6888 \catcode`\^^Z=\other 6889 \catcode`\^^[=\other 6890 \catcode`\^^\=\other 6891 \catcode`\^^]=\other 6892 \catcode`\^^^=\other 6893 \catcode`\^^_=\other 6894 % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc. 6895 % in xref tags, i.e., node names. But since ^^e4 notation isn't 6896 % supported in the main text, it doesn't seem desirable. Furthermore, 6897 % that is not enough: for node names that actually contain a ^ 6898 % character, we would end up writing a line like this: 'xrdef {'hat 6899 % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first 6900 % argument, and \hat is not an expandable control sequence. It could 6901 % all be worked out, but why? Either we support ^^ or we don't. 6902 % 6903 % The other change necessary for this was to define \auxhat: 6904 % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter 6905 % and then to call \auxhat in \setq. 6906 % 6907 \catcode`\^=\other 6908 % 6909 % Special characters. Should be turned off anyway, but... 6910 \catcode`\~=\other 6911 \catcode`\[=\other 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 % avoid \+ for paranoia even though we've turned it off 6923 % 6924 % This is to support \ in node names and titles, since the \ 6925 % characters end up in a \csname. It's easier than 6926 % leaving it active and making its active definition an actual \ 6927 % character. What I don't understand is why it works in the *value* 6928 % of the xrdef. Seems like it should be a catcode12 \, and that 6929 % should not typeset properly. But it works, so I'm moving on for 6930 % now. --karl, 15jan04. 6931 \catcode`\\=\other 6932 % 6933 % Make the characters 128-255 be printing characters. 6934 {% 6935 \count1=128 6936 \def\loop{% 6937 \catcode\count1=\other 6938 \advance\count1 by 1 6939 \ifnum \count1<256 \loop \fi 6940 }% 6941 }% 6942 % 6943 % @ is our escape character in .aux files, and we need braces. 6944 \catcode`\{=1 6945 \catcode`\}=2 6946 \catcode`\@=0 6947} 6948 6949\def\readdatafile#1{% 6950\begingroup 6951 \setupdatafile 6952 \input\jobname.#1 6953\endgroup} 6954 6955 6956\message{insertions,} 6957% including footnotes. 6958 6959\newcount \footnoteno 6960 6961% The trailing space in the following definition for supereject is 6962% vital for proper filling; pages come out unaligned when you do a 6963% pagealignmacro call if that space before the closing brace is 6964% removed. (Generally, numeric constants should always be followed by a 6965% space to prevent strange expansion errors.) 6966\def\supereject{\par\penalty -20000\footnoteno =0 } 6967 6968% @footnotestyle is meaningful for info output only. 6969\let\footnotestyle=\comment 6970 6971{\catcode `\@=11 6972% 6973% Auto-number footnotes. Otherwise like plain. 6974\gdef\footnote{% 6975 \let\indent=\ptexindent 6976 \let\noindent=\ptexnoindent 6977 \global\advance\footnoteno by \@ne 6978 \edef\thisfootno{$^{\the\footnoteno}$}% 6979 % 6980 % In case the footnote comes at the end of a sentence, preserve the 6981 % extra spacing after we do the footnote number. 6982 \let\@sf\empty 6983 \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi 6984 % 6985 % Remove inadvertent blank space before typesetting the footnote number. 6986 \unskip 6987 \thisfootno\@sf 6988 \dofootnote 6989}% 6990 6991% Don't bother with the trickery in plain.tex to not require the 6992% footnote text as a parameter. Our footnotes don't need to be so general. 6993% 6994% Oh yes, they do; otherwise, @ifset (and anything else that uses 6995% \parseargline) fails inside footnotes because the tokens are fixed when 6996% the footnote is read. --karl, 16nov96. 6997% 6998\gdef\dofootnote{% 6999 \insert\footins\bgroup 7000 % We want to typeset this text as a normal paragraph, even if the 7001 % footnote reference occurs in (for example) a display environment. 7002 % So reset some parameters. 7003 \hsize=\pagewidth 7004 \interlinepenalty\interfootnotelinepenalty 7005 \splittopskip\ht\strutbox % top baseline for broken footnotes 7006 \splitmaxdepth\dp\strutbox 7007 \floatingpenalty\@MM 7008 \leftskip\z@skip 7009 \rightskip\z@skip 7010 \spaceskip\z@skip 7011 \xspaceskip\z@skip 7012 \parindent\defaultparindent 7013 % 7014 \smallfonts \rm 7015 % 7016 % Because we use hanging indentation in footnotes, a @noindent appears 7017 % to exdent this text, so make it be a no-op. makeinfo does not use 7018 % hanging indentation so @noindent can still be needed within footnote 7019 % text after an @example or the like (not that this is good style). 7020 \let\noindent = \relax 7021 % 7022 % Hang the footnote text off the number. Use \everypar in case the 7023 % footnote extends for more than one paragraph. 7024 \everypar = {\hang}% 7025 \textindent{\thisfootno}% 7026 % 7027 % Don't crash into the line above the footnote text. Since this 7028 % expands into a box, it must come within the paragraph, lest it 7029 % provide a place where TeX can split the footnote. 7030 \footstrut 7031 \futurelet\next\fo@t 7032} 7033}%end \catcode `\@=11 7034 7035% In case a @footnote appears in a vbox, save the footnote text and create 7036% the real \insert just after the vbox finished. Otherwise, the insertion 7037% would be lost. 7038% Similarily, if a @footnote appears inside an alignment, save the footnote 7039% text to a box and make the \insert when a row of the table is finished. 7040% And the same can be done for other insert classes. --kasal, 16nov03. 7041 7042% Replace the \insert primitive by a cheating macro. 7043% Deeper inside, just make sure that the saved insertions are not spilled 7044% out prematurely. 7045% 7046\def\startsavinginserts{% 7047 \ifx \insert\ptexinsert 7048 \let\insert\saveinsert 7049 \else 7050 \let\checkinserts\relax 7051 \fi 7052} 7053 7054% This \insert replacement works for both \insert\footins{foo} and 7055% \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}. 7056% 7057\def\saveinsert#1{% 7058 \edef\next{\noexpand\savetobox \makeSAVEname#1}% 7059 \afterassignment\next 7060 % swallow the left brace 7061 \let\temp = 7062} 7063\def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}} 7064\def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1} 7065 7066\def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi} 7067 7068\def\placesaveins#1{% 7069 \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname 7070 {\box#1}% 7071} 7072 7073% eat @SAVE -- beware, all of them have catcode \other: 7074{ 7075 \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-) 7076 \gdef\gobblesave @SAVE{} 7077} 7078 7079% initialization: 7080\def\newsaveins #1{% 7081 \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}% 7082 \next 7083} 7084\def\newsaveinsX #1{% 7085 \csname newbox\endcsname #1% 7086 \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts 7087 \checksaveins #1}% 7088} 7089 7090% initialize: 7091\let\checkinserts\empty 7092\newsaveins\footins 7093\newsaveins\margin 7094 7095 7096% @image. We use the macros from epsf.tex to support this. 7097% If epsf.tex is not installed and @image is used, we complain. 7098% 7099% Check for and read epsf.tex up front. If we read it only at @image 7100% time, we might be inside a group, and then its definitions would get 7101% undone and the next image would fail. 7102\openin 1 = epsf.tex 7103\ifeof 1 \else 7104 % Do not bother showing banner with epsf.tex v2.7k (available in 7105 % doc/epsf.tex and on ctan). 7106 \def\epsfannounce{\toks0 = }% 7107 \input epsf.tex 7108\fi 7109\closein 1 7110% 7111% We will only complain once about lack of epsf.tex. 7112\newif\ifwarnednoepsf 7113\newhelp\noepsfhelp{epsf.tex must be installed for images to 7114 work. It is also included in the Texinfo distribution, or you can get 7115 it from ftp://tug.org/tex/epsf.tex.} 7116% 7117\def\image#1{% 7118 \ifx\epsfbox\undefined 7119 \ifwarnednoepsf \else 7120 \errhelp = \noepsfhelp 7121 \errmessage{epsf.tex not found, images will be ignored}% 7122 \global\warnednoepsftrue 7123 \fi 7124 \else 7125 \imagexxx #1,,,,,\finish 7126 \fi 7127} 7128% 7129% Arguments to @image: 7130% #1 is (mandatory) image filename; we tack on .eps extension. 7131% #2 is (optional) width, #3 is (optional) height. 7132% #4 is (ignored optional) html alt text. 7133% #5 is (ignored optional) extension. 7134% #6 is just the usual extra ignored arg for parsing this stuff. 7135\newif\ifimagevmode 7136\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup 7137 \catcode`\^^M = 5 % in case we're inside an example 7138 \normalturnoffactive % allow _ et al. in names 7139 % If the image is by itself, center it. 7140 \ifvmode 7141 \imagevmodetrue 7142 \nobreak\bigskip 7143 % Usually we'll have text after the image which will insert 7144 % \parskip glue, so insert it here too to equalize the space 7145 % above and below. 7146 \nobreak\vskip\parskip 7147 \nobreak 7148 \line\bgroup 7149 \fi 7150 % 7151 % Output the image. 7152 \ifpdf 7153 \dopdfimage{#1}{#2}{#3}% 7154 \else 7155 % \epsfbox itself resets \epsf?size at each figure. 7156 \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi 7157 \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi 7158 \epsfbox{#1.eps}% 7159 \fi 7160 % 7161 \ifimagevmode \egroup \bigbreak \fi % space after the image 7162\endgroup} 7163 7164 7165% @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables, 7166% etc. We don't actually implement floating yet, we always include the 7167% float "here". But it seemed the best name for the future. 7168% 7169\envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish} 7170 7171% There may be a space before second and/or third parameter; delete it. 7172\def\eatcommaspace#1, {#1,} 7173 7174% #1 is the optional FLOATTYPE, the text label for this float, typically 7175% "Figure", "Table", "Example", etc. Can't contain commas. If omitted, 7176% this float will not be numbered and cannot be referred to. 7177% 7178% #2 is the optional xref label. Also must be present for the float to 7179% be referable. 7180% 7181% #3 is the optional positioning argument; for now, it is ignored. It 7182% will somehow specify the positions allowed to float to (here, top, bottom). 7183% 7184% We keep a separate counter for each FLOATTYPE, which we reset at each 7185% chapter-level command. 7186\let\resetallfloatnos=\empty 7187% 7188\def\dofloat#1,#2,#3,#4\finish{% 7189 \let\thiscaption=\empty 7190 \let\thisshortcaption=\empty 7191 % 7192 % don't lose footnotes inside @float. 7193 % 7194 % BEWARE: when the floats start float, we have to issue warning whenever an 7195 % insert appears inside a float which could possibly float. --kasal, 26may04 7196 % 7197 \startsavinginserts 7198 % 7199 % We can't be used inside a paragraph. 7200 \par 7201 % 7202 \vtop\bgroup 7203 \def\floattype{#1}% 7204 \def\floatlabel{#2}% 7205 \def\floatloc{#3}% we do nothing with this yet. 7206 % 7207 \ifx\floattype\empty 7208 \let\safefloattype=\empty 7209 \else 7210 {% 7211 % the floattype might have accents or other special characters, 7212 % but we need to use it in a control sequence name. 7213 \indexnofonts 7214 \turnoffactive 7215 \xdef\safefloattype{\floattype}% 7216 }% 7217 \fi 7218 % 7219 % If label is given but no type, we handle that as the empty type. 7220 \ifx\floatlabel\empty \else 7221 % We want each FLOATTYPE to be numbered separately (Figure 1, 7222 % Table 1, Figure 2, ...). (And if no label, no number.) 7223 % 7224 \expandafter\getfloatno\csname\safefloattype floatno\endcsname 7225 \global\advance\floatno by 1 7226 % 7227 {% 7228 % This magic value for \thissection is output by \setref as the 7229 % XREFLABEL-title value. \xrefX uses it to distinguish float 7230 % labels (which have a completely different output format) from 7231 % node and anchor labels. And \xrdef uses it to construct the 7232 % lists of floats. 7233 % 7234 \edef\thissection{\floatmagic=\safefloattype}% 7235 \setref{\floatlabel}{Yfloat}% 7236 }% 7237 \fi 7238 % 7239 % start with \parskip glue, I guess. 7240 \vskip\parskip 7241 % 7242 % Don't suppress indentation if a float happens to start a section. 7243 \restorefirstparagraphindent 7244} 7245 7246% we have these possibilities: 7247% @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap 7248% @float Foo,lbl & no caption: Foo 1.1 7249% @float Foo & @caption{Cap}: Foo: Cap 7250% @float Foo & no caption: Foo 7251% @float ,lbl & Caption{Cap}: 1.1: Cap 7252% @float ,lbl & no caption: 1.1 7253% @float & @caption{Cap}: Cap 7254% @float & no caption: 7255% 7256\def\Efloat{% 7257 \let\floatident = \empty 7258 % 7259 % In all cases, if we have a float type, it comes first. 7260 \ifx\floattype\empty \else \def\floatident{\floattype}\fi 7261 % 7262 % If we have an xref label, the number comes next. 7263 \ifx\floatlabel\empty \else 7264 \ifx\floattype\empty \else % if also had float type, need tie first. 7265 \appendtomacro\floatident{\tie}% 7266 \fi 7267 % the number. 7268 \appendtomacro\floatident{\chaplevelprefix\the\floatno}% 7269 \fi 7270 % 7271 % Start the printed caption with what we've constructed in 7272 % \floatident, but keep it separate; we need \floatident again. 7273 \let\captionline = \floatident 7274 % 7275 \ifx\thiscaption\empty \else 7276 \ifx\floatident\empty \else 7277 \appendtomacro\captionline{: }% had ident, so need a colon between 7278 \fi 7279 % 7280 % caption text. 7281 \appendtomacro\captionline{\scanexp\thiscaption}% 7282 \fi 7283 % 7284 % If we have anything to print, print it, with space before. 7285 % Eventually this needs to become an \insert. 7286 \ifx\captionline\empty \else 7287 \vskip.5\parskip 7288 \captionline 7289 % 7290 % Space below caption. 7291 \vskip\parskip 7292 \fi 7293 % 7294 % If have an xref label, write the list of floats info. Do this 7295 % after the caption, to avoid chance of it being a breakpoint. 7296 \ifx\floatlabel\empty \else 7297 % Write the text that goes in the lof to the aux file as 7298 % \floatlabel-lof. Besides \floatident, we include the short 7299 % caption if specified, else the full caption if specified, else nothing. 7300 {% 7301 \atdummies 7302 % 7303 % since we read the caption text in the macro world, where ^^M 7304 % is turned into a normal character, we have to scan it back, so 7305 % we don't write the literal three characters "^^M" into the aux file. 7306 \scanexp{% 7307 \xdef\noexpand\gtemp{% 7308 \ifx\thisshortcaption\empty 7309 \thiscaption 7310 \else 7311 \thisshortcaption 7312 \fi 7313 }% 7314 }% 7315 \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident 7316 \ifx\gtemp\empty \else : \gtemp \fi}}% 7317 }% 7318 \fi 7319 \egroup % end of \vtop 7320 % 7321 % place the captured inserts 7322 % 7323 % BEWARE: when the floats start floating, we have to issue warning 7324 % whenever an insert appears inside a float which could possibly 7325 % float. --kasal, 26may04 7326 % 7327 \checkinserts 7328} 7329 7330% Append the tokens #2 to the definition of macro #1, not expanding either. 7331% 7332\def\appendtomacro#1#2{% 7333 \expandafter\def\expandafter#1\expandafter{#1#2}% 7334} 7335 7336% @caption, @shortcaption 7337% 7338\def\caption{\docaption\thiscaption} 7339\def\shortcaption{\docaption\thisshortcaption} 7340\def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption} 7341\def\defcaption#1#2{\egroup \def#1{#2}} 7342 7343% The parameter is the control sequence identifying the counter we are 7344% going to use. Create it if it doesn't exist and assign it to \floatno. 7345\def\getfloatno#1{% 7346 \ifx#1\relax 7347 % Haven't seen this figure type before. 7348 \csname newcount\endcsname #1% 7349 % 7350 % Remember to reset this floatno at the next chap. 7351 \expandafter\gdef\expandafter\resetallfloatnos 7352 \expandafter{\resetallfloatnos #1=0 }% 7353 \fi 7354 \let\floatno#1% 7355} 7356 7357% \setref calls this to get the XREFLABEL-snt value. We want an @xref 7358% to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we 7359% first read the @float command. 7360% 7361\def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}% 7362 7363% Magic string used for the XREFLABEL-title value, so \xrefX can 7364% distinguish floats from other xref types. 7365\def\floatmagic{!!float!!} 7366 7367% #1 is the control sequence we are passed; we expand into a conditional 7368% which is true if #1 represents a float ref. That is, the magic 7369% \thissection value which we \setref above. 7370% 7371\def\iffloat#1{\expandafter\doiffloat#1==\finish} 7372% 7373% #1 is (maybe) the \floatmagic string. If so, #2 will be the 7374% (safe) float type for this float. We set \iffloattype to #2. 7375% 7376\def\doiffloat#1=#2=#3\finish{% 7377 \def\temp{#1}% 7378 \def\iffloattype{#2}% 7379 \ifx\temp\floatmagic 7380} 7381 7382% @listoffloats FLOATTYPE - print a list of floats like a table of contents. 7383% 7384\parseargdef\listoffloats{% 7385 \def\floattype{#1}% floattype 7386 {% 7387 % the floattype might have accents or other special characters, 7388 % but we need to use it in a control sequence name. 7389 \indexnofonts 7390 \turnoffactive 7391 \xdef\safefloattype{\floattype}% 7392 }% 7393 % 7394 % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE. 7395 \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax 7396 \ifhavexrefs 7397 % if the user said @listoffloats foo but never @float foo. 7398 \message{\linenumber No `\safefloattype' floats to list.}% 7399 \fi 7400 \else 7401 \begingroup 7402 \leftskip=\tocindent % indent these entries like a toc 7403 \let\do=\listoffloatsdo 7404 \csname floatlist\safefloattype\endcsname 7405 \endgroup 7406 \fi 7407} 7408 7409% This is called on each entry in a list of floats. We're passed the 7410% xref label, in the form LABEL-title, which is how we save it in the 7411% aux file. We strip off the -title and look up \XRLABEL-lof, which 7412% has the text we're supposed to typeset here. 7413% 7414% Figures without xref labels will not be included in the list (since 7415% they won't appear in the aux file). 7416% 7417\def\listoffloatsdo#1{\listoffloatsdoentry#1\finish} 7418\def\listoffloatsdoentry#1-title\finish{{% 7419 % Can't fully expand XR#1-lof because it can contain anything. Just 7420 % pass the control sequence. On the other hand, XR#1-pg is just the 7421 % page number, and we want to fully expand that so we can get a link 7422 % in pdf output. 7423 \toksA = \expandafter{\csname XR#1-lof\endcsname}% 7424 % 7425 % use the same \entry macro we use to generate the TOC and index. 7426 \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}% 7427 \writeentry 7428}} 7429 7430 7431\message{localization,} 7432 7433% @documentlanguage is usually given very early, just after 7434% @setfilename. If done too late, it may not override everything 7435% properly. Single argument is the language abbreviation. 7436% It would be nice if we could set up a hyphenation file here. 7437% 7438\parseargdef\documentlanguage{% 7439 \tex % read txi-??.tex file in plain TeX. 7440 % Read the file if it exists. 7441 \openin 1 txi-#1.tex 7442 \ifeof 1 7443 \errhelp = \nolanghelp 7444 \errmessage{Cannot read language file txi-#1.tex}% 7445 \else 7446 \input txi-#1.tex 7447 \fi 7448 \closein 1 7449 \endgroup 7450} 7451\newhelp\nolanghelp{The given language definition file cannot be found or 7452is empty. Maybe you need to install it? In the current directory 7453should work if nowhere else does.} 7454 7455% Set the catcode of characters 128 through 255 to the specified number. 7456% 7457\def\setnonasciicharscatcode#1{% 7458 \count255=128 7459 \loop\ifnum\count255<256 7460 \global\catcode\count255=#1 7461 \advance\count255 by 1 7462 \repeat 7463} 7464 7465% @documentencoding sets the definition of non-ASCII characters 7466% according to the specified encoding. 7467% 7468\parseargdef\documentencoding{% 7469 % Encoding being declared for the document. 7470 \def\declaredencoding{\csname #1.enc\endcsname}% 7471 % 7472 % Supported encodings: names converted to tokens in order to be able 7473 % to compare them with \ifx. 7474 \def\ascii{\csname US-ASCII.enc\endcsname}% 7475 \def\latnine{\csname ISO-8859-15.enc\endcsname}% 7476 \def\latone{\csname ISO-8859-1.enc\endcsname}% 7477 \def\lattwo{\csname ISO-8859-2.enc\endcsname}% 7478 \def\utfeight{\csname UTF-8.enc\endcsname}% 7479 % 7480 \ifx \declaredencoding \ascii 7481 \asciichardefs 7482 % 7483 \else \ifx \declaredencoding \lattwo 7484 \setnonasciicharscatcode\active 7485 \lattwochardefs 7486 % 7487 \else \ifx \declaredencoding \latone 7488 \setnonasciicharscatcode\active 7489 \latonechardefs 7490 % 7491 \else \ifx \declaredencoding \latnine 7492 \setnonasciicharscatcode\active 7493 \latninechardefs 7494 % 7495 \else \ifx \declaredencoding \utfeight 7496 \setnonasciicharscatcode\active 7497 \utfeightchardefs 7498 % 7499 \else 7500 \message{Unknown document encoding #1, ignoring.}% 7501 % 7502 \fi % utfeight 7503 \fi % latnine 7504 \fi % latone 7505 \fi % lattwo 7506 \fi % ascii 7507} 7508 7509% A message to be logged when using a character that isn't available 7510% the default font encoding (OT1). 7511% 7512\def\missingcharmsg#1{\message{Character missing in OT1 encoding: #1.}} 7513 7514% Take account of \c (plain) vs. \, (Texinfo) difference. 7515\def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi} 7516 7517% First, make active non-ASCII characters in order for them to be 7518% correctly categorized when TeX reads the replacement text of 7519% macros containing the character definitions. 7520\setnonasciicharscatcode\active 7521% 7522% Latin1 (ISO-8859-1) character definitions. 7523\def\latonechardefs{% 7524 \gdef^^a0{~} 7525 \gdef^^a1{\exclamdown} 7526 \gdef^^a2{\missingcharmsg{CENT SIGN}} 7527 \gdef^^a3{{\pounds}} 7528 \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} 7529 \gdef^^a5{\missingcharmsg{YEN SIGN}} 7530 \gdef^^a6{\missingcharmsg{BROKEN BAR}} 7531 \gdef^^a7{\S} 7532 \gdef^^a8{\"{}} 7533 \gdef^^a9{\copyright} 7534 \gdef^^aa{\ordf} 7535 \gdef^^ab{\missingcharmsg{LEFT-POINTING DOUBLE ANGLE QUOTATION MARK}} 7536 \gdef^^ac{$\lnot$} 7537 \gdef^^ad{\-} 7538 \gdef^^ae{\registeredsymbol} 7539 \gdef^^af{\={}} 7540 % 7541 \gdef^^b0{\textdegree} 7542 \gdef^^b1{$\pm$} 7543 \gdef^^b2{$^2$} 7544 \gdef^^b3{$^3$} 7545 \gdef^^b4{\'{}} 7546 \gdef^^b5{$\mu$} 7547 \gdef^^b6{\P} 7548 % 7549 \gdef^^b7{$^.$} 7550 \gdef^^b8{\cedilla\ } 7551 \gdef^^b9{$^1$} 7552 \gdef^^ba{\ordm} 7553 % 7554 \gdef^^bb{\missingcharmsg{RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK}} 7555 \gdef^^bc{$1\over4$} 7556 \gdef^^bd{$1\over2$} 7557 \gdef^^be{$3\over4$} 7558 \gdef^^bf{\questiondown} 7559 % 7560 \gdef^^c0{\`A} 7561 \gdef^^c1{\'A} 7562 \gdef^^c2{\^A} 7563 \gdef^^c3{\~A} 7564 \gdef^^c4{\"A} 7565 \gdef^^c5{\ringaccent A} 7566 \gdef^^c6{\AE} 7567 \gdef^^c7{\cedilla C} 7568 \gdef^^c8{\`E} 7569 \gdef^^c9{\'E} 7570 \gdef^^ca{\^E} 7571 \gdef^^cb{\"E} 7572 \gdef^^cc{\`I} 7573 \gdef^^cd{\'I} 7574 \gdef^^ce{\^I} 7575 \gdef^^cf{\"I} 7576 % 7577 \gdef^^d0{\missingcharmsg{LATIN CAPITAL LETTER ETH}} 7578 \gdef^^d1{\~N} 7579 \gdef^^d2{\`O} 7580 \gdef^^d3{\'O} 7581 \gdef^^d4{\^O} 7582 \gdef^^d5{\~O} 7583 \gdef^^d6{\"O} 7584 \gdef^^d7{$\times$} 7585 \gdef^^d8{\O} 7586 \gdef^^d9{\`U} 7587 \gdef^^da{\'U} 7588 \gdef^^db{\^U} 7589 \gdef^^dc{\"U} 7590 \gdef^^dd{\'Y} 7591 \gdef^^de{\missingcharmsg{LATIN CAPITAL LETTER THORN}} 7592 \gdef^^df{\ss} 7593 % 7594 \gdef^^e0{\`a} 7595 \gdef^^e1{\'a} 7596 \gdef^^e2{\^a} 7597 \gdef^^e3{\~a} 7598 \gdef^^e4{\"a} 7599 \gdef^^e5{\ringaccent a} 7600 \gdef^^e6{\ae} 7601 \gdef^^e7{\cedilla c} 7602 \gdef^^e8{\`e} 7603 \gdef^^e9{\'e} 7604 \gdef^^ea{\^e} 7605 \gdef^^eb{\"e} 7606 \gdef^^ec{\`{\dotless i}} 7607 \gdef^^ed{\'{\dotless i}} 7608 \gdef^^ee{\^{\dotless i}} 7609 \gdef^^ef{\"{\dotless i}} 7610 % 7611 \gdef^^f0{\missingcharmsg{LATIN SMALL LETTER ETH}} 7612 \gdef^^f1{\~n} 7613 \gdef^^f2{\`o} 7614 \gdef^^f3{\'o} 7615 \gdef^^f4{\^o} 7616 \gdef^^f5{\~o} 7617 \gdef^^f6{\"o} 7618 \gdef^^f7{$\div$} 7619 \gdef^^f8{\o} 7620 \gdef^^f9{\`u} 7621 \gdef^^fa{\'u} 7622 \gdef^^fb{\^u} 7623 \gdef^^fc{\"u} 7624 \gdef^^fd{\'y} 7625 \gdef^^fe{\missingcharmsg{LATIN SMALL LETTER THORN}} 7626 \gdef^^ff{\"y} 7627} 7628 7629% Latin9 (ISO-8859-15) encoding character definitions. 7630\def\latninechardefs{% 7631 % Encoding is almost identical to Latin1. 7632 \latonechardefs 7633 % 7634 \gdef^^a4{\euro} 7635 \gdef^^a6{\v S} 7636 \gdef^^a8{\v s} 7637 \gdef^^b4{\v Z} 7638 \gdef^^b8{\v z} 7639 \gdef^^bc{\OE} 7640 \gdef^^bd{\oe} 7641 \gdef^^be{\"Y} 7642} 7643 7644% Latin2 (ISO-8859-2) character definitions. 7645\def\lattwochardefs{% 7646 \gdef^^a0{~} 7647 \gdef^^a1{\missingcharmsg{LATIN CAPITAL LETTER A WITH OGONEK}} 7648 \gdef^^a2{\u{}} 7649 \gdef^^a3{\L} 7650 \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} 7651 \gdef^^a5{\v L} 7652 \gdef^^a6{\'S} 7653 \gdef^^a7{\S} 7654 \gdef^^a8{\"{}} 7655 \gdef^^a9{\v S} 7656 \gdef^^aa{\cedilla S} 7657 \gdef^^ab{\v T} 7658 \gdef^^ac{\'Z} 7659 \gdef^^ad{\-} 7660 \gdef^^ae{\v Z} 7661 \gdef^^af{\dotaccent Z} 7662 % 7663 \gdef^^b0{\textdegree} 7664 \gdef^^b1{\missingcharmsg{LATIN SMALL LETTER A WITH OGONEK}} 7665 \gdef^^b2{\missingcharmsg{OGONEK}} 7666 \gdef^^b3{\l} 7667 \gdef^^b4{\'{}} 7668 \gdef^^b5{\v l} 7669 \gdef^^b6{\'s} 7670 \gdef^^b7{\v{}} 7671 \gdef^^b8{\cedilla\ } 7672 \gdef^^b9{\v s} 7673 \gdef^^ba{\cedilla s} 7674 \gdef^^bb{\v t} 7675 \gdef^^bc{\'z} 7676 \gdef^^bd{\H{}} 7677 \gdef^^be{\v z} 7678 \gdef^^bf{\dotaccent z} 7679 % 7680 \gdef^^c0{\'R} 7681 \gdef^^c1{\'A} 7682 \gdef^^c2{\^A} 7683 \gdef^^c3{\u A} 7684 \gdef^^c4{\"A} 7685 \gdef^^c5{\'L} 7686 \gdef^^c6{\'C} 7687 \gdef^^c7{\cedilla C} 7688 \gdef^^c8{\v C} 7689 \gdef^^c9{\'E} 7690 \gdef^^ca{\missingcharmsg{LATIN CAPITAL LETTER E WITH OGONEK}} 7691 \gdef^^cb{\"E} 7692 \gdef^^cc{\v E} 7693 \gdef^^cd{\'I} 7694 \gdef^^ce{\^I} 7695 \gdef^^cf{\v D} 7696 % 7697 \gdef^^d0{\missingcharmsg{LATIN CAPITAL LETTER D WITH STROKE}} 7698 \gdef^^d1{\'N} 7699 \gdef^^d2{\v N} 7700 \gdef^^d3{\'O} 7701 \gdef^^d4{\^O} 7702 \gdef^^d5{\H O} 7703 \gdef^^d6{\"O} 7704 \gdef^^d7{$\times$} 7705 \gdef^^d8{\v R} 7706 \gdef^^d9{\ringaccent U} 7707 \gdef^^da{\'U} 7708 \gdef^^db{\H U} 7709 \gdef^^dc{\"U} 7710 \gdef^^dd{\'Y} 7711 \gdef^^de{\cedilla T} 7712 \gdef^^df{\ss} 7713 % 7714 \gdef^^e0{\'r} 7715 \gdef^^e1{\'a} 7716 \gdef^^e2{\^a} 7717 \gdef^^e3{\u a} 7718 \gdef^^e4{\"a} 7719 \gdef^^e5{\'l} 7720 \gdef^^e6{\'c} 7721 \gdef^^e7{\cedilla c} 7722 \gdef^^e8{\v c} 7723 \gdef^^e9{\'e} 7724 \gdef^^ea{\missingcharmsg{LATIN SMALL LETTER E WITH OGONEK}} 7725 \gdef^^eb{\"e} 7726 \gdef^^ec{\v e} 7727 \gdef^^ed{\'\i} 7728 \gdef^^ee{\^\i} 7729 \gdef^^ef{\v d} 7730 % 7731 \gdef^^f0{\missingcharmsg{LATIN SMALL LETTER D WITH STROKE}} 7732 \gdef^^f1{\'n} 7733 \gdef^^f2{\v n} 7734 \gdef^^f3{\'o} 7735 \gdef^^f4{\^o} 7736 \gdef^^f5{\H o} 7737 \gdef^^f6{\"o} 7738 \gdef^^f7{$\div$} 7739 \gdef^^f8{\v r} 7740 \gdef^^f9{\ringaccent u} 7741 \gdef^^fa{\'u} 7742 \gdef^^fb{\H u} 7743 \gdef^^fc{\"u} 7744 \gdef^^fd{\'y} 7745 \gdef^^fe{\cedilla t} 7746 \gdef^^ff{\dotaccent{}} 7747} 7748 7749% UTF-8 character definitions. 7750% 7751% This code to support UTF-8 is based on LaTeX's utf8.def, with some 7752% changes for Texinfo conventions. It is included here under the GPL by 7753% permission from Frank Mittelbach and the LaTeX team. 7754% 7755\newcount\countUTFx 7756\newcount\countUTFy 7757\newcount\countUTFz 7758 7759\gdef\UTFviiiTwoOctets#1#2{\expandafter 7760 \UTFviiiDefined\csname u8:#1\string #2\endcsname} 7761% 7762\gdef\UTFviiiThreeOctets#1#2#3{\expandafter 7763 \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname} 7764% 7765\gdef\UTFviiiFourOctets#1#2#3#4{\expandafter 7766 \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname} 7767 7768\gdef\UTFviiiDefined#1{% 7769 \ifx #1\relax 7770 \message{\linenumber Unicode char \string #1 not defined for Texinfo}% 7771 \else 7772 \expandafter #1% 7773 \fi 7774} 7775 7776\begingroup 7777 \catcode`\~13 7778 \catcode`\"12 7779 7780 \def\UTFviiiLoop{% 7781 \global\catcode\countUTFx\active 7782 \uccode`\~\countUTFx 7783 \uppercase\expandafter{\UTFviiiTmp}% 7784 \advance\countUTFx by 1 7785 \ifnum\countUTFx < \countUTFy 7786 \expandafter\UTFviiiLoop 7787 \fi} 7788 7789 \countUTFx = "C2 7790 \countUTFy = "E0 7791 \def\UTFviiiTmp{% 7792 \xdef~{\noexpand\UTFviiiTwoOctets\string~}} 7793 \UTFviiiLoop 7794 7795 \countUTFx = "E0 7796 \countUTFy = "F0 7797 \def\UTFviiiTmp{% 7798 \xdef~{\noexpand\UTFviiiThreeOctets\string~}} 7799 \UTFviiiLoop 7800 7801 \countUTFx = "F0 7802 \countUTFy = "F4 7803 \def\UTFviiiTmp{% 7804 \xdef~{\noexpand\UTFviiiFourOctets\string~}} 7805 \UTFviiiLoop 7806\endgroup 7807 7808\begingroup 7809 \catcode`\"=12 7810 \catcode`\<=12 7811 \catcode`\.=12 7812 \catcode`\,=12 7813 \catcode`\;=12 7814 \catcode`\!=12 7815 \catcode`\~=13 7816 7817 \gdef\DeclareUnicodeCharacter#1#2{% 7818 \countUTFz = "#1\relax 7819 \wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}% 7820 \begingroup 7821 \parseXMLCharref 7822 \def\UTFviiiTwoOctets##1##2{% 7823 \csname u8:##1\string ##2\endcsname}% 7824 \def\UTFviiiThreeOctets##1##2##3{% 7825 \csname u8:##1\string ##2\string ##3\endcsname}% 7826 \def\UTFviiiFourOctets##1##2##3##4{% 7827 \csname u8:##1\string ##2\string ##3\string ##4\endcsname}% 7828 \expandafter\expandafter\expandafter\expandafter 7829 \expandafter\expandafter\expandafter 7830 \gdef\UTFviiiTmp{#2}% 7831 \endgroup} 7832 7833 \gdef\parseXMLCharref{% 7834 \ifnum\countUTFz < "A0\relax 7835 \errhelp = \EMsimple 7836 \errmessage{Cannot define Unicode char value < 00A0}% 7837 \else\ifnum\countUTFz < "800\relax 7838 \parseUTFviiiA,% 7839 \parseUTFviiiB C\UTFviiiTwoOctets.,% 7840 \else\ifnum\countUTFz < "10000\relax 7841 \parseUTFviiiA;% 7842 \parseUTFviiiA,% 7843 \parseUTFviiiB E\UTFviiiThreeOctets.{,;}% 7844 \else 7845 \parseUTFviiiA;% 7846 \parseUTFviiiA,% 7847 \parseUTFviiiA!% 7848 \parseUTFviiiB F\UTFviiiFourOctets.{!,;}% 7849 \fi\fi\fi 7850 } 7851 7852 \gdef\parseUTFviiiA#1{% 7853 \countUTFx = \countUTFz 7854 \divide\countUTFz by 64 7855 \countUTFy = \countUTFz 7856 \multiply\countUTFz by 64 7857 \advance\countUTFx by -\countUTFz 7858 \advance\countUTFx by 128 7859 \uccode `#1\countUTFx 7860 \countUTFz = \countUTFy} 7861 7862 \gdef\parseUTFviiiB#1#2#3#4{% 7863 \advance\countUTFz by "#10\relax 7864 \uccode `#3\countUTFz 7865 \uppercase{\gdef\UTFviiiTmp{#2#3#4}}} 7866\endgroup 7867 7868\def\utfeightchardefs{% 7869 \DeclareUnicodeCharacter{00A0}{\tie} 7870 \DeclareUnicodeCharacter{00A1}{\exclamdown} 7871 \DeclareUnicodeCharacter{00A3}{\pounds} 7872 \DeclareUnicodeCharacter{00A8}{\"{ }} 7873 \DeclareUnicodeCharacter{00A9}{\copyright} 7874 \DeclareUnicodeCharacter{00AA}{\ordf} 7875 \DeclareUnicodeCharacter{00AD}{\-} 7876 \DeclareUnicodeCharacter{00AE}{\registeredsymbol} 7877 \DeclareUnicodeCharacter{00AF}{\={ }} 7878 7879 \DeclareUnicodeCharacter{00B0}{\ringaccent{ }} 7880 \DeclareUnicodeCharacter{00B4}{\'{ }} 7881 \DeclareUnicodeCharacter{00B8}{\cedilla{ }} 7882 \DeclareUnicodeCharacter{00BA}{\ordm} 7883 \DeclareUnicodeCharacter{00BF}{\questiondown} 7884 7885 \DeclareUnicodeCharacter{00C0}{\`A} 7886 \DeclareUnicodeCharacter{00C1}{\'A} 7887 \DeclareUnicodeCharacter{00C2}{\^A} 7888 \DeclareUnicodeCharacter{00C3}{\~A} 7889 \DeclareUnicodeCharacter{00C4}{\"A} 7890 \DeclareUnicodeCharacter{00C5}{\AA} 7891 \DeclareUnicodeCharacter{00C6}{\AE} 7892 \DeclareUnicodeCharacter{00C7}{\cedilla{C}} 7893 \DeclareUnicodeCharacter{00C8}{\`E} 7894 \DeclareUnicodeCharacter{00C9}{\'E} 7895 \DeclareUnicodeCharacter{00CA}{\^E} 7896 \DeclareUnicodeCharacter{00CB}{\"E} 7897 \DeclareUnicodeCharacter{00CC}{\`I} 7898 \DeclareUnicodeCharacter{00CD}{\'I} 7899 \DeclareUnicodeCharacter{00CE}{\^I} 7900 \DeclareUnicodeCharacter{00CF}{\"I} 7901 7902 \DeclareUnicodeCharacter{00D1}{\~N} 7903 \DeclareUnicodeCharacter{00D2}{\`O} 7904 \DeclareUnicodeCharacter{00D3}{\'O} 7905 \DeclareUnicodeCharacter{00D4}{\^O} 7906 \DeclareUnicodeCharacter{00D5}{\~O} 7907 \DeclareUnicodeCharacter{00D6}{\"O} 7908 \DeclareUnicodeCharacter{00D8}{\O} 7909 \DeclareUnicodeCharacter{00D9}{\`U} 7910 \DeclareUnicodeCharacter{00DA}{\'U} 7911 \DeclareUnicodeCharacter{00DB}{\^U} 7912 \DeclareUnicodeCharacter{00DC}{\"U} 7913 \DeclareUnicodeCharacter{00DD}{\'Y} 7914 \DeclareUnicodeCharacter{00DF}{\ss} 7915 7916 \DeclareUnicodeCharacter{00E0}{\`a} 7917 \DeclareUnicodeCharacter{00E1}{\'a} 7918 \DeclareUnicodeCharacter{00E2}{\^a} 7919 \DeclareUnicodeCharacter{00E3}{\~a} 7920 \DeclareUnicodeCharacter{00E4}{\"a} 7921 \DeclareUnicodeCharacter{00E5}{\aa} 7922 \DeclareUnicodeCharacter{00E6}{\ae} 7923 \DeclareUnicodeCharacter{00E7}{\cedilla{c}} 7924 \DeclareUnicodeCharacter{00E8}{\`e} 7925 \DeclareUnicodeCharacter{00E9}{\'e} 7926 \DeclareUnicodeCharacter{00EA}{\^e} 7927 \DeclareUnicodeCharacter{00EB}{\"e} 7928 \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}} 7929 \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}} 7930 \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}} 7931 \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}} 7932 7933 \DeclareUnicodeCharacter{00F1}{\~n} 7934 \DeclareUnicodeCharacter{00F2}{\`o} 7935 \DeclareUnicodeCharacter{00F3}{\'o} 7936 \DeclareUnicodeCharacter{00F4}{\^o} 7937 \DeclareUnicodeCharacter{00F5}{\~o} 7938 \DeclareUnicodeCharacter{00F6}{\"o} 7939 \DeclareUnicodeCharacter{00F8}{\o} 7940 \DeclareUnicodeCharacter{00F9}{\`u} 7941 \DeclareUnicodeCharacter{00FA}{\'u} 7942 \DeclareUnicodeCharacter{00FB}{\^u} 7943 \DeclareUnicodeCharacter{00FC}{\"u} 7944 \DeclareUnicodeCharacter{00FD}{\'y} 7945 \DeclareUnicodeCharacter{00FF}{\"y} 7946 7947 \DeclareUnicodeCharacter{0100}{\=A} 7948 \DeclareUnicodeCharacter{0101}{\=a} 7949 \DeclareUnicodeCharacter{0102}{\u{A}} 7950 \DeclareUnicodeCharacter{0103}{\u{a}} 7951 \DeclareUnicodeCharacter{0106}{\'C} 7952 \DeclareUnicodeCharacter{0107}{\'c} 7953 \DeclareUnicodeCharacter{0108}{\^C} 7954 \DeclareUnicodeCharacter{0109}{\^c} 7955 \DeclareUnicodeCharacter{010A}{\dotaccent{C}} 7956 \DeclareUnicodeCharacter{010B}{\dotaccent{c}} 7957 \DeclareUnicodeCharacter{010C}{\v{C}} 7958 \DeclareUnicodeCharacter{010D}{\v{c}} 7959 \DeclareUnicodeCharacter{010E}{\v{D}} 7960 7961 \DeclareUnicodeCharacter{0112}{\=E} 7962 \DeclareUnicodeCharacter{0113}{\=e} 7963 \DeclareUnicodeCharacter{0114}{\u{E}} 7964 \DeclareUnicodeCharacter{0115}{\u{e}} 7965 \DeclareUnicodeCharacter{0116}{\dotaccent{E}} 7966 \DeclareUnicodeCharacter{0117}{\dotaccent{e}} 7967 \DeclareUnicodeCharacter{011A}{\v{E}} 7968 \DeclareUnicodeCharacter{011B}{\v{e}} 7969 \DeclareUnicodeCharacter{011C}{\^G} 7970 \DeclareUnicodeCharacter{011D}{\^g} 7971 \DeclareUnicodeCharacter{011E}{\u{G}} 7972 \DeclareUnicodeCharacter{011F}{\u{g}} 7973 7974 \DeclareUnicodeCharacter{0120}{\dotaccent{G}} 7975 \DeclareUnicodeCharacter{0121}{\dotaccent{g}} 7976 \DeclareUnicodeCharacter{0124}{\^H} 7977 \DeclareUnicodeCharacter{0125}{\^h} 7978 \DeclareUnicodeCharacter{0128}{\~I} 7979 \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}} 7980 \DeclareUnicodeCharacter{012A}{\=I} 7981 \DeclareUnicodeCharacter{012B}{\={\dotless{i}}} 7982 \DeclareUnicodeCharacter{012C}{\u{I}} 7983 \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}} 7984 7985 \DeclareUnicodeCharacter{0130}{\dotaccent{I}} 7986 \DeclareUnicodeCharacter{0131}{\dotless{i}} 7987 \DeclareUnicodeCharacter{0132}{IJ} 7988 \DeclareUnicodeCharacter{0133}{ij} 7989 \DeclareUnicodeCharacter{0134}{\^J} 7990 \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}} 7991 \DeclareUnicodeCharacter{0139}{\'L} 7992 \DeclareUnicodeCharacter{013A}{\'l} 7993 7994 \DeclareUnicodeCharacter{0141}{\L} 7995 \DeclareUnicodeCharacter{0142}{\l} 7996 \DeclareUnicodeCharacter{0143}{\'N} 7997 \DeclareUnicodeCharacter{0144}{\'n} 7998 \DeclareUnicodeCharacter{0147}{\v{N}} 7999 \DeclareUnicodeCharacter{0148}{\v{n}} 8000 \DeclareUnicodeCharacter{014C}{\=O} 8001 \DeclareUnicodeCharacter{014D}{\=o} 8002 \DeclareUnicodeCharacter{014E}{\u{O}} 8003 \DeclareUnicodeCharacter{014F}{\u{o}} 8004 8005 \DeclareUnicodeCharacter{0150}{\H{O}} 8006 \DeclareUnicodeCharacter{0151}{\H{o}} 8007 \DeclareUnicodeCharacter{0152}{\OE} 8008 \DeclareUnicodeCharacter{0153}{\oe} 8009 \DeclareUnicodeCharacter{0154}{\'R} 8010 \DeclareUnicodeCharacter{0155}{\'r} 8011 \DeclareUnicodeCharacter{0158}{\v{R}} 8012 \DeclareUnicodeCharacter{0159}{\v{r}} 8013 \DeclareUnicodeCharacter{015A}{\'S} 8014 \DeclareUnicodeCharacter{015B}{\'s} 8015 \DeclareUnicodeCharacter{015C}{\^S} 8016 \DeclareUnicodeCharacter{015D}{\^s} 8017 \DeclareUnicodeCharacter{015E}{\cedilla{S}} 8018 \DeclareUnicodeCharacter{015F}{\cedilla{s}} 8019 8020 \DeclareUnicodeCharacter{0160}{\v{S}} 8021 \DeclareUnicodeCharacter{0161}{\v{s}} 8022 \DeclareUnicodeCharacter{0162}{\cedilla{t}} 8023 \DeclareUnicodeCharacter{0163}{\cedilla{T}} 8024 \DeclareUnicodeCharacter{0164}{\v{T}} 8025 8026 \DeclareUnicodeCharacter{0168}{\~U} 8027 \DeclareUnicodeCharacter{0169}{\~u} 8028 \DeclareUnicodeCharacter{016A}{\=U} 8029 \DeclareUnicodeCharacter{016B}{\=u} 8030 \DeclareUnicodeCharacter{016C}{\u{U}} 8031 \DeclareUnicodeCharacter{016D}{\u{u}} 8032 \DeclareUnicodeCharacter{016E}{\ringaccent{U}} 8033 \DeclareUnicodeCharacter{016F}{\ringaccent{u}} 8034 8035 \DeclareUnicodeCharacter{0170}{\H{U}} 8036 \DeclareUnicodeCharacter{0171}{\H{u}} 8037 \DeclareUnicodeCharacter{0174}{\^W} 8038 \DeclareUnicodeCharacter{0175}{\^w} 8039 \DeclareUnicodeCharacter{0176}{\^Y} 8040 \DeclareUnicodeCharacter{0177}{\^y} 8041 \DeclareUnicodeCharacter{0178}{\"Y} 8042 \DeclareUnicodeCharacter{0179}{\'Z} 8043 \DeclareUnicodeCharacter{017A}{\'z} 8044 \DeclareUnicodeCharacter{017B}{\dotaccent{Z}} 8045 \DeclareUnicodeCharacter{017C}{\dotaccent{z}} 8046 \DeclareUnicodeCharacter{017D}{\v{Z}} 8047 \DeclareUnicodeCharacter{017E}{\v{z}} 8048 8049 \DeclareUnicodeCharacter{01C4}{D\v{Z}} 8050 \DeclareUnicodeCharacter{01C5}{D\v{z}} 8051 \DeclareUnicodeCharacter{01C6}{d\v{z}} 8052 \DeclareUnicodeCharacter{01C7}{LJ} 8053 \DeclareUnicodeCharacter{01C8}{Lj} 8054 \DeclareUnicodeCharacter{01C9}{lj} 8055 \DeclareUnicodeCharacter{01CA}{NJ} 8056 \DeclareUnicodeCharacter{01CB}{Nj} 8057 \DeclareUnicodeCharacter{01CC}{nj} 8058 \DeclareUnicodeCharacter{01CD}{\v{A}} 8059 \DeclareUnicodeCharacter{01CE}{\v{a}} 8060 \DeclareUnicodeCharacter{01CF}{\v{I}} 8061 8062 \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}} 8063 \DeclareUnicodeCharacter{01D1}{\v{O}} 8064 \DeclareUnicodeCharacter{01D2}{\v{o}} 8065 \DeclareUnicodeCharacter{01D3}{\v{U}} 8066 \DeclareUnicodeCharacter{01D4}{\v{u}} 8067 8068 \DeclareUnicodeCharacter{01E2}{\={\AE}} 8069 \DeclareUnicodeCharacter{01E3}{\={\ae}} 8070 \DeclareUnicodeCharacter{01E6}{\v{G}} 8071 \DeclareUnicodeCharacter{01E7}{\v{g}} 8072 \DeclareUnicodeCharacter{01E8}{\v{K}} 8073 \DeclareUnicodeCharacter{01E9}{\v{k}} 8074 8075 \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}} 8076 \DeclareUnicodeCharacter{01F1}{DZ} 8077 \DeclareUnicodeCharacter{01F2}{Dz} 8078 \DeclareUnicodeCharacter{01F3}{dz} 8079 \DeclareUnicodeCharacter{01F4}{\'G} 8080 \DeclareUnicodeCharacter{01F5}{\'g} 8081 \DeclareUnicodeCharacter{01F8}{\`N} 8082 \DeclareUnicodeCharacter{01F9}{\`n} 8083 \DeclareUnicodeCharacter{01FC}{\'{\AE}} 8084 \DeclareUnicodeCharacter{01FD}{\'{\ae}} 8085 \DeclareUnicodeCharacter{01FE}{\'{\O}} 8086 \DeclareUnicodeCharacter{01FF}{\'{\o}} 8087 8088 \DeclareUnicodeCharacter{021E}{\v{H}} 8089 \DeclareUnicodeCharacter{021F}{\v{h}} 8090 8091 \DeclareUnicodeCharacter{0226}{\dotaccent{A}} 8092 \DeclareUnicodeCharacter{0227}{\dotaccent{a}} 8093 \DeclareUnicodeCharacter{0228}{\cedilla{E}} 8094 \DeclareUnicodeCharacter{0229}{\cedilla{e}} 8095 \DeclareUnicodeCharacter{022E}{\dotaccent{O}} 8096 \DeclareUnicodeCharacter{022F}{\dotaccent{o}} 8097 8098 \DeclareUnicodeCharacter{0232}{\=Y} 8099 \DeclareUnicodeCharacter{0233}{\=y} 8100 \DeclareUnicodeCharacter{0237}{\dotless{j}} 8101 8102 \DeclareUnicodeCharacter{1E02}{\dotaccent{B}} 8103 \DeclareUnicodeCharacter{1E03}{\dotaccent{b}} 8104 \DeclareUnicodeCharacter{1E04}{\udotaccent{B}} 8105 \DeclareUnicodeCharacter{1E05}{\udotaccent{b}} 8106 \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}} 8107 \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}} 8108 \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}} 8109 \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}} 8110 \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}} 8111 \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}} 8112 \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}} 8113 \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}} 8114 8115 \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}} 8116 \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}} 8117 8118 \DeclareUnicodeCharacter{1E20}{\=G} 8119 \DeclareUnicodeCharacter{1E21}{\=g} 8120 \DeclareUnicodeCharacter{1E22}{\dotaccent{H}} 8121 \DeclareUnicodeCharacter{1E23}{\dotaccent{h}} 8122 \DeclareUnicodeCharacter{1E24}{\udotaccent{H}} 8123 \DeclareUnicodeCharacter{1E25}{\udotaccent{h}} 8124 \DeclareUnicodeCharacter{1E26}{\"H} 8125 \DeclareUnicodeCharacter{1E27}{\"h} 8126 8127 \DeclareUnicodeCharacter{1E30}{\'K} 8128 \DeclareUnicodeCharacter{1E31}{\'k} 8129 \DeclareUnicodeCharacter{1E32}{\udotaccent{K}} 8130 \DeclareUnicodeCharacter{1E33}{\udotaccent{k}} 8131 \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}} 8132 \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}} 8133 \DeclareUnicodeCharacter{1E36}{\udotaccent{L}} 8134 \DeclareUnicodeCharacter{1E37}{\udotaccent{l}} 8135 \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}} 8136 \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}} 8137 \DeclareUnicodeCharacter{1E3E}{\'M} 8138 \DeclareUnicodeCharacter{1E3F}{\'m} 8139 8140 \DeclareUnicodeCharacter{1E40}{\dotaccent{M}} 8141 \DeclareUnicodeCharacter{1E41}{\dotaccent{m}} 8142 \DeclareUnicodeCharacter{1E42}{\udotaccent{M}} 8143 \DeclareUnicodeCharacter{1E43}{\udotaccent{m}} 8144 \DeclareUnicodeCharacter{1E44}{\dotaccent{N}} 8145 \DeclareUnicodeCharacter{1E45}{\dotaccent{n}} 8146 \DeclareUnicodeCharacter{1E46}{\udotaccent{N}} 8147 \DeclareUnicodeCharacter{1E47}{\udotaccent{n}} 8148 \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}} 8149 \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}} 8150 8151 \DeclareUnicodeCharacter{1E54}{\'P} 8152 \DeclareUnicodeCharacter{1E55}{\'p} 8153 \DeclareUnicodeCharacter{1E56}{\dotaccent{P}} 8154 \DeclareUnicodeCharacter{1E57}{\dotaccent{p}} 8155 \DeclareUnicodeCharacter{1E58}{\dotaccent{R}} 8156 \DeclareUnicodeCharacter{1E59}{\dotaccent{r}} 8157 \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}} 8158 \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}} 8159 \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}} 8160 \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}} 8161 8162 \DeclareUnicodeCharacter{1E60}{\dotaccent{S}} 8163 \DeclareUnicodeCharacter{1E61}{\dotaccent{s}} 8164 \DeclareUnicodeCharacter{1E62}{\udotaccent{S}} 8165 \DeclareUnicodeCharacter{1E63}{\udotaccent{s}} 8166 \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}} 8167 \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}} 8168 \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}} 8169 \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}} 8170 \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}} 8171 \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}} 8172 8173 \DeclareUnicodeCharacter{1E7C}{\~V} 8174 \DeclareUnicodeCharacter{1E7D}{\~v} 8175 \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}} 8176 \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}} 8177 8178 \DeclareUnicodeCharacter{1E80}{\`W} 8179 \DeclareUnicodeCharacter{1E81}{\`w} 8180 \DeclareUnicodeCharacter{1E82}{\'W} 8181 \DeclareUnicodeCharacter{1E83}{\'w} 8182 \DeclareUnicodeCharacter{1E84}{\"W} 8183 \DeclareUnicodeCharacter{1E85}{\"w} 8184 \DeclareUnicodeCharacter{1E86}{\dotaccent{W}} 8185 \DeclareUnicodeCharacter{1E87}{\dotaccent{w}} 8186 \DeclareUnicodeCharacter{1E88}{\udotaccent{W}} 8187 \DeclareUnicodeCharacter{1E89}{\udotaccent{w}} 8188 \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}} 8189 \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}} 8190 \DeclareUnicodeCharacter{1E8C}{\"X} 8191 \DeclareUnicodeCharacter{1E8D}{\"x} 8192 \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}} 8193 \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}} 8194 8195 \DeclareUnicodeCharacter{1E90}{\^Z} 8196 \DeclareUnicodeCharacter{1E91}{\^z} 8197 \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}} 8198 \DeclareUnicodeCharacter{1E93}{\udotaccent{z}} 8199 \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}} 8200 \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}} 8201 \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}} 8202 \DeclareUnicodeCharacter{1E97}{\"t} 8203 \DeclareUnicodeCharacter{1E98}{\ringaccent{w}} 8204 \DeclareUnicodeCharacter{1E99}{\ringaccent{y}} 8205 8206 \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}} 8207 \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}} 8208 8209 \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}} 8210 \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}} 8211 \DeclareUnicodeCharacter{1EBC}{\~E} 8212 \DeclareUnicodeCharacter{1EBD}{\~e} 8213 8214 \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}} 8215 \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}} 8216 \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}} 8217 \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}} 8218 8219 \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}} 8220 \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}} 8221 8222 \DeclareUnicodeCharacter{1EF2}{\`Y} 8223 \DeclareUnicodeCharacter{1EF3}{\`y} 8224 \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}} 8225 8226 \DeclareUnicodeCharacter{1EF8}{\~Y} 8227 \DeclareUnicodeCharacter{1EF9}{\~y} 8228 8229 \DeclareUnicodeCharacter{2013}{--} 8230 \DeclareUnicodeCharacter{2014}{---} 8231 \DeclareUnicodeCharacter{2022}{\bullet} 8232 \DeclareUnicodeCharacter{2026}{\dots} 8233 \DeclareUnicodeCharacter{20AC}{\euro} 8234 8235 \DeclareUnicodeCharacter{2192}{\expansion} 8236 \DeclareUnicodeCharacter{21D2}{\result} 8237 8238 \DeclareUnicodeCharacter{2212}{\minus} 8239 \DeclareUnicodeCharacter{2217}{\point} 8240 \DeclareUnicodeCharacter{2261}{\equiv} 8241}% end of \utfeightchardefs 8242 8243 8244% US-ASCII character definitions. 8245\def\asciichardefs{% nothing need be done 8246 \relax 8247} 8248 8249% Make non-ASCII characters printable again for compatibility with 8250% existing Texinfo documents that may use them, even without declaring a 8251% document encoding. 8252% 8253\setnonasciicharscatcode \other 8254 8255 8256\message{formatting,} 8257 8258\newdimen\defaultparindent \defaultparindent = 15pt 8259 8260\chapheadingskip = 15pt plus 4pt minus 2pt 8261\secheadingskip = 12pt plus 3pt minus 2pt 8262\subsecheadingskip = 9pt plus 2pt minus 2pt 8263 8264% Prevent underfull vbox error messages. 8265\vbadness = 10000 8266 8267% Don't be so finicky about underfull hboxes, either. 8268\hbadness = 2000 8269 8270% Following George Bush, just get rid of widows and orphans. 8271\widowpenalty=10000 8272\clubpenalty=10000 8273 8274% Use TeX 3.0's \emergencystretch to help line breaking, but if we're 8275% using an old version of TeX, don't do anything. We want the amount of 8276% stretch added to depend on the line length, hence the dependence on 8277% \hsize. We call this whenever the paper size is set. 8278% 8279\def\setemergencystretch{% 8280 \ifx\emergencystretch\thisisundefined 8281 % Allow us to assign to \emergencystretch anyway. 8282 \def\emergencystretch{\dimen0}% 8283 \else 8284 \emergencystretch = .15\hsize 8285 \fi 8286} 8287 8288% Parameters in order: 1) textheight; 2) textwidth; 8289% 3) voffset; 4) hoffset; 5) binding offset; 6) topskip; 8290% 7) physical page height; 8) physical page width. 8291% 8292% We also call \setleading{\textleading}, so the caller should define 8293% \textleading. The caller should also set \parskip. 8294% 8295\def\internalpagesizes#1#2#3#4#5#6#7#8{% 8296 \voffset = #3\relax 8297 \topskip = #6\relax 8298 \splittopskip = \topskip 8299 % 8300 \vsize = #1\relax 8301 \advance\vsize by \topskip 8302 \outervsize = \vsize 8303 \advance\outervsize by 2\topandbottommargin 8304 \pageheight = \vsize 8305 % 8306 \hsize = #2\relax 8307 \outerhsize = \hsize 8308 \advance\outerhsize by 0.5in 8309 \pagewidth = \hsize 8310 % 8311 \normaloffset = #4\relax 8312 \bindingoffset = #5\relax 8313 % 8314 \ifpdf 8315 \pdfpageheight #7\relax 8316 \pdfpagewidth #8\relax 8317 \fi 8318 % 8319 \setleading{\textleading} 8320 % 8321 \parindent = \defaultparindent 8322 \setemergencystretch 8323} 8324 8325% @letterpaper (the default). 8326\def\letterpaper{{\globaldefs = 1 8327 \parskip = 3pt plus 2pt minus 1pt 8328 \textleading = 13.2pt 8329 % 8330 % If page is nothing but text, make it come out even. 8331 \internalpagesizes{46\baselineskip}{6in}% 8332 {\voffset}{.25in}% 8333 {\bindingoffset}{36pt}% 8334 {11in}{8.5in}% 8335}} 8336 8337% Use @smallbook to reset parameters for 7x9.25 trim size. 8338\def\smallbook{{\globaldefs = 1 8339 \parskip = 2pt plus 1pt 8340 \textleading = 12pt 8341 % 8342 \internalpagesizes{7.5in}{5in}% 8343 {\voffset}{.25in}% 8344 {\bindingoffset}{16pt}% 8345 {9.25in}{7in}% 8346 % 8347 \lispnarrowing = 0.3in 8348 \tolerance = 700 8349 \hfuzz = 1pt 8350 \contentsrightmargin = 0pt 8351 \defbodyindent = .5cm 8352}} 8353 8354% Use @smallerbook to reset parameters for 6x9 trim size. 8355% (Just testing, parameters still in flux.) 8356\def\smallerbook{{\globaldefs = 1 8357 \parskip = 1.5pt plus 1pt 8358 \textleading = 12pt 8359 % 8360 \internalpagesizes{7.4in}{4.8in}% 8361 {-.2in}{-.4in}% 8362 {0pt}{14pt}% 8363 {9in}{6in}% 8364 % 8365 \lispnarrowing = 0.25in 8366 \tolerance = 700 8367 \hfuzz = 1pt 8368 \contentsrightmargin = 0pt 8369 \defbodyindent = .4cm 8370}} 8371 8372% Use @afourpaper to print on European A4 paper. 8373\def\afourpaper{{\globaldefs = 1 8374 \parskip = 3pt plus 2pt minus 1pt 8375 \textleading = 13.2pt 8376 % 8377 % Double-side printing via postscript on Laserjet 4050 8378 % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm. 8379 % To change the settings for a different printer or situation, adjust 8380 % \normaloffset until the front-side and back-side texts align. Then 8381 % do the same for \bindingoffset. You can set these for testing in 8382 % your texinfo source file like this: 8383 % @tex 8384 % \global\normaloffset = -6mm 8385 % \global\bindingoffset = 10mm 8386 % @end tex 8387 \internalpagesizes{51\baselineskip}{160mm} 8388 {\voffset}{\hoffset}% 8389 {\bindingoffset}{44pt}% 8390 {297mm}{210mm}% 8391 % 8392 \tolerance = 700 8393 \hfuzz = 1pt 8394 \contentsrightmargin = 0pt 8395 \defbodyindent = 5mm 8396}} 8397 8398% Use @afivepaper to print on European A5 paper. 8399% From romildo@urano.iceb.ufop.br, 2 July 2000. 8400% He also recommends making @example and @lisp be small. 8401\def\afivepaper{{\globaldefs = 1 8402 \parskip = 2pt plus 1pt minus 0.1pt 8403 \textleading = 12.5pt 8404 % 8405 \internalpagesizes{160mm}{120mm}% 8406 {\voffset}{\hoffset}% 8407 {\bindingoffset}{8pt}% 8408 {210mm}{148mm}% 8409 % 8410 \lispnarrowing = 0.2in 8411 \tolerance = 800 8412 \hfuzz = 1.2pt 8413 \contentsrightmargin = 0pt 8414 \defbodyindent = 2mm 8415 \tableindent = 12mm 8416}} 8417 8418% A specific text layout, 24x15cm overall, intended for A4 paper. 8419\def\afourlatex{{\globaldefs = 1 8420 \afourpaper 8421 \internalpagesizes{237mm}{150mm}% 8422 {\voffset}{4.6mm}% 8423 {\bindingoffset}{7mm}% 8424 {297mm}{210mm}% 8425 % 8426 % Must explicitly reset to 0 because we call \afourpaper. 8427 \globaldefs = 0 8428}} 8429 8430% Use @afourwide to print on A4 paper in landscape format. 8431\def\afourwide{{\globaldefs = 1 8432 \afourpaper 8433 \internalpagesizes{241mm}{165mm}% 8434 {\voffset}{-2.95mm}% 8435 {\bindingoffset}{7mm}% 8436 {297mm}{210mm}% 8437 \globaldefs = 0 8438}} 8439 8440% @pagesizes TEXTHEIGHT[,TEXTWIDTH] 8441% Perhaps we should allow setting the margins, \topskip, \parskip, 8442% and/or leading, also. Or perhaps we should compute them somehow. 8443% 8444\parseargdef\pagesizes{\pagesizesyyy #1,,\finish} 8445\def\pagesizesyyy#1,#2,#3\finish{{% 8446 \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi 8447 \globaldefs = 1 8448 % 8449 \parskip = 3pt plus 2pt minus 1pt 8450 \setleading{\textleading}% 8451 % 8452 \dimen0 = #1 8453 \advance\dimen0 by \voffset 8454 % 8455 \dimen2 = \hsize 8456 \advance\dimen2 by \normaloffset 8457 % 8458 \internalpagesizes{#1}{\hsize}% 8459 {\voffset}{\normaloffset}% 8460 {\bindingoffset}{44pt}% 8461 {\dimen0}{\dimen2}% 8462}} 8463 8464% Set default to letter. 8465% 8466\letterpaper 8467 8468 8469\message{and turning on texinfo input format.} 8470 8471% Define macros to output various characters with catcode for normal text. 8472\catcode`\"=\other 8473\catcode`\~=\other 8474\catcode`\^=\other 8475\catcode`\_=\other 8476\catcode`\|=\other 8477\catcode`\<=\other 8478\catcode`\>=\other 8479\catcode`\+=\other 8480\catcode`\$=\other 8481\def\normaldoublequote{"} 8482\def\normaltilde{~} 8483\def\normalcaret{^} 8484\def\normalunderscore{_} 8485\def\normalverticalbar{|} 8486\def\normalless{<} 8487\def\normalgreater{>} 8488\def\normalplus{+} 8489\def\normaldollar{$}%$ font-lock fix 8490 8491% This macro is used to make a character print one way in \tt 8492% (where it can probably be output as-is), and another way in other fonts, 8493% where something hairier probably needs to be done. 8494% 8495% #1 is what to print if we are indeed using \tt; #2 is what to print 8496% otherwise. Since all the Computer Modern typewriter fonts have zero 8497% interword stretch (and shrink), and it is reasonable to expect all 8498% typewriter fonts to have this, we can check that font parameter. 8499% 8500\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi} 8501 8502% Same as above, but check for italic font. Actually this also catches 8503% non-italic slanted fonts since it is impossible to distinguish them from 8504% italic fonts. But since this is only used by $ and it uses \sl anyway 8505% this is not a problem. 8506\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi} 8507 8508% Turn off all special characters except @ 8509% (and those which the user can use as if they were ordinary). 8510% Most of these we simply print from the \tt font, but for some, we can 8511% use math or other variants that look better in normal text. 8512 8513\catcode`\"=\active 8514\def\activedoublequote{{\tt\char34}} 8515\let"=\activedoublequote 8516\catcode`\~=\active 8517\def~{{\tt\char126}} 8518\chardef\hat=`\^ 8519\catcode`\^=\active 8520\def^{{\tt \hat}} 8521 8522\catcode`\_=\active 8523\def_{\ifusingtt\normalunderscore\_} 8524\let\realunder=_ 8525% Subroutine for the previous macro. 8526\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em } 8527 8528\catcode`\|=\active 8529\def|{{\tt\char124}} 8530\chardef \less=`\< 8531\catcode`\<=\active 8532\def<{{\tt \less}} 8533\chardef \gtr=`\> 8534\catcode`\>=\active 8535\def>{{\tt \gtr}} 8536\catcode`\+=\active 8537\def+{{\tt \char 43}} 8538\catcode`\$=\active 8539\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix 8540 8541% If a .fmt file is being used, characters that might appear in a file 8542% name cannot be active until we have parsed the command line. 8543% So turn them off again, and have \everyjob (or @setfilename) turn them on. 8544% \otherifyactive is called near the end of this file. 8545\def\otherifyactive{\catcode`+=\other \catcode`\_=\other} 8546 8547% Used sometimes to turn off (effectively) the active characters even after 8548% parsing them. 8549\def\turnoffactive{% 8550 \normalturnoffactive 8551 \otherbackslash 8552} 8553 8554\catcode`\@=0 8555 8556% \backslashcurfont outputs one backslash character in current font, 8557% as in \char`\\. 8558\global\chardef\backslashcurfont=`\\ 8559\global\let\rawbackslashxx=\backslashcurfont % let existing .??s files work 8560 8561% \realbackslash is an actual character `\' with catcode other, and 8562% \doublebackslash is two of them (for the pdf outlines). 8563{\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}} 8564 8565% In texinfo, backslash is an active character; it prints the backslash 8566% in fixed width font. 8567\catcode`\\=\active 8568@def@normalbackslash{{@tt@backslashcurfont}} 8569% On startup, @fixbackslash assigns: 8570% @let \ = @normalbackslash 8571 8572% \rawbackslash defines an active \ to do \backslashcurfont. 8573% \otherbackslash defines an active \ to be a literal `\' character with 8574% catcode other. 8575@gdef@rawbackslash{@let\=@backslashcurfont} 8576@gdef@otherbackslash{@let\=@realbackslash} 8577 8578% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of 8579% the literal character `\'. 8580% 8581@def@normalturnoffactive{% 8582 @let\=@normalbackslash 8583 @let"=@normaldoublequote 8584 @let~=@normaltilde 8585 @let^=@normalcaret 8586 @let_=@normalunderscore 8587 @let|=@normalverticalbar 8588 @let<=@normalless 8589 @let>=@normalgreater 8590 @let+=@normalplus 8591 @let$=@normaldollar %$ font-lock fix 8592 @unsepspaces 8593} 8594 8595% Make _ and + \other characters, temporarily. 8596% This is canceled by @fixbackslash. 8597@otherifyactive 8598 8599% If a .fmt file is being used, we don't want the `\input texinfo' to show up. 8600% That is what \eatinput is for; after that, the `\' should revert to printing 8601% a backslash. 8602% 8603@gdef@eatinput input texinfo{@fixbackslash} 8604@global@let\ = @eatinput 8605 8606% On the other hand, perhaps the file did not have a `\input texinfo'. Then 8607% the first `\' in the file would cause an error. This macro tries to fix 8608% that, assuming it is called before the first `\' could plausibly occur. 8609% Also turn back on active characters that might appear in the input 8610% file name, in case not using a pre-dumped format. 8611% 8612@gdef@fixbackslash{% 8613 @ifx\@eatinput @let\ = @normalbackslash @fi 8614 @catcode`+=@active 8615 @catcode`@_=@active 8616} 8617 8618% Say @foo, not \foo, in error messages. 8619@escapechar = `@@ 8620 8621% These look ok in all fonts, so just make them not special. 8622@catcode`@& = @other 8623@catcode`@# = @other 8624@catcode`@% = @other 8625 8626 8627@c Local variables: 8628@c eval: (add-hook 'write-file-hooks 'time-stamp) 8629@c page-delimiter: "^\\\\message" 8630@c time-stamp-start: "def\\\\texinfoversion{" 8631@c time-stamp-format: "%:y-%02m-%02d.%02H" 8632@c time-stamp-end: "}" 8633@c End: 8634 8635@c vim:sw=2: 8636 8637@ignore 8638 arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115 8639@end ignore 8640