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