"SfR Fresh" - the SfR Freeware/Shareware Archive 
Member "wget-1.11.4/doc/texinfo.tex" of archive wget-1.11.4.tar.gz:
As a special service "SfR Fresh" has tried to format the requested source page into HTML format using (guessed) TeX and LaTeX source code syntax highlighting with prefixed line numbers.
Alternatively you can here view or download the uninterpreted source code file.
That can be also achieved for any archive member file by clicking within an archive contents listing on the first character of the file(path) respectively on the according byte size field.
1 % texinfo.tex -- TeX macros to handle Texinfo files.
2 %
3 % Load plain if necessary, i.e., if running under initex.
4 \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
5 %
6 \def\texinfoversion{2004-11-25.16}
7 %
8 % Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
9 % 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software
10 % Foundation, Inc.
11 %
12 % This texinfo.tex file is free software; you can redistribute it and/or
13 % modify it under the terms of the GNU General Public License as
14 % published by the Free Software Foundation; either version 3, or (at
15 % your option) any later version.
16 %
17 % This texinfo.tex file is distributed in the hope that it will be
18 % useful, but WITHOUT ANY WARRANTY; without even the implied warranty
19 % of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 % General Public License for more details.
21 %
22 % You should have received a copy of the GNU General Public License
23 % along with this texinfo.tex file. If not, see
24 % <http://www.gnu.org/licenses/>.
25 %
26 % As a special exception, when this file is read by TeX when processing
27 % a Texinfo source document, you may use the result without
28 % restriction. (This has been our intent since Texinfo was invented.)
29 %
30 % Please try the latest version of texinfo.tex before submitting bug
31 % reports; you can get the latest version from:
32 % http://www.gnu.org/software/texinfo/ (the Texinfo home page), or
33 % ftp://tug.org/tex/texinfo.tex
34 % (and all CTAN mirrors, see http://www.ctan.org).
35 % The texinfo.tex in any given distribution could well be out
36 % of date, so if that's what you're using, please check.
37 %
38 % Send bug reports to bug-texinfo@gnu.org. Please include including a
39 % complete document in each bug report with which we can reproduce the
40 % problem. Patches are, of course, greatly appreciated.
41 %
42 % To process a Texinfo manual with TeX, it's most reliable to use the
43 % texi2dvi shell script that comes with the distribution. For a simple
44 % manual foo.texi, however, you can get away with this:
45 % tex foo.texi
46 % texindex foo.??
47 % tex foo.texi
48 % tex foo.texi
49 % dvips foo.dvi -o # or whatever; this makes foo.ps.
50 % The extra TeX runs get the cross-reference information correct.
51 % Sometimes one run after texindex suffices, and sometimes you need more
52 % than two; texi2dvi does it as many times as necessary.
53 %
54 % It is possible to adapt texinfo.tex for other languages, to some
55 % extent. You can get the existing language-specific files from the
56 % full Texinfo distribution.
57 %
58 % The GNU Texinfo home page is http://www.gnu.org/software/texinfo.
59
60
61 \message{Loading texinfo [version \texinfoversion]:}
62
63 % If in a .fmt file, print the version number
64 % and turn on active characters that we couldn't do earlier because
65 % they might have appeared in the input file name.
66 \everyjob{\message{[Texinfo version \texinfoversion]}%
67 \catcode`+=\active \catcode`\_=\active}
68
69 \message{Basics,}
70 \chardef\other=12
71
72 % We never want plain's \outer definition of \+ in Texinfo.
73 % For @tex, we can use \tabalign.
74 \let\+ = \relax
75
76 % Save some plain tex macros whose names we will redefine.
77 \let\ptexb=\b
78 \let\ptexbullet=\bullet
79 \let\ptexc=\c
80 \let\ptexcomma=\,
81 \let\ptexdot=\.
82 \let\ptexdots=\dots
83 \let\ptexend=\end
84 \let\ptexequiv=\equiv
85 \let\ptexexclam=\!
86 \let\ptexfootnote=\footnote
87 \let\ptexgtr=>
88 \let\ptexhat=^
89 \let\ptexi=\i
90 \let\ptexindent=\indent
91 \let\ptexinsert=\insert
92 \let\ptexlbrace=\{
93 \let\ptexless=<
94 \let\ptexnewwrite\newwrite
95 \let\ptexnoindent=\noindent
96 \let\ptexplus=+
97 \let\ptexrbrace=\}
98 \let\ptexslash=\/
99 \let\ptexstar=\*
100 \let\ptext=\t
101
102 % If this character appears in an error message or help string, it
103 % starts a new line in the output.
104 \newlinechar = `^^J
105
106 % Use TeX 3.0's \inputlineno to get the line number, for better error
107 % messages, but if we're using an old version of TeX, don't do anything.
108 %
109 \ifx\inputlineno\thisisundefined
110 \let\linenumber = \empty % Pre-3.0.
111 \else
112 \def\linenumber{l.\the\inputlineno:\space}
113 \fi
114
115 % Set up fixed words for English if not already set.
116 \ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi
117 \ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi
118 \ifx\putwordfile\undefined \gdef\putwordfile{file}\fi
119 \ifx\putwordin\undefined \gdef\putwordin{in}\fi
120 \ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi
121 \ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi
122 \ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi
123 \ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi
124 \ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi
125 \ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi
126 \ifx\putwordof\undefined \gdef\putwordof{of}\fi
127 \ifx\putwordon\undefined \gdef\putwordon{on}\fi
128 \ifx\putwordpage\undefined \gdef\putwordpage{page}\fi
129 \ifx\putwordsection\undefined \gdef\putwordsection{section}\fi
130 \ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi
131 \ifx\putwordsee\undefined \gdef\putwordsee{see}\fi
132 \ifx\putwordSee\undefined \gdef\putwordSee{See}\fi
133 \ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi
134 \ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi
135 %
136 \ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi
137 \ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi
138 \ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi
139 \ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi
140 \ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi
141 \ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi
142 \ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi
143 \ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi
144 \ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi
145 \ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi
146 \ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi
147 \ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi
148 %
149 \ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi
150 \ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi
151 \ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi
152 \ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi
153 \ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi
154
155 % In some macros, we cannot use the `\? notation---the left quote is
156 % in some cases the escape char.
157 \chardef\colonChar = `\:
158 \chardef\commaChar = `\,
159 \chardef\dotChar = `\.
160 \chardef\exclamChar= `\!
161 \chardef\questChar = `\?
162 \chardef\semiChar = `\;
163 \chardef\underChar = `\_
164
165 \chardef\spaceChar = `\ %
166 \chardef\spacecat = 10
167 \def\spaceisspace{\catcode\spaceChar=\spacecat}
168
169 % Ignore a token.
170 %
171 \def\gobble#1{}
172
173 % The following is used inside several \edef's.
174 \def\makecsname#1{\expandafter\noexpand\csname#1\endcsname}
175
176 % Hyphenation fixes.
177 \hyphenation{
178 Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script
179 ap-pen-dix bit-map bit-maps
180 data-base data-bases eshell fall-ing half-way long-est man-u-script
181 man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm
182 par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces
183 spell-ing spell-ings
184 stand-alone strong-est time-stamp time-stamps which-ever white-space
185 wide-spread wrap-around
186 }
187
188 % Margin to add to right of even pages, to left of odd pages.
189 \newdimen\bindingoffset
190 \newdimen\normaloffset
191 \newdimen\pagewidth \newdimen\pageheight
192
193 % For a final copy, take out the rectangles
194 % that mark overfull boxes (in case you have decided
195 % that the text looks ok even though it passes the margin).
196 %
197 \def\finalout{\overfullrule=0pt}
198
199 % @| inserts a changebar to the left of the current line. It should
200 % surround any changed text. This approach does *not* work if the
201 % change spans more than two lines of output. To handle that, we would
202 % have adopt a much more difficult approach (putting marks into the main
203 % vertical list for the beginning and end of each change).
204 %
205 \def\|{%
206 % \vadjust can only be used in horizontal mode.
207 \leavevmode
208 %
209 % Append this vertical mode material after the current line in the output.
210 \vadjust{%
211 % We want to insert a rule with the height and depth of the current
212 % leading; that is exactly what \strutbox is supposed to record.
213 \vskip-\baselineskip
214 %
215 % \vadjust-items are inserted at the left edge of the type. So
216 % the \llap here moves out into the left-hand margin.
217 \llap{%
218 %
219 % For a thicker or thinner bar, change the `1pt'.
220 \vrule height\baselineskip width1pt
221 %
222 % This is the space between the bar and the text.
223 \hskip 12pt
224 }%
225 }%
226 }
227
228 % Sometimes it is convenient to have everything in the transcript file
229 % and nothing on the terminal. We don't just call \tracingall here,
230 % since that produces some useless output on the terminal. We also make
231 % some effort to order the tracing commands to reduce output in the log
232 % file; cf. trace.sty in LaTeX.
233 %
234 \def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
235 \def\loggingall{%
236 \tracingstats2
237 \tracingpages1
238 \tracinglostchars2 % 2 gives us more in etex
239 \tracingparagraphs1
240 \tracingoutput1
241 \tracingmacros2
242 \tracingrestores1
243 \showboxbreadth\maxdimen \showboxdepth\maxdimen
244 \ifx\eTeXversion\undefined\else % etex gives us more logging
245 \tracingscantokens1
246 \tracingifs1
247 \tracinggroups1
248 \tracingnesting2
249 \tracingassigns1
250 \fi
251 \tracingcommands3 % 3 gives us more in etex
252 \errorcontextlines16
253 }%
254
255 % add check for \lastpenalty to plain's definitions. If the last thing
256 % we did was a \nobreak, we don't want to insert more space.
257 %
258 \def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount
259 \removelastskip\penalty-50\smallskip\fi\fi}
260 \def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount
261 \removelastskip\penalty-100\medskip\fi\fi}
262 \def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount
263 \removelastskip\penalty-200\bigskip\fi\fi}
264
265 % For @cropmarks command.
266 % Do @cropmarks to get crop marks.
267 %
268 \newif\ifcropmarks
269 \let\cropmarks = \cropmarkstrue
270 %
271 % Dimensions to add cropmarks at corners.
272 % Added by P. A. MacKay, 12 Nov. 1986
273 %
274 \newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
275 \newdimen\cornerlong \cornerlong=1pc
276 \newdimen\cornerthick \cornerthick=.3pt
277 \newdimen\topandbottommargin \topandbottommargin=.75in
278
279 % Main output routine.
280 \chardef\PAGE = 255
281 \output = {\onepageout{\pagecontents\PAGE}}
282
283 \newbox\headlinebox
284 \newbox\footlinebox
285
286 % \onepageout takes a vbox as an argument. Note that \pagecontents
287 % does insertions, but you have to call it yourself.
288 \def\onepageout#1{%
289 \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi
290 %
291 \ifodd\pageno \advance\hoffset by \bindingoffset
292 \else \advance\hoffset by -\bindingoffset\fi
293 %
294 % Do this outside of the \shipout so @code etc. will be expanded in
295 % the headline as they should be, not taken literally (outputting ''code).
296 \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}%
297 \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}%
298 %
299 {%
300 % Have to do this stuff outside the \shipout because we want it to
301 % take effect in \write's, yet the group defined by the \vbox ends
302 % before the \shipout runs.
303 %
304 \escapechar = `\\ % use backslash in output files.
305 \indexdummies % don't expand commands in the output.
306 \normalturnoffactive % \ in index entries must not stay \, e.g., if
307 % the page break happens to be in the middle of an example.
308 \shipout\vbox{%
309 % Do this early so pdf references go to the beginning of the page.
310 \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi
311 %
312 \ifcropmarks \vbox to \outervsize\bgroup
313 \hsize = \outerhsize
314 \vskip-\topandbottommargin
315 \vtop to0pt{%
316 \line{\ewtop\hfil\ewtop}%
317 \nointerlineskip
318 \line{%
319 \vbox{\moveleft\cornerthick\nstop}%
320 \hfill
321 \vbox{\moveright\cornerthick\nstop}%
322 }%
323 \vss}%
324 \vskip\topandbottommargin
325 \line\bgroup
326 \hfil % center the page within the outer (page) hsize.
327 \ifodd\pageno\hskip\bindingoffset\fi
328 \vbox\bgroup
329 \fi
330 %
331 \unvbox\headlinebox
332 \pagebody{#1}%
333 \ifdim\ht\footlinebox > 0pt
334 % Only leave this space if the footline is nonempty.
335 % (We lessened \vsize for it in \oddfootingxxx.)
336 % The \baselineskip=24pt in plain's \makefootline has no effect.
337 \vskip 2\baselineskip
338 \unvbox\footlinebox
339 \fi
340 %
341 \ifcropmarks
342 \egroup % end of \vbox\bgroup
343 \hfil\egroup % end of (centering) \line\bgroup
344 \vskip\topandbottommargin plus1fill minus1fill
345 \boxmaxdepth = \cornerthick
346 \vbox to0pt{\vss
347 \line{%
348 \vbox{\moveleft\cornerthick\nsbot}%
349 \hfill
350 \vbox{\moveright\cornerthick\nsbot}%
351 }%
352 \nointerlineskip
353 \line{\ewbot\hfil\ewbot}%
354 }%
355 \egroup % \vbox from first cropmarks clause
356 \fi
357 }% end of \shipout\vbox
358 }% end of group with \normalturnoffactive
359 \advancepageno
360 \ifnum\outputpenalty>-20000 \else\dosupereject\fi
361 }
362
363 \newinsert\margin \dimen\margin=\maxdimen
364
365 \def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}
366 {\catcode`\@ =11
367 \gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
368 % marginal hacks, juha@viisa.uucp (Juha Takala)
369 \ifvoid\margin\else % marginal info is present
370 \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi
371 \dimen@=\dp#1 \unvbox#1
372 \ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
373 \ifr@ggedbottom \kern-\dimen@ \vfil \fi}
374 }
375
376 % Here are the rules for the cropmarks. Note that they are
377 % offset so that the space between them is truly \outerhsize or \outervsize
378 % (P. A. MacKay, 12 November, 1986)
379 %
380 \def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}
381 \def\nstop{\vbox
382 {\hrule height\cornerthick depth\cornerlong width\cornerthick}}
383 \def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}
384 \def\nsbot{\vbox
385 {\hrule height\cornerlong depth\cornerthick width\cornerthick}}
386
387 % Parse an argument, then pass it to #1. The argument is the rest of
388 % the input line (except we remove a trailing comment). #1 should be a
389 % macro which expects an ordinary undelimited TeX argument.
390 %
391 \def\parsearg{\parseargusing{}}
392 \def\parseargusing#1#2{%
393 \def\next{#2}%
394 \begingroup
395 \obeylines
396 \spaceisspace
397 #1%
398 \parseargline\empty% Insert the \empty token, see \finishparsearg below.
399 }
400
401 {\obeylines %
402 \gdef\parseargline#1^^M{%
403 \endgroup % End of the group started in \parsearg.
404 \argremovecomment #1\comment\ArgTerm%
405 }%
406 }
407
408 % First remove any @comment, then any @c comment.
409 \def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm}
410 \def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm}
411
412 % Each occurence of `\^^M' or `<space>\^^M' is replaced by a single space.
413 %
414 % \argremovec might leave us with trailing space, e.g.,
415 % @end itemize @c foo
416 % This space token undergoes the same procedure and is eventually removed
417 % by \finishparsearg.
418 %
419 \def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M}
420 \def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M}
421 \def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{%
422 \def\temp{#3}%
423 \ifx\temp\empty
424 % We cannot use \next here, as it holds the macro to run;
425 % thus we reuse \temp.
426 \let\temp\finishparsearg
427 \else
428 \let\temp\argcheckspaces
429 \fi
430 % Put the space token in:
431 \temp#1 #3\ArgTerm
432 }
433
434 % If a _delimited_ argument is enclosed in braces, they get stripped; so
435 % to get _exactly_ the rest of the line, we had to prevent such situation.
436 % We prepended an \empty token at the very beginning and we expand it now,
437 % just before passing the control to \next.
438 % (Similarily, we have to think about #3 of \argcheckspacesY above: it is
439 % either the null string, or it ends with \^^M---thus there is no danger
440 % that a pair of braces would be stripped.
441 %
442 % But first, we have to remove the trailing space token.
443 %
444 \def\finishparsearg#1 \ArgTerm{\expandafter\next\expandafter{#1}}
445
446 % \parseargdef\foo{...}
447 % is roughly equivalent to
448 % \def\foo{\parsearg\Xfoo}
449 % \def\Xfoo#1{...}
450 %
451 % Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my
452 % favourite TeX trick. --kasal, 16nov03
453
454 \def\parseargdef#1{%
455 \expandafter \doparseargdef \csname\string#1\endcsname #1%
456 }
457 \def\doparseargdef#1#2{%
458 \def#2{\parsearg#1}%
459 \def#1##1%
460 }
461
462 % Several utility definitions with active space:
463 {
464 \obeyspaces
465 \gdef\obeyedspace{ }
466
467 % Make each space character in the input produce a normal interword
468 % space in the output. Don't allow a line break at this space, as this
469 % is used only in environments like @example, where each line of input
470 % should produce a line of output anyway.
471 %
472 \gdef\sepspaces{\obeyspaces\let =\tie}
473
474 % If an index command is used in an @example environment, any spaces
475 % therein should become regular spaces in the raw index file, not the
476 % expansion of \tie (\leavevmode \penalty \@M \ ).
477 \gdef\unsepspaces{\let =\space}
478 }
479
480
481 \def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
482
483 % Define the framework for environments in texinfo.tex. It's used like this:
484 %
485 % \envdef\foo{...}
486 % \def\Efoo{...}
487 %
488 % It's the responsibility of \envdef to insert \begingroup before the
489 % actual body; @end closes the group after calling \Efoo. \envdef also
490 % defines \thisenv, so the current environment is known; @end checks
491 % whether the environment name matches. The \checkenv macro can also be
492 % used to check whether the current environment is the one expected.
493 %
494 % Non-false conditionals (@iftex, @ifset) don't fit into this, so they
495 % are not treated as enviroments; they don't open a group. (The
496 % implementation of @end takes care not to call \endgroup in this
497 % special case.)
498
499
500 % At runtime, environments start with this:
501 \def\startenvironment#1{\begingroup\def\thisenv{#1}}
502 % initialize
503 \let\thisenv\empty
504
505 % ... but they get defined via ``\envdef\foo{...}'':
506 \long\def\envdef#1#2{\def#1{\startenvironment#1#2}}
507 \def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}}
508
509 % Check whether we're in the right environment:
510 \def\checkenv#1{%
511 \def\temp{#1}%
512 \ifx\thisenv\temp
513 \else
514 \badenverr
515 \fi
516 }
517
518 % Evironment mismatch, #1 expected:
519 \def\badenverr{%
520 \errhelp = \EMsimple
521 \errmessage{This command can appear only \inenvironment\temp,
522 not \inenvironment\thisenv}%
523 }
524 \def\inenvironment#1{%
525 \ifx#1\empty
526 out of any environment%
527 \else
528 in environment \expandafter\string#1%
529 \fi
530 }
531
532 % @end foo executes the definition of \Efoo.
533 % But first, it executes a specialized version of \checkenv
534 %
535 \parseargdef\end{%
536 \if 1\csname iscond.#1\endcsname
537 \else
538 % The general wording of \badenverr may not be ideal, but... --kasal, 06nov03
539 \expandafter\checkenv\csname#1\endcsname
540 \csname E#1\endcsname
541 \endgroup
542 \fi
543 }
544
545 \newhelp\EMsimple{Press RETURN to continue.}
546
547
548 %% Simple single-character @ commands
549
550 % @@ prints an @
551 % Kludge this until the fonts are right (grr).
552 \def\@{{\tt\char64}}
553
554 % This is turned off because it was never documented
555 % and you can use @w{...} around a quote to suppress ligatures.
556 %% Define @` and @' to be the same as ` and '
557 %% but suppressing ligatures.
558 %\def\`{{`}}
559 %\def\'{{'}}
560
561 % Used to generate quoted braces.
562 \def\mylbrace {{\tt\char123}}
563 \def\myrbrace {{\tt\char125}}
564 \let\{=\mylbrace
565 \let\}=\myrbrace
566 \begingroup
567 % Definitions to produce \{ and \} commands for indices,
568 % and @{ and @} for the aux file.
569 \catcode`\{ = \other \catcode`\} = \other
570 \catcode`\[ = 1 \catcode`\] = 2
571 \catcode`\! = 0 \catcode`\\ = \other
572 !gdef!lbracecmd[\{]%
573 !gdef!rbracecmd[\}]%
574 !gdef!lbraceatcmd[@{]%
575 !gdef!rbraceatcmd[@}]%
576 !endgroup
577
578 % @comma{} to avoid , parsing problems.
579 \let\comma = ,
580
581 % Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
582 % Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
583 \let\, = \c
584 \let\dotaccent = \.
585 \def\ringaccent#1{{\accent23 #1}}
586 \let\tieaccent = \t
587 \let\ubaraccent = \b
588 \let\udotaccent = \d
589
590 % Other special characters: @questiondown @exclamdown @ordf @ordm
591 % Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
592 \def\questiondown{?`}
593 \def\exclamdown{!`}
594 \def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}}
595 \def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}}
596
597 % Dotless i and dotless j, used for accents.
598 \def\imacro{i}
599 \def\jmacro{j}
600 \def\dotless#1{%
601 \def\temp{#1}%
602 \ifx\temp\imacro \ptexi
603 \else\ifx\temp\jmacro \j
604 \else \errmessage{@dotless can be used only with i or j}%
605 \fi\fi
606 }
607
608 % The \TeX{} logo, as in plain, but resetting the spacing so that a
609 % period following counts as ending a sentence. (Idea found in latex.)
610 %
611 \edef\TeX{\TeX \spacefactor=1000 }
612
613 % @LaTeX{} logo. Not quite the same results as the definition in
614 % latex.ltx, since we use a different font for the raised A; it's most
615 % convenient for us to use an explicitly smaller font, rather than using
616 % the \scriptstyle font (since we don't reset \scriptstyle and
617 % \scriptscriptstyle).
618 %
619 \def\LaTeX{%
620 L\kern-.36em
621 {\setbox0=\hbox{T}%
622 \vbox to \ht0{\hbox{\selectfonts\lllsize A}\vss}}%
623 \kern-.15em
624 \TeX
625 }
626
627 % Be sure we're in horizontal mode when doing a tie, since we make space
628 % equivalent to this in @example-like environments. Otherwise, a space
629 % at the beginning of a line will start with \penalty -- and
630 % since \penalty is valid in vertical mode, we'd end up putting the
631 % penalty on the vertical list instead of in the new paragraph.
632 {\catcode`@ = 11
633 % Avoid using \@M directly, because that causes trouble
634 % if the definition is written into an index file.
635 \global\let\tiepenalty = \@M
636 \gdef\tie{\leavevmode\penalty\tiepenalty\ }
637 }
638
639 % @: forces normal size whitespace following.
640 \def\:{\spacefactor=1000 }
641
642 % @* forces a line break.
643 \def\*{\hfil\break\hbox{}\ignorespaces}
644
645 % @/ allows a line break.
646 \let\/=\allowbreak
647
648 % @. is an end-of-sentence period.
649 \def\.{.\spacefactor=3000 }
650
651 % @! is an end-of-sentence bang.
652 \def\!{!\spacefactor=3000 }
653
654 % @? is an end-of-sentence query.
655 \def\?{?\spacefactor=3000 }
656
657 % @w prevents a word break. Without the \leavevmode, @w at the
658 % beginning of a paragraph, when TeX is still in vertical mode, would
659 % produce a whole line of output instead of starting the paragraph.
660 \def\w#1{\leavevmode\hbox{#1}}
661
662 % @group ... @end group forces ... to be all on one page, by enclosing
663 % it in a TeX vbox. We use \vtop instead of \vbox to construct the box
664 % to keep its height that of a normal line. According to the rules for
665 % \topskip (p.114 of the TeXbook), the glue inserted is
666 % max (\topskip - \ht (first item), 0). If that height is large,
667 % therefore, no glue is inserted, and the space between the headline and
668 % the text is small, which looks bad.
669 %
670 % Another complication is that the group might be very large. This can
671 % cause the glue on the previous page to be unduly stretched, because it
672 % does not have much material. In this case, it's better to add an
673 % explicit \vfill so that the extra space is at the bottom. The
674 % threshold for doing this is if the group is more than \vfilllimit
675 % percent of a page (\vfilllimit can be changed inside of @tex).
676 %
677 \newbox\groupbox
678 \def\vfilllimit{0.7}
679 %
680 \envdef\group{%
681 \ifnum\catcode`\^^M=\active \else
682 \errhelp = \groupinvalidhelp
683 \errmessage{@group invalid in context where filling is enabled}%
684 \fi
685 \startsavinginserts
686 %
687 \setbox\groupbox = \vtop\bgroup
688 % Do @comment since we are called inside an environment such as
689 % @example, where each end-of-line in the input causes an
690 % end-of-line in the output. We don't want the end-of-line after
691 % the `@group' to put extra space in the output. Since @group
692 % should appear on a line by itself (according to the Texinfo
693 % manual), we don't worry about eating any user text.
694 \comment
695 }
696 %
697 % The \vtop produces a box with normal height and large depth; thus, TeX puts
698 % \baselineskip glue before it, and (when the next line of text is done)
699 % \lineskip glue after it. Thus, space below is not quite equal to space
700 % above. But it's pretty close.
701 \def\Egroup{%
702 % To get correct interline space between the last line of the group
703 % and the first line afterwards, we have to propagate \prevdepth.
704 \endgraf % Not \par, as it may have been set to \lisppar.
705 \global\dimen1 = \prevdepth
706 \egroup % End the \vtop.
707 % \dimen0 is the vertical size of the group's box.
708 \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox
709 % \dimen2 is how much space is left on the page (more or less).
710 \dimen2 = \pageheight \advance\dimen2 by -\pagetotal
711 % if the group doesn't fit on the current page, and it's a big big
712 % group, force a page break.
713 \ifdim \dimen0 > \dimen2
714 \ifdim \pagetotal < \vfilllimit\pageheight
715 \page
716 \fi
717 \fi
718 \box\groupbox
719 \prevdepth = \dimen1
720 \checkinserts
721 }
722 %
723 % TeX puts in an \escapechar (i.e., `@') at the beginning of the help
724 % message, so this ends up printing `@group can only ...'.
725 %
726 \newhelp\groupinvalidhelp{%
727 group can only be used in environments such as @example,^^J%
728 where each line of input produces a line of output.}
729
730 % @need space-in-mils
731 % forces a page break if there is not space-in-mils remaining.
732
733 \newdimen\mil \mil=0.001in
734
735 % Old definition--didn't work.
736 %\parseargdef\need{\par %
737 %% This method tries to make TeX break the page naturally
738 %% if the depth of the box does not fit.
739 %{\baselineskip=0pt%
740 %\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak
741 %\prevdepth=-1000pt
742 %}}
743
744 \parseargdef\need{%
745 % Ensure vertical mode, so we don't make a big box in the middle of a
746 % paragraph.
747 \par
748 %
749 % If the @need value is less than one line space, it's useless.
750 \dimen0 = #1\mil
751 \dimen2 = \ht\strutbox
752 \advance\dimen2 by \dp\strutbox
753 \ifdim\dimen0 > \dimen2
754 %
755 % Do a \strut just to make the height of this box be normal, so the
756 % normal leading is inserted relative to the preceding line.
757 % And a page break here is fine.
758 \vtop to #1\mil{\strut\vfil}%
759 %
760 % TeX does not even consider page breaks if a penalty added to the
761 % main vertical list is 10000 or more. But in order to see if the
762 % empty box we just added fits on the page, we must make it consider
763 % page breaks. On the other hand, we don't want to actually break the
764 % page after the empty box. So we use a penalty of 9999.
765 %
766 % There is an extremely small chance that TeX will actually break the
767 % page at this \penalty, if there are no other feasible breakpoints in
768 % sight. (If the user is using lots of big @group commands, which
769 % almost-but-not-quite fill up a page, TeX will have a hard time doing
770 % good page breaking, for example.) However, I could not construct an
771 % example where a page broke at this \penalty; if it happens in a real
772 % document, then we can reconsider our strategy.
773 \penalty9999
774 %
775 % Back up by the size of the box, whether we did a page break or not.
776 \kern -#1\mil
777 %
778 % Do not allow a page break right after this kern.
779 \nobreak
780 \fi
781 }
782
783 % @br forces paragraph break (and is undocumented).
784
785 \let\br = \par
786
787 % @page forces the start of a new page.
788 %
789 \def\page{\par\vfill\supereject}
790
791 % @exdent text....
792 % outputs text on separate line in roman font, starting at standard page margin
793
794 % This records the amount of indent in the innermost environment.
795 % That's how much \exdent should take out.
796 \newskip\exdentamount
797
798 % This defn is used inside fill environments such as @defun.
799 \parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}
800
801 % This defn is used inside nofill environments such as @example.
802 \parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount
803 \leftline{\hskip\leftskip{\rm#1}}}}
804
805 % @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
806 % paragraph. For more general purposes, use the \margin insertion
807 % class. WHICH is `l' or `r'.
808 %
809 \newskip\inmarginspacing \inmarginspacing=1cm
810 \def\strutdepth{\dp\strutbox}
811 %
812 \def\doinmargin#1#2{\strut\vadjust{%
813 \nobreak
814 \kern-\strutdepth
815 \vtop to \strutdepth{%
816 \baselineskip=\strutdepth
817 \vss
818 % if you have multiple lines of stuff to put here, you'll need to
819 % make the vbox yourself of the appropriate size.
820 \ifx#1l%
821 \llap{\ignorespaces #2\hskip\inmarginspacing}%
822 \else
823 \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}%
824 \fi
825 \null
826 }%
827 }}
828 \def\inleftmargin{\doinmargin l}
829 \def\inrightmargin{\doinmargin r}
830 %
831 % @inmargin{TEXT [, RIGHT-TEXT]}
832 % (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right;
833 % else use TEXT for both).
834 %
835 \def\inmargin#1{\parseinmargin #1,,\finish}
836 \def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing.
837 \setbox0 = \hbox{\ignorespaces #2}%
838 \ifdim\wd0 > 0pt
839 \def\lefttext{#1}% have both texts
840 \def\righttext{#2}%
841 \else
842 \def\lefttext{#1}% have only one text
843 \def\righttext{#1}%
844 \fi
845 %
846 \ifodd\pageno
847 \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin
848 \else
849 \def\temp{\inleftmargin\lefttext}%
850 \fi
851 \temp
852 }
853
854 % @include file insert text of that file as input.
855 %
856 \def\include{\parseargusing\filenamecatcodes\includezzz}
857 \def\includezzz#1{%
858 \pushthisfilestack
859 \def\thisfile{#1}%
860 {%
861 \makevalueexpandable
862 \def\temp{\input #1 }%
863 \expandafter
864 }\temp
865 \popthisfilestack
866 }
867 \def\filenamecatcodes{%
868 \catcode`\\=\other
869 \catcode`~=\other
870 \catcode`^=\other
871 \catcode`_=\other
872 \catcode`|=\other
873 \catcode`<=\other
874 \catcode`>=\other
875 \catcode`+=\other
876 \catcode`-=\other
877 }
878
879 \def\pushthisfilestack{%
880 \expandafter\pushthisfilestackX\popthisfilestack\StackTerm
881 }
882 \def\pushthisfilestackX{%
883 \expandafter\pushthisfilestackY\thisfile\StackTerm
884 }
885 \def\pushthisfilestackY #1\StackTerm #2\StackTerm {%
886 \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}%
887 }
888
889 \def\popthisfilestack{\errthisfilestackempty}
890 \def\errthisfilestackempty{\errmessage{Internal error:
891 the stack of filenames is empty.}}
892
893 \def\thisfile{}
894
895 % @center line
896 % outputs that line, centered.
897 %
898 \parseargdef\center{%
899 \ifhmode
900 \let\next\centerH
901 \else
902 \let\next\centerV
903 \fi
904 \next{\hfil \ignorespaces#1\unskip \hfil}%
905 }
906 \def\centerH#1{%
907 {%
908 \hfil\break
909 \advance\hsize by -\leftskip
910 \advance\hsize by -\rightskip
911 \line{#1}%
912 \break
913 }%
914 }
915 \def\centerV#1{\line{\kern\leftskip #1\kern\rightskip}}
916
917 % @sp n outputs n lines of vertical space
918
919 \parseargdef\sp{\vskip #1\baselineskip}
920
921 % @comment ...line which is ignored...
922 % @c is the same as @comment
923 % @ignore ... @end ignore is another way to write a comment
924
925 \def\comment{\begingroup \catcode`\^^M=\other%
926 \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
927 \commentxxx}
928 {\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}}
929
930 \let\c=\comment
931
932 % @paragraphindent NCHARS
933 % We'll use ems for NCHARS, close enough.
934 % NCHARS can also be the word `asis' or `none'.
935 % We cannot feasibly implement @paragraphindent asis, though.
936 %
937 \def\asisword{asis} % no translation, these are keywords
938 \def\noneword{none}
939 %
940 \parseargdef\paragraphindent{%
941 \def\temp{#1}%
942 \ifx\temp\asisword
943 \else
944 \ifx\temp\noneword
945 \defaultparindent = 0pt
946 \else
947 \defaultparindent = #1em
948 \fi
949 \fi
950 \parindent = \defaultparindent
951 }
952
953 % @exampleindent NCHARS
954 % We'll use ems for NCHARS like @paragraphindent.
955 % It seems @exampleindent asis isn't necessary, but
956 % I preserve it to make it similar to @paragraphindent.
957 \parseargdef\exampleindent{%
958 \def\temp{#1}%
959 \ifx\temp\asisword
960 \else
961 \ifx\temp\noneword
962 \lispnarrowing = 0pt
963 \else
964 \lispnarrowing = #1em
965 \fi
966 \fi
967 }
968
969 % @firstparagraphindent WORD
970 % If WORD is `none', then suppress indentation of the first paragraph
971 % after a section heading. If WORD is `insert', then do indent at such
972 % paragraphs.
973 %
974 % The paragraph indentation is suppressed or not by calling
975 % \suppressfirstparagraphindent, which the sectioning commands do.
976 % We switch the definition of this back and forth according to WORD.
977 % By default, we suppress indentation.
978 %
979 \def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent}
980 \def\insertword{insert}
981 %
982 \parseargdef\firstparagraphindent{%
983 \def\temp{#1}%
984 \ifx\temp\noneword
985 \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent
986 \else\ifx\temp\insertword
987 \let\suppressfirstparagraphindent = \relax
988 \else
989 \errhelp = \EMsimple
990 \errmessage{Unknown @firstparagraphindent option `\temp'}%
991 \fi\fi
992 }
993
994 % Here is how we actually suppress indentation. Redefine \everypar to
995 % \kern backwards by \parindent, and then reset itself to empty.
996 %
997 % We also make \indent itself not actually do anything until the next
998 % paragraph.
999 %
1000 \gdef\dosuppressfirstparagraphindent{%
1001 \gdef\indent{%
1002 \restorefirstparagraphindent
1003 \indent
1004 }%
1005 \gdef\noindent{%
1006 \restorefirstparagraphindent
1007 \noindent
1008 }%
1009 \global\everypar = {%
1010 \kern -\parindent
1011 \restorefirstparagraphindent
1012 }%
1013 }
1014
1015 \gdef\restorefirstparagraphindent{%
1016 \global \let \indent = \ptexindent
1017 \global \let \noindent = \ptexnoindent
1018 \global \everypar = {}%
1019 }
1020
1021
1022 % @asis just yields its argument. Used with @table, for example.
1023 %
1024 \def\asis#1{#1}
1025
1026 % @math outputs its argument in math mode.
1027 %
1028 % One complication: _ usually means subscripts, but it could also mean
1029 % an actual _ character, as in @math{@var{some_variable} + 1}. So make
1030 % _ active, and distinguish by seeing if the current family is \slfam,
1031 % which is what @var uses.
1032 {
1033 \catcode\underChar = \active
1034 \gdef\mathunderscore{%
1035 \catcode\underChar=\active
1036 \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
1037 }
1038 }
1039 % Another complication: we want \\ (and @\) to output a \ character.
1040 % FYI, plain.tex uses \\ as a temporary control sequence (why?), but
1041 % this is not advertised and we don't care. Texinfo does not
1042 % otherwise define @\.
1043 %
1044 % The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\.
1045 \def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}
1046 %
1047 \def\math{%
1048 \tex
1049 \mathunderscore
1050 \let\\ = \mathbackslash
1051 \mathactive
1052 $\finishmath
1053 }
1054 \def\finishmath#1{#1$\endgroup} % Close the group opened by \tex.
1055
1056 % Some active characters (such as <) are spaced differently in math.
1057 % We have to reset their definitions in case the @math was an argument
1058 % to a command which sets the catcodes (such as @item or @section).
1059 %
1060 {
1061 \catcode`^ = \active
1062 \catcode`< = \active
1063 \catcode`> = \active
1064 \catcode`+ = \active
1065 \gdef\mathactive{%
1066 \let^ = \ptexhat
1067 \let< = \ptexless
1068 \let> = \ptexgtr
1069 \let+ = \ptexplus
1070 }
1071 }
1072
1073 % @bullet and @minus need the same treatment as @math, just above.
1074 \def\bullet{$\ptexbullet$}
1075 \def\minus{$-$}
1076
1077 % @dots{} outputs an ellipsis using the current font.
1078 % We do .5em per period so that it has the same spacing in a typewriter
1079 % font as three actual period characters.
1080 %
1081 \def\dots{%
1082 \leavevmode
1083 \hbox to 1.5em{%
1084 \hskip 0pt plus 0.25fil
1085 .\hfil.\hfil.