|
|
1.1 ! root 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{2013-02-01.11} ! 7: % ! 8: % Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, ! 9: % 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, ! 10: % 2007, 2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc. ! 11: % ! 12: % This texinfo.tex file is free software: you can redistribute it and/or ! 13: % modify it under the terms of the GNU General Public License as ! 14: % published by the Free Software Foundation, either version 3 of the ! 15: % License, or (at your option) any later version. ! 16: % ! 17: % This texinfo.tex file is distributed in the hope that it will be ! 18: % useful, but WITHOUT ANY WARRANTY; without even the implied warranty ! 19: % of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! 20: % General Public License for more details. ! 21: % ! 22: % You should have received a copy of the GNU General Public License ! 23: % along with this program. If not, see <http://www.gnu.org/licenses/>. ! 24: % ! 25: % As a special exception, when this file is read by TeX when processing ! 26: % a Texinfo source document, you may use the result without ! 27: % restriction. This Exception is an additional permission under section 7 ! 28: % of the GNU General Public License, version 3 ("GPLv3"). ! 29: % ! 30: % Please try the latest version of texinfo.tex before submitting bug ! 31: % reports; you can get the latest version from: ! 32: % http://ftp.gnu.org/gnu/texinfo/ (the Texinfo release area), or ! 33: % http://ftpmirror.gnu.org/texinfo/ (same, via a mirror), or ! 34: % http://www.gnu.org/software/texinfo/ (the Texinfo home page) ! 35: % The texinfo.tex in any given distribution could well be out ! 36: % of date, so if that's what you're using, please check. ! 37: % ! 38: % Send bug reports to [email protected]. Please include including a ! 39: % complete document in each bug report with which we can reproduce the ! 40: % problem. Patches are, of course, greatly appreciated. ! 41: % ! 42: % To process a Texinfo manual with TeX, it's most reliable to use the ! 43: % texi2dvi shell script that comes with the distribution. For a simple ! 44: % manual foo.texi, however, you can get away with this: ! 45: % tex foo.texi ! 46: % texindex foo.?? ! 47: % tex foo.texi ! 48: % tex foo.texi ! 49: % dvips foo.dvi -o # or whatever; this makes foo.ps. ! 50: % The extra TeX runs get the cross-reference information correct. ! 51: % Sometimes one run after texindex suffices, and sometimes you need more ! 52: % than two; texi2dvi does it as many times as necessary. ! 53: % ! 54: % It is possible to adapt texinfo.tex for other languages, to some ! 55: % extent. You can get the existing language-specific files from the ! 56: % full Texinfo distribution. ! 57: % ! 58: % The GNU Texinfo home page is http://www.gnu.org/software/texinfo. ! 59: ! 60: ! 61: \message{Loading texinfo [version \texinfoversion]:} ! 62: ! 63: % If in a .fmt file, print the version number ! 64: % and turn on active characters that we couldn't do earlier because ! 65: % they might have appeared in the input file name. ! 66: \everyjob{\message{[Texinfo version \texinfoversion]}% ! 67: \catcode`+=\active \catcode`\_=\active} ! 68: ! 69: \chardef\other=12 ! 70: ! 71: % We never want plain's \outer definition of \+ in Texinfo. ! 72: % For @tex, we can use \tabalign. ! 73: \let\+ = \relax ! 74: ! 75: % Save some plain tex macros whose names we will redefine. ! 76: \let\ptexb=\b ! 77: \let\ptexbullet=\bullet ! 78: \let\ptexc=\c ! 79: \let\ptexcomma=\, ! 80: \let\ptexdot=\. ! 81: \let\ptexdots=\dots ! 82: \let\ptexend=\end ! 83: \let\ptexequiv=\equiv ! 84: \let\ptexexclam=\! ! 85: \let\ptexfootnote=\footnote ! 86: \let\ptexgtr=> ! 87: \let\ptexhat=^ ! 88: \let\ptexi=\i ! 89: \let\ptexindent=\indent ! 90: \let\ptexinsert=\insert ! 91: \let\ptexlbrace=\{ ! 92: \let\ptexless=< ! 93: \let\ptexnewwrite\newwrite ! 94: \let\ptexnoindent=\noindent ! 95: \let\ptexplus=+ ! 96: \let\ptexraggedright=\raggedright ! 97: \let\ptexrbrace=\} ! 98: \let\ptexslash=\/ ! 99: \let\ptexstar=\* ! 100: \let\ptext=\t ! 101: \let\ptextop=\top ! 102: {\catcode`\'=\active \global\let\ptexquoteright'}% active in plain's math mode ! 103: ! 104: % If this character appears in an error message or help string, it ! 105: % starts a new line in the output. ! 106: \newlinechar = `^^J ! 107: ! 108: % Use TeX 3.0's \inputlineno to get the line number, for better error ! 109: % messages, but if we're using an old version of TeX, don't do anything. ! 110: % ! 111: \ifx\inputlineno\thisisundefined ! 112: \let\linenumber = \empty % Pre-3.0. ! 113: \else ! 114: \def\linenumber{l.\the\inputlineno:\space} ! 115: \fi ! 116: ! 117: % Set up fixed words for English if not already set. ! 118: \ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi ! 119: \ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi ! 120: \ifx\putworderror\undefined \gdef\putworderror{error}\fi ! 121: \ifx\putwordfile\undefined \gdef\putwordfile{file}\fi ! 122: \ifx\putwordin\undefined \gdef\putwordin{in}\fi ! 123: \ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi ! 124: \ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi ! 125: \ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi ! 126: \ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi ! 127: \ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi ! 128: \ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi ! 129: \ifx\putwordof\undefined \gdef\putwordof{of}\fi ! 130: \ifx\putwordon\undefined \gdef\putwordon{on}\fi ! 131: \ifx\putwordpage\undefined \gdef\putwordpage{page}\fi ! 132: \ifx\putwordsection\undefined \gdef\putwordsection{section}\fi ! 133: \ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi ! 134: \ifx\putwordsee\undefined \gdef\putwordsee{see}\fi ! 135: \ifx\putwordSee\undefined \gdef\putwordSee{See}\fi ! 136: \ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi ! 137: \ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi ! 138: % ! 139: \ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi ! 140: \ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi ! 141: \ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi ! 142: \ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi ! 143: \ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi ! 144: \ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi ! 145: \ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi ! 146: \ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi ! 147: \ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi ! 148: \ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi ! 149: \ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi ! 150: \ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi ! 151: % ! 152: \ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi ! 153: \ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi ! 154: \ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi ! 155: \ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi ! 156: \ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi ! 157: ! 158: % Since the category of space is not known, we have to be careful. ! 159: \chardef\spacecat = 10 ! 160: \def\spaceisspace{\catcode`\ =\spacecat} ! 161: ! 162: % sometimes characters are active, so we need control sequences. ! 163: \chardef\ampChar = `\& ! 164: \chardef\colonChar = `\: ! 165: \chardef\commaChar = `\, ! 166: \chardef\dashChar = `\- ! 167: \chardef\dotChar = `\. ! 168: \chardef\exclamChar= `\! ! 169: \chardef\hashChar = `\# ! 170: \chardef\lquoteChar= `\` ! 171: \chardef\questChar = `\? ! 172: \chardef\rquoteChar= `\' ! 173: \chardef\semiChar = `\; ! 174: \chardef\slashChar = `\/ ! 175: \chardef\underChar = `\_ ! 176: ! 177: % Ignore a token. ! 178: % ! 179: \def\gobble#1{} ! 180: ! 181: % The following is used inside several \edef's. ! 182: \def\makecsname#1{\expandafter\noexpand\csname#1\endcsname} ! 183: ! 184: % Hyphenation fixes. ! 185: \hyphenation{ ! 186: Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script ! 187: ap-pen-dix bit-map bit-maps ! 188: data-base data-bases eshell fall-ing half-way long-est man-u-script ! 189: man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm ! 190: par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces ! 191: spell-ing spell-ings ! 192: stand-alone strong-est time-stamp time-stamps which-ever white-space ! 193: wide-spread wrap-around ! 194: } ! 195: ! 196: % Margin to add to right of even pages, to left of odd pages. ! 197: \newdimen\bindingoffset ! 198: \newdimen\normaloffset ! 199: \newdimen\pagewidth \newdimen\pageheight ! 200: ! 201: % For a final copy, take out the rectangles ! 202: % that mark overfull boxes (in case you have decided ! 203: % that the text looks ok even though it passes the margin). ! 204: % ! 205: \def\finalout{\overfullrule=0pt } ! 206: ! 207: % Sometimes it is convenient to have everything in the transcript file ! 208: % and nothing on the terminal. We don't just call \tracingall here, ! 209: % since that produces some useless output on the terminal. We also make ! 210: % some effort to order the tracing commands to reduce output in the log ! 211: % file; cf. trace.sty in LaTeX. ! 212: % ! 213: \def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}% ! 214: \def\loggingall{% ! 215: \tracingstats2 ! 216: \tracingpages1 ! 217: \tracinglostchars2 % 2 gives us more in etex ! 218: \tracingparagraphs1 ! 219: \tracingoutput1 ! 220: \tracingmacros2 ! 221: \tracingrestores1 ! 222: \showboxbreadth\maxdimen \showboxdepth\maxdimen ! 223: \ifx\eTeXversion\thisisundefined\else % etex gives us more logging ! 224: \tracingscantokens1 ! 225: \tracingifs1 ! 226: \tracinggroups1 ! 227: \tracingnesting2 ! 228: \tracingassigns1 ! 229: \fi ! 230: \tracingcommands3 % 3 gives us more in etex ! 231: \errorcontextlines16 ! 232: }% ! 233: ! 234: % @errormsg{MSG}. Do the index-like expansions on MSG, but if things ! 235: % aren't perfect, it's not the end of the world, being an error message, ! 236: % after all. ! 237: % ! 238: \def\errormsg{\begingroup \indexnofonts \doerrormsg} ! 239: \def\doerrormsg#1{\errmessage{#1}} ! 240: ! 241: % add check for \lastpenalty to plain's definitions. If the last thing ! 242: % we did was a \nobreak, we don't want to insert more space. ! 243: % ! 244: \def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount ! 245: \removelastskip\penalty-50\smallskip\fi\fi} ! 246: \def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount ! 247: \removelastskip\penalty-100\medskip\fi\fi} ! 248: \def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount ! 249: \removelastskip\penalty-200\bigskip\fi\fi} ! 250: ! 251: % Do @cropmarks to get crop marks. ! 252: % ! 253: \newif\ifcropmarks ! 254: \let\cropmarks = \cropmarkstrue ! 255: % ! 256: % Dimensions to add cropmarks at corners. ! 257: % Added by P. A. MacKay, 12 Nov. 1986 ! 258: % ! 259: \newdimen\outerhsize \newdimen\outervsize % set by the paper size routines ! 260: \newdimen\cornerlong \cornerlong=1pc ! 261: \newdimen\cornerthick \cornerthick=.3pt ! 262: \newdimen\topandbottommargin \topandbottommargin=.75in ! 263: ! 264: % Output a mark which sets \thischapter, \thissection and \thiscolor. ! 265: % We dump everything together because we only have one kind of mark. ! 266: % This works because we only use \botmark / \topmark, not \firstmark. ! 267: % ! 268: % A mark contains a subexpression of the \ifcase ... \fi construct. ! 269: % \get*marks macros below extract the needed part using \ifcase. ! 270: % ! 271: % Another complication is to let the user choose whether \thischapter ! 272: % (\thissection) refers to the chapter (section) in effect at the top ! 273: % of a page, or that at the bottom of a page. The solution is ! 274: % described on page 260 of The TeXbook. It involves outputting two ! 275: % marks for the sectioning macros, one before the section break, and ! 276: % one after. I won't pretend I can describe this better than DEK... ! 277: \def\domark{% ! 278: \toks0=\expandafter{\lastchapterdefs}% ! 279: \toks2=\expandafter{\lastsectiondefs}% ! 280: \toks4=\expandafter{\prevchapterdefs}% ! 281: \toks6=\expandafter{\prevsectiondefs}% ! 282: \toks8=\expandafter{\lastcolordefs}% ! 283: \mark{% ! 284: \the\toks0 \the\toks2 ! 285: \noexpand\or \the\toks4 \the\toks6 ! 286: \noexpand\else \the\toks8 ! 287: }% ! 288: } ! 289: % \topmark doesn't work for the very first chapter (after the title ! 290: % page or the contents), so we use \firstmark there -- this gets us ! 291: % the mark with the chapter defs, unless the user sneaks in, e.g., ! 292: % @setcolor (or @url, or @link, etc.) between @contents and the very ! 293: % first @chapter. ! 294: \def\gettopheadingmarks{% ! 295: \ifcase0\topmark\fi ! 296: \ifx\thischapter\empty \ifcase0\firstmark\fi \fi ! 297: } ! 298: \def\getbottomheadingmarks{\ifcase1\botmark\fi} ! 299: \def\getcolormarks{\ifcase2\topmark\fi} ! 300: ! 301: % Avoid "undefined control sequence" errors. ! 302: \def\lastchapterdefs{} ! 303: \def\lastsectiondefs{} ! 304: \def\prevchapterdefs{} ! 305: \def\prevsectiondefs{} ! 306: \def\lastcolordefs{} ! 307: ! 308: % Main output routine. ! 309: \chardef\PAGE = 255 ! 310: \output = {\onepageout{\pagecontents\PAGE}} ! 311: ! 312: \newbox\headlinebox ! 313: \newbox\footlinebox ! 314: ! 315: % \onepageout takes a vbox as an argument. Note that \pagecontents ! 316: % does insertions, but you have to call it yourself. ! 317: \def\onepageout#1{% ! 318: \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi ! 319: % ! 320: \ifodd\pageno \advance\hoffset by \bindingoffset ! 321: \else \advance\hoffset by -\bindingoffset\fi ! 322: % ! 323: % Do this outside of the \shipout so @code etc. will be expanded in ! 324: % the headline as they should be, not taken literally (outputting ''code). ! 325: \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi ! 326: \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}% ! 327: \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi ! 328: \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}% ! 329: % ! 330: {% ! 331: % Have to do this stuff outside the \shipout because we want it to ! 332: % take effect in \write's, yet the group defined by the \vbox ends ! 333: % before the \shipout runs. ! 334: % ! 335: \indexdummies % don't expand commands in the output. ! 336: \normalturnoffactive % \ in index entries must not stay \, e.g., if ! 337: % the page break happens to be in the middle of an example. ! 338: % We don't want .vr (or whatever) entries like this: ! 339: % \entry{{\tt \indexbackslash }acronym}{32}{\code {\acronym}} ! 340: % "\acronym" won't work when it's read back in; ! 341: % it needs to be ! 342: % {\code {{\tt \backslashcurfont }acronym} ! 343: \shipout\vbox{% ! 344: % Do this early so pdf references go to the beginning of the page. ! 345: \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi ! 346: % ! 347: \ifcropmarks \vbox to \outervsize\bgroup ! 348: \hsize = \outerhsize ! 349: \vskip-\topandbottommargin ! 350: \vtop to0pt{% ! 351: \line{\ewtop\hfil\ewtop}% ! 352: \nointerlineskip ! 353: \line{% ! 354: \vbox{\moveleft\cornerthick\nstop}% ! 355: \hfill ! 356: \vbox{\moveright\cornerthick\nstop}% ! 357: }% ! 358: \vss}% ! 359: \vskip\topandbottommargin ! 360: \line\bgroup ! 361: \hfil % center the page within the outer (page) hsize. ! 362: \ifodd\pageno\hskip\bindingoffset\fi ! 363: \vbox\bgroup ! 364: \fi ! 365: % ! 366: \unvbox\headlinebox ! 367: \pagebody{#1}% ! 368: \ifdim\ht\footlinebox > 0pt ! 369: % Only leave this space if the footline is nonempty. ! 370: % (We lessened \vsize for it in \oddfootingyyy.) ! 371: % The \baselineskip=24pt in plain's \makefootline has no effect. ! 372: \vskip 24pt ! 373: \unvbox\footlinebox ! 374: \fi ! 375: % ! 376: \ifcropmarks ! 377: \egroup % end of \vbox\bgroup ! 378: \hfil\egroup % end of (centering) \line\bgroup ! 379: \vskip\topandbottommargin plus1fill minus1fill ! 380: \boxmaxdepth = \cornerthick ! 381: \vbox to0pt{\vss ! 382: \line{% ! 383: \vbox{\moveleft\cornerthick\nsbot}% ! 384: \hfill ! 385: \vbox{\moveright\cornerthick\nsbot}% ! 386: }% ! 387: \nointerlineskip ! 388: \line{\ewbot\hfil\ewbot}% ! 389: }% ! 390: \egroup % \vbox from first cropmarks clause ! 391: \fi ! 392: }% end of \shipout\vbox ! 393: }% end of group with \indexdummies ! 394: \advancepageno ! 395: \ifnum\outputpenalty>-20000 \else\dosupereject\fi ! 396: } ! 397: ! 398: \newinsert\margin \dimen\margin=\maxdimen ! 399: ! 400: \def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}} ! 401: {\catcode`\@ =11 ! 402: \gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi ! 403: % marginal hacks, [email protected] (Juha Takala) ! 404: \ifvoid\margin\else % marginal info is present ! 405: \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi ! 406: \dimen@=\dp#1\relax \unvbox#1\relax ! 407: \ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi ! 408: \ifr@ggedbottom \kern-\dimen@ \vfil \fi} ! 409: } ! 410: ! 411: % Here are the rules for the cropmarks. Note that they are ! 412: % offset so that the space between them is truly \outerhsize or \outervsize ! 413: % (P. A. MacKay, 12 November, 1986) ! 414: % ! 415: \def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong} ! 416: \def\nstop{\vbox ! 417: {\hrule height\cornerthick depth\cornerlong width\cornerthick}} ! 418: \def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong} ! 419: \def\nsbot{\vbox ! 420: {\hrule height\cornerlong depth\cornerthick width\cornerthick}} ! 421: ! 422: % Parse an argument, then pass it to #1. The argument is the rest of ! 423: % the input line (except we remove a trailing comment). #1 should be a ! 424: % macro which expects an ordinary undelimited TeX argument. ! 425: % ! 426: \def\parsearg{\parseargusing{}} ! 427: \def\parseargusing#1#2{% ! 428: \def\argtorun{#2}% ! 429: \begingroup ! 430: \obeylines ! 431: \spaceisspace ! 432: #1% ! 433: \parseargline\empty% Insert the \empty token, see \finishparsearg below. ! 434: } ! 435: ! 436: {\obeylines % ! 437: \gdef\parseargline#1^^M{% ! 438: \endgroup % End of the group started in \parsearg. ! 439: \argremovecomment #1\comment\ArgTerm% ! 440: }% ! 441: } ! 442: ! 443: % First remove any @comment, then any @c comment. ! 444: \def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm} ! 445: \def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm} ! 446: ! 447: % Each occurrence of `\^^M' or `<space>\^^M' is replaced by a single space. ! 448: % ! 449: % \argremovec might leave us with trailing space, e.g., ! 450: % @end itemize @c foo ! 451: % This space token undergoes the same procedure and is eventually removed ! 452: % by \finishparsearg. ! 453: % ! 454: \def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M} ! 455: \def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M} ! 456: \def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{% ! 457: \def\temp{#3}% ! 458: \ifx\temp\empty ! 459: % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp: ! 460: \let\temp\finishparsearg ! 461: \else ! 462: \let\temp\argcheckspaces ! 463: \fi ! 464: % Put the space token in: ! 465: \temp#1 #3\ArgTerm ! 466: } ! 467: ! 468: % If a _delimited_ argument is enclosed in braces, they get stripped; so ! 469: % to get _exactly_ the rest of the line, we had to prevent such situation. ! 470: % We prepended an \empty token at the very beginning and we expand it now, ! 471: % just before passing the control to \argtorun. ! 472: % (Similarly, we have to think about #3 of \argcheckspacesY above: it is ! 473: % either the null string, or it ends with \^^M---thus there is no danger ! 474: % that a pair of braces would be stripped. ! 475: % ! 476: % But first, we have to remove the trailing space token. ! 477: % ! 478: \def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}} ! 479: ! 480: % \parseargdef\foo{...} ! 481: % is roughly equivalent to ! 482: % \def\foo{\parsearg\Xfoo} ! 483: % \def\Xfoo#1{...} ! 484: % ! 485: % Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my ! 486: % favourite TeX trick. --kasal, 16nov03 ! 487: ! 488: \def\parseargdef#1{% ! 489: \expandafter \doparseargdef \csname\string#1\endcsname #1% ! 490: } ! 491: \def\doparseargdef#1#2{% ! 492: \def#2{\parsearg#1}% ! 493: \def#1##1% ! 494: } ! 495: ! 496: % Several utility definitions with active space: ! 497: { ! 498: \obeyspaces ! 499: \gdef\obeyedspace{ } ! 500: ! 501: % Make each space character in the input produce a normal interword ! 502: % space in the output. Don't allow a line break at this space, as this ! 503: % is used only in environments like @example, where each line of input ! 504: % should produce a line of output anyway. ! 505: % ! 506: \gdef\sepspaces{\obeyspaces\let =\tie} ! 507: ! 508: % If an index command is used in an @example environment, any spaces ! 509: % therein should become regular spaces in the raw index file, not the ! 510: % expansion of \tie (\leavevmode \penalty \@M \ ). ! 511: \gdef\unsepspaces{\let =\space} ! 512: } ! 513: ! 514: ! 515: \def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next} ! 516: ! 517: % Define the framework for environments in texinfo.tex. It's used like this: ! 518: % ! 519: % \envdef\foo{...} ! 520: % \def\Efoo{...} ! 521: % ! 522: % It's the responsibility of \envdef to insert \begingroup before the ! 523: % actual body; @end closes the group after calling \Efoo. \envdef also ! 524: % defines \thisenv, so the current environment is known; @end checks ! 525: % whether the environment name matches. The \checkenv macro can also be ! 526: % used to check whether the current environment is the one expected. ! 527: % ! 528: % Non-false conditionals (@iftex, @ifset) don't fit into this, so they ! 529: % are not treated as environments; they don't open a group. (The ! 530: % implementation of @end takes care not to call \endgroup in this ! 531: % special case.) ! 532: ! 533: ! 534: % At run-time, environments start with this: ! 535: \def\startenvironment#1{\begingroup\def\thisenv{#1}} ! 536: % initialize ! 537: \let\thisenv\empty ! 538: ! 539: % ... but they get defined via ``\envdef\foo{...}'': ! 540: \long\def\envdef#1#2{\def#1{\startenvironment#1#2}} ! 541: \def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}} ! 542: ! 543: % Check whether we're in the right environment: ! 544: \def\checkenv#1{% ! 545: \def\temp{#1}% ! 546: \ifx\thisenv\temp ! 547: \else ! 548: \badenverr ! 549: \fi ! 550: } ! 551: ! 552: % Environment mismatch, #1 expected: ! 553: \def\badenverr{% ! 554: \errhelp = \EMsimple ! 555: \errmessage{This command can appear only \inenvironment\temp, ! 556: not \inenvironment\thisenv}% ! 557: } ! 558: \def\inenvironment#1{% ! 559: \ifx#1\empty ! 560: outside of any environment% ! 561: \else ! 562: in environment \expandafter\string#1% ! 563: \fi ! 564: } ! 565: ! 566: % @end foo executes the definition of \Efoo. ! 567: % But first, it executes a specialized version of \checkenv ! 568: % ! 569: \parseargdef\end{% ! 570: \if 1\csname iscond.#1\endcsname ! 571: \else ! 572: % The general wording of \badenverr may not be ideal. ! 573: \expandafter\checkenv\csname#1\endcsname ! 574: \csname E#1\endcsname ! 575: \endgroup ! 576: \fi ! 577: } ! 578: ! 579: \newhelp\EMsimple{Press RETURN to continue.} ! 580: ! 581: ! 582: % Be sure we're in horizontal mode when doing a tie, since we make space ! 583: % equivalent to this in @example-like environments. Otherwise, a space ! 584: % at the beginning of a line will start with \penalty -- and ! 585: % since \penalty is valid in vertical mode, we'd end up putting the ! 586: % penalty on the vertical list instead of in the new paragraph. ! 587: {\catcode`@ = 11 ! 588: % Avoid using \@M directly, because that causes trouble ! 589: % if the definition is written into an index file. ! 590: \global\let\tiepenalty = \@M ! 591: \gdef\tie{\leavevmode\penalty\tiepenalty\ } ! 592: } ! 593: ! 594: % @: forces normal size whitespace following. ! 595: \def\:{\spacefactor=1000 } ! 596: ! 597: % @* forces a line break. ! 598: \def\*{\unskip\hfil\break\hbox{}\ignorespaces} ! 599: ! 600: % @/ allows a line break. ! 601: \let\/=\allowbreak ! 602: ! 603: % @. is an end-of-sentence period. ! 604: \def\.{.\spacefactor=\endofsentencespacefactor\space} ! 605: ! 606: % @! is an end-of-sentence bang. ! 607: \def\!{!\spacefactor=\endofsentencespacefactor\space} ! 608: ! 609: % @? is an end-of-sentence query. ! 610: \def\?{?\spacefactor=\endofsentencespacefactor\space} ! 611: ! 612: % @frenchspacing on|off says whether to put extra space after punctuation. ! 613: % ! 614: \def\onword{on} ! 615: \def\offword{off} ! 616: % ! 617: \parseargdef\frenchspacing{% ! 618: \def\temp{#1}% ! 619: \ifx\temp\onword \plainfrenchspacing ! 620: \else\ifx\temp\offword \plainnonfrenchspacing ! 621: \else ! 622: \errhelp = \EMsimple ! 623: \errmessage{Unknown @frenchspacing option `\temp', must be on|off}% ! 624: \fi\fi ! 625: } ! 626: ! 627: % @w prevents a word break. Without the \leavevmode, @w at the ! 628: % beginning of a paragraph, when TeX is still in vertical mode, would ! 629: % produce a whole line of output instead of starting the paragraph. ! 630: \def\w#1{\leavevmode\hbox{#1}} ! 631: ! 632: % @group ... @end group forces ... to be all on one page, by enclosing ! 633: % it in a TeX vbox. We use \vtop instead of \vbox to construct the box ! 634: % to keep its height that of a normal line. According to the rules for ! 635: % \topskip (p.114 of the TeXbook), the glue inserted is ! 636: % max (\topskip - \ht (first item), 0). If that height is large, ! 637: % therefore, no glue is inserted, and the space between the headline and ! 638: % the text is small, which looks bad. ! 639: % ! 640: % Another complication is that the group might be very large. This can ! 641: % cause the glue on the previous page to be unduly stretched, because it ! 642: % does not have much material. In this case, it's better to add an ! 643: % explicit \vfill so that the extra space is at the bottom. The ! 644: % threshold for doing this is if the group is more than \vfilllimit ! 645: % percent of a page (\vfilllimit can be changed inside of @tex). ! 646: % ! 647: \newbox\groupbox ! 648: \def\vfilllimit{0.7} ! 649: % ! 650: \envdef\group{% ! 651: \ifnum\catcode`\^^M=\active \else ! 652: \errhelp = \groupinvalidhelp ! 653: \errmessage{@group invalid in context where filling is enabled}% ! 654: \fi ! 655: \startsavinginserts ! 656: % ! 657: \setbox\groupbox = \vtop\bgroup ! 658: % Do @comment since we are called inside an environment such as ! 659: % @example, where each end-of-line in the input causes an ! 660: % end-of-line in the output. We don't want the end-of-line after ! 661: % the `@group' to put extra space in the output. Since @group ! 662: % should appear on a line by itself (according to the Texinfo ! 663: % manual), we don't worry about eating any user text. ! 664: \comment ! 665: } ! 666: % ! 667: % The \vtop produces a box with normal height and large depth; thus, TeX puts ! 668: % \baselineskip glue before it, and (when the next line of text is done) ! 669: % \lineskip glue after it. Thus, space below is not quite equal to space ! 670: % above. But it's pretty close. ! 671: \def\Egroup{% ! 672: % To get correct interline space between the last line of the group ! 673: % and the first line afterwards, we have to propagate \prevdepth. ! 674: \endgraf % Not \par, as it may have been set to \lisppar. ! 675: \global\dimen1 = \prevdepth ! 676: \egroup % End the \vtop. ! 677: % \dimen0 is the vertical size of the group's box. ! 678: \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox ! 679: % \dimen2 is how much space is left on the page (more or less). ! 680: \dimen2 = \pageheight \advance\dimen2 by -\pagetotal ! 681: % if the group doesn't fit on the current page, and it's a big big ! 682: % group, force a page break. ! 683: \ifdim \dimen0 > \dimen2 ! 684: \ifdim \pagetotal < \vfilllimit\pageheight ! 685: \page ! 686: \fi ! 687: \fi ! 688: \box\groupbox ! 689: \prevdepth = \dimen1 ! 690: \checkinserts ! 691: } ! 692: % ! 693: % TeX puts in an \escapechar (i.e., `@') at the beginning of the help ! 694: % message, so this ends up printing `@group can only ...'. ! 695: % ! 696: \newhelp\groupinvalidhelp{% ! 697: group can only be used in environments such as @example,^^J% ! 698: where each line of input produces a line of output.} ! 699: ! 700: % @need space-in-mils ! 701: % forces a page break if there is not space-in-mils remaining. ! 702: ! 703: \newdimen\mil \mil=0.001in ! 704: ! 705: \parseargdef\need{% ! 706: % Ensure vertical mode, so we don't make a big box in the middle of a ! 707: % paragraph. ! 708: \par ! 709: % ! 710: % If the @need value is less than one line space, it's useless. ! 711: \dimen0 = #1\mil ! 712: \dimen2 = \ht\strutbox ! 713: \advance\dimen2 by \dp\strutbox ! 714: \ifdim\dimen0 > \dimen2 ! 715: % ! 716: % Do a \strut just to make the height of this box be normal, so the ! 717: % normal leading is inserted relative to the preceding line. ! 718: % And a page break here is fine. ! 719: \vtop to #1\mil{\strut\vfil}% ! 720: % ! 721: % TeX does not even consider page breaks if a penalty added to the ! 722: % main vertical list is 10000 or more. But in order to see if the ! 723: % empty box we just added fits on the page, we must make it consider ! 724: % page breaks. On the other hand, we don't want to actually break the ! 725: % page after the empty box. So we use a penalty of 9999. ! 726: % ! 727: % There is an extremely small chance that TeX will actually break the ! 728: % page at this \penalty, if there are no other feasible breakpoints in ! 729: % sight. (If the user is using lots of big @group commands, which ! 730: % almost-but-not-quite fill up a page, TeX will have a hard time doing ! 731: % good page breaking, for example.) However, I could not construct an ! 732: % example where a page broke at this \penalty; if it happens in a real ! 733: % document, then we can reconsider our strategy. ! 734: \penalty9999 ! 735: % ! 736: % Back up by the size of the box, whether we did a page break or not. ! 737: \kern -#1\mil ! 738: % ! 739: % Do not allow a page break right after this kern. ! 740: \nobreak ! 741: \fi ! 742: } ! 743: ! 744: % @br forces paragraph break (and is undocumented). ! 745: ! 746: \let\br = \par ! 747: ! 748: % @page forces the start of a new page. ! 749: % ! 750: \def\page{\par\vfill\supereject} ! 751: ! 752: % @exdent text.... ! 753: % outputs text on separate line in roman font, starting at standard page margin ! 754: ! 755: % This records the amount of indent in the innermost environment. ! 756: % That's how much \exdent should take out. ! 757: \newskip\exdentamount ! 758: ! 759: % This defn is used inside fill environments such as @defun. ! 760: \parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break} ! 761: ! 762: % This defn is used inside nofill environments such as @example. ! 763: \parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount ! 764: \leftline{\hskip\leftskip{\rm#1}}}} ! 765: ! 766: % @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current ! 767: % paragraph. For more general purposes, use the \margin insertion ! 768: % class. WHICH is `l' or `r'. Not documented, written for gawk manual. ! 769: % ! 770: \newskip\inmarginspacing \inmarginspacing=1cm ! 771: \def\strutdepth{\dp\strutbox} ! 772: % ! 773: \def\doinmargin#1#2{\strut\vadjust{% ! 774: \nobreak ! 775: \kern-\strutdepth ! 776: \vtop to \strutdepth{% ! 777: \baselineskip=\strutdepth ! 778: \vss ! 779: % if you have multiple lines of stuff to put here, you'll need to ! 780: % make the vbox yourself of the appropriate size. ! 781: \ifx#1l% ! 782: \llap{\ignorespaces #2\hskip\inmarginspacing}% ! 783: \else ! 784: \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}% ! 785: \fi ! 786: \null ! 787: }% ! 788: }} ! 789: \def\inleftmargin{\doinmargin l} ! 790: \def\inrightmargin{\doinmargin r} ! 791: % ! 792: % @inmargin{TEXT [, RIGHT-TEXT]} ! 793: % (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right; ! 794: % else use TEXT for both). ! 795: % ! 796: \def\inmargin#1{\parseinmargin #1,,\finish} ! 797: \def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing. ! 798: \setbox0 = \hbox{\ignorespaces #2}% ! 799: \ifdim\wd0 > 0pt ! 800: \def\lefttext{#1}% have both texts ! 801: \def\righttext{#2}% ! 802: \else ! 803: \def\lefttext{#1}% have only one text ! 804: \def\righttext{#1}% ! 805: \fi ! 806: % ! 807: \ifodd\pageno ! 808: \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin ! 809: \else ! 810: \def\temp{\inleftmargin\lefttext}% ! 811: \fi ! 812: \temp ! 813: } ! 814: ! 815: % @| inserts a changebar to the left of the current line. It should ! 816: % surround any changed text. This approach does *not* work if the ! 817: % change spans more than two lines of output. To handle that, we would ! 818: % have adopt a much more difficult approach (putting marks into the main ! 819: % vertical list for the beginning and end of each change). This command ! 820: % is not documented, not supported, and doesn't work. ! 821: % ! 822: \def\|{% ! 823: % \vadjust can only be used in horizontal mode. ! 824: \leavevmode ! 825: % ! 826: % Append this vertical mode material after the current line in the output. ! 827: \vadjust{% ! 828: % We want to insert a rule with the height and depth of the current ! 829: % leading; that is exactly what \strutbox is supposed to record. ! 830: \vskip-\baselineskip ! 831: % ! 832: % \vadjust-items are inserted at the left edge of the type. So ! 833: % the \llap here moves out into the left-hand margin. ! 834: \llap{% ! 835: % ! 836: % For a thicker or thinner bar, change the `1pt'. ! 837: \vrule height\baselineskip width1pt ! 838: % ! 839: % This is the space between the bar and the text. ! 840: \hskip 12pt ! 841: }% ! 842: }% ! 843: } ! 844: ! 845: % @include FILE -- \input text of FILE. ! 846: % ! 847: \def\include{\parseargusing\filenamecatcodes\includezzz} ! 848: \def\includezzz#1{% ! 849: \pushthisfilestack ! 850: \def\thisfile{#1}% ! 851: {% ! 852: \makevalueexpandable % we want to expand any @value in FILE. ! 853: \turnoffactive % and allow special characters in the expansion ! 854: \indexnofonts % Allow `@@' and other weird things in file names. ! 855: \wlog{texinfo.tex: doing @include of #1^^J}% ! 856: \edef\temp{\noexpand\input #1 }% ! 857: % ! 858: % This trickery is to read FILE outside of a group, in case it makes ! 859: % definitions, etc. ! 860: \expandafter ! 861: }\temp ! 862: \popthisfilestack ! 863: } ! 864: \def\filenamecatcodes{% ! 865: \catcode`\\=\other ! 866: \catcode`~=\other ! 867: \catcode`^=\other ! 868: \catcode`_=\other ! 869: \catcode`|=\other ! 870: \catcode`<=\other ! 871: \catcode`>=\other ! 872: \catcode`+=\other ! 873: \catcode`-=\other ! 874: \catcode`\`=\other ! 875: \catcode`\'=\other ! 876: } ! 877: ! 878: \def\pushthisfilestack{% ! 879: \expandafter\pushthisfilestackX\popthisfilestack\StackTerm ! 880: } ! 881: \def\pushthisfilestackX{% ! 882: \expandafter\pushthisfilestackY\thisfile\StackTerm ! 883: } ! 884: \def\pushthisfilestackY #1\StackTerm #2\StackTerm {% ! 885: \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}% ! 886: } ! 887: ! 888: \def\popthisfilestack{\errthisfilestackempty} ! 889: \def\errthisfilestackempty{\errmessage{Internal error: ! 890: the stack of filenames is empty.}} ! 891: % ! 892: \def\thisfile{} ! 893: ! 894: % @center line ! 895: % outputs that line, centered. ! 896: % ! 897: \parseargdef\center{% ! 898: \ifhmode ! 899: \let\centersub\centerH ! 900: \else ! 901: \let\centersub\centerV ! 902: \fi ! 903: \centersub{\hfil \ignorespaces#1\unskip \hfil}% ! 904: \let\centersub\relax % don't let the definition persist, just in case ! 905: } ! 906: \def\centerH#1{{% ! 907: \hfil\break ! 908: \advance\hsize by -\leftskip ! 909: \advance\hsize by -\rightskip ! 910: \line{#1}% ! 911: \break ! 912: }} ! 913: % ! 914: \newcount\centerpenalty ! 915: \def\centerV#1{% ! 916: % The idea here is the same as in \startdefun, \cartouche, etc.: if ! 917: % @center is the first thing after a section heading, we need to wipe ! 918: % out the negative parskip inserted by \sectionheading, but still ! 919: % prevent a page break here. ! 920: \centerpenalty = \lastpenalty ! 921: \ifnum\centerpenalty>10000 \vskip\parskip \fi ! 922: \ifnum\centerpenalty>9999 \penalty\centerpenalty \fi ! 923: \line{\kern\leftskip #1\kern\rightskip}% ! 924: } ! 925: ! 926: % @sp n outputs n lines of vertical space ! 927: % ! 928: \parseargdef\sp{\vskip #1\baselineskip} ! 929: ! 930: % @comment ...line which is ignored... ! 931: % @c is the same as @comment ! 932: % @ignore ... @end ignore is another way to write a comment ! 933: % ! 934: \def\comment{\begingroup \catcode`\^^M=\other% ! 935: \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other% ! 936: \commentxxx} ! 937: {\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}} ! 938: % ! 939: \let\c=\comment ! 940: ! 941: % @paragraphindent NCHARS ! 942: % We'll use ems for NCHARS, close enough. ! 943: % NCHARS can also be the word `asis' or `none'. ! 944: % We cannot feasibly implement @paragraphindent asis, though. ! 945: % ! 946: \def\asisword{asis} % no translation, these are keywords ! 947: \def\noneword{none} ! 948: % ! 949: \parseargdef\paragraphindent{% ! 950: \def\temp{#1}% ! 951: \ifx\temp\asisword ! 952: \else ! 953: \ifx\temp\noneword ! 954: \defaultparindent = 0pt ! 955: \else ! 956: \defaultparindent = #1em ! 957: \fi ! 958: \fi ! 959: \parindent = \defaultparindent ! 960: } ! 961: ! 962: % @exampleindent NCHARS ! 963: % We'll use ems for NCHARS like @paragraphindent. ! 964: % It seems @exampleindent asis isn't necessary, but ! 965: % I preserve it to make it similar to @paragraphindent. ! 966: \parseargdef\exampleindent{% ! 967: \def\temp{#1}% ! 968: \ifx\temp\asisword ! 969: \else ! 970: \ifx\temp\noneword ! 971: \lispnarrowing = 0pt ! 972: \else ! 973: \lispnarrowing = #1em ! 974: \fi ! 975: \fi ! 976: } ! 977: ! 978: % @firstparagraphindent WORD ! 979: % If WORD is `none', then suppress indentation of the first paragraph ! 980: % after a section heading. If WORD is `insert', then do indent at such ! 981: % paragraphs. ! 982: % ! 983: % The paragraph indentation is suppressed or not by calling ! 984: % \suppressfirstparagraphindent, which the sectioning commands do. ! 985: % We switch the definition of this back and forth according to WORD. ! 986: % By default, we suppress indentation. ! 987: % ! 988: \def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent} ! 989: \def\insertword{insert} ! 990: % ! 991: \parseargdef\firstparagraphindent{% ! 992: \def\temp{#1}% ! 993: \ifx\temp\noneword ! 994: \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent ! 995: \else\ifx\temp\insertword ! 996: \let\suppressfirstparagraphindent = \relax ! 997: \else ! 998: \errhelp = \EMsimple ! 999: \errmessage{Unknown @firstparagraphindent option `\temp'}% ! 1000: \fi\fi ! 1001: } ! 1002: ! 1003: % Here is how we actually suppress indentation. Redefine \everypar to ! 1004: % \kern backwards by \parindent, and then reset itself to empty. ! 1005: % ! 1006: % We also make \indent itself not actually do anything until the next ! 1007: % paragraph. ! 1008: % ! 1009: \gdef\dosuppressfirstparagraphindent{% ! 1010: \gdef\indent{% ! 1011: \restorefirstparagraphindent ! 1012: \indent ! 1013: }% ! 1014: \gdef\noindent{% ! 1015: \restorefirstparagraphindent ! 1016: \noindent ! 1017: }% ! 1018: \global\everypar = {% ! 1019: \kern -\parindent ! 1020: \restorefirstparagraphindent ! 1021: }% ! 1022: } ! 1023: ! 1024: \gdef\restorefirstparagraphindent{% ! 1025: \global \let \indent = \ptexindent ! 1026: \global \let \noindent = \ptexnoindent ! 1027: \global \everypar = {}% ! 1028: } ! 1029: ! 1030: ! 1031: % @refill is a no-op. ! 1032: \let\refill=\relax ! 1033: ! 1034: % If working on a large document in chapters, it is convenient to ! 1035: % be able to disable indexing, cross-referencing, and contents, for test runs. ! 1036: % This is done with @novalidate (before @setfilename). ! 1037: % ! 1038: \newif\iflinks \linkstrue % by default we want the aux files. ! 1039: \let\novalidate = \linksfalse ! 1040: ! 1041: % @setfilename is done at the beginning of every texinfo file. ! 1042: % So open here the files we need to have open while reading the input. ! 1043: % This makes it possible to make a .fmt file for texinfo. ! 1044: \def\setfilename{% ! 1045: \fixbackslash % Turn off hack to swallow `\input texinfo'. ! 1046: \iflinks ! 1047: \tryauxfile ! 1048: % Open the new aux file. TeX will close it automatically at exit. ! 1049: \immediate\openout\auxfile=\jobname.aux ! 1050: \fi % \openindices needs to do some work in any case. ! 1051: \openindices ! 1052: \let\setfilename=\comment % Ignore extra @setfilename cmds. ! 1053: % ! 1054: % If texinfo.cnf is present on the system, read it. ! 1055: % Useful for site-wide @afourpaper, etc. ! 1056: \openin 1 texinfo.cnf ! 1057: \ifeof 1 \else \input texinfo.cnf \fi ! 1058: \closein 1 ! 1059: % ! 1060: \comment % Ignore the actual filename. ! 1061: } ! 1062: ! 1063: % Called from \setfilename. ! 1064: % ! 1065: \def\openindices{% ! 1066: \newindex{cp}% ! 1067: \newcodeindex{fn}% ! 1068: \newcodeindex{vr}% ! 1069: \newcodeindex{tp}% ! 1070: \newcodeindex{ky}% ! 1071: \newcodeindex{pg}% ! 1072: } ! 1073: ! 1074: % @bye. ! 1075: \outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} ! 1076: ! 1077: ! 1078: \message{pdf,} ! 1079: % adobe `portable' document format ! 1080: \newcount\tempnum ! 1081: \newcount\lnkcount ! 1082: \newtoks\filename ! 1083: \newcount\filenamelength ! 1084: \newcount\pgn ! 1085: \newtoks\toksA ! 1086: \newtoks\toksB ! 1087: \newtoks\toksC ! 1088: \newtoks\toksD ! 1089: \newbox\boxA ! 1090: \newcount\countA ! 1091: \newif\ifpdf ! 1092: \newif\ifpdfmakepagedest ! 1093: ! 1094: % when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1 ! 1095: % can be set). So we test for \relax and 0 as well as being undefined. ! 1096: \ifx\pdfoutput\thisisundefined ! 1097: \else ! 1098: \ifx\pdfoutput\relax ! 1099: \else ! 1100: \ifcase\pdfoutput ! 1101: \else ! 1102: \pdftrue ! 1103: \fi ! 1104: \fi ! 1105: \fi ! 1106: ! 1107: % PDF uses PostScript string constants for the names of xref targets, ! 1108: % for display in the outlines, and in other places. Thus, we have to ! 1109: % double any backslashes. Otherwise, a name like "\node" will be ! 1110: % interpreted as a newline (\n), followed by o, d, e. Not good. ! 1111: % ! 1112: % See http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html and ! 1113: % related messages. The final outcome is that it is up to the TeX user ! 1114: % to double the backslashes and otherwise make the string valid, so ! 1115: % that's what we do. pdftex 1.30.0 (ca.2005) introduced a primitive to ! 1116: % do this reliably, so we use it. ! 1117: ! 1118: % #1 is a control sequence in which to do the replacements, ! 1119: % which we \xdef. ! 1120: \def\txiescapepdf#1{% ! 1121: \ifx\pdfescapestring\thisisundefined ! 1122: % No primitive available; should we give a warning or log? ! 1123: % Many times it won't matter. ! 1124: \else ! 1125: % The expandable \pdfescapestring primitive escapes parentheses, ! 1126: % backslashes, and other special chars. ! 1127: \xdef#1{\pdfescapestring{#1}}% ! 1128: \fi ! 1129: } ! 1130: ! 1131: \newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images ! 1132: with PDF output, and none of those formats could be found. (.eps cannot ! 1133: be supported due to the design of the PDF format; use regular TeX (DVI ! 1134: output) for that.)} ! 1135: ! 1136: \ifpdf ! 1137: % ! 1138: % Color manipulation macros based on pdfcolor.tex, ! 1139: % except using rgb instead of cmyk; the latter is said to render as a ! 1140: % very dark gray on-screen and a very dark halftone in print, instead ! 1141: % of actual black. ! 1142: \def\rgbDarkRed{0.50 0.09 0.12} ! 1143: \def\rgbBlack{0 0 0} ! 1144: % ! 1145: % k sets the color for filling (usual text, etc.); ! 1146: % K sets the color for stroking (thin rules, e.g., normal _'s). ! 1147: \def\pdfsetcolor#1{\pdfliteral{#1 rg #1 RG}} ! 1148: % ! 1149: % Set color, and create a mark which defines \thiscolor accordingly, ! 1150: % so that \makeheadline knows which color to restore. ! 1151: \def\setcolor#1{% ! 1152: \xdef\lastcolordefs{\gdef\noexpand\thiscolor{#1}}% ! 1153: \domark ! 1154: \pdfsetcolor{#1}% ! 1155: } ! 1156: % ! 1157: \def\maincolor{\rgbBlack} ! 1158: \pdfsetcolor{\maincolor} ! 1159: \edef\thiscolor{\maincolor} ! 1160: \def\lastcolordefs{} ! 1161: % ! 1162: \def\makefootline{% ! 1163: \baselineskip24pt ! 1164: \line{\pdfsetcolor{\maincolor}\the\footline}% ! 1165: } ! 1166: % ! 1167: \def\makeheadline{% ! 1168: \vbox to 0pt{% ! 1169: \vskip-22.5pt ! 1170: \line{% ! 1171: \vbox to8.5pt{}% ! 1172: % Extract \thiscolor definition from the marks. ! 1173: \getcolormarks ! 1174: % Typeset the headline with \maincolor, then restore the color. ! 1175: \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}% ! 1176: }% ! 1177: \vss ! 1178: }% ! 1179: \nointerlineskip ! 1180: } ! 1181: % ! 1182: % ! 1183: \pdfcatalog{/PageMode /UseOutlines} ! 1184: % ! 1185: % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto). ! 1186: \def\dopdfimage#1#2#3{% ! 1187: \def\pdfimagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}% ! 1188: \def\pdfimageheight{#3}\setbox2 = \hbox{\ignorespaces #3}% ! 1189: % ! 1190: % pdftex (and the PDF format) support .pdf, .png, .jpg (among ! 1191: % others). Let's try in that order, PDF first since if ! 1192: % someone has a scalable image, presumably better to use that than a ! 1193: % bitmap. ! 1194: \let\pdfimgext=\empty ! 1195: \begingroup ! 1196: \openin 1 #1.pdf \ifeof 1 ! 1197: \openin 1 #1.PDF \ifeof 1 ! 1198: \openin 1 #1.png \ifeof 1 ! 1199: \openin 1 #1.jpg \ifeof 1 ! 1200: \openin 1 #1.jpeg \ifeof 1 ! 1201: \openin 1 #1.JPG \ifeof 1 ! 1202: \errhelp = \nopdfimagehelp ! 1203: \errmessage{Could not find image file #1 for pdf}% ! 1204: \else \gdef\pdfimgext{JPG}% ! 1205: \fi ! 1206: \else \gdef\pdfimgext{jpeg}% ! 1207: \fi ! 1208: \else \gdef\pdfimgext{jpg}% ! 1209: \fi ! 1210: \else \gdef\pdfimgext{png}% ! 1211: \fi ! 1212: \else \gdef\pdfimgext{PDF}% ! 1213: \fi ! 1214: \else \gdef\pdfimgext{pdf}% ! 1215: \fi ! 1216: \closein 1 ! 1217: \endgroup ! 1218: % ! 1219: % without \immediate, ancient pdftex seg faults when the same image is ! 1220: % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.) ! 1221: \ifnum\pdftexversion < 14 ! 1222: \immediate\pdfimage ! 1223: \else ! 1224: \immediate\pdfximage ! 1225: \fi ! 1226: \ifdim \wd0 >0pt width \pdfimagewidth \fi ! 1227: \ifdim \wd2 >0pt height \pdfimageheight \fi ! 1228: \ifnum\pdftexversion<13 ! 1229: #1.\pdfimgext ! 1230: \else ! 1231: {#1.\pdfimgext}% ! 1232: \fi ! 1233: \ifnum\pdftexversion < 14 \else ! 1234: \pdfrefximage \pdflastximage ! 1235: \fi} ! 1236: % ! 1237: \def\pdfmkdest#1{{% ! 1238: % We have to set dummies so commands such as @code, and characters ! 1239: % such as \, aren't expanded when present in a section title. ! 1240: \indexnofonts ! 1241: \turnoffactive ! 1242: \makevalueexpandable ! 1243: \def\pdfdestname{#1}% ! 1244: \txiescapepdf\pdfdestname ! 1245: \safewhatsit{\pdfdest name{\pdfdestname} xyz}% ! 1246: }} ! 1247: % ! 1248: % used to mark target names; must be expandable. ! 1249: \def\pdfmkpgn#1{#1} ! 1250: % ! 1251: % by default, use a color that is dark enough to print on paper as ! 1252: % nearly black, but still distinguishable for online viewing. ! 1253: \def\urlcolor{\rgbDarkRed} ! 1254: \def\linkcolor{\rgbDarkRed} ! 1255: \def\endlink{\setcolor{\maincolor}\pdfendlink} ! 1256: % ! 1257: % Adding outlines to PDF; macros for calculating structure of outlines ! 1258: % come from Petr Olsak ! 1259: \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0% ! 1260: \else \csname#1\endcsname \fi} ! 1261: \def\advancenumber#1{\tempnum=\expnumber{#1}\relax ! 1262: \advance\tempnum by 1 ! 1263: \expandafter\xdef\csname#1\endcsname{\the\tempnum}} ! 1264: % ! 1265: % #1 is the section text, which is what will be displayed in the ! 1266: % outline by the pdf viewer. #2 is the pdf expression for the number ! 1267: % of subentries (or empty, for subsubsections). #3 is the node text, ! 1268: % which might be empty if this toc entry had no corresponding node. ! 1269: % #4 is the page number ! 1270: % ! 1271: \def\dopdfoutline#1#2#3#4{% ! 1272: % Generate a link to the node text if that exists; else, use the ! 1273: % page number. We could generate a destination for the section ! 1274: % text in the case where a section has no node, but it doesn't ! 1275: % seem worth the trouble, since most documents are normally structured. ! 1276: \edef\pdfoutlinedest{#3}% ! 1277: \ifx\pdfoutlinedest\empty ! 1278: \def\pdfoutlinedest{#4}% ! 1279: \else ! 1280: \txiescapepdf\pdfoutlinedest ! 1281: \fi ! 1282: % ! 1283: % Also escape PDF chars in the display string. ! 1284: \edef\pdfoutlinetext{#1}% ! 1285: \txiescapepdf\pdfoutlinetext ! 1286: % ! 1287: \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}% ! 1288: } ! 1289: % ! 1290: \def\pdfmakeoutlines{% ! 1291: \begingroup ! 1292: % Read toc silently, to get counts of subentries for \pdfoutline. ! 1293: \def\partentry##1##2##3##4{}% ignore parts in the outlines ! 1294: \def\numchapentry##1##2##3##4{% ! 1295: \def\thischapnum{##2}% ! 1296: \def\thissecnum{0}% ! 1297: \def\thissubsecnum{0}% ! 1298: }% ! 1299: \def\numsecentry##1##2##3##4{% ! 1300: \advancenumber{chap\thischapnum}% ! 1301: \def\thissecnum{##2}% ! 1302: \def\thissubsecnum{0}% ! 1303: }% ! 1304: \def\numsubsecentry##1##2##3##4{% ! 1305: \advancenumber{sec\thissecnum}% ! 1306: \def\thissubsecnum{##2}% ! 1307: }% ! 1308: \def\numsubsubsecentry##1##2##3##4{% ! 1309: \advancenumber{subsec\thissubsecnum}% ! 1310: }% ! 1311: \def\thischapnum{0}% ! 1312: \def\thissecnum{0}% ! 1313: \def\thissubsecnum{0}% ! 1314: % ! 1315: % use \def rather than \let here because we redefine \chapentry et ! 1316: % al. a second time, below. ! 1317: \def\appentry{\numchapentry}% ! 1318: \def\appsecentry{\numsecentry}% ! 1319: \def\appsubsecentry{\numsubsecentry}% ! 1320: \def\appsubsubsecentry{\numsubsubsecentry}% ! 1321: \def\unnchapentry{\numchapentry}% ! 1322: \def\unnsecentry{\numsecentry}% ! 1323: \def\unnsubsecentry{\numsubsecentry}% ! 1324: \def\unnsubsubsecentry{\numsubsubsecentry}% ! 1325: \readdatafile{toc}% ! 1326: % ! 1327: % Read toc second time, this time actually producing the outlines. ! 1328: % The `-' means take the \expnumber as the absolute number of ! 1329: % subentries, which we calculated on our first read of the .toc above. ! 1330: % ! 1331: % We use the node names as the destinations. ! 1332: \def\numchapentry##1##2##3##4{% ! 1333: \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}% ! 1334: \def\numsecentry##1##2##3##4{% ! 1335: \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}% ! 1336: \def\numsubsecentry##1##2##3##4{% ! 1337: \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}% ! 1338: \def\numsubsubsecentry##1##2##3##4{% count is always zero ! 1339: \dopdfoutline{##1}{}{##3}{##4}}% ! 1340: % ! 1341: % PDF outlines are displayed using system fonts, instead of ! 1342: % document fonts. Therefore we cannot use special characters, ! 1343: % since the encoding is unknown. For example, the eogonek from ! 1344: % Latin 2 (0xea) gets translated to a | character. Info from ! 1345: % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100. ! 1346: % ! 1347: % TODO this right, we have to translate 8-bit characters to ! 1348: % their "best" equivalent, based on the @documentencoding. Too ! 1349: % much work for too little return. Just use the ASCII equivalents ! 1350: % we use for the index sort strings. ! 1351: % ! 1352: \indexnofonts ! 1353: \setupdatafile ! 1354: % We can have normal brace characters in the PDF outlines, unlike ! 1355: % Texinfo index files. So set that up. ! 1356: \def\{{\lbracecharliteral}% ! 1357: \def\}{\rbracecharliteral}% ! 1358: \catcode`\\=\active \otherbackslash ! 1359: \input \tocreadfilename ! 1360: \endgroup ! 1361: } ! 1362: {\catcode`[=1 \catcode`]=2 ! 1363: \catcode`{=\other \catcode`}=\other ! 1364: \gdef\lbracecharliteral[{]% ! 1365: \gdef\rbracecharliteral[}]% ! 1366: ] ! 1367: % ! 1368: \def\skipspaces#1{\def\PP{#1}\def\D{|}% ! 1369: \ifx\PP\D\let\nextsp\relax ! 1370: \else\let\nextsp\skipspaces ! 1371: \addtokens{\filename}{\PP}% ! 1372: \advance\filenamelength by 1 ! 1373: \fi ! 1374: \nextsp} ! 1375: \def\getfilename#1{% ! 1376: \filenamelength=0 ! 1377: % If we don't expand the argument now, \skipspaces will get ! 1378: % snagged on things like "@value{foo}". ! 1379: \edef\temp{#1}% ! 1380: \expandafter\skipspaces\temp|\relax ! 1381: } ! 1382: \ifnum\pdftexversion < 14 ! 1383: \let \startlink \pdfannotlink ! 1384: \else ! 1385: \let \startlink \pdfstartlink ! 1386: \fi ! 1387: % make a live url in pdf output. ! 1388: \def\pdfurl#1{% ! 1389: \begingroup ! 1390: % it seems we really need yet another set of dummies; have not ! 1391: % tried to figure out what each command should do in the context ! 1392: % of @url. for now, just make @/ a no-op, that's the only one ! 1393: % people have actually reported a problem with. ! 1394: % ! 1395: \normalturnoffactive ! 1396: \def\@{@}% ! 1397: \let\/=\empty ! 1398: \makevalueexpandable ! 1399: % do we want to go so far as to use \indexnofonts instead of just ! 1400: % special-casing \var here? ! 1401: \def\var##1{##1}% ! 1402: % ! 1403: \leavevmode\setcolor{\urlcolor}% ! 1404: \startlink attr{/Border [0 0 0]}% ! 1405: user{/Subtype /Link /A << /S /URI /URI (#1) >>}% ! 1406: \endgroup} ! 1407: \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}} ! 1408: \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks} ! 1409: \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks} ! 1410: \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}} ! 1411: \def\maketoks{% ! 1412: \expandafter\poptoks\the\toksA|ENDTOKS|\relax ! 1413: \ifx\first0\adn0 ! 1414: \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3 ! 1415: \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6 ! 1416: \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 ! 1417: \else ! 1418: \ifnum0=\countA\else\makelink\fi ! 1419: \ifx\first.\let\next=\done\else ! 1420: \let\next=\maketoks ! 1421: \addtokens{\toksB}{\the\toksD} ! 1422: \ifx\first,\addtokens{\toksB}{\space}\fi ! 1423: \fi ! 1424: \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi ! 1425: \next} ! 1426: \def\makelink{\addtokens{\toksB}% ! 1427: {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} ! 1428: \def\pdflink#1{% ! 1429: \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}} ! 1430: \setcolor{\linkcolor}#1\endlink} ! 1431: \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} ! 1432: \else ! 1433: % non-pdf mode ! 1434: \let\pdfmkdest = \gobble ! 1435: \let\pdfurl = \gobble ! 1436: \let\endlink = \relax ! 1437: \let\setcolor = \gobble ! 1438: \let\pdfsetcolor = \gobble ! 1439: \let\pdfmakeoutlines = \relax ! 1440: \fi % \ifx\pdfoutput ! 1441: ! 1442: ! 1443: \message{fonts,} ! 1444: ! 1445: % Change the current font style to #1, remembering it in \curfontstyle. ! 1446: % For now, we do not accumulate font styles: @b{@i{foo}} prints foo in ! 1447: % italics, not bold italics. ! 1448: % ! 1449: \def\setfontstyle#1{% ! 1450: \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd. ! 1451: \csname ten#1\endcsname % change the current font ! 1452: } ! 1453: ! 1454: % Select #1 fonts with the current style. ! 1455: % ! 1456: \def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname} ! 1457: ! 1458: \def\rm{\fam=0 \setfontstyle{rm}} ! 1459: \def\it{\fam=\itfam \setfontstyle{it}} ! 1460: \def\sl{\fam=\slfam \setfontstyle{sl}} ! 1461: \def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf} ! 1462: \def\tt{\fam=\ttfam \setfontstyle{tt}} ! 1463: ! 1464: % Unfortunately, we have to override this for titles and the like, since ! 1465: % in those cases "rm" is bold. Sigh. ! 1466: \def\rmisbold{\rm\def\curfontstyle{bf}} ! 1467: ! 1468: % Texinfo sort of supports the sans serif font style, which plain TeX does not. ! 1469: % So we set up a \sf. ! 1470: \newfam\sffam ! 1471: \def\sf{\fam=\sffam \setfontstyle{sf}} ! 1472: \let\li = \sf % Sometimes we call it \li, not \sf. ! 1473: ! 1474: % We don't need math for this font style. ! 1475: \def\ttsl{\setfontstyle{ttsl}} ! 1476: ! 1477: ! 1478: % Set the baselineskip to #1, and the lineskip and strut size ! 1479: % correspondingly. There is no deep meaning behind these magic numbers ! 1480: % used as factors; they just match (closely enough) what Knuth defined. ! 1481: % ! 1482: \def\lineskipfactor{.08333} ! 1483: \def\strutheightpercent{.70833} ! 1484: \def\strutdepthpercent {.29167} ! 1485: % ! 1486: % can get a sort of poor man's double spacing by redefining this. ! 1487: \def\baselinefactor{1} ! 1488: % ! 1489: \newdimen\textleading ! 1490: \def\setleading#1{% ! 1491: \dimen0 = #1\relax ! 1492: \normalbaselineskip = \baselinefactor\dimen0 ! 1493: \normallineskip = \lineskipfactor\normalbaselineskip ! 1494: \normalbaselines ! 1495: \setbox\strutbox =\hbox{% ! 1496: \vrule width0pt height\strutheightpercent\baselineskip ! 1497: depth \strutdepthpercent \baselineskip ! 1498: }% ! 1499: } ! 1500: ! 1501: % PDF CMaps. See also LaTeX's t1.cmap. ! 1502: % ! 1503: % do nothing with this by default. ! 1504: \expandafter\let\csname cmapOT1\endcsname\gobble ! 1505: \expandafter\let\csname cmapOT1IT\endcsname\gobble ! 1506: \expandafter\let\csname cmapOT1TT\endcsname\gobble ! 1507: ! 1508: % if we are producing pdf, and we have \pdffontattr, then define cmaps. ! 1509: % (\pdffontattr was introduced many years ago, but people still run ! 1510: % older pdftex's; it's easy to conditionalize, so we do.) ! 1511: \ifpdf \ifx\pdffontattr\thisisundefined \else ! 1512: \begingroup ! 1513: \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. ! 1514: \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap ! 1515: %%DocumentNeededResources: ProcSet (CIDInit) ! 1516: %%IncludeResource: ProcSet (CIDInit) ! 1517: %%BeginResource: CMap (TeX-OT1-0) ! 1518: %%Title: (TeX-OT1-0 TeX OT1 0) ! 1519: %%Version: 1.000 ! 1520: %%EndComments ! 1521: /CIDInit /ProcSet findresource begin ! 1522: 12 dict begin ! 1523: begincmap ! 1524: /CIDSystemInfo ! 1525: << /Registry (TeX) ! 1526: /Ordering (OT1) ! 1527: /Supplement 0 ! 1528: >> def ! 1529: /CMapName /TeX-OT1-0 def ! 1530: /CMapType 2 def ! 1531: 1 begincodespacerange ! 1532: <00> <7F> ! 1533: endcodespacerange ! 1534: 8 beginbfrange ! 1535: <00> <01> <0393> ! 1536: <09> <0A> <03A8> ! 1537: <23> <26> <0023> ! 1538: <28> <3B> <0028> ! 1539: <3F> <5B> <003F> ! 1540: <5D> <5E> <005D> ! 1541: <61> <7A> <0061> ! 1542: <7B> <7C> <2013> ! 1543: endbfrange ! 1544: 40 beginbfchar ! 1545: <02> <0398> ! 1546: <03> <039B> ! 1547: <04> <039E> ! 1548: <05> <03A0> ! 1549: <06> <03A3> ! 1550: <07> <03D2> ! 1551: <08> <03A6> ! 1552: <0B> <00660066> ! 1553: <0C> <00660069> ! 1554: <0D> <0066006C> ! 1555: <0E> <006600660069> ! 1556: <0F> <00660066006C> ! 1557: <10> <0131> ! 1558: <11> <0237> ! 1559: <12> <0060> ! 1560: <13> <00B4> ! 1561: <14> <02C7> ! 1562: <15> <02D8> ! 1563: <16> <00AF> ! 1564: <17> <02DA> ! 1565: <18> <00B8> ! 1566: <19> <00DF> ! 1567: <1A> <00E6> ! 1568: <1B> <0153> ! 1569: <1C> <00F8> ! 1570: <1D> <00C6> ! 1571: <1E> <0152> ! 1572: <1F> <00D8> ! 1573: <21> <0021> ! 1574: <22> <201D> ! 1575: <27> <2019> ! 1576: <3C> <00A1> ! 1577: <3D> <003D> ! 1578: <3E> <00BF> ! 1579: <5C> <201C> ! 1580: <5F> <02D9> ! 1581: <60> <2018> ! 1582: <7D> <02DD> ! 1583: <7E> <007E> ! 1584: <7F> <00A8> ! 1585: endbfchar ! 1586: endcmap ! 1587: CMapName currentdict /CMap defineresource pop ! 1588: end ! 1589: end ! 1590: %%EndResource ! 1591: %%EOF ! 1592: }\endgroup ! 1593: \expandafter\edef\csname cmapOT1\endcsname#1{% ! 1594: \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% ! 1595: }% ! 1596: % ! 1597: % \cmapOT1IT ! 1598: \begingroup ! 1599: \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. ! 1600: \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap ! 1601: %%DocumentNeededResources: ProcSet (CIDInit) ! 1602: %%IncludeResource: ProcSet (CIDInit) ! 1603: %%BeginResource: CMap (TeX-OT1IT-0) ! 1604: %%Title: (TeX-OT1IT-0 TeX OT1IT 0) ! 1605: %%Version: 1.000 ! 1606: %%EndComments ! 1607: /CIDInit /ProcSet findresource begin ! 1608: 12 dict begin ! 1609: begincmap ! 1610: /CIDSystemInfo ! 1611: << /Registry (TeX) ! 1612: /Ordering (OT1IT) ! 1613: /Supplement 0 ! 1614: >> def ! 1615: /CMapName /TeX-OT1IT-0 def ! 1616: /CMapType 2 def ! 1617: 1 begincodespacerange ! 1618: <00> <7F> ! 1619: endcodespacerange ! 1620: 8 beginbfrange ! 1621: <00> <01> <0393> ! 1622: <09> <0A> <03A8> ! 1623: <25> <26> <0025> ! 1624: <28> <3B> <0028> ! 1625: <3F> <5B> <003F> ! 1626: <5D> <5E> <005D> ! 1627: <61> <7A> <0061> ! 1628: <7B> <7C> <2013> ! 1629: endbfrange ! 1630: 42 beginbfchar ! 1631: <02> <0398> ! 1632: <03> <039B> ! 1633: <04> <039E> ! 1634: <05> <03A0> ! 1635: <06> <03A3> ! 1636: <07> <03D2> ! 1637: <08> <03A6> ! 1638: <0B> <00660066> ! 1639: <0C> <00660069> ! 1640: <0D> <0066006C> ! 1641: <0E> <006600660069> ! 1642: <0F> <00660066006C> ! 1643: <10> <0131> ! 1644: <11> <0237> ! 1645: <12> <0060> ! 1646: <13> <00B4> ! 1647: <14> <02C7> ! 1648: <15> <02D8> ! 1649: <16> <00AF> ! 1650: <17> <02DA> ! 1651: <18> <00B8> ! 1652: <19> <00DF> ! 1653: <1A> <00E6> ! 1654: <1B> <0153> ! 1655: <1C> <00F8> ! 1656: <1D> <00C6> ! 1657: <1E> <0152> ! 1658: <1F> <00D8> ! 1659: <21> <0021> ! 1660: <22> <201D> ! 1661: <23> <0023> ! 1662: <24> <00A3> ! 1663: <27> <2019> ! 1664: <3C> <00A1> ! 1665: <3D> <003D> ! 1666: <3E> <00BF> ! 1667: <5C> <201C> ! 1668: <5F> <02D9> ! 1669: <60> <2018> ! 1670: <7D> <02DD> ! 1671: <7E> <007E> ! 1672: <7F> <00A8> ! 1673: endbfchar ! 1674: endcmap ! 1675: CMapName currentdict /CMap defineresource pop ! 1676: end ! 1677: end ! 1678: %%EndResource ! 1679: %%EOF ! 1680: }\endgroup ! 1681: \expandafter\edef\csname cmapOT1IT\endcsname#1{% ! 1682: \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% ! 1683: }% ! 1684: % ! 1685: % \cmapOT1TT ! 1686: \begingroup ! 1687: \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. ! 1688: \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap ! 1689: %%DocumentNeededResources: ProcSet (CIDInit) ! 1690: %%IncludeResource: ProcSet (CIDInit) ! 1691: %%BeginResource: CMap (TeX-OT1TT-0) ! 1692: %%Title: (TeX-OT1TT-0 TeX OT1TT 0) ! 1693: %%Version: 1.000 ! 1694: %%EndComments ! 1695: /CIDInit /ProcSet findresource begin ! 1696: 12 dict begin ! 1697: begincmap ! 1698: /CIDSystemInfo ! 1699: << /Registry (TeX) ! 1700: /Ordering (OT1TT) ! 1701: /Supplement 0 ! 1702: >> def ! 1703: /CMapName /TeX-OT1TT-0 def ! 1704: /CMapType 2 def ! 1705: 1 begincodespacerange ! 1706: <00> <7F> ! 1707: endcodespacerange ! 1708: 5 beginbfrange ! 1709: <00> <01> <0393> ! 1710: <09> <0A> <03A8> ! 1711: <21> <26> <0021> ! 1712: <28> <5F> <0028> ! 1713: <61> <7E> <0061> ! 1714: endbfrange ! 1715: 32 beginbfchar ! 1716: <02> <0398> ! 1717: <03> <039B> ! 1718: <04> <039E> ! 1719: <05> <03A0> ! 1720: <06> <03A3> ! 1721: <07> <03D2> ! 1722: <08> <03A6> ! 1723: <0B> <2191> ! 1724: <0C> <2193> ! 1725: <0D> <0027> ! 1726: <0E> <00A1> ! 1727: <0F> <00BF> ! 1728: <10> <0131> ! 1729: <11> <0237> ! 1730: <12> <0060> ! 1731: <13> <00B4> ! 1732: <14> <02C7> ! 1733: <15> <02D8> ! 1734: <16> <00AF> ! 1735: <17> <02DA> ! 1736: <18> <00B8> ! 1737: <19> <00DF> ! 1738: <1A> <00E6> ! 1739: <1B> <0153> ! 1740: <1C> <00F8> ! 1741: <1D> <00C6> ! 1742: <1E> <0152> ! 1743: <1F> <00D8> ! 1744: <20> <2423> ! 1745: <27> <2019> ! 1746: <60> <2018> ! 1747: <7F> <00A8> ! 1748: endbfchar ! 1749: endcmap ! 1750: CMapName currentdict /CMap defineresource pop ! 1751: end ! 1752: end ! 1753: %%EndResource ! 1754: %%EOF ! 1755: }\endgroup ! 1756: \expandafter\edef\csname cmapOT1TT\endcsname#1{% ! 1757: \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% ! 1758: }% ! 1759: \fi\fi ! 1760: ! 1761: ! 1762: % Set the font macro #1 to the font named \fontprefix#2. ! 1763: % #3 is the font's design size, #4 is a scale factor, #5 is the CMap ! 1764: % encoding (only OT1, OT1IT and OT1TT are allowed, or empty to omit). ! 1765: % Example: ! 1766: % #1 = \textrm ! 1767: % #2 = \rmshape ! 1768: % #3 = 10 ! 1769: % #4 = \mainmagstep ! 1770: % #5 = OT1 ! 1771: % ! 1772: \def\setfont#1#2#3#4#5{% ! 1773: \font#1=\fontprefix#2#3 scaled #4 ! 1774: \csname cmap#5\endcsname#1% ! 1775: } ! 1776: % This is what gets called when #5 of \setfont is empty. ! 1777: \let\cmap\gobble ! 1778: % ! 1779: % (end of cmaps) ! 1780: ! 1781: % Use cm as the default font prefix. ! 1782: % To specify the font prefix, you must define \fontprefix ! 1783: % before you read in texinfo.tex. ! 1784: \ifx\fontprefix\thisisundefined ! 1785: \def\fontprefix{cm} ! 1786: \fi ! 1787: % Support font families that don't use the same naming scheme as CM. ! 1788: \def\rmshape{r} ! 1789: \def\rmbshape{bx} % where the normal face is bold ! 1790: \def\bfshape{b} ! 1791: \def\bxshape{bx} ! 1792: \def\ttshape{tt} ! 1793: \def\ttbshape{tt} ! 1794: \def\ttslshape{sltt} ! 1795: \def\itshape{ti} ! 1796: \def\itbshape{bxti} ! 1797: \def\slshape{sl} ! 1798: \def\slbshape{bxsl} ! 1799: \def\sfshape{ss} ! 1800: \def\sfbshape{ss} ! 1801: \def\scshape{csc} ! 1802: \def\scbshape{csc} ! 1803: ! 1804: % Definitions for a main text size of 11pt. (The default in Texinfo.) ! 1805: % ! 1806: \def\definetextfontsizexi{% ! 1807: % Text fonts (11.2pt, magstep1). ! 1808: \def\textnominalsize{11pt} ! 1809: \edef\mainmagstep{\magstephalf} ! 1810: \setfont\textrm\rmshape{10}{\mainmagstep}{OT1} ! 1811: \setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} ! 1812: \setfont\textbf\bfshape{10}{\mainmagstep}{OT1} ! 1813: \setfont\textit\itshape{10}{\mainmagstep}{OT1IT} ! 1814: \setfont\textsl\slshape{10}{\mainmagstep}{OT1} ! 1815: \setfont\textsf\sfshape{10}{\mainmagstep}{OT1} ! 1816: \setfont\textsc\scshape{10}{\mainmagstep}{OT1} ! 1817: \setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} ! 1818: \font\texti=cmmi10 scaled \mainmagstep ! 1819: \font\textsy=cmsy10 scaled \mainmagstep ! 1820: \def\textecsize{1095} ! 1821: ! 1822: % A few fonts for @defun names and args. ! 1823: \setfont\defbf\bfshape{10}{\magstep1}{OT1} ! 1824: \setfont\deftt\ttshape{10}{\magstep1}{OT1TT} ! 1825: \setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT} ! 1826: \def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} ! 1827: ! 1828: % Fonts for indices, footnotes, small examples (9pt). ! 1829: \def\smallnominalsize{9pt} ! 1830: \setfont\smallrm\rmshape{9}{1000}{OT1} ! 1831: \setfont\smalltt\ttshape{9}{1000}{OT1TT} ! 1832: \setfont\smallbf\bfshape{10}{900}{OT1} ! 1833: \setfont\smallit\itshape{9}{1000}{OT1IT} ! 1834: \setfont\smallsl\slshape{9}{1000}{OT1} ! 1835: \setfont\smallsf\sfshape{9}{1000}{OT1} ! 1836: \setfont\smallsc\scshape{10}{900}{OT1} ! 1837: \setfont\smallttsl\ttslshape{10}{900}{OT1TT} ! 1838: \font\smalli=cmmi9 ! 1839: \font\smallsy=cmsy9 ! 1840: \def\smallecsize{0900} ! 1841: ! 1842: % Fonts for small examples (8pt). ! 1843: \def\smallernominalsize{8pt} ! 1844: \setfont\smallerrm\rmshape{8}{1000}{OT1} ! 1845: \setfont\smallertt\ttshape{8}{1000}{OT1TT} ! 1846: \setfont\smallerbf\bfshape{10}{800}{OT1} ! 1847: \setfont\smallerit\itshape{8}{1000}{OT1IT} ! 1848: \setfont\smallersl\slshape{8}{1000}{OT1} ! 1849: \setfont\smallersf\sfshape{8}{1000}{OT1} ! 1850: \setfont\smallersc\scshape{10}{800}{OT1} ! 1851: \setfont\smallerttsl\ttslshape{10}{800}{OT1TT} ! 1852: \font\smalleri=cmmi8 ! 1853: \font\smallersy=cmsy8 ! 1854: \def\smallerecsize{0800} ! 1855: ! 1856: % Fonts for title page (20.4pt): ! 1857: \def\titlenominalsize{20pt} ! 1858: \setfont\titlerm\rmbshape{12}{\magstep3}{OT1} ! 1859: \setfont\titleit\itbshape{10}{\magstep4}{OT1IT} ! 1860: \setfont\titlesl\slbshape{10}{\magstep4}{OT1} ! 1861: \setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} ! 1862: \setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} ! 1863: \setfont\titlesf\sfbshape{17}{\magstep1}{OT1} ! 1864: \let\titlebf=\titlerm ! 1865: \setfont\titlesc\scbshape{10}{\magstep4}{OT1} ! 1866: \font\titlei=cmmi12 scaled \magstep3 ! 1867: \font\titlesy=cmsy10 scaled \magstep4 ! 1868: \def\titleecsize{2074} ! 1869: ! 1870: % Chapter (and unnumbered) fonts (17.28pt). ! 1871: \def\chapnominalsize{17pt} ! 1872: \setfont\chaprm\rmbshape{12}{\magstep2}{OT1} ! 1873: \setfont\chapit\itbshape{10}{\magstep3}{OT1IT} ! 1874: \setfont\chapsl\slbshape{10}{\magstep3}{OT1} ! 1875: \setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT} ! 1876: \setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT} ! 1877: \setfont\chapsf\sfbshape{17}{1000}{OT1} ! 1878: \let\chapbf=\chaprm ! 1879: \setfont\chapsc\scbshape{10}{\magstep3}{OT1} ! 1880: \font\chapi=cmmi12 scaled \magstep2 ! 1881: \font\chapsy=cmsy10 scaled \magstep3 ! 1882: \def\chapecsize{1728} ! 1883: ! 1884: % Section fonts (14.4pt). ! 1885: \def\secnominalsize{14pt} ! 1886: \setfont\secrm\rmbshape{12}{\magstep1}{OT1} ! 1887: \setfont\secit\itbshape{10}{\magstep2}{OT1IT} ! 1888: \setfont\secsl\slbshape{10}{\magstep2}{OT1} ! 1889: \setfont\sectt\ttbshape{12}{\magstep1}{OT1TT} ! 1890: \setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT} ! 1891: \setfont\secsf\sfbshape{12}{\magstep1}{OT1} ! 1892: \let\secbf\secrm ! 1893: \setfont\secsc\scbshape{10}{\magstep2}{OT1} ! 1894: \font\seci=cmmi12 scaled \magstep1 ! 1895: \font\secsy=cmsy10 scaled \magstep2 ! 1896: \def\sececsize{1440} ! 1897: ! 1898: % Subsection fonts (13.15pt). ! 1899: \def\ssecnominalsize{13pt} ! 1900: \setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1} ! 1901: \setfont\ssecit\itbshape{10}{1315}{OT1IT} ! 1902: \setfont\ssecsl\slbshape{10}{1315}{OT1} ! 1903: \setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT} ! 1904: \setfont\ssecttsl\ttslshape{10}{1315}{OT1TT} ! 1905: \setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1} ! 1906: \let\ssecbf\ssecrm ! 1907: \setfont\ssecsc\scbshape{10}{1315}{OT1} ! 1908: \font\sseci=cmmi12 scaled \magstephalf ! 1909: \font\ssecsy=cmsy10 scaled 1315 ! 1910: \def\ssececsize{1200} ! 1911: ! 1912: % Reduced fonts for @acro in text (10pt). ! 1913: \def\reducednominalsize{10pt} ! 1914: \setfont\reducedrm\rmshape{10}{1000}{OT1} ! 1915: \setfont\reducedtt\ttshape{10}{1000}{OT1TT} ! 1916: \setfont\reducedbf\bfshape{10}{1000}{OT1} ! 1917: \setfont\reducedit\itshape{10}{1000}{OT1IT} ! 1918: \setfont\reducedsl\slshape{10}{1000}{OT1} ! 1919: \setfont\reducedsf\sfshape{10}{1000}{OT1} ! 1920: \setfont\reducedsc\scshape{10}{1000}{OT1} ! 1921: \setfont\reducedttsl\ttslshape{10}{1000}{OT1TT} ! 1922: \font\reducedi=cmmi10 ! 1923: \font\reducedsy=cmsy10 ! 1924: \def\reducedecsize{1000} ! 1925: ! 1926: \textleading = 13.2pt % line spacing for 11pt CM ! 1927: \textfonts % reset the current fonts ! 1928: \rm ! 1929: } % end of 11pt text font size definitions, \definetextfontsizexi ! 1930: ! 1931: ! 1932: % Definitions to make the main text be 10pt Computer Modern, with ! 1933: % section, chapter, etc., sizes following suit. This is for the GNU ! 1934: % Press printing of the Emacs 22 manual. Maybe other manuals in the ! 1935: % future. Used with @smallbook, which sets the leading to 12pt. ! 1936: % ! 1937: \def\definetextfontsizex{% ! 1938: % Text fonts (10pt). ! 1939: \def\textnominalsize{10pt} ! 1940: \edef\mainmagstep{1000} ! 1941: \setfont\textrm\rmshape{10}{\mainmagstep}{OT1} ! 1942: \setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} ! 1943: \setfont\textbf\bfshape{10}{\mainmagstep}{OT1} ! 1944: \setfont\textit\itshape{10}{\mainmagstep}{OT1IT} ! 1945: \setfont\textsl\slshape{10}{\mainmagstep}{OT1} ! 1946: \setfont\textsf\sfshape{10}{\mainmagstep}{OT1} ! 1947: \setfont\textsc\scshape{10}{\mainmagstep}{OT1} ! 1948: \setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} ! 1949: \font\texti=cmmi10 scaled \mainmagstep ! 1950: \font\textsy=cmsy10 scaled \mainmagstep ! 1951: \def\textecsize{1000} ! 1952: ! 1953: % A few fonts for @defun names and args. ! 1954: \setfont\defbf\bfshape{10}{\magstephalf}{OT1} ! 1955: \setfont\deftt\ttshape{10}{\magstephalf}{OT1TT} ! 1956: \setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT} ! 1957: \def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} ! 1958: ! 1959: % Fonts for indices, footnotes, small examples (9pt). ! 1960: \def\smallnominalsize{9pt} ! 1961: \setfont\smallrm\rmshape{9}{1000}{OT1} ! 1962: \setfont\smalltt\ttshape{9}{1000}{OT1TT} ! 1963: \setfont\smallbf\bfshape{10}{900}{OT1} ! 1964: \setfont\smallit\itshape{9}{1000}{OT1IT} ! 1965: \setfont\smallsl\slshape{9}{1000}{OT1} ! 1966: \setfont\smallsf\sfshape{9}{1000}{OT1} ! 1967: \setfont\smallsc\scshape{10}{900}{OT1} ! 1968: \setfont\smallttsl\ttslshape{10}{900}{OT1TT} ! 1969: \font\smalli=cmmi9 ! 1970: \font\smallsy=cmsy9 ! 1971: \def\smallecsize{0900} ! 1972: ! 1973: % Fonts for small examples (8pt). ! 1974: \def\smallernominalsize{8pt} ! 1975: \setfont\smallerrm\rmshape{8}{1000}{OT1} ! 1976: \setfont\smallertt\ttshape{8}{1000}{OT1TT} ! 1977: \setfont\smallerbf\bfshape{10}{800}{OT1} ! 1978: \setfont\smallerit\itshape{8}{1000}{OT1IT} ! 1979: \setfont\smallersl\slshape{8}{1000}{OT1} ! 1980: \setfont\smallersf\sfshape{8}{1000}{OT1} ! 1981: \setfont\smallersc\scshape{10}{800}{OT1} ! 1982: \setfont\smallerttsl\ttslshape{10}{800}{OT1TT} ! 1983: \font\smalleri=cmmi8 ! 1984: \font\smallersy=cmsy8 ! 1985: \def\smallerecsize{0800} ! 1986: ! 1987: % Fonts for title page (20.4pt): ! 1988: \def\titlenominalsize{20pt} ! 1989: \setfont\titlerm\rmbshape{12}{\magstep3}{OT1} ! 1990: \setfont\titleit\itbshape{10}{\magstep4}{OT1IT} ! 1991: \setfont\titlesl\slbshape{10}{\magstep4}{OT1} ! 1992: \setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} ! 1993: \setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} ! 1994: \setfont\titlesf\sfbshape{17}{\magstep1}{OT1} ! 1995: \let\titlebf=\titlerm ! 1996: \setfont\titlesc\scbshape{10}{\magstep4}{OT1} ! 1997: \font\titlei=cmmi12 scaled \magstep3 ! 1998: \font\titlesy=cmsy10 scaled \magstep4 ! 1999: \def\titleecsize{2074} ! 2000: ! 2001: % Chapter fonts (14.4pt). ! 2002: \def\chapnominalsize{14pt} ! 2003: \setfont\chaprm\rmbshape{12}{\magstep1}{OT1} ! 2004: \setfont\chapit\itbshape{10}{\magstep2}{OT1IT} ! 2005: \setfont\chapsl\slbshape{10}{\magstep2}{OT1} ! 2006: \setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT} ! 2007: \setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT} ! 2008: \setfont\chapsf\sfbshape{12}{\magstep1}{OT1} ! 2009: \let\chapbf\chaprm ! 2010: \setfont\chapsc\scbshape{10}{\magstep2}{OT1} ! 2011: \font\chapi=cmmi12 scaled \magstep1 ! 2012: \font\chapsy=cmsy10 scaled \magstep2 ! 2013: \def\chapecsize{1440} ! 2014: ! 2015: % Section fonts (12pt). ! 2016: \def\secnominalsize{12pt} ! 2017: \setfont\secrm\rmbshape{12}{1000}{OT1} ! 2018: \setfont\secit\itbshape{10}{\magstep1}{OT1IT} ! 2019: \setfont\secsl\slbshape{10}{\magstep1}{OT1} ! 2020: \setfont\sectt\ttbshape{12}{1000}{OT1TT} ! 2021: \setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT} ! 2022: \setfont\secsf\sfbshape{12}{1000}{OT1} ! 2023: \let\secbf\secrm ! 2024: \setfont\secsc\scbshape{10}{\magstep1}{OT1} ! 2025: \font\seci=cmmi12 ! 2026: \font\secsy=cmsy10 scaled \magstep1 ! 2027: \def\sececsize{1200} ! 2028: ! 2029: % Subsection fonts (10pt). ! 2030: \def\ssecnominalsize{10pt} ! 2031: \setfont\ssecrm\rmbshape{10}{1000}{OT1} ! 2032: \setfont\ssecit\itbshape{10}{1000}{OT1IT} ! 2033: \setfont\ssecsl\slbshape{10}{1000}{OT1} ! 2034: \setfont\ssectt\ttbshape{10}{1000}{OT1TT} ! 2035: \setfont\ssecttsl\ttslshape{10}{1000}{OT1TT} ! 2036: \setfont\ssecsf\sfbshape{10}{1000}{OT1} ! 2037: \let\ssecbf\ssecrm ! 2038: \setfont\ssecsc\scbshape{10}{1000}{OT1} ! 2039: \font\sseci=cmmi10 ! 2040: \font\ssecsy=cmsy10 ! 2041: \def\ssececsize{1000} ! 2042: ! 2043: % Reduced fonts for @acro in text (9pt). ! 2044: \def\reducednominalsize{9pt} ! 2045: \setfont\reducedrm\rmshape{9}{1000}{OT1} ! 2046: \setfont\reducedtt\ttshape{9}{1000}{OT1TT} ! 2047: \setfont\reducedbf\bfshape{10}{900}{OT1} ! 2048: \setfont\reducedit\itshape{9}{1000}{OT1IT} ! 2049: \setfont\reducedsl\slshape{9}{1000}{OT1} ! 2050: \setfont\reducedsf\sfshape{9}{1000}{OT1} ! 2051: \setfont\reducedsc\scshape{10}{900}{OT1} ! 2052: \setfont\reducedttsl\ttslshape{10}{900}{OT1TT} ! 2053: \font\reducedi=cmmi9 ! 2054: \font\reducedsy=cmsy9 ! 2055: \def\reducedecsize{0900} ! 2056: ! 2057: \divide\parskip by 2 % reduce space between paragraphs ! 2058: \textleading = 12pt % line spacing for 10pt CM ! 2059: \textfonts % reset the current fonts ! 2060: \rm ! 2061: } % end of 10pt text font size definitions, \definetextfontsizex ! 2062: ! 2063: ! 2064: % We provide the user-level command ! 2065: % @fonttextsize 10 ! 2066: % (or 11) to redefine the text font size. pt is assumed. ! 2067: % ! 2068: \def\xiword{11} ! 2069: \def\xword{10} ! 2070: \def\xwordpt{10pt} ! 2071: % ! 2072: \parseargdef\fonttextsize{% ! 2073: \def\textsizearg{#1}% ! 2074: %\wlog{doing @fonttextsize \textsizearg}% ! 2075: % ! 2076: % Set \globaldefs so that documents can use this inside @tex, since ! 2077: % makeinfo 4.8 does not support it, but we need it nonetheless. ! 2078: % ! 2079: \begingroup \globaldefs=1 ! 2080: \ifx\textsizearg\xword \definetextfontsizex ! 2081: \else \ifx\textsizearg\xiword \definetextfontsizexi ! 2082: \else ! 2083: \errhelp=\EMsimple ! 2084: \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'} ! 2085: \fi\fi ! 2086: \endgroup ! 2087: } ! 2088: ! 2089: ! 2090: % In order for the font changes to affect most math symbols and letters, ! 2091: % we have to define the \textfont of the standard families. Since ! 2092: % texinfo doesn't allow for producing subscripts and superscripts except ! 2093: % in the main text, we don't bother to reset \scriptfont and ! 2094: % \scriptscriptfont (which would also require loading a lot more fonts). ! 2095: % ! 2096: \def\resetmathfonts{% ! 2097: \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy ! 2098: \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf ! 2099: \textfont\ttfam=\tentt \textfont\sffam=\tensf ! 2100: } ! 2101: ! 2102: % The font-changing commands redefine the meanings of \tenSTYLE, instead ! 2103: % of just \STYLE. We do this because \STYLE needs to also set the ! 2104: % current \fam for math mode. Our \STYLE (e.g., \rm) commands hardwire ! 2105: % \tenSTYLE to set the current font. ! 2106: % ! 2107: % Each font-changing command also sets the names \lsize (one size lower) ! 2108: % and \lllsize (three sizes lower). These relative commands are used in ! 2109: % the LaTeX logo and acronyms. ! 2110: % ! 2111: % This all needs generalizing, badly. ! 2112: % ! 2113: \def\textfonts{% ! 2114: \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl ! 2115: \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc ! 2116: \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy ! 2117: \let\tenttsl=\textttsl ! 2118: \def\curfontsize{text}% ! 2119: \def\lsize{reduced}\def\lllsize{smaller}% ! 2120: \resetmathfonts \setleading{\textleading}} ! 2121: \def\titlefonts{% ! 2122: \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl ! 2123: \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc ! 2124: \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy ! 2125: \let\tenttsl=\titlettsl ! 2126: \def\curfontsize{title}% ! 2127: \def\lsize{chap}\def\lllsize{subsec}% ! 2128: \resetmathfonts \setleading{27pt}} ! 2129: \def\titlefont#1{{\titlefonts\rmisbold #1}} ! 2130: \def\chapfonts{% ! 2131: \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl ! 2132: \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc ! 2133: \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy ! 2134: \let\tenttsl=\chapttsl ! 2135: \def\curfontsize{chap}% ! 2136: \def\lsize{sec}\def\lllsize{text}% ! 2137: \resetmathfonts \setleading{19pt}} ! 2138: \def\secfonts{% ! 2139: \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl ! 2140: \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc ! 2141: \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy ! 2142: \let\tenttsl=\secttsl ! 2143: \def\curfontsize{sec}% ! 2144: \def\lsize{subsec}\def\lllsize{reduced}% ! 2145: \resetmathfonts \setleading{16pt}} ! 2146: \def\subsecfonts{% ! 2147: \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl ! 2148: \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc ! 2149: \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy ! 2150: \let\tenttsl=\ssecttsl ! 2151: \def\curfontsize{ssec}% ! 2152: \def\lsize{text}\def\lllsize{small}% ! 2153: \resetmathfonts \setleading{15pt}} ! 2154: \let\subsubsecfonts = \subsecfonts ! 2155: \def\reducedfonts{% ! 2156: \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl ! 2157: \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc ! 2158: \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy ! 2159: \let\tenttsl=\reducedttsl ! 2160: \def\curfontsize{reduced}% ! 2161: \def\lsize{small}\def\lllsize{smaller}% ! 2162: \resetmathfonts \setleading{10.5pt}} ! 2163: \def\smallfonts{% ! 2164: \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl ! 2165: \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc ! 2166: \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy ! 2167: \let\tenttsl=\smallttsl ! 2168: \def\curfontsize{small}% ! 2169: \def\lsize{smaller}\def\lllsize{smaller}% ! 2170: \resetmathfonts \setleading{10.5pt}} ! 2171: \def\smallerfonts{% ! 2172: \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl ! 2173: \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc ! 2174: \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy ! 2175: \let\tenttsl=\smallerttsl ! 2176: \def\curfontsize{smaller}% ! 2177: \def\lsize{smaller}\def\lllsize{smaller}% ! 2178: \resetmathfonts \setleading{9.5pt}} ! 2179: ! 2180: % Fonts for short table of contents. ! 2181: \setfont\shortcontrm\rmshape{12}{1000}{OT1} ! 2182: \setfont\shortcontbf\bfshape{10}{\magstep1}{OT1} % no cmb12 ! 2183: \setfont\shortcontsl\slshape{12}{1000}{OT1} ! 2184: \setfont\shortconttt\ttshape{12}{1000}{OT1TT} ! 2185: ! 2186: % Define these just so they can be easily changed for other fonts. ! 2187: \def\angleleft{$\langle$} ! 2188: \def\angleright{$\rangle$} ! 2189: ! 2190: % Set the fonts to use with the @small... environments. ! 2191: \let\smallexamplefonts = \smallfonts ! 2192: ! 2193: % About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample ! 2194: % can fit this many characters: ! 2195: % 8.5x11=86 smallbook=72 a4=90 a5=69 ! 2196: % If we use \scriptfonts (8pt), then we can fit this many characters: ! 2197: % 8.5x11=90+ smallbook=80 a4=90+ a5=77 ! 2198: % For me, subjectively, the few extra characters that fit aren't worth ! 2199: % the additional smallness of 8pt. So I'm making the default 9pt. ! 2200: % ! 2201: % By the way, for comparison, here's what fits with @example (10pt): ! 2202: % 8.5x11=71 smallbook=60 a4=75 a5=58 ! 2203: % --karl, 24jan03. ! 2204: ! 2205: % Set up the default fonts, so we can use them for creating boxes. ! 2206: % ! 2207: \definetextfontsizexi ! 2208: ! 2209: ! 2210: \message{markup,} ! 2211: ! 2212: % Check if we are currently using a typewriter font. Since all the ! 2213: % Computer Modern typewriter fonts have zero interword stretch (and ! 2214: % shrink), and it is reasonable to expect all typewriter fonts to have ! 2215: % this property, we can check that font parameter. ! 2216: % ! 2217: \def\ifmonospace{\ifdim\fontdimen3\font=0pt } ! 2218: ! 2219: % Markup style infrastructure. \defmarkupstylesetup\INITMACRO will ! 2220: % define and register \INITMACRO to be called on markup style changes. ! 2221: % \INITMACRO can check \currentmarkupstyle for the innermost ! 2222: % style and the set of \ifmarkupSTYLE switches for all styles ! 2223: % currently in effect. ! 2224: \newif\ifmarkupvar ! 2225: \newif\ifmarkupsamp ! 2226: \newif\ifmarkupkey ! 2227: %\newif\ifmarkupfile % @file == @samp. ! 2228: %\newif\ifmarkupoption % @option == @samp. ! 2229: \newif\ifmarkupcode ! 2230: \newif\ifmarkupkbd ! 2231: %\newif\ifmarkupenv % @env == @code. ! 2232: %\newif\ifmarkupcommand % @command == @code. ! 2233: \newif\ifmarkuptex % @tex (and part of @math, for now). ! 2234: \newif\ifmarkupexample ! 2235: \newif\ifmarkupverb ! 2236: \newif\ifmarkupverbatim ! 2237: ! 2238: \let\currentmarkupstyle\empty ! 2239: ! 2240: \def\setupmarkupstyle#1{% ! 2241: \csname markup#1true\endcsname ! 2242: \def\currentmarkupstyle{#1}% ! 2243: \markupstylesetup ! 2244: } ! 2245: ! 2246: \let\markupstylesetup\empty ! 2247: ! 2248: \def\defmarkupstylesetup#1{% ! 2249: \expandafter\def\expandafter\markupstylesetup ! 2250: \expandafter{\markupstylesetup #1}% ! 2251: \def#1% ! 2252: } ! 2253: ! 2254: % Markup style setup for left and right quotes. ! 2255: \defmarkupstylesetup\markupsetuplq{% ! 2256: \expandafter\let\expandafter \temp ! 2257: \csname markupsetuplq\currentmarkupstyle\endcsname ! 2258: \ifx\temp\relax \markupsetuplqdefault \else \temp \fi ! 2259: } ! 2260: ! 2261: \defmarkupstylesetup\markupsetuprq{% ! 2262: \expandafter\let\expandafter \temp ! 2263: \csname markupsetuprq\currentmarkupstyle\endcsname ! 2264: \ifx\temp\relax \markupsetuprqdefault \else \temp \fi ! 2265: } ! 2266: ! 2267: { ! 2268: \catcode`\'=\active ! 2269: \catcode`\`=\active ! 2270: ! 2271: \gdef\markupsetuplqdefault{\let`\lq} ! 2272: \gdef\markupsetuprqdefault{\let'\rq} ! 2273: ! 2274: \gdef\markupsetcodequoteleft{\let`\codequoteleft} ! 2275: \gdef\markupsetcodequoteright{\let'\codequoteright} ! 2276: } ! 2277: ! 2278: \let\markupsetuplqcode \markupsetcodequoteleft ! 2279: \let\markupsetuprqcode \markupsetcodequoteright ! 2280: % ! 2281: \let\markupsetuplqexample \markupsetcodequoteleft ! 2282: \let\markupsetuprqexample \markupsetcodequoteright ! 2283: % ! 2284: \let\markupsetuplqkbd \markupsetcodequoteleft ! 2285: \let\markupsetuprqkbd \markupsetcodequoteright ! 2286: % ! 2287: \let\markupsetuplqsamp \markupsetcodequoteleft ! 2288: \let\markupsetuprqsamp \markupsetcodequoteright ! 2289: % ! 2290: \let\markupsetuplqverb \markupsetcodequoteleft ! 2291: \let\markupsetuprqverb \markupsetcodequoteright ! 2292: % ! 2293: \let\markupsetuplqverbatim \markupsetcodequoteleft ! 2294: \let\markupsetuprqverbatim \markupsetcodequoteright ! 2295: ! 2296: % Allow an option to not use regular directed right quote/apostrophe ! 2297: % (char 0x27), but instead the undirected quote from cmtt (char 0x0d). ! 2298: % The undirected quote is ugly, so don't make it the default, but it ! 2299: % works for pasting with more pdf viewers (at least evince), the ! 2300: % lilypond developers report. xpdf does work with the regular 0x27. ! 2301: % ! 2302: \def\codequoteright{% ! 2303: \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax ! 2304: \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax ! 2305: '% ! 2306: \else \char'15 \fi ! 2307: \else \char'15 \fi ! 2308: } ! 2309: % ! 2310: % and a similar option for the left quote char vs. a grave accent. ! 2311: % Modern fonts display ASCII 0x60 as a grave accent, so some people like ! 2312: % the code environments to do likewise. ! 2313: % ! 2314: \def\codequoteleft{% ! 2315: \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax ! 2316: \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax ! 2317: % [Knuth] pp. 380,381,391 ! 2318: % \relax disables Spanish ligatures ?` and !` of \tt font. ! 2319: \relax`% ! 2320: \else \char'22 \fi ! 2321: \else \char'22 \fi ! 2322: } ! 2323: ! 2324: % Commands to set the quote options. ! 2325: % ! 2326: \parseargdef\codequoteundirected{% ! 2327: \def\temp{#1}% ! 2328: \ifx\temp\onword ! 2329: \expandafter\let\csname SETtxicodequoteundirected\endcsname ! 2330: = t% ! 2331: \else\ifx\temp\offword ! 2332: \expandafter\let\csname SETtxicodequoteundirected\endcsname ! 2333: = \relax ! 2334: \else ! 2335: \errhelp = \EMsimple ! 2336: \errmessage{Unknown @codequoteundirected value `\temp', must be on|off}% ! 2337: \fi\fi ! 2338: } ! 2339: % ! 2340: \parseargdef\codequotebacktick{% ! 2341: \def\temp{#1}% ! 2342: \ifx\temp\onword ! 2343: \expandafter\let\csname SETtxicodequotebacktick\endcsname ! 2344: = t% ! 2345: \else\ifx\temp\offword ! 2346: \expandafter\let\csname SETtxicodequotebacktick\endcsname ! 2347: = \relax ! 2348: \else ! 2349: \errhelp = \EMsimple ! 2350: \errmessage{Unknown @codequotebacktick value `\temp', must be on|off}% ! 2351: \fi\fi ! 2352: } ! 2353: ! 2354: % [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font. ! 2355: \def\noligaturesquoteleft{\relax\lq} ! 2356: ! 2357: % Count depth in font-changes, for error checks ! 2358: \newcount\fontdepth \fontdepth=0 ! 2359: ! 2360: % Font commands. ! 2361: ! 2362: % #1 is the font command (\sl or \it), #2 is the text to slant. ! 2363: % If we are in a monospaced environment, however, 1) always use \ttsl, ! 2364: % and 2) do not add an italic correction. ! 2365: \def\dosmartslant#1#2{% ! 2366: \ifusingtt ! 2367: {{\ttsl #2}\let\next=\relax}% ! 2368: {\def\next{{#1#2}\futurelet\next\smartitaliccorrection}}% ! 2369: \next ! 2370: } ! 2371: \def\smartslanted{\dosmartslant\sl} ! 2372: \def\smartitalic{\dosmartslant\it} ! 2373: ! 2374: % Output an italic correction unless \next (presumed to be the following ! 2375: % character) is such as not to need one. ! 2376: \def\smartitaliccorrection{% ! 2377: \ifx\next,% ! 2378: \else\ifx\next-% ! 2379: \else\ifx\next.% ! 2380: \else\ptexslash ! 2381: \fi\fi\fi ! 2382: \aftersmartic ! 2383: } ! 2384: ! 2385: % Unconditional use \ttsl, and no ic. @var is set to this for defuns. ! 2386: \def\ttslanted#1{{\ttsl #1}} ! 2387: ! 2388: % @cite is like \smartslanted except unconditionally use \sl. We never want ! 2389: % ttsl for book titles, do we? ! 2390: \def\cite#1{{\sl #1}\futurelet\next\smartitaliccorrection} ! 2391: ! 2392: \def\aftersmartic{} ! 2393: \def\var#1{% ! 2394: \let\saveaftersmartic = \aftersmartic ! 2395: \def\aftersmartic{\null\let\aftersmartic=\saveaftersmartic}% ! 2396: \smartslanted{#1}% ! 2397: } ! 2398: ! 2399: \let\i=\smartitalic ! 2400: \let\slanted=\smartslanted ! 2401: \let\dfn=\smartslanted ! 2402: \let\emph=\smartitalic ! 2403: ! 2404: % Explicit font changes: @r, @sc, undocumented @ii. ! 2405: \def\r#1{{\rm #1}} % roman font ! 2406: \def\sc#1{{\smallcaps#1}} % smallcaps font ! 2407: \def\ii#1{{\it #1}} % italic font ! 2408: ! 2409: % @b, explicit bold. Also @strong. ! 2410: \def\b#1{{\bf #1}} ! 2411: \let\strong=\b ! 2412: ! 2413: % @sansserif, explicit sans. ! 2414: \def\sansserif#1{{\sf #1}} ! 2415: ! 2416: % We can't just use \exhyphenpenalty, because that only has effect at ! 2417: % the end of a paragraph. Restore normal hyphenation at the end of the ! 2418: % group within which \nohyphenation is presumably called. ! 2419: % ! 2420: \def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation} ! 2421: \def\restorehyphenation{\hyphenchar\font = `- } ! 2422: ! 2423: % Set sfcode to normal for the chars that usually have another value. ! 2424: % Can't use plain's \frenchspacing because it uses the `\x notation, and ! 2425: % sometimes \x has an active definition that messes things up. ! 2426: % ! 2427: \catcode`@=11 ! 2428: \def\plainfrenchspacing{% ! 2429: \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m ! 2430: \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m ! 2431: \def\endofsentencespacefactor{1000}% for @. and friends ! 2432: } ! 2433: \def\plainnonfrenchspacing{% ! 2434: \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000 ! 2435: \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 ! 2436: \def\endofsentencespacefactor{3000}% for @. and friends ! 2437: } ! 2438: \catcode`@=\other ! 2439: \def\endofsentencespacefactor{3000}% default ! 2440: ! 2441: % @t, explicit typewriter. ! 2442: \def\t#1{% ! 2443: {\tt \rawbackslash \plainfrenchspacing #1}% ! 2444: \null ! 2445: } ! 2446: ! 2447: % @samp. ! 2448: \def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}} ! 2449: ! 2450: % @indicateurl is \samp, that is, with quotes. ! 2451: \let\indicateurl=\samp ! 2452: ! 2453: % @code (and similar) prints in typewriter, but with spaces the same ! 2454: % size as normal in the surrounding text, without hyphenation, etc. ! 2455: % This is a subroutine for that. ! 2456: \def\tclose#1{% ! 2457: {% ! 2458: % Change normal interword space to be same as for the current font. ! 2459: \spaceskip = \fontdimen2\font ! 2460: % ! 2461: % Switch to typewriter. ! 2462: \tt ! 2463: % ! 2464: % But `\ ' produces the large typewriter interword space. ! 2465: \def\ {{\spaceskip = 0pt{} }}% ! 2466: % ! 2467: % Turn off hyphenation. ! 2468: \nohyphenation ! 2469: % ! 2470: \rawbackslash ! 2471: \plainfrenchspacing ! 2472: #1% ! 2473: }% ! 2474: \null % reset spacefactor to 1000 ! 2475: } ! 2476: ! 2477: % We *must* turn on hyphenation at `-' and `_' in @code. ! 2478: % Otherwise, it is too hard to avoid overfull hboxes ! 2479: % in the Emacs manual, the Library manual, etc. ! 2480: % ! 2481: % Unfortunately, TeX uses one parameter (\hyphenchar) to control ! 2482: % both hyphenation at - and hyphenation within words. ! 2483: % We must therefore turn them both off (\tclose does that) ! 2484: % and arrange explicitly to hyphenate at a dash. ! 2485: % -- rms. ! 2486: { ! 2487: \catcode`\-=\active \catcode`\_=\active ! 2488: \catcode`\'=\active \catcode`\`=\active ! 2489: \global\let'=\rq \global\let`=\lq % default definitions ! 2490: % ! 2491: \global\def\code{\begingroup ! 2492: \setupmarkupstyle{code}% ! 2493: % The following should really be moved into \setupmarkupstyle handlers. ! 2494: \catcode\dashChar=\active \catcode\underChar=\active ! 2495: \ifallowcodebreaks ! 2496: \let-\codedash ! 2497: \let_\codeunder ! 2498: \else ! 2499: \let-\normaldash ! 2500: \let_\realunder ! 2501: \fi ! 2502: \codex ! 2503: } ! 2504: } ! 2505: ! 2506: \def\codex #1{\tclose{#1}\endgroup} ! 2507: ! 2508: \def\normaldash{-} ! 2509: \def\codedash{-\discretionary{}{}{}} ! 2510: \def\codeunder{% ! 2511: % this is all so @math{@code{var_name}+1} can work. In math mode, _ ! 2512: % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.) ! 2513: % will therefore expand the active definition of _, which is us ! 2514: % (inside @code that is), therefore an endless loop. ! 2515: \ifusingtt{\ifmmode ! 2516: \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_. ! 2517: \else\normalunderscore \fi ! 2518: \discretionary{}{}{}}% ! 2519: {\_}% ! 2520: } ! 2521: ! 2522: % An additional complication: the above will allow breaks after, e.g., ! 2523: % each of the four underscores in __typeof__. This is bad. ! 2524: % @allowcodebreaks provides a document-level way to turn breaking at - ! 2525: % and _ on and off. ! 2526: % ! 2527: \newif\ifallowcodebreaks \allowcodebreakstrue ! 2528: ! 2529: \def\keywordtrue{true} ! 2530: \def\keywordfalse{false} ! 2531: ! 2532: \parseargdef\allowcodebreaks{% ! 2533: \def\txiarg{#1}% ! 2534: \ifx\txiarg\keywordtrue ! 2535: \allowcodebreakstrue ! 2536: \else\ifx\txiarg\keywordfalse ! 2537: \allowcodebreaksfalse ! 2538: \else ! 2539: \errhelp = \EMsimple ! 2540: \errmessage{Unknown @allowcodebreaks option `\txiarg', must be true|false}% ! 2541: \fi\fi ! 2542: } ! 2543: ! 2544: % For @command, @env, @file, @option quotes seem unnecessary, ! 2545: % so use \code rather than \samp. ! 2546: \let\command=\code ! 2547: \let\env=\code ! 2548: \let\file=\code ! 2549: \let\option=\code ! 2550: ! 2551: % @uref (abbreviation for `urlref') takes an optional (comma-separated) ! 2552: % second argument specifying the text to display and an optional third ! 2553: % arg as text to display instead of (rather than in addition to) the url ! 2554: % itself. First (mandatory) arg is the url. ! 2555: % (This \urefnobreak definition isn't used now, leaving it for a while ! 2556: % for comparison.) ! 2557: \def\urefnobreak#1{\dourefnobreak #1,,,\finish} ! 2558: \def\dourefnobreak#1,#2,#3,#4\finish{\begingroup ! 2559: \unsepspaces ! 2560: \pdfurl{#1}% ! 2561: \setbox0 = \hbox{\ignorespaces #3}% ! 2562: \ifdim\wd0 > 0pt ! 2563: \unhbox0 % third arg given, show only that ! 2564: \else ! 2565: \setbox0 = \hbox{\ignorespaces #2}% ! 2566: \ifdim\wd0 > 0pt ! 2567: \ifpdf ! 2568: \unhbox0 % PDF: 2nd arg given, show only it ! 2569: \else ! 2570: \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url ! 2571: \fi ! 2572: \else ! 2573: \code{#1}% only url given, so show it ! 2574: \fi ! 2575: \fi ! 2576: \endlink ! 2577: \endgroup} ! 2578: ! 2579: % This \urefbreak definition is the active one. ! 2580: \def\urefbreak{\begingroup \urefcatcodes \dourefbreak} ! 2581: \let\uref=\urefbreak ! 2582: \def\dourefbreak#1{\urefbreakfinish #1,,,\finish} ! 2583: \def\urefbreakfinish#1,#2,#3,#4\finish{% doesn't work in @example ! 2584: \unsepspaces ! 2585: \pdfurl{#1}% ! 2586: \setbox0 = \hbox{\ignorespaces #3}% ! 2587: \ifdim\wd0 > 0pt ! 2588: \unhbox0 % third arg given, show only that ! 2589: \else ! 2590: \setbox0 = \hbox{\ignorespaces #2}% ! 2591: \ifdim\wd0 > 0pt ! 2592: \ifpdf ! 2593: \unhbox0 % PDF: 2nd arg given, show only it ! 2594: \else ! 2595: \unhbox0\ (\urefcode{#1})% DVI: 2nd arg given, show both it and url ! 2596: \fi ! 2597: \else ! 2598: \urefcode{#1}% only url given, so show it ! 2599: \fi ! 2600: \fi ! 2601: \endlink ! 2602: \endgroup} ! 2603: ! 2604: % Allow line breaks around only a few characters (only). ! 2605: \def\urefcatcodes{% ! 2606: \catcode\ampChar=\active \catcode\dotChar=\active ! 2607: \catcode\hashChar=\active \catcode\questChar=\active ! 2608: \catcode\slashChar=\active ! 2609: } ! 2610: { ! 2611: \urefcatcodes ! 2612: % ! 2613: \global\def\urefcode{\begingroup ! 2614: \setupmarkupstyle{code}% ! 2615: \urefcatcodes ! 2616: \let&\urefcodeamp ! 2617: \let.\urefcodedot ! 2618: \let#\urefcodehash ! 2619: \let?\urefcodequest ! 2620: \let/\urefcodeslash ! 2621: \codex ! 2622: } ! 2623: % ! 2624: % By default, they are just regular characters. ! 2625: \global\def&{\normalamp} ! 2626: \global\def.{\normaldot} ! 2627: \global\def#{\normalhash} ! 2628: \global\def?{\normalquest} ! 2629: \global\def/{\normalslash} ! 2630: } ! 2631: ! 2632: % we put a little stretch before and after the breakable chars, to help ! 2633: % line breaking of long url's. The unequal skips make look better in ! 2634: % cmtt at least, especially for dots. ! 2635: \def\urefprestretch{\urefprebreak \hskip0pt plus.13em } ! 2636: \def\urefpoststretch{\urefpostbreak \hskip0pt plus.1em } ! 2637: % ! 2638: \def\urefcodeamp{\urefprestretch \&\urefpoststretch} ! 2639: \def\urefcodedot{\urefprestretch .\urefpoststretch} ! 2640: \def\urefcodehash{\urefprestretch \#\urefpoststretch} ! 2641: \def\urefcodequest{\urefprestretch ?\urefpoststretch} ! 2642: \def\urefcodeslash{\futurelet\next\urefcodeslashfinish} ! 2643: { ! 2644: \catcode`\/=\active ! 2645: \global\def\urefcodeslashfinish{% ! 2646: \urefprestretch \slashChar ! 2647: % Allow line break only after the final / in a sequence of ! 2648: % slashes, to avoid line break between the slashes in http://. ! 2649: \ifx\next/\else \urefpoststretch \fi ! 2650: } ! 2651: } ! 2652: ! 2653: % One more complication: by default we'll break after the special ! 2654: % characters, but some people like to break before the special chars, so ! 2655: % allow that. Also allow no breaking at all, for manual control. ! 2656: % ! 2657: \parseargdef\urefbreakstyle{% ! 2658: \def\txiarg{#1}% ! 2659: \ifx\txiarg\wordnone ! 2660: \def\urefprebreak{\nobreak}\def\urefpostbreak{\nobreak} ! 2661: \else\ifx\txiarg\wordbefore ! 2662: \def\urefprebreak{\allowbreak}\def\urefpostbreak{\nobreak} ! 2663: \else\ifx\txiarg\wordafter ! 2664: \def\urefprebreak{\nobreak}\def\urefpostbreak{\allowbreak} ! 2665: \else ! 2666: \errhelp = \EMsimple ! 2667: \errmessage{Unknown @urefbreakstyle setting `\txiarg'}% ! 2668: \fi\fi\fi ! 2669: } ! 2670: \def\wordafter{after} ! 2671: \def\wordbefore{before} ! 2672: \def\wordnone{none} ! 2673: ! 2674: \urefbreakstyle after ! 2675: ! 2676: % @url synonym for @uref, since that's how everyone uses it. ! 2677: % ! 2678: \let\url=\uref ! 2679: ! 2680: % rms does not like angle brackets --karl, 17may97. ! 2681: % So now @email is just like @uref, unless we are pdf. ! 2682: % ! 2683: %\def\email#1{\angleleft{\tt #1}\angleright} ! 2684: \ifpdf ! 2685: \def\email#1{\doemail#1,,\finish} ! 2686: \def\doemail#1,#2,#3\finish{\begingroup ! 2687: \unsepspaces ! 2688: \pdfurl{mailto:#1}% ! 2689: \setbox0 = \hbox{\ignorespaces #2}% ! 2690: \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi ! 2691: \endlink ! 2692: \endgroup} ! 2693: \else ! 2694: \let\email=\uref ! 2695: \fi ! 2696: ! 2697: % @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always), ! 2698: % `example' (@kbd uses ttsl only inside of @example and friends), ! 2699: % or `code' (@kbd uses normal tty font always). ! 2700: \parseargdef\kbdinputstyle{% ! 2701: \def\txiarg{#1}% ! 2702: \ifx\txiarg\worddistinct ! 2703: \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}% ! 2704: \else\ifx\txiarg\wordexample ! 2705: \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}% ! 2706: \else\ifx\txiarg\wordcode ! 2707: \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}% ! 2708: \else ! 2709: \errhelp = \EMsimple ! 2710: \errmessage{Unknown @kbdinputstyle setting `\txiarg'}% ! 2711: \fi\fi\fi ! 2712: } ! 2713: \def\worddistinct{distinct} ! 2714: \def\wordexample{example} ! 2715: \def\wordcode{code} ! 2716: ! 2717: % Default is `distinct'. ! 2718: \kbdinputstyle distinct ! 2719: ! 2720: % @kbd is like @code, except that if the argument is just one @key command, ! 2721: % then @kbd has no effect. ! 2722: \def\kbd#1{{\def\look{#1}\expandafter\kbdsub\look??\par}} ! 2723: ! 2724: \def\xkey{\key} ! 2725: \def\kbdsub#1#2#3\par{% ! 2726: \def\one{#1}\def\three{#3}\def\threex{??}% ! 2727: \ifx\one\xkey\ifx\threex\three \key{#2}% ! 2728: \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi ! 2729: \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi ! 2730: } ! 2731: ! 2732: % definition of @key that produces a lozenge. Doesn't adjust to text size. ! 2733: %\setfont\keyrm\rmshape{8}{1000}{OT1} ! 2734: %\font\keysy=cmsy9 ! 2735: %\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{% ! 2736: % \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% ! 2737: % \vbox{\hrule\kern-0.4pt ! 2738: % \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% ! 2739: % \kern-0.4pt\hrule}% ! 2740: % \kern-.06em\raise0.4pt\hbox{\angleright}}}} ! 2741: ! 2742: % definition of @key with no lozenge. If the current font is already ! 2743: % monospace, don't change it; that way, we respect @kbdinputstyle. But ! 2744: % if it isn't monospace, then use \tt. ! 2745: % ! 2746: \def\key#1{{\setupmarkupstyle{key}% ! 2747: \nohyphenation ! 2748: \ifmonospace\else\tt\fi ! 2749: #1}\null} ! 2750: ! 2751: % @clicksequence{File @click{} Open ...} ! 2752: \def\clicksequence#1{\begingroup #1\endgroup} ! 2753: ! 2754: % @clickstyle @arrow (by default) ! 2755: \parseargdef\clickstyle{\def\click{#1}} ! 2756: \def\click{\arrow} ! 2757: ! 2758: % Typeset a dimension, e.g., `in' or `pt'. The only reason for the ! 2759: % argument is to make the input look right: @dmn{pt} instead of @dmn{}pt. ! 2760: % ! 2761: \def\dmn#1{\thinspace #1} ! 2762: ! 2763: % @l was never documented to mean ``switch to the Lisp font'', ! 2764: % and it is not used as such in any manual I can find. We need it for ! 2765: % Polish suppressed-l. --karl, 22sep96. ! 2766: %\def\l#1{{\li #1}\null} ! 2767: ! 2768: % @acronym for "FBI", "NATO", and the like. ! 2769: % We print this one point size smaller, since it's intended for ! 2770: % all-uppercase. ! 2771: % ! 2772: \def\acronym#1{\doacronym #1,,\finish} ! 2773: \def\doacronym#1,#2,#3\finish{% ! 2774: {\selectfonts\lsize #1}% ! 2775: \def\temp{#2}% ! 2776: \ifx\temp\empty \else ! 2777: \space ({\unsepspaces \ignorespaces \temp \unskip})% ! 2778: \fi ! 2779: \null % reset \spacefactor=1000 ! 2780: } ! 2781: ! 2782: % @abbr for "Comput. J." and the like. ! 2783: % No font change, but don't do end-of-sentence spacing. ! 2784: % ! 2785: \def\abbr#1{\doabbr #1,,\finish} ! 2786: \def\doabbr#1,#2,#3\finish{% ! 2787: {\plainfrenchspacing #1}% ! 2788: \def\temp{#2}% ! 2789: \ifx\temp\empty \else ! 2790: \space ({\unsepspaces \ignorespaces \temp \unskip})% ! 2791: \fi ! 2792: \null % reset \spacefactor=1000 ! 2793: } ! 2794: ! 2795: % @asis just yields its argument. Used with @table, for example. ! 2796: % ! 2797: \def\asis#1{#1} ! 2798: ! 2799: % @math outputs its argument in math mode. ! 2800: % ! 2801: % One complication: _ usually means subscripts, but it could also mean ! 2802: % an actual _ character, as in @math{@var{some_variable} + 1}. So make ! 2803: % _ active, and distinguish by seeing if the current family is \slfam, ! 2804: % which is what @var uses. ! 2805: { ! 2806: \catcode`\_ = \active ! 2807: \gdef\mathunderscore{% ! 2808: \catcode`\_=\active ! 2809: \def_{\ifnum\fam=\slfam \_\else\sb\fi}% ! 2810: } ! 2811: } ! 2812: % Another complication: we want \\ (and @\) to output a math (or tt) \. ! 2813: % FYI, plain.tex uses \\ as a temporary control sequence (for no ! 2814: % particular reason), but this is not advertised and we don't care. ! 2815: % ! 2816: % The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\. ! 2817: \def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi} ! 2818: % ! 2819: \def\math{% ! 2820: \tex ! 2821: \mathunderscore ! 2822: \let\\ = \mathbackslash ! 2823: \mathactive ! 2824: % make the texinfo accent commands work in math mode ! 2825: \let\"=\ddot ! 2826: \let\'=\acute ! 2827: \let\==\bar ! 2828: \let\^=\hat ! 2829: \let\`=\grave ! 2830: \let\u=\breve ! 2831: \let\v=\check ! 2832: \let\~=\tilde ! 2833: \let\dotaccent=\dot ! 2834: $\finishmath ! 2835: } ! 2836: \def\finishmath#1{#1$\endgroup} % Close the group opened by \tex. ! 2837: ! 2838: % Some active characters (such as <) are spaced differently in math. ! 2839: % We have to reset their definitions in case the @math was an argument ! 2840: % to a command which sets the catcodes (such as @item or @section). ! 2841: % ! 2842: { ! 2843: \catcode`^ = \active ! 2844: \catcode`< = \active ! 2845: \catcode`> = \active ! 2846: \catcode`+ = \active ! 2847: \catcode`' = \active ! 2848: \gdef\mathactive{% ! 2849: \let^ = \ptexhat ! 2850: \let< = \ptexless ! 2851: \let> = \ptexgtr ! 2852: \let+ = \ptexplus ! 2853: \let' = \ptexquoteright ! 2854: } ! 2855: } ! 2856: ! 2857: % ctrl is no longer a Texinfo command, but leave this definition for fun. ! 2858: \def\ctrl #1{{\tt \rawbackslash \hat}#1} ! 2859: ! 2860: % @inlinefmt{FMTNAME,PROCESSED-TEXT} and @inlineraw{FMTNAME,RAW-TEXT}. ! 2861: % Ignore unless FMTNAME == tex; then it is like @iftex and @tex, ! 2862: % except specified as a normal braced arg, so no newlines to worry about. ! 2863: % ! 2864: \def\outfmtnametex{tex} ! 2865: % ! 2866: \long\def\inlinefmt#1{\doinlinefmt #1,\finish} ! 2867: \long\def\doinlinefmt#1,#2,\finish{% ! 2868: \def\inlinefmtname{#1}% ! 2869: \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\fi ! 2870: } ! 2871: % For raw, must switch into @tex before parsing the argument, to avoid ! 2872: % setting catcodes prematurely. Doing it this way means that, for ! 2873: % example, @inlineraw{html, foo{bar} gets a parse error instead of being ! 2874: % ignored. But this isn't important because if people want a literal ! 2875: % *right* brace they would have to use a command anyway, so they may as ! 2876: % well use a command to get a left brace too. We could re-use the ! 2877: % delimiter character idea from \verb, but it seems like overkill. ! 2878: % ! 2879: \long\def\inlineraw{\tex \doinlineraw} ! 2880: \long\def\doinlineraw#1{\doinlinerawtwo #1,\finish} ! 2881: \def\doinlinerawtwo#1,#2,\finish{% ! 2882: \def\inlinerawname{#1}% ! 2883: \ifx\inlinerawname\outfmtnametex \ignorespaces #2\fi ! 2884: \endgroup % close group opened by \tex. ! 2885: } ! 2886: ! 2887: ! 2888: \message{glyphs,} ! 2889: % and logos. ! 2890: ! 2891: % @@ prints an @, as does @atchar{}. ! 2892: \def\@{\char64 } ! 2893: \let\atchar=\@ ! 2894: ! 2895: % @{ @} @lbracechar{} @rbracechar{} all generate brace characters. ! 2896: % Unless we're in typewriter, use \ecfont because the CM text fonts do ! 2897: % not have braces, and we don't want to switch into math. ! 2898: \def\mylbrace{{\ifmonospace\else\ecfont\fi \char123}} ! 2899: \def\myrbrace{{\ifmonospace\else\ecfont\fi \char125}} ! 2900: \let\{=\mylbrace \let\lbracechar=\{ ! 2901: \let\}=\myrbrace \let\rbracechar=\} ! 2902: \begingroup ! 2903: % Definitions to produce \{ and \} commands for indices, ! 2904: % and @{ and @} for the aux/toc files. ! 2905: \catcode`\{ = \other \catcode`\} = \other ! 2906: \catcode`\[ = 1 \catcode`\] = 2 ! 2907: \catcode`\! = 0 \catcode`\\ = \other ! 2908: !gdef!lbracecmd[\{]% ! 2909: !gdef!rbracecmd[\}]% ! 2910: !gdef!lbraceatcmd[@{]% ! 2911: !gdef!rbraceatcmd[@}]% ! 2912: !endgroup ! 2913: ! 2914: % @comma{} to avoid , parsing problems. ! 2915: \let\comma = , ! 2916: ! 2917: % Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent ! 2918: % Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H. ! 2919: \let\, = \ptexc ! 2920: \let\dotaccent = \ptexdot ! 2921: \def\ringaccent#1{{\accent23 #1}} ! 2922: \let\tieaccent = \ptext ! 2923: \let\ubaraccent = \ptexb ! 2924: \let\udotaccent = \d ! 2925: ! 2926: % Other special characters: @questiondown @exclamdown @ordf @ordm ! 2927: % Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss. ! 2928: \def\questiondown{?`} ! 2929: \def\exclamdown{!`} ! 2930: \def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}} ! 2931: \def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}} ! 2932: ! 2933: % Dotless i and dotless j, used for accents. ! 2934: \def\imacro{i} ! 2935: \def\jmacro{j} ! 2936: \def\dotless#1{% ! 2937: \def\temp{#1}% ! 2938: \ifx\temp\imacro \ifmmode\imath \else\ptexi \fi ! 2939: \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi ! 2940: \else \errmessage{@dotless can be used only with i or j}% ! 2941: \fi\fi ! 2942: } ! 2943: ! 2944: % The \TeX{} logo, as in plain, but resetting the spacing so that a ! 2945: % period following counts as ending a sentence. (Idea found in latex.) ! 2946: % ! 2947: \edef\TeX{\TeX \spacefactor=1000 } ! 2948: ! 2949: % @LaTeX{} logo. Not quite the same results as the definition in ! 2950: % latex.ltx, since we use a different font for the raised A; it's most ! 2951: % convenient for us to use an explicitly smaller font, rather than using ! 2952: % the \scriptstyle font (since we don't reset \scriptstyle and ! 2953: % \scriptscriptstyle). ! 2954: % ! 2955: \def\LaTeX{% ! 2956: L\kern-.36em ! 2957: {\setbox0=\hbox{T}% ! 2958: \vbox to \ht0{\hbox{% ! 2959: \ifx\textnominalsize\xwordpt ! 2960: % for 10pt running text, \lllsize (8pt) is too small for the A in LaTeX. ! 2961: % Revert to plain's \scriptsize, which is 7pt. ! 2962: \count255=\the\fam $\fam\count255 \scriptstyle A$% ! 2963: \else ! 2964: % For 11pt, we can use our lllsize. ! 2965: \selectfonts\lllsize A% ! 2966: \fi ! 2967: }% ! 2968: \vss ! 2969: }}% ! 2970: \kern-.15em ! 2971: \TeX ! 2972: } ! 2973: ! 2974: % Some math mode symbols. ! 2975: \def\bullet{$\ptexbullet$} ! 2976: \def\geq{\ifmmode \ge\else $\ge$\fi} ! 2977: \def\leq{\ifmmode \le\else $\le$\fi} ! 2978: \def\minus{\ifmmode -\else $-$\fi} ! 2979: ! 2980: % @dots{} outputs an ellipsis using the current font. ! 2981: % We do .5em per period so that it has the same spacing in the cm ! 2982: % typewriter fonts as three actual period characters; on the other hand, ! 2983: % in other typewriter fonts three periods are wider than 1.5em. So do ! 2984: % whichever is larger. ! 2985: % ! 2986: \def\dots{% ! 2987: \leavevmode ! 2988: \setbox0=\hbox{...}% get width of three periods ! 2989: \ifdim\wd0 > 1.5em ! 2990: \dimen0 = \wd0 ! 2991: \else ! 2992: \dimen0 = 1.5em ! 2993: \fi ! 2994: \hbox to \dimen0{% ! 2995: \hskip 0pt plus.25fil ! 2996: .\hskip 0pt plus1fil ! 2997: .\hskip 0pt plus1fil ! 2998: .\hskip 0pt plus.5fil ! 2999: }% ! 3000: } ! 3001: ! 3002: % @enddots{} is an end-of-sentence ellipsis. ! 3003: % ! 3004: \def\enddots{% ! 3005: \dots ! 3006: \spacefactor=\endofsentencespacefactor ! 3007: } ! 3008: ! 3009: % @point{}, @result{}, @expansion{}, @print{}, @equiv{}. ! 3010: % ! 3011: % Since these characters are used in examples, they should be an even number of ! 3012: % \tt widths. Each \tt character is 1en, so two makes it 1em. ! 3013: % ! 3014: \def\point{$\star$} ! 3015: \def\arrow{\leavevmode\raise.05ex\hbox to 1em{\hfil$\rightarrow$\hfil}} ! 3016: \def\result{\leavevmode\raise.05ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} ! 3017: \def\expansion{\leavevmode\hbox to 1em{\hfil$\mapsto$\hfil}} ! 3018: \def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} ! 3019: \def\equiv{\leavevmode\hbox to 1em{\hfil$\ptexequiv$\hfil}} ! 3020: ! 3021: % The @error{} command. ! 3022: % Adapted from the TeXbook's \boxit. ! 3023: % ! 3024: \newbox\errorbox ! 3025: % ! 3026: {\tentt \global\dimen0 = 3em}% Width of the box. ! 3027: \dimen2 = .55pt % Thickness of rules ! 3028: % The text. (`r' is open on the right, `e' somewhat less so on the left.) ! 3029: \setbox0 = \hbox{\kern-.75pt \reducedsf \putworderror\kern-1.5pt} ! 3030: % ! 3031: \setbox\errorbox=\hbox to \dimen0{\hfil ! 3032: \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. ! 3033: \advance\hsize by -2\dimen2 % Rules. ! 3034: \vbox{% ! 3035: \hrule height\dimen2 ! 3036: \hbox{\vrule width\dimen2 \kern3pt % Space to left of text. ! 3037: \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. ! 3038: \kern3pt\vrule width\dimen2}% Space to right. ! 3039: \hrule height\dimen2} ! 3040: \hfil} ! 3041: % ! 3042: \def\error{\leavevmode\lower.7ex\copy\errorbox} ! 3043: ! 3044: % @pounds{} is a sterling sign, which Knuth put in the CM italic font. ! 3045: % ! 3046: \def\pounds{{\it\$}} ! 3047: ! 3048: % @euro{} comes from a separate font, depending on the current style. ! 3049: % We use the free feym* fonts from the eurosym package by Henrik ! 3050: % Theiling, which support regular, slanted, bold and bold slanted (and ! 3051: % "outlined" (blackboard board, sort of) versions, which we don't need). ! 3052: % It is available from http://www.ctan.org/tex-archive/fonts/eurosym. ! 3053: % ! 3054: % Although only regular is the truly official Euro symbol, we ignore ! 3055: % that. The Euro is designed to be slightly taller than the regular ! 3056: % font height. ! 3057: % ! 3058: % feymr - regular ! 3059: % feymo - slanted ! 3060: % feybr - bold ! 3061: % feybo - bold slanted ! 3062: % ! 3063: % There is no good (free) typewriter version, to my knowledge. ! 3064: % A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide. ! 3065: % Hmm. ! 3066: % ! 3067: % Also doesn't work in math. Do we need to do math with euro symbols? ! 3068: % Hope not. ! 3069: % ! 3070: % ! 3071: \def\euro{{\eurofont e}} ! 3072: \def\eurofont{% ! 3073: % We set the font at each command, rather than predefining it in ! 3074: % \textfonts and the other font-switching commands, so that ! 3075: % installations which never need the symbol don't have to have the ! 3076: % font installed. ! 3077: % ! 3078: % There is only one designed size (nominal 10pt), so we always scale ! 3079: % that to the current nominal size. ! 3080: % ! 3081: % By the way, simply using "at 1em" works for cmr10 and the like, but ! 3082: % does not work for cmbx10 and other extended/shrunken fonts. ! 3083: % ! 3084: \def\eurosize{\csname\curfontsize nominalsize\endcsname}% ! 3085: % ! 3086: \ifx\curfontstyle\bfstylename ! 3087: % bold: ! 3088: \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize ! 3089: \else ! 3090: % regular: ! 3091: \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize ! 3092: \fi ! 3093: \thiseurofont ! 3094: } ! 3095: ! 3096: % Glyphs from the EC fonts. We don't use \let for the aliases, because ! 3097: % sometimes we redefine the original macro, and the alias should reflect ! 3098: % the redefinition. ! 3099: % ! 3100: % Use LaTeX names for the Icelandic letters. ! 3101: \def\DH{{\ecfont \char"D0}} % Eth ! 3102: \def\dh{{\ecfont \char"F0}} % eth ! 3103: \def\TH{{\ecfont \char"DE}} % Thorn ! 3104: \def\th{{\ecfont \char"FE}} % thorn ! 3105: % ! 3106: \def\guillemetleft{{\ecfont \char"13}} ! 3107: \def\guillemotleft{\guillemetleft} ! 3108: \def\guillemetright{{\ecfont \char"14}} ! 3109: \def\guillemotright{\guillemetright} ! 3110: \def\guilsinglleft{{\ecfont \char"0E}} ! 3111: \def\guilsinglright{{\ecfont \char"0F}} ! 3112: \def\quotedblbase{{\ecfont \char"12}} ! 3113: \def\quotesinglbase{{\ecfont \char"0D}} ! 3114: % ! 3115: % This positioning is not perfect (see the ogonek LaTeX package), but ! 3116: % we have the precomposed glyphs for the most common cases. We put the ! 3117: % tests to use those glyphs in the single \ogonek macro so we have fewer ! 3118: % dummy definitions to worry about for index entries, etc. ! 3119: % ! 3120: % ogonek is also used with other letters in Lithuanian (IOU), but using ! 3121: % the precomposed glyphs for those is not so easy since they aren't in ! 3122: % the same EC font. ! 3123: \def\ogonek#1{{% ! 3124: \def\temp{#1}% ! 3125: \ifx\temp\macrocharA\Aogonek ! 3126: \else\ifx\temp\macrochara\aogonek ! 3127: \else\ifx\temp\macrocharE\Eogonek ! 3128: \else\ifx\temp\macrochare\eogonek ! 3129: \else ! 3130: \ecfont \setbox0=\hbox{#1}% ! 3131: \ifdim\ht0=1ex\accent"0C #1% ! 3132: \else\ooalign{\unhbox0\crcr\hidewidth\char"0C \hidewidth}% ! 3133: \fi ! 3134: \fi\fi\fi\fi ! 3135: }% ! 3136: } ! 3137: \def\Aogonek{{\ecfont \char"81}}\def\macrocharA{A} ! 3138: \def\aogonek{{\ecfont \char"A1}}\def\macrochara{a} ! 3139: \def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E} ! 3140: \def\eogonek{{\ecfont \char"A6}}\def\macrochare{e} ! 3141: % ! 3142: % Use the ec* fonts (cm-super in outline format) for non-CM glyphs. ! 3143: \def\ecfont{% ! 3144: % We can't distinguish serif/sans and italic/slanted, but this ! 3145: % is used for crude hacks anyway (like adding French and German ! 3146: % quotes to documents typeset with CM, where we lose kerning), so ! 3147: % hopefully nobody will notice/care. ! 3148: \edef\ecsize{\csname\curfontsize ecsize\endcsname}% ! 3149: \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}% ! 3150: \ifmonospace ! 3151: % typewriter: ! 3152: \font\thisecfont = ectt\ecsize \space at \nominalsize ! 3153: \else ! 3154: \ifx\curfontstyle\bfstylename ! 3155: % bold: ! 3156: \font\thisecfont = ecb\ifusingit{i}{x}\ecsize \space at \nominalsize ! 3157: \else ! 3158: % regular: ! 3159: \font\thisecfont = ec\ifusingit{ti}{rm}\ecsize \space at \nominalsize ! 3160: \fi ! 3161: \fi ! 3162: \thisecfont ! 3163: } ! 3164: ! 3165: % @registeredsymbol - R in a circle. The font for the R should really ! 3166: % be smaller yet, but lllsize is the best we can do for now. ! 3167: % Adapted from the plain.tex definition of \copyright. ! 3168: % ! 3169: \def\registeredsymbol{% ! 3170: $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}% ! 3171: \hfil\crcr\Orb}}% ! 3172: }$% ! 3173: } ! 3174: ! 3175: % @textdegree - the normal degrees sign. ! 3176: % ! 3177: \def\textdegree{$^\circ$} ! 3178: ! 3179: % Laurent Siebenmann reports \Orb undefined with: ! 3180: % Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:38 ! 3181: % so we'll define it if necessary. ! 3182: % ! 3183: \ifx\Orb\thisisundefined ! 3184: \def\Orb{\mathhexbox20D} ! 3185: \fi ! 3186: ! 3187: % Quotes. ! 3188: \chardef\quotedblleft="5C ! 3189: \chardef\quotedblright=`\" ! 3190: \chardef\quoteleft=`\` ! 3191: \chardef\quoteright=`\' ! 3192: ! 3193: ! 3194: \message{page headings,} ! 3195: ! 3196: \newskip\titlepagetopglue \titlepagetopglue = 1.5in ! 3197: \newskip\titlepagebottomglue \titlepagebottomglue = 2pc ! 3198: ! 3199: % First the title page. Must do @settitle before @titlepage. ! 3200: \newif\ifseenauthor ! 3201: \newif\iffinishedtitlepage ! 3202: ! 3203: % Do an implicit @contents or @shortcontents after @end titlepage if the ! 3204: % user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage. ! 3205: % ! 3206: \newif\ifsetcontentsaftertitlepage ! 3207: \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue ! 3208: \newif\ifsetshortcontentsaftertitlepage ! 3209: \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue ! 3210: ! 3211: \parseargdef\shorttitlepage{% ! 3212: \begingroup \hbox{}\vskip 1.5in \chaprm \centerline{#1}% ! 3213: \endgroup\page\hbox{}\page} ! 3214: ! 3215: \envdef\titlepage{% ! 3216: % Open one extra group, as we want to close it in the middle of \Etitlepage. ! 3217: \begingroup ! 3218: \parindent=0pt \textfonts ! 3219: % Leave some space at the very top of the page. ! 3220: \vglue\titlepagetopglue ! 3221: % No rule at page bottom unless we print one at the top with @title. ! 3222: \finishedtitlepagetrue ! 3223: % ! 3224: % Most title ``pages'' are actually two pages long, with space ! 3225: % at the top of the second. We don't want the ragged left on the second. ! 3226: \let\oldpage = \page ! 3227: \def\page{% ! 3228: \iffinishedtitlepage\else ! 3229: \finishtitlepage ! 3230: \fi ! 3231: \let\page = \oldpage ! 3232: \page ! 3233: \null ! 3234: }% ! 3235: } ! 3236: ! 3237: \def\Etitlepage{% ! 3238: \iffinishedtitlepage\else ! 3239: \finishtitlepage ! 3240: \fi ! 3241: % It is important to do the page break before ending the group, ! 3242: % because the headline and footline are only empty inside the group. ! 3243: % If we use the new definition of \page, we always get a blank page ! 3244: % after the title page, which we certainly don't want. ! 3245: \oldpage ! 3246: \endgroup ! 3247: % ! 3248: % Need this before the \...aftertitlepage checks so that if they are ! 3249: % in effect the toc pages will come out with page numbers. ! 3250: \HEADINGSon ! 3251: % ! 3252: % If they want short, they certainly want long too. ! 3253: \ifsetshortcontentsaftertitlepage ! 3254: \shortcontents ! 3255: \contents ! 3256: \global\let\shortcontents = \relax ! 3257: \global\let\contents = \relax ! 3258: \fi ! 3259: % ! 3260: \ifsetcontentsaftertitlepage ! 3261: \contents ! 3262: \global\let\contents = \relax ! 3263: \global\let\shortcontents = \relax ! 3264: \fi ! 3265: } ! 3266: ! 3267: \def\finishtitlepage{% ! 3268: \vskip4pt \hrule height 2pt width \hsize ! 3269: \vskip\titlepagebottomglue ! 3270: \finishedtitlepagetrue ! 3271: } ! 3272: ! 3273: % Settings used for typesetting titles: no hyphenation, no indentation, ! 3274: % don't worry much about spacing, ragged right. This should be used ! 3275: % inside a \vbox, and fonts need to be set appropriately first. Because ! 3276: % it is always used for titles, nothing else, we call \rmisbold. \par ! 3277: % should be specified before the end of the \vbox, since a vbox is a group. ! 3278: % ! 3279: \def\raggedtitlesettings{% ! 3280: \rmisbold ! 3281: \hyphenpenalty=10000 ! 3282: \parindent=0pt ! 3283: \tolerance=5000 ! 3284: \ptexraggedright ! 3285: } ! 3286: ! 3287: % Macros to be used within @titlepage: ! 3288: ! 3289: \let\subtitlerm=\tenrm ! 3290: \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines} ! 3291: ! 3292: \parseargdef\title{% ! 3293: \checkenv\titlepage ! 3294: \vbox{\titlefonts \raggedtitlesettings #1\par}% ! 3295: % print a rule at the page bottom also. ! 3296: \finishedtitlepagefalse ! 3297: \vskip4pt \hrule height 4pt width \hsize \vskip4pt ! 3298: } ! 3299: ! 3300: \parseargdef\subtitle{% ! 3301: \checkenv\titlepage ! 3302: {\subtitlefont \rightline{#1}}% ! 3303: } ! 3304: ! 3305: % @author should come last, but may come many times. ! 3306: % It can also be used inside @quotation. ! 3307: % ! 3308: \parseargdef\author{% ! 3309: \def\temp{\quotation}% ! 3310: \ifx\thisenv\temp ! 3311: \def\quotationauthor{#1}% printed in \Equotation. ! 3312: \else ! 3313: \checkenv\titlepage ! 3314: \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi ! 3315: {\secfonts\rmisbold \leftline{#1}}% ! 3316: \fi ! 3317: } ! 3318: ! 3319: ! 3320: % Set up page headings and footings. ! 3321: ! 3322: \let\thispage=\folio ! 3323: ! 3324: \newtoks\evenheadline % headline on even pages ! 3325: \newtoks\oddheadline % headline on odd pages ! 3326: \newtoks\evenfootline % footline on even pages ! 3327: \newtoks\oddfootline % footline on odd pages ! 3328: ! 3329: % Now make TeX use those variables ! 3330: \headline={{\textfonts\rm \ifodd\pageno \the\oddheadline ! 3331: \else \the\evenheadline \fi}} ! 3332: \footline={{\textfonts\rm \ifodd\pageno \the\oddfootline ! 3333: \else \the\evenfootline \fi}\HEADINGShook} ! 3334: \let\HEADINGShook=\relax ! 3335: ! 3336: % Commands to set those variables. ! 3337: % For example, this is what @headings on does ! 3338: % @evenheading @thistitle|@thispage|@thischapter ! 3339: % @oddheading @thischapter|@thispage|@thistitle ! 3340: % @evenfooting @thisfile|| ! 3341: % @oddfooting ||@thisfile ! 3342: ! 3343: ! 3344: \def\evenheading{\parsearg\evenheadingxxx} ! 3345: \def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish} ! 3346: \def\evenheadingyyy #1\|#2\|#3\|#4\finish{% ! 3347: \global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} ! 3348: ! 3349: \def\oddheading{\parsearg\oddheadingxxx} ! 3350: \def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish} ! 3351: \def\oddheadingyyy #1\|#2\|#3\|#4\finish{% ! 3352: \global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} ! 3353: ! 3354: \parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}% ! 3355: ! 3356: \def\evenfooting{\parsearg\evenfootingxxx} ! 3357: \def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish} ! 3358: \def\evenfootingyyy #1\|#2\|#3\|#4\finish{% ! 3359: \global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} ! 3360: ! 3361: \def\oddfooting{\parsearg\oddfootingxxx} ! 3362: \def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish} ! 3363: \def\oddfootingyyy #1\|#2\|#3\|#4\finish{% ! 3364: \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}% ! 3365: % ! 3366: % Leave some space for the footline. Hopefully ok to assume ! 3367: % @evenfooting will not be used by itself. ! 3368: \global\advance\pageheight by -12pt ! 3369: \global\advance\vsize by -12pt ! 3370: } ! 3371: ! 3372: \parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}} ! 3373: ! 3374: % @evenheadingmarks top \thischapter <- chapter at the top of a page ! 3375: % @evenheadingmarks bottom \thischapter <- chapter at the bottom of a page ! 3376: % ! 3377: % The same set of arguments for: ! 3378: % ! 3379: % @oddheadingmarks ! 3380: % @evenfootingmarks ! 3381: % @oddfootingmarks ! 3382: % @everyheadingmarks ! 3383: % @everyfootingmarks ! 3384: ! 3385: \def\evenheadingmarks{\headingmarks{even}{heading}} ! 3386: \def\oddheadingmarks{\headingmarks{odd}{heading}} ! 3387: \def\evenfootingmarks{\headingmarks{even}{footing}} ! 3388: \def\oddfootingmarks{\headingmarks{odd}{footing}} ! 3389: \def\everyheadingmarks#1 {\headingmarks{even}{heading}{#1} ! 3390: \headingmarks{odd}{heading}{#1} } ! 3391: \def\everyfootingmarks#1 {\headingmarks{even}{footing}{#1} ! 3392: \headingmarks{odd}{footing}{#1} } ! 3393: % #1 = even/odd, #2 = heading/footing, #3 = top/bottom. ! 3394: \def\headingmarks#1#2#3 {% ! 3395: \expandafter\let\expandafter\temp \csname get#3headingmarks\endcsname ! 3396: \global\expandafter\let\csname get#1#2marks\endcsname \temp ! 3397: } ! 3398: ! 3399: \everyheadingmarks bottom ! 3400: \everyfootingmarks bottom ! 3401: ! 3402: % @headings double turns headings on for double-sided printing. ! 3403: % @headings single turns headings on for single-sided printing. ! 3404: % @headings off turns them off. ! 3405: % @headings on same as @headings double, retained for compatibility. ! 3406: % @headings after turns on double-sided headings after this page. ! 3407: % @headings doubleafter turns on double-sided headings after this page. ! 3408: % @headings singleafter turns on single-sided headings after this page. ! 3409: % By default, they are off at the start of a document, ! 3410: % and turned `on' after @end titlepage. ! 3411: ! 3412: \def\headings #1 {\csname HEADINGS#1\endcsname} ! 3413: ! 3414: \def\headingsoff{% non-global headings elimination ! 3415: \evenheadline={\hfil}\evenfootline={\hfil}% ! 3416: \oddheadline={\hfil}\oddfootline={\hfil}% ! 3417: } ! 3418: ! 3419: \def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting ! 3420: \HEADINGSoff % it's the default ! 3421: ! 3422: % When we turn headings on, set the page number to 1. ! 3423: % For double-sided printing, put current file name in lower left corner, ! 3424: % chapter name on inside top of right hand pages, document ! 3425: % title on inside top of left hand pages, and page numbers on outside top ! 3426: % edge of all pages. ! 3427: \def\HEADINGSdouble{% ! 3428: \global\pageno=1 ! 3429: \global\evenfootline={\hfil} ! 3430: \global\oddfootline={\hfil} ! 3431: \global\evenheadline={\line{\folio\hfil\thistitle}} ! 3432: \global\oddheadline={\line{\thischapter\hfil\folio}} ! 3433: \global\let\contentsalignmacro = \chapoddpage ! 3434: } ! 3435: \let\contentsalignmacro = \chappager ! 3436: ! 3437: % For single-sided printing, chapter title goes across top left of page, ! 3438: % page number on top right. ! 3439: \def\HEADINGSsingle{% ! 3440: \global\pageno=1 ! 3441: \global\evenfootline={\hfil} ! 3442: \global\oddfootline={\hfil} ! 3443: \global\evenheadline={\line{\thischapter\hfil\folio}} ! 3444: \global\oddheadline={\line{\thischapter\hfil\folio}} ! 3445: \global\let\contentsalignmacro = \chappager ! 3446: } ! 3447: \def\HEADINGSon{\HEADINGSdouble} ! 3448: ! 3449: \def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex} ! 3450: \let\HEADINGSdoubleafter=\HEADINGSafter ! 3451: \def\HEADINGSdoublex{% ! 3452: \global\evenfootline={\hfil} ! 3453: \global\oddfootline={\hfil} ! 3454: \global\evenheadline={\line{\folio\hfil\thistitle}} ! 3455: \global\oddheadline={\line{\thischapter\hfil\folio}} ! 3456: \global\let\contentsalignmacro = \chapoddpage ! 3457: } ! 3458: ! 3459: \def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} ! 3460: \def\HEADINGSsinglex{% ! 3461: \global\evenfootline={\hfil} ! 3462: \global\oddfootline={\hfil} ! 3463: \global\evenheadline={\line{\thischapter\hfil\folio}} ! 3464: \global\oddheadline={\line{\thischapter\hfil\folio}} ! 3465: \global\let\contentsalignmacro = \chappager ! 3466: } ! 3467: ! 3468: % Subroutines used in generating headings ! 3469: % This produces Day Month Year style of output. ! 3470: % Only define if not already defined, in case a txi-??.tex file has set ! 3471: % up a different format (e.g., txi-cs.tex does this). ! 3472: \ifx\today\thisisundefined ! 3473: \def\today{% ! 3474: \number\day\space ! 3475: \ifcase\month ! 3476: \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr ! 3477: \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug ! 3478: \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec ! 3479: \fi ! 3480: \space\number\year} ! 3481: \fi ! 3482: ! 3483: % @settitle line... specifies the title of the document, for headings. ! 3484: % It generates no output of its own. ! 3485: \def\thistitle{\putwordNoTitle} ! 3486: \def\settitle{\parsearg{\gdef\thistitle}} ! 3487: ! 3488: ! 3489: \message{tables,} ! 3490: % Tables -- @table, @ftable, @vtable, @item(x). ! 3491: ! 3492: % default indentation of table text ! 3493: \newdimen\tableindent \tableindent=.8in ! 3494: % default indentation of @itemize and @enumerate text ! 3495: \newdimen\itemindent \itemindent=.3in ! 3496: % margin between end of table item and start of table text. ! 3497: \newdimen\itemmargin \itemmargin=.1in ! 3498: ! 3499: % used internally for \itemindent minus \itemmargin ! 3500: \newdimen\itemmax ! 3501: ! 3502: % Note @table, @ftable, and @vtable define @item, @itemx, etc., with ! 3503: % these defs. ! 3504: % They also define \itemindex ! 3505: % to index the item name in whatever manner is desired (perhaps none). ! 3506: ! 3507: \newif\ifitemxneedsnegativevskip ! 3508: ! 3509: \def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi} ! 3510: ! 3511: \def\internalBitem{\smallbreak \parsearg\itemzzz} ! 3512: \def\internalBitemx{\itemxpar \parsearg\itemzzz} ! 3513: ! 3514: \def\itemzzz #1{\begingroup % ! 3515: \advance\hsize by -\rightskip ! 3516: \advance\hsize by -\tableindent ! 3517: \setbox0=\hbox{\itemindicate{#1}}% ! 3518: \itemindex{#1}% ! 3519: \nobreak % This prevents a break before @itemx. ! 3520: % ! 3521: % If the item text does not fit in the space we have, put it on a line ! 3522: % by itself, and do not allow a page break either before or after that ! 3523: % line. We do not start a paragraph here because then if the next ! 3524: % command is, e.g., @kindex, the whatsit would get put into the ! 3525: % horizontal list on a line by itself, resulting in extra blank space. ! 3526: \ifdim \wd0>\itemmax ! 3527: % ! 3528: % Make this a paragraph so we get the \parskip glue and wrapping, ! 3529: % but leave it ragged-right. ! 3530: \begingroup ! 3531: \advance\leftskip by-\tableindent ! 3532: \advance\hsize by\tableindent ! 3533: \advance\rightskip by0pt plus1fil\relax ! 3534: \leavevmode\unhbox0\par ! 3535: \endgroup ! 3536: % ! 3537: % We're going to be starting a paragraph, but we don't want the ! 3538: % \parskip glue -- logically it's part of the @item we just started. ! 3539: \nobreak \vskip-\parskip ! 3540: % ! 3541: % Stop a page break at the \parskip glue coming up. However, if ! 3542: % what follows is an environment such as @example, there will be no ! 3543: % \parskip glue; then the negative vskip we just inserted would ! 3544: % cause the example and the item to crash together. So we use this ! 3545: % bizarre value of 10001 as a signal to \aboveenvbreak to insert ! 3546: % \parskip glue after all. Section titles are handled this way also. ! 3547: % ! 3548: \penalty 10001 ! 3549: \endgroup ! 3550: \itemxneedsnegativevskipfalse ! 3551: \else ! 3552: % The item text fits into the space. Start a paragraph, so that the ! 3553: % following text (if any) will end up on the same line. ! 3554: \noindent ! 3555: % Do this with kerns and \unhbox so that if there is a footnote in ! 3556: % the item text, it can migrate to the main vertical list and ! 3557: % eventually be printed. ! 3558: \nobreak\kern-\tableindent ! 3559: \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0 ! 3560: \unhbox0 ! 3561: \nobreak\kern\dimen0 ! 3562: \endgroup ! 3563: \itemxneedsnegativevskiptrue ! 3564: \fi ! 3565: } ! 3566: ! 3567: \def\item{\errmessage{@item while not in a list environment}} ! 3568: \def\itemx{\errmessage{@itemx while not in a list environment}} ! 3569: ! 3570: % @table, @ftable, @vtable. ! 3571: \envdef\table{% ! 3572: \let\itemindex\gobble ! 3573: \tablecheck{table}% ! 3574: } ! 3575: \envdef\ftable{% ! 3576: \def\itemindex ##1{\doind {fn}{\code{##1}}}% ! 3577: \tablecheck{ftable}% ! 3578: } ! 3579: \envdef\vtable{% ! 3580: \def\itemindex ##1{\doind {vr}{\code{##1}}}% ! 3581: \tablecheck{vtable}% ! 3582: } ! 3583: \def\tablecheck#1{% ! 3584: \ifnum \the\catcode`\^^M=\active ! 3585: \endgroup ! 3586: \errmessage{This command won't work in this context; perhaps the problem is ! 3587: that we are \inenvironment\thisenv}% ! 3588: \def\next{\doignore{#1}}% ! 3589: \else ! 3590: \let\next\tablex ! 3591: \fi ! 3592: \next ! 3593: } ! 3594: \def\tablex#1{% ! 3595: \def\itemindicate{#1}% ! 3596: \parsearg\tabley ! 3597: } ! 3598: \def\tabley#1{% ! 3599: {% ! 3600: \makevalueexpandable ! 3601: \edef\temp{\noexpand\tablez #1\space\space\space}% ! 3602: \expandafter ! 3603: }\temp \endtablez ! 3604: } ! 3605: \def\tablez #1 #2 #3 #4\endtablez{% ! 3606: \aboveenvbreak ! 3607: \ifnum 0#1>0 \advance \leftskip by #1\mil \fi ! 3608: \ifnum 0#2>0 \tableindent=#2\mil \fi ! 3609: \ifnum 0#3>0 \advance \rightskip by #3\mil \fi ! 3610: \itemmax=\tableindent ! 3611: \advance \itemmax by -\itemmargin ! 3612: \advance \leftskip by \tableindent ! 3613: \exdentamount=\tableindent ! 3614: \parindent = 0pt ! 3615: \parskip = \smallskipamount ! 3616: \ifdim \parskip=0pt \parskip=2pt \fi ! 3617: \let\item = \internalBitem ! 3618: \let\itemx = \internalBitemx ! 3619: } ! 3620: \def\Etable{\endgraf\afterenvbreak} ! 3621: \let\Eftable\Etable ! 3622: \let\Evtable\Etable ! 3623: \let\Eitemize\Etable ! 3624: \let\Eenumerate\Etable ! 3625: ! 3626: % This is the counter used by @enumerate, which is really @itemize ! 3627: ! 3628: \newcount \itemno ! 3629: ! 3630: \envdef\itemize{\parsearg\doitemize} ! 3631: ! 3632: \def\doitemize#1{% ! 3633: \aboveenvbreak ! 3634: \itemmax=\itemindent ! 3635: \advance\itemmax by -\itemmargin ! 3636: \advance\leftskip by \itemindent ! 3637: \exdentamount=\itemindent ! 3638: \parindent=0pt ! 3639: \parskip=\smallskipamount ! 3640: \ifdim\parskip=0pt \parskip=2pt \fi ! 3641: % ! 3642: % Try typesetting the item mark that if the document erroneously says ! 3643: % something like @itemize @samp (intending @table), there's an error ! 3644: % right away at the @itemize. It's not the best error message in the ! 3645: % world, but it's better than leaving it to the @item. This means if ! 3646: % the user wants an empty mark, they have to say @w{} not just @w. ! 3647: \def\itemcontents{#1}% ! 3648: \setbox0 = \hbox{\itemcontents}% ! 3649: % ! 3650: % @itemize with no arg is equivalent to @itemize @bullet. ! 3651: \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi ! 3652: % ! 3653: \let\item=\itemizeitem ! 3654: } ! 3655: ! 3656: % Definition of @item while inside @itemize and @enumerate. ! 3657: % ! 3658: \def\itemizeitem{% ! 3659: \advance\itemno by 1 % for enumerations ! 3660: {\let\par=\endgraf \smallbreak}% reasonable place to break ! 3661: {% ! 3662: % If the document has an @itemize directly after a section title, a ! 3663: % \nobreak will be last on the list, and \sectionheading will have ! 3664: % done a \vskip-\parskip. In that case, we don't want to zero ! 3665: % parskip, or the item text will crash with the heading. On the ! 3666: % other hand, when there is normal text preceding the item (as there ! 3667: % usually is), we do want to zero parskip, or there would be too much ! 3668: % space. In that case, we won't have a \nobreak before. At least ! 3669: % that's the theory. ! 3670: \ifnum\lastpenalty<10000 \parskip=0in \fi ! 3671: \noindent ! 3672: \hbox to 0pt{\hss \itemcontents \kern\itemmargin}% ! 3673: % ! 3674: \vadjust{\penalty 1200}}% not good to break after first line of item. ! 3675: \flushcr ! 3676: } ! 3677: ! 3678: % \splitoff TOKENS\endmark defines \first to be the first token in ! 3679: % TOKENS, and \rest to be the remainder. ! 3680: % ! 3681: \def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}% ! 3682: ! 3683: % Allow an optional argument of an uppercase letter, lowercase letter, ! 3684: % or number, to specify the first label in the enumerated list. No ! 3685: % argument is the same as `1'. ! 3686: % ! 3687: \envparseargdef\enumerate{\enumeratey #1 \endenumeratey} ! 3688: \def\enumeratey #1 #2\endenumeratey{% ! 3689: % If we were given no argument, pretend we were given `1'. ! 3690: \def\thearg{#1}% ! 3691: \ifx\thearg\empty \def\thearg{1}\fi ! 3692: % ! 3693: % Detect if the argument is a single token. If so, it might be a ! 3694: % letter. Otherwise, the only valid thing it can be is a number. ! 3695: % (We will always have one token, because of the test we just made. ! 3696: % This is a good thing, since \splitoff doesn't work given nothing at ! 3697: % all -- the first parameter is undelimited.) ! 3698: \expandafter\splitoff\thearg\endmark ! 3699: \ifx\rest\empty ! 3700: % Only one token in the argument. It could still be anything. ! 3701: % A ``lowercase letter'' is one whose \lccode is nonzero. ! 3702: % An ``uppercase letter'' is one whose \lccode is both nonzero, and ! 3703: % not equal to itself. ! 3704: % Otherwise, we assume it's a number. ! 3705: % ! 3706: % We need the \relax at the end of the \ifnum lines to stop TeX from ! 3707: % continuing to look for a <number>. ! 3708: % ! 3709: \ifnum\lccode\expandafter`\thearg=0\relax ! 3710: \numericenumerate % a number (we hope) ! 3711: \else ! 3712: % It's a letter. ! 3713: \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax ! 3714: \lowercaseenumerate % lowercase letter ! 3715: \else ! 3716: \uppercaseenumerate % uppercase letter ! 3717: \fi ! 3718: \fi ! 3719: \else ! 3720: % Multiple tokens in the argument. We hope it's a number. ! 3721: \numericenumerate ! 3722: \fi ! 3723: } ! 3724: ! 3725: % An @enumerate whose labels are integers. The starting integer is ! 3726: % given in \thearg. ! 3727: % ! 3728: \def\numericenumerate{% ! 3729: \itemno = \thearg ! 3730: \startenumeration{\the\itemno}% ! 3731: } ! 3732: ! 3733: % The starting (lowercase) letter is in \thearg. ! 3734: \def\lowercaseenumerate{% ! 3735: \itemno = \expandafter`\thearg ! 3736: \startenumeration{% ! 3737: % Be sure we're not beyond the end of the alphabet. ! 3738: \ifnum\itemno=0 ! 3739: \errmessage{No more lowercase letters in @enumerate; get a bigger ! 3740: alphabet}% ! 3741: \fi ! 3742: \char\lccode\itemno ! 3743: }% ! 3744: } ! 3745: ! 3746: % The starting (uppercase) letter is in \thearg. ! 3747: \def\uppercaseenumerate{% ! 3748: \itemno = \expandafter`\thearg ! 3749: \startenumeration{% ! 3750: % Be sure we're not beyond the end of the alphabet. ! 3751: \ifnum\itemno=0 ! 3752: \errmessage{No more uppercase letters in @enumerate; get a bigger ! 3753: alphabet} ! 3754: \fi ! 3755: \char\uccode\itemno ! 3756: }% ! 3757: } ! 3758: ! 3759: % Call \doitemize, adding a period to the first argument and supplying the ! 3760: % common last two arguments. Also subtract one from the initial value in ! 3761: % \itemno, since @item increments \itemno. ! 3762: % ! 3763: \def\startenumeration#1{% ! 3764: \advance\itemno by -1 ! 3765: \doitemize{#1.}\flushcr ! 3766: } ! 3767: ! 3768: % @alphaenumerate and @capsenumerate are abbreviations for giving an arg ! 3769: % to @enumerate. ! 3770: % ! 3771: \def\alphaenumerate{\enumerate{a}} ! 3772: \def\capsenumerate{\enumerate{A}} ! 3773: \def\Ealphaenumerate{\Eenumerate} ! 3774: \def\Ecapsenumerate{\Eenumerate} ! 3775: ! 3776: ! 3777: % @multitable macros ! 3778: % Amy Hendrickson, 8/18/94, 3/6/96 ! 3779: % ! 3780: % @multitable ... @end multitable will make as many columns as desired. ! 3781: % Contents of each column will wrap at width given in preamble. Width ! 3782: % can be specified either with sample text given in a template line, ! 3783: % or in percent of \hsize, the current width of text on page. ! 3784: ! 3785: % Table can continue over pages but will only break between lines. ! 3786: ! 3787: % To make preamble: ! 3788: % ! 3789: % Either define widths of columns in terms of percent of \hsize: ! 3790: % @multitable @columnfractions .25 .3 .45 ! 3791: % @item ... ! 3792: % ! 3793: % Numbers following @columnfractions are the percent of the total ! 3794: % current hsize to be used for each column. You may use as many ! 3795: % columns as desired. ! 3796: ! 3797: ! 3798: % Or use a template: ! 3799: % @multitable {Column 1 template} {Column 2 template} {Column 3 template} ! 3800: % @item ... ! 3801: % using the widest term desired in each column. ! 3802: ! 3803: % Each new table line starts with @item, each subsequent new column ! 3804: % starts with @tab. Empty columns may be produced by supplying @tab's ! 3805: % with nothing between them for as many times as empty columns are needed, ! 3806: % ie, @tab@tab@tab will produce two empty columns. ! 3807: ! 3808: % @item, @tab do not need to be on their own lines, but it will not hurt ! 3809: % if they are. ! 3810: ! 3811: % Sample multitable: ! 3812: ! 3813: % @multitable {Column 1 template} {Column 2 template} {Column 3 template} ! 3814: % @item first col stuff @tab second col stuff @tab third col ! 3815: % @item ! 3816: % first col stuff ! 3817: % @tab ! 3818: % second col stuff ! 3819: % @tab ! 3820: % third col ! 3821: % @item first col stuff @tab second col stuff ! 3822: % @tab Many paragraphs of text may be used in any column. ! 3823: % ! 3824: % They will wrap at the width determined by the template. ! 3825: % @item@tab@tab This will be in third column. ! 3826: % @end multitable ! 3827: ! 3828: % Default dimensions may be reset by user. ! 3829: % @multitableparskip is vertical space between paragraphs in table. ! 3830: % @multitableparindent is paragraph indent in table. ! 3831: % @multitablecolmargin is horizontal space to be left between columns. ! 3832: % @multitablelinespace is space to leave between table items, baseline ! 3833: % to baseline. ! 3834: % 0pt means it depends on current normal line spacing. ! 3835: % ! 3836: \newskip\multitableparskip ! 3837: \newskip\multitableparindent ! 3838: \newdimen\multitablecolspace ! 3839: \newskip\multitablelinespace ! 3840: \multitableparskip=0pt ! 3841: \multitableparindent=6pt ! 3842: \multitablecolspace=12pt ! 3843: \multitablelinespace=0pt ! 3844: ! 3845: % Macros used to set up halign preamble: ! 3846: % ! 3847: \let\endsetuptable\relax ! 3848: \def\xendsetuptable{\endsetuptable} ! 3849: \let\columnfractions\relax ! 3850: \def\xcolumnfractions{\columnfractions} ! 3851: \newif\ifsetpercent ! 3852: ! 3853: % #1 is the @columnfraction, usually a decimal number like .5, but might ! 3854: % be just 1. We just use it, whatever it is. ! 3855: % ! 3856: \def\pickupwholefraction#1 {% ! 3857: \global\advance\colcount by 1 ! 3858: \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}% ! 3859: \setuptable ! 3860: } ! 3861: ! 3862: \newcount\colcount ! 3863: \def\setuptable#1{% ! 3864: \def\firstarg{#1}% ! 3865: \ifx\firstarg\xendsetuptable ! 3866: \let\go = \relax ! 3867: \else ! 3868: \ifx\firstarg\xcolumnfractions ! 3869: \global\setpercenttrue ! 3870: \else ! 3871: \ifsetpercent ! 3872: \let\go\pickupwholefraction ! 3873: \else ! 3874: \global\advance\colcount by 1 ! 3875: \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a ! 3876: % separator; typically that is always in the input, anyway. ! 3877: \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}% ! 3878: \fi ! 3879: \fi ! 3880: \ifx\go\pickupwholefraction ! 3881: % Put the argument back for the \pickupwholefraction call, so ! 3882: % we'll always have a period there to be parsed. ! 3883: \def\go{\pickupwholefraction#1}% ! 3884: \else ! 3885: \let\go = \setuptable ! 3886: \fi% ! 3887: \fi ! 3888: \go ! 3889: } ! 3890: ! 3891: % multitable-only commands. ! 3892: % ! 3893: % @headitem starts a heading row, which we typeset in bold. ! 3894: % Assignments have to be global since we are inside the implicit group ! 3895: % of an alignment entry. \everycr resets \everytab so we don't have to ! 3896: % undo it ourselves. ! 3897: \def\headitemfont{\b}% for people to use in the template row; not changeable ! 3898: \def\headitem{% ! 3899: \checkenv\multitable ! 3900: \crcr ! 3901: \global\everytab={\bf}% can't use \headitemfont since the parsing differs ! 3902: \the\everytab % for the first item ! 3903: }% ! 3904: % ! 3905: % A \tab used to include \hskip1sp. But then the space in a template ! 3906: % line is not enough. That is bad. So let's go back to just `&' until ! 3907: % we again encounter the problem the 1sp was intended to solve. ! 3908: % --karl, [email protected], 20apr99. ! 3909: \def\tab{\checkenv\multitable &\the\everytab}% ! 3910: ! 3911: % @multitable ... @end multitable definitions: ! 3912: % ! 3913: \newtoks\everytab % insert after every tab. ! 3914: % ! 3915: \envdef\multitable{% ! 3916: \vskip\parskip ! 3917: \startsavinginserts ! 3918: % ! 3919: % @item within a multitable starts a normal row. ! 3920: % We use \def instead of \let so that if one of the multitable entries ! 3921: % contains an @itemize, we don't choke on the \item (seen as \crcr aka ! 3922: % \endtemplate) expanding \doitemize. ! 3923: \def\item{\crcr}% ! 3924: % ! 3925: \tolerance=9500 ! 3926: \hbadness=9500 ! 3927: \setmultitablespacing ! 3928: \parskip=\multitableparskip ! 3929: \parindent=\multitableparindent ! 3930: \overfullrule=0pt ! 3931: \global\colcount=0 ! 3932: % ! 3933: \everycr = {% ! 3934: \noalign{% ! 3935: \global\everytab={}% ! 3936: \global\colcount=0 % Reset the column counter. ! 3937: % Check for saved footnotes, etc. ! 3938: \checkinserts ! 3939: % Keeps underfull box messages off when table breaks over pages. ! 3940: %\filbreak ! 3941: % Maybe so, but it also creates really weird page breaks when the ! 3942: % table breaks over pages. Wouldn't \vfil be better? Wait until the ! 3943: % problem manifests itself, so it can be fixed for real --karl. ! 3944: }% ! 3945: }% ! 3946: % ! 3947: \parsearg\domultitable ! 3948: } ! 3949: \def\domultitable#1{% ! 3950: % To parse everything between @multitable and @item: ! 3951: \setuptable#1 \endsetuptable ! 3952: % ! 3953: % This preamble sets up a generic column definition, which will ! 3954: % be used as many times as user calls for columns. ! 3955: % \vtop will set a single line and will also let text wrap and ! 3956: % continue for many paragraphs if desired. ! 3957: \halign\bgroup &% ! 3958: \global\advance\colcount by 1 ! 3959: \multistrut ! 3960: \vtop{% ! 3961: % Use the current \colcount to find the correct column width: ! 3962: \hsize=\expandafter\csname col\the\colcount\endcsname ! 3963: % ! 3964: % In order to keep entries from bumping into each other ! 3965: % we will add a \leftskip of \multitablecolspace to all columns after ! 3966: % the first one. ! 3967: % ! 3968: % If a template has been used, we will add \multitablecolspace ! 3969: % to the width of each template entry. ! 3970: % ! 3971: % If the user has set preamble in terms of percent of \hsize we will ! 3972: % use that dimension as the width of the column, and the \leftskip ! 3973: % will keep entries from bumping into each other. Table will start at ! 3974: % left margin and final column will justify at right margin. ! 3975: % ! 3976: % Make sure we don't inherit \rightskip from the outer environment. ! 3977: \rightskip=0pt ! 3978: \ifnum\colcount=1 ! 3979: % The first column will be indented with the surrounding text. ! 3980: \advance\hsize by\leftskip ! 3981: \else ! 3982: \ifsetpercent \else ! 3983: % If user has not set preamble in terms of percent of \hsize ! 3984: % we will advance \hsize by \multitablecolspace. ! 3985: \advance\hsize by \multitablecolspace ! 3986: \fi ! 3987: % In either case we will make \leftskip=\multitablecolspace: ! 3988: \leftskip=\multitablecolspace ! 3989: \fi ! 3990: % Ignoring space at the beginning and end avoids an occasional spurious ! 3991: % blank line, when TeX decides to break the line at the space before the ! 3992: % box from the multistrut, so the strut ends up on a line by itself. ! 3993: % For example: ! 3994: % @multitable @columnfractions .11 .89 ! 3995: % @item @code{#} ! 3996: % @tab Legal holiday which is valid in major parts of the whole country. ! 3997: % Is automatically provided with highlighting sequences respectively ! 3998: % marking characters. ! 3999: \noindent\ignorespaces##\unskip\multistrut ! 4000: }\cr ! 4001: } ! 4002: \def\Emultitable{% ! 4003: \crcr ! 4004: \egroup % end the \halign ! 4005: \global\setpercentfalse ! 4006: } ! 4007: ! 4008: \def\setmultitablespacing{% ! 4009: \def\multistrut{\strut}% just use the standard line spacing ! 4010: % ! 4011: % Compute \multitablelinespace (if not defined by user) for use in ! 4012: % \multitableparskip calculation. We used define \multistrut based on ! 4013: % this, but (ironically) that caused the spacing to be off. ! 4014: % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100. ! 4015: \ifdim\multitablelinespace=0pt ! 4016: \setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip ! 4017: \global\advance\multitablelinespace by-\ht0 ! 4018: \fi ! 4019: % Test to see if parskip is larger than space between lines of ! 4020: % table. If not, do nothing. ! 4021: % If so, set to same dimension as multitablelinespace. ! 4022: \ifdim\multitableparskip>\multitablelinespace ! 4023: \global\multitableparskip=\multitablelinespace ! 4024: \global\advance\multitableparskip-7pt % to keep parskip somewhat smaller ! 4025: % than skip between lines in the table. ! 4026: \fi% ! 4027: \ifdim\multitableparskip=0pt ! 4028: \global\multitableparskip=\multitablelinespace ! 4029: \global\advance\multitableparskip-7pt % to keep parskip somewhat smaller ! 4030: % than skip between lines in the table. ! 4031: \fi} ! 4032: ! 4033: ! 4034: \message{conditionals,} ! 4035: ! 4036: % @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext, ! 4037: % @ifnotxml always succeed. They currently do nothing; we don't ! 4038: % attempt to check whether the conditionals are properly nested. But we ! 4039: % have to remember that they are conditionals, so that @end doesn't ! 4040: % attempt to close an environment group. ! 4041: % ! 4042: \def\makecond#1{% ! 4043: \expandafter\let\csname #1\endcsname = \relax ! 4044: \expandafter\let\csname iscond.#1\endcsname = 1 ! 4045: } ! 4046: \makecond{iftex} ! 4047: \makecond{ifnotdocbook} ! 4048: \makecond{ifnothtml} ! 4049: \makecond{ifnotinfo} ! 4050: \makecond{ifnotplaintext} ! 4051: \makecond{ifnotxml} ! 4052: ! 4053: % Ignore @ignore, @ifhtml, @ifinfo, and the like. ! 4054: % ! 4055: \def\direntry{\doignore{direntry}} ! 4056: \def\documentdescription{\doignore{documentdescription}} ! 4057: \def\docbook{\doignore{docbook}} ! 4058: \def\html{\doignore{html}} ! 4059: \def\ifdocbook{\doignore{ifdocbook}} ! 4060: \def\ifhtml{\doignore{ifhtml}} ! 4061: \def\ifinfo{\doignore{ifinfo}} ! 4062: \def\ifnottex{\doignore{ifnottex}} ! 4063: \def\ifplaintext{\doignore{ifplaintext}} ! 4064: \def\ifxml{\doignore{ifxml}} ! 4065: \def\ignore{\doignore{ignore}} ! 4066: \def\menu{\doignore{menu}} ! 4067: \def\xml{\doignore{xml}} ! 4068: ! 4069: % Ignore text until a line `@end #1', keeping track of nested conditionals. ! 4070: % ! 4071: % A count to remember the depth of nesting. ! 4072: \newcount\doignorecount ! 4073: ! 4074: \def\doignore#1{\begingroup ! 4075: % Scan in ``verbatim'' mode: ! 4076: \obeylines ! 4077: \catcode`\@ = \other ! 4078: \catcode`\{ = \other ! 4079: \catcode`\} = \other ! 4080: % ! 4081: % Make sure that spaces turn into tokens that match what \doignoretext wants. ! 4082: \spaceisspace ! 4083: % ! 4084: % Count number of #1's that we've seen. ! 4085: \doignorecount = 0 ! 4086: % ! 4087: % Swallow text until we reach the matching `@end #1'. ! 4088: \dodoignore{#1}% ! 4089: } ! 4090: ! 4091: { \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source. ! 4092: \obeylines % ! 4093: % ! 4094: \gdef\dodoignore#1{% ! 4095: % #1 contains the command name as a string, e.g., `ifinfo'. ! 4096: % ! 4097: % Define a command to find the next `@end #1'. ! 4098: \long\def\doignoretext##1^^M@end #1{% ! 4099: \doignoretextyyy##1^^M@#1\_STOP_}% ! 4100: % ! 4101: % And this command to find another #1 command, at the beginning of a ! 4102: % line. (Otherwise, we would consider a line `@c @ifset', for ! 4103: % example, to count as an @ifset for nesting.) ! 4104: \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}% ! 4105: % ! 4106: % And now expand that command. ! 4107: \doignoretext ^^M% ! 4108: }% ! 4109: } ! 4110: ! 4111: \def\doignoreyyy#1{% ! 4112: \def\temp{#1}% ! 4113: \ifx\temp\empty % Nothing found. ! 4114: \let\next\doignoretextzzz ! 4115: \else % Found a nested condition, ... ! 4116: \advance\doignorecount by 1 ! 4117: \let\next\doignoretextyyy % ..., look for another. ! 4118: % If we're here, #1 ends with ^^M\ifinfo (for example). ! 4119: \fi ! 4120: \next #1% the token \_STOP_ is present just after this macro. ! 4121: } ! 4122: ! 4123: % We have to swallow the remaining "\_STOP_". ! 4124: % ! 4125: \def\doignoretextzzz#1{% ! 4126: \ifnum\doignorecount = 0 % We have just found the outermost @end. ! 4127: \let\next\enddoignore ! 4128: \else % Still inside a nested condition. ! 4129: \advance\doignorecount by -1 ! 4130: \let\next\doignoretext % Look for the next @end. ! 4131: \fi ! 4132: \next ! 4133: } ! 4134: ! 4135: % Finish off ignored text. ! 4136: { \obeylines% ! 4137: % Ignore anything after the last `@end #1'; this matters in verbatim ! 4138: % environments, where otherwise the newline after an ignored conditional ! 4139: % would result in a blank line in the output. ! 4140: \gdef\enddoignore#1^^M{\endgroup\ignorespaces}% ! 4141: } ! 4142: ! 4143: ! 4144: % @set VAR sets the variable VAR to an empty value. ! 4145: % @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE. ! 4146: % ! 4147: % Since we want to separate VAR from REST-OF-LINE (which might be ! 4148: % empty), we can't just use \parsearg; we have to insert a space of our ! 4149: % own to delimit the rest of the line, and then take it out again if we ! 4150: % didn't need it. ! 4151: % We rely on the fact that \parsearg sets \catcode`\ =10. ! 4152: % ! 4153: \parseargdef\set{\setyyy#1 \endsetyyy} ! 4154: \def\setyyy#1 #2\endsetyyy{% ! 4155: {% ! 4156: \makevalueexpandable ! 4157: \def\temp{#2}% ! 4158: \edef\next{\gdef\makecsname{SET#1}}% ! 4159: \ifx\temp\empty ! 4160: \next{}% ! 4161: \else ! 4162: \setzzz#2\endsetzzz ! 4163: \fi ! 4164: }% ! 4165: } ! 4166: % Remove the trailing space \setxxx inserted. ! 4167: \def\setzzz#1 \endsetzzz{\next{#1}} ! 4168: ! 4169: % @clear VAR clears (i.e., unsets) the variable VAR. ! 4170: % ! 4171: \parseargdef\clear{% ! 4172: {% ! 4173: \makevalueexpandable ! 4174: \global\expandafter\let\csname SET#1\endcsname=\relax ! 4175: }% ! 4176: } ! 4177: ! 4178: % @value{foo} gets the text saved in variable foo. ! 4179: \def\value{\begingroup\makevalueexpandable\valuexxx} ! 4180: \def\valuexxx#1{\expandablevalue{#1}\endgroup} ! 4181: { ! 4182: \catcode`\- = \active \catcode`\_ = \active ! 4183: % ! 4184: \gdef\makevalueexpandable{% ! 4185: \let\value = \expandablevalue ! 4186: % We don't want these characters active, ... ! 4187: \catcode`\-=\other \catcode`\_=\other ! 4188: % ..., but we might end up with active ones in the argument if ! 4189: % we're called from @code, as @code{@value{foo-bar_}}, though. ! 4190: % So \let them to their normal equivalents. ! 4191: \let-\normaldash \let_\normalunderscore ! 4192: } ! 4193: } ! 4194: ! 4195: % We have this subroutine so that we can handle at least some @value's ! 4196: % properly in indexes (we call \makevalueexpandable in \indexdummies). ! 4197: % The command has to be fully expandable (if the variable is set), since ! 4198: % the result winds up in the index file. This means that if the ! 4199: % variable's value contains other Texinfo commands, it's almost certain ! 4200: % it will fail (although perhaps we could fix that with sufficient work ! 4201: % to do a one-level expansion on the result, instead of complete). ! 4202: % ! 4203: \def\expandablevalue#1{% ! 4204: \expandafter\ifx\csname SET#1\endcsname\relax ! 4205: {[No value for ``#1'']}% ! 4206: \message{Variable `#1', used in @value, is not set.}% ! 4207: \else ! 4208: \csname SET#1\endcsname ! 4209: \fi ! 4210: } ! 4211: ! 4212: % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined ! 4213: % with @set. ! 4214: % ! 4215: % To get special treatment of `@end ifset,' call \makeond and the redefine. ! 4216: % ! 4217: \makecond{ifset} ! 4218: \def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}} ! 4219: \def\doifset#1#2{% ! 4220: {% ! 4221: \makevalueexpandable ! 4222: \let\next=\empty ! 4223: \expandafter\ifx\csname SET#2\endcsname\relax ! 4224: #1% If not set, redefine \next. ! 4225: \fi ! 4226: \expandafter ! 4227: }\next ! 4228: } ! 4229: \def\ifsetfail{\doignore{ifset}} ! 4230: ! 4231: % @ifclear VAR ... @end executes the `...' iff VAR has never been ! 4232: % defined with @set, or has been undefined with @clear. ! 4233: % ! 4234: % The `\else' inside the `\doifset' parameter is a trick to reuse the ! 4235: % above code: if the variable is not set, do nothing, if it is set, ! 4236: % then redefine \next to \ifclearfail. ! 4237: % ! 4238: \makecond{ifclear} ! 4239: \def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}} ! 4240: \def\ifclearfail{\doignore{ifclear}} ! 4241: ! 4242: % @ifcommandisdefined CMD ... @end executes the `...' if CMD (written ! 4243: % without the @) is in fact defined. We can only feasibly check at the ! 4244: % TeX level, so something like `mathcode' is going to considered ! 4245: % defined even though it is not a Texinfo command. ! 4246: % ! 4247: \makecond{ifcommanddefined} ! 4248: \def\ifcommanddefined{\parsearg{\doifcmddefined{\let\next=\ifcmddefinedfail}}} ! 4249: % ! 4250: \def\doifcmddefined#1#2{{% ! 4251: \makevalueexpandable ! 4252: \let\next=\empty ! 4253: \expandafter\ifx\csname #2\endcsname\relax ! 4254: #1% If not defined, \let\next as above. ! 4255: \fi ! 4256: \expandafter ! 4257: }\next ! 4258: } ! 4259: \def\ifcmddefinedfail{\doignore{ifcommanddefined}} ! 4260: ! 4261: % @ifcommandnotdefined CMD ... handled similar to @ifclear above. ! 4262: \makecond{ifcommandnotdefined} ! 4263: \def\ifcommandnotdefined{% ! 4264: \parsearg{\doifcmddefined{\else \let\next=\ifcmdnotdefinedfail}}} ! 4265: \def\ifcmdnotdefinedfail{\doignore{ifcommandnotdefined}} ! 4266: ! 4267: % Set the `txicommandconditionals' variable, so documents have a way to ! 4268: % test if the @ifcommand...defined conditionals are available. ! 4269: \set txicommandconditionals ! 4270: ! 4271: % @dircategory CATEGORY -- specify a category of the dir file ! 4272: % which this file should belong to. Ignore this in TeX. ! 4273: \let\dircategory=\comment ! 4274: ! 4275: % @defininfoenclose. ! 4276: \let\definfoenclose=\comment ! 4277: ! 4278: ! 4279: \message{indexing,} ! 4280: % Index generation facilities ! 4281: ! 4282: % Define \newwrite to be identical to plain tex's \newwrite ! 4283: % except not \outer, so it can be used within macros and \if's. ! 4284: \edef\newwrite{\makecsname{ptexnewwrite}} ! 4285: ! 4286: % \newindex {foo} defines an index named foo. ! 4287: % It automatically defines \fooindex such that ! 4288: % \fooindex ...rest of line... puts an entry in the index foo. ! 4289: % It also defines \fooindfile to be the number of the output channel for ! 4290: % the file that accumulates this index. The file's extension is foo. ! 4291: % The name of an index should be no more than 2 characters long ! 4292: % for the sake of vms. ! 4293: % ! 4294: \def\newindex#1{% ! 4295: \iflinks ! 4296: \expandafter\newwrite \csname#1indfile\endcsname ! 4297: \openout \csname#1indfile\endcsname \jobname.#1 % Open the file ! 4298: \fi ! 4299: \expandafter\xdef\csname#1index\endcsname{% % Define @#1index ! 4300: \noexpand\doindex{#1}} ! 4301: } ! 4302: ! 4303: % @defindex foo == \newindex{foo} ! 4304: % ! 4305: \def\defindex{\parsearg\newindex} ! 4306: ! 4307: % Define @defcodeindex, like @defindex except put all entries in @code. ! 4308: % ! 4309: \def\defcodeindex{\parsearg\newcodeindex} ! 4310: % ! 4311: \def\newcodeindex#1{% ! 4312: \iflinks ! 4313: \expandafter\newwrite \csname#1indfile\endcsname ! 4314: \openout \csname#1indfile\endcsname \jobname.#1 ! 4315: \fi ! 4316: \expandafter\xdef\csname#1index\endcsname{% ! 4317: \noexpand\docodeindex{#1}}% ! 4318: } ! 4319: ! 4320: ! 4321: % @synindex foo bar makes index foo feed into index bar. ! 4322: % Do this instead of @defindex foo if you don't want it as a separate index. ! 4323: % ! 4324: % @syncodeindex foo bar similar, but put all entries made for index foo ! 4325: % inside @code. ! 4326: % ! 4327: \def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}} ! 4328: \def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}} ! 4329: ! 4330: % #1 is \doindex or \docodeindex, #2 the index getting redefined (foo), ! 4331: % #3 the target index (bar). ! 4332: \def\dosynindex#1#2#3{% ! 4333: % Only do \closeout if we haven't already done it, else we'll end up ! 4334: % closing the target index. ! 4335: \expandafter \ifx\csname donesynindex#2\endcsname \relax ! 4336: % The \closeout helps reduce unnecessary open files; the limit on the ! 4337: % Acorn RISC OS is a mere 16 files. ! 4338: \expandafter\closeout\csname#2indfile\endcsname ! 4339: \expandafter\let\csname donesynindex#2\endcsname = 1 ! 4340: \fi ! 4341: % redefine \fooindfile: ! 4342: \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname ! 4343: \expandafter\let\csname#2indfile\endcsname=\temp ! 4344: % redefine \fooindex: ! 4345: \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}% ! 4346: } ! 4347: ! 4348: % Define \doindex, the driver for all \fooindex macros. ! 4349: % Argument #1 is generated by the calling \fooindex macro, ! 4350: % and it is "foo", the name of the index. ! 4351: ! 4352: % \doindex just uses \parsearg; it calls \doind for the actual work. ! 4353: % This is because \doind is more useful to call from other macros. ! 4354: ! 4355: % There is also \dosubind {index}{topic}{subtopic} ! 4356: % which makes an entry in a two-level index such as the operation index. ! 4357: ! 4358: \def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer} ! 4359: \def\singleindexer #1{\doind{\indexname}{#1}} ! 4360: ! 4361: % like the previous two, but they put @code around the argument. ! 4362: \def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} ! 4363: \def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} ! 4364: ! 4365: % Take care of Texinfo commands that can appear in an index entry. ! 4366: % Since there are some commands we want to expand, and others we don't, ! 4367: % we have to laboriously prevent expansion for those that we don't. ! 4368: % ! 4369: \def\indexdummies{% ! 4370: \escapechar = `\\ % use backslash in output files. ! 4371: \def\@{@}% change to @@ when we switch to @ as escape char in index files. ! 4372: \def\ {\realbackslash\space }% ! 4373: % ! 4374: % Need these unexpandable (because we define \tt as a dummy) ! 4375: % definitions when @{ or @} appear in index entry text. Also, more ! 4376: % complicated, when \tex is in effect and \{ is a \delimiter again. ! 4377: % We can't use \lbracecmd and \rbracecmd because texindex assumes ! 4378: % braces and backslashes are used only as delimiters. Perhaps we ! 4379: % should define @lbrace and @rbrace commands a la @comma. ! 4380: \def\{{{\tt\char123}}% ! 4381: \def\}{{\tt\char125}}% ! 4382: % ! 4383: % I don't entirely understand this, but when an index entry is ! 4384: % generated from a macro call, the \endinput which \scanmacro inserts ! 4385: % causes processing to be prematurely terminated. This is, ! 4386: % apparently, because \indexsorttmp is fully expanded, and \endinput ! 4387: % is an expandable command. The redefinition below makes \endinput ! 4388: % disappear altogether for that purpose -- although logging shows that ! 4389: % processing continues to some further point. On the other hand, it ! 4390: % seems \endinput does not hurt in the printed index arg, since that ! 4391: % is still getting written without apparent harm. ! 4392: % ! 4393: % Sample source (mac-idx3.tex, reported by Graham Percival to ! 4394: % help-texinfo, 22may06): ! 4395: % @macro funindex {WORD} ! 4396: % @findex xyz ! 4397: % @end macro ! 4398: % ... ! 4399: % @funindex commtest ! 4400: % ! 4401: % The above is not enough to reproduce the bug, but it gives the flavor. ! 4402: % ! 4403: % Sample whatsit resulting: ! 4404: % .@write3{\entry{xyz}{@folio }{@code {xyz@endinput }}} ! 4405: % ! 4406: % So: ! 4407: \let\endinput = \empty ! 4408: % ! 4409: % Do the redefinitions. ! 4410: \commondummies ! 4411: } ! 4412: ! 4413: % For the aux and toc files, @ is the escape character. So we want to ! 4414: % redefine everything using @ as the escape character (instead of ! 4415: % \realbackslash, still used for index files). When everything uses @, ! 4416: % this will be simpler. ! 4417: % ! 4418: \def\atdummies{% ! 4419: \def\@{@@}% ! 4420: \def\ {@ }% ! 4421: \let\{ = \lbraceatcmd ! 4422: \let\} = \rbraceatcmd ! 4423: % ! 4424: % Do the redefinitions. ! 4425: \commondummies ! 4426: \otherbackslash ! 4427: } ! 4428: ! 4429: % Called from \indexdummies and \atdummies. ! 4430: % ! 4431: \def\commondummies{% ! 4432: % ! 4433: % \definedummyword defines \#1 as \string\#1\space, thus effectively ! 4434: % preventing its expansion. This is used only for control words, ! 4435: % not control letters, because the \space would be incorrect for ! 4436: % control characters, but is needed to separate the control word ! 4437: % from whatever follows. ! 4438: % ! 4439: % For control letters, we have \definedummyletter, which omits the ! 4440: % space. ! 4441: % ! 4442: % These can be used both for control words that take an argument and ! 4443: % those that do not. If it is followed by {arg} in the input, then ! 4444: % that will dutifully get written to the index (or wherever). ! 4445: % ! 4446: \def\definedummyword ##1{\def##1{\string##1\space}}% ! 4447: \def\definedummyletter##1{\def##1{\string##1}}% ! 4448: \let\definedummyaccent\definedummyletter ! 4449: % ! 4450: \commondummiesnofonts ! 4451: % ! 4452: \definedummyletter\_% ! 4453: \definedummyletter\-% ! 4454: % ! 4455: % Non-English letters. ! 4456: \definedummyword\AA ! 4457: \definedummyword\AE ! 4458: \definedummyword\DH ! 4459: \definedummyword\L ! 4460: \definedummyword\O ! 4461: \definedummyword\OE ! 4462: \definedummyword\TH ! 4463: \definedummyword\aa ! 4464: \definedummyword\ae ! 4465: \definedummyword\dh ! 4466: \definedummyword\exclamdown ! 4467: \definedummyword\l ! 4468: \definedummyword\o ! 4469: \definedummyword\oe ! 4470: \definedummyword\ordf ! 4471: \definedummyword\ordm ! 4472: \definedummyword\questiondown ! 4473: \definedummyword\ss ! 4474: \definedummyword\th ! 4475: % ! 4476: % Although these internal commands shouldn't show up, sometimes they do. ! 4477: \definedummyword\bf ! 4478: \definedummyword\gtr ! 4479: \definedummyword\hat ! 4480: \definedummyword\less ! 4481: \definedummyword\sf ! 4482: \definedummyword\sl ! 4483: \definedummyword\tclose ! 4484: \definedummyword\tt ! 4485: % ! 4486: \definedummyword\LaTeX ! 4487: \definedummyword\TeX ! 4488: % ! 4489: % Assorted special characters. ! 4490: \definedummyword\arrow ! 4491: \definedummyword\bullet ! 4492: \definedummyword\comma ! 4493: \definedummyword\copyright ! 4494: \definedummyword\registeredsymbol ! 4495: \definedummyword\dots ! 4496: \definedummyword\enddots ! 4497: \definedummyword\entrybreak ! 4498: \definedummyword\equiv ! 4499: \definedummyword\error ! 4500: \definedummyword\euro ! 4501: \definedummyword\expansion ! 4502: \definedummyword\geq ! 4503: \definedummyword\guillemetleft ! 4504: \definedummyword\guillemetright ! 4505: \definedummyword\guilsinglleft ! 4506: \definedummyword\guilsinglright ! 4507: \definedummyword\lbracechar ! 4508: \definedummyword\leq ! 4509: \definedummyword\minus ! 4510: \definedummyword\ogonek ! 4511: \definedummyword\pounds ! 4512: \definedummyword\point ! 4513: \definedummyword\print ! 4514: \definedummyword\quotedblbase ! 4515: \definedummyword\quotedblleft ! 4516: \definedummyword\quotedblright ! 4517: \definedummyword\quoteleft ! 4518: \definedummyword\quoteright ! 4519: \definedummyword\quotesinglbase ! 4520: \definedummyword\rbracechar ! 4521: \definedummyword\result ! 4522: \definedummyword\textdegree ! 4523: % ! 4524: % We want to disable all macros so that they are not expanded by \write. ! 4525: \macrolist ! 4526: % ! 4527: \normalturnoffactive ! 4528: % ! 4529: % Handle some cases of @value -- where it does not contain any ! 4530: % (non-fully-expandable) commands. ! 4531: \makevalueexpandable ! 4532: } ! 4533: ! 4534: % \commondummiesnofonts: common to \commondummies and \indexnofonts. ! 4535: % ! 4536: \def\commondummiesnofonts{% ! 4537: % Control letters and accents. ! 4538: \definedummyletter\!% ! 4539: \definedummyaccent\"% ! 4540: \definedummyaccent\'% ! 4541: \definedummyletter\*% ! 4542: \definedummyaccent\,% ! 4543: \definedummyletter\.% ! 4544: \definedummyletter\/% ! 4545: \definedummyletter\:% ! 4546: \definedummyaccent\=% ! 4547: \definedummyletter\?% ! 4548: \definedummyaccent\^% ! 4549: \definedummyaccent\`% ! 4550: \definedummyaccent\~% ! 4551: \definedummyword\u ! 4552: \definedummyword\v ! 4553: \definedummyword\H ! 4554: \definedummyword\dotaccent ! 4555: \definedummyword\ogonek ! 4556: \definedummyword\ringaccent ! 4557: \definedummyword\tieaccent ! 4558: \definedummyword\ubaraccent ! 4559: \definedummyword\udotaccent ! 4560: \definedummyword\dotless ! 4561: % ! 4562: % Texinfo font commands. ! 4563: \definedummyword\b ! 4564: \definedummyword\i ! 4565: \definedummyword\r ! 4566: \definedummyword\sansserif ! 4567: \definedummyword\sc ! 4568: \definedummyword\slanted ! 4569: \definedummyword\t ! 4570: % ! 4571: % Commands that take arguments. ! 4572: \definedummyword\abbr ! 4573: \definedummyword\acronym ! 4574: \definedummyword\anchor ! 4575: \definedummyword\cite ! 4576: \definedummyword\code ! 4577: \definedummyword\command ! 4578: \definedummyword\dfn ! 4579: \definedummyword\dmn ! 4580: \definedummyword\email ! 4581: \definedummyword\emph ! 4582: \definedummyword\env ! 4583: \definedummyword\file ! 4584: \definedummyword\image ! 4585: \definedummyword\indicateurl ! 4586: \definedummyword\inforef ! 4587: \definedummyword\kbd ! 4588: \definedummyword\key ! 4589: \definedummyword\math ! 4590: \definedummyword\option ! 4591: \definedummyword\pxref ! 4592: \definedummyword\ref ! 4593: \definedummyword\samp ! 4594: \definedummyword\strong ! 4595: \definedummyword\tie ! 4596: \definedummyword\uref ! 4597: \definedummyword\url ! 4598: \definedummyword\var ! 4599: \definedummyword\verb ! 4600: \definedummyword\w ! 4601: \definedummyword\xref ! 4602: } ! 4603: ! 4604: % \indexnofonts is used when outputting the strings to sort the index ! 4605: % by, and when constructing control sequence names. It eliminates all ! 4606: % control sequences and just writes whatever the best ASCII sort string ! 4607: % would be for a given command (usually its argument). ! 4608: % ! 4609: \def\indexnofonts{% ! 4610: % Accent commands should become @asis. ! 4611: \def\definedummyaccent##1{\let##1\asis}% ! 4612: % We can just ignore other control letters. ! 4613: \def\definedummyletter##1{\let##1\empty}% ! 4614: % All control words become @asis by default; overrides below. ! 4615: \let\definedummyword\definedummyaccent ! 4616: % ! 4617: \commondummiesnofonts ! 4618: % ! 4619: % Don't no-op \tt, since it isn't a user-level command ! 4620: % and is used in the definitions of the active chars like <, >, |, etc. ! 4621: % Likewise with the other plain tex font commands. ! 4622: %\let\tt=\asis ! 4623: % ! 4624: \def\ { }% ! 4625: \def\@{@}% ! 4626: \def\_{\normalunderscore}% ! 4627: \def\-{}% @- shouldn't affect sorting ! 4628: % ! 4629: % Unfortunately, texindex is not prepared to handle braces in the ! 4630: % content at all. So for index sorting, we map @{ and @} to strings ! 4631: % starting with |, since that ASCII character is between ASCII { and }. ! 4632: \def\{{|a}% ! 4633: \def\lbracechar{|a}% ! 4634: % ! 4635: \def\}{|b}% ! 4636: \def\rbracechar{|b}% ! 4637: % ! 4638: % Non-English letters. ! 4639: \def\AA{AA}% ! 4640: \def\AE{AE}% ! 4641: \def\DH{DZZ}% ! 4642: \def\L{L}% ! 4643: \def\OE{OE}% ! 4644: \def\O{O}% ! 4645: \def\TH{ZZZ}% ! 4646: \def\aa{aa}% ! 4647: \def\ae{ae}% ! 4648: \def\dh{dzz}% ! 4649: \def\exclamdown{!}% ! 4650: \def\l{l}% ! 4651: \def\oe{oe}% ! 4652: \def\ordf{a}% ! 4653: \def\ordm{o}% ! 4654: \def\o{o}% ! 4655: \def\questiondown{?}% ! 4656: \def\ss{ss}% ! 4657: \def\th{zzz}% ! 4658: % ! 4659: \def\LaTeX{LaTeX}% ! 4660: \def\TeX{TeX}% ! 4661: % ! 4662: % Assorted special characters. ! 4663: % (The following {} will end up in the sort string, but that's ok.) ! 4664: \def\arrow{->}% ! 4665: \def\bullet{bullet}% ! 4666: \def\comma{,}% ! 4667: \def\copyright{copyright}% ! 4668: \def\dots{...}% ! 4669: \def\enddots{...}% ! 4670: \def\equiv{==}% ! 4671: \def\error{error}% ! 4672: \def\euro{euro}% ! 4673: \def\expansion{==>}% ! 4674: \def\geq{>=}% ! 4675: \def\guillemetleft{<<}% ! 4676: \def\guillemetright{>>}% ! 4677: \def\guilsinglleft{<}% ! 4678: \def\guilsinglright{>}% ! 4679: \def\leq{<=}% ! 4680: \def\minus{-}% ! 4681: \def\point{.}% ! 4682: \def\pounds{pounds}% ! 4683: \def\print{-|}% ! 4684: \def\quotedblbase{"}% ! 4685: \def\quotedblleft{"}% ! 4686: \def\quotedblright{"}% ! 4687: \def\quoteleft{`}% ! 4688: \def\quoteright{'}% ! 4689: \def\quotesinglbase{,}% ! 4690: \def\registeredsymbol{R}% ! 4691: \def\result{=>}% ! 4692: \def\textdegree{o}% ! 4693: % ! 4694: \expandafter\ifx\csname SETtxiindexlquoteignore\endcsname\relax ! 4695: \else \indexlquoteignore \fi ! 4696: % ! 4697: % We need to get rid of all macros, leaving only the arguments (if present). ! 4698: % Of course this is not nearly correct, but it is the best we can do for now. ! 4699: % makeinfo does not expand macros in the argument to @deffn, which ends up ! 4700: % writing an index entry, and texindex isn't prepared for an index sort entry ! 4701: % that starts with \. ! 4702: % ! 4703: % Since macro invocations are followed by braces, we can just redefine them ! 4704: % to take a single TeX argument. The case of a macro invocation that ! 4705: % goes to end-of-line is not handled. ! 4706: % ! 4707: \macrolist ! 4708: } ! 4709: ! 4710: % Undocumented (for FSFS 2nd ed.): @set txiindexlquoteignore makes us ! 4711: % ignore left quotes in the sort term. ! 4712: {\catcode`\`=\active ! 4713: \gdef\indexlquoteignore{\let`=\empty}} ! 4714: ! 4715: \let\indexbackslash=0 %overridden during \printindex. ! 4716: \let\SETmarginindex=\relax % put index entries in margin (undocumented)? ! 4717: ! 4718: % Most index entries go through here, but \dosubind is the general case. ! 4719: % #1 is the index name, #2 is the entry text. ! 4720: \def\doind#1#2{\dosubind{#1}{#2}{}} ! 4721: ! 4722: % Workhorse for all \fooindexes. ! 4723: % #1 is name of index, #2 is stuff to put there, #3 is subentry -- ! 4724: % empty if called from \doind, as we usually are (the main exception ! 4725: % is with most defuns, which call us directly). ! 4726: % ! 4727: \def\dosubind#1#2#3{% ! 4728: \iflinks ! 4729: {% ! 4730: % Store the main index entry text (including the third arg). ! 4731: \toks0 = {#2}% ! 4732: % If third arg is present, precede it with a space. ! 4733: \def\thirdarg{#3}% ! 4734: \ifx\thirdarg\empty \else ! 4735: \toks0 = \expandafter{\the\toks0 \space #3}% ! 4736: \fi ! 4737: % ! 4738: \edef\writeto{\csname#1indfile\endcsname}% ! 4739: % ! 4740: \safewhatsit\dosubindwrite ! 4741: }% ! 4742: \fi ! 4743: } ! 4744: ! 4745: % Write the entry in \toks0 to the index file: ! 4746: % ! 4747: \def\dosubindwrite{% ! 4748: % Put the index entry in the margin if desired. ! 4749: \ifx\SETmarginindex\relax\else ! 4750: \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}% ! 4751: \fi ! 4752: % ! 4753: % Remember, we are within a group. ! 4754: \indexdummies % Must do this here, since \bf, etc expand at this stage ! 4755: \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now ! 4756: % so it will be output as is; and it will print as backslash. ! 4757: % ! 4758: % Process the index entry with all font commands turned off, to ! 4759: % get the string to sort by. ! 4760: {\indexnofonts ! 4761: \edef\temp{\the\toks0}% need full expansion ! 4762: \xdef\indexsorttmp{\temp}% ! 4763: }% ! 4764: % ! 4765: % Set up the complete index entry, with both the sort key and ! 4766: % the original text, including any font commands. We write ! 4767: % three arguments to \entry to the .?? file (four in the ! 4768: % subentry case), texindex reduces to two when writing the .??s ! 4769: % sorted result. ! 4770: \edef\temp{% ! 4771: \write\writeto{% ! 4772: \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}% ! 4773: }% ! 4774: \temp ! 4775: } ! 4776: ! 4777: % Take care of unwanted page breaks/skips around a whatsit: ! 4778: % ! 4779: % If a skip is the last thing on the list now, preserve it ! 4780: % by backing up by \lastskip, doing the \write, then inserting ! 4781: % the skip again. Otherwise, the whatsit generated by the ! 4782: % \write or \pdfdest will make \lastskip zero. The result is that ! 4783: % sequences like this: ! 4784: % @end defun ! 4785: % @tindex whatever ! 4786: % @defun ... ! 4787: % will have extra space inserted, because the \medbreak in the ! 4788: % start of the @defun won't see the skip inserted by the @end of ! 4789: % the previous defun. ! 4790: % ! 4791: % But don't do any of this if we're not in vertical mode. We ! 4792: % don't want to do a \vskip and prematurely end a paragraph. ! 4793: % ! 4794: % Avoid page breaks due to these extra skips, too. ! 4795: % ! 4796: % But wait, there is a catch there: ! 4797: % We'll have to check whether \lastskip is zero skip. \ifdim is not ! 4798: % sufficient for this purpose, as it ignores stretch and shrink parts ! 4799: % of the skip. The only way seems to be to check the textual ! 4800: % representation of the skip. ! 4801: % ! 4802: % The following is almost like \def\zeroskipmacro{0.0pt} except that ! 4803: % the ``p'' and ``t'' characters have catcode \other, not 11 (letter). ! 4804: % ! 4805: \edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname} ! 4806: % ! 4807: \newskip\whatsitskip ! 4808: \newcount\whatsitpenalty ! 4809: % ! 4810: % ..., ready, GO: ! 4811: % ! 4812: \def\safewhatsit#1{\ifhmode ! 4813: #1% ! 4814: \else ! 4815: % \lastskip and \lastpenalty cannot both be nonzero simultaneously. ! 4816: \whatsitskip = \lastskip ! 4817: \edef\lastskipmacro{\the\lastskip}% ! 4818: \whatsitpenalty = \lastpenalty ! 4819: % ! 4820: % If \lastskip is nonzero, that means the last item was a ! 4821: % skip. And since a skip is discardable, that means this ! 4822: % -\whatsitskip glue we're inserting is preceded by a ! 4823: % non-discardable item, therefore it is not a potential ! 4824: % breakpoint, therefore no \nobreak needed. ! 4825: \ifx\lastskipmacro\zeroskipmacro ! 4826: \else ! 4827: \vskip-\whatsitskip ! 4828: \fi ! 4829: % ! 4830: #1% ! 4831: % ! 4832: \ifx\lastskipmacro\zeroskipmacro ! 4833: % If \lastskip was zero, perhaps the last item was a penalty, and ! 4834: % perhaps it was >=10000, e.g., a \nobreak. In that case, we want ! 4835: % to re-insert the same penalty (values >10000 are used for various ! 4836: % signals); since we just inserted a non-discardable item, any ! 4837: % following glue (such as a \parskip) would be a breakpoint. For example: ! 4838: % @deffn deffn-whatever ! 4839: % @vindex index-whatever ! 4840: % Description. ! 4841: % would allow a break between the index-whatever whatsit ! 4842: % and the "Description." paragraph. ! 4843: \ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi ! 4844: \else ! 4845: % On the other hand, if we had a nonzero \lastskip, ! 4846: % this make-up glue would be preceded by a non-discardable item ! 4847: % (the whatsit from the \write), so we must insert a \nobreak. ! 4848: \nobreak\vskip\whatsitskip ! 4849: \fi ! 4850: \fi} ! 4851: ! 4852: % The index entry written in the file actually looks like ! 4853: % \entry {sortstring}{page}{topic} ! 4854: % or ! 4855: % \entry {sortstring}{page}{topic}{subtopic} ! 4856: % The texindex program reads in these files and writes files ! 4857: % containing these kinds of lines: ! 4858: % \initial {c} ! 4859: % before the first topic whose initial is c ! 4860: % \entry {topic}{pagelist} ! 4861: % for a topic that is used without subtopics ! 4862: % \primary {topic} ! 4863: % for the beginning of a topic that is used with subtopics ! 4864: % \secondary {subtopic}{pagelist} ! 4865: % for each subtopic. ! 4866: ! 4867: % Define the user-accessible indexing commands ! 4868: % @findex, @vindex, @kindex, @cindex. ! 4869: ! 4870: \def\findex {\fnindex} ! 4871: \def\kindex {\kyindex} ! 4872: \def\cindex {\cpindex} ! 4873: \def\vindex {\vrindex} ! 4874: \def\tindex {\tpindex} ! 4875: \def\pindex {\pgindex} ! 4876: ! 4877: \def\cindexsub {\begingroup\obeylines\cindexsub} ! 4878: {\obeylines % ! 4879: \gdef\cindexsub "#1" #2^^M{\endgroup % ! 4880: \dosubind{cp}{#2}{#1}}} ! 4881: ! 4882: % Define the macros used in formatting output of the sorted index material. ! 4883: ! 4884: % @printindex causes a particular index (the ??s file) to get printed. ! 4885: % It does not print any chapter heading (usually an @unnumbered). ! 4886: % ! 4887: \parseargdef\printindex{\begingroup ! 4888: \dobreak \chapheadingskip{10000}% ! 4889: % ! 4890: \smallfonts \rm ! 4891: \tolerance = 9500 ! 4892: \plainfrenchspacing ! 4893: \everypar = {}% don't want the \kern\-parindent from indentation suppression. ! 4894: % ! 4895: % See if the index file exists and is nonempty. ! 4896: % Change catcode of @ here so that if the index file contains ! 4897: % \initial {@} ! 4898: % as its first line, TeX doesn't complain about mismatched braces ! 4899: % (because it thinks @} is a control sequence). ! 4900: \catcode`\@ = 11 ! 4901: \openin 1 \jobname.#1s ! 4902: \ifeof 1 ! 4903: % \enddoublecolumns gets confused if there is no text in the index, ! 4904: % and it loses the chapter title and the aux file entries for the ! 4905: % index. The easiest way to prevent this problem is to make sure ! 4906: % there is some text. ! 4907: \putwordIndexNonexistent ! 4908: \else ! 4909: % ! 4910: % If the index file exists but is empty, then \openin leaves \ifeof ! 4911: % false. We have to make TeX try to read something from the file, so ! 4912: % it can discover if there is anything in it. ! 4913: \read 1 to \temp ! 4914: \ifeof 1 ! 4915: \putwordIndexIsEmpty ! 4916: \else ! 4917: % Index files are almost Texinfo source, but we use \ as the escape ! 4918: % character. It would be better to use @, but that's too big a change ! 4919: % to make right now. ! 4920: \def\indexbackslash{\backslashcurfont}% ! 4921: \catcode`\\ = 0 ! 4922: \escapechar = `\\ ! 4923: \begindoublecolumns ! 4924: \input \jobname.#1s ! 4925: \enddoublecolumns ! 4926: \fi ! 4927: \fi ! 4928: \closein 1 ! 4929: \endgroup} ! 4930: ! 4931: % These macros are used by the sorted index file itself. ! 4932: % Change them to control the appearance of the index. ! 4933: ! 4934: \def\initial#1{{% ! 4935: % Some minor font changes for the special characters. ! 4936: \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt ! 4937: % ! 4938: % Remove any glue we may have, we'll be inserting our own. ! 4939: \removelastskip ! 4940: % ! 4941: % We like breaks before the index initials, so insert a bonus. ! 4942: \nobreak ! 4943: \vskip 0pt plus 3\baselineskip ! 4944: \penalty 0 ! 4945: \vskip 0pt plus -3\baselineskip ! 4946: % ! 4947: % Typeset the initial. Making this add up to a whole number of ! 4948: % baselineskips increases the chance of the dots lining up from column ! 4949: % to column. It still won't often be perfect, because of the stretch ! 4950: % we need before each entry, but it's better. ! 4951: % ! 4952: % No shrink because it confuses \balancecolumns. ! 4953: \vskip 1.67\baselineskip plus .5\baselineskip ! 4954: \leftline{\secbf #1}% ! 4955: % Do our best not to break after the initial. ! 4956: \nobreak ! 4957: \vskip .33\baselineskip plus .1\baselineskip ! 4958: }} ! 4959: ! 4960: % \entry typesets a paragraph consisting of the text (#1), dot leaders, and ! 4961: % then page number (#2) flushed to the right margin. It is used for index ! 4962: % and table of contents entries. The paragraph is indented by \leftskip. ! 4963: % ! 4964: % A straightforward implementation would start like this: ! 4965: % \def\entry#1#2{... ! 4966: % But this freezes the catcodes in the argument, and can cause problems to ! 4967: % @code, which sets - active. This problem was fixed by a kludge--- ! 4968: % ``-'' was active throughout whole index, but this isn't really right. ! 4969: % The right solution is to prevent \entry from swallowing the whole text. ! 4970: % --kasal, 21nov03 ! 4971: \def\entry{% ! 4972: \begingroup ! 4973: % ! 4974: % Start a new paragraph if necessary, so our assignments below can't ! 4975: % affect previous text. ! 4976: \par ! 4977: % ! 4978: % Do not fill out the last line with white space. ! 4979: \parfillskip = 0in ! 4980: % ! 4981: % No extra space above this paragraph. ! 4982: \parskip = 0in ! 4983: % ! 4984: % Do not prefer a separate line ending with a hyphen to fewer lines. ! 4985: \finalhyphendemerits = 0 ! 4986: % ! 4987: % \hangindent is only relevant when the entry text and page number ! 4988: % don't both fit on one line. In that case, bob suggests starting the ! 4989: % dots pretty far over on the line. Unfortunately, a large ! 4990: % indentation looks wrong when the entry text itself is broken across ! 4991: % lines. So we use a small indentation and put up with long leaders. ! 4992: % ! 4993: % \hangafter is reset to 1 (which is the value we want) at the start ! 4994: % of each paragraph, so we need not do anything with that. ! 4995: \hangindent = 2em ! 4996: % ! 4997: % When the entry text needs to be broken, just fill out the first line ! 4998: % with blank space. ! 4999: \rightskip = 0pt plus1fil ! 5000: % ! 5001: % A bit of stretch before each entry for the benefit of balancing ! 5002: % columns. ! 5003: \vskip 0pt plus1pt ! 5004: % ! 5005: % When reading the text of entry, convert explicit line breaks ! 5006: % from @* into spaces. The user might give these in long section ! 5007: % titles, for instance. ! 5008: \def\*{\unskip\space\ignorespaces}% ! 5009: \def\entrybreak{\hfil\break}% ! 5010: % ! 5011: % Swallow the left brace of the text (first parameter): ! 5012: \afterassignment\doentry ! 5013: \let\temp = ! 5014: } ! 5015: \def\entrybreak{\unskip\space\ignorespaces}% ! 5016: \def\doentry{% ! 5017: \bgroup % Instead of the swallowed brace. ! 5018: \noindent ! 5019: \aftergroup\finishentry ! 5020: % And now comes the text of the entry. ! 5021: } ! 5022: \def\finishentry#1{% ! 5023: % #1 is the page number. ! 5024: % ! 5025: % The following is kludged to not output a line of dots in the index if ! 5026: % there are no page numbers. The next person who breaks this will be ! 5027: % cursed by a Unix daemon. ! 5028: \setbox\boxA = \hbox{#1}% ! 5029: \ifdim\wd\boxA = 0pt ! 5030: \ % ! 5031: \else ! 5032: % ! 5033: % If we must, put the page number on a line of its own, and fill out ! 5034: % this line with blank space. (The \hfil is overwhelmed with the ! 5035: % fill leaders glue in \indexdotfill if the page number does fit.) ! 5036: \hfil\penalty50 ! 5037: \null\nobreak\indexdotfill % Have leaders before the page number. ! 5038: % ! 5039: % The `\ ' here is removed by the implicit \unskip that TeX does as ! 5040: % part of (the primitive) \par. Without it, a spurious underfull ! 5041: % \hbox ensues. ! 5042: \ifpdf ! 5043: \pdfgettoks#1.% ! 5044: \ \the\toksA ! 5045: \else ! 5046: \ #1% ! 5047: \fi ! 5048: \fi ! 5049: \par ! 5050: \endgroup ! 5051: } ! 5052: ! 5053: % Like plain.tex's \dotfill, except uses up at least 1 em. ! 5054: \def\indexdotfill{\cleaders ! 5055: \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1fill} ! 5056: ! 5057: \def\primary #1{\line{#1\hfil}} ! 5058: ! 5059: \newskip\secondaryindent \secondaryindent=0.5cm ! 5060: \def\secondary#1#2{{% ! 5061: \parfillskip=0in ! 5062: \parskip=0in ! 5063: \hangindent=1in ! 5064: \hangafter=1 ! 5065: \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill ! 5066: \ifpdf ! 5067: \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. ! 5068: \else ! 5069: #2 ! 5070: \fi ! 5071: \par ! 5072: }} ! 5073: ! 5074: % Define two-column mode, which we use to typeset indexes. ! 5075: % Adapted from the TeXbook, page 416, which is to say, ! 5076: % the manmac.tex format used to print the TeXbook itself. ! 5077: \catcode`\@=11 ! 5078: ! 5079: \newbox\partialpage ! 5080: \newdimen\doublecolumnhsize ! 5081: ! 5082: \def\begindoublecolumns{\begingroup % ended by \enddoublecolumns ! 5083: % Grab any single-column material above us. ! 5084: \output = {% ! 5085: % ! 5086: % Here is a possibility not foreseen in manmac: if we accumulate a ! 5087: % whole lot of material, we might end up calling this \output ! 5088: % routine twice in a row (see the doublecol-lose test, which is ! 5089: % essentially a couple of indexes with @setchapternewpage off). In ! 5090: % that case we just ship out what is in \partialpage with the normal ! 5091: % output routine. Generally, \partialpage will be empty when this ! 5092: % runs and this will be a no-op. See the indexspread.tex test case. ! 5093: \ifvoid\partialpage \else ! 5094: \onepageout{\pagecontents\partialpage}% ! 5095: \fi ! 5096: % ! 5097: \global\setbox\partialpage = \vbox{% ! 5098: % Unvbox the main output page. ! 5099: \unvbox\PAGE ! 5100: \kern-\topskip \kern\baselineskip ! 5101: }% ! 5102: }% ! 5103: \eject % run that output routine to set \partialpage ! 5104: % ! 5105: % Use the double-column output routine for subsequent pages. ! 5106: \output = {\doublecolumnout}% ! 5107: % ! 5108: % Change the page size parameters. We could do this once outside this ! 5109: % routine, in each of @smallbook, @afourpaper, and the default 8.5x11 ! 5110: % format, but then we repeat the same computation. Repeating a couple ! 5111: % of assignments once per index is clearly meaningless for the ! 5112: % execution time, so we may as well do it in one place. ! 5113: % ! 5114: % First we halve the line length, less a little for the gutter between ! 5115: % the columns. We compute the gutter based on the line length, so it ! 5116: % changes automatically with the paper format. The magic constant ! 5117: % below is chosen so that the gutter has the same value (well, +-<1pt) ! 5118: % as it did when we hard-coded it. ! 5119: % ! 5120: % We put the result in a separate register, \doublecolumhsize, so we ! 5121: % can restore it in \pagesofar, after \hsize itself has (potentially) ! 5122: % been clobbered. ! 5123: % ! 5124: \doublecolumnhsize = \hsize ! 5125: \advance\doublecolumnhsize by -.04154\hsize ! 5126: \divide\doublecolumnhsize by 2 ! 5127: \hsize = \doublecolumnhsize ! 5128: % ! 5129: % Double the \vsize as well. (We don't need a separate register here, ! 5130: % since nobody clobbers \vsize.) ! 5131: \vsize = 2\vsize ! 5132: } ! 5133: ! 5134: % The double-column output routine for all double-column pages except ! 5135: % the last. ! 5136: % ! 5137: \def\doublecolumnout{% ! 5138: \splittopskip=\topskip \splitmaxdepth=\maxdepth ! 5139: % Get the available space for the double columns -- the normal ! 5140: % (undoubled) page height minus any material left over from the ! 5141: % previous page. ! 5142: \dimen@ = \vsize ! 5143: \divide\dimen@ by 2 ! 5144: \advance\dimen@ by -\ht\partialpage ! 5145: % ! 5146: % box0 will be the left-hand column, box2 the right. ! 5147: \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ ! 5148: \onepageout\pagesofar ! 5149: \unvbox255 ! 5150: \penalty\outputpenalty ! 5151: } ! 5152: % ! 5153: % Re-output the contents of the output page -- any previous material, ! 5154: % followed by the two boxes we just split, in box0 and box2. ! 5155: \def\pagesofar{% ! 5156: \unvbox\partialpage ! 5157: % ! 5158: \hsize = \doublecolumnhsize ! 5159: \wd0=\hsize \wd2=\hsize ! 5160: \hbox to\pagewidth{\box0\hfil\box2}% ! 5161: } ! 5162: % ! 5163: % All done with double columns. ! 5164: \def\enddoublecolumns{% ! 5165: % The following penalty ensures that the page builder is exercised ! 5166: % _before_ we change the output routine. This is necessary in the ! 5167: % following situation: ! 5168: % ! 5169: % The last section of the index consists only of a single entry. ! 5170: % Before this section, \pagetotal is less than \pagegoal, so no ! 5171: % break occurs before the last section starts. However, the last ! 5172: % section, consisting of \initial and the single \entry, does not ! 5173: % fit on the page and has to be broken off. Without the following ! 5174: % penalty the page builder will not be exercised until \eject ! 5175: % below, and by that time we'll already have changed the output ! 5176: % routine to the \balancecolumns version, so the next-to-last ! 5177: % double-column page will be processed with \balancecolumns, which ! 5178: % is wrong: The two columns will go to the main vertical list, with ! 5179: % the broken-off section in the recent contributions. As soon as ! 5180: % the output routine finishes, TeX starts reconsidering the page ! 5181: % break. The two columns and the broken-off section both fit on the ! 5182: % page, because the two columns now take up only half of the page ! 5183: % goal. When TeX sees \eject from below which follows the final ! 5184: % section, it invokes the new output routine that we've set after ! 5185: % \balancecolumns below; \onepageout will try to fit the two columns ! 5186: % and the final section into the vbox of \pageheight (see ! 5187: % \pagebody), causing an overfull box. ! 5188: % ! 5189: % Note that glue won't work here, because glue does not exercise the ! 5190: % page builder, unlike penalties (see The TeXbook, pp. 280-281). ! 5191: \penalty0 ! 5192: % ! 5193: \output = {% ! 5194: % Split the last of the double-column material. Leave it on the ! 5195: % current page, no automatic page break. ! 5196: \balancecolumns ! 5197: % ! 5198: % If we end up splitting too much material for the current page, ! 5199: % though, there will be another page break right after this \output ! 5200: % invocation ends. Having called \balancecolumns once, we do not ! 5201: % want to call it again. Therefore, reset \output to its normal ! 5202: % definition right away. (We hope \balancecolumns will never be ! 5203: % called on to balance too much material, but if it is, this makes ! 5204: % the output somewhat more palatable.) ! 5205: \global\output = {\onepageout{\pagecontents\PAGE}}% ! 5206: }% ! 5207: \eject ! 5208: \endgroup % started in \begindoublecolumns ! 5209: % ! 5210: % \pagegoal was set to the doubled \vsize above, since we restarted ! 5211: % the current page. We're now back to normal single-column ! 5212: % typesetting, so reset \pagegoal to the normal \vsize (after the ! 5213: % \endgroup where \vsize got restored). ! 5214: \pagegoal = \vsize ! 5215: } ! 5216: % ! 5217: % Called at the end of the double column material. ! 5218: \def\balancecolumns{% ! 5219: \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120. ! 5220: \dimen@ = \ht0 ! 5221: \advance\dimen@ by \topskip ! 5222: \advance\dimen@ by-\baselineskip ! 5223: \divide\dimen@ by 2 % target to split to ! 5224: %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}% ! 5225: \splittopskip = \topskip ! 5226: % Loop until we get a decent breakpoint. ! 5227: {% ! 5228: \vbadness = 10000 ! 5229: \loop ! 5230: \global\setbox3 = \copy0 ! 5231: \global\setbox1 = \vsplit3 to \dimen@ ! 5232: \ifdim\ht3>\dimen@ ! 5233: \global\advance\dimen@ by 1pt ! 5234: \repeat ! 5235: }% ! 5236: %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}% ! 5237: \setbox0=\vbox to\dimen@{\unvbox1}% ! 5238: \setbox2=\vbox to\dimen@{\unvbox3}% ! 5239: % ! 5240: \pagesofar ! 5241: } ! 5242: \catcode`\@ = \other ! 5243: ! 5244: ! 5245: \message{sectioning,} ! 5246: % Chapters, sections, etc. ! 5247: ! 5248: % Let's start with @part. ! 5249: \outer\parseargdef\part{\partzzz{#1}} ! 5250: \def\partzzz#1{% ! 5251: \chapoddpage ! 5252: \null ! 5253: \vskip.3\vsize % move it down on the page a bit ! 5254: \begingroup ! 5255: \noindent \titlefonts\rmisbold #1\par % the text ! 5256: \let\lastnode=\empty % no node to associate with ! 5257: \writetocentry{part}{#1}{}% but put it in the toc ! 5258: \headingsoff % no headline or footline on the part page ! 5259: \chapoddpage ! 5260: \endgroup ! 5261: } ! 5262: ! 5263: % \unnumberedno is an oxymoron. But we count the unnumbered ! 5264: % sections so that we can refer to them unambiguously in the pdf ! 5265: % outlines by their "section number". We avoid collisions with chapter ! 5266: % numbers by starting them at 10000. (If a document ever has 10000 ! 5267: % chapters, we're in trouble anyway, I'm sure.) ! 5268: \newcount\unnumberedno \unnumberedno = 10000 ! 5269: \newcount\chapno ! 5270: \newcount\secno \secno=0 ! 5271: \newcount\subsecno \subsecno=0 ! 5272: \newcount\subsubsecno \subsubsecno=0 ! 5273: ! 5274: % This counter is funny since it counts through charcodes of letters A, B, ... ! 5275: \newcount\appendixno \appendixno = `\@ ! 5276: % ! 5277: % \def\appendixletter{\char\the\appendixno} ! 5278: % We do the following ugly conditional instead of the above simple ! 5279: % construct for the sake of pdftex, which needs the actual ! 5280: % letter in the expansion, not just typeset. ! 5281: % ! 5282: \def\appendixletter{% ! 5283: \ifnum\appendixno=`A A% ! 5284: \else\ifnum\appendixno=`B B% ! 5285: \else\ifnum\appendixno=`C C% ! 5286: \else\ifnum\appendixno=`D D% ! 5287: \else\ifnum\appendixno=`E E% ! 5288: \else\ifnum\appendixno=`F F% ! 5289: \else\ifnum\appendixno=`G G% ! 5290: \else\ifnum\appendixno=`H H% ! 5291: \else\ifnum\appendixno=`I I% ! 5292: \else\ifnum\appendixno=`J J% ! 5293: \else\ifnum\appendixno=`K K% ! 5294: \else\ifnum\appendixno=`L L% ! 5295: \else\ifnum\appendixno=`M M% ! 5296: \else\ifnum\appendixno=`N N% ! 5297: \else\ifnum\appendixno=`O O% ! 5298: \else\ifnum\appendixno=`P P% ! 5299: \else\ifnum\appendixno=`Q Q% ! 5300: \else\ifnum\appendixno=`R R% ! 5301: \else\ifnum\appendixno=`S S% ! 5302: \else\ifnum\appendixno=`T T% ! 5303: \else\ifnum\appendixno=`U U% ! 5304: \else\ifnum\appendixno=`V V% ! 5305: \else\ifnum\appendixno=`W W% ! 5306: \else\ifnum\appendixno=`X X% ! 5307: \else\ifnum\appendixno=`Y Y% ! 5308: \else\ifnum\appendixno=`Z Z% ! 5309: % The \the is necessary, despite appearances, because \appendixletter is ! 5310: % expanded while writing the .toc file. \char\appendixno is not ! 5311: % expandable, thus it is written literally, thus all appendixes come out ! 5312: % with the same letter (or @) in the toc without it. ! 5313: \else\char\the\appendixno ! 5314: \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi ! 5315: \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} ! 5316: ! 5317: % Each @chapter defines these (using marks) as the number+name, number ! 5318: % and name of the chapter. Page headings and footings can use ! 5319: % these. @section does likewise. ! 5320: \def\thischapter{} ! 5321: \def\thischapternum{} ! 5322: \def\thischaptername{} ! 5323: \def\thissection{} ! 5324: \def\thissectionnum{} ! 5325: \def\thissectionname{} ! 5326: ! 5327: \newcount\absseclevel % used to calculate proper heading level ! 5328: \newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count ! 5329: ! 5330: % @raisesections: treat @section as chapter, @subsection as section, etc. ! 5331: \def\raisesections{\global\advance\secbase by -1} ! 5332: \let\up=\raisesections % original BFox name ! 5333: ! 5334: % @lowersections: treat @chapter as section, @section as subsection, etc. ! 5335: \def\lowersections{\global\advance\secbase by 1} ! 5336: \let\down=\lowersections % original BFox name ! 5337: ! 5338: % we only have subsub. ! 5339: \chardef\maxseclevel = 3 ! 5340: % ! 5341: % A numbered section within an unnumbered changes to unnumbered too. ! 5342: % To achieve this, remember the "biggest" unnum. sec. we are currently in: ! 5343: \chardef\unnlevel = \maxseclevel ! 5344: % ! 5345: % Trace whether the current chapter is an appendix or not: ! 5346: % \chapheadtype is "N" or "A", unnumbered chapters are ignored. ! 5347: \def\chapheadtype{N} ! 5348: ! 5349: % Choose a heading macro ! 5350: % #1 is heading type ! 5351: % #2 is heading level ! 5352: % #3 is text for heading ! 5353: \def\genhead#1#2#3{% ! 5354: % Compute the abs. sec. level: ! 5355: \absseclevel=#2 ! 5356: \advance\absseclevel by \secbase ! 5357: % Make sure \absseclevel doesn't fall outside the range: ! 5358: \ifnum \absseclevel < 0 ! 5359: \absseclevel = 0 ! 5360: \else ! 5361: \ifnum \absseclevel > 3 ! 5362: \absseclevel = 3 ! 5363: \fi ! 5364: \fi ! 5365: % The heading type: ! 5366: \def\headtype{#1}% ! 5367: \if \headtype U% ! 5368: \ifnum \absseclevel < \unnlevel ! 5369: \chardef\unnlevel = \absseclevel ! 5370: \fi ! 5371: \else ! 5372: % Check for appendix sections: ! 5373: \ifnum \absseclevel = 0 ! 5374: \edef\chapheadtype{\headtype}% ! 5375: \else ! 5376: \if \headtype A\if \chapheadtype N% ! 5377: \errmessage{@appendix... within a non-appendix chapter}% ! 5378: \fi\fi ! 5379: \fi ! 5380: % Check for numbered within unnumbered: ! 5381: \ifnum \absseclevel > \unnlevel ! 5382: \def\headtype{U}% ! 5383: \else ! 5384: \chardef\unnlevel = 3 ! 5385: \fi ! 5386: \fi ! 5387: % Now print the heading: ! 5388: \if \headtype U% ! 5389: \ifcase\absseclevel ! 5390: \unnumberedzzz{#3}% ! 5391: \or \unnumberedseczzz{#3}% ! 5392: \or \unnumberedsubseczzz{#3}% ! 5393: \or \unnumberedsubsubseczzz{#3}% ! 5394: \fi ! 5395: \else ! 5396: \if \headtype A% ! 5397: \ifcase\absseclevel ! 5398: \appendixzzz{#3}% ! 5399: \or \appendixsectionzzz{#3}% ! 5400: \or \appendixsubseczzz{#3}% ! 5401: \or \appendixsubsubseczzz{#3}% ! 5402: \fi ! 5403: \else ! 5404: \ifcase\absseclevel ! 5405: \chapterzzz{#3}% ! 5406: \or \seczzz{#3}% ! 5407: \or \numberedsubseczzz{#3}% ! 5408: \or \numberedsubsubseczzz{#3}% ! 5409: \fi ! 5410: \fi ! 5411: \fi ! 5412: \suppressfirstparagraphindent ! 5413: } ! 5414: ! 5415: % an interface: ! 5416: \def\numhead{\genhead N} ! 5417: \def\apphead{\genhead A} ! 5418: \def\unnmhead{\genhead U} ! 5419: ! 5420: % @chapter, @appendix, @unnumbered. Increment top-level counter, reset ! 5421: % all lower-level sectioning counters to zero. ! 5422: % ! 5423: % Also set \chaplevelprefix, which we prepend to @float sequence numbers ! 5424: % (e.g., figures), q.v. By default (before any chapter), that is empty. ! 5425: \let\chaplevelprefix = \empty ! 5426: % ! 5427: \outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz ! 5428: \def\chapterzzz#1{% ! 5429: % section resetting is \global in case the chapter is in a group, such ! 5430: % as an @include file. ! 5431: \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 ! 5432: \global\advance\chapno by 1 ! 5433: % ! 5434: % Used for \float. ! 5435: \gdef\chaplevelprefix{\the\chapno.}% ! 5436: \resetallfloatnos ! 5437: % ! 5438: % \putwordChapter can contain complex things in translations. ! 5439: \toks0=\expandafter{\putwordChapter}% ! 5440: \message{\the\toks0 \space \the\chapno}% ! 5441: % ! 5442: % Write the actual heading. ! 5443: \chapmacro{#1}{Ynumbered}{\the\chapno}% ! 5444: % ! 5445: % So @section and the like are numbered underneath this chapter. ! 5446: \global\let\section = \numberedsec ! 5447: \global\let\subsection = \numberedsubsec ! 5448: \global\let\subsubsection = \numberedsubsubsec ! 5449: } ! 5450: ! 5451: \outer\parseargdef\appendix{\apphead0{#1}} % normally calls appendixzzz ! 5452: % ! 5453: \def\appendixzzz#1{% ! 5454: \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 ! 5455: \global\advance\appendixno by 1 ! 5456: \gdef\chaplevelprefix{\appendixletter.}% ! 5457: \resetallfloatnos ! 5458: % ! 5459: % \putwordAppendix can contain complex things in translations. ! 5460: \toks0=\expandafter{\putwordAppendix}% ! 5461: \message{\the\toks0 \space \appendixletter}% ! 5462: % ! 5463: \chapmacro{#1}{Yappendix}{\appendixletter}% ! 5464: % ! 5465: \global\let\section = \appendixsec ! 5466: \global\let\subsection = \appendixsubsec ! 5467: \global\let\subsubsection = \appendixsubsubsec ! 5468: } ! 5469: ! 5470: % normally unnmhead0 calls unnumberedzzz: ! 5471: \outer\parseargdef\unnumbered{\unnmhead0{#1}} ! 5472: \def\unnumberedzzz#1{% ! 5473: \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 ! 5474: \global\advance\unnumberedno by 1 ! 5475: % ! 5476: % Since an unnumbered has no number, no prefix for figures. ! 5477: \global\let\chaplevelprefix = \empty ! 5478: \resetallfloatnos ! 5479: % ! 5480: % This used to be simply \message{#1}, but TeX fully expands the ! 5481: % argument to \message. Therefore, if #1 contained @-commands, TeX ! 5482: % expanded them. For example, in `@unnumbered The @cite{Book}', TeX ! 5483: % expanded @cite (which turns out to cause errors because \cite is meant ! 5484: % to be executed, not expanded). ! 5485: % ! 5486: % Anyway, we don't want the fully-expanded definition of @cite to appear ! 5487: % as a result of the \message, we just want `@cite' itself. We use ! 5488: % \the<toks register> to achieve this: TeX expands \the<toks> only once, ! 5489: % simply yielding the contents of <toks register>. (We also do this for ! 5490: % the toc entries.) ! 5491: \toks0 = {#1}% ! 5492: \message{(\the\toks0)}% ! 5493: % ! 5494: \chapmacro{#1}{Ynothing}{\the\unnumberedno}% ! 5495: % ! 5496: \global\let\section = \unnumberedsec ! 5497: \global\let\subsection = \unnumberedsubsec ! 5498: \global\let\subsubsection = \unnumberedsubsubsec ! 5499: } ! 5500: ! 5501: % @centerchap is like @unnumbered, but the heading is centered. ! 5502: \outer\parseargdef\centerchap{% ! 5503: % Well, we could do the following in a group, but that would break ! 5504: % an assumption that \chapmacro is called at the outermost level. ! 5505: % Thus we are safer this way: --kasal, 24feb04 ! 5506: \let\centerparametersmaybe = \centerparameters ! 5507: \unnmhead0{#1}% ! 5508: \let\centerparametersmaybe = \relax ! 5509: } ! 5510: ! 5511: % @top is like @unnumbered. ! 5512: \let\top\unnumbered ! 5513: ! 5514: % Sections. ! 5515: % ! 5516: \outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz ! 5517: \def\seczzz#1{% ! 5518: \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 ! 5519: \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}% ! 5520: } ! 5521: ! 5522: % normally calls appendixsectionzzz: ! 5523: \outer\parseargdef\appendixsection{\apphead1{#1}} ! 5524: \def\appendixsectionzzz#1{% ! 5525: \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 ! 5526: \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}% ! 5527: } ! 5528: \let\appendixsec\appendixsection ! 5529: ! 5530: % normally calls unnumberedseczzz: ! 5531: \outer\parseargdef\unnumberedsec{\unnmhead1{#1}} ! 5532: \def\unnumberedseczzz#1{% ! 5533: \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 ! 5534: \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}% ! 5535: } ! 5536: ! 5537: % Subsections. ! 5538: % ! 5539: % normally calls numberedsubseczzz: ! 5540: \outer\parseargdef\numberedsubsec{\numhead2{#1}} ! 5541: \def\numberedsubseczzz#1{% ! 5542: \global\subsubsecno=0 \global\advance\subsecno by 1 ! 5543: \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}% ! 5544: } ! 5545: ! 5546: % normally calls appendixsubseczzz: ! 5547: \outer\parseargdef\appendixsubsec{\apphead2{#1}} ! 5548: \def\appendixsubseczzz#1{% ! 5549: \global\subsubsecno=0 \global\advance\subsecno by 1 ! 5550: \sectionheading{#1}{subsec}{Yappendix}% ! 5551: {\appendixletter.\the\secno.\the\subsecno}% ! 5552: } ! 5553: ! 5554: % normally calls unnumberedsubseczzz: ! 5555: \outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} ! 5556: \def\unnumberedsubseczzz#1{% ! 5557: \global\subsubsecno=0 \global\advance\subsecno by 1 ! 5558: \sectionheading{#1}{subsec}{Ynothing}% ! 5559: {\the\unnumberedno.\the\secno.\the\subsecno}% ! 5560: } ! 5561: ! 5562: % Subsubsections. ! 5563: % ! 5564: % normally numberedsubsubseczzz: ! 5565: \outer\parseargdef\numberedsubsubsec{\numhead3{#1}} ! 5566: \def\numberedsubsubseczzz#1{% ! 5567: \global\advance\subsubsecno by 1 ! 5568: \sectionheading{#1}{subsubsec}{Ynumbered}% ! 5569: {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}% ! 5570: } ! 5571: ! 5572: % normally appendixsubsubseczzz: ! 5573: \outer\parseargdef\appendixsubsubsec{\apphead3{#1}} ! 5574: \def\appendixsubsubseczzz#1{% ! 5575: \global\advance\subsubsecno by 1 ! 5576: \sectionheading{#1}{subsubsec}{Yappendix}% ! 5577: {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}% ! 5578: } ! 5579: ! 5580: % normally unnumberedsubsubseczzz: ! 5581: \outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} ! 5582: \def\unnumberedsubsubseczzz#1{% ! 5583: \global\advance\subsubsecno by 1 ! 5584: \sectionheading{#1}{subsubsec}{Ynothing}% ! 5585: {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}% ! 5586: } ! 5587: ! 5588: % These macros control what the section commands do, according ! 5589: % to what kind of chapter we are in (ordinary, appendix, or unnumbered). ! 5590: % Define them by default for a numbered chapter. ! 5591: \let\section = \numberedsec ! 5592: \let\subsection = \numberedsubsec ! 5593: \let\subsubsection = \numberedsubsubsec ! 5594: ! 5595: % Define @majorheading, @heading and @subheading ! 5596: ! 5597: \def\majorheading{% ! 5598: {\advance\chapheadingskip by 10pt \chapbreak }% ! 5599: \parsearg\chapheadingzzz ! 5600: } ! 5601: ! 5602: \def\chapheading{\chapbreak \parsearg\chapheadingzzz} ! 5603: \def\chapheadingzzz#1{% ! 5604: \vbox{\chapfonts \raggedtitlesettings #1\par}% ! 5605: \nobreak\bigskip \nobreak ! 5606: \suppressfirstparagraphindent ! 5607: } ! 5608: ! 5609: % @heading, @subheading, @subsubheading. ! 5610: \parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{} ! 5611: \suppressfirstparagraphindent} ! 5612: \parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{} ! 5613: \suppressfirstparagraphindent} ! 5614: \parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{} ! 5615: \suppressfirstparagraphindent} ! 5616: ! 5617: % These macros generate a chapter, section, etc. heading only ! 5618: % (including whitespace, linebreaking, etc. around it), ! 5619: % given all the information in convenient, parsed form. ! 5620: ! 5621: % Args are the skip and penalty (usually negative) ! 5622: \def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} ! 5623: ! 5624: % Parameter controlling skip before chapter headings (if needed) ! 5625: \newskip\chapheadingskip ! 5626: ! 5627: % Define plain chapter starts, and page on/off switching for it. ! 5628: \def\chapbreak{\dobreak \chapheadingskip {-4000}} ! 5629: \def\chappager{\par\vfill\supereject} ! 5630: % Because \domark is called before \chapoddpage, the filler page will ! 5631: % get the headings for the next chapter, which is wrong. But we don't ! 5632: % care -- we just disable all headings on the filler page. ! 5633: \def\chapoddpage{% ! 5634: \chappager ! 5635: \ifodd\pageno \else ! 5636: \begingroup ! 5637: \headingsoff ! 5638: \null ! 5639: \chappager ! 5640: \endgroup ! 5641: \fi ! 5642: } ! 5643: ! 5644: \def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} ! 5645: ! 5646: \def\CHAPPAGoff{% ! 5647: \global\let\contentsalignmacro = \chappager ! 5648: \global\let\pchapsepmacro=\chapbreak ! 5649: \global\let\pagealignmacro=\chappager} ! 5650: ! 5651: \def\CHAPPAGon{% ! 5652: \global\let\contentsalignmacro = \chappager ! 5653: \global\let\pchapsepmacro=\chappager ! 5654: \global\let\pagealignmacro=\chappager ! 5655: \global\def\HEADINGSon{\HEADINGSsingle}} ! 5656: ! 5657: \def\CHAPPAGodd{% ! 5658: \global\let\contentsalignmacro = \chapoddpage ! 5659: \global\let\pchapsepmacro=\chapoddpage ! 5660: \global\let\pagealignmacro=\chapoddpage ! 5661: \global\def\HEADINGSon{\HEADINGSdouble}} ! 5662: ! 5663: \CHAPPAGon ! 5664: ! 5665: % Chapter opening. ! 5666: % ! 5667: % #1 is the text, #2 is the section type (Ynumbered, Ynothing, ! 5668: % Yappendix, Yomitfromtoc), #3 the chapter number. ! 5669: % ! 5670: % To test against our argument. ! 5671: \def\Ynothingkeyword{Ynothing} ! 5672: \def\Yomitfromtockeyword{Yomitfromtoc} ! 5673: \def\Yappendixkeyword{Yappendix} ! 5674: % ! 5675: \def\chapmacro#1#2#3{% ! 5676: % Insert the first mark before the heading break (see notes for \domark). ! 5677: \let\prevchapterdefs=\lastchapterdefs ! 5678: \let\prevsectiondefs=\lastsectiondefs ! 5679: \gdef\lastsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}% ! 5680: \gdef\thissection{}}% ! 5681: % ! 5682: \def\temptype{#2}% ! 5683: \ifx\temptype\Ynothingkeyword ! 5684: \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% ! 5685: \gdef\thischapter{\thischaptername}}% ! 5686: \else\ifx\temptype\Yomitfromtockeyword ! 5687: \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% ! 5688: \gdef\thischapter{}}% ! 5689: \else\ifx\temptype\Yappendixkeyword ! 5690: \toks0={#1}% ! 5691: \xdef\lastchapterdefs{% ! 5692: \gdef\noexpand\thischaptername{\the\toks0}% ! 5693: \gdef\noexpand\thischapternum{\appendixletter}% ! 5694: % \noexpand\putwordAppendix avoids expanding indigestible ! 5695: % commands in some of the translations. ! 5696: \gdef\noexpand\thischapter{\noexpand\putwordAppendix{} ! 5697: \noexpand\thischapternum: ! 5698: \noexpand\thischaptername}% ! 5699: }% ! 5700: \else ! 5701: \toks0={#1}% ! 5702: \xdef\lastchapterdefs{% ! 5703: \gdef\noexpand\thischaptername{\the\toks0}% ! 5704: \gdef\noexpand\thischapternum{\the\chapno}% ! 5705: % \noexpand\putwordChapter avoids expanding indigestible ! 5706: % commands in some of the translations. ! 5707: \gdef\noexpand\thischapter{\noexpand\putwordChapter{} ! 5708: \noexpand\thischapternum: ! 5709: \noexpand\thischaptername}% ! 5710: }% ! 5711: \fi\fi\fi ! 5712: % ! 5713: % Output the mark. Pass it through \safewhatsit, to take care of ! 5714: % the preceding space. ! 5715: \safewhatsit\domark ! 5716: % ! 5717: % Insert the chapter heading break. ! 5718: \pchapsepmacro ! 5719: % ! 5720: % Now the second mark, after the heading break. No break points ! 5721: % between here and the heading. ! 5722: \let\prevchapterdefs=\lastchapterdefs ! 5723: \let\prevsectiondefs=\lastsectiondefs ! 5724: \domark ! 5725: % ! 5726: {% ! 5727: \chapfonts \rmisbold ! 5728: % ! 5729: % Have to define \lastsection before calling \donoderef, because the ! 5730: % xref code eventually uses it. On the other hand, it has to be called ! 5731: % after \pchapsepmacro, or the headline will change too soon. ! 5732: \gdef\lastsection{#1}% ! 5733: % ! 5734: % Only insert the separating space if we have a chapter/appendix ! 5735: % number, and don't print the unnumbered ``number''. ! 5736: \ifx\temptype\Ynothingkeyword ! 5737: \setbox0 = \hbox{}% ! 5738: \def\toctype{unnchap}% ! 5739: \else\ifx\temptype\Yomitfromtockeyword ! 5740: \setbox0 = \hbox{}% contents like unnumbered, but no toc entry ! 5741: \def\toctype{omit}% ! 5742: \else\ifx\temptype\Yappendixkeyword ! 5743: \setbox0 = \hbox{\putwordAppendix{} #3\enspace}% ! 5744: \def\toctype{app}% ! 5745: \else ! 5746: \setbox0 = \hbox{#3\enspace}% ! 5747: \def\toctype{numchap}% ! 5748: \fi\fi\fi ! 5749: % ! 5750: % Write the toc entry for this chapter. Must come before the ! 5751: % \donoderef, because we include the current node name in the toc ! 5752: % entry, and \donoderef resets it to empty. ! 5753: \writetocentry{\toctype}{#1}{#3}% ! 5754: % ! 5755: % For pdftex, we have to write out the node definition (aka, make ! 5756: % the pdfdest) after any page break, but before the actual text has ! 5757: % been typeset. If the destination for the pdf outline is after the ! 5758: % text, then jumping from the outline may wind up with the text not ! 5759: % being visible, for instance under high magnification. ! 5760: \donoderef{#2}% ! 5761: % ! 5762: % Typeset the actual heading. ! 5763: \nobreak % Avoid page breaks at the interline glue. ! 5764: \vbox{\raggedtitlesettings \hangindent=\wd0 \centerparametersmaybe ! 5765: \unhbox0 #1\par}% ! 5766: }% ! 5767: \nobreak\bigskip % no page break after a chapter title ! 5768: \nobreak ! 5769: } ! 5770: ! 5771: % @centerchap -- centered and unnumbered. ! 5772: \let\centerparametersmaybe = \relax ! 5773: \def\centerparameters{% ! 5774: \advance\rightskip by 3\rightskip ! 5775: \leftskip = \rightskip ! 5776: \parfillskip = 0pt ! 5777: } ! 5778: ! 5779: ! 5780: % I don't think this chapter style is supported any more, so I'm not ! 5781: % updating it with the new noderef stuff. We'll see. --karl, 11aug03. ! 5782: % ! 5783: \def\setchapterstyle #1 {\csname CHAPF#1\endcsname} ! 5784: % ! 5785: \def\unnchfopen #1{% ! 5786: \chapoddpage ! 5787: \vbox{\chapfonts \raggedtitlesettings #1\par}% ! 5788: \nobreak\bigskip\nobreak ! 5789: } ! 5790: \def\chfopen #1#2{\chapoddpage {\chapfonts ! 5791: \vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% ! 5792: \par\penalty 5000 % ! 5793: } ! 5794: \def\centerchfopen #1{% ! 5795: \chapoddpage ! 5796: \vbox{\chapfonts \raggedtitlesettings \hfill #1\hfill}% ! 5797: \nobreak\bigskip \nobreak ! 5798: } ! 5799: \def\CHAPFopen{% ! 5800: \global\let\chapmacro=\chfopen ! 5801: \global\let\centerchapmacro=\centerchfopen} ! 5802: ! 5803: ! 5804: % Section titles. These macros combine the section number parts and ! 5805: % call the generic \sectionheading to do the printing. ! 5806: % ! 5807: \newskip\secheadingskip ! 5808: \def\secheadingbreak{\dobreak \secheadingskip{-1000}} ! 5809: ! 5810: % Subsection titles. ! 5811: \newskip\subsecheadingskip ! 5812: \def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}} ! 5813: ! 5814: % Subsubsection titles. ! 5815: \def\subsubsecheadingskip{\subsecheadingskip} ! 5816: \def\subsubsecheadingbreak{\subsecheadingbreak} ! 5817: ! 5818: ! 5819: % Print any size, any type, section title. ! 5820: % ! 5821: % #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is ! 5822: % the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the ! 5823: % section number. ! 5824: % ! 5825: \def\seckeyword{sec} ! 5826: % ! 5827: \def\sectionheading#1#2#3#4{% ! 5828: {% ! 5829: \checkenv{}% should not be in an environment. ! 5830: % ! 5831: % Switch to the right set of fonts. ! 5832: \csname #2fonts\endcsname \rmisbold ! 5833: % ! 5834: \def\sectionlevel{#2}% ! 5835: \def\temptype{#3}% ! 5836: % ! 5837: % Insert first mark before the heading break (see notes for \domark). ! 5838: \let\prevsectiondefs=\lastsectiondefs ! 5839: \ifx\temptype\Ynothingkeyword ! 5840: \ifx\sectionlevel\seckeyword ! 5841: \gdef\lastsectiondefs{\gdef\thissectionname{#1}\gdef\thissectionnum{}% ! 5842: \gdef\thissection{\thissectionname}}% ! 5843: \fi ! 5844: \else\ifx\temptype\Yomitfromtockeyword ! 5845: % Don't redefine \thissection. ! 5846: \else\ifx\temptype\Yappendixkeyword ! 5847: \ifx\sectionlevel\seckeyword ! 5848: \toks0={#1}% ! 5849: \xdef\lastsectiondefs{% ! 5850: \gdef\noexpand\thissectionname{\the\toks0}% ! 5851: \gdef\noexpand\thissectionnum{#4}% ! 5852: % \noexpand\putwordSection avoids expanding indigestible ! 5853: % commands in some of the translations. ! 5854: \gdef\noexpand\thissection{\noexpand\putwordSection{} ! 5855: \noexpand\thissectionnum: ! 5856: \noexpand\thissectionname}% ! 5857: }% ! 5858: \fi ! 5859: \else ! 5860: \ifx\sectionlevel\seckeyword ! 5861: \toks0={#1}% ! 5862: \xdef\lastsectiondefs{% ! 5863: \gdef\noexpand\thissectionname{\the\toks0}% ! 5864: \gdef\noexpand\thissectionnum{#4}% ! 5865: % \noexpand\putwordSection avoids expanding indigestible ! 5866: % commands in some of the translations. ! 5867: \gdef\noexpand\thissection{\noexpand\putwordSection{} ! 5868: \noexpand\thissectionnum: ! 5869: \noexpand\thissectionname}% ! 5870: }% ! 5871: \fi ! 5872: \fi\fi\fi ! 5873: % ! 5874: % Go into vertical mode. Usually we'll already be there, but we ! 5875: % don't want the following whatsit to end up in a preceding paragraph ! 5876: % if the document didn't happen to have a blank line. ! 5877: \par ! 5878: % ! 5879: % Output the mark. Pass it through \safewhatsit, to take care of ! 5880: % the preceding space. ! 5881: \safewhatsit\domark ! 5882: % ! 5883: % Insert space above the heading. ! 5884: \csname #2headingbreak\endcsname ! 5885: % ! 5886: % Now the second mark, after the heading break. No break points ! 5887: % between here and the heading. ! 5888: \let\prevsectiondefs=\lastsectiondefs ! 5889: \domark ! 5890: % ! 5891: % Only insert the space after the number if we have a section number. ! 5892: \ifx\temptype\Ynothingkeyword ! 5893: \setbox0 = \hbox{}% ! 5894: \def\toctype{unn}% ! 5895: \gdef\lastsection{#1}% ! 5896: \else\ifx\temptype\Yomitfromtockeyword ! 5897: % for @headings -- no section number, don't include in toc, ! 5898: % and don't redefine \lastsection. ! 5899: \setbox0 = \hbox{}% ! 5900: \def\toctype{omit}% ! 5901: \let\sectionlevel=\empty ! 5902: \else\ifx\temptype\Yappendixkeyword ! 5903: \setbox0 = \hbox{#4\enspace}% ! 5904: \def\toctype{app}% ! 5905: \gdef\lastsection{#1}% ! 5906: \else ! 5907: \setbox0 = \hbox{#4\enspace}% ! 5908: \def\toctype{num}% ! 5909: \gdef\lastsection{#1}% ! 5910: \fi\fi\fi ! 5911: % ! 5912: % Write the toc entry (before \donoderef). See comments in \chapmacro. ! 5913: \writetocentry{\toctype\sectionlevel}{#1}{#4}% ! 5914: % ! 5915: % Write the node reference (= pdf destination for pdftex). ! 5916: % Again, see comments in \chapmacro. ! 5917: \donoderef{#3}% ! 5918: % ! 5919: % Interline glue will be inserted when the vbox is completed. ! 5920: % That glue will be a valid breakpoint for the page, since it'll be ! 5921: % preceded by a whatsit (usually from the \donoderef, or from the ! 5922: % \writetocentry if there was no node). We don't want to allow that ! 5923: % break, since then the whatsits could end up on page n while the ! 5924: % section is on page n+1, thus toc/etc. are wrong. Debian bug 276000. ! 5925: \nobreak ! 5926: % ! 5927: % Output the actual section heading. ! 5928: \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright ! 5929: \hangindent=\wd0 % zero if no section number ! 5930: \unhbox0 #1}% ! 5931: }% ! 5932: % Add extra space after the heading -- half of whatever came above it. ! 5933: % Don't allow stretch, though. ! 5934: \kern .5 \csname #2headingskip\endcsname ! 5935: % ! 5936: % Do not let the kern be a potential breakpoint, as it would be if it ! 5937: % was followed by glue. ! 5938: \nobreak ! 5939: % ! 5940: % We'll almost certainly start a paragraph next, so don't let that ! 5941: % glue accumulate. (Not a breakpoint because it's preceded by a ! 5942: % discardable item.) However, when a paragraph is not started next ! 5943: % (\startdefun, \cartouche, \center, etc.), this needs to be wiped out ! 5944: % or the negative glue will cause weirdly wrong output, typically ! 5945: % obscuring the section heading with something else. ! 5946: \vskip-\parskip ! 5947: % ! 5948: % This is so the last item on the main vertical list is a known ! 5949: % \penalty > 10000, so \startdefun, etc., can recognize the situation ! 5950: % and do the needful. ! 5951: \penalty 10001 ! 5952: } ! 5953: ! 5954: ! 5955: \message{toc,} ! 5956: % Table of contents. ! 5957: \newwrite\tocfile ! 5958: ! 5959: % Write an entry to the toc file, opening it if necessary. ! 5960: % Called from @chapter, etc. ! 5961: % ! 5962: % Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno} ! 5963: % We append the current node name (if any) and page number as additional ! 5964: % arguments for the \{chap,sec,...}entry macros which will eventually ! 5965: % read this. The node name is used in the pdf outlines as the ! 5966: % destination to jump to. ! 5967: % ! 5968: % We open the .toc file for writing here instead of at @setfilename (or ! 5969: % any other fixed time) so that @contents can be anywhere in the document. ! 5970: % But if #1 is `omit', then we don't do anything. This is used for the ! 5971: % table of contents chapter openings themselves. ! 5972: % ! 5973: \newif\iftocfileopened ! 5974: \def\omitkeyword{omit}% ! 5975: % ! 5976: \def\writetocentry#1#2#3{% ! 5977: \edef\writetoctype{#1}% ! 5978: \ifx\writetoctype\omitkeyword \else ! 5979: \iftocfileopened\else ! 5980: \immediate\openout\tocfile = \jobname.toc ! 5981: \global\tocfileopenedtrue ! 5982: \fi ! 5983: % ! 5984: \iflinks ! 5985: {\atdummies ! 5986: \edef\temp{% ! 5987: \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}% ! 5988: \temp ! 5989: }% ! 5990: \fi ! 5991: \fi ! 5992: % ! 5993: % Tell \shipout to create a pdf destination on each page, if we're ! 5994: % writing pdf. These are used in the table of contents. We can't ! 5995: % just write one on every page because the title pages are numbered ! 5996: % 1 and 2 (the page numbers aren't printed), and so are the first ! 5997: % two pages of the document. Thus, we'd have two destinations named ! 5998: % `1', and two named `2'. ! 5999: \ifpdf \global\pdfmakepagedesttrue \fi ! 6000: } ! 6001: ! 6002: ! 6003: % These characters do not print properly in the Computer Modern roman ! 6004: % fonts, so we must take special care. This is more or less redundant ! 6005: % with the Texinfo input format setup at the end of this file. ! 6006: % ! 6007: \def\activecatcodes{% ! 6008: \catcode`\"=\active ! 6009: \catcode`\$=\active ! 6010: \catcode`\<=\active ! 6011: \catcode`\>=\active ! 6012: \catcode`\\=\active ! 6013: \catcode`\^=\active ! 6014: \catcode`\_=\active ! 6015: \catcode`\|=\active ! 6016: \catcode`\~=\active ! 6017: } ! 6018: ! 6019: ! 6020: % Read the toc file, which is essentially Texinfo input. ! 6021: \def\readtocfile{% ! 6022: \setupdatafile ! 6023: \activecatcodes ! 6024: \input \tocreadfilename ! 6025: } ! 6026: ! 6027: \newskip\contentsrightmargin \contentsrightmargin=1in ! 6028: \newcount\savepageno ! 6029: \newcount\lastnegativepageno \lastnegativepageno = -1 ! 6030: ! 6031: % Prepare to read what we've written to \tocfile. ! 6032: % ! 6033: \def\startcontents#1{% ! 6034: % If @setchapternewpage on, and @headings double, the contents should ! 6035: % start on an odd page, unlike chapters. Thus, we maintain ! 6036: % \contentsalignmacro in parallel with \pagealignmacro. ! 6037: % From: Torbjorn Granlund <[email protected]> ! 6038: \contentsalignmacro ! 6039: \immediate\closeout\tocfile ! 6040: % ! 6041: % Don't need to put `Contents' or `Short Contents' in the headline. ! 6042: % It is abundantly clear what they are. ! 6043: \chapmacro{#1}{Yomitfromtoc}{}% ! 6044: % ! 6045: \savepageno = \pageno ! 6046: \begingroup % Set up to handle contents files properly. ! 6047: \raggedbottom % Worry more about breakpoints than the bottom. ! 6048: \advance\hsize by -\contentsrightmargin % Don't use the full line length. ! 6049: % ! 6050: % Roman numerals for page numbers. ! 6051: \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi ! 6052: } ! 6053: ! 6054: % redefined for the two-volume lispref. We always output on ! 6055: % \jobname.toc even if this is redefined. ! 6056: % ! 6057: \def\tocreadfilename{\jobname.toc} ! 6058: ! 6059: % Normal (long) toc. ! 6060: % ! 6061: \def\contents{% ! 6062: \startcontents{\putwordTOC}% ! 6063: \openin 1 \tocreadfilename\space ! 6064: \ifeof 1 \else ! 6065: \readtocfile ! 6066: \fi ! 6067: \vfill \eject ! 6068: \contentsalignmacro % in case @setchapternewpage odd is in effect ! 6069: \ifeof 1 \else ! 6070: \pdfmakeoutlines ! 6071: \fi ! 6072: \closein 1 ! 6073: \endgroup ! 6074: \lastnegativepageno = \pageno ! 6075: \global\pageno = \savepageno ! 6076: } ! 6077: ! 6078: % And just the chapters. ! 6079: \def\summarycontents{% ! 6080: \startcontents{\putwordShortTOC}% ! 6081: % ! 6082: \let\partentry = \shortpartentry ! 6083: \let\numchapentry = \shortchapentry ! 6084: \let\appentry = \shortchapentry ! 6085: \let\unnchapentry = \shortunnchapentry ! 6086: % We want a true roman here for the page numbers. ! 6087: \secfonts ! 6088: \let\rm=\shortcontrm \let\bf=\shortcontbf ! 6089: \let\sl=\shortcontsl \let\tt=\shortconttt ! 6090: \rm ! 6091: \hyphenpenalty = 10000 ! 6092: \advance\baselineskip by 1pt % Open it up a little. ! 6093: \def\numsecentry##1##2##3##4{} ! 6094: \let\appsecentry = \numsecentry ! 6095: \let\unnsecentry = \numsecentry ! 6096: \let\numsubsecentry = \numsecentry ! 6097: \let\appsubsecentry = \numsecentry ! 6098: \let\unnsubsecentry = \numsecentry ! 6099: \let\numsubsubsecentry = \numsecentry ! 6100: \let\appsubsubsecentry = \numsecentry ! 6101: \let\unnsubsubsecentry = \numsecentry ! 6102: \openin 1 \tocreadfilename\space ! 6103: \ifeof 1 \else ! 6104: \readtocfile ! 6105: \fi ! 6106: \closein 1 ! 6107: \vfill \eject ! 6108: \contentsalignmacro % in case @setchapternewpage odd is in effect ! 6109: \endgroup ! 6110: \lastnegativepageno = \pageno ! 6111: \global\pageno = \savepageno ! 6112: } ! 6113: \let\shortcontents = \summarycontents ! 6114: ! 6115: % Typeset the label for a chapter or appendix for the short contents. ! 6116: % The arg is, e.g., `A' for an appendix, or `3' for a chapter. ! 6117: % ! 6118: \def\shortchaplabel#1{% ! 6119: % This space should be enough, since a single number is .5em, and the ! 6120: % widest letter (M) is 1em, at least in the Computer Modern fonts. ! 6121: % But use \hss just in case. ! 6122: % (This space doesn't include the extra space that gets added after ! 6123: % the label; that gets put in by \shortchapentry above.) ! 6124: % ! 6125: % We'd like to right-justify chapter numbers, but that looks strange ! 6126: % with appendix letters. And right-justifying numbers and ! 6127: % left-justifying letters looks strange when there is less than 10 ! 6128: % chapters. Have to read the whole toc once to know how many chapters ! 6129: % there are before deciding ... ! 6130: \hbox to 1em{#1\hss}% ! 6131: } ! 6132: ! 6133: % These macros generate individual entries in the table of contents. ! 6134: % The first argument is the chapter or section name. ! 6135: % The last argument is the page number. ! 6136: % The arguments in between are the chapter number, section number, ... ! 6137: ! 6138: % Parts, in the main contents. Replace the part number, which doesn't ! 6139: % exist, with an empty box. Let's hope all the numbers have the same width. ! 6140: % Also ignore the page number, which is conventionally not printed. ! 6141: \def\numeralbox{\setbox0=\hbox{8}\hbox to \wd0{\hfil}} ! 6142: \def\partentry#1#2#3#4{\dochapentry{\numeralbox\labelspace#1}{}} ! 6143: % ! 6144: % Parts, in the short toc. ! 6145: \def\shortpartentry#1#2#3#4{% ! 6146: \penalty-300 ! 6147: \vskip.5\baselineskip plus.15\baselineskip minus.1\baselineskip ! 6148: \shortchapentry{{\bf #1}}{\numeralbox}{}{}% ! 6149: } ! 6150: ! 6151: % Chapters, in the main contents. ! 6152: \def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}} ! 6153: % ! 6154: % Chapters, in the short toc. ! 6155: % See comments in \dochapentry re vbox and related settings. ! 6156: \def\shortchapentry#1#2#3#4{% ! 6157: \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}% ! 6158: } ! 6159: ! 6160: % Appendices, in the main contents. ! 6161: % Need the word Appendix, and a fixed-size box. ! 6162: % ! 6163: \def\appendixbox#1{% ! 6164: % We use M since it's probably the widest letter. ! 6165: \setbox0 = \hbox{\putwordAppendix{} M}% ! 6166: \hbox to \wd0{\putwordAppendix{} #1\hss}} ! 6167: % ! 6168: \def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}} ! 6169: ! 6170: % Unnumbered chapters. ! 6171: \def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}} ! 6172: \def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}} ! 6173: ! 6174: % Sections. ! 6175: \def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}} ! 6176: \let\appsecentry=\numsecentry ! 6177: \def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}} ! 6178: ! 6179: % Subsections. ! 6180: \def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}} ! 6181: \let\appsubsecentry=\numsubsecentry ! 6182: \def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}} ! 6183: ! 6184: % And subsubsections. ! 6185: \def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}} ! 6186: \let\appsubsubsecentry=\numsubsubsecentry ! 6187: \def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}} ! 6188: ! 6189: % This parameter controls the indentation of the various levels. ! 6190: % Same as \defaultparindent. ! 6191: \newdimen\tocindent \tocindent = 15pt ! 6192: ! 6193: % Now for the actual typesetting. In all these, #1 is the text and #2 is the ! 6194: % page number. ! 6195: % ! 6196: % If the toc has to be broken over pages, we want it to be at chapters ! 6197: % if at all possible; hence the \penalty. ! 6198: \def\dochapentry#1#2{% ! 6199: \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip ! 6200: \begingroup ! 6201: \chapentryfonts ! 6202: \tocentry{#1}{\dopageno\bgroup#2\egroup}% ! 6203: \endgroup ! 6204: \nobreak\vskip .25\baselineskip plus.1\baselineskip ! 6205: } ! 6206: ! 6207: \def\dosecentry#1#2{\begingroup ! 6208: \secentryfonts \leftskip=\tocindent ! 6209: \tocentry{#1}{\dopageno\bgroup#2\egroup}% ! 6210: \endgroup} ! 6211: ! 6212: \def\dosubsecentry#1#2{\begingroup ! 6213: \subsecentryfonts \leftskip=2\tocindent ! 6214: \tocentry{#1}{\dopageno\bgroup#2\egroup}% ! 6215: \endgroup} ! 6216: ! 6217: \def\dosubsubsecentry#1#2{\begingroup ! 6218: \subsubsecentryfonts \leftskip=3\tocindent ! 6219: \tocentry{#1}{\dopageno\bgroup#2\egroup}% ! 6220: \endgroup} ! 6221: ! 6222: % We use the same \entry macro as for the index entries. ! 6223: \let\tocentry = \entry ! 6224: ! 6225: % Space between chapter (or whatever) number and the title. ! 6226: \def\labelspace{\hskip1em \relax} ! 6227: ! 6228: \def\dopageno#1{{\rm #1}} ! 6229: \def\doshortpageno#1{{\rm #1}} ! 6230: ! 6231: \def\chapentryfonts{\secfonts \rm} ! 6232: \def\secentryfonts{\textfonts} ! 6233: \def\subsecentryfonts{\textfonts} ! 6234: \def\subsubsecentryfonts{\textfonts} ! 6235: ! 6236: ! 6237: \message{environments,} ! 6238: % @foo ... @end foo. ! 6239: ! 6240: % @tex ... @end tex escapes into raw TeX temporarily. ! 6241: % One exception: @ is still an escape character, so that @end tex works. ! 6242: % But \@ or @@ will get a plain @ character. ! 6243: ! 6244: \envdef\tex{% ! 6245: \setupmarkupstyle{tex}% ! 6246: \catcode `\\=0 \catcode `\{=1 \catcode `\}=2 ! 6247: \catcode `\$=3 \catcode `\&=4 \catcode `\#=6 ! 6248: \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie ! 6249: \catcode `\%=14 ! 6250: \catcode `\+=\other ! 6251: \catcode `\"=\other ! 6252: \catcode `\|=\other ! 6253: \catcode `\<=\other ! 6254: \catcode `\>=\other ! 6255: \catcode`\`=\other ! 6256: \catcode`\'=\other ! 6257: \escapechar=`\\ ! 6258: % ! 6259: % ' is active in math mode (mathcode"8000). So reset it, and all our ! 6260: % other math active characters (just in case), to plain's definitions. ! 6261: \mathactive ! 6262: % ! 6263: \let\b=\ptexb ! 6264: \let\bullet=\ptexbullet ! 6265: \let\c=\ptexc ! 6266: \let\,=\ptexcomma ! 6267: \let\.=\ptexdot ! 6268: \let\dots=\ptexdots ! 6269: \let\equiv=\ptexequiv ! 6270: \let\!=\ptexexclam ! 6271: \let\i=\ptexi ! 6272: \let\indent=\ptexindent ! 6273: \let\noindent=\ptexnoindent ! 6274: \let\{=\ptexlbrace ! 6275: \let\+=\tabalign ! 6276: \let\}=\ptexrbrace ! 6277: \let\/=\ptexslash ! 6278: \let\*=\ptexstar ! 6279: \let\t=\ptext ! 6280: \expandafter \let\csname top\endcsname=\ptextop % outer ! 6281: \let\frenchspacing=\plainfrenchspacing ! 6282: % ! 6283: \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% ! 6284: \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}% ! 6285: \def\@{@}% ! 6286: } ! 6287: % There is no need to define \Etex. ! 6288: ! 6289: % Define @lisp ... @end lisp. ! 6290: % @lisp environment forms a group so it can rebind things, ! 6291: % including the definition of @end lisp (which normally is erroneous). ! 6292: ! 6293: % Amount to narrow the margins by for @lisp. ! 6294: \newskip\lispnarrowing \lispnarrowing=0.4in ! 6295: ! 6296: % This is the definition that ^^M gets inside @lisp, @example, and other ! 6297: % such environments. \null is better than a space, since it doesn't ! 6298: % have any width. ! 6299: \def\lisppar{\null\endgraf} ! 6300: ! 6301: % This space is always present above and below environments. ! 6302: \newskip\envskipamount \envskipamount = 0pt ! 6303: ! 6304: % Make spacing and below environment symmetrical. We use \parskip here ! 6305: % to help in doing that, since in @example-like environments \parskip ! 6306: % is reset to zero; thus the \afterenvbreak inserts no space -- but the ! 6307: % start of the next paragraph will insert \parskip. ! 6308: % ! 6309: \def\aboveenvbreak{{% ! 6310: % =10000 instead of <10000 because of a special case in \itemzzz and ! 6311: % \sectionheading, q.v. ! 6312: \ifnum \lastpenalty=10000 \else ! 6313: \advance\envskipamount by \parskip ! 6314: \endgraf ! 6315: \ifdim\lastskip<\envskipamount ! 6316: \removelastskip ! 6317: % it's not a good place to break if the last penalty was \nobreak ! 6318: % or better ... ! 6319: \ifnum\lastpenalty<10000 \penalty-50 \fi ! 6320: \vskip\envskipamount ! 6321: \fi ! 6322: \fi ! 6323: }} ! 6324: ! 6325: \let\afterenvbreak = \aboveenvbreak ! 6326: ! 6327: % \nonarrowing is a flag. If "set", @lisp etc don't narrow margins; it will ! 6328: % also clear it, so that its embedded environments do the narrowing again. ! 6329: \let\nonarrowing=\relax ! 6330: ! 6331: % @cartouche ... @end cartouche: draw rectangle w/rounded corners around ! 6332: % environment contents. ! 6333: \font\circle=lcircle10 ! 6334: \newdimen\circthick ! 6335: \newdimen\cartouter\newdimen\cartinner ! 6336: \newskip\normbskip\newskip\normpskip\newskip\normlskip ! 6337: \circthick=\fontdimen8\circle ! 6338: % ! 6339: \def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth ! 6340: \def\ctr{{\hskip 6pt\circle\char'010}} ! 6341: \def\cbl{{\circle\char'012\hskip -6pt}} ! 6342: \def\cbr{{\hskip 6pt\circle\char'011}} ! 6343: \def\carttop{\hbox to \cartouter{\hskip\lskip ! 6344: \ctl\leaders\hrule height\circthick\hfil\ctr ! 6345: \hskip\rskip}} ! 6346: \def\cartbot{\hbox to \cartouter{\hskip\lskip ! 6347: \cbl\leaders\hrule height\circthick\hfil\cbr ! 6348: \hskip\rskip}} ! 6349: % ! 6350: \newskip\lskip\newskip\rskip ! 6351: ! 6352: \envdef\cartouche{% ! 6353: \ifhmode\par\fi % can't be in the midst of a paragraph. ! 6354: \startsavinginserts ! 6355: \lskip=\leftskip \rskip=\rightskip ! 6356: \leftskip=0pt\rightskip=0pt % we want these *outside*. ! 6357: \cartinner=\hsize \advance\cartinner by-\lskip ! 6358: \advance\cartinner by-\rskip ! 6359: \cartouter=\hsize ! 6360: \advance\cartouter by 18.4pt % allow for 3pt kerns on either ! 6361: % side, and for 6pt waste from ! 6362: % each corner char, and rule thickness ! 6363: \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip ! 6364: % Flag to tell @lisp, etc., not to narrow margin. ! 6365: \let\nonarrowing = t% ! 6366: % ! 6367: % If this cartouche directly follows a sectioning command, we need the ! 6368: % \parskip glue (backspaced over by default) or the cartouche can ! 6369: % collide with the section heading. ! 6370: \ifnum\lastpenalty>10000 \vskip\parskip \penalty\lastpenalty \fi ! 6371: % ! 6372: \vbox\bgroup ! 6373: \baselineskip=0pt\parskip=0pt\lineskip=0pt ! 6374: \carttop ! 6375: \hbox\bgroup ! 6376: \hskip\lskip ! 6377: \vrule\kern3pt ! 6378: \vbox\bgroup ! 6379: \kern3pt ! 6380: \hsize=\cartinner ! 6381: \baselineskip=\normbskip ! 6382: \lineskip=\normlskip ! 6383: \parskip=\normpskip ! 6384: \vskip -\parskip ! 6385: \comment % For explanation, see the end of def\group. ! 6386: } ! 6387: \def\Ecartouche{% ! 6388: \ifhmode\par\fi ! 6389: \kern3pt ! 6390: \egroup ! 6391: \kern3pt\vrule ! 6392: \hskip\rskip ! 6393: \egroup ! 6394: \cartbot ! 6395: \egroup ! 6396: \checkinserts ! 6397: } ! 6398: ! 6399: ! 6400: % This macro is called at the beginning of all the @example variants, ! 6401: % inside a group. ! 6402: \newdimen\nonfillparindent ! 6403: \def\nonfillstart{% ! 6404: \aboveenvbreak ! 6405: \hfuzz = 12pt % Don't be fussy ! 6406: \sepspaces % Make spaces be word-separators rather than space tokens. ! 6407: \let\par = \lisppar % don't ignore blank lines ! 6408: \obeylines % each line of input is a line of output ! 6409: \parskip = 0pt ! 6410: % Turn off paragraph indentation but redefine \indent to emulate ! 6411: % the normal \indent. ! 6412: \nonfillparindent=\parindent ! 6413: \parindent = 0pt ! 6414: \let\indent\nonfillindent ! 6415: % ! 6416: \emergencystretch = 0pt % don't try to avoid overfull boxes ! 6417: \ifx\nonarrowing\relax ! 6418: \advance \leftskip by \lispnarrowing ! 6419: \exdentamount=\lispnarrowing ! 6420: \else ! 6421: \let\nonarrowing = \relax ! 6422: \fi ! 6423: \let\exdent=\nofillexdent ! 6424: } ! 6425: ! 6426: \begingroup ! 6427: \obeyspaces ! 6428: % We want to swallow spaces (but not other tokens) after the fake ! 6429: % @indent in our nonfill-environments, where spaces are normally ! 6430: % active and set to @tie, resulting in them not being ignored after ! 6431: % @indent. ! 6432: \gdef\nonfillindent{\futurelet\temp\nonfillindentcheck}% ! 6433: \gdef\nonfillindentcheck{% ! 6434: \ifx\temp % ! 6435: \expandafter\nonfillindentgobble% ! 6436: \else% ! 6437: \leavevmode\nonfillindentbox% ! 6438: \fi% ! 6439: }% ! 6440: \endgroup ! 6441: \def\nonfillindentgobble#1{\nonfillindent} ! 6442: \def\nonfillindentbox{\hbox to \nonfillparindent{\hss}} ! 6443: ! 6444: % If you want all examples etc. small: @set dispenvsize small. ! 6445: % If you want even small examples the full size: @set dispenvsize nosmall. ! 6446: % This affects the following displayed environments: ! 6447: % @example, @display, @format, @lisp ! 6448: % ! 6449: \def\smallword{small} ! 6450: \def\nosmallword{nosmall} ! 6451: \let\SETdispenvsize\relax ! 6452: \def\setnormaldispenv{% ! 6453: \ifx\SETdispenvsize\smallword ! 6454: % end paragraph for sake of leading, in case document has no blank ! 6455: % line. This is redundant with what happens in \aboveenvbreak, but ! 6456: % we need to do it before changing the fonts, and it's inconvenient ! 6457: % to change the fonts afterward. ! 6458: \ifnum \lastpenalty=10000 \else \endgraf \fi ! 6459: \smallexamplefonts \rm ! 6460: \fi ! 6461: } ! 6462: \def\setsmalldispenv{% ! 6463: \ifx\SETdispenvsize\nosmallword ! 6464: \else ! 6465: \ifnum \lastpenalty=10000 \else \endgraf \fi ! 6466: \smallexamplefonts \rm ! 6467: \fi ! 6468: } ! 6469: ! 6470: % We often define two environments, @foo and @smallfoo. ! 6471: % Let's do it in one command. #1 is the env name, #2 the definition. ! 6472: \def\makedispenvdef#1#2{% ! 6473: \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}% ! 6474: \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}% ! 6475: \expandafter\let\csname E#1\endcsname \afterenvbreak ! 6476: \expandafter\let\csname Esmall#1\endcsname \afterenvbreak ! 6477: } ! 6478: ! 6479: % Define two environment synonyms (#1 and #2) for an environment. ! 6480: \def\maketwodispenvdef#1#2#3{% ! 6481: \makedispenvdef{#1}{#3}% ! 6482: \makedispenvdef{#2}{#3}% ! 6483: } ! 6484: % ! 6485: % @lisp: indented, narrowed, typewriter font; ! 6486: % @example: same as @lisp. ! 6487: % ! 6488: % @smallexample and @smalllisp: use smaller fonts. ! 6489: % Originally contributed by Pavel@xerox. ! 6490: % ! 6491: \maketwodispenvdef{lisp}{example}{% ! 6492: \nonfillstart ! 6493: \tt\setupmarkupstyle{example}% ! 6494: \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. ! 6495: \gobble % eat return ! 6496: } ! 6497: % @display/@smalldisplay: same as @lisp except keep current font. ! 6498: % ! 6499: \makedispenvdef{display}{% ! 6500: \nonfillstart ! 6501: \gobble ! 6502: } ! 6503: ! 6504: % @format/@smallformat: same as @display except don't narrow margins. ! 6505: % ! 6506: \makedispenvdef{format}{% ! 6507: \let\nonarrowing = t% ! 6508: \nonfillstart ! 6509: \gobble ! 6510: } ! 6511: ! 6512: % @flushleft: same as @format, but doesn't obey \SETdispenvsize. ! 6513: \envdef\flushleft{% ! 6514: \let\nonarrowing = t% ! 6515: \nonfillstart ! 6516: \gobble ! 6517: } ! 6518: \let\Eflushleft = \afterenvbreak ! 6519: ! 6520: % @flushright. ! 6521: % ! 6522: \envdef\flushright{% ! 6523: \let\nonarrowing = t% ! 6524: \nonfillstart ! 6525: \advance\leftskip by 0pt plus 1fill\relax ! 6526: \gobble ! 6527: } ! 6528: \let\Eflushright = \afterenvbreak ! 6529: ! 6530: ! 6531: % @raggedright does more-or-less normal line breaking but no right ! 6532: % justification. From plain.tex. ! 6533: \envdef\raggedright{% ! 6534: \rightskip0pt plus2em \spaceskip.3333em \xspaceskip.5em\relax ! 6535: } ! 6536: \let\Eraggedright\par ! 6537: ! 6538: \envdef\raggedleft{% ! 6539: \parindent=0pt \leftskip0pt plus2em ! 6540: \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt ! 6541: \hbadness=10000 % Last line will usually be underfull, so turn off ! 6542: % badness reporting. ! 6543: } ! 6544: \let\Eraggedleft\par ! 6545: ! 6546: \envdef\raggedcenter{% ! 6547: \parindent=0pt \rightskip0pt plus1em \leftskip0pt plus1em ! 6548: \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt ! 6549: \hbadness=10000 % Last line will usually be underfull, so turn off ! 6550: % badness reporting. ! 6551: } ! 6552: \let\Eraggedcenter\par ! 6553: ! 6554: ! 6555: % @quotation does normal linebreaking (hence we can't use \nonfillstart) ! 6556: % and narrows the margins. We keep \parskip nonzero in general, since ! 6557: % we're doing normal filling. So, when using \aboveenvbreak and ! 6558: % \afterenvbreak, temporarily make \parskip 0. ! 6559: % ! 6560: \makedispenvdef{quotation}{\quotationstart} ! 6561: % ! 6562: \def\quotationstart{% ! 6563: \indentedblockstart % same as \indentedblock, but increase right margin too. ! 6564: \ifx\nonarrowing\relax ! 6565: \advance\rightskip by \lispnarrowing ! 6566: \fi ! 6567: \parsearg\quotationlabel ! 6568: } ! 6569: ! 6570: % We have retained a nonzero parskip for the environment, since we're ! 6571: % doing normal filling. ! 6572: % ! 6573: \def\Equotation{% ! 6574: \par ! 6575: \ifx\quotationauthor\thisisundefined\else ! 6576: % indent a bit. ! 6577: \leftline{\kern 2\leftskip \sl ---\quotationauthor}% ! 6578: \fi ! 6579: {\parskip=0pt \afterenvbreak}% ! 6580: } ! 6581: \def\Esmallquotation{\Equotation} ! 6582: ! 6583: % If we're given an argument, typeset it in bold with a colon after. ! 6584: \def\quotationlabel#1{% ! 6585: \def\temp{#1}% ! 6586: \ifx\temp\empty \else ! 6587: {\bf #1: }% ! 6588: \fi ! 6589: } ! 6590: ! 6591: % @indentedblock is like @quotation, but indents only on the left and ! 6592: % has no optional argument. ! 6593: % ! 6594: \makedispenvdef{indentedblock}{\indentedblockstart} ! 6595: % ! 6596: \def\indentedblockstart{% ! 6597: {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip ! 6598: \parindent=0pt ! 6599: % ! 6600: % @cartouche defines \nonarrowing to inhibit narrowing at next level down. ! 6601: \ifx\nonarrowing\relax ! 6602: \advance\leftskip by \lispnarrowing ! 6603: \exdentamount = \lispnarrowing ! 6604: \else ! 6605: \let\nonarrowing = \relax ! 6606: \fi ! 6607: } ! 6608: ! 6609: % Keep a nonzero parskip for the environment, since we're doing normal filling. ! 6610: % ! 6611: \def\Eindentedblock{% ! 6612: \par ! 6613: {\parskip=0pt \afterenvbreak}% ! 6614: } ! 6615: \def\Esmallindentedblock{\Eindentedblock} ! 6616: ! 6617: ! 6618: % LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>} ! 6619: % If we want to allow any <char> as delimiter, ! 6620: % we need the curly braces so that makeinfo sees the @verb command, eg: ! 6621: % `@verbx...x' would look like the '@verbx' command. [email protected] ! 6622: % ! 6623: % [Knuth]: Donald Ervin Knuth, 1996. The TeXbook. ! 6624: % ! 6625: % [Knuth] p.344; only we need to do the other characters Texinfo sets ! 6626: % active too. Otherwise, they get lost as the first character on a ! 6627: % verbatim line. ! 6628: \def\dospecials{% ! 6629: \do\ \do\\\do\{\do\}\do\$\do\&% ! 6630: \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~% ! 6631: \do\<\do\>\do\|\do\@\do+\do\"% ! 6632: % Don't do the quotes -- if we do, @set txicodequoteundirected and ! 6633: % @set txicodequotebacktick will not have effect on @verb and ! 6634: % @verbatim, and ?` and !` ligatures won't get disabled. ! 6635: %\do\`\do\'% ! 6636: } ! 6637: % ! 6638: % [Knuth] p. 380 ! 6639: \def\uncatcodespecials{% ! 6640: \def\do##1{\catcode`##1=\other}\dospecials} ! 6641: % ! 6642: % Setup for the @verb command. ! 6643: % ! 6644: % Eight spaces for a tab ! 6645: \begingroup ! 6646: \catcode`\^^I=\active ! 6647: \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }} ! 6648: \endgroup ! 6649: % ! 6650: \def\setupverb{% ! 6651: \tt % easiest (and conventionally used) font for verbatim ! 6652: \def\par{\leavevmode\endgraf}% ! 6653: \setupmarkupstyle{verb}% ! 6654: \tabeightspaces ! 6655: % Respect line breaks, ! 6656: % print special symbols as themselves, and ! 6657: % make each space count ! 6658: % must do in this order: ! 6659: \obeylines \uncatcodespecials \sepspaces ! 6660: } ! 6661: ! 6662: % Setup for the @verbatim environment ! 6663: % ! 6664: % Real tab expansion. ! 6665: \newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount ! 6666: % ! 6667: % We typeset each line of the verbatim in an \hbox, so we can handle ! 6668: % tabs. The \global is in case the verbatim line starts with an accent, ! 6669: % or some other command that starts with a begin-group. Otherwise, the ! 6670: % entire \verbbox would disappear at the corresponding end-group, before ! 6671: % it is typeset. Meanwhile, we can't have nested verbatim commands ! 6672: % (can we?), so the \global won't be overwriting itself. ! 6673: \newbox\verbbox ! 6674: \def\starttabbox{\global\setbox\verbbox=\hbox\bgroup} ! 6675: % ! 6676: \begingroup ! 6677: \catcode`\^^I=\active ! 6678: \gdef\tabexpand{% ! 6679: \catcode`\^^I=\active ! 6680: \def^^I{\leavevmode\egroup ! 6681: \dimen\verbbox=\wd\verbbox % the width so far, or since the previous tab ! 6682: \divide\dimen\verbbox by\tabw ! 6683: \multiply\dimen\verbbox by\tabw % compute previous multiple of \tabw ! 6684: \advance\dimen\verbbox by\tabw % advance to next multiple of \tabw ! 6685: \wd\verbbox=\dimen\verbbox \box\verbbox \starttabbox ! 6686: }% ! 6687: } ! 6688: \endgroup ! 6689: ! 6690: % start the verbatim environment. ! 6691: \def\setupverbatim{% ! 6692: \let\nonarrowing = t% ! 6693: \nonfillstart ! 6694: \tt % easiest (and conventionally used) font for verbatim ! 6695: % The \leavevmode here is for blank lines. Otherwise, we would ! 6696: % never \starttabox and the \egroup would end verbatim mode. ! 6697: \def\par{\leavevmode\egroup\box\verbbox\endgraf}% ! 6698: \tabexpand ! 6699: \setupmarkupstyle{verbatim}% ! 6700: % Respect line breaks, ! 6701: % print special symbols as themselves, and ! 6702: % make each space count. ! 6703: % Must do in this order: ! 6704: \obeylines \uncatcodespecials \sepspaces ! 6705: \everypar{\starttabbox}% ! 6706: } ! 6707: ! 6708: % Do the @verb magic: verbatim text is quoted by unique ! 6709: % delimiter characters. Before first delimiter expect a ! 6710: % right brace, after last delimiter expect closing brace: ! 6711: % ! 6712: % \def\doverb'{'<char>#1<char>'}'{#1} ! 6713: % ! 6714: % [Knuth] p. 382; only eat outer {} ! 6715: \begingroup ! 6716: \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other ! 6717: \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next] ! 6718: \endgroup ! 6719: % ! 6720: \def\verb{\begingroup\setupverb\doverb} ! 6721: % ! 6722: % ! 6723: % Do the @verbatim magic: define the macro \doverbatim so that ! 6724: % the (first) argument ends when '@end verbatim' is reached, ie: ! 6725: % ! 6726: % \def\doverbatim#1@end verbatim{#1} ! 6727: % ! 6728: % For Texinfo it's a lot easier than for LaTeX, ! 6729: % because texinfo's \verbatim doesn't stop at '\end{verbatim}': ! 6730: % we need not redefine '\', '{' and '}'. ! 6731: % ! 6732: % Inspired by LaTeX's verbatim command set [latex.ltx] ! 6733: % ! 6734: \begingroup ! 6735: \catcode`\ =\active ! 6736: \obeylines % ! 6737: % ignore everything up to the first ^^M, that's the newline at the end ! 6738: % of the @verbatim input line itself. Otherwise we get an extra blank ! 6739: % line in the output. ! 6740: \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}% ! 6741: % We really want {...\end verbatim} in the body of the macro, but ! 6742: % without the active space; thus we have to use \xdef and \gobble. ! 6743: \endgroup ! 6744: % ! 6745: \envdef\verbatim{% ! 6746: \setupverbatim\doverbatim ! 6747: } ! 6748: \let\Everbatim = \afterenvbreak ! 6749: ! 6750: ! 6751: % @verbatiminclude FILE - insert text of file in verbatim environment. ! 6752: % ! 6753: \def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude} ! 6754: % ! 6755: \def\doverbatiminclude#1{% ! 6756: {% ! 6757: \makevalueexpandable ! 6758: \setupverbatim ! 6759: \indexnofonts % Allow `@@' and other weird things in file names. ! 6760: \wlog{texinfo.tex: doing @verbatiminclude of #1^^J}% ! 6761: \input #1 ! 6762: \afterenvbreak ! 6763: }% ! 6764: } ! 6765: ! 6766: % @copying ... @end copying. ! 6767: % Save the text away for @insertcopying later. ! 6768: % ! 6769: % We save the uninterpreted tokens, rather than creating a box. ! 6770: % Saving the text in a box would be much easier, but then all the ! 6771: % typesetting commands (@smallbook, font changes, etc.) have to be done ! 6772: % beforehand -- and a) we want @copying to be done first in the source ! 6773: % file; b) letting users define the frontmatter in as flexible order as ! 6774: % possible is very desirable. ! 6775: % ! 6776: \def\copying{\checkenv{}\begingroup\scanargctxt\docopying} ! 6777: \def\docopying#1@end copying{\endgroup\def\copyingtext{#1}} ! 6778: % ! 6779: \def\insertcopying{% ! 6780: \begingroup ! 6781: \parindent = 0pt % paragraph indentation looks wrong on title page ! 6782: \scanexp\copyingtext ! 6783: \endgroup ! 6784: } ! 6785: ! 6786: ! 6787: \message{defuns,} ! 6788: % @defun etc. ! 6789: ! 6790: \newskip\defbodyindent \defbodyindent=.4in ! 6791: \newskip\defargsindent \defargsindent=50pt ! 6792: \newskip\deflastargmargin \deflastargmargin=18pt ! 6793: \newcount\defunpenalty ! 6794: ! 6795: % Start the processing of @deffn: ! 6796: \def\startdefun{% ! 6797: \ifnum\lastpenalty<10000 ! 6798: \medbreak ! 6799: \defunpenalty=10003 % Will keep this @deffn together with the ! 6800: % following @def command, see below. ! 6801: \else ! 6802: % If there are two @def commands in a row, we'll have a \nobreak, ! 6803: % which is there to keep the function description together with its ! 6804: % header. But if there's nothing but headers, we need to allow a ! 6805: % break somewhere. Check specifically for penalty 10002, inserted ! 6806: % by \printdefunline, instead of 10000, since the sectioning ! 6807: % commands also insert a nobreak penalty, and we don't want to allow ! 6808: % a break between a section heading and a defun. ! 6809: % ! 6810: % As a further refinement, we avoid "club" headers by signalling ! 6811: % with penalty of 10003 after the very first @deffn in the ! 6812: % sequence (see above), and penalty of 10002 after any following ! 6813: % @def command. ! 6814: \ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \fi ! 6815: % ! 6816: % Similarly, after a section heading, do not allow a break. ! 6817: % But do insert the glue. ! 6818: \medskip % preceded by discardable penalty, so not a breakpoint ! 6819: \fi ! 6820: % ! 6821: \parindent=0in ! 6822: \advance\leftskip by \defbodyindent ! 6823: \exdentamount=\defbodyindent ! 6824: } ! 6825: ! 6826: \def\dodefunx#1{% ! 6827: % First, check whether we are in the right environment: ! 6828: \checkenv#1% ! 6829: % ! 6830: % As above, allow line break if we have multiple x headers in a row. ! 6831: % It's not a great place, though. ! 6832: \ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi ! 6833: % ! 6834: % And now, it's time to reuse the body of the original defun: ! 6835: \expandafter\gobbledefun#1% ! 6836: } ! 6837: \def\gobbledefun#1\startdefun{} ! 6838: ! 6839: % \printdefunline \deffnheader{text} ! 6840: % ! 6841: \def\printdefunline#1#2{% ! 6842: \begingroup ! 6843: % call \deffnheader: ! 6844: #1#2 \endheader ! 6845: % common ending: ! 6846: \interlinepenalty = 10000 ! 6847: \advance\rightskip by 0pt plus 1fil\relax ! 6848: \endgraf ! 6849: \nobreak\vskip -\parskip ! 6850: \penalty\defunpenalty % signal to \startdefun and \dodefunx ! 6851: % Some of the @defun-type tags do not enable magic parentheses, ! 6852: % rendering the following check redundant. But we don't optimize. ! 6853: \checkparencounts ! 6854: \endgroup ! 6855: } ! 6856: ! 6857: \def\Edefun{\endgraf\medbreak} ! 6858: ! 6859: % \makedefun{deffn} creates \deffn, \deffnx and \Edeffn; ! 6860: % the only thing remaining is to define \deffnheader. ! 6861: % ! 6862: \def\makedefun#1{% ! 6863: \expandafter\let\csname E#1\endcsname = \Edefun ! 6864: \edef\temp{\noexpand\domakedefun ! 6865: \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}% ! 6866: \temp ! 6867: } ! 6868: ! 6869: % \domakedefun \deffn \deffnx \deffnheader ! 6870: % ! 6871: % Define \deffn and \deffnx, without parameters. ! 6872: % \deffnheader has to be defined explicitly. ! 6873: % ! 6874: \def\domakedefun#1#2#3{% ! 6875: \envdef#1{% ! 6876: \startdefun ! 6877: \doingtypefnfalse % distinguish typed functions from all else ! 6878: \parseargusing\activeparens{\printdefunline#3}% ! 6879: }% ! 6880: \def#2{\dodefunx#1}% ! 6881: \def#3% ! 6882: } ! 6883: ! 6884: \newif\ifdoingtypefn % doing typed function? ! 6885: \newif\ifrettypeownline % typeset return type on its own line? ! 6886: ! 6887: % @deftypefnnewline on|off says whether the return type of typed functions ! 6888: % are printed on their own line. This affects @deftypefn, @deftypefun, ! 6889: % @deftypeop, and @deftypemethod. ! 6890: % ! 6891: \parseargdef\deftypefnnewline{% ! 6892: \def\temp{#1}% ! 6893: \ifx\temp\onword ! 6894: \expandafter\let\csname SETtxideftypefnnl\endcsname ! 6895: = \empty ! 6896: \else\ifx\temp\offword ! 6897: \expandafter\let\csname SETtxideftypefnnl\endcsname ! 6898: = \relax ! 6899: \else ! 6900: \errhelp = \EMsimple ! 6901: \errmessage{Unknown @txideftypefnnl value `\temp', ! 6902: must be on|off}% ! 6903: \fi\fi ! 6904: } ! 6905: ! 6906: % Untyped functions: ! 6907: ! 6908: % @deffn category name args ! 6909: \makedefun{deffn}{\deffngeneral{}} ! 6910: ! 6911: % @deffn category class name args ! 6912: \makedefun{defop}#1 {\defopon{#1\ \putwordon}} ! 6913: ! 6914: % \defopon {category on}class name args ! 6915: \def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } ! 6916: ! 6917: % \deffngeneral {subind}category name args ! 6918: % ! 6919: \def\deffngeneral#1#2 #3 #4\endheader{% ! 6920: % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}. ! 6921: \dosubind{fn}{\code{#3}}{#1}% ! 6922: \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}% ! 6923: } ! 6924: ! 6925: % Typed functions: ! 6926: ! 6927: % @deftypefn category type name args ! 6928: \makedefun{deftypefn}{\deftypefngeneral{}} ! 6929: ! 6930: % @deftypeop category class type name args ! 6931: \makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}} ! 6932: ! 6933: % \deftypeopon {category on}class type name args ! 6934: \def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } ! 6935: ! 6936: % \deftypefngeneral {subind}category type name args ! 6937: % ! 6938: \def\deftypefngeneral#1#2 #3 #4 #5\endheader{% ! 6939: \dosubind{fn}{\code{#4}}{#1}% ! 6940: \doingtypefntrue ! 6941: \defname{#2}{#3}{#4}\defunargs{#5\unskip}% ! 6942: } ! 6943: ! 6944: % Typed variables: ! 6945: ! 6946: % @deftypevr category type var args ! 6947: \makedefun{deftypevr}{\deftypecvgeneral{}} ! 6948: ! 6949: % @deftypecv category class type var args ! 6950: \makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}} ! 6951: ! 6952: % \deftypecvof {category of}class type var args ! 6953: \def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} } ! 6954: ! 6955: % \deftypecvgeneral {subind}category type var args ! 6956: % ! 6957: \def\deftypecvgeneral#1#2 #3 #4 #5\endheader{% ! 6958: \dosubind{vr}{\code{#4}}{#1}% ! 6959: \defname{#2}{#3}{#4}\defunargs{#5\unskip}% ! 6960: } ! 6961: ! 6962: % Untyped variables: ! 6963: ! 6964: % @defvr category var args ! 6965: \makedefun{defvr}#1 {\deftypevrheader{#1} {} } ! 6966: ! 6967: % @defcv category class var args ! 6968: \makedefun{defcv}#1 {\defcvof{#1\ \putwordof}} ! 6969: ! 6970: % \defcvof {category of}class var args ! 6971: \def\defcvof#1#2 {\deftypecvof{#1}#2 {} } ! 6972: ! 6973: % Types: ! 6974: ! 6975: % @deftp category name args ! 6976: \makedefun{deftp}#1 #2 #3\endheader{% ! 6977: \doind{tp}{\code{#2}}% ! 6978: \defname{#1}{}{#2}\defunargs{#3\unskip}% ! 6979: } ! 6980: ! 6981: % Remaining @defun-like shortcuts: ! 6982: \makedefun{defun}{\deffnheader{\putwordDeffunc} } ! 6983: \makedefun{defmac}{\deffnheader{\putwordDefmac} } ! 6984: \makedefun{defspec}{\deffnheader{\putwordDefspec} } ! 6985: \makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} } ! 6986: \makedefun{defvar}{\defvrheader{\putwordDefvar} } ! 6987: \makedefun{defopt}{\defvrheader{\putwordDefopt} } ! 6988: \makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} } ! 6989: \makedefun{defmethod}{\defopon\putwordMethodon} ! 6990: \makedefun{deftypemethod}{\deftypeopon\putwordMethodon} ! 6991: \makedefun{defivar}{\defcvof\putwordInstanceVariableof} ! 6992: \makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof} ! 6993: ! 6994: % \defname, which formats the name of the @def (not the args). ! 6995: % #1 is the category, such as "Function". ! 6996: % #2 is the return type, if any. ! 6997: % #3 is the function name. ! 6998: % ! 6999: % We are followed by (but not passed) the arguments, if any. ! 7000: % ! 7001: \def\defname#1#2#3{% ! 7002: \par ! 7003: % Get the values of \leftskip and \rightskip as they were outside the @def... ! 7004: \advance\leftskip by -\defbodyindent ! 7005: % ! 7006: % Determine if we are typesetting the return type of a typed function ! 7007: % on a line by itself. ! 7008: \rettypeownlinefalse ! 7009: \ifdoingtypefn % doing a typed function specifically? ! 7010: % then check user option for putting return type on its own line: ! 7011: \expandafter\ifx\csname SETtxideftypefnnl\endcsname\relax \else ! 7012: \rettypeownlinetrue ! 7013: \fi ! 7014: \fi ! 7015: % ! 7016: % How we'll format the category name. Putting it in brackets helps ! 7017: % distinguish it from the body text that may end up on the next line ! 7018: % just below it. ! 7019: \def\temp{#1}% ! 7020: \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi} ! 7021: % ! 7022: % Figure out line sizes for the paragraph shape. We'll always have at ! 7023: % least two. ! 7024: \tempnum = 2 ! 7025: % ! 7026: % The first line needs space for \box0; but if \rightskip is nonzero, ! 7027: % we need only space for the part of \box0 which exceeds it: ! 7028: \dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip ! 7029: % ! 7030: % If doing a return type on its own line, we'll have another line. ! 7031: \ifrettypeownline ! 7032: \advance\tempnum by 1 ! 7033: \def\maybeshapeline{0in \hsize}% ! 7034: \else ! 7035: \def\maybeshapeline{}% ! 7036: \fi ! 7037: % ! 7038: % The continuations: ! 7039: \dimen2=\hsize \advance\dimen2 by -\defargsindent ! 7040: % ! 7041: % The final paragraph shape: ! 7042: \parshape \tempnum 0in \dimen0 \maybeshapeline \defargsindent \dimen2 ! 7043: % ! 7044: % Put the category name at the right margin. ! 7045: \noindent ! 7046: \hbox to 0pt{% ! 7047: \hfil\box0 \kern-\hsize ! 7048: % \hsize has to be shortened this way: ! 7049: \kern\leftskip ! 7050: % Intentionally do not respect \rightskip, since we need the space. ! 7051: }% ! 7052: % ! 7053: % Allow all lines to be underfull without complaint: ! 7054: \tolerance=10000 \hbadness=10000 ! 7055: \exdentamount=\defbodyindent ! 7056: {% ! 7057: % defun fonts. We use typewriter by default (used to be bold) because: ! 7058: % . we're printing identifiers, they should be in tt in principle. ! 7059: % . in languages with many accents, such as Czech or French, it's ! 7060: % common to leave accents off identifiers. The result looks ok in ! 7061: % tt, but exceedingly strange in rm. ! 7062: % . we don't want -- and --- to be treated as ligatures. ! 7063: % . this still does not fix the ?` and !` ligatures, but so far no ! 7064: % one has made identifiers using them :). ! 7065: \df \tt ! 7066: \def\temp{#2}% text of the return type ! 7067: \ifx\temp\empty\else ! 7068: \tclose{\temp}% typeset the return type ! 7069: \ifrettypeownline ! 7070: % put return type on its own line; prohibit line break following: ! 7071: \hfil\vadjust{\nobreak}\break ! 7072: \else ! 7073: \space % type on same line, so just followed by a space ! 7074: \fi ! 7075: \fi % no return type ! 7076: #3% output function name ! 7077: }% ! 7078: {\rm\enskip}% hskip 0.5 em of \tenrm ! 7079: % ! 7080: \boldbrax ! 7081: % arguments will be output next, if any. ! 7082: } ! 7083: ! 7084: % Print arguments in slanted roman (not ttsl), inconsistently with using ! 7085: % tt for the name. This is because literal text is sometimes needed in ! 7086: % the argument list (groff manual), and ttsl and tt are not very ! 7087: % distinguishable. Prevent hyphenation at `-' chars. ! 7088: % ! 7089: \def\defunargs#1{% ! 7090: % use sl by default (not ttsl), ! 7091: % tt for the names. ! 7092: \df \sl \hyphenchar\font=0 ! 7093: % ! 7094: % On the other hand, if an argument has two dashes (for instance), we ! 7095: % want a way to get ttsl. We used to recommend @var for that, so ! 7096: % leave the code in, but it's strange for @var to lead to typewriter. ! 7097: % Nowadays we recommend @code, since the difference between a ttsl hyphen ! 7098: % and a tt hyphen is pretty tiny. @code also disables ?` !`. ! 7099: \def\var##1{{\setupmarkupstyle{var}\ttslanted{##1}}}% ! 7100: #1% ! 7101: \sl\hyphenchar\font=45 ! 7102: } ! 7103: ! 7104: % We want ()&[] to print specially on the defun line. ! 7105: % ! 7106: \def\activeparens{% ! 7107: \catcode`\(=\active \catcode`\)=\active ! 7108: \catcode`\[=\active \catcode`\]=\active ! 7109: \catcode`\&=\active ! 7110: } ! 7111: ! 7112: % Make control sequences which act like normal parenthesis chars. ! 7113: \let\lparen = ( \let\rparen = ) ! 7114: ! 7115: % Be sure that we always have a definition for `(', etc. For example, ! 7116: % if the fn name has parens in it, \boldbrax will not be in effect yet, ! 7117: % so TeX would otherwise complain about undefined control sequence. ! 7118: { ! 7119: \activeparens ! 7120: \global\let(=\lparen \global\let)=\rparen ! 7121: \global\let[=\lbrack \global\let]=\rbrack ! 7122: \global\let& = \& ! 7123: ! 7124: \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} ! 7125: \gdef\magicamp{\let&=\amprm} ! 7126: } ! 7127: ! 7128: \newcount\parencount ! 7129: ! 7130: % If we encounter &foo, then turn on ()-hacking afterwards ! 7131: \newif\ifampseen ! 7132: \def\amprm#1 {\ampseentrue{\bf\ }} ! 7133: ! 7134: \def\parenfont{% ! 7135: \ifampseen ! 7136: % At the first level, print parens in roman, ! 7137: % otherwise use the default font. ! 7138: \ifnum \parencount=1 \rm \fi ! 7139: \else ! 7140: % The \sf parens (in \boldbrax) actually are a little bolder than ! 7141: % the contained text. This is especially needed for [ and ] . ! 7142: \sf ! 7143: \fi ! 7144: } ! 7145: \def\infirstlevel#1{% ! 7146: \ifampseen ! 7147: \ifnum\parencount=1 ! 7148: #1% ! 7149: \fi ! 7150: \fi ! 7151: } ! 7152: \def\bfafterword#1 {#1 \bf} ! 7153: ! 7154: \def\opnr{% ! 7155: \global\advance\parencount by 1 ! 7156: {\parenfont(}% ! 7157: \infirstlevel \bfafterword ! 7158: } ! 7159: \def\clnr{% ! 7160: {\parenfont)}% ! 7161: \infirstlevel \sl ! 7162: \global\advance\parencount by -1 ! 7163: } ! 7164: ! 7165: \newcount\brackcount ! 7166: \def\lbrb{% ! 7167: \global\advance\brackcount by 1 ! 7168: {\bf[}% ! 7169: } ! 7170: \def\rbrb{% ! 7171: {\bf]}% ! 7172: \global\advance\brackcount by -1 ! 7173: } ! 7174: ! 7175: \def\checkparencounts{% ! 7176: \ifnum\parencount=0 \else \badparencount \fi ! 7177: \ifnum\brackcount=0 \else \badbrackcount \fi ! 7178: } ! 7179: % these should not use \errmessage; the glibc manual, at least, actually ! 7180: % has such constructs (when documenting function pointers). ! 7181: \def\badparencount{% ! 7182: \message{Warning: unbalanced parentheses in @def...}% ! 7183: \global\parencount=0 ! 7184: } ! 7185: \def\badbrackcount{% ! 7186: \message{Warning: unbalanced square brackets in @def...}% ! 7187: \global\brackcount=0 ! 7188: } ! 7189: ! 7190: ! 7191: \message{macros,} ! 7192: % @macro. ! 7193: ! 7194: % To do this right we need a feature of e-TeX, \scantokens, ! 7195: % which we arrange to emulate with a temporary file in ordinary TeX. ! 7196: \ifx\eTeXversion\thisisundefined ! 7197: \newwrite\macscribble ! 7198: \def\scantokens#1{% ! 7199: \toks0={#1}% ! 7200: \immediate\openout\macscribble=\jobname.tmp ! 7201: \immediate\write\macscribble{\the\toks0}% ! 7202: \immediate\closeout\macscribble ! 7203: \input \jobname.tmp ! 7204: } ! 7205: \fi ! 7206: ! 7207: \def\scanmacro#1{\begingroup ! 7208: \newlinechar`\^^M ! 7209: \let\xeatspaces\eatspaces ! 7210: % ! 7211: % Undo catcode changes of \startcontents and \doprintindex ! 7212: % When called from @insertcopying or (short)caption, we need active ! 7213: % backslash to get it printed correctly. Previously, we had ! 7214: % \catcode`\\=\other instead. We'll see whether a problem appears ! 7215: % with macro expansion. --kasal, 19aug04 ! 7216: \catcode`\@=0 \catcode`\\=\active \escapechar=`\@ ! 7217: % ! 7218: % ... and for \example: ! 7219: \spaceisspace ! 7220: % ! 7221: % The \empty here causes a following catcode 5 newline to be eaten as ! 7222: % part of reading whitespace after a control sequence. It does not ! 7223: % eat a catcode 13 newline. There's no good way to handle the two ! 7224: % cases (untried: maybe e-TeX's \everyeof could help, though plain TeX ! 7225: % would then have different behavior). See the Macro Details node in ! 7226: % the manual for the workaround we recommend for macros and ! 7227: % line-oriented commands. ! 7228: % ! 7229: \scantokens{#1\empty}% ! 7230: \endgroup} ! 7231: ! 7232: \def\scanexp#1{% ! 7233: \edef\temp{\noexpand\scanmacro{#1}}% ! 7234: \temp ! 7235: } ! 7236: ! 7237: \newcount\paramno % Count of parameters ! 7238: \newtoks\macname % Macro name ! 7239: \newif\ifrecursive % Is it recursive? ! 7240: ! 7241: % List of all defined macros in the form ! 7242: % \definedummyword\macro1\definedummyword\macro2... ! 7243: % Currently is also contains all @aliases; the list can be split ! 7244: % if there is a need. ! 7245: \def\macrolist{} ! 7246: ! 7247: % Add the macro to \macrolist ! 7248: \def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname} ! 7249: \def\addtomacrolistxxx#1{% ! 7250: \toks0 = \expandafter{\macrolist\definedummyword#1}% ! 7251: \xdef\macrolist{\the\toks0}% ! 7252: } ! 7253: ! 7254: % Utility routines. ! 7255: % This does \let #1 = #2, with \csnames; that is, ! 7256: % \let \csname#1\endcsname = \csname#2\endcsname ! 7257: % (except of course we have to play expansion games). ! 7258: % ! 7259: \def\cslet#1#2{% ! 7260: \expandafter\let ! 7261: \csname#1\expandafter\endcsname ! 7262: \csname#2\endcsname ! 7263: } ! 7264: ! 7265: % Trim leading and trailing spaces off a string. ! 7266: % Concepts from aro-bend problem 15 (see CTAN). ! 7267: {\catcode`\@=11 ! 7268: \gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }} ! 7269: \gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@} ! 7270: \gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @} ! 7271: \def\unbrace#1{#1} ! 7272: \unbrace{\gdef\trim@@@ #1 } #2@{#1} ! 7273: } ! 7274: ! 7275: % Trim a single trailing ^^M off a string. ! 7276: {\catcode`\^^M=\other \catcode`\Q=3% ! 7277: \gdef\eatcr #1{\eatcra #1Q^^MQ}% ! 7278: \gdef\eatcra#1^^MQ{\eatcrb#1Q}% ! 7279: \gdef\eatcrb#1Q#2Q{#1}% ! 7280: } ! 7281: ! 7282: % Macro bodies are absorbed as an argument in a context where ! 7283: % all characters are catcode 10, 11 or 12, except \ which is active ! 7284: % (as in normal texinfo). It is necessary to change the definition of \ ! 7285: % to recognize macro arguments; this is the job of \mbodybackslash. ! 7286: % ! 7287: % Non-ASCII encodings make 8-bit characters active, so un-activate ! 7288: % them to avoid their expansion. Must do this non-globally, to ! 7289: % confine the change to the current group. ! 7290: % ! 7291: % It's necessary to have hard CRs when the macro is executed. This is ! 7292: % done by making ^^M (\endlinechar) catcode 12 when reading the macro ! 7293: % body, and then making it the \newlinechar in \scanmacro. ! 7294: % ! 7295: \def\scanctxt{% used as subroutine ! 7296: \catcode`\"=\other ! 7297: \catcode`\+=\other ! 7298: \catcode`\<=\other ! 7299: \catcode`\>=\other ! 7300: \catcode`\@=\other ! 7301: \catcode`\^=\other ! 7302: \catcode`\_=\other ! 7303: \catcode`\|=\other ! 7304: \catcode`\~=\other ! 7305: \ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi ! 7306: } ! 7307: ! 7308: \def\scanargctxt{% used for copying and captions, not macros. ! 7309: \scanctxt ! 7310: \catcode`\\=\other ! 7311: \catcode`\^^M=\other ! 7312: } ! 7313: ! 7314: \def\macrobodyctxt{% used for @macro definitions ! 7315: \scanctxt ! 7316: \catcode`\{=\other ! 7317: \catcode`\}=\other ! 7318: \catcode`\^^M=\other ! 7319: \usembodybackslash ! 7320: } ! 7321: ! 7322: \def\macroargctxt{% used when scanning invocations ! 7323: \scanctxt ! 7324: \catcode`\\=0 ! 7325: } ! 7326: % why catcode 0 for \ in the above? To recognize \\ \{ \} as "escapes" ! 7327: % for the single characters \ { }. Thus, we end up with the "commands" ! 7328: % that would be written @\ @{ @} in a Texinfo document. ! 7329: % ! 7330: % We already have @{ and @}. For @\, we define it here, and only for ! 7331: % this purpose, to produce a typewriter backslash (so, the @\ that we ! 7332: % define for @math can't be used with @macro calls): ! 7333: % ! 7334: \def\\{\normalbackslash}% ! 7335: % ! 7336: % We would like to do this for \, too, since that is what makeinfo does. ! 7337: % But it is not possible, because Texinfo already has a command @, for a ! 7338: % cedilla accent. Documents must use @comma{} instead. ! 7339: % ! 7340: % \anythingelse will almost certainly be an error of some kind. ! 7341: ! 7342: ! 7343: % \mbodybackslash is the definition of \ in @macro bodies. ! 7344: % It maps \foo\ => \csname macarg.foo\endcsname => #N ! 7345: % where N is the macro parameter number. ! 7346: % We define \csname macarg.\endcsname to be \realbackslash, so ! 7347: % \\ in macro replacement text gets you a backslash. ! 7348: % ! 7349: {\catcode`@=0 @catcode`@\=@active ! 7350: @gdef@usembodybackslash{@let\=@mbodybackslash} ! 7351: @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname} ! 7352: } ! 7353: \expandafter\def\csname macarg.\endcsname{\realbackslash} ! 7354: ! 7355: \def\margbackslash#1{\char`\#1 } ! 7356: ! 7357: \def\macro{\recursivefalse\parsearg\macroxxx} ! 7358: \def\rmacro{\recursivetrue\parsearg\macroxxx} ! 7359: ! 7360: \def\macroxxx#1{% ! 7361: \getargs{#1}% now \macname is the macname and \argl the arglist ! 7362: \ifx\argl\empty % no arguments ! 7363: \paramno=0\relax ! 7364: \else ! 7365: \expandafter\parsemargdef \argl;% ! 7366: \if\paramno>256\relax ! 7367: \ifx\eTeXversion\thisisundefined ! 7368: \errhelp = \EMsimple ! 7369: \errmessage{You need eTeX to compile a file with macros with more than 256 arguments} ! 7370: \fi ! 7371: \fi ! 7372: \fi ! 7373: \if1\csname ismacro.\the\macname\endcsname ! 7374: \message{Warning: redefining \the\macname}% ! 7375: \else ! 7376: \expandafter\ifx\csname \the\macname\endcsname \relax ! 7377: \else \errmessage{Macro name \the\macname\space already defined}\fi ! 7378: \global\cslet{macsave.\the\macname}{\the\macname}% ! 7379: \global\expandafter\let\csname ismacro.\the\macname\endcsname=1% ! 7380: \addtomacrolist{\the\macname}% ! 7381: \fi ! 7382: \begingroup \macrobodyctxt ! 7383: \ifrecursive \expandafter\parsermacbody ! 7384: \else \expandafter\parsemacbody ! 7385: \fi} ! 7386: ! 7387: \parseargdef\unmacro{% ! 7388: \if1\csname ismacro.#1\endcsname ! 7389: \global\cslet{#1}{macsave.#1}% ! 7390: \global\expandafter\let \csname ismacro.#1\endcsname=0% ! 7391: % Remove the macro name from \macrolist: ! 7392: \begingroup ! 7393: \expandafter\let\csname#1\endcsname \relax ! 7394: \let\definedummyword\unmacrodo ! 7395: \xdef\macrolist{\macrolist}% ! 7396: \endgroup ! 7397: \else ! 7398: \errmessage{Macro #1 not defined}% ! 7399: \fi ! 7400: } ! 7401: ! 7402: % Called by \do from \dounmacro on each macro. The idea is to omit any ! 7403: % macro definitions that have been changed to \relax. ! 7404: % ! 7405: \def\unmacrodo#1{% ! 7406: \ifx #1\relax ! 7407: % remove this ! 7408: \else ! 7409: \noexpand\definedummyword \noexpand#1% ! 7410: \fi ! 7411: } ! 7412: ! 7413: % This makes use of the obscure feature that if the last token of a ! 7414: % <parameter list> is #, then the preceding argument is delimited by ! 7415: % an opening brace, and that opening brace is not consumed. ! 7416: \def\getargs#1{\getargsxxx#1{}} ! 7417: \def\getargsxxx#1#{\getmacname #1 \relax\getmacargs} ! 7418: \def\getmacname#1 #2\relax{\macname={#1}} ! 7419: \def\getmacargs#1{\def\argl{#1}} ! 7420: ! 7421: % For macro processing make @ a letter so that we can make Texinfo private macro names. ! 7422: \edef\texiatcatcode{\the\catcode`\@} ! 7423: \catcode `@=11\relax ! 7424: ! 7425: % Parse the optional {params} list. Set up \paramno and \paramlist ! 7426: % so \defmacro knows what to do. Define \macarg.BLAH for each BLAH ! 7427: % in the params list to some hook where the argument si to be expanded. If ! 7428: % there are less than 10 arguments that hook is to be replaced by ##N where N ! 7429: % is the position in that list, that is to say the macro arguments are to be ! 7430: % defined `a la TeX in the macro body. ! 7431: % ! 7432: % That gets used by \mbodybackslash (above). ! 7433: % ! 7434: % We need to get `macro parameter char #' into several definitions. ! 7435: % The technique used is stolen from LaTeX: let \hash be something ! 7436: % unexpandable, insert that wherever you need a #, and then redefine ! 7437: % it to # just before using the token list produced. ! 7438: % ! 7439: % The same technique is used to protect \eatspaces till just before ! 7440: % the macro is used. ! 7441: % ! 7442: % If there are 10 or more arguments, a different technique is used, where the ! 7443: % hook remains in the body, and when macro is to be expanded the body is ! 7444: % processed again to replace the arguments. ! 7445: % ! 7446: % In that case, the hook is \the\toks N-1, and we simply set \toks N-1 to the ! 7447: % argument N value and then \edef the body (nothing else will expand because of ! 7448: % the catcode regime underwhich the body was input). ! 7449: % ! 7450: % If you compile with TeX (not eTeX), and you have macros with 10 or more ! 7451: % arguments, you need that no macro has more than 256 arguments, otherwise an ! 7452: % error is produced. ! 7453: \def\parsemargdef#1;{% ! 7454: \paramno=0\def\paramlist{}% ! 7455: \let\hash\relax ! 7456: \let\xeatspaces\relax ! 7457: \parsemargdefxxx#1,;,% ! 7458: % In case that there are 10 or more arguments we parse again the arguments ! 7459: % list to set new definitions for the \macarg.BLAH macros corresponding to ! 7460: % each BLAH argument. It was anyhow needed to parse already once this list ! 7461: % in order to count the arguments, and as macros with at most 9 arguments ! 7462: % are by far more frequent than macro with 10 or more arguments, defining ! 7463: % twice the \macarg.BLAH macros does not cost too much processing power. ! 7464: \ifnum\paramno<10\relax\else ! 7465: \paramno0\relax ! 7466: \parsemmanyargdef@@#1,;,% 10 or more arguments ! 7467: \fi ! 7468: } ! 7469: \def\parsemargdefxxx#1,{% ! 7470: \if#1;\let\next=\relax ! 7471: \else \let\next=\parsemargdefxxx ! 7472: \advance\paramno by 1 ! 7473: \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname ! 7474: {\xeatspaces{\hash\the\paramno}}% ! 7475: \edef\paramlist{\paramlist\hash\the\paramno,}% ! 7476: \fi\next} ! 7477: ! 7478: \def\parsemmanyargdef@@#1,{% ! 7479: \if#1;\let\next=\relax ! 7480: \else ! 7481: \let\next=\parsemmanyargdef@@ ! 7482: \edef\tempb{\eatspaces{#1}}% ! 7483: \expandafter\def\expandafter\tempa ! 7484: \expandafter{\csname macarg.\tempb\endcsname}% ! 7485: % Note that we need some extra \noexpand\noexpand, this is because we ! 7486: % don't want \the to be expanded in the \parsermacbody as it uses an ! 7487: % \xdef . ! 7488: \expandafter\edef\tempa ! 7489: {\noexpand\noexpand\noexpand\the\toks\the\paramno}% ! 7490: \advance\paramno by 1\relax ! 7491: \fi\next} ! 7492: ! 7493: % These two commands read recursive and nonrecursive macro bodies. ! 7494: % (They're different since rec and nonrec macros end differently.) ! 7495: % ! 7496: ! 7497: \catcode `\@\texiatcatcode ! 7498: \long\def\parsemacbody#1@end macro% ! 7499: {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% ! 7500: \long\def\parsermacbody#1@end rmacro% ! 7501: {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% ! 7502: \catcode `\@=11\relax ! 7503: ! 7504: \let\endargs@\relax ! 7505: \let\nil@\relax ! 7506: \def\nilm@{\nil@}% ! 7507: \long\def\nillm@{\nil@}% ! 7508: ! 7509: % This macro is expanded during the Texinfo macro expansion, not during its ! 7510: % definition. It gets all the arguments values and assigns them to macros ! 7511: % macarg.ARGNAME ! 7512: % ! 7513: % #1 is the macro name ! 7514: % #2 is the list of argument names ! 7515: % #3 is the list of argument values ! 7516: \def\getargvals@#1#2#3{% ! 7517: \def\macargdeflist@{}% ! 7518: \def\saveparamlist@{#2}% Need to keep a copy for parameter expansion. ! 7519: \def\paramlist{#2,\nil@}% ! 7520: \def\macroname{#1}% ! 7521: \begingroup ! 7522: \macroargctxt ! 7523: \def\argvaluelist{#3,\nil@}% ! 7524: \def\@tempa{#3}% ! 7525: \ifx\@tempa\empty ! 7526: \setemptyargvalues@ ! 7527: \else ! 7528: \getargvals@@ ! 7529: \fi ! 7530: } ! 7531: ! 7532: % ! 7533: \def\getargvals@@{% ! 7534: \ifx\paramlist\nilm@ ! 7535: % Some sanity check needed here that \argvaluelist is also empty. ! 7536: \ifx\argvaluelist\nillm@ ! 7537: \else ! 7538: \errhelp = \EMsimple ! 7539: \errmessage{Too many arguments in macro `\macroname'!}% ! 7540: \fi ! 7541: \let\next\macargexpandinbody@ ! 7542: \else ! 7543: \ifx\argvaluelist\nillm@ ! 7544: % No more arguments values passed to macro. Set remaining named-arg ! 7545: % macros to empty. ! 7546: \let\next\setemptyargvalues@ ! 7547: \else ! 7548: % pop current arg name into \@tempb ! 7549: \def\@tempa##1{\pop@{\@tempb}{\paramlist}##1\endargs@}% ! 7550: \expandafter\@tempa\expandafter{\paramlist}% ! 7551: % pop current argument value into \@tempc ! 7552: \def\@tempa##1{\longpop@{\@tempc}{\argvaluelist}##1\endargs@}% ! 7553: \expandafter\@tempa\expandafter{\argvaluelist}% ! 7554: % Here \@tempb is the current arg name and \@tempc is the current arg value. ! 7555: % First place the new argument macro definition into \@tempd ! 7556: \expandafter\macname\expandafter{\@tempc}% ! 7557: \expandafter\let\csname macarg.\@tempb\endcsname\relax ! 7558: \expandafter\def\expandafter\@tempe\expandafter{% ! 7559: \csname macarg.\@tempb\endcsname}% ! 7560: \edef\@tempd{\long\def\@tempe{\the\macname}}% ! 7561: \push@\@tempd\macargdeflist@ ! 7562: \let\next\getargvals@@ ! 7563: \fi ! 7564: \fi ! 7565: \next ! 7566: } ! 7567: ! 7568: \def\push@#1#2{% ! 7569: \expandafter\expandafter\expandafter\def ! 7570: \expandafter\expandafter\expandafter#2% ! 7571: \expandafter\expandafter\expandafter{% ! 7572: \expandafter#1#2}% ! 7573: } ! 7574: ! 7575: % Replace arguments by their values in the macro body, and place the result ! 7576: % in macro \@tempa ! 7577: \def\macvalstoargs@{% ! 7578: % To do this we use the property that token registers that are \the'ed ! 7579: % within an \edef expand only once. So we are going to place all argument ! 7580: % values into respective token registers. ! 7581: % ! 7582: % First we save the token context, and initialize argument numbering. ! 7583: \begingroup ! 7584: \paramno0\relax ! 7585: % Then, for each argument number #N, we place the corresponding argument ! 7586: % value into a new token list register \toks#N ! 7587: \expandafter\putargsintokens@\saveparamlist@,;,% ! 7588: % Then, we expand the body so that argument are replaced by their ! 7589: % values. The trick for values not to be expanded themselves is that they ! 7590: % are within tokens and that tokens expand only once in an \edef . ! 7591: \edef\@tempc{\csname mac.\macroname .body\endcsname}% ! 7592: % Now we restore the token stack pointer to free the token list registers ! 7593: % which we have used, but we make sure that expanded body is saved after ! 7594: % group. ! 7595: \expandafter ! 7596: \endgroup ! 7597: \expandafter\def\expandafter\@tempa\expandafter{\@tempc}% ! 7598: } ! 7599: ! 7600: \def\macargexpandinbody@{% ! 7601: %% Define the named-macro outside of this group and then close this group. ! 7602: \expandafter ! 7603: \endgroup ! 7604: \macargdeflist@ ! 7605: % First the replace in body the macro arguments by their values, the result ! 7606: % is in \@tempa . ! 7607: \macvalstoargs@ ! 7608: % Then we point at the \norecurse or \gobble (for recursive) macro value ! 7609: % with \@tempb . ! 7610: \expandafter\let\expandafter\@tempb\csname mac.\macroname .recurse\endcsname ! 7611: % Depending on whether it is recursive or not, we need some tailing ! 7612: % \egroup . ! 7613: \ifx\@tempb\gobble ! 7614: \let\@tempc\relax ! 7615: \else ! 7616: \let\@tempc\egroup ! 7617: \fi ! 7618: % And now we do the real job: ! 7619: \edef\@tempd{\noexpand\@tempb{\macroname}\noexpand\scanmacro{\@tempa}\@tempc}% ! 7620: \@tempd ! 7621: } ! 7622: ! 7623: \def\putargsintokens@#1,{% ! 7624: \if#1;\let\next\relax ! 7625: \else ! 7626: \let\next\putargsintokens@ ! 7627: % First we allocate the new token list register, and give it a temporary ! 7628: % alias \@tempb . ! 7629: \toksdef\@tempb\the\paramno ! 7630: % Then we place the argument value into that token list register. ! 7631: \expandafter\let\expandafter\@tempa\csname macarg.#1\endcsname ! 7632: \expandafter\@tempb\expandafter{\@tempa}% ! 7633: \advance\paramno by 1\relax ! 7634: \fi ! 7635: \next ! 7636: } ! 7637: ! 7638: % Save the token stack pointer into macro #1 ! 7639: \def\texisavetoksstackpoint#1{\edef#1{\the\@cclvi}} ! 7640: % Restore the token stack pointer from number in macro #1 ! 7641: \def\texirestoretoksstackpoint#1{\expandafter\mathchardef\expandafter\@cclvi#1\relax} ! 7642: % newtoks that can be used non \outer . ! 7643: \def\texinonouternewtoks{\alloc@ 5\toks \toksdef \@cclvi} ! 7644: ! 7645: % Tailing missing arguments are set to empty ! 7646: \def\setemptyargvalues@{% ! 7647: \ifx\paramlist\nilm@ ! 7648: \let\next\macargexpandinbody@ ! 7649: \else ! 7650: \expandafter\setemptyargvaluesparser@\paramlist\endargs@ ! 7651: \let\next\setemptyargvalues@ ! 7652: \fi ! 7653: \next ! 7654: } ! 7655: ! 7656: \def\setemptyargvaluesparser@#1,#2\endargs@{% ! 7657: \expandafter\def\expandafter\@tempa\expandafter{% ! 7658: \expandafter\def\csname macarg.#1\endcsname{}}% ! 7659: \push@\@tempa\macargdeflist@ ! 7660: \def\paramlist{#2}% ! 7661: } ! 7662: ! 7663: % #1 is the element target macro ! 7664: % #2 is the list macro ! 7665: % #3,#4\endargs@ is the list value ! 7666: \def\pop@#1#2#3,#4\endargs@{% ! 7667: \def#1{#3}% ! 7668: \def#2{#4}% ! 7669: } ! 7670: \long\def\longpop@#1#2#3,#4\endargs@{% ! 7671: \long\def#1{#3}% ! 7672: \long\def#2{#4}% ! 7673: } ! 7674: ! 7675: % This defines a Texinfo @macro. There are eight cases: recursive and ! 7676: % nonrecursive macros of zero, one, up to nine, and many arguments. ! 7677: % Much magic with \expandafter here. ! 7678: % \xdef is used so that macro definitions will survive the file ! 7679: % they're defined in; @include reads the file inside a group. ! 7680: % ! 7681: \def\defmacro{% ! 7682: \let\hash=##% convert placeholders to macro parameter chars ! 7683: \ifrecursive ! 7684: \ifcase\paramno ! 7685: % 0 ! 7686: \expandafter\xdef\csname\the\macname\endcsname{% ! 7687: \noexpand\scanmacro{\temp}}% ! 7688: \or % 1 ! 7689: \expandafter\xdef\csname\the\macname\endcsname{% ! 7690: \bgroup\noexpand\macroargctxt ! 7691: \noexpand\braceorline ! 7692: \expandafter\noexpand\csname\the\macname xxx\endcsname}% ! 7693: \expandafter\xdef\csname\the\macname xxx\endcsname##1{% ! 7694: \egroup\noexpand\scanmacro{\temp}}% ! 7695: \else ! 7696: \ifnum\paramno<10\relax % at most 9 ! 7697: \expandafter\xdef\csname\the\macname\endcsname{% ! 7698: \bgroup\noexpand\macroargctxt ! 7699: \noexpand\csname\the\macname xx\endcsname}% ! 7700: \expandafter\xdef\csname\the\macname xx\endcsname##1{% ! 7701: \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% ! 7702: \expandafter\expandafter ! 7703: \expandafter\xdef ! 7704: \expandafter\expandafter ! 7705: \csname\the\macname xxx\endcsname ! 7706: \paramlist{\egroup\noexpand\scanmacro{\temp}}% ! 7707: \else % 10 or more ! 7708: \expandafter\xdef\csname\the\macname\endcsname{% ! 7709: \noexpand\getargvals@{\the\macname}{\argl}% ! 7710: }% ! 7711: \global\expandafter\let\csname mac.\the\macname .body\endcsname\temp ! 7712: \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\gobble ! 7713: \fi ! 7714: \fi ! 7715: \else ! 7716: \ifcase\paramno ! 7717: % 0 ! 7718: \expandafter\xdef\csname\the\macname\endcsname{% ! 7719: \noexpand\norecurse{\the\macname}% ! 7720: \noexpand\scanmacro{\temp}\egroup}% ! 7721: \or % 1 ! 7722: \expandafter\xdef\csname\the\macname\endcsname{% ! 7723: \bgroup\noexpand\macroargctxt ! 7724: \noexpand\braceorline ! 7725: \expandafter\noexpand\csname\the\macname xxx\endcsname}% ! 7726: \expandafter\xdef\csname\the\macname xxx\endcsname##1{% ! 7727: \egroup ! 7728: \noexpand\norecurse{\the\macname}% ! 7729: \noexpand\scanmacro{\temp}\egroup}% ! 7730: \else % at most 9 ! 7731: \ifnum\paramno<10\relax ! 7732: \expandafter\xdef\csname\the\macname\endcsname{% ! 7733: \bgroup\noexpand\macroargctxt ! 7734: \expandafter\noexpand\csname\the\macname xx\endcsname}% ! 7735: \expandafter\xdef\csname\the\macname xx\endcsname##1{% ! 7736: \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% ! 7737: \expandafter\expandafter ! 7738: \expandafter\xdef ! 7739: \expandafter\expandafter ! 7740: \csname\the\macname xxx\endcsname ! 7741: \paramlist{% ! 7742: \egroup ! 7743: \noexpand\norecurse{\the\macname}% ! 7744: \noexpand\scanmacro{\temp}\egroup}% ! 7745: \else % 10 or more: ! 7746: \expandafter\xdef\csname\the\macname\endcsname{% ! 7747: \noexpand\getargvals@{\the\macname}{\argl}% ! 7748: }% ! 7749: \global\expandafter\let\csname mac.\the\macname .body\endcsname\temp ! 7750: \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\norecurse ! 7751: \fi ! 7752: \fi ! 7753: \fi} ! 7754: ! 7755: \catcode `\@\texiatcatcode\relax ! 7756: ! 7757: \def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} ! 7758: ! 7759: % \braceorline decides whether the next nonwhitespace character is a ! 7760: % {. If so it reads up to the closing }, if not, it reads the whole ! 7761: % line. Whatever was read is then fed to the next control sequence ! 7762: % as an argument (by \parsebrace or \parsearg). ! 7763: % ! 7764: \def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx} ! 7765: \def\braceorlinexxx{% ! 7766: \ifx\nchar\bgroup\else ! 7767: \expandafter\parsearg ! 7768: \fi \macnamexxx} ! 7769: ! 7770: ! 7771: % @alias. ! 7772: % We need some trickery to remove the optional spaces around the equal ! 7773: % sign. Make them active and then expand them all to nothing. ! 7774: % ! 7775: \def\alias{\parseargusing\obeyspaces\aliasxxx} ! 7776: \def\aliasxxx #1{\aliasyyy#1\relax} ! 7777: \def\aliasyyy #1=#2\relax{% ! 7778: {% ! 7779: \expandafter\let\obeyedspace=\empty ! 7780: \addtomacrolist{#1}% ! 7781: \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}% ! 7782: }% ! 7783: \next ! 7784: } ! 7785: ! 7786: ! 7787: \message{cross references,} ! 7788: ! 7789: \newwrite\auxfile ! 7790: \newif\ifhavexrefs % True if xref values are known. ! 7791: \newif\ifwarnedxrefs % True if we warned once that they aren't known. ! 7792: ! 7793: % @inforef is relatively simple. ! 7794: \def\inforef #1{\inforefzzz #1,,,,**} ! 7795: \def\inforefzzz #1,#2,#3,#4**{% ! 7796: \putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, ! 7797: node \samp{\ignorespaces#1{}}} ! 7798: ! 7799: % @node's only job in TeX is to define \lastnode, which is used in ! 7800: % cross-references. The @node line might or might not have commas, and ! 7801: % might or might not have spaces before the first comma, like: ! 7802: % @node foo , bar , ... ! 7803: % We don't want such trailing spaces in the node name. ! 7804: % ! 7805: \parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse} ! 7806: % ! 7807: % also remove a trailing comma, in case of something like this: ! 7808: % @node Help-Cross, , , Cross-refs ! 7809: \def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse} ! 7810: \def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}} ! 7811: ! 7812: \let\nwnode=\node ! 7813: \let\lastnode=\empty ! 7814: ! 7815: % Write a cross-reference definition for the current node. #1 is the ! 7816: % type (Ynumbered, Yappendix, Ynothing). ! 7817: % ! 7818: \def\donoderef#1{% ! 7819: \ifx\lastnode\empty\else ! 7820: \setref{\lastnode}{#1}% ! 7821: \global\let\lastnode=\empty ! 7822: \fi ! 7823: } ! 7824: ! 7825: % @anchor{NAME} -- define xref target at arbitrary point. ! 7826: % ! 7827: \newcount\savesfregister ! 7828: % ! 7829: \def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi} ! 7830: \def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi} ! 7831: \def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces} ! 7832: ! 7833: % \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an ! 7834: % anchor), which consists of three parts: ! 7835: % 1) NAME-title - the current sectioning name taken from \lastsection, ! 7836: % or the anchor name. ! 7837: % 2) NAME-snt - section number and type, passed as the SNT arg, or ! 7838: % empty for anchors. ! 7839: % 3) NAME-pg - the page number. ! 7840: % ! 7841: % This is called from \donoderef, \anchor, and \dofloat. In the case of ! 7842: % floats, there is an additional part, which is not written here: ! 7843: % 4) NAME-lof - the text as it should appear in a @listoffloats. ! 7844: % ! 7845: \def\setref#1#2{% ! 7846: \pdfmkdest{#1}% ! 7847: \iflinks ! 7848: {% ! 7849: \atdummies % preserve commands, but don't expand them ! 7850: \edef\writexrdef##1##2{% ! 7851: \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef ! 7852: ##1}{##2}}% these are parameters of \writexrdef ! 7853: }% ! 7854: \toks0 = \expandafter{\lastsection}% ! 7855: \immediate \writexrdef{title}{\the\toks0 }% ! 7856: \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc. ! 7857: \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, at \shipout ! 7858: }% ! 7859: \fi ! 7860: } ! 7861: ! 7862: % @xrefautosectiontitle on|off says whether @section(ing) names are used ! 7863: % automatically in xrefs, if the third arg is not explicitly specified. ! 7864: % This was provided as a "secret" @set xref-automatic-section-title ! 7865: % variable, now it's official. ! 7866: % ! 7867: \parseargdef\xrefautomaticsectiontitle{% ! 7868: \def\temp{#1}% ! 7869: \ifx\temp\onword ! 7870: \expandafter\let\csname SETxref-automatic-section-title\endcsname ! 7871: = \empty ! 7872: \else\ifx\temp\offword ! 7873: \expandafter\let\csname SETxref-automatic-section-title\endcsname ! 7874: = \relax ! 7875: \else ! 7876: \errhelp = \EMsimple ! 7877: \errmessage{Unknown @xrefautomaticsectiontitle value `\temp', ! 7878: must be on|off}% ! 7879: \fi\fi ! 7880: } ! 7881: ! 7882: % ! 7883: % @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is ! 7884: % the node name, #2 the name of the Info cross-reference, #3 the printed ! 7885: % node name, #4 the name of the Info file, #5 the name of the printed ! 7886: % manual. All but the node name can be omitted. ! 7887: % ! 7888: \def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]} ! 7889: \def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} ! 7890: \def\ref#1{\xrefX[#1,,,,,,,]} ! 7891: % ! 7892: \newbox\toprefbox ! 7893: \newbox\printedrefnamebox ! 7894: \newbox\infofilenamebox ! 7895: \newbox\printedmanualbox ! 7896: % ! 7897: \def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup ! 7898: \unsepspaces ! 7899: % ! 7900: % Get args without leading/trailing spaces. ! 7901: \def\printedrefname{\ignorespaces #3}% ! 7902: \setbox\printedrefnamebox = \hbox{\printedrefname\unskip}% ! 7903: % ! 7904: \def\infofilename{\ignorespaces #4}% ! 7905: \setbox\infofilenamebox = \hbox{\infofilename\unskip}% ! 7906: % ! 7907: \def\printedmanual{\ignorespaces #5}% ! 7908: \setbox\printedmanualbox = \hbox{\printedmanual\unskip}% ! 7909: % ! 7910: % If the printed reference name (arg #3) was not explicitly given in ! 7911: % the @xref, figure out what we want to use. ! 7912: \ifdim \wd\printedrefnamebox = 0pt ! 7913: % No printed node name was explicitly given. ! 7914: \expandafter\ifx\csname SETxref-automatic-section-title\endcsname \relax ! 7915: % Not auto section-title: use node name inside the square brackets. ! 7916: \def\printedrefname{\ignorespaces #1}% ! 7917: \else ! 7918: % Auto section-title: use chapter/section title inside ! 7919: % the square brackets if we have it. ! 7920: \ifdim \wd\printedmanualbox > 0pt ! 7921: % It is in another manual, so we don't have it; use node name. ! 7922: \def\printedrefname{\ignorespaces #1}% ! 7923: \else ! 7924: \ifhavexrefs ! 7925: % We (should) know the real title if we have the xref values. ! 7926: \def\printedrefname{\refx{#1-title}{}}% ! 7927: \else ! 7928: % Otherwise just copy the Info node name. ! 7929: \def\printedrefname{\ignorespaces #1}% ! 7930: \fi% ! 7931: \fi ! 7932: \fi ! 7933: \fi ! 7934: % ! 7935: % Make link in pdf output. ! 7936: \ifpdf ! 7937: {\indexnofonts ! 7938: \turnoffactive ! 7939: \makevalueexpandable ! 7940: % This expands tokens, so do it after making catcode changes, so _ ! 7941: % etc. don't get their TeX definitions. This ignores all spaces in ! 7942: % #4, including (wrongly) those in the middle of the filename. ! 7943: \getfilename{#4}% ! 7944: % ! 7945: % This (wrongly) does not take account of leading or trailing ! 7946: % spaces in #1, which should be ignored. ! 7947: \edef\pdfxrefdest{#1}% ! 7948: \ifx\pdfxrefdest\empty ! 7949: \def\pdfxrefdest{Top}% no empty targets ! 7950: \else ! 7951: \txiescapepdf\pdfxrefdest % escape PDF special chars ! 7952: \fi ! 7953: % ! 7954: \leavevmode ! 7955: \startlink attr{/Border [0 0 0]}% ! 7956: \ifnum\filenamelength>0 ! 7957: goto file{\the\filename.pdf} name{\pdfxrefdest}% ! 7958: \else ! 7959: goto name{\pdfmkpgn{\pdfxrefdest}}% ! 7960: \fi ! 7961: }% ! 7962: \setcolor{\linkcolor}% ! 7963: \fi ! 7964: % ! 7965: % Float references are printed completely differently: "Figure 1.2" ! 7966: % instead of "[somenode], p.3". We distinguish them by the ! 7967: % LABEL-title being set to a magic string. ! 7968: {% ! 7969: % Have to otherify everything special to allow the \csname to ! 7970: % include an _ in the xref name, etc. ! 7971: \indexnofonts ! 7972: \turnoffactive ! 7973: \expandafter\global\expandafter\let\expandafter\Xthisreftitle ! 7974: \csname XR#1-title\endcsname ! 7975: }% ! 7976: \iffloat\Xthisreftitle ! 7977: % If the user specified the print name (third arg) to the ref, ! 7978: % print it instead of our usual "Figure 1.2". ! 7979: \ifdim\wd\printedrefnamebox = 0pt ! 7980: \refx{#1-snt}{}% ! 7981: \else ! 7982: \printedrefname ! 7983: \fi ! 7984: % ! 7985: % If the user also gave the printed manual name (fifth arg), append ! 7986: % "in MANUALNAME". ! 7987: \ifdim \wd\printedmanualbox > 0pt ! 7988: \space \putwordin{} \cite{\printedmanual}% ! 7989: \fi ! 7990: \else ! 7991: % node/anchor (non-float) references. ! 7992: % ! 7993: % If we use \unhbox to print the node names, TeX does not insert ! 7994: % empty discretionaries after hyphens, which means that it will not ! 7995: % find a line break at a hyphen in a node names. Since some manuals ! 7996: % are best written with fairly long node names, containing hyphens, ! 7997: % this is a loss. Therefore, we give the text of the node name ! 7998: % again, so it is as if TeX is seeing it for the first time. ! 7999: % ! 8000: \ifdim \wd\printedmanualbox > 0pt ! 8001: % Cross-manual reference with a printed manual name. ! 8002: % ! 8003: \crossmanualxref{\cite{\printedmanual\unskip}}% ! 8004: % ! 8005: \else\ifdim \wd\infofilenamebox > 0pt ! 8006: % Cross-manual reference with only an info filename (arg 4), no ! 8007: % printed manual name (arg 5). This is essentially the same as ! 8008: % the case above; we output the filename, since we have nothing else. ! 8009: % ! 8010: \crossmanualxref{\code{\infofilename\unskip}}% ! 8011: % ! 8012: \else ! 8013: % Reference within this manual. ! 8014: % ! 8015: % _ (for example) has to be the character _ for the purposes of the ! 8016: % control sequence corresponding to the node, but it has to expand ! 8017: % into the usual \leavevmode...\vrule stuff for purposes of ! 8018: % printing. So we \turnoffactive for the \refx-snt, back on for the ! 8019: % printing, back off for the \refx-pg. ! 8020: {\turnoffactive ! 8021: % Only output a following space if the -snt ref is nonempty; for ! 8022: % @unnumbered and @anchor, it won't be. ! 8023: \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}% ! 8024: \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi ! 8025: }% ! 8026: % output the `[mynode]' via the macro below so it can be overridden. ! 8027: \xrefprintnodename\printedrefname ! 8028: % ! 8029: % But we always want a comma and a space: ! 8030: ,\space ! 8031: % ! 8032: % output the `page 3'. ! 8033: \turnoffactive \putwordpage\tie\refx{#1-pg}{}% ! 8034: \fi\fi ! 8035: \fi ! 8036: \endlink ! 8037: \endgroup} ! 8038: ! 8039: % Output a cross-manual xref to #1. Used just above (twice). ! 8040: % ! 8041: % Only include the text "Section ``foo'' in" if the foo is neither ! 8042: % missing or Top. Thus, @xref{,,,foo,The Foo Manual} outputs simply ! 8043: % "see The Foo Manual", the idea being to refer to the whole manual. ! 8044: % ! 8045: % But, this being TeX, we can't easily compare our node name against the ! 8046: % string "Top" while ignoring the possible spaces before and after in ! 8047: % the input. By adding the arbitrary 7sp below, we make it much less ! 8048: % likely that a real node name would have the same width as "Top" (e.g., ! 8049: % in a monospaced font). Hopefully it will never happen in practice. ! 8050: % ! 8051: % For the same basic reason, we retypeset the "Top" at every ! 8052: % reference, since the current font is indeterminate. ! 8053: % ! 8054: \def\crossmanualxref#1{% ! 8055: \setbox\toprefbox = \hbox{Top\kern7sp}% ! 8056: \setbox2 = \hbox{\ignorespaces \printedrefname \unskip \kern7sp}% ! 8057: \ifdim \wd2 > 7sp % nonempty? ! 8058: \ifdim \wd2 = \wd\toprefbox \else % same as Top? ! 8059: \putwordSection{} ``\printedrefname'' \putwordin{}\space ! 8060: \fi ! 8061: \fi ! 8062: #1% ! 8063: } ! 8064: ! 8065: % This macro is called from \xrefX for the `[nodename]' part of xref ! 8066: % output. It's a separate macro only so it can be changed more easily, ! 8067: % since square brackets don't work well in some documents. Particularly ! 8068: % one that Bob is working on :). ! 8069: % ! 8070: \def\xrefprintnodename#1{[#1]} ! 8071: ! 8072: % Things referred to by \setref. ! 8073: % ! 8074: \def\Ynothing{} ! 8075: \def\Yomitfromtoc{} ! 8076: \def\Ynumbered{% ! 8077: \ifnum\secno=0 ! 8078: \putwordChapter@tie \the\chapno ! 8079: \else \ifnum\subsecno=0 ! 8080: \putwordSection@tie \the\chapno.\the\secno ! 8081: \else \ifnum\subsubsecno=0 ! 8082: \putwordSection@tie \the\chapno.\the\secno.\the\subsecno ! 8083: \else ! 8084: \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno ! 8085: \fi\fi\fi ! 8086: } ! 8087: \def\Yappendix{% ! 8088: \ifnum\secno=0 ! 8089: \putwordAppendix@tie @char\the\appendixno{}% ! 8090: \else \ifnum\subsecno=0 ! 8091: \putwordSection@tie @char\the\appendixno.\the\secno ! 8092: \else \ifnum\subsubsecno=0 ! 8093: \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno ! 8094: \else ! 8095: \putwordSection@tie ! 8096: @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno ! 8097: \fi\fi\fi ! 8098: } ! 8099: ! 8100: % Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME. ! 8101: % If its value is nonempty, SUFFIX is output afterward. ! 8102: % ! 8103: \def\refx#1#2{% ! 8104: {% ! 8105: \indexnofonts ! 8106: \otherbackslash ! 8107: \expandafter\global\expandafter\let\expandafter\thisrefX ! 8108: \csname XR#1\endcsname ! 8109: }% ! 8110: \ifx\thisrefX\relax ! 8111: % If not defined, say something at least. ! 8112: \angleleft un\-de\-fined\angleright ! 8113: \iflinks ! 8114: \ifhavexrefs ! 8115: {\toks0 = {#1}% avoid expansion of possibly-complex value ! 8116: \message{\linenumber Undefined cross reference `\the\toks0'.}}% ! 8117: \else ! 8118: \ifwarnedxrefs\else ! 8119: \global\warnedxrefstrue ! 8120: \message{Cross reference values unknown; you must run TeX again.}% ! 8121: \fi ! 8122: \fi ! 8123: \fi ! 8124: \else ! 8125: % It's defined, so just use it. ! 8126: \thisrefX ! 8127: \fi ! 8128: #2% Output the suffix in any case. ! 8129: } ! 8130: ! 8131: % This is the macro invoked by entries in the aux file. Usually it's ! 8132: % just a \def (we prepend XR to the control sequence name to avoid ! 8133: % collisions). But if this is a float type, we have more work to do. ! 8134: % ! 8135: \def\xrdef#1#2{% ! 8136: {% The node name might contain 8-bit characters, which in our current ! 8137: % implementation are changed to commands like @'e. Don't let these ! 8138: % mess up the control sequence name. ! 8139: \indexnofonts ! 8140: \turnoffactive ! 8141: \xdef\safexrefname{#1}% ! 8142: }% ! 8143: % ! 8144: \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% remember this xref ! 8145: % ! 8146: % Was that xref control sequence that we just defined for a float? ! 8147: \expandafter\iffloat\csname XR\safexrefname\endcsname ! 8148: % it was a float, and we have the (safe) float type in \iffloattype. ! 8149: \expandafter\let\expandafter\floatlist ! 8150: \csname floatlist\iffloattype\endcsname ! 8151: % ! 8152: % Is this the first time we've seen this float type? ! 8153: \expandafter\ifx\floatlist\relax ! 8154: \toks0 = {\do}% yes, so just \do ! 8155: \else ! 8156: % had it before, so preserve previous elements in list. ! 8157: \toks0 = \expandafter{\floatlist\do}% ! 8158: \fi ! 8159: % ! 8160: % Remember this xref in the control sequence \floatlistFLOATTYPE, ! 8161: % for later use in \listoffloats. ! 8162: \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0 ! 8163: {\safexrefname}}% ! 8164: \fi ! 8165: } ! 8166: ! 8167: % Read the last existing aux file, if any. No error if none exists. ! 8168: % ! 8169: \def\tryauxfile{% ! 8170: \openin 1 \jobname.aux ! 8171: \ifeof 1 \else ! 8172: \readdatafile{aux}% ! 8173: \global\havexrefstrue ! 8174: \fi ! 8175: \closein 1 ! 8176: } ! 8177: ! 8178: \def\setupdatafile{% ! 8179: \catcode`\^^@=\other ! 8180: \catcode`\^^A=\other ! 8181: \catcode`\^^B=\other ! 8182: \catcode`\^^C=\other ! 8183: \catcode`\^^D=\other ! 8184: \catcode`\^^E=\other ! 8185: \catcode`\^^F=\other ! 8186: \catcode`\^^G=\other ! 8187: \catcode`\^^H=\other ! 8188: \catcode`\^^K=\other ! 8189: \catcode`\^^L=\other ! 8190: \catcode`\^^N=\other ! 8191: \catcode`\^^P=\other ! 8192: \catcode`\^^Q=\other ! 8193: \catcode`\^^R=\other ! 8194: \catcode`\^^S=\other ! 8195: \catcode`\^^T=\other ! 8196: \catcode`\^^U=\other ! 8197: \catcode`\^^V=\other ! 8198: \catcode`\^^W=\other ! 8199: \catcode`\^^X=\other ! 8200: \catcode`\^^Z=\other ! 8201: \catcode`\^^[=\other ! 8202: \catcode`\^^\=\other ! 8203: \catcode`\^^]=\other ! 8204: \catcode`\^^^=\other ! 8205: \catcode`\^^_=\other ! 8206: % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc. ! 8207: % in xref tags, i.e., node names. But since ^^e4 notation isn't ! 8208: % supported in the main text, it doesn't seem desirable. Furthermore, ! 8209: % that is not enough: for node names that actually contain a ^ ! 8210: % character, we would end up writing a line like this: 'xrdef {'hat ! 8211: % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first ! 8212: % argument, and \hat is not an expandable control sequence. It could ! 8213: % all be worked out, but why? Either we support ^^ or we don't. ! 8214: % ! 8215: % The other change necessary for this was to define \auxhat: ! 8216: % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter ! 8217: % and then to call \auxhat in \setq. ! 8218: % ! 8219: \catcode`\^=\other ! 8220: % ! 8221: % Special characters. Should be turned off anyway, but... ! 8222: \catcode`\~=\other ! 8223: \catcode`\[=\other ! 8224: \catcode`\]=\other ! 8225: \catcode`\"=\other ! 8226: \catcode`\_=\other ! 8227: \catcode`\|=\other ! 8228: \catcode`\<=\other ! 8229: \catcode`\>=\other ! 8230: \catcode`\$=\other ! 8231: \catcode`\#=\other ! 8232: \catcode`\&=\other ! 8233: \catcode`\%=\other ! 8234: \catcode`+=\other % avoid \+ for paranoia even though we've turned it off ! 8235: % ! 8236: % This is to support \ in node names and titles, since the \ ! 8237: % characters end up in a \csname. It's easier than ! 8238: % leaving it active and making its active definition an actual \ ! 8239: % character. What I don't understand is why it works in the *value* ! 8240: % of the xrdef. Seems like it should be a catcode12 \, and that ! 8241: % should not typeset properly. But it works, so I'm moving on for ! 8242: % now. --karl, 15jan04. ! 8243: \catcode`\\=\other ! 8244: % ! 8245: % Make the characters 128-255 be printing characters. ! 8246: {% ! 8247: \count1=128 ! 8248: \def\loop{% ! 8249: \catcode\count1=\other ! 8250: \advance\count1 by 1 ! 8251: \ifnum \count1<256 \loop \fi ! 8252: }% ! 8253: }% ! 8254: % ! 8255: % @ is our escape character in .aux files, and we need braces. ! 8256: \catcode`\{=1 ! 8257: \catcode`\}=2 ! 8258: \catcode`\@=0 ! 8259: } ! 8260: ! 8261: \def\readdatafile#1{% ! 8262: \begingroup ! 8263: \setupdatafile ! 8264: \input\jobname.#1 ! 8265: \endgroup} ! 8266: ! 8267: ! 8268: \message{insertions,} ! 8269: % including footnotes. ! 8270: ! 8271: \newcount \footnoteno ! 8272: ! 8273: % The trailing space in the following definition for supereject is ! 8274: % vital for proper filling; pages come out unaligned when you do a ! 8275: % pagealignmacro call if that space before the closing brace is ! 8276: % removed. (Generally, numeric constants should always be followed by a ! 8277: % space to prevent strange expansion errors.) ! 8278: \def\supereject{\par\penalty -20000\footnoteno =0 } ! 8279: ! 8280: % @footnotestyle is meaningful for Info output only. ! 8281: \let\footnotestyle=\comment ! 8282: ! 8283: {\catcode `\@=11 ! 8284: % ! 8285: % Auto-number footnotes. Otherwise like plain. ! 8286: \gdef\footnote{% ! 8287: \let\indent=\ptexindent ! 8288: \let\noindent=\ptexnoindent ! 8289: \global\advance\footnoteno by \@ne ! 8290: \edef\thisfootno{$^{\the\footnoteno}$}% ! 8291: % ! 8292: % In case the footnote comes at the end of a sentence, preserve the ! 8293: % extra spacing after we do the footnote number. ! 8294: \let\@sf\empty ! 8295: \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi ! 8296: % ! 8297: % Remove inadvertent blank space before typesetting the footnote number. ! 8298: \unskip ! 8299: \thisfootno\@sf ! 8300: \dofootnote ! 8301: }% ! 8302: ! 8303: % Don't bother with the trickery in plain.tex to not require the ! 8304: % footnote text as a parameter. Our footnotes don't need to be so general. ! 8305: % ! 8306: % Oh yes, they do; otherwise, @ifset (and anything else that uses ! 8307: % \parseargline) fails inside footnotes because the tokens are fixed when ! 8308: % the footnote is read. --karl, 16nov96. ! 8309: % ! 8310: \gdef\dofootnote{% ! 8311: \insert\footins\bgroup ! 8312: % We want to typeset this text as a normal paragraph, even if the ! 8313: % footnote reference occurs in (for example) a display environment. ! 8314: % So reset some parameters. ! 8315: \hsize=\pagewidth ! 8316: \interlinepenalty\interfootnotelinepenalty ! 8317: \splittopskip\ht\strutbox % top baseline for broken footnotes ! 8318: \splitmaxdepth\dp\strutbox ! 8319: \floatingpenalty\@MM ! 8320: \leftskip\z@skip ! 8321: \rightskip\z@skip ! 8322: \spaceskip\z@skip ! 8323: \xspaceskip\z@skip ! 8324: \parindent\defaultparindent ! 8325: % ! 8326: \smallfonts \rm ! 8327: % ! 8328: % Because we use hanging indentation in footnotes, a @noindent appears ! 8329: % to exdent this text, so make it be a no-op. makeinfo does not use ! 8330: % hanging indentation so @noindent can still be needed within footnote ! 8331: % text after an @example or the like (not that this is good style). ! 8332: \let\noindent = \relax ! 8333: % ! 8334: % Hang the footnote text off the number. Use \everypar in case the ! 8335: % footnote extends for more than one paragraph. ! 8336: \everypar = {\hang}% ! 8337: \textindent{\thisfootno}% ! 8338: % ! 8339: % Don't crash into the line above the footnote text. Since this ! 8340: % expands into a box, it must come within the paragraph, lest it ! 8341: % provide a place where TeX can split the footnote. ! 8342: \footstrut ! 8343: % ! 8344: % Invoke rest of plain TeX footnote routine. ! 8345: \futurelet\next\fo@t ! 8346: } ! 8347: }%end \catcode `\@=11 ! 8348: ! 8349: % In case a @footnote appears in a vbox, save the footnote text and create ! 8350: % the real \insert just after the vbox finished. Otherwise, the insertion ! 8351: % would be lost. ! 8352: % Similarly, if a @footnote appears inside an alignment, save the footnote ! 8353: % text to a box and make the \insert when a row of the table is finished. ! 8354: % And the same can be done for other insert classes. --kasal, 16nov03. ! 8355: ! 8356: % Replace the \insert primitive by a cheating macro. ! 8357: % Deeper inside, just make sure that the saved insertions are not spilled ! 8358: % out prematurely. ! 8359: % ! 8360: \def\startsavinginserts{% ! 8361: \ifx \insert\ptexinsert ! 8362: \let\insert\saveinsert ! 8363: \else ! 8364: \let\checkinserts\relax ! 8365: \fi ! 8366: } ! 8367: ! 8368: % This \insert replacement works for both \insert\footins{foo} and ! 8369: % \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}. ! 8370: % ! 8371: \def\saveinsert#1{% ! 8372: \edef\next{\noexpand\savetobox \makeSAVEname#1}% ! 8373: \afterassignment\next ! 8374: % swallow the left brace ! 8375: \let\temp = ! 8376: } ! 8377: \def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}} ! 8378: \def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1} ! 8379: ! 8380: \def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi} ! 8381: ! 8382: \def\placesaveins#1{% ! 8383: \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname ! 8384: {\box#1}% ! 8385: } ! 8386: ! 8387: % eat @SAVE -- beware, all of them have catcode \other: ! 8388: { ! 8389: \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-) ! 8390: \gdef\gobblesave @SAVE{} ! 8391: } ! 8392: ! 8393: % initialization: ! 8394: \def\newsaveins #1{% ! 8395: \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}% ! 8396: \next ! 8397: } ! 8398: \def\newsaveinsX #1{% ! 8399: \csname newbox\endcsname #1% ! 8400: \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts ! 8401: \checksaveins #1}% ! 8402: } ! 8403: ! 8404: % initialize: ! 8405: \let\checkinserts\empty ! 8406: \newsaveins\footins ! 8407: \newsaveins\margin ! 8408: ! 8409: ! 8410: % @image. We use the macros from epsf.tex to support this. ! 8411: % If epsf.tex is not installed and @image is used, we complain. ! 8412: % ! 8413: % Check for and read epsf.tex up front. If we read it only at @image ! 8414: % time, we might be inside a group, and then its definitions would get ! 8415: % undone and the next image would fail. ! 8416: \openin 1 = epsf.tex ! 8417: \ifeof 1 \else ! 8418: % Do not bother showing banner with epsf.tex v2.7k (available in ! 8419: % doc/epsf.tex and on ctan). ! 8420: \def\epsfannounce{\toks0 = }% ! 8421: \input epsf.tex ! 8422: \fi ! 8423: \closein 1 ! 8424: % ! 8425: % We will only complain once about lack of epsf.tex. ! 8426: \newif\ifwarnednoepsf ! 8427: \newhelp\noepsfhelp{epsf.tex must be installed for images to ! 8428: work. It is also included in the Texinfo distribution, or you can get ! 8429: it from ftp://tug.org/tex/epsf.tex.} ! 8430: % ! 8431: \def\image#1{% ! 8432: \ifx\epsfbox\thisisundefined ! 8433: \ifwarnednoepsf \else ! 8434: \errhelp = \noepsfhelp ! 8435: \errmessage{epsf.tex not found, images will be ignored}% ! 8436: \global\warnednoepsftrue ! 8437: \fi ! 8438: \else ! 8439: \imagexxx #1,,,,,\finish ! 8440: \fi ! 8441: } ! 8442: % ! 8443: % Arguments to @image: ! 8444: % #1 is (mandatory) image filename; we tack on .eps extension. ! 8445: % #2 is (optional) width, #3 is (optional) height. ! 8446: % #4 is (ignored optional) html alt text. ! 8447: % #5 is (ignored optional) extension. ! 8448: % #6 is just the usual extra ignored arg for parsing stuff. ! 8449: \newif\ifimagevmode ! 8450: \def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup ! 8451: \catcode`\^^M = 5 % in case we're inside an example ! 8452: \normalturnoffactive % allow _ et al. in names ! 8453: % If the image is by itself, center it. ! 8454: \ifvmode ! 8455: \imagevmodetrue ! 8456: \else \ifx\centersub\centerV ! 8457: % for @center @image, we need a vbox so we can have our vertical space ! 8458: \imagevmodetrue ! 8459: \vbox\bgroup % vbox has better behavior than vtop herev ! 8460: \fi\fi ! 8461: % ! 8462: \ifimagevmode ! 8463: \nobreak\medskip ! 8464: % Usually we'll have text after the image which will insert ! 8465: % \parskip glue, so insert it here too to equalize the space ! 8466: % above and below. ! 8467: \nobreak\vskip\parskip ! 8468: \nobreak ! 8469: \fi ! 8470: % ! 8471: % Leave vertical mode so that indentation from an enclosing ! 8472: % environment such as @quotation is respected. ! 8473: % However, if we're at the top level, we don't want the ! 8474: % normal paragraph indentation. ! 8475: % On the other hand, if we are in the case of @center @image, we don't ! 8476: % want to start a paragraph, which will create a hsize-width box and ! 8477: % eradicate the centering. ! 8478: \ifx\centersub\centerV\else \noindent \fi ! 8479: % ! 8480: % Output the image. ! 8481: \ifpdf ! 8482: \dopdfimage{#1}{#2}{#3}% ! 8483: \else ! 8484: % \epsfbox itself resets \epsf?size at each figure. ! 8485: \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi ! 8486: \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi ! 8487: \epsfbox{#1.eps}% ! 8488: \fi ! 8489: % ! 8490: \ifimagevmode ! 8491: \medskip % space after a standalone image ! 8492: \fi ! 8493: \ifx\centersub\centerV \egroup \fi ! 8494: \endgroup} ! 8495: ! 8496: ! 8497: % @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables, ! 8498: % etc. We don't actually implement floating yet, we always include the ! 8499: % float "here". But it seemed the best name for the future. ! 8500: % ! 8501: \envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish} ! 8502: ! 8503: % There may be a space before second and/or third parameter; delete it. ! 8504: \def\eatcommaspace#1, {#1,} ! 8505: ! 8506: % #1 is the optional FLOATTYPE, the text label for this float, typically ! 8507: % "Figure", "Table", "Example", etc. Can't contain commas. If omitted, ! 8508: % this float will not be numbered and cannot be referred to. ! 8509: % ! 8510: % #2 is the optional xref label. Also must be present for the float to ! 8511: % be referable. ! 8512: % ! 8513: % #3 is the optional positioning argument; for now, it is ignored. It ! 8514: % will somehow specify the positions allowed to float to (here, top, bottom). ! 8515: % ! 8516: % We keep a separate counter for each FLOATTYPE, which we reset at each ! 8517: % chapter-level command. ! 8518: \let\resetallfloatnos=\empty ! 8519: % ! 8520: \def\dofloat#1,#2,#3,#4\finish{% ! 8521: \let\thiscaption=\empty ! 8522: \let\thisshortcaption=\empty ! 8523: % ! 8524: % don't lose footnotes inside @float. ! 8525: % ! 8526: % BEWARE: when the floats start float, we have to issue warning whenever an ! 8527: % insert appears inside a float which could possibly float. --kasal, 26may04 ! 8528: % ! 8529: \startsavinginserts ! 8530: % ! 8531: % We can't be used inside a paragraph. ! 8532: \par ! 8533: % ! 8534: \vtop\bgroup ! 8535: \def\floattype{#1}% ! 8536: \def\floatlabel{#2}% ! 8537: \def\floatloc{#3}% we do nothing with this yet. ! 8538: % ! 8539: \ifx\floattype\empty ! 8540: \let\safefloattype=\empty ! 8541: \else ! 8542: {% ! 8543: % the floattype might have accents or other special characters, ! 8544: % but we need to use it in a control sequence name. ! 8545: \indexnofonts ! 8546: \turnoffactive ! 8547: \xdef\safefloattype{\floattype}% ! 8548: }% ! 8549: \fi ! 8550: % ! 8551: % If label is given but no type, we handle that as the empty type. ! 8552: \ifx\floatlabel\empty \else ! 8553: % We want each FLOATTYPE to be numbered separately (Figure 1, ! 8554: % Table 1, Figure 2, ...). (And if no label, no number.) ! 8555: % ! 8556: \expandafter\getfloatno\csname\safefloattype floatno\endcsname ! 8557: \global\advance\floatno by 1 ! 8558: % ! 8559: {% ! 8560: % This magic value for \lastsection is output by \setref as the ! 8561: % XREFLABEL-title value. \xrefX uses it to distinguish float ! 8562: % labels (which have a completely different output format) from ! 8563: % node and anchor labels. And \xrdef uses it to construct the ! 8564: % lists of floats. ! 8565: % ! 8566: \edef\lastsection{\floatmagic=\safefloattype}% ! 8567: \setref{\floatlabel}{Yfloat}% ! 8568: }% ! 8569: \fi ! 8570: % ! 8571: % start with \parskip glue, I guess. ! 8572: \vskip\parskip ! 8573: % ! 8574: % Don't suppress indentation if a float happens to start a section. ! 8575: \restorefirstparagraphindent ! 8576: } ! 8577: ! 8578: % we have these possibilities: ! 8579: % @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap ! 8580: % @float Foo,lbl & no caption: Foo 1.1 ! 8581: % @float Foo & @caption{Cap}: Foo: Cap ! 8582: % @float Foo & no caption: Foo ! 8583: % @float ,lbl & Caption{Cap}: 1.1: Cap ! 8584: % @float ,lbl & no caption: 1.1 ! 8585: % @float & @caption{Cap}: Cap ! 8586: % @float & no caption: ! 8587: % ! 8588: \def\Efloat{% ! 8589: \let\floatident = \empty ! 8590: % ! 8591: % In all cases, if we have a float type, it comes first. ! 8592: \ifx\floattype\empty \else \def\floatident{\floattype}\fi ! 8593: % ! 8594: % If we have an xref label, the number comes next. ! 8595: \ifx\floatlabel\empty \else ! 8596: \ifx\floattype\empty \else % if also had float type, need tie first. ! 8597: \appendtomacro\floatident{\tie}% ! 8598: \fi ! 8599: % the number. ! 8600: \appendtomacro\floatident{\chaplevelprefix\the\floatno}% ! 8601: \fi ! 8602: % ! 8603: % Start the printed caption with what we've constructed in ! 8604: % \floatident, but keep it separate; we need \floatident again. ! 8605: \let\captionline = \floatident ! 8606: % ! 8607: \ifx\thiscaption\empty \else ! 8608: \ifx\floatident\empty \else ! 8609: \appendtomacro\captionline{: }% had ident, so need a colon between ! 8610: \fi ! 8611: % ! 8612: % caption text. ! 8613: \appendtomacro\captionline{\scanexp\thiscaption}% ! 8614: \fi ! 8615: % ! 8616: % If we have anything to print, print it, with space before. ! 8617: % Eventually this needs to become an \insert. ! 8618: \ifx\captionline\empty \else ! 8619: \vskip.5\parskip ! 8620: \captionline ! 8621: % ! 8622: % Space below caption. ! 8623: \vskip\parskip ! 8624: \fi ! 8625: % ! 8626: % If have an xref label, write the list of floats info. Do this ! 8627: % after the caption, to avoid chance of it being a breakpoint. ! 8628: \ifx\floatlabel\empty \else ! 8629: % Write the text that goes in the lof to the aux file as ! 8630: % \floatlabel-lof. Besides \floatident, we include the short ! 8631: % caption if specified, else the full caption if specified, else nothing. ! 8632: {% ! 8633: \atdummies ! 8634: % ! 8635: % since we read the caption text in the macro world, where ^^M ! 8636: % is turned into a normal character, we have to scan it back, so ! 8637: % we don't write the literal three characters "^^M" into the aux file. ! 8638: \scanexp{% ! 8639: \xdef\noexpand\gtemp{% ! 8640: \ifx\thisshortcaption\empty ! 8641: \thiscaption ! 8642: \else ! 8643: \thisshortcaption ! 8644: \fi ! 8645: }% ! 8646: }% ! 8647: \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident ! 8648: \ifx\gtemp\empty \else : \gtemp \fi}}% ! 8649: }% ! 8650: \fi ! 8651: \egroup % end of \vtop ! 8652: % ! 8653: % place the captured inserts ! 8654: % ! 8655: % BEWARE: when the floats start floating, we have to issue warning ! 8656: % whenever an insert appears inside a float which could possibly ! 8657: % float. --kasal, 26may04 ! 8658: % ! 8659: \checkinserts ! 8660: } ! 8661: ! 8662: % Append the tokens #2 to the definition of macro #1, not expanding either. ! 8663: % ! 8664: \def\appendtomacro#1#2{% ! 8665: \expandafter\def\expandafter#1\expandafter{#1#2}% ! 8666: } ! 8667: ! 8668: % @caption, @shortcaption ! 8669: % ! 8670: \def\caption{\docaption\thiscaption} ! 8671: \def\shortcaption{\docaption\thisshortcaption} ! 8672: \def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption} ! 8673: \def\defcaption#1#2{\egroup \def#1{#2}} ! 8674: ! 8675: % The parameter is the control sequence identifying the counter we are ! 8676: % going to use. Create it if it doesn't exist and assign it to \floatno. ! 8677: \def\getfloatno#1{% ! 8678: \ifx#1\relax ! 8679: % Haven't seen this figure type before. ! 8680: \csname newcount\endcsname #1% ! 8681: % ! 8682: % Remember to reset this floatno at the next chap. ! 8683: \expandafter\gdef\expandafter\resetallfloatnos ! 8684: \expandafter{\resetallfloatnos #1=0 }% ! 8685: \fi ! 8686: \let\floatno#1% ! 8687: } ! 8688: ! 8689: % \setref calls this to get the XREFLABEL-snt value. We want an @xref ! 8690: % to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we ! 8691: % first read the @float command. ! 8692: % ! 8693: \def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}% ! 8694: ! 8695: % Magic string used for the XREFLABEL-title value, so \xrefX can ! 8696: % distinguish floats from other xref types. ! 8697: \def\floatmagic{!!float!!} ! 8698: ! 8699: % #1 is the control sequence we are passed; we expand into a conditional ! 8700: % which is true if #1 represents a float ref. That is, the magic ! 8701: % \lastsection value which we \setref above. ! 8702: % ! 8703: \def\iffloat#1{\expandafter\doiffloat#1==\finish} ! 8704: % ! 8705: % #1 is (maybe) the \floatmagic string. If so, #2 will be the ! 8706: % (safe) float type for this float. We set \iffloattype to #2. ! 8707: % ! 8708: \def\doiffloat#1=#2=#3\finish{% ! 8709: \def\temp{#1}% ! 8710: \def\iffloattype{#2}% ! 8711: \ifx\temp\floatmagic ! 8712: } ! 8713: ! 8714: % @listoffloats FLOATTYPE - print a list of floats like a table of contents. ! 8715: % ! 8716: \parseargdef\listoffloats{% ! 8717: \def\floattype{#1}% floattype ! 8718: {% ! 8719: % the floattype might have accents or other special characters, ! 8720: % but we need to use it in a control sequence name. ! 8721: \indexnofonts ! 8722: \turnoffactive ! 8723: \xdef\safefloattype{\floattype}% ! 8724: }% ! 8725: % ! 8726: % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE. ! 8727: \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax ! 8728: \ifhavexrefs ! 8729: % if the user said @listoffloats foo but never @float foo. ! 8730: \message{\linenumber No `\safefloattype' floats to list.}% ! 8731: \fi ! 8732: \else ! 8733: \begingroup ! 8734: \leftskip=\tocindent % indent these entries like a toc ! 8735: \let\do=\listoffloatsdo ! 8736: \csname floatlist\safefloattype\endcsname ! 8737: \endgroup ! 8738: \fi ! 8739: } ! 8740: ! 8741: % This is called on each entry in a list of floats. We're passed the ! 8742: % xref label, in the form LABEL-title, which is how we save it in the ! 8743: % aux file. We strip off the -title and look up \XRLABEL-lof, which ! 8744: % has the text we're supposed to typeset here. ! 8745: % ! 8746: % Figures without xref labels will not be included in the list (since ! 8747: % they won't appear in the aux file). ! 8748: % ! 8749: \def\listoffloatsdo#1{\listoffloatsdoentry#1\finish} ! 8750: \def\listoffloatsdoentry#1-title\finish{{% ! 8751: % Can't fully expand XR#1-lof because it can contain anything. Just ! 8752: % pass the control sequence. On the other hand, XR#1-pg is just the ! 8753: % page number, and we want to fully expand that so we can get a link ! 8754: % in pdf output. ! 8755: \toksA = \expandafter{\csname XR#1-lof\endcsname}% ! 8756: % ! 8757: % use the same \entry macro we use to generate the TOC and index. ! 8758: \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}% ! 8759: \writeentry ! 8760: }} ! 8761: ! 8762: ! 8763: \message{localization,} ! 8764: ! 8765: % For single-language documents, @documentlanguage is usually given very ! 8766: % early, just after @documentencoding. Single argument is the language ! 8767: % (de) or locale (de_DE) abbreviation. ! 8768: % ! 8769: { ! 8770: \catcode`\_ = \active ! 8771: \globaldefs=1 ! 8772: \parseargdef\documentlanguage{\begingroup ! 8773: \let_=\normalunderscore % normal _ character for filenames ! 8774: \tex % read txi-??.tex file in plain TeX. ! 8775: % Read the file by the name they passed if it exists. ! 8776: \openin 1 txi-#1.tex ! 8777: \ifeof 1 ! 8778: \documentlanguagetrywithoutunderscore{#1_\finish}% ! 8779: \else ! 8780: \globaldefs = 1 % everything in the txi-LL files needs to persist ! 8781: \input txi-#1.tex ! 8782: \fi ! 8783: \closein 1 ! 8784: \endgroup % end raw TeX ! 8785: \endgroup} ! 8786: % ! 8787: % If they passed de_DE, and txi-de_DE.tex doesn't exist, ! 8788: % try txi-de.tex. ! 8789: % ! 8790: \gdef\documentlanguagetrywithoutunderscore#1_#2\finish{% ! 8791: \openin 1 txi-#1.tex ! 8792: \ifeof 1 ! 8793: \errhelp = \nolanghelp ! 8794: \errmessage{Cannot read language file txi-#1.tex}% ! 8795: \else ! 8796: \globaldefs = 1 % everything in the txi-LL files needs to persist ! 8797: \input txi-#1.tex ! 8798: \fi ! 8799: \closein 1 ! 8800: } ! 8801: }% end of special _ catcode ! 8802: % ! 8803: \newhelp\nolanghelp{The given language definition file cannot be found or ! 8804: is empty. Maybe you need to install it? Putting it in the current ! 8805: directory should work if nowhere else does.} ! 8806: ! 8807: % This macro is called from txi-??.tex files; the first argument is the ! 8808: % \language name to set (without the "\lang@" prefix), the second and ! 8809: % third args are \{left,right}hyphenmin. ! 8810: % ! 8811: % The language names to pass are determined when the format is built. ! 8812: % See the etex.log file created at that time, e.g., ! 8813: % /usr/local/texlive/2008/texmf-var/web2c/pdftex/etex.log. ! 8814: % ! 8815: % With TeX Live 2008, etex now includes hyphenation patterns for all ! 8816: % available languages. This means we can support hyphenation in ! 8817: % Texinfo, at least to some extent. (This still doesn't solve the ! 8818: % accented characters problem.) ! 8819: % ! 8820: \catcode`@=11 ! 8821: \def\txisetlanguage#1#2#3{% ! 8822: % do not set the language if the name is undefined in the current TeX. ! 8823: \expandafter\ifx\csname lang@#1\endcsname \relax ! 8824: \message{no patterns for #1}% ! 8825: \else ! 8826: \global\language = \csname lang@#1\endcsname ! 8827: \fi ! 8828: % but there is no harm in adjusting the hyphenmin values regardless. ! 8829: \global\lefthyphenmin = #2\relax ! 8830: \global\righthyphenmin = #3\relax ! 8831: } ! 8832: ! 8833: % Helpers for encodings. ! 8834: % Set the catcode of characters 128 through 255 to the specified number. ! 8835: % ! 8836: \def\setnonasciicharscatcode#1{% ! 8837: \count255=128 ! 8838: \loop\ifnum\count255<256 ! 8839: \global\catcode\count255=#1\relax ! 8840: \advance\count255 by 1 ! 8841: \repeat ! 8842: } ! 8843: ! 8844: \def\setnonasciicharscatcodenonglobal#1{% ! 8845: \count255=128 ! 8846: \loop\ifnum\count255<256 ! 8847: \catcode\count255=#1\relax ! 8848: \advance\count255 by 1 ! 8849: \repeat ! 8850: } ! 8851: ! 8852: % @documentencoding sets the definition of non-ASCII characters ! 8853: % according to the specified encoding. ! 8854: % ! 8855: \parseargdef\documentencoding{% ! 8856: % Encoding being declared for the document. ! 8857: \def\declaredencoding{\csname #1.enc\endcsname}% ! 8858: % ! 8859: % Supported encodings: names converted to tokens in order to be able ! 8860: % to compare them with \ifx. ! 8861: \def\ascii{\csname US-ASCII.enc\endcsname}% ! 8862: \def\latnine{\csname ISO-8859-15.enc\endcsname}% ! 8863: \def\latone{\csname ISO-8859-1.enc\endcsname}% ! 8864: \def\lattwo{\csname ISO-8859-2.enc\endcsname}% ! 8865: \def\utfeight{\csname UTF-8.enc\endcsname}% ! 8866: % ! 8867: \ifx \declaredencoding \ascii ! 8868: \asciichardefs ! 8869: % ! 8870: \else \ifx \declaredencoding \lattwo ! 8871: \setnonasciicharscatcode\active ! 8872: \lattwochardefs ! 8873: % ! 8874: \else \ifx \declaredencoding \latone ! 8875: \setnonasciicharscatcode\active ! 8876: \latonechardefs ! 8877: % ! 8878: \else \ifx \declaredencoding \latnine ! 8879: \setnonasciicharscatcode\active ! 8880: \latninechardefs ! 8881: % ! 8882: \else \ifx \declaredencoding \utfeight ! 8883: \setnonasciicharscatcode\active ! 8884: \utfeightchardefs ! 8885: % ! 8886: \else ! 8887: \message{Unknown document encoding #1, ignoring.}% ! 8888: % ! 8889: \fi % utfeight ! 8890: \fi % latnine ! 8891: \fi % latone ! 8892: \fi % lattwo ! 8893: \fi % ascii ! 8894: } ! 8895: ! 8896: % A message to be logged when using a character that isn't available ! 8897: % the default font encoding (OT1). ! 8898: % ! 8899: \def\missingcharmsg#1{\message{Character missing in OT1 encoding: #1.}} ! 8900: ! 8901: % Take account of \c (plain) vs. \, (Texinfo) difference. ! 8902: \def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi} ! 8903: ! 8904: % First, make active non-ASCII characters in order for them to be ! 8905: % correctly categorized when TeX reads the replacement text of ! 8906: % macros containing the character definitions. ! 8907: \setnonasciicharscatcode\active ! 8908: % ! 8909: % Latin1 (ISO-8859-1) character definitions. ! 8910: \def\latonechardefs{% ! 8911: \gdef^^a0{\tie} ! 8912: \gdef^^a1{\exclamdown} ! 8913: \gdef^^a2{\missingcharmsg{CENT SIGN}} ! 8914: \gdef^^a3{{\pounds}} ! 8915: \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} ! 8916: \gdef^^a5{\missingcharmsg{YEN SIGN}} ! 8917: \gdef^^a6{\missingcharmsg{BROKEN BAR}} ! 8918: \gdef^^a7{\S} ! 8919: \gdef^^a8{\"{}} ! 8920: \gdef^^a9{\copyright} ! 8921: \gdef^^aa{\ordf} ! 8922: \gdef^^ab{\guillemetleft} ! 8923: \gdef^^ac{$\lnot$} ! 8924: \gdef^^ad{\-} ! 8925: \gdef^^ae{\registeredsymbol} ! 8926: \gdef^^af{\={}} ! 8927: % ! 8928: \gdef^^b0{\textdegree} ! 8929: \gdef^^b1{$\pm$} ! 8930: \gdef^^b2{$^2$} ! 8931: \gdef^^b3{$^3$} ! 8932: \gdef^^b4{\'{}} ! 8933: \gdef^^b5{$\mu$} ! 8934: \gdef^^b6{\P} ! 8935: % ! 8936: \gdef^^b7{$^.$} ! 8937: \gdef^^b8{\cedilla\ } ! 8938: \gdef^^b9{$^1$} ! 8939: \gdef^^ba{\ordm} ! 8940: % ! 8941: \gdef^^bb{\guillemetright} ! 8942: \gdef^^bc{$1\over4$} ! 8943: \gdef^^bd{$1\over2$} ! 8944: \gdef^^be{$3\over4$} ! 8945: \gdef^^bf{\questiondown} ! 8946: % ! 8947: \gdef^^c0{\`A} ! 8948: \gdef^^c1{\'A} ! 8949: \gdef^^c2{\^A} ! 8950: \gdef^^c3{\~A} ! 8951: \gdef^^c4{\"A} ! 8952: \gdef^^c5{\ringaccent A} ! 8953: \gdef^^c6{\AE} ! 8954: \gdef^^c7{\cedilla C} ! 8955: \gdef^^c8{\`E} ! 8956: \gdef^^c9{\'E} ! 8957: \gdef^^ca{\^E} ! 8958: \gdef^^cb{\"E} ! 8959: \gdef^^cc{\`I} ! 8960: \gdef^^cd{\'I} ! 8961: \gdef^^ce{\^I} ! 8962: \gdef^^cf{\"I} ! 8963: % ! 8964: \gdef^^d0{\DH} ! 8965: \gdef^^d1{\~N} ! 8966: \gdef^^d2{\`O} ! 8967: \gdef^^d3{\'O} ! 8968: \gdef^^d4{\^O} ! 8969: \gdef^^d5{\~O} ! 8970: \gdef^^d6{\"O} ! 8971: \gdef^^d7{$\times$} ! 8972: \gdef^^d8{\O} ! 8973: \gdef^^d9{\`U} ! 8974: \gdef^^da{\'U} ! 8975: \gdef^^db{\^U} ! 8976: \gdef^^dc{\"U} ! 8977: \gdef^^dd{\'Y} ! 8978: \gdef^^de{\TH} ! 8979: \gdef^^df{\ss} ! 8980: % ! 8981: \gdef^^e0{\`a} ! 8982: \gdef^^e1{\'a} ! 8983: \gdef^^e2{\^a} ! 8984: \gdef^^e3{\~a} ! 8985: \gdef^^e4{\"a} ! 8986: \gdef^^e5{\ringaccent a} ! 8987: \gdef^^e6{\ae} ! 8988: \gdef^^e7{\cedilla c} ! 8989: \gdef^^e8{\`e} ! 8990: \gdef^^e9{\'e} ! 8991: \gdef^^ea{\^e} ! 8992: \gdef^^eb{\"e} ! 8993: \gdef^^ec{\`{\dotless i}} ! 8994: \gdef^^ed{\'{\dotless i}} ! 8995: \gdef^^ee{\^{\dotless i}} ! 8996: \gdef^^ef{\"{\dotless i}} ! 8997: % ! 8998: \gdef^^f0{\dh} ! 8999: \gdef^^f1{\~n} ! 9000: \gdef^^f2{\`o} ! 9001: \gdef^^f3{\'o} ! 9002: \gdef^^f4{\^o} ! 9003: \gdef^^f5{\~o} ! 9004: \gdef^^f6{\"o} ! 9005: \gdef^^f7{$\div$} ! 9006: \gdef^^f8{\o} ! 9007: \gdef^^f9{\`u} ! 9008: \gdef^^fa{\'u} ! 9009: \gdef^^fb{\^u} ! 9010: \gdef^^fc{\"u} ! 9011: \gdef^^fd{\'y} ! 9012: \gdef^^fe{\th} ! 9013: \gdef^^ff{\"y} ! 9014: } ! 9015: ! 9016: % Latin9 (ISO-8859-15) encoding character definitions. ! 9017: \def\latninechardefs{% ! 9018: % Encoding is almost identical to Latin1. ! 9019: \latonechardefs ! 9020: % ! 9021: \gdef^^a4{\euro} ! 9022: \gdef^^a6{\v S} ! 9023: \gdef^^a8{\v s} ! 9024: \gdef^^b4{\v Z} ! 9025: \gdef^^b8{\v z} ! 9026: \gdef^^bc{\OE} ! 9027: \gdef^^bd{\oe} ! 9028: \gdef^^be{\"Y} ! 9029: } ! 9030: ! 9031: % Latin2 (ISO-8859-2) character definitions. ! 9032: \def\lattwochardefs{% ! 9033: \gdef^^a0{\tie} ! 9034: \gdef^^a1{\ogonek{A}} ! 9035: \gdef^^a2{\u{}} ! 9036: \gdef^^a3{\L} ! 9037: \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} ! 9038: \gdef^^a5{\v L} ! 9039: \gdef^^a6{\'S} ! 9040: \gdef^^a7{\S} ! 9041: \gdef^^a8{\"{}} ! 9042: \gdef^^a9{\v S} ! 9043: \gdef^^aa{\cedilla S} ! 9044: \gdef^^ab{\v T} ! 9045: \gdef^^ac{\'Z} ! 9046: \gdef^^ad{\-} ! 9047: \gdef^^ae{\v Z} ! 9048: \gdef^^af{\dotaccent Z} ! 9049: % ! 9050: \gdef^^b0{\textdegree} ! 9051: \gdef^^b1{\ogonek{a}} ! 9052: \gdef^^b2{\ogonek{ }} ! 9053: \gdef^^b3{\l} ! 9054: \gdef^^b4{\'{}} ! 9055: \gdef^^b5{\v l} ! 9056: \gdef^^b6{\'s} ! 9057: \gdef^^b7{\v{}} ! 9058: \gdef^^b8{\cedilla\ } ! 9059: \gdef^^b9{\v s} ! 9060: \gdef^^ba{\cedilla s} ! 9061: \gdef^^bb{\v t} ! 9062: \gdef^^bc{\'z} ! 9063: \gdef^^bd{\H{}} ! 9064: \gdef^^be{\v z} ! 9065: \gdef^^bf{\dotaccent z} ! 9066: % ! 9067: \gdef^^c0{\'R} ! 9068: \gdef^^c1{\'A} ! 9069: \gdef^^c2{\^A} ! 9070: \gdef^^c3{\u A} ! 9071: \gdef^^c4{\"A} ! 9072: \gdef^^c5{\'L} ! 9073: \gdef^^c6{\'C} ! 9074: \gdef^^c7{\cedilla C} ! 9075: \gdef^^c8{\v C} ! 9076: \gdef^^c9{\'E} ! 9077: \gdef^^ca{\ogonek{E}} ! 9078: \gdef^^cb{\"E} ! 9079: \gdef^^cc{\v E} ! 9080: \gdef^^cd{\'I} ! 9081: \gdef^^ce{\^I} ! 9082: \gdef^^cf{\v D} ! 9083: % ! 9084: \gdef^^d0{\DH} ! 9085: \gdef^^d1{\'N} ! 9086: \gdef^^d2{\v N} ! 9087: \gdef^^d3{\'O} ! 9088: \gdef^^d4{\^O} ! 9089: \gdef^^d5{\H O} ! 9090: \gdef^^d6{\"O} ! 9091: \gdef^^d7{$\times$} ! 9092: \gdef^^d8{\v R} ! 9093: \gdef^^d9{\ringaccent U} ! 9094: \gdef^^da{\'U} ! 9095: \gdef^^db{\H U} ! 9096: \gdef^^dc{\"U} ! 9097: \gdef^^dd{\'Y} ! 9098: \gdef^^de{\cedilla T} ! 9099: \gdef^^df{\ss} ! 9100: % ! 9101: \gdef^^e0{\'r} ! 9102: \gdef^^e1{\'a} ! 9103: \gdef^^e2{\^a} ! 9104: \gdef^^e3{\u a} ! 9105: \gdef^^e4{\"a} ! 9106: \gdef^^e5{\'l} ! 9107: \gdef^^e6{\'c} ! 9108: \gdef^^e7{\cedilla c} ! 9109: \gdef^^e8{\v c} ! 9110: \gdef^^e9{\'e} ! 9111: \gdef^^ea{\ogonek{e}} ! 9112: \gdef^^eb{\"e} ! 9113: \gdef^^ec{\v e} ! 9114: \gdef^^ed{\'{\dotless{i}}} ! 9115: \gdef^^ee{\^{\dotless{i}}} ! 9116: \gdef^^ef{\v d} ! 9117: % ! 9118: \gdef^^f0{\dh} ! 9119: \gdef^^f1{\'n} ! 9120: \gdef^^f2{\v n} ! 9121: \gdef^^f3{\'o} ! 9122: \gdef^^f4{\^o} ! 9123: \gdef^^f5{\H o} ! 9124: \gdef^^f6{\"o} ! 9125: \gdef^^f7{$\div$} ! 9126: \gdef^^f8{\v r} ! 9127: \gdef^^f9{\ringaccent u} ! 9128: \gdef^^fa{\'u} ! 9129: \gdef^^fb{\H u} ! 9130: \gdef^^fc{\"u} ! 9131: \gdef^^fd{\'y} ! 9132: \gdef^^fe{\cedilla t} ! 9133: \gdef^^ff{\dotaccent{}} ! 9134: } ! 9135: ! 9136: % UTF-8 character definitions. ! 9137: % ! 9138: % This code to support UTF-8 is based on LaTeX's utf8.def, with some ! 9139: % changes for Texinfo conventions. It is included here under the GPL by ! 9140: % permission from Frank Mittelbach and the LaTeX team. ! 9141: % ! 9142: \newcount\countUTFx ! 9143: \newcount\countUTFy ! 9144: \newcount\countUTFz ! 9145: ! 9146: \gdef\UTFviiiTwoOctets#1#2{\expandafter ! 9147: \UTFviiiDefined\csname u8:#1\string #2\endcsname} ! 9148: % ! 9149: \gdef\UTFviiiThreeOctets#1#2#3{\expandafter ! 9150: \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname} ! 9151: % ! 9152: \gdef\UTFviiiFourOctets#1#2#3#4{\expandafter ! 9153: \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname} ! 9154: ! 9155: \gdef\UTFviiiDefined#1{% ! 9156: \ifx #1\relax ! 9157: \message{\linenumber Unicode char \string #1 not defined for Texinfo}% ! 9158: \else ! 9159: \expandafter #1% ! 9160: \fi ! 9161: } ! 9162: ! 9163: \begingroup ! 9164: \catcode`\~13 ! 9165: \catcode`\"12 ! 9166: ! 9167: \def\UTFviiiLoop{% ! 9168: \global\catcode\countUTFx\active ! 9169: \uccode`\~\countUTFx ! 9170: \uppercase\expandafter{\UTFviiiTmp}% ! 9171: \advance\countUTFx by 1 ! 9172: \ifnum\countUTFx < \countUTFy ! 9173: \expandafter\UTFviiiLoop ! 9174: \fi} ! 9175: ! 9176: \countUTFx = "C2 ! 9177: \countUTFy = "E0 ! 9178: \def\UTFviiiTmp{% ! 9179: \xdef~{\noexpand\UTFviiiTwoOctets\string~}} ! 9180: \UTFviiiLoop ! 9181: ! 9182: \countUTFx = "E0 ! 9183: \countUTFy = "F0 ! 9184: \def\UTFviiiTmp{% ! 9185: \xdef~{\noexpand\UTFviiiThreeOctets\string~}} ! 9186: \UTFviiiLoop ! 9187: ! 9188: \countUTFx = "F0 ! 9189: \countUTFy = "F4 ! 9190: \def\UTFviiiTmp{% ! 9191: \xdef~{\noexpand\UTFviiiFourOctets\string~}} ! 9192: \UTFviiiLoop ! 9193: \endgroup ! 9194: ! 9195: \begingroup ! 9196: \catcode`\"=12 ! 9197: \catcode`\<=12 ! 9198: \catcode`\.=12 ! 9199: \catcode`\,=12 ! 9200: \catcode`\;=12 ! 9201: \catcode`\!=12 ! 9202: \catcode`\~=13 ! 9203: ! 9204: \gdef\DeclareUnicodeCharacter#1#2{% ! 9205: \countUTFz = "#1\relax ! 9206: %\wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}% ! 9207: \begingroup ! 9208: \parseXMLCharref ! 9209: \def\UTFviiiTwoOctets##1##2{% ! 9210: \csname u8:##1\string ##2\endcsname}% ! 9211: \def\UTFviiiThreeOctets##1##2##3{% ! 9212: \csname u8:##1\string ##2\string ##3\endcsname}% ! 9213: \def\UTFviiiFourOctets##1##2##3##4{% ! 9214: \csname u8:##1\string ##2\string ##3\string ##4\endcsname}% ! 9215: \expandafter\expandafter\expandafter\expandafter ! 9216: \expandafter\expandafter\expandafter ! 9217: \gdef\UTFviiiTmp{#2}% ! 9218: \endgroup} ! 9219: ! 9220: \gdef\parseXMLCharref{% ! 9221: \ifnum\countUTFz < "A0\relax ! 9222: \errhelp = \EMsimple ! 9223: \errmessage{Cannot define Unicode char value < 00A0}% ! 9224: \else\ifnum\countUTFz < "800\relax ! 9225: \parseUTFviiiA,% ! 9226: \parseUTFviiiB C\UTFviiiTwoOctets.,% ! 9227: \else\ifnum\countUTFz < "10000\relax ! 9228: \parseUTFviiiA;% ! 9229: \parseUTFviiiA,% ! 9230: \parseUTFviiiB E\UTFviiiThreeOctets.{,;}% ! 9231: \else ! 9232: \parseUTFviiiA;% ! 9233: \parseUTFviiiA,% ! 9234: \parseUTFviiiA!% ! 9235: \parseUTFviiiB F\UTFviiiFourOctets.{!,;}% ! 9236: \fi\fi\fi ! 9237: } ! 9238: ! 9239: \gdef\parseUTFviiiA#1{% ! 9240: \countUTFx = \countUTFz ! 9241: \divide\countUTFz by 64 ! 9242: \countUTFy = \countUTFz ! 9243: \multiply\countUTFz by 64 ! 9244: \advance\countUTFx by -\countUTFz ! 9245: \advance\countUTFx by 128 ! 9246: \uccode `#1\countUTFx ! 9247: \countUTFz = \countUTFy} ! 9248: ! 9249: \gdef\parseUTFviiiB#1#2#3#4{% ! 9250: \advance\countUTFz by "#10\relax ! 9251: \uccode `#3\countUTFz ! 9252: \uppercase{\gdef\UTFviiiTmp{#2#3#4}}} ! 9253: \endgroup ! 9254: ! 9255: \def\utfeightchardefs{% ! 9256: \DeclareUnicodeCharacter{00A0}{\tie} ! 9257: \DeclareUnicodeCharacter{00A1}{\exclamdown} ! 9258: \DeclareUnicodeCharacter{00A3}{\pounds} ! 9259: \DeclareUnicodeCharacter{00A8}{\"{ }} ! 9260: \DeclareUnicodeCharacter{00A9}{\copyright} ! 9261: \DeclareUnicodeCharacter{00AA}{\ordf} ! 9262: \DeclareUnicodeCharacter{00AB}{\guillemetleft} ! 9263: \DeclareUnicodeCharacter{00AD}{\-} ! 9264: \DeclareUnicodeCharacter{00AE}{\registeredsymbol} ! 9265: \DeclareUnicodeCharacter{00AF}{\={ }} ! 9266: ! 9267: \DeclareUnicodeCharacter{00B0}{\ringaccent{ }} ! 9268: \DeclareUnicodeCharacter{00B4}{\'{ }} ! 9269: \DeclareUnicodeCharacter{00B8}{\cedilla{ }} ! 9270: \DeclareUnicodeCharacter{00BA}{\ordm} ! 9271: \DeclareUnicodeCharacter{00BB}{\guillemetright} ! 9272: \DeclareUnicodeCharacter{00BF}{\questiondown} ! 9273: ! 9274: \DeclareUnicodeCharacter{00C0}{\`A} ! 9275: \DeclareUnicodeCharacter{00C1}{\'A} ! 9276: \DeclareUnicodeCharacter{00C2}{\^A} ! 9277: \DeclareUnicodeCharacter{00C3}{\~A} ! 9278: \DeclareUnicodeCharacter{00C4}{\"A} ! 9279: \DeclareUnicodeCharacter{00C5}{\AA} ! 9280: \DeclareUnicodeCharacter{00C6}{\AE} ! 9281: \DeclareUnicodeCharacter{00C7}{\cedilla{C}} ! 9282: \DeclareUnicodeCharacter{00C8}{\`E} ! 9283: \DeclareUnicodeCharacter{00C9}{\'E} ! 9284: \DeclareUnicodeCharacter{00CA}{\^E} ! 9285: \DeclareUnicodeCharacter{00CB}{\"E} ! 9286: \DeclareUnicodeCharacter{00CC}{\`I} ! 9287: \DeclareUnicodeCharacter{00CD}{\'I} ! 9288: \DeclareUnicodeCharacter{00CE}{\^I} ! 9289: \DeclareUnicodeCharacter{00CF}{\"I} ! 9290: ! 9291: \DeclareUnicodeCharacter{00D0}{\DH} ! 9292: \DeclareUnicodeCharacter{00D1}{\~N} ! 9293: \DeclareUnicodeCharacter{00D2}{\`O} ! 9294: \DeclareUnicodeCharacter{00D3}{\'O} ! 9295: \DeclareUnicodeCharacter{00D4}{\^O} ! 9296: \DeclareUnicodeCharacter{00D5}{\~O} ! 9297: \DeclareUnicodeCharacter{00D6}{\"O} ! 9298: \DeclareUnicodeCharacter{00D8}{\O} ! 9299: \DeclareUnicodeCharacter{00D9}{\`U} ! 9300: \DeclareUnicodeCharacter{00DA}{\'U} ! 9301: \DeclareUnicodeCharacter{00DB}{\^U} ! 9302: \DeclareUnicodeCharacter{00DC}{\"U} ! 9303: \DeclareUnicodeCharacter{00DD}{\'Y} ! 9304: \DeclareUnicodeCharacter{00DE}{\TH} ! 9305: \DeclareUnicodeCharacter{00DF}{\ss} ! 9306: ! 9307: \DeclareUnicodeCharacter{00E0}{\`a} ! 9308: \DeclareUnicodeCharacter{00E1}{\'a} ! 9309: \DeclareUnicodeCharacter{00E2}{\^a} ! 9310: \DeclareUnicodeCharacter{00E3}{\~a} ! 9311: \DeclareUnicodeCharacter{00E4}{\"a} ! 9312: \DeclareUnicodeCharacter{00E5}{\aa} ! 9313: \DeclareUnicodeCharacter{00E6}{\ae} ! 9314: \DeclareUnicodeCharacter{00E7}{\cedilla{c}} ! 9315: \DeclareUnicodeCharacter{00E8}{\`e} ! 9316: \DeclareUnicodeCharacter{00E9}{\'e} ! 9317: \DeclareUnicodeCharacter{00EA}{\^e} ! 9318: \DeclareUnicodeCharacter{00EB}{\"e} ! 9319: \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}} ! 9320: \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}} ! 9321: \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}} ! 9322: \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}} ! 9323: ! 9324: \DeclareUnicodeCharacter{00F0}{\dh} ! 9325: \DeclareUnicodeCharacter{00F1}{\~n} ! 9326: \DeclareUnicodeCharacter{00F2}{\`o} ! 9327: \DeclareUnicodeCharacter{00F3}{\'o} ! 9328: \DeclareUnicodeCharacter{00F4}{\^o} ! 9329: \DeclareUnicodeCharacter{00F5}{\~o} ! 9330: \DeclareUnicodeCharacter{00F6}{\"o} ! 9331: \DeclareUnicodeCharacter{00F8}{\o} ! 9332: \DeclareUnicodeCharacter{00F9}{\`u} ! 9333: \DeclareUnicodeCharacter{00FA}{\'u} ! 9334: \DeclareUnicodeCharacter{00FB}{\^u} ! 9335: \DeclareUnicodeCharacter{00FC}{\"u} ! 9336: \DeclareUnicodeCharacter{00FD}{\'y} ! 9337: \DeclareUnicodeCharacter{00FE}{\th} ! 9338: \DeclareUnicodeCharacter{00FF}{\"y} ! 9339: ! 9340: \DeclareUnicodeCharacter{0100}{\=A} ! 9341: \DeclareUnicodeCharacter{0101}{\=a} ! 9342: \DeclareUnicodeCharacter{0102}{\u{A}} ! 9343: \DeclareUnicodeCharacter{0103}{\u{a}} ! 9344: \DeclareUnicodeCharacter{0104}{\ogonek{A}} ! 9345: \DeclareUnicodeCharacter{0105}{\ogonek{a}} ! 9346: \DeclareUnicodeCharacter{0106}{\'C} ! 9347: \DeclareUnicodeCharacter{0107}{\'c} ! 9348: \DeclareUnicodeCharacter{0108}{\^C} ! 9349: \DeclareUnicodeCharacter{0109}{\^c} ! 9350: \DeclareUnicodeCharacter{0118}{\ogonek{E}} ! 9351: \DeclareUnicodeCharacter{0119}{\ogonek{e}} ! 9352: \DeclareUnicodeCharacter{010A}{\dotaccent{C}} ! 9353: \DeclareUnicodeCharacter{010B}{\dotaccent{c}} ! 9354: \DeclareUnicodeCharacter{010C}{\v{C}} ! 9355: \DeclareUnicodeCharacter{010D}{\v{c}} ! 9356: \DeclareUnicodeCharacter{010E}{\v{D}} ! 9357: ! 9358: \DeclareUnicodeCharacter{0112}{\=E} ! 9359: \DeclareUnicodeCharacter{0113}{\=e} ! 9360: \DeclareUnicodeCharacter{0114}{\u{E}} ! 9361: \DeclareUnicodeCharacter{0115}{\u{e}} ! 9362: \DeclareUnicodeCharacter{0116}{\dotaccent{E}} ! 9363: \DeclareUnicodeCharacter{0117}{\dotaccent{e}} ! 9364: \DeclareUnicodeCharacter{011A}{\v{E}} ! 9365: \DeclareUnicodeCharacter{011B}{\v{e}} ! 9366: \DeclareUnicodeCharacter{011C}{\^G} ! 9367: \DeclareUnicodeCharacter{011D}{\^g} ! 9368: \DeclareUnicodeCharacter{011E}{\u{G}} ! 9369: \DeclareUnicodeCharacter{011F}{\u{g}} ! 9370: ! 9371: \DeclareUnicodeCharacter{0120}{\dotaccent{G}} ! 9372: \DeclareUnicodeCharacter{0121}{\dotaccent{g}} ! 9373: \DeclareUnicodeCharacter{0124}{\^H} ! 9374: \DeclareUnicodeCharacter{0125}{\^h} ! 9375: \DeclareUnicodeCharacter{0128}{\~I} ! 9376: \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}} ! 9377: \DeclareUnicodeCharacter{012A}{\=I} ! 9378: \DeclareUnicodeCharacter{012B}{\={\dotless{i}}} ! 9379: \DeclareUnicodeCharacter{012C}{\u{I}} ! 9380: \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}} ! 9381: ! 9382: \DeclareUnicodeCharacter{0130}{\dotaccent{I}} ! 9383: \DeclareUnicodeCharacter{0131}{\dotless{i}} ! 9384: \DeclareUnicodeCharacter{0132}{IJ} ! 9385: \DeclareUnicodeCharacter{0133}{ij} ! 9386: \DeclareUnicodeCharacter{0134}{\^J} ! 9387: \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}} ! 9388: \DeclareUnicodeCharacter{0139}{\'L} ! 9389: \DeclareUnicodeCharacter{013A}{\'l} ! 9390: ! 9391: \DeclareUnicodeCharacter{0141}{\L} ! 9392: \DeclareUnicodeCharacter{0142}{\l} ! 9393: \DeclareUnicodeCharacter{0143}{\'N} ! 9394: \DeclareUnicodeCharacter{0144}{\'n} ! 9395: \DeclareUnicodeCharacter{0147}{\v{N}} ! 9396: \DeclareUnicodeCharacter{0148}{\v{n}} ! 9397: \DeclareUnicodeCharacter{014C}{\=O} ! 9398: \DeclareUnicodeCharacter{014D}{\=o} ! 9399: \DeclareUnicodeCharacter{014E}{\u{O}} ! 9400: \DeclareUnicodeCharacter{014F}{\u{o}} ! 9401: ! 9402: \DeclareUnicodeCharacter{0150}{\H{O}} ! 9403: \DeclareUnicodeCharacter{0151}{\H{o}} ! 9404: \DeclareUnicodeCharacter{0152}{\OE} ! 9405: \DeclareUnicodeCharacter{0153}{\oe} ! 9406: \DeclareUnicodeCharacter{0154}{\'R} ! 9407: \DeclareUnicodeCharacter{0155}{\'r} ! 9408: \DeclareUnicodeCharacter{0158}{\v{R}} ! 9409: \DeclareUnicodeCharacter{0159}{\v{r}} ! 9410: \DeclareUnicodeCharacter{015A}{\'S} ! 9411: \DeclareUnicodeCharacter{015B}{\'s} ! 9412: \DeclareUnicodeCharacter{015C}{\^S} ! 9413: \DeclareUnicodeCharacter{015D}{\^s} ! 9414: \DeclareUnicodeCharacter{015E}{\cedilla{S}} ! 9415: \DeclareUnicodeCharacter{015F}{\cedilla{s}} ! 9416: ! 9417: \DeclareUnicodeCharacter{0160}{\v{S}} ! 9418: \DeclareUnicodeCharacter{0161}{\v{s}} ! 9419: \DeclareUnicodeCharacter{0162}{\cedilla{t}} ! 9420: \DeclareUnicodeCharacter{0163}{\cedilla{T}} ! 9421: \DeclareUnicodeCharacter{0164}{\v{T}} ! 9422: ! 9423: \DeclareUnicodeCharacter{0168}{\~U} ! 9424: \DeclareUnicodeCharacter{0169}{\~u} ! 9425: \DeclareUnicodeCharacter{016A}{\=U} ! 9426: \DeclareUnicodeCharacter{016B}{\=u} ! 9427: \DeclareUnicodeCharacter{016C}{\u{U}} ! 9428: \DeclareUnicodeCharacter{016D}{\u{u}} ! 9429: \DeclareUnicodeCharacter{016E}{\ringaccent{U}} ! 9430: \DeclareUnicodeCharacter{016F}{\ringaccent{u}} ! 9431: ! 9432: \DeclareUnicodeCharacter{0170}{\H{U}} ! 9433: \DeclareUnicodeCharacter{0171}{\H{u}} ! 9434: \DeclareUnicodeCharacter{0174}{\^W} ! 9435: \DeclareUnicodeCharacter{0175}{\^w} ! 9436: \DeclareUnicodeCharacter{0176}{\^Y} ! 9437: \DeclareUnicodeCharacter{0177}{\^y} ! 9438: \DeclareUnicodeCharacter{0178}{\"Y} ! 9439: \DeclareUnicodeCharacter{0179}{\'Z} ! 9440: \DeclareUnicodeCharacter{017A}{\'z} ! 9441: \DeclareUnicodeCharacter{017B}{\dotaccent{Z}} ! 9442: \DeclareUnicodeCharacter{017C}{\dotaccent{z}} ! 9443: \DeclareUnicodeCharacter{017D}{\v{Z}} ! 9444: \DeclareUnicodeCharacter{017E}{\v{z}} ! 9445: ! 9446: \DeclareUnicodeCharacter{01C4}{D\v{Z}} ! 9447: \DeclareUnicodeCharacter{01C5}{D\v{z}} ! 9448: \DeclareUnicodeCharacter{01C6}{d\v{z}} ! 9449: \DeclareUnicodeCharacter{01C7}{LJ} ! 9450: \DeclareUnicodeCharacter{01C8}{Lj} ! 9451: \DeclareUnicodeCharacter{01C9}{lj} ! 9452: \DeclareUnicodeCharacter{01CA}{NJ} ! 9453: \DeclareUnicodeCharacter{01CB}{Nj} ! 9454: \DeclareUnicodeCharacter{01CC}{nj} ! 9455: \DeclareUnicodeCharacter{01CD}{\v{A}} ! 9456: \DeclareUnicodeCharacter{01CE}{\v{a}} ! 9457: \DeclareUnicodeCharacter{01CF}{\v{I}} ! 9458: ! 9459: \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}} ! 9460: \DeclareUnicodeCharacter{01D1}{\v{O}} ! 9461: \DeclareUnicodeCharacter{01D2}{\v{o}} ! 9462: \DeclareUnicodeCharacter{01D3}{\v{U}} ! 9463: \DeclareUnicodeCharacter{01D4}{\v{u}} ! 9464: ! 9465: \DeclareUnicodeCharacter{01E2}{\={\AE}} ! 9466: \DeclareUnicodeCharacter{01E3}{\={\ae}} ! 9467: \DeclareUnicodeCharacter{01E6}{\v{G}} ! 9468: \DeclareUnicodeCharacter{01E7}{\v{g}} ! 9469: \DeclareUnicodeCharacter{01E8}{\v{K}} ! 9470: \DeclareUnicodeCharacter{01E9}{\v{k}} ! 9471: ! 9472: \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}} ! 9473: \DeclareUnicodeCharacter{01F1}{DZ} ! 9474: \DeclareUnicodeCharacter{01F2}{Dz} ! 9475: \DeclareUnicodeCharacter{01F3}{dz} ! 9476: \DeclareUnicodeCharacter{01F4}{\'G} ! 9477: \DeclareUnicodeCharacter{01F5}{\'g} ! 9478: \DeclareUnicodeCharacter{01F8}{\`N} ! 9479: \DeclareUnicodeCharacter{01F9}{\`n} ! 9480: \DeclareUnicodeCharacter{01FC}{\'{\AE}} ! 9481: \DeclareUnicodeCharacter{01FD}{\'{\ae}} ! 9482: \DeclareUnicodeCharacter{01FE}{\'{\O}} ! 9483: \DeclareUnicodeCharacter{01FF}{\'{\o}} ! 9484: ! 9485: \DeclareUnicodeCharacter{021E}{\v{H}} ! 9486: \DeclareUnicodeCharacter{021F}{\v{h}} ! 9487: ! 9488: \DeclareUnicodeCharacter{0226}{\dotaccent{A}} ! 9489: \DeclareUnicodeCharacter{0227}{\dotaccent{a}} ! 9490: \DeclareUnicodeCharacter{0228}{\cedilla{E}} ! 9491: \DeclareUnicodeCharacter{0229}{\cedilla{e}} ! 9492: \DeclareUnicodeCharacter{022E}{\dotaccent{O}} ! 9493: \DeclareUnicodeCharacter{022F}{\dotaccent{o}} ! 9494: ! 9495: \DeclareUnicodeCharacter{0232}{\=Y} ! 9496: \DeclareUnicodeCharacter{0233}{\=y} ! 9497: \DeclareUnicodeCharacter{0237}{\dotless{j}} ! 9498: ! 9499: \DeclareUnicodeCharacter{02DB}{\ogonek{ }} ! 9500: ! 9501: \DeclareUnicodeCharacter{1E02}{\dotaccent{B}} ! 9502: \DeclareUnicodeCharacter{1E03}{\dotaccent{b}} ! 9503: \DeclareUnicodeCharacter{1E04}{\udotaccent{B}} ! 9504: \DeclareUnicodeCharacter{1E05}{\udotaccent{b}} ! 9505: \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}} ! 9506: \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}} ! 9507: \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}} ! 9508: \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}} ! 9509: \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}} ! 9510: \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}} ! 9511: \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}} ! 9512: \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}} ! 9513: ! 9514: \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}} ! 9515: \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}} ! 9516: ! 9517: \DeclareUnicodeCharacter{1E20}{\=G} ! 9518: \DeclareUnicodeCharacter{1E21}{\=g} ! 9519: \DeclareUnicodeCharacter{1E22}{\dotaccent{H}} ! 9520: \DeclareUnicodeCharacter{1E23}{\dotaccent{h}} ! 9521: \DeclareUnicodeCharacter{1E24}{\udotaccent{H}} ! 9522: \DeclareUnicodeCharacter{1E25}{\udotaccent{h}} ! 9523: \DeclareUnicodeCharacter{1E26}{\"H} ! 9524: \DeclareUnicodeCharacter{1E27}{\"h} ! 9525: ! 9526: \DeclareUnicodeCharacter{1E30}{\'K} ! 9527: \DeclareUnicodeCharacter{1E31}{\'k} ! 9528: \DeclareUnicodeCharacter{1E32}{\udotaccent{K}} ! 9529: \DeclareUnicodeCharacter{1E33}{\udotaccent{k}} ! 9530: \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}} ! 9531: \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}} ! 9532: \DeclareUnicodeCharacter{1E36}{\udotaccent{L}} ! 9533: \DeclareUnicodeCharacter{1E37}{\udotaccent{l}} ! 9534: \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}} ! 9535: \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}} ! 9536: \DeclareUnicodeCharacter{1E3E}{\'M} ! 9537: \DeclareUnicodeCharacter{1E3F}{\'m} ! 9538: ! 9539: \DeclareUnicodeCharacter{1E40}{\dotaccent{M}} ! 9540: \DeclareUnicodeCharacter{1E41}{\dotaccent{m}} ! 9541: \DeclareUnicodeCharacter{1E42}{\udotaccent{M}} ! 9542: \DeclareUnicodeCharacter{1E43}{\udotaccent{m}} ! 9543: \DeclareUnicodeCharacter{1E44}{\dotaccent{N}} ! 9544: \DeclareUnicodeCharacter{1E45}{\dotaccent{n}} ! 9545: \DeclareUnicodeCharacter{1E46}{\udotaccent{N}} ! 9546: \DeclareUnicodeCharacter{1E47}{\udotaccent{n}} ! 9547: \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}} ! 9548: \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}} ! 9549: ! 9550: \DeclareUnicodeCharacter{1E54}{\'P} ! 9551: \DeclareUnicodeCharacter{1E55}{\'p} ! 9552: \DeclareUnicodeCharacter{1E56}{\dotaccent{P}} ! 9553: \DeclareUnicodeCharacter{1E57}{\dotaccent{p}} ! 9554: \DeclareUnicodeCharacter{1E58}{\dotaccent{R}} ! 9555: \DeclareUnicodeCharacter{1E59}{\dotaccent{r}} ! 9556: \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}} ! 9557: \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}} ! 9558: \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}} ! 9559: \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}} ! 9560: ! 9561: \DeclareUnicodeCharacter{1E60}{\dotaccent{S}} ! 9562: \DeclareUnicodeCharacter{1E61}{\dotaccent{s}} ! 9563: \DeclareUnicodeCharacter{1E62}{\udotaccent{S}} ! 9564: \DeclareUnicodeCharacter{1E63}{\udotaccent{s}} ! 9565: \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}} ! 9566: \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}} ! 9567: \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}} ! 9568: \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}} ! 9569: \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}} ! 9570: \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}} ! 9571: ! 9572: \DeclareUnicodeCharacter{1E7C}{\~V} ! 9573: \DeclareUnicodeCharacter{1E7D}{\~v} ! 9574: \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}} ! 9575: \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}} ! 9576: ! 9577: \DeclareUnicodeCharacter{1E80}{\`W} ! 9578: \DeclareUnicodeCharacter{1E81}{\`w} ! 9579: \DeclareUnicodeCharacter{1E82}{\'W} ! 9580: \DeclareUnicodeCharacter{1E83}{\'w} ! 9581: \DeclareUnicodeCharacter{1E84}{\"W} ! 9582: \DeclareUnicodeCharacter{1E85}{\"w} ! 9583: \DeclareUnicodeCharacter{1E86}{\dotaccent{W}} ! 9584: \DeclareUnicodeCharacter{1E87}{\dotaccent{w}} ! 9585: \DeclareUnicodeCharacter{1E88}{\udotaccent{W}} ! 9586: \DeclareUnicodeCharacter{1E89}{\udotaccent{w}} ! 9587: \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}} ! 9588: \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}} ! 9589: \DeclareUnicodeCharacter{1E8C}{\"X} ! 9590: \DeclareUnicodeCharacter{1E8D}{\"x} ! 9591: \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}} ! 9592: \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}} ! 9593: ! 9594: \DeclareUnicodeCharacter{1E90}{\^Z} ! 9595: \DeclareUnicodeCharacter{1E91}{\^z} ! 9596: \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}} ! 9597: \DeclareUnicodeCharacter{1E93}{\udotaccent{z}} ! 9598: \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}} ! 9599: \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}} ! 9600: \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}} ! 9601: \DeclareUnicodeCharacter{1E97}{\"t} ! 9602: \DeclareUnicodeCharacter{1E98}{\ringaccent{w}} ! 9603: \DeclareUnicodeCharacter{1E99}{\ringaccent{y}} ! 9604: ! 9605: \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}} ! 9606: \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}} ! 9607: ! 9608: \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}} ! 9609: \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}} ! 9610: \DeclareUnicodeCharacter{1EBC}{\~E} ! 9611: \DeclareUnicodeCharacter{1EBD}{\~e} ! 9612: ! 9613: \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}} ! 9614: \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}} ! 9615: \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}} ! 9616: \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}} ! 9617: ! 9618: \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}} ! 9619: \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}} ! 9620: ! 9621: \DeclareUnicodeCharacter{1EF2}{\`Y} ! 9622: \DeclareUnicodeCharacter{1EF3}{\`y} ! 9623: \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}} ! 9624: ! 9625: \DeclareUnicodeCharacter{1EF8}{\~Y} ! 9626: \DeclareUnicodeCharacter{1EF9}{\~y} ! 9627: ! 9628: \DeclareUnicodeCharacter{2013}{--} ! 9629: \DeclareUnicodeCharacter{2014}{---} ! 9630: \DeclareUnicodeCharacter{2018}{\quoteleft} ! 9631: \DeclareUnicodeCharacter{2019}{\quoteright} ! 9632: \DeclareUnicodeCharacter{201A}{\quotesinglbase} ! 9633: \DeclareUnicodeCharacter{201C}{\quotedblleft} ! 9634: \DeclareUnicodeCharacter{201D}{\quotedblright} ! 9635: \DeclareUnicodeCharacter{201E}{\quotedblbase} ! 9636: \DeclareUnicodeCharacter{2022}{\bullet} ! 9637: \DeclareUnicodeCharacter{2026}{\dots} ! 9638: \DeclareUnicodeCharacter{2039}{\guilsinglleft} ! 9639: \DeclareUnicodeCharacter{203A}{\guilsinglright} ! 9640: \DeclareUnicodeCharacter{20AC}{\euro} ! 9641: ! 9642: \DeclareUnicodeCharacter{2192}{\expansion} ! 9643: \DeclareUnicodeCharacter{21D2}{\result} ! 9644: ! 9645: \DeclareUnicodeCharacter{2212}{\minus} ! 9646: \DeclareUnicodeCharacter{2217}{\point} ! 9647: \DeclareUnicodeCharacter{2261}{\equiv} ! 9648: }% end of \utfeightchardefs ! 9649: ! 9650: ! 9651: % US-ASCII character definitions. ! 9652: \def\asciichardefs{% nothing need be done ! 9653: \relax ! 9654: } ! 9655: ! 9656: % Make non-ASCII characters printable again for compatibility with ! 9657: % existing Texinfo documents that may use them, even without declaring a ! 9658: % document encoding. ! 9659: % ! 9660: \setnonasciicharscatcode \other ! 9661: ! 9662: ! 9663: \message{formatting,} ! 9664: ! 9665: \newdimen\defaultparindent \defaultparindent = 15pt ! 9666: ! 9667: \chapheadingskip = 15pt plus 4pt minus 2pt ! 9668: \secheadingskip = 12pt plus 3pt minus 2pt ! 9669: \subsecheadingskip = 9pt plus 2pt minus 2pt ! 9670: ! 9671: % Prevent underfull vbox error messages. ! 9672: \vbadness = 10000 ! 9673: ! 9674: % Don't be very finicky about underfull hboxes, either. ! 9675: \hbadness = 6666 ! 9676: ! 9677: % Following George Bush, get rid of widows and orphans. ! 9678: \widowpenalty=10000 ! 9679: \clubpenalty=10000 ! 9680: ! 9681: % Use TeX 3.0's \emergencystretch to help line breaking, but if we're ! 9682: % using an old version of TeX, don't do anything. We want the amount of ! 9683: % stretch added to depend on the line length, hence the dependence on ! 9684: % \hsize. We call this whenever the paper size is set. ! 9685: % ! 9686: \def\setemergencystretch{% ! 9687: \ifx\emergencystretch\thisisundefined ! 9688: % Allow us to assign to \emergencystretch anyway. ! 9689: \def\emergencystretch{\dimen0}% ! 9690: \else ! 9691: \emergencystretch = .15\hsize ! 9692: \fi ! 9693: } ! 9694: ! 9695: % Parameters in order: 1) textheight; 2) textwidth; ! 9696: % 3) voffset; 4) hoffset; 5) binding offset; 6) topskip; ! 9697: % 7) physical page height; 8) physical page width. ! 9698: % ! 9699: % We also call \setleading{\textleading}, so the caller should define ! 9700: % \textleading. The caller should also set \parskip. ! 9701: % ! 9702: \def\internalpagesizes#1#2#3#4#5#6#7#8{% ! 9703: \voffset = #3\relax ! 9704: \topskip = #6\relax ! 9705: \splittopskip = \topskip ! 9706: % ! 9707: \vsize = #1\relax ! 9708: \advance\vsize by \topskip ! 9709: \outervsize = \vsize ! 9710: \advance\outervsize by 2\topandbottommargin ! 9711: \pageheight = \vsize ! 9712: % ! 9713: \hsize = #2\relax ! 9714: \outerhsize = \hsize ! 9715: \advance\outerhsize by 0.5in ! 9716: \pagewidth = \hsize ! 9717: % ! 9718: \normaloffset = #4\relax ! 9719: \bindingoffset = #5\relax ! 9720: % ! 9721: \ifpdf ! 9722: \pdfpageheight #7\relax ! 9723: \pdfpagewidth #8\relax ! 9724: % if we don't reset these, they will remain at "1 true in" of ! 9725: % whatever layout pdftex was dumped with. ! 9726: \pdfhorigin = 1 true in ! 9727: \pdfvorigin = 1 true in ! 9728: \fi ! 9729: % ! 9730: \setleading{\textleading} ! 9731: % ! 9732: \parindent = \defaultparindent ! 9733: \setemergencystretch ! 9734: } ! 9735: ! 9736: % @letterpaper (the default). ! 9737: \def\letterpaper{{\globaldefs = 1 ! 9738: \parskip = 3pt plus 2pt minus 1pt ! 9739: \textleading = 13.2pt ! 9740: % ! 9741: % If page is nothing but text, make it come out even. ! 9742: \internalpagesizes{607.2pt}{6in}% that's 46 lines ! 9743: {\voffset}{.25in}% ! 9744: {\bindingoffset}{36pt}% ! 9745: {11in}{8.5in}% ! 9746: }} ! 9747: ! 9748: % Use @smallbook to reset parameters for 7x9.25 trim size. ! 9749: \def\smallbook{{\globaldefs = 1 ! 9750: \parskip = 2pt plus 1pt ! 9751: \textleading = 12pt ! 9752: % ! 9753: \internalpagesizes{7.5in}{5in}% ! 9754: {-.2in}{0in}% ! 9755: {\bindingoffset}{16pt}% ! 9756: {9.25in}{7in}% ! 9757: % ! 9758: \lispnarrowing = 0.3in ! 9759: \tolerance = 700 ! 9760: \hfuzz = 1pt ! 9761: \contentsrightmargin = 0pt ! 9762: \defbodyindent = .5cm ! 9763: }} ! 9764: ! 9765: % Use @smallerbook to reset parameters for 6x9 trim size. ! 9766: % (Just testing, parameters still in flux.) ! 9767: \def\smallerbook{{\globaldefs = 1 ! 9768: \parskip = 1.5pt plus 1pt ! 9769: \textleading = 12pt ! 9770: % ! 9771: \internalpagesizes{7.4in}{4.8in}% ! 9772: {-.2in}{-.4in}% ! 9773: {0pt}{14pt}% ! 9774: {9in}{6in}% ! 9775: % ! 9776: \lispnarrowing = 0.25in ! 9777: \tolerance = 700 ! 9778: \hfuzz = 1pt ! 9779: \contentsrightmargin = 0pt ! 9780: \defbodyindent = .4cm ! 9781: }} ! 9782: ! 9783: % Use @afourpaper to print on European A4 paper. ! 9784: \def\afourpaper{{\globaldefs = 1 ! 9785: \parskip = 3pt plus 2pt minus 1pt ! 9786: \textleading = 13.2pt ! 9787: % ! 9788: % Double-side printing via postscript on Laserjet 4050 ! 9789: % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm. ! 9790: % To change the settings for a different printer or situation, adjust ! 9791: % \normaloffset until the front-side and back-side texts align. Then ! 9792: % do the same for \bindingoffset. You can set these for testing in ! 9793: % your texinfo source file like this: ! 9794: % @tex ! 9795: % \global\normaloffset = -6mm ! 9796: % \global\bindingoffset = 10mm ! 9797: % @end tex ! 9798: \internalpagesizes{673.2pt}{160mm}% that's 51 lines ! 9799: {\voffset}{\hoffset}% ! 9800: {\bindingoffset}{44pt}% ! 9801: {297mm}{210mm}% ! 9802: % ! 9803: \tolerance = 700 ! 9804: \hfuzz = 1pt ! 9805: \contentsrightmargin = 0pt ! 9806: \defbodyindent = 5mm ! 9807: }} ! 9808: ! 9809: % Use @afivepaper to print on European A5 paper. ! 9810: % From [email protected], 2 July 2000. ! 9811: % He also recommends making @example and @lisp be small. ! 9812: \def\afivepaper{{\globaldefs = 1 ! 9813: \parskip = 2pt plus 1pt minus 0.1pt ! 9814: \textleading = 12.5pt ! 9815: % ! 9816: \internalpagesizes{160mm}{120mm}% ! 9817: {\voffset}{\hoffset}% ! 9818: {\bindingoffset}{8pt}% ! 9819: {210mm}{148mm}% ! 9820: % ! 9821: \lispnarrowing = 0.2in ! 9822: \tolerance = 800 ! 9823: \hfuzz = 1.2pt ! 9824: \contentsrightmargin = 0pt ! 9825: \defbodyindent = 2mm ! 9826: \tableindent = 12mm ! 9827: }} ! 9828: ! 9829: % A specific text layout, 24x15cm overall, intended for A4 paper. ! 9830: \def\afourlatex{{\globaldefs = 1 ! 9831: \afourpaper ! 9832: \internalpagesizes{237mm}{150mm}% ! 9833: {\voffset}{4.6mm}% ! 9834: {\bindingoffset}{7mm}% ! 9835: {297mm}{210mm}% ! 9836: % ! 9837: % Must explicitly reset to 0 because we call \afourpaper. ! 9838: \globaldefs = 0 ! 9839: }} ! 9840: ! 9841: % Use @afourwide to print on A4 paper in landscape format. ! 9842: \def\afourwide{{\globaldefs = 1 ! 9843: \afourpaper ! 9844: \internalpagesizes{241mm}{165mm}% ! 9845: {\voffset}{-2.95mm}% ! 9846: {\bindingoffset}{7mm}% ! 9847: {297mm}{210mm}% ! 9848: \globaldefs = 0 ! 9849: }} ! 9850: ! 9851: % @pagesizes TEXTHEIGHT[,TEXTWIDTH] ! 9852: % Perhaps we should allow setting the margins, \topskip, \parskip, ! 9853: % and/or leading, also. Or perhaps we should compute them somehow. ! 9854: % ! 9855: \parseargdef\pagesizes{\pagesizesyyy #1,,\finish} ! 9856: \def\pagesizesyyy#1,#2,#3\finish{{% ! 9857: \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi ! 9858: \globaldefs = 1 ! 9859: % ! 9860: \parskip = 3pt plus 2pt minus 1pt ! 9861: \setleading{\textleading}% ! 9862: % ! 9863: \dimen0 = #1\relax ! 9864: \advance\dimen0 by \voffset ! 9865: % ! 9866: \dimen2 = \hsize ! 9867: \advance\dimen2 by \normaloffset ! 9868: % ! 9869: \internalpagesizes{#1}{\hsize}% ! 9870: {\voffset}{\normaloffset}% ! 9871: {\bindingoffset}{44pt}% ! 9872: {\dimen0}{\dimen2}% ! 9873: }} ! 9874: ! 9875: % Set default to letter. ! 9876: % ! 9877: \letterpaper ! 9878: ! 9879: ! 9880: \message{and turning on texinfo input format.} ! 9881: ! 9882: \def^^L{\par} % remove \outer, so ^L can appear in an @comment ! 9883: ! 9884: % DEL is a comment character, in case @c does not suffice. ! 9885: \catcode`\^^? = 14 ! 9886: ! 9887: % Define macros to output various characters with catcode for normal text. ! 9888: \catcode`\"=\other \def\normaldoublequote{"} ! 9889: \catcode`\$=\other \def\normaldollar{$}%$ font-lock fix ! 9890: \catcode`\+=\other \def\normalplus{+} ! 9891: \catcode`\<=\other \def\normalless{<} ! 9892: \catcode`\>=\other \def\normalgreater{>} ! 9893: \catcode`\^=\other \def\normalcaret{^} ! 9894: \catcode`\_=\other \def\normalunderscore{_} ! 9895: \catcode`\|=\other \def\normalverticalbar{|} ! 9896: \catcode`\~=\other \def\normaltilde{~} ! 9897: ! 9898: % This macro is used to make a character print one way in \tt ! 9899: % (where it can probably be output as-is), and another way in other fonts, ! 9900: % where something hairier probably needs to be done. ! 9901: % ! 9902: % #1 is what to print if we are indeed using \tt; #2 is what to print ! 9903: % otherwise. Since all the Computer Modern typewriter fonts have zero ! 9904: % interword stretch (and shrink), and it is reasonable to expect all ! 9905: % typewriter fonts to have this, we can check that font parameter. ! 9906: % ! 9907: \def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi} ! 9908: ! 9909: % Same as above, but check for italic font. Actually this also catches ! 9910: % non-italic slanted fonts since it is impossible to distinguish them from ! 9911: % italic fonts. But since this is only used by $ and it uses \sl anyway ! 9912: % this is not a problem. ! 9913: \def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi} ! 9914: ! 9915: % Turn off all special characters except @ ! 9916: % (and those which the user can use as if they were ordinary). ! 9917: % Most of these we simply print from the \tt font, but for some, we can ! 9918: % use math or other variants that look better in normal text. ! 9919: ! 9920: \catcode`\"=\active ! 9921: \def\activedoublequote{{\tt\char34}} ! 9922: \let"=\activedoublequote ! 9923: \catcode`\~=\active ! 9924: \def~{{\tt\char126}} ! 9925: \chardef\hat=`\^ ! 9926: \catcode`\^=\active ! 9927: \def^{{\tt \hat}} ! 9928: ! 9929: \catcode`\_=\active ! 9930: \def_{\ifusingtt\normalunderscore\_} ! 9931: \let\realunder=_ ! 9932: % Subroutine for the previous macro. ! 9933: \def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em } ! 9934: ! 9935: \catcode`\|=\active ! 9936: \def|{{\tt\char124}} ! 9937: \chardef \less=`\< ! 9938: \catcode`\<=\active ! 9939: \def<{{\tt \less}} ! 9940: \chardef \gtr=`\> ! 9941: \catcode`\>=\active ! 9942: \def>{{\tt \gtr}} ! 9943: \catcode`\+=\active ! 9944: \def+{{\tt \char 43}} ! 9945: \catcode`\$=\active ! 9946: \def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix ! 9947: ! 9948: % If a .fmt file is being used, characters that might appear in a file ! 9949: % name cannot be active until we have parsed the command line. ! 9950: % So turn them off again, and have \everyjob (or @setfilename) turn them on. ! 9951: % \otherifyactive is called near the end of this file. ! 9952: \def\otherifyactive{\catcode`+=\other \catcode`\_=\other} ! 9953: ! 9954: % Used sometimes to turn off (effectively) the active characters even after ! 9955: % parsing them. ! 9956: \def\turnoffactive{% ! 9957: \normalturnoffactive ! 9958: \otherbackslash ! 9959: } ! 9960: ! 9961: \catcode`\@=0 ! 9962: ! 9963: % \backslashcurfont outputs one backslash character in current font, ! 9964: % as in \char`\\. ! 9965: \global\chardef\backslashcurfont=`\\ ! 9966: \global\let\rawbackslashxx=\backslashcurfont % let existing .??s files work ! 9967: ! 9968: % \realbackslash is an actual character `\' with catcode other, and ! 9969: % \doublebackslash is two of them (for the pdf outlines). ! 9970: {\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}} ! 9971: ! 9972: % In texinfo, backslash is an active character; it prints the backslash ! 9973: % in fixed width font. ! 9974: \catcode`\\=\active % @ for escape char from now on. ! 9975: ! 9976: % The story here is that in math mode, the \char of \backslashcurfont ! 9977: % ends up printing the roman \ from the math symbol font (because \char ! 9978: % in math mode uses the \mathcode, and plain.tex sets ! 9979: % \mathcode`\\="026E). It seems better for @backslashchar{} to always ! 9980: % print a typewriter backslash, hence we use an explicit \mathchar, ! 9981: % which is the decimal equivalent of "715c (class 7, e.g., use \fam; ! 9982: % ignored family value; char position "5C). We can't use " for the ! 9983: % usual hex value because it has already been made active. ! 9984: @def@normalbackslash{{@tt @ifmmode @mathchar29020 @else @backslashcurfont @fi}} ! 9985: @let@backslashchar = @normalbackslash % @backslashchar{} is for user documents. ! 9986: ! 9987: % On startup, @fixbackslash assigns: ! 9988: % @let \ = @normalbackslash ! 9989: % \rawbackslash defines an active \ to do \backslashcurfont. ! 9990: % \otherbackslash defines an active \ to be a literal `\' character with ! 9991: % catcode other. We switch back and forth between these. ! 9992: @gdef@rawbackslash{@let\=@backslashcurfont} ! 9993: @gdef@otherbackslash{@let\=@realbackslash} ! 9994: ! 9995: % Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of ! 9996: % the literal character `\'. Also revert - to its normal character, in ! 9997: % case the active - from code has slipped in. ! 9998: % ! 9999: {@catcode`- = @active ! 10000: @gdef@normalturnoffactive{% ! 10001: @let-=@normaldash ! 10002: @let"=@normaldoublequote ! 10003: @let$=@normaldollar %$ font-lock fix ! 10004: @let+=@normalplus ! 10005: @let<=@normalless ! 10006: @let>=@normalgreater ! 10007: @let\=@normalbackslash ! 10008: @let^=@normalcaret ! 10009: @let_=@normalunderscore ! 10010: @let|=@normalverticalbar ! 10011: @let~=@normaltilde ! 10012: @markupsetuplqdefault ! 10013: @markupsetuprqdefault ! 10014: @unsepspaces ! 10015: } ! 10016: } ! 10017: ! 10018: % Make _ and + \other characters, temporarily. ! 10019: % This is canceled by @fixbackslash. ! 10020: @otherifyactive ! 10021: ! 10022: % If a .fmt file is being used, we don't want the `\input texinfo' to show up. ! 10023: % That is what \eatinput is for; after that, the `\' should revert to printing ! 10024: % a backslash. ! 10025: % ! 10026: @gdef@eatinput input texinfo{@fixbackslash} ! 10027: @global@let\ = @eatinput ! 10028: ! 10029: % On the other hand, perhaps the file did not have a `\input texinfo'. Then ! 10030: % the first `\' in the file would cause an error. This macro tries to fix ! 10031: % that, assuming it is called before the first `\' could plausibly occur. ! 10032: % Also turn back on active characters that might appear in the input ! 10033: % file name, in case not using a pre-dumped format. ! 10034: % ! 10035: @gdef@fixbackslash{% ! 10036: @ifx\@eatinput @let\ = @normalbackslash @fi ! 10037: @catcode`+=@active ! 10038: @catcode`@_=@active ! 10039: } ! 10040: ! 10041: % Say @foo, not \foo, in error messages. ! 10042: @escapechar = `@@ ! 10043: ! 10044: % These (along with & and #) are made active for url-breaking, so need ! 10045: % active definitions as the normal characters. ! 10046: @def@normaldot{.} ! 10047: @def@normalquest{?} ! 10048: @def@normalslash{/} ! 10049: ! 10050: % These look ok in all fonts, so just make them not special. ! 10051: % @hashchar{} gets its own user-level command, because of #line. ! 10052: @catcode`@& = @other @def@normalamp{&} ! 10053: @catcode`@# = @other @def@normalhash{#} ! 10054: @catcode`@% = @other @def@normalpercent{%} ! 10055: ! 10056: @let @hashchar = @normalhash ! 10057: ! 10058: @c Finally, make ` and ' active, so that txicodequoteundirected and ! 10059: @c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}. If we ! 10060: @c don't make ` and ' active, @code will not get them as active chars. ! 10061: @c Do this last of all since we use ` in the previous @catcode assignments. ! 10062: @catcode`@'=@active ! 10063: @catcode`@`=@active ! 10064: @markupsetuplqdefault ! 10065: @markupsetuprqdefault ! 10066: ! 10067: @c Local variables: ! 10068: @c eval: (add-hook 'write-file-hooks 'time-stamp) ! 10069: @c page-delimiter: "^\\\\message" ! 10070: @c time-stamp-start: "def\\\\texinfoversion{" ! 10071: @c time-stamp-format: "%:y-%02m-%02d.%02H" ! 10072: @c time-stamp-end: "}" ! 10073: @c End: ! 10074: ! 10075: @c vim:sw=2: ! 10076: ! 10077: @ignore ! 10078: arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115 ! 10079: @end ignore
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.