Mercurial > emacs
annotate man/texinfo.tex @ 54736:b94de166de9d
(ethio-sera-being-called-by-w3): New
variable.
(ethio-sera-to-fidel-ethio): Check ethio-sera-being-called-by-w3
instead of sera-being-called-by-w3.
(ethio-fidel-to-sera-buffer): Likewise.
(ethio-find-file): Bind ethio-sera-being-called-by-w3 to t
instead of sera-being-called-by-w3.
(ethio-write-file): Likewise.
| author | Kenichi Handa <handa@m17n.org> |
|---|---|
| date | Mon, 05 Apr 2004 23:27:37 +0000 |
| parents | a93f1f4e2e49 |
| children | f164571769e0 |
| rev | line source |
|---|---|
| 37713 | 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 % | |
|
52790
a93f1f4e2e49
Replace `%' in arch tagline by @ignore.
Luc Teirlinck <teirllm@auburn.edu>
parents:
52401
diff
changeset
|
6 \def\texinfoversion{2003-10-06.16} |
| 37713 | 7 % |
| 8 % Copyright (C) 1985, 86, 88, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, | |
| 47284 | 9 % 2000, 01, 02 Free Software Foundation, Inc. |
| 37713 | 10 % |
| 11 % This texinfo.tex file is free software; you can redistribute it and/or | |
| 12 % modify it under the terms of the GNU General Public License as | |
| 13 % published by the Free Software Foundation; either version 2, or (at | |
| 14 % your option) any later version. | |
| 15 % | |
| 16 % This texinfo.tex file is distributed in the hope that it will be | |
| 17 % useful, but WITHOUT ANY WARRANTY; without even the implied warranty | |
| 18 % of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| 19 % General Public License for more details. | |
| 20 % | |
| 21 % You should have received a copy of the GNU General Public License | |
| 22 % along with this texinfo.tex file; see the file COPYING. If not, write | |
| 23 % to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
| 24 % Boston, MA 02111-1307, USA. | |
| 25 % | |
| 26 % In other words, you are welcome to use, share and improve this program. | |
| 27 % You are forbidden to forbid anyone else to use, share and improve | |
| 28 % what you give them. Help stamp out software-hoarding! | |
| 29 % | |
| 30 % Please try the latest version of texinfo.tex before submitting bug | |
| 31 % reports; you can get the latest version from: | |
| 32 % ftp://ftp.gnu.org/gnu/texinfo.tex | |
| 47284 | 33 % (and all GNU mirrors, see http://www.gnu.org/order/ftp.html) |
| 34 % ftp://texinfo.org/texinfo/texinfo.tex | |
| 35 % ftp://tug.org/tex/texinfo.tex | |
| 36 % (and all CTAN mirrors, see http://www.ctan.org), | |
| 37 % and /home/gd/gnu/doc/texinfo.tex on the GNU machines. | |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
47284
diff
changeset
|
38 % |
| 37713 | 39 % The texinfo.tex in any given Texinfo distribution could well be out |
| 40 % of date, so if that's what you're using, please check. | |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
47284
diff
changeset
|
41 % |
| 47284 | 42 % Texinfo has a small home page at http://texinfo.org/ and also |
| 43 % http://www.gnu.org/software/texinfo. | |
| 37713 | 44 % |
| 45 % Send bug reports to bug-texinfo@gnu.org. Please include including a | |
| 46 % complete document in each bug report with which we can reproduce the | |
| 47 % problem. Patches are, of course, greatly appreciated. | |
| 48 % | |
| 49 % To process a Texinfo manual with TeX, it's most reliable to use the | |
| 50 % texi2dvi shell script that comes with the distribution. For a simple | |
| 51 % manual foo.texi, however, you can get away with this: | |
| 52 % tex foo.texi | |
| 53 % texindex foo.?? | |
| 54 % tex foo.texi | |
| 55 % tex foo.texi | |
| 47284 | 56 % dvips foo.dvi -o # or whatever; this makes foo.ps. |
| 57 % The extra TeX runs get the cross-reference information correct. | |
| 37713 | 58 % Sometimes one run after texindex suffices, and sometimes you need more |
| 59 % than two; texi2dvi does it as many times as necessary. | |
| 60 % | |
| 61 % It is possible to adapt texinfo.tex for other languages. You can get | |
| 47284 | 62 % the existing language-specific files from the full Texinfo distribution. |
| 37713 | 63 |
| 64 \message{Loading texinfo [version \texinfoversion]:} | |
| 65 | |
| 66 % If in a .fmt file, print the version number | |
| 67 % and turn on active characters that we couldn't do earlier because | |
| 68 % they might have appeared in the input file name. | |
| 69 \everyjob{\message{[Texinfo version \texinfoversion]}% | |
| 70 \catcode`+=\active \catcode`\_=\active} | |
| 71 | |
| 72 % Save some parts of plain tex whose names we will redefine. | |
| 73 \let\ptexb=\b | |
| 74 \let\ptexbullet=\bullet | |
| 75 \let\ptexc=\c | |
| 76 \let\ptexcomma=\, | |
| 77 \let\ptexdot=\. | |
| 78 \let\ptexdots=\dots | |
| 79 \let\ptexend=\end | |
| 80 \let\ptexequiv=\equiv | |
| 81 \let\ptexexclam=\! | |
| 82 \let\ptexi=\i | |
| 83 \let\ptexlbrace=\{ | |
| 84 \let\ptexrbrace=\} | |
| 85 \let\ptexstar=\* | |
| 86 \let\ptext=\t | |
| 87 | |
| 88 % We never want plain's outer \+ definition in Texinfo. | |
| 89 % For @tex, we can use \tabalign. | |
| 90 \let\+ = \relax | |
| 91 | |
| 92 \message{Basics,} | |
| 93 \chardef\other=12 | |
| 94 | |
| 95 % If this character appears in an error message or help string, it | |
| 96 % starts a new line in the output. | |
| 97 \newlinechar = `^^J | |
| 98 | |
| 99 % Set up fixed words for English if not already set. | |
| 100 \ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi | |
| 101 \ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi | |
| 102 \ifx\putwordfile\undefined \gdef\putwordfile{file}\fi | |
| 103 \ifx\putwordin\undefined \gdef\putwordin{in}\fi | |
| 104 \ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi | |
| 105 \ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi | |
| 106 \ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi | |
| 107 \ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi | |
| 108 \ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi | |
| 109 \ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi | |
| 110 \ifx\putwordof\undefined \gdef\putwordof{of}\fi | |
| 111 \ifx\putwordon\undefined \gdef\putwordon{on}\fi | |
| 112 \ifx\putwordpage\undefined \gdef\putwordpage{page}\fi | |
| 113 \ifx\putwordsection\undefined \gdef\putwordsection{section}\fi | |
| 114 \ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi | |
| 115 \ifx\putwordsee\undefined \gdef\putwordsee{see}\fi | |
| 116 \ifx\putwordSee\undefined \gdef\putwordSee{See}\fi | |
| 117 \ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi | |
| 118 \ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi | |
| 119 % | |
| 120 \ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi | |
| 121 \ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi | |
| 122 \ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi | |
| 123 \ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi | |
| 124 \ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi | |
| 125 \ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi | |
| 126 \ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi | |
| 127 \ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi | |
| 128 \ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi | |
| 129 \ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi | |
| 130 \ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi | |
| 131 \ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi | |
| 132 % | |
| 133 \ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi | |
| 134 \ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi | |
| 135 \ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi | |
| 136 \ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi | |
| 137 \ifx\putwordDeftypevar\undefined\gdef\putwordDeftypevar{Variable}\fi | |
| 138 \ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi | |
| 139 \ifx\putwordDeftypefun\undefined\gdef\putwordDeftypefun{Function}\fi | |
| 140 | |
| 141 % Ignore a token. | |
| 142 % | |
| 143 \def\gobble#1{} | |
| 144 | |
| 145 \hyphenation{ap-pen-dix} | |
| 146 \hyphenation{mini-buf-fer mini-buf-fers} | |
| 147 \hyphenation{eshell} | |
| 148 \hyphenation{white-space} | |
| 149 | |
| 150 % Margin to add to right of even pages, to left of odd pages. | |
| 151 \newdimen \bindingoffset | |
| 152 \newdimen \normaloffset | |
| 153 \newdimen\pagewidth \newdimen\pageheight | |
| 154 | |
| 155 % Sometimes it is convenient to have everything in the transcript file | |
| 156 % and nothing on the terminal. We don't just call \tracingall here, | |
| 157 % since that produces some useless output on the terminal. | |
| 158 % | |
| 159 \def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}% | |
| 160 \ifx\eTeXversion\undefined | |
| 161 \def\loggingall{\tracingcommands2 \tracingstats2 | |
| 162 \tracingpages1 \tracingoutput1 \tracinglostchars1 | |
| 163 \tracingmacros2 \tracingparagraphs1 \tracingrestores1 | |
| 164 \showboxbreadth\maxdimen\showboxdepth\maxdimen | |
| 165 }% | |
| 166 \else | |
| 167 \def\loggingall{\tracingcommands3 \tracingstats2 | |
| 168 \tracingpages1 \tracingoutput1 \tracinglostchars1 | |
| 169 \tracingmacros2 \tracingparagraphs1 \tracingrestores1 | |
| 170 \tracingscantokens1 \tracingassigns1 \tracingifs1 | |
| 171 \tracinggroups1 \tracingnesting2 | |
| 172 \showboxbreadth\maxdimen\showboxdepth\maxdimen | |
| 173 }% | |
| 174 \fi | |
| 175 | |
| 47284 | 176 % add check for \lastpenalty to plain's definitions. If the last thing |
| 177 % we did was a \nobreak, we don't want to insert more space. | |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
47284
diff
changeset
|
178 % |
| 47284 | 179 \def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount |
| 180 \removelastskip\penalty-50\smallskip\fi\fi} | |
| 181 \def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount | |
| 182 \removelastskip\penalty-100\medskip\fi\fi} | |
| 183 \def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount | |
| 184 \removelastskip\penalty-200\bigskip\fi\fi} | |
| 185 | |
| 37713 | 186 % For @cropmarks command. |
| 187 % Do @cropmarks to get crop marks. | |
| 188 % | |
| 189 \newif\ifcropmarks | |
| 190 \let\cropmarks = \cropmarkstrue | |
| 191 % | |
| 192 % Dimensions to add cropmarks at corners. | |
| 193 % Added by P. A. MacKay, 12 Nov. 1986 | |
| 194 % | |
| 195 \newdimen\outerhsize \newdimen\outervsize % set by the paper size routines | |
| 196 \newdimen\cornerlong \cornerlong=1pc | |
| 197 \newdimen\cornerthick \cornerthick=.3pt | |
| 198 \newdimen\topandbottommargin \topandbottommargin=.75in | |
| 199 | |
| 200 % Main output routine. | |
| 201 \chardef\PAGE = 255 | |
| 202 \output = {\onepageout{\pagecontents\PAGE}} | |
| 203 | |
| 204 \newbox\headlinebox | |
| 205 \newbox\footlinebox | |
| 206 | |
| 207 % \onepageout takes a vbox as an argument. Note that \pagecontents | |
| 208 % does insertions, but you have to call it yourself. | |
| 209 \def\onepageout#1{% | |
| 210 \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi | |
| 211 % | |
| 212 \ifodd\pageno \advance\hoffset by \bindingoffset | |
| 213 \else \advance\hoffset by -\bindingoffset\fi | |
| 214 % | |
| 215 % Do this outside of the \shipout so @code etc. will be expanded in | |
| 216 % the headline as they should be, not taken literally (outputting ''code). | |
| 217 \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}% | |
| 218 \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}% | |
| 219 % | |
| 220 {% | |
| 221 % Have to do this stuff outside the \shipout because we want it to | |
| 222 % take effect in \write's, yet the group defined by the \vbox ends | |
| 223 % before the \shipout runs. | |
| 224 % | |
| 225 \escapechar = `\\ % use backslash in output files. | |
| 226 \indexdummies % don't expand commands in the output. | |
| 227 \normalturnoffactive % \ in index entries must not stay \, e.g., if | |
| 228 % the page break happens to be in the middle of an example. | |
| 229 \shipout\vbox{% | |
| 230 % Do this early so pdf references go to the beginning of the page. | |
| 231 \ifpdfmakepagedest \pdfmkdest{\the\pageno} \fi | |
| 232 % | |
| 233 \ifcropmarks \vbox to \outervsize\bgroup | |
| 234 \hsize = \outerhsize | |
| 235 \vskip-\topandbottommargin | |
| 236 \vtop to0pt{% | |
| 237 \line{\ewtop\hfil\ewtop}% | |
| 238 \nointerlineskip | |
| 239 \line{% | |
| 240 \vbox{\moveleft\cornerthick\nstop}% | |
| 241 \hfill | |
| 242 \vbox{\moveright\cornerthick\nstop}% | |
| 243 }% | |
| 244 \vss}% | |
| 245 \vskip\topandbottommargin | |
| 246 \line\bgroup | |
| 247 \hfil % center the page within the outer (page) hsize. | |
| 248 \ifodd\pageno\hskip\bindingoffset\fi | |
| 249 \vbox\bgroup | |
| 250 \fi | |
| 251 % | |
| 252 \unvbox\headlinebox | |
| 253 \pagebody{#1}% | |
| 254 \ifdim\ht\footlinebox > 0pt | |
| 255 % Only leave this space if the footline is nonempty. | |
| 256 % (We lessened \vsize for it in \oddfootingxxx.) | |
| 257 % The \baselineskip=24pt in plain's \makefootline has no effect. | |
| 258 \vskip 2\baselineskip | |
| 259 \unvbox\footlinebox | |
| 260 \fi | |
| 261 % | |
| 262 \ifcropmarks | |
| 263 \egroup % end of \vbox\bgroup | |
| 264 \hfil\egroup % end of (centering) \line\bgroup | |
| 265 \vskip\topandbottommargin plus1fill minus1fill | |
| 266 \boxmaxdepth = \cornerthick | |
| 267 \vbox to0pt{\vss | |
| 268 \line{% | |
| 269 \vbox{\moveleft\cornerthick\nsbot}% | |
| 270 \hfill | |
| 271 \vbox{\moveright\cornerthick\nsbot}% | |
| 272 }% | |
| 273 \nointerlineskip | |
| 274 \line{\ewbot\hfil\ewbot}% | |
| 275 }% | |
| 276 \egroup % \vbox from first cropmarks clause | |
| 277 \fi | |
| 278 }% end of \shipout\vbox | |
| 279 }% end of group with \turnoffactive | |
| 280 \advancepageno | |
| 281 \ifnum\outputpenalty>-20000 \else\dosupereject\fi | |
| 282 } | |
| 283 | |
| 284 \newinsert\margin \dimen\margin=\maxdimen | |
| 285 | |
| 286 \def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}} | |
| 287 {\catcode`\@ =11 | |
| 288 \gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi | |
| 289 % marginal hacks, juha@viisa.uucp (Juha Takala) | |
| 290 \ifvoid\margin\else % marginal info is present | |
| 291 \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi | |
| 292 \dimen@=\dp#1 \unvbox#1 | |
| 293 \ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi | |
| 294 \ifr@ggedbottom \kern-\dimen@ \vfil \fi} | |
| 295 } | |
| 296 | |
| 297 % Here are the rules for the cropmarks. Note that they are | |
| 298 % offset so that the space between them is truly \outerhsize or \outervsize | |
| 299 % (P. A. MacKay, 12 November, 1986) | |
| 300 % | |
| 301 \def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong} | |
| 302 \def\nstop{\vbox | |
| 303 {\hrule height\cornerthick depth\cornerlong width\cornerthick}} | |
| 304 \def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong} | |
| 305 \def\nsbot{\vbox | |
| 306 {\hrule height\cornerlong depth\cornerthick width\cornerthick}} | |
| 307 | |
| 308 % Parse an argument, then pass it to #1. The argument is the rest of | |
| 309 % the input line (except we remove a trailing comment). #1 should be a | |
| 310 % macro which expects an ordinary undelimited TeX argument. | |
| 311 % | |
| 312 \def\parsearg#1{% | |
| 313 \let\next = #1% | |
| 314 \begingroup | |
| 315 \obeylines | |
| 316 \futurelet\temp\parseargx | |
| 317 } | |
| 318 | |
| 319 % If the next token is an obeyed space (from an @example environment or | |
| 320 % the like), remove it and recurse. Otherwise, we're done. | |
| 321 \def\parseargx{% | |
| 322 % \obeyedspace is defined far below, after the definition of \sepspaces. | |
| 323 \ifx\obeyedspace\temp | |
| 324 \expandafter\parseargdiscardspace | |
| 325 \else | |
| 326 \expandafter\parseargline | |
| 327 \fi | |
| 328 } | |
| 329 | |
| 330 % Remove a single space (as the delimiter token to the macro call). | |
| 331 {\obeyspaces % | |
| 332 \gdef\parseargdiscardspace {\futurelet\temp\parseargx}} | |
| 333 | |
| 334 {\obeylines % | |
| 335 \gdef\parseargline#1^^M{% | |
| 336 \endgroup % End of the group started in \parsearg. | |
| 337 % | |
| 338 % First remove any @c comment, then any @comment. | |
| 339 % Result of each macro is put in \toks0. | |
| 340 \argremovec #1\c\relax % | |
| 341 \expandafter\argremovecomment \the\toks0 \comment\relax % | |
| 342 % | |
| 343 % Call the caller's macro, saved as \next in \parsearg. | |
| 344 \expandafter\next\expandafter{\the\toks0}% | |
| 345 }% | |
| 346 } | |
| 347 | |
| 348 % Since all \c{,omment} does is throw away the argument, we can let TeX | |
| 349 % do that for us. The \relax here is matched by the \relax in the call | |
| 350 % in \parseargline; it could be more or less anything, its purpose is | |
| 351 % just to delimit the argument to the \c. | |
| 352 \def\argremovec#1\c#2\relax{\toks0 = {#1}} | |
| 353 \def\argremovecomment#1\comment#2\relax{\toks0 = {#1}} | |
| 354 | |
| 355 % \argremovec{,omment} might leave us with trailing spaces, though; e.g., | |
| 356 % @end itemize @c foo | |
| 357 % will have two active spaces as part of the argument with the | |
| 358 % `itemize'. Here we remove all active spaces from #1, and assign the | |
| 359 % result to \toks0. | |
| 360 % | |
| 361 % This loses if there are any *other* active characters besides spaces | |
| 362 % in the argument -- _ ^ +, for example -- since they get expanded. | |
| 363 % Fortunately, Texinfo does not define any such commands. (If it ever | |
| 364 % does, the catcode of the characters in questionwill have to be changed | |
| 365 % here.) But this means we cannot call \removeactivespaces as part of | |
| 366 % \argremovec{,omment}, since @c uses \parsearg, and thus the argument | |
| 367 % that \parsearg gets might well have any character at all in it. | |
| 368 % | |
| 369 \def\removeactivespaces#1{% | |
| 370 \begingroup | |
| 371 \ignoreactivespaces | |
| 372 \edef\temp{#1}% | |
| 373 \global\toks0 = \expandafter{\temp}% | |
| 374 \endgroup | |
| 375 } | |
| 376 | |
| 377 % Change the active space to expand to nothing. | |
| 378 % | |
| 379 \begingroup | |
| 380 \obeyspaces | |
| 381 \gdef\ignoreactivespaces{\obeyspaces\let =\empty} | |
| 382 \endgroup | |
| 383 | |
| 384 | |
| 385 \def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next} | |
| 386 | |
| 387 %% These are used to keep @begin/@end levels from running away | |
| 388 %% Call \inENV within environments (after a \begingroup) | |
| 389 \newif\ifENV \ENVfalse \def\inENV{\ifENV\relax\else\ENVtrue\fi} | |
| 390 \def\ENVcheck{% | |
| 391 \ifENV\errmessage{Still within an environment; press RETURN to continue} | |
| 392 \endgroup\fi} % This is not perfect, but it should reduce lossage | |
| 393 | |
| 394 % @begin foo is the same as @foo, for now. | |
| 395 \newhelp\EMsimple{Press RETURN to continue.} | |
| 396 | |
| 397 \outer\def\begin{\parsearg\beginxxx} | |
| 398 | |
| 399 \def\beginxxx #1{% | |
| 400 \expandafter\ifx\csname #1\endcsname\relax | |
| 401 {\errhelp=\EMsimple \errmessage{Undefined command @begin #1}}\else | |
| 402 \csname #1\endcsname\fi} | |
| 403 | |
| 404 % @end foo executes the definition of \Efoo. | |
| 405 % | |
| 406 \def\end{\parsearg\endxxx} | |
| 407 \def\endxxx #1{% | |
| 408 \removeactivespaces{#1}% | |
| 409 \edef\endthing{\the\toks0}% | |
| 410 % | |
| 411 \expandafter\ifx\csname E\endthing\endcsname\relax | |
| 412 \expandafter\ifx\csname \endthing\endcsname\relax | |
| 413 % There's no \foo, i.e., no ``environment'' foo. | |
| 414 \errhelp = \EMsimple | |
| 415 \errmessage{Undefined command `@end \endthing'}% | |
| 416 \else | |
| 417 \unmatchedenderror\endthing | |
| 418 \fi | |
| 419 \else | |
| 420 % Everything's ok; the right environment has been started. | |
| 421 \csname E\endthing\endcsname | |
| 422 \fi | |
| 423 } | |
| 424 | |
| 425 % There is an environment #1, but it hasn't been started. Give an error. | |
| 426 % | |
| 427 \def\unmatchedenderror#1{% | |
| 428 \errhelp = \EMsimple | |
| 429 \errmessage{This `@end #1' doesn't have a matching `@#1'}% | |
| 430 } | |
| 431 | |
| 432 % Define the control sequence \E#1 to give an unmatched @end error. | |
| 433 % | |
| 434 \def\defineunmatchedend#1{% | |
| 435 \expandafter\def\csname E#1\endcsname{\unmatchedenderror{#1}}% | |
| 436 } | |
| 437 | |
| 438 | |
| 439 % Single-spacing is done by various environments (specifically, in | |
| 440 % \nonfillstart and \quotations). | |
| 441 \newskip\singlespaceskip \singlespaceskip = 12.5pt | |
| 442 \def\singlespace{% | |
| 443 % Why was this kern here? It messes up equalizing space above and below | |
| 444 % environments. --karl, 6may93 | |
| 445 %{\advance \baselineskip by -\singlespaceskip | |
| 446 %\kern \baselineskip}% | |
| 47284 | 447 \setleading\singlespaceskip |
| 37713 | 448 } |
| 449 | |
| 450 %% Simple single-character @ commands | |
| 451 | |
| 452 % @@ prints an @ | |
| 453 % Kludge this until the fonts are right (grr). | |
| 454 \def\@{{\tt\char64}} | |
| 455 | |
| 456 % This is turned off because it was never documented | |
| 457 % and you can use @w{...} around a quote to suppress ligatures. | |
| 458 %% Define @` and @' to be the same as ` and ' | |
| 459 %% but suppressing ligatures. | |
| 460 %\def\`{{`}} | |
| 461 %\def\'{{'}} | |
| 462 | |
| 463 % Used to generate quoted braces. | |
| 464 \def\mylbrace {{\tt\char123}} | |
| 465 \def\myrbrace {{\tt\char125}} | |
| 466 \let\{=\mylbrace | |
| 467 \let\}=\myrbrace | |
| 468 \begingroup | |
| 469 % Definitions to produce actual \{ & \} command in an index. | |
| 470 \catcode`\{ = 12 \catcode`\} = 12 | |
| 471 \catcode`\[ = 1 \catcode`\] = 2 | |
| 472 \catcode`\@ = 0 \catcode`\\ = 12 | |
| 473 @gdef@lbracecmd[\{]% | |
| 474 @gdef@rbracecmd[\}]% | |
| 475 @endgroup | |
| 476 | |
| 477 % Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent | |
| 478 % Others are defined by plain TeX: @` @' @" @^ @~ @= @v @H. | |
| 479 \let\, = \c | |
| 480 \let\dotaccent = \. | |
| 481 \def\ringaccent#1{{\accent23 #1}} | |
| 482 \let\tieaccent = \t | |
| 483 \let\ubaraccent = \b | |
| 484 \let\udotaccent = \d | |
| 485 | |
| 486 % Other special characters: @questiondown @exclamdown | |
| 487 % Plain TeX defines: @AA @AE @O @OE @L (and lowercase versions) @ss. | |
| 488 \def\questiondown{?`} | |
| 489 \def\exclamdown{!`} | |
| 490 | |
| 491 % Dotless i and dotless j, used for accents. | |
| 492 \def\imacro{i} | |
| 493 \def\jmacro{j} | |
| 494 \def\dotless#1{% | |
| 495 \def\temp{#1}% | |
| 496 \ifx\temp\imacro \ptexi | |
| 497 \else\ifx\temp\jmacro \j | |
| 498 \else \errmessage{@dotless can be used only with i or j}% | |
| 499 \fi\fi | |
| 500 } | |
| 501 | |
| 502 % Be sure we're in horizontal mode when doing a tie, since we make space | |
| 503 % equivalent to this in @example-like environments. Otherwise, a space | |
| 504 % at the beginning of a line will start with \penalty -- and | |
| 505 % since \penalty is valid in vertical mode, we'd end up putting the | |
| 506 % penalty on the vertical list instead of in the new paragraph. | |
| 507 {\catcode`@ = 11 | |
| 508 % Avoid using \@M directly, because that causes trouble | |
| 509 % if the definition is written into an index file. | |
| 510 \global\let\tiepenalty = \@M | |
| 511 \gdef\tie{\leavevmode\penalty\tiepenalty\ } | |
| 512 } | |
| 513 | |
| 514 % @: forces normal size whitespace following. | |
| 515 \def\:{\spacefactor=1000 } | |
| 516 | |
| 517 % @* forces a line break. | |
| 518 \def\*{\hfil\break\hbox{}\ignorespaces} | |
| 519 | |
| 520 % @. is an end-of-sentence period. | |
| 521 \def\.{.\spacefactor=3000 } | |
| 522 | |
| 523 % @! is an end-of-sentence bang. | |
| 524 \def\!{!\spacefactor=3000 } | |
| 525 | |
| 526 % @? is an end-of-sentence query. | |
| 527 \def\?{?\spacefactor=3000 } | |
| 528 | |
| 529 % @w prevents a word break. Without the \leavevmode, @w at the | |
| 530 % beginning of a paragraph, when TeX is still in vertical mode, would | |
| 531 % produce a whole line of output instead of starting the paragraph. | |
| 532 \def\w#1{\leavevmode\hbox{#1}} | |
| 533 | |
| 534 % @group ... @end group forces ... to be all on one page, by enclosing | |
| 535 % it in a TeX vbox. We use \vtop instead of \vbox to construct the box | |
| 536 % to keep its height that of a normal line. According to the rules for | |
| 537 % \topskip (p.114 of the TeXbook), the glue inserted is | |
| 538 % max (\topskip - \ht (first item), 0). If that height is large, | |
| 539 % therefore, no glue is inserted, and the space between the headline and | |
| 540 % the text is small, which looks bad. | |
| 541 % | |
| 542 \def\group{\begingroup | |
| 543 \ifnum\catcode13=\active \else | |
| 544 \errhelp = \groupinvalidhelp | |
| 545 \errmessage{@group invalid in context where filling is enabled}% | |
| 546 \fi | |
| 547 % | |
| 548 % The \vtop we start below produces a box with normal height and large | |
| 549 % depth; thus, TeX puts \baselineskip glue before it, and (when the | |
| 550 % next line of text is done) \lineskip glue after it. (See p.82 of | |
| 551 % the TeXbook.) Thus, space below is not quite equal to space | |
| 552 % above. But it's pretty close. | |
| 553 \def\Egroup{% | |
| 554 \egroup % End the \vtop. | |
| 555 \endgroup % End the \group. | |
| 556 }% | |
| 557 % | |
| 558 \vtop\bgroup | |
| 559 % We have to put a strut on the last line in case the @group is in | |
| 560 % the midst of an example, rather than completely enclosing it. | |
| 561 % Otherwise, the interline space between the last line of the group | |
| 562 % and the first line afterwards is too small. But we can't put the | |
| 563 % strut in \Egroup, since there it would be on a line by itself. | |
| 564 % Hence this just inserts a strut at the beginning of each line. | |
| 565 \everypar = {\strut}% | |
| 566 % | |
| 567 % Since we have a strut on every line, we don't need any of TeX's | |
| 568 % normal interline spacing. | |
| 569 \offinterlineskip | |
| 570 % | |
| 571 % OK, but now we have to do something about blank | |
| 572 % lines in the input in @example-like environments, which normally | |
| 573 % just turn into \lisppar, which will insert no space now that we've | |
| 574 % turned off the interline space. Simplest is to make them be an | |
| 575 % empty paragraph. | |
| 576 \ifx\par\lisppar | |
| 577 \edef\par{\leavevmode \par}% | |
| 578 % | |
| 579 % Reset ^^M's definition to new definition of \par. | |
| 580 \obeylines | |
| 581 \fi | |
| 582 % | |
| 583 % Do @comment since we are called inside an environment such as | |
| 584 % @example, where each end-of-line in the input causes an | |
| 585 % end-of-line in the output. We don't want the end-of-line after | |
| 586 % the `@group' to put extra space in the output. Since @group | |
| 587 % should appear on a line by itself (according to the Texinfo | |
| 588 % manual), we don't worry about eating any user text. | |
| 589 \comment | |
| 590 } | |
| 591 % | |
| 592 % TeX puts in an \escapechar (i.e., `@') at the beginning of the help | |
| 593 % message, so this ends up printing `@group can only ...'. | |
| 594 % | |
| 595 \newhelp\groupinvalidhelp{% | |
| 596 group can only be used in environments such as @example,^^J% | |
| 597 where each line of input produces a line of output.} | |
| 598 | |
| 599 % @need space-in-mils | |
| 600 % forces a page break if there is not space-in-mils remaining. | |
| 601 | |
| 602 \newdimen\mil \mil=0.001in | |
| 603 | |
| 604 \def\need{\parsearg\needx} | |
| 605 | |
| 606 % Old definition--didn't work. | |
| 607 %\def\needx #1{\par % | |
| 608 %% This method tries to make TeX break the page naturally | |
| 609 %% if the depth of the box does not fit. | |
| 610 %{\baselineskip=0pt% | |
| 611 %\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak | |
| 612 %\prevdepth=-1000pt | |
| 613 %}} | |
| 614 | |
| 615 \def\needx#1{% | |
| 616 % Ensure vertical mode, so we don't make a big box in the middle of a | |
| 617 % paragraph. | |
| 618 \par | |
| 619 % | |
| 620 % If the @need value is less than one line space, it's useless. | |
| 621 \dimen0 = #1\mil | |
| 622 \dimen2 = \ht\strutbox | |
| 623 \advance\dimen2 by \dp\strutbox | |
| 624 \ifdim\dimen0 > \dimen2 | |
| 625 % | |
| 626 % Do a \strut just to make the height of this box be normal, so the | |
| 627 % normal leading is inserted relative to the preceding line. | |
| 628 % And a page break here is fine. | |
| 629 \vtop to #1\mil{\strut\vfil}% | |
| 630 % | |
| 631 % TeX does not even consider page breaks if a penalty added to the | |
| 632 % main vertical list is 10000 or more. But in order to see if the | |
| 633 % empty box we just added fits on the page, we must make it consider | |
| 634 % page breaks. On the other hand, we don't want to actually break the | |
| 635 % page after the empty box. So we use a penalty of 9999. | |
| 636 % | |
| 637 % There is an extremely small chance that TeX will actually break the | |
| 638 % page at this \penalty, if there are no other feasible breakpoints in | |
| 639 % sight. (If the user is using lots of big @group commands, which | |
| 640 % almost-but-not-quite fill up a page, TeX will have a hard time doing | |
| 641 % good page breaking, for example.) However, I could not construct an | |
| 642 % example where a page broke at this \penalty; if it happens in a real | |
| 643 % document, then we can reconsider our strategy. | |
| 644 \penalty9999 | |
| 645 % | |
| 646 % Back up by the size of the box, whether we did a page break or not. | |
| 647 \kern -#1\mil | |
| 648 % | |
| 649 % Do not allow a page break right after this kern. | |
| 650 \nobreak | |
| 651 \fi | |
| 652 } | |
| 653 | |
| 654 % @br forces paragraph break | |
| 655 | |
| 656 \let\br = \par | |
| 657 | |
| 658 % @dots{} output an ellipsis using the current font. | |
| 659 % We do .5em per period so that it has the same spacing in a typewriter | |
| 660 % font as three actual period characters. | |
| 661 % | |
| 662 \def\dots{% | |
| 663 \leavevmode | |
| 664 \hbox to 1.5em{% | |
| 665 \hskip 0pt plus 0.25fil minus 0.25fil | |
| 666 .\hss.\hss.% | |
| 667 \hskip 0pt plus 0.5fil minus 0.5fil | |
| 668 }% | |
| 669 } | |
| 670 | |
| 671 % @enddots{} is an end-of-sentence ellipsis. | |
| 672 % | |
| 673 \def\enddots{% | |
| 674 \leavevmode | |
| 675 \hbox to 2em{% | |
| 676 \hskip 0pt plus 0.25fil minus 0.25fil | |
| 677 .\hss.\hss.\hss.% | |
| 678 \hskip 0pt plus 0.5fil minus 0.5fil | |
| 679 }% | |
| 680 \spacefactor=3000 | |
| 681 } | |
| 682 | |
| 683 | |
| 684 % @page forces the start of a new page | |
| 685 % | |
| 686 \def\page{\par\vfill\supereject} | |
| 687 | |
| 688 % @exdent text.... | |
| 689 % outputs text on separate line in roman font, starting at standard page margin | |
| 690 | |
| 691 % This records the amount of indent in the innermost environment. | |
| 692 % That's how much \exdent should take out. | |
| 693 \newskip\exdentamount | |
| 694 | |
| 695 % This defn is used inside fill environments such as @defun. | |
| 696 \def\exdent{\parsearg\exdentyyy} | |
| 697 \def\exdentyyy #1{{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}} | |
| 698 | |
| 699 % This defn is used inside nofill environments such as @example. | |
| 700 \def\nofillexdent{\parsearg\nofillexdentyyy} | |
| 701 \def\nofillexdentyyy #1{{\advance \leftskip by -\exdentamount | |
| 702 \leftline{\hskip\leftskip{\rm#1}}}} | |
| 703 | |
| 704 % @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current | |
| 705 % paragraph. For more general purposes, use the \margin insertion | |
| 706 % class. WHICH is `l' or `r'. | |
| 707 % | |
| 708 \newskip\inmarginspacing \inmarginspacing=1cm | |
| 709 \def\strutdepth{\dp\strutbox} | |
| 710 % | |
| 711 \def\doinmargin#1#2{\strut\vadjust{% | |
| 712 \nobreak | |
| 713 \kern-\strutdepth | |
| 714 \vtop to \strutdepth{% | |
| 715 \baselineskip=\strutdepth | |
| 716 \vss | |
| 717 % if you have multiple lines of stuff to put here, you'll need to | |
| 718 % make the vbox yourself of the appropriate size. | |
| 719 \ifx#1l% | |
| 720 \llap{\ignorespaces #2\hskip\inmarginspacing}% | |
| 721 \else | |
| 722 \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}% | |
| 723 \fi | |
| 724 \null | |
| 725 }% | |
| 726 }} | |
| 727 \def\inleftmargin{\doinmargin l} | |
| 728 \def\inrightmargin{\doinmargin r} | |
| 729 % | |
| 730 % @inmargin{TEXT [, RIGHT-TEXT]} | |
| 731 % (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right; | |
| 732 % else use TEXT for both). | |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
47284
diff
changeset
|
733 % |
| 37713 | 734 \def\inmargin#1{\parseinmargin #1,,\finish} |
| 735 \def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing. | |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
47284
diff
changeset
|
736 \setbox0 = \hbox{\ignorespaces #2}% |
| 37713 | 737 \ifdim\wd0 > 0pt |
| 738 \def\lefttext{#1}% have both texts | |
| 739 \def\righttext{#2}% | |
| 740 \else | |
| 741 \def\lefttext{#1}% have only one text | |
| 742 \def\righttext{#1}% | |
| 743 \fi | |
| 744 % | |
| 745 \ifodd\pageno | |
| 746 \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin | |
| 747 \else | |
| 748 \def\temp{\inleftmargin\lefttext}% | |
| 749 \fi | |
| 750 \temp | |
| 751 } | |
| 752 | |
| 753 % @include file insert text of that file as input. | |
| 754 % Allow normal characters that we make active in the argument (a file name). | |
| 755 \def\include{\begingroup | |
| 756 \catcode`\\=12 | |
| 757 \catcode`~=12 | |
| 758 \catcode`^=12 | |
| 759 \catcode`_=12 | |
| 760 \catcode`|=12 | |
| 761 \catcode`<=12 | |
| 762 \catcode`>=12 | |
| 763 \catcode`+=12 | |
| 764 \parsearg\includezzz} | |
| 765 % Restore active chars for included file. | |
| 766 \def\includezzz#1{\endgroup\begingroup | |
| 767 % Read the included file in a group so nested @include's work. | |
| 768 \def\thisfile{#1}% | |
| 769 \input\thisfile | |
| 770 \endgroup} | |
| 771 | |
| 772 \def\thisfile{} | |
| 773 | |
| 774 % @center line outputs that line, centered | |
| 775 | |
| 776 \def\center{\parsearg\centerzzz} | |
| 777 \def\centerzzz #1{{\advance\hsize by -\leftskip | |
| 778 \advance\hsize by -\rightskip | |
| 779 \centerline{#1}}} | |
| 780 | |
| 781 % @sp n outputs n lines of vertical space | |
| 782 | |
| 783 \def\sp{\parsearg\spxxx} | |
| 784 \def\spxxx #1{\vskip #1\baselineskip} | |
| 785 | |
| 786 % @comment ...line which is ignored... | |
| 787 % @c is the same as @comment | |
| 788 % @ignore ... @end ignore is another way to write a comment | |
| 789 | |
| 790 \def\comment{\begingroup \catcode`\^^M=\other% | |
| 791 \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other% | |
| 792 \commentxxx} | |
| 793 {\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}} | |
| 794 | |
| 795 \let\c=\comment | |
| 796 | |
| 797 % @paragraphindent NCHARS | |
| 798 % We'll use ems for NCHARS, close enough. | |
| 799 % We cannot implement @paragraphindent asis, though. | |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
47284
diff
changeset
|
800 % |
| 37713 | 801 \def\asisword{asis} % no translation, these are keywords |
| 802 \def\noneword{none} | |
| 803 % | |
| 804 \def\paragraphindent{\parsearg\doparagraphindent} | |
| 805 \def\doparagraphindent#1{% | |
| 806 \def\temp{#1}% | |
| 807 \ifx\temp\asisword | |
| 808 \else | |
| 809 \ifx\temp\noneword | |
| 810 \defaultparindent = 0pt | |
| 811 \else | |
| 812 \defaultparindent = #1em | |
| 813 \fi | |
| 814 \fi | |
| 815 \parindent = \defaultparindent | |
| 816 } | |
| 817 | |
| 818 % @exampleindent NCHARS | |
| 819 % We'll use ems for NCHARS like @paragraphindent. | |
| 820 % It seems @exampleindent asis isn't necessary, but | |
| 821 % I preserve it to make it similar to @paragraphindent. | |
| 822 \def\exampleindent{\parsearg\doexampleindent} | |
| 823 \def\doexampleindent#1{% | |
| 824 \def\temp{#1}% | |
| 825 \ifx\temp\asisword | |
| 826 \else | |
| 827 \ifx\temp\noneword | |
| 828 \lispnarrowing = 0pt | |
| 829 \else | |
| 830 \lispnarrowing = #1em | |
| 831 \fi | |
| 832 \fi | |
| 833 } | |
| 834 | |
| 835 % @asis just yields its argument. Used with @table, for example. | |
| 836 % | |
| 837 \def\asis#1{#1} | |
| 838 | |
| 47284 | 839 % @math outputs its argument in math mode. |
| 840 % We don't use $'s directly in the definition of \math because we need | |
| 841 % to set catcodes according to plain TeX first, to allow for subscripts, | |
| 842 % superscripts, special math chars, etc. | |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
47284
diff
changeset
|
843 % |
| 47284 | 844 % @math does not do math typesetting in section titles, index |
| 845 % entries, and other such contexts where the catcodes are set before | |
| 846 % @math gets a chance to work. This could perhaps be fixed, but for now | |
| 847 % at least we can have real math in the main text, where it's needed most. | |
| 848 % | |
| 849 \let\implicitmath = $%$ font-lock fix | |
| 850 % | |
| 851 % One complication: _ usually means subscripts, but it could also mean | |
| 852 % an actual _ character, as in @math{@var{some_variable} + 1}. So make | |
| 853 % _ within @math be active (mathcode "8000), and distinguish by seeing | |
| 854 % if the current family is \slfam, which is what @var uses. | |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
47284
diff
changeset
|
855 % |
| 47284 | 856 {\catcode95 = \active % 95 = _ |
| 857 \gdef\mathunderscore{% | |
| 858 \catcode95=\active | |
| 859 \def_{\ifnum\fam=\slfam \_\else\sb\fi}% | |
| 860 }} | |
| 861 % | |
| 862 % Another complication: we want \\ (and @\) to output a \ character. | |
| 863 % FYI, plain.tex uses \\ as a temporary control sequence (why?), but | |
| 864 % this is not advertised and we don't care. Texinfo does not | |
| 865 % otherwise define @\. | |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
47284
diff
changeset
|
866 % |
| 47284 | 867 % The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\. |
| 868 \def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi} | |
| 869 % | |
| 870 \def\math{% | |
| 871 \tex | |
| 872 \mathcode`\_="8000 \mathunderscore | |
| 873 \let\\ = \mathbackslash | |
| 874 \implicitmath\finishmath} | |
| 875 \def\finishmath#1{#1\implicitmath\Etex} | |
| 37713 | 876 |
| 877 % @bullet and @minus need the same treatment as @math, just above. | |
| 878 \def\bullet{\implicitmath\ptexbullet\implicitmath} | |
| 879 \def\minus{\implicitmath-\implicitmath} | |
| 880 | |
| 881 % @refill is a no-op. | |
| 882 \let\refill=\relax | |
| 883 | |
| 884 % If working on a large document in chapters, it is convenient to | |
| 885 % be able to disable indexing, cross-referencing, and contents, for test runs. | |
| 886 % This is done with @novalidate (before @setfilename). | |
| 887 % | |
| 888 \newif\iflinks \linkstrue % by default we want the aux files. | |
| 889 \let\novalidate = \linksfalse | |
| 890 | |
| 891 % @setfilename is done at the beginning of every texinfo file. | |
| 892 % So open here the files we need to have open while reading the input. | |
| 893 % This makes it possible to make a .fmt file for texinfo. | |
| 894 \def\setfilename{% | |
| 895 \iflinks | |
| 896 \readauxfile | |
| 897 \fi % \openindices needs to do some work in any case. | |
| 898 \openindices | |
| 899 \fixbackslash % Turn off hack to swallow `\input texinfo'. | |
| 900 \global\let\setfilename=\comment % Ignore extra @setfilename cmds. | |
| 901 % | |
| 902 % If texinfo.cnf is present on the system, read it. | |
| 903 % Useful for site-wide @afourpaper, etc. | |
| 904 % Just to be on the safe side, close the input stream before the \input. | |
| 905 \openin 1 texinfo.cnf | |
| 906 \ifeof1 \let\temp=\relax \else \def\temp{\input texinfo.cnf }\fi | |
| 907 \closein1 | |
| 908 \temp | |
| 909 % | |
| 910 \comment % Ignore the actual filename. | |
| 911 } | |
| 912 | |
| 913 % Called from \setfilename. | |
| 914 % | |
| 915 \def\openindices{% | |
| 916 \newindex{cp}% | |
| 917 \newcodeindex{fn}% | |
| 918 \newcodeindex{vr}% | |
| 919 \newcodeindex{tp}% | |
| 920 \newcodeindex{ky}% | |
| 921 \newcodeindex{pg}% | |
| 922 } | |
| 923 | |
| 924 % @bye. | |
| 925 \outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} | |
| 926 | |
| 927 | |
| 928 \message{pdf,} | |
| 929 % adobe `portable' document format | |
| 930 \newcount\tempnum | |
| 931 \newcount\lnkcount | |
| 932 \newtoks\filename | |
| 933 \newcount\filenamelength | |
| 934 \newcount\pgn | |
| 935 \newtoks\toksA | |
| 936 \newtoks\toksB | |
| 937 \newtoks\toksC | |
| 938 \newtoks\toksD | |
| 939 \newbox\boxA | |
| 940 \newcount\countA | |
| 941 \newif\ifpdf | |
| 942 \newif\ifpdfmakepagedest | |
| 943 | |
| 944 \ifx\pdfoutput\undefined | |
| 945 \pdffalse | |
| 946 \let\pdfmkdest = \gobble | |
| 947 \let\pdfurl = \gobble | |
| 948 \let\endlink = \relax | |
| 949 \let\linkcolor = \relax | |
| 950 \let\pdfmakeoutlines = \relax | |
| 951 \else | |
| 952 \pdftrue | |
| 953 \pdfoutput = 1 | |
| 954 \input pdfcolor | |
| 955 \def\dopdfimage#1#2#3{% | |
| 956 \def\imagewidth{#2}% | |
| 957 \def\imageheight{#3}% | |
| 47284 | 958 % without \immediate, pdftex seg faults when the same image is |
| 959 % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.) | |
| 37713 | 960 \ifnum\pdftexversion < 14 |
| 47284 | 961 \immediate\pdfimage |
| 37713 | 962 \else |
| 47284 | 963 \immediate\pdfximage |
| 37713 | 964 \fi |
| 965 \ifx\empty\imagewidth\else width \imagewidth \fi | |
| 966 \ifx\empty\imageheight\else height \imageheight \fi | |
| 967 \ifnum\pdftexversion<13 | |
| 968 #1.pdf% | |
| 969 \else | |
| 970 {#1.pdf}% | |
| 971 \fi | |
| 972 \ifnum\pdftexversion < 14 \else | |
| 973 \pdfrefximage \pdflastximage | |
| 974 \fi} | |
| 47284 | 975 \def\pdfmkdest#1{{\normalturnoffactive \pdfdest name{#1} xyz}} |
| 976 \def\pdfmkpgn#1{#1} | |
| 37713 | 977 \let\linkcolor = \Blue % was Cyan, but that seems light? |
| 978 \def\endlink{\Black\pdfendlink} | |
| 979 % Adding outlines to PDF; macros for calculating structure of outlines | |
| 980 % come from Petr Olsak | |
| 981 \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0% | |
| 982 \else \csname#1\endcsname \fi} | |
| 983 \def\advancenumber#1{\tempnum=\expnumber{#1}\relax | |
| 984 \advance\tempnum by1 | |
| 985 \expandafter\xdef\csname#1\endcsname{\the\tempnum}} | |
| 986 \def\pdfmakeoutlines{{% | |
| 987 \openin 1 \jobname.toc | |
| 47284 | 988 \ifeof 1\else\begingroup |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
47284
diff
changeset
|
989 \closein 1 |
| 37713 | 990 \indexnofonts |
| 991 \def\tt{} | |
| 992 \let\_ = \normalunderscore | |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
47284
diff
changeset
|
993 % Thanh's hack / proper braces in bookmarks |
| 37713 | 994 \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace |
| 995 \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace | |
| 996 % | |
| 997 \def\chapentry ##1##2##3{} | |
| 47284 | 998 \let\appendixentry = \chapentry |
| 37713 | 999 \def\unnumbchapentry ##1##2{} |
| 1000 \def\secentry ##1##2##3##4{\advancenumber{chap##2}} | |
| 47284 | 1001 \def\unnumbsecentry ##1##2##3{\advancenumber{chap##2}} |
| 37713 | 1002 \def\subsecentry ##1##2##3##4##5{\advancenumber{sec##2.##3}} |
| 47284 | 1003 \def\unnumbsubsecentry ##1##2##3##4{\advancenumber{sec##2.##3}} |
| 37713 | 1004 \def\subsubsecentry ##1##2##3##4##5##6{\advancenumber{subsec##2.##3.##4}} |
| 47284 | 1005 \def\unnumbsubsubsecentry ##1##2##3##4##5{\advancenumber{subsec##2.##3.##4}} |
| 37713 | 1006 \input \jobname.toc |
| 1007 \def\chapentry ##1##2##3{% | |
| 1008 \pdfoutline goto name{\pdfmkpgn{##3}}count-\expnumber{chap##2}{##1}} | |
| 47284 | 1009 \let\appendixentry = \chapentry |
| 37713 | 1010 \def\unnumbchapentry ##1##2{% |
| 1011 \pdfoutline goto name{\pdfmkpgn{##2}}{##1}} | |
| 1012 \def\secentry ##1##2##3##4{% | |
| 1013 \pdfoutline goto name{\pdfmkpgn{##4}}count-\expnumber{sec##2.##3}{##1}} | |
| 47284 | 1014 \def\unnumbsecentry ##1##2##3{% |
| 1015 \pdfoutline goto name{\pdfmkpgn{##3}}{##1}} | |
| 37713 | 1016 \def\subsecentry ##1##2##3##4##5{% |
| 1017 \pdfoutline goto name{\pdfmkpgn{##5}}count-\expnumber{subsec##2.##3.##4}{##1}} | |
| 47284 | 1018 \def\unnumbsubsecentry ##1##2##3##4{% |
| 1019 \pdfoutline goto name{\pdfmkpgn{##4}}{##1}} | |
| 37713 | 1020 \def\subsubsecentry ##1##2##3##4##5##6{% |
| 1021 \pdfoutline goto name{\pdfmkpgn{##6}}{##1}} | |
| 47284 | 1022 \def\unnumbsubsubsecentry ##1##2##3##4##5{% |
| 1023 \pdfoutline goto name{\pdfmkpgn{##5}}{##1}} | |
| 37713 | 1024 \input \jobname.toc |
| 47284 | 1025 \endgroup\fi |
| 37713 | 1026 }} |
| 1027 \def\makelinks #1,{% | |
| 1028 \def\params{#1}\def\E{END}% | |
| 1029 \ifx\params\E | |
| 1030 \let\nextmakelinks=\relax | |
| 1031 \else | |
| 1032 \let\nextmakelinks=\makelinks | |
| 1033 \ifnum\lnkcount>0,\fi | |
| 1034 \picknum{#1}% | |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
47284
diff
changeset
|
1035 \startlink attr{/Border [0 0 0]} |
| 37713 | 1036 goto name{\pdfmkpgn{\the\pgn}}% |
| 1037 \linkcolor #1% | |
| 1038 \advance\lnkcount by 1% | |
| 1039 \endlink | |
| 1040 \fi | |
| 1041 \nextmakelinks | |
| 1042 } | |
| 1043 \def\picknum#1{\expandafter\pn#1} | |
| 1044 \def\pn#1{% | |
| 1045 \def\p{#1}% | |
| 1046 \ifx\p\lbrace | |
| 1047 \let\nextpn=\ppn | |
| 1048 \else | |
| 1049 \let\nextpn=\ppnn | |
| 1050 \def\first{#1} | |
| 1051 \fi | |
| 1052 \nextpn | |
| 1053 } | |
| 1054 \def\ppn#1{\pgn=#1\gobble} | |
| 1055 \def\ppnn{\pgn=\first} | |
| 1056 \def\pdfmklnk#1{\lnkcount=0\makelinks #1,END,} | |
| 1057 \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks} | |
| 1058 \def\skipspaces#1{\def\PP{#1}\def\D{|}% | |
| 1059 \ifx\PP\D\let\nextsp\relax | |
| 1060 \else\let\nextsp\skipspaces | |
| 1061 \ifx\p\space\else\addtokens{\filename}{\PP}% | |
| 1062 \advance\filenamelength by 1 | |
| 1063 \fi | |
| 1064 \fi | |
| 1065 \nextsp} | |
| 1066 \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax} | |
| 1067 \ifnum\pdftexversion < 14 | |
| 1068 \let \startlink \pdfannotlink | |
| 1069 \else | |
| 1070 \let \startlink \pdfstartlink | |
| 1071 \fi | |
| 1072 \def\pdfurl#1{% | |
| 1073 \begingroup | |
| 1074 \normalturnoffactive\def\@{@}% | |
| 47284 | 1075 \let\value=\expandablevalue |
| 37713 | 1076 \leavevmode\Red |
| 1077 \startlink attr{/Border [0 0 0]}% | |
| 1078 user{/Subtype /Link /A << /S /URI /URI (#1) >>}% | |
| 1079 % #1 | |
| 1080 \endgroup} | |
| 1081 \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}} | |
| 1082 \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks} | |
| 1083 \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks} | |
| 1084 \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}} | |
| 1085 \def\maketoks{% | |
| 1086 \expandafter\poptoks\the\toksA|ENDTOKS| | |
| 1087 \ifx\first0\adn0 | |
| 1088 \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3 | |
| 1089 \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6 | |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
47284
diff
changeset
|
1090 \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 |
| 37713 | 1091 \else |
| 1092 \ifnum0=\countA\else\makelink\fi | |
| 1093 \ifx\first.\let\next=\done\else | |
| 1094 \let\next=\maketoks | |
| 1095 \addtokens{\toksB}{\the\toksD} | |
| 1096 \ifx\first,\addtokens{\toksB}{\space}\fi | |
| 1097 \fi | |
| 1098 \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi | |
| 1099 \next} | |
| 1100 \def\makelink{\addtokens{\toksB}% | |
| 1101 {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} | |
| 1102 \def\pdflink#1{% | |
| 47284 | 1103 \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}} |
| 37713 | 1104 \linkcolor #1\endlink} |
| 1105 \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} | |
| 1106 \fi % \ifx\pdfoutput | |
| 1107 | |
| 1108 | |
| 1109 \message{fonts,} | |
| 1110 % Font-change commands. | |
| 1111 | |
| 1112 % Texinfo sort of supports the sans serif font style, which plain TeX does not. | |
| 1113 % So we set up a \sf analogous to plain's \rm, etc. | |
| 1114 \newfam\sffam | |
| 1115 \def\sf{\fam=\sffam \tensf} | |
| 1116 \let\li = \sf % Sometimes we call it \li, not \sf. | |
| 1117 | |
| 1118 % We don't need math for this one. | |
| 1119 \def\ttsl{\tenttsl} | |
| 1120 | |
| 47284 | 1121 % Default leading. |
| 1122 \newdimen\textleading \textleading = 13.2pt | |
| 1123 | |
| 1124 % Set the baselineskip to #1, and the lineskip and strut size | |
| 1125 % correspondingly. There is no deep meaning behind these magic numbers | |
| 1126 % used as factors; they just match (closely enough) what Knuth defined. | |
| 1127 % | |
| 1128 \def\lineskipfactor{.08333} | |
| 1129 \def\strutheightpercent{.70833} | |
| 1130 \def\strutdepthpercent {.29167} | |
| 1131 % | |
| 1132 \def\setleading#1{% | |
| 1133 \normalbaselineskip = #1\relax | |
| 1134 \normallineskip = \lineskipfactor\normalbaselineskip | |
| 1135 \normalbaselines | |
| 1136 \setbox\strutbox =\hbox{% | |
| 1137 \vrule width0pt height\strutheightpercent\baselineskip | |
| 1138 depth \strutdepthpercent \baselineskip | |
| 1139 }% | |
| 1140 } | |
| 37713 | 1141 |
| 1142 % Set the font macro #1 to the font named #2, adding on the | |
| 1143 % specified font prefix (normally `cm'). | |
| 1144 % #3 is the font's design size, #4 is a scale factor | |
| 1145 \def\setfont#1#2#3#4{\font#1=\fontprefix#2#3 scaled #4} | |
| 1146 | |
| 1147 % Use cm as the default font prefix. | |
| 1148 % To specify the font prefix, you must define \fontprefix | |
| 1149 % before you read in texinfo.tex. | |
| 1150 \ifx\fontprefix\undefined | |
| 1151 \def\fontprefix{cm} | |
| 1152 \fi | |
| 1153 % Support font families that don't use the same naming scheme as CM. | |
| 1154 \def\rmshape{r} | |
| 1155 \def\rmbshape{bx} %where the normal face is bold | |
| 1156 \def\bfshape{b} | |
| 1157 \def\bxshape{bx} | |
| 1158 \def\ttshape{tt} | |
| 1159 \def\ttbshape{tt} | |
| 1160 \def\ttslshape{sltt} | |
| 1161 \def\itshape{ti} | |
| 1162 \def\itbshape{bxti} | |
| 1163 \def\slshape{sl} | |
| 1164 \def\slbshape{bxsl} | |
| 1165 \def\sfshape{ss} | |
| 1166 \def\sfbshape{ss} | |
| 1167 \def\scshape{csc} | |
| 1168 \def\scbshape{csc} | |
| 1169 | |
| 47284 | 1170 \newcount\mainmagstep |
| 37713 | 1171 \ifx\bigger\relax |
| 47284 | 1172 % not really supported. |
| 1173 \let\mainmagstep=\magstep1 | |
| 1174 \setfont\textrm\rmshape{12}{1000} | |
| 1175 \setfont\texttt\ttshape{12}{1000} | |
| 37713 | 1176 \else |
| 47284 | 1177 \mainmagstep=\magstephalf |
| 1178 \setfont\textrm\rmshape{10}{\mainmagstep} | |
| 1179 \setfont\texttt\ttshape{10}{\mainmagstep} | |
| 37713 | 1180 \fi |
| 1181 % Instead of cmb10, you many want to use cmbx10. | |
| 1182 % cmbx10 is a prettier font on its own, but cmb10 | |
| 1183 % looks better when embedded in a line with cmr10. | |
| 1184 \setfont\textbf\bfshape{10}{\mainmagstep} | |
| 1185 \setfont\textit\itshape{10}{\mainmagstep} | |
| 1186 \setfont\textsl\slshape{10}{\mainmagstep} | |
| 1187 \setfont\textsf\sfshape{10}{\mainmagstep} | |
| 1188 \setfont\textsc\scshape{10}{\mainmagstep} | |
| 1189 \setfont\textttsl\ttslshape{10}{\mainmagstep} | |
| 1190 \font\texti=cmmi10 scaled \mainmagstep | |
| 1191 \font\textsy=cmsy10 scaled \mainmagstep | |
| 1192 | |
| 1193 % A few fonts for @defun, etc. | |
| 1194 \setfont\defbf\bxshape{10}{\magstep1} %was 1314 | |
| 1195 \setfont\deftt\ttshape{10}{\magstep1} | |
| 1196 \def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf} | |
| 1197 | |
| 1198 % Fonts for indices, footnotes, small examples (9pt). | |
| 1199 \setfont\smallrm\rmshape{9}{1000} | |
| 1200 \setfont\smalltt\ttshape{9}{1000} | |
| 1201 \setfont\smallbf\bfshape{10}{900} | |
| 1202 \setfont\smallit\itshape{9}{1000} | |
| 1203 \setfont\smallsl\slshape{9}{1000} | |
| 1204 \setfont\smallsf\sfshape{9}{1000} | |
| 1205 \setfont\smallsc\scshape{10}{900} | |
| 1206 \setfont\smallttsl\ttslshape{10}{900} | |
| 1207 \font\smalli=cmmi9 | |
| 1208 \font\smallsy=cmsy9 | |
| 1209 | |
| 47284 | 1210 % Fonts for small examples (8pt). |
| 1211 \setfont\smallerrm\rmshape{8}{1000} | |
| 1212 \setfont\smallertt\ttshape{8}{1000} | |
| 1213 \setfont\smallerbf\bfshape{10}{800} | |
| 1214 \setfont\smallerit\itshape{8}{1000} | |
| 1215 \setfont\smallersl\slshape{8}{1000} | |
| 1216 \setfont\smallersf\sfshape{8}{1000} | |
| 1217 \setfont\smallersc\scshape{10}{800} | |
| 1218 \setfont\smallerttsl\ttslshape{10}{800} | |
| 1219 \font\smalleri=cmmi8 | |
| 1220 \font\smallersy=cmsy8 | |
| 1221 | |
| 37713 | 1222 % Fonts for title page: |
| 1223 \setfont\titlerm\rmbshape{12}{\magstep3} | |
| 1224 \setfont\titleit\itbshape{10}{\magstep4} | |
| 1225 \setfont\titlesl\slbshape{10}{\magstep4} | |
| 1226 \setfont\titlett\ttbshape{12}{\magstep3} | |
| 1227 \setfont\titlettsl\ttslshape{10}{\magstep4} | |
| 1228 \setfont\titlesf\sfbshape{17}{\magstep1} | |
| 1229 \let\titlebf=\titlerm | |
| 1230 \setfont\titlesc\scbshape{10}{\magstep4} | |
| 1231 \font\titlei=cmmi12 scaled \magstep3 | |
| 1232 \font\titlesy=cmsy10 scaled \magstep4 | |
| 1233 \def\authorrm{\secrm} | |
| 1234 | |
| 1235 % Chapter (and unnumbered) fonts (17.28pt). | |
| 1236 \setfont\chaprm\rmbshape{12}{\magstep2} | |
| 1237 \setfont\chapit\itbshape{10}{\magstep3} | |
| 1238 \setfont\chapsl\slbshape{10}{\magstep3} | |
| 1239 \setfont\chaptt\ttbshape{12}{\magstep2} | |
| 1240 \setfont\chapttsl\ttslshape{10}{\magstep3} | |
| 1241 \setfont\chapsf\sfbshape{17}{1000} | |
| 1242 \let\chapbf=\chaprm | |
| 1243 \setfont\chapsc\scbshape{10}{\magstep3} | |
| 1244 \font\chapi=cmmi12 scaled \magstep2 | |
| 1245 \font\chapsy=cmsy10 scaled \magstep3 | |
| 1246 | |
| 1247 % Section fonts (14.4pt). | |
| 1248 \setfont\secrm\rmbshape{12}{\magstep1} | |
| 1249 \setfont\secit\itbshape{10}{\magstep2} | |
| 1250 \setfont\secsl\slbshape{10}{\magstep2} | |
| 1251 \setfont\sectt\ttbshape{12}{\magstep1} | |
| 1252 \setfont\secttsl\ttslshape{10}{\magstep2} | |
| 1253 \setfont\secsf\sfbshape{12}{\magstep1} | |
| 1254 \let\secbf\secrm | |
| 1255 \setfont\secsc\scbshape{10}{\magstep2} | |
| 1256 \font\seci=cmmi12 scaled \magstep1 | |
| 1257 \font\secsy=cmsy10 scaled \magstep2 | |
| 1258 | |
| 1259 % Subsection fonts (13.15pt). | |
| 1260 \setfont\ssecrm\rmbshape{12}{\magstephalf} | |
| 1261 \setfont\ssecit\itbshape{10}{1315} | |
| 1262 \setfont\ssecsl\slbshape{10}{1315} | |
| 1263 \setfont\ssectt\ttbshape{12}{\magstephalf} | |
| 1264 \setfont\ssecttsl\ttslshape{10}{1315} | |
| 1265 \setfont\ssecsf\sfbshape{12}{\magstephalf} | |
| 1266 \let\ssecbf\ssecrm | |
| 1267 \setfont\ssecsc\scbshape{10}{\magstep1} | |
| 1268 \font\sseci=cmmi12 scaled \magstephalf | |
| 1269 \font\ssecsy=cmsy10 scaled 1315 | |
| 1270 % The smallcaps and symbol fonts should actually be scaled \magstep1.5, | |
| 1271 % but that is not a standard magnification. | |
| 1272 | |
| 1273 % In order for the font changes to affect most math symbols and letters, | |
| 1274 % we have to define the \textfont of the standard families. Since | |
| 47284 | 1275 % texinfo doesn't allow for producing subscripts and superscripts except |
| 1276 % in the main text, we don't bother to reset \scriptfont and | |
| 1277 % \scriptscriptfont (which would also require loading a lot more fonts). | |
| 37713 | 1278 % |
| 1279 \def\resetmathfonts{% | |
| 47284 | 1280 \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy |
| 1281 \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf | |
| 1282 \textfont\ttfam=\tentt \textfont\sffam=\tensf | |
| 1283 } | |
| 37713 | 1284 |
| 1285 % The font-changing commands redefine the meanings of \tenSTYLE, instead | |
| 1286 % of just \STYLE. We do this so that font changes will continue to work | |
| 1287 % in math mode, where it is the current \fam that is relevant in most | |
| 1288 % cases, not the current font. Plain TeX does \def\bf{\fam=\bffam | |
| 1289 % \tenbf}, for example. By redefining \tenbf, we obviate the need to | |
| 1290 % redefine \bf itself. | |
| 1291 \def\textfonts{% | |
| 1292 \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl | |
| 1293 \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc | |
| 1294 \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy \let\tenttsl=\textttsl | |
| 47284 | 1295 \resetmathfonts \setleading{\textleading}} |
| 37713 | 1296 \def\titlefonts{% |
| 1297 \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl | |
| 1298 \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc | |
| 1299 \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy | |
| 1300 \let\tenttsl=\titlettsl | |
| 1301 \resetmathfonts \setleading{25pt}} | |
| 1302 \def\titlefont#1{{\titlefonts\rm #1}} | |
| 1303 \def\chapfonts{% | |
| 1304 \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl | |
| 1305 \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc | |
| 1306 \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl | |
| 1307 \resetmathfonts \setleading{19pt}} | |
| 1308 \def\secfonts{% | |
| 1309 \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl | |
| 1310 \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc | |
| 1311 \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy \let\tenttsl=\secttsl | |
| 1312 \resetmathfonts \setleading{16pt}} | |
| 1313 \def\subsecfonts{% | |
| 1314 \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl | |
| 1315 \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc | |
| 1316 \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl | |
| 1317 \resetmathfonts \setleading{15pt}} | |
| 1318 \let\subsubsecfonts = \subsecfonts % Maybe make sssec fonts scaled magstephalf? | |
| 1319 \def\smallfonts{% | |
| 1320 \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl | |
| 1321 \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc | |
| 1322 \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy | |
| 1323 \let\tenttsl=\smallttsl | |
| 47284 | 1324 \resetmathfonts \setleading{10.5pt}} |
| 1325 \def\smallerfonts{% | |
| 1326 \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl | |
| 1327 \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc | |
| 1328 \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy | |
| 1329 \let\tenttsl=\smallerttsl | |
| 1330 \resetmathfonts \setleading{9.5pt}} | |
| 1331 \let\smallexamplefonts = \smallerfonts | |
| 37713 | 1332 |
| 1333 % Set up the default fonts, so we can use them for creating boxes. | |
| 1334 % | |
| 1335 \textfonts | |
| 1336 | |
| 1337 % Define these so they can be easily changed for other fonts. | |
| 1338 \def\angleleft{$\langle$} | |
| 1339 \def\angleright{$\rangle$} | |
| 1340 | |
| 1341 % Count depth in font-changes, for error checks | |
| 1342 \newcount\fontdepth \fontdepth=0 | |
| 1343 | |
| 1344 % Fonts for short table of contents. | |
| 1345 \setfont\shortcontrm\rmshape{12}{1000} | |
| 1346 \setfont\shortcontbf\bxshape{12}{1000} | |
| 1347 \setfont\shortcontsl\slshape{12}{1000} | |
| 1348 | |
| 1349 %% Add scribe-like font environments, plus @l for inline lisp (usually sans | |
| 1350 %% serif) and @ii for TeX italic | |
| 1351 | |
| 1352 % \smartitalic{ARG} outputs arg in italics, followed by an italic correction | |
| 1353 % unless the following character is such as not to need one. | |
| 1354 \def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else\/\fi\fi\fi} | |
| 1355 \def\smartslanted#1{{\sl #1}\futurelet\next\smartitalicx} | |
| 1356 \def\smartitalic#1{{\it #1}\futurelet\next\smartitalicx} | |
| 1357 | |
| 1358 \let\i=\smartitalic | |
| 1359 \let\var=\smartslanted | |
| 1360 \let\dfn=\smartslanted | |
| 1361 \let\emph=\smartitalic | |
| 1362 \let\cite=\smartslanted | |
| 1363 | |
| 1364 \def\b#1{{\bf #1}} | |
| 1365 \let\strong=\b | |
| 1366 | |
| 1367 % We can't just use \exhyphenpenalty, because that only has effect at | |
| 1368 % the end of a paragraph. Restore normal hyphenation at the end of the | |
| 1369 % group within which \nohyphenation is presumably called. | |
| 1370 % | |
| 1371 \def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation} | |
| 1372 \def\restorehyphenation{\hyphenchar\font = `- } | |
| 1373 | |
| 1374 \def\t#1{% | |
| 1375 {\tt \rawbackslash \frenchspacing #1}% | |
| 1376 \null | |
| 1377 } | |
| 1378 \let\ttfont=\t | |
| 1379 \def\samp#1{`\tclose{#1}'\null} | |
| 1380 \setfont\keyrm\rmshape{8}{1000} | |
| 1381 \font\keysy=cmsy9 | |
| 1382 \def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{% | |
| 1383 \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% | |
| 1384 \vbox{\hrule\kern-0.4pt | |
| 1385 \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% | |
| 1386 \kern-0.4pt\hrule}% | |
| 1387 \kern-.06em\raise0.4pt\hbox{\angleright}}}} | |
| 1388 % The old definition, with no lozenge: | |
| 1389 %\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null} | |
| 1390 \def\ctrl #1{{\tt \rawbackslash \hat}#1} | |
| 1391 | |
| 1392 % @file, @option are the same as @samp. | |
| 1393 \let\file=\samp | |
| 1394 \let\option=\samp | |
| 1395 | |
| 1396 % @code is a modification of @t, | |
| 1397 % which makes spaces the same size as normal in the surrounding text. | |
| 1398 \def\tclose#1{% | |
| 1399 {% | |
| 1400 % Change normal interword space to be same as for the current font. | |
| 1401 \spaceskip = \fontdimen2\font | |
| 1402 % | |
| 1403 % Switch to typewriter. | |
| 1404 \tt | |
| 1405 % | |
| 1406 % But `\ ' produces the large typewriter interword space. | |
| 1407 \def\ {{\spaceskip = 0pt{} }}% | |
| 1408 % | |
| 1409 % Turn off hyphenation. | |
| 1410 \nohyphenation | |
| 1411 % | |
| 1412 \rawbackslash | |
| 1413 \frenchspacing | |
| 1414 #1% | |
| 1415 }% | |
| 1416 \null | |
| 1417 } | |
| 1418 | |
| 1419 % We *must* turn on hyphenation at `-' and `_' in \code. | |
| 1420 % Otherwise, it is too hard to avoid overfull hboxes | |
| 1421 % in the Emacs manual, the Library manual, etc. | |
| 1422 | |
| 1423 % Unfortunately, TeX uses one parameter (\hyphenchar) to control | |
| 1424 % both hyphenation at - and hyphenation within words. | |
| 1425 % We must therefore turn them both off (\tclose does that) | |
| 1426 % and arrange explicitly to hyphenate at a dash. | |
| 1427 % -- rms. | |
| 1428 { | |
| 1429 \catcode`\-=\active | |
| 1430 \catcode`\_=\active | |
| 1431 % | |
| 1432 \global\def\code{\begingroup | |
| 1433 \catcode`\-=\active \let-\codedash | |
| 1434 \catcode`\_=\active \let_\codeunder | |
| 1435 \codex | |
| 1436 } | |
| 1437 % | |
| 1438 % If we end up with any active - characters when handling the index, | |
| 1439 % just treat them as a normal -. | |
| 1440 \global\def\indexbreaks{\catcode`\-=\active \let-\realdash} | |
| 1441 } | |
| 1442 | |
| 1443 \def\realdash{-} | |
| 1444 \def\codedash{-\discretionary{}{}{}} | |
| 47284 | 1445 \def\codeunder{% |
| 1446 % this is all so @math{@code{var_name}+1} can work. In math mode, _ | |
| 1447 % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.) | |
| 1448 % will therefore expand the active definition of _, which is us | |
| 1449 % (inside @code that is), therefore an endless loop. | |
| 1450 \ifusingtt{\ifmmode | |
| 1451 \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_. | |
| 1452 \else\normalunderscore \fi | |
| 1453 \discretionary{}{}{}}% | |
| 1454 {\_}% | |
| 1455 } | |
| 37713 | 1456 \def\codex #1{\tclose{#1}\endgroup} |
| 1457 | |
| 1458 % @kbd is like @code, except that if the argument is just one @key command, | |
| 1459 % then @kbd has no effect. | |
| 1460 | |
| 1461 % @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always), | |
| 1462 % `example' (@kbd uses ttsl only inside of @example and friends), | |
| 1463 % or `code' (@kbd uses normal tty font always). | |
| 1464 \def\kbdinputstyle{\parsearg\kbdinputstylexxx} | |
| 1465 \def\kbdinputstylexxx#1{% | |
| 1466 \def\arg{#1}% | |
| 1467 \ifx\arg\worddistinct | |
| 1468 \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}% | |
| 1469 \else\ifx\arg\wordexample | |
| 1470 \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}% | |
| 1471 \else\ifx\arg\wordcode | |
| 1472 \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}% | |
| 1473 \fi\fi\fi | |
| 1474 } | |
| 1475 \def\worddistinct{distinct} | |
| 1476 \def\wordexample{example} | |
| 1477 \def\wordcode{code} | |
| 1478 | |
| 1479 % Default is kbdinputdistinct. (Too much of a hassle to call the macro, | |
| 1480 % the catcodes are wrong for parsearg to work.) | |
| 1481 \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl} | |
| 1482 | |
| 1483 \def\xkey{\key} | |
| 1484 \def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}% | |
| 1485 \ifx\one\xkey\ifx\threex\three \key{#2}% | |
| 1486 \else{\tclose{\kbdfont\look}}\fi | |
| 1487 \else{\tclose{\kbdfont\look}}\fi} | |
| 1488 | |
| 1489 % For @url, @env, @command quotes seem unnecessary, so use \code. | |
| 1490 \let\url=\code | |
| 1491 \let\env=\code | |
| 1492 \let\command=\code | |
| 1493 | |
| 1494 % @uref (abbreviation for `urlref') takes an optional (comma-separated) | |
| 1495 % second argument specifying the text to display and an optional third | |
| 1496 % arg as text to display instead of (rather than in addition to) the url | |
| 1497 % itself. First (mandatory) arg is the url. Perhaps eventually put in | |
| 1498 % a hypertex \special here. | |
| 1499 % | |
| 1500 \def\uref#1{\douref #1,,,\finish} | |
| 1501 \def\douref#1,#2,#3,#4\finish{\begingroup | |
| 1502 \unsepspaces | |
| 1503 \pdfurl{#1}% | |
| 1504 \setbox0 = \hbox{\ignorespaces #3}% | |
| 1505 \ifdim\wd0 > 0pt | |
| 1506 \unhbox0 % third arg given, show only that | |
| 1507 \else | |
| 1508 \setbox0 = \hbox{\ignorespaces #2}% | |
| 1509 \ifdim\wd0 > 0pt | |
| 1510 \ifpdf | |
| 1511 \unhbox0 % PDF: 2nd arg given, show only it | |
| 1512 \else | |
| 1513 \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url | |
| 1514 \fi | |
| 1515 \else | |
| 1516 \code{#1}% only url given, so show it | |
| 1517 \fi | |
| 1518 \fi | |
| 1519 \endlink | |
| 1520 \endgroup} | |
| 1521 | |
| 1522 % rms does not like angle brackets --karl, 17may97. | |
| 1523 % So now @email is just like @uref, unless we are pdf. | |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
47284
diff
changeset
|
1524 % |
| 37713 | 1525 %\def\email#1{\angleleft{\tt #1}\angleright} |
| 1526 \ifpdf | |
| 1527 \def\email#1{\doemail#1,,\finish} | |
| 1528 \def\doemail#1,#2,#3\finish{\begingroup | |
| 1529 \unsepspaces | |
| 1530 \pdfurl{mailto:#1}% | |
| 1531 \setbox0 = \hbox{\ignorespaces #2}% | |
| 1532 \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi | |
| 1533 \endlink | |
| 1534 \endgroup} | |
| 1535 \else | |
| 1536 \let\email=\uref | |
| 1537 \fi | |
| 1538 | |
| 1539 % Check if we are currently using a typewriter font. Since all the | |
| 1540 % Computer Modern typewriter fonts have zero interword stretch (and | |
| 1541 % shrink), and it is reasonable to expect all typewriter fonts to have | |
| 1542 % this property, we can check that font parameter. | |
| 1543 % | |
| 1544 \def\ifmonospace{\ifdim\fontdimen3\font=0pt } | |
| 1545 | |
| 1546 % Typeset a dimension, e.g., `in' or `pt'. The only reason for the | |
| 1547 % argument is to make the input look right: @dmn{pt} instead of @dmn{}pt. | |
| 1548 % | |
| 1549 \def\dmn#1{\thinspace #1} | |
| 1550 | |
| 1551 \def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par} | |
| 1552 | |
| 1553 % @l was never documented to mean ``switch to the Lisp font'', | |
| 1554 % and it is not used as such in any manual I can find. We need it for | |
| 1555 % Polish suppressed-l. --karl, 22sep96. | |
| 1556 %\def\l#1{{\li #1}\null} | |
| 1557 | |
| 1558 % Explicit font changes: @r, @sc, undocumented @ii. | |
| 1559 \def\r#1{{\rm #1}} % roman font | |
| 1560 \def\sc#1{{\smallcaps#1}} % smallcaps font | |
| 1561 \def\ii#1{{\it #1}} % italic font | |
| 1562 | |
| 1563 % @acronym downcases the argument and prints in smallcaps. | |
| 1564 \def\acronym#1{{\smallcaps \lowercase{#1}}} | |
| 1565 | |
| 1566 % @pounds{} is a sterling sign. | |
| 1567 \def\pounds{{\it\$}} | |
| 1568 | |
| 1569 | |
| 1570 \message{page headings,} | |
| 1571 | |
| 1572 \newskip\titlepagetopglue \titlepagetopglue = 1.5in | |
| 1573 \newskip\titlepagebottomglue \titlepagebottomglue = 2pc | |
| 1574 | |
| 1575 % First the title page. Must do @settitle before @titlepage. | |
| 1576 \newif\ifseenauthor | |
| 1577 \newif\iffinishedtitlepage | |
| 1578 | |
| 1579 % Do an implicit @contents or @shortcontents after @end titlepage if the | |
| 1580 % user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage. | |
| 1581 % | |
| 1582 \newif\ifsetcontentsaftertitlepage | |
| 1583 \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue | |
| 1584 \newif\ifsetshortcontentsaftertitlepage | |
| 1585 \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue | |
| 1586 | |
| 1587 \def\shorttitlepage{\parsearg\shorttitlepagezzz} | |
| 1588 \def\shorttitlepagezzz #1{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}% | |
| 1589 \endgroup\page\hbox{}\page} | |
| 1590 | |
| 1591 \def\titlepage{\begingroup \parindent=0pt \textfonts | |
| 1592 \let\subtitlerm=\tenrm | |
| 1593 \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}% | |
| 1594 % | |
| 1595 \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines}% | |
| 1596 % | |
| 1597 % Leave some space at the very top of the page. | |
| 1598 \vglue\titlepagetopglue | |
| 1599 % | |
| 1600 % Now you can print the title using @title. | |
| 1601 \def\title{\parsearg\titlezzz}% | |
| 1602 \def\titlezzz##1{\leftline{\titlefonts\rm ##1} | |
| 1603 % print a rule at the page bottom also. | |
| 1604 \finishedtitlepagefalse | |
| 1605 \vskip4pt \hrule height 4pt width \hsize \vskip4pt}% | |
| 1606 % No rule at page bottom unless we print one at the top with @title. | |
| 1607 \finishedtitlepagetrue | |
| 1608 % | |
| 1609 % Now you can put text using @subtitle. | |
| 1610 \def\subtitle{\parsearg\subtitlezzz}% | |
| 1611 \def\subtitlezzz##1{{\subtitlefont \rightline{##1}}}% | |
| 1612 % | |
| 1613 % @author should come last, but may come many times. | |
| 1614 \def\author{\parsearg\authorzzz}% | |
| 1615 \def\authorzzz##1{\ifseenauthor\else\vskip 0pt plus 1filll\seenauthortrue\fi | |
| 1616 {\authorfont \leftline{##1}}}% | |
| 1617 % | |
| 1618 % Most title ``pages'' are actually two pages long, with space | |
| 1619 % at the top of the second. We don't want the ragged left on the second. | |
| 1620 \let\oldpage = \page | |
| 1621 \def\page{% | |
| 1622 \iffinishedtitlepage\else | |
| 1623 \finishtitlepage | |
| 1624 \fi | |
| 1625 \oldpage | |
| 1626 \let\page = \oldpage | |
| 1627 \hbox{}}% | |
| 1628 % \def\page{\oldpage \hbox{}} | |
| 1629 } | |
| 1630 | |
| 1631 \def\Etitlepage{% | |
| 1632 \iffinishedtitlepage\else | |
| 1633 \finishtitlepage | |
| 1634 \fi | |
| 1635 % It is important to do the page break before ending the group, | |
| 1636 % because the headline and footline are only empty inside the group. | |
| 1637 % If we use the new definition of \page, we always get a blank page | |
| 1638 % after the title page, which we certainly don't want. | |
| 1639 \oldpage | |
| 1640 \endgroup | |
| 1641 % | |
| 47284 | 1642 % Need this before the \...aftertitlepage checks so that if they are |
| 1643 % in effect the toc pages will come out with page numbers. | |
| 1644 \HEADINGSon | |
| 1645 % | |
| 37713 | 1646 % If they want short, they certainly want long too. |
| 1647 \ifsetshortcontentsaftertitlepage | |
| 1648 \shortcontents | |
| 1649 \contents | |
| 1650 \global\let\shortcontents = \relax | |
| 1651 \global\let\contents = \relax | |
| 1652 \fi | |
| 1653 % | |
| 1654 \ifsetcontentsaftertitlepage | |
| 1655 \contents | |
| 1656 \global\let\contents = \relax | |
| 1657 \global\let\shortcontents = \relax | |
| 1658 \fi | |
| 1659 } | |
| 1660 | |
| 1661 \def\finishtitlepage{% | |
| 1662 \vskip4pt \hrule height 2pt width \hsize | |
| 1663 \vskip\titlepagebottomglue | |
| 1664 \finishedtitlepagetrue | |
| 1665 } | |
| 1666 | |
| 1667 %%% Set up page headings and footings. | |
| 1668 | |
| 1669 \let\thispage=\folio | |
| 1670 | |
| 1671 \newtoks\evenheadline % headline on even pages | |
| 1672 \newtoks\oddheadline % headline on odd pages | |
| 1673 \newtoks\evenfootline % footline on even pages | |
| 1674 \newtoks\oddfootline % footline on odd pages | |
| 1675 | |
| 1676 % Now make Tex use those variables | |
| 1677 \headline={{\textfonts\rm \ifodd\pageno \the\oddheadline | |
| 1678 \else \the\evenheadline \fi}} | |
| 1679 \footline={{\textfonts\rm \ifodd\pageno \the\oddfootline | |
| 1680 \else \the\evenfootline \fi}\HEADINGShook} | |
| 1681 \let\HEADINGShook=\relax | |
| 1682 | |
| 1683 % Commands to set those variables. | |
| 1684 % For example, this is what @headings on does | |
| 1685 % @evenheading @thistitle|@thispage|@thischapter | |
| 1686 % @oddheading @thischapter|@thispage|@thistitle | |
| 1687 % @evenfooting @thisfile|| | |
| 1688 % @oddfooting ||@thisfile | |
| 1689 | |
| 1690 \def\evenheading{\parsearg\evenheadingxxx} | |
| 1691 \def\oddheading{\parsearg\oddheadingxxx} | |
| 1692 \def\everyheading{\parsearg\everyheadingxxx} | |
| 1693 | |
| 1694 \def\evenfooting{\parsearg\evenfootingxxx} | |
| 1695 \def\oddfooting{\parsearg\oddfootingxxx} | |
| 1696 \def\everyfooting{\parsearg\everyfootingxxx} | |
| 1697 | |
| 1698 {\catcode`\@=0 % | |
| 1699 | |
| 1700 \gdef\evenheadingxxx #1{\evenheadingyyy #1@|@|@|@|\finish} | |
| 1701 \gdef\evenheadingyyy #1@|#2@|#3@|#4\finish{% | |
| 1702 \global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} | |
| 1703 | |
| 1704 \gdef\oddheadingxxx #1{\oddheadingyyy #1@|@|@|@|\finish} | |
| 1705 \gdef\oddheadingyyy #1@|#2@|#3@|#4\finish{% | |
| 1706 \global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} | |
| 1707 | |
| 1708 \gdef\everyheadingxxx#1{\oddheadingxxx{#1}\evenheadingxxx{#1}}% | |
| 1709 | |
| 1710 \gdef\evenfootingxxx #1{\evenfootingyyy #1@|@|@|@|\finish} | |
| 1711 \gdef\evenfootingyyy #1@|#2@|#3@|#4\finish{% | |
| 1712 \global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} | |
| 1713 | |
| 1714 \gdef\oddfootingxxx #1{\oddfootingyyy #1@|@|@|@|\finish} | |
| 1715 \gdef\oddfootingyyy #1@|#2@|#3@|#4\finish{% | |
| 1716 \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}% | |
| 1717 % | |
| 1718 % Leave some space for the footline. Hopefully ok to assume | |
| 1719 % @evenfooting will not be used by itself. | |
| 1720 \global\advance\pageheight by -\baselineskip | |
| 1721 \global\advance\vsize by -\baselineskip | |
| 1722 } | |
| 1723 | |
| 1724 \gdef\everyfootingxxx#1{\oddfootingxxx{#1}\evenfootingxxx{#1}} | |
| 1725 % | |
| 1726 }% unbind the catcode of @. | |
| 1727 | |
| 1728 % @headings double turns headings on for double-sided printing. | |
| 1729 % @headings single turns headings on for single-sided printing. | |
| 1730 % @headings off turns them off. | |
| 1731 % @headings on same as @headings double, retained for compatibility. | |
| 1732 % @headings after turns on double-sided headings after this page. | |
| 1733 % @headings doubleafter turns on double-sided headings after this page. | |
| 1734 % @headings singleafter turns on single-sided headings after this page. | |
| 1735 % By default, they are off at the start of a document, | |
| 1736 % and turned `on' after @end titlepage. | |
| 1737 | |
| 1738 \def\headings #1 {\csname HEADINGS#1\endcsname} | |
| 1739 | |
| 1740 \def\HEADINGSoff{ | |
| 1741 \global\evenheadline={\hfil} \global\evenfootline={\hfil} | |
| 1742 \global\oddheadline={\hfil} \global\oddfootline={\hfil}} | |
| 1743 \HEADINGSoff | |
| 1744 % When we turn headings on, set the page number to 1. | |
| 1745 % For double-sided printing, put current file name in lower left corner, | |
| 1746 % chapter name on inside top of right hand pages, document | |
| 1747 % title on inside top of left hand pages, and page numbers on outside top | |
| 1748 % edge of all pages. | |
| 1749 \def\HEADINGSdouble{ | |
| 1750 \global\pageno=1 | |
| 1751 \global\evenfootline={\hfil} | |
| 1752 \global\oddfootline={\hfil} | |
| 1753 \global\evenheadline={\line{\folio\hfil\thistitle}} | |
| 1754 \global\oddheadline={\line{\thischapter\hfil\folio}} | |
| 1755 \global\let\contentsalignmacro = \chapoddpage | |
| 1756 } | |
| 1757 \let\contentsalignmacro = \chappager | |
| 1758 | |
| 1759 % For single-sided printing, chapter title goes across top left of page, | |
| 1760 % page number on top right. | |
| 1761 \def\HEADINGSsingle{ | |
| 1762 \global\pageno=1 | |
| 1763 \global\evenfootline={\hfil} | |
| 1764 \global\oddfootline={\hfil} | |
| 1765 \global\evenheadline={\line{\thischapter\hfil\folio}} | |
| 1766 \global\oddheadline={\line{\thischapter\hfil\folio}} | |
| 1767 \global\let\contentsalignmacro = \chappager | |
| 1768 } | |
| 1769 \def\HEADINGSon{\HEADINGSdouble} | |
| 1770 | |
| 1771 \def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex} | |
| 1772 \let\HEADINGSdoubleafter=\HEADINGSafter | |
| 1773 \def\HEADINGSdoublex{% | |
| 1774 \global\evenfootline={\hfil} | |
| 1775 \global\oddfootline={\hfil} | |
| 1776 \global\evenheadline={\line{\folio\hfil\thistitle}} | |
| 1777 \global\oddheadline={\line{\thischapter\hfil\folio}} | |
| 1778 \global\let\contentsalignmacro = \chapoddpage | |
| 1779 } | |
| 1780 | |
| 1781 \def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} | |
| 1782 \def\HEADINGSsinglex{% | |
| 1783 \global\evenfootline={\hfil} | |
| 1784 \global\oddfootline={\hfil} | |
| 1785 \global\evenheadline={\line{\thischapter\hfil\folio}} | |
| 1786 \global\oddheadline={\line{\thischapter\hfil\folio}} | |
| 1787 \global\let\contentsalignmacro = \chappager | |
| 1788 } | |
| 1789 | |
| 1790 % Subroutines used in generating headings | |
| 1791 % This produces Day Month Year style of output. | |
| 1792 % Only define if not already defined, in case a txi-??.tex file has set | |
| 1793 % up a different format (e.g., txi-cs.tex does this). | |
| 1794 \ifx\today\undefined | |
| 1795 \def\today{% | |
| 1796 \number\day\space | |
| 1797 \ifcase\month | |
| 1798 \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr | |
| 1799 \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug | |
| 1800 \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec | |
| 1801 \fi | |
| 1802 \space\number\year} | |
| 1803 \fi | |
| 1804 | |
| 1805 % @settitle line... specifies the title of the document, for headings. | |
| 1806 % It generates no output of its own. | |
| 1807 \def\thistitle{\putwordNoTitle} | |
| 1808 \def\settitle{\parsearg\settitlezzz} | |
| 1809 \def\settitlezzz #1{\gdef\thistitle{#1}} | |
| 1810 | |
| 1811 | |
| 1812 \message{tables,} | |
| 1813 % Tables -- @table, @ftable, @vtable, @item(x), @kitem(x), @xitem(x). | |
| 1814 | |
| 1815 % default indentation of table text | |
| 1816 \newdimen\tableindent \tableindent=.8in | |
| 1817 % default indentation of @itemize and @enumerate text | |
| 1818 \newdimen\itemindent \itemindent=.3in | |
| 1819 % margin between end of table item and start of table text. | |
| 1820 \newdimen\itemmargin \itemmargin=.1in | |
| 1821 | |
| 1822 % used internally for \itemindent minus \itemmargin | |
| 1823 \newdimen\itemmax | |
| 1824 | |
| 1825 % Note @table, @vtable, and @vtable define @item, @itemx, etc., with | |
| 1826 % these defs. | |
| 1827 % They also define \itemindex | |
| 1828 % to index the item name in whatever manner is desired (perhaps none). | |
| 1829 | |
| 1830 \newif\ifitemxneedsnegativevskip | |
| 1831 | |
| 1832 \def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi} | |
| 1833 | |
| 1834 \def\internalBitem{\smallbreak \parsearg\itemzzz} | |
| 1835 \def\internalBitemx{\itemxpar \parsearg\itemzzz} | |
| 1836 | |
| 1837 \def\internalBxitem "#1"{\def\xitemsubtopix{#1} \smallbreak \parsearg\xitemzzz} | |
| 1838 \def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \itemxpar \parsearg\xitemzzz} | |
| 1839 | |
| 1840 \def\internalBkitem{\smallbreak \parsearg\kitemzzz} | |
| 1841 \def\internalBkitemx{\itemxpar \parsearg\kitemzzz} | |
| 1842 | |
| 1843 \def\kitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \lastfunction}}% | |
| 1844 \itemzzz {#1}} | |
| 1845 | |
| 1846 \def\xitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \xitemsubtopic}}% | |
| 1847 \itemzzz {#1}} | |
| 1848 | |
| 1849 \def\itemzzz #1{\begingroup % | |
| 1850 \advance\hsize by -\rightskip | |
| 1851 \advance\hsize by -\tableindent | |
| 1852 \setbox0=\hbox{\itemfont{#1}}% | |
| 1853 \itemindex{#1}% | |
| 1854 \nobreak % This prevents a break before @itemx. | |
| 1855 % | |
| 1856 % If the item text does not fit in the space we have, put it on a line | |
| 1857 % by itself, and do not allow a page break either before or after that | |
| 1858 % line. We do not start a paragraph here because then if the next | |
| 1859 % command is, e.g., @kindex, the whatsit would get put into the | |
| 1860 % horizontal list on a line by itself, resulting in extra blank space. | |
| 1861 \ifdim \wd0>\itemmax | |
| 1862 % | |
| 1863 % Make this a paragraph so we get the \parskip glue and wrapping, | |
| 1864 % but leave it ragged-right. | |
| 1865 \begingroup | |
| 1866 \advance\leftskip by-\tableindent | |
| 1867 \advance\hsize by\tableindent | |
| 1868 \advance\rightskip by0pt plus1fil | |
| 1869 \leavevmode\unhbox0\par | |
| 1870 \endgroup | |
| 1871 % | |
| 1872 % We're going to be starting a paragraph, but we don't want the | |
| 1873 % \parskip glue -- logically it's part of the @item we just started. | |
| 1874 \nobreak \vskip-\parskip | |
| 1875 % | |
| 1876 % Stop a page break at the \parskip glue coming up. Unfortunately | |
| 1877 % we can't prevent a possible page break at the following | |
| 1878 % \baselineskip glue. | |
| 1879 \nobreak | |
| 1880 \endgroup | |
| 1881 \itemxneedsnegativevskipfalse | |
| 1882 \else | |
| 1883 % The item text fits into the space. Start a paragraph, so that the | |
| 1884 % following text (if any) will end up on the same line. | |
| 1885 \noindent | |
| 1886 % Do this with kerns and \unhbox so that if there is a footnote in | |
| 1887 % the item text, it can migrate to the main vertical list and | |
| 1888 % eventually be printed. | |
| 1889 \nobreak\kern-\tableindent | |
| 1890 \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0 | |
| 1891 \unhbox0 | |
| 1892 \nobreak\kern\dimen0 | |
| 1893 \endgroup | |
| 1894 \itemxneedsnegativevskiptrue | |
| 1895 \fi | |
| 1896 } | |
| 1897 | |
| 1898 \def\item{\errmessage{@item while not in a table}} | |
| 1899 \def\itemx{\errmessage{@itemx while not in a table}} | |
| 1900 \def\kitem{\errmessage{@kitem while not in a table}} | |
| 1901 \def\kitemx{\errmessage{@kitemx while not in a table}} | |
| 1902 \def\xitem{\errmessage{@xitem while not in a table}} | |
| 1903 \def\xitemx{\errmessage{@xitemx while not in a table}} | |
| 1904 | |
| 1905 % Contains a kludge to get @end[description] to work. | |
| 1906 \def\description{\tablez{\dontindex}{1}{}{}{}{}} | |
| 1907 | |
| 1908 % @table, @ftable, @vtable. | |
| 1909 \def\table{\begingroup\inENV\obeylines\obeyspaces\tablex} | |
| 1910 {\obeylines\obeyspaces% | |
| 1911 \gdef\tablex #1^^M{% | |
| 1912 \tabley\dontindex#1 \endtabley}} | |
| 1913 | |
| 1914 \def\ftable{\begingroup\inENV\obeylines\obeyspaces\ftablex} | |
| 1915 {\obeylines\obeyspaces% | |
| 1916 \gdef\ftablex #1^^M{% | |
| 1917 \tabley\fnitemindex#1 \endtabley | |
| 1918 \def\Eftable{\endgraf\afterenvbreak\endgroup}% | |
| 1919 \let\Etable=\relax}} | |
| 1920 | |
| 1921 \def\vtable{\begingroup\inENV\obeylines\obeyspaces\vtablex} | |
| 1922 {\obeylines\obeyspaces% | |
| 1923 \gdef\vtablex #1^^M{% | |
| 1924 \tabley\vritemindex#1 \endtabley | |
| 1925 \def\Evtable{\endgraf\afterenvbreak\endgroup}% | |
| 1926 \let\Etable=\relax}} | |
| 1927 | |
| 1928 \def\dontindex #1{} | |
| 1929 \def\fnitemindex #1{\doind {fn}{\code{#1}}}% | |
| 1930 \def\vritemindex #1{\doind {vr}{\code{#1}}}% | |
| 1931 | |
| 1932 {\obeyspaces % | |
| 1933 \gdef\tabley#1#2 #3 #4 #5 #6 #7\endtabley{\endgroup% | |
| 1934 \tablez{#1}{#2}{#3}{#4}{#5}{#6}}} | |
| 1935 | |
| 1936 \def\tablez #1#2#3#4#5#6{% | |
| 1937 \aboveenvbreak % | |
| 1938 \begingroup % | |
| 1939 \def\Edescription{\Etable}% Necessary kludge. | |
| 1940 \let\itemindex=#1% | |
| 1941 \ifnum 0#3>0 \advance \leftskip by #3\mil \fi % | |
| 1942 \ifnum 0#4>0 \tableindent=#4\mil \fi % | |
| 1943 \ifnum 0#5>0 \advance \rightskip by #5\mil \fi % | |
| 1944 \def\itemfont{#2}% | |
| 1945 \itemmax=\tableindent % | |
| 1946 \advance \itemmax by -\itemmargin % | |
| 1947 \advance \leftskip by \tableindent % | |
| 1948 \exdentamount=\tableindent | |
| 1949 \parindent = 0pt | |
| 1950 \parskip = \smallskipamount | |
| 1951 \ifdim \parskip=0pt \parskip=2pt \fi% | |
| 1952 \def\Etable{\endgraf\afterenvbreak\endgroup}% | |
| 1953 \let\item = \internalBitem % | |
| 1954 \let\itemx = \internalBitemx % | |
| 1955 \let\kitem = \internalBkitem % | |
| 1956 \let\kitemx = \internalBkitemx % | |
| 1957 \let\xitem = \internalBxitem % | |
| 1958 \let\xitemx = \internalBxitemx % | |
| 1959 } | |
| 1960 | |
| 1961 % This is the counter used by @enumerate, which is really @itemize | |
| 1962 | |
| 1963 \newcount \itemno | |
| 1964 | |
| 1965 \def\itemize{\parsearg\itemizezzz} | |
| 1966 | |
| 1967 \def\itemizezzz #1{% | |
| 1968 \begingroup % ended by the @end itemize | |
| 1969 \itemizey {#1}{\Eitemize} | |
| 1970 } | |
| 1971 | |
| 1972 \def\itemizey #1#2{% | |
| 1973 \aboveenvbreak % | |
| 1974 \itemmax=\itemindent % | |
| 1975 \advance \itemmax by -\itemmargin % | |
| 1976 \advance \leftskip by \itemindent % | |
| 1977 \exdentamount=\itemindent | |
| 1978 \parindent = 0pt % | |
| 1979 \parskip = \smallskipamount % | |
| 1980 \ifdim \parskip=0pt \parskip=2pt \fi% | |
| 1981 \def#2{\endgraf\afterenvbreak\endgroup}% | |
| 1982 \def\itemcontents{#1}% | |
| 1983 \let\item=\itemizeitem} | |
| 1984 | |
| 1985 % Set sfcode to normal for the chars that usually have another value. | |
| 1986 % These are `.?!:;,' | |
| 1987 \def\frenchspacing{\sfcode46=1000 \sfcode63=1000 \sfcode33=1000 | |
| 1988 \sfcode58=1000 \sfcode59=1000 \sfcode44=1000 } | |
| 1989 | |
| 1990 % \splitoff TOKENS\endmark defines \first to be the first token in | |
| 1991 % TOKENS, and \rest to be the remainder. | |
| 1992 % | |
| 1993 \def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}% | |
| 1994 | |
| 1995 % Allow an optional argument of an uppercase letter, lowercase letter, | |
| 1996 % or number, to specify the first label in the enumerated list. No | |
| 1997 % argument is the same as `1'. | |
| 1998 % | |
| 1999 \def\enumerate{\parsearg\enumeratezzz} | |
| 2000 \def\enumeratezzz #1{\enumeratey #1 \endenumeratey} | |
| 2001 \def\enumeratey #1 #2\endenumeratey{% | |
| 2002 \begingroup % ended by the @end enumerate | |
| 2003 % | |
| 2004 % If we were given no argument, pretend we were given `1'. | |
| 2005 \def\thearg{#1}% | |
| 2006 \ifx\thearg\empty \def\thearg{1}\fi | |
| 2007 % | |
| 2008 % Detect if the argument is a single token. If so, it might be a | |
| 2009 % letter. Otherwise, the only valid thing it can be is a number. | |
| 2010 % (We will always have one token, because of the test we just made. | |
| 2011 % This is a good thing, since \splitoff doesn't work given nothing at | |
| 2012 % all -- the first parameter is undelimited.) | |
| 2013 \expandafter\splitoff\thearg\endmark | |
| 2014 \ifx\rest\empty | |
| 2015 % Only one token in the argument. It could still be anything. | |
| 2016 % A ``lowercase letter'' is one whose \lccode is nonzero. | |
| 2017 % An ``uppercase letter'' is one whose \lccode is both nonzero, and | |
| 2018 % not equal to itself. | |
| 2019 % Otherwise, we assume it's a number. | |
| 2020 % | |
| 2021 % We need the \relax at the end of the \ifnum lines to stop TeX from | |
| 2022 % continuing to look for a <number>. | |
| 2023 % | |
| 2024 \ifnum\lccode\expandafter`\thearg=0\relax | |
| 2025 \numericenumerate % a number (we hope) | |
| 2026 \else | |
| 2027 % It's a letter. | |
| 2028 \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax | |
| 2029 \lowercaseenumerate % lowercase letter | |
| 2030 \else | |
| 2031 \uppercaseenumerate % uppercase letter | |
| 2032 \fi | |
| 2033 \fi | |
| 2034 \else | |
| 2035 % Multiple tokens in the argument. We hope it's a number. | |
| 2036 \numericenumerate | |
| 2037 \fi | |
| 2038 } | |
| 2039 | |
| 2040 % An @enumerate whose labels are integers. The starting integer is | |
| 2041 % given in \thearg. | |
| 2042 % | |
| 2043 \def\numericenumerate{% | |
| 2044 \itemno = \thearg | |
| 2045 \startenumeration{\the\itemno}% | |
| 2046 } | |
| 2047 | |
| 2048 % The starting (lowercase) letter is in \thearg. | |
| 2049 \def\lowercaseenumerate{% | |
| 2050 \itemno = \expandafter`\thearg | |
| 2051 \startenumeration{% | |
| 2052 % Be sure we're not beyond the end of the alphabet. | |
| 2053 \ifnum\itemno=0 | |
| 2054 \errmessage{No more lowercase letters in @enumerate; get a bigger | |
| 2055 alphabet}% | |
| 2056 \fi | |
| 2057 \char\lccode\itemno | |
| 2058 }% | |
| 2059 } | |
| 2060 | |
| 2061 % The starting (uppercase) letter is in \thearg. | |
| 2062 \def\uppercaseenumerate{% | |
| 2063 \itemno = \expandafter`\thearg | |
| 2064 \startenumeration{% | |
| 2065 % Be sure we're not beyond the end of the alphabet. | |
| 2066 \ifnum\itemno=0 | |
| 2067 \errmessage{No more uppercase letters in @enumerate; get a bigger | |
| 2068 alphabet} | |
| 2069 \fi | |
| 2070 \char\uccode\itemno | |
| 2071 }% | |
| 2072 } | |
| 2073 | |
| 2074 % Call itemizey, adding a period to the first argument and supplying the | |
| 2075 % common last two arguments. Also subtract one from the initial value in | |
| 2076 % \itemno, since @item increments \itemno. | |
| 2077 % | |
| 2078 \def\startenumeration#1{% | |
| 2079 \advance\itemno by -1 | |
| 2080 \itemizey{#1.}\Eenumerate\flushcr | |
| 2081 } | |
| 2082 | |
| 2083 % @alphaenumerate and @capsenumerate are abbreviations for giving an arg | |
| 2084 % to @enumerate. | |
| 2085 % | |
| 2086 \def\alphaenumerate{\enumerate{a}} | |
| 2087 \def\capsenumerate{\enumerate{A}} | |
| 2088 \def\Ealphaenumerate{\Eenumerate} | |
| 2089 \def\Ecapsenumerate{\Eenumerate} | |
| 2090 | |
| 2091 % Definition of @item while inside @itemize. | |
| 2092 | |
| 2093 \def\itemizeitem{% | |
| 2094 \advance\itemno by 1 | |
| 2095 {\let\par=\endgraf \smallbreak}% | |
| 2096 \ifhmode \errmessage{In hmode at itemizeitem}\fi | |
| 2097 {\parskip=0in \hskip 0pt | |
| 2098 \hbox to 0pt{\hss \itemcontents\hskip \itemmargin}% | |
| 2099 \vadjust{\penalty 1200}}% | |
| 2100 \flushcr} | |
| 2101 | |
| 2102 % @multitable macros | |
| 2103 % Amy Hendrickson, 8/18/94, 3/6/96 | |
| 2104 % | |
| 2105 % @multitable ... @end multitable will make as many columns as desired. | |
| 2106 % Contents of each column will wrap at width given in preamble. Width | |
| 2107 % can be specified either with sample text given in a template line, | |
| 2108 % or in percent of \hsize, the current width of text on page. | |
| 2109 | |
| 2110 % Table can continue over pages but will only break between lines. | |
| 2111 | |
| 2112 % To make preamble: | |
| 2113 % | |
| 2114 % Either define widths of columns in terms of percent of \hsize: | |
| 2115 % @multitable @columnfractions .25 .3 .45 | |
| 2116 % @item ... | |
| 2117 % | |
| 2118 % Numbers following @columnfractions are the percent of the total | |
| 2119 % current hsize to be used for each column. You may use as many | |
| 2120 % columns as desired. | |
| 2121 | |
| 2122 | |
| 2123 % Or use a template: | |
| 2124 % @multitable {Column 1 template} {Column 2 template} {Column 3 template} | |
| 2125 % @item ... | |
| 2126 % using the widest term desired in each column. | |
| 2127 % | |
| 2128 % For those who want to use more than one line's worth of words in | |
| 2129 % the preamble, break the line within one argument and it | |
| 2130 % will parse correctly, i.e., | |
| 2131 % | |
| 2132 % @multitable {Column 1 template} {Column 2 template} {Column 3 | |
| 2133 % template} | |
| 2134 % Not: | |
| 2135 % @multitable {Column 1 template} {Column 2 template} | |
| 2136 % {Column 3 template} | |
| 2137 | |
| 2138 % Each new table line starts with @item, each subsequent new column | |
| 2139 % starts with @tab. Empty columns may be produced by supplying @tab's | |
| 2140 % with nothing between them for as many times as empty columns are needed, | |
| 2141 % ie, @tab@tab@tab will produce two empty columns. | |
| 2142 | |
| 2143 % @item, @tab, @multitable or @end multitable do not need to be on their | |
| 2144 % own lines, but it will not hurt if they are. | |
| 2145 | |
| 2146 % Sample multitable: | |
| 2147 | |
| 2148 % @multitable {Column 1 template} {Column 2 template} {Column 3 template} | |
| 2149 % @item first col stuff @tab second col stuff @tab third col | |
| 2150 % @item | |
| 2151 % first col stuff | |
| 2152 % @tab | |
| 2153 % second col stuff | |
| 2154 % @tab | |
| 2155 % third col | |
| 2156 % @item first col stuff @tab second col stuff | |
| 2157 % @tab Many paragraphs of text may be used in any column. | |
| 2158 % | |
| 2159 % They will wrap at the width determined by the template. | |
| 2160 % @item@tab@tab This will be in third column. | |
| 2161 % @end multitable | |
| 2162 | |
| 2163 % Default dimensions may be reset by user. | |
| 2164 % @multitableparskip is vertical space between paragraphs in table. | |
| 2165 % @multitableparindent is paragraph indent in table. | |
| 2166 % @multitablecolmargin is horizontal space to be left between columns. | |
| 2167 % @multitablelinespace is space to leave between table items, baseline | |
| 2168 % to baseline. | |
| 2169 % 0pt means it depends on current normal line spacing. | |
| 2170 % | |
| 2171 \newskip\multitableparskip | |
| 2172 \newskip\multitableparindent | |
| 2173 \newdimen\multitablecolspace | |
| 2174 \newskip\multitablelinespace | |
| 2175 \multitableparskip=0pt | |
| 2176 \multitableparindent=6pt | |
| 2177 \multitablecolspace=12pt | |
| 2178 \multitablelinespace=0pt | |
| 2179 | |
| 2180 % Macros used to set up halign preamble: | |
| 2181 % | |
| 2182 \let\endsetuptable\relax | |
| 2183 \def\xendsetuptable{\endsetuptable} | |
| 2184 \let\columnfractions\relax | |
| 2185 \def\xcolumnfractions{\columnfractions} | |
| 2186 \newif\ifsetpercent | |
| 2187 | |
| 2188 % #1 is the part of the @columnfraction before the decimal point, which | |
| 2189 % is presumably either 0 or the empty string (but we don't check, we | |
| 2190 % just throw it away). #2 is the decimal part, which we use as the | |
| 2191 % percent of \hsize for this column. | |
| 2192 \def\pickupwholefraction#1.#2 {% | |
| 2193 \global\advance\colcount by 1 | |
| 2194 \expandafter\xdef\csname col\the\colcount\endcsname{.#2\hsize}% | |
| 2195 \setuptable | |
| 2196 } | |
| 2197 | |
| 2198 \newcount\colcount | |
| 2199 \def\setuptable#1{% | |
| 2200 \def\firstarg{#1}% | |
| 2201 \ifx\firstarg\xendsetuptable | |
| 2202 \let\go = \relax | |
| 2203 \else | |
| 2204 \ifx\firstarg\xcolumnfractions | |
| 2205 \global\setpercenttrue | |
| 2206 \else | |
| 2207 \ifsetpercent | |
| 2208 \let\go\pickupwholefraction | |
| 2209 \else | |
| 2210 \global\advance\colcount by 1 | |
| 2211 \setbox0=\hbox{#1\unskip }% Add a normal word space as a separator; | |
| 2212 % typically that is always in the input, anyway. | |
| 2213 \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}% | |
| 2214 \fi | |
| 2215 \fi | |
| 2216 \ifx\go\pickupwholefraction | |
| 2217 % Put the argument back for the \pickupwholefraction call, so | |
| 2218 % we'll always have a period there to be parsed. | |
| 2219 \def\go{\pickupwholefraction#1}% | |
| 2220 \else | |
| 2221 \let\go = \setuptable | |
| 2222 \fi% | |
| 2223 \fi | |
| 2224 \go | |
| 2225 } | |
| 2226 | |
| 2227 % This used to have \hskip1sp. But then the space in a template line is | |
| 2228 % not enough. That is bad. So let's go back to just & until we | |
| 2229 % encounter the problem it was intended to solve again. | |
| 2230 % --karl, nathan@acm.org, 20apr99. | |
| 2231 \def\tab{&} | |
| 2232 | |
| 2233 % @multitable ... @end multitable definitions: | |
| 2234 % | |
| 2235 \def\multitable{\parsearg\dotable} | |
| 2236 \def\dotable#1{\bgroup | |
| 2237 \vskip\parskip | |
| 2238 \let\item\crcr | |
| 2239 \tolerance=9500 | |
| 2240 \hbadness=9500 | |
| 2241 \setmultitablespacing | |
| 2242 \parskip=\multitableparskip | |
| 2243 \parindent=\multitableparindent | |
| 2244 \overfullrule=0pt | |
| 2245 \global\colcount=0 | |
| 2246 \def\Emultitable{\global\setpercentfalse\cr\egroup\egroup}% | |
| 2247 % | |
| 2248 % To parse everything between @multitable and @item: | |
| 2249 \setuptable#1 \endsetuptable | |
| 2250 % | |
| 2251 % \everycr will reset column counter, \colcount, at the end of | |
| 2252 % each line. Every column entry will cause \colcount to advance by one. | |
| 2253 % The table preamble | |
| 2254 % looks at the current \colcount to find the correct column width. | |
| 2255 \everycr{\noalign{% | |
| 2256 % | |
| 2257 % \filbreak%% keeps underfull box messages off when table breaks over pages. | |
| 2258 % Maybe so, but it also creates really weird page breaks when the table | |
| 2259 % breaks over pages. Wouldn't \vfil be better? Wait until the problem | |
| 2260 % manifests itself, so it can be fixed for real --karl. | |
| 2261 \global\colcount=0\relax}}% | |
| 2262 % | |
| 2263 % This preamble sets up a generic column definition, which will | |
| 2264 % be used as many times as user calls for columns. | |
| 2265 % \vtop will set a single line and will also let text wrap and | |
| 2266 % continue for many paragraphs if desired. | |
| 2267 \halign\bgroup&\global\advance\colcount by 1\relax | |
| 2268 \multistrut\vtop{\hsize=\expandafter\csname col\the\colcount\endcsname | |
| 2269 % | |
| 2270 % In order to keep entries from bumping into each other | |
| 2271 % we will add a \leftskip of \multitablecolspace to all columns after | |
| 2272 % the first one. | |
| 2273 % | |
| 2274 % If a template has been used, we will add \multitablecolspace | |
| 2275 % to the width of each template entry. | |
| 2276 % | |
| 2277 % If the user has set preamble in terms of percent of \hsize we will | |
| 2278 % use that dimension as the width of the column, and the \leftskip | |
| 2279 % will keep entries from bumping into each other. Table will start at | |
| 2280 % left margin and final column will justify at right margin. | |
| 2281 % | |
| 2282 % Make sure we don't inherit \rightskip from the outer environment. | |
| 2283 \rightskip=0pt | |
| 2284 \ifnum\colcount=1 | |
| 2285 % The first column will be indented with the surrounding text. | |
| 2286 \advance\hsize by\leftskip | |
| 2287 \else | |
| 2288 \ifsetpercent \else | |
| 2289 % If user has not set preamble in terms of percent of \hsize | |
| 2290 % we will advance \hsize by \multitablecolspace. | |
| 2291 \advance\hsize by \multitablecolspace | |
| 2292 \fi | |
| 2293 % In either case we will make \leftskip=\multitablecolspace: | |
| 2294 \leftskip=\multitablecolspace | |
| 2295 \fi | |
| 2296 % Ignoring space at the beginning and end avoids an occasional spurious | |
| 2297 % blank line, when TeX decides to break the line at the space before the | |
| 2298 % box from the multistrut, so the strut ends up on a line by itself. | |
| 2299 % For example: | |
| 2300 % @multitable @columnfractions .11 .89 | |
| 2301 % @item @code{#} | |
| 2302 % @tab Legal holiday which is valid in major parts of the whole country. | |
| 2303 % Is automatically provided with highlighting sequences respectively marking | |
| 2304 % characters. | |
| 2305 \noindent\ignorespaces##\unskip\multistrut}\cr | |
| 2306 } | |
| 2307 | |
| 2308 \def\setmultitablespacing{% test to see if user has set \multitablelinespace. | |
| 2309 % If so, do nothing. If not, give it an appropriate dimension based on | |
| 2310 % current baselineskip. | |
| 2311 \ifdim\multitablelinespace=0pt | |
| 2312 \setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip | |
| 2313 \global\advance\multitablelinespace by-\ht0 | |
| 2314 %% strut to put in table in case some entry doesn't have descenders, | |
| 2315 %% to keep lines equally spaced | |
| 2316 \let\multistrut = \strut | |
| 2317 \else | |
| 2318 %% FIXME: what is \box0 supposed to be? | |
| 2319 \gdef\multistrut{\vrule height\multitablelinespace depth\dp0 | |
| 2320 width0pt\relax} \fi | |
| 2321 %% Test to see if parskip is larger than space between lines of | |
| 2322 %% table. If not, do nothing. | |
| 2323 %% If so, set to same dimension as multitablelinespace. | |
| 2324 \ifdim\multitableparskip>\multitablelinespace | |
| 2325 \global\multitableparskip=\multitablelinespace | |
| 2326 \global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller | |
| 2327 %% than skip between lines in the table. | |
| 2328 \fi% | |
| 2329 \ifdim\multitableparskip=0pt | |
| 2330 \global\multitableparskip=\multitablelinespace | |
| 2331 \global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller | |
| 2332 %% than skip between lines in the table. | |
| 2333 \fi} | |
| 2334 | |
| 2335 | |
| 2336 \message{conditionals,} | |
| 2337 % Prevent errors for section commands. | |
| 2338 % Used in @ignore and in failing conditionals. | |
| 2339 \def\ignoresections{% | |
| 2340 \let\chapter=\relax | |
| 2341 \let\unnumbered=\relax | |
| 2342 \let\top=\relax | |
| 2343 \let\unnumberedsec=\relax | |
| 2344 \let\unnumberedsection=\relax | |
| 2345 \let\unnumberedsubsec=\relax | |
| 2346 \let\unnumberedsubsection=\relax | |
| 2347 \let\unnumberedsubsubsec=\relax | |
| 2348 \let\unnumberedsubsubsection=\relax | |
| 2349 \let\section=\relax | |
| 2350 \let\subsec=\relax | |
| 2351 \let\subsubsec=\relax | |
| 2352 \let\subsection=\relax | |
| 2353 \let\subsubsection=\relax | |
| 2354 \let\appendix=\relax | |
| 2355 \let\appendixsec=\relax | |
| 2356 \let\appendixsection=\relax | |
| 2357 \let\appendixsubsec=\relax | |
| 2358 \let\appendixsubsection=\relax | |
| 2359 \let\appendixsubsubsec=\relax | |
| 2360 \let\appendixsubsubsection=\relax | |
| 2361 \let\contents=\relax | |
| 2362 \let\smallbook=\relax | |
| 2363 \let\titlepage=\relax | |
| 2364 } | |
| 2365 | |
| 2366 % Used in nested conditionals, where we have to parse the Texinfo source | |
| 2367 % and so want to turn off most commands, in case they are used | |
| 2368 % incorrectly. | |
| 2369 % | |
| 2370 \def\ignoremorecommands{% | |
| 2371 \let\defcodeindex = \relax | |
| 2372 \let\defcv = \relax | |
| 2373 \let\deffn = \relax | |
| 2374 \let\deffnx = \relax | |
| 2375 \let\defindex = \relax | |
| 2376 \let\defivar = \relax | |
| 2377 \let\defmac = \relax | |
| 2378 \let\defmethod = \relax | |
| 2379 \let\defop = \relax | |
| 2380 \let\defopt = \relax | |
| 2381 \let\defspec = \relax | |
| 2382 \let\deftp = \relax | |
| 2383 \let\deftypefn = \relax | |
| 2384 \let\deftypefun = \relax | |
| 2385 \let\deftypeivar = \relax | |
| 2386 \let\deftypeop = \relax | |
| 2387 \let\deftypevar = \relax | |
| 2388 \let\deftypevr = \relax | |
| 2389 \let\defun = \relax | |
| 2390 \let\defvar = \relax | |
| 2391 \let\defvr = \relax | |
| 2392 \let\ref = \relax | |
| 2393 \let\xref = \relax | |
| 2394 \let\printindex = \relax | |
| 2395 \let\pxref = \relax | |
| 2396 \let\settitle = \relax | |
| 2397 \let\setchapternewpage = \relax | |
| 2398 \let\setchapterstyle = \relax | |
| 2399 \let\everyheading = \relax | |
| 2400 \let\evenheading = \relax | |
| 2401 \let\oddheading = \relax | |
| 2402 \let\everyfooting = \relax | |
| 2403 \let\evenfooting = \relax | |
| 2404 \let\oddfooting = \relax | |
| 2405 \let\headings = \relax | |
| 2406 \let\include = \relax | |
| 2407 \let\lowersections = \relax | |
| 2408 \let\down = \relax | |
| 2409 \let\raisesections = \relax | |
| 2410 \let\up = \relax | |
| 2411 \let\set = \relax | |
| 2412 \let\clear = \relax | |
| 2413 \let\item = \relax | |
| 2414 } | |
| 2415 | |
| 47284 | 2416 % Ignore @ignore, @ifhtml, @ifinfo, @ifplaintext, @ifnottex, @html, @menu, |
| 2417 % @direntry, and @documentdescription. | |
| 37713 | 2418 % |
| 2419 \def\ignore{\doignore{ignore}} | |
| 47284 | 2420 \def\ifhtml{\doignore{ifhtml}} |
| 37713 | 2421 \def\ifinfo{\doignore{ifinfo}} |
| 47284 | 2422 \def\ifplaintext{\doignore{ifplaintext}} |
| 37713 | 2423 \def\ifnottex{\doignore{ifnottex}} |
| 2424 \def\html{\doignore{html}} | |
| 2425 \def\menu{\doignore{menu}} | |
| 2426 \def\direntry{\doignore{direntry}} | |
| 47284 | 2427 \def\documentdescription{\doignore{documentdescription}} |
| 2428 \def\documentdescriptionword{documentdescription} | |
| 37713 | 2429 |
| 2430 % @dircategory CATEGORY -- specify a category of the dir file | |
| 2431 % which this file should belong to. Ignore this in TeX. | |
| 2432 \let\dircategory = \comment | |
| 2433 | |
| 2434 % Ignore text until a line `@end #1'. | |
| 2435 % | |
| 2436 \def\doignore#1{\begingroup | |
| 2437 % Don't complain about control sequences we have declared \outer. | |
| 2438 \ignoresections | |
| 2439 % | |
| 2440 % Define a command to swallow text until we reach `@end #1'. | |
| 2441 % This @ is a catcode 12 token (that is the normal catcode of @ in | |
| 2442 % this texinfo.tex file). We change the catcode of @ below to match. | |
| 2443 \long\def\doignoretext##1@end #1{\enddoignore}% | |
| 2444 % | |
| 2445 % Make sure that spaces turn into tokens that match what \doignoretext wants. | |
| 2446 \catcode32 = 10 | |
| 2447 % | |
| 2448 % Ignore braces, too, so mismatched braces don't cause trouble. | |
| 2449 \catcode`\{ = 9 | |
| 2450 \catcode`\} = 9 | |
| 2451 % | |
| 2452 % We must not have @c interpreted as a control sequence. | |
| 2453 \catcode`\@ = 12 | |
| 2454 % | |
| 47284 | 2455 \def\ignoreword{#1}% |
| 2456 \ifx\ignoreword\documentdescriptionword | |
| 2457 % The c kludge breaks documentdescription, since | |
| 2458 % `documentdescription' contains a `c'. Means not everything will | |
| 2459 % be ignored inside @documentdescription, but oh well... | |
| 2460 \else | |
| 2461 % Make the letter c a comment character so that the rest of the line | |
| 2462 % will be ignored. This way, the document can have (for example) | |
| 2463 % @c @end ifinfo | |
| 2464 % and the @end ifinfo will be properly ignored. | |
| 2465 % (We've just changed @ to catcode 12.) | |
| 2466 \catcode`\c = 14 | |
| 2467 \fi | |
| 37713 | 2468 % |
| 47284 | 2469 % And now expand the command defined above. |
| 37713 | 2470 \doignoretext |
| 2471 } | |
| 2472 | |
| 2473 % What we do to finish off ignored text. | |
| 2474 % | |
| 2475 \def\enddoignore{\endgroup\ignorespaces}% | |
| 2476 | |
| 2477 \newif\ifwarnedobs\warnedobsfalse | |
| 2478 \def\obstexwarn{% | |
| 2479 \ifwarnedobs\relax\else | |
| 2480 % We need to warn folks that they may have trouble with TeX 3.0. | |
| 2481 % This uses \immediate\write16 rather than \message to get newlines. | |
| 2482 \immediate\write16{} | |
| 2483 \immediate\write16{WARNING: for users of Unix TeX 3.0!} | |
| 2484 \immediate\write16{This manual trips a bug in TeX version 3.0 (tex hangs).} | |
| 2485 \immediate\write16{If you are running another version of TeX, relax.} | |
| 2486 \immediate\write16{If you are running Unix TeX 3.0, kill this TeX process.} | |
| 2487 \immediate\write16{ Then upgrade your TeX installation if you can.} | |
| 2488 \immediate\write16{ (See ftp://ftp.gnu.org/pub/gnu/TeX.README.)} | |
| 2489 \immediate\write16{If you are stuck with version 3.0, run the} | |
| 2490 \immediate\write16{ script ``tex3patch'' from the Texinfo distribution} | |
| 2491 \immediate\write16{ to use a workaround.} | |
| 2492 \immediate\write16{} | |
| 2493 \global\warnedobstrue | |
| 2494 \fi | |
| 2495 } | |
| 2496 | |
| 2497 % **In TeX 3.0, setting text in \nullfont hangs tex. For a | |
| 2498 % workaround (which requires the file ``dummy.tfm'' to be installed), | |
| 2499 % uncomment the following line: | |
| 2500 %%%%%\font\nullfont=dummy\let\obstexwarn=\relax | |
| 2501 | |
| 2502 % Ignore text, except that we keep track of conditional commands for | |
| 2503 % purposes of nesting, up to an `@end #1' command. | |
| 2504 % | |
| 2505 \def\nestedignore#1{% | |
| 2506 \obstexwarn | |
| 2507 % We must actually expand the ignored text to look for the @end | |
| 2508 % command, so that nested ignore constructs work. Thus, we put the | |
| 2509 % text into a \vbox and then do nothing with the result. To minimize | |
| 2510 % the change of memory overflow, we follow the approach outlined on | |
| 2511 % page 401 of the TeXbook: make the current font be a dummy font. | |
| 2512 % | |
| 2513 \setbox0 = \vbox\bgroup | |
| 2514 % Don't complain about control sequences we have declared \outer. | |
| 2515 \ignoresections | |
| 2516 % | |
| 2517 % Define `@end #1' to end the box, which will in turn undefine the | |
| 2518 % @end command again. | |
| 2519 \expandafter\def\csname E#1\endcsname{\egroup\ignorespaces}% | |
| 2520 % | |
| 2521 % We are going to be parsing Texinfo commands. Most cause no | |
| 2522 % trouble when they are used incorrectly, but some commands do | |
| 2523 % complicated argument parsing or otherwise get confused, so we | |
| 2524 % undefine them. | |
| 2525 % | |
| 2526 % We can't do anything about stray @-signs, unfortunately; | |
| 2527 % they'll produce `undefined control sequence' errors. | |
| 2528 \ignoremorecommands | |
| 2529 % | |
| 2530 % Set the current font to be \nullfont, a TeX primitive, and define | |
| 2531 % all the font commands to also use \nullfont. We don't use | |
| 2532 % dummy.tfm, as suggested in the TeXbook, because not all sites | |
| 2533 % might have that installed. Therefore, math mode will still | |
| 2534 % produce output, but that should be an extremely small amount of | |
| 2535 % stuff compared to the main input. | |
| 2536 % | |
| 2537 \nullfont | |
| 2538 \let\tenrm=\nullfont \let\tenit=\nullfont \let\tensl=\nullfont | |
| 2539 \let\tenbf=\nullfont \let\tentt=\nullfont \let\smallcaps=\nullfont | |
| 2540 \let\tensf=\nullfont | |
| 47284 | 2541 % Similarly for index fonts. |
| 37713 | 2542 \let\smallrm=\nullfont \let\smallit=\nullfont \let\smallsl=\nullfont |
| 2543 \let\smallbf=\nullfont \let\smalltt=\nullfont \let\smallsc=\nullfont | |
| 2544 \let\smallsf=\nullfont | |
| 47284 | 2545 % Similarly for smallexample fonts. |
| 2546 \let\smallerrm=\nullfont \let\smallerit=\nullfont \let\smallersl=\nullfont | |
| 2547 \let\smallerbf=\nullfont \let\smallertt=\nullfont \let\smallersc=\nullfont | |
| 2548 \let\smallersf=\nullfont | |
| 37713 | 2549 % |
| 2550 % Don't complain when characters are missing from the fonts. | |
| 2551 \tracinglostchars = 0 | |
| 2552 % | |
| 2553 % Don't bother to do space factor calculations. | |
| 2554 \frenchspacing | |
| 2555 % | |
| 2556 % Don't report underfull hboxes. | |
| 2557 \hbadness = 10000 | |
| 2558 % | |
| 2559 % Do minimal line-breaking. | |
| 2560 \pretolerance = 10000 | |
| 2561 % | |
| 2562 % Do not execute instructions in @tex | |
| 2563 \def\tex{\doignore{tex}}% | |
| 2564 % Do not execute macro definitions. | |
| 2565 % `c' is a comment character, so the word `macro' will get cut off. | |
| 2566 \def\macro{\doignore{ma}}% | |
| 2567 } | |
| 2568 | |
| 2569 % @set VAR sets the variable VAR to an empty value. | |
| 2570 % @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE. | |
| 2571 % | |
| 2572 % Since we want to separate VAR from REST-OF-LINE (which might be | |
| 2573 % empty), we can't just use \parsearg; we have to insert a space of our | |
| 2574 % own to delimit the rest of the line, and then take it out again if we | |
| 2575 % didn't need it. Make sure the catcode of space is correct to avoid | |
| 2576 % losing inside @example, for instance. | |
| 2577 % | |
| 2578 \def\set{\begingroup\catcode` =10 | |
| 2579 \catcode`\-=12 \catcode`\_=12 % Allow - and _ in VAR. | |
| 2580 \parsearg\setxxx} | |
| 2581 \def\setxxx#1{\setyyy#1 \endsetyyy} | |
| 2582 \def\setyyy#1 #2\endsetyyy{% | |
| 2583 \def\temp{#2}% | |
| 2584 \ifx\temp\empty \global\expandafter\let\csname SET#1\endcsname = \empty | |
| 2585 \else \setzzz{#1}#2\endsetzzz % Remove the trailing space \setxxx inserted. | |
| 2586 \fi | |
| 2587 \endgroup | |
| 2588 } | |
| 2589 % Can't use \xdef to pre-expand #2 and save some time, since \temp or | |
| 2590 % \next or other control sequences that we've defined might get us into | |
| 2591 % an infinite loop. Consider `@set foo @cite{bar}'. | |
| 2592 \def\setzzz#1#2 \endsetzzz{\expandafter\gdef\csname SET#1\endcsname{#2}} | |
| 2593 | |
| 2594 % @clear VAR clears (i.e., unsets) the variable VAR. | |
| 2595 % | |
| 2596 \def\clear{\parsearg\clearxxx} | |
| 2597 \def\clearxxx#1{\global\expandafter\let\csname SET#1\endcsname=\relax} | |
| 2598 | |
| 2599 % @value{foo} gets the text saved in variable foo. | |
| 2600 { | |
| 2601 \catcode`\_ = \active | |
| 2602 % | |
| 2603 % We might end up with active _ or - characters in the argument if | |
| 2604 % we're called from @code, as @code{@value{foo-bar_}}. So \let any | |
| 2605 % such active characters to their normal equivalents. | |
| 2606 \gdef\value{\begingroup | |
| 2607 \catcode`\-=12 \catcode`\_=12 | |
| 2608 \indexbreaks \let_\normalunderscore | |
| 2609 \valuexxx} | |
| 2610 } | |
| 2611 \def\valuexxx#1{\expandablevalue{#1}\endgroup} | |
| 2612 | |
| 2613 % We have this subroutine so that we can handle at least some @value's | |
| 2614 % properly in indexes (we \let\value to this in \indexdummies). Ones | |
| 2615 % whose names contain - or _ still won't work, but we can't do anything | |
| 2616 % about that. The command has to be fully expandable, since the result | |
| 2617 % winds up in the index file. This means that if the variable's value | |
| 2618 % contains other Texinfo commands, it's almost certain it will fail | |
| 2619 % (although perhaps we could fix that with sufficient work to do a | |
| 2620 % one-level expansion on the result, instead of complete). | |
| 2621 % | |
| 2622 \def\expandablevalue#1{% | |
| 2623 \expandafter\ifx\csname SET#1\endcsname\relax | |
| 2624 {[No value for ``#1'']}% | |
| 2625 \else | |
| 2626 \csname SET#1\endcsname | |
| 2627 \fi | |
| 2628 } | |
| 2629 | |
| 2630 % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined | |
| 2631 % with @set. | |
| 2632 % | |
| 2633 \def\ifset{\parsearg\ifsetxxx} | |
| 2634 \def\ifsetxxx #1{% | |
| 2635 \expandafter\ifx\csname SET#1\endcsname\relax | |
| 2636 \expandafter\ifsetfail | |
| 2637 \else | |
| 2638 \expandafter\ifsetsucceed | |
| 2639 \fi | |
| 2640 } | |
| 2641 \def\ifsetsucceed{\conditionalsucceed{ifset}} | |
| 2642 \def\ifsetfail{\nestedignore{ifset}} | |
| 2643 \defineunmatchedend{ifset} | |
| 2644 | |
| 2645 % @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been | |
| 2646 % defined with @set, or has been undefined with @clear. | |
| 2647 % | |
| 2648 \def\ifclear{\parsearg\ifclearxxx} | |
| 2649 \def\ifclearxxx #1{% | |
| 2650 \expandafter\ifx\csname SET#1\endcsname\relax | |
| 2651 \expandafter\ifclearsucceed | |
| 2652 \else | |
| 2653 \expandafter\ifclearfail | |
| 2654 \fi | |
| 2655 } | |
| 2656 \def\ifclearsucceed{\conditionalsucceed{ifclear}} | |
| 2657 \def\ifclearfail{\nestedignore{ifclear}} | |
| 2658 \defineunmatchedend{ifclear} | |
| 2659 | |
| 47284 | 2660 % @iftex, @ifnothtml, @ifnotinfo, @ifnotplaintext always succeed; we |
| 2661 % read the text following, through the first @end iftex (etc.). Make | |
| 2662 % `@end iftex' (etc.) valid only after an @iftex. | |
| 37713 | 2663 % |
| 2664 \def\iftex{\conditionalsucceed{iftex}} | |
| 2665 \def\ifnothtml{\conditionalsucceed{ifnothtml}} | |
| 2666 \def\ifnotinfo{\conditionalsucceed{ifnotinfo}} | |
| 47284 | 2667 \def\ifnotplaintext{\conditionalsucceed{ifnotplaintext}} |
| 37713 | 2668 \defineunmatchedend{iftex} |
| 2669 \defineunmatchedend{ifnothtml} | |
| 2670 \defineunmatchedend{ifnotinfo} | |
| 47284 | 2671 \defineunmatchedend{ifnotplaintext} |
| 2672 | |
| 2673 % We can't just want to start a group at @iftex (etc.) and end it at | |
| 2674 % @end iftex, since then @set commands inside the conditional have no | |
| 37713 | 2675 % effect (they'd get reverted at the end of the group). So we must |
| 2676 % define \Eiftex to redefine itself to be its previous value. (We can't | |
| 2677 % just define it to fail again with an ``unmatched end'' error, since | |
| 2678 % the @ifset might be nested.) | |
| 2679 % | |
| 2680 \def\conditionalsucceed#1{% | |
| 2681 \edef\temp{% | |
| 2682 % Remember the current value of \E#1. | |
| 2683 \let\nece{prevE#1} = \nece{E#1}% | |
| 2684 % | |
| 2685 % At the `@end #1', redefine \E#1 to be its previous value. | |
| 2686 \def\nece{E#1}{\let\nece{E#1} = \nece{prevE#1}}% | |
| 2687 }% | |
| 2688 \temp | |
| 2689 } | |
| 2690 | |
| 2691 % We need to expand lots of \csname's, but we don't want to expand the | |
| 2692 % control sequences after we've constructed them. | |
| 2693 % | |
| 2694 \def\nece#1{\expandafter\noexpand\csname#1\endcsname} | |
| 2695 | |
| 2696 % @defininfoenclose. | |
| 2697 \let\definfoenclose=\comment | |
| 2698 | |
| 2699 | |
| 2700 \message{indexing,} | |
| 2701 % Index generation facilities | |
| 2702 | |
| 2703 % Define \newwrite to be identical to plain tex's \newwrite | |
| 2704 % except not \outer, so it can be used within \newindex. | |
| 2705 {\catcode`\@=11 | |
| 2706 \gdef\newwrite{\alloc@7\write\chardef\sixt@@n}} | |
| 2707 | |
| 2708 % \newindex {foo} defines an index named foo. | |
| 2709 % It automatically defines \fooindex such that | |
| 2710 % \fooindex ...rest of line... puts an entry in the index foo. | |
| 2711 % It also defines \fooindfile to be the number of the output channel for | |
| 2712 % the file that accumulates this index. The file's extension is foo. | |
| 2713 % The name of an index should be no more than 2 characters long | |
| 2714 % for the sake of vms. | |
| 2715 % | |
| 2716 \def\newindex#1{% | |
| 2717 \iflinks | |
| 2718 \expandafter\newwrite \csname#1indfile\endcsname | |
| 2719 \openout \csname#1indfile\endcsname \jobname.#1 % Open the file | |
| 2720 \fi | |
| 2721 \expandafter\xdef\csname#1index\endcsname{% % Define @#1index | |
| 2722 \noexpand\doindex{#1}} | |
| 2723 } | |
| 2724 | |
| 2725 % @defindex foo == \newindex{foo} | |
| 2726 % | |
| 2727 \def\defindex{\parsearg\newindex} | |
| 2728 | |
| 2729 % Define @defcodeindex, like @defindex except put all entries in @code. | |
| 2730 % | |
| 2731 \def\defcodeindex{\parsearg\newcodeindex} | |
| 2732 % | |
| 2733 \def\newcodeindex#1{% | |
| 2734 \iflinks | |
| 2735 \expandafter\newwrite \csname#1indfile\endcsname | |
| 2736 \openout \csname#1indfile\endcsname \jobname.#1 | |
| 2737 \fi | |
| 2738 \expandafter\xdef\csname#1index\endcsname{% | |
| 2739 \noexpand\docodeindex{#1}}% | |
| 2740 } | |
| 2741 | |
| 2742 | |
| 2743 % @synindex foo bar makes index foo feed into index bar. | |
| 2744 % Do this instead of @defindex foo if you don't want it as a separate index. | |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
47284
diff
changeset
|
2745 % |
| 37713 | 2746 % @syncodeindex foo bar similar, but put all entries made for index foo |
| 2747 % inside @code. | |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
47284
diff
changeset
|
2748 % |
| 37713 | 2749 \def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}} |
| 2750 \def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}} | |
| 2751 | |
| 2752 % #1 is \doindex or \docodeindex, #2 the index getting redefined (foo), | |
| 2753 % #3 the target index (bar). | |
| 2754 \def\dosynindex#1#2#3{% | |
| 2755 % Only do \closeout if we haven't already done it, else we'll end up | |
| 2756 % closing the target index. | |
| 2757 \expandafter \ifx\csname donesynindex#2\endcsname \undefined | |
| 2758 % The \closeout helps reduce unnecessary open files; the limit on the | |
| 2759 % Acorn RISC OS is a mere 16 files. | |
| 2760 \expandafter\closeout\csname#2indfile\endcsname | |
| 2761 \expandafter\let\csname\donesynindex#2\endcsname = 1 | |
| 2762 \fi | |
| 2763 % redefine \fooindfile: | |
| 2764 \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname | |
| 2765 \expandafter\let\csname#2indfile\endcsname=\temp | |
| 2766 % redefine \fooindex: | |
| 2767 \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}% | |
| 2768 } | |
| 2769 | |
| 2770 % Define \doindex, the driver for all \fooindex macros. | |
| 2771 % Argument #1 is generated by the calling \fooindex macro, | |
| 2772 % and it is "foo", the name of the index. | |
| 2773 | |
| 2774 % \doindex just uses \parsearg; it calls \doind for the actual work. | |
| 2775 % This is because \doind is more useful to call from other macros. | |
| 2776 | |
| 2777 % There is also \dosubind {index}{topic}{subtopic} | |
| 2778 % which makes an entry in a two-level index such as the operation index. | |
| 2779 | |
| 2780 \def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer} | |
| 2781 \def\singleindexer #1{\doind{\indexname}{#1}} | |
| 2782 | |
| 2783 % like the previous two, but they put @code around the argument. | |
| 2784 \def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} | |
| 2785 \def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} | |
| 2786 | |
| 47284 | 2787 % Take care of texinfo commands likely to appear in an index entry. |
| 2788 % (Must be a way to avoid doing expansion at all, and thus not have to | |
| 2789 % laboriously list every single command here.) | |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
47284
diff
changeset
|
2790 % |
| 37713 | 2791 \def\indexdummies{% |
| 2792 \def\ { }% | |
| 47284 | 2793 \def\@{@}% change to @@ when we switch to @ as escape char in aux files. |
| 2794 % Need these in case \tex is in effect and \{ is a \delimiter again. | |
| 2795 % But can't use \lbracecmd and \rbracecmd because texindex assumes | |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
47284
diff
changeset
|
2796 % braces and backslashes are used only as delimiters. |
| 47284 | 2797 \let\{ = \mylbrace |
| 2798 \let\} = \myrbrace | |
| 2799 \def\_{{\realbackslash _}}% | |
| 2800 \normalturnoffactive | |
| 2801 % | |
| 37713 | 2802 % Take care of the plain tex accent commands. |
| 47284 | 2803 \def\,##1{\realbackslash ,{##1}}% |
| 37713 | 2804 \def\"{\realbackslash "}% |
| 2805 \def\`{\realbackslash `}% | |
| 2806 \def\'{\realbackslash '}% | |
| 2807 \def\^{\realbackslash ^}% | |
| 2808 \def\~{\realbackslash ~}% | |
| 2809 \def\={\realbackslash =}% | |
| 2810 \def\b{\realbackslash b}% | |
| 2811 \def\c{\realbackslash c}% | |
| 2812 \def\d{\realbackslash d}% | |
| 2813 \def\u{\realbackslash u}% | |
| 2814 \def\v{\realbackslash v}% | |
| 2815 \def\H{\realbackslash H}% | |
| 47284 | 2816 \def\dotless##1{\realbackslash dotless {##1}}% |
| 37713 | 2817 % Take care of the plain tex special European modified letters. |
| 47284 | 2818 \def\AA{\realbackslash AA}% |
| 37713 | 2819 \def\AE{\realbackslash AE}% |
| 47284 | 2820 \def\L{\realbackslash L}% |
| 2821 \def\OE{\realbackslash OE}% | |
| 37713 | 2822 \def\O{\realbackslash O}% |
| 47284 | 2823 \def\aa{\realbackslash aa}% |
| 2824 \def\ae{\realbackslash ae}% | |
| 37713 | 2825 \def\l{\realbackslash l}% |
| 47284 | 2826 \def\oe{\realbackslash oe}% |
| 2827 \def\o{\realbackslash o}% | |
| 37713 | 2828 \def\ss{\realbackslash ss}% |
| 47284 | 2829 % |
| 2830 % Although these internals commands shouldn't show up, sometimes they do. | |
| 37713 | 2831 \def\bf{\realbackslash bf }% |
| 47284 | 2832 \def\gtr{\realbackslash gtr}% |
| 2833 \def\hat{\realbackslash hat}% | |
| 2834 \def\less{\realbackslash less}% | |
| 37713 | 2835 %\def\rm{\realbackslash rm }% |
| 2836 \def\sf{\realbackslash sf}% | |
| 47284 | 2837 \def\sl{\realbackslash sl }% |
| 2838 \def\tclose##1{\realbackslash tclose {##1}}% | |
| 37713 | 2839 \def\tt{\realbackslash tt}% |
| 47284 | 2840 % |
| 2841 \def\b##1{\realbackslash b {##1}}% | |
| 2842 \def\i##1{\realbackslash i {##1}}% | |
| 2843 \def\sc##1{\realbackslash sc {##1}}% | |
| 2844 \def\t##1{\realbackslash t {##1}}% | |
| 2845 \def\r##1{\realbackslash r {##1}}% | |
| 2846 % | |
| 37713 | 2847 \def\TeX{\realbackslash TeX}% |
| 47284 | 2848 \def\acronym##1{\realbackslash acronym {##1}}% |
| 2849 \def\cite##1{\realbackslash cite {##1}}% | |
| 2850 \def\code##1{\realbackslash code {##1}}% | |
| 2851 \def\command##1{\realbackslash command {##1}}% | |
| 2852 \def\dfn##1{\realbackslash dfn {##1}}% | |
| 37713 | 2853 \def\dots{\realbackslash dots }% |
| 47284 | 2854 \def\emph##1{\realbackslash emph {##1}}% |
| 2855 \def\env##1{\realbackslash env {##1}}% | |
| 2856 \def\file##1{\realbackslash file {##1}}% | |
| 2857 \def\kbd##1{\realbackslash kbd {##1}}% | |
| 2858 \def\key##1{\realbackslash key {##1}}% | |
| 2859 \def\math##1{\realbackslash math {##1}}% | |
| 2860 \def\option##1{\realbackslash option {##1}}% | |
| 2861 \def\samp##1{\realbackslash samp {##1}}% | |
| 2862 \def\strong##1{\realbackslash strong {##1}}% | |
| 37713 | 2863 \def\uref##1{\realbackslash uref {##1}}% |
| 2864 \def\url##1{\realbackslash url {##1}}% | |
| 2865 \def\var##1{\realbackslash var {##1}}% | |
| 47284 | 2866 \def\w{\realbackslash w }% |
| 2867 % | |
| 2868 % These math commands don't seem likely to be used in index entries. | |
| 2869 \def\copyright{\realbackslash copyright}% | |
| 2870 \def\equiv{\realbackslash equiv}% | |
| 2871 \def\error{\realbackslash error}% | |
| 2872 \def\expansion{\realbackslash expansion}% | |
| 2873 \def\point{\realbackslash point}% | |
| 2874 \def\print{\realbackslash print}% | |
| 2875 \def\result{\realbackslash result}% | |
| 37713 | 2876 % |
| 2877 % Handle some cases of @value -- where the variable name does not | |
| 2878 % contain - or _, and the value does not contain any | |
| 2879 % (non-fully-expandable) commands. | |
| 2880 \let\value = \expandablevalue | |
| 2881 % | |
| 2882 \unsepspaces | |
| 2883 % Turn off macro expansion | |
| 2884 \turnoffmacros | |
| 2885 } | |
| 2886 | |
| 2887 % If an index command is used in an @example environment, any spaces | |
| 2888 % therein should become regular spaces in the raw index file, not the | |
| 47284 | 2889 % expansion of \tie (\leavevmode \penalty \@M \ ). |
| 37713 | 2890 {\obeyspaces |
| 2891 \gdef\unsepspaces{\obeyspaces\let =\space}} | |
| 2892 | |
| 2893 % \indexnofonts no-ops all font-change commands. | |
| 2894 % This is used when outputting the strings to sort the index by. | |
| 2895 \def\indexdummyfont#1{#1} | |
| 2896 \def\indexdummytex{TeX} | |
| 2897 \def\indexdummydots{...} | |
| 2898 | |
| 2899 \def\indexnofonts{% | |
| 47284 | 2900 \def\@{@}% |
| 2901 % how to handle braces? | |
| 2902 \def\_{\normalunderscore}% | |
| 2903 % | |
| 37713 | 2904 \let\,=\indexdummyfont |
| 2905 \let\"=\indexdummyfont | |
| 2906 \let\`=\indexdummyfont | |
| 2907 \let\'=\indexdummyfont | |
| 2908 \let\^=\indexdummyfont | |
| 2909 \let\~=\indexdummyfont | |
| 2910 \let\==\indexdummyfont | |
| 2911 \let\b=\indexdummyfont | |
| 2912 \let\c=\indexdummyfont | |
| 2913 \let\d=\indexdummyfont | |
| 2914 \let\u=\indexdummyfont | |
| 2915 \let\v=\indexdummyfont | |
| 2916 \let\H=\indexdummyfont | |
| 2917 \let\dotless=\indexdummyfont | |
| 2918 % Take care of the plain tex special European modified letters. | |
| 47284 | 2919 \def\AA{AA}% |
| 2920 \def\AE{AE}% | |
| 2921 \def\L{L}% | |
| 37713 | 2922 \def\OE{OE}% |
| 2923 \def\O{O}% | |
| 47284 | 2924 \def\aa{aa}% |
| 2925 \def\ae{ae}% | |
| 37713 | 2926 \def\l{l}% |
| 47284 | 2927 \def\oe{oe}% |
| 2928 \def\o{o}% | |
| 37713 | 2929 \def\ss{ss}% |
| 47284 | 2930 % |
| 2931 % Don't no-op \tt, since it isn't a user-level command | |
| 2932 % and is used in the definitions of the active chars like <, >, |, etc. | |
| 2933 % Likewise with the other plain tex font commands. | |
| 2934 %\let\tt=\indexdummyfont | |
| 2935 % | |
| 2936 \let\b=\indexdummyfont | |
| 2937 \let\i=\indexdummyfont | |
| 37713 | 2938 \let\r=\indexdummyfont |
| 47284 | 2939 \let\sc=\indexdummyfont |
| 2940 \let\t=\indexdummyfont | |
| 2941 % | |
| 2942 \let\TeX=\indexdummytex | |
| 2943 \let\acronym=\indexdummyfont | |
| 2944 \let\cite=\indexdummyfont | |
| 2945 \let\code=\indexdummyfont | |
| 2946 \let\command=\indexdummyfont | |
| 2947 \let\dfn=\indexdummyfont | |
| 2948 \let\dots=\indexdummydots | |
| 37713 | 2949 \let\emph=\indexdummyfont |
| 2950 \let\env=\indexdummyfont | |
| 2951 \let\file=\indexdummyfont | |
| 2952 \let\kbd=\indexdummyfont | |
| 2953 \let\key=\indexdummyfont | |
| 47284 | 2954 \let\math=\indexdummyfont |
| 2955 \let\option=\indexdummyfont | |
| 2956 \let\samp=\indexdummyfont | |
| 2957 \let\strong=\indexdummyfont | |
| 2958 \let\uref=\indexdummyfont | |
| 2959 \let\url=\indexdummyfont | |
| 37713 | 2960 \let\var=\indexdummyfont |
| 47284 | 2961 \let\w=\indexdummyfont |
| 37713 | 2962 } |
| 2963 | |
| 2964 % To define \realbackslash, we must make \ not be an escape. | |
| 2965 % We must first make another character (@) an escape | |
| 2966 % so we do not become unable to do a definition. | |
| 2967 | |
| 2968 {\catcode`\@=0 \catcode`\\=\other | |
| 2969 @gdef@realbackslash{\}} | |
| 2970 | |
| 2971 \let\indexbackslash=0 %overridden during \printindex. | |
| 2972 \let\SETmarginindex=\relax % put index entries in margin (undocumented)? | |
| 2973 | |
| 2974 % For \ifx comparisons. | |
| 2975 \def\emptymacro{\empty} | |
| 2976 | |
| 2977 % Most index entries go through here, but \dosubind is the general case. | |
| 2978 % | |
| 2979 \def\doind#1#2{\dosubind{#1}{#2}\empty} | |
| 2980 | |
| 2981 % Workhorse for all \fooindexes. | |
| 2982 % #1 is name of index, #2 is stuff to put there, #3 is subentry -- | |
| 2983 % \empty if called from \doind, as we usually are. The main exception | |
| 2984 % is with defuns, which call us directly. | |
| 2985 % | |
| 2986 \def\dosubind#1#2#3{% | |
| 2987 % Put the index entry in the margin if desired. | |
| 2988 \ifx\SETmarginindex\relax\else | |
| 2989 \insert\margin{\hbox{\vrule height8pt depth3pt width0pt #2}}% | |
| 2990 \fi | |
| 2991 {% | |
| 2992 \count255=\lastpenalty | |
| 2993 {% | |
| 2994 \indexdummies % Must do this here, since \bf, etc expand at this stage | |
| 2995 \escapechar=`\\ | |
| 2996 {% | |
| 2997 \let\folio = 0% We will expand all macros now EXCEPT \folio. | |
| 2998 \def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now | |
| 2999 % so it will be output as is; and it will print as backslash. | |
| 3000 % | |
| 3001 \def\thirdarg{#3}% | |
| 3002 % | |
| 3003 % If third arg is present, precede it with space in sort key. | |
| 3004 \ifx\thirdarg\emptymacro | |
| 3005 \let\subentry = \empty | |
| 3006 \else | |
| 3007 \def\subentry{ #3}% | |
| 3008 \fi | |
| 3009 % | |
| 3010 % First process the index entry with all font commands turned | |
| 3011 % off to get the string to sort by. | |
| 3012 {\indexnofonts \xdef\indexsorttmp{#2\subentry}}% | |
| 3013 % | |
| 3014 % Now the real index entry with the fonts. | |
| 3015 \toks0 = {#2}% | |
| 3016 % | |
| 3017 % If the third (subentry) arg is present, add it to the index | |
| 3018 % line to write. | |
| 3019 \ifx\thirdarg\emptymacro \else | |
| 3020 \toks0 = \expandafter{\the\toks0{#3}}% | |
| 3021 \fi | |
| 3022 % | |
| 3023 % Set up the complete index entry, with both the sort key and | |
| 3024 % the original text, including any font commands. We write | |
| 3025 % three arguments to \entry to the .?? file (four in the | |
| 3026 % subentry case), texindex reduces to two when writing the .??s | |
| 3027 % sorted result. | |
| 3028 \edef\temp{% | |
| 3029 \write\csname#1indfile\endcsname{% | |
| 3030 \realbackslash entry{\indexsorttmp}{\folio}{\the\toks0}}% | |
| 3031 }% | |
| 3032 % | |
| 3033 % If a skip is the last thing on the list now, preserve it | |
| 3034 % by backing up by \lastskip, doing the \write, then inserting | |
| 3035 % the skip again. Otherwise, the whatsit generated by the | |
| 3036 % \write will make \lastskip zero. The result is that sequences | |
| 3037 % like this: | |
| 3038 % @end defun | |
| 3039 % @tindex whatever | |
| 3040 % @defun ... | |
| 3041 % will have extra space inserted, because the \medbreak in the | |
| 3042 % start of the @defun won't see the skip inserted by the @end of | |
| 3043 % the previous defun. | |
| 3044 % | |
| 3045 % But don't do any of this if we're not in vertical mode. We | |
| 3046 % don't want to do a \vskip and prematurely end a paragraph. | |
| 3047 % | |
| 3048 % Avoid page breaks due to these extra skips, too. | |
| 3049 % | |
| 3050 \iflinks | |
| 3051 \ifvmode | |
| 3052 \skip0 = \lastskip | |
| 3053 \ifdim\lastskip = 0pt \else \nobreak\vskip-\lastskip \fi | |
| 3054 \fi | |
| 3055 % | |
| 3056 \temp % do the write | |
| 3057 % | |
| 3058 % | |
| 3059 \ifvmode \ifdim\skip0 = 0pt \else \nobreak\vskip\skip0 \fi \fi | |
| 3060 \fi | |
| 3061 }% | |
| 3062 }% | |
| 3063 \penalty\count255 | |
| 3064 }% | |
| 3065 } | |
| 3066 | |
| 3067 % The index entry written in the file actually looks like | |
| 3068 % \entry {sortstring}{page}{topic} | |
| 3069 % or | |
| 3070 % \entry {sortstring}{page}{topic}{subtopic} | |
| 3071 % The texindex program reads in these files and writes files | |
| 3072 % containing these kinds of lines: | |
| 3073 % \initial {c} | |
| 3074 % before the first topic whose initial is c | |
| 3075 % \entry {topic}{pagelist} | |
| 3076 % for a topic that is used without subtopics | |
| 3077 % \primary {topic} | |
| 3078 % for the beginning of a topic that is used with subtopics | |
| 3079 % \secondary {subtopic}{pagelist} | |
| 3080 % for each subtopic. | |
| 3081 | |
| 3082 % Define the user-accessible indexing commands | |
| 3083 % @findex, @vindex, @kindex, @cindex. | |
| 3084 | |
| 3085 \def\findex {\fnindex} | |
| 3086 \def\kindex {\kyindex} | |
| 3087 \def\cindex {\cpindex} | |
| 3088 \def\vindex {\vrindex} | |
| 3089 \def\tindex {\tpindex} | |
| 3090 \def\pindex {\pgindex} | |
| 3091 | |
| 3092 \def\cindexsub {\begingroup\obeylines\cindexsub} | |
| 3093 {\obeylines % | |
| 3094 \gdef\cindexsub "#1" #2^^M{\endgroup % | |
| 3095 \dosubind{cp}{#2}{#1}}} | |
| 3096 | |
| 3097 % Define the macros used in formatting output of the sorted index material. | |
| 3098 | |
| 3099 % @printindex causes a particular index (the ??s file) to get printed. | |
| 3100 % It does not print any chapter heading (usually an @unnumbered). | |
| 3101 % | |
| 3102 \def\printindex{\parsearg\doprintindex} | |
| 3103 \def\doprintindex#1{\begingroup | |
| 3104 \dobreak \chapheadingskip{10000}% | |
| 3105 % | |
| 3106 \smallfonts \rm | |
| 3107 \tolerance = 9500 | |
| 3108 \indexbreaks | |
| 3109 % | |
| 3110 % See if the index file exists and is nonempty. | |
| 3111 % Change catcode of @ here so that if the index file contains | |
| 3112 % \initial {@} | |
| 3113 % as its first line, TeX doesn't complain about mismatched braces | |
| 3114 % (because it thinks @} is a control sequence). | |
| 3115 \catcode`\@ = 11 | |
| 3116 \openin 1 \jobname.#1s | |
| 3117 \ifeof 1 | |
| 3118 % \enddoublecolumns gets confused if there is no text in the index, | |
| 3119 % and it loses the chapter title and the aux file entries for the | |
| 3120 % index. The easiest way to prevent this problem is to make sure | |
| 3121 % there is some text. | |
| 3122 \putwordIndexNonexistent | |
| 3123 \else | |
| 3124 % | |
| 3125 % If the index file exists but is empty, then \openin leaves \ifeof | |
| 3126 % false. We have to make TeX try to read something from the file, so | |
| 3127 % it can discover if there is anything in it. | |
| 3128 \read 1 to \temp | |
| 3129 \ifeof 1 | |
| 3130 \putwordIndexIsEmpty | |
| 3131 \else | |
| 3132 % Index files are almost Texinfo source, but we use \ as the escape | |
| 3133 % character. It would be better to use @, but that's too big a change | |
| 3134 % to make right now. | |
| 3135 \def\indexbackslash{\rawbackslashxx}% | |
| 3136 \catcode`\\ = 0 | |
| 3137 \escapechar = `\\ | |
| 3138 \begindoublecolumns | |
| 3139 \input \jobname.#1s | |
| 3140 \enddoublecolumns | |
| 3141 \fi | |
| 3142 \fi | |
| 3143 \closein 1 | |
| 3144 \endgroup} | |
| 3145 | |
| 3146 % These macros are used by the sorted index file itself. | |
| 3147 % Change them to control the appearance of the index. | |
| 3148 | |
| 3149 \def\initial#1{{% | |
| 3150 % Some minor font changes for the special characters. | |
| 3151 \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt | |
| 3152 % | |
| 3153 % Remove any glue we may have, we'll be inserting our own. | |
| 3154 \removelastskip | |
| 3155 % | |
| 3156 % We like breaks before the index initials, so insert a bonus. | |
| 3157 \penalty -300 | |
| 3158 % | |
| 3159 % Typeset the initial. Making this add up to a whole number of | |
| 3160 % baselineskips increases the chance of the dots lining up from column | |
| 3161 % to column. It still won't often be perfect, because of the stretch | |
| 3162 % we need before each entry, but it's better. | |
| 3163 % | |
| 3164 % No shrink because it confuses \balancecolumns. | |
| 3165 \vskip 1.67\baselineskip plus .5\baselineskip | |
| 3166 \leftline{\secbf #1}% | |
| 3167 \vskip .33\baselineskip plus .1\baselineskip | |
| 3168 % | |
| 3169 % Do our best not to break after the initial. | |
| 3170 \nobreak | |
| 3171 }} | |
| 3172 | |
| 3173 % This typesets a paragraph consisting of #1, dot leaders, and then #2 | |
| 3174 % flush to the right margin. It is used for index and table of contents | |
| 3175 % entries. The paragraph is indented by \leftskip. | |
| 3176 % | |
| 3177 \def\entry#1#2{\begingroup | |
| 3178 % | |
| 3179 % Start a new paragraph if necessary, so our assignments below can't | |
| 3180 % affect previous text. | |
| 3181 \par | |
| 3182 % | |
| 3183 % Do not fill out the last line with white space. | |
| 3184 \parfillskip = 0in | |
| 3185 % | |
| 3186 % No extra space above this paragraph. | |
| 3187 \parskip = 0in | |
| 3188 % | |
| 3189 % Do not prefer a separate line ending with a hyphen to fewer lines. | |
| 3190 \finalhyphendemerits = 0 | |
| 3191 % | |
| 3192 % \hangindent is only relevant when the entry text and page number | |
| 3193 % don't both fit on one line. In that case, bob suggests starting the | |
| 3194 % dots pretty far over on the line. Unfortunately, a large | |
| 3195 % indentation looks wrong when the entry text itself is broken across | |
| 3196 % lines. So we use a small indentation and put up with long leaders. | |
| 3197 % | |
| 3198 % \hangafter is reset to 1 (which is the value we want) at the start | |
| 3199 % of each paragraph, so we need not do anything with that. | |
| 3200 \hangindent = 2em | |
| 3201 % | |
| 3202 % When the entry text needs to be broken, just fill out the first line | |
| 3203 % with blank space. | |
| 3204 \rightskip = 0pt plus1fil | |
| 3205 % | |
| 3206 % A bit of stretch before each entry for the benefit of balancing columns. | |
| 3207 \vskip 0pt plus1pt | |
| 3208 % | |
| 3209 % Start a ``paragraph'' for the index entry so the line breaking | |
| 3210 % parameters we've set above will have an effect. | |
| 3211 \noindent | |
| 3212 % | |
| 3213 % Insert the text of the index entry. TeX will do line-breaking on it. | |
| 3214 #1% | |
| 3215 % The following is kludged to not output a line of dots in the index if | |
| 3216 % there are no page numbers. The next person who breaks this will be | |
| 3217 % cursed by a Unix daemon. | |
| 3218 \def\tempa{{\rm }}% | |
| 3219 \def\tempb{#2}% | |
| 3220 \edef\tempc{\tempa}% | |
| 3221 \edef\tempd{\tempb}% | |
| 3222 \ifx\tempc\tempd\ \else% | |
| 3223 % | |
| 3224 % If we must, put the page number on a line of its own, and fill out | |
| 3225 % this line with blank space. (The \hfil is overwhelmed with the | |
| 3226 % fill leaders glue in \indexdotfill if the page number does fit.) | |
| 3227 \hfil\penalty50 | |
| 3228 \null\nobreak\indexdotfill % Have leaders before the page number. | |
| 3229 % | |
| 3230 % The `\ ' here is removed by the implicit \unskip that TeX does as | |
| 3231 % part of (the primitive) \par. Without it, a spurious underfull | |
| 3232 % \hbox ensues. | |
| 3233 \ifpdf | |
| 3234 \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. | |
| 3235 \else | |
| 3236 \ #2% The page number ends the paragraph. | |
| 3237 \fi | |
| 3238 \fi% | |
| 3239 \par | |
| 3240 \endgroup} | |
| 3241 | |
| 3242 % Like \dotfill except takes at least 1 em. | |
| 3243 \def\indexdotfill{\cleaders | |
| 3244 \hbox{$\mathsurround=0pt \mkern1.5mu ${\it .}$ \mkern1.5mu$}\hskip 1em plus 1fill} | |
| 3245 | |
| 3246 \def\primary #1{\line{#1\hfil}} | |
| 3247 | |
| 3248 \newskip\secondaryindent \secondaryindent=0.5cm | |
| 3249 \def\secondary#1#2{{% | |
| 3250 \parfillskip=0in | |
| 3251 \parskip=0in | |
| 3252 \hangindent=1in | |
| 3253 \hangafter=1 | |
| 3254 \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill | |
| 3255 \ifpdf | |
| 3256 \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. | |
| 3257 \else | |
| 3258 #2 | |
| 3259 \fi | |
| 3260 \par | |
| 3261 }} | |
| 3262 | |
| 3263 % Define two-column mode, which we use to typeset indexes. | |
| 3264 % Adapted from the TeXbook, page 416, which is to say, | |
| 3265 % the manmac.tex format used to print the TeXbook itself. | |
| 3266 \catcode`\@=11 | |
| 3267 | |
| 3268 \newbox\partialpage | |
| 3269 \newdimen\doublecolumnhsize | |
| 3270 | |
| 3271 \def\begindoublecolumns{\begingroup % ended by \enddoublecolumns | |
| 3272 % Grab any single-column material above us. | |
| 3273 \output = {% | |
| 3274 % | |
| 3275 % Here is a possibility not foreseen in manmac: if we accumulate a | |
| 3276 % whole lot of material, we might end up calling this \output | |
| 3277 % routine twice in a row (see the doublecol-lose test, which is | |
| 3278 % essentially a couple of indexes with @setchapternewpage off). In | |
| 3279 % that case we just ship out what is in \partialpage with the normal | |
| 3280 % output routine. Generally, \partialpage will be empty when this | |
| 3281 % runs and this will be a no-op. See the indexspread.tex test case. | |
| 3282 \ifvoid\partialpage \else | |
| 3283 \onepageout{\pagecontents\partialpage}% | |
| 3284 \fi | |
| 3285 % | |
| 3286 \global\setbox\partialpage = \vbox{% | |
| 3287 % Unvbox the main output page. | |
| 3288 \unvbox\PAGE | |
| 3289 \kern-\topskip \kern\baselineskip | |
| 3290 }% | |
| 3291 }% | |
| 3292 \eject % run that output routine to set \partialpage | |
| 3293 % | |
| 3294 % Use the double-column output routine for subsequent pages. | |
| 3295 \output = {\doublecolumnout}% | |
| 3296 % | |
| 3297 % Change the page size parameters. We could do this once outside this | |
| 3298 % routine, in each of @smallbook, @afourpaper, and the default 8.5x11 | |
| 3299 % format, but then we repeat the same computation. Repeating a couple | |
| 3300 % of assignments once per index is clearly meaningless for the | |
| 3301 % execution time, so we may as well do it in one place. | |
| 3302 % | |
| 3303 % First we halve the line length, less a little for the gutter between | |
| 3304 % the columns. We compute the gutter based on the line length, so it | |
| 3305 % changes automatically with the paper format. The magic constant | |
| 3306 % below is chosen so that the gutter has the same value (well, +-<1pt) | |
| 3307 % as it did when we hard-coded it. | |
| 3308 % | |
| 3309 % We put the result in a separate register, \doublecolumhsize, so we | |
| 3310 % can restore it in \pagesofar, after \hsize itself has (potentially) | |
| 3311 % been clobbered. | |
| 3312 % | |
| 3313 \doublecolumnhsize = \hsize | |
| 3314 \advance\doublecolumnhsize by -.04154\hsize | |
| 3315 \divide\doublecolumnhsize by 2 | |
| 3316 \hsize = \doublecolumnhsize | |
| 3317 % | |
| 3318 % Double the \vsize as well. (We don't need a separate register here, | |
| 3319 % since nobody clobbers \vsize.) | |
| 3320 \vsize = 2\vsize | |
| 3321 } | |
| 3322 | |
| 3323 % The double-column output routine for all double-column pages except | |
| 3324 % the last. | |
| 3325 % | |
| 3326 \def\doublecolumnout{% | |
| 3327 \splittopskip=\topskip \splitmaxdepth=\maxdepth | |
| 3328 % Get the available space for the double columns -- the normal | |
| 3329 % (undoubled) page height minus any material left over from the | |
| 3330 % previous page. | |
| 3331 \dimen@ = \vsize | |
| 3332 \divide\dimen@ by 2 | |
| 3333 \advance\dimen@ by -\ht\partialpage | |
| 3334 % | |
| 3335 % box0 will be the left-hand column, box2 the right. | |
| 3336 \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ | |
| 3337 \onepageout\pagesofar | |
| 3338 \unvbox255 | |
| 3339 \penalty\outputpenalty | |
| 3340 } | |
| 3341 % | |
| 3342 % Re-output the contents of the output page -- any previous material, | |
| 3343 % followed by the two boxes we just split, in box0 and box2. | |
| 3344 \def\pagesofar{% | |
| 3345 \unvbox\partialpage | |
| 3346 % | |
| 3347 \hsize = \doublecolumnhsize | |
| 3348 \wd0=\hsize \wd2=\hsize | |
| 3349 \hbox to\pagewidth{\box0\hfil\box2}% | |
| 3350 } | |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
47284
diff
changeset
|
3351 % |
| 37713 | 3352 % All done with double columns. |
| 3353 \def\enddoublecolumns{% | |
| 3354 \output = {% | |
| 3355 % Split the last of the double-column material. Leave it on the | |
| 3356 % current page, no automatic page break. | |
| 3357 \balancecolumns | |
| 3358 % | |
| 3359 % If we end up splitting too much material for the current page, | |
| 3360 % though, there will be another page break right after this \output | |
| 3361 % invocation ends. Having called \balancecolumns once, we do not | |
| 3362 % want to call it again. Therefore, reset \output to its normal | |
| 3363 % definition right away. (We hope \balancecolumns will never be | |
| 3364 % called on to balance too much material, but if it is, this makes | |
| 3365 % the output somewhat more palatable.) | |
| 3366 \global\output = {\onepageout{\pagecontents\PAGE}}% | |
| 3367 }% | |
| 3368 \eject | |
| 3369 \endgroup % started in \begindoublecolumns | |
| 3370 % | |
| 3371 % \pagegoal was set to the doubled \vsize above, since we restarted | |
| 3372 % the current page. We're now back to normal single-column | |
| 3373 % typesetting, so reset \pagegoal to the normal \vsize (after the | |
| 3374 % \endgroup where \vsize got restored). | |
| 3375 \pagegoal = \vsize | |
| 3376 } | |
| 3377 % | |
| 3378 % Called at the end of the double column material. | |
| 3379 \def\balancecolumns{% | |
| 3380 \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120. | |
| 3381 \dimen@ = \ht0 | |
| 3382 \advance\dimen@ by \topskip | |
| 3383 \advance\dimen@ by-\baselineskip | |
| 3384 \divide\dimen@ by 2 % target to split to | |
| 3385 %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}% | |
| 3386 \splittopskip = \topskip | |
| 3387 % Loop until we get a decent breakpoint. | |
| 3388 {% | |
| 3389 \vbadness = 10000 | |
| 3390 \loop | |
| 3391 \global\setbox3 = \copy0 | |
| 3392 \global\setbox1 = \vsplit3 to \dimen@ | |
| 3393 \ifdim\ht3>\dimen@ | |
| 3394 \global\advance\dimen@ by 1pt | |
| 3395 \repeat | |
| 3396 }% | |
| 3397 %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}% | |
| 3398 \setbox0=\vbox to\dimen@{\unvbox1}% | |
| 3399 \setbox2=\vbox to\dimen@{\unvbox3}% | |
| 3400 % | |
| 3401 \pagesofar | |
| 3402 } | |
| 3403 \catcode`\@ = \other | |
| 3404 | |
| 3405 | |
| 3406 \message{sectioning,} | |
| 3407 % Chapters, sections, etc. | |
| 3408 | |
| 3409 \newcount\chapno | |
| 3410 \newcount\secno \secno=0 | |
| 3411 \newcount\subsecno \subsecno=0 | |
| 3412 \newcount\subsubsecno \subsubsecno=0 | |
| 3413 | |
| 3414 % This counter is funny since it counts through charcodes of letters A, B, ... | |
| 3415 \newcount\appendixno \appendixno = `\@ | |
| 3416 % \def\appendixletter{\char\the\appendixno} | |
| 3417 % We do the following for the sake of pdftex, which needs the actual | |
| 3418 % letter in the expansion, not just typeset. | |
| 3419 \def\appendixletter{% | |
| 3420 \ifnum\appendixno=`A A% | |
| 3421 \else\ifnum\appendixno=`B B% | |
| 3422 \else\ifnum\appendixno=`C C% | |
| 3423 \else\ifnum\appendixno=`D D% | |
| 3424 \else\ifnum\appendixno=`E E% | |
| 3425 \else\ifnum\appendixno=`F F% | |
| 3426 \else\ifnum\appendixno=`G G% | |
| 3427 \else\ifnum\appendixno=`H H% | |
| 3428 \else\ifnum\appendixno=`I I% | |
| 3429 \else\ifnum\appendixno=`J J% | |
| 3430 \else\ifnum\appendixno=`K K% | |
| 3431 \else\ifnum\appendixno=`L L% | |
| 3432 \else\ifnum\appendixno=`M M% | |
| 3433 \else\ifnum\appendixno=`N N% | |
| 3434 \else\ifnum\appendixno=`O O% | |
| 3435 \else\ifnum\appendixno=`P P% | |
| 3436 \else\ifnum\appendixno=`Q Q% | |
| 3437 \else\ifnum\appendixno=`R R% | |
| 3438 \else\ifnum\appendixno=`S S% | |
| 3439 \else\ifnum\appendixno=`T T% | |
| 3440 \else\ifnum\appendixno=`U U% | |
| 3441 \else\ifnum\appendixno=`V V% | |
| 3442 \else\ifnum\appendixno=`W W% | |
| 3443 \else\ifnum\appendixno=`X X% | |
| 3444 \else\ifnum\appendixno=`Y Y% | |
| 3445 \else\ifnum\appendixno=`Z Z% | |
| 3446 % The \the is necessary, despite appearances, because \appendixletter is | |
| 3447 % expanded while writing the .toc file. \char\appendixno is not | |
| 3448 % expandable, thus it is written literally, thus all appendixes come out | |
| 3449 % with the same letter (or @) in the toc without it. | |
| 3450 \else\char\the\appendixno | |
| 3451 \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi | |
| 3452 \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} | |
| 3453 | |
| 3454 % Each @chapter defines this as the name of the chapter. | |
| 3455 % page headings and footings can use it. @section does likewise. | |
| 3456 \def\thischapter{} | |
| 3457 \def\thissection{} | |
| 3458 | |
| 3459 \newcount\absseclevel % used to calculate proper heading level | |
| 3460 \newcount\secbase\secbase=0 % @raise/lowersections modify this count | |
| 3461 | |
| 3462 % @raisesections: treat @section as chapter, @subsection as section, etc. | |
| 3463 \def\raisesections{\global\advance\secbase by -1} | |
| 3464 \let\up=\raisesections % original BFox name | |
| 3465 | |
| 3466 % @lowersections: treat @chapter as section, @section as subsection, etc. | |
| 3467 \def\lowersections{\global\advance\secbase by 1} | |
| 3468 \let\down=\lowersections % original BFox name | |
| 3469 | |
| 3470 % Choose a numbered-heading macro | |
| 3471 % #1 is heading level if unmodified by @raisesections or @lowersections | |
| 3472 % #2 is text for heading | |
| 3473 \def\numhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1 | |
| 3474 \ifcase\absseclevel | |
| 3475 \chapterzzz{#2} | |
| 3476 \or | |
| 3477 \seczzz{#2} | |
| 3478 \or | |
| 3479 \numberedsubseczzz{#2} | |
| 3480 \or | |
| 3481 \numberedsubsubseczzz{#2} | |
| 3482 \else | |
| 3483 \ifnum \absseclevel<0 | |
| 3484 \chapterzzz{#2} | |
| 3485 \else | |
| 3486 \numberedsubsubseczzz{#2} | |
| 3487 \fi | |
| 3488 \fi | |
| 3489 } | |
| 3490 | |
| 3491 % like \numhead, but chooses appendix heading levels | |
| 3492 \def\apphead#1#2{\absseclevel=\secbase\advance\absseclevel by #1 | |
| 3493 \ifcase\absseclevel | |
| 3494 \appendixzzz{#2} | |
| 3495 \or | |
| 3496 \appendixsectionzzz{#2} | |
| 3497 \or | |
| 3498 \appendixsubseczzz{#2} | |
| 3499 \or | |
| 3500 \appendixsubsubseczzz{#2} | |
| 3501 \else | |
| 3502 \ifnum \absseclevel<0 | |
| 3503 \appendixzzz{#2} | |
| 3504 \else | |
| 3505 \appendixsubsubseczzz{#2} | |
| 3506 \fi | |
| 3507 \fi | |
| 3508 } | |
| 3509 | |
| 3510 % like \numhead, but chooses numberless heading levels | |
| 3511 \def\unnmhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1 | |
| 3512 \ifcase\absseclevel | |
| 3513 \unnumberedzzz{#2} | |
| 3514 \or | |
| 3515 \unnumberedseczzz{#2} | |
| 3516 \or | |
| 3517 \unnumberedsubseczzz{#2} | |
| 3518 \or | |
| 3519 \unnumberedsubsubseczzz{#2} | |
| 3520 \else | |
| 3521 \ifnum \absseclevel<0 | |
| 3522 \unnumberedzzz{#2} | |
| 3523 \else | |
| 3524 \unnumberedsubsubseczzz{#2} | |
| 3525 \fi | |
| 3526 \fi | |
| 3527 } | |
| 3528 | |
| 3529 % @chapter, @appendix, @unnumbered. | |
| 3530 \def\thischaptername{No Chapter Title} | |
| 3531 \outer\def\chapter{\parsearg\chapteryyy} | |
| 3532 \def\chapteryyy #1{\numhead0{#1}} % normally numhead0 calls chapterzzz | |
| 3533 \def\chapterzzz #1{% | |
| 3534 \secno=0 \subsecno=0 \subsubsecno=0 | |
| 3535 \global\advance \chapno by 1 \message{\putwordChapter\space \the\chapno}% | |
| 3536 \chapmacro {#1}{\the\chapno}% | |
| 3537 \gdef\thissection{#1}% | |
| 3538 \gdef\thischaptername{#1}% | |
| 3539 % We don't substitute the actual chapter name into \thischapter | |
| 3540 % because we don't want its macros evaluated now. | |
| 3541 \xdef\thischapter{\putwordChapter{} \the\chapno: \noexpand\thischaptername}% | |
| 3542 \toks0 = {#1}% | |
| 3543 \edef\temp{\noexpand\writetocentry{\realbackslash chapentry{\the\toks0}% | |
| 3544 {\the\chapno}}}% | |
| 3545 \temp | |
| 3546 \donoderef | |
| 3547 \global\let\section = \numberedsec | |
| 3548 \global\let\subsection = \numberedsubsec | |
| 3549 \global\let\subsubsection = \numberedsubsubsec | |
| 3550 } | |
| 3551 | |
| 3552 \outer\def\appendix{\parsearg\appendixyyy} | |
| 3553 \def\appendixyyy #1{\apphead0{#1}} % normally apphead0 calls appendixzzz | |
| 3554 \def\appendixzzz #1{% | |
| 3555 \secno=0 \subsecno=0 \subsubsecno=0 | |
| 3556 \global\advance \appendixno by 1 | |
| 3557 \message{\putwordAppendix\space \appendixletter}% | |
| 3558 \chapmacro {#1}{\putwordAppendix{} \appendixletter}% | |
| 3559 \gdef\thissection{#1}% | |
| 3560 \gdef\thischaptername{#1}% | |
| 3561 \xdef\thischapter{\putwordAppendix{} \appendixletter: \noexpand\thischaptername}% | |
| 3562 \toks0 = {#1}% | |
| 47284 | 3563 \edef\temp{\noexpand\writetocentry{\realbackslash appendixentry{\the\toks0}% |
| 3564 {\appendixletter}}}% | |
| 37713 | 3565 \temp |
| 3566 \appendixnoderef | |
| 3567 \global\let\section = \appendixsec | |
| 3568 \global\let\subsection = \appendixsubsec | |
| 3569 \global\let\subsubsection = \appendixsubsubsec | |
| 3570 } | |
| 3571 | |
| 3572 % @centerchap is like @unnumbered, but the heading is centered. | |
| 3573 \outer\def\centerchap{\parsearg\centerchapyyy} | |
| 3574 \def\centerchapyyy #1{{\let\unnumbchapmacro=\centerchapmacro \unnumberedyyy{#1}}} | |
| 3575 | |
| 3576 % @top is like @unnumbered. | |
| 3577 \outer\def\top{\parsearg\unnumberedyyy} | |
| 3578 | |
| 3579 \outer\def\unnumbered{\parsearg\unnumberedyyy} | |
| 3580 \def\unnumberedyyy #1{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz | |
| 3581 \def\unnumberedzzz #1{% | |
| 3582 \secno=0 \subsecno=0 \subsubsecno=0 | |
| 3583 % | |
| 3584 % This used to be simply \message{#1}, but TeX fully expands the | |
| 3585 % argument to \message. Therefore, if #1 contained @-commands, TeX | |
| 3586 % expanded them. For example, in `@unnumbered The @cite{Book}', TeX | |
| 3587 % expanded @cite (which turns out to cause errors because \cite is meant | |
| 3588 % to be executed, not expanded). | |
| 3589 % | |
| 3590 % Anyway, we don't want the fully-expanded definition of @cite to appear | |
| 3591 % as a result of the \message, we just want `@cite' itself. We use | |
| 3592 % \the<toks register> to achieve this: TeX expands \the<toks> only once, | |
| 3593 % simply yielding the contents of <toks register>. (We also do this for | |
| 3594 % the toc entries.) | |
| 3595 \toks0 = {#1}\message{(\the\toks0)}% | |
| 3596 % | |
| 3597 \unnumbchapmacro {#1}% | |
| 3598 \gdef\thischapter{#1}\gdef\thissection{#1}% | |
| 3599 \toks0 = {#1}% | |
| 3600 \edef\temp{\noexpand\writetocentry{\realbackslash unnumbchapentry{\the\toks0}}}% | |
| 3601 \temp | |
| 3602 \unnumbnoderef | |
| 3603 \global\let\section = \unnumberedsec | |
| 3604 \global\let\subsection = \unnumberedsubsec | |
| 3605 \global\let\subsubsection = \unnumberedsubsubsec | |
| 3606 } | |
| 3607 | |
| 3608 % Sections. | |
| 3609 \outer\def\numberedsec{\parsearg\secyyy} | |
| 3610 \def\secyyy #1{\numhead1{#1}} % normally calls seczzz | |
| 3611 \def\seczzz #1{% | |
| 3612 \subsecno=0 \subsubsecno=0 \global\advance \secno by 1 % | |
| 3613 \gdef\thissection{#1}\secheading {#1}{\the\chapno}{\the\secno}% | |
| 3614 \toks0 = {#1}% | |
| 3615 \edef\temp{\noexpand\writetocentry{\realbackslash secentry{\the\toks0}% | |
| 3616 {\the\chapno}{\the\secno}}}% | |
| 3617 \temp | |
| 3618 \donoderef | |
| 3619 \nobreak | |
| 3620 } | |
| 3621 | |
| 3622 \outer\def\appendixsection{\parsearg\appendixsecyyy} | |
| 3623 \outer\def\appendixsec{\parsearg\appendixsecyyy} | |
| 3624 \def\appendixsecyyy #1{\apphead1{#1}} % normally calls appendixsectionzzz | |
| 3625 \def\appendixsectionzzz #1{% | |
| 3626 \subsecno=0 \subsubsecno=0 \global\advance \secno by 1 % | |
| 3627 \gdef\thissection{#1}\secheading {#1}{\appendixletter}{\the\secno}% | |
| 3628 \toks0 = {#1}% | |
| 3629 \edef\temp{\noexpand\writetocentry{\realbackslash secentry{\the\toks0}% | |
| 3630 {\appendixletter}{\the\secno}}}% | |
| 3631 \temp | |
| 3632 \appendixnoderef | |
| 3633 \nobreak | |
| 3634 } | |
| 3635 | |
| 3636 \outer\def\unnumberedsec{\parsearg\unnumberedsecyyy} | |
| 3637 \def\unnumberedsecyyy #1{\unnmhead1{#1}} % normally calls unnumberedseczzz | |
| 3638 \def\unnumberedseczzz #1{% | |
| 3639 \plainsecheading {#1}\gdef\thissection{#1}% | |
| 3640 \toks0 = {#1}% | |
| 47284 | 3641 \edef\temp{\noexpand\writetocentry{\realbackslash unnumbsecentry% |
| 3642 {\the\toks0}{\the\chapno}}}% | |
| 37713 | 3643 \temp |
| 3644 \unnumbnoderef | |
| 3645 \nobreak | |
| 3646 } | |
| 3647 | |
| 3648 % Subsections. | |
| 3649 \outer\def\numberedsubsec{\parsearg\numberedsubsecyyy} | |
| 3650 \def\numberedsubsecyyy #1{\numhead2{#1}} % normally calls numberedsubseczzz | |
| 3651 \def\numberedsubseczzz #1{% | |
| 3652 \gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 % | |
| 3653 \subsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}% | |
| 3654 \toks0 = {#1}% | |
| 3655 \edef\temp{\noexpand\writetocentry{\realbackslash subsecentry{\the\toks0}% | |
| 3656 {\the\chapno}{\the\secno}{\the\subsecno}}}% | |
| 3657 \temp | |
| 3658 \donoderef | |
| 3659 \nobreak | |
| 3660 } | |
| 3661 | |
| 3662 \outer\def\appendixsubsec{\parsearg\appendixsubsecyyy} | |
| 3663 \def\appendixsubsecyyy #1{\apphead2{#1}} % normally calls appendixsubseczzz | |
| 3664 \def\appendixsubseczzz #1{% | |
| 3665 \gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 % | |
| 3666 \subsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}% | |
| 3667 \toks0 = {#1}% | |
| 3668 \edef\temp{\noexpand\writetocentry{\realbackslash subsecentry{\the\toks0}% | |
| 3669 {\appendixletter}{\the\secno}{\the\subsecno}}}% | |
| 3670 \temp | |
| 3671 \appendixnoderef | |
| 3672 \nobreak | |
| 3673 } | |
| 3674 | |
| 3675 \outer\def\unnumberedsubsec{\parsearg\unnumberedsubsecyyy} | |
| 3676 \def\unnumberedsubsecyyy #1{\unnmhead2{#1}} %normally calls unnumberedsubseczzz | |
| 3677 \def\unnumberedsubseczzz #1{% | |
| 3678 \plainsubsecheading {#1}\gdef\thissection{#1}% | |
| 3679 \toks0 = {#1}% | |
| 3680 \edef\temp{\noexpand\writetocentry{\realbackslash unnumbsubsecentry% | |
| 47284 | 3681 {\the\toks0}{\the\chapno}{\the\secno}}}% |
| 37713 | 3682 \temp |
| 3683 \unnumbnoderef | |
| 3684 \nobreak | |
| 3685 } | |
| 3686 | |
| 3687 % Subsubsections. | |
| 3688 \outer\def\numberedsubsubsec{\parsearg\numberedsubsubsecyyy} | |
| 3689 \def\numberedsubsubsecyyy #1{\numhead3{#1}} % normally numberedsubsubseczzz | |
| 3690 \def\numberedsubsubseczzz #1{% | |
| 3691 \gdef\thissection{#1}\global\advance \subsubsecno by 1 % | |
| 3692 \subsubsecheading {#1} | |
| 3693 {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}% | |
| 3694 \toks0 = {#1}% | |
| 3695 \edef\temp{\noexpand\writetocentry{\realbackslash subsubsecentry{\the\toks0}% | |
| 3696 {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}}}% | |
| 3697 \temp | |
| 3698 \donoderef | |
| 3699 \nobreak | |
| 3700 } | |
| 3701 | |
| 3702 \outer\def\appendixsubsubsec{\parsearg\appendixsubsubsecyyy} | |
| 3703 \def\appendixsubsubsecyyy #1{\apphead3{#1}} % normally appendixsubsubseczzz | |
| 3704 \def\appendixsubsubseczzz #1{% | |
| 3705 \gdef\thissection{#1}\global\advance \subsubsecno by 1 % | |
| 3706 \subsubsecheading {#1} | |
| 3707 {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}% | |
| 3708 \toks0 = {#1}% | |
| 3709 \edef\temp{\noexpand\writetocentry{\realbackslash subsubsecentry{\the\toks0}% | |
| 3710 {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}}}% | |
| 3711 \temp | |
| 3712 \appendixnoderef | |
| 3713 \nobreak | |
| 3714 } | |
| 3715 | |
| 3716 \outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubsecyyy} | |
| 3717 \def\unnumberedsubsubsecyyy #1{\unnmhead3{#1}} %normally unnumberedsubsubseczzz | |
| 3718 \def\unnumberedsubsubseczzz #1{% | |
| 3719 \plainsubsubsecheading {#1}\gdef\thissection{#1}% | |
| 3720 \toks0 = {#1}% | |
| 3721 \edef\temp{\noexpand\writetocentry{\realbackslash unnumbsubsubsecentry% | |
| 47284 | 3722 {\the\toks0}{\the\chapno}{\the\secno}{\the\subsecno}}}% |
| 37713 | 3723 \temp |
| 3724 \unnumbnoderef | |
| 3725 \nobreak | |
| 3726 } | |
| 3727 | |
| 3728 % These are variants which are not "outer", so they can appear in @ifinfo. | |
| 3729 % Actually, they should now be obsolete; ordinary section commands should work. | |
| 3730 \def\infotop{\parsearg\unnumberedzzz} | |
| 3731 \def\infounnumbered{\parsearg\unnumberedzzz} | |
| 3732 \def\infounnumberedsec{\parsearg\unnumberedseczzz} | |
| 3733 \def\infounnumberedsubsec{\parsearg\unnumberedsubseczzz} | |
| 3734 \def\infounnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz} | |
| 3735 | |
| 3736 \def\infoappendix{\parsearg\appendixzzz} | |
| 3737 \def\infoappendixsec{\parsearg\appendixseczzz} | |
| 3738 \def\infoappendixsubsec{\parsearg\appendixsubseczzz} | |
| 3739 \def\infoappendixsubsubsec{\parsearg\appendixsubsubseczzz} | |
| 3740 | |
| 3741 \def\infochapter{\parsearg\chapterzzz} | |
| 3742 \def\infosection{\parsearg\sectionzzz} | |
| 3743 \def\infosubsection{\parsearg\subsectionzzz} | |
| 3744 \def\infosubsubsection{\parsearg\subsubsectionzzz} | |
| 3745 | |
| 3746 % These macros control what the section commands do, according | |
| 3747 % to what kind of chapter we are in (ordinary, appendix, or unnumbered). | |
| 3748 % Define them by default for a numbered chapter. | |
| 3749 \global\let\section = \numberedsec | |
| 3750 \global\let\subsection = \numberedsubsec | |
| 3751 \global\let\subsubsection = \numberedsubsubsec | |
| 3752 | |
| 3753 % Define @majorheading, @heading and @subheading | |
| 3754 | |
| 3755 % NOTE on use of \vbox for chapter headings, section headings, and such: | |
| 3756 % 1) We use \vbox rather than the earlier \line to permit | |
| 3757 % overlong headings to fold. | |
| 3758 % 2) \hyphenpenalty is set to 10000 because hyphenation in a | |
| 3759 % heading is obnoxious; this forbids it. | |
| 3760 % 3) Likewise, headings look best if no \parindent is used, and | |
| 3761 % if justification is not attempted. Hence \raggedright. | |
| 3762 | |
| 3763 | |
| 3764 \def\majorheading{\parsearg\majorheadingzzz} | |
| 3765 \def\majorheadingzzz #1{% | |
| 3766 {\advance\chapheadingskip by 10pt \chapbreak }% | |
| 3767 {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 | |
| 3768 \parindent=0pt\raggedright | |
| 3769 \rm #1\hfill}}\bigskip \par\penalty 200} | |
| 3770 | |
| 3771 \def\chapheading{\parsearg\chapheadingzzz} | |
| 3772 \def\chapheadingzzz #1{\chapbreak % | |
| 3773 {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 | |
| 3774 \parindent=0pt\raggedright | |
| 3775 \rm #1\hfill}}\bigskip \par\penalty 200} | |
| 3776 | |
| 3777 % @heading, @subheading, @subsubheading. | |
| 3778 \def\heading{\parsearg\plainsecheading} | |
| 3779 \def\subheading{\parsearg\plainsubsecheading} | |
| 3780 \def\subsubheading{\parsearg\plainsubsubsecheading} | |
| 3781 | |
| 3782 % These macros generate a chapter, section, etc. heading only | |
| 3783 % (including whitespace, linebreaking, etc. around it), | |
| 3784 % given all the information in convenient, parsed form. | |
| 3785 | |
| 3786 %%% Args are the skip and penalty (usually negative) | |
| 3787 \def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} | |
| 3788 | |
| 3789 \def\setchapterstyle #1 {\csname CHAPF#1\endcsname} | |
| 3790 | |
| 3791 %%% Define plain chapter starts, and page on/off switching for it | |
| 3792 % Parameter controlling skip before chapter headings (if needed) | |
| 3793 | |
| 3794 \newskip\chapheadingskip | |
| 3795 | |
| 3796 \def\chapbreak{\dobreak \chapheadingskip {-4000}} | |
| 3797 \def\chappager{\par\vfill\supereject} | |
| 3798 \def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi} | |
| 3799 | |
| 3800 \def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} | |
| 3801 | |
| 3802 \def\CHAPPAGoff{% | |
| 3803 \global\let\contentsalignmacro = \chappager | |
| 3804 \global\let\pchapsepmacro=\chapbreak | |
| 3805 \global\let\pagealignmacro=\chappager} | |
| 3806 | |
| 3807 \def\CHAPPAGon{% | |
| 3808 \global\let\contentsalignmacro = \chappager | |
| 3809 \global\let\pchapsepmacro=\chappager | |
| 3810 \global\let\pagealignmacro=\chappager | |
| 3811 \global\def\HEADINGSon{\HEADINGSsingle}} | |
| 3812 | |
| 3813 \def\CHAPPAGodd{ | |
| 3814 \global\let\contentsalignmacro = \chapoddpage | |
| 3815 \global\let\pchapsepmacro=\chapoddpage | |
| 3816 \global\let\pagealignmacro=\chapoddpage | |
| 3817 \global\def\HEADINGSon{\HEADINGSdouble}} | |
| 3818 | |
| 3819 \CHAPPAGon | |
| 3820 | |
| 3821 \def\CHAPFplain{ | |
| 3822 \global\let\chapmacro=\chfplain | |
| 3823 \global\let\unnumbchapmacro=\unnchfplain | |
| 3824 \global\let\centerchapmacro=\centerchfplain} | |
| 3825 | |
| 3826 % Plain chapter opening. | |
| 3827 % #1 is the text, #2 the chapter number or empty if unnumbered. | |
| 3828 \def\chfplain#1#2{% | |
| 3829 \pchapsepmacro | |
| 3830 {% | |
| 3831 \chapfonts \rm | |
| 3832 \def\chapnum{#2}% | |
| 3833 \setbox0 = \hbox{#2\ifx\chapnum\empty\else\enspace\fi}% | |
| 3834 \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright | |
| 3835 \hangindent = \wd0 \centerparametersmaybe | |
| 3836 \unhbox0 #1\par}% | |
| 3837 }% | |
| 3838 \nobreak\bigskip % no page break after a chapter title | |
| 3839 \nobreak | |
| 3840 } | |
| 3841 | |
| 3842 % Plain opening for unnumbered. | |
| 3843 \def\unnchfplain#1{\chfplain{#1}{}} | |
| 3844 | |
| 3845 % @centerchap -- centered and unnumbered. | |
| 3846 \let\centerparametersmaybe = \relax | |
| 3847 \def\centerchfplain#1{{% | |
| 3848 \def\centerparametersmaybe{% | |
| 3849 \advance\rightskip by 3\rightskip | |
| 3850 \leftskip = \rightskip | |
| 3851 \parfillskip = 0pt | |
| 3852 }% | |
| 3853 \chfplain{#1}{}% | |
| 3854 }} | |
| 3855 | |
| 3856 \CHAPFplain % The default | |
| 3857 | |
| 3858 \def\unnchfopen #1{% | |
| 3859 \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 | |
| 3860 \parindent=0pt\raggedright | |
| 3861 \rm #1\hfill}}\bigskip \par\nobreak | |
| 3862 } | |
| 3863 | |
| 3864 \def\chfopen #1#2{\chapoddpage {\chapfonts | |
| 3865 \vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% | |
| 3866 \par\penalty 5000 % | |
| 3867 } | |
| 3868 | |
| 3869 \def\centerchfopen #1{% | |
| 3870 \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 | |
| 3871 \parindent=0pt | |
| 3872 \hfill {\rm #1}\hfill}}\bigskip \par\nobreak | |
| 3873 } | |
| 3874 | |
| 3875 \def\CHAPFopen{ | |
| 3876 \global\let\chapmacro=\chfopen | |
| 3877 \global\let\unnumbchapmacro=\unnchfopen | |
| 3878 \global\let\centerchapmacro=\centerchfopen} | |
| 3879 | |
| 3880 | |
| 3881 % Section titles. | |
| 3882 \newskip\secheadingskip | |
| 3883 \def\secheadingbreak{\dobreak \secheadingskip {-1000}} | |
| 3884 \def\secheading#1#2#3{\sectionheading{sec}{#2.#3}{#1}} | |
| 3885 \def\plainsecheading#1{\sectionheading{sec}{}{#1}} | |
| 3886 | |
| 3887 % Subsection titles. | |
| 3888 \newskip \subsecheadingskip | |
| 3889 \def\subsecheadingbreak{\dobreak \subsecheadingskip {-500}} | |
| 3890 \def\subsecheading#1#2#3#4{\sectionheading{subsec}{#2.#3.#4}{#1}} | |
| 3891 \def\plainsubsecheading#1{\sectionheading{subsec}{}{#1}} | |
| 3892 | |
| 3893 % Subsubsection titles. | |
| 3894 \let\subsubsecheadingskip = \subsecheadingskip | |
| 3895 \let\subsubsecheadingbreak = \subsecheadingbreak | |
| 3896 \def\subsubsecheading#1#2#3#4#5{\sectionheading{subsubsec}{#2.#3.#4.#5}{#1}} | |
| 3897 \def\plainsubsubsecheading#1{\sectionheading{subsubsec}{}{#1}} | |
| 3898 | |
| 3899 | |
| 3900 % Print any size section title. | |
| 3901 % | |
| 3902 % #1 is the section type (sec/subsec/subsubsec), #2 is the section | |
| 3903 % number (maybe empty), #3 the text. | |
| 3904 \def\sectionheading#1#2#3{% | |
| 3905 {% | |
| 3906 \expandafter\advance\csname #1headingskip\endcsname by \parskip | |
| 3907 \csname #1headingbreak\endcsname | |
| 3908 }% | |
| 3909 {% | |
| 3910 % Switch to the right set of fonts. | |
| 3911 \csname #1fonts\endcsname \rm | |
| 3912 % | |
| 3913 % Only insert the separating space if we have a section number. | |
| 3914 \def\secnum{#2}% | |
| 3915 \setbox0 = \hbox{#2\ifx\secnum\empty\else\enspace\fi}% | |
| 3916 % | |
| 3917 \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright | |
| 3918 \hangindent = \wd0 % zero if no section number | |
| 3919 \unhbox0 #3}% | |
| 3920 }% | |
| 3921 \ifdim\parskip<10pt \nobreak\kern10pt\nobreak\kern-\parskip\fi \nobreak | |
| 3922 } | |
| 3923 | |
| 3924 | |
| 3925 \message{toc,} | |
| 3926 % Table of contents. | |
| 3927 \newwrite\tocfile | |
| 3928 | |
| 3929 % Write an entry to the toc file, opening it if necessary. | |
| 3930 % Called from @chapter, etc. We supply {\folio} at the end of the | |
| 3931 % argument, which will end up as the last argument to the \...entry macro. | |
| 3932 % | |
| 3933 % We open the .toc file here instead of at @setfilename or any other | |
| 47284 | 3934 % fixed time so that @contents can be put in the document anywhere. |
| 37713 | 3935 % |
| 3936 \newif\iftocfileopened | |
| 3937 \def\writetocentry#1{% | |
| 3938 \iftocfileopened\else | |
| 3939 \immediate\openout\tocfile = \jobname.toc | |
| 3940 \global\tocfileopenedtrue | |
| 3941 \fi | |
| 3942 \iflinks \write\tocfile{#1{\folio}}\fi | |
| 47284 | 3943 % |
| 3944 % Tell \shipout to create a page destination if we're doing pdf, which | |
| 3945 % will be the target of the links in the table of contents. We can't | |
| 3946 % just do it on every page because the title pages are numbered 1 and | |
| 3947 % 2 (the page numbers aren't printed), and so are the first two pages | |
| 3948 % of the document. Thus, we'd have two destinations named `1', and | |
| 3949 % two named `2'. | |
| 3950 \ifpdf \pdfmakepagedesttrue \fi | |
| 37713 | 3951 } |
| 3952 | |
| 3953 \newskip\contentsrightmargin \contentsrightmargin=1in | |
| 3954 \newcount\savepageno | |
| 3955 \newcount\lastnegativepageno \lastnegativepageno = -1 | |
| 3956 | |
| 3957 % Finish up the main text and prepare to read what we've written | |
| 3958 % to \tocfile. | |
| 3959 % | |
| 3960 \def\startcontents#1{% | |
| 3961 % If @setchapternewpage on, and @headings double, the contents should | |
| 3962 % start on an odd page, unlike chapters. Thus, we maintain | |
| 3963 % \contentsalignmacro in parallel with \pagealignmacro. | |
| 3964 % From: Torbjorn Granlund <tege@matematik.su.se> | |
| 3965 \contentsalignmacro | |
| 3966 \immediate\closeout\tocfile | |
| 3967 % | |
| 3968 % Don't need to put `Contents' or `Short Contents' in the headline. | |
| 3969 % It is abundantly clear what they are. | |
| 3970 \unnumbchapmacro{#1}\def\thischapter{}% | |
| 3971 \savepageno = \pageno | |
| 3972 \begingroup % Set up to handle contents files properly. | |
| 3973 \catcode`\\=0 \catcode`\{=1 \catcode`\}=2 \catcode`\@=11 | |
| 3974 % We can't do this, because then an actual ^ in a section | |
| 3975 % title fails, e.g., @chapter ^ -- exponentiation. --karl, 9jul97. | |
| 3976 %\catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi | |
| 3977 \raggedbottom % Worry more about breakpoints than the bottom. | |
| 3978 \advance\hsize by -\contentsrightmargin % Don't use the full line length. | |
| 3979 % | |
| 3980 % Roman numerals for page numbers. | |
| 3981 \ifnum \pageno>0 \pageno = \lastnegativepageno \fi | |
| 3982 } | |
| 3983 | |
| 3984 | |
| 3985 % Normal (long) toc. | |
| 3986 \def\contents{% | |
| 3987 \startcontents{\putwordTOC}% | |
| 3988 \openin 1 \jobname.toc | |
| 3989 \ifeof 1 \else | |
| 3990 \closein 1 | |
| 3991 \input \jobname.toc | |
| 3992 \fi | |
| 3993 \vfill \eject | |
| 3994 \contentsalignmacro % in case @setchapternewpage odd is in effect | |
| 3995 \pdfmakeoutlines | |
| 3996 \endgroup | |
| 3997 \lastnegativepageno = \pageno | |
| 3998 \pageno = \savepageno | |
| 3999 } | |
| 4000 | |
| 4001 % And just the chapters. | |
| 4002 \def\summarycontents{% | |
| 4003 \startcontents{\putwordShortTOC}% | |
| 4004 % | |
| 4005 \let\chapentry = \shortchapentry | |
| 47284 | 4006 \let\appendixentry = \shortappendixentry |
| 37713 | 4007 \let\unnumbchapentry = \shortunnumberedentry |
| 4008 % We want a true roman here for the page numbers. | |
| 4009 \secfonts | |
| 4010 \let\rm=\shortcontrm \let\bf=\shortcontbf \let\sl=\shortcontsl | |
| 4011 \rm | |
| 4012 \hyphenpenalty = 10000 | |
| 4013 \advance\baselineskip by 1pt % Open it up a little. | |
| 4014 \def\secentry ##1##2##3##4{} | |
| 47284 | 4015 \def\unnumbsecentry ##1##2##3{} |
| 37713 | 4016 \def\subsecentry ##1##2##3##4##5{} |
| 47284 | 4017 \def\unnumbsubsecentry ##1##2##3##4{} |
| 37713 | 4018 \def\subsubsecentry ##1##2##3##4##5##6{} |
| 47284 | 4019 \def\unnumbsubsubsecentry ##1##2##3##4##5{} |
| 37713 | 4020 \openin 1 \jobname.toc |
| 4021 \ifeof 1 \else | |
| 4022 \closein 1 | |
| 4023 \input \jobname.toc | |
| 4024 \fi | |
| 4025 \vfill \eject | |
| 4026 \contentsalignmacro % in case @setchapternewpage odd is in effect | |
| 4027 \endgroup | |
| 4028 \lastnegativepageno = \pageno | |
| 4029 \pageno = \savepageno | |
| 4030 } | |
| 4031 \let\shortcontents = \summarycontents | |
| 4032 | |
| 4033 \ifpdf | |
| 4034 \pdfcatalog{/PageMode /UseOutlines}% | |
| 4035 \fi | |
| 4036 | |
| 4037 % These macros generate individual entries in the table of contents. | |
| 4038 % The first argument is the chapter or section name. | |
| 4039 % The last argument is the page number. | |
| 4040 % The arguments in between are the chapter number, section number, ... | |
| 4041 | |
| 47284 | 4042 % Chapters, in the main contents. |
| 37713 | 4043 \def\chapentry#1#2#3{\dochapentry{#2\labelspace#1}{#3}} |
| 47284 | 4044 % |
| 4045 % Chapters, in the short toc. | |
| 4046 % See comments in \dochapentry re vbox and related settings. | |
| 37713 | 4047 \def\shortchapentry#1#2#3{% |
| 4048 \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#3\egroup}% | |
| 4049 } | |
| 4050 | |
| 47284 | 4051 % Appendices, in the main contents. |
| 4052 \def\appendixentry#1#2#3{\dochapentry{\putwordAppendix{} #2\labelspace#1}{#3}} | |
| 4053 % | |
| 4054 % Appendices, in the short toc. | |
| 4055 \let\shortappendixentry = \shortchapentry | |
| 4056 | |
| 37713 | 4057 % Typeset the label for a chapter or appendix for the short contents. |
| 47284 | 4058 % The arg is, e.g., `Appendix A' for an appendix, or `3' for a chapter. |
| 37713 | 4059 % We could simplify the code here by writing out an \appendixentry |
| 4060 % command in the toc file for appendices, instead of using \chapentry | |
| 4061 % for both, but it doesn't seem worth it. | |
| 4062 % | |
| 4063 \newdimen\shortappendixwidth | |
| 4064 % | |
| 4065 \def\shortchaplabel#1{% | |
| 47284 | 4066 % This space should be enough, since a single number is .5em, and the |
| 37713 | 4067 % widest letter (M) is 1em, at least in the Computer Modern fonts. |
| 47284 | 4068 % But use \hss just in case. |
| 37713 | 4069 % (This space doesn't include the extra space that gets added after |
| 4070 % the label; that gets put in by \shortchapentry above.) | |
| 47284 | 4071 \dimen0 = 1em |
| 4072 \hbox to \dimen0{#1\hss}% | |
| 4073 } | |
| 4074 | |
| 4075 % Unnumbered chapters. | |
| 37713 | 4076 \def\unnumbchapentry#1#2{\dochapentry{#1}{#2}} |
| 4077 \def\shortunnumberedentry#1#2{\tocentry{#1}{\doshortpageno\bgroup#2\egroup}} | |
| 4078 | |
| 4079 % Sections. | |
| 4080 \def\secentry#1#2#3#4{\dosecentry{#2.#3\labelspace#1}{#4}} | |
| 47284 | 4081 \def\unnumbsecentry#1#2#3{\dosecentry{#1}{#3}} |
| 37713 | 4082 |
| 4083 % Subsections. | |
| 4084 \def\subsecentry#1#2#3#4#5{\dosubsecentry{#2.#3.#4\labelspace#1}{#5}} | |
| 47284 | 4085 \def\unnumbsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}} |
| 37713 | 4086 |
| 4087 % And subsubsections. | |
| 4088 \def\subsubsecentry#1#2#3#4#5#6{% | |
| 4089 \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}{#6}} | |
| 47284 | 4090 \def\unnumbsubsubsecentry#1#2#3#4#5{\dosubsubsecentry{#1}{#5}} |
| 37713 | 4091 |
| 4092 % This parameter controls the indentation of the various levels. | |
| 4093 \newdimen\tocindent \tocindent = 3pc | |
| 4094 | |
| 4095 % Now for the actual typesetting. In all these, #1 is the text and #2 is the | |
| 4096 % page number. | |
| 4097 % | |
| 4098 % If the toc has to be broken over pages, we want it to be at chapters | |
| 4099 % if at all possible; hence the \penalty. | |
| 4100 \def\dochapentry#1#2{% | |
| 4101 \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip | |
| 4102 \begingroup | |
| 4103 \chapentryfonts | |
| 4104 \tocentry{#1}{\dopageno\bgroup#2\egroup}% | |
| 4105 \endgroup | |
| 4106 \nobreak\vskip .25\baselineskip plus.1\baselineskip | |
| 4107 } | |
| 4108 | |
| 4109 \def\dosecentry#1#2{\begingroup | |
| 4110 \secentryfonts \leftskip=\tocindent | |
| 4111 \tocentry{#1}{\dopageno\bgroup#2\egroup}% | |
| 4112 \endgroup} | |
| 4113 | |
| 4114 \def\dosubsecentry#1#2{\begingroup | |
| 4115 \subsecentryfonts \leftskip=2\tocindent | |
| 4116 \tocentry{#1}{\dopageno\bgroup#2\egroup}% | |
| 4117 \endgroup} | |
| 4118 | |
| 4119 \def\dosubsubsecentry#1#2{\begingroup | |
| 4120 \subsubsecentryfonts \leftskip=3\tocindent | |
| 4121 \tocentry{#1}{\dopageno\bgroup#2\egroup}% | |
| 4122 \endgroup} | |
| 4123 | |
| 4124 % Final typesetting of a toc entry; we use the same \entry macro as for | |
| 4125 % the index entries, but we want to suppress hyphenation here. (We | |
| 4126 % can't do that in the \entry macro, since index entries might consist | |
| 4127 % of hyphenated-identifiers-that-do-not-fit-on-a-line-and-nothing-else.) | |
| 4128 \def\tocentry#1#2{\begingroup | |
| 4129 \vskip 0pt plus1pt % allow a little stretch for the sake of nice page breaks | |
| 4130 % Do not use \turnoffactive in these arguments. Since the toc is | |
| 47284 | 4131 % typeset in cmr, characters such as _ would come out wrong; we |
| 37713 | 4132 % have to do the usual translation tricks. |
| 4133 \entry{#1}{#2}% | |
| 4134 \endgroup} | |
| 4135 | |
| 4136 % Space between chapter (or whatever) number and the title. | |
| 4137 \def\labelspace{\hskip1em \relax} | |
| 4138 | |
| 4139 \def\dopageno#1{{\rm #1}} | |
| 4140 \def\doshortpageno#1{{\rm #1}} | |
| 4141 | |
| 4142 \def\chapentryfonts{\secfonts \rm} | |
| 4143 \def\secentryfonts{\textfonts} | |
| 4144 \let\subsecentryfonts = \textfonts | |
| 4145 \let\subsubsecentryfonts = \textfonts | |
| 4146 | |
| 4147 | |
| 4148 \message{environments,} | |
| 4149 % @foo ... @end foo. | |
| 4150 | |
| 47284 | 4151 % @point{}, @result{}, @expansion{}, @print{}, @equiv{}. |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
47284
diff
changeset
|
4152 % |
| 37713 | 4153 % Since these characters are used in examples, it should be an even number of |
| 4154 % \tt widths. Each \tt character is 1en, so two makes it 1em. | |
| 47284 | 4155 % |
| 37713 | 4156 \def\point{$\star$} |
| 4157 \def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} | |
| 4158 \def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}} | |
| 4159 \def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} | |
| 4160 \def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}} | |
| 4161 | |
| 47284 | 4162 % The @error{} command. |
| 37713 | 4163 % Adapted from the TeXbook's \boxit. |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
47284
diff
changeset
|
4164 % |
| 47284 | 4165 \newbox\errorbox |
| 4166 % | |
| 37713 | 4167 {\tentt \global\dimen0 = 3em}% Width of the box. |
| 4168 \dimen2 = .55pt % Thickness of rules | |
| 4169 % The text. (`r' is open on the right, `e' somewhat less so on the left.) | |
| 4170 \setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt} | |
| 47284 | 4171 % |
| 37713 | 4172 \global\setbox\errorbox=\hbox to \dimen0{\hfil |
| 4173 \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. | |
| 4174 \advance\hsize by -2\dimen2 % Rules. | |
| 4175 \vbox{ | |
| 4176 \hrule height\dimen2 | |
| 4177 \hbox{\vrule width\dimen2 \kern3pt % Space to left of text. | |
| 4178 \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. | |
| 4179 \kern3pt\vrule width\dimen2}% Space to right. | |
| 4180 \hrule height\dimen2} | |
| 4181 \hfil} | |
| 47284 | 4182 % |
| 37713 | 4183 \def\error{\leavevmode\lower.7ex\copy\errorbox} |
| 4184 | |
| 4185 % @tex ... @end tex escapes into raw Tex temporarily. | |
| 4186 % One exception: @ is still an escape character, so that @end tex works. | |
| 4187 % But \@ or @@ will get a plain tex @ character. | |
| 4188 | |
| 4189 \def\tex{\begingroup | |
| 4190 \catcode `\\=0 \catcode `\{=1 \catcode `\}=2 | |
| 4191 \catcode `\$=3 \catcode `\&=4 \catcode `\#=6 | |
| 4192 \catcode `\^=7 \catcode `\_=8 \catcode `\~=13 \let~=\tie | |
| 4193 \catcode `\%=14 | |
| 4194 \catcode 43=12 % plus | |
| 4195 \catcode`\"=12 | |
| 4196 \catcode`\==12 | |
| 4197 \catcode`\|=12 | |
| 4198 \catcode`\<=12 | |
| 4199 \catcode`\>=12 | |
| 4200 \escapechar=`\\ | |
| 4201 % | |
| 4202 \let\b=\ptexb | |
| 4203 \let\bullet=\ptexbullet | |
| 4204 \let\c=\ptexc | |
| 4205 \let\,=\ptexcomma | |
| 4206 \let\.=\ptexdot | |
| 4207 \let\dots=\ptexdots | |
| 4208 \let\equiv=\ptexequiv | |
| 4209 \let\!=\ptexexclam | |
| 4210 \let\i=\ptexi | |
| 4211 \let\{=\ptexlbrace | |
| 4212 \let\+=\tabalign | |
| 4213 \let\}=\ptexrbrace | |
| 4214 \let\*=\ptexstar | |
| 4215 \let\t=\ptext | |
| 4216 % | |
| 4217 \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% | |
| 4218 \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}% | |
| 4219 \def\@{@}% | |
| 4220 \let\Etex=\endgroup} | |
| 4221 | |
| 47284 | 4222 % Define @lisp ... @end lisp. |
| 37713 | 4223 % @lisp does a \begingroup so it can rebind things, |
| 47284 | 4224 % including the definition of @end lisp (which normally is erroneous). |
| 37713 | 4225 |
| 4226 % Amount to narrow the margins by for @lisp. | |
| 4227 \newskip\lispnarrowing \lispnarrowing=0.4in | |
| 4228 | |
| 4229 % This is the definition that ^^M gets inside @lisp, @example, and other | |
| 4230 % such environments. \null is better than a space, since it doesn't | |
| 4231 % have any width. | |
| 4232 \def\lisppar{\null\endgraf} | |
| 4233 | |
| 4234 % Make each space character in the input produce a normal interword | |
| 4235 % space in the output. Don't allow a line break at this space, as this | |
| 4236 % is used only in environments like @example, where each line of input | |
| 4237 % should produce a line of output anyway. | |
| 4238 % | |
| 4239 {\obeyspaces % | |
| 4240 \gdef\sepspaces{\obeyspaces\let =\tie}} | |
| 4241 | |
| 4242 % Define \obeyedspace to be our active space, whatever it is. This is | |
| 4243 % for use in \parsearg. | |
| 4244 {\sepspaces% | |
| 4245 \global\let\obeyedspace= } | |
| 4246 | |
| 4247 % This space is always present above and below environments. | |
| 4248 \newskip\envskipamount \envskipamount = 0pt | |
| 4249 | |
| 4250 % Make spacing and below environment symmetrical. We use \parskip here | |
| 4251 % to help in doing that, since in @example-like environments \parskip | |
| 4252 % is reset to zero; thus the \afterenvbreak inserts no space -- but the | |
| 4253 % start of the next paragraph will insert \parskip | |
| 4254 % | |
| 47284 | 4255 \def\aboveenvbreak{{% |
| 4256 \ifnum\lastpenalty < 10000 | |
| 4257 \advance\envskipamount by \parskip | |
| 4258 \endgraf | |
| 4259 \ifdim\lastskip<\envskipamount | |
| 4260 \removelastskip | |
| 4261 \penalty-50 | |
| 4262 \vskip\envskipamount | |
| 4263 \fi | |
| 4264 \fi | |
| 4265 }} | |
| 37713 | 4266 |
| 4267 \let\afterenvbreak = \aboveenvbreak | |
| 4268 | |
| 4269 % \nonarrowing is a flag. If "set", @lisp etc don't narrow margins. | |
| 4270 \let\nonarrowing=\relax | |
| 4271 | |
| 4272 % @cartouche ... @end cartouche: draw rectangle w/rounded corners around | |
| 4273 % environment contents. | |
| 4274 \font\circle=lcircle10 | |
| 4275 \newdimen\circthick | |
| 4276 \newdimen\cartouter\newdimen\cartinner | |
| 4277 \newskip\normbskip\newskip\normpskip\newskip\normlskip | |
| 4278 \circthick=\fontdimen8\circle | |
| 4279 % | |
| 4280 \def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth | |
| 4281 \def\ctr{{\hskip 6pt\circle\char'010}} | |
| 4282 \def\cbl{{\circle\char'012\hskip -6pt}} | |
| 4283 \def\cbr{{\hskip 6pt\circle\char'011}} | |
| 4284 \def\carttop{\hbox to \cartouter{\hskip\lskip | |
| 4285 \ctl\leaders\hrule height\circthick\hfil\ctr | |
| 4286 \hskip\rskip}} | |
| 4287 \def\cartbot{\hbox to \cartouter{\hskip\lskip | |
| 4288 \cbl\leaders\hrule height\circthick\hfil\cbr | |
| 4289 \hskip\rskip}} | |
| 4290 % | |
| 4291 \newskip\lskip\newskip\rskip | |
| 4292 | |
| 4293 \long\def\cartouche{% | |
| 4294 \begingroup | |
| 4295 \lskip=\leftskip \rskip=\rightskip | |
| 4296 \leftskip=0pt\rightskip=0pt %we want these *outside*. | |
| 4297 \cartinner=\hsize \advance\cartinner by-\lskip | |
| 4298 \advance\cartinner by-\rskip | |
| 4299 \cartouter=\hsize | |
| 4300 \advance\cartouter by 18.4pt % allow for 3pt kerns on either | |
| 4301 % side, and for 6pt waste from | |
| 4302 % each corner char, and rule thickness | |
| 4303 \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip | |
| 4304 % Flag to tell @lisp, etc., not to narrow margin. | |
| 4305 \let\nonarrowing=\comment | |
| 4306 \vbox\bgroup | |
| 4307 \baselineskip=0pt\parskip=0pt\lineskip=0pt | |
| 4308 \carttop | |
| 4309 \hbox\bgroup | |
| 4310 \hskip\lskip | |
| 4311 \vrule\kern3pt | |
| 4312 \vbox\bgroup | |
| 4313 \hsize=\cartinner | |
| 4314 \kern3pt | |
| 4315 \begingroup | |
| 4316 \baselineskip=\normbskip | |
| 4317 \lineskip=\normlskip | |
| 4318 \parskip=\normpskip | |
| 4319 \vskip -\parskip | |
| 4320 \def\Ecartouche{% | |
| 4321 \endgroup | |
| 4322 \kern3pt | |
| 4323 \egroup | |
| 4324 \kern3pt\vrule | |
| 4325 \hskip\rskip | |
| 4326 \egroup | |
| 4327 \cartbot | |
| 4328 \egroup | |
| 4329 \endgroup | |
| 4330 }} | |
| 4331 | |
| 4332 | |
| 4333 % This macro is called at the beginning of all the @example variants, | |
| 4334 % inside a group. | |
| 4335 \def\nonfillstart{% | |
| 4336 \aboveenvbreak | |
| 4337 \inENV % This group ends at the end of the body | |
| 4338 \hfuzz = 12pt % Don't be fussy | |
| 4339 \sepspaces % Make spaces be word-separators rather than space tokens. | |
| 4340 \singlespace | |
| 4341 \let\par = \lisppar % don't ignore blank lines | |
| 4342 \obeylines % each line of input is a line of output | |
| 4343 \parskip = 0pt | |
| 4344 \parindent = 0pt | |
| 4345 \emergencystretch = 0pt % don't try to avoid overfull boxes | |
| 4346 % @cartouche defines \nonarrowing to inhibit narrowing | |
| 4347 % at next level down. | |
| 4348 \ifx\nonarrowing\relax | |
| 4349 \advance \leftskip by \lispnarrowing | |
| 4350 \exdentamount=\lispnarrowing | |
| 4351 \let\exdent=\nofillexdent | |
| 4352 \let\nonarrowing=\relax | |
| 4353 \fi | |
| 4354 } | |
| 4355 | |
| 4356 % Define the \E... control sequence only if we are inside the particular | |
| 4357 % environment, so the error checking in \end will work. | |
| 4358 % | |
| 4359 % To end an @example-like environment, we first end the paragraph (via | |
| 4360 % \afterenvbreak's vertical glue), and then the group. That way we keep | |
| 4361 % the zero \parskip that the environments set -- \parskip glue will be | |
| 4362 % inserted at the beginning of the next paragraph in the document, after | |
| 4363 % the environment. | |
| 4364 % | |
| 4365 \def\nonfillfinish{\afterenvbreak\endgroup} | |
| 4366 | |
| 4367 % @lisp: indented, narrowed, typewriter font. | |
| 4368 \def\lisp{\begingroup | |
| 4369 \nonfillstart | |
| 4370 \let\Elisp = \nonfillfinish | |
| 4371 \tt | |
| 4372 \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. | |
| 4373 \gobble % eat return | |
| 4374 } | |
| 4375 | |
| 4376 % @example: Same as @lisp. | |
| 4377 \def\example{\begingroup \def\Eexample{\nonfillfinish\endgroup}\lisp} | |
| 4378 | |
| 4379 % @small... is usually equivalent to the non-small (@smallbook | |
| 4380 % redefines). We must call \example (or whatever) last in the | |
| 4381 % definition, since it reads the return following the @example (or | |
| 4382 % whatever) command. | |
| 4383 % | |
| 4384 % This actually allows (for example) @end display inside an | |
| 4385 % @smalldisplay. Too bad, but makeinfo will catch the error anyway. | |
| 4386 % | |
| 4387 \def\smalldisplay{\begingroup\def\Esmalldisplay{\nonfillfinish\endgroup}\display} | |
| 4388 \def\smallexample{\begingroup\def\Esmallexample{\nonfillfinish\endgroup}\lisp} | |
| 4389 \def\smallformat{\begingroup\def\Esmallformat{\nonfillfinish\endgroup}\format} | |
| 4390 \def\smalllisp{\begingroup\def\Esmalllisp{\nonfillfinish\endgroup}\lisp} | |
| 4391 | |
| 4392 % Real @smallexample and @smalllisp (when @smallbook): use smaller fonts. | |
| 4393 % Originally contributed by Pavel@xerox. | |
| 4394 \def\smalllispx{\begingroup | |
| 4395 \def\Esmalllisp{\nonfillfinish\endgroup}% | |
| 4396 \def\Esmallexample{\nonfillfinish\endgroup}% | |
| 47284 | 4397 \smallexamplefonts |
| 37713 | 4398 \lisp |
| 4399 } | |
| 4400 | |
| 4401 % @display: same as @lisp except keep current font. | |
| 4402 % | |
| 4403 \def\display{\begingroup | |
| 4404 \nonfillstart | |
| 4405 \let\Edisplay = \nonfillfinish | |
| 4406 \gobble | |
| 4407 } | |
| 47284 | 4408 % |
| 37713 | 4409 % @smalldisplay (when @smallbook): @display plus smaller fonts. |
| 4410 % | |
| 4411 \def\smalldisplayx{\begingroup | |
| 4412 \def\Esmalldisplay{\nonfillfinish\endgroup}% | |
| 47284 | 4413 \smallexamplefonts \rm |
| 37713 | 4414 \display |
| 4415 } | |
| 4416 | |
| 4417 % @format: same as @display except don't narrow margins. | |
| 4418 % | |
| 4419 \def\format{\begingroup | |
| 4420 \let\nonarrowing = t | |
| 4421 \nonfillstart | |
| 4422 \let\Eformat = \nonfillfinish | |
| 4423 \gobble | |
| 4424 } | |
| 47284 | 4425 % |
| 37713 | 4426 % @smallformat (when @smallbook): @format plus smaller fonts. |
| 4427 % | |
| 4428 \def\smallformatx{\begingroup | |
| 4429 \def\Esmallformat{\nonfillfinish\endgroup}% | |
| 47284 | 4430 \smallexamplefonts \rm |
| 37713 | 4431 \format |
| 4432 } | |
| 4433 | |
| 4434 % @flushleft (same as @format). | |
| 4435 % | |
| 4436 \def\flushleft{\begingroup \def\Eflushleft{\nonfillfinish\endgroup}\format} | |
| 4437 | |
| 4438 % @flushright. | |
| 4439 % | |
| 4440 \def\flushright{\begingroup | |
| 4441 \let\nonarrowing = t | |
| 4442 \nonfillstart | |
| 4443 \let\Eflushright = \nonfillfinish | |
| 4444 \advance\leftskip by 0pt plus 1fill | |
| 4445 \gobble | |
| 4446 } | |
| 4447 | |
| 4448 | |
| 4449 % @quotation does normal linebreaking (hence we can't use \nonfillstart) | |
| 4450 % and narrows the margins. | |
| 4451 % | |
| 4452 \def\quotation{% | |
| 4453 \begingroup\inENV %This group ends at the end of the @quotation body | |
| 4454 {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip | |
| 4455 \singlespace | |
| 4456 \parindent=0pt | |
| 4457 % We have retained a nonzero parskip for the environment, since we're | |
| 4458 % doing normal filling. So to avoid extra space below the environment... | |
| 4459 \def\Equotation{\parskip = 0pt \nonfillfinish}% | |
| 4460 % | |
| 4461 % @cartouche defines \nonarrowing to inhibit narrowing at next level down. | |
| 4462 \ifx\nonarrowing\relax | |
| 4463 \advance\leftskip by \lispnarrowing | |
| 4464 \advance\rightskip by \lispnarrowing | |
| 4465 \exdentamount = \lispnarrowing | |
| 4466 \let\nonarrowing = \relax | |
| 4467 \fi | |
| 4468 } | |
| 4469 | |
| 4470 | |
| 4471 % LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>} | |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
47284
diff
changeset
|
4472 % If we want to allow any <char> as delimiter, |
| 37713 | 4473 % we need the curly braces so that makeinfo sees the @verb command, eg: |
| 4474 % `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org | |
| 4475 % | |
| 4476 % [Knuth]: Donald Ervin Knuth, 1996. The TeXbook. | |
| 4477 % | |
| 4478 % [Knuth] p. 344; only we need to do '@' too | |
| 4479 \def\dospecials{% | |
| 4480 \do\ \do\\\do\@\do\{\do\}\do\$\do\&% | |
| 4481 \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~} | |
| 4482 % | |
| 4483 % [Knuth] p. 380 | |
| 4484 \def\uncatcodespecials{% | |
| 4485 \def\do##1{\catcode`##1=12}\dospecials} | |
| 4486 % | |
| 4487 % [Knuth] pp. 380,381,391 | |
| 4488 % Disable Spanish ligatures ?` and !` of \tt font | |
| 4489 \begingroup | |
| 4490 \catcode`\`=\active\gdef`{\relax\lq} | |
| 4491 \endgroup | |
| 4492 % | |
| 4493 % Setup for the @verb command. | |
| 4494 % | |
| 4495 % Eight spaces for a tab | |
| 4496 \begingroup | |
| 4497 \catcode`\^^I=\active | |
| 4498 \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }} | |
| 4499 \endgroup | |
| 4500 % | |
| 4501 \def\setupverb{% | |
| 4502 \tt % easiest (and conventionally used) font for verbatim | |
| 4503 \def\par{\leavevmode\endgraf}% | |
| 4504 \catcode`\`=\active | |
| 4505 \tabeightspaces | |
| 4506 % Respect line breaks, | |
| 4507 % print special symbols as themselves, and | |
| 4508 % make each space count | |
| 4509 % must do in this order: | |
| 4510 \obeylines \uncatcodespecials \sepspaces | |
| 4511 } | |
| 4512 | |
| 4513 % Setup for the @verbatim environment | |
| 4514 % | |
| 4515 % Real tab expansion | |
| 4516 \newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount | |
| 4517 % | |
| 4518 \def\starttabbox{\setbox0=\hbox\bgroup} | |
| 4519 \begingroup | |
| 4520 \catcode`\^^I=\active | |
| 4521 \gdef\tabexpand{% | |
| 4522 \catcode`\^^I=\active | |
| 4523 \def^^I{\leavevmode\egroup | |
| 4524 \dimen0=\wd0 % the width so far, or since the previous tab | |
| 4525 \divide\dimen0 by\tabw | |
| 4526 \multiply\dimen0 by\tabw % compute previous multiple of \tabw | |
| 4527 \advance\dimen0 by\tabw % advance to next multiple of \tabw | |
| 4528 \wd0=\dimen0 \box0 \starttabbox | |
| 4529 }% | |
| 4530 } | |
| 4531 \endgroup | |
| 4532 \def\setupverbatim{% | |
| 4533 % Easiest (and conventionally used) font for verbatim | |
| 4534 \tt | |
| 4535 \def\par{\leavevmode\egroup\box0\endgraf}% | |
| 4536 \catcode`\`=\active | |
| 4537 \tabexpand | |
| 4538 % Respect line breaks, | |
| 4539 % print special symbols as themselves, and | |
| 4540 % make each space count | |
| 4541 % must do in this order: | |
| 4542 \obeylines \uncatcodespecials \sepspaces | |
| 4543 \everypar{\starttabbox}% | |
| 4544 } | |
| 4545 | |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
47284
diff
changeset
|
4546 % Do the @verb magic: verbatim text is quoted by unique |
|
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
47284
diff
changeset
|
4547 % delimiter characters. Before first delimiter expect a |
| 37713 | 4548 % right brace, after last delimiter expect closing brace: |
| 4549 % | |
| 4550 % \def\doverb'{'<char>#1<char>'}'{#1} | |
| 4551 % | |
| 4552 % [Knuth] p. 382; only eat outer {} | |
| 4553 \begingroup | |
| 4554 \catcode`[=1\catcode`]=2\catcode`\{=12\catcode`\}=12 | |
| 4555 \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next] | |
| 4556 \endgroup | |
| 4557 % | |
| 4558 \def\verb{\begingroup\setupverb\doverb} | |
| 4559 % | |
| 4560 % | |
| 4561 % Do the @verbatim magic: define the macro \doverbatim so that | |
| 4562 % the (first) argument ends when '@end verbatim' is reached, ie: | |
| 4563 % | |
| 4564 % \def\doverbatim#1@end verbatim{#1} | |
| 4565 % | |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
47284
diff
changeset
|
4566 % For Texinfo it's a lot easier than for LaTeX, |
| 37713 | 4567 % because texinfo's \verbatim doesn't stop at '\end{verbatim}': |
| 4568 % we need not redefine '\', '{' and '}' | |
| 4569 % | |
| 4570 % Inspired by LaTeX's verbatim command set [latex.ltx] | |
| 4571 %% Include LaTeX hack for completeness -- never know | |
| 4572 %% \begingroup | |
| 4573 %% \catcode`|=0 \catcode`[=1 | |
| 4574 %% \catcode`]=2\catcode`\{=12\catcode`\}=12\catcode`\ =\active | |
| 4575 %% \catcode`\\=12|gdef|doverbatim#1@end verbatim[ | |
| 4576 %% #1|endgroup|def|Everbatim[]|end[verbatim]] | |
| 4577 %% |endgroup | |
| 4578 \begingroup | |
| 4579 \catcode`\ =\active | |
| 4580 \gdef\doverbatim#1@end verbatim{#1\end{verbatim}} | |
| 4581 \endgroup | |
| 4582 % | |
| 4583 \def\verbatim{% | |
| 4584 \def\Everbatim{\nonfillfinish\endgroup}% | |
| 4585 \begingroup | |
| 4586 \nonfillstart | |
| 4587 \advance\leftskip by -\defbodyindent | |
| 4588 \begingroup\setupverbatim\doverbatim | |
| 4589 } | |
| 4590 | |
| 4591 % @verbatiminclude FILE - insert text of file in verbatim environment. | |
| 4592 % | |
| 4593 % Allow normal characters that we make active in the argument (a file name). | |
| 4594 \def\verbatiminclude{% | |
| 4595 \begingroup | |
| 4596 \catcode`\\=12 | |
| 4597 \catcode`~=12 | |
| 4598 \catcode`^=12 | |
| 4599 \catcode`_=12 | |
| 4600 \catcode`|=12 | |
| 4601 \catcode`<=12 | |
| 4602 \catcode`>=12 | |
| 4603 \catcode`+=12 | |
| 4604 \parsearg\doverbatiminclude | |
| 4605 } | |
| 4606 \def\setupverbatiminclude{% | |
| 4607 \begingroup | |
| 4608 \nonfillstart | |
| 4609 \advance\leftskip by -\defbodyindent | |
| 4610 \begingroup\setupverbatim | |
| 4611 } | |
| 4612 % | |
| 4613 \def\doverbatiminclude#1{% | |
| 4614 % Restore active chars for included file. | |
| 4615 \endgroup | |
| 4616 \begingroup | |
| 4617 \def\thisfile{#1}% | |
| 4618 \expandafter\expandafter\setupverbatiminclude\input\thisfile | |
| 4619 \endgroup\nonfillfinish\endgroup | |
| 4620 } | |
| 4621 | |
| 47284 | 4622 % @copying ... @end copying. |
| 4623 % Save the text away for @insertcopying later. | |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
47284
diff
changeset
|
4624 % |
| 47284 | 4625 \newbox\copyingbox |
| 4626 % | |
| 4627 \def\copying{\begingroup | |
| 4628 \parindent = 0pt % looks wrong on title page | |
| 4629 \def\Ecopying{\egroup\endgroup}% | |
| 4630 \global\setbox\copyingbox = \vbox\bgroup | |
| 4631 } | |
| 4632 | |
| 4633 % @insertcopying. | |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
47284
diff
changeset
|
4634 % |
| 47284 | 4635 \def\insertcopying{\unvcopy\copyingbox} |
| 4636 | |
| 37713 | 4637 |
| 4638 \message{defuns,} | |
| 4639 % @defun etc. | |
| 4640 | |
| 4641 % Allow user to change definition object font (\df) internally | |
| 4642 \def\setdeffont #1 {\csname DEF#1\endcsname} | |
| 4643 | |
| 4644 \newskip\defbodyindent \defbodyindent=.4in | |
| 4645 \newskip\defargsindent \defargsindent=50pt | |
| 4646 \newskip\deftypemargin \deftypemargin=12pt | |
| 4647 \newskip\deflastargmargin \deflastargmargin=18pt | |
| 4648 | |
| 4649 \newcount\parencount | |
| 4650 % define \functionparens, which makes ( and ) and & do special things. | |
| 4651 % \functionparens affects the group it is contained in. | |
| 4652 \def\activeparens{% | |
| 4653 \catcode`\(=\active \catcode`\)=\active \catcode`\&=\active | |
| 4654 \catcode`\[=\active \catcode`\]=\active} | |
| 4655 | |
| 4656 % Make control sequences which act like normal parenthesis chars. | |
| 4657 \let\lparen = ( \let\rparen = ) | |
| 4658 | |
| 4659 {\activeparens % Now, smart parens don't turn on until &foo (see \amprm) | |
| 4660 | |
| 4661 % Be sure that we always have a definition for `(', etc. For example, | |
| 4662 % if the fn name has parens in it, \boldbrax will not be in effect yet, | |
| 4663 % so TeX would otherwise complain about undefined control sequence. | |
| 4664 \global\let(=\lparen \global\let)=\rparen | |
| 4665 \global\let[=\lbrack \global\let]=\rbrack | |
| 4666 | |
| 4667 \gdef\functionparens{\boldbrax\let&=\amprm\parencount=0 } | |
| 4668 \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} | |
| 4669 % This is used to turn on special parens | |
| 4670 % but make & act ordinary (given that it's active). | |
| 4671 \gdef\boldbraxnoamp{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb\let&=\ampnr} | |
| 4672 | |
| 4673 % Definitions of (, ) and & used in args for functions. | |
| 4674 % This is the definition of ( outside of all parentheses. | |
| 4675 \gdef\oprm#1 {{\rm\char`\(}#1 \bf \let(=\opnested | |
| 4676 \global\advance\parencount by 1 | |
| 4677 } | |
| 4678 % | |
| 4679 % This is the definition of ( when already inside a level of parens. | |
| 4680 \gdef\opnested{\char`\(\global\advance\parencount by 1 } | |
| 4681 % | |
| 4682 \gdef\clrm{% Print a paren in roman if it is taking us back to depth of 0. | |
| 4683 % also in that case restore the outer-level definition of (. | |
| 4684 \ifnum \parencount=1 {\rm \char `\)}\sl \let(=\oprm \else \char `\) \fi | |
| 4685 \global\advance \parencount by -1 } | |
| 4686 % If we encounter &foo, then turn on ()-hacking afterwards | |
| 4687 \gdef\amprm#1 {{\rm\}\let(=\oprm \let)=\clrm\ } | |
| 4688 % | |
| 4689 \gdef\normalparens{\boldbrax\let&=\ampnr} | |
| 4690 } % End of definition inside \activeparens | |
| 4691 %% These parens (in \boldbrax) actually are a little bolder than the | |
| 4692 %% contained text. This is especially needed for [ and ] | |
| 4693 \def\opnr{{\sf\char`\(}\global\advance\parencount by 1 } | |
| 4694 \def\clnr{{\sf\char`\)}\global\advance\parencount by -1 } | |
| 4695 \let\ampnr = \& | |
| 4696 \def\lbrb{{\bf\char`\[}} | |
| 4697 \def\rbrb{{\bf\char`\]}} | |
| 4698 | |
| 4699 % Active &'s sneak into the index arguments, so make sure it's defined. | |
| 4700 { | |
| 4701 \catcode`& = 13 | |
| 4702 \global\let& = \ampnr | |
| 4703 } | |
| 4704 | |
| 4705 % First, defname, which formats the header line itself. | |
| 4706 % #1 should be the function name. | |
| 4707 % #2 should be the type of definition, such as "Function". | |
| 4708 | |
| 4709 \def\defname #1#2{% | |
| 4710 % Get the values of \leftskip and \rightskip as they were | |
| 4711 % outside the @def... | |
| 4712 \dimen2=\leftskip | |
| 4713 \advance\dimen2 by -\defbodyindent | |
| 4714 \noindent | |
| 4715 \setbox0=\hbox{\hskip \deflastargmargin{\rm #2}\hskip \deftypemargin}% | |
| 4716 \dimen0=\hsize \advance \dimen0 by -\wd0 % compute size for first line | |
| 4717 \dimen1=\hsize \advance \dimen1 by -\defargsindent %size for continuations | |
| 4718 \parshape 2 0in \dimen0 \defargsindent \dimen1 | |
| 4719 % Now output arg 2 ("Function" or some such) | |
| 4720 % ending at \deftypemargin from the right margin, | |
| 4721 % but stuck inside a box of width 0 so it does not interfere with linebreaking | |
| 4722 {% Adjust \hsize to exclude the ambient margins, | |
| 4723 % so that \rightline will obey them. | |
| 4724 \advance \hsize by -\dimen2 | |
| 4725 \rlap{\rightline{{\rm #2}\hskip -1.25pc }}}% | |
| 4726 % Make all lines underfull and no complaints: | |
| 4727 \tolerance=10000 \hbadness=10000 | |
| 4728 \advance\leftskip by -\defbodyindent | |
| 4729 \exdentamount=\defbodyindent | |
| 4730 {\df #1}\enskip % Generate function name | |
| 4731 } | |
| 4732 | |
| 47284 | 4733 % Common pieces to start any @def... |
| 37713 | 4734 % #1 is the \E... control sequence to end the definition (which we define). |
| 47284 | 4735 % #2 is the \...x control sequence (which our caller defines). |
| 4736 % #3 is the control sequence to process the header, such as \defunheader. | |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
47284
diff
changeset
|
4737 % |
| 47284 | 4738 \def\parsebodycommon#1#2#3{% |
| 4739 \begingroup\inENV | |
| 4740 % If there are two @def commands in a row, we'll have a \nobreak, | |
| 4741 % which is there to keep the function description together with its | |
| 4742 % header. But if there's nothing but headers, we want to allow a | |
| 4743 % break after all. | |
| 4744 \ifnum\lastpenalty = 10000 \penalty0 \fi | |
| 37713 | 4745 \medbreak |
| 47284 | 4746 % |
| 4747 % Define the \E... end token that this defining construct specifies | |
| 4748 % so that it will exit this group. | |
| 37713 | 4749 \def#1{\endgraf\endgroup\medbreak}% |
| 47284 | 4750 % |
| 37713 | 4751 \parindent=0in |
| 4752 \advance\leftskip by \defbodyindent | |
| 4753 \exdentamount=\defbodyindent | |
| 47284 | 4754 } |
| 4755 | |
| 4756 % Process body of @defun, @deffn, @defmac, etc. | |
| 4757 % | |
| 4758 \def\defparsebody#1#2#3{% | |
| 4759 \parsebodycommon{#1}{#2}{#3}% | |
| 4760 \def#2{\begingroup\obeylines\activeparens\spacesplit#3}% | |
| 4761 \catcode61=\active % 61 is `=' | |
| 4762 \begingroup\obeylines\activeparens | |
| 4763 \spacesplit#3% | |
| 4764 } | |
| 4765 | |
| 4766 % #1, #2, #3 are the common arguments (see \defparsebody). | |
| 4767 % #4, delimited by the space, is the class name. | |
| 4768 % | |
| 4769 \def\defmethparsebody#1#2#3#4 {% | |
| 4770 \parsebodycommon{#1}{#2}{#3}% | |
| 4771 \def#2##1 {\begingroup\obeylines\activeparens\spacesplit{#3{##1}}}% | |
| 4772 \begingroup\obeylines\activeparens | |
| 4773 \spacesplit{#3{#4}}% | |
| 4774 } | |
| 4775 | |
| 4776 % Used for @deftypemethod and @deftypeivar. | |
| 4777 % #1, #2, #3 are the common arguments (see \defparsebody). | |
| 4778 % #4, delimited by a space, is the class name. | |
| 4779 % #5 is the method's return type. | |
| 4780 % | |
| 4781 \def\deftypemethparsebody#1#2#3#4 #5 {% | |
| 4782 \parsebodycommon{#1}{#2}{#3}% | |
| 4783 \def#2##1 ##2 {\begingroup\obeylines\activeparens\spacesplit{#3{##1}{##2}}}% | |
| 4784 \begingroup\obeylines\activeparens | |
| 4785 \spacesplit{#3{#4}{#5}}% | |
| 4786 } | |
| 37713 | 4787 |
| 4788 % Used for @deftypeop. The change from \deftypemethparsebody is an | |
| 4789 % extra argument at the beginning which is the `category', instead of it | |
| 4790 % being the hardwired string `Method' or `Instance Variable'. We have | |
| 4791 % to account for this both in the \...x definition and in parsing the | |
| 4792 % input at hand. Thus also need a control sequence (passed as #5) for | |
| 4793 % the \E... definition to assign the category name to. | |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
47284
diff
changeset
|
4794 % |
| 47284 | 4795 \def\deftypeopparsebody#1#2#3#4#5 #6 {% |
| 4796 \parsebodycommon{#1}{#2}{#3}% | |
| 37713 | 4797 \def#2##1 ##2 ##3 {% |
| 4798 \def#4{##1}% | |
| 4799 \begingroup\obeylines\activeparens\spacesplit{#3{##2}{##3}}}% | |
| 47284 | 4800 \begingroup\obeylines\activeparens |
| 4801 \spacesplit{#3{#5}{#6}}% | |
| 4802 } | |
| 4803 | |
| 4804 % For @defop. | |
| 4805 \def\defopparsebody #1#2#3#4#5 {% | |
| 4806 \parsebodycommon{#1}{#2}{#3}% | |
| 4807 \def#2##1 ##2 {\def#4{##1}% | |
| 4808 \begingroup\obeylines\activeparens\spacesplit{#3{##2}}}% | |
| 4809 \begingroup\obeylines\activeparens | |
| 4810 \spacesplit{#3{#5}}% | |
| 4811 } | |
| 37713 | 4812 |
| 4813 % These parsing functions are similar to the preceding ones | |
| 4814 % except that they do not make parens into active characters. | |
| 4815 % These are used for "variables" since they have no arguments. | |
| 47284 | 4816 % |
| 4817 \def\defvarparsebody #1#2#3{% | |
| 4818 \parsebodycommon{#1}{#2}{#3}% | |
| 4819 \def#2{\begingroup\obeylines\spacesplit#3}% | |
| 4820 \catcode61=\active % | |
| 37713 | 4821 \begingroup\obeylines |
| 47284 | 4822 \spacesplit#3% |
| 4823 } | |
| 4824 | |
| 4825 % @defopvar. | |
| 4826 \def\defopvarparsebody #1#2#3#4#5 {% | |
| 4827 \parsebodycommon{#1}{#2}{#3}% | |
| 4828 \def#2##1 ##2 {\def#4{##1}% | |
| 4829 \begingroup\obeylines\spacesplit{#3{##2}}}% | |
| 4830 \begingroup\obeylines | |
| 4831 \spacesplit{#3{#5}}% | |
| 37713 | 4832 } |
| 4833 | |
| 4834 \def\defvrparsebody#1#2#3#4 {% | |
| 4835 \parsebodycommon{#1}{#2}{#3}% | |
| 47284 | 4836 \def#2##1 {\begingroup\obeylines\spacesplit{#3{##1}}}% |
| 4837 \begingroup\obeylines | |
| 37713 | 4838 \spacesplit{#3{#4}}% |
| 4839 } | |
| 4840 | |
| 4841 % This loses on `@deftp {Data Type} {struct termios}' -- it thinks the | |
| 4842 % type is just `struct', because we lose the braces in `{struct | |
| 4843 % termios}' when \spacesplit reads its undelimited argument. Sigh. | |
| 4844 % \let\deftpparsebody=\defvrparsebody | |
| 4845 % | |
| 4846 % So, to get around this, we put \empty in with the type name. That | |
| 4847 % way, TeX won't find exactly `{...}' as an undelimited argument, and | |
| 4848 % won't strip off the braces. | |
| 4849 % | |
| 4850 \def\deftpparsebody #1#2#3#4 {% | |
| 4851 \parsebodycommon{#1}{#2}{#3}% | |
| 47284 | 4852 \def#2##1 {\begingroup\obeylines\spacesplit{#3{##1}}}% |
| 4853 \begingroup\obeylines | |
| 37713 | 4854 \spacesplit{\parsetpheaderline{#3{#4}}}\empty |
| 4855 } | |
| 4856 | |
| 4857 % Fine, but then we have to eventually remove the \empty *and* the | |
| 4858 % braces (if any). That's what this does. | |
| 4859 % | |
| 4860 \def\removeemptybraces\empty#1\relax{#1} | |
| 4861 | |
| 4862 % After \spacesplit has done its work, this is called -- #1 is the final | |
| 4863 % thing to call, #2 the type name (which starts with \empty), and #3 | |
| 4864 % (which might be empty) the arguments. | |
| 4865 % | |
| 4866 \def\parsetpheaderline#1#2#3{% | |
| 4867 #1{\removeemptybraces#2\relax}{#3}% | |
| 4868 }% | |
| 4869 | |
| 4870 % Split up #2 at the first space token. | |
| 4871 % call #1 with two arguments: | |
| 4872 % the first is all of #2 before the space token, | |
| 4873 % the second is all of #2 after that space token. | |
| 4874 % If #2 contains no space token, all of it is passed as the first arg | |
| 4875 % and the second is passed as empty. | |
| 47284 | 4876 % |
| 37713 | 4877 {\obeylines |
| 4878 \gdef\spacesplit#1#2^^M{\endgroup\spacesplitfoo{#1}#2 \relax\spacesplitfoo}% | |
| 4879 \long\gdef\spacesplitfoo#1#2 #3#4\spacesplitfoo{% | |
| 4880 \ifx\relax #3% | |
| 4881 #1{#2}{}\else #1{#2}{#3#4}\fi}} | |
| 4882 | |
| 4883 % Define @defun. | |
| 4884 | |
| 4885 % First, define the processing that is wanted for arguments of \defun | |
| 4886 % Use this to expand the args and terminate the paragraph they make up | |
| 4887 | |
| 4888 \def\defunargs#1{\functionparens \sl | |
| 4889 % Expand, preventing hyphenation at `-' chars. | |
| 4890 % Note that groups don't affect changes in \hyphenchar. | |
| 4891 % Set the font temporarily and use \font in case \setfont made \tensl a macro. | |
| 4892 {\tensl\hyphenchar\font=0}% | |
| 4893 #1% | |
| 4894 {\tensl\hyphenchar\font=45}% | |
| 4895 \ifnum\parencount=0 \else \errmessage{Unbalanced parentheses in @def}\fi% | |
| 4896 \interlinepenalty=10000 | |
| 4897 \advance\rightskip by 0pt plus 1fil | |
| 4898 \endgraf\nobreak\vskip -\parskip\nobreak | |
| 4899 } | |
| 4900 | |
| 4901 \def\deftypefunargs #1{% | |
| 4902 % Expand, preventing hyphenation at `-' chars. | |
| 4903 % Note that groups don't affect changes in \hyphenchar. | |
| 4904 % Use \boldbraxnoamp, not \functionparens, so that & is not special. | |
| 4905 \boldbraxnoamp | |
| 4906 \tclose{#1}% avoid \code because of side effects on active chars | |
| 4907 \interlinepenalty=10000 | |
| 4908 \advance\rightskip by 0pt plus 1fil | |
| 4909 \endgraf\nobreak\vskip -\parskip\nobreak | |
| 4910 } | |
| 4911 | |
| 4912 % Do complete processing of one @defun or @defunx line already parsed. | |
| 4913 | |
| 4914 % @deffn Command forward-char nchars | |
| 4915 | |
| 4916 \def\deffn{\defmethparsebody\Edeffn\deffnx\deffnheader} | |
| 4917 | |
| 4918 \def\deffnheader #1#2#3{\doind {fn}{\code{#2}}% | |
| 4919 \begingroup\defname {#2}{#1}\defunargs{#3}\endgroup % | |
| 4920 \catcode 61=\other % Turn off change made in \defparsebody | |
| 4921 } | |
| 4922 | |
| 4923 % @defun == @deffn Function | |
| 4924 | |
| 4925 \def\defun{\defparsebody\Edefun\defunx\defunheader} | |
| 4926 | |
| 4927 \def\defunheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index | |
| 4928 \begingroup\defname {#1}{\putwordDeffunc}% | |
| 4929 \defunargs {#2}\endgroup % | |
| 4930 \catcode 61=\other % Turn off change made in \defparsebody | |
| 4931 } | |
| 4932 | |
| 4933 % @deftypefun int foobar (int @var{foo}, float @var{bar}) | |
| 4934 | |
| 4935 \def\deftypefun{\defparsebody\Edeftypefun\deftypefunx\deftypefunheader} | |
| 4936 | |
| 4937 % #1 is the data type. #2 is the name and args. | |
| 4938 \def\deftypefunheader #1#2{\deftypefunheaderx{#1}#2 \relax} | |
| 4939 % #1 is the data type, #2 the name, #3 the args. | |
| 4940 \def\deftypefunheaderx #1#2 #3\relax{% | |
| 4941 \doind {fn}{\code{#2}}% Make entry in function index | |
| 47284 | 4942 \begingroup\defname {\defheaderxcond#1\relax$.$#2}{\putwordDeftypefun}% |
| 37713 | 4943 \deftypefunargs {#3}\endgroup % |
| 4944 \catcode 61=\other % Turn off change made in \defparsebody | |
| 4945 } | |
| 4946 | |
| 4947 % @deftypefn {Library Function} int foobar (int @var{foo}, float @var{bar}) | |
| 4948 | |
| 4949 \def\deftypefn{\defmethparsebody\Edeftypefn\deftypefnx\deftypefnheader} | |
| 4950 | |
| 47284 | 4951 % \defheaderxcond#1\relax$.$ |
| 37713 | 4952 % puts #1 in @code, followed by a space, but does nothing if #1 is null. |
| 47284 | 4953 \def\defheaderxcond#1#2$.${\ifx#1\relax\else\code{#1#2} \fi} |
| 37713 | 4954 |
| 4955 % #1 is the classification. #2 is the data type. #3 is the name and args. | |
| 4956 \def\deftypefnheader #1#2#3{\deftypefnheaderx{#1}{#2}#3 \relax} | |
| 4957 % #1 is the classification, #2 the data type, #3 the name, #4 the args. | |
| 4958 \def\deftypefnheaderx #1#2#3 #4\relax{% | |
| 4959 \doind {fn}{\code{#3}}% Make entry in function index | |
| 4960 \begingroup | |
| 4961 \normalparens % notably, turn off `&' magic, which prevents | |
| 4962 % at least some C++ text from working | |
| 47284 | 4963 \defname {\defheaderxcond#2\relax$.$#3}{#1}% |
| 37713 | 4964 \deftypefunargs {#4}\endgroup % |
| 4965 \catcode 61=\other % Turn off change made in \defparsebody | |
| 4966 } | |
| 4967 | |
| 4968 % @defmac == @deffn Macro | |
| 4969 | |
| 4970 \def\defmac{\defparsebody\Edefmac\defmacx\defmacheader} | |
| 4971 | |
| 4972 \def\defmacheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index | |
| 4973 \begingroup\defname {#1}{\putwordDefmac}% | |
| 4974 \defunargs {#2}\endgroup % | |
| 4975 \catcode 61=\other % Turn off change made in \defparsebody | |
| 4976 } | |
| 4977 | |
| 4978 % @defspec == @deffn Special Form | |
| 4979 | |
| 4980 \def\defspec{\defparsebody\Edefspec\defspecx\defspecheader} | |
| 4981 | |
| 4982 \def\defspecheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index | |
| 4983 \begingroup\defname {#1}{\putwordDefspec}% | |
| 4984 \defunargs {#2}\endgroup % | |
| 4985 \catcode 61=\other % Turn off change made in \defparsebody | |
| 4986 } | |
| 4987 | |
| 4988 % @defop CATEGORY CLASS OPERATION ARG... | |
| 4989 % | |
| 4990 \def\defop #1 {\def\defoptype{#1}% | |
| 4991 \defopparsebody\Edefop\defopx\defopheader\defoptype} | |
| 4992 % | |
| 4993 \def\defopheader#1#2#3{% | |
| 4994 \dosubind {fn}{\code{#2}}{\putwordon\ #1}% Make entry in function index | |
| 4995 \begingroup\defname {#2}{\defoptype\ \putwordon\ #1}% | |
| 4996 \defunargs {#3}\endgroup % | |
| 4997 } | |
| 4998 | |
| 4999 % @deftypeop CATEGORY CLASS TYPE OPERATION ARG... | |
| 5000 % | |
| 5001 \def\deftypeop #1 {\def\deftypeopcategory{#1}% | |
| 5002 \deftypeopparsebody\Edeftypeop\deftypeopx\deftypeopheader | |
| 5003 \deftypeopcategory} | |
| 5004 % | |
| 5005 % #1 is the class name, #2 the data type, #3 the operation name, #4 the args. | |
| 5006 \def\deftypeopheader#1#2#3#4{% | |
| 5007 \dosubind{fn}{\code{#3}}{\putwordon\ \code{#1}}% entry in function index | |
| 5008 \begingroup | |
| 47284 | 5009 \defname{\defheaderxcond#2\relax$.$#3} |
| 37713 | 5010 {\deftypeopcategory\ \putwordon\ \code{#1}}% |
| 5011 \deftypefunargs{#4}% | |
| 5012 \endgroup | |
| 5013 } | |
| 5014 | |
| 5015 % @deftypemethod CLASS TYPE METHOD ARG... | |
| 5016 % | |
| 5017 \def\deftypemethod{% | |
| 5018 \deftypemethparsebody\Edeftypemethod\deftypemethodx\deftypemethodheader} | |
| 5019 % | |
| 5020 % #1 is the class name, #2 the data type, #3 the method name, #4 the args. | |
| 5021 \def\deftypemethodheader#1#2#3#4{% | |
| 5022 \dosubind{fn}{\code{#3}}{\putwordon\ \code{#1}}% entry in function index | |
| 5023 \begingroup | |
| 47284 | 5024 \defname{\defheaderxcond#2\relax$.$#3}{\putwordMethodon\ \code{#1}}% |
| 37713 | 5025 \deftypefunargs{#4}% |
| 5026 \endgroup | |
| 5027 } | |
| 5028 | |
| 5029 % @deftypeivar CLASS TYPE VARNAME | |
| 5030 % | |
| 5031 \def\deftypeivar{% | |
| 5032 \deftypemethparsebody\Edeftypeivar\deftypeivarx\deftypeivarheader} | |
| 5033 % | |
| 5034 % #1 is the class name, #2 the data type, #3 the variable name. | |
| 5035 \def\deftypeivarheader#1#2#3{% | |
| 5036 \dosubind{vr}{\code{#3}}{\putwordof\ \code{#1}}% entry in variable index | |
| 5037 \begingroup | |
| 47284 | 5038 \defname{\defheaderxcond#2\relax$.$#3} |
| 37713 | 5039 {\putwordInstanceVariableof\ \code{#1}}% |
| 5040 \defvarargs{#3}% | |
| 5041 \endgroup | |
| 5042 } | |
| 5043 | |
| 5044 % @defmethod == @defop Method | |
| 5045 % | |
| 5046 \def\defmethod{\defmethparsebody\Edefmethod\defmethodx\defmethodheader} | |
| 5047 % | |
| 5048 % #1 is the class name, #2 the method name, #3 the args. | |
| 5049 \def\defmethodheader#1#2#3{% | |
| 5050 \dosubind{fn}{\code{#2}}{\putwordon\ \code{#1}}% entry in function index | |
| 5051 \begingroup | |
| 5052 \defname{#2}{\putwordMethodon\ \code{#1}}% | |
| 5053 \defunargs{#3}% | |
| 5054 \endgroup | |
| 5055 } | |
| 5056 | |
| 5057 % @defcv {Class Option} foo-class foo-flag | |
| 5058 | |
| 5059 \def\defcv #1 {\def\defcvtype{#1}% | |
| 5060 \defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype} | |
| 5061 | |
| 5062 \def\defcvarheader #1#2#3{% | |
| 5063 \dosubind {vr}{\code{#2}}{\putwordof\ #1}% Make entry in var index | |
| 5064 \begingroup\defname {#2}{\defcvtype\ \putwordof\ #1}% | |
| 5065 \defvarargs {#3}\endgroup % | |
| 5066 } | |
| 5067 | |
| 5068 % @defivar CLASS VARNAME == @defcv {Instance Variable} CLASS VARNAME | |
| 5069 % | |
| 5070 \def\defivar{\defvrparsebody\Edefivar\defivarx\defivarheader} | |
| 5071 % | |
| 5072 \def\defivarheader#1#2#3{% | |
| 5073 \dosubind {vr}{\code{#2}}{\putwordof\ #1}% entry in var index | |
| 5074 \begingroup | |
| 5075 \defname{#2}{\putwordInstanceVariableof\ #1}% | |
| 5076 \defvarargs{#3}% | |
| 5077 \endgroup | |
| 5078 } | |
| 5079 | |
| 5080 % @defvar | |
| 5081 % First, define the processing that is wanted for arguments of @defvar. | |
| 5082 % This is actually simple: just print them in roman. | |
| 5083 % This must expand the args and terminate the paragraph they make up | |
| 5084 \def\defvarargs #1{\normalparens #1% | |
| 5085 \interlinepenalty=10000 | |
| 5086 \endgraf\nobreak\vskip -\parskip\nobreak} | |
| 5087 | |
| 5088 % @defvr Counter foo-count | |
| 5089 | |
| 5090 \def\defvr{\defvrparsebody\Edefvr\defvrx\defvrheader} | |
| 5091 | |
| 5092 \def\defvrheader #1#2#3{\doind {vr}{\code{#2}}% | |
| 5093 \begingroup\defname {#2}{#1}\defvarargs{#3}\endgroup} | |
| 5094 | |
| 5095 % @defvar == @defvr Variable | |
| 5096 | |
| 5097 \def\defvar{\defvarparsebody\Edefvar\defvarx\defvarheader} | |
| 5098 | |
| 5099 \def\defvarheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index | |
| 5100 \begingroup\defname {#1}{\putwordDefvar}% | |
| 5101 \defvarargs {#2}\endgroup % | |
| 5102 } | |
| 5103 | |
| 5104 % @defopt == @defvr {User Option} | |
| 5105 | |
| 5106 \def\defopt{\defvarparsebody\Edefopt\defoptx\defoptheader} | |
| 5107 | |
| 5108 \def\defoptheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index | |
| 5109 \begingroup\defname {#1}{\putwordDefopt}% | |
| 5110 \defvarargs {#2}\endgroup % | |
| 5111 } | |
| 5112 | |
| 5113 % @deftypevar int foobar | |
| 5114 | |
| 5115 \def\deftypevar{\defvarparsebody\Edeftypevar\deftypevarx\deftypevarheader} | |
| 5116 | |
| 5117 % #1 is the data type. #2 is the name, perhaps followed by text that | |
| 5118 % is actually part of the data type, which should not be put into the index. | |
| 5119 \def\deftypevarheader #1#2{% | |
| 5120 \dovarind#2 \relax% Make entry in variables index | |
| 47284 | 5121 \begingroup\defname {\defheaderxcond#1\relax$.$#2}{\putwordDeftypevar}% |
| 37713 | 5122 \interlinepenalty=10000 |
| 5123 \endgraf\nobreak\vskip -\parskip\nobreak | |
| 5124 \endgroup} | |
| 5125 \def\dovarind#1 #2\relax{\doind{vr}{\code{#1}}} | |
| 5126 | |
| 5127 % @deftypevr {Global Flag} int enable | |
| 5128 | |
| 5129 \def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader} | |
| 5130 | |
| 5131 \def\deftypevrheader #1#2#3{\dovarind#3 \relax% | |
| 47284 | 5132 \begingroup\defname {\defheaderxcond#2\relax$.$#3}{#1} |
| 37713 | 5133 \interlinepenalty=10000 |
| 5134 \endgraf\nobreak\vskip -\parskip\nobreak | |
| 5135 \endgroup} | |
| 5136 | |
| 5137 % Now define @deftp | |
| 5138 % Args are printed in bold, a slight difference from @defvar. | |
| 5139 | |
| 5140 \def\deftpargs #1{\bf \defvarargs{#1}} | |
| 5141 | |
| 5142 % @deftp Class window height width ... | |
| 5143 | |
| 5144 \def\deftp{\deftpparsebody\Edeftp\deftpx\deftpheader} | |
| 5145 | |
| 5146 \def\deftpheader #1#2#3{\doind {tp}{\code{#2}}% | |
| 5147 \begingroup\defname {#2}{#1}\deftpargs{#3}\endgroup} | |
| 5148 | |
| 5149 % These definitions are used if you use @defunx (etc.) | |
| 5150 % anywhere other than immediately after a @defun or @defunx. | |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
47284
diff
changeset
|
5151 % |
| 37713 | 5152 \def\defcvx#1 {\errmessage{@defcvx in invalid context}} |
| 5153 \def\deffnx#1 {\errmessage{@deffnx in invalid context}} | |
| 5154 \def\defivarx#1 {\errmessage{@defivarx in invalid context}} | |
| 5155 \def\defmacx#1 {\errmessage{@defmacx in invalid context}} | |
| 5156 \def\defmethodx#1 {\errmessage{@defmethodx in invalid context}} | |
| 5157 \def\defoptx #1 {\errmessage{@defoptx in invalid context}} | |
| 5158 \def\defopx#1 {\errmessage{@defopx in invalid context}} | |
| 5159 \def\defspecx#1 {\errmessage{@defspecx in invalid context}} | |
| 5160 \def\deftpx#1 {\errmessage{@deftpx in invalid context}} | |
| 5161 \def\deftypefnx#1 {\errmessage{@deftypefnx in invalid context}} | |
| 5162 \def\deftypefunx#1 {\errmessage{@deftypefunx in invalid context}} | |
| 5163 \def\deftypeivarx#1 {\errmessage{@deftypeivarx in invalid context}} | |
| 5164 \def\deftypemethodx#1 {\errmessage{@deftypemethodx in invalid context}} | |
| 5165 \def\deftypeopx#1 {\errmessage{@deftypeopx in invalid context}} | |
| 5166 \def\deftypevarx#1 {\errmessage{@deftypevarx in invalid context}} | |
| 5167 \def\deftypevrx#1 {\errmessage{@deftypevrx in invalid context}} | |
| 5168 \def\defunx#1 {\errmessage{@defunx in invalid context}} | |
| 5169 \def\defvarx#1 {\errmessage{@defvarx in invalid context}} | |
| 5170 \def\defvrx#1 {\errmessage{@defvrx in invalid context}} | |
| 5171 | |
| 5172 | |
| 5173 \message{macros,} | |
| 5174 % @macro. | |
| 5175 | |
| 5176 % To do this right we need a feature of e-TeX, \scantokens, | |
| 5177 % which we arrange to emulate with a temporary file in ordinary TeX. | |
| 5178 \ifx\eTeXversion\undefined | |
| 5179 \newwrite\macscribble | |
| 5180 \def\scanmacro#1{% | |
| 5181 \begingroup \newlinechar`\^^M | |
| 5182 % Undo catcode changes of \startcontents and \doprintindex | |
| 5183 \catcode`\@=0 \catcode`\\=12 \escapechar=`\@ | |
| 5184 % Append \endinput to make sure that TeX does not see the ending newline. | |
| 5185 \toks0={#1\endinput}% | |
| 5186 \immediate\openout\macscribble=\jobname.tmp | |
| 5187 \immediate\write\macscribble{\the\toks0}% | |
| 5188 \immediate\closeout\macscribble | |
| 5189 \let\xeatspaces\eatspaces | |
| 5190 \input \jobname.tmp | |
| 5191 \endgroup | |
| 5192 } | |
| 5193 \else | |
| 5194 \def\scanmacro#1{% | |
| 5195 \begingroup \newlinechar`\^^M | |
| 5196 % Undo catcode changes of \startcontents and \doprintindex | |
| 5197 \catcode`\@=0 \catcode`\\=12 \escapechar=`\@ | |
| 5198 \let\xeatspaces\eatspaces\scantokens{#1\endinput}\endgroup} | |
| 5199 \fi | |
| 5200 | |
| 5201 \newcount\paramno % Count of parameters | |
| 5202 \newtoks\macname % Macro name | |
| 5203 \newif\ifrecursive % Is it recursive? | |
| 5204 \def\macrolist{} % List of all defined macros in the form | |
| 5205 % \do\macro1\do\macro2... | |
| 5206 | |
| 5207 % Utility routines. | |
| 5208 % Thisdoes \let #1 = #2, except with \csnames. | |
| 5209 \def\cslet#1#2{% | |
| 5210 \expandafter\expandafter | |
| 5211 \expandafter\let | |
| 5212 \expandafter\expandafter | |
| 5213 \csname#1\endcsname | |
| 5214 \csname#2\endcsname} | |
| 5215 | |
| 5216 % Trim leading and trailing spaces off a string. | |
| 5217 % Concepts from aro-bend problem 15 (see CTAN). | |
| 5218 {\catcode`\@=11 | |
| 5219 \gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }} | |
| 5220 \gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@} | |
| 5221 \gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @} | |
| 5222 \def\unbrace#1{#1} | |
| 5223 \unbrace{\gdef\trim@@@ #1 } #2@{#1} | |
| 5224 } | |
| 5225 | |
| 5226 % Trim a single trailing ^^M off a string. | |
| 5227 {\catcode`\^^M=12\catcode`\Q=3% | |
| 5228 \gdef\eatcr #1{\eatcra #1Q^^MQ}% | |
| 5229 \gdef\eatcra#1^^MQ{\eatcrb#1Q}% | |
| 5230 \gdef\eatcrb#1Q#2Q{#1}% | |
| 5231 } | |
| 5232 | |
| 5233 % Macro bodies are absorbed as an argument in a context where | |
| 5234 % all characters are catcode 10, 11 or 12, except \ which is active | |
| 5235 % (as in normal texinfo). It is necessary to change the definition of \. | |
| 5236 | |
| 5237 % It's necessary to have hard CRs when the macro is executed. This is | |
| 5238 % done by making ^^M (\endlinechar) catcode 12 when reading the macro | |
| 5239 % body, and then making it the \newlinechar in \scanmacro. | |
| 5240 | |
| 5241 \def\macrobodyctxt{% | |
| 5242 \catcode`\~=12 | |
| 5243 \catcode`\^=12 | |
| 5244 \catcode`\_=12 | |
| 5245 \catcode`\|=12 | |
| 5246 \catcode`\<=12 | |
| 5247 \catcode`\>=12 | |
| 5248 \catcode`\+=12 | |
| 5249 \catcode`\{=12 | |
| 5250 \catcode`\}=12 | |
| 5251 \catcode`\@=12 | |
| 5252 \catcode`\^^M=12 | |
| 5253 \usembodybackslash} | |
| 5254 | |
| 5255 \def\macroargctxt{% | |
| 5256 \catcode`\~=12 | |
| 5257 \catcode`\^=12 | |
| 5258 \catcode`\_=12 | |
| 5259 \catcode`\|=12 | |
| 5260 \catcode`\<=12 | |
| 5261 \catcode`\>=12 | |
| 5262 \catcode`\+=12 | |
| 5263 \catcode`\@=12 | |
| 5264 \catcode`\\=12} | |
| 5265 | |
| 5266 % \mbodybackslash is the definition of \ in @macro bodies. | |
| 5267 % It maps \foo\ => \csname macarg.foo\endcsname => #N | |
| 5268 % where N is the macro parameter number. | |
| 5269 % We define \csname macarg.\endcsname to be \realbackslash, so | |
| 5270 % \\ in macro replacement text gets you a backslash. | |
| 5271 | |
| 5272 {\catcode`@=0 @catcode`@\=@active | |
| 5273 @gdef@usembodybackslash{@let\=@mbodybackslash} | |
| 5274 @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname} | |
| 5275 } | |
| 5276 \expandafter\def\csname macarg.\endcsname{\realbackslash} | |
| 5277 | |
| 5278 \def\macro{\recursivefalse\parsearg\macroxxx} | |
| 5279 \def\rmacro{\recursivetrue\parsearg\macroxxx} | |
| 5280 | |
| 5281 \def\macroxxx#1{% | |
| 5282 \getargs{#1}% now \macname is the macname and \argl the arglist | |
| 5283 \ifx\argl\empty % no arguments | |
| 5284 \paramno=0% | |
| 5285 \else | |
| 5286 \expandafter\parsemargdef \argl;% | |
| 5287 \fi | |
| 5288 \if1\csname ismacro.\the\macname\endcsname | |
| 5289 \message{Warning: redefining \the\macname}% | |
| 5290 \else | |
| 5291 \expandafter\ifx\csname \the\macname\endcsname \relax | |
| 47284 | 5292 \else \errmessage{Macro name \the\macname\space already defined}\fi |
| 37713 | 5293 \global\cslet{macsave.\the\macname}{\the\macname}% |
| 5294 \global\expandafter\let\csname ismacro.\the\macname\endcsname=1% | |
| 5295 % Add the macroname to \macrolist | |
| 5296 \toks0 = \expandafter{\macrolist\do}% | |
| 5297 \xdef\macrolist{\the\toks0 | |
| 5298 \expandafter\noexpand\csname\the\macname\endcsname}% | |
| 5299 \fi | |
| 5300 \begingroup \macrobodyctxt | |
| 5301 \ifrecursive \expandafter\parsermacbody | |
| 5302 \else \expandafter\parsemacbody | |
| 5303 \fi} | |
| 5304 | |
| 5305 \def\unmacro{\parsearg\unmacroxxx} | |
| 5306 \def\unmacroxxx#1{% | |
| 5307 \if1\csname ismacro.#1\endcsname | |
| 5308 \global\cslet{#1}{macsave.#1}% | |
| 5309 \global\expandafter\let \csname ismacro.#1\endcsname=0% | |
| 5310 % Remove the macro name from \macrolist | |
| 5311 \begingroup | |
| 5312 \edef\tempa{\expandafter\noexpand\csname#1\endcsname}% | |
| 5313 \def\do##1{% | |
| 5314 \def\tempb{##1}% | |
| 5315 \ifx\tempa\tempb | |
| 5316 % remove this | |
| 5317 \else | |
| 5318 \toks0 = \expandafter{\newmacrolist\do}% | |
| 5319 \edef\newmacrolist{\the\toks0\expandafter\noexpand\tempa}% | |
| 5320 \fi}% | |
| 5321 \def\newmacrolist{}% | |
| 5322 % Execute macro list to define \newmacrolist | |
| 5323 \macrolist | |
| 5324 \global\let\macrolist\newmacrolist | |
| 5325 \endgroup | |
| 5326 \else | |
| 5327 \errmessage{Macro #1 not defined}% | |
| 5328 \fi | |
| 5329 } | |
| 5330 | |
| 5331 % This makes use of the obscure feature that if the last token of a | |
| 5332 % <parameter list> is #, then the preceding argument is delimited by | |
| 5333 % an opening brace, and that opening brace is not consumed. | |
| 5334 \def\getargs#1{\getargsxxx#1{}} | |
| 5335 \def\getargsxxx#1#{\getmacname #1 \relax\getmacargs} | |
| 5336 \def\getmacname #1 #2\relax{\macname={#1}} | |
| 5337 \def\getmacargs#1{\def\argl{#1}} | |
| 5338 | |
| 5339 % Parse the optional {params} list. Set up \paramno and \paramlist | |
| 5340 % so \defmacro knows what to do. Define \macarg.blah for each blah | |
| 5341 % in the params list, to be ##N where N is the position in that list. | |
| 5342 % That gets used by \mbodybackslash (above). | |
| 5343 | |
| 5344 % We need to get `macro parameter char #' into several definitions. | |
| 5345 % The technique used is stolen from LaTeX: let \hash be something | |
| 5346 % unexpandable, insert that wherever you need a #, and then redefine | |
| 5347 % it to # just before using the token list produced. | |
| 5348 % | |
| 5349 % The same technique is used to protect \eatspaces till just before | |
| 5350 % the macro is used. | |
| 5351 | |
| 5352 \def\parsemargdef#1;{\paramno=0\def\paramlist{}% | |
| 5353 \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,} | |
| 5354 \def\parsemargdefxxx#1,{% | |
| 5355 \if#1;\let\next=\relax | |
| 5356 \else \let\next=\parsemargdefxxx | |
| 5357 \advance\paramno by 1% | |
| 5358 \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname | |
| 5359 {\xeatspaces{\hash\the\paramno}}% | |
| 5360 \edef\paramlist{\paramlist\hash\the\paramno,}% | |
| 5361 \fi\next} | |
| 5362 | |
| 5363 % These two commands read recursive and nonrecursive macro bodies. | |
| 5364 % (They're different since rec and nonrec macros end differently.) | |
| 5365 | |
| 5366 \long\def\parsemacbody#1@end macro% | |
| 5367 {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% | |
| 5368 \long\def\parsermacbody#1@end rmacro% | |
| 5369 {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% | |
| 5370 | |
| 5371 % This defines the macro itself. There are six cases: recursive and | |
| 5372 % nonrecursive macros of zero, one, and many arguments. | |
| 5373 % Much magic with \expandafter here. | |
| 5374 % \xdef is used so that macro definitions will survive the file | |
| 5375 % they're defined in; @include reads the file inside a group. | |
| 5376 \def\defmacro{% | |
| 5377 \let\hash=##% convert placeholders to macro parameter chars | |
| 5378 \ifrecursive | |
| 5379 \ifcase\paramno | |
| 5380 % 0 | |
| 5381 \expandafter\xdef\csname\the\macname\endcsname{% | |
| 5382 \noexpand\scanmacro{\temp}}% | |
| 5383 \or % 1 | |
| 5384 \expandafter\xdef\csname\the\macname\endcsname{% | |
| 5385 \bgroup\noexpand\macroargctxt | |
| 5386 \noexpand\braceorline | |
| 5387 \expandafter\noexpand\csname\the\macname xxx\endcsname}% | |
| 5388 \expandafter\xdef\csname\the\macname xxx\endcsname##1{% | |
| 5389 \egroup\noexpand\scanmacro{\temp}}% | |
| 5390 \else % many | |
| 5391 \expandafter\xdef\csname\the\macname\endcsname{% | |
| 5392 \bgroup\noexpand\macroargctxt | |
| 5393 \noexpand\csname\the\macname xx\endcsname}% | |
| 5394 \expandafter\xdef\csname\the\macname xx\endcsname##1{% | |
| 5395 \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% | |
| 5396 \expandafter\expandafter | |
| 5397 \expandafter\xdef | |
| 5398 \expandafter\expandafter | |
| 5399 \csname\the\macname xxx\endcsname | |
| 5400 \paramlist{\egroup\noexpand\scanmacro{\temp}}% | |
| 5401 \fi | |
| 5402 \else | |
| 5403 \ifcase\paramno | |
| 5404 % 0 | |
| 5405 \expandafter\xdef\csname\the\macname\endcsname{% | |
| 5406 \noexpand\norecurse{\the\macname}% | |
| 5407 \noexpand\scanmacro{\temp}\egroup}% | |
| 5408 \or % 1 | |
| 5409 \expandafter\xdef\csname\the\macname\endcsname{% | |
| 5410 \bgroup\noexpand\macroargctxt | |
| 5411 \noexpand\braceorline | |
| 5412 \expandafter\noexpand\csname\the\macname xxx\endcsname}% | |
| 5413 \expandafter\xdef\csname\the\macname xxx\endcsname##1{% | |
| 5414 \egroup | |
| 5415 \noexpand\norecurse{\the\macname}% | |
| 5416 \noexpand\scanmacro{\temp}\egroup}% | |
| 5417 \else % many | |
| 5418 \expandafter\xdef\csname\the\macname\endcsname{% | |
| 5419 \bgroup\noexpand\macroargctxt | |
| 5420 \expandafter\noexpand\csname\the\macname xx\endcsname}% | |
| 5421 \expandafter\xdef\csname\the\macname xx\endcsname##1{% | |
| 5422 \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% | |
| 5423 \expandafter\expandafter | |
| 5424 \expandafter\xdef | |
| 5425 \expandafter\expandafter | |
| 5426 \csname\the\macname xxx\endcsname | |
| 5427 \paramlist{% | |
| 5428 \egroup | |
| 5429 \noexpand\norecurse{\the\macname}% | |
| 5430 \noexpand\scanmacro{\temp}\egroup}% | |
| 5431 \fi | |
| 5432 \fi} | |
| 5433 | |
| 5434 \def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} | |
| 5435 | |
| 5436 % \braceorline decides whether the next nonwhitespace character is a | |
| 5437 % {. If so it reads up to the closing }, if not, it reads the whole | |
| 5438 % line. Whatever was read is then fed to the next control sequence | |
| 5439 % as an argument (by \parsebrace or \parsearg) | |
| 5440 \def\braceorline#1{\let\next=#1\futurelet\nchar\braceorlinexxx} | |
| 5441 \def\braceorlinexxx{% | |
| 5442 \ifx\nchar\bgroup\else | |
| 5443 \expandafter\parsearg | |
| 5444 \fi \next} | |
| 5445 | |
| 5446 % We mant to disable all macros during \shipout so that they are not | |
| 5447 % expanded by \write. | |
| 5448 \def\turnoffmacros{\begingroup \def\do##1{\let\noexpand##1=\relax}% | |
| 5449 \edef\next{\macrolist}\expandafter\endgroup\next} | |
| 5450 | |
| 5451 | |
| 5452 % @alias. | |
| 5453 % We need some trickery to remove the optional spaces around the equal | |
| 5454 % sign. Just make them active and then expand them all to nothing. | |
| 5455 \def\alias{\begingroup\obeyspaces\parsearg\aliasxxx} | |
| 5456 \def\aliasxxx #1{\aliasyyy#1\relax} | |
| 5457 \def\aliasyyy #1=#2\relax{\ignoreactivespaces | |
| 5458 \edef\next{\global\let\expandafter\noexpand\csname#1\endcsname=% | |
| 5459 \expandafter\noexpand\csname#2\endcsname}% | |
| 5460 \expandafter\endgroup\next} | |
| 5461 | |
| 5462 | |
| 5463 \message{cross references,} | |
| 5464 % @xref etc. | |
| 5465 | |
| 5466 \newwrite\auxfile | |
| 5467 | |
| 5468 \newif\ifhavexrefs % True if xref values are known. | |
| 5469 \newif\ifwarnedxrefs % True if we warned once that they aren't known. | |
| 5470 | |
| 5471 % @inforef is relatively simple. | |
| 5472 \def\inforef #1{\inforefzzz #1,,,,**} | |
| 5473 \def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, | |
| 5474 node \samp{\ignorespaces#1{}}} | |
| 5475 | |
| 5476 % @node's job is to define \lastnode. | |
| 5477 \def\node{\ENVcheck\parsearg\nodezzz} | |
| 5478 \def\nodezzz#1{\nodexxx [#1,]} | |
| 5479 \def\nodexxx[#1,#2]{\gdef\lastnode{#1}} | |
| 5480 \let\nwnode=\node | |
| 5481 \let\lastnode=\relax | |
| 5482 | |
| 5483 % The sectioning commands (@chapter, etc.) call these. | |
| 5484 \def\donoderef{% | |
| 5485 \ifx\lastnode\relax\else | |
| 5486 \expandafter\expandafter\expandafter\setref{\lastnode}% | |
| 5487 {Ysectionnumberandtype}% | |
| 5488 \global\let\lastnode=\relax | |
| 5489 \fi | |
| 5490 } | |
| 5491 \def\unnumbnoderef{% | |
| 5492 \ifx\lastnode\relax\else | |
| 5493 \expandafter\expandafter\expandafter\setref{\lastnode}{Ynothing}% | |
| 5494 \global\let\lastnode=\relax | |
| 5495 \fi | |
| 5496 } | |
| 5497 \def\appendixnoderef{% | |
| 5498 \ifx\lastnode\relax\else | |
| 5499 \expandafter\expandafter\expandafter\setref{\lastnode}% | |
| 5500 {Yappendixletterandtype}% | |
| 5501 \global\let\lastnode=\relax | |
| 5502 \fi | |
| 5503 } | |
| 5504 | |
| 5505 | |
| 5506 % @anchor{NAME} -- define xref target at arbitrary point. | |
| 5507 % | |
| 5508 \newcount\savesfregister | |
| 5509 \gdef\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi} | |
| 5510 \gdef\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi} | |
| 5511 \gdef\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces} | |
| 5512 | |
| 5513 % \setref{NAME}{SNT} defines a cross-reference point NAME, namely | |
| 5514 % NAME-title, NAME-pg, and NAME-SNT. Called from \foonoderef. We have | |
| 5515 % to set \indexdummies so commands such as @code in a section title | |
| 5516 % aren't expanded. It would be nicer not to expand the titles in the | |
| 5517 % first place, but there's so many layers that that is hard to do. | |
| 5518 % | |
| 5519 \def\setref#1#2{{% | |
| 5520 \indexdummies | |
| 5521 \pdfmkdest{#1}% | |
| 5522 \dosetq{#1-title}{Ytitle}% | |
| 5523 \dosetq{#1-pg}{Ypagenumber}% | |
| 5524 \dosetq{#1-snt}{#2}% | |
| 5525 }} | |
| 5526 | |
| 5527 % @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is | |
| 5528 % the node name, #2 the name of the Info cross-reference, #3 the printed | |
| 5529 % node name, #4 the name of the Info file, #5 the name of the printed | |
| 5530 % manual. All but the node name can be omitted. | |
| 5531 % | |
| 5532 \def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]} | |
| 5533 \def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} | |
| 5534 \def\ref#1{\xrefX[#1,,,,,,,]} | |
| 5535 \def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup | |
| 5536 \unsepspaces | |
| 5537 \def\printedmanual{\ignorespaces #5}% | |
| 5538 \def\printednodename{\ignorespaces #3}% | |
| 5539 \setbox1=\hbox{\printedmanual}% | |
| 5540 \setbox0=\hbox{\printednodename}% | |
| 5541 \ifdim \wd0 = 0pt | |
| 5542 % No printed node name was explicitly given. | |
| 5543 \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax | |
| 5544 % Use the node name inside the square brackets. | |
| 5545 \def\printednodename{\ignorespaces #1}% | |
| 5546 \else | |
| 5547 % Use the actual chapter/section title appear inside | |
| 5548 % the square brackets. Use the real section title if we have it. | |
| 5549 \ifdim \wd1 > 0pt | |
| 5550 % It is in another manual, so we don't have it. | |
| 5551 \def\printednodename{\ignorespaces #1}% | |
| 5552 \else | |
| 5553 \ifhavexrefs | |
| 5554 % We know the real title if we have the xref values. | |
| 5555 \def\printednodename{\refx{#1-title}{}}% | |
| 5556 \else | |
| 5557 % Otherwise just copy the Info node name. | |
| 5558 \def\printednodename{\ignorespaces #1}% | |
| 5559 \fi% | |
| 5560 \fi | |
| 5561 \fi | |
| 5562 \fi | |
| 5563 % | |
| 5564 % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not | |
| 5565 % insert empty discretionaries after hyphens, which means that it will | |
| 5566 % not find a line break at a hyphen in a node names. Since some manuals | |
| 5567 % are best written with fairly long node names, containing hyphens, this | |
| 5568 % is a loss. Therefore, we give the text of the node name again, so it | |
| 5569 % is as if TeX is seeing it for the first time. | |
| 5570 \ifpdf | |
| 5571 \leavevmode | |
| 5572 \getfilename{#4}% | |
| 47284 | 5573 {\normalturnoffactive |
| 5574 \ifnum\filenamelength>0 | |
| 5575 \startlink attr{/Border [0 0 0]}% | |
| 5576 goto file{\the\filename.pdf} name{#1}% | |
| 5577 \else | |
| 5578 \startlink attr{/Border [0 0 0]}% | |
| 5579 goto name{#1}% | |
| 5580 \fi | |
| 5581 }% | |
| 37713 | 5582 \linkcolor |
| 5583 \fi | |
| 5584 % | |
| 5585 \ifdim \wd1 > 0pt | |
| 5586 \putwordsection{} ``\printednodename'' \putwordin{} \cite{\printedmanual}% | |
| 5587 \else | |
| 5588 % _ (for example) has to be the character _ for the purposes of the | |
| 5589 % control sequence corresponding to the node, but it has to expand | |
| 5590 % into the usual \leavevmode...\vrule stuff for purposes of | |
| 5591 % printing. So we \turnoffactive for the \refx-snt, back on for the | |
| 5592 % printing, back off for the \refx-pg. | |
| 5593 {\normalturnoffactive | |
| 5594 % Only output a following space if the -snt ref is nonempty; for | |
| 5595 % @unnumbered and @anchor, it won't be. | |
| 5596 \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}% | |
| 5597 \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi | |
| 5598 }% | |
| 5599 % [mynode], | |
| 5600 [\printednodename],\space | |
| 5601 % page 3 | |
| 5602 \turnoffactive \putwordpage\tie\refx{#1-pg}{}% | |
| 5603 \fi | |
| 5604 \endlink | |
| 5605 \endgroup} | |
| 5606 | |
| 5607 % \dosetq is the interface for calls from other macros | |
| 5608 | |
| 5609 % Use \normalturnoffactive so that punctuation chars such as underscore | |
| 5610 % and backslash work in node names. (\turnoffactive doesn't do \.) | |
| 5611 \def\dosetq#1#2{% | |
| 5612 {\let\folio=0% | |
| 5613 \normalturnoffactive | |
| 5614 \edef\next{\write\auxfile{\internalsetq{#1}{#2}}}% | |
| 5615 \iflinks | |
| 5616 \next | |
| 5617 \fi | |
| 5618 }% | |
| 5619 } | |
| 5620 | |
| 5621 % \internalsetq {foo}{page} expands into | |
| 5622 % CHARACTERS 'xrdef {foo}{...expansion of \Ypage...} | |
| 5623 % When the aux file is read, ' is the escape character | |
| 5624 | |
| 5625 \def\internalsetq #1#2{'xrdef {#1}{\csname #2\endcsname}} | |
| 5626 | |
| 5627 % Things to be expanded by \internalsetq | |
| 5628 | |
| 5629 \def\Ypagenumber{\folio} | |
| 5630 | |
| 5631 \def\Ytitle{\thissection} | |
| 5632 | |
| 5633 \def\Ynothing{} | |
| 5634 | |
| 5635 \def\Ysectionnumberandtype{% | |
| 5636 \ifnum\secno=0 \putwordChapter\xreftie\the\chapno % | |
| 5637 \else \ifnum \subsecno=0 \putwordSection\xreftie\the\chapno.\the\secno % | |
| 5638 \else \ifnum \subsubsecno=0 % | |
| 5639 \putwordSection\xreftie\the\chapno.\the\secno.\the\subsecno % | |
| 5640 \else % | |
| 5641 \putwordSection\xreftie\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno % | |
| 5642 \fi \fi \fi } | |
| 5643 | |
| 5644 \def\Yappendixletterandtype{% | |
| 5645 \ifnum\secno=0 \putwordAppendix\xreftie'char\the\appendixno{}% | |
| 5646 \else \ifnum \subsecno=0 \putwordSection\xreftie'char\the\appendixno.\the\secno % | |
| 5647 \else \ifnum \subsubsecno=0 % | |
| 5648 \putwordSection\xreftie'char\the\appendixno.\the\secno.\the\subsecno % | |
| 5649 \else % | |
| 5650 \putwordSection\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno % | |
| 5651 \fi \fi \fi } | |
| 5652 | |
| 5653 \gdef\xreftie{'tie} | |
| 5654 | |
| 5655 % Use TeX 3.0's \inputlineno to get the line number, for better error | |
| 5656 % messages, but if we're using an old version of TeX, don't do anything. | |
| 5657 % | |
| 5658 \ifx\inputlineno\thisisundefined | |
| 5659 \let\linenumber = \empty % Non-3.0. | |
| 5660 \else | |
| 5661 \def\linenumber{\the\inputlineno:\space} | |
| 5662 \fi | |
| 5663 | |
| 5664 % Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME. | |
| 5665 % If its value is nonempty, SUFFIX is output afterward. | |
| 5666 | |
| 5667 \def\refx#1#2{% | |
| 5668 \expandafter\ifx\csname X#1\endcsname\relax | |
| 5669 % If not defined, say something at least. | |
| 5670 \angleleft un\-de\-fined\angleright | |
| 5671 \iflinks | |
| 5672 \ifhavexrefs | |
| 5673 \message{\linenumber Undefined cross reference `#1'.}% | |
| 5674 \else | |
| 5675 \ifwarnedxrefs\else | |
| 5676 \global\warnedxrefstrue | |
| 5677 \message{Cross reference values unknown; you must run TeX again.}% | |
| 5678 \fi | |
| 5679 \fi | |
| 5680 \fi | |
| 5681 \else | |
| 5682 % It's defined, so just use it. | |
| 5683 \csname X#1\endcsname | |
| 5684 \fi | |
| 5685 #2% Output the suffix in any case. | |
| 5686 } | |
| 5687 | |
| 5688 % This is the macro invoked by entries in the aux file. | |
| 5689 % | |
| 5690 \def\xrdef#1{\begingroup | |
| 5691 % Reenable \ as an escape while reading the second argument. | |
| 5692 \catcode`\\ = 0 | |
| 5693 \afterassignment\endgroup | |
| 5694 \expandafter\gdef\csname X#1\endcsname | |
| 5695 } | |
| 5696 | |
| 5697 % Read the last existing aux file, if any. No error if none exists. | |
| 5698 \def\readauxfile{\begingroup | |
| 5699 \catcode`\^^@=\other | |
| 5700 \catcode`\^^A=\other | |
| 5701 \catcode`\^^B=\other | |
| 5702 \catcode`\^^C=\other | |
| 5703 \catcode`\^^D=\other | |
| 5704 \catcode`\^^E=\other | |
| 5705 \catcode`\^^F=\other | |
| 5706 \catcode`\^^G=\other | |
| 5707 \catcode`\^^H=\other | |
| 5708 \catcode`\^^K=\other | |
| 5709 \catcode`\^^L=\other | |
| 5710 \catcode`\^^N=\other | |
| 5711 \catcode`\^^P=\other | |
| 5712 \catcode`\^^Q=\other | |
| 5713 \catcode`\^^R=\other | |
| 5714 \catcode`\^^S=\other | |
| 5715 \catcode`\^^T=\other | |
| 5716 \catcode`\^^U=\other | |
| 5717 \catcode`\^^V=\other | |
| 5718 \catcode`\^^W=\other | |
| 5719 \catcode`\^^X=\other | |
| 5720 \catcode`\^^Z=\other | |
| 5721 \catcode`\^^[=\other | |
| 5722 \catcode`\^^\=\other | |
| 5723 \catcode`\^^]=\other | |
| 5724 \catcode`\^^^=\other | |
| 5725 \catcode`\^^_=\other | |
| 5726 \catcode`\@=\other | |
| 5727 \catcode`\^=\other | |
| 5728 % It was suggested to define this as 7, which would allow ^^e4 etc. | |
| 5729 % in xref tags, i.e., node names. But since ^^e4 notation isn't | |
| 5730 % supported in the main text, it doesn't seem desirable. Furthermore, | |
| 5731 % that is not enough: for node names that actually contain a ^ | |
| 5732 % character, we would end up writing a line like this: 'xrdef {'hat | |
| 5733 % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first | |
| 5734 % argument, and \hat is not an expandable control sequence. It could | |
| 5735 % all be worked out, but why? Either we support ^^ or we don't. | |
| 5736 % | |
| 5737 % The other change necessary for this was to define \auxhat: | |
| 5738 % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter | |
| 5739 % and then to call \auxhat in \setq. | |
| 5740 % | |
| 5741 \catcode`\~=\other | |
| 5742 \catcode`\[=\other | |
| 5743 \catcode`\]=\other | |
| 5744 \catcode`\"=\other | |
| 5745 \catcode`\_=\other | |
| 5746 \catcode`\|=\other | |
| 5747 \catcode`\<=\other | |
| 5748 \catcode`\>=\other | |
| 5749 \catcode`\$=\other | |
| 5750 \catcode`\#=\other | |
| 5751 \catcode`\&=\other | |
| 5752 \catcode`+=\other % avoid \+ for paranoia even though we've turned it off | |
| 5753 % Make the characters 128-255 be printing characters | |
| 5754 {% | |
| 5755 \count 1=128 | |
| 5756 \def\loop{% | |
| 5757 \catcode\count 1=\other | |
| 5758 \advance\count 1 by 1 | |
| 5759 \ifnum \count 1<256 \loop \fi | |
| 5760 }% | |
| 5761 }% | |
| 5762 % The aux file uses ' as the escape (for now). | |
| 5763 % Turn off \ as an escape so we do not lose on | |
| 5764 % entries which were dumped with control sequences in their names. | |
| 5765 % For example, 'xrdef {$\leq $-fun}{page ...} made by @defun ^^ | |
| 5766 % Reference to such entries still does not work the way one would wish, | |
| 5767 % but at least they do not bomb out when the aux file is read in. | |
| 5768 \catcode`\{=1 | |
| 5769 \catcode`\}=2 | |
| 5770 \catcode`\%=\other | |
| 5771 \catcode`\'=0 | |
| 5772 \catcode`\\=\other | |
| 5773 % | |
| 5774 \openin 1 \jobname.aux | |
| 5775 \ifeof 1 \else | |
| 5776 \closein 1 | |
| 5777 \input \jobname.aux | |
| 5778 \global\havexrefstrue | |
| 5779 \global\warnedobstrue | |
| 5780 \fi | |
| 5781 % Open the new aux file. TeX will close it automatically at exit. | |
| 5782 \openout\auxfile=\jobname.aux | |
| 5783 \endgroup} | |
| 5784 | |
| 5785 | |
| 5786 % Footnotes. | |
| 5787 | |
| 5788 \newcount \footnoteno | |
| 5789 | |
| 5790 % The trailing space in the following definition for supereject is | |
| 5791 % vital for proper filling; pages come out unaligned when you do a | |
| 5792 % pagealignmacro call if that space before the closing brace is | |
| 5793 % removed. (Generally, numeric constants should always be followed by a | |
| 5794 % space to prevent strange expansion errors.) | |
| 5795 \def\supereject{\par\penalty -20000\footnoteno =0 } | |
| 5796 | |
| 5797 % @footnotestyle is meaningful for info output only. | |
| 5798 \let\footnotestyle=\comment | |
| 5799 | |
| 5800 \let\ptexfootnote=\footnote | |
| 5801 | |
| 5802 {\catcode `\@=11 | |
| 5803 % | |
| 5804 % Auto-number footnotes. Otherwise like plain. | |
| 5805 \gdef\footnote{% | |
| 5806 \global\advance\footnoteno by \@ne | |
| 5807 \edef\thisfootno{$^{\the\footnoteno}$}% | |
| 5808 % | |
| 5809 % In case the footnote comes at the end of a sentence, preserve the | |
| 5810 % extra spacing after we do the footnote number. | |
| 5811 \let\@sf\empty | |
| 5812 \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi | |
| 5813 % | |
| 5814 % Remove inadvertent blank space before typesetting the footnote number. | |
| 5815 \unskip | |
| 5816 \thisfootno\@sf | |
| 5817 \footnotezzz | |
| 5818 }% | |
| 5819 | |
| 5820 % Don't bother with the trickery in plain.tex to not require the | |
| 5821 % footnote text as a parameter. Our footnotes don't need to be so general. | |
| 5822 % | |
| 5823 % Oh yes, they do; otherwise, @ifset and anything else that uses | |
| 5824 % \parseargline fail inside footnotes because the tokens are fixed when | |
| 5825 % the footnote is read. --karl, 16nov96. | |
| 5826 % | |
| 5827 \long\gdef\footnotezzz{\insert\footins\bgroup | |
| 5828 % We want to typeset this text as a normal paragraph, even if the | |
| 5829 % footnote reference occurs in (for example) a display environment. | |
| 5830 % So reset some parameters. | |
| 5831 \interlinepenalty\interfootnotelinepenalty | |
| 5832 \splittopskip\ht\strutbox % top baseline for broken footnotes | |
| 5833 \splitmaxdepth\dp\strutbox | |
| 5834 \floatingpenalty\@MM | |
| 5835 \leftskip\z@skip | |
| 5836 \rightskip\z@skip | |
| 5837 \spaceskip\z@skip | |
| 5838 \xspaceskip\z@skip | |
| 5839 \parindent\defaultparindent | |
| 5840 % | |
| 5841 \smallfonts \rm | |
| 5842 % | |
| 47284 | 5843 % Because we use hanging indentation in footnotes, a @noindent appears |
| 5844 % to exdent this text, so make it be a no-op. makeinfo does not use | |
| 5845 % hanging indentation so @noindent can still be needed within footnote | |
| 5846 % text after an @example or the like (not that this is good style). | |
| 5847 \let\noindent = \relax | |
| 5848 % | |
| 5849 % Hang the footnote text off the number. Use \everypar in case the | |
| 5850 % footnote extends for more than one paragraph. | |
| 5851 \everypar = {\hang}% | |
| 37713 | 5852 \textindent{\thisfootno}% |
| 5853 % | |
| 5854 % Don't crash into the line above the footnote text. Since this | |
| 5855 % expands into a box, it must come within the paragraph, lest it | |
| 5856 % provide a place where TeX can split the footnote. | |
| 5857 \footstrut | |
| 5858 \futurelet\next\fo@t | |
| 5859 } | |
| 5860 \def\fo@t{\ifcat\bgroup\noexpand\next \let\next\f@@t | |
| 5861 \else\let\next\f@t\fi \next} | |
| 5862 \def\f@@t{\bgroup\aftergroup\@foot\let\next} | |
| 5863 \def\f@t#1{#1\@foot} | |
| 5864 \def\@foot{\strut\par\egroup} | |
| 5865 | |
| 5866 }%end \catcode `\@=11 | |
| 5867 | |
| 5868 % @| inserts a changebar to the left of the current line. It should | |
| 5869 % surround any changed text. This approach does *not* work if the | |
| 5870 % change spans more than two lines of output. To handle that, we would | |
| 5871 % have adopt a much more difficult approach (putting marks into the main | |
| 5872 % vertical list for the beginning and end of each change). | |
| 5873 % | |
| 5874 \def\|{% | |
| 5875 % \vadjust can only be used in horizontal mode. | |
| 5876 \leavevmode | |
| 5877 % | |
| 5878 % Append this vertical mode material after the current line in the output. | |
| 5879 \vadjust{% | |
| 5880 % We want to insert a rule with the height and depth of the current | |
| 5881 % leading; that is exactly what \strutbox is supposed to record. | |
| 5882 \vskip-\baselineskip | |
| 5883 % | |
| 5884 % \vadjust-items are inserted at the left edge of the type. So | |
| 5885 % the \llap here moves out into the left-hand margin. | |
| 5886 \llap{% | |
| 5887 % | |
| 5888 % For a thicker or thinner bar, change the `1pt'. | |
| 5889 \vrule height\baselineskip width1pt | |
| 5890 % | |
| 5891 % This is the space between the bar and the text. | |
| 5892 \hskip 12pt | |
| 5893 }% | |
| 5894 }% | |
| 5895 } | |
| 5896 | |
| 5897 % For a final copy, take out the rectangles | |
| 5898 % that mark overfull boxes (in case you have decided | |
| 5899 % that the text looks ok even though it passes the margin). | |
| 5900 % | |
| 5901 \def\finalout{\overfullrule=0pt} | |
| 5902 | |
| 5903 % @image. We use the macros from epsf.tex to support this. | |
| 5904 % If epsf.tex is not installed and @image is used, we complain. | |
| 5905 % | |
| 5906 % Check for and read epsf.tex up front. If we read it only at @image | |
| 5907 % time, we might be inside a group, and then its definitions would get | |
| 5908 % undone and the next image would fail. | |
| 5909 \openin 1 = epsf.tex | |
| 5910 \ifeof 1 \else | |
| 5911 \closein 1 | |
| 5912 % Do not bother showing banner with post-v2.7 epsf.tex (available in | |
| 5913 % doc/epsf.tex until it shows up on ctan). | |
| 5914 \def\epsfannounce{\toks0 = }% | |
| 5915 \input epsf.tex | |
| 5916 \fi | |
| 5917 % | |
| 5918 % We will only complain once about lack of epsf.tex. | |
| 5919 \newif\ifwarnednoepsf | |
| 5920 \newhelp\noepsfhelp{epsf.tex must be installed for images to | |
| 5921 work. It is also included in the Texinfo distribution, or you can get | |
| 5922 it from ftp://tug.org/tex/epsf.tex.} | |
| 5923 % | |
| 5924 \def\image#1{% | |
| 5925 \ifx\epsfbox\undefined | |
| 5926 \ifwarnednoepsf \else | |
| 5927 \errhelp = \noepsfhelp | |
| 5928 \errmessage{epsf.tex not found, images will be ignored}% | |
| 5929 \global\warnednoepsftrue | |
| 5930 \fi | |
| 5931 \else | |
| 47284 | 5932 \imagexxx #1,,,,,\finish |
| 37713 | 5933 \fi |
| 5934 } | |
| 5935 % | |
| 5936 % Arguments to @image: | |
| 5937 % #1 is (mandatory) image filename; we tack on .eps extension. | |
| 5938 % #2 is (optional) width, #3 is (optional) height. | |
| 47284 | 5939 % #4 is (ignored optional) html alt text. |
| 5940 % #5 is (ignored optional) extension. | |
| 5941 % #6 is just the usual extra ignored arg for parsing this stuff. | |
| 5942 \newif\ifimagevmode | |
| 5943 \def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup | |
| 5944 \catcode`\^^M = 5 % in case we're inside an example | |
| 5945 \normalturnoffactive % allow _ et al. in names | |
| 5946 % If the image is by itself, center it. | |
| 5947 \ifvmode | |
| 5948 \imagevmodetrue | |
| 5949 \nobreak\bigskip | |
| 5950 % Usually we'll have text after the image which will insert | |
| 5951 % \parskip glue, so insert it here too to equalize the space | |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
47284
diff
changeset
|
5952 % above and below. |
| 47284 | 5953 \nobreak\vskip\parskip |
| 5954 \nobreak | |
| 5955 \line\bgroup\hss | |
| 5956 \fi | |
| 5957 % | |
| 5958 % Output the image. | |
| 37713 | 5959 \ifpdf |
| 47284 | 5960 \dopdfimage{#1}{#2}{#3}% |
| 37713 | 5961 \else |
| 5962 % \epsfbox itself resets \epsf?size at each figure. | |
| 5963 \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi | |
| 5964 \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi | |
| 47284 | 5965 \epsfbox{#1.eps}% |
| 37713 | 5966 \fi |
| 47284 | 5967 % |
| 5968 \ifimagevmode \hss \egroup \bigbreak \fi % space after the image | |
| 5969 \endgroup} | |
| 37713 | 5970 |
| 5971 | |
| 5972 \message{localization,} | |
| 5973 % and i18n. | |
| 5974 | |
| 5975 % @documentlanguage is usually given very early, just after | |
| 5976 % @setfilename. If done too late, it may not override everything | |
| 5977 % properly. Single argument is the language abbreviation. | |
| 5978 % It would be nice if we could set up a hyphenation file here. | |
| 5979 % | |
| 5980 \def\documentlanguage{\parsearg\dodocumentlanguage} | |
| 5981 \def\dodocumentlanguage#1{% | |
| 5982 \tex % read txi-??.tex file in plain TeX. | |
| 5983 % Read the file if it exists. | |
| 5984 \openin 1 txi-#1.tex | |
| 5985 \ifeof1 | |
| 5986 \errhelp = \nolanghelp | |
| 5987 \errmessage{Cannot read language file txi-#1.tex}% | |
| 5988 \let\temp = \relax | |
| 5989 \else | |
| 5990 \def\temp{\input txi-#1.tex }% | |
| 5991 \fi | |
| 5992 \temp | |
| 5993 \endgroup | |
| 5994 } | |
| 5995 \newhelp\nolanghelp{The given language definition file cannot be found or | |
| 5996 is empty. Maybe you need to install it? In the current directory | |
| 5997 should work if nowhere else does.} | |
| 5998 | |
| 5999 | |
| 6000 % @documentencoding should change something in TeX eventually, most | |
| 6001 % likely, but for now just recognize it. | |
| 6002 \let\documentencoding = \comment | |
| 6003 | |
| 6004 | |
| 6005 % Page size parameters. | |
| 6006 % | |
| 6007 \newdimen\defaultparindent \defaultparindent = 15pt | |
| 6008 | |
| 6009 \chapheadingskip = 15pt plus 4pt minus 2pt | |
| 6010 \secheadingskip = 12pt plus 3pt minus 2pt | |
| 6011 \subsecheadingskip = 9pt plus 2pt minus 2pt | |
| 6012 | |
| 6013 % Prevent underfull vbox error messages. | |
| 6014 \vbadness = 10000 | |
| 6015 | |
| 6016 % Don't be so finicky about underfull hboxes, either. | |
| 6017 \hbadness = 2000 | |
| 6018 | |
| 6019 % Following George Bush, just get rid of widows and orphans. | |
| 6020 \widowpenalty=10000 | |
| 6021 \clubpenalty=10000 | |
| 6022 | |
| 6023 % Use TeX 3.0's \emergencystretch to help line breaking, but if we're | |
| 6024 % using an old version of TeX, don't do anything. We want the amount of | |
| 6025 % stretch added to depend on the line length, hence the dependence on | |
| 6026 % \hsize. We call this whenever the paper size is set. | |
| 6027 % | |
| 6028 \def\setemergencystretch{% | |
| 6029 \ifx\emergencystretch\thisisundefined | |
| 6030 % Allow us to assign to \emergencystretch anyway. | |
| 6031 \def\emergencystretch{\dimen0}% | |
| 6032 \else | |
| 6033 \emergencystretch = .15\hsize | |
| 6034 \fi | |
| 6035 } | |
| 6036 | |
| 6037 % Parameters in order: 1) textheight; 2) textwidth; 3) voffset; | |
| 47284 | 6038 % 4) hoffset; 5) binding offset; 6) topskip. We also call |
| 6039 % \setleading{\textleading}, so the caller should define \textleading. | |
| 6040 % The caller should also set \parskip. | |
| 37713 | 6041 % |
| 6042 \def\internalpagesizes#1#2#3#4#5#6{% | |
| 6043 \voffset = #3\relax | |
| 6044 \topskip = #6\relax | |
| 6045 \splittopskip = \topskip | |
| 6046 % | |
| 6047 \vsize = #1\relax | |
| 6048 \advance\vsize by \topskip | |
| 6049 \outervsize = \vsize | |
| 6050 \advance\outervsize by 2\topandbottommargin | |
| 6051 \pageheight = \vsize | |
| 6052 % | |
| 6053 \hsize = #2\relax | |
| 6054 \outerhsize = \hsize | |
| 6055 \advance\outerhsize by 0.5in | |
| 6056 \pagewidth = \hsize | |
| 6057 % | |
| 6058 \normaloffset = #4\relax | |
| 6059 \bindingoffset = #5\relax | |
| 6060 % | |
| 47284 | 6061 \setleading{\textleading} |
| 6062 % | |
| 37713 | 6063 \parindent = \defaultparindent |
| 6064 \setemergencystretch | |
| 6065 } | |
| 6066 | |
| 6067 % Use `small' versions. | |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
47284
diff
changeset
|
6068 % |
| 37713 | 6069 \def\smallenvironments{% |
| 6070 \let\smalldisplay = \smalldisplayx | |
| 6071 \let\smallexample = \smalllispx | |
| 6072 \let\smallformat = \smallformatx | |
| 6073 \let\smalllisp = \smalllispx | |
| 6074 } | |
| 6075 | |
| 6076 % @letterpaper (the default). | |
| 6077 \def\letterpaper{{\globaldefs = 1 | |
| 6078 \parskip = 3pt plus 2pt minus 1pt | |
| 47284 | 6079 \textleading = 13.2pt |
| 37713 | 6080 % |
| 6081 % If page is nothing but text, make it come out even. | |
| 6082 \internalpagesizes{46\baselineskip}{6in}{\voffset}{.25in}{\bindingoffset}{36pt}% | |
| 6083 }} | |
| 6084 | |
| 6085 % Use @smallbook to reset parameters for 7x9.5 (or so) format. | |
| 6086 \def\smallbook{{\globaldefs = 1 | |
| 6087 \parskip = 2pt plus 1pt | |
| 47284 | 6088 \textleading = 12pt |
| 37713 | 6089 % |
| 6090 \internalpagesizes{7.5in}{5.in}{\voffset}{.25in}{\bindingoffset}{16pt}% | |
| 6091 % | |
| 6092 \lispnarrowing = 0.3in | |
| 6093 \tolerance = 700 | |
| 6094 \hfuzz = 1pt | |
| 6095 \contentsrightmargin = 0pt | |
| 6096 \deftypemargin = 0pt | |
| 6097 \defbodyindent = .5cm | |
| 6098 \smallenvironments | |
| 6099 }} | |
| 6100 | |
| 6101 % Use @afourpaper to print on European A4 paper. | |
| 6102 \def\afourpaper{{\globaldefs = 1 | |
| 6103 \parskip = 3pt plus 2pt minus 1pt | |
| 47284 | 6104 \textleading = 12pt |
| 37713 | 6105 % |
| 6106 \internalpagesizes{53\baselineskip}{160mm}{\voffset}{4mm}{\bindingoffset}{44pt}% | |
| 6107 % | |
| 6108 \tolerance = 700 | |
| 6109 \hfuzz = 1pt | |
| 6110 }} | |
| 6111 | |
| 6112 % Use @afivepaper to print on European A5 paper. | |
| 6113 % From romildo@urano.iceb.ufop.br, 2 July 2000. | |
| 6114 % He also recommends making @example and @lisp be small. | |
| 6115 \def\afivepaper{{\globaldefs = 1 | |
| 6116 \parskip = 2pt plus 1pt minus 0.1pt | |
| 47284 | 6117 \textleading = 12.5pt |
| 37713 | 6118 % |
| 6119 \internalpagesizes{166mm}{120mm}{\voffset}{-8mm}{\bindingoffset}{8pt}% | |
| 6120 % | |
| 6121 \lispnarrowing = 0.2in | |
| 6122 \tolerance = 800 | |
| 6123 \hfuzz = 1.2pt | |
| 6124 \contentsrightmargin = 0mm | |
| 6125 \deftypemargin = 0pt | |
| 6126 \defbodyindent = 2mm | |
| 6127 \tableindent = 12mm | |
| 6128 % | |
| 6129 \smallenvironments | |
| 6130 }} | |
| 6131 | |
| 6132 % A specific text layout, 24x15cm overall, intended for A4 paper. Top margin | |
| 6133 % 29mm, hence bottom margin 28mm, nominal side margin 3cm. | |
| 6134 \def\afourlatex{{\globaldefs = 1 | |
| 47284 | 6135 \textleading = 13.6pt |
| 37713 | 6136 % |
| 6137 \afourpaper | |
| 6138 \internalpagesizes{237mm}{150mm}{3.6mm}{3.6mm}{3mm}{7mm}% | |
| 6139 % | |
| 47284 | 6140 % Must explicitly reset to 0 because we call \afourpaper, apparently, |
| 6141 % although this does not entirely make sense. | |
| 37713 | 6142 \globaldefs = 0 |
| 6143 }} | |
| 6144 | |
| 6145 % Use @afourwide to print on European A4 paper in wide format. | |
| 6146 \def\afourwide{% | |
| 6147 \afourpaper | |
| 6148 \internalpagesizes{6.5in}{9.5in}{\hoffset}{\normaloffset}{\bindingoffset}{7mm}% | |
| 6149 } | |
| 6150 | |
| 6151 % @pagesizes TEXTHEIGHT[,TEXTWIDTH] | |
| 6152 % Perhaps we should allow setting the margins, \topskip, \parskip, | |
| 6153 % and/or leading, also. Or perhaps we should compute them somehow. | |
| 6154 % | |
| 6155 \def\pagesizes{\parsearg\pagesizesxxx} | |
| 6156 \def\pagesizesxxx#1{\pagesizesyyy #1,,\finish} | |
| 6157 \def\pagesizesyyy#1,#2,#3\finish{{% | |
| 6158 \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi | |
| 6159 \globaldefs = 1 | |
| 6160 % | |
| 6161 \parskip = 3pt plus 2pt minus 1pt | |
| 47284 | 6162 \setleading{\textleading}% |
| 37713 | 6163 % |
| 6164 \internalpagesizes{#1}{\hsize}{\voffset}{\normaloffset}{\bindingoffset}{44pt}% | |
| 6165 }} | |
| 6166 | |
| 6167 % Set default to letter. | |
| 6168 % | |
| 6169 \letterpaper | |
| 6170 | |
| 6171 | |
| 6172 \message{and turning on texinfo input format.} | |
| 6173 | |
| 6174 % Define macros to output various characters with catcode for normal text. | |
| 6175 \catcode`\"=\other | |
| 6176 \catcode`\~=\other | |
| 6177 \catcode`\^=\other | |
| 6178 \catcode`\_=\other | |
| 6179 \catcode`\|=\other | |
| 6180 \catcode`\<=\other | |
| 6181 \catcode`\>=\other | |
| 6182 \catcode`\+=\other | |
| 6183 \catcode`\$=\other | |
| 6184 \def\normaldoublequote{"} | |
| 6185 \def\normaltilde{~} | |
| 6186 \def\normalcaret{^} | |
| 6187 \def\normalunderscore{_} | |
| 6188 \def\normalverticalbar{|} | |
| 6189 \def\normalless{<} | |
| 6190 \def\normalgreater{>} | |
| 6191 \def\normalplus{+} | |
| 47284 | 6192 \def\normaldollar{$}%$ font-lock fix |
| 37713 | 6193 |
| 6194 % This macro is used to make a character print one way in ttfont | |
| 6195 % where it can probably just be output, and another way in other fonts, | |
| 6196 % where something hairier probably needs to be done. | |
| 6197 % | |
| 6198 % #1 is what to print if we are indeed using \tt; #2 is what to print | |
| 6199 % otherwise. Since all the Computer Modern typewriter fonts have zero | |
| 6200 % interword stretch (and shrink), and it is reasonable to expect all | |
| 6201 % typewriter fonts to have this, we can check that font parameter. | |
| 6202 % | |
| 6203 \def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi} | |
| 6204 | |
| 6205 % Same as above, but check for italic font. Actually this also catches | |
| 6206 % non-italic slanted fonts since it is impossible to distinguish them from | |
| 6207 % italic fonts. But since this is only used by $ and it uses \sl anyway | |
| 6208 % this is not a problem. | |
| 6209 \def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi} | |
| 6210 | |
| 6211 % Turn off all special characters except @ | |
| 6212 % (and those which the user can use as if they were ordinary). | |
| 6213 % Most of these we simply print from the \tt font, but for some, we can | |
| 6214 % use math or other variants that look better in normal text. | |
| 6215 | |
| 6216 \catcode`\"=\active | |
| 6217 \def\activedoublequote{{\tt\char34}} | |
| 6218 \let"=\activedoublequote | |
| 6219 \catcode`\~=\active | |
| 6220 \def~{{\tt\char126}} | |
| 6221 \chardef\hat=`\^ | |
| 6222 \catcode`\^=\active | |
| 6223 \def^{{\tt \hat}} | |
| 6224 | |
| 6225 \catcode`\_=\active | |
| 6226 \def_{\ifusingtt\normalunderscore\_} | |
| 6227 % Subroutine for the previous macro. | |
| 6228 \def\_{\leavevmode \kern.06em \vbox{\hrule width.3em height.1ex}} | |
| 6229 | |
| 6230 \catcode`\|=\active | |
| 6231 \def|{{\tt\char124}} | |
| 6232 \chardef \less=`\< | |
| 6233 \catcode`\<=\active | |
| 6234 \def<{{\tt \less}} | |
| 6235 \chardef \gtr=`\> | |
| 6236 \catcode`\>=\active | |
| 6237 \def>{{\tt \gtr}} | |
| 6238 \catcode`\+=\active | |
| 6239 \def+{{\tt \char 43}} | |
| 6240 \catcode`\$=\active | |
| 47284 | 6241 \def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix |
| 37713 | 6242 %\catcode 27=\active |
| 6243 %\def^^[{$\diamondsuit$} | |
| 6244 | |
| 6245 % Set up an active definition for =, but don't enable it most of the time. | |
| 6246 {\catcode`\==\active | |
| 6247 \global\def={{\tt \char 61}}} | |
| 6248 | |
| 6249 \catcode`+=\active | |
| 6250 \catcode`\_=\active | |
| 6251 | |
| 6252 % If a .fmt file is being used, characters that might appear in a file | |
| 6253 % name cannot be active until we have parsed the command line. | |
| 6254 % So turn them off again, and have \everyjob (or @setfilename) turn them on. | |
| 6255 % \otherifyactive is called near the end of this file. | |
| 6256 \def\otherifyactive{\catcode`+=\other \catcode`\_=\other} | |
| 6257 | |
| 6258 \catcode`\@=0 | |
| 6259 | |
| 6260 % \rawbackslashxx output one backslash character in current font | |
| 6261 \global\chardef\rawbackslashxx=`\\ | |
| 6262 %{\catcode`\\=\other | |
| 6263 %@gdef@rawbackslashxx{\}} | |
| 6264 | |
| 6265 % \rawbackslash redefines \ as input to do \rawbackslashxx. | |
| 6266 {\catcode`\\=\active | |
| 6267 @gdef@rawbackslash{@let\=@rawbackslashxx }} | |
| 6268 | |
| 6269 % \normalbackslash outputs one backslash in fixed width font. | |
| 6270 \def\normalbackslash{{\tt\rawbackslashxx}} | |
| 6271 | |
| 6272 % \catcode 17=0 % Define control-q | |
| 6273 \catcode`\\=\active | |
| 6274 | |
| 6275 % Used sometimes to turn off (effectively) the active characters | |
| 6276 % even after parsing them. | |
| 6277 @def@turnoffactive{@let"=@normaldoublequote | |
| 6278 @let\=@realbackslash | |
| 6279 @let~=@normaltilde | |
| 6280 @let^=@normalcaret | |
| 6281 @let_=@normalunderscore | |
| 6282 @let|=@normalverticalbar | |
| 6283 @let<=@normalless | |
| 6284 @let>=@normalgreater | |
| 6285 @let+=@normalplus | |
| 47284 | 6286 @let$=@normaldollar}%$ font-lock fix |
| 37713 | 6287 |
| 6288 @def@normalturnoffactive{@let"=@normaldoublequote | |
| 6289 @let\=@normalbackslash | |
| 6290 @let~=@normaltilde | |
| 6291 @let^=@normalcaret | |
| 6292 @let_=@normalunderscore | |
| 6293 @let|=@normalverticalbar | |
| 6294 @let<=@normalless | |
| 6295 @let>=@normalgreater | |
| 6296 @let+=@normalplus | |
| 47284 | 6297 @let$=@normaldollar}%$ font-lock fix |
| 37713 | 6298 |
| 6299 % Make _ and + \other characters, temporarily. | |
| 6300 % This is canceled by @fixbackslash. | |
| 6301 @otherifyactive | |
| 6302 | |
| 6303 % If a .fmt file is being used, we don't want the `\input texinfo' to show up. | |
| 6304 % That is what \eatinput is for; after that, the `\' should revert to printing | |
| 6305 % a backslash. | |
| 6306 % | |
| 6307 @gdef@eatinput input texinfo{@fixbackslash} | |
| 6308 @global@let\ = @eatinput | |
| 6309 | |
| 6310 % On the other hand, perhaps the file did not have a `\input texinfo'. Then | |
| 6311 % the first `\{ in the file would cause an error. This macro tries to fix | |
| 6312 % that, assuming it is called before the first `\' could plausibly occur. | |
| 6313 % Also back turn on active characters that might appear in the input | |
| 6314 % file name, in case not using a pre-dumped format. | |
| 6315 % | |
| 6316 @gdef@fixbackslash{% | |
| 6317 @ifx\@eatinput @let\ = @normalbackslash @fi | |
| 6318 @catcode`+=@active | |
| 6319 @catcode`@_=@active | |
| 6320 } | |
| 6321 | |
| 6322 % Say @foo, not \foo, in error messages. | |
| 6323 @escapechar = `@@ | |
| 6324 | |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
47284
diff
changeset
|
6325 % These look ok in all fonts, so just make them not special. |
| 37713 | 6326 @catcode`@& = @other |
| 6327 @catcode`@# = @other | |
| 6328 @catcode`@% = @other | |
| 6329 | |
| 6330 @c Set initial fonts. | |
| 6331 @textfonts | |
| 6332 @rm | |
| 6333 | |
| 6334 | |
| 6335 @c Local variables: | |
| 6336 @c eval: (add-hook 'write-file-hooks 'time-stamp) | |
| 6337 @c page-delimiter: "^\\\\message" | |
| 6338 @c time-stamp-start: "def\\\\texinfoversion{" | |
| 6339 @c time-stamp-format: "%:y-%02m-%02d.%02H" | |
| 6340 @c time-stamp-end: "}" | |
| 6341 @c End: | |
| 52401 | 6342 |
|
52790
a93f1f4e2e49
Replace `%' in arch tagline by @ignore.
Luc Teirlinck <teirllm@auburn.edu>
parents:
52401
diff
changeset
|
6343 @ignore |
|
a93f1f4e2e49
Replace `%' in arch tagline by @ignore.
Luc Teirlinck <teirllm@auburn.edu>
parents:
52401
diff
changeset
|
6344 arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115 |
|
a93f1f4e2e49
Replace `%' in arch tagline by @ignore.
Luc Teirlinck <teirllm@auburn.edu>
parents:
52401
diff
changeset
|
6345 @end ignore |
