INSTALLドキュメントで、InfoとCASL2LIBのディレクトリー記述を修正
[YACASL2.git] / doc / texinfo.tex
1 % texinfo.tex -- TeX macros to handle Texinfo files.
2 %
3 % Load plain if necessary, i.e., if running under initex.
4 \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
5 %
6 \def\texinfoversion{2013-12-21.11}
7 %
8 % Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
9 % 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
10 % 2007, 2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc.
11 %
12 % This texinfo.tex file is free software: you can redistribute it and/or
13 % modify it under the terms of the GNU General Public License as
14 % published by the Free Software Foundation, either version 3 of the
15 % License, or (at your option) any later version.
16 %
17 % This texinfo.tex file is distributed in the hope that it will be
18 % useful, but WITHOUT ANY WARRANTY; without even the implied warranty
19 % of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20 % General Public License for more details.
21 %
22 % You should have received a copy of the GNU General Public License
23 % along with this program.  If not, see <http://www.gnu.org/licenses/>.
24 %
25 % As a special exception, when this file is read by TeX when processing
26 % a Texinfo source document, you may use the result without
27 % restriction. This Exception is an additional permission under section 7
28 % of the GNU General Public License, version 3 ("GPLv3").
29 %
30 % Please try the latest version of texinfo.tex before submitting bug
31 % reports; you can get the latest version from:
32 %   http://ftp.gnu.org/gnu/texinfo/ (the Texinfo release area), or
33 %   http://ftpmirror.gnu.org/texinfo/ (same, via a mirror), or
34 %   http://www.gnu.org/software/texinfo/ (the Texinfo home page)
35 % The texinfo.tex in any given distribution could well be out
36 % of date, so if that's what you're using, please check.
37 %
38 % Send bug reports to bug-texinfo@gnu.org.  Please include including a
39 % complete document in each bug report with which we can reproduce the
40 % problem.  Patches are, of course, greatly appreciated.
41 %
42 % To process a Texinfo manual with TeX, it's most reliable to use the
43 % texi2dvi shell script that comes with the distribution.  For a simple
44 % manual foo.texi, however, you can get away with this:
45 %   tex foo.texi
46 %   texindex foo.??
47 %   tex foo.texi
48 %   tex foo.texi
49 %   dvips foo.dvi -o  # or whatever; this makes foo.ps.
50 % The extra TeX runs get the cross-reference information correct.
51 % Sometimes one run after texindex suffices, and sometimes you need more
52 % than two; texi2dvi does it as many times as necessary.
53 %
54 % It is possible to adapt texinfo.tex for other languages, to some
55 % extent.  You can get the existing language-specific files from the
56 % full Texinfo distribution.
57 %
58 % The GNU Texinfo home page is http://www.gnu.org/software/texinfo.
59
60
61 \message{Loading texinfo [version \texinfoversion]:}
62
63 % If in a .fmt file, print the version number
64 % and turn on active characters that we couldn't do earlier because
65 % they might have appeared in the input file name.
66 \everyjob{\message{[Texinfo version \texinfoversion]}%
67   \catcode`+=\active \catcode`\_=\active}
68
69 % (Aug. 17, 1999 --ak)
70 % Japanese support. (pTeX is a free Japanese TeX by ASCII corp., Japan,
71 % and jTeX is a free Japanese TeX by NTT corp. and T. Sakurai)
72 \newif\ifjaTeX
73 \newif\ifpTeX
74 \newif\ifjTeX
75 \ifx\kanjiskip\undefined\else
76   \pTeXtrue
77   \jaTeXtrue
78 \fi
79 \ifx\jkern\undefined\else
80   \jTeXtrue
81   \jaTeXtrue
82 \fi
83
84 \ifpTeX
85 \message{ASCII-pTeX,}
86 \fi
87 \ifjTeX
88 \message{NTT-jTeX,}
89 \fi
90 \chardef\other=12
91
92 % We never want plain's \outer definition of \+ in Texinfo.
93 % For @tex, we can use \tabalign.
94 \let\+ = \relax
95
96 % Save some plain tex macros whose names we will redefine.
97 \let\ptexb=\b
98 \let\ptexbullet=\bullet
99 \let\ptexc=\c
100 \let\ptexcomma=\,
101 \let\ptexdot=\.
102 \let\ptexdots=\dots
103 \let\ptexend=\end
104 \let\ptexequiv=\equiv
105 \let\ptexexclam=\!
106 \let\ptexfootnote=\footnote
107 \let\ptexgtr=>
108 \let\ptexhat=^
109 \let\ptexi=\i
110 \let\ptexindent=\indent
111 \let\ptexinsert=\insert
112 \let\ptexlbrace=\{
113 \let\ptexless=<
114 \let\ptexnewwrite\newwrite
115 \let\ptexnoindent=\noindent
116 \let\ptexplus=+
117 \let\ptexraggedright=\raggedright
118 \let\ptexrbrace=\}
119 \let\ptexslash=\/
120 \let\ptexstar=\*
121 \let\ptext=\t
122 \let\ptextop=\top
123 {\catcode`\'=\active \global\let\ptexquoteright'}% active in plain's math mode
124
125 % If this character appears in an error message or help string, it
126 % starts a new line in the output.
127 \newlinechar = `^^J
128
129 % Use TeX 3.0's \inputlineno to get the line number, for better error
130 % messages, but if we're using an old version of TeX, don't do anything.
131 %
132 \ifx\inputlineno\thisisundefined
133   \let\linenumber = \empty % Pre-3.0.
134 \else
135   \def\linenumber{l.\the\inputlineno:\space}
136 \fi
137
138 % Set up fixed words for English if not already set.
139 \ifx\putwordAppendix\undefined  \gdef\putwordAppendix{付録}\fi
140 \ifx\putwordChapter\undefined   \gdef\putwordChapter{章}\fi
141 \ifx\putworderror\undefined     \gdef\putworderror{エラー}\fi
142 \ifx\putwordfile\undefined      \gdef\putwordfile{ファイル}\fi
143 \ifx\putwordin\undefined        \gdef\putwordin{in}\fi
144 \ifx\putwordIndexIsEmpty\undefined       \gdef\putwordIndexIsEmpty{(Index is empty)}\fi
145 \ifx\putwordIndexNonexistent\undefined   \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi
146 \ifx\putwordInfo\undefined      \gdef\putwordInfo{Info}\fi
147 \ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi
148 \ifx\putwordMethodon\undefined  \gdef\putwordMethodon{Method on}\fi
149 \ifx\putwordNoTitle\undefined   \gdef\putwordNoTitle{No Title}\fi
150 \ifx\putwordof\undefined        \gdef\putwordof{of}\fi
151 \ifx\putwordon\undefined        \gdef\putwordon{on}\fi
152 \ifx\putwordpage\undefined      \gdef\putwordpage{ページ}\fi
153 \ifx\putwordsection\undefined   \gdef\putwordsection{セクション}\fi
154 \ifx\putwordSection\undefined   \gdef\putwordSection{セクション}\fi
155 \ifx\putwordsee\undefined       \gdef\putwordsee{See}\fi
156 \ifx\putwordSee\undefined       \gdef\putwordSee{See}\fi
157 \ifx\putwordShortTOC\undefined  \gdef\putwordShortTOC{Short Contents}\fi
158 \ifx\putwordTOC\undefined       \gdef\putwordTOC{目次}\fi
159 %
160 \ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi
161 \ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi
162 \ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi
163 \ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi
164 \ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi
165 \ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi
166 \ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi
167 \ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi
168 \ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi
169 \ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi
170 \ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi
171 \ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi
172 %
173 \ifx\putwordDefmac\undefined    \gdef\putwordDefmac{Macro}\fi
174 \ifx\putwordDefspec\undefined   \gdef\putwordDefspec{Special Form}\fi
175 \ifx\putwordDefvar\undefined    \gdef\putwordDefvar{Variable}\fi
176 \ifx\putwordDefopt\undefined    \gdef\putwordDefopt{User Option}\fi
177 \ifx\putwordDeffunc\undefined   \gdef\putwordDeffunc{Function}\fi
178
179 % Since the category of space is not known, we have to be careful.
180 \chardef\spacecat = 10
181 \def\spaceisspace{\catcode`\ =\spacecat}
182
183 % sometimes characters are active, so we need control sequences.
184 \chardef\ampChar   = `\&
185 \chardef\colonChar = `\:
186 \chardef\commaChar = `\,
187 \chardef\dashChar  = `\-
188 \chardef\dotChar   = `\.
189 \chardef\exclamChar= `\!
190 \chardef\hashChar  = `\#
191 \chardef\lquoteChar= `\`
192 \chardef\questChar = `\?
193 \chardef\rquoteChar= `\'
194 \chardef\semiChar  = `\;
195 \chardef\slashChar = `\/
196 \chardef\underChar = `\_
197
198 % Ignore a token.
199 %
200 \def\gobble#1{}
201
202 % The following is used inside several \edef's.
203 \def\makecsname#1{\expandafter\noexpand\csname#1\endcsname}
204
205 % Hyphenation fixes.
206 \hyphenation{
207   Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script
208   ap-pen-dix bit-map bit-maps
209   data-base data-bases eshell fall-ing half-way long-est man-u-script
210   man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm
211   par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces
212   spell-ing spell-ings
213   stand-alone strong-est time-stamp time-stamps which-ever white-space
214   wide-spread wrap-around
215 }
216
217 % Margin to add to right of even pages, to left of odd pages.
218 \newdimen\bindingoffset
219 \newdimen\normaloffset
220 \newdimen\pagewidth \newdimen\pageheight
221
222 % For a final copy, take out the rectangles
223 % that mark overfull boxes (in case you have decided
224 % that the text looks ok even though it passes the margin).
225 %
226 \def\finalout{\overfullrule=0pt }
227
228 % Sometimes it is convenient to have everything in the transcript file
229 % and nothing on the terminal.  We don't just call \tracingall here,
230 % since that produces some useless output on the terminal.  We also make
231 % some effort to order the tracing commands to reduce output in the log
232 % file; cf. trace.sty in LaTeX.
233 %
234 \def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
235 \def\loggingall{%
236   \tracingstats2
237   \tracingpages1
238   \tracinglostchars2  % 2 gives us more in etex
239   \tracingparagraphs1
240   \tracingoutput1
241   \tracingmacros2
242   \tracingrestores1
243   \showboxbreadth\maxdimen \showboxdepth\maxdimen
244   \ifx\eTeXversion\thisisundefined\else % etex gives us more logging
245     \tracingscantokens1
246     \tracingifs1
247     \tracinggroups1
248     \tracingnesting2
249     \tracingassigns1
250   \fi
251   \tracingcommands3  % 3 gives us more in etex
252   \errorcontextlines16
253 }%
254
255 % @errormsg{MSG}.  Do the index-like expansions on MSG, but if things
256 % aren't perfect, it's not the end of the world, being an error message,
257 % after all.
258
259 \def\errormsg{\begingroup \indexnofonts \doerrormsg}
260 \def\doerrormsg#1{\errmessage{#1}}
261
262 % add check for \lastpenalty to plain's definitions.  If the last thing
263 % we did was a \nobreak, we don't want to insert more space.
264 %
265 \def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount
266   \removelastskip\penalty-50\smallskip\fi\fi}
267 \def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount
268   \removelastskip\penalty-100\medskip\fi\fi}
269 \def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount
270   \removelastskip\penalty-200\bigskip\fi\fi}
271
272 % Do @cropmarks to get crop marks.
273 %
274 \newif\ifcropmarks
275 \let\cropmarks = \cropmarkstrue
276 %
277 % Dimensions to add cropmarks at corners.
278 % Added by P. A. MacKay, 12 Nov. 1986
279 %
280 \newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
281 \newdimen\cornerlong  \cornerlong=1pc
282 \newdimen\cornerthick \cornerthick=.3pt
283 \newdimen\topandbottommargin \topandbottommargin=.75in
284
285 % Output a mark which sets \thischapter, \thissection and \thiscolor.
286 % We dump everything together because we only have one kind of mark.
287 % This works because we only use \botmark / \topmark, not \firstmark.
288 %
289 % A mark contains a subexpression of the \ifcase ... \fi construct.
290 % \get*marks macros below extract the needed part using \ifcase.
291 %
292 % Another complication is to let the user choose whether \thischapter
293 % (\thissection) refers to the chapter (section) in effect at the top
294 % of a page, or that at the bottom of a page.  The solution is
295 % described on page 260 of The TeXbook.  It involves outputting two
296 % marks for the sectioning macros, one before the section break, and
297 % one after.  I won't pretend I can describe this better than DEK...
298 \def\domark{%
299   \toks0=\expandafter{\lastchapterdefs}%
300   \toks2=\expandafter{\lastsectiondefs}%
301   \toks4=\expandafter{\prevchapterdefs}%
302   \toks6=\expandafter{\prevsectiondefs}%
303   \toks8=\expandafter{\lastcolordefs}%
304   \mark{%
305                    \the\toks0 \the\toks2
306       \noexpand\or \the\toks4 \the\toks6
307     \noexpand\else \the\toks8
308   }%
309 }
310 % \topmark doesn't work for the very first chapter (after the title
311 % page or the contents), so we use \firstmark there -- this gets us
312 % the mark with the chapter defs, unless the user sneaks in, e.g.,
313 % @setcolor (or @url, or @link, etc.) between @contents and the very
314 % first @chapter.
315 \def\gettopheadingmarks{%
316   \ifcase0\topmark\fi
317   \ifx\thischapter\empty \ifcase0\firstmark\fi \fi
318 }
319 \def\getbottomheadingmarks{\ifcase1\botmark\fi}
320 \def\getcolormarks{\ifcase2\topmark\fi}
321
322 % Avoid "undefined control sequence" errors.
323 \def\lastchapterdefs{}
324 \def\lastsectiondefs{}
325 \def\prevchapterdefs{}
326 \def\prevsectiondefs{}
327 \def\lastcolordefs{}
328
329 % Main output routine.
330 \chardef\PAGE = 255
331 \output = {\onepageout{\pagecontents\PAGE}}
332
333 \newbox\headlinebox
334 \newbox\footlinebox
335
336 % \onepageout takes a vbox as an argument.  Note that \pagecontents
337 % does insertions, but you have to call it yourself.
338 \def\onepageout#1{%
339   \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi
340   %
341   \ifodd\pageno  \advance\hoffset by \bindingoffset
342   \else \advance\hoffset by -\bindingoffset\fi
343   %
344   % Do this outside of the \shipout so @code etc. will be expanded in
345   % the headline as they should be, not taken literally (outputting ''code).
346   \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi
347   \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}%
348   \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi
349   \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}%
350   %
351   {%
352     % Have to do this stuff outside the \shipout because we want it to
353     % take effect in \write's, yet the group defined by the \vbox ends
354     % before the \shipout runs.
355     %
356     \indexdummies         % don't expand commands in the output.
357     \normalturnoffactive  % \ in index entries must not stay \, e.g., if
358                % the page break happens to be in the middle of an example.
359                % We don't want .vr (or whatever) entries like this:
360                % \entry{{\tt \indexbackslash }acronym}{32}{\code {\acronym}}
361                % "\acronym" won't work when it's read back in;
362                % it needs to be
363                % {\code {{\tt \backslashcurfont }acronym}
364     \shipout\vbox{%
365       % Do this early so pdf references go to the beginning of the page.
366       \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi
367       %
368       \ifcropmarks \vbox to \outervsize\bgroup
369         \hsize = \outerhsize
370         \vskip-\topandbottommargin
371         \vtop to0pt{%
372           \line{\ewtop\hfil\ewtop}%
373           \nointerlineskip
374           \line{%
375             \vbox{\moveleft\cornerthick\nstop}%
376             \hfill
377             \vbox{\moveright\cornerthick\nstop}%
378           }%
379           \vss}%
380         \vskip\topandbottommargin
381         \line\bgroup
382           \hfil % center the page within the outer (page) hsize.
383           \ifodd\pageno\hskip\bindingoffset\fi
384           \vbox\bgroup
385       \fi
386       %
387       \unvbox\headlinebox
388       \pagebody{#1}%
389       \ifdim\ht\footlinebox > 0pt
390         % Only leave this space if the footline is nonempty.
391         % (We lessened \vsize for it in \oddfootingyyy.)
392         % The \baselineskip=24pt in plain's \makefootline has no effect.
393         \vskip 24pt
394         \unvbox\footlinebox
395       \fi
396       %
397       \ifcropmarks
398           \egroup % end of \vbox\bgroup
399         \hfil\egroup % end of (centering) \line\bgroup
400         \vskip\topandbottommargin plus1fill minus1fill
401         \boxmaxdepth = \cornerthick
402         \vbox to0pt{\vss
403           \line{%
404             \vbox{\moveleft\cornerthick\nsbot}%
405             \hfill
406             \vbox{\moveright\cornerthick\nsbot}%
407           }%
408           \nointerlineskip
409           \line{\ewbot\hfil\ewbot}%
410         }%
411       \egroup % \vbox from first cropmarks clause
412       \fi
413     }% end of \shipout\vbox
414   }% end of group with \indexdummies
415   \advancepageno
416   \ifnum\outputpenalty>-20000 \else\dosupereject\fi
417 }
418
419 \newinsert\margin \dimen\margin=\maxdimen
420
421 \def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}
422 {\catcode`\@ =11
423 \gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
424 % marginal hacks, juha@viisa.uucp (Juha Takala)
425 \ifvoid\margin\else % marginal info is present
426   \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi
427 \dimen@=\dp#1\relax \unvbox#1\relax
428 \ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
429 \ifr@ggedbottom \kern-\dimen@ \vfil \fi}
430 }
431
432 % Here are the rules for the cropmarks.  Note that they are
433 % offset so that the space between them is truly \outerhsize or \outervsize
434 % (P. A. MacKay, 12 November, 1986)
435 %
436 \def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}
437 \def\nstop{\vbox
438   {\hrule height\cornerthick depth\cornerlong width\cornerthick}}
439 \def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}
440 \def\nsbot{\vbox
441   {\hrule height\cornerlong depth\cornerthick width\cornerthick}}
442
443 % Parse an argument, then pass it to #1.  The argument is the rest of
444 % the input line (except we remove a trailing comment).  #1 should be a
445 % macro which expects an ordinary undelimited TeX argument.
446 %
447 \def\parsearg{\parseargusing{}}
448 \def\parseargusing#1#2{%
449   \def\argtorun{#2}%
450   \begingroup
451     \obeylines
452     \spaceisspace
453     #1%
454     \parseargline\empty% Insert the \empty token, see \finishparsearg below.
455 }
456
457 {\obeylines %
458   \gdef\parseargline#1^^M{%
459     \endgroup % End of the group started in \parsearg.
460     \argremovecomment #1\comment\ArgTerm%
461   }%
462 }
463
464 % First remove any @comment, then any @c comment.
465 \def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm}
466 \def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm}
467
468 % Each occurrence of `\^^M' or `<space>\^^M' is replaced by a single space.
469 %
470 % \argremovec might leave us with trailing space, e.g.,
471 %    @end itemize  @c foo
472 % This space token undergoes the same procedure and is eventually removed
473 % by \finishparsearg.
474 %
475 \def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M}
476 \def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M}
477 \def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{%
478   \def\temp{#3}%
479   \ifx\temp\empty
480     % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp:
481     \let\temp\finishparsearg
482   \else
483     \let\temp\argcheckspaces
484   \fi
485   % Put the space token in:
486   \temp#1 #3\ArgTerm
487 }
488
489 % If a _delimited_ argument is enclosed in braces, they get stripped; so
490 % to get _exactly_ the rest of the line, we had to prevent such situation.
491 % We prepended an \empty token at the very beginning and we expand it now,
492 % just before passing the control to \argtorun.
493 % (Similarly, we have to think about #3 of \argcheckspacesY above: it is
494 % either the null string, or it ends with \^^M---thus there is no danger
495 % that a pair of braces would be stripped.
496 %
497 % But first, we have to remove the trailing space token.
498 %
499 \def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}}
500
501 % \parseargdef\foo{...}
502 %       is roughly equivalent to
503 % \def\foo{\parsearg\Xfoo}
504 % \def\Xfoo#1{...}
505 %
506 % Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my
507 % favourite TeX trick.  --kasal, 16nov03
508
509 \def\parseargdef#1{%
510   \expandafter \doparseargdef \csname\string#1\endcsname #1%
511 }
512 \def\doparseargdef#1#2{%
513   \def#2{\parsearg#1}%
514   \def#1##1%
515 }
516
517 % Several utility definitions with active space:
518 {
519   \obeyspaces
520   \gdef\obeyedspace{ }
521
522   % Make each space character in the input produce a normal interword
523   % space in the output.  Don't allow a line break at this space, as this
524   % is used only in environments like @example, where each line of input
525   % should produce a line of output anyway.
526   %
527   \gdef\sepspaces{\obeyspaces\let =\tie}
528
529   % If an index command is used in an @example environment, any spaces
530   % therein should become regular spaces in the raw index file, not the
531   % expansion of \tie (\leavevmode \penalty \@M \ ).
532   \gdef\unsepspaces{\let =\space}
533 }
534
535
536 \def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
537
538 % Define the framework for environments in texinfo.tex.  It's used like this:
539 %
540 %   \envdef\foo{...}
541 %   \def\Efoo{...}
542 %
543 % It's the responsibility of \envdef to insert \begingroup before the
544 % actual body; @end closes the group after calling \Efoo.  \envdef also
545 % defines \thisenv, so the current environment is known; @end checks
546 % whether the environment name matches.  The \checkenv macro can also be
547 % used to check whether the current environment is the one expected.
548 %
549 % Non-false conditionals (@iftex, @ifset) don't fit into this, so they
550 % are not treated as environments; they don't open a group.  (The
551 % implementation of @end takes care not to call \endgroup in this
552 % special case.)
553
554
555 % At run-time, environments start with this:
556 \def\startenvironment#1{\begingroup\def\thisenv{#1}}
557 % initialize
558 \let\thisenv\empty
559
560 % ... but they get defined via ``\envdef\foo{...}'':
561 \long\def\envdef#1#2{\def#1{\startenvironment#1#2}}
562 \def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}}
563
564 % Check whether we're in the right environment:
565 \def\checkenv#1{%
566   \def\temp{#1}%
567   \ifx\thisenv\temp
568   \else
569     \badenverr
570   \fi
571 }
572
573 % Environment mismatch, #1 expected:
574 \def\badenverr{%
575   \errhelp = \EMsimple
576   \errmessage{This command can appear only \inenvironment\temp,
577     not \inenvironment\thisenv}%
578 }
579 \def\inenvironment#1{%
580   \ifx#1\empty
581     outside of any environment%
582   \else
583     in environment \expandafter\string#1%
584   \fi
585 }
586
587 % @end foo executes the definition of \Efoo.
588 % But first, it executes a specialized version of \checkenv
589 %
590 \parseargdef\end{%
591   \if 1\csname iscond.#1\endcsname
592   \else
593     % The general wording of \badenverr may not be ideal.
594     \expandafter\checkenv\csname#1\endcsname
595     \csname E#1\endcsname
596     \endgroup
597   \fi
598 }
599
600 \newhelp\EMsimple{Press RETURN to continue.}
601
602
603 % Be sure we're in horizontal mode when doing a tie, since we make space
604 % equivalent to this in @example-like environments. Otherwise, a space
605 % at the beginning of a line will start with \penalty -- and
606 % since \penalty is valid in vertical mode, we'd end up putting the
607 % penalty on the vertical list instead of in the new paragraph.
608 {\catcode`@ = 11
609  % Avoid using \@M directly, because that causes trouble
610  % if the definition is written into an index file.
611  \global\let\tiepenalty = \@M
612  \gdef\tie{\leavevmode\penalty\tiepenalty\ }
613 }
614
615 % @: forces normal size whitespace following.
616 \def\:{\spacefactor=1000 }
617
618 % @* forces a line break.
619 \def\*{\unskip\hfil\break\hbox{}\ignorespaces}
620
621 % @/ allows a line break.
622 \let\/=\allowbreak
623
624 % @. is an end-of-sentence period.
625 \def\.{.\spacefactor=\endofsentencespacefactor\space}
626
627 % @! is an end-of-sentence bang.
628 \def\!{!\spacefactor=\endofsentencespacefactor\space}
629
630 % @? is an end-of-sentence query.
631 \def\?{?\spacefactor=\endofsentencespacefactor\space}
632
633 % @frenchspacing on|off  says whether to put extra space after punctuation.
634 %
635 \def\onword{on}
636 \def\offword{off}
637 %
638 \parseargdef\frenchspacing{%
639   \def\temp{#1}%
640   \ifx\temp\onword \plainfrenchspacing
641   \else\ifx\temp\offword \plainnonfrenchspacing
642   \else
643     \errhelp = \EMsimple
644     \errmessage{Unknown @frenchspacing option `\temp', must be on|off}%
645   \fi\fi
646 }
647
648 % @w prevents a word break.  Without the \leavevmode, @w at the
649 % beginning of a paragraph, when TeX is still in vertical mode, would
650 % produce a whole line of output instead of starting the paragraph.
651 \def\w#1{\leavevmode\hbox{#1}}
652
653 % @group ... @end group forces ... to be all on one page, by enclosing
654 % it in a TeX vbox.  We use \vtop instead of \vbox to construct the box
655 % to keep its height that of a normal line.  According to the rules for
656 % \topskip (p.114 of the TeXbook), the glue inserted is
657 % max (\topskip - \ht (first item), 0).  If that height is large,
658 % therefore, no glue is inserted, and the space between the headline and
659 % the text is small, which looks bad.
660 %
661 % Another complication is that the group might be very large.  This can
662 % cause the glue on the previous page to be unduly stretched, because it
663 % does not have much material.  In this case, it's better to add an
664 % explicit \vfill so that the extra space is at the bottom.  The
665 % threshold for doing this is if the group is more than \vfilllimit
666 % percent of a page (\vfilllimit can be changed inside of @tex).
667 %
668 \newbox\groupbox
669 \def\vfilllimit{0.7}
670 %
671 \envdef\group{%
672   \ifnum\catcode`\^^M=\active \else
673     \errhelp = \groupinvalidhelp
674     \errmessage{@group invalid in context where filling is enabled}%
675   \fi
676   \startsavinginserts
677   %
678   \setbox\groupbox = \vtop\bgroup
679     % Do @comment since we are called inside an environment such as
680     % @example, where each end-of-line in the input causes an
681     % end-of-line in the output.  We don't want the end-of-line after
682     % the `@group' to put extra space in the output.  Since @group
683     % should appear on a line by itself (according to the Texinfo
684     % manual), we don't worry about eating any user text.
685     \comment
686 }
687 %
688 % The \vtop produces a box with normal height and large depth; thus, TeX puts
689 % \baselineskip glue before it, and (when the next line of text is done)
690 % \lineskip glue after it.  Thus, space below is not quite equal to space
691 % above.  But it's pretty close.
692 \def\Egroup{%
693     % To get correct interline space between the last line of the group
694     % and the first line afterwards, we have to propagate \prevdepth.
695     \endgraf % Not \par, as it may have been set to \lisppar.
696     \global\dimen1 = \prevdepth
697   \egroup           % End the \vtop.
698   % \dimen0 is the vertical size of the group's box.
699   \dimen0 = \ht\groupbox  \advance\dimen0 by \dp\groupbox
700   % \dimen2 is how much space is left on the page (more or less).
701   \dimen2 = \pageheight   \advance\dimen2 by -\pagetotal
702   % if the group doesn't fit on the current page, and it's a big big
703   % group, force a page break.
704   \ifdim \dimen0 > \dimen2
705     \ifdim \pagetotal < \vfilllimit\pageheight
706       \page
707     \fi
708   \fi
709   \box\groupbox
710   \prevdepth = \dimen1
711   \checkinserts
712 }
713 %
714 % TeX puts in an \escapechar (i.e., `@') at the beginning of the help
715 % message, so this ends up printing `@group can only ...'.
716 %
717 \newhelp\groupinvalidhelp{%
718 group can only be used in environments such as @example,^^J%
719 where each line of input produces a line of output.}
720
721 % @need space-in-mils
722 % forces a page break if there is not space-in-mils remaining.
723
724 \newdimen\mil  \mil=0.001in
725
726 \parseargdef\need{%
727   % Ensure vertical mode, so we don't make a big box in the middle of a
728   % paragraph.
729   \par
730   %
731   % If the @need value is less than one line space, it's useless.
732   \dimen0 = #1\mil
733   \dimen2 = \ht\strutbox
734   \advance\dimen2 by \dp\strutbox
735   \ifdim\dimen0 > \dimen2
736     %
737     % Do a \strut just to make the height of this box be normal, so the
738     % normal leading is inserted relative to the preceding line.
739     % And a page break here is fine.
740     \vtop to #1\mil{\strut\vfil}%
741     %
742     % TeX does not even consider page breaks if a penalty added to the
743     % main vertical list is 10000 or more.  But in order to see if the
744     % empty box we just added fits on the page, we must make it consider
745     % page breaks.  On the other hand, we don't want to actually break the
746     % page after the empty box.  So we use a penalty of 9999.
747     %
748     % There is an extremely small chance that TeX will actually break the
749     % page at this \penalty, if there are no other feasible breakpoints in
750     % sight.  (If the user is using lots of big @group commands, which
751     % almost-but-not-quite fill up a page, TeX will have a hard time doing
752     % good page breaking, for example.)  However, I could not construct an
753     % example where a page broke at this \penalty; if it happens in a real
754     % document, then we can reconsider our strategy.
755     \penalty9999
756     %
757     % Back up by the size of the box, whether we did a page break or not.
758     \kern -#1\mil
759     %
760     % Do not allow a page break right after this kern.
761     \nobreak
762   \fi
763 }
764
765 % @br   forces paragraph break (and is undocumented).
766
767 \let\br = \par
768
769 % @page forces the start of a new page.
770 %
771 \def\page{\par\vfill\supereject}
772
773 % @exdent text....
774 % outputs text on separate line in roman font, starting at standard page margin
775
776 % This records the amount of indent in the innermost environment.
777 % That's how much \exdent should take out.
778 \newskip\exdentamount
779
780 % This defn is used inside fill environments such as @defun.
781 \parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}
782
783 % This defn is used inside nofill environments such as @example.
784 \parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount
785   \leftline{\hskip\leftskip{\rm#1}}}}
786
787 % @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
788 % paragraph.  For more general purposes, use the \margin insertion
789 % class.  WHICH is `l' or `r'.  Not documented, written for gawk manual.
790 %
791 \newskip\inmarginspacing \inmarginspacing=1cm
792 \def\strutdepth{\dp\strutbox}
793 %
794 \def\doinmargin#1#2{\strut\vadjust{%
795   \nobreak
796   \kern-\strutdepth
797   \vtop to \strutdepth{%
798     \baselineskip=\strutdepth
799     \vss
800     % if you have multiple lines of stuff to put here, you'll need to
801     % make the vbox yourself of the appropriate size.
802     \ifx#1l%
803       \llap{\ignorespaces #2\hskip\inmarginspacing}%
804     \else
805       \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}%
806     \fi
807     \null
808   }%
809 }}
810 \def\inleftmargin{\doinmargin l}
811 \def\inrightmargin{\doinmargin r}
812 %
813 % @inmargin{TEXT [, RIGHT-TEXT]}
814 % (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right;
815 % else use TEXT for both).
816 %
817 \def\inmargin#1{\parseinmargin #1,,\finish}
818 \def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing.
819   \setbox0 = \hbox{\ignorespaces #2}%
820   \ifdim\wd0 > 0pt
821     \def\lefttext{#1}%  have both texts
822     \def\righttext{#2}%
823   \else
824     \def\lefttext{#1}%  have only one text
825     \def\righttext{#1}%
826   \fi
827   %
828   \ifodd\pageno
829     \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin
830   \else
831     \def\temp{\inleftmargin\lefttext}%
832   \fi
833   \temp
834 }
835
836 % @| inserts a changebar to the left of the current line.  It should
837 % surround any changed text.  This approach does *not* work if the
838 % change spans more than two lines of output.  To handle that, we would
839 % have adopt a much more difficult approach (putting marks into the main
840 % vertical list for the beginning and end of each change).  This command
841 % is not documented, not supported, and doesn't work.
842 %
843 \def\|{%
844   % \vadjust can only be used in horizontal mode.
845   \leavevmode
846   %
847   % Append this vertical mode material after the current line in the output.
848   \vadjust{%
849     % We want to insert a rule with the height and depth of the current
850     % leading; that is exactly what \strutbox is supposed to record.
851     \vskip-\baselineskip
852     %
853     % \vadjust-items are inserted at the left edge of the type.  So
854     % the \llap here moves out into the left-hand margin.
855     \llap{%
856       %
857       % For a thicker or thinner bar, change the `1pt'.
858       \vrule height\baselineskip width1pt
859       %
860       % This is the space between the bar and the text.
861       \hskip 12pt
862     }%
863   }%
864 }
865
866 % @include FILE -- \input text of FILE.
867 %
868 \def\include{\parseargusing\filenamecatcodes\includezzz}
869 \def\includezzz#1{%
870   \pushthisfilestack
871   \def\thisfile{#1}%
872   {%
873     \makevalueexpandable  % we want to expand any @value in FILE.
874     \turnoffactive        % and allow special characters in the expansion
875     \indexnofonts         % Allow `@@' and other weird things in file names.
876     \wlog{texinfo.tex: doing @include of #1^^J}%
877     \edef\temp{\noexpand\input #1 }%
878     %
879     % This trickery is to read FILE outside of a group, in case it makes
880     % definitions, etc.
881     \expandafter
882   }\temp
883   \popthisfilestack
884 }
885 \def\filenamecatcodes{%
886   \catcode`\\=\other
887   \catcode`~=\other
888   \catcode`^=\other
889   \catcode`_=\other
890   \catcode`|=\other
891   \catcode`<=\other
892   \catcode`>=\other
893   \catcode`+=\other
894   \catcode`-=\other
895   \catcode`\`=\other
896   \catcode`\'=\other
897 }
898
899 \def\pushthisfilestack{%
900   \expandafter\pushthisfilestackX\popthisfilestack\StackTerm
901 }
902 \def\pushthisfilestackX{%
903   \expandafter\pushthisfilestackY\thisfile\StackTerm
904 }
905 \def\pushthisfilestackY #1\StackTerm #2\StackTerm {%
906   \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}%
907 }
908
909 \def\popthisfilestack{\errthisfilestackempty}
910 \def\errthisfilestackempty{\errmessage{Internal error:
911   the stack of filenames is empty.}}
912 %
913 \def\thisfile{}
914
915 % @center line
916 % outputs that line, centered.
917 %
918 \parseargdef\center{%
919   \ifhmode
920     \let\centersub\centerH
921   \else
922     \let\centersub\centerV
923   \fi
924   \centersub{\hfil \ignorespaces#1\unskip \hfil}%
925   \let\centersub\relax % don't let the definition persist, just in case
926 }
927 \def\centerH#1{{%
928   \hfil\break
929   \advance\hsize by -\leftskip
930   \advance\hsize by -\rightskip
931   \line{#1}%
932   \break
933 }}
934 %
935 \newcount\centerpenalty
936 \def\centerV#1{%
937   % The idea here is the same as in \startdefun, \cartouche, etc.: if
938   % @center is the first thing after a section heading, we need to wipe
939   % out the negative parskip inserted by \sectionheading, but still
940   % prevent a page break here.
941   \centerpenalty = \lastpenalty
942   \ifnum\centerpenalty>10000 \vskip\parskip \fi
943   \ifnum\centerpenalty>9999 \penalty\centerpenalty \fi
944   \line{\kern\leftskip #1\kern\rightskip}%
945 }
946
947 % @sp n   outputs n lines of vertical space
948 %
949 \parseargdef\sp{\vskip #1\baselineskip}
950
951 % @comment ...line which is ignored...
952 % @c is the same as @comment
953 % @ignore ... @end ignore  is another way to write a comment
954 %
955 \def\comment{\begingroup \catcode`\^^M=\other%
956 \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
957 \commentxxx}
958 {\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}}
959 %
960 \let\c=\comment
961
962 % @paragraphindent NCHARS
963 % We'll use ems for NCHARS, close enough.
964 % NCHARS can also be the word `asis' or `none'.
965 % We cannot feasibly implement @paragraphindent asis, though.
966 %
967 \def\asisword{asis} % no translation, these are keywords
968 \def\noneword{none}
969 %
970 \parseargdef\paragraphindent{%
971   \def\temp{#1}%
972   \ifx\temp\asisword
973   \else
974     \ifx\temp\noneword
975       \defaultparindent = 0pt
976     \else
977       \defaultparindent = #1em
978     \fi
979   \fi
980   \parindent = \defaultparindent
981 }
982
983 % @exampleindent NCHARS
984 % We'll use ems for NCHARS like @paragraphindent.
985 % It seems @exampleindent asis isn't necessary, but
986 % I preserve it to make it similar to @paragraphindent.
987 \parseargdef\exampleindent{%
988   \def\temp{#1}%
989   \ifx\temp\asisword
990   \else
991     \ifx\temp\noneword
992       \lispnarrowing = 0pt
993     \else
994       \lispnarrowing = #1em
995     \fi
996   \fi
997 }
998
999 % @firstparagraphindent WORD
1000 % If WORD is `none', then suppress indentation of the first paragraph
1001 % after a section heading.  If WORD is `insert', then do indent at such
1002 % paragraphs.
1003 %
1004 % The paragraph indentation is suppressed or not by calling
1005 % \suppressfirstparagraphindent, which the sectioning commands do.
1006 % We switch the definition of this back and forth according to WORD.
1007 % By default, we suppress indentation.
1008 %
1009 \def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent}
1010 \def\insertword{insert}
1011 %
1012 \parseargdef\firstparagraphindent{%
1013   \def\temp{#1}%
1014   \ifx\temp\noneword
1015     \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent
1016   \else\ifx\temp\insertword
1017     \let\suppressfirstparagraphindent = \relax
1018   \else
1019     \errhelp = \EMsimple
1020     \errmessage{Unknown @firstparagraphindent option `\temp'}%
1021   \fi\fi
1022 }
1023
1024 % Here is how we actually suppress indentation.  Redefine \everypar to
1025 % \kern backwards by \parindent, and then reset itself to empty.
1026 %
1027 % We also make \indent itself not actually do anything until the next
1028 % paragraph.
1029 %
1030 \gdef\dosuppressfirstparagraphindent{%
1031   \gdef\indent{%
1032     \restorefirstparagraphindent
1033     \indent
1034   }%
1035   \gdef\noindent{%
1036     \restorefirstparagraphindent
1037     \noindent
1038   }%
1039   \global\everypar = {%
1040     \kern -\parindent
1041     \restorefirstparagraphindent
1042   }%
1043 }
1044
1045 \gdef\restorefirstparagraphindent{%
1046   \global \let \indent = \ptexindent
1047   \global \let \noindent = \ptexnoindent
1048   \global \everypar = {}%
1049 }
1050
1051
1052 % @refill is a no-op.
1053 \let\refill=\relax
1054
1055 % If working on a large document in chapters, it is convenient to
1056 % be able to disable indexing, cross-referencing, and contents, for test runs.
1057 % This is done with @novalidate (before @setfilename).
1058 %
1059 \newif\iflinks \linkstrue % by default we want the aux files.
1060 \let\novalidate = \linksfalse
1061
1062 % @setfilename is done at the beginning of every texinfo file.
1063 % So open here the files we need to have open while reading the input.
1064 % This makes it possible to make a .fmt file for texinfo.
1065 \def\setfilename{%
1066    \fixbackslash  % Turn off hack to swallow `\input texinfo'.
1067    \iflinks
1068      \tryauxfile
1069      % Open the new aux file.  TeX will close it automatically at exit.
1070      \immediate\openout\auxfile=\jobname.aux
1071    \fi % \openindices needs to do some work in any case.
1072    \openindices
1073    \let\setfilename=\comment % Ignore extra @setfilename cmds.
1074    %
1075    % If texinfo.cnf is present on the system, read it.
1076    % Useful for site-wide @afourpaper, etc.
1077    \openin 1 texinfo.cnf
1078    \ifeof 1 \else \input texinfo.cnf \fi
1079    \closein 1
1080    %
1081    \comment % Ignore the actual filename.
1082 }
1083
1084 % Called from \setfilename.
1085 %
1086 \def\openindices{%
1087   \newindex{cp}%
1088   \newcodeindex{fn}%
1089   \newcodeindex{vr}%
1090   \newcodeindex{tp}%
1091   \newcodeindex{ky}%
1092   \newcodeindex{pg}%
1093 }
1094
1095 % @bye.
1096 \outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
1097
1098
1099 \message{pdf,}
1100 % adobe `portable' document format
1101 \newcount\tempnum
1102 \newcount\lnkcount
1103 \newtoks\filename
1104 \newcount\filenamelength
1105 \newcount\pgn
1106 \newtoks\toksA
1107 \newtoks\toksB
1108 \newtoks\toksC
1109 \newtoks\toksD
1110 \newbox\boxA
1111 \newcount\countA
1112 \newif\ifpdf
1113 \newif\ifpdfmakepagedest
1114
1115 % when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1
1116 % can be set).  So we test for \relax and 0 as well as being undefined.
1117 \ifx\pdfoutput\thisisundefined
1118 \else
1119   \ifx\pdfoutput\relax
1120   \else
1121     \ifcase\pdfoutput
1122     \else
1123       \pdftrue
1124     \fi
1125   \fi
1126 \fi
1127
1128 % PDF uses PostScript string constants for the names of xref targets,
1129 % for display in the outlines, and in other places.  Thus, we have to
1130 % double any backslashes.  Otherwise, a name like "\node" will be
1131 % interpreted as a newline (\n), followed by o, d, e.  Not good.
1132
1133 % See http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html and
1134 % related messages.  The final outcome is that it is up to the TeX user
1135 % to double the backslashes and otherwise make the string valid, so
1136 % that's what we do.  pdftex 1.30.0 (ca.2005) introduced a primitive to
1137 % do this reliably, so we use it.
1138
1139 % #1 is a control sequence in which to do the replacements,
1140 % which we \xdef.
1141 \def\txiescapepdf#1{%
1142   \ifx\pdfescapestring\thisisundefined
1143     % No primitive available; should we give a warning or log?
1144     % Many times it won't matter.
1145   \else
1146     % The expandable \pdfescapestring primitive escapes parentheses,
1147     % backslashes, and other special chars.
1148     \xdef#1{\pdfescapestring{#1}}%
1149   \fi
1150 }
1151
1152 \newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images
1153 with PDF output, and none of those formats could be found.  (.eps cannot
1154 be supported due to the design of the PDF format; use regular TeX (DVI
1155 output) for that.)}
1156
1157 \ifpdf
1158   %
1159   % Color manipulation macros based on pdfcolor.tex,
1160   % except using rgb instead of cmyk; the latter is said to render as a
1161   % very dark gray on-screen and a very dark halftone in print, instead
1162   % of actual black.
1163   \def\rgbDarkRed{0.50 0.09 0.12}
1164   \def\rgbBlack{0 0 0}
1165   %
1166   % k sets the color for filling (usual text, etc.);
1167   % K sets the color for stroking (thin rules, e.g., normal _'s).
1168   \def\pdfsetcolor#1{\pdfliteral{#1 rg  #1 RG}}
1169   %
1170   % Set color, and create a mark which defines \thiscolor accordingly,
1171   % so that \makeheadline knows which color to restore.
1172   \def\setcolor#1{%
1173     \xdef\lastcolordefs{\gdef\noexpand\thiscolor{#1}}%
1174     \domark
1175     \pdfsetcolor{#1}%
1176   }
1177   %
1178   \def\maincolor{\rgbBlack}
1179   \pdfsetcolor{\maincolor}
1180   \edef\thiscolor{\maincolor}
1181   \def\lastcolordefs{}
1182   %
1183   \def\makefootline{%
1184     \baselineskip24pt
1185     \line{\pdfsetcolor{\maincolor}\the\footline}%
1186   }
1187   %
1188   \def\makeheadline{%
1189     \vbox to 0pt{%
1190       \vskip-22.5pt
1191       \line{%
1192         \vbox to8.5pt{}%
1193         % Extract \thiscolor definition from the marks.
1194         \getcolormarks
1195         % Typeset the headline with \maincolor, then restore the color.
1196         \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}%
1197       }%
1198       \vss
1199     }%
1200     \nointerlineskip
1201   }
1202   %
1203   %
1204   \pdfcatalog{/PageMode /UseOutlines}
1205   %
1206   % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto).
1207   \def\dopdfimage#1#2#3{%
1208     \def\pdfimagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}%
1209     \def\pdfimageheight{#3}\setbox2 = \hbox{\ignorespaces #3}%
1210     %
1211     % pdftex (and the PDF format) support .pdf, .png, .jpg (among
1212     % others).  Let's try in that order, PDF first since if
1213     % someone has a scalable image, presumably better to use that than a
1214     % bitmap.
1215     \let\pdfimgext=\empty
1216     \begingroup
1217       \openin 1 #1.pdf \ifeof 1
1218         \openin 1 #1.PDF \ifeof 1
1219           \openin 1 #1.png \ifeof 1
1220             \openin 1 #1.jpg \ifeof 1
1221               \openin 1 #1.jpeg \ifeof 1
1222                 \openin 1 #1.JPG \ifeof 1
1223                   \errhelp = \nopdfimagehelp
1224                   \errmessage{Could not find image file #1 for pdf}%
1225                 \else \gdef\pdfimgext{JPG}%
1226                 \fi
1227               \else \gdef\pdfimgext{jpeg}%
1228               \fi
1229             \else \gdef\pdfimgext{jpg}%
1230             \fi
1231           \else \gdef\pdfimgext{png}%
1232           \fi
1233         \else \gdef\pdfimgext{PDF}%
1234         \fi
1235       \else \gdef\pdfimgext{pdf}%
1236       \fi
1237       \closein 1
1238     \endgroup
1239     %
1240     % without \immediate, ancient pdftex seg faults when the same image is
1241     % included twice.  (Version 3.14159-pre-1.0-unofficial-20010704.)
1242     \ifnum\pdftexversion < 14
1243       \immediate\pdfimage
1244     \else
1245       \immediate\pdfximage
1246     \fi
1247       \ifdim \wd0 >0pt width \pdfimagewidth \fi
1248       \ifdim \wd2 >0pt height \pdfimageheight \fi
1249       \ifnum\pdftexversion<13
1250          #1.\pdfimgext
1251        \else
1252          {#1.\pdfimgext}%
1253        \fi
1254     \ifnum\pdftexversion < 14 \else
1255       \pdfrefximage \pdflastximage
1256     \fi}
1257   %
1258   \def\pdfmkdest#1{{%
1259     % We have to set dummies so commands such as @code, and characters
1260     % such as \, aren't expanded when present in a section title.
1261     \indexnofonts
1262     \turnoffactive
1263     \makevalueexpandable
1264     \def\pdfdestname{#1}%
1265     \txiescapepdf\pdfdestname
1266     \safewhatsit{\pdfdest name{\pdfdestname} xyz}%
1267   }}
1268   %
1269   % used to mark target names; must be expandable.
1270   \def\pdfmkpgn#1{#1}
1271   %
1272   % by default, use a color that is dark enough to print on paper as
1273   % nearly black, but still distinguishable for online viewing.
1274   \def\urlcolor{\rgbDarkRed}
1275   \def\linkcolor{\rgbDarkRed}
1276   \def\endlink{\setcolor{\maincolor}\pdfendlink}
1277   %
1278   % Adding outlines to PDF; macros for calculating structure of outlines
1279   % come from Petr Olsak
1280   \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
1281     \else \csname#1\endcsname \fi}
1282   \def\advancenumber#1{\tempnum=\expnumber{#1}\relax
1283     \advance\tempnum by 1
1284     \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
1285   %
1286   % #1 is the section text, which is what will be displayed in the
1287   % outline by the pdf viewer.  #2 is the pdf expression for the number
1288   % of subentries (or empty, for subsubsections).  #3 is the node text,
1289   % which might be empty if this toc entry had no corresponding node.
1290   % #4 is the page number
1291   %
1292   \def\dopdfoutline#1#2#3#4{%
1293     % Generate a link to the node text if that exists; else, use the
1294     % page number.  We could generate a destination for the section
1295     % text in the case where a section has no node, but it doesn't
1296     % seem worth the trouble, since most documents are normally structured.
1297     \edef\pdfoutlinedest{#3}%
1298     \ifx\pdfoutlinedest\empty
1299       \def\pdfoutlinedest{#4}%
1300     \else
1301       \txiescapepdf\pdfoutlinedest
1302     \fi
1303     %
1304     % Also escape PDF chars in the display string.
1305     \edef\pdfoutlinetext{#1}%
1306     \txiescapepdf\pdfoutlinetext
1307     %
1308     \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}%
1309   }
1310   %
1311   \def\pdfmakeoutlines{%
1312     \begingroup
1313       % Read toc silently, to get counts of subentries for \pdfoutline.
1314       \def\partentry##1##2##3##4{}% ignore parts in the outlines
1315       \def\numchapentry##1##2##3##4{%
1316         \def\thischapnum{##2}%
1317         \def\thissecnum{0}%
1318         \def\thissubsecnum{0}%
1319       }%
1320       \def\numsecentry##1##2##3##4{%
1321         \advancenumber{chap\thischapnum}%
1322         \def\thissecnum{##2}%
1323         \def\thissubsecnum{0}%
1324       }%
1325       \def\numsubsecentry##1##2##3##4{%
1326         \advancenumber{sec\thissecnum}%
1327         \def\thissubsecnum{##2}%
1328       }%
1329       \def\numsubsubsecentry##1##2##3##4{%
1330         \advancenumber{subsec\thissubsecnum}%
1331       }%
1332       \def\thischapnum{0}%
1333       \def\thissecnum{0}%
1334       \def\thissubsecnum{0}%
1335       %
1336       % use \def rather than \let here because we redefine \chapentry et
1337       % al. a second time, below.
1338       \def\appentry{\numchapentry}%
1339       \def\appsecentry{\numsecentry}%
1340       \def\appsubsecentry{\numsubsecentry}%
1341       \def\appsubsubsecentry{\numsubsubsecentry}%
1342       \def\unnchapentry{\numchapentry}%
1343       \def\unnsecentry{\numsecentry}%
1344       \def\unnsubsecentry{\numsubsecentry}%
1345       \def\unnsubsubsecentry{\numsubsubsecentry}%
1346       \readdatafile{toc}%
1347       %
1348       % Read toc second time, this time actually producing the outlines.
1349       % The `-' means take the \expnumber as the absolute number of
1350       % subentries, which we calculated on our first read of the .toc above.
1351       %
1352       % We use the node names as the destinations.
1353       \def\numchapentry##1##2##3##4{%
1354         \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}%
1355       \def\numsecentry##1##2##3##4{%
1356         \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}%
1357       \def\numsubsecentry##1##2##3##4{%
1358         \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}%
1359       \def\numsubsubsecentry##1##2##3##4{% count is always zero
1360         \dopdfoutline{##1}{}{##3}{##4}}%
1361       %
1362       % PDF outlines are displayed using system fonts, instead of
1363       % document fonts.  Therefore we cannot use special characters,
1364       % since the encoding is unknown.  For example, the eogonek from
1365       % Latin 2 (0xea) gets translated to a | character.  Info from
1366       % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100.
1367       %
1368       % TODO this right, we have to translate 8-bit characters to
1369       % their "best" equivalent, based on the @documentencoding.  Too
1370       % much work for too little return.  Just use the ASCII equivalents
1371       % we use for the index sort strings.
1372       % 
1373       \indexnofonts
1374       \setupdatafile
1375       % We can have normal brace characters in the PDF outlines, unlike
1376       % Texinfo index files.  So set that up.
1377       \def\{{\lbracecharliteral}%
1378       \def\}{\rbracecharliteral}%
1379       \catcode`\\=\active \otherbackslash
1380       \input \tocreadfilename
1381     \endgroup
1382   }
1383   {\catcode`[=1 \catcode`]=2
1384    \catcode`{=\other \catcode`}=\other
1385    \gdef\lbracecharliteral[{]%
1386    \gdef\rbracecharliteral[}]%
1387   ]
1388   %
1389   \def\skipspaces#1{\def\PP{#1}\def\D{|}%
1390     \ifx\PP\D\let\nextsp\relax
1391     \else\let\nextsp\skipspaces
1392       \addtokens{\filename}{\PP}%
1393       \advance\filenamelength by 1
1394     \fi
1395     \nextsp}
1396   \def\getfilename#1{%
1397     \filenamelength=0
1398     % If we don't expand the argument now, \skipspaces will get
1399     % snagged on things like "@value{foo}".
1400     \edef\temp{#1}%
1401     \expandafter\skipspaces\temp|\relax
1402   }
1403   \ifnum\pdftexversion < 14
1404     \let \startlink \pdfannotlink
1405   \else
1406     \let \startlink \pdfstartlink
1407   \fi
1408   % make a live url in pdf output.
1409   \def\pdfurl#1{%
1410     \begingroup
1411       % it seems we really need yet another set of dummies; have not
1412       % tried to figure out what each command should do in the context
1413       % of @url.  for now, just make @/ a no-op, that's the only one
1414       % people have actually reported a problem with.
1415       %
1416       \normalturnoffactive
1417       \def\@{@}%
1418       \let\/=\empty
1419       \makevalueexpandable
1420       % do we want to go so far as to use \indexnofonts instead of just
1421       % special-casing \var here?
1422       \def\var##1{##1}%
1423       %
1424       \leavevmode\setcolor{\urlcolor}%
1425       \startlink attr{/Border [0 0 0]}%
1426         user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
1427     \endgroup}
1428   \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
1429   \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
1430   \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
1431   \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
1432   \def\maketoks{%
1433     \expandafter\poptoks\the\toksA|ENDTOKS|\relax
1434     \ifx\first0\adn0
1435     \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
1436     \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
1437     \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9
1438     \else
1439       \ifnum0=\countA\else\makelink\fi
1440       \ifx\first.\let\next=\done\else
1441         \let\next=\maketoks
1442         \addtokens{\toksB}{\the\toksD}
1443         \ifx\first,\addtokens{\toksB}{\space}\fi
1444       \fi
1445     \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
1446     \next}
1447   \def\makelink{\addtokens{\toksB}%
1448     {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
1449   \def\pdflink#1{%
1450     \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}
1451     \setcolor{\linkcolor}#1\endlink}
1452   \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
1453 \else
1454   % non-pdf mode
1455   \let\pdfmkdest = \gobble
1456   \let\pdfurl = \gobble
1457   \let\endlink = \relax
1458   \let\setcolor = \gobble
1459   \let\pdfsetcolor = \gobble
1460   \let\pdfmakeoutlines = \relax
1461 \fi  % \ifx\pdfoutput
1462
1463
1464 \message{fonts,}
1465
1466 % Change the current font style to #1, remembering it in \curfontstyle.
1467 % For now, we do not accumulate font styles: @b{@i{foo}} prints foo in
1468 % italics, not bold italics.
1469 %
1470 \def\setfontstyle#1{%
1471   \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd.
1472   \csname ten#1\endcsname  % change the current font
1473 }
1474
1475 % Select #1 fonts with the current style.
1476 %
1477 \def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname}
1478
1479 % Japanese fonts. (--ak)
1480 \ifjaTeX
1481 \csname newfam\endcsname\mcfam
1482 \csname newfam\endcsname\gtfam
1483 \def\mc{\fam\mcfam \setfontstyle{min}}
1484 \def\gt{\fam\gtfam \setfontstyle{gt}}
1485 \def\rm{\mc \fam=0 \setfontstyle{rm}}
1486 \def\it{\fam=\itfam \setfontstyle{it}}
1487 \def\sl{\fam=\slfam \setfontstyle{sl}}
1488 \def\bf{\gt \fam\bffam \setfontstyle{bf}}\def\bfstylename{bf}
1489 \def\tt{\fam=\ttfam \setfontstyle{tt}}
1490 \else
1491 \def\rm{\fam=0 \setfontstyle{rm}}
1492 \def\it{\fam=\itfam \setfontstyle{it}}
1493 \def\sl{\fam=\slfam \setfontstyle{sl}}
1494 \def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf}
1495 \def\tt{\fam=\ttfam \setfontstyle{tt}}
1496 \fi
1497
1498 % Unfortunately, we have to override this for titles and the like, since
1499 % in those cases "rm" is bold.  Sigh.
1500 \ifjaTeX
1501 \def\rmisbold{\rm\gt\def\curfontstyle{bf}}
1502 \else
1503 \def\rmisbold{\rm\def\curfontstyle{bf}}
1504 \fi
1505
1506 % Texinfo sort of supports the sans serif font style, which plain TeX does not.
1507 % So we set up a \sf.
1508 \newfam\sffam
1509 \ifjaTeX
1510 \def\sf{\gt \fam\sffam \setfontstyle{sf}}
1511 \else
1512 \def\sf{\fam=\sffam \setfontstyle{sf}}
1513 \fi
1514 \let\li = \sf % Sometimes we call it \li, not \sf.
1515
1516 % We don't need math for this font style.
1517 \def\ttsl{\setfontstyle{ttsl}}
1518
1519
1520 % Set the baselineskip to #1, and the lineskip and strut size
1521 % correspondingly.  There is no deep meaning behind these magic numbers
1522 % used as factors; they just match (closely enough) what Knuth defined.
1523 %
1524 \def\lineskipfactor{.08333}
1525 \def\strutheightpercent{.70833}
1526 \def\strutdepthpercent {.29167}
1527 %
1528 % can get a sort of poor man's double spacing by redefining this.
1529 \def\baselinefactor{1}
1530 %
1531 \newdimen\textleading
1532 \def\setleading#1{%
1533   \dimen0 = #1\relax
1534   \normalbaselineskip = \baselinefactor\dimen0
1535   \normallineskip = \lineskipfactor\normalbaselineskip
1536   \normalbaselines
1537   \setbox\strutbox =\hbox{%
1538     \vrule width0pt height\strutheightpercent\baselineskip
1539                     depth \strutdepthpercent \baselineskip
1540   }%
1541 }
1542
1543 % PDF CMaps.  See also LaTeX's t1.cmap.
1544 %
1545 % do nothing with this by default.
1546 \expandafter\let\csname cmapOT1\endcsname\gobble
1547 \expandafter\let\csname cmapOT1IT\endcsname\gobble
1548 \expandafter\let\csname cmapOT1TT\endcsname\gobble
1549
1550 % if we are producing pdf, and we have \pdffontattr, then define cmaps.
1551 % (\pdffontattr was introduced many years ago, but people still run
1552 % older pdftex's; it's easy to conditionalize, so we do.)
1553 \ifpdf \ifx\pdffontattr\thisisundefined \else
1554   \begingroup
1555     \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
1556     \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
1557 %%DocumentNeededResources: ProcSet (CIDInit)
1558 %%IncludeResource: ProcSet (CIDInit)
1559 %%BeginResource: CMap (TeX-OT1-0)
1560 %%Title: (TeX-OT1-0 TeX OT1 0)
1561 %%Version: 1.000
1562 %%EndComments
1563 /CIDInit /ProcSet findresource begin
1564 12 dict begin
1565 begincmap
1566 /CIDSystemInfo
1567 << /Registry (TeX)
1568 /Ordering (OT1)
1569 /Supplement 0
1570 >> def
1571 /CMapName /TeX-OT1-0 def
1572 /CMapType 2 def
1573 1 begincodespacerange
1574 <00> <7F>
1575 endcodespacerange
1576 8 beginbfrange
1577 <00> <01> <0393>
1578 <09> <0A> <03A8>
1579 <23> <26> <0023>
1580 <28> <3B> <0028>
1581 <3F> <5B> <003F>
1582 <5D> <5E> <005D>
1583 <61> <7A> <0061>
1584 <7B> <7C> <2013>
1585 endbfrange
1586 40 beginbfchar
1587 <02> <0398>
1588 <03> <039B>
1589 <04> <039E>
1590 <05> <03A0>
1591 <06> <03A3>
1592 <07> <03D2>
1593 <08> <03A6>
1594 <0B> <00660066>
1595 <0C> <00660069>
1596 <0D> <0066006C>
1597 <0E> <006600660069>
1598 <0F> <00660066006C>
1599 <10> <0131>
1600 <11> <0237>
1601 <12> <0060>
1602 <13> <00B4>
1603 <14> <02C7>
1604 <15> <02D8>
1605 <16> <00AF>
1606 <17> <02DA>
1607 <18> <00B8>
1608 <19> <00DF>
1609 <1A> <00E6>
1610 <1B> <0153>
1611 <1C> <00F8>
1612 <1D> <00C6>
1613 <1E> <0152>
1614 <1F> <00D8>
1615 <21> <0021>
1616 <22> <201D>
1617 <27> <2019>
1618 <3C> <00A1>
1619 <3D> <003D>
1620 <3E> <00BF>
1621 <5C> <201C>
1622 <5F> <02D9>
1623 <60> <2018>
1624 <7D> <02DD>
1625 <7E> <007E>
1626 <7F> <00A8>
1627 endbfchar
1628 endcmap
1629 CMapName currentdict /CMap defineresource pop
1630 end
1631 end
1632 %%EndResource
1633 %%EOF
1634     }\endgroup
1635   \expandafter\edef\csname cmapOT1\endcsname#1{%
1636     \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
1637   }%
1638 %
1639 % \cmapOT1IT
1640   \begingroup
1641     \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
1642     \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
1643 %%DocumentNeededResources: ProcSet (CIDInit)
1644 %%IncludeResource: ProcSet (CIDInit)
1645 %%BeginResource: CMap (TeX-OT1IT-0)
1646 %%Title: (TeX-OT1IT-0 TeX OT1IT 0)
1647 %%Version: 1.000
1648 %%EndComments
1649 /CIDInit /ProcSet findresource begin
1650 12 dict begin
1651 begincmap
1652 /CIDSystemInfo
1653 << /Registry (TeX)
1654 /Ordering (OT1IT)
1655 /Supplement 0
1656 >> def
1657 /CMapName /TeX-OT1IT-0 def
1658 /CMapType 2 def
1659 1 begincodespacerange
1660 <00> <7F>
1661 endcodespacerange
1662 8 beginbfrange
1663 <00> <01> <0393>
1664 <09> <0A> <03A8>
1665 <25> <26> <0025>
1666 <28> <3B> <0028>
1667 <3F> <5B> <003F>
1668 <5D> <5E> <005D>
1669 <61> <7A> <0061>
1670 <7B> <7C> <2013>
1671 endbfrange
1672 42 beginbfchar
1673 <02> <0398>
1674 <03> <039B>
1675 <04> <039E>
1676 <05> <03A0>
1677 <06> <03A3>
1678 <07> <03D2>
1679 <08> <03A6>
1680 <0B> <00660066>
1681 <0C> <00660069>
1682 <0D> <0066006C>
1683 <0E> <006600660069>
1684 <0F> <00660066006C>
1685 <10> <0131>
1686 <11> <0237>
1687 <12> <0060>
1688 <13> <00B4>
1689 <14> <02C7>
1690 <15> <02D8>
1691 <16> <00AF>
1692 <17> <02DA>
1693 <18> <00B8>
1694 <19> <00DF>
1695 <1A> <00E6>
1696 <1B> <0153>
1697 <1C> <00F8>
1698 <1D> <00C6>
1699 <1E> <0152>
1700 <1F> <00D8>
1701 <21> <0021>
1702 <22> <201D>
1703 <23> <0023>
1704 <24> <00A3>
1705 <27> <2019>
1706 <3C> <00A1>
1707 <3D> <003D>
1708 <3E> <00BF>
1709 <5C> <201C>
1710 <5F> <02D9>
1711 <60> <2018>
1712 <7D> <02DD>
1713 <7E> <007E>
1714 <7F> <00A8>
1715 endbfchar
1716 endcmap
1717 CMapName currentdict /CMap defineresource pop
1718 end
1719 end
1720 %%EndResource
1721 %%EOF
1722     }\endgroup
1723   \expandafter\edef\csname cmapOT1IT\endcsname#1{%
1724     \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
1725   }%
1726 %
1727 % \cmapOT1TT
1728   \begingroup
1729     \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
1730     \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
1731 %%DocumentNeededResources: ProcSet (CIDInit)
1732 %%IncludeResource: ProcSet (CIDInit)
1733 %%BeginResource: CMap (TeX-OT1TT-0)
1734 %%Title: (TeX-OT1TT-0 TeX OT1TT 0)
1735 %%Version: 1.000
1736 %%EndComments
1737 /CIDInit /ProcSet findresource begin
1738 12 dict begin
1739 begincmap
1740 /CIDSystemInfo
1741 << /Registry (TeX)
1742 /Ordering (OT1TT)
1743 /Supplement 0
1744 >> def
1745 /CMapName /TeX-OT1TT-0 def
1746 /CMapType 2 def
1747 1 begincodespacerange
1748 <00> <7F>
1749 endcodespacerange
1750 5 beginbfrange
1751 <00> <01> <0393>
1752 <09> <0A> <03A8>
1753 <21> <26> <0021>
1754 <28> <5F> <0028>
1755 <61> <7E> <0061>
1756 endbfrange
1757 32 beginbfchar
1758 <02> <0398>
1759 <03> <039B>
1760 <04> <039E>
1761 <05> <03A0>
1762 <06> <03A3>
1763 <07> <03D2>
1764 <08> <03A6>
1765 <0B> <2191>
1766 <0C> <2193>
1767 <0D> <0027>
1768 <0E> <00A1>
1769 <0F> <00BF>
1770 <10> <0131>
1771 <11> <0237>
1772 <12> <0060>
1773 <13> <00B4>
1774 <14> <02C7>
1775 <15> <02D8>
1776 <16> <00AF>
1777 <17> <02DA>
1778 <18> <00B8>
1779 <19> <00DF>
1780 <1A> <00E6>
1781 <1B> <0153>
1782 <1C> <00F8>
1783 <1D> <00C6>
1784 <1E> <0152>
1785 <1F> <00D8>
1786 <20> <2423>
1787 <27> <2019>
1788 <60> <2018>
1789 <7F> <00A8>
1790 endbfchar
1791 endcmap
1792 CMapName currentdict /CMap defineresource pop
1793 end
1794 end
1795 %%EndResource
1796 %%EOF
1797     }\endgroup
1798   \expandafter\edef\csname cmapOT1TT\endcsname#1{%
1799     \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
1800   }%
1801 \fi\fi
1802
1803
1804 % Set the font macro #1 to the font named \fontprefix#2.
1805 % #3 is the font's design size, #4 is a scale factor, #5 is the CMap
1806 % encoding (only OT1, OT1IT and OT1TT are allowed, or empty to omit).
1807 % Example:
1808 % #1 = \textrm
1809 % #2 = \rmshape
1810 % #3 = 10
1811 % #4 = \mainmagstep
1812 % #5 = OT1
1813 %
1814 \def\setfont#1#2#3#4#5{%
1815   \font#1=\fontprefix#2#3 scaled #4
1816   \csname cmap#5\endcsname#1%
1817 }
1818 % This is what gets called when #5 of \setfont is empty.
1819 \let\cmap\gobble
1820 %
1821 % (end of cmaps)
1822
1823 % Use cm as the default font prefix.
1824 % To specify the font prefix, you must define \fontprefix
1825 % before you read in texinfo.tex.
1826 \ifx\fontprefix\thisisundefined
1827 \def\fontprefix{cm}
1828 \fi
1829 % Support font families that don't use the same naming scheme as CM.
1830 \def\rmshape{r}
1831 \def\rmbshape{bx}               % where the normal face is bold
1832 \def\bfshape{b}
1833 \def\bxshape{bx}
1834 \def\ttshape{tt}
1835 \def\ttbshape{tt}
1836 \def\ttslshape{sltt}
1837 \def\itshape{ti}
1838 \def\itbshape{bxti}
1839 \def\slshape{sl}
1840 \def\slbshape{bxsl}
1841 \def\sfshape{ss}
1842 \def\sfbshape{ss}
1843 \def\scshape{csc}
1844 \def\scbshape{csc}
1845
1846 % Definitions for a main text size of 11pt.  (The default in Texinfo.)
1847 %
1848 \def\definetextfontsizexi{%
1849 % Text fonts (11.2pt, magstep1).
1850 \def\textnominalsize{11pt}
1851 \edef\mainmagstep{\magstephalf}
1852 \setfont\textrm\rmshape{10}{\mainmagstep}{OT1}
1853 \setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT}
1854 \ifpTeX
1855 \font\textmc=min10 scaled \mainmagstep
1856 \font\textgt=goth10 scaled \mainmagstep
1857 \fi
1858 \ifjTeX
1859 \jfont\textmc=dm10 scaled \mainmagstep
1860 \jfont\textgt=dg10 scaled \mainmagstep
1861 \fi
1862 \setfont\textbf\bfshape{10}{\mainmagstep}{OT1}
1863 \setfont\textit\itshape{10}{\mainmagstep}{OT1IT}
1864 \setfont\textsl\slshape{10}{\mainmagstep}{OT1}
1865 \setfont\textsf\sfshape{10}{\mainmagstep}{OT1}
1866 \setfont\textsc\scshape{10}{\mainmagstep}{OT1}
1867 \setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT}
1868 \font\texti=cmmi10 scaled \mainmagstep
1869 \font\textsy=cmsy10 scaled \mainmagstep
1870 \def\textecsize{1095}
1871
1872 % A few fonts for @defun names and args.
1873 \ifpTeX
1874 \setfont\defbf\bfshape{10}{\magstep1}{OT1}
1875 \setfont\deftt\ttshape{10}{\magstep1}{OT1TT}
1876 \setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT}
1877 \font\defmc=min10 scaled \magstep1
1878 \font\defgt=goth10 scaled \magstep1
1879 \def\df{\let\tentt=\deftt \let\tenmin=\defmc
1880 \let\tengt=\defgt \let\tenbf=\defbf \let\tenttsl=\defttsl \bf}
1881 \else\ifjTeX
1882 \setfont\defbf\bfshape{10}{\magstep1}{OT1}
1883 \setfont\deftt\ttshape{10}{\magstep1}{OT1TT}
1884 \setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT}
1885 \jfont\defmc=dm10 scaled \magstep1
1886 \jfont\defgt=dg10 scaled \magstep1
1887 \def\df{\let\tentt=\deftt \let\tenmin=\defmc
1888 \let\tengt=\defgt\let\tenbf=\defbf \let\tenttsl=\defttsl \bf}
1889 \else
1890 \setfont\defbf\bfshape{10}{\magstep1}{OT1}
1891 \setfont\deftt\ttshape{10}{\magstep1}{OT1TT}
1892 \setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT}
1893 \def\df{\let\tentt=\deftt \let\tenbf=\defbf \let\tenttsl=\defttsl \bf}
1894 \fi\fi
1895
1896 % Fonts for indices, footnotes, small examples (9pt).
1897 \def\smallnominalsize{9pt}
1898 \setfont\smallrm\rmshape{9}{1000}{OT1}
1899 \setfont\smalltt\ttshape{9}{1000}{OT1TT}
1900 \setfont\smallbf\bfshape{10}{900}{OT1}
1901 \setfont\smallit\itshape{9}{1000}{OT1IT}
1902 \setfont\smallsl\slshape{9}{1000}{OT1}
1903 \setfont\smallsf\sfshape{9}{1000}{OT1}
1904 \setfont\smallsc\scshape{10}{900}{OT1}
1905 \setfont\smallttsl\ttslshape{10}{900}{OT1TT}
1906 \font\smalli=cmmi9
1907 \font\smallsy=cmsy9
1908 \ifpTeX
1909 \font\smallmc=min9
1910 \font\smallgt=goth9
1911 \fi
1912 \ifjTeX
1913 \jfont\smallmc=dm9
1914 \jfont\smallgt=dg9
1915 \fi
1916 \def\smallecsize{0900}
1917
1918 % Fonts for small examples (8pt).
1919 \def\smallernominalsize{8pt}
1920 \setfont\smallerrm\rmshape{8}{1000}{OT1}
1921 \setfont\smallertt\ttshape{8}{1000}{OT1TT}
1922 \setfont\smallerbf\bfshape{10}{800}{OT1}
1923 \setfont\smallerit\itshape{8}{1000}{OT1IT}
1924 \setfont\smallersl\slshape{8}{1000}{OT1}
1925 \setfont\smallersf\sfshape{8}{1000}{OT1}
1926 \setfont\smallersc\scshape{10}{800}{OT1}
1927 \setfont\smallerttsl\ttslshape{10}{800}{OT1TT}
1928 \font\smalleri=cmmi8
1929 \font\smallersy=cmsy8
1930 \ifpTeX
1931 \font\smallermc=min8
1932 \font\smallergt=goth8
1933 \fi
1934 \ifjTeX
1935 \jfont\smallermc=dm8
1936 \jfont\smallergt=dg8
1937 \fi
1938 \def\smallerecsize{0800}
1939
1940 % Fonts for title page (20.4pt):
1941 \def\titlenominalsize{20pt}
1942 \setfont\titlerm\rmbshape{12}{\magstep3}{OT1}
1943 \setfont\titleit\itbshape{10}{\magstep4}{OT1IT}
1944 \setfont\titlesl\slbshape{10}{\magstep4}{OT1}
1945 \setfont\titlett\ttbshape{12}{\magstep3}{OT1TT}
1946 \setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT}
1947 \setfont\titlesf\sfbshape{17}{\magstep1}{OT1}
1948 \ifpTeX
1949 \font\titlemc=min10 scaled \magstep4
1950 \font\titlegt=goth10 scaled \magstep4
1951 \fi
1952 \ifjTeX
1953 \jfont\titlemc=dm10 scaled \magstep4
1954 \jfont\titlegt=dg10 scaled \magstep4
1955 \fi
1956 \let\titlebf=\titlerm
1957 \setfont\titlesc\scbshape{10}{\magstep4}{OT1}
1958 \font\titlei=cmmi12 scaled \magstep3
1959 \font\titlesy=cmsy10 scaled \magstep4
1960 \def\titleecsize{2074}
1961
1962 % Chapter (and unnumbered) fonts (17.28pt).
1963 \def\chapnominalsize{17pt}
1964 \setfont\chaprm\rmbshape{12}{\magstep2}{OT1}
1965 \setfont\chapit\itbshape{10}{\magstep3}{OT1IT}
1966 \setfont\chapsl\slbshape{10}{\magstep3}{OT1}
1967 \setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT}
1968 \setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT}
1969 \setfont\chapsf\sfbshape{17}{1000}{OT1}
1970 \ifpTeX
1971 \font\chapmc=min10 scaled \magstep3
1972 \font\chapgt=goth10 scaled \magstep3
1973 \fi
1974 \ifjTeX
1975 \jfont\chapmc=dm10 scaled \magstep3
1976 \jfont\chapgt=dg10 scaled \magstep3
1977 \fi
1978 \let\chapbf=\chaprm
1979 \setfont\chapsc\scbshape{10}{\magstep3}{OT1}
1980 \font\chapi=cmmi12 scaled \magstep2
1981 \font\chapsy=cmsy10 scaled \magstep3
1982 \def\chapecsize{1728}
1983
1984 % Section fonts (14.4pt).
1985 \def\secnominalsize{14pt}
1986 \setfont\secrm\rmbshape{12}{\magstep1}{OT1}
1987 \setfont\secit\itbshape{10}{\magstep2}{OT1IT}
1988 \setfont\secsl\slbshape{10}{\magstep2}{OT1}
1989 \setfont\sectt\ttbshape{12}{\magstep1}{OT1TT}
1990 \setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT}
1991 \setfont\secsf\sfbshape{12}{\magstep1}{OT1}
1992 \ifpTeX
1993 \font\secmc=min10 scaled \magstep2
1994 \font\secgt=goth10 scaled \magstep2
1995 \fi
1996 \ifjTeX
1997 \jfont\secmc=dm10 scaled \magstep2
1998 \jfont\secgt=dg10 scaled \magstep2
1999 \fi
2000 \let\secbf\secrm
2001 \setfont\secsc\scbshape{10}{\magstep2}{OT1}
2002 \font\seci=cmmi12 scaled \magstep1
2003 \font\secsy=cmsy10 scaled \magstep2
2004 \def\sececsize{1440}
2005
2006 % Subsection fonts (13.15pt).
2007 \def\ssecnominalsize{13pt}
2008 \setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1}
2009 \setfont\ssecit\itbshape{10}{1315}{OT1IT}
2010 \setfont\ssecsl\slbshape{10}{1315}{OT1}
2011 \setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT}
2012 \setfont\ssecttsl\ttslshape{10}{1315}{OT1TT}
2013 \setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1}
2014 \ifpTeX
2015 \font\ssecmc=min10 scaled 1315
2016 \font\ssecgt=goth10 scaled 1315
2017 \fi
2018 \ifjTeX
2019 \jfont\ssecmc=dm10 scaled 1315
2020 \jfont\ssecgt=dg10 scaled 1315
2021 \fi
2022 \let\ssecbf\ssecrm
2023 \setfont\ssecsc\scbshape{10}{1315}{OT1}
2024 \font\sseci=cmmi12 scaled \magstephalf
2025 \font\ssecsy=cmsy10 scaled 1315
2026 \def\ssececsize{1200}
2027
2028 % Reduced fonts for @acro in text (10pt).
2029 \def\reducednominalsize{10pt}
2030 \setfont\reducedrm\rmshape{10}{1000}{OT1}
2031 \setfont\reducedtt\ttshape{10}{1000}{OT1TT}
2032 \setfont\reducedbf\bfshape{10}{1000}{OT1}
2033 \setfont\reducedit\itshape{10}{1000}{OT1IT}
2034 \setfont\reducedsl\slshape{10}{1000}{OT1}
2035 \setfont\reducedsf\sfshape{10}{1000}{OT1}
2036 \setfont\reducedsc\scshape{10}{1000}{OT1}
2037 \setfont\reducedttsl\ttslshape{10}{1000}{OT1TT}
2038 \font\reducedi=cmmi10
2039 \font\reducedsy=cmsy10
2040 \ifpTeX
2041 \font\reducedmc=min10
2042 \font\reducedgt=goth10
2043 \fi
2044 \ifjTeX
2045 \jfont\reducedmc=dm10
2046 \jfont\reducedgt=dg10
2047 \fi
2048 \def\reducedecsize{1000}
2049
2050 \textleading = 13.2pt % line spacing for 11pt CM
2051 \textfonts            % reset the current fonts
2052 \rm
2053 } % end of 11pt text font size definitions, \definetextfontsizexi
2054
2055
2056 % Definitions to make the main text be 10pt Computer Modern, with
2057 % section, chapter, etc., sizes following suit.  This is for the GNU
2058 % Press printing of the Emacs 22 manual.  Maybe other manuals in the
2059 % future.  Used with @smallbook, which sets the leading to 12pt.
2060 %
2061 \def\definetextfontsizex{%
2062 % Text fonts (10pt).
2063 \def\textnominalsize{10pt}
2064 \edef\mainmagstep{1000}
2065 \setfont\textrm\rmshape{10}{\mainmagstep}{OT1}
2066 \setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT}
2067 \ifpTeX
2068 \font\textmc=min10 scaled \mainmagstep
2069 \font\textgt=goth10 scaled \mainmagstep
2070 \fi
2071 \ifjTeX
2072 \jfont\textmc=dm10 scaled \mainmagstep
2073 \jfont\textgt=dg10 scaled \mainmagstep
2074 \fi
2075 \setfont\textbf\bfshape{10}{\mainmagstep}{OT1}
2076 \setfont\textit\itshape{10}{\mainmagstep}{OT1IT}
2077 \setfont\textsl\slshape{10}{\mainmagstep}{OT1}
2078 \setfont\textsf\sfshape{10}{\mainmagstep}{OT1}
2079 \setfont\textsc\scshape{10}{\mainmagstep}{OT1}
2080 \setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT}
2081 \font\texti=cmmi10 scaled \mainmagstep
2082 \font\textsy=cmsy10 scaled \mainmagstep
2083 \def\textecsize{1000}
2084
2085 % A few fonts for @defun names and args.
2086 \ifpTeX
2087 \setfont\defbf\bfshape{10}{\magstephalf}{OT1}
2088 \setfont\deftt\ttshape{10}{\magstephalf}{OT1TT}
2089 \setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT}
2090 \font\defmc=min10 scaled \magstephalf
2091 \font\defgt=goth10 scaled \magstephalf
2092 \def\df{\let\tentt=\deftt \let\tenmin=\defmc
2093 \let\tengt=\defgt \let\tenbf=\defbf \let\tenttsl=\defttsl \bf}
2094 \else\ifjTeX
2095 \setfont\defbf\bfshape{10}{\magstephalf}{OT1}
2096 \setfont\deftt\ttshape{10}{\magstephalf}{OT1TT}
2097 \setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT}
2098 \jfont\defmc=dm10 scaled \magstephalf
2099 \jfont\defgt=dg10 scaled \magstephalf
2100 \def\df{\let\tentt=\deftt \let\tenmin=\defmc
2101 \let\tengt=\defgt \let\tenbf=\defbf \let\tenttsl=\defttsl \bf}
2102 \else
2103 \setfont\defbf\bfshape{10}{\magstephalf}{OT1}
2104 \setfont\deftt\ttshape{10}{\magstephalf}{OT1TT}
2105 \setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT}
2106 \def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf}
2107 \fi\fi
2108
2109 % Fonts for indices, footnotes, small examples (9pt).
2110 \def\smallnominalsize{9pt}
2111 \setfont\smallrm\rmshape{9}{1000}{OT1}
2112 \setfont\smalltt\ttshape{9}{1000}{OT1TT}
2113 \setfont\smallbf\bfshape{10}{900}{OT1}
2114 \setfont\smallit\itshape{9}{1000}{OT1IT}
2115 \setfont\smallsl\slshape{9}{1000}{OT1}
2116 \setfont\smallsf\sfshape{9}{1000}{OT1}
2117 \setfont\smallsc\scshape{10}{900}{OT1}
2118 \setfont\smallttsl\ttslshape{10}{900}{OT1TT}
2119 \font\smalli=cmmi9
2120 \font\smallsy=cmsy9
2121 \ifpTeX
2122 \font\smallmc=min9
2123 \font\smallgt=goth9
2124 \fi
2125 \ifjTeX
2126 \jfont\smallmc=dm9
2127 \jfont\smallgt=dg9
2128 \fi
2129 \def\smallecsize{0900}
2130
2131 % Fonts for small examples (8pt).
2132 \def\smallernominalsize{8pt}
2133 \setfont\smallerrm\rmshape{8}{1000}{OT1}
2134 \setfont\smallertt\ttshape{8}{1000}{OT1TT}
2135 \setfont\smallerbf\bfshape{10}{800}{OT1}
2136 \setfont\smallerit\itshape{8}{1000}{OT1IT}
2137 \setfont\smallersl\slshape{8}{1000}{OT1}
2138 \setfont\smallersf\sfshape{8}{1000}{OT1}
2139 \setfont\smallersc\scshape{10}{800}{OT1}
2140 \setfont\smallerttsl\ttslshape{10}{800}{OT1TT}
2141 \font\smalleri=cmmi8
2142 \font\smallersy=cmsy8
2143 \ifpTeX
2144 \font\smallermc=min8
2145 \font\smallergt=goth8
2146 \fi
2147 \ifjTeX
2148 \jfont\smallermc=dm8
2149 \jfont\smallergt=dg8
2150 \fi
2151 \def\smallerecsize{0800}
2152
2153 % Fonts for title page (20.4pt):
2154 \def\titlenominalsize{20pt}
2155 \setfont\titlerm\rmbshape{12}{\magstep3}{OT1}
2156 \setfont\titleit\itbshape{10}{\magstep4}{OT1IT}
2157 \setfont\titlesl\slbshape{10}{\magstep4}{OT1}
2158 \setfont\titlett\ttbshape{12}{\magstep3}{OT1TT}
2159 \setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT}
2160 \setfont\titlesf\sfbshape{17}{\magstep1}{OT1}
2161 \ifpTeX
2162 \font\titlemc=min10 scaled \magstep4
2163 \font\titlegt=goth10 scaled \magstep4
2164 \fi
2165 \ifjTeX
2166 \jfont\titlemc=dm10 scaled \magstep4
2167 \jfont\titlegt=dg10 scaled \magstep4
2168 \fi
2169 \let\titlebf=\titlerm
2170 \setfont\titlesc\scbshape{10}{\magstep4}{OT1}
2171 \font\titlei=cmmi12 scaled \magstep3
2172 \font\titlesy=cmsy10 scaled \magstep4
2173 \def\titleecsize{2074}
2174
2175 % Chapter fonts (14.4pt).
2176 \def\chapnominalsize{14pt}
2177 \setfont\chaprm\rmbshape{12}{\magstep1}{OT1}
2178 \setfont\chapit\itbshape{10}{\magstep2}{OT1IT}
2179 \setfont\chapsl\slbshape{10}{\magstep2}{OT1}
2180 \setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT}
2181 \setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT}
2182 \setfont\chapsf\sfbshape{12}{\magstep1}{OT1}
2183 \ifpTeX
2184 \font\chapmc=min10 scaled \magstep2
2185 \font\chapgt=goth10 scaled \magstep2
2186 \fi
2187 \ifjTeX
2188 \jfont\chapmc=dm10 scaled \magstep2
2189 \jfont\chapgt=dg10 scaled \magstep2
2190 \fi
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 \ifpTeX
2206 \font\secmc=min10 scaled \magstep1
2207 \font\secgt=goth10 scaled \magstep1
2208 \fi
2209 \ifjTeX
2210 \jfont\secmc=dm10 scaled \magstep1
2211 \jfont\secgt=dg10 scaled \magstep1
2212 \fi
2213 \let\secbf\secrm
2214 \setfont\secsc\scbshape{10}{\magstep1}{OT1}
2215 \font\seci=cmmi12
2216 \font\secsy=cmsy10 scaled \magstep1
2217 \def\sececsize{1200}
2218
2219 % Subsection fonts (10pt).
2220 \def\ssecnominalsize{10pt}
2221 \setfont\ssecrm\rmbshape{10}{1000}{OT1}
2222 \setfont\ssecit\itbshape{10}{1000}{OT1IT}
2223 \setfont\ssecsl\slbshape{10}{1000}{OT1}
2224 \setfont\ssectt\ttbshape{10}{1000}{OT1TT}
2225 \setfont\ssecttsl\ttslshape{10}{1000}{OT1TT}
2226 \setfont\ssecsf\sfbshape{10}{1000}{OT1}
2227 \ifpTeX
2228 \font\ssecmc=min10
2229 \font\ssecgt=goth10
2230 \fi
2231 \ifjTeX
2232 \jfont\ssecmc=dm10
2233 \jfont\ssecgt=dg10
2234 \fi
2235 \let\ssecbf\ssecrm
2236 \setfont\ssecsc\scbshape{10}{1000}{OT1}
2237 \font\sseci=cmmi10
2238 \font\ssecsy=cmsy10
2239 \def\ssececsize{1000}
2240
2241 % Reduced fonts for @acro in text (9pt).
2242 \def\reducednominalsize{9pt}
2243 \setfont\reducedrm\rmshape{9}{1000}{OT1}
2244 \setfont\reducedtt\ttshape{9}{1000}{OT1TT}
2245 \setfont\reducedbf\bfshape{10}{900}{OT1}
2246 \setfont\reducedit\itshape{9}{1000}{OT1IT}
2247 \setfont\reducedsl\slshape{9}{1000}{OT1}
2248 \setfont\reducedsf\sfshape{9}{1000}{OT1}
2249 \setfont\reducedsc\scshape{10}{900}{OT1}
2250 \setfont\reducedttsl\ttslshape{10}{900}{OT1TT}
2251 \font\reducedi=cmmi9
2252 \font\reducedsy=cmsy9
2253 \ifpTeX
2254 \font\reducedmc=min9
2255 \font\reducedgt=goth9
2256 \fi
2257 \ifjTeX
2258 \jfont\reducedmc=dm9
2259 \jfont\reducedgt=dg9
2260 \fi
2261 \def\reducedecsize{0900}
2262
2263 \divide\parskip by 2  % reduce space between paragraphs
2264 \textleading = 12pt   % line spacing for 10pt CM
2265 \textfonts            % reset the current fonts
2266 \rm
2267 } % end of 10pt text font size definitions, \definetextfontsizex
2268
2269
2270 % We provide the user-level command
2271 %   @fonttextsize 10
2272 % (or 11) to redefine the text font size.  pt is assumed.
2273 %
2274 \def\xiword{11}
2275 \def\xword{10}
2276 \def\xwordpt{10pt}
2277 %
2278 \parseargdef\fonttextsize{%
2279   \def\textsizearg{#1}%
2280   %\wlog{doing @fonttextsize \textsizearg}%
2281   %
2282   % Set \globaldefs so that documents can use this inside @tex, since
2283   % makeinfo 4.8 does not support it, but we need it nonetheless.
2284   %
2285  \begingroup \globaldefs=1
2286   \ifx\textsizearg\xword \definetextfontsizex
2287   \else \ifx\textsizearg\xiword \definetextfontsizexi
2288   \else
2289     \errhelp=\EMsimple
2290     \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'}
2291   \fi\fi
2292  \endgroup
2293 }
2294
2295
2296 % In order for the font changes to affect most math symbols and letters,
2297 % we have to define the \textfont of the standard families.  Since
2298 % texinfo doesn't allow for producing subscripts and superscripts except
2299 % in the main text, we don't bother to reset \scriptfont and
2300 % \scriptscriptfont (which would also require loading a lot more fonts).
2301 %
2302 \ifpTeX
2303 \def\resetmathfonts{%
2304   \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy
2305   \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf
2306   \textfont\ttfam=\tentt \textfont\sffam=\tensf
2307   \textfont\mcfam = \tenmin \textfont\gtfam = \tengt
2308 }
2309 \else
2310 \def\resetmathfonts{%
2311   \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy
2312   \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf
2313   \textfont\ttfam=\tentt \textfont\sffam=\tensf
2314 }
2315 \fi
2316
2317 % The font-changing commands redefine the meanings of \tenSTYLE, instead
2318 % of just \STYLE.  We do this because \STYLE needs to also set the
2319 % current \fam for math mode.  Our \STYLE (e.g., \rm) commands hardwire
2320 % \tenSTYLE to set the current font.
2321 %
2322 % Each font-changing command also sets the names \lsize (one size lower)
2323 % and \lllsize (three sizes lower).  These relative commands are used in
2324 % the LaTeX logo and acronyms.
2325 %
2326 % This all needs generalizing, badly.
2327 %
2328 \ifjaTeX
2329 \def\textfonts{%
2330   \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
2331   \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
2332   \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy
2333   \let\tenttsl=\textttsl
2334   \let\tenmin=\textmc \let\tengt=\textgt
2335   \def\curfontsize{text}%
2336   \def\lsize{reduced}\def\lllsize{smaller}%
2337   \resetmathfonts \setleading{\textleading}}
2338 \else
2339 \def\textfonts{%
2340   \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
2341   \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
2342   \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy
2343   \let\tenttsl=\textttsl
2344   \def\curfontsize{text}%
2345   \def\lsize{reduced}\def\lllsize{smaller}%
2346   \resetmathfonts \setleading{\textleading}}
2347 \fi
2348 \ifjaTeX
2349 \def\titlefonts{%
2350   \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl
2351   \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc
2352   \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy
2353   \let\tenttsl=\titlettsl
2354   \let\tenmin=\titlemc \let\tengt=\titlegt
2355   \def\curfontsize{title}%
2356   \def\lsize{chap}\def\lllsize{subsec}%
2357   \resetmathfonts \setleading{27pt}}
2358 \def\titlefont#1{{\titlefonts\rmisbold #1}}
2359 \else
2360 \def\titlefonts{%
2361   \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl
2362   \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc
2363   \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy
2364   \let\tenttsl=\titlettsl
2365   \def\curfontsize{title}%
2366   \def\lsize{chap}\def\lllsize{subsec}%
2367   \resetmathfonts \setleading{25pt}}
2368 \def\titlefont#1{{\titlefonts\rmisbold #1}}
2369 \fi
2370 \ifjaTeX
2371 \def\chapfonts{%
2372   \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
2373   \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
2374   \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy
2375   \let\tenttsl=\chapttsl
2376   \let\tenmin=\chapmc \let\tengt=\chapgt
2377   \def\curfontsize{chap}%
2378   \def\lsize{sec}\def\lllsize{text}%
2379   \resetmathfonts \setleading{19pt}}
2380 \else
2381 \def\chapfonts{%
2382   \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
2383   \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
2384   \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy
2385   \let\tenttsl=\chapttsl
2386   \def\curfontsize{chap}%
2387   \def\lsize{sec}\def\lllsize{text}%
2388   \resetmathfonts \setleading{19pt}}
2389 \fi
2390 \ifjaTeX
2391 \def\secfonts{%
2392   \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
2393   \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
2394   \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy
2395   \let\tenttsl=\secttsl
2396   \let\tenmin=\secmc \let\tengt=\secgt
2397   \def\curfontsize{sec}%
2398   \def\lsize{subsec}\def\lllsize{reduced}%
2399   \resetmathfonts \setleading{16pt}}
2400 \else
2401 \def\secfonts{%
2402   \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
2403   \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
2404   \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy
2405   \let\tenttsl=\secttsl
2406   \def\curfontsize{sec}%
2407   \def\lsize{subsec}\def\lllsize{reduced}%
2408   \resetmathfonts \setleading{16pt}}
2409 \fi
2410 \ifjaTeX
2411 \def\subsecfonts{%
2412   \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
2413   \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
2414   \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy
2415   \let\tenttsl=\ssecttsl
2416   \let\tenmin=\ssecmc \let\tengt=\ssecgt
2417   \def\curfontsize{ssec}%
2418   \def\lsize{text}\def\lllsize{small}%
2419   \resetmathfonts \setleading{15pt}}
2420 \else
2421 \def\subsecfonts{%
2422   \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
2423   \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
2424   \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy
2425   \let\tenttsl=\ssecttsl
2426   \def\curfontsize{ssec}%
2427   \def\lsize{text}\def\lllsize{small}%
2428   \resetmathfonts \setleading{15pt}}
2429 \fi
2430 \ifjaTeX
2431 \let\subsubsecfonts = \subsecfonts
2432 \def\reducedfonts{%
2433   \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl
2434   \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc
2435   \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy
2436   \let\tenttsl=\reducedttsl
2437   \let\tenmc=\reducedmc
2438   \let\tengt=\reducedgt
2439   \def\curfontsize{reduced}%
2440   \def\lsize{small}\def\lllsize{smaller}%
2441   \resetmathfonts \setleading{10.5pt}}
2442 \else
2443 \let\subsubsecfonts = \subsecfonts
2444 \def\reducedfonts{%
2445   \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl
2446   \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc
2447   \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy
2448   \let\tenttsl=\reducedttsl
2449   \def\curfontsize{reduced}%
2450   \def\lsize{small}\def\lllsize{smaller}%
2451   \resetmathfonts \setleading{10.5pt}}
2452 \fi
2453 \ifjaTeX
2454 \def\smallfonts{%
2455   \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl
2456   \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc
2457   \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy
2458   \let\tenttsl=\smallttsl
2459   \let\tenmin=\smallmc \let\tengt=\smallgt
2460   \def\curfontsize{small}%
2461   \def\lsize{smaller}\def\lllsize{smaller}%
2462   \resetmathfonts \setleading{10.5pt}}
2463 \else
2464 \def\smallfonts{%
2465   \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl
2466   \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc
2467   \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy
2468   \let\tenttsl=\smallttsl
2469   \def\curfontsize{small}%
2470   \def\lsize{smaller}\def\lllsize{smaller}%
2471   \resetmathfonts \setleading{10.5pt}}
2472 \fi
2473 \ifjaTeX
2474 \def\smallerfonts{%
2475   \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl
2476   \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc
2477   \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy
2478   \let\tenttsl=\smallerttsl
2479   \let\tenmin=\smallermc \let\tengt=\smallergt
2480   \def\curfontsize{smaller}%
2481   \def\lsize{smaller}\def\lllsize{smaller}%
2482   \resetmathfonts \setleading{9.5pt}}
2483 \else
2484 \def\smallerfonts{%
2485   \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl
2486   \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc
2487   \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy
2488   \let\tenttsl=\smallerttsl
2489   \def\curfontsize{smaller}%
2490   \def\lsize{smaller}\def\lllsize{smaller}%
2491   \resetmathfonts \setleading{9.5pt}}
2492 \fi
2493
2494 % Fonts for short table of contents.
2495 \setfont\shortcontrm\rmshape{12}{1000}{OT1}
2496 \setfont\shortcontbf\bfshape{10}{\magstep1}{OT1}  % no cmb12
2497 \setfont\shortcontsl\slshape{12}{1000}{OT1}
2498 \setfont\shortconttt\ttshape{12}{1000}{OT1TT}
2499 \ifpTeX
2500 \font\shortcontmc=min10 scaled \magstep1
2501 \font\shortcontgt=goth10 scaled \magstep1
2502 \fi
2503 \ifjTeX
2504 \jfont\shortcontmc=dm10 scaled \magstep1
2505 \jfont\shortcontgt=dg10 scaled \magstep1
2506 \fi
2507
2508 % Define these just so they can be easily changed for other fonts.
2509 \def\angleleft{$\langle$}
2510 \def\angleright{$\rangle$}
2511
2512 % Set the fonts to use with the @small... environments.
2513 \let\smallexamplefonts = \smallfonts
2514
2515 % About \smallexamplefonts.  If we use \smallfonts (9pt), @smallexample
2516 % can fit this many characters:
2517 %   8.5x11=86   smallbook=72  a4=90  a5=69
2518 % If we use \scriptfonts (8pt), then we can fit this many characters:
2519 %   8.5x11=90+  smallbook=80  a4=90+  a5=77
2520 % For me, subjectively, the few extra characters that fit aren't worth
2521 % the additional smallness of 8pt.  So I'm making the default 9pt.
2522 %
2523 % By the way, for comparison, here's what fits with @example (10pt):
2524 %   8.5x11=71  smallbook=60  a4=75  a5=58
2525 % --karl, 24jan03.
2526
2527 % Set up the default fonts, so we can use them for creating boxes.
2528 %
2529 \definetextfontsizexi
2530
2531
2532 \message{markup,}
2533
2534 % Check if we are currently using a typewriter font.  Since all the
2535 % Computer Modern typewriter fonts have zero interword stretch (and
2536 % shrink), and it is reasonable to expect all typewriter fonts to have
2537 % this property, we can check that font parameter.
2538 %
2539 \def\ifmonospace{\ifdim\fontdimen3\font=0pt }
2540
2541 % Markup style infrastructure.  \defmarkupstylesetup\INITMACRO will
2542 % define and register \INITMACRO to be called on markup style changes.
2543 % \INITMACRO can check \currentmarkupstyle for the innermost
2544 % style and the set of \ifmarkupSTYLE switches for all styles
2545 % currently in effect.
2546 \newif\ifmarkupvar
2547 \newif\ifmarkupsamp
2548 \newif\ifmarkupkey
2549 %\newif\ifmarkupfile % @file == @samp.
2550 %\newif\ifmarkupoption % @option == @samp.
2551 \newif\ifmarkupcode
2552 \newif\ifmarkupkbd
2553 %\newif\ifmarkupenv % @env == @code.
2554 %\newif\ifmarkupcommand % @command == @code.
2555 \newif\ifmarkuptex % @tex (and part of @math, for now).
2556 \newif\ifmarkupexample
2557 \newif\ifmarkupverb
2558 \newif\ifmarkupverbatim
2559
2560 \let\currentmarkupstyle\empty
2561
2562 \def\setupmarkupstyle#1{%
2563   \csname markup#1true\endcsname
2564   \def\currentmarkupstyle{#1}%
2565   \markupstylesetup
2566 }
2567
2568 \let\markupstylesetup\empty
2569
2570 \def\defmarkupstylesetup#1{%
2571   \expandafter\def\expandafter\markupstylesetup
2572     \expandafter{\markupstylesetup #1}%
2573   \def#1%
2574 }
2575
2576 % Markup style setup for left and right quotes.
2577 \defmarkupstylesetup\markupsetuplq{%
2578   \expandafter\let\expandafter \temp
2579     \csname markupsetuplq\currentmarkupstyle\endcsname
2580   \ifx\temp\relax \markupsetuplqdefault \else \temp \fi
2581 }
2582
2583 \defmarkupstylesetup\markupsetuprq{%
2584   \expandafter\let\expandafter \temp
2585     \csname markupsetuprq\currentmarkupstyle\endcsname
2586   \ifx\temp\relax \markupsetuprqdefault \else \temp \fi
2587 }
2588
2589 {
2590 \catcode`\'=\active
2591 \catcode`\`=\active
2592
2593 \gdef\markupsetuplqdefault{\let`\lq}
2594 \gdef\markupsetuprqdefault{\let'\rq}
2595
2596 \gdef\markupsetcodequoteleft{\let`\codequoteleft}
2597 \gdef\markupsetcodequoteright{\let'\codequoteright}
2598 }
2599
2600 \let\markupsetuplqcode \markupsetcodequoteleft
2601 \let\markupsetuprqcode \markupsetcodequoteright
2602 %
2603 \let\markupsetuplqexample \markupsetcodequoteleft
2604 \let\markupsetuprqexample \markupsetcodequoteright
2605 %
2606 \let\markupsetuplqkbd     \markupsetcodequoteleft
2607 \let\markupsetuprqkbd     \markupsetcodequoteright
2608 %
2609 \let\markupsetuplqsamp \markupsetcodequoteleft
2610 \let\markupsetuprqsamp \markupsetcodequoteright
2611 %
2612 \let\markupsetuplqverb \markupsetcodequoteleft
2613 \let\markupsetuprqverb \markupsetcodequoteright
2614 %
2615 \let\markupsetuplqverbatim \markupsetcodequoteleft
2616 \let\markupsetuprqverbatim \markupsetcodequoteright
2617
2618 % Allow an option to not use regular directed right quote/apostrophe
2619 % (char 0x27), but instead the undirected quote from cmtt (char 0x0d).
2620 % The undirected quote is ugly, so don't make it the default, but it
2621 % works for pasting with more pdf viewers (at least evince), the
2622 % lilypond developers report.  xpdf does work with the regular 0x27.
2623 %
2624 \def\codequoteright{%
2625   \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax
2626     \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax
2627       '%
2628     \else \char'15 \fi
2629   \else \char'15 \fi
2630 }
2631 %
2632 % and a similar option for the left quote char vs. a grave accent.
2633 % Modern fonts display ASCII 0x60 as a grave accent, so some people like
2634 % the code environments to do likewise.
2635 %
2636 \def\codequoteleft{%
2637   \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax
2638     \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax
2639       % [Knuth] pp. 380,381,391
2640       % \relax disables Spanish ligatures ?` and !` of \tt font.
2641       \relax`%
2642     \else \char'22 \fi
2643   \else \char'22 \fi
2644 }
2645
2646 % Commands to set the quote options.
2647
2648 \parseargdef\codequoteundirected{%
2649   \def\temp{#1}%
2650   \ifx\temp\onword
2651     \expandafter\let\csname SETtxicodequoteundirected\endcsname
2652       = t%
2653   \else\ifx\temp\offword
2654     \expandafter\let\csname SETtxicodequoteundirected\endcsname
2655       = \relax
2656   \else
2657     \errhelp = \EMsimple
2658     \errmessage{Unknown @codequoteundirected value `\temp', must be on|off}%
2659   \fi\fi
2660 }
2661 %
2662 \parseargdef\codequotebacktick{%
2663   \def\temp{#1}%
2664   \ifx\temp\onword
2665     \expandafter\let\csname SETtxicodequotebacktick\endcsname
2666       = t%
2667   \else\ifx\temp\offword
2668     \expandafter\let\csname SETtxicodequotebacktick\endcsname
2669       = \relax
2670   \else
2671     \errhelp = \EMsimple
2672     \errmessage{Unknown @codequotebacktick value `\temp', must be on|off}%
2673   \fi\fi
2674 }
2675
2676 % [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font.
2677 \def\noligaturesquoteleft{\relax\lq}
2678
2679 % Count depth in font-changes, for error checks
2680 \newcount\fontdepth \fontdepth=0
2681
2682 % Font commands.
2683
2684 % #1 is the font command (\sl or \it), #2 is the text to slant.
2685 % If we are in a monospaced environment, however, 1) always use \ttsl,
2686 % and 2) do not add an italic correction.
2687 \def\dosmartslant#1#2{%
2688   \ifusingtt 
2689     {{\ttsl #2}\let\next=\relax}%
2690     {\def\next{{#1#2}\futurelet\next\smartitaliccorrection}}%
2691   \next
2692 }
2693 \def\smartslanted{\dosmartslant\sl}
2694 \def\smartitalic{\dosmartslant\it}
2695
2696 % Output an italic correction unless \next (presumed to be the following
2697 % character) is such as not to need one.
2698 \def\smartitaliccorrection{%
2699   \ifx\next,%
2700   \else\ifx\next-%
2701   \else\ifx\next.%
2702   \else\ptexslash
2703   \fi\fi\fi
2704   \aftersmartic
2705 }
2706
2707 % Unconditional use \ttsl, and no ic.  @var is set to this for defuns.
2708 \def\ttslanted#1{{\ttsl #1}}
2709
2710 % @cite is like \smartslanted except unconditionally use \sl.  We never want
2711 % ttsl for book titles, do we?
2712 \def\cite#1{{\sl #1}\futurelet\next\smartitaliccorrection}
2713
2714 \def\aftersmartic{}
2715 \def\var#1{%
2716   \let\saveaftersmartic = \aftersmartic
2717   \def\aftersmartic{\null\let\aftersmartic=\saveaftersmartic}%
2718   \smartslanted{#1}%
2719 }
2720
2721 \let\i=\smartitalic
2722 \let\slanted=\smartslanted
2723 \let\dfn=\smartslanted
2724 \let\emph=\smartitalic
2725
2726 % Explicit font changes: @r, @sc, undocumented @ii.
2727 \def\r#1{{\rm #1}}              % roman font
2728 \def\sc#1{{\smallcaps#1}}       % smallcaps font
2729 \def\ii#1{{\it #1}}             % italic font
2730
2731 % @b, explicit bold.  Also @strong.
2732 \def\b#1{{\bf #1}}
2733 \let\strong=\b
2734
2735 % @sansserif, explicit sans.
2736 \def\sansserif#1{{\sf #1}}
2737
2738 % We can't just use \exhyphenpenalty, because that only has effect at
2739 % the end of a paragraph.  Restore normal hyphenation at the end of the
2740 % group within which \nohyphenation is presumably called.
2741 %
2742 \def\nohyphenation{\hyphenchar\font = -1  \aftergroup\restorehyphenation}
2743 \def\restorehyphenation{\hyphenchar\font = `- }
2744
2745 % Set sfcode to normal for the chars that usually have another value.
2746 % Can't use plain's \frenchspacing because it uses the `\x notation, and
2747 % sometimes \x has an active definition that messes things up.
2748 %
2749 \catcode`@=11
2750   \def\plainfrenchspacing{%
2751     \sfcode\dotChar  =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m
2752     \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m
2753     \def\endofsentencespacefactor{1000}% for @. and friends
2754   }
2755   \def\plainnonfrenchspacing{%
2756     \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000
2757     \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250
2758     \def\endofsentencespacefactor{3000}% for @. and friends
2759   }
2760 \catcode`@=\other
2761 \def\endofsentencespacefactor{3000}% default
2762
2763 % @t, explicit typewriter.
2764 \def\t#1{%
2765   {\tt \rawbackslash \plainfrenchspacing #1}%
2766   \null
2767 }
2768
2769 % @samp.
2770 \def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}}
2771
2772 % @indicateurl is \samp, that is, with quotes.
2773 \let\indicateurl=\samp
2774
2775 % @code (and similar) prints in typewriter, but with spaces the same
2776 % size as normal in the surrounding text, without hyphenation, etc.
2777 % This is a subroutine for that.
2778 \def\tclose#1{%
2779   {%
2780     % Change normal interword space to be same as for the current font.
2781     \spaceskip = \fontdimen2\font
2782     %
2783     % Switch to typewriter.
2784     \tt
2785     %
2786     % But `\ ' produces the large typewriter interword space.
2787     \def\ {{\spaceskip = 0pt{} }}%
2788     %
2789     % Turn off hyphenation.
2790     \nohyphenation
2791     %
2792     \rawbackslash
2793     \plainfrenchspacing
2794     #1%
2795   }%
2796   \null % reset spacefactor to 1000
2797 }
2798
2799 % We *must* turn on hyphenation at `-' and `_' in @code.
2800 % (But see \codedashfinish below.)
2801 % Otherwise, it is too hard to avoid overfull hboxes
2802 % in the Emacs manual, the Library manual, etc.
2803 %
2804 % Unfortunately, TeX uses one parameter (\hyphenchar) to control
2805 % both hyphenation at - and hyphenation within words.
2806 % We must therefore turn them both off (\tclose does that)
2807 % and arrange explicitly to hyphenate at a dash. -- rms.
2808 {
2809   \catcode`\-=\active \catcode`\_=\active
2810   \catcode`\'=\active \catcode`\`=\active
2811   \global\let'=\rq \global\let`=\lq  % default definitions
2812   %
2813   \global\def\code{\begingroup
2814     \setupmarkupstyle{code}%
2815     % The following should really be moved into \setupmarkupstyle handlers.
2816     \catcode\dashChar=\active  \catcode\underChar=\active
2817     \ifallowcodebreaks
2818      \let-\codedash
2819      \let_\codeunder
2820     \else
2821      \let-\normaldash
2822      \let_\realunder
2823     \fi
2824     % Given -foo (with a single dash), we do not want to allow a break
2825     % after the hyphen.
2826     \global\let\codedashprev=\codedash
2827     %
2828     \codex
2829   }
2830   %
2831   \gdef\codedash{\futurelet\next\codedashfinish}
2832   \gdef\codedashfinish{%
2833     \normaldash % always output the dash character itself.
2834     % 
2835     % Now, output a discretionary to allow a line break, unless
2836     % (a) the next character is a -, or
2837     % (b) the preceding character is a -.
2838     % E.g., given --posix, we do not want to allow a break after either -.
2839     % Given --foo-bar, we do want to allow a break between the - and the b.
2840     \ifx\next\codedash \else
2841       \ifx\codedashprev\codedash 
2842       \else \discretionary{}{}{}\fi
2843     \fi
2844     \global\let\codedashprev=\next
2845   }
2846 }
2847 \def\normaldash{-}
2848 %
2849 \def\codex #1{\tclose{#1}\endgroup}
2850
2851 \def\codeunder{%
2852   % this is all so @math{@code{var_name}+1} can work.  In math mode, _
2853   % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.)
2854   % will therefore expand the active definition of _, which is us
2855   % (inside @code that is), therefore an endless loop.
2856   \ifusingtt{\ifmmode
2857                \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_.
2858              \else\normalunderscore \fi
2859              \discretionary{}{}{}}%
2860             {\_}%
2861 }
2862
2863 % An additional complication: the above will allow breaks after, e.g.,
2864 % each of the four underscores in __typeof__.  This is bad.
2865 % @allowcodebreaks provides a document-level way to turn breaking at -
2866 % and _ on and off.
2867 %
2868 \newif\ifallowcodebreaks  \allowcodebreakstrue
2869
2870 \def\keywordtrue{true}
2871 \def\keywordfalse{false}
2872
2873 \parseargdef\allowcodebreaks{%
2874   \def\txiarg{#1}%
2875   \ifx\txiarg\keywordtrue
2876     \allowcodebreakstrue
2877   \else\ifx\txiarg\keywordfalse
2878     \allowcodebreaksfalse
2879   \else
2880     \errhelp = \EMsimple
2881     \errmessage{Unknown @allowcodebreaks option `\txiarg', must be true|false}%
2882   \fi\fi
2883 }
2884
2885 % For @command, @env, @file, @option quotes seem unnecessary,
2886 % so use \code rather than \samp.
2887 \let\command=\code
2888 \let\env=\code
2889 \let\file=\code
2890 \let\option=\code
2891
2892 % @uref (abbreviation for `urlref') takes an optional (comma-separated)
2893 % second argument specifying the text to display and an optional third
2894 % arg as text to display instead of (rather than in addition to) the url
2895 % itself.  First (mandatory) arg is the url.
2896 % (This \urefnobreak definition isn't used now, leaving it for a while
2897 % for comparison.)
2898 \def\urefnobreak#1{\dourefnobreak #1,,,\finish}
2899 \def\dourefnobreak#1,#2,#3,#4\finish{\begingroup
2900   \unsepspaces
2901   \pdfurl{#1}%
2902   \setbox0 = \hbox{\ignorespaces #3}%
2903   \ifdim\wd0 > 0pt
2904     \unhbox0 % third arg given, show only that
2905   \else
2906     \setbox0 = \hbox{\ignorespaces #2}%
2907     \ifdim\wd0 > 0pt
2908       \ifpdf
2909         \unhbox0             % PDF: 2nd arg given, show only it
2910       \else
2911         \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url
2912       \fi
2913     \else
2914       \code{#1}% only url given, so show it
2915     \fi
2916   \fi
2917   \endlink
2918 \endgroup}
2919
2920 % This \urefbreak definition is the active one.
2921 \def\urefbreak{\begingroup \urefcatcodes \dourefbreak}
2922 \let\uref=\urefbreak
2923 \def\dourefbreak#1{\urefbreakfinish #1,,,\finish}
2924 \def\urefbreakfinish#1,#2,#3,#4\finish{% doesn't work in @example
2925   \unsepspaces
2926   \pdfurl{#1}%
2927   \setbox0 = \hbox{\ignorespaces #3}%
2928   \ifdim\wd0 > 0pt
2929     \unhbox0 % third arg given, show only that
2930   \else
2931     \setbox0 = \hbox{\ignorespaces #2}%
2932     \ifdim\wd0 > 0pt
2933       \ifpdf
2934         \unhbox0             % PDF: 2nd arg given, show only it
2935       \else
2936         \unhbox0\ (\urefcode{#1})% DVI: 2nd arg given, show both it and url
2937       \fi
2938     \else
2939       \urefcode{#1}% only url given, so show it
2940     \fi
2941   \fi
2942   \endlink
2943 \endgroup}
2944
2945 % Allow line breaks around only a few characters (only).
2946 \def\urefcatcodes{%
2947   \catcode\ampChar=\active   \catcode\dotChar=\active
2948   \catcode\hashChar=\active  \catcode\questChar=\active
2949   \catcode\slashChar=\active
2950 }
2951 {
2952   \urefcatcodes
2953   %
2954   \global\def\urefcode{\begingroup
2955     \setupmarkupstyle{code}%
2956     \urefcatcodes
2957     \let&\urefcodeamp
2958     \let.\urefcodedot
2959     \let#\urefcodehash
2960     \let?\urefcodequest
2961     \let/\urefcodeslash
2962     \codex
2963   }
2964   %
2965   % By default, they are just regular characters.
2966   \global\def&{\normalamp}
2967   \global\def.{\normaldot}
2968   \global\def#{\normalhash}
2969   \global\def?{\normalquest}
2970   \global\def/{\normalslash}
2971 }
2972
2973 % we put a little stretch before and after the breakable chars, to help
2974 % line breaking of long url's.  The unequal skips make look better in
2975 % cmtt at least, especially for dots.
2976 \def\urefprestretch{\urefprebreak \hskip0pt plus.13em }
2977 \def\urefpoststretch{\urefpostbreak \hskip0pt plus.1em }
2978 %
2979 \def\urefcodeamp{\urefprestretch \&\urefpoststretch}
2980 \def\urefcodedot{\urefprestretch .\urefpoststretch}
2981 \def\urefcodehash{\urefprestretch \#\urefpoststretch}
2982 \def\urefcodequest{\urefprestretch ?\urefpoststretch}
2983 \def\urefcodeslash{\futurelet\next\urefcodeslashfinish}
2984 {
2985   \catcode`\/=\active
2986   \global\def\urefcodeslashfinish{%
2987     \urefprestretch \slashChar
2988     % Allow line break only after the final / in a sequence of
2989     % slashes, to avoid line break between the slashes in http://.
2990     \ifx\next/\else \urefpoststretch \fi
2991   }
2992 }
2993
2994 % One more complication: by default we'll break after the special
2995 % characters, but some people like to break before the special chars, so
2996 % allow that.  Also allow no breaking at all, for manual control.
2997
2998 \parseargdef\urefbreakstyle{%
2999   \def\txiarg{#1}%
3000   \ifx\txiarg\wordnone
3001     \def\urefprebreak{\nobreak}\def\urefpostbreak{\nobreak}
3002   \else\ifx\txiarg\wordbefore
3003     \def\urefprebreak{\allowbreak}\def\urefpostbreak{\nobreak}
3004   \else\ifx\txiarg\wordafter
3005     \def\urefprebreak{\nobreak}\def\urefpostbreak{\allowbreak}
3006   \else
3007     \errhelp = \EMsimple
3008     \errmessage{Unknown @urefbreakstyle setting `\txiarg'}%
3009   \fi\fi\fi
3010 }
3011 \def\wordafter{after}
3012 \def\wordbefore{before}
3013 \def\wordnone{none}
3014
3015 \urefbreakstyle after
3016
3017 % @url synonym for @uref, since that's how everyone uses it.
3018 %
3019 \let\url=\uref
3020
3021 % rms does not like angle brackets --karl, 17may97.
3022 % So now @email is just like @uref, unless we are pdf.
3023 %
3024 %\def\email#1{\angleleft{\tt #1}\angleright}
3025 \ifpdf
3026   \def\email#1{\doemail#1,,\finish}
3027   \def\doemail#1,#2,#3\finish{\begingroup
3028     \unsepspaces
3029     \pdfurl{mailto:#1}%
3030     \setbox0 = \hbox{\ignorespaces #2}%
3031     \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi
3032     \endlink
3033   \endgroup}
3034 \else
3035   \let\email=\uref
3036 \fi
3037
3038 % @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
3039 %   `example' (@kbd uses ttsl only inside of @example and friends),
3040 %   or `code' (@kbd uses normal tty font always).
3041 \parseargdef\kbdinputstyle{%
3042   \def\txiarg{#1}%
3043   \ifx\txiarg\worddistinct
3044     \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
3045   \else\ifx\txiarg\wordexample
3046     \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%
3047   \else\ifx\txiarg\wordcode
3048     \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
3049   \else
3050     \errhelp = \EMsimple
3051     \errmessage{Unknown @kbdinputstyle setting `\txiarg'}%
3052   \fi\fi\fi
3053 }
3054 \def\worddistinct{distinct}
3055 \def\wordexample{example}
3056 \def\wordcode{code}
3057
3058 % Default is `distinct'.
3059 \kbdinputstyle distinct
3060
3061 % @kbd is like @code, except that if the argument is just one @key command,
3062 % then @kbd has no effect.
3063 \def\kbd#1{{\def\look{#1}\expandafter\kbdsub\look??\par}}
3064
3065 \def\xkey{\key}
3066 \def\kbdsub#1#2#3\par{%
3067   \def\one{#1}\def\three{#3}\def\threex{??}%
3068   \ifx\one\xkey\ifx\threex\three \key{#2}%
3069   \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi
3070   \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi
3071 }
3072
3073 % definition of @key that produces a lozenge.  Doesn't adjust to text size.
3074 %\setfont\keyrm\rmshape{8}{1000}{OT1}
3075 %\font\keysy=cmsy9
3076 %\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{%
3077 %  \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{%
3078 %    \vbox{\hrule\kern-0.4pt
3079 %     \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}%
3080 %    \kern-0.4pt\hrule}%
3081 %  \kern-.06em\raise0.4pt\hbox{\angleright}}}}
3082
3083 % definition of @key with no lozenge.  If the current font is already
3084 % monospace, don't change it; that way, we respect @kbdinputstyle.  But
3085 % if it isn't monospace, then use \tt.
3086 %
3087 \def\key#1{{\setupmarkupstyle{key}%
3088   \nohyphenation
3089   \ifmonospace\else\tt\fi
3090   #1}\null}
3091
3092 % @clicksequence{File @click{} Open ...}
3093 \def\clicksequence#1{\begingroup #1\endgroup}
3094
3095 % @clickstyle @arrow   (by default)
3096 \parseargdef\clickstyle{\def\click{#1}}
3097 \def\click{\arrow}
3098
3099 % Typeset a dimension, e.g., `in' or `pt'.  The only reason for the
3100 % argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
3101 %
3102 \def\dmn#1{\thinspace #1}
3103
3104 % @l was never documented to mean ``switch to the Lisp font'',
3105 % and it is not used as such in any manual I can find.  We need it for
3106 % Polish suppressed-l.  --karl, 22sep96.
3107 %\def\l#1{{\li #1}\null}
3108
3109 % @acronym for "FBI", "NATO", and the like.
3110 % We print this one point size smaller, since it's intended for
3111 % all-uppercase.
3112 %
3113 \def\acronym#1{\doacronym #1,,\finish}
3114 \def\doacronym#1,#2,#3\finish{%
3115   {\selectfonts\lsize #1}%
3116   \def\temp{#2}%
3117   \ifx\temp\empty \else
3118     \space ({\unsepspaces \ignorespaces \temp \unskip})%
3119   \fi
3120   \null % reset \spacefactor=1000
3121 }
3122
3123 % @abbr for "Comput. J." and the like.
3124 % No font change, but don't do end-of-sentence spacing.
3125 %
3126 \def\abbr#1{\doabbr #1,,\finish}
3127 \def\doabbr#1,#2,#3\finish{%
3128   {\plainfrenchspacing #1}%
3129   \def\temp{#2}%
3130   \ifx\temp\empty \else
3131     \space ({\unsepspaces \ignorespaces \temp \unskip})%
3132   \fi
3133   \null % reset \spacefactor=1000
3134 }
3135
3136 % @asis just yields its argument.  Used with @table, for example.
3137 %
3138 \def\asis#1{#1}
3139
3140 % @math outputs its argument in math mode.
3141 %
3142 % One complication: _ usually means subscripts, but it could also mean
3143 % an actual _ character, as in @math{@var{some_variable} + 1}.  So make
3144 % _ active, and distinguish by seeing if the current family is \slfam,
3145 % which is what @var uses.
3146 {
3147   \catcode`\_ = \active
3148   \gdef\mathunderscore{%
3149     \catcode`\_=\active
3150     \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
3151   }
3152 }
3153 % Another complication: we want \\ (and @\) to output a math (or tt) \.
3154 % FYI, plain.tex uses \\ as a temporary control sequence (for no
3155 % particular reason), but this is not advertised and we don't care.
3156 %
3157 % The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\.
3158 \def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}
3159 %
3160 \def\math{%
3161   \tex
3162   \mathunderscore
3163   \let\\ = \mathbackslash
3164   \mathactive
3165   % make the texinfo accent commands work in math mode
3166   \let\"=\ddot
3167   \let\'=\acute
3168   \let\==\bar
3169   \let\^=\hat
3170   \let\`=\grave
3171   \let\u=\breve
3172   \let\v=\check
3173   \let\~=\tilde
3174   \let\dotaccent=\dot
3175   $\finishmath
3176 }
3177 \def\finishmath#1{#1$\endgroup}  % Close the group opened by \tex.
3178
3179 % Some active characters (such as <) are spaced differently in math.
3180 % We have to reset their definitions in case the @math was an argument
3181 % to a command which sets the catcodes (such as @item or @section).
3182 %
3183 {
3184   \catcode`^ = \active
3185   \catcode`< = \active
3186   \catcode`> = \active
3187   \catcode`+ = \active
3188   \catcode`' = \active
3189   \gdef\mathactive{%
3190     \let^ = \ptexhat
3191     \let< = \ptexless
3192     \let> = \ptexgtr
3193     \let+ = \ptexplus
3194     \let' = \ptexquoteright
3195   }
3196 }
3197
3198 % ctrl is no longer a Texinfo command, but leave this definition for fun.
3199 \def\ctrl #1{{\tt \rawbackslash \hat}#1}
3200
3201 % @inlinefmt{FMTNAME,PROCESSED-TEXT} and @inlineraw{FMTNAME,RAW-TEXT}.
3202 % Ignore unless FMTNAME == tex; then it is like @iftex and @tex,
3203 % except specified as a normal braced arg, so no newlines to worry about.
3204
3205 \def\outfmtnametex{tex}
3206 %
3207 \long\def\inlinefmt#1{\doinlinefmt #1,\finish}
3208 \long\def\doinlinefmt#1,#2,\finish{%
3209   \def\inlinefmtname{#1}%
3210   \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\fi
3211 }
3212 % For raw, must switch into @tex before parsing the argument, to avoid
3213 % setting catcodes prematurely.  Doing it this way means that, for
3214 % example, @inlineraw{html, foo{bar} gets a parse error instead of being
3215 % ignored.  But this isn't important because if people want a literal
3216 % *right* brace they would have to use a command anyway, so they may as
3217 % well use a command to get a left brace too.  We could re-use the
3218 % delimiter character idea from \verb, but it seems like overkill.
3219
3220 \long\def\inlineraw{\tex \doinlineraw}
3221 \long\def\doinlineraw#1{\doinlinerawtwo #1,\finish}
3222 \def\doinlinerawtwo#1,#2,\finish{%
3223   \def\inlinerawname{#1}%
3224   \ifx\inlinerawname\outfmtnametex \ignorespaces #2\fi
3225   \endgroup % close group opened by \tex.
3226 }
3227
3228
3229 \message{glyphs,}
3230 % and logos.
3231
3232 % @@ prints an @, as does @atchar{}.
3233 \def\@{\char64 }
3234 \let\atchar=\@
3235
3236 % @{ @} @lbracechar{} @rbracechar{} all generate brace characters.
3237 % Unless we're in typewriter, use \ecfont because the CM text fonts do
3238 % not have braces, and we don't want to switch into math.
3239 \def\mylbrace{{\ifmonospace\else\ecfont\fi \char123}}
3240 \def\myrbrace{{\ifmonospace\else\ecfont\fi \char125}}
3241 \let\{=\mylbrace \let\lbracechar=\{
3242 \let\}=\myrbrace \let\rbracechar=\}
3243 \begingroup
3244   % Definitions to produce \{ and \} commands for indices,
3245   % and @{ and @} for the aux/toc files.
3246   \catcode`\{ = \other \catcode`\} = \other
3247   \catcode`\[ = 1 \catcode`\] = 2
3248   \catcode`\! = 0 \catcode`\\ = \other
3249   !gdef!lbracecmd[\{]%
3250   !gdef!rbracecmd[\}]%
3251   !gdef!lbraceatcmd[@{]%
3252   !gdef!rbraceatcmd[@}]%
3253 !endgroup
3254
3255 % @comma{} to avoid , parsing problems.
3256 \let\comma = ,
3257
3258 % Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
3259 % Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
3260 \let\, = \ptexc
3261 \let\dotaccent = \ptexdot
3262 \def\ringaccent#1{{\accent23 #1}}
3263 \let\tieaccent = \ptext
3264 \let\ubaraccent = \ptexb
3265 \let\udotaccent = \d
3266
3267 % Other special characters: @questiondown @exclamdown @ordf @ordm
3268 % Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
3269 \def\questiondown{?`}
3270 \def\exclamdown{!`}
3271 \def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}}
3272 \def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}}
3273
3274 % Dotless i and dotless j, used for accents.
3275 \def\imacro{i}
3276 \def\jmacro{j}
3277 \def\dotless#1{%
3278   \def\temp{#1}%
3279   \ifx\temp\imacro \ifmmode\imath \else\ptexi \fi
3280   \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi
3281   \else \errmessage{@dotless can be used only with i or j}%
3282   \fi\fi
3283 }
3284
3285 % The \TeX{} logo, as in plain, but resetting the spacing so that a
3286 % period following counts as ending a sentence.  (Idea found in latex.)
3287 %
3288 \edef\TeX{\TeX \spacefactor=1000 }
3289
3290 % @LaTeX{} logo.  Not quite the same results as the definition in
3291 % latex.ltx, since we use a different font for the raised A; it's most
3292 % convenient for us to use an explicitly smaller font, rather than using
3293 % the \scriptstyle font (since we don't reset \scriptstyle and
3294 % \scriptscriptstyle).
3295 %
3296 \def\LaTeX{%
3297   L\kern-.36em
3298   {\setbox0=\hbox{T}%
3299    \vbox to \ht0{\hbox{%
3300      \ifx\textnominalsize\xwordpt
3301        % for 10pt running text, \lllsize (8pt) is too small for the A in LaTeX.
3302        % Revert to plain's \scriptsize, which is 7pt.
3303        \count255=\the\fam $\fam\count255 \scriptstyle A$%
3304      \else
3305        % For 11pt, we can use our lllsize.
3306        \selectfonts\lllsize A%
3307      \fi
3308      }%
3309      \vss
3310   }}%
3311   \kern-.15em
3312   \TeX
3313 }
3314
3315 % Some math mode symbols.
3316 \def\bullet{$\ptexbullet$}
3317 \def\geq{\ifmmode \ge\else $\ge$\fi}
3318 \def\leq{\ifmmode \le\else $\le$\fi}
3319 \def\minus{\ifmmode -\else $-$\fi}
3320
3321 % @dots{} outputs an ellipsis using the current font.
3322 % We do .5em per period so that it has the same spacing in the cm
3323 % typewriter fonts as three actual period characters; on the other hand,
3324 % in other typewriter fonts three periods are wider than 1.5em.  So do
3325 % whichever is larger.
3326 %
3327 \def\dots{%
3328   \leavevmode
3329   \setbox0=\hbox{...}% get width of three periods
3330   \ifdim\wd0 > 1.5em
3331     \dimen0 = \wd0
3332   \else
3333     \dimen0 = 1.5em
3334   \fi
3335   \hbox to \dimen0{%
3336     \hskip 0pt plus.25fil
3337     .\hskip 0pt plus1fil
3338     .\hskip 0pt plus1fil
3339     .\hskip 0pt plus.5fil
3340   }%
3341 }
3342
3343 % @enddots{} is an end-of-sentence ellipsis.
3344 %
3345 \def\enddots{%
3346   \dots
3347   \spacefactor=\endofsentencespacefactor
3348 }
3349
3350 % @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
3351 %
3352 % Since these characters are used in examples, they should be an even number of
3353 % \tt widths. Each \tt character is 1en, so two makes it 1em.
3354 %
3355 \def\point{$\star$}
3356 \def\arrow{\leavevmode\raise.05ex\hbox to 1em{\hfil$\rightarrow$\hfil}}
3357 \def\result{\leavevmode\raise.05ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
3358 \def\expansion{\leavevmode\hbox to 1em{\hfil$\mapsto$\hfil}}
3359 \def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
3360 \def\equiv{\leavevmode\hbox to 1em{\hfil$\ptexequiv$\hfil}}
3361
3362 % The @error{} command.
3363 % Adapted from the TeXbook's \boxit.
3364 %
3365 \newbox\errorbox
3366 %
3367 {\tentt \global\dimen0 = 3em}% Width of the box.
3368 \dimen2 = .55pt % Thickness of rules
3369 % The text. (`r' is open on the right, `e' somewhat less so on the left.)
3370 \setbox0 = \hbox{\kern-.75pt \reducedsf \putworderror\kern-1.5pt}
3371 %
3372 \setbox\errorbox=\hbox to \dimen0{\hfil
3373    \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
3374    \advance\hsize by -2\dimen2 % Rules.
3375    \vbox{%
3376       \hrule height\dimen2
3377       \hbox{\vrule width\dimen2 \kern3pt          % Space to left of text.
3378          \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
3379          \kern3pt\vrule width\dimen2}% Space to right.
3380       \hrule height\dimen2}
3381     \hfil}
3382 %
3383 \def\error{\leavevmode\lower.7ex\copy\errorbox}
3384
3385 % @pounds{} is a sterling sign, which Knuth put in the CM italic font.
3386 %
3387 \def\pounds{{\it\$}}
3388
3389 % @euro{} comes from a separate font, depending on the current style.
3390 % We use the free feym* fonts from the eurosym package by Henrik
3391 % Theiling, which support regular, slanted, bold and bold slanted (and
3392 % "outlined" (blackboard board, sort of) versions, which we don't need).
3393 % It is available from http://www.ctan.org/tex-archive/fonts/eurosym.
3394 %
3395 % Although only regular is the truly official Euro symbol, we ignore
3396 % that.  The Euro is designed to be slightly taller than the regular
3397 % font height.
3398 %
3399 % feymr - regular
3400 % feymo - slanted
3401 % feybr - bold
3402 % feybo - bold slanted
3403 %
3404 % There is no good (free) typewriter version, to my knowledge.
3405 % A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide.
3406 % Hmm.
3407 %
3408 % Also doesn't work in math.  Do we need to do math with euro symbols?
3409 % Hope not.
3410 %
3411 %
3412 \def\euro{{\eurofont e}}
3413 \def\eurofont{%
3414   % We set the font at each command, rather than predefining it in
3415   % \textfonts and the other font-switching commands, so that
3416   % installations which never need the symbol don't have to have the
3417   % font installed.
3418   %
3419   % There is only one designed size (nominal 10pt), so we always scale
3420   % that to the current nominal size.
3421   %
3422   % By the way, simply using "at 1em" works for cmr10 and the like, but
3423   % does not work for cmbx10 and other extended/shrunken fonts.
3424   %
3425   \def\eurosize{\csname\curfontsize nominalsize\endcsname}%
3426   %
3427   \ifx\curfontstyle\bfstylename
3428     % bold:
3429     \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize
3430   \else
3431     % regular:
3432     \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize
3433   \fi
3434   \thiseurofont
3435 }
3436
3437 % Glyphs from the EC fonts.  We don't use \let for the aliases, because
3438 % sometimes we redefine the original macro, and the alias should reflect
3439 % the redefinition.
3440 %
3441 % Use LaTeX names for the Icelandic letters.
3442 \def\DH{{\ecfont \char"D0}} % Eth
3443 \def\dh{{\ecfont \char"F0}} % eth
3444 \def\TH{{\ecfont \char"DE}} % Thorn
3445 \def\th{{\ecfont \char"FE}} % thorn
3446 %
3447 \def\guillemetleft{{\ecfont \char"13}}
3448 \def\guillemotleft{\guillemetleft}
3449 \def\guillemetright{{\ecfont \char"14}}
3450 \def\guillemotright{\guillemetright}
3451 \def\guilsinglleft{{\ecfont \char"0E}}
3452 \def\guilsinglright{{\ecfont \char"0F}}
3453 \def\quotedblbase{{\ecfont \char"12}}
3454 \def\quotesinglbase{{\ecfont \char"0D}}
3455 %
3456 % This positioning is not perfect (see the ogonek LaTeX package), but
3457 % we have the precomposed glyphs for the most common cases.  We put the
3458 % tests to use those glyphs in the single \ogonek macro so we have fewer
3459 % dummy definitions to worry about for index entries, etc.
3460 %
3461 % ogonek is also used with other letters in Lithuanian (IOU), but using
3462 % the precomposed glyphs for those is not so easy since they aren't in
3463 % the same EC font.
3464 \def\ogonek#1{{%
3465   \def\temp{#1}%
3466   \ifx\temp\macrocharA\Aogonek
3467   \else\ifx\temp\macrochara\aogonek
3468   \else\ifx\temp\macrocharE\Eogonek
3469   \else\ifx\temp\macrochare\eogonek
3470   \else
3471     \ecfont \setbox0=\hbox{#1}%
3472     \ifdim\ht0=1ex\accent"0C #1%
3473     \else\ooalign{\unhbox0\crcr\hidewidth\char"0C \hidewidth}%
3474     \fi
3475   \fi\fi\fi\fi
3476   }%
3477 }
3478 \def\Aogonek{{\ecfont \char"81}}\def\macrocharA{A}
3479 \def\aogonek{{\ecfont \char"A1}}\def\macrochara{a}
3480 \def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E}
3481 \def\eogonek{{\ecfont \char"A6}}\def\macrochare{e}
3482 %
3483 % Use the ec* fonts (cm-super in outline format) for non-CM glyphs.
3484 \def\ecfont{%
3485   % We can't distinguish serif/sans and italic/slanted, but this
3486   % is used for crude hacks anyway (like adding French and German
3487   % quotes to documents typeset with CM, where we lose kerning), so
3488   % hopefully nobody will notice/care.
3489   \edef\ecsize{\csname\curfontsize ecsize\endcsname}%
3490   \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}%
3491   \ifmonospace
3492     % typewriter:
3493     \font\thisecfont = ectt\ecsize \space at \nominalsize
3494   \else
3495     \ifx\curfontstyle\bfstylename
3496       % bold:
3497       \font\thisecfont = ecb\ifusingit{i}{x}\ecsize \space at \nominalsize
3498     \else
3499       % regular:
3500       \font\thisecfont = ec\ifusingit{ti}{rm}\ecsize \space at \nominalsize
3501     \fi
3502   \fi
3503   \thisecfont
3504 }
3505
3506 % @registeredsymbol - R in a circle.  The font for the R should really
3507 % be smaller yet, but lllsize is the best we can do for now.
3508 % Adapted from the plain.tex definition of \copyright.
3509 %
3510 \font\onlytodefineregisteredsymbol=psyr at 7pt
3511 \def\registeredsymbol{%
3512 $^{\hbox{\onlytodefineregisteredsymbol\char210\relax}}$%
3513 }
3514
3515 % @textdegree - the normal degrees sign.
3516 %
3517 \def\textdegree{$^\circ$}
3518
3519 % Laurent Siebenmann reports \Orb undefined with:
3520 %  Textures 1.7.7 (preloaded format=plain 93.10.14)  (68K)  16 APR 2004 02:38
3521 % so we'll define it if necessary.
3522 %
3523 \ifx\Orb\thisisundefined
3524 \def\Orb{\mathhexbox20D}
3525 \fi
3526
3527 % Quotes.
3528 \chardef\quotedblleft="5C
3529 \chardef\quotedblright=`\"
3530 \chardef\quoteleft=`\`
3531 \chardef\quoteright=`\'
3532
3533
3534 \message{page headings,}
3535
3536 \newskip\titlepagetopglue \titlepagetopglue = 1.5in
3537 \newskip\titlepagebottomglue \titlepagebottomglue = 2pc
3538
3539 % First the title page.  Must do @settitle before @titlepage.
3540 \newif\ifseenauthor
3541 \newif\iffinishedtitlepage
3542
3543 % Do an implicit @contents or @shortcontents after @end titlepage if the
3544 % user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage.
3545 %
3546 \newif\ifsetcontentsaftertitlepage
3547  \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue
3548 \newif\ifsetshortcontentsaftertitlepage
3549  \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue
3550
3551 \parseargdef\shorttitlepage{%
3552   \begingroup \hbox{}\vskip 1.5in \chaprm \centerline{#1}%
3553   \endgroup\page\hbox{}\page}
3554
3555 \envdef\titlepage{%
3556   % Open one extra group, as we want to close it in the middle of \Etitlepage.
3557   \begingroup
3558     \parindent=0pt \textfonts
3559     % Leave some space at the very top of the page.
3560     \vglue\titlepagetopglue
3561     % No rule at page bottom unless we print one at the top with @title.
3562     \finishedtitlepagetrue
3563     %
3564     % Most title ``pages'' are actually two pages long, with space
3565     % at the top of the second.  We don't want the ragged left on the second.
3566     \let\oldpage = \page
3567     \def\page{%
3568       \iffinishedtitlepage\else
3569          \finishtitlepage
3570       \fi
3571       \let\page = \oldpage
3572       \page
3573       \null
3574     }%
3575 }
3576
3577 \def\Etitlepage{%
3578     \iffinishedtitlepage\else
3579         \finishtitlepage
3580     \fi
3581     % It is important to do the page break before ending the group,
3582     % because the headline and footline are only empty inside the group.
3583     % If we use the new definition of \page, we always get a blank page
3584     % after the title page, which we certainly don't want.
3585     \oldpage
3586   \endgroup
3587   %
3588   % Need this before the \...aftertitlepage checks so that if they are
3589   % in effect the toc pages will come out with page numbers.
3590   \HEADINGSon
3591   %
3592   % If they want short, they certainly want long too.
3593   \ifsetshortcontentsaftertitlepage
3594     \shortcontents
3595     \contents
3596     \global\let\shortcontents = \relax
3597     \global\let\contents = \relax
3598   \fi
3599   %
3600   \ifsetcontentsaftertitlepage
3601     \contents
3602     \global\let\contents = \relax
3603     \global\let\shortcontents = \relax
3604   \fi
3605 }
3606
3607 \def\finishtitlepage{%
3608   \vskip4pt \hrule height 2pt width \hsize
3609   \vskip\titlepagebottomglue
3610   \finishedtitlepagetrue
3611 }
3612
3613 % Settings used for typesetting titles: no hyphenation, no indentation,
3614 % don't worry much about spacing, ragged right.  This should be used
3615 % inside a \vbox, and fonts need to be set appropriately first.  Because
3616 % it is always used for titles, nothing else, we call \rmisbold.  \par
3617 % should be specified before the end of the \vbox, since a vbox is a group.
3618
3619 \def\raggedtitlesettings{%
3620   \rmisbold
3621   \hyphenpenalty=10000
3622   \parindent=0pt
3623   \tolerance=5000
3624   \ptexraggedright
3625 }
3626
3627 % Macros to be used within @titlepage:
3628
3629 \let\subtitlerm=\tenrm
3630 \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}
3631
3632 \parseargdef\title{%
3633   \checkenv\titlepage
3634   \vbox{\titlefonts \raggedtitlesettings #1\par}%
3635   % print a rule at the page bottom also.
3636   \finishedtitlepagefalse
3637   \vskip4pt \hrule height 4pt width \hsize \vskip4pt
3638 }
3639
3640 \parseargdef\subtitle{%
3641   \checkenv\titlepage
3642   {\subtitlefont \rightline{#1}}%
3643 }
3644
3645 % @author should come last, but may come many times.
3646 % It can also be used inside @quotation.
3647 %
3648 \parseargdef\author{%
3649   \def\temp{\quotation}%
3650   \ifx\thisenv\temp
3651     \def\quotationauthor{#1}% printed in \Equotation.
3652   \else
3653     \checkenv\titlepage
3654     \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi
3655     {\secfonts\rmisbold \leftline{#1}}%
3656   \fi
3657 }
3658
3659
3660 % Set up page headings and footings.
3661
3662 \let\thispage=\folio
3663
3664 \newtoks\evenheadline    % headline on even pages
3665 \newtoks\oddheadline     % headline on odd pages
3666 \newtoks\evenfootline    % footline on even pages
3667 \newtoks\oddfootline     % footline on odd pages
3668
3669 % Now make TeX use those variables
3670 \headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
3671                             \else \the\evenheadline \fi}}
3672 \footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
3673                             \else \the\evenfootline \fi}\HEADINGShook}
3674 \let\HEADINGShook=\relax
3675
3676 % Commands to set those variables.
3677 % For example, this is what  @headings on  does
3678 % @evenheading @thistitle|@thispage|@thischapter
3679 % @oddheading @thischapter|@thispage|@thistitle
3680 % @evenfooting @thisfile||
3681 % @oddfooting ||@thisfile
3682
3683
3684 \def\evenheading{\parsearg\evenheadingxxx}
3685 \def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish}
3686 \def\evenheadingyyy #1\|#2\|#3\|#4\finish{%
3687 \global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
3688
3689 \def\oddheading{\parsearg\oddheadingxxx}
3690 \def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish}
3691 \def\oddheadingyyy #1\|#2\|#3\|#4\finish{%
3692 \global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
3693
3694 \parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
3695
3696 \def\evenfooting{\parsearg\evenfootingxxx}
3697 \def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish}
3698 \def\evenfootingyyy #1\|#2\|#3\|#4\finish{%
3699 \global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
3700
3701 \def\oddfooting{\parsearg\oddfootingxxx}
3702 \def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish}
3703 \def\oddfootingyyy #1\|#2\|#3\|#4\finish{%
3704   \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
3705   %
3706   % Leave some space for the footline.  Hopefully ok to assume
3707   % @evenfooting will not be used by itself.
3708   \global\advance\pageheight by -12pt
3709   \global\advance\vsize by -12pt
3710 }
3711
3712 \parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}}
3713
3714 % @evenheadingmarks top     \thischapter <- chapter at the top of a page
3715 % @evenheadingmarks bottom  \thischapter <- chapter at the bottom of a page
3716 %
3717 % The same set of arguments for:
3718 %
3719 % @oddheadingmarks
3720 % @evenfootingmarks
3721 % @oddfootingmarks
3722 % @everyheadingmarks
3723 % @everyfootingmarks
3724
3725 \def\evenheadingmarks{\headingmarks{even}{heading}}
3726 \def\oddheadingmarks{\headingmarks{odd}{heading}}
3727 \def\evenfootingmarks{\headingmarks{even}{footing}}
3728 \def\oddfootingmarks{\headingmarks{odd}{footing}}
3729 \def\everyheadingmarks#1 {\headingmarks{even}{heading}{#1}
3730                           \headingmarks{odd}{heading}{#1} }
3731 \def\everyfootingmarks#1 {\headingmarks{even}{footing}{#1}
3732                           \headingmarks{odd}{footing}{#1} }
3733 % #1 = even/odd, #2 = heading/footing, #3 = top/bottom.
3734 \def\headingmarks#1#2#3 {%
3735   \expandafter\let\expandafter\temp \csname get#3headingmarks\endcsname
3736   \global\expandafter\let\csname get#1#2marks\endcsname \temp
3737 }
3738
3739 \everyheadingmarks bottom
3740 \everyfootingmarks bottom
3741
3742 % @headings double      turns headings on for double-sided printing.
3743 % @headings single      turns headings on for single-sided printing.
3744 % @headings off         turns them off.
3745 % @headings on          same as @headings double, retained for compatibility.
3746 % @headings after       turns on double-sided headings after this page.
3747 % @headings doubleafter turns on double-sided headings after this page.
3748 % @headings singleafter turns on single-sided headings after this page.
3749 % By default, they are off at the start of a document,
3750 % and turned `on' after @end titlepage.
3751
3752 \def\headings #1 {\csname HEADINGS#1\endcsname}
3753
3754 \def\headingsoff{% non-global headings elimination
3755   \evenheadline={\hfil}\evenfootline={\hfil}%
3756    \oddheadline={\hfil}\oddfootline={\hfil}%
3757 }
3758
3759 \def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting
3760 \HEADINGSoff  % it's the default
3761
3762 % When we turn headings on, set the page number to 1.
3763 % For double-sided printing, put current file name in lower left corner,
3764 % chapter name on inside top of right hand pages, document
3765 % title on inside top of left hand pages, and page numbers on outside top
3766 % edge of all pages.
3767 \def\HEADINGSdouble{%
3768 \global\pageno=1
3769 \global\evenfootline={\hfil}
3770 \global\oddfootline={\hfil}
3771 \global\evenheadline={\line{\folio\hfil\thistitle}}
3772 \global\oddheadline={\line{\thischapter\hfil\folio}}
3773 \global\let\contentsalignmacro = \chapoddpage
3774 }
3775 \let\contentsalignmacro = \chappager
3776
3777 % For single-sided printing, chapter title goes across top left of page,
3778 % page number on top right.
3779 \def\HEADINGSsingle{%
3780 \global\pageno=1
3781 \global\evenfootline={\hfil}
3782 \global\oddfootline={\hfil}
3783 \global\evenheadline={\line{\thischapter\hfil\folio}}
3784 \global\oddheadline={\line{\thischapter\hfil\folio}}
3785 \global\let\contentsalignmacro = \chappager
3786 }
3787 \def\HEADINGSon{\HEADINGSdouble}
3788
3789 \def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
3790 \let\HEADINGSdoubleafter=\HEADINGSafter
3791 \def\HEADINGSdoublex{%
3792 \global\evenfootline={\hfil}
3793 \global\oddfootline={\hfil}
3794 \global\evenheadline={\line{\folio\hfil\thistitle}}
3795 \global\oddheadline={\line{\thischapter\hfil\folio}}
3796 \global\let\contentsalignmacro = \chapoddpage
3797 }
3798
3799 \def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
3800 \def\HEADINGSsinglex{%
3801 \global\evenfootline={\hfil}
3802 \global\oddfootline={\hfil}
3803 \global\evenheadline={\line{\thischapter\hfil\folio}}
3804 \global\oddheadline={\line{\thischapter\hfil\folio}}
3805 \global\let\contentsalignmacro = \chappager
3806 }
3807
3808 % Subroutines used in generating headings
3809 % This produces Day Month Year style of output.
3810 % Only define if not already defined, in case a txi-??.tex file has set
3811 % up a different format (e.g., txi-cs.tex does this).
3812 \ifx\today\thisisundefined
3813 \def\today{%
3814   \number\day\space
3815   \ifcase\month
3816   \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
3817   \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
3818   \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
3819   \fi
3820   \space\number\year}
3821 \fi
3822
3823 % @settitle line...  specifies the title of the document, for headings.
3824 % It generates no output of its own.
3825 \def\thistitle{\putwordNoTitle}
3826 \def\settitle{\parsearg{\gdef\thistitle}}
3827
3828
3829 \message{tables,}
3830 % Tables -- @table, @ftable, @vtable, @item(x).
3831
3832 % default indentation of table text
3833 \newdimen\tableindent \tableindent=.8in
3834 % default indentation of @itemize and @enumerate text
3835 \newdimen\itemindent  \itemindent=.3in
3836 % margin between end of table item and start of table text.
3837 \newdimen\itemmargin  \itemmargin=.1in
3838
3839 % used internally for \itemindent minus \itemmargin
3840 \newdimen\itemmax
3841
3842 % Note @table, @ftable, and @vtable define @item, @itemx, etc., with
3843 % these defs.
3844 % They also define \itemindex
3845 % to index the item name in whatever manner is desired (perhaps none).
3846
3847 \newif\ifitemxneedsnegativevskip
3848
3849 \def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi}
3850
3851 \def\internalBitem{\smallbreak \parsearg\itemzzz}
3852 \def\internalBitemx{\itemxpar \parsearg\itemzzz}