~ubuntu-branches/debian/sid/grub2/sid-200907171837

« back to all changes in this revision

Viewing changes to docs/texinfo.tex

  • Committer: Bazaar Package Importer
  • Author(s): Robert Millan
  • Date: 2009-07-02 13:23:51 UTC
  • mfrom: (1.1.10 upstream)
  • Revision ID: james.westby@ubuntu.com-20090702132351-tanpn0ryyijp93gu
Tags: 1.96+20090702-1
* New SVN snapshot.
* rules: Remove duplicated files in sparc64-ieee1275 port.
* rules: Comment out -DGRUB_ASSUME_LINUX_HAS_FB_SUPPORT=1 setting.  We'll
  re-evaluate using it when it's more mature.  (Closes: #535026).

Show diffs side-by-side

added added

removed removed

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