Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 228205 | Differences between
and this patch

Collapse All | Expand All

(-)automake-1.7.9/lib/texinfo.tex (-2615 / +5162 lines)
Lines 3-17 Link Here
3
% Load plain if necessary, i.e., if running under initex.
3
% Load plain if necessary, i.e., if running under initex.
4
\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
4
\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
5
%
5
%
6
\def\texinfoversion{2003-10-06.08}
6
\def\texinfoversion{2009-05-16.16}
7
%
7
%
8
% Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
8
% Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
9
% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
9
% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
10
% 2007, 2008, 2009 Free Software Foundation, Inc.
10
%
11
%
11
% This texinfo.tex file is free software; you can redistribute it and/or
12
% This texinfo.tex file is free software: you can redistribute it and/or
12
% modify it under the terms of the GNU General Public License as
13
% modify it under the terms of the GNU General Public License as
13
% published by the Free Software Foundation; either version 2, or (at
14
% published by the Free Software Foundation, either version 3 of the
14
% your option) any later version.
15
% License, or (at your option) any later version.
15
%
16
%
16
% This texinfo.tex file is distributed in the hope that it will be
17
% This texinfo.tex file is distributed in the hope that it will be
17
% useful, but WITHOUT ANY WARRANTY; without even the implied warranty
18
% useful, but WITHOUT ANY WARRANTY; without even the implied warranty
Lines 19-43 Link Here
19
% General Public License for more details.
20
% General Public License for more details.
20
%
21
%
21
% You should have received a copy of the GNU General Public License
22
% You should have received a copy of the GNU General Public License
22
% along with this texinfo.tex file; see the file COPYING.  If not, write
23
% along with this program.  If not, see <http://www.gnu.org/licenses/>.
23
% to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
24
%
24
% Boston, MA 02111-1307, USA.
25
% As a special exception, when this file is read by TeX when processing
25
%
26
% a Texinfo source document, you may use the result without
26
% In other words, you are welcome to use, share and improve this program.
27
% restriction.  (This has been our intent since Texinfo was invented.)
27
% You are forbidden to forbid anyone else to use, share and improve
28
% what you give them.   Help stamp out software-hoarding!
29
%
28
%
30
% Please try the latest version of texinfo.tex before submitting bug
29
% Please try the latest version of texinfo.tex before submitting bug
31
% reports; you can get the latest version from:
30
% reports; you can get the latest version from:
32
%   ftp://ftp.gnu.org/gnu/texinfo/texinfo.tex
31
%   http://www.gnu.org/software/texinfo/ (the Texinfo home page), or
33
%     (and all GNU mirrors, see http://www.gnu.org/order/ftp.html)
34
%   ftp://tug.org/tex/texinfo.tex
32
%   ftp://tug.org/tex/texinfo.tex
35
%     (and all CTAN mirrors, see http://www.ctan.org),
33
%     (and all CTAN mirrors, see http://www.ctan.org).
36
%   and /home/gd/gnu/doc/texinfo.tex on the GNU machines.
34
% The texinfo.tex in any given distribution could well be out
37
%
38
% The GNU Texinfo home page is http://www.gnu.org/software/texinfo.
39
%
40
% The texinfo.tex in any given Texinfo distribution could well be out
41
% of date, so if that's what you're using, please check.
35
% of date, so if that's what you're using, please check.
42
%
36
%
43
% Send bug reports to bug-texinfo@gnu.org.  Please include including a
37
% Send bug reports to bug-texinfo@gnu.org.  Please include including a
Lines 59-64 Link Here
59
% It is possible to adapt texinfo.tex for other languages, to some
53
% It is possible to adapt texinfo.tex for other languages, to some
60
% extent.  You can get the existing language-specific files from the
54
% extent.  You can get the existing language-specific files from the
61
% full Texinfo distribution.
55
% full Texinfo distribution.
56
%
57
% The GNU Texinfo home page is http://www.gnu.org/software/texinfo.
58
62
59
63
\message{Loading texinfo [version \texinfoversion]:}
60
\message{Loading texinfo [version \texinfoversion]:}
64
61
Lines 68-74 Link Here
68
\everyjob{\message{[Texinfo version \texinfoversion]}%
65
\everyjob{\message{[Texinfo version \texinfoversion]}%
69
  \catcode`+=\active \catcode`\_=\active}
66
  \catcode`+=\active \catcode`\_=\active}
70
67
71
\message{Basics,}
68
72
\chardef\other=12
69
\chardef\other=12
73
70
74
% We never want plain's \outer definition of \+ in Texinfo.
71
% We never want plain's \outer definition of \+ in Texinfo.
Lines 85-107 Link Here
85
\let\ptexend=\end
82
\let\ptexend=\end
86
\let\ptexequiv=\equiv
83
\let\ptexequiv=\equiv
87
\let\ptexexclam=\!
84
\let\ptexexclam=\!
85
\let\ptexfootnote=\footnote
88
\let\ptexgtr=>
86
\let\ptexgtr=>
89
\let\ptexhat=^
87
\let\ptexhat=^
90
\let\ptexi=\i
88
\let\ptexi=\i
91
\let\ptexindent=\indent
89
\let\ptexindent=\indent
92
\let\ptexnoindent=\noindent
90
\let\ptexinsert=\insert
93
\let\ptexlbrace=\{
91
\let\ptexlbrace=\{
94
\let\ptexless=<
92
\let\ptexless=<
93
\let\ptexnewwrite\newwrite
94
\let\ptexnoindent=\noindent
95
\let\ptexplus=+
95
\let\ptexplus=+
96
\let\ptexrbrace=\}
96
\let\ptexrbrace=\}
97
\let\ptexslash=\/
97
\let\ptexslash=\/
98
\let\ptexstar=\*
98
\let\ptexstar=\*
99
\let\ptext=\t
99
\let\ptext=\t
100
\let\ptextop=\top
101
{\catcode`\'=\active
102
\global\let\ptexquoteright'}% Math-mode def from plain.tex.
103
\let\ptexraggedright=\raggedright
100
104
101
% If this character appears in an error message or help string, it
105
% If this character appears in an error message or help string, it
102
% starts a new line in the output.
106
% starts a new line in the output.
103
\newlinechar = `^^J
107
\newlinechar = `^^J
104
108
109
% Use TeX 3.0's \inputlineno to get the line number, for better error
110
% messages, but if we're using an old version of TeX, don't do anything.
111
%
112
\ifx\inputlineno\thisisundefined
113
  \let\linenumber = \empty % Pre-3.0.
114
\else
115
  \def\linenumber{l.\the\inputlineno:\space}
116
\fi
117
105
% Set up fixed words for English if not already set.
118
% Set up fixed words for English if not already set.
106
\ifx\putwordAppendix\undefined  \gdef\putwordAppendix{Appendix}\fi
119
\ifx\putwordAppendix\undefined  \gdef\putwordAppendix{Appendix}\fi
107
\ifx\putwordChapter\undefined   \gdef\putwordChapter{Chapter}\fi
120
\ifx\putwordChapter\undefined   \gdef\putwordChapter{Chapter}\fi
Lines 140-182 Link Here
140
\ifx\putwordDefspec\undefined   \gdef\putwordDefspec{Special Form}\fi
153
\ifx\putwordDefspec\undefined   \gdef\putwordDefspec{Special Form}\fi
141
\ifx\putwordDefvar\undefined    \gdef\putwordDefvar{Variable}\fi
154
\ifx\putwordDefvar\undefined    \gdef\putwordDefvar{Variable}\fi
142
\ifx\putwordDefopt\undefined    \gdef\putwordDefopt{User Option}\fi
155
\ifx\putwordDefopt\undefined    \gdef\putwordDefopt{User Option}\fi
143
\ifx\putwordDeftypevar\undefined\gdef\putwordDeftypevar{Variable}\fi
144
\ifx\putwordDeffunc\undefined   \gdef\putwordDeffunc{Function}\fi
156
\ifx\putwordDeffunc\undefined   \gdef\putwordDeffunc{Function}\fi
145
\ifx\putwordDeftypefun\undefined\gdef\putwordDeftypefun{Function}\fi
146
157
147
% In some macros, we cannot use the `\? notation---the left quote is
158
% Since the category of space is not known, we have to be careful.
148
% in some cases the escape char.
159
\chardef\spacecat = 10
160
\def\spaceisspace{\catcode`\ =\spacecat}
161
162
% sometimes characters are active, so we need control sequences.
149
\chardef\colonChar = `\:
163
\chardef\colonChar = `\:
150
\chardef\commaChar = `\,
164
\chardef\commaChar = `\,
165
\chardef\dashChar  = `\-
151
\chardef\dotChar   = `\.
166
\chardef\dotChar   = `\.
152
\chardef\equalChar = `\=
153
\chardef\exclamChar= `\!
167
\chardef\exclamChar= `\!
168
\chardef\lquoteChar= `\`
154
\chardef\questChar = `\?
169
\chardef\questChar = `\?
170
\chardef\rquoteChar= `\'
155
\chardef\semiChar  = `\;
171
\chardef\semiChar  = `\;
156
\chardef\spaceChar = `\ %
157
\chardef\underChar = `\_
172
\chardef\underChar = `\_
158
173
159
% Ignore a token.
174
% Ignore a token.
160
%
175
%
161
\def\gobble#1{}
176
\def\gobble#1{}
162
177
163
% True if #1 is the empty string, i.e., called like `\ifempty{}'.
178
% The following is used inside several \edef's.
164
%
179
\def\makecsname#1{\expandafter\noexpand\csname#1\endcsname}
165
\def\ifempty#1{\ifemptyx #1\emptymarkA\emptymarkB}%
166
\def\ifemptyx#1#2\emptymarkB{\ifx #1\emptymarkA}%
167
180
168
% Hyphenation fixes.
181
% Hyphenation fixes.
169
\hyphenation{ap-pen-dix}
182
\hyphenation{
170
\hyphenation{eshell}
183
  Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script
171
\hyphenation{mini-buf-fer mini-buf-fers}
184
  ap-pen-dix bit-map bit-maps
172
\hyphenation{time-stamp}
185
  data-base data-bases eshell fall-ing half-way long-est man-u-script
173
\hyphenation{white-space}
186
  man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm
187
  par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces
188
  spell-ing spell-ings
189
  stand-alone strong-est time-stamp time-stamps which-ever white-space
190
  wide-spread wrap-around
191
}
174
192
175
% Margin to add to right of even pages, to left of odd pages.
193
% Margin to add to right of even pages, to left of odd pages.
176
\newdimen\bindingoffset
194
\newdimen\bindingoffset
177
\newdimen\normaloffset
195
\newdimen\normaloffset
178
\newdimen\pagewidth \newdimen\pageheight
196
\newdimen\pagewidth \newdimen\pageheight
179
197
198
% For a final copy, take out the rectangles
199
% that mark overfull boxes (in case you have decided
200
% that the text looks ok even though it passes the margin).
201
%
202
\def\finalout{\overfullrule=0pt}
203
204
% @| inserts a changebar to the left of the current line.  It should
205
% surround any changed text.  This approach does *not* work if the
206
% change spans more than two lines of output.  To handle that, we would
207
% have adopt a much more difficult approach (putting marks into the main
208
% vertical list for the beginning and end of each change).
209
%
210
\def\|{%
211
  % \vadjust can only be used in horizontal mode.
212
  \leavevmode
213
  %
214
  % Append this vertical mode material after the current line in the output.
215
  \vadjust{%
216
    % We want to insert a rule with the height and depth of the current
217
    % leading; that is exactly what \strutbox is supposed to record.
218
    \vskip-\baselineskip
219
    %
220
    % \vadjust-items are inserted at the left edge of the type.  So
221
    % the \llap here moves out into the left-hand margin.
222
    \llap{%
223
      %
224
      % For a thicker or thinner bar, change the `1pt'.
225
      \vrule height\baselineskip width1pt
226
      %
227
      % This is the space between the bar and the text.
228
      \hskip 12pt
229
    }%
230
  }%
231
}
232
180
% Sometimes it is convenient to have everything in the transcript file
233
% Sometimes it is convenient to have everything in the transcript file
181
% and nothing on the terminal.  We don't just call \tracingall here,
234
% and nothing on the terminal.  We don't just call \tracingall here,
182
% since that produces some useless output on the terminal.  We also make
235
% since that produces some useless output on the terminal.  We also make
Lines 201-207 Link Here
201
    \tracingassigns1
254
    \tracingassigns1
202
  \fi
255
  \fi
203
  \tracingcommands3  % 3 gives us more in etex
256
  \tracingcommands3  % 3 gives us more in etex
204
  \errorcontextlines\maxdimen
257
  \errorcontextlines16
205
}%
258
}%
206
259
207
% add check for \lastpenalty to plain's definitions.  If the last thing
260
% add check for \lastpenalty to plain's definitions.  If the last thing
Lines 228-233 Link Here
228
\newdimen\cornerthick \cornerthick=.3pt
281
\newdimen\cornerthick \cornerthick=.3pt
229
\newdimen\topandbottommargin \topandbottommargin=.75in
282
\newdimen\topandbottommargin \topandbottommargin=.75in
230
283
284
% Output a mark which sets \thischapter, \thissection and \thiscolor.
285
% We dump everything together because we only have one kind of mark.
286
% This works because we only use \botmark / \topmark, not \firstmark.
287
%
288
% A mark contains a subexpression of the \ifcase ... \fi construct.
289
% \get*marks macros below extract the needed part using \ifcase.
290
%
291
% Another complication is to let the user choose whether \thischapter
292
% (\thissection) refers to the chapter (section) in effect at the top
293
% of a page, or that at the bottom of a page.  The solution is
294
% described on page 260 of The TeXbook.  It involves outputting two
295
% marks for the sectioning macros, one before the section break, and
296
% one after.  I won't pretend I can describe this better than DEK...
297
\def\domark{%
298
  \toks0=\expandafter{\lastchapterdefs}%
299
  \toks2=\expandafter{\lastsectiondefs}%
300
  \toks4=\expandafter{\prevchapterdefs}%
301
  \toks6=\expandafter{\prevsectiondefs}%
302
  \toks8=\expandafter{\lastcolordefs}%
303
  \mark{%
304
                   \the\toks0 \the\toks2
305
      \noexpand\or \the\toks4 \the\toks6
306
    \noexpand\else \the\toks8
307
  }%
308
}
309
% \topmark doesn't work for the very first chapter (after the title
310
% page or the contents), so we use \firstmark there -- this gets us
311
% the mark with the chapter defs, unless the user sneaks in, e.g.,
312
% @setcolor (or @url, or @link, etc.) between @contents and the very
313
% first @chapter.
314
\def\gettopheadingmarks{%
315
  \ifcase0\topmark\fi
316
  \ifx\thischapter\empty \ifcase0\firstmark\fi \fi
317
}
318
\def\getbottomheadingmarks{\ifcase1\botmark\fi}
319
\def\getcolormarks{\ifcase2\topmark\fi}
320
321
% Avoid "undefined control sequence" errors.
322
\def\lastchapterdefs{}
323
\def\lastsectiondefs{}
324
\def\prevchapterdefs{}
325
\def\prevsectiondefs{}
326
\def\lastcolordefs{}
327
231
% Main output routine.
328
% Main output routine.
232
\chardef\PAGE = 255
329
\chardef\PAGE = 255
233
\output = {\onepageout{\pagecontents\PAGE}}
330
\output = {\onepageout{\pagecontents\PAGE}}
Lines 245-251 Link Here
245
  %
342
  %
246
  % Do this outside of the \shipout so @code etc. will be expanded in
343
  % Do this outside of the \shipout so @code etc. will be expanded in
247
  % the headline as they should be, not taken literally (outputting ''code).
344
  % the headline as they should be, not taken literally (outputting ''code).
345
  \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi
248
  \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}%
346
  \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}%
347
  \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi
249
  \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}%
348
  \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}%
250
  %
349
  %
251
  {%
350
  {%
Lines 253-265 Link Here
253
    % take effect in \write's, yet the group defined by the \vbox ends
352
    % take effect in \write's, yet the group defined by the \vbox ends
254
    % before the \shipout runs.
353
    % before the \shipout runs.
255
    %
354
    %
256
    \escapechar = `\\     % use backslash in output files.
257
    \indexdummies         % don't expand commands in the output.
355
    \indexdummies         % don't expand commands in the output.
258
    \normalturnoffactive  % \ in index entries must not stay \, e.g., if
356
    \normalturnoffactive  % \ in index entries must not stay \, e.g., if
259
                   % the page break happens to be in the middle of an example.
357
               % the page break happens to be in the middle of an example.
358
               % We don't want .vr (or whatever) entries like this:
359
               % \entry{{\tt \indexbackslash }acronym}{32}{\code {\acronym}}
360
               % "\acronym" won't work when it's read back in;
361
               % it needs to be
362
               % {\code {{\tt \backslashcurfont }acronym}
260
    \shipout\vbox{%
363
    \shipout\vbox{%
261
      % Do this early so pdf references go to the beginning of the page.
364
      % Do this early so pdf references go to the beginning of the page.
262
      \ifpdfmakepagedest \pdfmkdest{\the\pageno}\fi
365
      \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi
263
      %
366
      %
264
      \ifcropmarks \vbox to \outervsize\bgroup
367
      \ifcropmarks \vbox to \outervsize\bgroup
265
        \hsize = \outerhsize
368
        \hsize = \outerhsize
Lines 284-292 Link Here
284
      \pagebody{#1}%
387
      \pagebody{#1}%
285
      \ifdim\ht\footlinebox > 0pt
388
      \ifdim\ht\footlinebox > 0pt
286
        % Only leave this space if the footline is nonempty.
389
        % Only leave this space if the footline is nonempty.
287
        % (We lessened \vsize for it in \oddfootingxxx.)
390
        % (We lessened \vsize for it in \oddfootingyyy.)
288
        % The \baselineskip=24pt in plain's \makefootline has no effect.
391
        % The \baselineskip=24pt in plain's \makefootline has no effect.
289
        \vskip 2\baselineskip
392
        \vskip 24pt
290
        \unvbox\footlinebox
393
        \unvbox\footlinebox
291
      \fi
394
      \fi
292
      %
395
      %
Lines 307-313 Link Here
307
      \egroup % \vbox from first cropmarks clause
410
      \egroup % \vbox from first cropmarks clause
308
      \fi
411
      \fi
309
    }% end of \shipout\vbox
412
    }% end of \shipout\vbox
310
  }% end of group with \normalturnoffactive
413
  }% end of group with \indexdummies
311
  \advancepageno
414
  \advancepageno
312
  \ifnum\outputpenalty>-20000 \else\dosupereject\fi
415
  \ifnum\outputpenalty>-20000 \else\dosupereject\fi
313
}
416
}
Lines 320-326 Link Here
320
% marginal hacks, juha@viisa.uucp (Juha Takala)
423
% marginal hacks, juha@viisa.uucp (Juha Takala)
321
\ifvoid\margin\else % marginal info is present
424
\ifvoid\margin\else % marginal info is present
322
  \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi
425
  \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi
323
\dimen@=\dp#1 \unvbox#1
426
\dimen@=\dp#1\relax \unvbox#1\relax
324
\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
427
\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
325
\ifr@ggedbottom \kern-\dimen@ \vfil \fi}
428
\ifr@ggedbottom \kern-\dimen@ \vfil \fi}
326
}
429
}
Lines 340-471 Link Here
340
% the input line (except we remove a trailing comment).  #1 should be a
443
% the input line (except we remove a trailing comment).  #1 should be a
341
% macro which expects an ordinary undelimited TeX argument.
444
% macro which expects an ordinary undelimited TeX argument.
342
%
445
%
343
\def\parsearg#1{%
446
\def\parsearg{\parseargusing{}}
344
  \let\next = #1%
447
\def\parseargusing#1#2{%
448
  \def\argtorun{#2}%
345
  \begingroup
449
  \begingroup
346
    \obeylines
450
    \obeylines
347
    \futurelet\temp\parseargx
451
    \spaceisspace
348
}
452
    #1%
349
453
    \parseargline\empty% Insert the \empty token, see \finishparsearg below.
350
% If the next token is an obeyed space (from an @example environment or
351
% the like), remove it and recurse.  Otherwise, we're done.
352
\def\parseargx{%
353
  % \obeyedspace is defined far below, after the definition of \sepspaces.
354
  \ifx\obeyedspace\temp
355
    \expandafter\parseargdiscardspace
356
  \else
357
    \expandafter\parseargline
358
  \fi
359
}
454
}
360
455
361
% Remove a single space (as the delimiter token to the macro call).
362
{\obeyspaces %
363
 \gdef\parseargdiscardspace {\futurelet\temp\parseargx}}
364
365
{\obeylines %
456
{\obeylines %
366
  \gdef\parseargline#1^^M{%
457
  \gdef\parseargline#1^^M{%
367
    \endgroup % End of the group started in \parsearg.
458
    \endgroup % End of the group started in \parsearg.
368
    %
459
    \argremovecomment #1\comment\ArgTerm%
369
    % First remove any @c comment, then any @comment.
370
    % Result of each macro is put in \toks0.
371
    \argremovec #1\c\relax %
372
    \expandafter\argremovecomment \the\toks0 \comment\relax %
373
    %
374
    % Call the caller's macro, saved as \next in \parsearg.
375
    \expandafter\next\expandafter{\the\toks0}%
376
  }%
460
  }%
377
}
461
}
378
462
379
% Since all \c{,omment} does is throw away the argument, we can let TeX
463
% First remove any @comment, then any @c comment.
380
% do that for us.  The \relax here is matched by the \relax in the call
464
\def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm}
381
% in \parseargline; it could be more or less anything, its purpose is
465
\def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm}
382
% just to delimit the argument to the \c.
383
\def\argremovec#1\c#2\relax{\toks0 = {#1}}
384
\def\argremovecomment#1\comment#2\relax{\toks0 = {#1}}
385
466
386
% \argremovec{,omment} might leave us with trailing spaces, though; e.g.,
467
% Each occurrence of `\^^M' or `<space>\^^M' is replaced by a single space.
468
%
469
% \argremovec might leave us with trailing space, e.g.,
387
%    @end itemize  @c foo
470
%    @end itemize  @c foo
388
% will have two active spaces as part of the argument with the
471
% This space token undergoes the same procedure and is eventually removed
389
% `itemize'.  Here we remove all active spaces from #1, and assign the
472
% by \finishparsearg.
390
% result to \toks0.
391
%
392
% This loses if there are any *other* active characters besides spaces
393
% in the argument -- _ ^ +, for example -- since they get expanded.
394
% Fortunately, Texinfo does not define any such commands.  (If it ever
395
% does, the catcode of the characters in questionwill have to be changed
396
% here.)  But this means we cannot call \removeactivespaces as part of
397
% \argremovec{,omment}, since @c uses \parsearg, and thus the argument
398
% that \parsearg gets might well have any character at all in it.
399
%
473
%
400
\def\removeactivespaces#1{%
474
\def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M}
401
  \begingroup
475
\def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M}
402
    \ignoreactivespaces
476
\def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{%
403
    \edef\temp{#1}%
477
  \def\temp{#3}%
404
    \global\toks0 = \expandafter{\temp}%
478
  \ifx\temp\empty
405
  \endgroup
479
    % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp:
480
    \let\temp\finishparsearg
481
  \else
482
    \let\temp\argcheckspaces
483
  \fi
484
  % Put the space token in:
485
  \temp#1 #3\ArgTerm
406
}
486
}
407
487
408
% Change the active space to expand to nothing.
488
% If a _delimited_ argument is enclosed in braces, they get stripped; so
489
% to get _exactly_ the rest of the line, we had to prevent such situation.
490
% We prepended an \empty token at the very beginning and we expand it now,
491
% just before passing the control to \argtorun.
492
% (Similarly, we have to think about #3 of \argcheckspacesY above: it is
493
% either the null string, or it ends with \^^M---thus there is no danger
494
% that a pair of braces would be stripped.
409
%
495
%
410
\begingroup
496
% But first, we have to remove the trailing space token.
411
  \obeyspaces
497
%
412
  \gdef\ignoreactivespaces{\obeyspaces\let =\empty}
498
\def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}}
413
\endgroup
414
499
500
% \parseargdef\foo{...}
501
%	is roughly equivalent to
502
% \def\foo{\parsearg\Xfoo}
503
% \def\Xfoo#1{...}
504
%
505
% Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my
506
% favourite TeX trick.  --kasal, 16nov03
415
507
416
\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
508
\def\parseargdef#1{%
509
  \expandafter \doparseargdef \csname\string#1\endcsname #1%
510
}
511
\def\doparseargdef#1#2{%
512
  \def#2{\parsearg#1}%
513
  \def#1##1%
514
}
417
515
418
%% These are used to keep @begin/@end levels from running away
516
% Several utility definitions with active space:
419
%% Call \inENV within environments (after a \begingroup)
517
{
420
\newif\ifENV \ENVfalse \def\inENV{\ifENV\relax\else\ENVtrue\fi}
518
  \obeyspaces
421
\def\ENVcheck{%
519
  \gdef\obeyedspace{ }
422
\ifENV\errmessage{Still within an environment; press RETURN to continue}
423
\endgroup\fi} % This is not perfect, but it should reduce lossage
424
520
425
% @begin foo  is the same as @foo, for now.
521
  % Make each space character in the input produce a normal interword
426
\newhelp\EMsimple{Press RETURN to continue.}
522
  % space in the output.  Don't allow a line break at this space, as this
523
  % is used only in environments like @example, where each line of input
524
  % should produce a line of output anyway.
525
  %
526
  \gdef\sepspaces{\obeyspaces\let =\tie}
527
528
  % If an index command is used in an @example environment, any spaces
529
  % therein should become regular spaces in the raw index file, not the
530
  % expansion of \tie (\leavevmode \penalty \@M \ ).
531
  \gdef\unsepspaces{\let =\space}
532
}
427
533
428
\outer\def\begin{\parsearg\beginxxx}
429
534
430
\def\beginxxx #1{%
535
\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
431
\expandafter\ifx\csname #1\endcsname\relax
432
{\errhelp=\EMsimple \errmessage{Undefined command @begin #1}}\else
433
\csname #1\endcsname\fi}
434
536
435
% @end foo executes the definition of \Efoo.
537
% Define the framework for environments in texinfo.tex.  It's used like this:
436
%
538
%
437
\def\end{\parsearg\endxxx}
539
%   \envdef\foo{...}
438
\def\endxxx #1{%
540
%   \def\Efoo{...}
439
  \removeactivespaces{#1}%
541
%
440
  \edef\endthing{\the\toks0}%
542
% It's the responsibility of \envdef to insert \begingroup before the
441
  %
543
% actual body; @end closes the group after calling \Efoo.  \envdef also
442
  \expandafter\ifx\csname E\endthing\endcsname\relax
544
% defines \thisenv, so the current environment is known; @end checks
443
    \expandafter\ifx\csname \endthing\endcsname\relax
545
% whether the environment name matches.  The \checkenv macro can also be
444
      % There's no \foo, i.e., no ``environment'' foo.
546
% used to check whether the current environment is the one expected.
445
      \errhelp = \EMsimple
547
%
446
      \errmessage{Undefined command `@end \endthing'}%
548
% Non-false conditionals (@iftex, @ifset) don't fit into this, so they
447
    \else
549
% are not treated as environments; they don't open a group.  (The
448
      \unmatchedenderror\endthing
550
% implementation of @end takes care not to call \endgroup in this
449
    \fi
551
% special case.)
552
553
554
% At run-time, environments start with this:
555
\def\startenvironment#1{\begingroup\def\thisenv{#1}}
556
% initialize
557
\let\thisenv\empty
558
559
% ... but they get defined via ``\envdef\foo{...}'':
560
\long\def\envdef#1#2{\def#1{\startenvironment#1#2}}
561
\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}}
562
563
% Check whether we're in the right environment:
564
\def\checkenv#1{%
565
  \def\temp{#1}%
566
  \ifx\thisenv\temp
450
  \else
567
  \else
451
    % Everything's ok; the right environment has been started.
568
    \badenverr
452
    \csname E\endthing\endcsname
453
  \fi
569
  \fi
454
}
570
}
455
571
456
% There is an environment #1, but it hasn't been started.  Give an error.
572
% Environment mismatch, #1 expected:
457
%
573
\def\badenverr{%
458
\def\unmatchedenderror#1{%
459
  \errhelp = \EMsimple
574
  \errhelp = \EMsimple
460
  \errmessage{This `@end #1' doesn't have a matching `@#1'}%
575
  \errmessage{This command can appear only \inenvironment\temp,
576
    not \inenvironment\thisenv}%
577
}
578
\def\inenvironment#1{%
579
  \ifx#1\empty
580
    out of any environment%
581
  \else
582
    in environment \expandafter\string#1%
583
  \fi
461
}
584
}
462
585
463
% Define the control sequence \E#1 to give an unmatched @end error.
586
% @end foo executes the definition of \Efoo.
587
% But first, it executes a specialized version of \checkenv
464
%
588
%
465
\def\defineunmatchedend#1{%
589
\parseargdef\end{%
466
  \expandafter\def\csname E#1\endcsname{\unmatchedenderror{#1}}%
590
  \if 1\csname iscond.#1\endcsname
591
  \else
592
    % The general wording of \badenverr may not be ideal, but... --kasal, 06nov03
593
    \expandafter\checkenv\csname#1\endcsname
594
    \csname E#1\endcsname
595
    \endgroup
596
  \fi
467
}
597
}
468
598
599
\newhelp\EMsimple{Press RETURN to continue.}
600
469
601
470
%% Simple single-character @ commands
602
%% Simple single-character @ commands
471
603
Lines 487-493 Link Here
487
\let\}=\myrbrace
619
\let\}=\myrbrace
488
\begingroup
620
\begingroup
489
  % Definitions to produce \{ and \} commands for indices,
621
  % Definitions to produce \{ and \} commands for indices,
490
  % and @{ and @} for the aux file.
622
  % and @{ and @} for the aux/toc files.
491
  \catcode`\{ = \other \catcode`\} = \other
623
  \catcode`\{ = \other \catcode`\} = \other
492
  \catcode`\[ = 1 \catcode`\] = 2
624
  \catcode`\[ = 1 \catcode`\] = 2
493
  \catcode`\! = 0 \catcode`\\ = \other
625
  \catcode`\! = 0 \catcode`\\ = \other
Lines 497-502 Link Here
497
  !gdef!rbraceatcmd[@}]%
629
  !gdef!rbraceatcmd[@}]%
498
!endgroup
630
!endgroup
499
631
632
% @comma{} to avoid , parsing problems.
633
\let\comma = ,
634
500
% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
635
% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
501
% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
636
% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
502
\let\, = \c
637
\let\, = \c
Lines 506-527 Link Here
506
\let\ubaraccent = \b
641
\let\ubaraccent = \b
507
\let\udotaccent = \d
642
\let\udotaccent = \d
508
643
509
% Other special characters: @questiondown @exclamdown
644
% Other special characters: @questiondown @exclamdown @ordf @ordm
510
% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
645
% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
511
\def\questiondown{?`}
646
\def\questiondown{?`}
512
\def\exclamdown{!`}
647
\def\exclamdown{!`}
648
\def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}}
649
\def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}}
513
650
514
% Dotless i and dotless j, used for accents.
651
% Dotless i and dotless j, used for accents.
515
\def\imacro{i}
652
\def\imacro{i}
516
\def\jmacro{j}
653
\def\jmacro{j}
517
\def\dotless#1{%
654
\def\dotless#1{%
518
  \def\temp{#1}%
655
  \def\temp{#1}%
519
  \ifx\temp\imacro \ptexi
656
  \ifx\temp\imacro \ifmmode\imath \else\ptexi \fi
520
  \else\ifx\temp\jmacro \j
657
  \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi
521
  \else \errmessage{@dotless can be used only with i or j}%
658
  \else \errmessage{@dotless can be used only with i or j}%
522
  \fi\fi
659
  \fi\fi
523
}
660
}
524
661
662
% The \TeX{} logo, as in plain, but resetting the spacing so that a
663
% period following counts as ending a sentence.  (Idea found in latex.)
664
%
665
\edef\TeX{\TeX \spacefactor=1000 }
666
667
% @LaTeX{} logo.  Not quite the same results as the definition in
668
% latex.ltx, since we use a different font for the raised A; it's most
669
% convenient for us to use an explicitly smaller font, rather than using
670
% the \scriptstyle font (since we don't reset \scriptstyle and
671
% \scriptscriptstyle).
672
%
673
\def\LaTeX{%
674
  L\kern-.36em
675
  {\setbox0=\hbox{T}%
676
   \vbox to \ht0{\hbox{\selectfonts\lllsize A}\vss}}%
677
  \kern-.15em
678
  \TeX
679
}
680
525
% Be sure we're in horizontal mode when doing a tie, since we make space
681
% Be sure we're in horizontal mode when doing a tie, since we make space
526
% equivalent to this in @example-like environments. Otherwise, a space
682
% equivalent to this in @example-like environments. Otherwise, a space
527
% at the beginning of a line will start with \penalty -- and
683
% at the beginning of a line will start with \penalty -- and
Lines 544-556 Link Here
544
\let\/=\allowbreak
700
\let\/=\allowbreak
545
701
546
% @. is an end-of-sentence period.
702
% @. is an end-of-sentence period.
547
\def\.{.\spacefactor=3000 }
703
\def\.{.\spacefactor=\endofsentencespacefactor\space}
548
704
549
% @! is an end-of-sentence bang.
705
% @! is an end-of-sentence bang.
550
\def\!{!\spacefactor=3000 }
706
\def\!{!\spacefactor=\endofsentencespacefactor\space}
551
707
552
% @? is an end-of-sentence query.
708
% @? is an end-of-sentence query.
553
\def\?{?\spacefactor=3000 }
709
\def\?{?\spacefactor=\endofsentencespacefactor\space}
710
711
% @frenchspacing on|off  says whether to put extra space after punctuation.
712
%
713
\def\onword{on}
714
\def\offword{off}
715
%
716
\parseargdef\frenchspacing{%
717
  \def\temp{#1}%
718
  \ifx\temp\onword \plainfrenchspacing
719
  \else\ifx\temp\offword \plainnonfrenchspacing
720
  \else
721
    \errhelp = \EMsimple
722
    \errmessage{Unknown @frenchspacing option `\temp', must be on/off}%
723
  \fi\fi
724
}
554
725
555
% @w prevents a word break.  Without the \leavevmode, @w at the
726
% @w prevents a word break.  Without the \leavevmode, @w at the
556
% beginning of a paragraph, when TeX is still in vertical mode, would
727
% beginning of a paragraph, when TeX is still in vertical mode, would
Lines 575-633 Link Here
575
\newbox\groupbox
746
\newbox\groupbox
576
\def\vfilllimit{0.7}
747
\def\vfilllimit{0.7}
577
%
748
%
578
\def\group{\begingroup
749
\envdef\group{%
579
  \ifnum\catcode13=\active \else
750
  \ifnum\catcode`\^^M=\active \else
580
    \errhelp = \groupinvalidhelp
751
    \errhelp = \groupinvalidhelp
581
    \errmessage{@group invalid in context where filling is enabled}%
752
    \errmessage{@group invalid in context where filling is enabled}%
582
  \fi
753
  \fi
583
  %
754
  \startsavinginserts
584
  % The \vtop we start below produces a box with normal height and large
585
  % depth; thus, TeX puts \baselineskip glue before it, and (when the
586
  % next line of text is done) \lineskip glue after it.  (See p.82 of
587
  % the TeXbook.)  Thus, space below is not quite equal to space
588
  % above.  But it's pretty close.
589
  \def\Egroup{%
590
    \egroup           % End the \vtop.
591
    % \dimen0 is the vertical size of the group's box.
592
    \dimen0 = \ht\groupbox  \advance\dimen0 by \dp\groupbox
593
    % \dimen2 is how much space is left on the page (more or less).
594
    \dimen2 = \pageheight   \advance\dimen2 by -\pagetotal
595
    % if the group doesn't fit on the current page, and it's a big big
596
    % group, force a page break.
597
    \ifdim \dimen0 > \dimen2
598
      \ifdim \pagetotal < \vfilllimit\pageheight
599
        \page
600
      \fi
601
    \fi
602
    \copy\groupbox
603
    \endgroup         % End the \group.
604
  }%
605
  %
755
  %
606
  \setbox\groupbox = \vtop\bgroup
756
  \setbox\groupbox = \vtop\bgroup
607
    % We have to put a strut on the last line in case the @group is in
608
    % the midst of an example, rather than completely enclosing it.
609
    % Otherwise, the interline space between the last line of the group
610
    % and the first line afterwards is too small.  But we can't put the
611
    % strut in \Egroup, since there it would be on a line by itself.
612
    % Hence this just inserts a strut at the beginning of each line.
613
    \everypar = {\strut}%
614
    %
615
    % Since we have a strut on every line, we don't need any of TeX's
616
    % normal interline spacing.
617
    \offinterlineskip
618
    %
619
    % OK, but now we have to do something about blank
620
    % lines in the input in @example-like environments, which normally
621
    % just turn into \lisppar, which will insert no space now that we've
622
    % turned off the interline space.  Simplest is to make them be an
623
    % empty paragraph.
624
    \ifx\par\lisppar
625
      \edef\par{\leavevmode \par}%
626
      %
627
      % Reset ^^M's definition to new definition of \par.
628
      \obeylines
629
    \fi
630
    %
631
    % Do @comment since we are called inside an environment such as
757
    % Do @comment since we are called inside an environment such as
632
    % @example, where each end-of-line in the input causes an
758
    % @example, where each end-of-line in the input causes an
633
    % end-of-line in the output.  We don't want the end-of-line after
759
    % end-of-line in the output.  We don't want the end-of-line after
Lines 637-642 Link Here
637
    \comment
763
    \comment
638
}
764
}
639
%
765
%
766
% The \vtop produces a box with normal height and large depth; thus, TeX puts
767
% \baselineskip glue before it, and (when the next line of text is done)
768
% \lineskip glue after it.  Thus, space below is not quite equal to space
769
% above.  But it's pretty close.
770
\def\Egroup{%
771
    % To get correct interline space between the last line of the group
772
    % and the first line afterwards, we have to propagate \prevdepth.
773
    \endgraf % Not \par, as it may have been set to \lisppar.
774
    \global\dimen1 = \prevdepth
775
  \egroup           % End the \vtop.
776
  % \dimen0 is the vertical size of the group's box.
777
  \dimen0 = \ht\groupbox  \advance\dimen0 by \dp\groupbox
778
  % \dimen2 is how much space is left on the page (more or less).
779
  \dimen2 = \pageheight   \advance\dimen2 by -\pagetotal
780
  % if the group doesn't fit on the current page, and it's a big big
781
  % group, force a page break.
782
  \ifdim \dimen0 > \dimen2
783
    \ifdim \pagetotal < \vfilllimit\pageheight
784
      \page
785
    \fi
786
  \fi
787
  \box\groupbox
788
  \prevdepth = \dimen1
789
  \checkinserts
790
}
791
%
640
% TeX puts in an \escapechar (i.e., `@') at the beginning of the help
792
% TeX puts in an \escapechar (i.e., `@') at the beginning of the help
641
% message, so this ends up printing `@group can only ...'.
793
% message, so this ends up printing `@group can only ...'.
642
%
794
%
Lines 649-658 Link Here
649
801
650
\newdimen\mil  \mil=0.001in
802
\newdimen\mil  \mil=0.001in
651
803
652
\def\need{\parsearg\needx}
653
654
% Old definition--didn't work.
804
% Old definition--didn't work.
655
%\def\needx #1{\par %
805
%\parseargdef\need{\par %
656
%% This method tries to make TeX break the page naturally
806
%% This method tries to make TeX break the page naturally
657
%% if the depth of the box does not fit.
807
%% if the depth of the box does not fit.
658
%{\baselineskip=0pt%
808
%{\baselineskip=0pt%
Lines 660-666 Link Here
660
%\prevdepth=-1000pt
810
%\prevdepth=-1000pt
661
%}}
811
%}}
662
812
663
\def\needx#1{%
813
\parseargdef\need{%
664
  % Ensure vertical mode, so we don't make a big box in the middle of a
814
  % Ensure vertical mode, so we don't make a big box in the middle of a
665
  % paragraph.
815
  % paragraph.
666
  \par
816
  \par
Lines 699-733 Link Here
699
  \fi
849
  \fi
700
}
850
}
701
851
702
% @br   forces paragraph break
852
% @br   forces paragraph break (and is undocumented).
703
853
704
\let\br = \par
854
\let\br = \par
705
855
706
% @dots{} output an ellipsis using the current font.
707
% We do .5em per period so that it has the same spacing in a typewriter
708
% font as three actual period characters.
709
%
710
\def\dots{%
711
  \leavevmode
712
  \hbox to 1.5em{%
713
    \hskip 0pt plus 0.25fil minus 0.25fil
714
    .\hss.\hss.%
715
    \hskip 0pt plus 0.5fil minus 0.5fil
716
  }%
717
}
718
719
% @enddots{} is an end-of-sentence ellipsis.
720
%
721
\def\enddots{%
722
  \leavevmode
723
  \hbox to 2em{%
724
    \hskip 0pt plus 0.25fil minus 0.25fil
725
    .\hss.\hss.\hss.%
726
    \hskip 0pt plus 0.5fil minus 0.5fil
727
  }%
728
  \spacefactor=3000
729
}
730
731
% @page forces the start of a new page.
856
% @page forces the start of a new page.
732
%
857
%
733
\def\page{\par\vfill\supereject}
858
\def\page{\par\vfill\supereject}
Lines 740-752 Link Here
740
\newskip\exdentamount
865
\newskip\exdentamount
741
866
742
% This defn is used inside fill environments such as @defun.
867
% This defn is used inside fill environments such as @defun.
743
\def\exdent{\parsearg\exdentyyy}
868
\parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}
744
\def\exdentyyy #1{{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}}
745
869
746
% This defn is used inside nofill environments such as @example.
870
% This defn is used inside nofill environments such as @example.
747
\def\nofillexdent{\parsearg\nofillexdentyyy}
871
\parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount
748
\def\nofillexdentyyy #1{{\advance \leftskip by -\exdentamount
872
  \leftline{\hskip\leftskip{\rm#1}}}}
749
\leftline{\hskip\leftskip{\rm#1}}}}
750
873
751
% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
874
% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
752
% paragraph.  For more general purposes, use the \margin insertion
875
% paragraph.  For more general purposes, use the \margin insertion
Lines 797-805 Link Here
797
  \temp
920
  \temp
798
}
921
}
799
922
800
% @include file    insert text of that file as input.
923
% @include FILE -- \input text of FILE.
801
% Allow normal characters that  we make active in the argument (a file name).
924
%
802
\def\include{\begingroup
925
\def\include{\parseargusing\filenamecatcodes\includezzz}
926
\def\includezzz#1{%
927
  \pushthisfilestack
928
  \def\thisfile{#1}%
929
  {%
930
    \makevalueexpandable  % we want to expand any @value in FILE.
931
    \turnoffactive        % and allow special characters in the expansion
932
    \indexnofonts         % Allow `@@' and other weird things in file names.
933
    \edef\temp{\noexpand\input #1 }%
934
    %
935
    % This trickery is to read FILE outside of a group, in case it makes
936
    % definitions, etc.
937
    \expandafter
938
  }\temp
939
  \popthisfilestack
940
}
941
\def\filenamecatcodes{%
803
  \catcode`\\=\other
942
  \catcode`\\=\other
804
  \catcode`~=\other
943
  \catcode`~=\other
805
  \catcode`^=\other
944
  \catcode`^=\other
Lines 808-840 Link Here
808
  \catcode`<=\other
947
  \catcode`<=\other
809
  \catcode`>=\other
948
  \catcode`>=\other
810
  \catcode`+=\other
949
  \catcode`+=\other
811
  \parsearg\includezzz}
950
  \catcode`-=\other
812
% Restore active chars for included file.
951
  \catcode`\`=\other
813
\def\includezzz#1{\endgroup\begingroup
952
  \catcode`\'=\other
814
  % Read the included file in a group so nested @include's work.
953
}
815
  \def\thisfile{#1}%
954
816
  \let\value=\expandablevalue
955
\def\pushthisfilestack{%
817
  \input\thisfile
956
  \expandafter\pushthisfilestackX\popthisfilestack\StackTerm
818
\endgroup}
957
}
958
\def\pushthisfilestackX{%
959
  \expandafter\pushthisfilestackY\thisfile\StackTerm
960
}
961
\def\pushthisfilestackY #1\StackTerm #2\StackTerm {%
962
  \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}%
963
}
964
965
\def\popthisfilestack{\errthisfilestackempty}
966
\def\errthisfilestackempty{\errmessage{Internal error:
967
  the stack of filenames is empty.}}
819
968
820
\def\thisfile{}
969
\def\thisfile{}
821
970
822
% @center line
971
% @center line
823
% outputs that line, centered.
972
% outputs that line, centered.
824
%
973
%
825
\def\center{\parsearg\docenter}
974
\parseargdef\center{%
826
\def\docenter#1{{%
975
  \ifhmode
827
  \ifhmode \hfil\break \fi
976
    \let\next\centerH
828
  \advance\hsize by -\leftskip
977
  \else
829
  \advance\hsize by -\rightskip
978
    \let\next\centerV
830
  \line{\hfil \ignorespaces#1\unskip \hfil}%
979
  \fi
831
  \ifhmode \break \fi
980
  \next{\hfil \ignorespaces#1\unskip \hfil}%
832
}}
981
}
982
\def\centerH#1{%
983
  {%
984
    \hfil\break
985
    \advance\hsize by -\leftskip
986
    \advance\hsize by -\rightskip
987
    \line{#1}%
988
    \break
989
  }%
990
}
991
\def\centerV#1{\line{\kern\leftskip #1\kern\rightskip}}
833
992
834
% @sp n   outputs n lines of vertical space
993
% @sp n   outputs n lines of vertical space
835
994
836
\def\sp{\parsearg\spxxx}
995
\parseargdef\sp{\vskip #1\baselineskip}
837
\def\spxxx #1{\vskip #1\baselineskip}
838
996
839
% @comment ...line which is ignored...
997
% @comment ...line which is ignored...
840
% @c is the same as @comment
998
% @c is the same as @comment
Lines 855-862 Link Here
855
\def\asisword{asis} % no translation, these are keywords
1013
\def\asisword{asis} % no translation, these are keywords
856
\def\noneword{none}
1014
\def\noneword{none}
857
%
1015
%
858
\def\paragraphindent{\parsearg\doparagraphindent}
1016
\parseargdef\paragraphindent{%
859
\def\doparagraphindent#1{%
860
  \def\temp{#1}%
1017
  \def\temp{#1}%
861
  \ifx\temp\asisword
1018
  \ifx\temp\asisword
862
  \else
1019
  \else
Lines 873-880 Link Here
873
% We'll use ems for NCHARS like @paragraphindent.
1030
% We'll use ems for NCHARS like @paragraphindent.
874
% It seems @exampleindent asis isn't necessary, but
1031
% It seems @exampleindent asis isn't necessary, but
875
% I preserve it to make it similar to @paragraphindent.
1032
% I preserve it to make it similar to @paragraphindent.
876
\def\exampleindent{\parsearg\doexampleindent}
1033
\parseargdef\exampleindent{%
877
\def\doexampleindent#1{%
878
  \def\temp{#1}%
1034
  \def\temp{#1}%
879
  \ifx\temp\asisword
1035
  \ifx\temp\asisword
880
  \else
1036
  \else
Lines 897-908 Link Here
897
% By default, we suppress indentation.
1053
% By default, we suppress indentation.
898
%
1054
%
899
\def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent}
1055
\def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent}
900
\newdimen\currentparindent
901
%
902
\def\insertword{insert}
1056
\def\insertword{insert}
903
%
1057
%
904
\def\firstparagraphindent{\parsearg\dofirstparagraphindent}
1058
\parseargdef\firstparagraphindent{%
905
\def\dofirstparagraphindent#1{%
906
  \def\temp{#1}%
1059
  \def\temp{#1}%
907
  \ifx\temp\noneword
1060
  \ifx\temp\noneword
908
    \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent
1061
    \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent
Lines 947-969 Link Here
947
\def\asis#1{#1}
1100
\def\asis#1{#1}
948
1101
949
% @math outputs its argument in math mode.
1102
% @math outputs its argument in math mode.
950
% We don't use $'s directly in the definition of \math because we need
951
% to set catcodes according to plain TeX first, to allow for subscripts,
952
% superscripts, special math chars, etc.
953
%
954
\let\implicitmath = $%$ font-lock fix
955
%
1103
%
956
% One complication: _ usually means subscripts, but it could also mean
1104
% One complication: _ usually means subscripts, but it could also mean
957
% an actual _ character, as in @math{@var{some_variable} + 1}.  So make
1105
% an actual _ character, as in @math{@var{some_variable} + 1}.  So make
958
% _ within @math be active (mathcode "8000), and distinguish by seeing
1106
% _ active, and distinguish by seeing if the current family is \slfam,
959
% if the current family is \slfam, which is what @var uses.
1107
% which is what @var uses.
960
%
1108
{
961
{\catcode\underChar = \active
1109
  \catcode`\_ = \active
962
\gdef\mathunderscore{%
1110
  \gdef\mathunderscore{%
963
  \catcode\underChar=\active
1111
    \catcode`\_=\active
964
  \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
1112
    \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
965
}}
1113
  }
966
%
1114
}
967
% Another complication: we want \\ (and @\) to output a \ character.
1115
% Another complication: we want \\ (and @\) to output a \ character.
968
% FYI, plain.tex uses \\ as a temporary control sequence (why?), but
1116
% FYI, plain.tex uses \\ as a temporary control sequence (why?), but
969
% this is not advertised and we don't care.  Texinfo does not
1117
% this is not advertised and we don't care.  Texinfo does not
Lines 974-1005 Link Here
974
%
1122
%
975
\def\math{%
1123
\def\math{%
976
  \tex
1124
  \tex
977
  \mathcode`\_="8000 \mathunderscore
1125
  \mathunderscore
978
  \let\\ = \mathbackslash
1126
  \let\\ = \mathbackslash
979
  \mathactive
1127
  \mathactive
980
  \implicitmath\finishmath}
1128
  % make the texinfo accent commands work in math mode
981
\def\finishmath#1{#1\implicitmath\Etex}
1129
  \let\"=\ddot
1130
  \let\'=\acute
1131
  \let\==\bar
1132
  \let\^=\hat
1133
  \let\`=\grave
1134
  \let\u=\breve
1135
  \let\v=\check
1136
  \let\~=\tilde
1137
  \let\dotaccent=\dot
1138
  $\finishmath
1139
}
1140
\def\finishmath#1{#1$\endgroup}  % Close the group opened by \tex.
982
1141
983
% Some active characters (such as <) are spaced differently in math.
1142
% Some active characters (such as <) are spaced differently in math.
984
% We have to reset their definitions in case the @math was an
1143
% We have to reset their definitions in case the @math was an argument
985
% argument to a command which set the catcodes (such as @item or @section).
1144
% to a command which sets the catcodes (such as @item or @section).
986
%
1145
%
987
{
1146
{
988
  \catcode`^ = \active
1147
  \catcode`^ = \active
989
  \catcode`< = \active
1148
  \catcode`< = \active
990
  \catcode`> = \active
1149
  \catcode`> = \active
991
  \catcode`+ = \active
1150
  \catcode`+ = \active
1151
  \catcode`' = \active
992
  \gdef\mathactive{%
1152
  \gdef\mathactive{%
993
    \let^ = \ptexhat
1153
    \let^ = \ptexhat
994
    \let< = \ptexless
1154
    \let< = \ptexless
995
    \let> = \ptexgtr
1155
    \let> = \ptexgtr
996
    \let+ = \ptexplus
1156
    \let+ = \ptexplus
1157
    \let' = \ptexquoteright
997
  }
1158
  }
998
}
1159
}
999
1160
1000
% @bullet and @minus need the same treatment as @math, just above.
1161
% Some math mode symbols.
1001
\def\bullet{\implicitmath\ptexbullet\implicitmath}
1162
\def\bullet{$\ptexbullet$}
1002
\def\minus{\implicitmath-\implicitmath}
1163
\def\geq{\ifmmode \ge\else $\ge$\fi}
1164
\def\leq{\ifmmode \le\else $\le$\fi}
1165
\def\minus{\ifmmode -\else $-$\fi}
1166
1167
% @dots{} outputs an ellipsis using the current font.
1168
% We do .5em per period so that it has the same spacing in the cm
1169
% typewriter fonts as three actual period characters; on the other hand,
1170
% in other typewriter fonts three periods are wider than 1.5em.  So do
1171
% whichever is larger.
1172
%
1173
\def\dots{%
1174
  \leavevmode
1175
  \setbox0=\hbox{...}% get width of three periods
1176
  \ifdim\wd0 > 1.5em
1177
    \dimen0 = \wd0
1178
  \else
1179
    \dimen0 = 1.5em
1180
  \fi
1181
  \hbox to \dimen0{%
1182
    \hskip 0pt plus.25fil
1183
    .\hskip 0pt plus1fil
1184
    .\hskip 0pt plus1fil
1185
    .\hskip 0pt plus.5fil
1186
  }%
1187
}
1188
1189
% @enddots{} is an end-of-sentence ellipsis.
1190
%
1191
\def\enddots{%
1192
  \dots
1193
  \spacefactor=\endofsentencespacefactor
1194
}
1195
1196
% @comma{} is so commas can be inserted into text without messing up
1197
% Texinfo's parsing.
1198
%
1199
\let\comma = ,
1003
1200
1004
% @refill is a no-op.
1201
% @refill is a no-op.
1005
\let\refill=\relax
1202
\let\refill=\relax
Lines 1015-1034 Link Here
1015
% So open here the files we need to have open while reading the input.
1212
% So open here the files we need to have open while reading the input.
1016
% This makes it possible to make a .fmt file for texinfo.
1213
% This makes it possible to make a .fmt file for texinfo.
1017
\def\setfilename{%
1214
\def\setfilename{%
1215
   \fixbackslash  % Turn off hack to swallow `\input texinfo'.
1018
   \iflinks
1216
   \iflinks
1019
     \readauxfile
1217
     \tryauxfile
1218
     % Open the new aux file.  TeX will close it automatically at exit.
1219
     \immediate\openout\auxfile=\jobname.aux
1020
   \fi % \openindices needs to do some work in any case.
1220
   \fi % \openindices needs to do some work in any case.
1021
   \openindices
1221
   \openindices
1022
   \fixbackslash  % Turn off hack to swallow `\input texinfo'.
1222
   \let\setfilename=\comment % Ignore extra @setfilename cmds.
1023
   \global\let\setfilename=\comment % Ignore extra @setfilename cmds.
1024
   %
1223
   %
1025
   % If texinfo.cnf is present on the system, read it.
1224
   % If texinfo.cnf is present on the system, read it.
1026
   % Useful for site-wide @afourpaper, etc.
1225
   % Useful for site-wide @afourpaper, etc.
1027
   % Just to be on the safe side, close the input stream before the \input.
1028
   \openin 1 texinfo.cnf
1226
   \openin 1 texinfo.cnf
1029
   \ifeof1 \let\temp=\relax \else \def\temp{\input texinfo.cnf }\fi
1227
   \ifeof 1 \else \input texinfo.cnf \fi
1030
   \closein1
1228
   \closein 1
1031
   \temp
1032
   %
1229
   %
1033
   \comment % Ignore the actual filename.
1230
   \comment % Ignore the actual filename.
1034
}
1231
}
Lines 1064-1105 Link Here
1064
\newif\ifpdf
1261
\newif\ifpdf
1065
\newif\ifpdfmakepagedest
1262
\newif\ifpdfmakepagedest
1066
1263
1264
% when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1
1265
% can be set).  So we test for \relax and 0 as well as \undefined,
1266
% borrowed from ifpdf.sty.
1067
\ifx\pdfoutput\undefined
1267
\ifx\pdfoutput\undefined
1068
  \pdffalse
1069
  \let\pdfmkdest = \gobble
1070
  \let\pdfurl = \gobble
1071
  \let\endlink = \relax
1072
  \let\linkcolor = \relax
1073
  \let\pdfmakeoutlines = \relax
1074
\else
1268
\else
1075
  \pdftrue
1269
  \ifx\pdfoutput\relax
1076
  \pdfoutput = 1
1270
  \else
1077
  \input pdfcolor
1271
    \ifcase\pdfoutput
1078
  \pdfcatalog{/PageMode /UseOutlines}%
1272
    \else
1273
      \pdftrue
1274
    \fi
1275
  \fi
1276
\fi
1277
1278
% PDF uses PostScript string constants for the names of xref targets,
1279
% for display in the outlines, and in other places.  Thus, we have to
1280
% double any backslashes.  Otherwise, a name like "\node" will be
1281
% interpreted as a newline (\n), followed by o, d, e.  Not good.
1282
% http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html
1283
% (and related messages, the final outcome is that it is up to the TeX
1284
% user to double the backslashes and otherwise make the string valid, so
1285
% that's what we do).
1286
1287
% double active backslashes.
1288
%
1289
{\catcode`\@=0 \catcode`\\=\active
1290
 @gdef@activebackslashdouble{%
1291
   @catcode`@\=@active
1292
   @let\=@doublebackslash}
1293
}
1294
1295
% To handle parens, we must adopt a different approach, since parens are
1296
% not active characters.  hyperref.dtx (which has the same problem as
1297
% us) handles it with this amazing macro to replace tokens, with minor
1298
% changes for Texinfo.  It is included here under the GPL by permission
1299
% from the author, Heiko Oberdiek.
1300
%
1301
% #1 is the tokens to replace.
1302
% #2 is the replacement.
1303
% #3 is the control sequence with the string.
1304
%
1305
\def\HyPsdSubst#1#2#3{%
1306
  \def\HyPsdReplace##1#1##2\END{%
1307
    ##1%
1308
    \ifx\\##2\\%
1309
    \else
1310
      #2%
1311
      \HyReturnAfterFi{%
1312
        \HyPsdReplace##2\END
1313
      }%
1314
    \fi
1315
  }%
1316
  \xdef#3{\expandafter\HyPsdReplace#3#1\END}%
1317
}
1318
\long\def\HyReturnAfterFi#1\fi{\fi#1}
1319
1320
% #1 is a control sequence in which to do the replacements.
1321
\def\backslashparens#1{%
1322
  \xdef#1{#1}% redefine it as its expansion; the definition is simply
1323
             % \lastnode when called from \setref -> \pdfmkdest.
1324
  \HyPsdSubst{(}{\realbackslash(}{#1}%
1325
  \HyPsdSubst{)}{\realbackslash)}{#1}%
1326
}
1327
1328
\newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images
1329
with PDF output, and none of those formats could be found.  (.eps cannot
1330
be supported due to the design of the PDF format; use regular TeX (DVI
1331
output) for that.)}
1332
1333
\ifpdf
1334
  %
1335
  % Color manipulation macros based on pdfcolor.tex.
1336
  \def\cmykDarkRed{0.28 1 1 0.35}
1337
  \def\cmykBlack{0 0 0 1}
1338
  %
1339
  % k sets the color for filling (usual text, etc.);
1340
  % K sets the color for stroking (thin rules, e.g., normal _'s).
1341
  \def\pdfsetcolor#1{\pdfliteral{#1 k  #1 K}}
1342
  %
1343
  % Set color, and create a mark which defines \thiscolor accordingly,
1344
  % so that \makeheadline knows which color to restore.
1345
  \def\setcolor#1{%
1346
    \xdef\lastcolordefs{\gdef\noexpand\thiscolor{#1}}%
1347
    \domark
1348
    \pdfsetcolor{#1}%
1349
  }
1350
  %
1351
  \def\maincolor{\cmykBlack}
1352
  \pdfsetcolor{\maincolor}
1353
  \edef\thiscolor{\maincolor}
1354
  \def\lastcolordefs{}
1355
  %
1356
  \def\makefootline{%
1357
    \baselineskip24pt
1358
    \line{\pdfsetcolor{\maincolor}\the\footline}%
1359
  }
1360
  %
1361
  \def\makeheadline{%
1362
    \vbox to 0pt{%
1363
      \vskip-22.5pt
1364
      \line{%
1365
        \vbox to8.5pt{}%
1366
        % Extract \thiscolor definition from the marks.
1367
        \getcolormarks
1368
        % Typeset the headline with \maincolor, then restore the color.
1369
        \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}%
1370
      }%
1371
      \vss
1372
    }%
1373
    \nointerlineskip
1374
  }
1375
  %
1376
  %
1377
  \pdfcatalog{/PageMode /UseOutlines}
1378
  %
1379
  % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto).
1079
  \def\dopdfimage#1#2#3{%
1380
  \def\dopdfimage#1#2#3{%
1080
    \def\imagewidth{#2}%
1381
    \def\imagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}%
1081
    \def\imageheight{#3}%
1382
    \def\imageheight{#3}\setbox2 = \hbox{\ignorespaces #3}%
1082
    % without \immediate, pdftex seg faults when the same image is
1383
    %
1384
    % pdftex (and the PDF format) support .png, .jpg, .pdf (among
1385
    % others).  Let's try in that order.
1386
    \let\pdfimgext=\empty
1387
    \begingroup
1388
      \openin 1 #1.png \ifeof 1
1389
        \openin 1 #1.jpg \ifeof 1
1390
          \openin 1 #1.jpeg \ifeof 1
1391
            \openin 1 #1.JPG \ifeof 1
1392
              \openin 1 #1.pdf \ifeof 1
1393
                \openin 1 #1.PDF \ifeof 1
1394
                  \errhelp = \nopdfimagehelp
1395
                  \errmessage{Could not find image file #1 for pdf}%
1396
                \else \gdef\pdfimgext{PDF}%
1397
                \fi
1398
              \else \gdef\pdfimgext{pdf}%
1399
              \fi
1400
            \else \gdef\pdfimgext{JPG}%
1401
            \fi
1402
          \else \gdef\pdfimgext{jpeg}%
1403
          \fi
1404
        \else \gdef\pdfimgext{jpg}%
1405
        \fi
1406
      \else \gdef\pdfimgext{png}%
1407
      \fi
1408
      \closein 1
1409
    \endgroup
1410
    %
1411
    % without \immediate, ancient pdftex seg faults when the same image is
1083
    % included twice.  (Version 3.14159-pre-1.0-unofficial-20010704.)
1412
    % included twice.  (Version 3.14159-pre-1.0-unofficial-20010704.)
1084
    \ifnum\pdftexversion < 14
1413
    \ifnum\pdftexversion < 14
1085
      \immediate\pdfimage
1414
      \immediate\pdfimage
1086
    \else
1415
    \else
1087
      \immediate\pdfximage
1416
      \immediate\pdfximage
1088
    \fi
1417
    \fi
1089
      \ifx\empty\imagewidth\else width \imagewidth \fi
1418
      \ifdim \wd0 >0pt width \imagewidth \fi
1090
      \ifx\empty\imageheight\else height \imageheight \fi
1419
      \ifdim \wd2 >0pt height \imageheight \fi
1091
      \ifnum\pdftexversion<13
1420
      \ifnum\pdftexversion<13
1092
         #1.pdf%
1421
         #1.\pdfimgext
1093
       \else
1422
       \else
1094
         {#1.pdf}%
1423
         {#1.\pdfimgext}%
1095
       \fi
1424
       \fi
1096
    \ifnum\pdftexversion < 14 \else
1425
    \ifnum\pdftexversion < 14 \else
1097
      \pdfrefximage \pdflastximage
1426
      \pdfrefximage \pdflastximage
1098
    \fi}
1427
    \fi}
1099
  \def\pdfmkdest#1{{\normalturnoffactive \pdfdest name{#1} xyz}}
1428
  %
1429
  \def\pdfmkdest#1{{%
1430
    % We have to set dummies so commands such as @code, and characters
1431
    % such as \, aren't expanded when present in a section title.
1432
    \indexnofonts
1433
    \turnoffactive
1434
    \activebackslashdouble
1435
    \makevalueexpandable
1436
    \def\pdfdestname{#1}%
1437
    \backslashparens\pdfdestname
1438
    \safewhatsit{\pdfdest name{\pdfdestname} xyz}%
1439
  }}
1440
  %
1441
  % used to mark target names; must be expandable.
1100
  \def\pdfmkpgn#1{#1}
1442
  \def\pdfmkpgn#1{#1}
1101
  \let\linkcolor = \Blue  % was Cyan, but that seems light?
1443
  %
1102
  \def\endlink{\Black\pdfendlink}
1444
  % by default, use a color that is dark enough to print on paper as
1445
  % nearly black, but still distinguishable for online viewing.
1446
  \def\urlcolor{\cmykDarkRed}
1447
  \def\linkcolor{\cmykDarkRed}
1448
  \def\endlink{\setcolor{\maincolor}\pdfendlink}
1449
  %
1103
  % Adding outlines to PDF; macros for calculating structure of outlines
1450
  % Adding outlines to PDF; macros for calculating structure of outlines
1104
  % come from Petr Olsak
1451
  % come from Petr Olsak
1105
  \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
1452
  \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
Lines 1108-1146 Link Here
1108
    \advance\tempnum by 1
1455
    \advance\tempnum by 1
1109
    \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
1456
    \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
1110
  %
1457
  %
1111
  % #1 is the section text.  #2 is the pdf expression for the number
1458
  % #1 is the section text, which is what will be displayed in the
1112
  % of subentries (or empty, for subsubsections).  #3 is the node
1459
  % outline by the pdf viewer.  #2 is the pdf expression for the number
1113
  % text, which might be empty if this toc entry had no
1460
  % of subentries (or empty, for subsubsections).  #3 is the node text,
1114
  % corresponding node.  #4 is the page number.
1461
  % which might be empty if this toc entry had no corresponding node.
1115
  % 
1462
  % #4 is the page number
1463
  %
1116
  \def\dopdfoutline#1#2#3#4{%
1464
  \def\dopdfoutline#1#2#3#4{%
1117
    % Generate a link to the node text if that exists; else, use the
1465
    % Generate a link to the node text if that exists; else, use the
1118
    % page number.  We could generate a destination for the section
1466
    % page number.  We could generate a destination for the section
1119
    % text in the case where a section has no node, but it doesn't
1467
    % text in the case where a section has no node, but it doesn't
1120
    % seem worthwhile, since most documents are normally structured.
1468
    % seem worth the trouble, since most documents are normally structured.
1121
    \def\pdfoutlinedest{#3}%
1469
    \def\pdfoutlinedest{#3}%
1122
    \ifx\pdfoutlinedest\empty \def\pdfoutlinedest{#4}\fi
1470
    \ifx\pdfoutlinedest\empty
1471
      \def\pdfoutlinedest{#4}%
1472
    \else
1473
      % Doubled backslashes in the name.
1474
      {\activebackslashdouble \xdef\pdfoutlinedest{#3}%
1475
       \backslashparens\pdfoutlinedest}%
1476
    \fi
1123
    %
1477
    %
1124
    \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{#1}%
1478
    % Also double the backslashes in the display string.
1479
    {\activebackslashdouble \xdef\pdfoutlinetext{#1}%
1480
     \backslashparens\pdfoutlinetext}%
1481
    %
1482
    \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}%
1125
  }
1483
  }
1126
  %
1484
  %
1127
  \def\pdfmakeoutlines{%
1485
  \def\pdfmakeoutlines{%
1128
    \openin 1 \jobname.toc
1486
    \begingroup
1129
    \ifeof 1\else\begingroup
1130
      \closein 1
1131
      % Thanh's hack / proper braces in bookmarks
1487
      % Thanh's hack / proper braces in bookmarks
1132
      \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace
1488
      \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace
1133
      \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace
1489
      \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace
1134
      %
1490
      %
1135
      % Read toc silently, to get counts of subentries for \pdfoutline.
1491
      % Read toc silently, to get counts of subentries for \pdfoutline.
1136
      \def\numchapentry##1##2##3##4{\def\thischapnum{##2}}%
1492
      \def\numchapentry##1##2##3##4{%
1493
	\def\thischapnum{##2}%
1494
	\def\thissecnum{0}%
1495
	\def\thissubsecnum{0}%
1496
      }%
1137
      \def\numsecentry##1##2##3##4{%
1497
      \def\numsecentry##1##2##3##4{%
1138
        \def\thissecnum{##2}%
1498
	\advancenumber{chap\thischapnum}%
1139
        \advancenumber{chap\thischapnum}}%
1499
	\def\thissecnum{##2}%
1500
	\def\thissubsecnum{0}%
1501
      }%
1140
      \def\numsubsecentry##1##2##3##4{%
1502
      \def\numsubsecentry##1##2##3##4{%
1141
        \def\thissubsecnum{##2}%
1503
	\advancenumber{sec\thissecnum}%
1142
        \advancenumber{sec\thissecnum}}%
1504
	\def\thissubsecnum{##2}%
1143
      \def\numsubsubsecentry##1##2##3##4{\advancenumber{subsec\thissubsecnum}}%
1505
      }%
1506
      \def\numsubsubsecentry##1##2##3##4{%
1507
	\advancenumber{subsec\thissubsecnum}%
1508
      }%
1509
      \def\thischapnum{0}%
1510
      \def\thissecnum{0}%
1511
      \def\thissubsecnum{0}%
1144
      %
1512
      %
1145
      % use \def rather than \let here because we redefine \chapentry et
1513
      % use \def rather than \let here because we redefine \chapentry et
1146
      % al. a second time, below.
1514
      % al. a second time, below.
Lines 1152-1163 Link Here
1152
      \def\unnsecentry{\numsecentry}%
1520
      \def\unnsecentry{\numsecentry}%
1153
      \def\unnsubsecentry{\numsubsecentry}%
1521
      \def\unnsubsecentry{\numsubsecentry}%
1154
      \def\unnsubsubsecentry{\numsubsubsecentry}%
1522
      \def\unnsubsubsecentry{\numsubsubsecentry}%
1155
      \input \jobname.toc
1523
      \readdatafile{toc}%
1156
      %
1524
      %
1157
      % Read toc second time, this time actually producing the outlines.
1525
      % Read toc second time, this time actually producing the outlines.
1158
      % The `-' means take the \expnumber as the absolute number of
1526
      % The `-' means take the \expnumber as the absolute number of
1159
      % subentries, which we calculated on our first read of the .toc above.
1527
      % subentries, which we calculated on our first read of the .toc above.
1160
      % 
1528
      %
1161
      % We use the node names as the destinations.
1529
      % We use the node names as the destinations.
1162
      \def\numchapentry##1##2##3##4{%
1530
      \def\numchapentry##1##2##3##4{%
1163
        \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}%
1531
        \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}%
Lines 1168-1211 Link Here
1168
      \def\numsubsubsecentry##1##2##3##4{% count is always zero
1536
      \def\numsubsubsecentry##1##2##3##4{% count is always zero
1169
        \dopdfoutline{##1}{}{##3}{##4}}%
1537
        \dopdfoutline{##1}{}{##3}{##4}}%
1170
      %
1538
      %
1171
      % Make special characters normal for writing to the pdf file.
1539
      % PDF outlines are displayed using system fonts, instead of
1540
      % document fonts.  Therefore we cannot use special characters,
1541
      % since the encoding is unknown.  For example, the eogonek from
1542
      % Latin 2 (0xea) gets translated to a | character.  Info from
1543
      % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100.
1544
      %
1545
      % xx to do this right, we have to translate 8-bit characters to
1546
      % their "best" equivalent, based on the @documentencoding.  Right
1547
      % now, I guess we'll just let the pdf reader have its way.
1172
      \indexnofonts
1548
      \indexnofonts
1173
      \turnoffactive
1549
      \setupdatafile
1174
      \input \jobname.toc
1550
      \catcode`\\=\active \otherbackslash
1175
    \endgroup\fi
1551
      \input \tocreadfilename
1552
    \endgroup
1176
  }
1553
  }
1177
  %
1554
  %
1178
  \def\makelinks #1,{%
1179
    \def\params{#1}\def\E{END}%
1180
    \ifx\params\E
1181
      \let\nextmakelinks=\relax
1182
    \else
1183
      \let\nextmakelinks=\makelinks
1184
      \ifnum\lnkcount>0,\fi
1185
      \picknum{#1}%
1186
      \startlink attr{/Border [0 0 0]}
1187
        goto name{\pdfmkpgn{\the\pgn}}%
1188
      \linkcolor #1%
1189
      \advance\lnkcount by 1%
1190
      \endlink
1191
    \fi
1192
    \nextmakelinks
1193
  }
1194
  \def\picknum#1{\expandafter\pn#1}
1195
  \def\pn#1{%
1196
    \def\p{#1}%
1197
    \ifx\p\lbrace
1198
      \let\nextpn=\ppn
1199
    \else
1200
      \let\nextpn=\ppnn
1201
      \def\first{#1}
1202
    \fi
1203
    \nextpn
1204
  }
1205
  \def\ppn#1{\pgn=#1\gobble}
1206
  \def\ppnn{\pgn=\first}
1207
  \def\pdfmklnk#1{\lnkcount=0\makelinks #1,END,}
1208
  \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
1209
  \def\skipspaces#1{\def\PP{#1}\def\D{|}%
1555
  \def\skipspaces#1{\def\PP{#1}\def\D{|}%
1210
    \ifx\PP\D\let\nextsp\relax
1556
    \ifx\PP\D\let\nextsp\relax
1211
    \else\let\nextsp\skipspaces
1557
    \else\let\nextsp\skipspaces
Lines 1220-1240 Link Here
1220
  \else
1566
  \else
1221
    \let \startlink \pdfstartlink
1567
    \let \startlink \pdfstartlink
1222
  \fi
1568
  \fi
1569
  % make a live url in pdf output.
1223
  \def\pdfurl#1{%
1570
  \def\pdfurl#1{%
1224
    \begingroup
1571
    \begingroup
1225
      \normalturnoffactive\def\@{@}%
1572
      % it seems we really need yet another set of dummies; have not
1226
      \let\value=\expandablevalue
1573
      % tried to figure out what each command should do in the context
1227
      \leavevmode\Red
1574
      % of @url.  for now, just make @/ a no-op, that's the only one
1575
      % people have actually reported a problem with.
1576
      %
1577
      \normalturnoffactive
1578
      \def\@{@}%
1579
      \let\/=\empty
1580
      \makevalueexpandable
1581
      % do we want to go so far as to use \indexnofonts instead of just
1582
      % special-casing \var here?
1583
      \def\var##1{##1}%
1584
      %
1585
      \leavevmode\setcolor{\urlcolor}%
1228
      \startlink attr{/Border [0 0 0]}%
1586
      \startlink attr{/Border [0 0 0]}%
1229
        user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
1587
        user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
1230
        % #1
1231
    \endgroup}
1588
    \endgroup}
1232
  \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
1589
  \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
1233
  \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
1590
  \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
1234
  \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
1591
  \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
1235
  \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
1592
  \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
1236
  \def\maketoks{%
1593
  \def\maketoks{%
1237
    \expandafter\poptoks\the\toksA|ENDTOKS|
1594
    \expandafter\poptoks\the\toksA|ENDTOKS|\relax
1238
    \ifx\first0\adn0
1595
    \ifx\first0\adn0
1239
    \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
1596
    \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
1240
    \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
1597
    \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
Lines 1252-1273 Link Here
1252
    {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
1609
    {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
1253
  \def\pdflink#1{%
1610
  \def\pdflink#1{%
1254
    \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}
1611
    \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}
1255
    \linkcolor #1\endlink}
1612
    \setcolor{\linkcolor}#1\endlink}
1256
  \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
1613
  \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
1257
\fi % \ifx\pdfoutput
1614
\else
1615
  % non-pdf mode
1616
  \let\pdfmkdest = \gobble
1617
  \let\pdfurl = \gobble
1618
  \let\endlink = \relax
1619
  \let\setcolor = \gobble
1620
  \let\pdfsetcolor = \gobble
1621
  \let\pdfmakeoutlines = \relax
1622
\fi  % \ifx\pdfoutput
1258
1623
1259
1624
1260
\message{fonts,}
1625
\message{fonts,}
1261
% Font-change commands.
1262
1626
1263
% Texinfo sort of supports the sans serif font style, which plain TeX does not.
1627
% Change the current font style to #1, remembering it in \curfontstyle.
1264
% So we set up a \sf analogous to plain's \rm, etc.
1628
% For now, we do not accumulate font styles: @b{@i{foo}} prints foo in
1265
\newfam\sffam
1629
% italics, not bold italics.
1266
\def\sf{\fam=\sffam \tensf}
1630
%
1267
\let\li = \sf % Sometimes we call it \li, not \sf.
1631
\def\setfontstyle#1{%
1632
  \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd.
1633
  \csname ten#1\endcsname  % change the current font
1634
}
1635
1636
% Select #1 fonts with the current style.
1637
%
1638
\def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname}
1639
1640
\def\rm{\fam=0 \setfontstyle{rm}}
1641
\def\it{\fam=\itfam \setfontstyle{it}}
1642
\def\sl{\fam=\slfam \setfontstyle{sl}}
1643
\def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf}
1644
\def\tt{\fam=\ttfam \setfontstyle{tt}}
1645
1646
% Unfortunately, we have to override this for titles and the like, since
1647
% in those cases "rm" is bold.  Sigh.
1648
\def\rmisbold{\rm\def\curfontstyle{bf}}
1649
1650
% Texinfo sort of supports the sans serif font style, which plain TeX does not.
1651
% So we set up a \sf.
1652
\newfam\sffam
1653
\def\sf{\fam=\sffam \setfontstyle{sf}}
1654
\let\li = \sf % Sometimes we call it \li, not \sf.
1655
1656
% We don't need math for this font style.
1657
\def\ttsl{\setfontstyle{ttsl}}
1268
1658
1269
% We don't need math for this one.
1270
\def\ttsl{\tenttsl}
1271
1659
1272
% Default leading.
1660
% Default leading.
1273
\newdimen\textleading  \textleading = 13.2pt
1661
\newdimen\textleading  \textleading = 13.2pt
Lines 1280-1287 Link Here
1280
\def\strutheightpercent{.70833}
1668
\def\strutheightpercent{.70833}
1281
\def\strutdepthpercent {.29167}
1669
\def\strutdepthpercent {.29167}
1282
%
1670
%
1671
% can get a sort of poor man's double spacing by redefining this.
1672
\def\baselinefactor{1}
1673
%
1283
\def\setleading#1{%
1674
\def\setleading#1{%
1284
  \normalbaselineskip = #1\relax
1675
  \dimen0 = #1\relax
1676
  \normalbaselineskip = \baselinefactor\dimen0
1285
  \normallineskip = \lineskipfactor\normalbaselineskip
1677
  \normallineskip = \lineskipfactor\normalbaselineskip
1286
  \normalbaselines
1678
  \normalbaselines
1287
  \setbox\strutbox =\hbox{%
1679
  \setbox\strutbox =\hbox{%
Lines 1290-1299 Link Here
1290
  }%
1682
  }%
1291
}
1683
}
1292
1684
1685
% PDF CMaps.  See also LaTeX's t1.cmap.
1686
%
1687
% do nothing with this by default.
1688
\expandafter\let\csname cmapOT1\endcsname\gobble
1689
\expandafter\let\csname cmapOT1IT\endcsname\gobble
1690
\expandafter\let\csname cmapOT1TT\endcsname\gobble
1691
1692
% if we are producing pdf, and we have \pdffontattr, then define cmaps.
1693
% (\pdffontattr was introduced many years ago, but people still run
1694
% older pdftex's; it's easy to conditionalize, so we do.)
1695
\ifpdf \ifx\pdffontattr\undefined \else
1696
  \begingroup
1697
    \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
1698
    \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
1699
%%DocumentNeededResources: ProcSet (CIDInit)
1700
%%IncludeResource: ProcSet (CIDInit)
1701
%%BeginResource: CMap (TeX-OT1-0)
1702
%%Title: (TeX-OT1-0 TeX OT1 0)
1703
%%Version: 1.000
1704
%%EndComments
1705
/CIDInit /ProcSet findresource begin
1706
12 dict begin
1707
begincmap
1708
/CIDSystemInfo
1709
<< /Registry (TeX)
1710
/Ordering (OT1)
1711
/Supplement 0
1712
>> def
1713
/CMapName /TeX-OT1-0 def
1714
/CMapType 2 def
1715
1 begincodespacerange
1716
<00> <7F>
1717
endcodespacerange
1718
8 beginbfrange
1719
<00> <01> <0393>
1720
<09> <0A> <03A8>
1721
<23> <26> <0023>
1722
<28> <3B> <0028>
1723
<3F> <5B> <003F>
1724
<5D> <5E> <005D>
1725
<61> <7A> <0061>
1726
<7B> <7C> <2013>
1727
endbfrange
1728
40 beginbfchar
1729
<02> <0398>
1730
<03> <039B>
1731
<04> <039E>
1732
<05> <03A0>
1733
<06> <03A3>
1734
<07> <03D2>
1735
<08> <03A6>
1736
<0B> <00660066>
1737
<0C> <00660069>
1738
<0D> <0066006C>
1739
<0E> <006600660069>
1740
<0F> <00660066006C>
1741
<10> <0131>
1742
<11> <0237>
1743
<12> <0060>
1744
<13> <00B4>
1745
<14> <02C7>
1746
<15> <02D8>
1747
<16> <00AF>
1748
<17> <02DA>
1749
<18> <00B8>
1750
<19> <00DF>
1751
<1A> <00E6>
1752
<1B> <0153>
1753
<1C> <00F8>
1754
<1D> <00C6>
1755
<1E> <0152>
1756
<1F> <00D8>
1757
<21> <0021>
1758
<22> <201D>
1759
<27> <2019>
1760
<3C> <00A1>
1761
<3D> <003D>
1762
<3E> <00BF>
1763
<5C> <201C>
1764
<5F> <02D9>
1765
<60> <2018>
1766
<7D> <02DD>
1767
<7E> <007E>
1768
<7F> <00A8>
1769
endbfchar
1770
endcmap
1771
CMapName currentdict /CMap defineresource pop
1772
end
1773
end
1774
%%EndResource
1775
%%EOF
1776
    }\endgroup
1777
  \expandafter\edef\csname cmapOT1\endcsname#1{%
1778
    \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
1779
  }%
1780
%
1781
% \cmapOT1IT
1782
  \begingroup
1783
    \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
1784
    \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
1785
%%DocumentNeededResources: ProcSet (CIDInit)
1786
%%IncludeResource: ProcSet (CIDInit)
1787
%%BeginResource: CMap (TeX-OT1IT-0)
1788
%%Title: (TeX-OT1IT-0 TeX OT1IT 0)
1789
%%Version: 1.000
1790
%%EndComments
1791
/CIDInit /ProcSet findresource begin
1792
12 dict begin
1793
begincmap
1794
/CIDSystemInfo
1795
<< /Registry (TeX)
1796
/Ordering (OT1IT)
1797
/Supplement 0
1798
>> def
1799
/CMapName /TeX-OT1IT-0 def
1800
/CMapType 2 def
1801
1 begincodespacerange
1802
<00> <7F>
1803
endcodespacerange
1804
8 beginbfrange
1805
<00> <01> <0393>
1806
<09> <0A> <03A8>
1807
<25> <26> <0025>
1808
<28> <3B> <0028>
1809
<3F> <5B> <003F>
1810
<5D> <5E> <005D>
1811
<61> <7A> <0061>
1812
<7B> <7C> <2013>
1813
endbfrange
1814
42 beginbfchar
1815
<02> <0398>
1816
<03> <039B>
1817
<04> <039E>
1818
<05> <03A0>
1819
<06> <03A3>
1820
<07> <03D2>
1821
<08> <03A6>
1822
<0B> <00660066>
1823
<0C> <00660069>
1824
<0D> <0066006C>
1825
<0E> <006600660069>
1826
<0F> <00660066006C>
1827
<10> <0131>
1828
<11> <0237>
1829
<12> <0060>
1830
<13> <00B4>
1831
<14> <02C7>
1832
<15> <02D8>
1833
<16> <00AF>
1834
<17> <02DA>
1835
<18> <00B8>
1836
<19> <00DF>
1837
<1A> <00E6>
1838
<1B> <0153>
1839
<1C> <00F8>
1840
<1D> <00C6>
1841
<1E> <0152>
1842
<1F> <00D8>
1843
<21> <0021>
1844
<22> <201D>
1845
<23> <0023>
1846
<24> <00A3>
1847
<27> <2019>
1848
<3C> <00A1>
1849
<3D> <003D>
1850
<3E> <00BF>
1851
<5C> <201C>
1852
<5F> <02D9>
1853
<60> <2018>
1854
<7D> <02DD>
1855
<7E> <007E>
1856
<7F> <00A8>
1857
endbfchar
1858
endcmap
1859
CMapName currentdict /CMap defineresource pop
1860
end
1861
end
1862
%%EndResource
1863
%%EOF
1864
    }\endgroup
1865
  \expandafter\edef\csname cmapOT1IT\endcsname#1{%
1866
    \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
1867
  }%
1868
%
1869
% \cmapOT1TT
1870
  \begingroup
1871
    \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
1872
    \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
1873
%%DocumentNeededResources: ProcSet (CIDInit)
1874
%%IncludeResource: ProcSet (CIDInit)
1875
%%BeginResource: CMap (TeX-OT1TT-0)
1876
%%Title: (TeX-OT1TT-0 TeX OT1TT 0)
1877
%%Version: 1.000
1878
%%EndComments
1879
/CIDInit /ProcSet findresource begin
1880
12 dict begin
1881
begincmap
1882
/CIDSystemInfo
1883
<< /Registry (TeX)
1884
/Ordering (OT1TT)
1885
/Supplement 0
1886
>> def
1887
/CMapName /TeX-OT1TT-0 def
1888
/CMapType 2 def
1889
1 begincodespacerange
1890
<00> <7F>
1891
endcodespacerange
1892
5 beginbfrange
1893
<00> <01> <0393>
1894
<09> <0A> <03A8>
1895
<21> <26> <0021>
1896
<28> <5F> <0028>
1897
<61> <7E> <0061>
1898
endbfrange
1899
32 beginbfchar
1900
<02> <0398>
1901
<03> <039B>
1902
<04> <039E>
1903
<05> <03A0>
1904
<06> <03A3>
1905
<07> <03D2>
1906
<08> <03A6>
1907
<0B> <2191>
1908
<0C> <2193>
1909
<0D> <0027>
1910
<0E> <00A1>
1911
<0F> <00BF>
1912
<10> <0131>
1913
<11> <0237>
1914
<12> <0060>
1915
<13> <00B4>
1916
<14> <02C7>
1917
<15> <02D8>
1918
<16> <00AF>
1919
<17> <02DA>
1920
<18> <00B8>
1921
<19> <00DF>
1922
<1A> <00E6>
1923
<1B> <0153>
1924
<1C> <00F8>
1925
<1D> <00C6>
1926
<1E> <0152>
1927
<1F> <00D8>
1928
<20> <2423>
1929
<27> <2019>
1930
<60> <2018>
1931
<7F> <00A8>
1932
endbfchar
1933
endcmap
1934
CMapName currentdict /CMap defineresource pop
1935
end
1936
end
1937
%%EndResource
1938
%%EOF
1939
    }\endgroup
1940
  \expandafter\edef\csname cmapOT1TT\endcsname#1{%
1941
    \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
1942
  }%
1943
\fi\fi
1944
1945
1293
% Set the font macro #1 to the font named #2, adding on the
1946
% Set the font macro #1 to the font named #2, adding on the
1294
% specified font prefix (normally `cm').
1947
% specified font prefix (normally `cm').
1295
% #3 is the font's design size, #4 is a scale factor
1948
% #3 is the font's design size, #4 is a scale factor, #5 is the CMap
1296
\def\setfont#1#2#3#4{\font#1=\fontprefix#2#3 scaled #4}
1949
% encoding (currently only OT1, OT1IT and OT1TT are allowed, pass
1950
% empty to omit).
1951
\def\setfont#1#2#3#4#5{%
1952
  \font#1=\fontprefix#2#3 scaled #4
1953
  \csname cmap#5\endcsname#1%
1954
}
1955
% This is what gets called when #5 of \setfont is empty.
1956
\let\cmap\gobble
1957
% emacs-page end of cmaps
1297
1958
1298
% Use cm as the default font prefix.
1959
% Use cm as the default font prefix.
1299
% To specify the font prefix, you must define \fontprefix
1960
% To specify the font prefix, you must define \fontprefix
Lines 1318-1427 Link Here
1318
\def\scshape{csc}
1979
\def\scshape{csc}
1319
\def\scbshape{csc}
1980
\def\scbshape{csc}
1320
1981
1321
\newcount\mainmagstep
1982
% Definitions for a main text size of 11pt.  This is the default in
1322
\ifx\bigger\relax
1983
% Texinfo.
1323
  % not really supported.
1984
%
1324
  \mainmagstep=\magstep1
1985
\def\definetextfontsizexi{%
1325
  \setfont\textrm\rmshape{12}{1000}
1986
% Text fonts (11.2pt, magstep1).
1326
  \setfont\texttt\ttshape{12}{1000}
1987
\def\textnominalsize{11pt}
1327
\else
1988
\edef\mainmagstep{\magstephalf}
1328
  \mainmagstep=\magstephalf
1989
\setfont\textrm\rmshape{10}{\mainmagstep}{OT1}
1329
  \setfont\textrm\rmshape{10}{\mainmagstep}
1990
\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT}
1330
  \setfont\texttt\ttshape{10}{\mainmagstep}
1991
\setfont\textbf\bfshape{10}{\mainmagstep}{OT1}
1331
\fi
1992
\setfont\textit\itshape{10}{\mainmagstep}{OT1IT}
1332
% Instead of cmb10, you may want to use cmbx10.
1993
\setfont\textsl\slshape{10}{\mainmagstep}{OT1}
1333
% cmbx10 is a prettier font on its own, but cmb10
1994
\setfont\textsf\sfshape{10}{\mainmagstep}{OT1}
1334
% looks better when embedded in a line with cmr10
1995
\setfont\textsc\scshape{10}{\mainmagstep}{OT1}
1335
% (in Bob's opinion).
1996
\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT}
1336
\setfont\textbf\bfshape{10}{\mainmagstep}
1337
\setfont\textit\itshape{10}{\mainmagstep}
1338
\setfont\textsl\slshape{10}{\mainmagstep}
1339
\setfont\textsf\sfshape{10}{\mainmagstep}
1340
\setfont\textsc\scshape{10}{\mainmagstep}
1341
\setfont\textttsl\ttslshape{10}{\mainmagstep}
1342
\font\texti=cmmi10 scaled \mainmagstep
1997
\font\texti=cmmi10 scaled \mainmagstep
1343
\font\textsy=cmsy10 scaled \mainmagstep
1998
\font\textsy=cmsy10 scaled \mainmagstep
1999
\def\textecsize{1095}
1344
2000
1345
% A few fonts for @defun, etc.
2001
% A few fonts for @defun names and args.
1346
\setfont\defbf\bxshape{10}{\magstep1} %was 1314
2002
\setfont\defbf\bfshape{10}{\magstep1}{OT1}
1347
\setfont\deftt\ttshape{10}{\magstep1}
2003
\setfont\deftt\ttshape{10}{\magstep1}{OT1TT}
1348
\def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf}
2004
\setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT}
2005
\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf}
1349
2006
1350
% Fonts for indices, footnotes, small examples (9pt).
2007
% Fonts for indices, footnotes, small examples (9pt).
1351
\setfont\smallrm\rmshape{9}{1000}
2008
\def\smallnominalsize{9pt}
1352
\setfont\smalltt\ttshape{9}{1000}
2009
\setfont\smallrm\rmshape{9}{1000}{OT1}
1353
\setfont\smallbf\bfshape{10}{900}
2010
\setfont\smalltt\ttshape{9}{1000}{OT1TT}
1354
\setfont\smallit\itshape{9}{1000}
2011
\setfont\smallbf\bfshape{10}{900}{OT1}
1355
\setfont\smallsl\slshape{9}{1000}
2012
\setfont\smallit\itshape{9}{1000}{OT1IT}
1356
\setfont\smallsf\sfshape{9}{1000}
2013
\setfont\smallsl\slshape{9}{1000}{OT1}
1357
\setfont\smallsc\scshape{10}{900}
2014
\setfont\smallsf\sfshape{9}{1000}{OT1}
1358
\setfont\smallttsl\ttslshape{10}{900}
2015
\setfont\smallsc\scshape{10}{900}{OT1}
2016
\setfont\smallttsl\ttslshape{10}{900}{OT1TT}
1359
\font\smalli=cmmi9
2017
\font\smalli=cmmi9
1360
\font\smallsy=cmsy9
2018
\font\smallsy=cmsy9
2019
\def\smallecsize{0900}
1361
2020
1362
% Fonts for small examples (8pt).
2021
% Fonts for small examples (8pt).
1363
\setfont\smallerrm\rmshape{8}{1000}
2022
\def\smallernominalsize{8pt}
1364
\setfont\smallertt\ttshape{8}{1000}
2023
\setfont\smallerrm\rmshape{8}{1000}{OT1}
1365
\setfont\smallerbf\bfshape{10}{800}
2024
\setfont\smallertt\ttshape{8}{1000}{OT1TT}
1366
\setfont\smallerit\itshape{8}{1000}
2025
\setfont\smallerbf\bfshape{10}{800}{OT1}
1367
\setfont\smallersl\slshape{8}{1000}
2026
\setfont\smallerit\itshape{8}{1000}{OT1IT}
1368
\setfont\smallersf\sfshape{8}{1000}
2027
\setfont\smallersl\slshape{8}{1000}{OT1}
1369
\setfont\smallersc\scshape{10}{800}
2028
\setfont\smallersf\sfshape{8}{1000}{OT1}
1370
\setfont\smallerttsl\ttslshape{10}{800}
2029
\setfont\smallersc\scshape{10}{800}{OT1}
2030
\setfont\smallerttsl\ttslshape{10}{800}{OT1TT}
1371
\font\smalleri=cmmi8
2031
\font\smalleri=cmmi8
1372
\font\smallersy=cmsy8
2032
\font\smallersy=cmsy8
2033
\def\smallerecsize{0800}
1373
2034
1374
% Fonts for title page:
2035
% Fonts for title page (20.4pt):
1375
\setfont\titlerm\rmbshape{12}{\magstep3}
2036
\def\titlenominalsize{20pt}
1376
\setfont\titleit\itbshape{10}{\magstep4}
2037
\setfont\titlerm\rmbshape{12}{\magstep3}{OT1}
1377
\setfont\titlesl\slbshape{10}{\magstep4}
2038
\setfont\titleit\itbshape{10}{\magstep4}{OT1IT}
1378
\setfont\titlett\ttbshape{12}{\magstep3}
2039
\setfont\titlesl\slbshape{10}{\magstep4}{OT1}
1379
\setfont\titlettsl\ttslshape{10}{\magstep4}
2040
\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT}
1380
\setfont\titlesf\sfbshape{17}{\magstep1}
2041
\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT}
2042
\setfont\titlesf\sfbshape{17}{\magstep1}{OT1}
1381
\let\titlebf=\titlerm
2043
\let\titlebf=\titlerm
1382
\setfont\titlesc\scbshape{10}{\magstep4}
2044
\setfont\titlesc\scbshape{10}{\magstep4}{OT1}
1383
\font\titlei=cmmi12 scaled \magstep3
2045
\font\titlei=cmmi12 scaled \magstep3
1384
\font\titlesy=cmsy10 scaled \magstep4
2046
\font\titlesy=cmsy10 scaled \magstep4
1385
\def\authorrm{\secrm}
2047
\def\titleecsize{2074}
1386
\def\authortt{\sectt}
1387
2048
1388
% Chapter (and unnumbered) fonts (17.28pt).
2049
% Chapter (and unnumbered) fonts (17.28pt).
1389
\setfont\chaprm\rmbshape{12}{\magstep2}
2050
\def\chapnominalsize{17pt}
1390
\setfont\chapit\itbshape{10}{\magstep3}
2051
\setfont\chaprm\rmbshape{12}{\magstep2}{OT1}
1391
\setfont\chapsl\slbshape{10}{\magstep3}
2052
\setfont\chapit\itbshape{10}{\magstep3}{OT1IT}
1392
\setfont\chaptt\ttbshape{12}{\magstep2}
2053
\setfont\chapsl\slbshape{10}{\magstep3}{OT1}
1393
\setfont\chapttsl\ttslshape{10}{\magstep3}
2054
\setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT}
1394
\setfont\chapsf\sfbshape{17}{1000}
2055
\setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT}
2056
\setfont\chapsf\sfbshape{17}{1000}{OT1}
1395
\let\chapbf=\chaprm
2057
\let\chapbf=\chaprm
1396
\setfont\chapsc\scbshape{10}{\magstep3}
2058
\setfont\chapsc\scbshape{10}{\magstep3}{OT1}
1397
\font\chapi=cmmi12 scaled \magstep2
2059
\font\chapi=cmmi12 scaled \magstep2
1398
\font\chapsy=cmsy10 scaled \magstep3
2060
\font\chapsy=cmsy10 scaled \magstep3
2061
\def\chapecsize{1728}
1399
2062
1400
% Section fonts (14.4pt).
2063
% Section fonts (14.4pt).
1401
\setfont\secrm\rmbshape{12}{\magstep1}
2064
\def\secnominalsize{14pt}
1402
\setfont\secit\itbshape{10}{\magstep2}
2065
\setfont\secrm\rmbshape{12}{\magstep1}{OT1}
1403
\setfont\secsl\slbshape{10}{\magstep2}
2066
\setfont\secit\itbshape{10}{\magstep2}{OT1IT}
1404
\setfont\sectt\ttbshape{12}{\magstep1}
2067
\setfont\secsl\slbshape{10}{\magstep2}{OT1}
1405
\setfont\secttsl\ttslshape{10}{\magstep2}
2068
\setfont\sectt\ttbshape{12}{\magstep1}{OT1TT}
1406
\setfont\secsf\sfbshape{12}{\magstep1}
2069
\setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT}
2070
\setfont\secsf\sfbshape{12}{\magstep1}{OT1}
1407
\let\secbf\secrm
2071
\let\secbf\secrm
1408
\setfont\secsc\scbshape{10}{\magstep2}
2072
\setfont\secsc\scbshape{10}{\magstep2}{OT1}
1409
\font\seci=cmmi12 scaled \magstep1
2073
\font\seci=cmmi12 scaled \magstep1
1410
\font\secsy=cmsy10 scaled \magstep2
2074
\font\secsy=cmsy10 scaled \magstep2
2075
\def\sececsize{1440}
1411
2076
1412
% Subsection fonts (13.15pt).
2077
% Subsection fonts (13.15pt).
1413
\setfont\ssecrm\rmbshape{12}{\magstephalf}
2078
\def\ssecnominalsize{13pt}
1414
\setfont\ssecit\itbshape{10}{1315}
2079
\setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1}
1415
\setfont\ssecsl\slbshape{10}{1315}
2080
\setfont\ssecit\itbshape{10}{1315}{OT1IT}
1416
\setfont\ssectt\ttbshape{12}{\magstephalf}
2081
\setfont\ssecsl\slbshape{10}{1315}{OT1}
1417
\setfont\ssecttsl\ttslshape{10}{1315}
2082
\setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT}
1418
\setfont\ssecsf\sfbshape{12}{\magstephalf}
2083
\setfont\ssecttsl\ttslshape{10}{1315}{OT1TT}
2084
\setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1}
1419
\let\ssecbf\ssecrm
2085
\let\ssecbf\ssecrm
1420
\setfont\ssecsc\scbshape{10}{\magstep1}
2086
\setfont\ssecsc\scbshape{10}{1315}{OT1}
1421
\font\sseci=cmmi12 scaled \magstephalf
2087
\font\sseci=cmmi12 scaled \magstephalf
1422
\font\ssecsy=cmsy10 scaled 1315
2088
\font\ssecsy=cmsy10 scaled 1315
1423
% The smallcaps and symbol fonts should actually be scaled \magstep1.5,
2089
\def\ssececsize{1200}
1424
% but that is not a standard magnification.
2090
2091
% Reduced fonts for @acro in text (10pt).
2092
\def\reducednominalsize{10pt}
2093
\setfont\reducedrm\rmshape{10}{1000}{OT1}
2094
\setfont\reducedtt\ttshape{10}{1000}{OT1TT}
2095
\setfont\reducedbf\bfshape{10}{1000}{OT1}
2096
\setfont\reducedit\itshape{10}{1000}{OT1IT}
2097
\setfont\reducedsl\slshape{10}{1000}{OT1}
2098
\setfont\reducedsf\sfshape{10}{1000}{OT1}
2099
\setfont\reducedsc\scshape{10}{1000}{OT1}
2100
\setfont\reducedttsl\ttslshape{10}{1000}{OT1TT}
2101
\font\reducedi=cmmi10
2102
\font\reducedsy=cmsy10
2103
\def\reducedecsize{1000}
2104
2105
% reset the current fonts
2106
\textfonts
2107
\rm
2108
} % end of 11pt text font size definitions
2109
2110
2111
% Definitions to make the main text be 10pt Computer Modern, with
2112
% section, chapter, etc., sizes following suit.  This is for the GNU
2113
% Press printing of the Emacs 22 manual.  Maybe other manuals in the
2114
% future.  Used with @smallbook, which sets the leading to 12pt.
2115
%
2116
\def\definetextfontsizex{%
2117
% Text fonts (10pt).
2118
\def\textnominalsize{10pt}
2119
\edef\mainmagstep{1000}
2120
\setfont\textrm\rmshape{10}{\mainmagstep}{OT1}
2121
\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT}
2122
\setfont\textbf\bfshape{10}{\mainmagstep}{OT1}
2123
\setfont\textit\itshape{10}{\mainmagstep}{OT1IT}
2124
\setfont\textsl\slshape{10}{\mainmagstep}{OT1}
2125
\setfont\textsf\sfshape{10}{\mainmagstep}{OT1}
2126
\setfont\textsc\scshape{10}{\mainmagstep}{OT1}
2127
\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT}
2128
\font\texti=cmmi10 scaled \mainmagstep
2129
\font\textsy=cmsy10 scaled \mainmagstep
2130
\def\textecsize{1000}
2131
2132
% A few fonts for @defun names and args.
2133
\setfont\defbf\bfshape{10}{\magstephalf}{OT1}
2134
\setfont\deftt\ttshape{10}{\magstephalf}{OT1TT}
2135
\setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT}
2136
\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf}
2137
2138
% Fonts for indices, footnotes, small examples (9pt).
2139
\def\smallnominalsize{9pt}
2140
\setfont\smallrm\rmshape{9}{1000}{OT1}
2141
\setfont\smalltt\ttshape{9}{1000}{OT1TT}
2142
\setfont\smallbf\bfshape{10}{900}{OT1}
2143
\setfont\smallit\itshape{9}{1000}{OT1IT}
2144
\setfont\smallsl\slshape{9}{1000}{OT1}
2145
\setfont\smallsf\sfshape{9}{1000}{OT1}
2146
\setfont\smallsc\scshape{10}{900}{OT1}
2147
\setfont\smallttsl\ttslshape{10}{900}{OT1TT}
2148
\font\smalli=cmmi9
2149
\font\smallsy=cmsy9
2150
\def\smallecsize{0900}
2151
2152
% Fonts for small examples (8pt).
2153
\def\smallernominalsize{8pt}
2154
\setfont\smallerrm\rmshape{8}{1000}{OT1}
2155
\setfont\smallertt\ttshape{8}{1000}{OT1TT}
2156
\setfont\smallerbf\bfshape{10}{800}{OT1}
2157
\setfont\smallerit\itshape{8}{1000}{OT1IT}
2158
\setfont\smallersl\slshape{8}{1000}{OT1}
2159
\setfont\smallersf\sfshape{8}{1000}{OT1}
2160
\setfont\smallersc\scshape{10}{800}{OT1}
2161
\setfont\smallerttsl\ttslshape{10}{800}{OT1TT}
2162
\font\smalleri=cmmi8
2163
\font\smallersy=cmsy8
2164
\def\smallerecsize{0800}
2165
2166
% Fonts for title page (20.4pt):
2167
\def\titlenominalsize{20pt}
2168
\setfont\titlerm\rmbshape{12}{\magstep3}{OT1}
2169
\setfont\titleit\itbshape{10}{\magstep4}{OT1IT}
2170
\setfont\titlesl\slbshape{10}{\magstep4}{OT1}
2171
\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT}
2172
\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT}
2173
\setfont\titlesf\sfbshape{17}{\magstep1}{OT1}
2174
\let\titlebf=\titlerm
2175
\setfont\titlesc\scbshape{10}{\magstep4}{OT1}
2176
\font\titlei=cmmi12 scaled \magstep3
2177
\font\titlesy=cmsy10 scaled \magstep4
2178
\def\titleecsize{2074}
2179
2180
% Chapter fonts (14.4pt).
2181
\def\chapnominalsize{14pt}
2182
\setfont\chaprm\rmbshape{12}{\magstep1}{OT1}
2183
\setfont\chapit\itbshape{10}{\magstep2}{OT1IT}
2184
\setfont\chapsl\slbshape{10}{\magstep2}{OT1}
2185
\setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT}
2186
\setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT}
2187
\setfont\chapsf\sfbshape{12}{\magstep1}{OT1}
2188
\let\chapbf\chaprm
2189
\setfont\chapsc\scbshape{10}{\magstep2}{OT1}
2190
\font\chapi=cmmi12 scaled \magstep1
2191
\font\chapsy=cmsy10 scaled \magstep2
2192
\def\chapecsize{1440}
2193
2194
% Section fonts (12pt).
2195
\def\secnominalsize{12pt}
2196
\setfont\secrm\rmbshape{12}{1000}{OT1}
2197
\setfont\secit\itbshape{10}{\magstep1}{OT1IT}
2198
\setfont\secsl\slbshape{10}{\magstep1}{OT1}
2199
\setfont\sectt\ttbshape{12}{1000}{OT1TT}
2200
\setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT}
2201
\setfont\secsf\sfbshape{12}{1000}{OT1}
2202
\let\secbf\secrm
2203
\setfont\secsc\scbshape{10}{\magstep1}{OT1}
2204
\font\seci=cmmi12
2205
\font\secsy=cmsy10 scaled \magstep1
2206
\def\sececsize{1200}
2207
2208
% Subsection fonts (10pt).
2209
\def\ssecnominalsize{10pt}
2210
\setfont\ssecrm\rmbshape{10}{1000}{OT1}
2211
\setfont\ssecit\itbshape{10}{1000}{OT1IT}
2212
\setfont\ssecsl\slbshape{10}{1000}{OT1}
2213
\setfont\ssectt\ttbshape{10}{1000}{OT1TT}
2214
\setfont\ssecttsl\ttslshape{10}{1000}{OT1TT}
2215
\setfont\ssecsf\sfbshape{10}{1000}{OT1}
2216
\let\ssecbf\ssecrm
2217
\setfont\ssecsc\scbshape{10}{1000}{OT1}
2218
\font\sseci=cmmi10
2219
\font\ssecsy=cmsy10
2220
\def\ssececsize{1000}
2221
2222
% Reduced fonts for @acro in text (9pt).
2223
\def\reducednominalsize{9pt}
2224
\setfont\reducedrm\rmshape{9}{1000}{OT1}
2225
\setfont\reducedtt\ttshape{9}{1000}{OT1TT}
2226
\setfont\reducedbf\bfshape{10}{900}{OT1}
2227
\setfont\reducedit\itshape{9}{1000}{OT1IT}
2228
\setfont\reducedsl\slshape{9}{1000}{OT1}
2229
\setfont\reducedsf\sfshape{9}{1000}{OT1}
2230
\setfont\reducedsc\scshape{10}{900}{OT1}
2231
\setfont\reducedttsl\ttslshape{10}{900}{OT1TT}
2232
\font\reducedi=cmmi9
2233
\font\reducedsy=cmsy9
2234
\def\reducedecsize{0900}
2235
2236
% reduce space between paragraphs
2237
\divide\parskip by 2
2238
2239
% reset the current fonts
2240
\textfonts
2241
\rm
2242
} % end of 10pt text font size definitions
2243
2244
2245
% We provide the user-level command
2246
%   @fonttextsize 10
2247
% (or 11) to redefine the text font size.  pt is assumed.
2248
%
2249
\def\xword{10}
2250
\def\xiword{11}
2251
%
2252
\parseargdef\fonttextsize{%
2253
  \def\textsizearg{#1}%
2254
  \wlog{doing @fonttextsize \textsizearg}%
2255
  %
2256
  % Set \globaldefs so that documents can use this inside @tex, since
2257
  % makeinfo 4.8 does not support it, but we need it nonetheless.
2258
  %
2259
 \begingroup \globaldefs=1
2260
  \ifx\textsizearg\xword \definetextfontsizex
2261
  \else \ifx\textsizearg\xiword \definetextfontsizexi
2262
  \else
2263
    \errhelp=\EMsimple
2264
    \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'}
2265
  \fi\fi
2266
 \endgroup
2267
}
2268
1425
2269
1426
% In order for the font changes to affect most math symbols and letters,
2270
% In order for the font changes to affect most math symbols and letters,
1427
% we have to define the \textfont of the standard families.  Since
2271
% we have to define the \textfont of the standard families.  Since
Lines 1436-1523 Link Here
1436
}
2280
}
1437
2281
1438
% The font-changing commands redefine the meanings of \tenSTYLE, instead
2282
% The font-changing commands redefine the meanings of \tenSTYLE, instead
1439
% of just \STYLE.  We do this so that font changes will continue to work
2283
% of just \STYLE.  We do this because \STYLE needs to also set the
1440
% in math mode, where it is the current \fam that is relevant in most
2284
% current \fam for math mode.  Our \STYLE (e.g., \rm) commands hardwire
1441
% cases, not the current font.  Plain TeX does \def\bf{\fam=\bffam
2285
% \tenSTYLE to set the current font.
1442
% \tenbf}, for example.  By redefining \tenbf, we obviate the need to
2286
%
1443
% redefine \bf itself.
2287
% Each font-changing command also sets the names \lsize (one size lower)
2288
% and \lllsize (three sizes lower).  These relative commands are used in
2289
% the LaTeX logo and acronyms.
2290
%
2291
% This all needs generalizing, badly.
2292
%
1444
\def\textfonts{%
2293
\def\textfonts{%
1445
  \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
2294
  \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
1446
  \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
2295
  \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
1447
  \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy \let\tenttsl=\textttsl
2296
  \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy
2297
  \let\tenttsl=\textttsl
2298
  \def\curfontsize{text}%
2299
  \def\lsize{reduced}\def\lllsize{smaller}%
1448
  \resetmathfonts \setleading{\textleading}}
2300
  \resetmathfonts \setleading{\textleading}}
1449
\def\titlefonts{%
2301
\def\titlefonts{%
1450
  \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl
2302
  \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl
1451
  \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc
2303
  \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc
1452
  \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy
2304
  \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy
1453
  \let\tenttsl=\titlettsl
2305
  \let\tenttsl=\titlettsl
2306
  \def\curfontsize{title}%
2307
  \def\lsize{chap}\def\lllsize{subsec}%
1454
  \resetmathfonts \setleading{25pt}}
2308
  \resetmathfonts \setleading{25pt}}
1455
\def\titlefont#1{{\titlefonts\rm #1}}
2309
\def\titlefont#1{{\titlefonts\rmisbold #1}}
1456
\def\chapfonts{%
2310
\def\chapfonts{%
1457
  \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
2311
  \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
1458
  \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
2312
  \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
1459
  \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl
2313
  \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy
2314
  \let\tenttsl=\chapttsl
2315
  \def\curfontsize{chap}%
2316
  \def\lsize{sec}\def\lllsize{text}%
1460
  \resetmathfonts \setleading{19pt}}
2317
  \resetmathfonts \setleading{19pt}}
1461
\def\secfonts{%
2318
\def\secfonts{%
1462
  \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
2319
  \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
1463
  \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
2320
  \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
1464
  \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy \let\tenttsl=\secttsl
2321
  \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy
2322
  \let\tenttsl=\secttsl
2323
  \def\curfontsize{sec}%
2324
  \def\lsize{subsec}\def\lllsize{reduced}%
1465
  \resetmathfonts \setleading{16pt}}
2325
  \resetmathfonts \setleading{16pt}}
1466
\def\subsecfonts{%
2326
\def\subsecfonts{%
1467
  \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
2327
  \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
1468
  \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
2328
  \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
1469
  \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl
2329
  \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy
2330
  \let\tenttsl=\ssecttsl
2331
  \def\curfontsize{ssec}%
2332
  \def\lsize{text}\def\lllsize{small}%
1470
  \resetmathfonts \setleading{15pt}}
2333
  \resetmathfonts \setleading{15pt}}
1471
\let\subsubsecfonts = \subsecfonts % Maybe make sssec fonts scaled magstephalf?
2334
\let\subsubsecfonts = \subsecfonts
2335
\def\reducedfonts{%
2336
  \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl
2337
  \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc
2338
  \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy
2339
  \let\tenttsl=\reducedttsl
2340
  \def\curfontsize{reduced}%
2341
  \def\lsize{small}\def\lllsize{smaller}%
2342
  \resetmathfonts \setleading{10.5pt}}
1472
\def\smallfonts{%
2343
\def\smallfonts{%
1473
  \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl
2344
  \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl
1474
  \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc
2345
  \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc
1475
  \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy
2346
  \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy
1476
  \let\tenttsl=\smallttsl
2347
  \let\tenttsl=\smallttsl
2348
  \def\curfontsize{small}%
2349
  \def\lsize{smaller}\def\lllsize{smaller}%
1477
  \resetmathfonts \setleading{10.5pt}}
2350
  \resetmathfonts \setleading{10.5pt}}
1478
\def\smallerfonts{%
2351
\def\smallerfonts{%
1479
  \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl
2352
  \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl
1480
  \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc
2353
  \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc
1481
  \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy
2354
  \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy
1482
  \let\tenttsl=\smallerttsl
2355
  \let\tenttsl=\smallerttsl
2356
  \def\curfontsize{smaller}%
2357
  \def\lsize{smaller}\def\lllsize{smaller}%
1483
  \resetmathfonts \setleading{9.5pt}}
2358
  \resetmathfonts \setleading{9.5pt}}
1484
2359
2360
% Fonts for short table of contents.
2361
\setfont\shortcontrm\rmshape{12}{1000}{OT1}
2362
\setfont\shortcontbf\bfshape{10}{\magstep1}{OT1}  % no cmb12
2363
\setfont\shortcontsl\slshape{12}{1000}{OT1}
2364
\setfont\shortconttt\ttshape{12}{1000}{OT1TT}
2365
2366
% Define these just so they can be easily changed for other fonts.
2367
\def\angleleft{$\langle$}
2368
\def\angleright{$\rangle$}
2369
1485
% Set the fonts to use with the @small... environments.
2370
% Set the fonts to use with the @small... environments.
1486
\let\smallexamplefonts = \smallfonts
2371
\let\smallexamplefonts = \smallfonts
1487
2372
1488
% About \smallexamplefonts.  If we use \smallfonts (9pt), @smallexample
2373
% About \smallexamplefonts.  If we use \smallfonts (9pt), @smallexample
1489
% can fit this many characters:
2374
% can fit this many characters:
1490
%   8.5x11=86   smallbook=72  a4=90  a5=69
2375
%   8.5x11=86   smallbook=72  a4=90  a5=69
1491
% If we use \smallerfonts (8pt), then we can fit this many characters:
2376
% If we use \scriptfonts (8pt), then we can fit this many characters:
1492
%   8.5x11=90+  smallbook=80  a4=90+  a5=77
2377
%   8.5x11=90+  smallbook=80  a4=90+  a5=77
1493
% For me, subjectively, the few extra characters that fit aren't worth
2378
% For me, subjectively, the few extra characters that fit aren't worth
1494
% the additional smallness of 8pt.  So I'm making the default 9pt.
2379
% the additional smallness of 8pt.  So I'm making the default 9pt.
1495
%
2380
%
1496
% By the way, for comparison, here's what fits with @example (10pt):
2381
% By the way, for comparison, here's what fits with @example (10pt):
1497
%   8.5x11=71  smallbook=60  a4=75  a5=58
2382
%   8.5x11=71  smallbook=60  a4=75  a5=58
1498
%
1499
% I wish we used A4 paper on this side of the Atlantic.
1500
%
1501
% --karl, 24jan03.
2383
% --karl, 24jan03.
1502
2384
1503
1504
% Set up the default fonts, so we can use them for creating boxes.
2385
% Set up the default fonts, so we can use them for creating boxes.
1505
%
2386
%
1506
\textfonts
2387
\definetextfontsizexi
1507
2388
1508
% Define these so they can be easily changed for other fonts.
2389
1509
\def\angleleft{$\langle$}
2390
\message{markup,}
1510
\def\angleright{$\rangle$}
2391
2392
% Check if we are currently using a typewriter font.  Since all the
2393
% Computer Modern typewriter fonts have zero interword stretch (and
2394
% shrink), and it is reasonable to expect all typewriter fonts to have
2395
% this property, we can check that font parameter.
2396
%
2397
\def\ifmonospace{\ifdim\fontdimen3\font=0pt }
2398
2399
% Markup style infrastructure.  \defmarkupstylesetup\INITMACRO will
2400
% define and register \INITMACRO to be called on markup style changes.
2401
% \INITMACRO can check \currentmarkupstyle for the innermost
2402
% style and the set of \ifmarkupSTYLE switches for all styles
2403
% currently in effect.
2404
\newif\ifmarkupvar
2405
\newif\ifmarkupsamp
2406
\newif\ifmarkupkey
2407
%\newif\ifmarkupfile % @file == @samp.
2408
%\newif\ifmarkupoption % @option == @samp.
2409
\newif\ifmarkupcode
2410
\newif\ifmarkupkbd
2411
%\newif\ifmarkupenv % @env == @code.
2412
%\newif\ifmarkupcommand % @command == @code.
2413
\newif\ifmarkuptex % @tex (and part of @math, for now).
2414
\newif\ifmarkupexample
2415
\newif\ifmarkupverb
2416
\newif\ifmarkupverbatim
2417
2418
\let\currentmarkupstyle\empty
2419
2420
\def\setupmarkupstyle#1{%
2421
  \csname markup#1true\endcsname
2422
  \def\currentmarkupstyle{#1}%
2423
  \markupstylesetup
2424
}
2425
2426
\let\markupstylesetup\empty
2427
2428
\def\defmarkupstylesetup#1{%
2429
  \expandafter\def\expandafter\markupstylesetup
2430
    \expandafter{\markupstylesetup #1}%
2431
  \def#1%
2432
}
2433
2434
% Markup style setup for left and right quotes.
2435
\defmarkupstylesetup\markupsetuplq{%
2436
  \expandafter\let\expandafter \temp \csname markupsetuplq\currentmarkupstyle\endcsname
2437
  \ifx\temp\relax \markupsetuplqdefault \else \temp \fi
2438
}
2439
2440
\defmarkupstylesetup\markupsetuprq{%
2441
  \expandafter\let\expandafter \temp \csname markupsetuprq\currentmarkupstyle\endcsname
2442
  \ifx\temp\relax \markupsetuprqdefault \else \temp \fi
2443
}
2444
2445
{
2446
\catcode`\'=\active
2447
\catcode`\`=\active
2448
2449
\gdef\markupsetuplqdefault{\let`\lq}
2450
\gdef\markupsetuprqdefault{\let'\rq}
2451
2452
\gdef\markupsetcodequoteleft{\let`\codequoteleft}
2453
\gdef\markupsetcodequoteright{\let'\codequoteright}
2454
2455
\gdef\markupsetnoligaturesquoteleft{\let`\noligaturesquoteleft}
2456
}
2457
2458
\let\markupsetuplqcode \markupsetcodequoteleft
2459
\let\markupsetuprqcode \markupsetcodequoteright
2460
\let\markupsetuplqexample \markupsetcodequoteleft
2461
\let\markupsetuprqexample \markupsetcodequoteright
2462
\let\markupsetuplqverb \markupsetcodequoteleft
2463
\let\markupsetuprqverb \markupsetcodequoteright
2464
\let\markupsetuplqverbatim \markupsetcodequoteleft
2465
\let\markupsetuprqverbatim \markupsetcodequoteright
2466
2467
\let\markupsetuplqsamp \markupsetnoligaturesquoteleft
2468
\let\markupsetuplqkbd \markupsetnoligaturesquoteleft
2469
2470
% Allow an option to not replace quotes with a regular directed right
2471
% quote/apostrophe (char 0x27), but instead use the undirected quote
2472
% from cmtt (char 0x0d).  The undirected quote is ugly, so don't make it
2473
% the default, but it works for pasting with more pdf viewers (at least
2474
% evince), the lilypond developers report.  xpdf does work with the
2475
% regular 0x27.
2476
%
2477
\def\codequoteright{%
2478
  \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax
2479
    \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax
2480
      '%
2481
    \else \char'15 \fi
2482
  \else \char'15 \fi
2483
}
2484
%
2485
% and a similar option for the left quote char vs. a grave accent.
2486
% Modern fonts display ASCII 0x60 as a grave accent, so some people like
2487
% the code environments to do likewise.
2488
%
2489
\def\codequoteleft{%
2490
  \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax
2491
    \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax
2492
      % [Knuth] pp. 380,381,391
2493
      % \relax disables Spanish ligatures ?` and !` of \tt font.
2494
      \relax`%
2495
    \else \char'22 \fi
2496
  \else \char'22 \fi
2497
}
2498
2499
% [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font.
2500
\def\noligaturesquoteleft{\relax\lq}
1511
2501
1512
% Count depth in font-changes, for error checks
2502
% Count depth in font-changes, for error checks
1513
\newcount\fontdepth \fontdepth=0
2503
\newcount\fontdepth \fontdepth=0
1514
2504
1515
% Fonts for short table of contents.
1516
\setfont\shortcontrm\rmshape{12}{1000}
1517
\setfont\shortcontbf\bxshape{12}{1000}
1518
\setfont\shortcontsl\slshape{12}{1000}
1519
\setfont\shortconttt\ttshape{12}{1000}
1520
1521
%% Add scribe-like font environments, plus @l for inline lisp (usually sans
2505
%% Add scribe-like font environments, plus @l for inline lisp (usually sans
1522
%% serif) and @ii for TeX italic
2506
%% serif) and @ii for TeX italic
1523
2507
Lines 1528-1542 Link Here
1528
\def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx}
2512
\def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx}
1529
\def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx}
2513
\def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx}
1530
2514
2515
% like \smartslanted except unconditionally uses \ttsl.
2516
% @var is set to this for defun arguments.
2517
\def\ttslanted#1{{\ttsl #1}\futurelet\next\smartitalicx}
2518
2519
% @cite is like \smartslanted except unconditionally use \sl.  We never want
2520
% ttsl for book titles, do we?
2521
\def\cite#1{{\sl #1}\futurelet\next\smartitalicx}
2522
1531
\let\i=\smartitalic
2523
\let\i=\smartitalic
1532
\let\var=\smartslanted
2524
\let\slanted=\smartslanted
2525
\def\var#1{{\setupmarkupstyle{var}\smartslanted{#1}}}
1533
\let\dfn=\smartslanted
2526
\let\dfn=\smartslanted
1534
\let\emph=\smartitalic
2527
\let\emph=\smartitalic
1535
\let\cite=\smartslanted
1536
2528
2529
% Explicit font changes: @r, @sc, undocumented @ii.
2530
\def\r#1{{\rm #1}}              % roman font
2531
\def\sc#1{{\smallcaps#1}}       % smallcaps font
2532
\def\ii#1{{\it #1}}             % italic font
2533
2534
% @b, explicit bold.  Also @strong.
1537
\def\b#1{{\bf #1}}
2535
\def\b#1{{\bf #1}}
1538
\let\strong=\b
2536
\let\strong=\b
1539
2537
2538
% @sansserif, explicit sans.
2539
\def\sansserif#1{{\sf #1}}
2540
1540
% We can't just use \exhyphenpenalty, because that only has effect at
2541
% We can't just use \exhyphenpenalty, because that only has effect at
1541
% the end of a paragraph.  Restore normal hyphenation at the end of the
2542
% the end of a paragraph.  Restore normal hyphenation at the end of the
1542
% group within which \nohyphenation is presumably called.
2543
% group within which \nohyphenation is presumably called.
Lines 1549-1576 Link Here
1549
% sometimes \x has an active definition that messes things up.
2550
% sometimes \x has an active definition that messes things up.
1550
%
2551
%
1551
\catcode`@=11
2552
\catcode`@=11
1552
  \def\frenchspacing{%
2553
  \def\plainfrenchspacing{%
1553
    \sfcode\dotChar  =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m
2554
    \sfcode\dotChar  =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m
1554
    \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m
2555
    \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m
2556
    \def\endofsentencespacefactor{1000}% for @. and friends
2557
  }
2558
  \def\plainnonfrenchspacing{%
2559
    \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000
2560
    \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250
2561
    \def\endofsentencespacefactor{3000}% for @. and friends
1555
  }
2562
  }
1556
\catcode`@=\other
2563
\catcode`@=\other
2564
\def\endofsentencespacefactor{3000}% default
1557
2565
2566
% @t, explicit typewriter.
1558
\def\t#1{%
2567
\def\t#1{%
1559
  {\tt \rawbackslash \frenchspacing #1}%
2568
  {\tt \rawbackslash \plainfrenchspacing #1}%
1560
  \null
2569
  \null
1561
}
2570
}
1562
\let\ttfont=\t
2571
1563
\def\samp#1{`\tclose{#1}'\null}
2572
% @samp.
1564
\setfont\keyrm\rmshape{8}{1000}
2573
\def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}}
1565
\font\keysy=cmsy9
2574
1566
\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{%
2575
% definition of @key that produces a lozenge.  Doesn't adjust to text size.
1567
  \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{%
2576
%\setfont\keyrm\rmshape{8}{1000}{OT1}
1568
    \vbox{\hrule\kern-0.4pt
2577
%\font\keysy=cmsy9
1569
     \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}%
2578
%\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{%
1570
    \kern-0.4pt\hrule}%
2579
%  \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{%
1571
  \kern-.06em\raise0.4pt\hbox{\angleright}}}}
2580
%    \vbox{\hrule\kern-0.4pt
1572
% The old definition, with no lozenge:
2581
%     \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}%
1573
%\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null}
2582
%    \kern-0.4pt\hrule}%
2583
%  \kern-.06em\raise0.4pt\hbox{\angleright}}}}
2584
2585
% definition of @key with no lozenge.  If the current font is already
2586
% monospace, don't change it; that way, we respect @kbdinputstyle.  But
2587
% if it isn't monospace, then use \tt.
2588
%
2589
\def\key#1{{\setupmarkupstyle{key}%
2590
  \nohyphenation
2591
  \ifmonospace\else\tt\fi
2592
  #1}\null}
2593
2594
% ctrl is no longer a Texinfo command.
1574
\def\ctrl #1{{\tt \rawbackslash \hat}#1}
2595
\def\ctrl #1{{\tt \rawbackslash \hat}#1}
1575
2596
1576
% @file, @option are the same as @samp.
2597
% @file, @option are the same as @samp.
Lines 1594-1606 Link Here
1594
    \nohyphenation
2615
    \nohyphenation
1595
    %
2616
    %
1596
    \rawbackslash
2617
    \rawbackslash
1597
    \frenchspacing
2618
    \plainfrenchspacing
1598
    #1%
2619
    #1%
1599
  }%
2620
  }%
1600
  \null
2621
  \null
1601
}
2622
}
1602
2623
1603
% We *must* turn on hyphenation at `-' and `_' in \code.
2624
% We *must* turn on hyphenation at `-' and `_' in @code.
1604
% Otherwise, it is too hard to avoid overfull hboxes
2625
% Otherwise, it is too hard to avoid overfull hboxes
1605
% in the Emacs manual, the Library manual, etc.
2626
% in the Emacs manual, the Library manual, etc.
1606
2627
Lines 1610-1627 Link Here
1610
% and arrange explicitly to hyphenate at a dash.
2631
% and arrange explicitly to hyphenate at a dash.
1611
%  -- rms.
2632
%  -- rms.
1612
{
2633
{
1613
  \catcode`\-=\active
2634
  \catcode`\-=\active \catcode`\_=\active
1614
  \catcode`\_=\active
2635
  \catcode`\'=\active \catcode`\`=\active
2636
  \global\let'=\rq \global\let`=\lq  % default definitions
1615
  %
2637
  %
1616
  \global\def\code{\begingroup
2638
  \global\def\code{\begingroup
1617
    \catcode`\-=\active \let-\codedash
2639
    \setupmarkupstyle{code}%
1618
    \catcode`\_=\active \let_\codeunder
2640
    % The following should really be moved into \setupmarkupstyle handlers.
2641
    \catcode\dashChar=\active  \catcode\underChar=\active
2642
    \ifallowcodebreaks
2643
     \let-\codedash
2644
     \let_\codeunder
2645
    \else
2646
     \let-\realdash
2647
     \let_\realunder
2648
    \fi
1619
    \codex
2649
    \codex
1620
  }
2650
  }
1621
  %
1622
  % If we end up with any active - characters when handling the index,
1623
  % just treat them as a normal -.
1624
  \global\def\indexbreaks{\catcode`\-=\active \let-\realdash}
1625
}
2651
}
1626
2652
1627
\def\realdash{-}
2653
\def\realdash{-}
Lines 1639-1682 Link Here
1639
}
2665
}
1640
\def\codex #1{\tclose{#1}\endgroup}
2666
\def\codex #1{\tclose{#1}\endgroup}
1641
2667
2668
% An additional complication: the above will allow breaks after, e.g.,
2669
% each of the four underscores in __typeof__.  This is undesirable in
2670
% some manuals, especially if they don't have long identifiers in
2671
% general.  @allowcodebreaks provides a way to control this.
2672
%
2673
\newif\ifallowcodebreaks  \allowcodebreakstrue
2674
2675
\def\keywordtrue{true}
2676
\def\keywordfalse{false}
2677
2678
\parseargdef\allowcodebreaks{%
2679
  \def\txiarg{#1}%
2680
  \ifx\txiarg\keywordtrue
2681
    \allowcodebreakstrue
2682
  \else\ifx\txiarg\keywordfalse
2683
    \allowcodebreaksfalse
2684
  \else
2685
    \errhelp = \EMsimple
2686
    \errmessage{Unknown @allowcodebreaks option `\txiarg'}%
2687
  \fi\fi
2688
}
2689
1642
% @kbd is like @code, except that if the argument is just one @key command,
2690
% @kbd is like @code, except that if the argument is just one @key command,
1643
% then @kbd has no effect.
2691
% then @kbd has no effect.
2692
\def\kbd#1{{\setupmarkupstyle{kbd}\def\look{#1}\expandafter\kbdfoo\look??\par}}
1644
2693
1645
% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
2694
% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
1646
%   `example' (@kbd uses ttsl only inside of @example and friends),
2695
%   `example' (@kbd uses ttsl only inside of @example and friends),
1647
%   or `code' (@kbd uses normal tty font always).
2696
%   or `code' (@kbd uses normal tty font always).
1648
\def\kbdinputstyle{\parsearg\kbdinputstylexxx}
2697
\parseargdef\kbdinputstyle{%
1649
\def\kbdinputstylexxx#1{%
2698
  \def\txiarg{#1}%
1650
  \def\arg{#1}%
2699
  \ifx\txiarg\worddistinct
1651
  \ifx\arg\worddistinct
1652
    \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
2700
    \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
1653
  \else\ifx\arg\wordexample
2701
  \else\ifx\txiarg\wordexample
1654
    \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%
2702
    \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%
1655
  \else\ifx\arg\wordcode
2703
  \else\ifx\txiarg\wordcode
1656
    \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
2704
    \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
1657
  \else
2705
  \else
1658
    \errhelp = \EMsimple
2706
    \errhelp = \EMsimple
1659
    \errmessage{Unknown @kbdinputstyle option `\arg'}%
2707
    \errmessage{Unknown @kbdinputstyle option `\txiarg'}%
1660
  \fi\fi\fi
2708
  \fi\fi\fi
1661
}
2709
}
1662
\def\worddistinct{distinct}
2710
\def\worddistinct{distinct}
1663
\def\wordexample{example}
2711
\def\wordexample{example}
1664
\def\wordcode{code}
2712
\def\wordcode{code}
1665
2713
1666
% Default is `distinct.'
2714
% Default is `distinct'.
1667
\kbdinputstyle distinct
2715
\kbdinputstyle distinct
1668
2716
1669
\def\xkey{\key}
2717
\def\xkey{\key}
1670
\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
2718
\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
1671
\ifx\one\xkey\ifx\threex\three \key{#2}%
2719
\ifx\one\xkey\ifx\threex\three \key{#2}%
1672
\else{\tclose{\kbdfont\look}}\fi
2720
\else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi
1673
\else{\tclose{\kbdfont\look}}\fi}
2721
\else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi}
1674
2722
1675
% For @url, @env, @command quotes seem unnecessary, so use \code.
2723
% For @indicateurl, @env, @command quotes seem unnecessary, so use \code.
1676
\let\url=\code
2724
\let\indicateurl=\code
1677
\let\env=\code
2725
\let\env=\code
1678
\let\command=\code
2726
\let\command=\code
1679
2727
2728
% @clicksequence{File @click{} Open ...}
2729
\def\clicksequence#1{\begingroup #1\endgroup}
2730
2731
% @clickstyle @arrow   (by default)
2732
\parseargdef\clickstyle{\def\click{#1}}
2733
\def\click{\arrow}
2734
1680
% @uref (abbreviation for `urlref') takes an optional (comma-separated)
2735
% @uref (abbreviation for `urlref') takes an optional (comma-separated)
1681
% second argument specifying the text to display and an optional third
2736
% second argument specifying the text to display and an optional third
1682
% arg as text to display instead of (rather than in addition to) the url
2737
% arg as text to display instead of (rather than in addition to) the url
Lines 1705-1710 Link Here
1705
  \endlink
2760
  \endlink
1706
\endgroup}
2761
\endgroup}
1707
2762
2763
% @url synonym for @uref, since that's how everyone uses it.
2764
%
2765
\let\url=\uref
2766
1708
% rms does not like angle brackets --karl, 17may97.
2767
% rms does not like angle brackets --karl, 17may97.
1709
% So now @email is just like @uref, unless we are pdf.
2768
% So now @email is just like @uref, unless we are pdf.
1710
%
2769
%
Lines 1722-1767 Link Here
1722
  \let\email=\uref
2781
  \let\email=\uref
1723
\fi
2782
\fi
1724
2783
1725
% Check if we are currently using a typewriter font.  Since all the
1726
% Computer Modern typewriter fonts have zero interword stretch (and
1727
% shrink), and it is reasonable to expect all typewriter fonts to have
1728
% this property, we can check that font parameter.
1729
%
1730
\def\ifmonospace{\ifdim\fontdimen3\font=0pt }
1731
1732
% Typeset a dimension, e.g., `in' or `pt'.  The only reason for the
2784
% Typeset a dimension, e.g., `in' or `pt'.  The only reason for the
1733
% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
2785
% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
1734
%
2786
%
1735
\def\dmn#1{\thinspace #1}
2787
\def\dmn#1{\thinspace #1}
1736
2788
1737
\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par}
1738
1739
% @l was never documented to mean ``switch to the Lisp font'',
2789
% @l was never documented to mean ``switch to the Lisp font'',
1740
% and it is not used as such in any manual I can find.  We need it for
2790
% and it is not used as such in any manual I can find.  We need it for
1741
% Polish suppressed-l.  --karl, 22sep96.
2791
% Polish suppressed-l.  --karl, 22sep96.
1742
%\def\l#1{{\li #1}\null}
2792
%\def\l#1{{\li #1}\null}
1743
2793
1744
% Explicit font changes: @r, @sc, undocumented @ii.
2794
% @acronym for "FBI", "NATO", and the like.
1745
\def\r#1{{\rm #1}}              % roman font
2795
% We print this one point size smaller, since it's intended for
1746
\def\sc#1{{\smallcaps#1}}       % smallcaps font
2796
% all-uppercase.
1747
\def\ii#1{{\it #1}}             % italic font
2797
%
2798
\def\acronym#1{\doacronym #1,,\finish}
2799
\def\doacronym#1,#2,#3\finish{%
2800
  {\selectfonts\lsize #1}%
2801
  \def\temp{#2}%
2802
  \ifx\temp\empty \else
2803
    \space ({\unsepspaces \ignorespaces \temp \unskip})%
2804
  \fi
2805
}
2806
2807
% @abbr for "Comput. J." and the like.
2808
% No font change, but don't do end-of-sentence spacing.
2809
%
2810
\def\abbr#1{\doabbr #1,,\finish}
2811
\def\doabbr#1,#2,#3\finish{%
2812
  {\plainfrenchspacing #1}%
2813
  \def\temp{#2}%
2814
  \ifx\temp\empty \else
2815
    \space ({\unsepspaces \ignorespaces \temp \unskip})%
2816
  \fi
2817
}
2818
2819
2820
\message{glyphs,}
2821
2822
% @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
2823
%
2824
% Since these characters are used in examples, they should be an even number of
2825
% \tt widths. Each \tt character is 1en, so two makes it 1em.
2826
%
2827
\def\point{$\star$}
2828
\def\arrow{\leavevmode\raise.05ex\hbox to 1em{\hfil$\rightarrow$\hfil}}
2829
\def\result{\leavevmode\raise.05ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
2830
\def\expansion{\leavevmode\hbox to 1em{\hfil$\mapsto$\hfil}}
2831
\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
2832
\def\equiv{\leavevmode\hbox to 1em{\hfil$\ptexequiv$\hfil}}
1748
2833
1749
% @acronym downcases the argument and prints in smallcaps.
2834
% The @error{} command.
1750
\def\acronym#1{{\smallcaps \lowercase{#1}}}
2835
% Adapted from the TeXbook's \boxit.
2836
%
2837
\newbox\errorbox
2838
%
2839
{\tentt \global\dimen0 = 3em}% Width of the box.
2840
\dimen2 = .55pt % Thickness of rules
2841
% The text. (`r' is open on the right, `e' somewhat less so on the left.)
2842
\setbox0 = \hbox{\kern-.75pt \reducedsf error\kern-1.5pt}
2843
%
2844
\setbox\errorbox=\hbox to \dimen0{\hfil
2845
   \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
2846
   \advance\hsize by -2\dimen2 % Rules.
2847
   \vbox{%
2848
      \hrule height\dimen2
2849
      \hbox{\vrule width\dimen2 \kern3pt          % Space to left of text.
2850
         \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
2851
         \kern3pt\vrule width\dimen2}% Space to right.
2852
      \hrule height\dimen2}
2853
    \hfil}
2854
%
2855
\def\error{\leavevmode\lower.7ex\copy\errorbox}
1751
2856
1752
% @pounds{} is a sterling sign.
2857
% @pounds{} is a sterling sign, which Knuth put in the CM italic font.
2858
%
1753
\def\pounds{{\it\$}}
2859
\def\pounds{{\it\$}}
1754
2860
1755
% @registeredsymbol - R in a circle.  For now, only works in text size;
2861
% @euro{} comes from a separate font, depending on the current style.
1756
% we'd have to redo the font mechanism to change the \scriptstyle and
2862
% We use the free feym* fonts from the eurosym package by Henrik
1757
% \scriptscriptstyle font sizes to make it look right in headings.
2863
% Theiling, which support regular, slanted, bold and bold slanted (and
2864
% "outlined" (blackboard board, sort of) versions, which we don't need).
2865
% It is available from http://www.ctan.org/tex-archive/fonts/eurosym.
2866
%
2867
% Although only regular is the truly official Euro symbol, we ignore
2868
% that.  The Euro is designed to be slightly taller than the regular
2869
% font height.
2870
%
2871
% feymr - regular
2872
% feymo - slanted
2873
% feybr - bold
2874
% feybo - bold slanted
2875
%
2876
% There is no good (free) typewriter version, to my knowledge.
2877
% A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide.
2878
% Hmm.
2879
%
2880
% Also doesn't work in math.  Do we need to do math with euro symbols?
2881
% Hope not.
2882
%
2883
%
2884
\def\euro{{\eurofont e}}
2885
\def\eurofont{%
2886
  % We set the font at each command, rather than predefining it in
2887
  % \textfonts and the other font-switching commands, so that
2888
  % installations which never need the symbol don't have to have the
2889
  % font installed.
2890
  %
2891
  % There is only one designed size (nominal 10pt), so we always scale
2892
  % that to the current nominal size.
2893
  %
2894
  % By the way, simply using "at 1em" works for cmr10 and the like, but
2895
  % does not work for cmbx10 and other extended/shrunken fonts.
2896
  %
2897
  \def\eurosize{\csname\curfontsize nominalsize\endcsname}%
2898
  %
2899
  \ifx\curfontstyle\bfstylename
2900
    % bold:
2901
    \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize
2902
  \else
2903
    % regular:
2904
    \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize
2905
  \fi
2906
  \thiseurofont
2907
}
2908
2909
% Glyphs from the EC fonts.  We don't use \let for the aliases, because
2910
% sometimes we redefine the original macro, and the alias should reflect
2911
% the redefinition.
2912
%
2913
% Use LaTeX names for the Icelandic letters.
2914
\def\DH{{\ecfont \char"D0}} % Eth
2915
\def\dh{{\ecfont \char"F0}} % eth
2916
\def\TH{{\ecfont \char"DE}} % Thorn
2917
\def\th{{\ecfont \char"FE}} % thorn
2918
%
2919
\def\guillemetleft{{\ecfont \char"13}}
2920
\def\guillemotleft{\guillemetleft}
2921
\def\guillemetright{{\ecfont \char"14}}
2922
\def\guillemotright{\guillemetright}
2923
\def\guilsinglleft{{\ecfont \char"0E}}
2924
\def\guilsinglright{{\ecfont \char"0F}}
2925
\def\quotedblbase{{\ecfont \char"12}}
2926
\def\quotesinglbase{{\ecfont \char"0D}}
2927
%
2928
% This positioning is not perfect (see the ogonek LaTeX package), but
2929
% we have the precomposed glyphs for the most common cases.  We put the
2930
% tests to use those glyphs in the single \ogonek macro so we have fewer
2931
% dummy definitions to worry about for index entries, etc.
2932
%
2933
% ogonek is also used with other letters in Lithuanian (IOU), but using
2934
% the precomposed glyphs for those is not so easy since they aren't in
2935
% the same EC font.
2936
\def\ogonek#1{{%
2937
  \def\temp{#1}%
2938
  \ifx\temp\macrocharA\Aogonek
2939
  \else\ifx\temp\macrochara\aogonek
2940
  \else\ifx\temp\macrocharE\Eogonek
2941
  \else\ifx\temp\macrochare\eogonek
2942
  \else
2943
    \ecfont \setbox0=\hbox{#1}%
2944
    \ifdim\ht0=1ex\accent"0C #1%
2945
    \else\ooalign{\unhbox0\crcr\hidewidth\char"0C \hidewidth}%
2946
    \fi
2947
  \fi\fi\fi\fi
2948
  }%
2949
}
2950
\def\Aogonek{{\ecfont \char"81}}\def\macrocharA{A}
2951
\def\aogonek{{\ecfont \char"A1}}\def\macrochara{a}
2952
\def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E}
2953
\def\eogonek{{\ecfont \char"A6}}\def\macrochare{e}
2954
%
2955
% Use the ec* fonts (cm-super in outline format) for non-CM glyphs.
2956
\def\ecfont{%
2957
  % We can't distinguish serif/sans and italic/slanted, but this
2958
  % is used for crude hacks anyway (like adding French and German
2959
  % quotes to documents typeset with CM, where we lose kerning), so
2960
  % hopefully nobody will notice/care.
2961
  \edef\ecsize{\csname\curfontsize ecsize\endcsname}%
2962
  \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}%
2963
  \ifx\curfontstyle\bfstylename
2964
    % bold:
2965
    \font\thisecfont = ecb\ifusingit{i}{x}\ecsize \space at \nominalsize
2966
  \else
2967
    % regular:
2968
    \font\thisecfont = ec\ifusingit{ti}{rm}\ecsize \space at \nominalsize
2969
  \fi
2970
  \thisecfont
2971
}
2972
2973
% @registeredsymbol - R in a circle.  The font for the R should really
2974
% be smaller yet, but lllsize is the best we can do for now.
1758
% Adapted from the plain.tex definition of \copyright.
2975
% Adapted from the plain.tex definition of \copyright.
1759
%
2976
%
1760
\def\registeredsymbol{%
2977
\def\registeredsymbol{%
1761
  $^{{\ooalign{\hfil\raise.07ex\hbox{$\scriptstyle\rm R$}\hfil\crcr\Orb}}%
2978
  $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}%
2979
               \hfil\crcr\Orb}}%
1762
    }$%
2980
    }$%
1763
}
2981
}
1764
2982
2983
% @textdegree - the normal degrees sign.
2984
%
2985
\def\textdegree{$^\circ$}
2986
2987
% Laurent Siebenmann reports \Orb undefined with:
2988
%  Textures 1.7.7 (preloaded format=plain 93.10.14)  (68K)  16 APR 2004 02:38
2989
% so we'll define it if necessary.
2990
%
2991
\ifx\Orb\undefined
2992
\def\Orb{\mathhexbox20D}
2993
\fi
2994
2995
% Quotes.
2996
\chardef\quotedblleft="5C
2997
\chardef\quotedblright=`\"
2998
\chardef\quoteleft=`\`
2999
\chardef\quoteright=`\'
3000
1765
3001
1766
\message{page headings,}
3002
\message{page headings,}
1767
3003
Lines 1780-1866 Link Here
1780
\newif\ifsetshortcontentsaftertitlepage
3016
\newif\ifsetshortcontentsaftertitlepage
1781
 \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue
3017
 \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue
1782
3018
1783
\def\shorttitlepage{\parsearg\shorttitlepagezzz}
3019
\parseargdef\shorttitlepage{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%
1784
\def\shorttitlepagezzz #1{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%
1785
        \endgroup\page\hbox{}\page}
3020
        \endgroup\page\hbox{}\page}
1786
3021
1787
\def\titlepage{\begingroup \parindent=0pt \textfonts
3022
\envdef\titlepage{%
1788
   \let\subtitlerm=\tenrm
3023
  % Open one extra group, as we want to close it in the middle of \Etitlepage.
1789
   \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}%
3024
  \begingroup
1790
   %
3025
    \parindent=0pt \textfonts
1791
   \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines
3026
    % Leave some space at the very top of the page.
1792
                   \let\tt=\authortt}%
3027
    \vglue\titlepagetopglue
1793
   %
3028
    % No rule at page bottom unless we print one at the top with @title.
1794
   % Leave some space at the very top of the page.
3029
    \finishedtitlepagetrue
1795
   \vglue\titlepagetopglue
3030
    %
1796
   %
3031
    % Most title ``pages'' are actually two pages long, with space
1797
   % Now you can print the title using @title.
3032
    % at the top of the second.  We don't want the ragged left on the second.
1798
   \def\title{\parsearg\titlezzz}%
3033
    \let\oldpage = \page
1799
   \def\titlezzz##1{\leftline{\titlefonts\rm ##1}
3034
    \def\page{%
1800
                    % print a rule at the page bottom also.
1801
                    \finishedtitlepagefalse
1802
                    \vskip4pt \hrule height 4pt width \hsize \vskip4pt}%
1803
   % No rule at page bottom unless we print one at the top with @title.
1804
   \finishedtitlepagetrue
1805
   %
1806
   % Now you can put text using @subtitle.
1807
   \def\subtitle{\parsearg\subtitlezzz}%
1808
   \def\subtitlezzz##1{{\subtitlefont \rightline{##1}}}%
1809
   %
1810
   % @author should come last, but may come many times.
1811
   \def\author{\parsearg\authorzzz}%
1812
   \def\authorzzz##1{\ifseenauthor\else\vskip 0pt plus 1filll\seenauthortrue\fi
1813
      {\authorfont \leftline{##1}}}%
1814
   %
1815
   % Most title ``pages'' are actually two pages long, with space
1816
   % at the top of the second.  We don't want the ragged left on the second.
1817
   \let\oldpage = \page
1818
   \def\page{%
1819
      \iffinishedtitlepage\else
3035
      \iffinishedtitlepage\else
1820
         \finishtitlepage
3036
	 \finishtitlepage
1821
      \fi
3037
      \fi
1822
      \oldpage
1823
      \let\page = \oldpage
3038
      \let\page = \oldpage
1824
      \hbox{}}%
3039
      \page
1825
%   \def\page{\oldpage \hbox{}}
3040
      \null
3041
    }%
1826
}
3042
}
1827
3043
1828
\def\Etitlepage{%
3044
\def\Etitlepage{%
1829
   \iffinishedtitlepage\else
3045
    \iffinishedtitlepage\else
1830
      \finishtitlepage
3046
	\finishtitlepage
1831
   \fi
3047
    \fi
1832
   % It is important to do the page break before ending the group,
3048
    % It is important to do the page break before ending the group,
1833
   % because the headline and footline are only empty inside the group.
3049
    % because the headline and footline are only empty inside the group.
1834
   % If we use the new definition of \page, we always get a blank page
3050
    % If we use the new definition of \page, we always get a blank page
1835
   % after the title page, which we certainly don't want.
3051
    % after the title page, which we certainly don't want.
1836
   \oldpage
3052
    \oldpage
1837
   \endgroup
3053
  \endgroup
1838
   %
3054
  %
1839
   % Need this before the \...aftertitlepage checks so that if they are
3055
  % Need this before the \...aftertitlepage checks so that if they are
1840
   % in effect the toc pages will come out with page numbers.
3056
  % in effect the toc pages will come out with page numbers.
1841
   \HEADINGSon
3057
  \HEADINGSon
1842
   %
3058
  %
1843
   % If they want short, they certainly want long too.
3059
  % If they want short, they certainly want long too.
1844
   \ifsetshortcontentsaftertitlepage
3060
  \ifsetshortcontentsaftertitlepage
1845
     \shortcontents
3061
    \shortcontents
1846
     \contents
3062
    \contents
1847
     \global\let\shortcontents = \relax
3063
    \global\let\shortcontents = \relax
1848
     \global\let\contents = \relax
3064
    \global\let\contents = \relax
1849
   \fi
3065
  \fi
1850
   %
3066
  %
1851
   \ifsetcontentsaftertitlepage
3067
  \ifsetcontentsaftertitlepage
1852
     \contents
3068
    \contents
1853
     \global\let\contents = \relax
3069
    \global\let\contents = \relax
1854
     \global\let\shortcontents = \relax
3070
    \global\let\shortcontents = \relax
1855
   \fi
3071
  \fi
1856
}
3072
}
1857
3073
1858
\def\finishtitlepage{%
3074
\def\finishtitlepage{%
1859
   \vskip4pt \hrule height 2pt width \hsize
3075
  \vskip4pt \hrule height 2pt width \hsize
1860
   \vskip\titlepagebottomglue
3076
  \vskip\titlepagebottomglue
1861
   \finishedtitlepagetrue
3077
  \finishedtitlepagetrue
3078
}
3079
3080
%%% Macros to be used within @titlepage:
3081
3082
\let\subtitlerm=\tenrm
3083
\def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}
3084
3085
\parseargdef\title{%
3086
  \checkenv\titlepage
3087
  \leftline{\titlefonts\rmisbold #1}
3088
  % print a rule at the page bottom also.
3089
  \finishedtitlepagefalse
3090
  \vskip4pt \hrule height 4pt width \hsize \vskip4pt
3091
}
3092
3093
\parseargdef\subtitle{%
3094
  \checkenv\titlepage
3095
  {\subtitlefont \rightline{#1}}%
3096
}
3097
3098
% @author should come last, but may come many times.
3099
% It can also be used inside @quotation.
3100
%
3101
\parseargdef\author{%
3102
  \def\temp{\quotation}%
3103
  \ifx\thisenv\temp
3104
    \def\quotationauthor{#1}% printed in \Equotation.
3105
  \else
3106
    \checkenv\titlepage
3107
    \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi
3108
    {\secfonts\rmisbold \leftline{#1}}%
3109
  \fi
1862
}
3110
}
1863
3111
3112
1864
%%% Set up page headings and footings.
3113
%%% Set up page headings and footings.
1865
3114
1866
\let\thispage=\folio
3115
\let\thispage=\folio
Lines 1870-1876 Link Here
1870
\newtoks\evenfootline    % footline on even pages
3119
\newtoks\evenfootline    % footline on even pages
1871
\newtoks\oddfootline     % footline on odd pages
3120
\newtoks\oddfootline     % footline on odd pages
1872
3121
1873
% Now make Tex use those variables
3122
% Now make TeX use those variables
1874
\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
3123
\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
1875
                            \else \the\evenheadline \fi}}
3124
                            \else \the\evenheadline \fi}}
1876
\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
3125
\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
Lines 1884-1926 Link Here
1884
% @evenfooting @thisfile||
3133
% @evenfooting @thisfile||
1885
% @oddfooting ||@thisfile
3134
% @oddfooting ||@thisfile
1886
3135
1887
\def\evenheading{\parsearg\evenheadingxxx}
1888
\def\oddheading{\parsearg\oddheadingxxx}
1889
\def\everyheading{\parsearg\everyheadingxxx}
1890
1891
\def\evenfooting{\parsearg\evenfootingxxx}
1892
\def\oddfooting{\parsearg\oddfootingxxx}
1893
\def\everyfooting{\parsearg\everyfootingxxx}
1894
3136
1895
{\catcode`\@=0 %
3137
\def\evenheading{\parsearg\evenheadingxxx}
1896
3138
\def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish}
1897
\gdef\evenheadingxxx #1{\evenheadingyyy #1@|@|@|@|\finish}
3139
\def\evenheadingyyy #1\|#2\|#3\|#4\finish{%
1898
\gdef\evenheadingyyy #1@|#2@|#3@|#4\finish{%
1899
\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
3140
\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
1900
3141
1901
\gdef\oddheadingxxx #1{\oddheadingyyy #1@|@|@|@|\finish}
3142
\def\oddheading{\parsearg\oddheadingxxx}
1902
\gdef\oddheadingyyy #1@|#2@|#3@|#4\finish{%
3143
\def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish}
3144
\def\oddheadingyyy #1\|#2\|#3\|#4\finish{%
1903
\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
3145
\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
1904
3146
1905
\gdef\everyheadingxxx#1{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
3147
\parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
1906
3148
1907
\gdef\evenfootingxxx #1{\evenfootingyyy #1@|@|@|@|\finish}
3149
\def\evenfooting{\parsearg\evenfootingxxx}
1908
\gdef\evenfootingyyy #1@|#2@|#3@|#4\finish{%
3150
\def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish}
3151
\def\evenfootingyyy #1\|#2\|#3\|#4\finish{%
1909
\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
3152
\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
1910
3153
1911
\gdef\oddfootingxxx #1{\oddfootingyyy #1@|@|@|@|\finish}
3154
\def\oddfooting{\parsearg\oddfootingxxx}
1912
\gdef\oddfootingyyy #1@|#2@|#3@|#4\finish{%
3155
\def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish}
3156
\def\oddfootingyyy #1\|#2\|#3\|#4\finish{%
1913
  \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
3157
  \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
1914
  %
3158
  %
1915
  % Leave some space for the footline.  Hopefully ok to assume
3159
  % Leave some space for the footline.  Hopefully ok to assume
1916
  % @evenfooting will not be used by itself.
3160
  % @evenfooting will not be used by itself.
1917
  \global\advance\pageheight by -\baselineskip
3161
  \global\advance\pageheight by -12pt
1918
  \global\advance\vsize by -\baselineskip
3162
  \global\advance\vsize by -12pt
1919
}
3163
}
1920
3164
1921
\gdef\everyfootingxxx#1{\oddfootingxxx{#1}\evenfootingxxx{#1}}
3165
\parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}}
3166
3167
% @evenheadingmarks top     \thischapter <- chapter at the top of a page
3168
% @evenheadingmarks bottom  \thischapter <- chapter at the bottom of a page
1922
%
3169
%
1923
}% unbind the catcode of @.
3170
% The same set of arguments for:
3171
%
3172
% @oddheadingmarks
3173
% @evenfootingmarks
3174
% @oddfootingmarks
3175
% @everyheadingmarks
3176
% @everyfootingmarks
3177
3178
\def\evenheadingmarks{\headingmarks{even}{heading}}
3179
\def\oddheadingmarks{\headingmarks{odd}{heading}}
3180
\def\evenfootingmarks{\headingmarks{even}{footing}}
3181
\def\oddfootingmarks{\headingmarks{odd}{footing}}
3182
\def\everyheadingmarks#1 {\headingmarks{even}{heading}{#1}
3183
                          \headingmarks{odd}{heading}{#1} }
3184
\def\everyfootingmarks#1 {\headingmarks{even}{footing}{#1}
3185
                          \headingmarks{odd}{footing}{#1} }
3186
% #1 = even/odd, #2 = heading/footing, #3 = top/bottom.
3187
\def\headingmarks#1#2#3 {%
3188
  \expandafter\let\expandafter\temp \csname get#3headingmarks\endcsname
3189
  \global\expandafter\let\csname get#1#2marks\endcsname \temp
3190
}
3191
3192
\everyheadingmarks bottom
3193
\everyfootingmarks bottom
1924
3194
1925
% @headings double      turns headings on for double-sided printing.
3195
% @headings double      turns headings on for double-sided printing.
1926
% @headings single      turns headings on for single-sided printing.
3196
% @headings single      turns headings on for single-sided printing.
Lines 1934-1940 Link Here
1934
3204
1935
\def\headings #1 {\csname HEADINGS#1\endcsname}
3205
\def\headings #1 {\csname HEADINGS#1\endcsname}
1936
3206
1937
\def\HEADINGSoff{
3207
\def\HEADINGSoff{%
1938
\global\evenheadline={\hfil} \global\evenfootline={\hfil}
3208
\global\evenheadline={\hfil} \global\evenfootline={\hfil}
1939
\global\oddheadline={\hfil} \global\oddfootline={\hfil}}
3209
\global\oddheadline={\hfil} \global\oddfootline={\hfil}}
1940
\HEADINGSoff
3210
\HEADINGSoff
Lines 1943-1949 Link Here
1943
% chapter name on inside top of right hand pages, document
3213
% chapter name on inside top of right hand pages, document
1944
% title on inside top of left hand pages, and page numbers on outside top
3214
% title on inside top of left hand pages, and page numbers on outside top
1945
% edge of all pages.
3215
% edge of all pages.
1946
\def\HEADINGSdouble{
3216
\def\HEADINGSdouble{%
1947
\global\pageno=1
3217
\global\pageno=1
1948
\global\evenfootline={\hfil}
3218
\global\evenfootline={\hfil}
1949
\global\oddfootline={\hfil}
3219
\global\oddfootline={\hfil}
Lines 1955-1961 Link Here
1955
3225
1956
% For single-sided printing, chapter title goes across top left of page,
3226
% For single-sided printing, chapter title goes across top left of page,
1957
% page number on top right.
3227
% page number on top right.
1958
\def\HEADINGSsingle{
3228
\def\HEADINGSsingle{%
1959
\global\pageno=1
3229
\global\pageno=1
1960
\global\evenfootline={\hfil}
3230
\global\evenfootline={\hfil}
1961
\global\oddfootline={\hfil}
3231
\global\oddfootline={\hfil}
Lines 2002-2013 Link Here
2002
% @settitle line...  specifies the title of the document, for headings.
3272
% @settitle line...  specifies the title of the document, for headings.
2003
% It generates no output of its own.
3273
% It generates no output of its own.
2004
\def\thistitle{\putwordNoTitle}
3274
\def\thistitle{\putwordNoTitle}
2005
\def\settitle{\parsearg\settitlezzz}
3275
\def\settitle{\parsearg{\gdef\thistitle}}
2006
\def\settitlezzz #1{\gdef\thistitle{#1}}
2007
3276
2008
3277
2009
\message{tables,}
3278
\message{tables,}
2010
% Tables -- @table, @ftable, @vtable, @item(x), @kitem(x), @xitem(x).
3279
% Tables -- @table, @ftable, @vtable, @item(x).
2011
3280
2012
% default indentation of table text
3281
% default indentation of table text
2013
\newdimen\tableindent \tableindent=.8in
3282
\newdimen\tableindent \tableindent=.8in
Lines 2019-2025 Link Here
2019
% used internally for \itemindent minus \itemmargin
3288
% used internally for \itemindent minus \itemmargin
2020
\newdimen\itemmax
3289
\newdimen\itemmax
2021
3290
2022
% Note @table, @vtable, and @vtable define @item, @itemx, etc., with
3291
% Note @table, @ftable, and @vtable define @item, @itemx, etc., with
2023
% these defs.
3292
% these defs.
2024
% They also define \itemindex
3293
% They also define \itemindex
2025
% to index the item name in whatever manner is desired (perhaps none).
3294
% to index the item name in whatever manner is desired (perhaps none).
Lines 2031-2052 Link Here
2031
\def\internalBitem{\smallbreak \parsearg\itemzzz}
3300
\def\internalBitem{\smallbreak \parsearg\itemzzz}
2032
\def\internalBitemx{\itemxpar \parsearg\itemzzz}
3301
\def\internalBitemx{\itemxpar \parsearg\itemzzz}
2033
3302
2034
\def\internalBxitem "#1"{\def\xitemsubtopix{#1} \smallbreak \parsearg\xitemzzz}
2035
\def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \itemxpar \parsearg\xitemzzz}
2036
2037
\def\internalBkitem{\smallbreak \parsearg\kitemzzz}
2038
\def\internalBkitemx{\itemxpar \parsearg\kitemzzz}
2039
2040
\def\kitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \lastfunction}}%
2041
                 \itemzzz {#1}}
2042
2043
\def\xitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \xitemsubtopic}}%
2044
                 \itemzzz {#1}}
2045
2046
\def\itemzzz #1{\begingroup %
3303
\def\itemzzz #1{\begingroup %
2047
  \advance\hsize by -\rightskip
3304
  \advance\hsize by -\rightskip
2048
  \advance\hsize by -\tableindent
3305
  \advance\hsize by -\tableindent
2049
  \setbox0=\hbox{\itemfont{#1}}%
3306
  \setbox0=\hbox{\itemindicate{#1}}%
2050
  \itemindex{#1}%
3307
  \itemindex{#1}%
2051
  \nobreak % This prevents a break before @itemx.
3308
  \nobreak % This prevents a break before @itemx.
2052
  %
3309
  %
Lines 2070-2086 Link Here
2070
    % \parskip glue -- logically it's part of the @item we just started.
3327
    % \parskip glue -- logically it's part of the @item we just started.
2071
    \nobreak \vskip-\parskip
3328
    \nobreak \vskip-\parskip
2072
    %
3329
    %
2073
    % Stop a page break at the \parskip glue coming up.  (Unfortunately
3330
    % Stop a page break at the \parskip glue coming up.  However, if
2074
    % we can't prevent a possible page break at the following
3331
    % what follows is an environment such as @example, there will be no
2075
    % \baselineskip glue.)  However, if what follows is an environment
3332
    % \parskip glue; then the negative vskip we just inserted would
2076
    % such as @example, there will be no \parskip glue; then
3333
    % cause the example and the item to crash together.  So we use this
2077
    % the negative vskip we just would cause the example and the item to
3334
    % bizarre value of 10001 as a signal to \aboveenvbreak to insert
2078
    % crash together.  So we use this bizarre value of 10001 as a signal
3335
    % \parskip glue after all.  Section titles are handled this way also.
2079
    % to \aboveenvbreak to insert \parskip glue after all.
3336
    %
2080
    % (Possibly there are other commands that could be followed by
2081
    % @example which need the same treatment, but not section titles; or
2082
    % maybe section titles are the only special case and they should be
2083
    % penalty 10001...)
2084
    \penalty 10001
3337
    \penalty 10001
2085
    \endgroup
3338
    \endgroup
2086
    \itemxneedsnegativevskipfalse
3339
    \itemxneedsnegativevskipfalse
Lines 2100-2180 Link Here
2100
  \fi
3353
  \fi
2101
}
3354
}
2102
3355
2103
\def\item{\errmessage{@item while not in a table}}
3356
\def\item{\errmessage{@item while not in a list environment}}
2104
\def\itemx{\errmessage{@itemx while not in a table}}
3357
\def\itemx{\errmessage{@itemx while not in a list environment}}
2105
\def\kitem{\errmessage{@kitem while not in a table}}
2106
\def\kitemx{\errmessage{@kitemx while not in a table}}
2107
\def\xitem{\errmessage{@xitem while not in a table}}
2108
\def\xitemx{\errmessage{@xitemx while not in a table}}
2109
2110
% Contains a kludge to get @end[description] to work.
2111
\def\description{\tablez{\dontindex}{1}{}{}{}{}}
2112
3358
2113
% @table, @ftable, @vtable.
3359
% @table, @ftable, @vtable.
2114
\def\table{\begingroup\inENV\obeylines\obeyspaces\tablex}
3360
\envdef\table{%
2115
{\obeylines\obeyspaces%
3361
  \let\itemindex\gobble
2116
\gdef\tablex #1^^M{%
3362
  \tablecheck{table}%
2117
\tabley\dontindex#1        \endtabley}}
3363
}
2118
3364
\envdef\ftable{%
2119
\def\ftable{\begingroup\inENV\obeylines\obeyspaces\ftablex}
3365
  \def\itemindex ##1{\doind {fn}{\code{##1}}}%
2120
{\obeylines\obeyspaces%
3366
  \tablecheck{ftable}%
2121
\gdef\ftablex #1^^M{%
3367
}
2122
\tabley\fnitemindex#1        \endtabley
3368
\envdef\vtable{%
2123
\def\Eftable{\endgraf\afterenvbreak\endgroup}%
3369
  \def\itemindex ##1{\doind {vr}{\code{##1}}}%
2124
\let\Etable=\relax}}
3370
  \tablecheck{vtable}%
2125
3371
}
2126
\def\vtable{\begingroup\inENV\obeylines\obeyspaces\vtablex}
3372
\def\tablecheck#1{%
2127
{\obeylines\obeyspaces%
3373
  \ifnum \the\catcode`\^^M=\active
2128
\gdef\vtablex #1^^M{%
3374
    \endgroup
2129
\tabley\vritemindex#1        \endtabley
3375
    \errmessage{This command won't work in this context; perhaps the problem is
2130
\def\Evtable{\endgraf\afterenvbreak\endgroup}%
3376
      that we are \inenvironment\thisenv}%
2131
\let\Etable=\relax}}
3377
    \def\next{\doignore{#1}}%
2132
3378
  \else
2133
\def\dontindex #1{}
3379
    \let\next\tablex
2134
\def\fnitemindex #1{\doind {fn}{\code{#1}}}%
3380
  \fi
2135
\def\vritemindex #1{\doind {vr}{\code{#1}}}%
3381
  \next
2136
3382
}
2137
{\obeyspaces %
3383
\def\tablex#1{%
2138
\gdef\tabley#1#2 #3 #4 #5 #6 #7\endtabley{\endgroup%
3384
  \def\itemindicate{#1}%
2139
\tablez{#1}{#2}{#3}{#4}{#5}{#6}}}
3385
  \parsearg\tabley
2140
3386
}
2141
\def\tablez #1#2#3#4#5#6{%
3387
\def\tabley#1{%
2142
\aboveenvbreak %
3388
  {%
2143
\begingroup %
3389
    \makevalueexpandable
2144
\def\Edescription{\Etable}% Necessary kludge.
3390
    \edef\temp{\noexpand\tablez #1\space\space\space}%
2145
\let\itemindex=#1%
3391
    \expandafter
2146
\ifnum 0#3>0 \advance \leftskip by #3\mil \fi %
3392
  }\temp \endtablez
2147
\ifnum 0#4>0 \tableindent=#4\mil \fi %
2148
\ifnum 0#5>0 \advance \rightskip by #5\mil \fi %
2149
\def\itemfont{#2}%
2150
\itemmax=\tableindent %
2151
\advance \itemmax by -\itemmargin %
2152
\advance \leftskip by \tableindent %
2153
\exdentamount=\tableindent
2154
\parindent = 0pt
2155
\parskip = \smallskipamount
2156
\ifdim \parskip=0pt \parskip=2pt \fi%
2157
\def\Etable{\endgraf\afterenvbreak\endgroup}%
2158
\let\item = \internalBitem %
2159
\let\itemx = \internalBitemx %
2160
\let\kitem = \internalBkitem %
2161
\let\kitemx = \internalBkitemx %
2162
\let\xitem = \internalBxitem %
2163
\let\xitemx = \internalBxitemx %
2164
}
3393
}
3394
\def\tablez #1 #2 #3 #4\endtablez{%
3395
  \aboveenvbreak
3396
  \ifnum 0#1>0 \advance \leftskip by #1\mil \fi
3397
  \ifnum 0#2>0 \tableindent=#2\mil \fi
3398
  \ifnum 0#3>0 \advance \rightskip by #3\mil \fi
3399
  \itemmax=\tableindent
3400
  \advance \itemmax by -\itemmargin
3401
  \advance \leftskip by \tableindent
3402
  \exdentamount=\tableindent
3403
  \parindent = 0pt
3404
  \parskip = \smallskipamount
3405
  \ifdim \parskip=0pt \parskip=2pt \fi
3406
  \let\item = \internalBitem
3407
  \let\itemx = \internalBitemx
3408
}
3409
\def\Etable{\endgraf\afterenvbreak}
3410
\let\Eftable\Etable
3411
\let\Evtable\Etable
3412
\let\Eitemize\Etable
3413
\let\Eenumerate\Etable
2165
3414
2166
% This is the counter used by @enumerate, which is really @itemize
3415
% This is the counter used by @enumerate, which is really @itemize
2167
3416
2168
\newcount \itemno
3417
\newcount \itemno
2169
3418
2170
\def\itemize{\parsearg\itemizezzz}
3419
\envdef\itemize{\parsearg\doitemize}
2171
2172
\def\itemizezzz #1{%
2173
  \begingroup % ended by the @end itemize
2174
  \itemizey {#1}{\Eitemize}
2175
}
2176
3420
2177
\def\itemizey#1#2{%
3421
\def\doitemize#1{%
2178
  \aboveenvbreak
3422
  \aboveenvbreak
2179
  \itemmax=\itemindent
3423
  \itemmax=\itemindent
2180
  \advance\itemmax by -\itemmargin
3424
  \advance\itemmax by -\itemmargin
Lines 2183-2195 Link Here
2183
  \parindent=0pt
3427
  \parindent=0pt
2184
  \parskip=\smallskipamount
3428
  \parskip=\smallskipamount
2185
  \ifdim\parskip=0pt \parskip=2pt \fi
3429
  \ifdim\parskip=0pt \parskip=2pt \fi
2186
  \def#2{\endgraf\afterenvbreak\endgroup}%
3430
  %
3431
  % Try typesetting the item mark that if the document erroneously says
3432
  % something like @itemize @samp (intending @table), there's an error
3433
  % right away at the @itemize.  It's not the best error message in the
3434
  % world, but it's better than leaving it to the @item.  This means if
3435
  % the user wants an empty mark, they have to say @w{} not just @w.
2187
  \def\itemcontents{#1}%
3436
  \def\itemcontents{#1}%
3437
  \setbox0 = \hbox{\itemcontents}%
3438
  %
2188
  % @itemize with no arg is equivalent to @itemize @bullet.
3439
  % @itemize with no arg is equivalent to @itemize @bullet.
2189
  \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi
3440
  \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi
3441
  %
2190
  \let\item=\itemizeitem
3442
  \let\item=\itemizeitem
2191
}
3443
}
2192
3444
3445
% Definition of @item while inside @itemize and @enumerate.
3446
%
3447
\def\itemizeitem{%
3448
  \advance\itemno by 1  % for enumerations
3449
  {\let\par=\endgraf \smallbreak}% reasonable place to break
3450
  {%
3451
   % If the document has an @itemize directly after a section title, a
3452
   % \nobreak will be last on the list, and \sectionheading will have
3453
   % done a \vskip-\parskip.  In that case, we don't want to zero
3454
   % parskip, or the item text will crash with the heading.  On the
3455
   % other hand, when there is normal text preceding the item (as there
3456
   % usually is), we do want to zero parskip, or there would be too much
3457
   % space.  In that case, we won't have a \nobreak before.  At least
3458
   % that's the theory.
3459
   \ifnum\lastpenalty<10000 \parskip=0in \fi
3460
   \noindent
3461
   \hbox to 0pt{\hss \itemcontents \kern\itemmargin}%
3462
   %
3463
   \vadjust{\penalty 1200}}% not good to break after first line of item.
3464
  \flushcr
3465
}
3466
2193
% \splitoff TOKENS\endmark defines \first to be the first token in
3467
% \splitoff TOKENS\endmark defines \first to be the first token in
2194
% TOKENS, and \rest to be the remainder.
3468
% TOKENS, and \rest to be the remainder.
2195
%
3469
%
Lines 2199-2209 Link Here
2199
% or number, to specify the first label in the enumerated list.  No
3473
% or number, to specify the first label in the enumerated list.  No
2200
% argument is the same as `1'.
3474
% argument is the same as `1'.
2201
%
3475
%
2202
\def\enumerate{\parsearg\enumeratezzz}
3476
\envparseargdef\enumerate{\enumeratey #1  \endenumeratey}
2203
\def\enumeratezzz #1{\enumeratey #1  \endenumeratey}
2204
\def\enumeratey #1 #2\endenumeratey{%
3477
\def\enumeratey #1 #2\endenumeratey{%
2205
  \begingroup % ended by the @end enumerate
2206
  %
2207
  % If we were given no argument, pretend we were given `1'.
3478
  % If we were given no argument, pretend we were given `1'.
2208
  \def\thearg{#1}%
3479
  \def\thearg{#1}%
2209
  \ifx\thearg\empty \def\thearg{1}\fi
3480
  \ifx\thearg\empty \def\thearg{1}\fi
Lines 2274-2286 Link Here
2274
  }%
3545
  }%
2275
}
3546
}
2276
3547
2277
% Call itemizey, adding a period to the first argument and supplying the
3548
% Call \doitemize, adding a period to the first argument and supplying the
2278
% common last two arguments.  Also subtract one from the initial value in
3549
% common last two arguments.  Also subtract one from the initial value in
2279
% \itemno, since @item increments \itemno.
3550
% \itemno, since @item increments \itemno.
2280
%
3551
%
2281
\def\startenumeration#1{%
3552
\def\startenumeration#1{%
2282
  \advance\itemno by -1
3553
  \advance\itemno by -1
2283
  \itemizey{#1.}\Eenumerate\flushcr
3554
  \doitemize{#1.}\flushcr
2284
}
3555
}
2285
3556
2286
% @alphaenumerate and @capsenumerate are abbreviations for giving an arg
3557
% @alphaenumerate and @capsenumerate are abbreviations for giving an arg
Lines 2291-2306 Link Here
2291
\def\Ealphaenumerate{\Eenumerate}
3562
\def\Ealphaenumerate{\Eenumerate}
2292
\def\Ecapsenumerate{\Eenumerate}
3563
\def\Ecapsenumerate{\Eenumerate}
2293
3564
2294
% Definition of @item while inside @itemize.
2295
2296
\def\itemizeitem{%
2297
\advance\itemno by 1
2298
{\let\par=\endgraf \smallbreak}%
2299
\ifhmode \errmessage{In hmode at itemizeitem}\fi
2300
{\parskip=0in \hskip 0pt
2301
\hbox to 0pt{\hss \itemcontents\hskip \itemmargin}%
2302
\vadjust{\penalty 1200}}%
2303
\flushcr}
2304
3565
2305
% @multitable macros
3566
% @multitable macros
2306
% Amy Hendrickson, 8/18/94, 3/6/96
3567
% Amy Hendrickson, 8/18/94, 3/6/96
Lines 2327-2350 Link Here
2327
%   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
3588
%   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
2328
%   @item ...
3589
%   @item ...
2329
%   using the widest term desired in each column.
3590
%   using the widest term desired in each column.
2330
%
2331
% For those who want to use more than one line's worth of words in
2332
% the preamble, break the line within one argument and it
2333
% will parse correctly, i.e.,
2334
%
2335
%     @multitable {Column 1 template} {Column 2 template} {Column 3
2336
%      template}
2337
% Not:
2338
%     @multitable {Column 1 template} {Column 2 template}
2339
%      {Column 3 template}
2340
3591
2341
% Each new table line starts with @item, each subsequent new column
3592
% Each new table line starts with @item, each subsequent new column
2342
% starts with @tab. Empty columns may be produced by supplying @tab's
3593
% starts with @tab. Empty columns may be produced by supplying @tab's
2343
% with nothing between them for as many times as empty columns are needed,
3594
% with nothing between them for as many times as empty columns are needed,
2344
% ie, @tab@tab@tab will produce two empty columns.
3595
% ie, @tab@tab@tab will produce two empty columns.
2345
3596
2346
% @item, @tab, @multitable or @end multitable do not need to be on their
3597
% @item, @tab do not need to be on their own lines, but it will not hurt
2347
% own lines, but it will not hurt if they are.
3598
% if they are.
2348
3599
2349
% Sample multitable:
3600
% Sample multitable:
2350
3601
Lines 2388-2400 Link Here
2388
\def\xcolumnfractions{\columnfractions}
3639
\def\xcolumnfractions{\columnfractions}
2389
\newif\ifsetpercent
3640
\newif\ifsetpercent
2390
3641
2391
% #1 is the part of the @columnfraction before the decimal point, which
3642
% #1 is the @columnfraction, usually a decimal number like .5, but might
2392
% is presumably either 0 or the empty string (but we don't check, we
3643
% be just 1.  We just use it, whatever it is.
2393
% just throw it away).  #2 is the decimal part, which we use as the
3644
%
2394
% percent of \hsize for this column.
3645
\def\pickupwholefraction#1 {%
2395
\def\pickupwholefraction#1.#2 {%
2396
  \global\advance\colcount by 1
3646
  \global\advance\colcount by 1
2397
  \expandafter\xdef\csname col\the\colcount\endcsname{.#2\hsize}%
3647
  \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}%
2398
  \setuptable
3648
  \setuptable
2399
}
3649
}
2400
3650
Lines 2427-2444 Link Here
2427
  \go
3677
  \go
2428
}
3678
}
2429
3679
3680
% multitable-only commands.
3681
%
3682
% @headitem starts a heading row, which we typeset in bold.
3683
% Assignments have to be global since we are inside the implicit group
3684
% of an alignment entry.  \everycr resets \everytab so we don't have to
3685
% undo it ourselves.
3686
\def\headitemfont{\b}% for people to use in the template row; not changeable
3687
\def\headitem{%
3688
  \checkenv\multitable
3689
  \crcr
3690
  \global\everytab={\bf}% can't use \headitemfont since the parsing differs
3691
  \the\everytab % for the first item
3692
}%
3693
%
3694
% A \tab used to include \hskip1sp.  But then the space in a template
3695
% line is not enough.  That is bad.  So let's go back to just `&' until
3696
% we again encounter the problem the 1sp was intended to solve.
3697
%					--karl, nathan@acm.org, 20apr99.
3698
\def\tab{\checkenv\multitable &\the\everytab}%
3699
2430
% @multitable ... @end multitable definitions:
3700
% @multitable ... @end multitable definitions:
2431
%
3701
%
2432
\def\multitable{\parsearg\dotable}
3702
\newtoks\everytab  % insert after every tab.
2433
\def\dotable#1{\bgroup
3703
%
3704
\envdef\multitable{%
2434
  \vskip\parskip
3705
  \vskip\parskip
2435
  \let\item=\crcrwithfootnotes
3706
  \startsavinginserts
2436
  % A \tab used to include \hskip1sp.  But then the space in a template
3707
  %
2437
  % line is not enough.  That is bad.  So let's go back to just & until
3708
  % @item within a multitable starts a normal row.
2438
  % we encounter the problem it was intended to solve again.  --karl,
3709
  % We use \def instead of \let so that if one of the multitable entries
2439
  % nathan@acm.org, 20apr99.
3710
  % contains an @itemize, we don't choke on the \item (seen as \crcr aka
2440
  \let\tab=&%
3711
  % \endtemplate) expanding \doitemize.
2441
  \let\startfootins=\startsavedfootnote
3712
  \def\item{\crcr}%
3713
  %
2442
  \tolerance=9500
3714
  \tolerance=9500
2443
  \hbadness=9500
3715
  \hbadness=9500
2444
  \setmultitablespacing
3716
  \setmultitablespacing
Lines 2446-2530 Link Here
2446
  \parindent=\multitableparindent
3718
  \parindent=\multitableparindent
2447
  \overfullrule=0pt
3719
  \overfullrule=0pt
2448
  \global\colcount=0
3720
  \global\colcount=0
2449
  \def\Emultitable{%
3721
  %
2450
    \global\setpercentfalse
3722
  \everycr = {%
2451
    \crcrwithfootnotes\crcr
3723
    \noalign{%
2452
    \egroup\egroup
3724
      \global\everytab={}%
3725
      \global\colcount=0 % Reset the column counter.
3726
      % Check for saved footnotes, etc.
3727
      \checkinserts
3728
      % Keeps underfull box messages off when table breaks over pages.
3729
      %\filbreak
3730
	% Maybe so, but it also creates really weird page breaks when the
3731
	% table breaks over pages. Wouldn't \vfil be better?  Wait until the
3732
	% problem manifests itself, so it can be fixed for real --karl.
3733
    }%
2453
  }%
3734
  }%
2454
  %
3735
  %
3736
  \parsearg\domultitable
3737
}
3738
\def\domultitable#1{%
2455
  % To parse everything between @multitable and @item:
3739
  % To parse everything between @multitable and @item:
2456
  \setuptable#1 \endsetuptable
3740
  \setuptable#1 \endsetuptable
2457
  %
3741
  %
2458
  % \everycr will reset column counter, \colcount, at the end of
2459
  % each line. Every column entry will cause \colcount to advance by one.
2460
  % The table preamble
2461
  % looks at the current \colcount to find the correct column width.
2462
  \everycr{\noalign{%
2463
  %
2464
  % \filbreak%% keeps underfull box messages off when table breaks over pages.
2465
  % Maybe so, but it also creates really weird page breaks when the table
2466
  % breaks over pages. Wouldn't \vfil be better?  Wait until the problem
2467
  % manifests itself, so it can be fixed for real --karl.
2468
    \global\colcount=0\relax}}%
2469
  %
2470
  % This preamble sets up a generic column definition, which will
3742
  % This preamble sets up a generic column definition, which will
2471
  % be used as many times as user calls for columns.
3743
  % be used as many times as user calls for columns.
2472
  % \vtop will set a single line and will also let text wrap and
3744
  % \vtop will set a single line and will also let text wrap and
2473
  % continue for many paragraphs if desired.
3745
  % continue for many paragraphs if desired.
2474
  \halign\bgroup&\global\advance\colcount by 1\relax
3746
  \halign\bgroup &%
2475
    \multistrut\vtop{\hsize=\expandafter\csname col\the\colcount\endcsname
3747
    \global\advance\colcount by 1
3748
    \multistrut
3749
    \vtop{%
3750
      % Use the current \colcount to find the correct column width:
3751
      \hsize=\expandafter\csname col\the\colcount\endcsname
3752
      %
3753
      % In order to keep entries from bumping into each other
3754
      % we will add a \leftskip of \multitablecolspace to all columns after
3755
      % the first one.
3756
      %
3757
      % If a template has been used, we will add \multitablecolspace
3758
      % to the width of each template entry.
3759
      %
3760
      % If the user has set preamble in terms of percent of \hsize we will
3761
      % use that dimension as the width of the column, and the \leftskip
3762
      % will keep entries from bumping into each other.  Table will start at
3763
      % left margin and final column will justify at right margin.
3764
      %
3765
      % Make sure we don't inherit \rightskip from the outer environment.
3766
      \rightskip=0pt
3767
      \ifnum\colcount=1
3768
	% The first column will be indented with the surrounding text.
3769
	\advance\hsize by\leftskip
3770
      \else
3771
	\ifsetpercent \else
3772
	  % If user has not set preamble in terms of percent of \hsize
3773
	  % we will advance \hsize by \multitablecolspace.
3774
	  \advance\hsize by \multitablecolspace
3775
	\fi
3776
       % In either case we will make \leftskip=\multitablecolspace:
3777
      \leftskip=\multitablecolspace
3778
      \fi
3779
      % Ignoring space at the beginning and end avoids an occasional spurious
3780
      % blank line, when TeX decides to break the line at the space before the
3781
      % box from the multistrut, so the strut ends up on a line by itself.
3782
      % For example:
3783
      % @multitable @columnfractions .11 .89
3784
      % @item @code{#}
3785
      % @tab Legal holiday which is valid in major parts of the whole country.
3786
      % Is automatically provided with highlighting sequences respectively
3787
      % marking characters.
3788
      \noindent\ignorespaces##\unskip\multistrut
3789
    }\cr
3790
}
3791
\def\Emultitable{%
3792
  \crcr
3793
  \egroup % end the \halign
3794
  \global\setpercentfalse
3795
}
3796
3797
\def\setmultitablespacing{%
3798
  \def\multistrut{\strut}% just use the standard line spacing
2476
  %
3799
  %
2477
  % In order to keep entries from bumping into each other
3800
  % Compute \multitablelinespace (if not defined by user) for use in
2478
  % we will add a \leftskip of \multitablecolspace to all columns after
3801
  % \multitableparskip calculation.  We used define \multistrut based on
2479
  % the first one.
3802
  % this, but (ironically) that caused the spacing to be off.
2480
  %
3803
  % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100.
2481
  % If a template has been used, we will add \multitablecolspace
2482
  % to the width of each template entry.
2483
  %
2484
  % If the user has set preamble in terms of percent of \hsize we will
2485
  % use that dimension as the width of the column, and the \leftskip
2486
  % will keep entries from bumping into each other.  Table will start at
2487
  % left margin and final column will justify at right margin.
2488
  %
2489
  % Make sure we don't inherit \rightskip from the outer environment.
2490
  \rightskip=0pt
2491
  \ifnum\colcount=1
2492
    % The first column will be indented with the surrounding text.
2493
    \advance\hsize by\leftskip
2494
  \else
2495
    \ifsetpercent \else
2496
      % If user has not set preamble in terms of percent of \hsize
2497
      % we will advance \hsize by \multitablecolspace.
2498
      \advance\hsize by \multitablecolspace
2499
    \fi
2500
   % In either case we will make \leftskip=\multitablecolspace:
2501
  \leftskip=\multitablecolspace
2502
  \fi
2503
  % Ignoring space at the beginning and end avoids an occasional spurious
2504
  % blank line, when TeX decides to break the line at the space before the
2505
  % box from the multistrut, so the strut ends up on a line by itself.
2506
  % For example:
2507
  % @multitable @columnfractions .11 .89
2508
  % @item @code{#}
2509
  % @tab Legal holiday which is valid in major parts of the whole country.
2510
  % Is automatically provided with highlighting sequences respectively marking
2511
  % characters.
2512
  \noindent\ignorespaces##\unskip\multistrut}\cr
2513
}
2514
2515
\def\setmultitablespacing{% test to see if user has set \multitablelinespace.
2516
% If so, do nothing. If not, give it an appropriate dimension based on
2517
% current baselineskip.
2518
\ifdim\multitablelinespace=0pt
3804
\ifdim\multitablelinespace=0pt
2519
\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
3805
\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
2520
\global\advance\multitablelinespace by-\ht0
3806
\global\advance\multitablelinespace by-\ht0
2521
%% strut to put in table in case some entry doesn't have descenders,
3807
\fi
2522
%% to keep lines equally spaced
2523
\let\multistrut = \strut
2524
\else
2525
%% FIXME: what is \box0 supposed to be?
2526
\gdef\multistrut{\vrule height\multitablelinespace depth\dp0
2527
width0pt\relax} \fi
2528
%% Test to see if parskip is larger than space between lines of
3808
%% Test to see if parskip is larger than space between lines of
2529
%% table. If not, do nothing.
3809
%% table. If not, do nothing.
2530
%%        If so, set to same dimension as multitablelinespace.
3810
%%        If so, set to same dimension as multitablelinespace.
Lines 2539-2603 Link Here
2539
                                      %% than skip between lines in the table.
3819
                                      %% than skip between lines in the table.
2540
\fi}
3820
\fi}
2541
3821
2542
% In case a @footnote appears inside an alignment, save the footnote
2543
% text to a box and make the \insert when a row of the table is
2544
% finished.  Otherwise, the insertion is lost, it never migrates to the
2545
% main vertical list.  --kasal, 22jan03.
2546
%
2547
\newbox\savedfootnotes
2548
%
2549
% \dotable \let's \startfootins to this, so that \dofootnote will call
2550
% it instead of starting the insertion right away.
2551
\def\startsavedfootnote{%
2552
  \global\setbox\savedfootnotes = \vbox\bgroup
2553
    \unvbox\savedfootnotes
2554
}
2555
\def\crcrwithfootnotes{%
2556
  \crcr
2557
  \ifvoid\savedfootnotes \else
2558
    \noalign{\insert\footins{\box\savedfootnotes}}%
2559
  \fi
2560
}
2561
3822
2562
\message{conditionals,}
3823
\message{conditionals,}
2563
% Prevent errors for section commands.
3824
2564
% Used in @ignore and in failing conditionals.
3825
% @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext,
2565
\def\ignoresections{%
3826
% @ifnotxml always succeed.  They currently do nothing; we don't
2566
  \let\appendix=\relax
3827
% attempt to check whether the conditionals are properly nested.  But we
2567
  \let\appendixsec=\relax
3828
% have to remember that they are conditionals, so that @end doesn't
2568
  \let\appendixsection=\relax
3829
% attempt to close an environment group.
2569
  \let\appendixsubsec=\relax
3830
%
2570
  \let\appendixsubsection=\relax
3831
\def\makecond#1{%
2571
  \let\appendixsubsubsec=\relax
3832
  \expandafter\let\csname #1\endcsname = \relax
2572
  \let\appendixsubsubsection=\relax
3833
  \expandafter\let\csname iscond.#1\endcsname = 1
2573
  %\let\begin=\relax
3834
}
2574
  %\let\bye=\relax
3835
\makecond{iftex}
2575
  \let\centerchap=\relax
3836
\makecond{ifnotdocbook}
2576
  \let\chapter=\relax
3837
\makecond{ifnothtml}
2577
  \let\contents=\relax
3838
\makecond{ifnotinfo}
2578
  \let\section=\relax
3839
\makecond{ifnotplaintext}
2579
  \let\smallbook=\relax
3840
\makecond{ifnotxml}
2580
  \let\subsec=\relax
2581
  \let\subsection=\relax
2582
  \let\subsubsec=\relax
2583
  \let\subsubsection=\relax
2584
  \let\titlepage=\relax
2585
  \let\top=\relax
2586
  \let\unnumbered=\relax
2587
  \let\unnumberedsec=\relax
2588
  \let\unnumberedsection=\relax
2589
  \let\unnumberedsubsec=\relax
2590
  \let\unnumberedsubsection=\relax
2591
  \let\unnumberedsubsubsec=\relax
2592
  \let\unnumberedsubsubsection=\relax
2593
}
2594
3841
2595
% Ignore @ignore, @ifhtml, @ifinfo, and the like.
3842
% Ignore @ignore, @ifhtml, @ifinfo, and the like.
2596
%
3843
%
2597
\def\direntry{\doignore{direntry}}
3844
\def\direntry{\doignore{direntry}}
2598
\def\documentdescriptionword{documentdescription}
2599
\def\documentdescription{\doignore{documentdescription}}
3845
\def\documentdescription{\doignore{documentdescription}}
3846
\def\docbook{\doignore{docbook}}
2600
\def\html{\doignore{html}}
3847
\def\html{\doignore{html}}
3848
\def\ifdocbook{\doignore{ifdocbook}}
2601
\def\ifhtml{\doignore{ifhtml}}
3849
\def\ifhtml{\doignore{ifhtml}}
2602
\def\ifinfo{\doignore{ifinfo}}
3850
\def\ifinfo{\doignore{ifinfo}}
2603
\def\ifnottex{\doignore{ifnottex}}
3851
\def\ifnottex{\doignore{ifnottex}}
Lines 2607-2656 Link Here
2607
\def\menu{\doignore{menu}}
3855
\def\menu{\doignore{menu}}
2608
\def\xml{\doignore{xml}}
3856
\def\xml{\doignore{xml}}
2609
3857
2610
% @dircategory CATEGORY  -- specify a category of the dir file
2611
% which this file should belong to.  Ignore this in TeX.
2612
\let\dircategory = \comment
2613
2614
% Ignore text until a line `@end #1', keeping track of nested conditionals.
3858
% Ignore text until a line `@end #1', keeping track of nested conditionals.
2615
%
3859
%
2616
% A count to remember the depth of nesting.
3860
% A count to remember the depth of nesting.
2617
\newcount\doignorecount
3861
\newcount\doignorecount
2618
3862
2619
\def\doignore#1{\begingroup
3863
\def\doignore#1{\begingroup
2620
  % Don't complain about control sequences we have declared \outer.
3864
  % Scan in ``verbatim'' mode:
2621
  \ignoresections
3865
  \obeylines
3866
  \catcode`\@ = \other
3867
  \catcode`\{ = \other
3868
  \catcode`\} = \other
2622
  %
3869
  %
2623
  % Make sure that spaces turn into tokens that match what \doignoretext wants.
3870
  % Make sure that spaces turn into tokens that match what \doignoretext wants.
2624
  \catcode\spaceChar = 10
3871
  \spaceisspace
2625
  %
2626
  % Ignore braces, so mismatched braces don't cause trouble.
2627
  \catcode`\{ = 9
2628
  \catcode`\} = 9
2629
  %
3872
  %
2630
  % Count number of #1's that we've seen.
3873
  % Count number of #1's that we've seen.
2631
  \doignorecount = 0
3874
  \doignorecount = 0
2632
  %
3875
  %
2633
  % Swallow text until we reach the matching `@end #1'.
3876
  % Swallow text until we reach the matching `@end #1'.
2634
  \expandafter \dodoignore \csname#1\endcsname {#1}%
3877
  \dodoignore{#1}%
2635
}
3878
}
2636
3879
2637
{ \catcode`@=11 % We want to use \ST@P which cannot appear in texinfo source.
3880
{ \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source.
2638
  \obeylines %
3881
  \obeylines %
2639
  %
3882
  %
2640
  \gdef\dodoignore#1#2{%
3883
  \gdef\dodoignore#1{%
2641
    % #1 contains, e.g., \ifinfo, a.k.a. @ifinfo.
3884
    % #1 contains the command name as a string, e.g., `ifinfo'.
2642
    % #2 contains the string `ifinfo'.
3885
    %
2643
    %
3886
    % Define a command to find the next `@end #1'.
2644
    % Define a command to find the next `@end #2', which must be on a line
3887
    \long\def\doignoretext##1^^M@end #1{%
2645
    % by itself.
3888
      \doignoretextyyy##1^^M@#1\_STOP_}%
2646
    \long\def\doignoretext##1^^M\end #2{\doignoretextyyy##1^^M#1\ST@P}%
3889
    %
2647
    % And this command to find another #1 command, at the beginning of a
3890
    % And this command to find another #1 command, at the beginning of a
2648
    % line.  (Otherwise, we would consider a line `@c @ifset', for
3891
    % line.  (Otherwise, we would consider a line `@c @ifset', for
2649
    % example, to count as an @ifset for nesting.)
3892
    % example, to count as an @ifset for nesting.)
2650
    \long\def\doignoretextyyy##1^^M#1##2\ST@P{\doignoreyyy{##2}\ST@P}%
3893
    \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}%
2651
    %
3894
    %
2652
    % And now expand that command.
3895
    % And now expand that command.
2653
    \obeylines %
2654
    \doignoretext ^^M%
3896
    \doignoretext ^^M%
2655
  }%
3897
  }%
2656
}
3898
}
Lines 2664-2674 Link Here
2664
    \let\next\doignoretextyyy		% ..., look for another.
3906
    \let\next\doignoretextyyy		% ..., look for another.
2665
    % If we're here, #1 ends with ^^M\ifinfo (for example).
3907
    % If we're here, #1 ends with ^^M\ifinfo (for example).
2666
  \fi
3908
  \fi
2667
  \next #1% the token \ST@P is present just after this macro.
3909
  \next #1% the token \_STOP_ is present just after this macro.
2668
}
3910
}
2669
3911
2670
% We have to swallow the remaining "\ST@P".
3912
% We have to swallow the remaining "\_STOP_".
2671
% 
3913
%
2672
\def\doignoretextzzz#1{%
3914
\def\doignoretextzzz#1{%
2673
  \ifnum\doignorecount = 0	% We have just found the outermost @end.
3915
  \ifnum\doignorecount = 0	% We have just found the outermost @end.
2674
    \let\next\enddoignore
3916
    \let\next\enddoignore
Lines 2680-2686 Link Here
2680
}
3922
}
2681
3923
2682
% Finish off ignored text.
3924
% Finish off ignored text.
2683
\def\enddoignore{\endgroup\ignorespaces}
3925
{ \obeylines%
3926
  % Ignore anything after the last `@end #1'; this matters in verbatim
3927
  % environments, where otherwise the newline after an ignored conditional
3928
  % would result in a blank line in the output.
3929
  \gdef\enddoignore#1^^M{\endgroup\ignorespaces}%
3930
}
2684
3931
2685
3932
2686
% @set VAR sets the variable VAR to an empty value.
3933
% @set VAR sets the variable VAR to an empty value.
Lines 2689-2741 Link Here
2689
% Since we want to separate VAR from REST-OF-LINE (which might be
3936
% Since we want to separate VAR from REST-OF-LINE (which might be
2690
% empty), we can't just use \parsearg; we have to insert a space of our
3937
% empty), we can't just use \parsearg; we have to insert a space of our
2691
% own to delimit the rest of the line, and then take it out again if we
3938
% own to delimit the rest of the line, and then take it out again if we
2692
% didn't need it.  Make sure the catcode of space is correct to avoid
3939
% didn't need it.
2693
% losing inside @example, for instance.
3940
% We rely on the fact that \parsearg sets \catcode`\ =10.
2694
%
3941
%
2695
\def\set{\begingroup\catcode` =10
3942
\parseargdef\set{\setyyy#1 \endsetyyy}
2696
  \catcode`\-=12 \catcode`\_=12 % Allow - and _ in VAR.
2697
  \parsearg\setxxx}
2698
\def\setxxx#1{\setyyy#1 \endsetyyy}
2699
\def\setyyy#1 #2\endsetyyy{%
3943
\def\setyyy#1 #2\endsetyyy{%
2700
  \def\temp{#2}%
3944
  {%
2701
  \ifx\temp\empty \global\expandafter\let\csname SET#1\endcsname = \empty
3945
    \makevalueexpandable
2702
  \else \setzzz{#1}#2\endsetzzz % Remove the trailing space \setxxx inserted.
3946
    \def\temp{#2}%
2703
  \fi
3947
    \edef\next{\gdef\makecsname{SET#1}}%
2704
  \endgroup
3948
    \ifx\temp\empty
3949
      \next{}%
3950
    \else
3951
      \setzzz#2\endsetzzz
3952
    \fi
3953
  }%
2705
}
3954
}
2706
% Can't use \xdef to pre-expand #2 and save some time, since \temp or
3955
% Remove the trailing space \setxxx inserted.
2707
% \next or other control sequences that we've defined might get us into
3956
\def\setzzz#1 \endsetzzz{\next{#1}}
2708
% an infinite loop. Consider `@set foo @cite{bar}'.
2709
\def\setzzz#1#2 \endsetzzz{\expandafter\gdef\csname SET#1\endcsname{#2}}
2710
3957
2711
% @clear VAR clears (i.e., unsets) the variable VAR.
3958
% @clear VAR clears (i.e., unsets) the variable VAR.
2712
%
3959
%
2713
\def\clear{\parsearg\clearxxx}
3960
\parseargdef\clear{%
2714
\def\clearxxx#1{\global\expandafter\let\csname SET#1\endcsname=\relax}
3961
  {%
3962
    \makevalueexpandable
3963
    \global\expandafter\let\csname SET#1\endcsname=\relax
3964
  }%
3965
}
2715
3966
2716
% @value{foo} gets the text saved in variable foo.
3967
% @value{foo} gets the text saved in variable foo.
3968
\def\value{\begingroup\makevalueexpandable\valuexxx}
3969
\def\valuexxx#1{\expandablevalue{#1}\endgroup}
2717
{
3970
{
2718
  \catcode`\_ = \active
3971
  \catcode`\- = \active \catcode`\_ = \active
2719
  %
3972
  %
2720
  % We might end up with active _ or - characters in the argument if
3973
  \gdef\makevalueexpandable{%
2721
  % we're called from @code, as @code{@value{foo-bar_}}.  So \let any
3974
    \let\value = \expandablevalue
2722
  % such active characters to their normal equivalents.
3975
    % We don't want these characters active, ...
2723
  \gdef\value{\begingroup
2724
    \catcode`\-=\other \catcode`\_=\other
3976
    \catcode`\-=\other \catcode`\_=\other
2725
    \indexbreaks \let_\normalunderscore
3977
    % ..., but we might end up with active ones in the argument if
2726
    \valuexxx}
3978
    % we're called from @code, as @code{@value{foo-bar_}}, though.
3979
    % So \let them to their normal equivalents.
3980
    \let-\realdash \let_\normalunderscore
3981
  }
2727
}
3982
}
2728
\def\valuexxx#1{\expandablevalue{#1}\endgroup}
2729
3983
2730
% We have this subroutine so that we can handle at least some @value's
3984
% We have this subroutine so that we can handle at least some @value's
2731
% properly in indexes (we \let\value to this in \indexdummies).  Ones
3985
% properly in indexes (we call \makevalueexpandable in \indexdummies).
2732
% whose names contain - or _ still won't work, but we can't do anything
3986
% The command has to be fully expandable (if the variable is set), since
2733
% about that.  The command has to be fully expandable (if the variable
3987
% the result winds up in the index file.  This means that if the
2734
% is set), since the result winds up in the index file.  This means that
3988
% variable's value contains other Texinfo commands, it's almost certain
2735
% if the variable's value contains other Texinfo commands, it's almost
3989
% it will fail (although perhaps we could fix that with sufficient work
2736
% certain it will fail (although perhaps we could fix that with
3990
% to do a one-level expansion on the result, instead of complete).
2737
% sufficient work to do a one-level expansion on the result, instead of
2738
% complete).
2739
%
3991
%
2740
\def\expandablevalue#1{%
3992
\def\expandablevalue#1{%
2741
  \expandafter\ifx\csname SET#1\endcsname\relax
3993
  \expandafter\ifx\csname SET#1\endcsname\relax
Lines 2749-2803 Link Here
2749
% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
4001
% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
2750
% with @set.
4002
% with @set.
2751
%
4003
%
2752
\def\ifset{\parsearg\doifset}
4004
% To get special treatment of `@end ifset,' call \makeond and the redefine.
2753
\def\doifset#1{%
4005
%
2754
  \expandafter\ifx\csname SET#1\endcsname\relax
4006
\makecond{ifset}
2755
    \let\next=\ifsetfail
4007
\def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}}
2756
  \else
4008
\def\doifset#1#2{%
2757
    \let\next=\ifsetsucceed
4009
  {%
2758
  \fi
4010
    \makevalueexpandable
2759
  \next
4011
    \let\next=\empty
4012
    \expandafter\ifx\csname SET#2\endcsname\relax
4013
      #1% If not set, redefine \next.
4014
    \fi
4015
    \expandafter
4016
  }\next
2760
}
4017
}
2761
\def\ifsetsucceed{\conditionalsucceed{ifset}}
2762
\def\ifsetfail{\doignore{ifset}}
4018
\def\ifsetfail{\doignore{ifset}}
2763
\defineunmatchedend{ifset}
2764
4019
2765
% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been
4020
% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been
2766
% defined with @set, or has been undefined with @clear.
4021
% defined with @set, or has been undefined with @clear.
2767
%
4022
%
2768
\def\ifclear{\parsearg\doifclear}
4023
% The `\else' inside the `\doifset' parameter is a trick to reuse the
2769
\def\doifclear#1{%
4024
% above code: if the variable is not set, do nothing, if it is set,
2770
  \expandafter\ifx\csname SET#1\endcsname\relax
4025
% then redefine \next to \ifclearfail.
2771
    \let\next=\ifclearsucceed
4026
%
2772
  \else
4027
\makecond{ifclear}
2773
    \let\next=\ifclearfail
4028
\def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}}
2774
  \fi
2775
  \next
2776
}
2777
\def\ifclearsucceed{\conditionalsucceed{ifclear}}
2778
\def\ifclearfail{\doignore{ifclear}}
4029
\def\ifclearfail{\doignore{ifclear}}
2779
\defineunmatchedend{ifclear}
2780
4030
2781
% @iftex, @ifnothtml, @ifnotinfo, @ifnotplaintext always succeed; we
4031
% @dircategory CATEGORY  -- specify a category of the dir file
2782
% read the text following, through the first @end iftex (etc.).  Make
4032
% which this file should belong to.  Ignore this in TeX.
2783
% `@end iftex' (etc.) valid only after an @iftex.
4033
\let\dircategory=\comment
2784
%
2785
\def\iftex{\conditionalsucceed{iftex}}
2786
\def\ifnothtml{\conditionalsucceed{ifnothtml}}
2787
\def\ifnotinfo{\conditionalsucceed{ifnotinfo}}
2788
\def\ifnotplaintext{\conditionalsucceed{ifnotplaintext}}
2789
\defineunmatchedend{iftex}
2790
\defineunmatchedend{ifnothtml}
2791
\defineunmatchedend{ifnotinfo}
2792
\defineunmatchedend{ifnotplaintext}
2793
2794
% True conditional.  Since \set globally defines its variables, we can
2795
% just start and end a group (to keep the @end definition undefined at
2796
% the outer level).
2797
%
2798
\def\conditionalsucceed#1{\begingroup
2799
  \expandafter\def\csname E#1\endcsname{\endgroup}%
2800
}
2801
4034
2802
% @defininfoenclose.
4035
% @defininfoenclose.
2803
\let\definfoenclose=\comment
4036
\let\definfoenclose=\comment
Lines 2807-2815 Link Here
2807
% Index generation facilities
4040
% Index generation facilities
2808
4041
2809
% Define \newwrite to be identical to plain tex's \newwrite
4042
% Define \newwrite to be identical to plain tex's \newwrite
2810
% except not \outer, so it can be used within \newindex.
4043
% except not \outer, so it can be used within macros and \if's.
2811
{\catcode`\@=11
4044
\edef\newwrite{\makecsname{ptexnewwrite}}
2812
\gdef\newwrite{\alloc@7\write\chardef\sixt@@n}}
2813
4045
2814
% \newindex {foo} defines an index named foo.
4046
% \newindex {foo} defines an index named foo.
2815
% It automatically defines \fooindex such that
4047
% It automatically defines \fooindex such that
Lines 2860-2870 Link Here
2860
\def\dosynindex#1#2#3{%
4092
\def\dosynindex#1#2#3{%
2861
  % Only do \closeout if we haven't already done it, else we'll end up
4093
  % Only do \closeout if we haven't already done it, else we'll end up
2862
  % closing the target index.
4094
  % closing the target index.
2863
  \expandafter \ifx\csname donesynindex#2\endcsname \undefined
4095
  \expandafter \ifx\csname donesynindex#2\endcsname \relax
2864
    % The \closeout helps reduce unnecessary open files; the limit on the
4096
    % The \closeout helps reduce unnecessary open files; the limit on the
2865
    % Acorn RISC OS is a mere 16 files.
4097
    % Acorn RISC OS is a mere 16 files.
2866
    \expandafter\closeout\csname#2indfile\endcsname
4098
    \expandafter\closeout\csname#2indfile\endcsname
2867
    \expandafter\let\csname\donesynindex#2\endcsname = 1
4099
    \expandafter\let\csname donesynindex#2\endcsname = 1
2868
  \fi
4100
  \fi
2869
  % redefine \fooindfile:
4101
  % redefine \fooindfile:
2870
  \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname
4102
  \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname
Lines 2895-2935 Link Here
2895
% we have to laboriously prevent expansion for those that we don't.
4127
% we have to laboriously prevent expansion for those that we don't.
2896
%
4128
%
2897
\def\indexdummies{%
4129
\def\indexdummies{%
4130
  \escapechar = `\\     % use backslash in output files.
2898
  \def\@{@}% change to @@ when we switch to @ as escape char in index files.
4131
  \def\@{@}% change to @@ when we switch to @ as escape char in index files.
2899
  \def\ {\realbackslash\space }%
4132
  \def\ {\realbackslash\space }%
4133
  %
2900
  % Need these in case \tex is in effect and \{ is a \delimiter again.
4134
  % Need these in case \tex is in effect and \{ is a \delimiter again.
2901
  % But can't use \lbracecmd and \rbracecmd because texindex assumes
4135
  % But can't use \lbracecmd and \rbracecmd because texindex assumes
2902
  % braces and backslashes are used only as delimiters.
4136
  % braces and backslashes are used only as delimiters.
2903
  \let\{ = \mylbrace
4137
  \let\{ = \mylbrace
2904
  \let\} = \myrbrace
4138
  \let\} = \myrbrace
2905
  %
4139
  %
2906
  % \definedummyword defines \#1 as \realbackslash #1\space, thus
4140
  % I don't entirely understand this, but when an index entry is
2907
  % effectively preventing its expansion.  This is used only for control
4141
  % generated from a macro call, the \endinput which \scanmacro inserts
2908
  % words, not control letters, because the \space would be incorrect
4142
  % causes processing to be prematurely terminated.  This is,
2909
  % for control characters, but is needed to separate the control word
4143
  % apparently, because \indexsorttmp is fully expanded, and \endinput
2910
  % from whatever follows.
4144
  % is an expandable command.  The redefinition below makes \endinput
4145
  % disappear altogether for that purpose -- although logging shows that
4146
  % processing continues to some further point.  On the other hand, it
4147
  % seems \endinput does not hurt in the printed index arg, since that
4148
  % is still getting written without apparent harm.
4149
  %
4150
  % Sample source (mac-idx3.tex, reported by Graham Percival to
4151
  % help-texinfo, 22may06):
4152
  % @macro funindex {WORD}
4153
  % @findex xyz
4154
  % @end macro
4155
  % ...
4156
  % @funindex commtest
2911
  %
4157
  %
2912
  % For control letters, we have \definedummyletter, which omits the
4158
  % The above is not enough to reproduce the bug, but it gives the flavor.
2913
  % space.
2914
  %
4159
  %
2915
  % These can be used both for control words that take an argument and
4160
  % Sample whatsit resulting:
2916
  % those that do not.  If it is followed by {arg} in the input, then
4161
  % .@write3{\entry{xyz}{@folio }{@code {xyz@endinput }}}
2917
  % that will dutifully get written to the index (or wherever).
2918
  %
4162
  %
2919
  \def\definedummyword##1{%
4163
  % So:
2920
    \expandafter\def\csname ##1\endcsname{\realbackslash ##1\space}%
4164
  \let\endinput = \empty
2921
  }%
2922
  \def\definedummyletter##1{%
2923
    \expandafter\def\csname ##1\endcsname{\realbackslash ##1}%
2924
  }%
2925
  %
4165
  %
2926
  % Do the redefinitions.
4166
  % Do the redefinitions.
2927
  \commondummies
4167
  \commondummies
2928
}
4168
}
2929
4169
2930
% For the aux file, @ is the escape character.  So we want to redefine
4170
% For the aux and toc files, @ is the escape character.  So we want to
2931
% everything using @ instead of \realbackslash.  When everything uses
4171
% redefine everything using @ as the escape character (instead of
2932
% @, this will be simpler.
4172
% \realbackslash, still used for index files).  When everything uses @,
4173
% this will be simpler.
2933
%
4174
%
2934
\def\atdummies{%
4175
\def\atdummies{%
2935
  \def\@{@@}%
4176
  \def\@{@@}%
Lines 2937-3164 Link Here
2937
  \let\{ = \lbraceatcmd
4178
  \let\{ = \lbraceatcmd
2938
  \let\} = \rbraceatcmd
4179
  \let\} = \rbraceatcmd
2939
  %
4180
  %
2940
  % (See comments in \indexdummies.)
2941
  \def\definedummyword##1{%
2942
    \expandafter\def\csname ##1\endcsname{@##1\space}%
2943
  }%
2944
  \def\definedummyletter##1{%
2945
    \expandafter\def\csname ##1\endcsname{@##1}%
2946
  }%
2947
  %
2948
  % Do the redefinitions.
4181
  % Do the redefinitions.
2949
  \commondummies
4182
  \commondummies
4183
  \otherbackslash
2950
}
4184
}
2951
4185
2952
% Called from \indexdummies and \atdummies.  \definedummyword and
4186
% Called from \indexdummies and \atdummies.
2953
% \definedummyletter must be defined first.
2954
%
4187
%
2955
\def\commondummies{%
4188
\def\commondummies{%
2956
  %
4189
  %
2957
  \normalturnoffactive
4190
  % \definedummyword defines \#1 as \string\#1\space, thus effectively
4191
  % preventing its expansion.  This is used only for control% words,
4192
  % not control letters, because the \space would be incorrect for
4193
  % control characters, but is needed to separate the control word
4194
  % from whatever follows.
2958
  %
4195
  %
2959
  % Control letters and accents.
4196
  % For control letters, we have \definedummyletter, which omits the
2960
  \definedummyletter{_}%
4197
  % space.
2961
  \definedummyletter{,}%
4198
  %
2962
  \definedummyletter{"}%
4199
  % These can be used both for control words that take an argument and
2963
  \definedummyletter{`}%
4200
  % those that do not.  If it is followed by {arg} in the input, then
2964
  \definedummyletter{'}%
4201
  % that will dutifully get written to the index (or wherever).
2965
  \definedummyletter{^}%
4202
  %
2966
  \definedummyletter{~}%
4203
  \def\definedummyword  ##1{\def##1{\string##1\space}}%
2967
  \definedummyletter{=}%
4204
  \def\definedummyletter##1{\def##1{\string##1}}%
2968
  \definedummyword{u}%
4205
  \let\definedummyaccent\definedummyletter
2969
  \definedummyword{v}%
4206
  %
2970
  \definedummyword{H}%
4207
  \commondummiesnofonts
2971
  \definedummyword{dotaccent}%
4208
  %
2972
  \definedummyword{ringaccent}%
4209
  \definedummyletter\_%
2973
  \definedummyword{tieaccent}%
4210
  %
2974
  \definedummyword{ubaraccent}%
4211
  % Non-English letters.
2975
  \definedummyword{udotaccent}%
4212
  \definedummyword\AA
2976
  \definedummyword{dotless}%
4213
  \definedummyword\AE
2977
  %
4214
  \definedummyword\DH
2978
  % Other non-English letters.
4215
  \definedummyword\L
2979
  \definedummyword{AA}%
4216
  \definedummyword\O
2980
  \definedummyword{AE}%
4217
  \definedummyword\OE
2981
  \definedummyword{L}%
4218
  \definedummyword\TH
2982
  \definedummyword{OE}%
4219
  \definedummyword\aa
2983
  \definedummyword{O}%
4220
  \definedummyword\ae
2984
  \definedummyword{aa}%
4221
  \definedummyword\dh
2985
  \definedummyword{ae}%
4222
  \definedummyword\exclamdown
2986
  \definedummyword{l}%
4223
  \definedummyword\l
2987
  \definedummyword{oe}%
4224
  \definedummyword\o
2988
  \definedummyword{o}%
4225
  \definedummyword\oe
2989
  \definedummyword{ss}%
4226
  \definedummyword\ordf
4227
  \definedummyword\ordm
4228
  \definedummyword\questiondown
4229
  \definedummyword\ss
4230
  \definedummyword\th
2990
  %
4231
  %
2991
  % Although these internal commands shouldn't show up, sometimes they do.
4232
  % Although these internal commands shouldn't show up, sometimes they do.
2992
  \definedummyword{bf}%
4233
  \definedummyword\bf
2993
  \definedummyword{gtr}%
4234
  \definedummyword\gtr
2994
  \definedummyword{hat}%
4235
  \definedummyword\hat
2995
  \definedummyword{less}%
4236
  \definedummyword\less
2996
  \definedummyword{sf}%
4237
  \definedummyword\sf
2997
  \definedummyword{sl}%
4238
  \definedummyword\sl
2998
  \definedummyword{tclose}%
4239
  \definedummyword\tclose
2999
  \definedummyword{tt}%
4240
  \definedummyword\tt
3000
  %
4241
  %
3001
  % Texinfo font commands.
4242
  \definedummyword\LaTeX
3002
  \definedummyword{b}%
4243
  \definedummyword\TeX
3003
  \definedummyword{i}%
3004
  \definedummyword{r}%
3005
  \definedummyword{sc}%
3006
  \definedummyword{t}%
3007
  %
3008
  \definedummyword{TeX}%
3009
  \definedummyword{acronym}%
3010
  \definedummyword{cite}%
3011
  \definedummyword{code}%
3012
  \definedummyword{command}%
3013
  \definedummyword{dfn}%
3014
  \definedummyword{dots}%
3015
  \definedummyword{emph}%
3016
  \definedummyword{env}%
3017
  \definedummyword{file}%
3018
  \definedummyword{kbd}%
3019
  \definedummyword{key}%
3020
  \definedummyword{math}%
3021
  \definedummyword{option}%
3022
  \definedummyword{samp}%
3023
  \definedummyword{strong}%
3024
  \definedummyword{uref}%
3025
  \definedummyword{url}%
3026
  \definedummyword{var}%
3027
  \definedummyword{verb}%
3028
  \definedummyword{w}%
3029
  %
4244
  %
3030
  % Assorted special characters.
4245
  % Assorted special characters.
3031
  \definedummyword{bullet}%
4246
  \definedummyword\bullet
3032
  \definedummyword{copyright}%
4247
  \definedummyword\comma
3033
  \definedummyword{dots}%
4248
  \definedummyword\copyright
3034
  \definedummyword{enddots}%
4249
  \definedummyword\registeredsymbol
3035
  \definedummyword{equiv}%
4250
  \definedummyword\dots
3036
  \definedummyword{error}%
4251
  \definedummyword\enddots
3037
  \definedummyword{expansion}%
4252
  \definedummyword\equiv
3038
  \definedummyword{minus}%
4253
  \definedummyword\error
3039
  \definedummyword{pounds}%
4254
  \definedummyword\euro
3040
  \definedummyword{point}%
4255
  \definedummyword\guillemetleft
3041
  \definedummyword{print}%
4256
  \definedummyword\guillemetright
3042
  \definedummyword{result}%
4257
  \definedummyword\guilsinglleft
4258
  \definedummyword\guilsinglright
4259
  \definedummyword\expansion
4260
  \definedummyword\minus
4261
  \definedummyword\ogonek
4262
  \definedummyword\pounds
4263
  \definedummyword\point
4264
  \definedummyword\print
4265
  \definedummyword\quotedblbase
4266
  \definedummyword\quotedblleft
4267
  \definedummyword\quotedblright
4268
  \definedummyword\quoteleft
4269
  \definedummyword\quoteright
4270
  \definedummyword\quotesinglbase
4271
  \definedummyword\result
4272
  \definedummyword\textdegree
3043
  %
4273
  %
3044
  % Handle some cases of @value -- where the variable name does not
4274
  % We want to disable all macros so that they are not expanded by \write.
3045
  % contain - or _, and the value does not contain any
4275
  \macrolist
3046
  % (non-fully-expandable) commands.
3047
  \let\value = \expandablevalue
3048
  %
4276
  %
3049
  % Normal spaces, not active ones.
4277
  \normalturnoffactive
3050
  \unsepspaces
3051
  %
4278
  %
3052
  % No macro expansion.
4279
  % Handle some cases of @value -- where it does not contain any
3053
  \turnoffmacros
4280
  % (non-fully-expandable) commands.
4281
  \makevalueexpandable
3054
}
4282
}
3055
4283
3056
% If an index command is used in an @example environment, any spaces
4284
% \commondummiesnofonts: common to \commondummies and \indexnofonts.
3057
% therein should become regular spaces in the raw index file, not the
4285
%
3058
% expansion of \tie (\leavevmode \penalty \@M \ ).
4286
\def\commondummiesnofonts{%
3059
{\obeyspaces
4287
  % Control letters and accents.
3060
 \gdef\unsepspaces{\obeyspaces\let =\space}}
4288
  \definedummyletter\!%
3061
4289
  \definedummyaccent\"%
4290
  \definedummyaccent\'%
4291
  \definedummyletter\*%
4292
  \definedummyaccent\,%
4293
  \definedummyletter\.%
4294
  \definedummyletter\/%
4295
  \definedummyletter\:%
4296
  \definedummyaccent\=%
4297
  \definedummyletter\?%
4298
  \definedummyaccent\^%
4299
  \definedummyaccent\`%
4300
  \definedummyaccent\~%
4301
  \definedummyword\u
4302
  \definedummyword\v
4303
  \definedummyword\H
4304
  \definedummyword\dotaccent
4305
  \definedummyword\ogonek
4306
  \definedummyword\ringaccent
4307
  \definedummyword\tieaccent
4308
  \definedummyword\ubaraccent
4309
  \definedummyword\udotaccent
4310
  \definedummyword\dotless
4311
  %
4312
  % Texinfo font commands.
4313
  \definedummyword\b
4314
  \definedummyword\i
4315
  \definedummyword\r
4316
  \definedummyword\sc
4317
  \definedummyword\t
4318
  %
4319
  % Commands that take arguments.
4320
  \definedummyword\acronym
4321
  \definedummyword\cite
4322
  \definedummyword\code
4323
  \definedummyword\command
4324
  \definedummyword\dfn
4325
  \definedummyword\emph
4326
  \definedummyword\env
4327
  \definedummyword\file
4328
  \definedummyword\kbd
4329
  \definedummyword\key
4330
  \definedummyword\math
4331
  \definedummyword\option
4332
  \definedummyword\pxref
4333
  \definedummyword\ref
4334
  \definedummyword\samp
4335
  \definedummyword\strong
4336
  \definedummyword\tie
4337
  \definedummyword\uref
4338
  \definedummyword\url
4339
  \definedummyword\var
4340
  \definedummyword\verb
4341
  \definedummyword\w
4342
  \definedummyword\xref
4343
}
3062
4344
3063
% \indexnofonts is used when outputting the strings to sort the index
4345
% \indexnofonts is used when outputting the strings to sort the index
3064
% by, and when constructing control sequence names.  It eliminates all
4346
% by, and when constructing control sequence names.  It eliminates all
3065
% control sequences and just writes whatever the best ASCII sort string
4347
% control sequences and just writes whatever the best ASCII sort string
3066
% would be for a given command (usually its argument).
4348
% would be for a given command (usually its argument).
3067
%
4349
%
3068
\def\indexdummytex{TeX}
3069
\def\indexdummydots{...}
3070
%
3071
\def\indexnofonts{%
4350
\def\indexnofonts{%
4351
  % Accent commands should become @asis.
4352
  \def\definedummyaccent##1{\let##1\asis}%
4353
  % We can just ignore other control letters.
4354
  \def\definedummyletter##1{\let##1\empty}%
4355
  % Hopefully, all control words can become @asis.
4356
  \let\definedummyword\definedummyaccent
4357
  %
4358
  \commondummiesnofonts
4359
  %
4360
  % Don't no-op \tt, since it isn't a user-level command
4361
  % and is used in the definitions of the active chars like <, >, |, etc.
4362
  % Likewise with the other plain tex font commands.
4363
  %\let\tt=\asis
4364
  %
3072
  \def\ { }%
4365
  \def\ { }%
3073
  \def\@{@}%
4366
  \def\@{@}%
3074
  % how to handle braces?
4367
  % how to handle braces?
3075
  \def\_{\normalunderscore}%
4368
  \def\_{\normalunderscore}%
3076
  %
4369
  %
3077
  \let\,=\asis
4370
  % Non-English letters.
3078
  \let\"=\asis
3079
  \let\`=\asis
3080
  \let\'=\asis
3081
  \let\^=\asis
3082
  \let\~=\asis
3083
  \let\==\asis
3084
  \let\u=\asis
3085
  \let\v=\asis
3086
  \let\H=\asis
3087
  \let\dotaccent=\asis
3088
  \let\ringaccent=\asis
3089
  \let\tieaccent=\asis
3090
  \let\ubaraccent=\asis
3091
  \let\udotaccent=\asis
3092
  \let\dotless=\asis
3093
  %
3094
  % Other non-English letters.
3095
  \def\AA{AA}%
4371
  \def\AA{AA}%
3096
  \def\AE{AE}%
4372
  \def\AE{AE}%
4373
  \def\DH{DZZ}%
3097
  \def\L{L}%
4374
  \def\L{L}%
3098
  \def\OE{OE}%
4375
  \def\OE{OE}%
3099
  \def\O{O}%
4376
  \def\O{O}%
4377
  \def\TH{ZZZ}%
3100
  \def\aa{aa}%
4378
  \def\aa{aa}%
3101
  \def\ae{ae}%
4379
  \def\ae{ae}%
4380
  \def\dh{dzz}%
4381
  \def\exclamdown{!}%
3102
  \def\l{l}%
4382
  \def\l{l}%
3103
  \def\oe{oe}%
4383
  \def\oe{oe}%
4384
  \def\ordf{a}%
4385
  \def\ordm{o}%
3104
  \def\o{o}%
4386
  \def\o{o}%
3105
  \def\ss{ss}%
3106
  \def\exclamdown{!}%
3107
  \def\questiondown{?}%
4387
  \def\questiondown{?}%
4388
  \def\ss{ss}%
4389
  \def\th{zzz}%
3108
  %
4390
  %
3109
  % Don't no-op \tt, since it isn't a user-level command
4391
  \def\LaTeX{LaTeX}%
3110
  % and is used in the definitions of the active chars like <, >, |, etc.
4392
  \def\TeX{TeX}%
3111
  % Likewise with the other plain tex font commands.
3112
  %\let\tt=\asis
3113
  %
4393
  %
3114
  % Texinfo font commands.
4394
  % Assorted special characters.
3115
  \let\b=\asis
4395
  % (The following {} will end up in the sort string, but that's ok.)
3116
  \let\i=\asis
4396
  \def\bullet{bullet}%
3117
  \let\r=\asis
4397
  \def\comma{,}%
3118
  \let\sc=\asis
4398
  \def\copyright{copyright}%
3119
  \let\t=\asis
4399
  \def\dots{...}%
3120
  %
4400
  \def\enddots{...}%
3121
  \let\TeX=\indexdummytex
4401
  \def\equiv{==}%
3122
  \let\acronym=\asis
4402
  \def\error{error}%
3123
  \let\cite=\asis
4403
  \def\euro{euro}%
3124
  \let\code=\asis
4404
  \def\expansion{==>}%
3125
  \let\command=\asis
4405
  \def\guillemetleft{<<}%
3126
  \let\dfn=\asis
4406
  \def\guillemetright{>>}%
3127
  \let\dots=\indexdummydots
4407
  \def\guilsinglleft{<}%
3128
  \let\emph=\asis
4408
  \def\guilsinglright{>}%
3129
  \let\env=\asis
4409
  \def\minus{-}%
3130
  \let\file=\asis
4410
  \def\point{.}%
3131
  \let\kbd=\asis
4411
  \def\pounds{pounds}%
3132
  \let\key=\asis
4412
  \def\print{-|}%
3133
  \let\math=\asis
4413
  \def\quotedblbase{"}%
3134
  \let\option=\asis
4414
  \def\quotedblleft{"}%
3135
  \let\samp=\asis
4415
  \def\quotedblright{"}%
3136
  \let\strong=\asis
4416
  \def\quoteleft{`}%
3137
  \let\uref=\asis
4417
  \def\quoteright{'}%
3138
  \let\url=\asis
4418
  \def\quotesinglbase{,}%
3139
  \let\var=\asis
4419
  \def\registeredsymbol{R}%
3140
  \let\verb=\asis
4420
  \def\result{=>}%
3141
  \let\w=\asis
4421
  \def\textdegree{o}%
4422
  %
4423
  % We need to get rid of all macros, leaving only the arguments (if present).
4424
  % Of course this is not nearly correct, but it is the best we can do for now.
4425
  % makeinfo does not expand macros in the argument to @deffn, which ends up
4426
  % writing an index entry, and texindex isn't prepared for an index sort entry
4427
  % that starts with \.
4428
  %
4429
  % Since macro invocations are followed by braces, we can just redefine them
4430
  % to take a single TeX argument.  The case of a macro invocation that
4431
  % goes to end-of-line is not handled.
4432
  %
4433
  \macrolist
3142
}
4434
}
3143
4435
3144
\let\indexbackslash=0  %overridden during \printindex.
4436
\let\indexbackslash=0  %overridden during \printindex.
3145
\let\SETmarginindex=\relax % put index entries in margin (undocumented)?
4437
\let\SETmarginindex=\relax % put index entries in margin (undocumented)?
3146
4438
3147
% Most index entries go through here, but \dosubind is the general case.
4439
% Most index entries go through here, but \dosubind is the general case.
3148
%
4440
% #1 is the index name, #2 is the entry text.
3149
\def\doind#1#2{\dosubind{#1}{#2}{}}
4441
\def\doind#1#2{\dosubind{#1}{#2}{}}
3150
4442
3151
% Workhorse for all \fooindexes.
4443
% Workhorse for all \fooindexes.
3152
% #1 is name of index, #2 is stuff to put there, #3 is subentry --
4444
% #1 is name of index, #2 is stuff to put there, #3 is subentry --
3153
% \empty if called from \doind, as we usually are.  The main exception
4445
% empty if called from \doind, as we usually are (the main exception
3154
% is with defuns, which call us directly.
4446
% is with most defuns, which call us directly).
3155
%
4447
%
3156
\def\dosubind#1#2#3{%
4448
\def\dosubind#1#2#3{%
3157
  \iflinks
4449
  \iflinks
3158
  {%
4450
  {%
3159
    % Store the main index entry text (including the third arg).
4451
    % Store the main index entry text (including the third arg).
3160
    \toks0 = {#2}%
4452
    \toks0 = {#2}%
3161
    % If third arg is present, precede it with space.
4453
    % If third arg is present, precede it with a space.
3162
    \def\thirdarg{#3}%
4454
    \def\thirdarg{#3}%
3163
    \ifx\thirdarg\empty \else
4455
    \ifx\thirdarg\empty \else
3164
      \toks0 = \expandafter{\the\toks0 \space #3}%
4456
      \toks0 = \expandafter{\the\toks0 \space #3}%
Lines 3166-3181 Link Here
3166
    %
4458
    %
3167
    \edef\writeto{\csname#1indfile\endcsname}%
4459
    \edef\writeto{\csname#1indfile\endcsname}%
3168
    %
4460
    %
3169
    \ifvmode
4461
    \safewhatsit\dosubindwrite
3170
      \dosubindsanitize
3171
    \else
3172
      \dosubindwrite
3173
    \fi
3174
  }%
4462
  }%
3175
  \fi
4463
  \fi
3176
}
4464
}
3177
4465
3178
% Write the entry to the index file:
4466
% Write the entry in \toks0 to the index file:
3179
%
4467
%
3180
\def\dosubindwrite{%
4468
\def\dosubindwrite{%
3181
  % Put the index entry in the margin if desired.
4469
  % Put the index entry in the margin if desired.
Lines 3185-3192 Link Here
3185
  %
4473
  %
3186
  % Remember, we are within a group.
4474
  % Remember, we are within a group.
3187
  \indexdummies % Must do this here, since \bf, etc expand at this stage
4475
  \indexdummies % Must do this here, since \bf, etc expand at this stage
3188
  \escapechar=`\\
4476
  \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now
3189
  \def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now
3190
      % so it will be output as is; and it will print as backslash.
4477
      % so it will be output as is; and it will print as backslash.
3191
  %
4478
  %
3192
  % Process the index entry with all font commands turned off, to
4479
  % Process the index entry with all font commands turned off, to
Lines 3208-3220 Link Here
3208
  \temp
4495
  \temp
3209
}
4496
}
3210
4497
3211
%  Take care of unwanted page breaks:
4498
% Take care of unwanted page breaks/skips around a whatsit:
3212
%
4499
%
3213
% If a skip is the last thing on the list now, preserve it
4500
% If a skip is the last thing on the list now, preserve it
3214
% by backing up by \lastskip, doing the \write, then inserting
4501
% by backing up by \lastskip, doing the \write, then inserting
3215
% the skip again.  Otherwise, the whatsit generated by the
4502
% the skip again.  Otherwise, the whatsit generated by the
3216
% \write will make \lastskip zero.  The result is that sequences
4503
% \write or \pdfdest will make \lastskip zero.  The result is that
3217
% like this:
4504
% sequences like this:
3218
% @end defun
4505
% @end defun
3219
% @tindex whatever
4506
% @tindex whatever
3220
% @defun ...
4507
% @defun ...
Lines 3227-3264 Link Here
3227
%
4514
%
3228
% Avoid page breaks due to these extra skips, too.
4515
% Avoid page breaks due to these extra skips, too.
3229
%
4516
%
3230
\def\dosubindsanitize{%
4517
% But wait, there is a catch there:
4518
% We'll have to check whether \lastskip is zero skip.  \ifdim is not
4519
% sufficient for this purpose, as it ignores stretch and shrink parts
4520
% of the skip.  The only way seems to be to check the textual
4521
% representation of the skip.
4522
%
4523
% The following is almost like \def\zeroskipmacro{0.0pt} except that
4524
% the ``p'' and ``t'' characters have catcode \other, not 11 (letter).
4525
%
4526
\edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname}
4527
%
4528
\newskip\whatsitskip
4529
\newcount\whatsitpenalty
4530
%
4531
% ..., ready, GO:
4532
%
4533
\def\safewhatsit#1{%
4534
\ifhmode
4535
  #1%
4536
\else
3231
  % \lastskip and \lastpenalty cannot both be nonzero simultaneously.
4537
  % \lastskip and \lastpenalty cannot both be nonzero simultaneously.
3232
  \skip0 = \lastskip
4538
  \whatsitskip = \lastskip
3233
  \count255 = \lastpenalty
4539
  \edef\lastskipmacro{\the\lastskip}%
4540
  \whatsitpenalty = \lastpenalty
3234
  %
4541
  %
3235
  % If \lastskip is nonzero, that means the last item was a
4542
  % If \lastskip is nonzero, that means the last item was a
3236
  % skip.  And since a skip is discardable, that means this
4543
  % skip.  And since a skip is discardable, that means this
3237
  % -\skip0 glue we're inserting is preceded by a
4544
  % -\whatsitskip glue we're inserting is preceded by a
3238
  % non-discardable item, therefore it is not a potential
4545
  % non-discardable item, therefore it is not a potential
3239
  % breakpoint, therefore no \nobreak needed.
4546
  % breakpoint, therefore no \nobreak needed.
3240
  \ifdim\lastskip = 0pt \else \vskip-\skip0 \fi
4547
  \ifx\lastskipmacro\zeroskipmacro
4548
  \else
4549
    \vskip-\whatsitskip
4550
  \fi
3241
  %
4551
  %
3242
  \dosubindwrite
4552
  #1%
3243
  %
4553
  %
3244
  \ifdim\skip0 = 0pt
4554
  \ifx\lastskipmacro\zeroskipmacro
3245
    % if \lastskip was zero, perhaps the last item was a
4555
    % If \lastskip was zero, perhaps the last item was a penalty, and
3246
    % penalty, and perhaps it was >=10000, e.g., a \nobreak.
4556
    % perhaps it was >=10000, e.g., a \nobreak.  In that case, we want
3247
    % In that case, we want to re-insert the penalty; since we
4557
    % to re-insert the same penalty (values >10000 are used for various
3248
    % just inserted a non-discardable item, any following glue
4558
    % signals); since we just inserted a non-discardable item, any
3249
    % (such as a \parskip) would be a breakpoint.  For example:
4559
    % following glue (such as a \parskip) would be a breakpoint.  For example:
4560
    %
3250
    %   @deffn deffn-whatever
4561
    %   @deffn deffn-whatever
3251
    %   @vindex index-whatever
4562
    %   @vindex index-whatever
3252
    %   Description.
4563
    %   Description.
3253
    % would allow a break between the index-whatever whatsit
4564
    % would allow a break between the index-whatever whatsit
3254
    % and the "Description." paragraph.
4565
    % and the "Description." paragraph.
3255
    \ifnum\count255>9999 \nobreak \fi
4566
    \ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi
3256
  \else
4567
  \else
3257
    % On the other hand, if we had a nonzero \lastskip,
4568
    % On the other hand, if we had a nonzero \lastskip,
3258
    % this make-up glue would be preceded by a non-discardable item
4569
    % this make-up glue would be preceded by a non-discardable item
3259
    % (the whatsit from the \write), so we must insert a \nobreak.
4570
    % (the whatsit from the \write), so we must insert a \nobreak.
3260
    \nobreak\vskip\skip0
4571
    \nobreak\vskip\whatsitskip
3261
  \fi
4572
  \fi
4573
\fi
3262
}
4574
}
3263
4575
3264
% The index entry written in the file actually looks like
4576
% The index entry written in the file actually looks like
Lines 3296-3309 Link Here
3296
% @printindex causes a particular index (the ??s file) to get printed.
4608
% @printindex causes a particular index (the ??s file) to get printed.
3297
% It does not print any chapter heading (usually an @unnumbered).
4609
% It does not print any chapter heading (usually an @unnumbered).
3298
%
4610
%
3299
\def\printindex{\parsearg\doprintindex}
4611
\parseargdef\printindex{\begingroup
3300
\def\doprintindex#1{\begingroup
3301
  \dobreak \chapheadingskip{10000}%
4612
  \dobreak \chapheadingskip{10000}%
3302
  %
4613
  %
3303
  \smallfonts \rm
4614
  \smallfonts \rm
3304
  \tolerance = 9500
4615
  \tolerance = 9500
4616
  \plainfrenchspacing
3305
  \everypar = {}% don't want the \kern\-parindent from indentation suppression.
4617
  \everypar = {}% don't want the \kern\-parindent from indentation suppression.
3306
  \indexbreaks
3307
  %
4618
  %
3308
  % See if the index file exists and is nonempty.
4619
  % See if the index file exists and is nonempty.
3309
  % Change catcode of @ here so that if the index file contains
4620
  % Change catcode of @ here so that if the index file contains
Lines 3330-3336 Link Here
3330
      % Index files are almost Texinfo source, but we use \ as the escape
4641
      % Index files are almost Texinfo source, but we use \ as the escape
3331
      % character.  It would be better to use @, but that's too big a change
4642
      % character.  It would be better to use @, but that's too big a change
3332
      % to make right now.
4643
      % to make right now.
3333
      \def\indexbackslash{\rawbackslashxx}%
4644
      \def\indexbackslash{\backslashcurfont}%
3334
      \catcode`\\ = 0
4645
      \catcode`\\ = 0
3335
      \escapechar = `\\
4646
      \escapechar = `\\
3336
      \begindoublecolumns
4647
      \begindoublecolumns
Lines 3352-3358 Link Here
3352
  \removelastskip
4663
  \removelastskip
3353
  %
4664
  %
3354
  % We like breaks before the index initials, so insert a bonus.
4665
  % We like breaks before the index initials, so insert a bonus.
3355
  \penalty -300
4666
  \nobreak
4667
  \vskip 0pt plus 3\baselineskip
4668
  \penalty 0
4669
  \vskip 0pt plus -3\baselineskip
3356
  %
4670
  %
3357
  % Typeset the initial.  Making this add up to a whole number of
4671
  % Typeset the initial.  Making this add up to a whole number of
3358
  % baselineskips increases the chance of the dots lining up from column
4672
  % baselineskips increases the chance of the dots lining up from column
Lines 3362-3445 Link Here
3362
  % No shrink because it confuses \balancecolumns.
4676
  % No shrink because it confuses \balancecolumns.
3363
  \vskip 1.67\baselineskip plus .5\baselineskip
4677
  \vskip 1.67\baselineskip plus .5\baselineskip
3364
  \leftline{\secbf #1}%
4678
  \leftline{\secbf #1}%
3365
  \vskip .33\baselineskip plus .1\baselineskip
3366
  %
3367
  % Do our best not to break after the initial.
4679
  % Do our best not to break after the initial.
3368
  \nobreak
4680
  \nobreak
4681
  \vskip .33\baselineskip plus .1\baselineskip
3369
}}
4682
}}
3370
4683
3371
% This typesets a paragraph consisting of #1, dot leaders, and then #2
4684
% \entry typesets a paragraph consisting of the text (#1), dot leaders, and
3372
% flush to the right margin.  It is used for index and table of contents
4685
% then page number (#2) flushed to the right margin.  It is used for index
3373
% entries.  The paragraph is indented by \leftskip.
4686
% and table of contents entries.  The paragraph is indented by \leftskip.
3374
%
4687
%
3375
\def\entry#1#2{\begingroup
4688
% A straightforward implementation would start like this:
3376
  %
4689
%	\def\entry#1#2{...
3377
  % Start a new paragraph if necessary, so our assignments below can't
4690
% But this freezes the catcodes in the argument, and can cause problems to
3378
  % affect previous text.
4691
% @code, which sets - active.  This problem was fixed by a kludge---
3379
  \par
4692
% ``-'' was active throughout whole index, but this isn't really right.
3380
  %
4693
%
3381
  % Do not fill out the last line with white space.
4694
% The right solution is to prevent \entry from swallowing the whole text.
3382
  \parfillskip = 0in
4695
%                                 --kasal, 21nov03
3383
  %
4696
\def\entry{%
3384
  % No extra space above this paragraph.
4697
  \begingroup
3385
  \parskip = 0in
4698
    %
3386
  %
4699
    % Start a new paragraph if necessary, so our assignments below can't
3387
  % Do not prefer a separate line ending with a hyphen to fewer lines.
4700
    % affect previous text.
3388
  \finalhyphendemerits = 0
4701
    \par
3389
  %
4702
    %
3390
  % \hangindent is only relevant when the entry text and page number
4703
    % Do not fill out the last line with white space.
3391
  % don't both fit on one line.  In that case, bob suggests starting the
4704
    \parfillskip = 0in
3392
  % dots pretty far over on the line.  Unfortunately, a large
4705
    %
3393
  % indentation looks wrong when the entry text itself is broken across
4706
    % No extra space above this paragraph.
3394
  % lines.  So we use a small indentation and put up with long leaders.
4707
    \parskip = 0in
3395
  %
4708
    %
3396
  % \hangafter is reset to 1 (which is the value we want) at the start
4709
    % Do not prefer a separate line ending with a hyphen to fewer lines.
3397
  % of each paragraph, so we need not do anything with that.
4710
    \finalhyphendemerits = 0
3398
  \hangindent = 2em
4711
    %
3399
  %
4712
    % \hangindent is only relevant when the entry text and page number
3400
  % When the entry text needs to be broken, just fill out the first line
4713
    % don't both fit on one line.  In that case, bob suggests starting the
3401
  % with blank space.
4714
    % dots pretty far over on the line.  Unfortunately, a large
3402
  \rightskip = 0pt plus1fil
4715
    % indentation looks wrong when the entry text itself is broken across
3403
  %
4716
    % lines.  So we use a small indentation and put up with long leaders.
3404
  % A bit of stretch before each entry for the benefit of balancing columns.
4717
    %
3405
  \vskip 0pt plus1pt
4718
    % \hangafter is reset to 1 (which is the value we want) at the start
3406
  %
4719
    % of each paragraph, so we need not do anything with that.
3407
  % Start a ``paragraph'' for the index entry so the line breaking
4720
    \hangindent = 2em
3408
  % parameters we've set above will have an effect.
4721
    %
3409
  \noindent
4722
    % When the entry text needs to be broken, just fill out the first line
3410
  %
4723
    % with blank space.
3411
  % Insert the text of the index entry.  TeX will do line-breaking on it.
4724
    \rightskip = 0pt plus1fil
3412
  #1%
4725
    %
3413
  % The following is kludged to not output a line of dots in the index if
4726
    % A bit of stretch before each entry for the benefit of balancing
3414
  % there are no page numbers.  The next person who breaks this will be
4727
    % columns.
3415
  % cursed by a Unix daemon.
4728
    \vskip 0pt plus1pt
3416
  \def\tempa{{\rm }}%
4729
    %
3417
  \def\tempb{#2}%
4730
    % Swallow the left brace of the text (first parameter):
3418
  \edef\tempc{\tempa}%
4731
    \afterassignment\doentry
3419
  \edef\tempd{\tempb}%
4732
    \let\temp =
3420
  \ifx\tempc\tempd\ \else%
4733
}
3421
    %
4734
\def\doentry{%
3422
    % If we must, put the page number on a line of its own, and fill out
4735
    \bgroup % Instead of the swallowed brace.
3423
    % this line with blank space.  (The \hfil is overwhelmed with the
4736
      \noindent
3424
    % fill leaders glue in \indexdotfill if the page number does fit.)
4737
      \aftergroup\finishentry
3425
    \hfil\penalty50
4738
      % And now comes the text of the entry.
3426
    \null\nobreak\indexdotfill % Have leaders before the page number.
4739
}
3427
    %
4740
\def\finishentry#1{%
3428
    % The `\ ' here is removed by the implicit \unskip that TeX does as
4741
    % #1 is the page number.
3429
    % part of (the primitive) \par.  Without it, a spurious underfull
4742
    %
3430
    % \hbox ensues.
4743
    % The following is kludged to not output a line of dots in the index if
3431
    \ifpdf
4744
    % there are no page numbers.  The next person who breaks this will be
3432
      \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
4745
    % cursed by a Unix daemon.
4746
    \setbox\boxA = \hbox{#1}%
4747
    \ifdim\wd\boxA = 0pt
4748
      \ %
3433
    \else
4749
    \else
3434
      \ #2% The page number ends the paragraph.
4750
      %
4751
      % If we must, put the page number on a line of its own, and fill out
4752
      % this line with blank space.  (The \hfil is overwhelmed with the
4753
      % fill leaders glue in \indexdotfill if the page number does fit.)
4754
      \hfil\penalty50
4755
      \null\nobreak\indexdotfill % Have leaders before the page number.
4756
      %
4757
      % The `\ ' here is removed by the implicit \unskip that TeX does as
4758
      % part of (the primitive) \par.  Without it, a spurious underfull
4759
      % \hbox ensues.
4760
      \ifpdf
4761
	\pdfgettoks#1.%
4762
	\ \the\toksA
4763
      \else
4764
	\ #1%
4765
      \fi
3435
    \fi
4766
    \fi
3436
  \fi%
4767
    \par
3437
  \par
4768
  \endgroup
3438
\endgroup}
4769
}
3439
4770
3440
% Like \dotfill except takes at least 1 em.
4771
% Like plain.tex's \dotfill, except uses up at least 1 em.
3441
\def\indexdotfill{\cleaders
4772
\def\indexdotfill{\cleaders
3442
  \hbox{$\mathsurround=0pt \mkern1.5mu ${\it .}$ \mkern1.5mu$}\hskip 1em plus 1fill}
4773
  \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1fill}
3443
4774
3444
\def\primary #1{\line{#1\hfil}}
4775
\def\primary #1{\line{#1\hfil}}
3445
4776
Lines 3549-3554 Link Here
3549
%
4880
%
3550
% All done with double columns.
4881
% All done with double columns.
3551
\def\enddoublecolumns{%
4882
\def\enddoublecolumns{%
4883
  % The following penalty ensures that the page builder is exercised
4884
  % _before_ we change the output routine.  This is necessary in the
4885
  % following situation:
4886
  %
4887
  % The last section of the index consists only of a single entry.
4888
  % Before this section, \pagetotal is less than \pagegoal, so no
4889
  % break occurs before the last section starts.  However, the last
4890
  % section, consisting of \initial and the single \entry, does not
4891
  % fit on the page and has to be broken off.  Without the following
4892
  % penalty the page builder will not be exercised until \eject
4893
  % below, and by that time we'll already have changed the output
4894
  % routine to the \balancecolumns version, so the next-to-last
4895
  % double-column page will be processed with \balancecolumns, which
4896
  % is wrong:  The two columns will go to the main vertical list, with
4897
  % the broken-off section in the recent contributions.  As soon as
4898
  % the output routine finishes, TeX starts reconsidering the page
4899
  % break.  The two columns and the broken-off section both fit on the
4900
  % page, because the two columns now take up only half of the page
4901
  % goal.  When TeX sees \eject from below which follows the final
4902
  % section, it invokes the new output routine that we've set after
4903
  % \balancecolumns below; \onepageout will try to fit the two columns
4904
  % and the final section into the vbox of \pageheight (see
4905
  % \pagebody), causing an overfull box.
4906
  %
4907
  % Note that glue won't work here, because glue does not exercise the
4908
  % page builder, unlike penalties (see The TeXbook, pp. 280-281).
4909
  \penalty0
4910
  %
3552
  \output = {%
4911
  \output = {%
3553
    % Split the last of the double-column material.  Leave it on the
4912
    % Split the last of the double-column material.  Leave it on the
3554
    % current page, no automatic page break.
4913
    % current page, no automatic page break.
Lines 3622-3628 Link Here
3622
% We do the following ugly conditional instead of the above simple
4981
% We do the following ugly conditional instead of the above simple
3623
% construct for the sake of pdftex, which needs the actual
4982
% construct for the sake of pdftex, which needs the actual
3624
% letter in the expansion, not just typeset.
4983
% letter in the expansion, not just typeset.
3625
% 
4984
%
3626
\def\appendixletter{%
4985
\def\appendixletter{%
3627
  \ifnum\appendixno=`A A%
4986
  \ifnum\appendixno=`A A%
3628
  \else\ifnum\appendixno=`B B%
4987
  \else\ifnum\appendixno=`B B%
Lines 3658-3668 Link Here
3658
  \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
5017
  \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
3659
  \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
5018
  \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
3660
5019
3661
% Each @chapter defines this as the name of the chapter.
5020
% Each @chapter defines these (using marks) as the number+name, number
3662
% page headings and footings can use it.  @section does likewise.
5021
% and name of the chapter.  Page headings and footings can use
3663
% However, they are not reliable, because we don't use marks.
5022
% these.  @section does likewise.
3664
\def\thischapter{}
5023
\def\thischapter{}
5024
\def\thischapternum{}
5025
\def\thischaptername{}
3665
\def\thissection{}
5026
\def\thissection{}
5027
\def\thissectionnum{}
5028
\def\thissectionname{}
3666
5029
3667
\newcount\absseclevel % used to calculate proper heading level
5030
\newcount\absseclevel % used to calculate proper heading level
3668
\newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count
5031
\newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count
Lines 3675-3734 Link Here
3675
\def\lowersections{\global\advance\secbase by 1}
5038
\def\lowersections{\global\advance\secbase by 1}
3676
\let\down=\lowersections % original BFox name
5039
\let\down=\lowersections % original BFox name
3677
5040
3678
% Choose a numbered-heading macro
5041
% we only have subsub.
3679
% #1 is heading level if unmodified by @raisesections or @lowersections
5042
\chardef\maxseclevel = 3
3680
% #2 is text for heading
5043
%
3681
\def\numhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
5044
% A numbered section within an unnumbered changes to unnumbered too.
3682
\ifcase\absseclevel
5045
% To achive this, remember the "biggest" unnum. sec. we are currently in:
3683
      \chapterzzz{#2}%
5046
\chardef\unmlevel = \maxseclevel
3684
  \or \seczzz{#2}%
5047
%
3685
  \or \numberedsubseczzz{#2}%
5048
% Trace whether the current chapter is an appendix or not:
3686
  \or \numberedsubsubseczzz{#2}%
5049
% \chapheadtype is "N" or "A", unnumbered chapters are ignored.
5050
\def\chapheadtype{N}
5051
5052
% Choose a heading macro
5053
% #1 is heading type
5054
% #2 is heading level
5055
% #3 is text for heading
5056
\def\genhead#1#2#3{%
5057
  % Compute the abs. sec. level:
5058
  \absseclevel=#2
5059
  \advance\absseclevel by \secbase
5060
  % Make sure \absseclevel doesn't fall outside the range:
5061
  \ifnum \absseclevel < 0
5062
    \absseclevel = 0
3687
  \else
5063
  \else
3688
    \ifnum \absseclevel<0 \chapterzzz{#2}%
5064
    \ifnum \absseclevel > 3
3689
    \else \numberedsubsubseczzz{#2}%
5065
      \absseclevel = 3
3690
    \fi
5066
    \fi
3691
  \fi
5067
  \fi
3692
  \suppressfirstparagraphindent
5068
  % The heading type:
3693
}
5069
  \def\headtype{#1}%
3694
5070
  \if \headtype U%
3695
% like \numhead, but chooses appendix heading levels
5071
    \ifnum \absseclevel < \unmlevel
3696
\def\apphead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
5072
      \chardef\unmlevel = \absseclevel
3697
\ifcase\absseclevel
5073
    \fi
3698
      \appendixzzz{#2}%
3699
  \or \appendixsectionzzz{#2}%
3700
  \or \appendixsubseczzz{#2}%
3701
  \or \appendixsubsubseczzz{#2}%
3702
  \else
5074
  \else
3703
    \ifnum \absseclevel<0 \appendixzzz{#2}%
5075
    % Check for appendix sections:
3704
    \else \appendixsubsubseczzz{#2}%
5076
    \ifnum \absseclevel = 0
5077
      \edef\chapheadtype{\headtype}%
5078
    \else
5079
      \if \headtype A\if \chapheadtype N%
5080
	\errmessage{@appendix... within a non-appendix chapter}%
5081
      \fi\fi
5082
    \fi
5083
    % Check for numbered within unnumbered:
5084
    \ifnum \absseclevel > \unmlevel
5085
      \def\headtype{U}%
5086
    \else
5087
      \chardef\unmlevel = 3
3705
    \fi
5088
    \fi
3706
  \fi
5089
  \fi
3707
  \suppressfirstparagraphindent
5090
  % Now print the heading:
3708
}
5091
  \if \headtype U%
3709
5092
    \ifcase\absseclevel
3710
% like \numhead, but chooses numberless heading levels
5093
	\unnumberedzzz{#3}%
3711
\def\unnmhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
5094
    \or \unnumberedseczzz{#3}%
3712
  \ifcase\absseclevel
5095
    \or \unnumberedsubseczzz{#3}%
3713
      \unnumberedzzz{#2}%
5096
    \or \unnumberedsubsubseczzz{#3}%
3714
  \or \unnumberedseczzz{#2}%
5097
    \fi
3715
  \or \unnumberedsubseczzz{#2}%
3716
  \or \unnumberedsubsubseczzz{#2}%
3717
  \else
5098
  \else
3718
    \ifnum \absseclevel<0 \unnumberedzzz{#2}%
5099
    \if \headtype A%
3719
    \else \unnumberedsubsubseczzz{#2}%
5100
      \ifcase\absseclevel
5101
	  \appendixzzz{#3}%
5102
      \or \appendixsectionzzz{#3}%
5103
      \or \appendixsubseczzz{#3}%
5104
      \or \appendixsubsubseczzz{#3}%
5105
      \fi
5106
    \else
5107
      \ifcase\absseclevel
5108
	  \chapterzzz{#3}%
5109
      \or \seczzz{#3}%
5110
      \or \numberedsubseczzz{#3}%
5111
      \or \numberedsubsubseczzz{#3}%
5112
      \fi
3720
    \fi
5113
    \fi
3721
  \fi
5114
  \fi
3722
  \suppressfirstparagraphindent
5115
  \suppressfirstparagraphindent
3723
}
5116
}
3724
5117
3725
% @chapter, @appendix, @unnumbered.
5118
% an interface:
5119
\def\numhead{\genhead N}
5120
\def\apphead{\genhead A}
5121
\def\unnmhead{\genhead U}
5122
5123
% @chapter, @appendix, @unnumbered.  Increment top-level counter, reset
5124
% all lower-level sectioning counters to zero.
5125
%
5126
% Also set \chaplevelprefix, which we prepend to @float sequence numbers
5127
% (e.g., figures), q.v.  By default (before any chapter), that is empty.
5128
\let\chaplevelprefix = \empty
3726
%
5129
%
3727
\outer\def\chapter{\parsearg\chapteryyy}
5130
\outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz
3728
\def\chapteryyy#1{\numhead0{#1}} % normally numhead0 calls chapterzzz
3729
\def\chapterzzz#1{%
5131
\def\chapterzzz#1{%
3730
  \secno=0 \subsecno=0 \subsubsecno=0  \advance\chapno by 1
5132
  % section resetting is \global in case the chapter is in a group, such
3731
  \message{\putwordChapter\space \the\chapno}%
5133
  % as an @include file.
5134
  \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
5135
    \global\advance\chapno by 1
5136
  %
5137
  % Used for \float.
5138
  \gdef\chaplevelprefix{\the\chapno.}%
5139
  \resetallfloatnos
5140
  %
5141
  % \putwordChapter can contain complex things in translations.
5142
  \toks0=\expandafter{\putwordChapter}%
5143
  \message{\the\toks0 \space \the\chapno}%
3732
  %
5144
  %
3733
  % Write the actual heading.
5145
  % Write the actual heading.
3734
  \chapmacro{#1}{Ynumbered}{\the\chapno}%
5146
  \chapmacro{#1}{Ynumbered}{\the\chapno}%
Lines 3739-3767 Link Here
3739
  \global\let\subsubsection = \numberedsubsubsec
5151
  \global\let\subsubsection = \numberedsubsubsec
3740
}
5152
}
3741
5153
3742
\outer\def\appendix{\parsearg\appendixyyy}
5154
\outer\parseargdef\appendix{\apphead0{#1}} % normally calls appendixzzz
3743
\def\appendixyyy#1{\apphead0{#1}} % normally apphead0 calls appendixzzz
5155
%
3744
\def\appendixzzz#1{%
5156
\def\appendixzzz#1{%
3745
  \secno=0 \subsecno=0 \subsubsecno=0  \advance\appendixno by 1
5157
  \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
3746
  \def\appendixnum{\putwordAppendix\space \appendixletter}%
5158
    \global\advance\appendixno by 1
3747
  \message{\appendixnum}%
5159
  \gdef\chaplevelprefix{\appendixletter.}%
5160
  \resetallfloatnos
5161
  %
5162
  % \putwordAppendix can contain complex things in translations.
5163
  \toks0=\expandafter{\putwordAppendix}%
5164
  \message{\the\toks0 \space \appendixletter}%
5165
  %
3748
  \chapmacro{#1}{Yappendix}{\appendixletter}%
5166
  \chapmacro{#1}{Yappendix}{\appendixletter}%
5167
  %
3749
  \global\let\section = \appendixsec
5168
  \global\let\section = \appendixsec
3750
  \global\let\subsection = \appendixsubsec
5169
  \global\let\subsection = \appendixsubsec
3751
  \global\let\subsubsection = \appendixsubsubsec
5170
  \global\let\subsubsection = \appendixsubsubsec
3752
}
5171
}
3753
5172
3754
% @centerchap is like @unnumbered, but the heading is centered.
5173
\outer\parseargdef\unnumbered{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz
3755
\outer\def\centerchap{\parsearg\centerchapyyy}
3756
\def\centerchapyyy#1{{\unnumberedyyy{#1}}}
3757
3758
% @top is like @unnumbered.
3759
\outer\def\top{\parsearg\unnumberedyyy}
3760
3761
\outer\def\unnumbered{\parsearg\unnumberedyyy}
3762
\def\unnumberedyyy#1{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz
3763
\def\unnumberedzzz#1{%
5174
\def\unnumberedzzz#1{%
3764
  \secno=0 \subsecno=0 \subsubsecno=0  \advance\unnumberedno by 1
5175
  \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
5176
    \global\advance\unnumberedno by 1
5177
  %
5178
  % Since an unnumbered has no number, no prefix for figures.
5179
  \global\let\chaplevelprefix = \empty
5180
  \resetallfloatnos
3765
  %
5181
  %
3766
  % This used to be simply \message{#1}, but TeX fully expands the
5182
  % This used to be simply \message{#1}, but TeX fully expands the
3767
  % argument to \message.  Therefore, if #1 contained @-commands, TeX
5183
  % argument to \message.  Therefore, if #1 contained @-commands, TeX
Lines 3774-3780 Link Here
3774
  % \the<toks register> to achieve this: TeX expands \the<toks> only once,
5190
  % \the<toks register> to achieve this: TeX expands \the<toks> only once,
3775
  % simply yielding the contents of <toks register>.  (We also do this for
5191
  % simply yielding the contents of <toks register>.  (We also do this for
3776
  % the toc entries.)
5192
  % the toc entries.)
3777
  \toks0 = {#1}\message{(\the\toks0)}%
5193
  \toks0 = {#1}%
5194
  \message{(\the\toks0)}%
3778
  %
5195
  %
3779
  \chapmacro{#1}{Ynothing}{\the\unnumberedno}%
5196
  \chapmacro{#1}{Ynothing}{\the\unnumberedno}%
3780
  %
5197
  %
Lines 3783-3878 Link Here
3783
  \global\let\subsubsection = \unnumberedsubsubsec
5200
  \global\let\subsubsection = \unnumberedsubsubsec
3784
}
5201
}
3785
5202
5203
% @centerchap is like @unnumbered, but the heading is centered.
5204
\outer\parseargdef\centerchap{%
5205
  % Well, we could do the following in a group, but that would break
5206
  % an assumption that \chapmacro is called at the outermost level.
5207
  % Thus we are safer this way:		--kasal, 24feb04
5208
  \let\centerparametersmaybe = \centerparameters
5209
  \unnmhead0{#1}%
5210
  \let\centerparametersmaybe = \relax
5211
}
5212
5213
% @top is like @unnumbered.
5214
\let\top\unnumbered
5215
3786
% Sections.
5216
% Sections.
3787
\outer\def\numberedsec{\parsearg\secyyy}
5217
\outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz
3788
\def\secyyy#1{\numhead1{#1}} % normally calls seczzz
3789
\def\seczzz#1{%
5218
\def\seczzz#1{%
3790
  \subsecno=0 \subsubsecno=0  \advance\secno by 1
5219
  \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
3791
  \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}%
5220
  \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}%
3792
}
5221
}
3793
5222
3794
\outer\def\appendixsection{\parsearg\appendixsecyyy}
5223
\outer\parseargdef\appendixsection{\apphead1{#1}} % normally calls appendixsectionzzz
3795
\outer\def\appendixsec{\parsearg\appendixsecyyy}
3796
\def\appendixsecyyy#1{\apphead1{#1}} % normally calls appendixsectionzzz
3797
\def\appendixsectionzzz#1{%
5224
\def\appendixsectionzzz#1{%
3798
  \subsecno=0 \subsubsecno=0  \advance\secno by 1
5225
  \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
3799
  \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}%
5226
  \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}%
3800
}
5227
}
5228
\let\appendixsec\appendixsection
3801
5229
3802
\outer\def\unnumberedsec{\parsearg\unnumberedsecyyy}
5230
\outer\parseargdef\unnumberedsec{\unnmhead1{#1}} % normally calls unnumberedseczzz
3803
\def\unnumberedsecyyy#1{\unnmhead1{#1}} % normally calls unnumberedseczzz
3804
\def\unnumberedseczzz#1{%
5231
\def\unnumberedseczzz#1{%
3805
  \subsecno=0 \subsubsecno=0  \advance\secno by 1
5232
  \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
3806
  \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}%
5233
  \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}%
3807
}
5234
}
3808
5235
3809
% Subsections.
5236
% Subsections.
3810
\outer\def\numberedsubsec{\parsearg\numberedsubsecyyy}
5237
\outer\parseargdef\numberedsubsec{\numhead2{#1}} % normally calls numberedsubseczzz
3811
\def\numberedsubsecyyy#1{\numhead2{#1}} % normally calls numberedsubseczzz
3812
\def\numberedsubseczzz#1{%
5238
\def\numberedsubseczzz#1{%
3813
  \subsubsecno=0  \advance\subsecno by 1
5239
  \global\subsubsecno=0  \global\advance\subsecno by 1
3814
  \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}%
5240
  \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}%
3815
}
5241
}
3816
5242
3817
\outer\def\appendixsubsec{\parsearg\appendixsubsecyyy}
5243
\outer\parseargdef\appendixsubsec{\apphead2{#1}} % normally calls appendixsubseczzz
3818
\def\appendixsubsecyyy#1{\apphead2{#1}} % normally calls appendixsubseczzz
3819
\def\appendixsubseczzz#1{%
5244
\def\appendixsubseczzz#1{%
3820
  \subsubsecno=0  \advance\subsecno by 1
5245
  \global\subsubsecno=0  \global\advance\subsecno by 1
3821
  \sectionheading{#1}{subsec}{Yappendix}%
5246
  \sectionheading{#1}{subsec}{Yappendix}%
3822
                 {\appendixletter.\the\secno.\the\subsecno}%
5247
                 {\appendixletter.\the\secno.\the\subsecno}%
3823
}
5248
}
3824
5249
3825
\outer\def\unnumberedsubsec{\parsearg\unnumberedsubsecyyy}
5250
\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
3826
\def\unnumberedsubsecyyy#1{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
3827
\def\unnumberedsubseczzz#1{%
5251
\def\unnumberedsubseczzz#1{%
3828
  \subsubsecno=0  \advance\subsecno by 1
5252
  \global\subsubsecno=0  \global\advance\subsecno by 1
3829
  \sectionheading{#1}{subsec}{Ynothing}%
5253
  \sectionheading{#1}{subsec}{Ynothing}%
3830
                 {\the\unnumberedno.\the\secno.\the\subsecno}%
5254
                 {\the\unnumberedno.\the\secno.\the\subsecno}%
3831
}
5255
}
3832
5256
3833
% Subsubsections.
5257
% Subsubsections.
3834
\outer\def\numberedsubsubsec{\parsearg\numberedsubsubsecyyy}
5258
\outer\parseargdef\numberedsubsubsec{\numhead3{#1}} % normally numberedsubsubseczzz
3835
\def\numberedsubsubsecyyy#1{\numhead3{#1}} % normally numberedsubsubseczzz
3836
\def\numberedsubsubseczzz#1{%
5259
\def\numberedsubsubseczzz#1{%
3837
  \advance\subsubsecno by 1
5260
  \global\advance\subsubsecno by 1
3838
  \sectionheading{#1}{subsubsec}{Ynumbered}%
5261
  \sectionheading{#1}{subsubsec}{Ynumbered}%
3839
                 {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}%
5262
                 {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}%
3840
}
5263
}
3841
5264
3842
\outer\def\appendixsubsubsec{\parsearg\appendixsubsubsecyyy}
5265
\outer\parseargdef\appendixsubsubsec{\apphead3{#1}} % normally appendixsubsubseczzz
3843
\def\appendixsubsubsecyyy#1{\apphead3{#1}} % normally appendixsubsubseczzz
3844
\def\appendixsubsubseczzz#1{%
5266
\def\appendixsubsubseczzz#1{%
3845
  \advance\subsubsecno by 1
5267
  \global\advance\subsubsecno by 1
3846
  \sectionheading{#1}{subsubsec}{Yappendix}%
5268
  \sectionheading{#1}{subsubsec}{Yappendix}%
3847
                 {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}%
5269
                 {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}%
3848
}
5270
}
3849
5271
3850
\outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubsecyyy}
5272
\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
3851
\def\unnumberedsubsubsecyyy#1{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
3852
\def\unnumberedsubsubseczzz#1{%
5273
\def\unnumberedsubsubseczzz#1{%
3853
  \advance\subsubsecno by 1
5274
  \global\advance\subsubsecno by 1
3854
  \sectionheading{#1}{subsubsec}{Ynothing}%
5275
  \sectionheading{#1}{subsubsec}{Ynothing}%
3855
                 {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}%
5276
                 {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}%
3856
}
5277
}
3857
5278
3858
% These are variants which are not "outer", so they can appear in @ifinfo.
3859
% Actually, they are now be obsolete; ordinary section commands should work.
3860
\def\infotop{\parsearg\unnumberedzzz}
3861
\def\infounnumbered{\parsearg\unnumberedzzz}
3862
\def\infounnumberedsec{\parsearg\unnumberedseczzz}
3863
\def\infounnumberedsubsec{\parsearg\unnumberedsubseczzz}
3864
\def\infounnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz}
3865
3866
\def\infoappendix{\parsearg\appendixzzz}
3867
\def\infoappendixsec{\parsearg\appendixseczzz}
3868
\def\infoappendixsubsec{\parsearg\appendixsubseczzz}
3869
\def\infoappendixsubsubsec{\parsearg\appendixsubsubseczzz}
3870
3871
\def\infochapter{\parsearg\chapterzzz}
3872
\def\infosection{\parsearg\sectionzzz}
3873
\def\infosubsection{\parsearg\subsectionzzz}
3874
\def\infosubsubsection{\parsearg\subsubsectionzzz}
3875
3876
% These macros control what the section commands do, according
5279
% These macros control what the section commands do, according
3877
% to what kind of chapter we are in (ordinary, appendix, or unnumbered).
5280
% to what kind of chapter we are in (ordinary, appendix, or unnumbered).
3878
% Define them by default for a numbered chapter.
5281
% Define them by default for a numbered chapter.
Lines 3890-3896 Link Here
3890
%       3) Likewise, headings look best if no \parindent is used, and
5293
%       3) Likewise, headings look best if no \parindent is used, and
3891
%          if justification is not attempted.  Hence \raggedright.
5294
%          if justification is not attempted.  Hence \raggedright.
3892
5295
3893
3894
\def\majorheading{%
5296
\def\majorheading{%
3895
  {\advance\chapheadingskip by 10pt \chapbreak }%
5297
  {\advance\chapheadingskip by 10pt \chapbreak }%
3896
  \parsearg\chapheadingzzz
5298
  \parsearg\chapheadingzzz
Lines 3899-3919 Link Here
3899
\def\chapheading{\chapbreak \parsearg\chapheadingzzz}
5301
\def\chapheading{\chapbreak \parsearg\chapheadingzzz}
3900
\def\chapheadingzzz#1{%
5302
\def\chapheadingzzz#1{%
3901
  {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
5303
  {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
3902
                    \parindent=0pt\raggedright
5304
                    \parindent=0pt\ptexraggedright
3903
                    \rm #1\hfill}}%
5305
                    \rmisbold #1\hfill}}%
3904
  \bigskip \par\penalty 200\relax
5306
  \bigskip \par\penalty 200\relax
3905
  \suppressfirstparagraphindent
5307
  \suppressfirstparagraphindent
3906
}
5308
}
3907
5309
3908
% @heading, @subheading, @subsubheading.
5310
% @heading, @subheading, @subsubheading.
3909
\def\heading{\parsearg\doheading}
5311
\parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{}
3910
\def\subheading{\parsearg\dosubheading}
3911
\def\subsubheading{\parsearg\dosubsubheading}
3912
\def\doheading#1{\sectionheading{#1}{sec}{Yomitfromtoc}{}
3913
  \suppressfirstparagraphindent}
5312
  \suppressfirstparagraphindent}
3914
\def\dosubheading#1{\sectionheading{#1}{subsec}{Yomitfromtoc}{}
5313
\parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{}
3915
  \suppressfirstparagraphindent}
5314
  \suppressfirstparagraphindent}
3916
\def\dosubsubheading#1{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{}
5315
\parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{}
3917
  \suppressfirstparagraphindent}
5316
  \suppressfirstparagraphindent}
3918
5317
3919
% These macros generate a chapter, section, etc. heading only
5318
% These macros generate a chapter, section, etc. heading only
Lines 3923-3930 Link Here
3923
%%% Args are the skip and penalty (usually negative)
5322
%%% Args are the skip and penalty (usually negative)
3924
\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
5323
\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
3925
5324
3926
\def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
3927
3928
%%% Define plain chapter starts, and page on/off switching for it
5325
%%% Define plain chapter starts, and page on/off switching for it
3929
% Parameter controlling skip before chapter headings (if needed)
5326
% Parameter controlling skip before chapter headings (if needed)
3930
5327
Lines 3932-3938 Link Here
3932
5329
3933
\def\chapbreak{\dobreak \chapheadingskip {-4000}}
5330
\def\chapbreak{\dobreak \chapheadingskip {-4000}}
3934
\def\chappager{\par\vfill\supereject}
5331
\def\chappager{\par\vfill\supereject}
3935
\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi}
5332
% Because \domark is called before \chapoddpage, the filler page will
5333
% get the headings for the next chapter, which is wrong.  But we don't
5334
% care -- we just disable all headings on the filler page.
5335
\def\chapoddpage{%
5336
  \chappager
5337
  \ifodd\pageno \else
5338
    \begingroup
5339
      \evenheadline={\hfil}\evenfootline={\hfil}%
5340
      \oddheadline={\hfil}\oddfootline={\hfil}%
5341
      \hbox to 0pt{}%
5342
      \chappager
5343
    \endgroup
5344
  \fi
5345
}
3936
5346
3937
\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
5347
\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
3938
5348
Lines 3955-4011 Link Here
3955
5365
3956
\CHAPPAGon
5366
\CHAPPAGon
3957
5367
3958
\def\CHAPFplain{%
5368
% Chapter opening.
3959
\global\let\chapmacro=\chfplain
5369
%
3960
\global\let\centerchapmacro=\centerchfplain}
3961
3962
% Normal chapter opening.
3963
% 
3964
% #1 is the text, #2 is the section type (Ynumbered, Ynothing,
5370
% #1 is the text, #2 is the section type (Ynumbered, Ynothing,
3965
% Yappendix, Yomitfromtoc), #3 the chapter number.
5371
% Yappendix, Yomitfromtoc), #3 the chapter number.
3966
% 
5372
%
3967
% To test against our argument.
5373
% To test against our argument.
3968
\def\Ynothingkeyword{Ynothing}
5374
\def\Ynothingkeyword{Ynothing}
3969
\def\Yomitfromtockeyword{Yomitfromtoc}
5375
\def\Yomitfromtockeyword{Yomitfromtoc}
3970
\def\Yappendixkeyword{Yappendix}
5376
\def\Yappendixkeyword{Yappendix}
3971
%
5377
%
3972
\def\chfplain#1#2#3{%
5378
\def\chapmacro#1#2#3{%
5379
  % Insert the first mark before the heading break (see notes for \domark).
5380
  \let\prevchapterdefs=\lastchapterdefs
5381
  \let\prevsectiondefs=\lastsectiondefs
5382
  \gdef\lastsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}%
5383
                        \gdef\thissection{}}%
5384
  %
5385
  \def\temptype{#2}%
5386
  \ifx\temptype\Ynothingkeyword
5387
    \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}%
5388
                          \gdef\thischapter{\thischaptername}}%
5389
  \else\ifx\temptype\Yomitfromtockeyword
5390
    \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}%
5391
                          \gdef\thischapter{}}%
5392
  \else\ifx\temptype\Yappendixkeyword
5393
    \toks0={#1}%
5394
    \xdef\lastchapterdefs{%
5395
      \gdef\noexpand\thischaptername{\the\toks0}%
5396
      \gdef\noexpand\thischapternum{\appendixletter}%
5397
      % \noexpand\putwordAppendix avoids expanding indigestible
5398
      % commands in some of the translations.
5399
      \gdef\noexpand\thischapter{\noexpand\putwordAppendix{}
5400
                                 \noexpand\thischapternum:
5401
                                 \noexpand\thischaptername}%
5402
    }%
5403
  \else
5404
    \toks0={#1}%
5405
    \xdef\lastchapterdefs{%
5406
      \gdef\noexpand\thischaptername{\the\toks0}%
5407
      \gdef\noexpand\thischapternum{\the\chapno}%
5408
      % \noexpand\putwordChapter avoids expanding indigestible
5409
      % commands in some of the translations.
5410
      \gdef\noexpand\thischapter{\noexpand\putwordChapter{}
5411
                                 \noexpand\thischapternum:
5412
                                 \noexpand\thischaptername}%
5413
    }%
5414
  \fi\fi\fi
5415
  %
5416
  % Output the mark.  Pass it through \safewhatsit, to take care of
5417
  % the preceding space.
5418
  \safewhatsit\domark
5419
  %
5420
  % Insert the chapter heading break.
3973
  \pchapsepmacro
5421
  \pchapsepmacro
5422
  %
5423
  % Now the second mark, after the heading break.  No break points
5424
  % between here and the heading.
5425
  \let\prevchapterdefs=\lastchapterdefs
5426
  \let\prevsectiondefs=\lastsectiondefs
5427
  \domark
5428
  %
3974
  {%
5429
  {%
3975
    \chapfonts \rm
5430
    \chapfonts \rmisbold
3976
    %
5431
    %
3977
    % Have to define \thissection before calling \donoderef, because the
5432
    % Have to define \lastsection before calling \donoderef, because the
3978
    % xref code eventually uses it, as \Ytitle.  On the other hand, it
5433
    % xref code eventually uses it.  On the other hand, it has to be called
3979
    % has to be called after \pchapsepmacro, or the headline will change
5434
    % after \pchapsepmacro, or the headline will change too soon.
3980
    % too soon.
5435
    \gdef\lastsection{#1}%
3981
    \gdef\thissection{#1}%
3982
    \gdef\thischaptername{#1}%
3983
    %
5436
    %
3984
    % Only insert the separating space if we have a chapter/appendix
5437
    % Only insert the separating space if we have a chapter/appendix
3985
    % number, and don't print the unnumbered ``number''.
5438
    % number, and don't print the unnumbered ``number''.
3986
    \def\temptype{#2}%
3987
    \ifx\temptype\Ynothingkeyword
5439
    \ifx\temptype\Ynothingkeyword
3988
      \setbox0 = \hbox{}%
5440
      \setbox0 = \hbox{}%
3989
      \def\toctype{unnchap}%
5441
      \def\toctype{unnchap}%
3990
      \def\thischapter{#1}%
3991
    \else\ifx\temptype\Yomitfromtockeyword
5442
    \else\ifx\temptype\Yomitfromtockeyword
3992
      \setbox0 = \hbox{}% contents like unnumbered, but no toc entry
5443
      \setbox0 = \hbox{}% contents like unnumbered, but no toc entry
3993
      \def\toctype{omit}%
5444
      \def\toctype{omit}%
3994
      \xdef\thischapter{}%
3995
    \else\ifx\temptype\Yappendixkeyword
5445
    \else\ifx\temptype\Yappendixkeyword
3996
      \setbox0 = \hbox{\putwordAppendix{} #3\enspace}%
5446
      \setbox0 = \hbox{\putwordAppendix{} #3\enspace}%
3997
      \def\toctype{app}%
5447
      \def\toctype{app}%
3998
      % We don't substitute the actual chapter name into \thischapter
3999
      % because we don't want its macros evaluated now.  And we don't
4000
      % use \thissection because that changes with each section.
4001
      %
4002
      \xdef\thischapter{\putwordAppendix{} \appendixletter:
4003
                        \noexpand\thischaptername}%
4004
    \else
5448
    \else
4005
      \setbox0 = \hbox{#3\enspace}%
5449
      \setbox0 = \hbox{#3\enspace}%
4006
      \def\toctype{numchap}%
5450
      \def\toctype{numchap}%
4007
      \xdef\thischapter{\putwordChapter{} \the\chapno:
4008
                        \noexpand\thischaptername}%
4009
    \fi\fi\fi
5451
    \fi\fi\fi
4010
    %
5452
    %
4011
    % Write the toc entry for this chapter.  Must come before the
5453
    % Write the toc entry for this chapter.  Must come before the
Lines 4021-4027 Link Here
4021
    \donoderef{#2}%
5463
    \donoderef{#2}%
4022
    %
5464
    %
4023
    % Typeset the actual heading.
5465
    % Typeset the actual heading.
4024
    \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
5466
    \nobreak % Avoid page breaks at the interline glue.
5467
    \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright
4025
          \hangindent=\wd0 \centerparametersmaybe
5468
          \hangindent=\wd0 \centerparametersmaybe
4026
          \unhbox0 #1\par}%
5469
          \unhbox0 #1\par}%
4027
  }%
5470
  }%
Lines 4031-4075 Link Here
4031
5474
4032
% @centerchap -- centered and unnumbered.
5475
% @centerchap -- centered and unnumbered.
4033
\let\centerparametersmaybe = \relax
5476
\let\centerparametersmaybe = \relax
4034
\def\centerchfplain#1{{%
5477
\def\centerparameters{%
4035
  \def\centerparametersmaybe{%
5478
  \advance\rightskip by 3\rightskip
4036
    \advance\rightskip by 3\rightskip
5479
  \leftskip = \rightskip
4037
    \leftskip = \rightskip
5480
  \parfillskip = 0pt
4038
    \parfillskip = 0pt
5481
}
4039
  }%
4040
  \chfplain{#1}{Ynothing}{}%
4041
}}
4042
5482
4043
\CHAPFplain % The default
4044
5483
4045
% I don't think this chapter style is supported any more, so I'm not
5484
% I don't think this chapter style is supported any more, so I'm not
4046
% updating it with the new noderef stuff.  We'll see.  --karl, 11aug03.
5485
% updating it with the new noderef stuff.  We'll see.  --karl, 11aug03.
4047
% 
5486
%
5487
\def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
5488
%
4048
\def\unnchfopen #1{%
5489
\def\unnchfopen #1{%
4049
\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
5490
\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
4050
                       \parindent=0pt\raggedright
5491
                       \parindent=0pt\ptexraggedright
4051
                       \rm #1\hfill}}\bigskip \par\nobreak
5492
                       \rmisbold #1\hfill}}\bigskip \par\nobreak
4052
}
5493
}
4053
4054
\def\chfopen #1#2{\chapoddpage {\chapfonts
5494
\def\chfopen #1#2{\chapoddpage {\chapfonts
4055
\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
5495
\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
4056
\par\penalty 5000 %
5496
\par\penalty 5000 %
4057
}
5497
}
4058
4059
\def\centerchfopen #1{%
5498
\def\centerchfopen #1{%
4060
\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
5499
\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
4061
                       \parindent=0pt
5500
                       \parindent=0pt
4062
                       \hfill {\rm #1}\hfill}}\bigskip \par\nobreak
5501
                       \hfill {\rmisbold #1}\hfill}}\bigskip \par\nobreak
4063
}
5502
}
4064
4065
\def\CHAPFopen{%
5503
\def\CHAPFopen{%
4066
\global\let\chapmacro=\chfopen
5504
  \global\let\chapmacro=\chfopen
4067
\global\let\centerchapmacro=\centerchfopen}
5505
  \global\let\centerchapmacro=\centerchfopen}
4068
5506
4069
5507
4070
% Section titles.  These macros combine the section number parts and
5508
% Section titles.  These macros combine the section number parts and
4071
% call the generic \sectionheading to do the printing.
5509
% call the generic \sectionheading to do the printing.
4072
% 
5510
%
4073
\newskip\secheadingskip
5511
\newskip\secheadingskip
4074
\def\secheadingbreak{\dobreak \secheadingskip{-1000}}
5512
\def\secheadingbreak{\dobreak \secheadingskip{-1000}}
4075
5513
Lines 4083-4134 Link Here
4083
5521
4084
5522
4085
% Print any size, any type, section title.
5523
% Print any size, any type, section title.
4086
% 
5524
%
4087
% #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is
5525
% #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is
4088
% the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the
5526
% the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the
4089
% section number.
5527
% section number.
4090
% 
5528
%
5529
\def\seckeyword{sec}
5530
%
4091
\def\sectionheading#1#2#3#4{%
5531
\def\sectionheading#1#2#3#4{%
4092
  {%
5532
  {%
4093
    % Switch to the right set of fonts.
5533
    % Switch to the right set of fonts.
4094
    \csname #2fonts\endcsname \rm
5534
    \csname #2fonts\endcsname \rmisbold
5535
    %
5536
    \def\sectionlevel{#2}%
5537
    \def\temptype{#3}%
5538
    %
5539
    % Insert first mark before the heading break (see notes for \domark).
5540
    \let\prevsectiondefs=\lastsectiondefs
5541
    \ifx\temptype\Ynothingkeyword
5542
      \ifx\sectionlevel\seckeyword
5543
        \gdef\lastsectiondefs{\gdef\thissectionname{#1}\gdef\thissectionnum{}%
5544
                              \gdef\thissection{\thissectionname}}%
5545
      \fi
5546
    \else\ifx\temptype\Yomitfromtockeyword
5547
      % Don't redefine \thissection.
5548
    \else\ifx\temptype\Yappendixkeyword
5549
      \ifx\sectionlevel\seckeyword
5550
        \toks0={#1}%
5551
        \xdef\lastsectiondefs{%
5552
          \gdef\noexpand\thissectionname{\the\toks0}%
5553
          \gdef\noexpand\thissectionnum{#4}%
5554
          % \noexpand\putwordSection avoids expanding indigestible
5555
          % commands in some of the translations.
5556
          \gdef\noexpand\thissection{\noexpand\putwordSection{}
5557
                                     \noexpand\thissectionnum:
5558
                                     \noexpand\thissectionname}%
5559
        }%
5560
      \fi
5561
    \else
5562
      \ifx\sectionlevel\seckeyword
5563
        \toks0={#1}%
5564
        \xdef\lastsectiondefs{%
5565
          \gdef\noexpand\thissectionname{\the\toks0}%
5566
          \gdef\noexpand\thissectionnum{#4}%
5567
          % \noexpand\putwordSection avoids expanding indigestible
5568
          % commands in some of the translations.
5569
          \gdef\noexpand\thissection{\noexpand\putwordSection{}
5570
                                     \noexpand\thissectionnum:
5571
                                     \noexpand\thissectionname}%
5572
        }%
5573
      \fi
5574
    \fi\fi\fi
5575
    %
5576
    % Go into vertical mode.  Usually we'll already be there, but we
5577
    % don't want the following whatsit to end up in a preceding paragraph
5578
    % if the document didn't happen to have a blank line.
5579
    \par
5580
    %
5581
    % Output the mark.  Pass it through \safewhatsit, to take care of
5582
    % the preceding space.
5583
    \safewhatsit\domark
4095
    %
5584
    %
4096
    % Insert space above the heading.
5585
    % Insert space above the heading.
4097
    \csname #2headingbreak\endcsname
5586
    \csname #2headingbreak\endcsname
4098
    %
5587
    %
4099
    % Only insert the space after the number if we have a section number.
5588
    % Now the second mark, after the heading break.  No break points
4100
    \def\sectionlevel{#2}%
5589
    % between here and the heading.
4101
    \def\temptype{#3}%
5590
    \let\prevsectiondefs=\lastsectiondefs
5591
    \domark
4102
    %
5592
    %
5593
    % Only insert the space after the number if we have a section number.
4103
    \ifx\temptype\Ynothingkeyword
5594
    \ifx\temptype\Ynothingkeyword
4104
      \setbox0 = \hbox{}%
5595
      \setbox0 = \hbox{}%
4105
      \def\toctype{unn}%
5596
      \def\toctype{unn}%
4106
      \gdef\thissection{#1}%
5597
      \gdef\lastsection{#1}%
4107
    \else\ifx\temptype\Yomitfromtockeyword
5598
    \else\ifx\temptype\Yomitfromtockeyword
4108
      % for @headings -- no section number, don't include in toc,
5599
      % for @headings -- no section number, don't include in toc,
4109
      % and don't redefine \thissection.
5600
      % and don't redefine \lastsection.
4110
      \setbox0 = \hbox{}%
5601
      \setbox0 = \hbox{}%
4111
      \def\toctype{omit}%
5602
      \def\toctype{omit}%
4112
      \let\sectionlevel=\empty
5603
      \let\sectionlevel=\empty
4113
    \else\ifx\temptype\Yappendixkeyword
5604
    \else\ifx\temptype\Yappendixkeyword
4114
      \setbox0 = \hbox{#4\enspace}%
5605
      \setbox0 = \hbox{#4\enspace}%
4115
      \def\toctype{app}%
5606
      \def\toctype{app}%
4116
      \gdef\thissection{#1}%
5607
      \gdef\lastsection{#1}%
4117
    \else
5608
    \else
4118
      \setbox0 = \hbox{#4\enspace}%
5609
      \setbox0 = \hbox{#4\enspace}%
4119
      \def\toctype{num}%
5610
      \def\toctype{num}%
4120
      \gdef\thissection{#1}%
5611
      \gdef\lastsection{#1}%
4121
    \fi\fi\fi
5612
    \fi\fi\fi
4122
    %
5613
    %
4123
    % Write the toc entry (before \donoderef).  See comments in \chfplain.
5614
    % Write the toc entry (before \donoderef).  See comments in \chapmacro.
4124
    \writetocentry{\toctype\sectionlevel}{#1}{#4}%
5615
    \writetocentry{\toctype\sectionlevel}{#1}{#4}%
4125
    %
5616
    %
4126
    % Write the node reference (= pdf destination for pdftex).
5617
    % Write the node reference (= pdf destination for pdftex).
4127
    % Again, see comments in \chfplain.
5618
    % Again, see comments in \chapmacro.
4128
    \donoderef{#3}%
5619
    \donoderef{#3}%
4129
    %
5620
    %
5621
    % Interline glue will be inserted when the vbox is completed.
5622
    % That glue will be a valid breakpoint for the page, since it'll be
5623
    % preceded by a whatsit (usually from the \donoderef, or from the
5624
    % \writetocentry if there was no node).  We don't want to allow that
5625
    % break, since then the whatsits could end up on page n while the
5626
    % section is on page n+1, thus toc/etc. are wrong.  Debian bug 276000.
5627
    \nobreak
5628
    %
4130
    % Output the actual section heading.
5629
    % Output the actual section heading.
4131
    \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
5630
    \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright
4132
          \hangindent=\wd0  % zero if no section number
5631
          \hangindent=\wd0  % zero if no section number
4133
          \unhbox0 #1}%
5632
          \unhbox0 #1}%
4134
  }%
5633
  }%
Lines 4145-4157 Link Here
4145
  % discardable item.)
5644
  % discardable item.)
4146
  \vskip-\parskip
5645
  \vskip-\parskip
4147
  %
5646
  %
4148
  % This \nobreak is purely so the last item on the list is a \penalty
5647
  % This is purely so the last item on the list is a known \penalty >
4149
  % of 10000.  This is so other code, for instance \parsebodycommon, can
5648
  % 10000.  This is so \startdefun can avoid allowing breakpoints after
4150
  % check for and avoid allowing breakpoints.  Otherwise, it would
5649
  % section headings.  Otherwise, it would insert a valid breakpoint between:
4151
  % insert a valid breakpoint between:
5650
  %
4152
  %   @section sec-whatever
5651
  %   @section sec-whatever
4153
  %   @deffn def-whatever
5652
  %   @deffn def-whatever
4154
  \nobreak
5653
  \penalty 10001
4155
}
5654
}
4156
5655
4157
5656
Lines 4160-4173 Link Here
4160
\newwrite\tocfile
5659
\newwrite\tocfile
4161
5660
4162
% Write an entry to the toc file, opening it if necessary.
5661
% Write an entry to the toc file, opening it if necessary.
4163
% Called from @chapter, etc.  
5662
% Called from @chapter, etc.
4164
% 
5663
%
4165
% Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno}
5664
% Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno}
4166
% We append the current node name (if any) and page number as additional
5665
% We append the current node name (if any) and page number as additional
4167
% arguments for the \{chap,sec,...}entry macros which will eventually
5666
% arguments for the \{chap,sec,...}entry macros which will eventually
4168
% read this.  The node name is used in the pdf outlines as the
5667
% read this.  The node name is used in the pdf outlines as the
4169
% destination to jump to.
5668
% destination to jump to.
4170
% 
5669
%
4171
% We open the .toc file for writing here instead of at @setfilename (or
5670
% We open the .toc file for writing here instead of at @setfilename (or
4172
% any other fixed time) so that @contents can be anywhere in the document.
5671
% any other fixed time) so that @contents can be anywhere in the document.
4173
% But if #1 is `omit', then we don't do anything.  This is used for the
5672
% But if #1 is `omit', then we don't do anything.  This is used for the
Lines 4185-4195 Link Here
4185
    \fi
5684
    \fi
4186
    %
5685
    %
4187
    \iflinks
5686
    \iflinks
4188
      \toks0 = {#2}%
5687
      {\atdummies
4189
      \toks2 = \expandafter{\lastnode}%
5688
       \edef\temp{%
4190
      \edef\temp{\write\tocfile{\realbackslash #1entry{\the\toks0}{#3}%
5689
         \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}%
4191
                               {\the\toks2}{\noexpand\folio}}}%
5690
       \temp
4192
      \temp
5691
      }%
4193
    \fi
5692
    \fi
4194
  \fi
5693
  \fi
4195
  %
5694
  %
Lines 4202-4207 Link Here
4202
  \ifpdf \global\pdfmakepagedesttrue \fi
5701
  \ifpdf \global\pdfmakepagedesttrue \fi
4203
}
5702
}
4204
5703
5704
5705
% These characters do not print properly in the Computer Modern roman
5706
% fonts, so we must take special care.  This is more or less redundant
5707
% with the Texinfo input format setup at the end of this file.
5708
%
5709
\def\activecatcodes{%
5710
  \catcode`\"=\active
5711
  \catcode`\$=\active
5712
  \catcode`\<=\active
5713
  \catcode`\>=\active
5714
  \catcode`\\=\active
5715
  \catcode`\^=\active
5716
  \catcode`\_=\active
5717
  \catcode`\|=\active
5718
  \catcode`\~=\active
5719
}
5720
5721
5722
% Read the toc file, which is essentially Texinfo input.
5723
\def\readtocfile{%
5724
  \setupdatafile
5725
  \activecatcodes
5726
  \input \tocreadfilename
5727
}
5728
4205
\newskip\contentsrightmargin \contentsrightmargin=1in
5729
\newskip\contentsrightmargin \contentsrightmargin=1in
4206
\newcount\savepageno
5730
\newcount\savepageno
4207
\newcount\lastnegativepageno \lastnegativepageno = -1
5731
\newcount\lastnegativepageno \lastnegativepageno = -1
Lines 4209-4289 Link Here
4209
% Prepare to read what we've written to \tocfile.
5733
% Prepare to read what we've written to \tocfile.
4210
%
5734
%
4211
\def\startcontents#1{%
5735
\def\startcontents#1{%
4212
   % If @setchapternewpage on, and @headings double, the contents should
5736
  % If @setchapternewpage on, and @headings double, the contents should
4213
   % start on an odd page, unlike chapters.  Thus, we maintain
5737
  % start on an odd page, unlike chapters.  Thus, we maintain
4214
   % \contentsalignmacro in parallel with \pagealignmacro.
5738
  % \contentsalignmacro in parallel with \pagealignmacro.
4215
   % From: Torbjorn Granlund <tege@matematik.su.se>
5739
  % From: Torbjorn Granlund <tege@matematik.su.se>
4216
   \contentsalignmacro
5740
  \contentsalignmacro
4217
   \immediate\closeout\tocfile
5741
  \immediate\closeout\tocfile
4218
   %
5742
  %
4219
   % Don't need to put `Contents' or `Short Contents' in the headline.
5743
  % Don't need to put `Contents' or `Short Contents' in the headline.
4220
   % It is abundantly clear what they are.
5744
  % It is abundantly clear what they are.
4221
   \def\thischapter{}%
5745
  \chapmacro{#1}{Yomitfromtoc}{}%
4222
   \chapmacro{#1}{Yomitfromtoc}{}%
5746
  %
4223
   %
5747
  \savepageno = \pageno
4224
   \savepageno = \pageno
5748
  \begingroup                  % Set up to handle contents files properly.
4225
   \begingroup                  % Set up to handle contents files properly.
5749
    \raggedbottom              % Worry more about breakpoints than the bottom.
4226
      \catcode`\\=0  \catcode`\{=1  \catcode`\}=2  \catcode`\@=11
5750
    \advance\hsize by -\contentsrightmargin % Don't use the full line length.
4227
      % We can't do this, because then an actual ^ in a section
5751
    %
4228
      % title fails, e.g., @chapter ^ -- exponentiation.  --karl, 9jul97.
5752
    % Roman numerals for page numbers.
4229
      %\catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi
5753
    \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi
4230
      \raggedbottom             % Worry more about breakpoints than the bottom.
4231
      \advance\hsize by -\contentsrightmargin % Don't use the full line length.
4232
      %
4233
      % Roman numerals for page numbers.
4234
      \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi
4235
}
5754
}
4236
5755
5756
% redefined for the two-volume lispref.  We always output on
5757
% \jobname.toc even if this is redefined.
5758
%
5759
\def\tocreadfilename{\jobname.toc}
4237
5760
4238
% Normal (long) toc.
5761
% Normal (long) toc.
5762
%
4239
\def\contents{%
5763
\def\contents{%
4240
   \startcontents{\putwordTOC}%
5764
  \startcontents{\putwordTOC}%
4241
     \openin 1 \jobname.toc
5765
    \openin 1 \tocreadfilename\space
4242
     \ifeof 1 \else
5766
    \ifeof 1 \else
4243
       \closein 1
5767
      \readtocfile
4244
       \input \jobname.toc
5768
    \fi
4245
     \fi
5769
    \vfill \eject
4246
     \vfill \eject
5770
    \contentsalignmacro % in case @setchapternewpage odd is in effect
4247
     \contentsalignmacro % in case @setchapternewpage odd is in effect
5771
    \ifeof 1 \else
4248
     \pdfmakeoutlines
5772
      \pdfmakeoutlines
4249
   \endgroup
5773
    \fi
4250
   \lastnegativepageno = \pageno
5774
    \closein 1
4251
   \global\pageno = \savepageno
5775
  \endgroup
5776
  \lastnegativepageno = \pageno
5777
  \global\pageno = \savepageno
4252
}
5778
}
4253
5779
4254
% And just the chapters.
5780
% And just the chapters.
4255
\def\summarycontents{%
5781
\def\summarycontents{%
4256
   \startcontents{\putwordShortTOC}%
5782
  \startcontents{\putwordShortTOC}%
4257
      %
5783
    %
4258
      \let\numchapentry = \shortchapentry
5784
    \let\numchapentry = \shortchapentry
4259
      \let\appentry = \shortchapentry
5785
    \let\appentry = \shortchapentry
4260
      \let\unnchapentry = \shortunnchapentry
5786
    \let\unnchapentry = \shortunnchapentry
4261
      % We want a true roman here for the page numbers.
5787
    % We want a true roman here for the page numbers.
4262
      \secfonts
5788
    \secfonts
4263
      \let\rm=\shortcontrm \let\bf=\shortcontbf
5789
    \let\rm=\shortcontrm \let\bf=\shortcontbf
4264
      \let\sl=\shortcontsl \let\tt=\shortconttt
5790
    \let\sl=\shortcontsl \let\tt=\shortconttt
4265
      \rm
5791
    \rm
4266
      \hyphenpenalty = 10000
5792
    \hyphenpenalty = 10000
4267
      \advance\baselineskip by 1pt % Open it up a little.
5793
    \advance\baselineskip by 1pt % Open it up a little.
4268
      \def\numsecentry##1##2##3##4{}
5794
    \def\numsecentry##1##2##3##4{}
4269
      \let\appsecentry = \numsecentry
5795
    \let\appsecentry = \numsecentry
4270
      \let\unnsecentry = \numsecentry
5796
    \let\unnsecentry = \numsecentry
4271
      \let\numsubsecentry = \numsecentry
5797
    \let\numsubsecentry = \numsecentry
4272
      \let\appsubsecentry = \numsecentry
5798
    \let\appsubsecentry = \numsecentry
4273
      \let\unnsubsecentry = \numsecentry
5799
    \let\unnsubsecentry = \numsecentry
4274
      \let\numsubsubsecentry = \numsecentry
5800
    \let\numsubsubsecentry = \numsecentry
4275
      \let\appsubsubsecentry = \numsecentry
5801
    \let\appsubsubsecentry = \numsecentry
4276
      \let\unnsubsubsecentry = \numsecentry
5802
    \let\unnsubsubsecentry = \numsecentry
4277
      \openin 1 \jobname.toc
5803
    \openin 1 \tocreadfilename\space
4278
      \ifeof 1 \else
5804
    \ifeof 1 \else
4279
        \closein 1
5805
      \readtocfile
4280
        \input \jobname.toc
5806
    \fi
4281
      \fi
5807
    \closein 1
4282
     \vfill \eject
5808
    \vfill \eject
4283
     \contentsalignmacro % in case @setchapternewpage odd is in effect
5809
    \contentsalignmacro % in case @setchapternewpage odd is in effect
4284
   \endgroup
5810
  \endgroup
4285
   \lastnegativepageno = \pageno
5811
  \lastnegativepageno = \pageno
4286
   \global\pageno = \savepageno
5812
  \global\pageno = \savepageno
4287
}
5813
}
4288
\let\shortcontents = \summarycontents
5814
\let\shortcontents = \summarycontents
4289
5815
Lines 4296-4302 Link Here
4296
  % But use \hss just in case.
5822
  % But use \hss just in case.
4297
  % (This space doesn't include the extra space that gets added after
5823
  % (This space doesn't include the extra space that gets added after
4298
  % the label; that gets put in by \shortchapentry above.)
5824
  % the label; that gets put in by \shortchapentry above.)
4299
  % 
5825
  %
4300
  % We'd like to right-justify chapter numbers, but that looks strange
5826
  % We'd like to right-justify chapter numbers, but that looks strange
4301
  % with appendix letters.  And right-justifying numbers and
5827
  % with appendix letters.  And right-justifying numbers and
4302
  % left-justifying letters looks strange when there is less than 10
5828
  % left-justifying letters looks strange when there is less than 10
Lines 4321-4327 Link Here
4321
5847
4322
% Appendices, in the main contents.
5848
% Appendices, in the main contents.
4323
% Need the word Appendix, and a fixed-size box.
5849
% Need the word Appendix, and a fixed-size box.
4324
% 
5850
%
4325
\def\appendixbox#1{%
5851
\def\appendixbox#1{%
4326
  % We use M since it's probably the widest letter.
5852
  % We use M since it's probably the widest letter.
4327
  \setbox0 = \hbox{\putwordAppendix{} M}%
5853
  \setbox0 = \hbox{\putwordAppendix{} M}%
Lines 4349-4355 Link Here
4349
\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}}
5875
\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}}
4350
5876
4351
% This parameter controls the indentation of the various levels.
5877
% This parameter controls the indentation of the various levels.
4352
\newdimen\tocindent \tocindent = 2pc
5878
% Same as \defaultparindent.
5879
\newdimen\tocindent \tocindent = 15pt
4353
5880
4354
% Now for the actual typesetting. In all these, #1 is the text and #2 is the
5881
% Now for the actual typesetting. In all these, #1 is the text and #2 is the
4355
% page number.
5882
% page number.
Lines 4380-4396 Link Here
4380
  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
5907
  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
4381
\endgroup}
5908
\endgroup}
4382
5909
4383
% Final typesetting of a toc entry; we use the same \entry macro as for
5910
% We use the same \entry macro as for the index entries.
4384
% the index entries, but we want to suppress hyphenation here.  (We
5911
\let\tocentry = \entry
4385
% can't do that in the \entry macro, since index entries might consist
4386
% of hyphenated-identifiers-that-do-not-fit-on-a-line-and-nothing-else.)
4387
\def\tocentry#1#2{\begingroup
4388
  \vskip 0pt plus1pt % allow a little stretch for the sake of nice page breaks
4389
  % Do not use \turnoffactive in these arguments.  Since the toc is
4390
  % typeset in cmr, characters such as _ would come out wrong; we
4391
  % have to do the usual translation tricks.
4392
  \entry{#1}{#2}%
4393
\endgroup}
4394
5912
4395
% Space between chapter (or whatever) number and the title.
5913
% Space between chapter (or whatever) number and the title.
4396
\def\labelspace{\hskip1em \relax}
5914
\def\labelspace{\hskip1em \relax}
Lines 4407-4461 Link Here
4407
\message{environments,}
5925
\message{environments,}
4408
% @foo ... @end foo.
5926
% @foo ... @end foo.
4409
5927
4410
% @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
4411
%
4412
% Since these characters are used in examples, it should be an even number of
4413
% \tt widths. Each \tt character is 1en, so two makes it 1em.
4414
%
4415
\def\point{$\star$}
4416
\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
4417
\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}}
4418
\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
4419
\def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}}
4420
4421
% The @error{} command.
4422
% Adapted from the TeXbook's \boxit.
4423
%
4424
\newbox\errorbox
4425
%
4426
{\tentt \global\dimen0 = 3em}% Width of the box.
4427
\dimen2 = .55pt % Thickness of rules
4428
% The text. (`r' is open on the right, `e' somewhat less so on the left.)
4429
\setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt}
4430
%
4431
\global\setbox\errorbox=\hbox to \dimen0{\hfil
4432
   \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
4433
   \advance\hsize by -2\dimen2 % Rules.
4434
   \vbox{
4435
      \hrule height\dimen2
4436
      \hbox{\vrule width\dimen2 \kern3pt          % Space to left of text.
4437
         \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
4438
         \kern3pt\vrule width\dimen2}% Space to right.
4439
      \hrule height\dimen2}
4440
    \hfil}
4441
%
4442
\def\error{\leavevmode\lower.7ex\copy\errorbox}
4443
4444
% @tex ... @end tex    escapes into raw Tex temporarily.
5928
% @tex ... @end tex    escapes into raw Tex temporarily.
4445
% One exception: @ is still an escape character, so that @end tex works.
5929
% One exception: @ is still an escape character, so that @end tex works.
4446
% But \@ or @@ will get a plain tex @ character.
5930
% But \@ or @@ will get a plain tex @ character.
4447
5931
4448
\def\tex{\begingroup
5932
\envdef\tex{%
5933
  \setupmarkupstyle{tex}%
4449
  \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
5934
  \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
4450
  \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
5935
  \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
4451
  \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie
5936
  \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie
4452
  \catcode `\%=14
5937
  \catcode `\%=14
4453
  \catcode `\+=\other
5938
  \catcode `\+=\other
4454
  \catcode `\"=\other
5939
  \catcode `\"=\other
4455
  \catcode `\==\other
4456
  \catcode `\|=\other
5940
  \catcode `\|=\other
4457
  \catcode `\<=\other
5941
  \catcode `\<=\other
4458
  \catcode `\>=\other
5942
  \catcode `\>=\other
5943
  \catcode`\`=\other
5944
  \catcode`\'=\other
4459
  \escapechar=`\\
5945
  \escapechar=`\\
4460
  %
5946
  %
4461
  \let\b=\ptexb
5947
  \let\b=\ptexb
Lines 4475-4488 Link Here
4475
  \let\/=\ptexslash
5961
  \let\/=\ptexslash
4476
  \let\*=\ptexstar
5962
  \let\*=\ptexstar
4477
  \let\t=\ptext
5963
  \let\t=\ptext
5964
  \expandafter \let\csname top\endcsname=\ptextop  % outer
5965
  \let\frenchspacing=\plainfrenchspacing
4478
  %
5966
  %
4479
  \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
5967
  \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
4480
  \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
5968
  \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
4481
  \def\@{@}%
5969
  \def\@{@}%
4482
\let\Etex=\endgroup}
5970
}
5971
% There is no need to define \Etex.
4483
5972
4484
% Define @lisp ... @end lisp.
5973
% Define @lisp ... @end lisp.
4485
% @lisp does a \begingroup so it can rebind things,
5974
% @lisp environment forms a group so it can rebind things,
4486
% including the definition of @end lisp (which normally is erroneous).
5975
% including the definition of @end lisp (which normally is erroneous).
4487
5976
4488
% Amount to narrow the margins by for @lisp.
5977
% Amount to narrow the margins by for @lisp.
Lines 4493-4511 Link Here
4493
% have any width.
5982
% have any width.
4494
\def\lisppar{\null\endgraf}
5983
\def\lisppar{\null\endgraf}
4495
5984
4496
% Make each space character in the input produce a normal interword
4497
% space in the output.  Don't allow a line break at this space, as this
4498
% is used only in environments like @example, where each line of input
4499
% should produce a line of output anyway.
4500
%
4501
{\obeyspaces %
4502
\gdef\sepspaces{\obeyspaces\let =\tie}}
4503
4504
% Define \obeyedspace to be our active space, whatever it is.  This is
4505
% for use in \parsearg.
4506
{\sepspaces%
4507
\global\let\obeyedspace= }
4508
4509
% This space is always present above and below environments.
5985
% This space is always present above and below environments.
4510
\newskip\envskipamount \envskipamount = 0pt
5986
\newskip\envskipamount \envskipamount = 0pt
4511
5987
Lines 4515-4521 Link Here
4515
% start of the next paragraph will insert \parskip.
5991
% start of the next paragraph will insert \parskip.
4516
%
5992
%
4517
\def\aboveenvbreak{{%
5993
\def\aboveenvbreak{{%
4518
  % =10000 instead of <10000 because of a special case in \itemzzz, q.v.
5994
  % =10000 instead of <10000 because of a special case in \itemzzz and
5995
  % \sectionheading, q.v.
4519
  \ifnum \lastpenalty=10000 \else
5996
  \ifnum \lastpenalty=10000 \else
4520
    \advance\envskipamount by \parskip
5997
    \advance\envskipamount by \parskip
4521
    \endgraf
5998
    \endgraf
Lines 4523-4529 Link Here
4523
      \removelastskip
6000
      \removelastskip
4524
      % it's not a good place to break if the last penalty was \nobreak
6001
      % it's not a good place to break if the last penalty was \nobreak
4525
      % or better ...
6002
      % or better ...
4526
      \ifnum\lastpenalty>10000 \else \penalty-50 \fi
6003
      \ifnum\lastpenalty<10000 \penalty-50 \fi
4527
      \vskip\envskipamount
6004
      \vskip\envskipamount
4528
    \fi
6005
    \fi
4529
  \fi
6006
  \fi
Lines 4531-4537 Link Here
4531
6008
4532
\let\afterenvbreak = \aboveenvbreak
6009
\let\afterenvbreak = \aboveenvbreak
4533
6010
4534
% \nonarrowing is a flag.  If "set", @lisp etc don't narrow margins.
6011
% \nonarrowing is a flag.  If "set", @lisp etc don't narrow margins; it will
6012
% also clear it, so that its embedded environments do the narrowing again.
4535
\let\nonarrowing=\relax
6013
\let\nonarrowing=\relax
4536
6014
4537
% @cartouche ... @end cartouche: draw rectangle w/rounded corners around
6015
% @cartouche ... @end cartouche: draw rectangle w/rounded corners around
Lines 4555-4723 Link Here
4555
%
6033
%
4556
\newskip\lskip\newskip\rskip
6034
\newskip\lskip\newskip\rskip
4557
6035
4558
\def\cartouche{%
6036
\envdef\cartouche{%
4559
\par  % can't be in the midst of a paragraph.
6037
  \ifhmode\par\fi  % can't be in the midst of a paragraph.
4560
\begingroup
6038
  \startsavinginserts
4561
        \lskip=\leftskip \rskip=\rightskip
6039
  \lskip=\leftskip \rskip=\rightskip
4562
        \leftskip=0pt\rightskip=0pt %we want these *outside*.
6040
  \leftskip=0pt\rightskip=0pt % we want these *outside*.
4563
        \cartinner=\hsize \advance\cartinner by-\lskip
6041
  \cartinner=\hsize \advance\cartinner by-\lskip
4564
                          \advance\cartinner by-\rskip
6042
  \advance\cartinner by-\rskip
4565
        \cartouter=\hsize
6043
  \cartouter=\hsize
4566
        \advance\cartouter by 18.4pt % allow for 3pt kerns on either
6044
  \advance\cartouter by 18.4pt	% allow for 3pt kerns on either
4567
%                                    side, and for 6pt waste from
6045
				% side, and for 6pt waste from
4568
%                                    each corner char, and rule thickness
6046
				% each corner char, and rule thickness
4569
        \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
6047
  \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
4570
        % Flag to tell @lisp, etc., not to narrow margin.
6048
  % Flag to tell @lisp, etc., not to narrow margin.
4571
        \let\nonarrowing=\comment
6049
  \let\nonarrowing = t%
4572
        \vbox\bgroup
6050
  \vbox\bgroup
4573
                \baselineskip=0pt\parskip=0pt\lineskip=0pt
6051
      \baselineskip=0pt\parskip=0pt\lineskip=0pt
4574
                \carttop
6052
      \carttop
4575
                \hbox\bgroup
6053
      \hbox\bgroup
4576
                        \hskip\lskip
6054
	  \hskip\lskip
4577
                        \vrule\kern3pt
6055
	  \vrule\kern3pt
4578
                        \vbox\bgroup
6056
	  \vbox\bgroup
4579
                                \hsize=\cartinner
6057
	      \kern3pt
4580
                                \kern3pt
6058
	      \hsize=\cartinner
4581
                                \begingroup
6059
	      \baselineskip=\normbskip
4582
                                        \baselineskip=\normbskip
6060
	      \lineskip=\normlskip
4583
                                        \lineskip=\normlskip
6061
	      \parskip=\normpskip
4584
                                        \parskip=\normpskip
6062
	      \vskip -\parskip
4585
                                        \vskip -\parskip
6063
	      \comment % For explanation, see the end of \def\group.
6064
}
4586
\def\Ecartouche{%
6065
\def\Ecartouche{%
4587
                                \endgroup
6066
              \ifhmode\par\fi
4588
                                \kern3pt
6067
	      \kern3pt
4589
                        \egroup
6068
	  \egroup
4590
                        \kern3pt\vrule
6069
	  \kern3pt\vrule
4591
                        \hskip\rskip
6070
	  \hskip\rskip
4592
                \egroup
6071
      \egroup
4593
                \cartbot
6072
      \cartbot
4594
        \egroup
6073
  \egroup
4595
\endgroup
6074
  \checkinserts
4596
}}
6075
}
4597
6076
4598
6077
4599
% This macro is called at the beginning of all the @example variants,
6078
% This macro is called at the beginning of all the @example variants,
4600
% inside a group.
6079
% inside a group.
6080
\newdimen\nonfillparindent
4601
\def\nonfillstart{%
6081
\def\nonfillstart{%
4602
  \aboveenvbreak
6082
  \aboveenvbreak
4603
  \inENV % This group ends at the end of the body
4604
  \hfuzz = 12pt % Don't be fussy
6083
  \hfuzz = 12pt % Don't be fussy
4605
  \sepspaces % Make spaces be word-separators rather than space tokens.
6084
  \sepspaces % Make spaces be word-separators rather than space tokens.
4606
  \let\par = \lisppar % don't ignore blank lines
6085
  \let\par = \lisppar % don't ignore blank lines
4607
  \obeylines % each line of input is a line of output
6086
  \obeylines % each line of input is a line of output
4608
  \parskip = 0pt
6087
  \parskip = 0pt
6088
  % Turn off paragraph indentation but redefine \indent to emulate
6089
  % the normal \indent.
6090
  \nonfillparindent=\parindent
4609
  \parindent = 0pt
6091
  \parindent = 0pt
6092
  \let\indent\nonfillindent
6093
  %
4610
  \emergencystretch = 0pt % don't try to avoid overfull boxes
6094
  \emergencystretch = 0pt % don't try to avoid overfull boxes
4611
  % @cartouche defines \nonarrowing to inhibit narrowing
4612
  % at next level down.
4613
  \ifx\nonarrowing\relax
6095
  \ifx\nonarrowing\relax
4614
    \advance \leftskip by \lispnarrowing
6096
    \advance \leftskip by \lispnarrowing
4615
    \exdentamount=\lispnarrowing
6097
    \exdentamount=\lispnarrowing
4616
    \let\exdent=\nofillexdent
6098
  \else
4617
    \let\nonarrowing=\relax
6099
    \let\nonarrowing = \relax
4618
  \fi
6100
  \fi
6101
  \let\exdent=\nofillexdent
4619
}
6102
}
4620
6103
4621
% Define the \E... control sequence only if we are inside the particular
6104
\begingroup
4622
% environment, so the error checking in \end will work.
6105
\obeyspaces
4623
%
6106
% We want to swallow spaces (but not other tokens) after the fake
4624
% To end an @example-like environment, we first end the paragraph (via
6107
% @indent in our nonfill-environments, where spaces are normally
4625
% \afterenvbreak's vertical glue), and then the group.  That way we keep
6108
% active and set to @tie, resulting in them not being ignored after
4626
% the zero \parskip that the environments set -- \parskip glue will be
6109
% @indent.
4627
% inserted at the beginning of the next paragraph in the document, after
6110
\gdef\nonfillindent{\futurelet\temp\nonfillindentcheck}%
4628
% the environment.
6111
\gdef\nonfillindentcheck{%
4629
%
6112
\ifx\temp %
4630
\def\nonfillfinish{\afterenvbreak\endgroup}
6113
\expandafter\nonfillindentgobble%
6114
\else%
6115
\leavevmode\nonfillindentbox%
6116
\fi%
6117
}%
6118
\endgroup
6119
\def\nonfillindentgobble#1{\nonfillindent}
6120
\def\nonfillindentbox{\hbox to \nonfillparindent{\hss}}
4631
6121
4632
% @lisp: indented, narrowed, typewriter font.
6122
% If you want all examples etc. small: @set dispenvsize small.
4633
\def\lisp{\begingroup
6123
% If you want even small examples the full size: @set dispenvsize nosmall.
4634
  \nonfillstart
6124
% This affects the following displayed environments:
4635
  \let\Elisp = \nonfillfinish
6125
%    @example, @display, @format, @lisp
4636
  \tt
6126
%
4637
  \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
6127
\def\smallword{small}
4638
  \gobble       % eat return
6128
\def\nosmallword{nosmall}
6129
\let\SETdispenvsize\relax
6130
\def\setnormaldispenv{%
6131
  \ifx\SETdispenvsize\smallword
6132
    % end paragraph for sake of leading, in case document has no blank
6133
    % line.  This is redundant with what happens in \aboveenvbreak, but
6134
    % we need to do it before changing the fonts, and it's inconvenient
6135
    % to change the fonts afterward.
6136
    \ifnum \lastpenalty=10000 \else \endgraf \fi
6137
    \smallexamplefonts \rm
6138
  \fi
6139
}
6140
\def\setsmalldispenv{%
6141
  \ifx\SETdispenvsize\nosmallword
6142
  \else
6143
    \ifnum \lastpenalty=10000 \else \endgraf \fi
6144
    \smallexamplefonts \rm
6145
  \fi
4639
}
6146
}
4640
6147
4641
% @example: Same as @lisp.
6148
% We often define two environments, @foo and @smallfoo.
4642
\def\example{\begingroup \def\Eexample{\nonfillfinish\endgroup}\lisp}
6149
% Let's do it by one command:
4643
6150
\def\makedispenv #1#2{
4644
% @smallexample and @smalllisp: use smaller fonts.
6151
  \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}
4645
% Originally contributed by Pavel@xerox.
6152
  \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}
4646
\def\smalllisp{\begingroup
6153
  \expandafter\let\csname E#1\endcsname \afterenvbreak
4647
  \def\Esmalllisp{\nonfillfinish\endgroup}%
6154
  \expandafter\let\csname Esmall#1\endcsname \afterenvbreak
4648
  \def\Esmallexample{\nonfillfinish\endgroup}%
4649
  \smallexamplefonts
4650
  \lisp
4651
}
6155
}
4652
\let\smallexample = \smalllisp
4653
6156
6157
% Define two synonyms:
6158
\def\maketwodispenvs #1#2#3{
6159
  \makedispenv{#1}{#3}
6160
  \makedispenv{#2}{#3}
6161
}
4654
6162
4655
% @display: same as @lisp except keep current font.
6163
% @lisp: indented, narrowed, typewriter font; @example: same as @lisp.
6164
%
6165
% @smallexample and @smalllisp: use smaller fonts.
6166
% Originally contributed by Pavel@xerox.
4656
%
6167
%
4657
\def\display{\begingroup
6168
\maketwodispenvs {lisp}{example}{%
4658
  \nonfillstart
6169
  \nonfillstart
4659
  \let\Edisplay = \nonfillfinish
6170
  \tt\setupmarkupstyle{example}%
4660
  \gobble
6171
  \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
6172
  \gobble       % eat return
4661
}
6173
}
6174
% @display/@smalldisplay: same as @lisp except keep current font.
4662
%
6175
%
4663
% @smalldisplay: @display plus smaller fonts.
6176
\makedispenv {display}{%
4664
%
6177
  \nonfillstart
4665
\def\smalldisplay{\begingroup
6178
  \gobble
4666
  \def\Esmalldisplay{\nonfillfinish\endgroup}%
4667
  \smallexamplefonts \rm
4668
  \display
4669
}
6179
}
4670
6180
4671
% @format: same as @display except don't narrow margins.
6181
% @format/@smallformat: same as @display except don't narrow margins.
4672
%
6182
%
4673
\def\format{\begingroup
6183
\makedispenv{format}{%
4674
  \let\nonarrowing = t
6184
  \let\nonarrowing = t%
4675
  \nonfillstart
6185
  \nonfillstart
4676
  \let\Eformat = \nonfillfinish
4677
  \gobble
6186
  \gobble
4678
}
6187
}
4679
%
4680
% @smallformat: @format plus smaller fonts.
4681
%
4682
\def\smallformat{\begingroup
4683
  \def\Esmallformat{\nonfillfinish\endgroup}%
4684
  \smallexamplefonts \rm
4685
  \format
4686
}
4687
6188
4688
% @flushleft (same as @format).
6189
% @flushleft: same as @format, but doesn't obey \SETdispenvsize.
4689
%
6190
\envdef\flushleft{%
4690
\def\flushleft{\begingroup \def\Eflushleft{\nonfillfinish\endgroup}\format}
6191
  \let\nonarrowing = t%
6192
  \nonfillstart
6193
  \gobble
6194
}
6195
\let\Eflushleft = \afterenvbreak
4691
6196
4692
% @flushright.
6197
% @flushright.
4693
%
6198
%
4694
\def\flushright{\begingroup
6199
\envdef\flushright{%
4695
  \let\nonarrowing = t
6200
  \let\nonarrowing = t%
4696
  \nonfillstart
6201
  \nonfillstart
4697
  \let\Eflushright = \nonfillfinish
4698
  \advance\leftskip by 0pt plus 1fill
6202
  \advance\leftskip by 0pt plus 1fill
4699
  \gobble
6203
  \gobble
4700
}
6204
}
6205
\let\Eflushright = \afterenvbreak
6206
6207
6208
% @raggedright does more-or-less normal line breaking but no right
6209
% justification.  From plain.tex.
6210
\envdef\raggedright{%
6211
  \rightskip0pt plus2em \spaceskip.3333em \xspaceskip.5em\relax
6212
}
6213
\let\Eraggedright\par
6214
6215
\envdef\raggedleft{%
6216
  \parindent=0pt \leftskip0pt plus2em
6217
  \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt
6218
  \hbadness=10000 % Last line will usually be underfull, so turn off
6219
                  % badness reporting.
6220
}
6221
\let\Eraggedleft\par
6222
6223
\envdef\raggedcenter{%
6224
  \parindent=0pt \rightskip0pt plus1em \leftskip0pt plus1em
6225
  \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt
6226
  \hbadness=10000 % Last line will usually be underfull, so turn off
6227
                  % badness reporting.
6228
}
6229
\let\Eraggedcenter\par
4701
6230
4702
6231
4703
% @quotation does normal linebreaking (hence we can't use \nonfillstart)
6232
% @quotation does normal linebreaking (hence we can't use \nonfillstart)
4704
% and narrows the margins.
6233
% and narrows the margins.  We keep \parskip nonzero in general, since
6234
% we're doing normal filling.  So, when using \aboveenvbreak and
6235
% \afterenvbreak, temporarily make \parskip 0.
4705
%
6236
%
4706
\def\quotation{%
6237
\def\quotationstart{%
4707
  \begingroup\inENV %This group ends at the end of the @quotation body
4708
  {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
6238
  {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
4709
  \parindent=0pt
6239
  \parindent=0pt
4710
  % We have retained a nonzero parskip for the environment, since we're
4711
  % doing normal filling. So to avoid extra space below the environment...
4712
  \def\Equotation{\parskip = 0pt \nonfillfinish}%
4713
  %
6240
  %
4714
  % @cartouche defines \nonarrowing to inhibit narrowing at next level down.
6241
  % @cartouche defines \nonarrowing to inhibit narrowing at next level down.
4715
  \ifx\nonarrowing\relax
6242
  \ifx\nonarrowing\relax
4716
    \advance\leftskip by \lispnarrowing
6243
    \advance\leftskip by \lispnarrowing
4717
    \advance\rightskip by \lispnarrowing
6244
    \advance\rightskip by \lispnarrowing
4718
    \exdentamount = \lispnarrowing
6245
    \exdentamount = \lispnarrowing
6246
  \else
4719
    \let\nonarrowing = \relax
6247
    \let\nonarrowing = \relax
4720
  \fi
6248
  \fi
6249
  \parsearg\quotationlabel
6250
}
6251
6252
\envdef\quotation{%
6253
  \setnormaldispenv
6254
  \quotationstart
6255
}
6256
6257
\envdef\smallquotation{%
6258
  \setsmalldispenv
6259
  \quotationstart
6260
}
6261
\let\Esmallquotation = \Equotation
6262
6263
% We have retained a nonzero parskip for the environment, since we're
6264
% doing normal filling.
6265
%
6266
\def\Equotation{%
6267
  \par
6268
  \ifx\quotationauthor\undefined\else
6269
    % indent a bit.
6270
    \leftline{\kern 2\leftskip \sl ---\quotationauthor}%
6271
  \fi
6272
  {\parskip=0pt \afterenvbreak}%
6273
}
6274
6275
% If we're given an argument, typeset it in bold with a colon after.
6276
\def\quotationlabel#1{%
6277
  \def\temp{#1}%
6278
  \ifx\temp\empty \else
6279
    {\bf #1: }%
6280
  \fi
4721
}
6281
}
4722
6282
4723
6283
Lines 4735-4751 Link Here
4735
  \do\ \do\\\do\{\do\}\do\$\do\&%
6295
  \do\ \do\\\do\{\do\}\do\$\do\&%
4736
  \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~%
6296
  \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~%
4737
  \do\<\do\>\do\|\do\@\do+\do\"%
6297
  \do\<\do\>\do\|\do\@\do+\do\"%
6298
  % Don't do the quotes -- if we do, @set txicodequoteundirected and
6299
  % @set txicodequotebacktick will not have effect on @verb and
6300
  % @verbatim, and ?` and !` ligatures won't get disabled.
6301
  %\do\`\do\'%
4738
}
6302
}
4739
%
6303
%
4740
% [Knuth] p. 380
6304
% [Knuth] p. 380
4741
\def\uncatcodespecials{%
6305
\def\uncatcodespecials{%
4742
  \def\do##1{\catcode`##1=12}\dospecials}
6306
  \def\do##1{\catcode`##1=\other}\dospecials}
4743
%
4744
% [Knuth] pp. 380,381,391
4745
% Disable Spanish ligatures ?` and !` of \tt font
4746
\begingroup
4747
  \catcode`\`=\active\gdef`{\relax\lq}
4748
\endgroup
4749
%
6307
%
4750
% Setup for the @verb command.
6308
% Setup for the @verb command.
4751
%
6309
%
Lines 4758-4764 Link Here
4758
\def\setupverb{%
6316
\def\setupverb{%
4759
  \tt  % easiest (and conventionally used) font for verbatim
6317
  \tt  % easiest (and conventionally used) font for verbatim
4760
  \def\par{\leavevmode\endgraf}%
6318
  \def\par{\leavevmode\endgraf}%
4761
  \catcode`\`=\active
6319
  \setupmarkupstyle{verb}%
4762
  \tabeightspaces
6320
  \tabeightspaces
4763
  % Respect line breaks,
6321
  % Respect line breaks,
4764
  % print special symbols as themselves, and
6322
  % print special symbols as themselves, and
Lines 4773-4778 Link Here
4773
\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount
6331
\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount
4774
%
6332
%
4775
\def\starttabbox{\setbox0=\hbox\bgroup}
6333
\def\starttabbox{\setbox0=\hbox\bgroup}
6334
%
4776
\begingroup
6335
\begingroup
4777
  \catcode`\^^I=\active
6336
  \catcode`\^^I=\active
4778
  \gdef\tabexpand{%
6337
  \gdef\tabexpand{%
Lines 4786-4797 Link Here
4786
    }%
6345
    }%
4787
  }
6346
  }
4788
\endgroup
6347
\endgroup
6348
6349
% start the verbatim environment.
4789
\def\setupverbatim{%
6350
\def\setupverbatim{%
6351
  \let\nonarrowing = t%
6352
  \nonfillstart
4790
  % Easiest (and conventionally used) font for verbatim
6353
  % Easiest (and conventionally used) font for verbatim
4791
  \tt
6354
  \tt
4792
  \def\par{\leavevmode\egroup\box0\endgraf}%
6355
  \def\par{\leavevmode\egroup\box0\endgraf}%
4793
  \catcode`\`=\active
4794
  \tabexpand
6356
  \tabexpand
6357
  \setupmarkupstyle{verbatim}%
4795
  % Respect line breaks,
6358
  % Respect line breaks,
4796
  % print special symbols as themselves, and
6359
  % print special symbols as themselves, and
4797
  % make each space count
6360
  % make each space count
Lines 4808-4814 Link Here
4808
%
6371
%
4809
% [Knuth] p. 382; only eat outer {}
6372
% [Knuth] p. 382; only eat outer {}
4810
\begingroup
6373
\begingroup
4811
  \catcode`[=1\catcode`]=2\catcode`\{=12\catcode`\}=12
6374
  \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other
4812
  \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next]
6375
  \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next]
4813
\endgroup
6376
\endgroup
4814
%
6377
%
Lines 4825-4837 Link Here
4825
% we need not redefine '\', '{' and '}'.
6388
% we need not redefine '\', '{' and '}'.
4826
%
6389
%
4827
% Inspired by LaTeX's verbatim command set [latex.ltx]
6390
% Inspired by LaTeX's verbatim command set [latex.ltx]
4828
%% Include LaTeX hack for completeness -- never know
4829
%% \begingroup
4830
%% \catcode`|=0 \catcode`[=1
4831
%% \catcode`]=2\catcode`\{=12\catcode`\}=12\catcode`\ =\active
4832
%% \catcode`\\=12|gdef|doverbatim#1@end verbatim[
4833
%% #1|endgroup|def|Everbatim[]|end[verbatim]]
4834
%% |endgroup
4835
%
6391
%
4836
\begingroup
6392
\begingroup
4837
  \catcode`\ =\active
6393
  \catcode`\ =\active
Lines 4839-4892 Link Here
4839
  % ignore everything up to the first ^^M, that's the newline at the end
6395
  % ignore everything up to the first ^^M, that's the newline at the end
4840
  % of the @verbatim input line itself.  Otherwise we get an extra blank
6396
  % of the @verbatim input line itself.  Otherwise we get an extra blank
4841
  % line in the output.
6397
  % line in the output.
4842
  \gdef\doverbatim#1^^M#2@end verbatim{#2\end{verbatim}}%
6398
  \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}%
6399
  % We really want {...\end verbatim} in the body of the macro, but
6400
  % without the active space; thus we have to use \xdef and \gobble.
4843
\endgroup
6401
\endgroup
4844
%
6402
%
4845
\def\verbatim{%
6403
\envdef\verbatim{%
4846
  \def\Everbatim{\nonfillfinish\endgroup}%
6404
    \setupverbatim\doverbatim
4847
  \begingroup
4848
    \nonfillstart
4849
    \advance\leftskip by -\defbodyindent
4850
    \begingroup\setupverbatim\doverbatim
4851
}
6405
}
6406
\let\Everbatim = \afterenvbreak
6407
4852
6408
4853
% @verbatiminclude FILE - insert text of file in verbatim environment.
6409
% @verbatiminclude FILE - insert text of file in verbatim environment.
4854
%
6410
%
4855
% Allow normal characters that we make active in the argument (a file name).
6411
\def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude}
4856
\def\verbatiminclude{%
4857
  \begingroup
4858
    \catcode`\\=\other
4859
    \catcode`~=\other
4860
    \catcode`^=\other
4861
    \catcode`_=\other
4862
    \catcode`|=\other
4863
    \catcode`<=\other
4864
    \catcode`>=\other
4865
    \catcode`+=\other
4866
    \parsearg\doverbatiminclude
4867
}
4868
\def\setupverbatiminclude{%
4869
  \begingroup
4870
    \nonfillstart
4871
    \advance\leftskip by -\defbodyindent
4872
    \begingroup\setupverbatim
4873
}
4874
%
6412
%
4875
\def\doverbatiminclude#1{%
6413
\def\doverbatiminclude#1{%
4876
     % Restore active chars for included file.
6414
  {%
4877
  \endgroup
6415
    \makevalueexpandable
4878
  \begingroup
6416
    \setupverbatim
4879
    \let\value=\expandablevalue
6417
    \indexnofonts       % Allow `@@' and other weird things in file names.
4880
    \def\thisfile{#1}%
6418
    \input #1
4881
    \expandafter\expandafter\setupverbatiminclude\input\thisfile
6419
    \afterenvbreak
4882
  \endgroup
6420
  }%
4883
  \nonfillfinish
4884
  \endgroup
4885
}
6421
}
4886
6422
4887
% @copying ... @end copying.
6423
% @copying ... @end copying.
4888
% Save the text away for @insertcopying later.  Many commands won't be
6424
% Save the text away for @insertcopying later.
4889
% allowed in this context, but that's ok.
4890
%
6425
%
4891
% We save the uninterpreted tokens, rather than creating a box.
6426
% We save the uninterpreted tokens, rather than creating a box.
4892
% Saving the text in a box would be much easier, but then all the
6427
% Saving the text in a box would be much easier, but then all the
Lines 4895-5538 Link Here
4895
% file; b) letting users define the frontmatter in as flexible order as
6430
% file; b) letting users define the frontmatter in as flexible order as
4896
% possible is very desirable.
6431
% possible is very desirable.
4897
%
6432
%
4898
\def\copying{\begingroup
6433
\def\copying{\checkenv{}\begingroup\scanargctxt\docopying}
4899
  % Define a command to swallow text until we reach `@end copying'.
6434
\def\docopying#1@end copying{\endgroup\def\copyingtext{#1}}
4900
  % \ is the escape char in this texinfo.tex file, so it is the
6435
%
4901
  % delimiter for the command; @ will be the escape char when we read
6436
\def\insertcopying{%
4902
  % it, but that doesn't matter.
6437
  \begingroup
4903
  \long\def\docopying##1\end copying{\gdef\copyingtext{##1}\enddocopying}%
6438
    \parindent = 0pt  % paragraph indentation looks wrong on title page
4904
  %
6439
    \scanexp\copyingtext
4905
  % We must preserve ^^M's in the input file; see \insertcopying below.
6440
  \endgroup
4906
  \catcode`\^^M = \active
4907
  \docopying
4908
}
4909
4910
% What we do to finish off the copying text.
4911
%
4912
\def\enddocopying{\endgroup\ignorespaces}
4913
4914
% @insertcopying.  Here we must play games with ^^M's.  On the one hand,
4915
% we need them to delimit commands such as `@end quotation', so they
4916
% must be active.  On the other hand, we certainly don't want every
4917
% end-of-line to be a \par, as would happen with the normal active
4918
% definition of ^^M.  On the third hand, two ^^M's in a row should still
4919
% generate a \par.
4920
%
4921
% Our approach is to make ^^M insert a space and a penalty1 normally;
4922
% then it can also check if \lastpenalty=1.  If it does, then manually
4923
% do \par.
4924
%
4925
% This messes up the normal definitions of @c[omment], so we redefine
4926
% it.  Similarly for @ignore.  (These commands are used in the gcc
4927
% manual for man page generation.)
4928
%
4929
% Seems pretty fragile, most line-oriented commands will presumably
4930
% fail, but for the limited use of getting the copying text (which
4931
% should be quite simple) inserted, we can hope it's ok.
4932
%
4933
{\catcode`\^^M=\active %
4934
\gdef\insertcopying{\begingroup %
4935
  \parindent = 0pt  % looks wrong on title page
4936
  \def^^M{%
4937
    \ifnum \lastpenalty=1 %
4938
      \par %
4939
    \else %
4940
      \space \penalty 1 %
4941
    \fi %
4942
  }%
4943
  %
4944
  % Fix @c[omment] for catcode 13 ^^M's.
4945
  \def\c##1^^M{\ignorespaces}%
4946
  \let\comment = \c %
4947
  %
4948
  % Don't bother jumping through all the hoops that \doignore does, it
4949
  % would be very hard since the catcodes are already set.
4950
  \long\def\ignore##1\end ignore{\ignorespaces}%
4951
  %
4952
  \copyingtext %
4953
\endgroup}%
4954
}
6441
}
4955
6442
6443
4956
\message{defuns,}
6444
\message{defuns,}
4957
% @defun etc.
6445
% @defun etc.
4958
6446
4959
\newskip\defbodyindent \defbodyindent=.4in
6447
\newskip\defbodyindent \defbodyindent=.4in
4960
\newskip\defargsindent \defargsindent=50pt
6448
\newskip\defargsindent \defargsindent=50pt
4961
\newskip\deflastargmargin \deflastargmargin=18pt
6449
\newskip\deflastargmargin \deflastargmargin=18pt
6450
\newcount\defunpenalty
4962
6451
4963
\newcount\parencount
6452
% Start the processing of @deffn:
4964
6453
\def\startdefun{%
4965
% We want ()&[] to print specially on the defun line.
6454
  \ifnum\lastpenalty<10000
4966
%
6455
    \medbreak
4967
\def\activeparens{%
6456
    \defunpenalty=10003 % Will keep this @deffn together with the
4968
  \catcode`\(=\active \catcode`\)=\active
6457
                        % following @def command, see below.
4969
  \catcode`\&=\active
4970
  \catcode`\[=\active \catcode`\]=\active
4971
}
4972
4973
% Make control sequences which act like normal parenthesis chars.
4974
\let\lparen = ( \let\rparen = )
4975
4976
{\activeparens % Now, smart parens don't turn on until &foo (see \amprm)
4977
4978
% Be sure that we always have a definition for `(', etc.  For example,
4979
% if the fn name has parens in it, \boldbrax will not be in effect yet,
4980
% so TeX would otherwise complain about undefined control sequence.
4981
\global\let(=\lparen \global\let)=\rparen
4982
\global\let[=\lbrack \global\let]=\rbrack
4983
4984
\gdef\functionparens{\boldbrax\let&=\amprm\parencount=0 }
4985
\gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
4986
% This is used to turn on special parens
4987
% but make & act ordinary (given that it's active).
4988
\gdef\boldbraxnoamp{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb\let&=\ampnr}
4989
4990
% Definitions of (, ) and & used in args for functions.
4991
% This is the definition of ( outside of all parentheses.
4992
\gdef\oprm#1 {{\rm\char`\(}#1 \bf \let(=\opnested
4993
  \global\advance\parencount by 1
4994
}
4995
%
4996
% This is the definition of ( when already inside a level of parens.
4997
\gdef\opnested{\char`\(\global\advance\parencount by 1 }
4998
%
4999
\gdef\clrm{% Print a paren in roman if it is taking us back to depth of 0.
5000
  % also in that case restore the outer-level definition of (.
5001
  \ifnum \parencount=1 {\rm \char `\)}\sl \let(=\oprm \else \char `\) \fi
5002
  \global\advance \parencount by -1 }
5003
% If we encounter &foo, then turn on ()-hacking afterwards
5004
\gdef\amprm#1 {{\rm\&#1}\let(=\oprm \let)=\clrm\ }
5005
%
5006
\gdef\normalparens{\boldbrax\let&=\ampnr}
5007
} % End of definition inside \activeparens
5008
%% These parens (in \boldbrax) actually are a little bolder than the
5009
%% contained text.  This is especially needed for [ and ]
5010
\def\opnr{{\sf\char`\(}\global\advance\parencount by 1 }
5011
\def\clnr{{\sf\char`\)}\global\advance\parencount by -1 }
5012
\let\ampnr = \&
5013
\def\lbrb{{\bf\char`\[}}
5014
\def\rbrb{{\bf\char`\]}}
5015
5016
% Active &'s sneak into the index arguments, so make sure it's defined.
5017
{
5018
  \catcode`& = \active
5019
  \global\let& = \ampnr
5020
}
5021
5022
% \defname, which formats the name of the @def (not the args).
5023
% #1 is the function name.
5024
% #2 is the type of definition, such as "Function".
5025
%
5026
\def\defname#1#2{%
5027
  % How we'll output the type name.  Putting it in brackets helps
5028
  % distinguish it from the body text that may end up on the next line
5029
  % just below it.
5030
  \ifempty{#2}%
5031
    \def\defnametype{}%
5032
  \else
6458
  \else
5033
    \def\defnametype{[\rm #2]}%
6459
    % If there are two @def commands in a row, we'll have a \nobreak,
6460
    % which is there to keep the function description together with its
6461
    % header.  But if there's nothing but headers, we need to allow a
6462
    % break somewhere.  Check specifically for penalty 10002, inserted
6463
    % by \printdefunline, instead of 10000, since the sectioning
6464
    % commands also insert a nobreak penalty, and we don't want to allow
6465
    % a break between a section heading and a defun.
6466
    %
6467
    % As a minor refinement, we avoid "club" headers by signalling
6468
    % with penalty of 10003 after the very first @deffn in the
6469
    % sequence (see above), and penalty of 10002 after any following
6470
    % @def command.
6471
    \ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \fi
6472
    %
6473
    % Similarly, after a section heading, do not allow a break.
6474
    % But do insert the glue.
6475
    \medskip  % preceded by discardable penalty, so not a breakpoint
5034
  \fi
6476
  \fi
5035
  %
6477
  %
5036
  % Get the values of \leftskip and \rightskip as they were outside the @def...
5037
  \dimen2=\leftskip
5038
  \advance\dimen2 by -\defbodyindent
5039
  %
5040
  % Figure out values for the paragraph shape.
5041
  \setbox0=\hbox{\hskip \deflastargmargin{\defnametype}}%
5042
  \dimen0=\hsize \advance \dimen0 by -\wd0  % compute size for first line
5043
  \dimen1=\hsize \advance \dimen1 by -\defargsindent  % size for continuations
5044
  \parshape 2 0in \dimen0 \defargsindent \dimen1
5045
  %
5046
  % Output arg 2 ("Function" or some such) but stuck inside a box of
5047
  % width 0 so it does not interfere with linebreaking.
5048
  \noindent
5049
  %
5050
  {% Adjust \hsize to exclude the ambient margins,
5051
   % so that \rightline will obey them.
5052
   \advance \hsize by -\dimen2
5053
   \dimen3 = 0pt  % was -1.25pc
5054
   \rlap{\rightline{\defnametype\kern\dimen3}}%
5055
  }%
5056
  %
5057
  % Allow all lines to be underfull without complaint:
5058
  \tolerance=10000 \hbadness=10000
5059
  \advance\leftskip by -\defbodyindent
5060
  \exdentamount=\defbodyindent
5061
  {\df #1}\enskip        % output function name
5062
  % \defunargs will be called next to output the arguments, if any.
5063
}
5064
5065
% Common pieces to start any @def...
5066
% #1 is the \E... control sequence to end the definition (which we define).
5067
% #2 is the \...x control sequence (which our caller defines).
5068
% #3 is the control sequence to process the header, such as \defunheader.
5069
%
5070
\def\parsebodycommon#1#2#3{%
5071
  \begingroup\inENV
5072
  % If there are two @def commands in a row, we'll have a \nobreak,
5073
  % which is there to keep the function description together with its
5074
  % header.  But if there's nothing but headers, we need to allow a
5075
  % break somewhere.  Check for penalty 10002 (inserted by
5076
  % \defargscommonending) instead of 10000, since the sectioning
5077
  % commands insert a \penalty10000, and we don't want to allow a break
5078
  % between a section heading and a defun.
5079
  \ifnum\lastpenalty=10002 \penalty2000 \fi
5080
  %
5081
  % Similarly, after a section heading, do not allow a break.
5082
  % But do insert the glue.
5083
  \ifnum\lastpenalty<10000 \medbreak
5084
  \else \medskip  % preceded by discardable penalty, so not a breakpoint
5085
  \fi
5086
  %
5087
  % Define the \E... end token that this defining construct specifies
5088
  % so that it will exit this group.
5089
  \def#1{\endgraf\endgroup\medbreak}%
5090
  %
5091
  \parindent=0in
6478
  \parindent=0in
5092
  \advance\leftskip by \defbodyindent
6479
  \advance\leftskip by \defbodyindent
5093
  \exdentamount=\defbodyindent
6480
  \exdentamount=\defbodyindent
5094
}
6481
}
5095
6482
5096
% Common part of the \...x definitions.
6483
\def\dodefunx#1{%
5097
%
6484
  % First, check whether we are in the right environment:
5098
\def\defxbodycommon{%
6485
  \checkenv#1%
5099
  % As with \parsebodycommon above, allow line break if we have multiple
5100
  % x headers in a row.  It's not a great place, though.
5101
  \ifnum\lastpenalty=10002 \penalty2000 \fi
5102
  %
6486
  %
5103
  \begingroup\obeylines
6487
  % As above, allow line break if we have multiple x headers in a row.
5104
}
6488
  % It's not a great place, though.
5105
6489
  \ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi
5106
% Process body of @defun, @deffn, @defmac, etc.
6490
  %
5107
%
6491
  % And now, it's time to reuse the body of the original defun:
5108
\def\defparsebody#1#2#3{%
6492
  \expandafter\gobbledefun#1%
5109
  \parsebodycommon{#1}{#2}{#3}%
5110
  \def#2{\defxbodycommon \activeparens \spacesplit#3}%
5111
  \catcode\equalChar=\active
5112
  \begingroup\obeylines\activeparens
5113
  \spacesplit#3%
5114
}
5115
5116
% #1, #2, #3 are the common arguments (see \parsebodycommon above).
5117
% #4, delimited by the space, is the class name.
5118
%
5119
\def\defmethparsebody#1#2#3#4 {%
5120
  \parsebodycommon{#1}{#2}{#3}%
5121
  \def#2##1 {\defxbodycommon \activeparens \spacesplit{#3{##1}}}%
5122
  \begingroup\obeylines\activeparens
5123
  % The \empty here prevents misinterpretation of a construct such as
5124
  %   @deffn {whatever} {Enharmonic comma}
5125
  % See comments at \deftpparsebody, although in our case we don't have
5126
  % to remove the \empty afterwards, since it is empty.
5127
  \spacesplit{#3{#4}}\empty
5128
}
5129
5130
% Used for @deftypemethod and @deftypeivar.
5131
% #1, #2, #3 are the common arguments (see \defparsebody).
5132
% #4, delimited by a space, is the class name.
5133
% #5 is the method's return type.
5134
%
5135
\def\deftypemethparsebody#1#2#3#4 #5 {%
5136
  \parsebodycommon{#1}{#2}{#3}%
5137
  \def#2##1 ##2 {\defxbodycommon \activeparens \spacesplit{#3{##1}{##2}}}%
5138
  \begingroup\obeylines\activeparens
5139
  \spacesplit{#3{#4}{#5}}%
5140
}
6493
}
6494
\def\gobbledefun#1\startdefun{}
5141
6495
5142
% Used for @deftypeop.  The change from \deftypemethparsebody is an
6496
% \printdefunline \deffnheader{text}
5143
% extra argument at the beginning which is the `category', instead of it
5144
% being the hardwired string `Method' or `Instance Variable'.  We have
5145
% to account for this both in the \...x definition and in parsing the
5146
% input at hand.  Thus also need a control sequence (passed as #5) for
5147
% the \E... definition to assign the category name to.
5148
%
6497
%
5149
\def\deftypeopparsebody#1#2#3#4#5 #6 {%
6498
\def\printdefunline#1#2{%
5150
  \parsebodycommon{#1}{#2}{#3}%
6499
  \begingroup
5151
  \def#2##1 ##2 ##3 {\def#4{##1}%
6500
    % call \deffnheader:
5152
    \defxbodycommon \activeparens \spacesplit{#3{##2}{##3}}}%
6501
    #1#2 \endheader
5153
  \begingroup\obeylines\activeparens
6502
    % common ending:
5154
  \spacesplit{#3{#5}{#6}}%
6503
    \interlinepenalty = 10000
6504
    \advance\rightskip by 0pt plus 1fil
6505
    \endgraf
6506
    \nobreak\vskip -\parskip
6507
    \penalty\defunpenalty  % signal to \startdefun and \dodefunx
6508
    % Some of the @defun-type tags do not enable magic parentheses,
6509
    % rendering the following check redundant.  But we don't optimize.
6510
    \checkparencounts
6511
  \endgroup
5155
}
6512
}
5156
6513
5157
% For @defop.
6514
\def\Edefun{\endgraf\medbreak}
5158
\def\defopparsebody #1#2#3#4#5 {%
5159
  \parsebodycommon{#1}{#2}{#3}%
5160
  \def#2##1 ##2 {\def#4{##1}%
5161
    \defxbodycommon \activeparens \spacesplit{#3{##2}}}%
5162
  \begingroup\obeylines\activeparens
5163
  \spacesplit{#3{#5}}%
5164
}
5165
6515
5166
% These parsing functions are similar to the preceding ones
6516
% \makedefun{deffn} creates \deffn, \deffnx and \Edeffn;
5167
% except that they do not make parens into active characters.
6517
% the only thing remaining is to define \deffnheader.
5168
% These are used for "variables" since they have no arguments.
5169
%
6518
%
5170
\def\defvarparsebody #1#2#3{%
6519
\def\makedefun#1{%
5171
  \parsebodycommon{#1}{#2}{#3}%
6520
  \expandafter\let\csname E#1\endcsname = \Edefun
5172
  \def#2{\defxbodycommon \spacesplit#3}%
6521
  \edef\temp{\noexpand\domakedefun
5173
  \catcode\equalChar=\active
6522
    \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}%
5174
  \begingroup\obeylines
6523
  \temp
5175
  \spacesplit#3%
5176
}
5177
5178
% @defopvar.
5179
\def\defopvarparsebody #1#2#3#4#5 {%
5180
  \parsebodycommon{#1}{#2}{#3}%
5181
  \def#2##1 ##2 {\def#4{##1}%
5182
    \defxbodycommon \spacesplit{#3{##2}}}%
5183
  \begingroup\obeylines
5184
  \spacesplit{#3{#5}}%
5185
}
5186
5187
\def\defvrparsebody#1#2#3#4 {%
5188
  \parsebodycommon{#1}{#2}{#3}%
5189
  \def#2##1 {\defxbodycommon \spacesplit{#3{##1}}}%
5190
  \begingroup\obeylines
5191
  \spacesplit{#3{#4}}%
5192
}
6524
}
5193
6525
5194
% This loses on `@deftp {Data Type} {struct termios}' -- it thinks the
6526
% \domakedefun \deffn \deffnx \deffnheader
5195
% type is just `struct', because we lose the braces in `{struct
5196
% termios}' when \spacesplit reads its undelimited argument.  Sigh.
5197
% \let\deftpparsebody=\defvrparsebody
5198
%
6527
%
5199
% So, to get around this, we put \empty in with the type name.  That
6528
% Define \deffn and \deffnx, without parameters.
5200
% way, TeX won't find exactly `{...}' as an undelimited argument, and
6529
% \deffnheader has to be defined explicitly.
5201
% won't strip off the braces.
5202
%
6530
%
5203
\def\deftpparsebody #1#2#3#4 {%
6531
\def\domakedefun#1#2#3{%
5204
  \parsebodycommon{#1}{#2}{#3}%
6532
  \envdef#1{%
5205
  \def#2##1 {\defxbodycommon \spacesplit{#3{##1}}}%
6533
    \startdefun
5206
  \begingroup\obeylines
6534
    \parseargusing\activeparens{\printdefunline#3}%
5207
  \spacesplit{\parsetpheaderline{#3{#4}}}\empty
6535
  }%
6536
  \def#2{\dodefunx#1}%
6537
  \def#3%
5208
}
6538
}
5209
6539
5210
% Fine, but then we have to eventually remove the \empty *and* the
6540
%%% Untyped functions:
5211
% braces (if any).  That's what this does.
5212
%
5213
\def\removeemptybraces\empty#1\relax{#1}
5214
6541
5215
% After \spacesplit has done its work, this is called -- #1 is the final
6542
% @deffn category name args
5216
% thing to call, #2 the type name (which starts with \empty), and #3
6543
\makedefun{deffn}{\deffngeneral{}}
5217
% (which might be empty) the arguments.
5218
%
5219
\def\parsetpheaderline#1#2#3{%
5220
  #1{\removeemptybraces#2\relax}{#3}%
5221
}%
5222
6544
5223
% Split up #2 (the rest of the input line) at the first space token.
6545
% @deffn category class name args
5224
% call #1 with two arguments:
6546
\makedefun{defop}#1 {\defopon{#1\ \putwordon}}
5225
%  the first is all of #2 before the space token,
5226
%  the second is all of #2 after that space token.
5227
% If #2 contains no space token, all of it is passed as the first arg
5228
% and the second is passed as empty.
5229
%
5230
{\obeylines %
5231
 \gdef\spacesplit#1#2^^M{\endgroup\spacesplitx{#1}#2 \relax\spacesplitx}%
5232
 \long\gdef\spacesplitx#1#2 #3#4\spacesplitx{%
5233
   \ifx\relax #3%
5234
     #1{#2}{}%
5235
   \else %
5236
     #1{#2}{#3#4}%
5237
   \fi}%
5238
}
5239
6547
5240
% Define @defun.
6548
% \defopon {category on}class name args
6549
\def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
5241
6550
5242
% This is called to end the arguments processing for all the @def... commands.
6551
% \deffngeneral {subind}category name args
5243
%
6552
%
5244
\def\defargscommonending{%
6553
\def\deffngeneral#1#2 #3 #4\endheader{%
5245
  \interlinepenalty = 10000
6554
  % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}.
5246
  \advance\rightskip by 0pt plus 1fil
6555
  \dosubind{fn}{\code{#3}}{#1}%
5247
  \endgraf
6556
  \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}%
5248
  \nobreak\vskip -\parskip
5249
  \penalty 10002  % signal to \parsebodycommon and \defxbodycommon.
5250
}
6557
}
5251
6558
5252
% This expands the args and terminates the paragraph they comprise.
6559
%%% Typed functions:
5253
%
5254
\def\defunargs#1{\functionparens \sl
5255
% Expand, preventing hyphenation at `-' chars.
5256
% Note that groups don't affect changes in \hyphenchar.
5257
% Set the font temporarily and use \font in case \setfont made \tensl a macro.
5258
{\tensl\hyphenchar\font=0}%
5259
#1%
5260
{\tensl\hyphenchar\font=45}%
5261
\ifnum\parencount=0 \else \errmessage{Unbalanced parentheses in @def}\fi%
5262
  \defargscommonending
5263
}
5264
5265
\def\deftypefunargs #1{%
5266
% Expand, preventing hyphenation at `-' chars.
5267
% Note that groups don't affect changes in \hyphenchar.
5268
% Use \boldbraxnoamp, not \functionparens, so that & is not special.
5269
\boldbraxnoamp
5270
\tclose{#1}% avoid \code because of side effects on active chars
5271
  \defargscommonending
5272
}
5273
6560
5274
% Do complete processing of one @defun or @defunx line already parsed.
6561
% @deftypefn category type name args
6562
\makedefun{deftypefn}{\deftypefngeneral{}}
5275
6563
5276
% @deffn Command forward-char nchars
6564
% @deftypeop category class type name args
6565
\makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}}
5277
6566
5278
\def\deffn{\defmethparsebody\Edeffn\deffnx\deffnheader}
6567
% \deftypeopon {category on}class type name args
6568
\def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
5279
6569
5280
\def\deffnheader #1#2#3{\doind {fn}{\code{#2}}%
6570
% \deftypefngeneral {subind}category type name args
5281
\begingroup\defname {#2}{#1}\defunargs{#3}\endgroup %
6571
%
5282
\catcode\equalChar=\other % Turn off change made in \defparsebody
6572
\def\deftypefngeneral#1#2 #3 #4 #5\endheader{%
6573
  \dosubind{fn}{\code{#4}}{#1}%
6574
  \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
5283
}
6575
}
5284
6576
5285
% @defun == @deffn Function
6577
%%% Typed variables:
5286
5287
\def\defun{\defparsebody\Edefun\defunx\defunheader}
5288
6578
5289
\def\defunheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
6579
% @deftypevr category type var args
5290
\begingroup\defname {#1}{\putwordDeffunc}%
6580
\makedefun{deftypevr}{\deftypecvgeneral{}}
5291
\defunargs {#2}\endgroup %
5292
\catcode\equalChar=\other % Turn off change made in \defparsebody
5293
}
5294
6581
5295
% @deftypefun int foobar (int @var{foo}, float @var{bar})
6582
% @deftypecv category class type var args
6583
\makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}}
5296
6584
5297
\def\deftypefun{\defparsebody\Edeftypefun\deftypefunx\deftypefunheader}
6585
% \deftypecvof {category of}class type var args
6586
\def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} }
5298
6587
5299
% #1 is the data type.  #2 is the name and args.
6588
% \deftypecvgeneral {subind}category type var args
5300
\def\deftypefunheader #1#2{\deftypefunheaderx{#1}#2 \relax}
6589
%
5301
% #1 is the data type, #2 the name, #3 the args.
6590
\def\deftypecvgeneral#1#2 #3 #4 #5\endheader{%
5302
\def\deftypefunheaderx #1#2 #3\relax{%
6591
  \dosubind{vr}{\code{#4}}{#1}%
5303
\doind {fn}{\code{#2}}% Make entry in function index
6592
  \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
5304
\begingroup\defname {\defheaderxcond#1\relax$.$#2}{\putwordDeftypefun}%
5305
\deftypefunargs {#3}\endgroup %
5306
\catcode\equalChar=\other % Turn off change made in \defparsebody
5307
}
6593
}
5308
6594
5309
% @deftypefn {Library Function} int foobar (int @var{foo}, float @var{bar})
6595
%%% Untyped variables:
5310
5311
\def\deftypefn{\defmethparsebody\Edeftypefn\deftypefnx\deftypefnheader}
5312
6596
5313
% \defheaderxcond#1\relax$.$
6597
% @defvr category var args
5314
% puts #1 in @code, followed by a space, but does nothing if #1 is null.
6598
\makedefun{defvr}#1 {\deftypevrheader{#1} {} }
5315
\def\defheaderxcond#1#2$.${\ifx#1\relax\else\code{#1#2} \fi}
5316
6599
5317
% #1 is the classification.  #2 is the data type.  #3 is the name and args.
6600
% @defcv category class var args
5318
\def\deftypefnheader #1#2#3{\deftypefnheaderx{#1}{#2}#3 \relax}
6601
\makedefun{defcv}#1 {\defcvof{#1\ \putwordof}}
5319
% #1 is the classification, #2 the data type, #3 the name, #4 the args.
5320
\def\deftypefnheaderx #1#2#3 #4\relax{%
5321
\doind {fn}{\code{#3}}% Make entry in function index
5322
\begingroup
5323
\normalparens % notably, turn off `&' magic, which prevents
5324
%               at least some C++ text from working
5325
\defname {\defheaderxcond#2\relax$.$#3}{#1}%
5326
\deftypefunargs {#4}\endgroup %
5327
\catcode\equalChar=\other % Turn off change made in \defparsebody
5328
}
5329
6602
5330
% @defmac == @deffn Macro
6603
% \defcvof {category of}class var args
6604
\def\defcvof#1#2 {\deftypecvof{#1}#2 {} }
5331
6605
5332
\def\defmac{\defparsebody\Edefmac\defmacx\defmacheader}
6606
%%% Type:
5333
6607
% @deftp category name args
5334
\def\defmacheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
6608
\makedefun{deftp}#1 #2 #3\endheader{%
5335
\begingroup\defname {#1}{\putwordDefmac}%
6609
  \doind{tp}{\code{#2}}%
5336
\defunargs {#2}\endgroup %
6610
  \defname{#1}{}{#2}\defunargs{#3\unskip}%
5337
\catcode\equalChar=\other % Turn off change made in \defparsebody
5338
}
6611
}
5339
6612
5340
% @defspec == @deffn Special Form
6613
% Remaining @defun-like shortcuts:
5341
6614
\makedefun{defun}{\deffnheader{\putwordDeffunc} }
5342
\def\defspec{\defparsebody\Edefspec\defspecx\defspecheader}
6615
\makedefun{defmac}{\deffnheader{\putwordDefmac} }
6616
\makedefun{defspec}{\deffnheader{\putwordDefspec} }
6617
\makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} }
6618
\makedefun{defvar}{\defvrheader{\putwordDefvar} }
6619
\makedefun{defopt}{\defvrheader{\putwordDefopt} }
6620
\makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} }
6621
\makedefun{defmethod}{\defopon\putwordMethodon}
6622
\makedefun{deftypemethod}{\deftypeopon\putwordMethodon}
6623
\makedefun{defivar}{\defcvof\putwordInstanceVariableof}
6624
\makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof}
5343
6625
5344
\def\defspecheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
6626
% \defname, which formats the name of the @def (not the args).
5345
\begingroup\defname {#1}{\putwordDefspec}%
6627
% #1 is the category, such as "Function".
5346
\defunargs {#2}\endgroup %
6628
% #2 is the return type, if any.
5347
\catcode\equalChar=\other % Turn off change made in \defparsebody
6629
% #3 is the function name.
5348
}
5349
5350
% @defop CATEGORY CLASS OPERATION ARG...
5351
%
6630
%
5352
\def\defop #1 {\def\defoptype{#1}%
6631
% We are followed by (but not passed) the arguments, if any.
5353
\defopparsebody\Edefop\defopx\defopheader\defoptype}
5354
%
6632
%
5355
\def\defopheader#1#2#3{%
6633
\def\defname#1#2#3{%
5356
  \dosubind{fn}{\code{#2}}{\putwordon\ \code{#1}}% function index entry
6634
  % Get the values of \leftskip and \rightskip as they were outside the @def...
5357
  \begingroup
6635
  \advance\leftskip by -\defbodyindent
5358
    \defname{#2}{\defoptype\ \putwordon\ #1}%
6636
  %
5359
    \defunargs{#3}%
6637
  % How we'll format the type name.  Putting it in brackets helps
5360
  \endgroup
6638
  % distinguish it from the body text that may end up on the next line
6639
  % just below it.
6640
  \def\temp{#1}%
6641
  \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi}
6642
  %
6643
  % Figure out line sizes for the paragraph shape.
6644
  % The first line needs space for \box0; but if \rightskip is nonzero,
6645
  % we need only space for the part of \box0 which exceeds it:
6646
  \dimen0=\hsize  \advance\dimen0 by -\wd0  \advance\dimen0 by \rightskip
6647
  % The continuations:
6648
  \dimen2=\hsize  \advance\dimen2 by -\defargsindent
6649
  % (plain.tex says that \dimen1 should be used only as global.)
6650
  \parshape 2 0in \dimen0 \defargsindent \dimen2
6651
  %
6652
  % Put the type name to the right margin.
6653
  \noindent
6654
  \hbox to 0pt{%
6655
    \hfil\box0 \kern-\hsize
6656
    % \hsize has to be shortened this way:
6657
    \kern\leftskip
6658
    % Intentionally do not respect \rightskip, since we need the space.
6659
  }%
6660
  %
6661
  % Allow all lines to be underfull without complaint:
6662
  \tolerance=10000 \hbadness=10000
6663
  \exdentamount=\defbodyindent
6664
  {%
6665
    % defun fonts. We use typewriter by default (used to be bold) because:
6666
    % . we're printing identifiers, they should be in tt in principle.
6667
    % . in languages with many accents, such as Czech or French, it's
6668
    %   common to leave accents off identifiers.  The result looks ok in
6669
    %   tt, but exceedingly strange in rm.
6670
    % . we don't want -- and --- to be treated as ligatures.
6671
    % . this still does not fix the ?` and !` ligatures, but so far no
6672
    %   one has made identifiers using them :).
6673
    \df \tt
6674
    \def\temp{#2}% return value type
6675
    \ifx\temp\empty\else \tclose{\temp} \fi
6676
    #3% output function name
6677
  }%
6678
  {\rm\enskip}% hskip 0.5 em of \tenrm
6679
  %
6680
  \boldbrax
6681
  % arguments will be output next, if any.
5361
}
6682
}
5362
6683
5363
% @deftypeop CATEGORY CLASS TYPE OPERATION ARG...
6684
% Print arguments in slanted roman (not ttsl), inconsistently with using
6685
% tt for the name.  This is because literal text is sometimes needed in
6686
% the argument list (groff manual), and ttsl and tt are not very
6687
% distinguishable.  Prevent hyphenation at `-' chars.
5364
%
6688
%
5365
\def\deftypeop #1 {\def\deftypeopcategory{#1}%
6689
\def\defunargs#1{%
5366
  \deftypeopparsebody\Edeftypeop\deftypeopx\deftypeopheader
6690
  % use sl by default (not ttsl),
5367
                       \deftypeopcategory}
6691
  % tt for the names.
5368
%
6692
  \df \sl \hyphenchar\font=0
5369
% #1 is the class name, #2 the data type, #3 the operation name, #4 the args.
6693
  %
5370
\def\deftypeopheader#1#2#3#4{%
6694
  % On the other hand, if an argument has two dashes (for instance), we
5371
  \dosubind{fn}{\code{#3}}{\putwordon\ \code{#1}}% entry in function index
6695
  % want a way to get ttsl.  Let's try @var for that.
5372
  \begingroup
6696
  \def\var##1{{\setupmarkupstyle{var}\ttslanted{##1}}}%
5373
    \defname{\defheaderxcond#2\relax$.$#3}
6697
  #1%
5374
            {\deftypeopcategory\ \putwordon\ \code{#1}}%
6698
  \sl\hyphenchar\font=45
5375
    \deftypefunargs{#4}%
5376
  \endgroup
5377
}
6699
}
5378
6700
5379
% @deftypemethod CLASS TYPE METHOD ARG...
6701
% We want ()&[] to print specially on the defun line.
5380
%
5381
\def\deftypemethod{%
5382
  \deftypemethparsebody\Edeftypemethod\deftypemethodx\deftypemethodheader}
5383
%
6702
%
5384
% #1 is the class name, #2 the data type, #3 the method name, #4 the args.
6703
\def\activeparens{%
5385
\def\deftypemethodheader#1#2#3#4{%
6704
  \catcode`\(=\active \catcode`\)=\active
5386
  \dosubind{fn}{\code{#3}}{\putwordon\ \code{#1}}% entry in function index
6705
  \catcode`\[=\active \catcode`\]=\active
5387
  \begingroup
6706
  \catcode`\&=\active
5388
    \defname{\defheaderxcond#2\relax$.$#3}{\putwordMethodon\ \code{#1}}%
5389
    \deftypefunargs{#4}%
5390
  \endgroup
5391
}
6707
}
5392
6708
5393
% @deftypeivar CLASS TYPE VARNAME
6709
% Make control sequences which act like normal parenthesis chars.
5394
%
6710
\let\lparen = ( \let\rparen = )
5395
\def\deftypeivar{%
5396
  \deftypemethparsebody\Edeftypeivar\deftypeivarx\deftypeivarheader}
5397
%
5398
% #1 is the class name, #2 the data type, #3 the variable name.
5399
\def\deftypeivarheader#1#2#3{%
5400
  \dosubind{vr}{\code{#3}}{\putwordof\ \code{#1}}% entry in variable index
5401
  \begingroup
5402
    \defname{\defheaderxcond#2\relax$.$#3}
5403
            {\putwordInstanceVariableof\ \code{#1}}%
5404
    \defvarargs{#3}%
5405
  \endgroup
5406
}
5407
6711
5408
% @defmethod == @defop Method
6712
% Be sure that we always have a definition for `(', etc.  For example,
5409
%
6713
% if the fn name has parens in it, \boldbrax will not be in effect yet,
5410
\def\defmethod{\defmethparsebody\Edefmethod\defmethodx\defmethodheader}
6714
% so TeX would otherwise complain about undefined control sequence.
5411
%
6715
{
5412
% #1 is the class name, #2 the method name, #3 the args.
6716
  \activeparens
5413
\def\defmethodheader#1#2#3{%
6717
  \global\let(=\lparen \global\let)=\rparen
5414
  \dosubind{fn}{\code{#2}}{\putwordon\ \code{#1}}% entry in function index
6718
  \global\let[=\lbrack \global\let]=\rbrack
5415
  \begingroup
6719
  \global\let& = \&
5416
    \defname{#2}{\putwordMethodon\ \code{#1}}%
5417
    \defunargs{#3}%
5418
  \endgroup
5419
}
5420
6720
5421
% @defcv {Class Option} foo-class foo-flag
6721
  \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
6722
  \gdef\magicamp{\let&=\amprm}
6723
}
5422
6724
5423
\def\defcv #1 {\def\defcvtype{#1}%
6725
\newcount\parencount
5424
\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}
5425
6726
5426
\def\defcvarheader #1#2#3{%
6727
% If we encounter &foo, then turn on ()-hacking afterwards
5427
  \dosubind{vr}{\code{#2}}{\putwordof\ \code{#1}}% variable index entry
6728
\newif\ifampseen
5428
  \begingroup
6729
\def\amprm#1 {\ampseentrue{\bf\&#1 }}
5429
    \defname{#2}{\defcvtype\ \putwordof\ #1}%
5430
    \defvarargs{#3}%
5431
  \endgroup
5432
}
5433
6730
5434
% @defivar CLASS VARNAME == @defcv {Instance Variable} CLASS VARNAME
6731
\def\parenfont{%
5435
%
6732
  \ifampseen
5436
\def\defivar{\defvrparsebody\Edefivar\defivarx\defivarheader}
6733
    % At the first level, print parens in roman,
5437
%
6734
    % otherwise use the default font.
5438
\def\defivarheader#1#2#3{%
6735
    \ifnum \parencount=1 \rm \fi
5439
  \dosubind{vr}{\code{#2}}{\putwordof\ \code{#1}}% entry in var index
6736
  \else
5440
  \begingroup
6737
    % The \sf parens (in \boldbrax) actually are a little bolder than
5441
    \defname{#2}{\putwordInstanceVariableof\ #1}%
6738
    % the contained text.  This is especially needed for [ and ] .
5442
    \defvarargs{#3}%
6739
    \sf
5443
  \endgroup
6740
  \fi
5444
}
6741
}
5445
6742
\def\infirstlevel#1{%
5446
% @defvar
6743
  \ifampseen
5447
% First, define the processing that is wanted for arguments of @defvar.
6744
    \ifnum\parencount=1
5448
% This is actually simple: just print them in roman.
6745
      #1%
5449
% This must expand the args and terminate the paragraph they make up
6746
    \fi
5450
\def\defvarargs #1{\normalparens #1%
6747
  \fi
5451
  \defargscommonending
5452
}
6748
}
6749
\def\bfafterword#1 {#1 \bf}
5453
6750
5454
% @defvr Counter foo-count
6751
\def\opnr{%
5455
6752
  \global\advance\parencount by 1
5456
\def\defvr{\defvrparsebody\Edefvr\defvrx\defvrheader}
6753
  {\parenfont(}%
5457
6754
  \infirstlevel \bfafterword
5458
\def\defvrheader #1#2#3{\doind {vr}{\code{#2}}%
5459
\begingroup\defname {#2}{#1}\defvarargs{#3}\endgroup}
5460
5461
% @defvar == @defvr Variable
5462
5463
\def\defvar{\defvarparsebody\Edefvar\defvarx\defvarheader}
5464
5465
\def\defvarheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
5466
\begingroup\defname {#1}{\putwordDefvar}%
5467
\defvarargs {#2}\endgroup %
5468
}
6755
}
5469
6756
\def\clnr{%
5470
% @defopt == @defvr {User Option}
6757
  {\parenfont)}%
5471
6758
  \infirstlevel \sl
5472
\def\defopt{\defvarparsebody\Edefopt\defoptx\defoptheader}
6759
  \global\advance\parencount by -1
5473
6760
}
5474
\def\defoptheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
6761
5475
\begingroup\defname {#1}{\putwordDefopt}%
6762
\newcount\brackcount
5476
\defvarargs {#2}\endgroup %
6763
\def\lbrb{%
6764
  \global\advance\brackcount by 1
6765
  {\bf[}%
6766
}
6767
\def\rbrb{%
6768
  {\bf]}%
6769
  \global\advance\brackcount by -1
6770
}
6771
6772
\def\checkparencounts{%
6773
  \ifnum\parencount=0 \else \badparencount \fi
6774
  \ifnum\brackcount=0 \else \badbrackcount \fi
6775
}
6776
% these should not use \errmessage; the glibc manual, at least, actually
6777
% has such constructs (when documenting function pointers).
6778
\def\badparencount{%
6779
  \message{Warning: unbalanced parentheses in @def...}%
6780
  \global\parencount=0
6781
}
6782
\def\badbrackcount{%
6783
  \message{Warning: unbalanced square brackets in @def...}%
6784
  \global\brackcount=0
5477
}
6785
}
5478
6786
5479
% @deftypevar int foobar
5480
5481
\def\deftypevar{\defvarparsebody\Edeftypevar\deftypevarx\deftypevarheader}
5482
5483
% #1 is the data type.  #2 is the name, perhaps followed by text that
5484
% is actually part of the data type, which should not be put into the index.
5485
\def\deftypevarheader #1#2{%
5486
\dovarind#2 \relax% Make entry in variables index
5487
\begingroup\defname {\defheaderxcond#1\relax$.$#2}{\putwordDeftypevar}%
5488
  \defargscommonending
5489
\endgroup}
5490
\def\dovarind#1 #2\relax{\doind{vr}{\code{#1}}}
5491
5492
% @deftypevr {Global Flag} int enable
5493
5494
\def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader}
5495
5496
\def\deftypevrheader #1#2#3{\dovarind#3 \relax%
5497
\begingroup\defname {\defheaderxcond#2\relax$.$#3}{#1}
5498
  \defargscommonending
5499
\endgroup}
5500
5501
% Now define @deftp
5502
% Args are printed in bold, a slight difference from @defvar.
5503
5504
\def\deftpargs #1{\bf \defvarargs{#1}}
5505
5506
% @deftp Class window height width ...
5507
5508
\def\deftp{\deftpparsebody\Edeftp\deftpx\deftpheader}
5509
5510
\def\deftpheader #1#2#3{\doind {tp}{\code{#2}}%
5511
\begingroup\defname {#2}{#1}\deftpargs{#3}\endgroup}
5512
5513
% These definitions are used if you use @defunx (etc.)
5514
% anywhere other than immediately after a @defun or @defunx.
5515
%
5516
\def\defcvx#1 {\errmessage{@defcvx in invalid context}}
5517
\def\deffnx#1 {\errmessage{@deffnx in invalid context}}
5518
\def\defivarx#1 {\errmessage{@defivarx in invalid context}}
5519
\def\defmacx#1 {\errmessage{@defmacx in invalid context}}
5520
\def\defmethodx#1 {\errmessage{@defmethodx in invalid context}}
5521
\def\defoptx #1 {\errmessage{@defoptx in invalid context}}
5522
\def\defopx#1 {\errmessage{@defopx in invalid context}}
5523
\def\defspecx#1 {\errmessage{@defspecx in invalid context}}
5524
\def\deftpx#1 {\errmessage{@deftpx in invalid context}}
5525
\def\deftypefnx#1 {\errmessage{@deftypefnx in invalid context}}
5526
\def\deftypefunx#1 {\errmessage{@deftypefunx in invalid context}}
5527
\def\deftypeivarx#1 {\errmessage{@deftypeivarx in invalid context}}
5528
\def\deftypemethodx#1 {\errmessage{@deftypemethodx in invalid context}}
5529
\def\deftypeopx#1 {\errmessage{@deftypeopx in invalid context}}
5530
\def\deftypevarx#1 {\errmessage{@deftypevarx in invalid context}}
5531
\def\deftypevrx#1 {\errmessage{@deftypevrx in invalid context}}
5532
\def\defunx#1 {\errmessage{@defunx in invalid context}}
5533
\def\defvarx#1 {\errmessage{@defvarx in invalid context}}
5534
\def\defvrx#1 {\errmessage{@defvrx in invalid context}}
5535
5536
6787
5537
\message{macros,}
6788
\message{macros,}
5538
% @macro.
6789
% @macro.
Lines 5540-5581 Link Here
5540
% To do this right we need a feature of e-TeX, \scantokens,
6791
% To do this right we need a feature of e-TeX, \scantokens,
5541
% which we arrange to emulate with a temporary file in ordinary TeX.
6792
% which we arrange to emulate with a temporary file in ordinary TeX.
5542
\ifx\eTeXversion\undefined
6793
\ifx\eTeXversion\undefined
5543
 \newwrite\macscribble
6794
  \newwrite\macscribble
5544
 \def\scanmacro#1{%
6795
  \def\scantokens#1{%
5545
   \begingroup \newlinechar`\^^M
6796
    \toks0={#1}%
5546
   % Undo catcode changes of \startcontents and \doprintindex
6797
    \immediate\openout\macscribble=\jobname.tmp
5547
   \catcode`\@=0 \catcode`\\=\other \escapechar=`\@
6798
    \immediate\write\macscribble{\the\toks0}%
5548
   % Append \endinput to make sure that TeX does not see the ending newline.
6799
    \immediate\closeout\macscribble
5549
   \toks0={#1\endinput}%
6800
    \input \jobname.tmp
5550
   \immediate\openout\macscribble=\jobname.tmp
6801
  }
5551
   \immediate\write\macscribble{\the\toks0}%
5552
   \immediate\closeout\macscribble
5553
   \let\xeatspaces\eatspaces
5554
   \input \jobname.tmp
5555
   \endgroup
5556
}
5557
\else
5558
\def\scanmacro#1{%
5559
\begingroup \newlinechar`\^^M
5560
% Undo catcode changes of \startcontents and \doprintindex
5561
\catcode`\@=0 \catcode`\\=\other \escapechar=`\@
5562
\let\xeatspaces\eatspaces\scantokens{#1\endinput}\endgroup}
5563
\fi
6802
\fi
5564
6803
6804
\def\scanmacro#1{%
6805
  \begingroup
6806
    \newlinechar`\^^M
6807
    \let\xeatspaces\eatspaces
6808
    % Undo catcode changes of \startcontents and \doprintindex
6809
    % When called from @insertcopying or (short)caption, we need active
6810
    % backslash to get it printed correctly.  Previously, we had
6811
    % \catcode`\\=\other instead.  We'll see whether a problem appears
6812
    % with macro expansion.				--kasal, 19aug04
6813
    \catcode`\@=0 \catcode`\\=\active \escapechar=`\@
6814
    % ... and \example
6815
    \spaceisspace
6816
    %
6817
    % Append \endinput to make sure that TeX does not see the ending newline.
6818
    % I've verified that it is necessary both for e-TeX and for ordinary TeX
6819
    %							--kasal, 29nov03
6820
    \scantokens{#1\endinput}%
6821
  \endgroup
6822
}
6823
6824
\def\scanexp#1{%
6825
  \edef\temp{\noexpand\scanmacro{#1}}%
6826
  \temp
6827
}
6828
5565
\newcount\paramno   % Count of parameters
6829
\newcount\paramno   % Count of parameters
5566
\newtoks\macname    % Macro name
6830
\newtoks\macname    % Macro name
5567
\newif\ifrecursive  % Is it recursive?
6831
\newif\ifrecursive  % Is it recursive?
5568
\def\macrolist{}    % List of all defined macros in the form
6832
5569
                    % \do\macro1\do\macro2...
6833
% List of all defined macros in the form
6834
%    \definedummyword\macro1\definedummyword\macro2...
6835
% Currently is also contains all @aliases; the list can be split
6836
% if there is a need.
6837
\def\macrolist{}
6838
6839
% Add the macro to \macrolist
6840
\def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname}
6841
\def\addtomacrolistxxx#1{%
6842
     \toks0 = \expandafter{\macrolist\definedummyword#1}%
6843
     \xdef\macrolist{\the\toks0}%
6844
}
5570
6845
5571
% Utility routines.
6846
% Utility routines.
5572
% Thisdoes \let #1 = #2, except with \csnames.
6847
% This does \let #1 = #2, with \csnames; that is,
6848
%   \let \csname#1\endcsname = \csname#2\endcsname
6849
% (except of course we have to play expansion games).
6850
%
5573
\def\cslet#1#2{%
6851
\def\cslet#1#2{%
5574
\expandafter\expandafter
6852
  \expandafter\let
5575
\expandafter\let
6853
  \csname#1\expandafter\endcsname
5576
\expandafter\expandafter
6854
  \csname#2\endcsname
5577
\csname#1\endcsname
6855
}
5578
\csname#2\endcsname}
5579
6856
5580
% Trim leading and trailing spaces off a string.
6857
% Trim leading and trailing spaces off a string.
5581
% Concepts from aro-bend problem 15 (see CTAN).
6858
% Concepts from aro-bend problem 15 (see CTAN).
Lines 5598-5631 Link Here
5598
% all characters are catcode 10, 11 or 12, except \ which is active
6875
% all characters are catcode 10, 11 or 12, except \ which is active
5599
% (as in normal texinfo). It is necessary to change the definition of \.
6876
% (as in normal texinfo). It is necessary to change the definition of \.
5600
6877
6878
% Non-ASCII encodings make 8-bit characters active, so un-activate
6879
% them to avoid their expansion.  Must do this non-globally, to
6880
% confine the change to the current group.
6881
5601
% It's necessary to have hard CRs when the macro is executed. This is
6882
% It's necessary to have hard CRs when the macro is executed. This is
5602
% done by  making ^^M (\endlinechar) catcode 12 when reading the macro
6883
% done by  making ^^M (\endlinechar) catcode 12 when reading the macro
5603
% body, and then making it the \newlinechar in \scanmacro.
6884
% body, and then making it the \newlinechar in \scanmacro.
5604
6885
5605
\def\macrobodyctxt{%
6886
\def\scanctxt{%
5606
  \catcode`\~=\other
6887
  \catcode`\"=\other
6888
  \catcode`\+=\other
6889
  \catcode`\<=\other
6890
  \catcode`\>=\other
6891
  \catcode`\@=\other
5607
  \catcode`\^=\other
6892
  \catcode`\^=\other
5608
  \catcode`\_=\other
6893
  \catcode`\_=\other
5609
  \catcode`\|=\other
6894
  \catcode`\|=\other
5610
  \catcode`\<=\other
6895
  \catcode`\~=\other
5611
  \catcode`\>=\other
6896
  \ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi
5612
  \catcode`\+=\other
6897
}
6898
6899
\def\scanargctxt{%
6900
  \scanctxt
6901
  \catcode`\\=\other
6902
  \catcode`\^^M=\other
6903
}
6904
6905
\def\macrobodyctxt{%
6906
  \scanctxt
5613
  \catcode`\{=\other
6907
  \catcode`\{=\other
5614
  \catcode`\}=\other
6908
  \catcode`\}=\other
5615
  \catcode`\@=\other
5616
  \catcode`\^^M=\other
6909
  \catcode`\^^M=\other
5617
  \usembodybackslash}
6910
  \usembodybackslash
6911
}
5618
6912
5619
\def\macroargctxt{%
6913
\def\macroargctxt{%
5620
  \catcode`\~=\other
6914
  \scanctxt
5621
  \catcode`\^=\other
6915
  \catcode`\\=\other
5622
  \catcode`\_=\other
6916
}
5623
  \catcode`\|=\other
5624
  \catcode`\<=\other
5625
  \catcode`\>=\other
5626
  \catcode`\+=\other
5627
  \catcode`\@=\other
5628
  \catcode`\\=\other}
5629
6917
5630
% \mbodybackslash is the definition of \ in @macro bodies.
6918
% \mbodybackslash is the definition of \ in @macro bodies.
5631
% It maps \foo\ => \csname macarg.foo\endcsname => #N
6919
% It maps \foo\ => \csname macarg.foo\endcsname => #N
Lines 5656-5680 Link Here
5656
     \else \errmessage{Macro name \the\macname\space already defined}\fi
6944
     \else \errmessage{Macro name \the\macname\space already defined}\fi
5657
     \global\cslet{macsave.\the\macname}{\the\macname}%
6945
     \global\cslet{macsave.\the\macname}{\the\macname}%
5658
     \global\expandafter\let\csname ismacro.\the\macname\endcsname=1%
6946
     \global\expandafter\let\csname ismacro.\the\macname\endcsname=1%
5659
     % Add the macroname to \macrolist
6947
     \addtomacrolist{\the\macname}%
5660
     \toks0 = \expandafter{\macrolist\do}%
5661
     \xdef\macrolist{\the\toks0
5662
       \expandafter\noexpand\csname\the\macname\endcsname}%
5663
  \fi
6948
  \fi
5664
  \begingroup \macrobodyctxt
6949
  \begingroup \macrobodyctxt
5665
  \ifrecursive \expandafter\parsermacbody
6950
  \ifrecursive \expandafter\parsermacbody
5666
  \else \expandafter\parsemacbody
6951
  \else \expandafter\parsemacbody
5667
  \fi}
6952
  \fi}
5668
6953
5669
\def\unmacro{\parsearg\dounmacro}
6954
\parseargdef\unmacro{%
5670
\def\dounmacro#1{%
5671
  \if1\csname ismacro.#1\endcsname
6955
  \if1\csname ismacro.#1\endcsname
5672
    \global\cslet{#1}{macsave.#1}%
6956
    \global\cslet{#1}{macsave.#1}%
5673
    \global\expandafter\let \csname ismacro.#1\endcsname=0%
6957
    \global\expandafter\let \csname ismacro.#1\endcsname=0%
5674
    % Remove the macro name from \macrolist:
6958
    % Remove the macro name from \macrolist:
5675
    \begingroup
6959
    \begingroup
5676
      \expandafter\let\csname#1\endcsname \relax
6960
      \expandafter\let\csname#1\endcsname \relax
5677
      \let\do\unmacrodo
6961
      \let\definedummyword\unmacrodo
5678
      \xdef\macrolist{\macrolist}%
6962
      \xdef\macrolist{\macrolist}%
5679
    \endgroup
6963
    \endgroup
5680
  \else
6964
  \else
Lines 5686-5695 Link Here
5686
% macro definitions that have been changed to \relax.
6970
% macro definitions that have been changed to \relax.
5687
%
6971
%
5688
\def\unmacrodo#1{%
6972
\def\unmacrodo#1{%
5689
  \ifx#1\relax
6973
  \ifx #1\relax
5690
    % remove this
6974
    % remove this
5691
  \else
6975
  \else
5692
    \noexpand\do \noexpand #1%
6976
    \noexpand\definedummyword \noexpand#1%
5693
  \fi
6977
  \fi
5694
}
6978
}
5695
6979
Lines 5802-5834 Link Here
5802
% {.  If so it reads up to the closing }, if not, it reads the whole
7086
% {.  If so it reads up to the closing }, if not, it reads the whole
5803
% line.  Whatever was read is then fed to the next control sequence
7087
% line.  Whatever was read is then fed to the next control sequence
5804
% as an argument (by \parsebrace or \parsearg)
7088
% as an argument (by \parsebrace or \parsearg)
5805
\def\braceorline#1{\let\next=#1\futurelet\nchar\braceorlinexxx}
7089
\def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx}
5806
\def\braceorlinexxx{%
7090
\def\braceorlinexxx{%
5807
  \ifx\nchar\bgroup\else
7091
  \ifx\nchar\bgroup\else
5808
    \expandafter\parsearg
7092
    \expandafter\parsearg
5809
  \fi \next}
7093
  \fi \macnamexxx}
5810
5811
% We mant to disable all macros during \shipout so that they are not
5812
% expanded by \write.
5813
\def\turnoffmacros{\begingroup \def\do##1{\let\noexpand##1=\relax}%
5814
  \edef\next{\macrolist}\expandafter\endgroup\next}
5815
7094
5816
7095
5817
% @alias.
7096
% @alias.
5818
% We need some trickery to remove the optional spaces around the equal
7097
% We need some trickery to remove the optional spaces around the equal
5819
% sign.  Just make them active and then expand them all to nothing.
7098
% sign.  Just make them active and then expand them all to nothing.
5820
\def\alias{\begingroup\obeyspaces\parsearg\aliasxxx}
7099
\def\alias{\parseargusing\obeyspaces\aliasxxx}
5821
\def\aliasxxx #1{\aliasyyy#1\relax}
7100
\def\aliasxxx #1{\aliasyyy#1\relax}
5822
\def\aliasyyy #1=#2\relax{\ignoreactivespaces
7101
\def\aliasyyy #1=#2\relax{%
5823
\edef\next{\global\let\expandafter\noexpand\csname#1\endcsname=%
7102
  {%
5824
           \expandafter\noexpand\csname#2\endcsname}%
7103
    \expandafter\let\obeyedspace=\empty
5825
\expandafter\endgroup\next}
7104
    \addtomacrolist{#1}%
7105
    \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}%
7106
  }%
7107
  \next
7108
}
5826
7109
5827
7110
5828
\message{cross references,}
7111
\message{cross references,}
5829
7112
5830
\newwrite\auxfile
7113
\newwrite\auxfile
5831
5832
\newif\ifhavexrefs    % True if xref values are known.
7114
\newif\ifhavexrefs    % True if xref values are known.
5833
\newif\ifwarnedxrefs  % True if we warned once that they aren't known.
7115
\newif\ifwarnedxrefs  % True if we warned once that they aren't known.
5834
7116
Lines 5838-5856 Link Here
5838
  node \samp{\ignorespaces#1{}}}
7120
  node \samp{\ignorespaces#1{}}}
5839
7121
5840
% @node's only job in TeX is to define \lastnode, which is used in
7122
% @node's only job in TeX is to define \lastnode, which is used in
5841
% cross-references.
7123
% cross-references.  The @node line might or might not have commas, and
5842
\def\node{\ENVcheck\parsearg\nodezzz}
7124
% might or might not have spaces before the first comma, like:
5843
\def\nodezzz#1{\nodexxx #1,\finishnodeparse}
7125
% @node foo , bar , ...
5844
\def\nodexxx#1,#2\finishnodeparse{\gdef\lastnode{#1}}
7126
% We don't want such trailing spaces in the node name.
7127
%
7128
\parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse}
7129
%
7130
% also remove a trailing comma, in case of something like this:
7131
% @node Help-Cross,  ,  , Cross-refs
7132
\def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse}
7133
\def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}}
7134
5845
\let\nwnode=\node
7135
\let\nwnode=\node
5846
\let\lastnode=\empty
7136
\let\lastnode=\empty
5847
7137
5848
% Write a cross-reference definition for the current node.  #1 is the
7138
% Write a cross-reference definition for the current node.  #1 is the
5849
% type (Ynumbered, Yappendix, Ynothing).
7139
% type (Ynumbered, Yappendix, Ynothing).
5850
% 
7140
%
5851
\def\donoderef#1{%
7141
\def\donoderef#1{%
5852
  \ifx\lastnode\empty\else
7142
  \ifx\lastnode\empty\else
5853
    \expandafter\expandafter\expandafter\setref{\lastnode}{#1}%
7143
    \setref{\lastnode}{#1}%
5854
    \global\let\lastnode=\empty
7144
    \global\let\lastnode=\empty
5855
  \fi
7145
  \fi
5856
}
7146
}
Lines 5859-5891 Link Here
5859
%
7149
%
5860
\newcount\savesfregister
7150
\newcount\savesfregister
5861
%
7151
%
5862
\gdef\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
7152
\def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
5863
\gdef\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
7153
\def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
5864
\gdef\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}
7154
\def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}
5865
7155
5866
% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an
7156
% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an
5867
% anchor), namely NAME-title (the corresponding @chapter/etc. name),
7157
% anchor), which consists of three parts:
5868
% NAME-pg (the page number), and NAME-snt (section number and type).
7158
% 1) NAME-title - the current sectioning name taken from \lastsection,
5869
% Called from \foonoderef.
7159
%                 or the anchor name.
5870
% 
7160
% 2) NAME-snt   - section number and type, passed as the SNT arg, or
5871
% We have to set dummies so commands such as @code in a section title
7161
%                 empty for anchors.
5872
% aren't expanded.  It would be nicer not to expand the titles in the
7162
% 3) NAME-pg    - the page number.
5873
% first place, but that is hard to do.
7163
%
7164
% This is called from \donoderef, \anchor, and \dofloat.  In the case of
7165
% floats, there is an additional part, which is not written here:
7166
% 4) NAME-lof   - the text as it should appear in a @listoffloats.
5874
%
7167
%
5875
% Likewise, use \turnoffactive so that punctuation chars such as underscore
7168
\def\setref#1#2{%
5876
% and backslash work in node names.
5877
%
5878
\def\setref#1#2{{%
5879
  \atdummies
5880
  \pdfmkdest{#1}%
7169
  \pdfmkdest{#1}%
5881
  %
5882
  \iflinks
7170
  \iflinks
5883
    \turnoffactive
7171
    {%
5884
    \dosetq{#1-title}{Ytitle}%
7172
      \atdummies  % preserve commands, but don't expand them
5885
    \dosetq{#1-pg}{Ypagenumber}%
7173
      \edef\writexrdef##1##2{%
5886
    \dosetq{#1-snt}{#2}%
7174
	\write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef
7175
	  ##1}{##2}}% these are parameters of \writexrdef
7176
      }%
7177
      \toks0 = \expandafter{\lastsection}%
7178
      \immediate \writexrdef{title}{\the\toks0 }%
7179
      \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc.
7180
      \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, during \shipout
7181
    }%
5887
  \fi
7182
  \fi
5888
}}
7183
}
5889
7184
5890
% @xref, @pxref, and @ref generate cross-references.  For \xrefX, #1 is
7185
% @xref, @pxref, and @ref generate cross-references.  For \xrefX, #1 is
5891
% the node name, #2 the name of the Info cross-reference, #3 the printed
7186
% the node name, #2 the name of the Info cross-reference, #3 the printed
Lines 5898-5998 Link Here
5898
\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
7193
\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
5899
  \unsepspaces
7194
  \unsepspaces
5900
  \def\printedmanual{\ignorespaces #5}%
7195
  \def\printedmanual{\ignorespaces #5}%
5901
  \def\printednodename{\ignorespaces #3}%
7196
  \def\printedrefname{\ignorespaces #3}%
5902
  \setbox1=\hbox{\printedmanual}%
7197
  \setbox1=\hbox{\printedmanual\unskip}%
5903
  \setbox0=\hbox{\printednodename}%
7198
  \setbox0=\hbox{\printedrefname\unskip}%
5904
  \ifdim \wd0 = 0pt
7199
  \ifdim \wd0 = 0pt
5905
    % No printed node name was explicitly given.
7200
    % No printed node name was explicitly given.
5906
    \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax
7201
    \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax
5907
      % Use the node name inside the square brackets.
7202
      % Use the node name inside the square brackets.
5908
      \def\printednodename{\ignorespaces #1}%
7203
      \def\printedrefname{\ignorespaces #1}%
5909
    \else
7204
    \else
5910
      % Use the actual chapter/section title appear inside
7205
      % Use the actual chapter/section title appear inside
5911
      % the square brackets.  Use the real section title if we have it.
7206
      % the square brackets.  Use the real section title if we have it.
5912
      \ifdim \wd1 > 0pt
7207
      \ifdim \wd1 > 0pt
5913
        % It is in another manual, so we don't have it.
7208
        % It is in another manual, so we don't have it.
5914
        \def\printednodename{\ignorespaces #1}%
7209
        \def\printedrefname{\ignorespaces #1}%
5915
      \else
7210
      \else
5916
        \ifhavexrefs
7211
        \ifhavexrefs
5917
          % We know the real title if we have the xref values.
7212
          % We know the real title if we have the xref values.
5918
          \def\printednodename{\refx{#1-title}{}}%
7213
          \def\printedrefname{\refx{#1-title}{}}%
5919
        \else
7214
        \else
5920
          % Otherwise just copy the Info node name.
7215
          % Otherwise just copy the Info node name.
5921
          \def\printednodename{\ignorespaces #1}%
7216
          \def\printedrefname{\ignorespaces #1}%
5922
        \fi%
7217
        \fi%
5923
      \fi
7218
      \fi
5924
    \fi
7219
    \fi
5925
  \fi
7220
  \fi
5926
  %
7221
  %
5927
  % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not
7222
  % Make link in pdf output.
5928
  % insert empty discretionaries after hyphens, which means that it will
5929
  % not find a line break at a hyphen in a node names.  Since some manuals
5930
  % are best written with fairly long node names, containing hyphens, this
5931
  % is a loss.  Therefore, we give the text of the node name again, so it
5932
  % is as if TeX is seeing it for the first time.
5933
  \ifpdf
7223
  \ifpdf
5934
    \leavevmode
7224
    {\indexnofonts
5935
    \getfilename{#4}%
7225
     \turnoffactive
5936
    {\turnoffactive \otherbackslash
7226
     % This expands tokens, so do it after making catcode changes, so _
7227
     % etc. don't get their TeX definitions.
7228
     \getfilename{#4}%
7229
     %
7230
     % See comments at \activebackslashdouble.
7231
     {\activebackslashdouble \xdef\pdfxrefdest{#1}%
7232
      \backslashparens\pdfxrefdest}%
7233
     %
7234
     \leavevmode
7235
     \startlink attr{/Border [0 0 0]}%
5937
     \ifnum\filenamelength>0
7236
     \ifnum\filenamelength>0
5938
       \startlink attr{/Border [0 0 0]}%
7237
       goto file{\the\filename.pdf} name{\pdfxrefdest}%
5939
         goto file{\the\filename.pdf} name{#1}%
5940
     \else
7238
     \else
5941
       \startlink attr{/Border [0 0 0]}%
7239
       goto name{\pdfmkpgn{\pdfxrefdest}}%
5942
         goto name{\pdfmkpgn{#1}}%
5943
     \fi
7240
     \fi
5944
    }%
7241
    }%
5945
    \linkcolor
7242
    \setcolor{\linkcolor}%
5946
  \fi
7243
  \fi
5947
  %
7244
  %
5948
  \ifdim \wd1 > 0pt
7245
  % Float references are printed completely differently: "Figure 1.2"
5949
    \putwordsection{} ``\printednodename'' \putwordin{} \cite{\printedmanual}%
7246
  % instead of "[somenode], p.3".  We distinguish them by the
5950
  \else
7247
  % LABEL-title being set to a magic string.
5951
    % _ (for example) has to be the character _ for the purposes of the
7248
  {%
5952
    % control sequence corresponding to the node, but it has to expand
7249
    % Have to otherify everything special to allow the \csname to
5953
    % into the usual \leavevmode...\vrule stuff for purposes of
7250
    % include an _ in the xref name, etc.
5954
    % printing. So we \turnoffactive for the \refx-snt, back on for the
7251
    \indexnofonts
5955
    % printing, back off for the \refx-pg.
7252
    \turnoffactive
5956
    {\turnoffactive \otherbackslash
7253
    \expandafter\global\expandafter\let\expandafter\Xthisreftitle
5957
     % Only output a following space if the -snt ref is nonempty; for
7254
      \csname XR#1-title\endcsname
5958
     % @unnumbered and @anchor, it won't be.
7255
  }%
5959
     \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
7256
  \iffloat\Xthisreftitle
5960
     \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
7257
    % If the user specified the print name (third arg) to the ref,
5961
    }%
7258
    % print it instead of our usual "Figure 1.2".
5962
    % output the `[mynode]' via a macro.
7259
    \ifdim\wd0 = 0pt
5963
    \xrefprintnodename\printednodename
7260
      \refx{#1-snt}{}%
7261
    \else
7262
      \printedrefname
7263
    \fi
5964
    %
7264
    %
5965
    % But we always want a comma and a space:
7265
    % if the user also gave the printed manual name (fifth arg), append
5966
    ,\space
7266
    % "in MANUALNAME".
7267
    \ifdim \wd1 > 0pt
7268
      \space \putwordin{} \cite{\printedmanual}%
7269
    \fi
7270
  \else
7271
    % node/anchor (non-float) references.
5967
    %
7272
    %
5968
    % output the `page 3'.
7273
    % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not
5969
    \turnoffactive \otherbackslash \putwordpage\tie\refx{#1-pg}{}%
7274
    % insert empty discretionaries after hyphens, which means that it will
7275
    % not find a line break at a hyphen in a node names.  Since some manuals
7276
    % are best written with fairly long node names, containing hyphens, this
7277
    % is a loss.  Therefore, we give the text of the node name again, so it
7278
    % is as if TeX is seeing it for the first time.
7279
    \ifdim \wd1 > 0pt
7280
      \putwordSection{} ``\printedrefname'' \putwordin{} \cite{\printedmanual}%
7281
    \else
7282
      % _ (for example) has to be the character _ for the purposes of the
7283
      % control sequence corresponding to the node, but it has to expand
7284
      % into the usual \leavevmode...\vrule stuff for purposes of
7285
      % printing. So we \turnoffactive for the \refx-snt, back on for the
7286
      % printing, back off for the \refx-pg.
7287
      {\turnoffactive
7288
       % Only output a following space if the -snt ref is nonempty; for
7289
       % @unnumbered and @anchor, it won't be.
7290
       \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
7291
       \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
7292
      }%
7293
      % output the `[mynode]' via a macro so it can be overridden.
7294
      \xrefprintnodename\printedrefname
7295
      %
7296
      % But we always want a comma and a space:
7297
      ,\space
7298
      %
7299
      % output the `page 3'.
7300
      \turnoffactive \putwordpage\tie\refx{#1-pg}{}%
7301
    \fi
5970
  \fi
7302
  \fi
5971
  \endlink
7303
  \endlink
5972
\endgroup}
7304
\endgroup}
5973
7305
5974
% This macro is called from \xrefX for the `[nodename]' part of xref
7306
% This macro is called from \xrefX for the `[nodename]' part of xref
5975
% output.  It's a separate macro only so it can be changed more easily,
7307
% output.  It's a separate macro only so it can be changed more easily,
5976
% since not square brackets don't work in some documents.  Particularly
7308
% since square brackets don't work well in some documents.  Particularly
5977
% one that Bob is working on :).
7309
% one that Bob is working on :).
5978
%
7310
%
5979
\def\xrefprintnodename#1{[#1]}
7311
\def\xrefprintnodename#1{[#1]}
5980
7312
5981
% \dosetq is called from \setref to do the actual \write (\iflinks).
7313
% Things referred to by \setref.
5982
%
5983
\def\dosetq#1#2{%
5984
  \edef\next{\write\auxfile{\internalsetq{#1}{#2}}}%
5985
  \next
5986
}
5987
5988
% \internalsetq{foo}{page} expands into
5989
%   CHARACTERS @xrdef{foo}{...expansion of \page...}
5990
\def\internalsetq#1#2{@xrdef{#1}{\csname #2\endcsname}}
5991
5992
% Things to be expanded by \internalsetq.
5993
%
7314
%
5994
\def\Ypagenumber{\noexpand\folio}
5995
\def\Ytitle{\thissection}
5996
\def\Ynothing{}
7315
\def\Ynothing{}
5997
\def\Yomitfromtoc{}
7316
\def\Yomitfromtoc{}
5998
\def\Ynumbered{%
7317
\def\Ynumbered{%
Lines 6019-6033 Link Here
6019
  \fi\fi\fi
7338
  \fi\fi\fi
6020
}
7339
}
6021
7340
6022
% Use TeX 3.0's \inputlineno to get the line number, for better error
6023
% messages, but if we're using an old version of TeX, don't do anything.
6024
%
6025
\ifx\inputlineno\thisisundefined
6026
  \let\linenumber = \empty % Pre-3.0.
6027
\else
6028
  \def\linenumber{\the\inputlineno:\space}
6029
\fi
6030
6031
% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME.
7341
% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME.
6032
% If its value is nonempty, SUFFIX is output afterward.
7342
% If its value is nonempty, SUFFIX is output afterward.
6033
%
7343
%
Lines 6036-6042 Link Here
6036
    \indexnofonts
7346
    \indexnofonts
6037
    \otherbackslash
7347
    \otherbackslash
6038
    \expandafter\global\expandafter\let\expandafter\thisrefX
7348
    \expandafter\global\expandafter\let\expandafter\thisrefX
6039
      \csname X#1\endcsname
7349
      \csname XR#1\endcsname
6040
  }%
7350
  }%
6041
  \ifx\thisrefX\relax
7351
  \ifx\thisrefX\relax
6042
    % If not defined, say something at least.
7352
    % If not defined, say something at least.
Lines 6058-6069 Link Here
6058
  #2% Output the suffix in any case.
7368
  #2% Output the suffix in any case.
6059
}
7369
}
6060
7370
6061
% This is the macro invoked by entries in the aux file.
7371
% This is the macro invoked by entries in the aux file.  Usually it's
6062
%
7372
% just a \def (we prepend XR to the control sequence name to avoid
6063
\def\xrdef#1{\expandafter\gdef\csname X#1\endcsname}
7373
% collisions).  But if this is a float type, we have more work to do.
7374
%
7375
\def\xrdef#1#2{%
7376
  {% The node name might contain 8-bit characters, which in our current
7377
   % implementation are changed to commands like @'e.  Don't let these
7378
   % mess up the control sequence name.
7379
    \indexnofonts
7380
    \turnoffactive
7381
    \xdef\safexrefname{#1}%
7382
  }%
7383
  %
7384
  \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% remember this xref
7385
  %
7386
  % Was that xref control sequence that we just defined for a float?
7387
  \expandafter\iffloat\csname XR\safexrefname\endcsname
7388
    % it was a float, and we have the (safe) float type in \iffloattype.
7389
    \expandafter\let\expandafter\floatlist
7390
      \csname floatlist\iffloattype\endcsname
7391
    %
7392
    % Is this the first time we've seen this float type?
7393
    \expandafter\ifx\floatlist\relax
7394
      \toks0 = {\do}% yes, so just \do
7395
    \else
7396
      % had it before, so preserve previous elements in list.
7397
      \toks0 = \expandafter{\floatlist\do}%
7398
    \fi
7399
    %
7400
    % Remember this xref in the control sequence \floatlistFLOATTYPE,
7401
    % for later use in \listoffloats.
7402
    \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0
7403
      {\safexrefname}}%
7404
  \fi
7405
}
6064
7406
6065
% Read the last existing aux file, if any.  No error if none exists.
7407
% Read the last existing aux file, if any.  No error if none exists.
6066
\def\readauxfile{\begingroup
7408
%
7409
\def\tryauxfile{%
7410
  \openin 1 \jobname.aux
7411
  \ifeof 1 \else
7412
    \readdatafile{aux}%
7413
    \global\havexrefstrue
7414
  \fi
7415
  \closein 1
7416
}
7417
7418
\def\setupdatafile{%
6067
  \catcode`\^^@=\other
7419
  \catcode`\^^@=\other
6068
  \catcode`\^^A=\other
7420
  \catcode`\^^A=\other
6069
  \catcode`\^^B=\other
7421
  \catcode`\^^B=\other
Lines 6121-6160 Link Here
6121
  \catcode`\%=\other
7473
  \catcode`\%=\other
6122
  \catcode`+=\other % avoid \+ for paranoia even though we've turned it off
7474
  \catcode`+=\other % avoid \+ for paranoia even though we've turned it off
6123
  %
7475
  %
6124
  % Make the characters 128-255 be printing characters
7476
  % This is to support \ in node names and titles, since the \
7477
  % characters end up in a \csname.  It's easier than
7478
  % leaving it active and making its active definition an actual \
7479
  % character.  What I don't understand is why it works in the *value*
7480
  % of the xrdef.  Seems like it should be a catcode12 \, and that
7481
  % should not typeset properly.  But it works, so I'm moving on for
7482
  % now.  --karl, 15jan04.
7483
  \catcode`\\=\other
7484
  %
7485
  % Make the characters 128-255 be printing characters.
6125
  {%
7486
  {%
6126
    \count 1=128
7487
    \count1=128
6127
    \def\loop{%
7488
    \def\loop{%
6128
      \catcode\count 1=\other
7489
      \catcode\count1=\other
6129
      \advance\count 1 by 1
7490
      \advance\count1 by 1
6130
      \ifnum \count 1<256 \loop \fi
7491
      \ifnum \count1<256 \loop \fi
6131
    }%
7492
    }%
6132
  }%
7493
  }%
6133
  %
7494
  %
6134
  % Turn off \ as an escape so we do not lose on
7495
  % @ is our escape character in .aux files, and we need braces.
6135
  % entries which were dumped with control sequences in their names.
6136
  % For example, @xrdef{$\leq $-fun}{page ...} made by @defun ^^
6137
  % Reference to such entries still does not work the way one would wish,
6138
  % but at least they do not bomb out when the aux file is read in.
6139
  \catcode`\\=\other
6140
  %
6141
  % @ is our escape character in .aux files.
6142
  \catcode`\{=1
7496
  \catcode`\{=1
6143
  \catcode`\}=2
7497
  \catcode`\}=2
6144
  \catcode`\@=0
7498
  \catcode`\@=0
6145
  %
7499
}
6146
  \openin 1 \jobname.aux
7500
6147
  \ifeof 1 \else
7501
\def\readdatafile#1{%
6148
    \closein 1
7502
\begingroup
6149
    \input \jobname.aux
7503
  \setupdatafile
6150
    \global\havexrefstrue
7504
  \input\jobname.#1
6151
  \fi
6152
  % Open the new aux file.  TeX will close it automatically at exit.
6153
  \openout\auxfile=\jobname.aux
6154
\endgroup}
7505
\endgroup}
6155
7506
6156
7507
6157
% Footnotes.
7508
\message{insertions,}
7509
% including footnotes.
6158
7510
6159
\newcount \footnoteno
7511
\newcount \footnoteno
6160
7512
Lines 6168-6175 Link Here
6168
% @footnotestyle is meaningful for info output only.
7520
% @footnotestyle is meaningful for info output only.
6169
\let\footnotestyle=\comment
7521
\let\footnotestyle=\comment
6170
7522
6171
\let\ptexfootnote=\footnote
6172
6173
{\catcode `\@=11
7523
{\catcode `\@=11
6174
%
7524
%
6175
% Auto-number footnotes.  Otherwise like plain.
7525
% Auto-number footnotes.  Otherwise like plain.
Lines 6193-6209 Link Here
6193
% Don't bother with the trickery in plain.tex to not require the
7543
% Don't bother with the trickery in plain.tex to not require the
6194
% footnote text as a parameter.  Our footnotes don't need to be so general.
7544
% footnote text as a parameter.  Our footnotes don't need to be so general.
6195
%
7545
%
6196
% Oh yes, they do; otherwise, @ifset and anything else that uses
7546
% Oh yes, they do; otherwise, @ifset (and anything else that uses
6197
% \parseargline fail inside footnotes because the tokens are fixed when
7547
% \parseargline) fails inside footnotes because the tokens are fixed when
6198
% the footnote is read.  --karl, 16nov96.
7548
% the footnote is read.  --karl, 16nov96.
6199
%
7549
%
6200
% The start of the footnote looks usually like this:
6201
\gdef\startfootins{\insert\footins\bgroup}
6202
%
6203
% ... but this macro is redefined inside @multitable.
6204
%
6205
\gdef\dofootnote{%
7550
\gdef\dofootnote{%
6206
  \startfootins
7551
  \insert\footins\bgroup
6207
  % We want to typeset this text as a normal paragraph, even if the
7552
  % We want to typeset this text as a normal paragraph, even if the
6208
  % footnote reference occurs in (for example) a display environment.
7553
  % footnote reference occurs in (for example) a display environment.
6209
  % So reset some parameters.
7554
  % So reset some parameters.
Lines 6239-6278 Link Here
6239
}
7584
}
6240
}%end \catcode `\@=11
7585
}%end \catcode `\@=11
6241
7586
6242
% @| inserts a changebar to the left of the current line.  It should
7587
% In case a @footnote appears in a vbox, save the footnote text and create
6243
% surround any changed text.  This approach does *not* work if the
7588
% the real \insert just after the vbox finished.  Otherwise, the insertion
6244
% change spans more than two lines of output.  To handle that, we would
7589
% would be lost.
6245
% have adopt a much more difficult approach (putting marks into the main
7590
% Similarly, if a @footnote appears inside an alignment, save the footnote
6246
% vertical list for the beginning and end of each change).
7591
% text to a box and make the \insert when a row of the table is finished.
6247
%
7592
% And the same can be done for other insert classes.  --kasal, 16nov03.
6248
\def\|{%
7593
6249
  % \vadjust can only be used in horizontal mode.
7594
% Replace the \insert primitive by a cheating macro.
6250
  \leavevmode
7595
% Deeper inside, just make sure that the saved insertions are not spilled
6251
  %
7596
% out prematurely.
6252
  % Append this vertical mode material after the current line in the output.
7597
%
6253
  \vadjust{%
7598
\def\startsavinginserts{%
6254
    % We want to insert a rule with the height and depth of the current
7599
  \ifx \insert\ptexinsert
6255
    % leading; that is exactly what \strutbox is supposed to record.
7600
    \let\insert\saveinsert
6256
    \vskip-\baselineskip
7601
  \else
6257
    %
7602
    \let\checkinserts\relax
6258
    % \vadjust-items are inserted at the left edge of the type.  So
7603
  \fi
6259
    % the \llap here moves out into the left-hand margin.
6260
    \llap{%
6261
      %
6262
      % For a thicker or thinner bar, change the `1pt'.
6263
      \vrule height\baselineskip width1pt
6264
      %
6265
      % This is the space between the bar and the text.
6266
      \hskip 12pt
6267
    }%
6268
  }%
6269
}
7604
}
6270
7605
6271
% For a final copy, take out the rectangles
7606
% This \insert replacement works for both \insert\footins{foo} and
6272
% that mark overfull boxes (in case you have decided
7607
% \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}.
6273
% that the text looks ok even though it passes the margin).
6274
%
7608
%
6275
\def\finalout{\overfullrule=0pt}
7609
\def\saveinsert#1{%
7610
  \edef\next{\noexpand\savetobox \makeSAVEname#1}%
7611
  \afterassignment\next
7612
  % swallow the left brace
7613
  \let\temp =
7614
}
7615
\def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}}
7616
\def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1}
7617
7618
\def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi}
7619
7620
\def\placesaveins#1{%
7621
  \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname
7622
    {\box#1}%
7623
}
7624
7625
% eat @SAVE -- beware, all of them have catcode \other:
7626
{
7627
  \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials  %  ;-)
7628
  \gdef\gobblesave @SAVE{}
7629
}
7630
7631
% initialization:
7632
\def\newsaveins #1{%
7633
  \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}%
7634
  \next
7635
}
7636
\def\newsaveinsX #1{%
7637
  \csname newbox\endcsname #1%
7638
  \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts
7639
    \checksaveins #1}%
7640
}
7641
7642
% initialize:
7643
\let\checkinserts\empty
7644
\newsaveins\footins
7645
\newsaveins\margin
7646
6276
7647
6277
% @image.  We use the macros from epsf.tex to support this.
7648
% @image.  We use the macros from epsf.tex to support this.
6278
% If epsf.tex is not installed and @image is used, we complain.
7649
% If epsf.tex is not installed and @image is used, we complain.
Lines 6282-6293 Link Here
6282
% undone and the next image would fail.
7653
% undone and the next image would fail.
6283
\openin 1 = epsf.tex
7654
\openin 1 = epsf.tex
6284
\ifeof 1 \else
7655
\ifeof 1 \else
6285
  \closein 1
6286
  % Do not bother showing banner with epsf.tex v2.7k (available in
7656
  % Do not bother showing banner with epsf.tex v2.7k (available in
6287
  % doc/epsf.tex and on ctan).
7657
  % doc/epsf.tex and on ctan).
6288
  \def\epsfannounce{\toks0 = }%
7658
  \def\epsfannounce{\toks0 = }%
6289
  \input epsf.tex
7659
  \input epsf.tex
6290
\fi
7660
\fi
7661
\closein 1
6291
%
7662
%
6292
% We will only complain once about lack of epsf.tex.
7663
% We will only complain once about lack of epsf.tex.
6293
\newif\ifwarnednoepsf
7664
\newif\ifwarnednoepsf
Lines 6320-6334 Link Here
6320
  % If the image is by itself, center it.
7691
  % If the image is by itself, center it.
6321
  \ifvmode
7692
  \ifvmode
6322
    \imagevmodetrue
7693
    \imagevmodetrue
6323
    \nobreak\bigskip
7694
    \nobreak\medskip
6324
    % Usually we'll have text after the image which will insert
7695
    % Usually we'll have text after the image which will insert
6325
    % \parskip glue, so insert it here too to equalize the space
7696
    % \parskip glue, so insert it here too to equalize the space
6326
    % above and below.
7697
    % above and below.
6327
    \nobreak\vskip\parskip
7698
    \nobreak\vskip\parskip
6328
    \nobreak
7699
    \nobreak
6329
    \line\bgroup\hss
6330
  \fi
7700
  \fi
6331
  %
7701
  %
7702
  % Leave vertical mode so that indentation from an enclosing
7703
  % environment such as @quotation is respected.  On the other hand, if
7704
  % it's at the top level, we don't want the normal paragraph indentation.
7705
  \noindent
7706
  %
6332
  % Output the image.
7707
  % Output the image.
6333
  \ifpdf
7708
  \ifpdf
6334
    \dopdfimage{#1}{#2}{#3}%
7709
    \dopdfimage{#1}{#2}{#3}%
Lines 6339-6383 Link Here
6339
    \epsfbox{#1.eps}%
7714
    \epsfbox{#1.eps}%
6340
  \fi
7715
  \fi
6341
  %
7716
  %
6342
  \ifimagevmode \hss \egroup \bigbreak \fi  % space after the image
7717
  \ifimagevmode \medskip \fi  % space after the standalone image
6343
\endgroup}
7718
\endgroup}
6344
7719
6345
7720
7721
% @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables,
7722
% etc.  We don't actually implement floating yet, we always include the
7723
% float "here".  But it seemed the best name for the future.
7724
%
7725
\envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish}
7726
7727
% There may be a space before second and/or third parameter; delete it.
7728
\def\eatcommaspace#1, {#1,}
7729
7730
% #1 is the optional FLOATTYPE, the text label for this float, typically
7731
% "Figure", "Table", "Example", etc.  Can't contain commas.  If omitted,
7732
% this float will not be numbered and cannot be referred to.
7733
%
7734
% #2 is the optional xref label.  Also must be present for the float to
7735
% be referable.
7736
%
7737
% #3 is the optional positioning argument; for now, it is ignored.  It
7738
% will somehow specify the positions allowed to float to (here, top, bottom).
7739
%
7740
% We keep a separate counter for each FLOATTYPE, which we reset at each
7741
% chapter-level command.
7742
\let\resetallfloatnos=\empty
7743
%
7744
\def\dofloat#1,#2,#3,#4\finish{%
7745
  \let\thiscaption=\empty
7746
  \let\thisshortcaption=\empty
7747
  %
7748
  % don't lose footnotes inside @float.
7749
  %
7750
  % BEWARE: when the floats start float, we have to issue warning whenever an
7751
  % insert appears inside a float which could possibly float. --kasal, 26may04
7752
  %
7753
  \startsavinginserts
7754
  %
7755
  % We can't be used inside a paragraph.
7756
  \par
7757
  %
7758
  \vtop\bgroup
7759
    \def\floattype{#1}%
7760
    \def\floatlabel{#2}%
7761
    \def\floatloc{#3}% we do nothing with this yet.
7762
    %
7763
    \ifx\floattype\empty
7764
      \let\safefloattype=\empty
7765
    \else
7766
      {%
7767
        % the floattype might have accents or other special characters,
7768
        % but we need to use it in a control sequence name.
7769
        \indexnofonts
7770
        \turnoffactive
7771
        \xdef\safefloattype{\floattype}%
7772
      }%
7773
    \fi
7774
    %
7775
    % If label is given but no type, we handle that as the empty type.
7776
    \ifx\floatlabel\empty \else
7777
      % We want each FLOATTYPE to be numbered separately (Figure 1,
7778
      % Table 1, Figure 2, ...).  (And if no label, no number.)
7779
      %
7780
      \expandafter\getfloatno\csname\safefloattype floatno\endcsname
7781
      \global\advance\floatno by 1
7782
      %
7783
      {%
7784
        % This magic value for \lastsection is output by \setref as the
7785
        % XREFLABEL-title value.  \xrefX uses it to distinguish float
7786
        % labels (which have a completely different output format) from
7787
        % node and anchor labels.  And \xrdef uses it to construct the
7788
        % lists of floats.
7789
        %
7790
        \edef\lastsection{\floatmagic=\safefloattype}%
7791
        \setref{\floatlabel}{Yfloat}%
7792
      }%
7793
    \fi
7794
    %
7795
    % start with \parskip glue, I guess.
7796
    \vskip\parskip
7797
    %
7798
    % Don't suppress indentation if a float happens to start a section.
7799
    \restorefirstparagraphindent
7800
}
7801
7802
% we have these possibilities:
7803
% @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap
7804
% @float Foo,lbl & no caption:    Foo 1.1
7805
% @float Foo & @caption{Cap}:     Foo: Cap
7806
% @float Foo & no caption:        Foo
7807
% @float ,lbl & Caption{Cap}:     1.1: Cap
7808
% @float ,lbl & no caption:       1.1
7809
% @float & @caption{Cap}:         Cap
7810
% @float & no caption:
7811
%
7812
\def\Efloat{%
7813
    \let\floatident = \empty
7814
    %
7815
    % In all cases, if we have a float type, it comes first.
7816
    \ifx\floattype\empty \else \def\floatident{\floattype}\fi
7817
    %
7818
    % If we have an xref label, the number comes next.
7819
    \ifx\floatlabel\empty \else
7820
      \ifx\floattype\empty \else % if also had float type, need tie first.
7821
        \appendtomacro\floatident{\tie}%
7822
      \fi
7823
      % the number.
7824
      \appendtomacro\floatident{\chaplevelprefix\the\floatno}%
7825
    \fi
7826
    %
7827
    % Start the printed caption with what we've constructed in
7828
    % \floatident, but keep it separate; we need \floatident again.
7829
    \let\captionline = \floatident
7830
    %
7831
    \ifx\thiscaption\empty \else
7832
      \ifx\floatident\empty \else
7833
	\appendtomacro\captionline{: }% had ident, so need a colon between
7834
      \fi
7835
      %
7836
      % caption text.
7837
      \appendtomacro\captionline{\scanexp\thiscaption}%
7838
    \fi
7839
    %
7840
    % If we have anything to print, print it, with space before.
7841
    % Eventually this needs to become an \insert.
7842
    \ifx\captionline\empty \else
7843
      \vskip.5\parskip
7844
      \captionline
7845
      %
7846
      % Space below caption.
7847
      \vskip\parskip
7848
    \fi
7849
    %
7850
    % If have an xref label, write the list of floats info.  Do this
7851
    % after the caption, to avoid chance of it being a breakpoint.
7852
    \ifx\floatlabel\empty \else
7853
      % Write the text that goes in the lof to the aux file as
7854
      % \floatlabel-lof.  Besides \floatident, we include the short
7855
      % caption if specified, else the full caption if specified, else nothing.
7856
      {%
7857
        \atdummies
7858
        %
7859
        % since we read the caption text in the macro world, where ^^M
7860
        % is turned into a normal character, we have to scan it back, so
7861
        % we don't write the literal three characters "^^M" into the aux file.
7862
	\scanexp{%
7863
	  \xdef\noexpand\gtemp{%
7864
	    \ifx\thisshortcaption\empty
7865
	      \thiscaption
7866
	    \else
7867
	      \thisshortcaption
7868
	    \fi
7869
	  }%
7870
	}%
7871
        \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident
7872
	  \ifx\gtemp\empty \else : \gtemp \fi}}%
7873
      }%
7874
    \fi
7875
  \egroup  % end of \vtop
7876
  %
7877
  % place the captured inserts
7878
  %
7879
  % BEWARE: when the floats start floating, we have to issue warning
7880
  % whenever an insert appears inside a float which could possibly
7881
  % float. --kasal, 26may04
7882
  %
7883
  \checkinserts
7884
}
7885
7886
% Append the tokens #2 to the definition of macro #1, not expanding either.
7887
%
7888
\def\appendtomacro#1#2{%
7889
  \expandafter\def\expandafter#1\expandafter{#1#2}%
7890
}
7891
7892
% @caption, @shortcaption
7893
%
7894
\def\caption{\docaption\thiscaption}
7895
\def\shortcaption{\docaption\thisshortcaption}
7896
\def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption}
7897
\def\defcaption#1#2{\egroup \def#1{#2}}
7898
7899
% The parameter is the control sequence identifying the counter we are
7900
% going to use.  Create it if it doesn't exist and assign it to \floatno.
7901
\def\getfloatno#1{%
7902
  \ifx#1\relax
7903
      % Haven't seen this figure type before.
7904
      \csname newcount\endcsname #1%
7905
      %
7906
      % Remember to reset this floatno at the next chap.
7907
      \expandafter\gdef\expandafter\resetallfloatnos
7908
        \expandafter{\resetallfloatnos #1=0 }%
7909
  \fi
7910
  \let\floatno#1%
7911
}
7912
7913
% \setref calls this to get the XREFLABEL-snt value.  We want an @xref
7914
% to the FLOATLABEL to expand to "Figure 3.1".  We call \setref when we
7915
% first read the @float command.
7916
%
7917
\def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}%
7918
7919
% Magic string used for the XREFLABEL-title value, so \xrefX can
7920
% distinguish floats from other xref types.
7921
\def\floatmagic{!!float!!}
7922
7923
% #1 is the control sequence we are passed; we expand into a conditional
7924
% which is true if #1 represents a float ref.  That is, the magic
7925
% \lastsection value which we \setref above.
7926
%
7927
\def\iffloat#1{\expandafter\doiffloat#1==\finish}
7928
%
7929
% #1 is (maybe) the \floatmagic string.  If so, #2 will be the
7930
% (safe) float type for this float.  We set \iffloattype to #2.
7931
%
7932
\def\doiffloat#1=#2=#3\finish{%
7933
  \def\temp{#1}%
7934
  \def\iffloattype{#2}%
7935
  \ifx\temp\floatmagic
7936
}
7937
7938
% @listoffloats FLOATTYPE - print a list of floats like a table of contents.
7939
%
7940
\parseargdef\listoffloats{%
7941
  \def\floattype{#1}% floattype
7942
  {%
7943
    % the floattype might have accents or other special characters,
7944
    % but we need to use it in a control sequence name.
7945
    \indexnofonts
7946
    \turnoffactive
7947
    \xdef\safefloattype{\floattype}%
7948
  }%
7949
  %
7950
  % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE.
7951
  \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax
7952
    \ifhavexrefs
7953
      % if the user said @listoffloats foo but never @float foo.
7954
      \message{\linenumber No `\safefloattype' floats to list.}%
7955
    \fi
7956
  \else
7957
    \begingroup
7958
      \leftskip=\tocindent  % indent these entries like a toc
7959
      \let\do=\listoffloatsdo
7960
      \csname floatlist\safefloattype\endcsname
7961
    \endgroup
7962
  \fi
7963
}
7964
7965
% This is called on each entry in a list of floats.  We're passed the
7966
% xref label, in the form LABEL-title, which is how we save it in the
7967
% aux file.  We strip off the -title and look up \XRLABEL-lof, which
7968
% has the text we're supposed to typeset here.
7969
%
7970
% Figures without xref labels will not be included in the list (since
7971
% they won't appear in the aux file).
7972
%
7973
\def\listoffloatsdo#1{\listoffloatsdoentry#1\finish}
7974
\def\listoffloatsdoentry#1-title\finish{{%
7975
  % Can't fully expand XR#1-lof because it can contain anything.  Just
7976
  % pass the control sequence.  On the other hand, XR#1-pg is just the
7977
  % page number, and we want to fully expand that so we can get a link
7978
  % in pdf output.
7979
  \toksA = \expandafter{\csname XR#1-lof\endcsname}%
7980
  %
7981
  % use the same \entry macro we use to generate the TOC and index.
7982
  \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}%
7983
  \writeentry
7984
}}
7985
7986
6346
\message{localization,}
7987
\message{localization,}
6347
% and i18n.
6348
7988
6349
% @documentlanguage is usually given very early, just after
7989
% For single-language documents, @documentlanguage is usually given very
6350
% @setfilename.  If done too late, it may not override everything
7990
% early, just after @documentencoding.  Single argument is the language
6351
% properly.  Single argument is the language abbreviation.
7991
% (de) or locale (de_DE) abbreviation.
6352
% It would be nice if we could set up a hyphenation file here.
6353
%
7992
%
6354
\def\documentlanguage{\parsearg\dodocumentlanguage}
7993
{
6355
\def\dodocumentlanguage#1{%
7994
  \catcode`\_ = \active
7995
  \globaldefs=1
7996
\parseargdef\documentlanguage{\begingroup
7997
  \let_=\normalunderscore  % normal _ character for filenames
6356
  \tex % read txi-??.tex file in plain TeX.
7998
  \tex % read txi-??.tex file in plain TeX.
6357
  % Read the file if it exists.
7999
    % Read the file by the name they passed if it exists.
8000
    \openin 1 txi-#1.tex
8001
    \ifeof 1
8002
      \documentlanguagetrywithoutunderscore{#1_\finish}%
8003
    \else
8004
      \globaldefs = 1  % everything in the txi-LL files needs to persist
8005
      \input txi-#1.tex
8006
    \fi
8007
    \closein 1
8008
  \endgroup % end raw TeX
8009
\endgroup}
8010
%
8011
% If they passed de_DE, and txi-de_DE.tex doesn't exist,
8012
% try txi-de.tex.
8013
%
8014
\gdef\documentlanguagetrywithoutunderscore#1_#2\finish{%
6358
  \openin 1 txi-#1.tex
8015
  \openin 1 txi-#1.tex
6359
  \ifeof1
8016
  \ifeof 1
6360
    \errhelp = \nolanghelp
8017
    \errhelp = \nolanghelp
6361
    \errmessage{Cannot read language file txi-#1.tex}%
8018
    \errmessage{Cannot read language file txi-#1.tex}%
6362
    \let\temp = \relax
6363
  \else
8019
  \else
6364
    \def\temp{\input txi-#1.tex }%
8020
    \globaldefs = 1  % everything in the txi-LL files needs to persist
8021
    \input txi-#1.tex
6365
  \fi
8022
  \fi
6366
  \temp
8023
  \closein 1
6367
  \endgroup
6368
}
8024
}
8025
}% end of special _ catcode
8026
%
6369
\newhelp\nolanghelp{The given language definition file cannot be found or
8027
\newhelp\nolanghelp{The given language definition file cannot be found or
6370
is empty.  Maybe you need to install it?  In the current directory
8028
is empty.  Maybe you need to install it?  Putting it in the current
6371
should work if nowhere else does.}
8029
directory should work if nowhere else does.}
8030
8031
% This macro is called from txi-??.tex files; the first argument is the
8032
% \language name to set (without the "\lang@" prefix), the second and
8033
% third args are \{left,right}hyphenmin.
8034
%
8035
% The language names to pass are determined when the format is built.
8036
% See the etex.log file created at that time, e.g.,
8037
% /usr/local/texlive/2008/texmf-var/web2c/pdftex/etex.log.
8038
%
8039
% With TeX Live 2008, etex now includes hyphenation patterns for all
8040
% available languages.  This means we can support hyphenation in
8041
% Texinfo, at least to some extent.  (This still doesn't solve the
8042
% accented characters problem.)
8043
%
8044
\catcode`@=11
8045
\def\txisetlanguage#1#2#3{%
8046
  % do not set the language if the name is undefined in the current TeX.
8047
  \expandafter\ifx\csname lang@#1\endcsname \relax
8048
    \message{no patterns for #1}%
8049
  \else
8050
    \global\language = \csname lang@#1\endcsname
8051
  \fi
8052
  % but there is no harm in adjusting the hyphenmin values regardless.
8053
  \global\lefthyphenmin = #2\relax
8054
  \global\righthyphenmin = #3\relax
8055
}
8056
8057
% Helpers for encodings.
8058
% Set the catcode of characters 128 through 255 to the specified number.
8059
%
8060
\def\setnonasciicharscatcode#1{%
8061
   \count255=128
8062
   \loop\ifnum\count255<256
8063
      \global\catcode\count255=#1\relax
8064
      \advance\count255 by 1
8065
   \repeat
8066
}
6372
8067
8068
\def\setnonasciicharscatcodenonglobal#1{%
8069
   \count255=128
8070
   \loop\ifnum\count255<256
8071
      \catcode\count255=#1\relax
8072
      \advance\count255 by 1
8073
   \repeat
8074
}
8075
8076
% @documentencoding sets the definition of non-ASCII characters
8077
% according to the specified encoding.
8078
%
8079
\parseargdef\documentencoding{%
8080
  % Encoding being declared for the document.
8081
  \def\declaredencoding{\csname #1.enc\endcsname}%
8082
  %
8083
  % Supported encodings: names converted to tokens in order to be able
8084
  % to compare them with \ifx.
8085
  \def\ascii{\csname US-ASCII.enc\endcsname}%
8086
  \def\latnine{\csname ISO-8859-15.enc\endcsname}%
8087
  \def\latone{\csname ISO-8859-1.enc\endcsname}%
8088
  \def\lattwo{\csname ISO-8859-2.enc\endcsname}%
8089
  \def\utfeight{\csname UTF-8.enc\endcsname}%
8090
  %
8091
  \ifx \declaredencoding \ascii
8092
     \asciichardefs
8093
  %
8094
  \else \ifx \declaredencoding \lattwo
8095
     \setnonasciicharscatcode\active
8096
     \lattwochardefs
8097
  %
8098
  \else \ifx \declaredencoding \latone
8099
     \setnonasciicharscatcode\active
8100
     \latonechardefs
8101
  %
8102
  \else \ifx \declaredencoding \latnine
8103
     \setnonasciicharscatcode\active
8104
     \latninechardefs
8105
  %
8106
  \else \ifx \declaredencoding \utfeight
8107
     \setnonasciicharscatcode\active
8108
     \utfeightchardefs
8109
  %
8110
  \else
8111
    \message{Unknown document encoding #1, ignoring.}%
8112
  %
8113
  \fi % utfeight
8114
  \fi % latnine
8115
  \fi % latone
8116
  \fi % lattwo
8117
  \fi % ascii
8118
}
8119
8120
% A message to be logged when using a character that isn't available
8121
% the default font encoding (OT1).
8122
%
8123
\def\missingcharmsg#1{\message{Character missing in OT1 encoding: #1.}}
8124
8125
% Take account of \c (plain) vs. \, (Texinfo) difference.
8126
\def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi}
8127
8128
% First, make active non-ASCII characters in order for them to be
8129
% correctly categorized when TeX reads the replacement text of
8130
% macros containing the character definitions.
8131
\setnonasciicharscatcode\active
8132
%
8133
% Latin1 (ISO-8859-1) character definitions.
8134
\def\latonechardefs{%
8135
  \gdef^^a0{~}
8136
  \gdef^^a1{\exclamdown}
8137
  \gdef^^a2{\missingcharmsg{CENT SIGN}}
8138
  \gdef^^a3{{\pounds}}
8139
  \gdef^^a4{\missingcharmsg{CURRENCY SIGN}}
8140
  \gdef^^a5{\missingcharmsg{YEN SIGN}}
8141
  \gdef^^a6{\missingcharmsg{BROKEN BAR}}
8142
  \gdef^^a7{\S}
8143
  \gdef^^a8{\"{}}
8144
  \gdef^^a9{\copyright}
8145
  \gdef^^aa{\ordf}
8146
  \gdef^^ab{\guillemetleft}
8147
  \gdef^^ac{$\lnot$}
8148
  \gdef^^ad{\-}
8149
  \gdef^^ae{\registeredsymbol}
8150
  \gdef^^af{\={}}
8151
  %
8152
  \gdef^^b0{\textdegree}
8153
  \gdef^^b1{$\pm$}
8154
  \gdef^^b2{$^2$}
8155
  \gdef^^b3{$^3$}
8156
  \gdef^^b4{\'{}}
8157
  \gdef^^b5{$\mu$}
8158
  \gdef^^b6{\P}
8159
  %
8160
  \gdef^^b7{$^.$}
8161
  \gdef^^b8{\cedilla\ }
8162
  \gdef^^b9{$^1$}
8163
  \gdef^^ba{\ordm}
8164
  %
8165
  \gdef^^bb{\guilletright}
8166
  \gdef^^bc{$1\over4$}
8167
  \gdef^^bd{$1\over2$}
8168
  \gdef^^be{$3\over4$}
8169
  \gdef^^bf{\questiondown}
8170
  %
8171
  \gdef^^c0{\`A}
8172
  \gdef^^c1{\'A}
8173
  \gdef^^c2{\^A}
8174
  \gdef^^c3{\~A}
8175
  \gdef^^c4{\"A}
8176
  \gdef^^c5{\ringaccent A}
8177
  \gdef^^c6{\AE}
8178
  \gdef^^c7{\cedilla C}
8179
  \gdef^^c8{\`E}
8180
  \gdef^^c9{\'E}
8181
  \gdef^^ca{\^E}
8182
  \gdef^^cb{\"E}
8183
  \gdef^^cc{\`I}
8184
  \gdef^^cd{\'I}
8185
  \gdef^^ce{\^I}
8186
  \gdef^^cf{\"I}
8187
  %
8188
  \gdef^^d0{\DH}
8189
  \gdef^^d1{\~N}
8190
  \gdef^^d2{\`O}
8191
  \gdef^^d3{\'O}
8192
  \gdef^^d4{\^O}
8193
  \gdef^^d5{\~O}
8194
  \gdef^^d6{\"O}
8195
  \gdef^^d7{$\times$}
8196
  \gdef^^d8{\O}
8197
  \gdef^^d9{\`U}
8198
  \gdef^^da{\'U}
8199
  \gdef^^db{\^U}
8200
  \gdef^^dc{\"U}
8201
  \gdef^^dd{\'Y}
8202
  \gdef^^de{\TH}
8203
  \gdef^^df{\ss}
8204
  %
8205
  \gdef^^e0{\`a}
8206
  \gdef^^e1{\'a}
8207
  \gdef^^e2{\^a}
8208
  \gdef^^e3{\~a}
8209
  \gdef^^e4{\"a}
8210
  \gdef^^e5{\ringaccent a}
8211
  \gdef^^e6{\ae}
8212
  \gdef^^e7{\cedilla c}
8213
  \gdef^^e8{\`e}
8214
  \gdef^^e9{\'e}
8215
  \gdef^^ea{\^e}
8216
  \gdef^^eb{\"e}
8217
  \gdef^^ec{\`{\dotless i}}
8218
  \gdef^^ed{\'{\dotless i}}
8219
  \gdef^^ee{\^{\dotless i}}
8220
  \gdef^^ef{\"{\dotless i}}
8221
  %
8222
  \gdef^^f0{\dh}
8223
  \gdef^^f1{\~n}
8224
  \gdef^^f2{\`o}
8225
  \gdef^^f3{\'o}
8226
  \gdef^^f4{\^o}
8227
  \gdef^^f5{\~o}
8228
  \gdef^^f6{\"o}
8229
  \gdef^^f7{$\div$}
8230
  \gdef^^f8{\o}
8231
  \gdef^^f9{\`u}
8232
  \gdef^^fa{\'u}
8233
  \gdef^^fb{\^u}
8234
  \gdef^^fc{\"u}
8235
  \gdef^^fd{\'y}
8236
  \gdef^^fe{\th}
8237
  \gdef^^ff{\"y}
8238
}
8239
8240
% Latin9 (ISO-8859-15) encoding character definitions.
8241
\def\latninechardefs{%
8242
  % Encoding is almost identical to Latin1.
8243
  \latonechardefs
8244
  %
8245
  \gdef^^a4{\euro}
8246
  \gdef^^a6{\v S}
8247
  \gdef^^a8{\v s}
8248
  \gdef^^b4{\v Z}
8249
  \gdef^^b8{\v z}
8250
  \gdef^^bc{\OE}
8251
  \gdef^^bd{\oe}
8252
  \gdef^^be{\"Y}
8253
}
8254
8255
% Latin2 (ISO-8859-2) character definitions.
8256
\def\lattwochardefs{%
8257
  \gdef^^a0{~}
8258
  \gdef^^a1{\ogonek{A}}
8259
  \gdef^^a2{\u{}}
8260
  \gdef^^a3{\L}
8261
  \gdef^^a4{\missingcharmsg{CURRENCY SIGN}}
8262
  \gdef^^a5{\v L}
8263
  \gdef^^a6{\'S}
8264
  \gdef^^a7{\S}
8265
  \gdef^^a8{\"{}}
8266
  \gdef^^a9{\v S}
8267
  \gdef^^aa{\cedilla S}
8268
  \gdef^^ab{\v T}
8269
  \gdef^^ac{\'Z}
8270
  \gdef^^ad{\-}
8271
  \gdef^^ae{\v Z}
8272
  \gdef^^af{\dotaccent Z}
8273
  %
8274
  \gdef^^b0{\textdegree}
8275
  \gdef^^b1{\ogonek{a}}
8276
  \gdef^^b2{\ogonek{ }}
8277
  \gdef^^b3{\l}
8278
  \gdef^^b4{\'{}}
8279
  \gdef^^b5{\v l}
8280
  \gdef^^b6{\'s}
8281
  \gdef^^b7{\v{}}
8282
  \gdef^^b8{\cedilla\ }
8283
  \gdef^^b9{\v s}
8284
  \gdef^^ba{\cedilla s}
8285
  \gdef^^bb{\v t}
8286
  \gdef^^bc{\'z}
8287
  \gdef^^bd{\H{}}
8288
  \gdef^^be{\v z}
8289
  \gdef^^bf{\dotaccent z}
8290
  %
8291
  \gdef^^c0{\'R}
8292
  \gdef^^c1{\'A}
8293
  \gdef^^c2{\^A}
8294
  \gdef^^c3{\u A}
8295
  \gdef^^c4{\"A}
8296
  \gdef^^c5{\'L}
8297
  \gdef^^c6{\'C}
8298
  \gdef^^c7{\cedilla C}
8299
  \gdef^^c8{\v C}
8300
  \gdef^^c9{\'E}
8301
  \gdef^^ca{\ogonek{E}}
8302
  \gdef^^cb{\"E}
8303
  \gdef^^cc{\v E}
8304
  \gdef^^cd{\'I}
8305
  \gdef^^ce{\^I}
8306
  \gdef^^cf{\v D}
8307
  %
8308
  \gdef^^d0{\DH}
8309
  \gdef^^d1{\'N}
8310
  \gdef^^d2{\v N}
8311
  \gdef^^d3{\'O}
8312
  \gdef^^d4{\^O}
8313
  \gdef^^d5{\H O}
8314
  \gdef^^d6{\"O}
8315
  \gdef^^d7{$\times$}
8316
  \gdef^^d8{\v R}
8317
  \gdef^^d9{\ringaccent U}
8318
  \gdef^^da{\'U}
8319
  \gdef^^db{\H U}
8320
  \gdef^^dc{\"U}
8321
  \gdef^^dd{\'Y}
8322
  \gdef^^de{\cedilla T}
8323
  \gdef^^df{\ss}
8324
  %
8325
  \gdef^^e0{\'r}
8326
  \gdef^^e1{\'a}
8327
  \gdef^^e2{\^a}
8328
  \gdef^^e3{\u a}
8329
  \gdef^^e4{\"a}
8330
  \gdef^^e5{\'l}
8331
  \gdef^^e6{\'c}
8332
  \gdef^^e7{\cedilla c}
8333
  \gdef^^e8{\v c}
8334
  \gdef^^e9{\'e}
8335
  \gdef^^ea{\ogonek{e}}
8336
  \gdef^^eb{\"e}
8337
  \gdef^^ec{\v e}
8338
  \gdef^^ed{\'\i}
8339
  \gdef^^ee{\^\i}
8340
  \gdef^^ef{\v d}
8341
  %
8342
  \gdef^^f0{\dh}
8343
  \gdef^^f1{\'n}
8344
  \gdef^^f2{\v n}
8345
  \gdef^^f3{\'o}
8346
  \gdef^^f4{\^o}
8347
  \gdef^^f5{\H o}
8348
  \gdef^^f6{\"o}
8349
  \gdef^^f7{$\div$}
8350
  \gdef^^f8{\v r}
8351
  \gdef^^f9{\ringaccent u}
8352
  \gdef^^fa{\'u}
8353
  \gdef^^fb{\H u}
8354
  \gdef^^fc{\"u}
8355
  \gdef^^fd{\'y}
8356
  \gdef^^fe{\cedilla t}
8357
  \gdef^^ff{\dotaccent{}}
8358
}
8359
8360
% UTF-8 character definitions.
8361
%
8362
% This code to support UTF-8 is based on LaTeX's utf8.def, with some
8363
% changes for Texinfo conventions.  It is included here under the GPL by
8364
% permission from Frank Mittelbach and the LaTeX team.
8365
%
8366
\newcount\countUTFx
8367
\newcount\countUTFy
8368
\newcount\countUTFz
8369
8370
\gdef\UTFviiiTwoOctets#1#2{\expandafter
8371
   \UTFviiiDefined\csname u8:#1\string #2\endcsname}
8372
%
8373
\gdef\UTFviiiThreeOctets#1#2#3{\expandafter
8374
   \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname}
8375
%
8376
\gdef\UTFviiiFourOctets#1#2#3#4{\expandafter
8377
   \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname}
8378
8379
\gdef\UTFviiiDefined#1{%
8380
  \ifx #1\relax
8381
    \message{\linenumber Unicode char \string #1 not defined for Texinfo}%
8382
  \else
8383
    \expandafter #1%
8384
  \fi
8385
}
8386
8387
\begingroup
8388
  \catcode`\~13
8389
  \catcode`\"12
8390
8391
  \def\UTFviiiLoop{%
8392
    \global\catcode\countUTFx\active
8393
    \uccode`\~\countUTFx
8394
    \uppercase\expandafter{\UTFviiiTmp}%
8395
    \advance\countUTFx by 1
8396
    \ifnum\countUTFx < \countUTFy
8397
      \expandafter\UTFviiiLoop
8398
    \fi}
8399
8400
  \countUTFx = "C2
8401
  \countUTFy = "E0
8402
  \def\UTFviiiTmp{%
8403
    \xdef~{\noexpand\UTFviiiTwoOctets\string~}}
8404
  \UTFviiiLoop
8405
8406
  \countUTFx = "E0
8407
  \countUTFy = "F0
8408
  \def\UTFviiiTmp{%
8409
    \xdef~{\noexpand\UTFviiiThreeOctets\string~}}
8410
  \UTFviiiLoop
8411
8412
  \countUTFx = "F0
8413
  \countUTFy = "F4
8414
  \def\UTFviiiTmp{%
8415
    \xdef~{\noexpand\UTFviiiFourOctets\string~}}
8416
  \UTFviiiLoop
8417
\endgroup
8418
8419
\begingroup
8420
  \catcode`\"=12
8421
  \catcode`\<=12
8422
  \catcode`\.=12
8423
  \catcode`\,=12
8424
  \catcode`\;=12
8425
  \catcode`\!=12
8426
  \catcode`\~=13
8427
8428
  \gdef\DeclareUnicodeCharacter#1#2{%
8429
    \countUTFz = "#1\relax
8430
    \wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}%
8431
    \begingroup
8432
      \parseXMLCharref
8433
      \def\UTFviiiTwoOctets##1##2{%
8434
        \csname u8:##1\string ##2\endcsname}%
8435
      \def\UTFviiiThreeOctets##1##2##3{%
8436
        \csname u8:##1\string ##2\string ##3\endcsname}%
8437
      \def\UTFviiiFourOctets##1##2##3##4{%
8438
        \csname u8:##1\string ##2\string ##3\string ##4\endcsname}%
8439
      \expandafter\expandafter\expandafter\expandafter
8440
       \expandafter\expandafter\expandafter
8441
       \gdef\UTFviiiTmp{#2}%
8442
    \endgroup}
6373
8443
6374
% @documentencoding should change something in TeX eventually, most
8444
  \gdef\parseXMLCharref{%
6375
% likely, but for now just recognize it.
8445
    \ifnum\countUTFz < "A0\relax
6376
\let\documentencoding = \comment
8446
      \errhelp = \EMsimple
8447
      \errmessage{Cannot define Unicode char value < 00A0}%
8448
    \else\ifnum\countUTFz < "800\relax
8449
      \parseUTFviiiA,%
8450
      \parseUTFviiiB C\UTFviiiTwoOctets.,%
8451
    \else\ifnum\countUTFz < "10000\relax
8452
      \parseUTFviiiA;%
8453
      \parseUTFviiiA,%
8454
      \parseUTFviiiB E\UTFviiiThreeOctets.{,;}%
8455
    \else
8456
      \parseUTFviiiA;%
8457
      \parseUTFviiiA,%
8458
      \parseUTFviiiA!%
8459
      \parseUTFviiiB F\UTFviiiFourOctets.{!,;}%
8460
    \fi\fi\fi
8461
  }
6377
8462
8463
  \gdef\parseUTFviiiA#1{%
8464
    \countUTFx = \countUTFz
8465
    \divide\countUTFz by 64
8466
    \countUTFy = \countUTFz
8467
    \multiply\countUTFz by 64
8468
    \advance\countUTFx by -\countUTFz
8469
    \advance\countUTFx by 128
8470
    \uccode `#1\countUTFx
8471
    \countUTFz = \countUTFy}
8472
8473
  \gdef\parseUTFviiiB#1#2#3#4{%
8474
    \advance\countUTFz by "#10\relax
8475
    \uccode `#3\countUTFz
8476
    \uppercase{\gdef\UTFviiiTmp{#2#3#4}}}
8477
\endgroup
6378
8478
6379
% Page size parameters.
8479
\def\utfeightchardefs{%
8480
  \DeclareUnicodeCharacter{00A0}{\tie}
8481
  \DeclareUnicodeCharacter{00A1}{\exclamdown}
8482
  \DeclareUnicodeCharacter{00A3}{\pounds}
8483
  \DeclareUnicodeCharacter{00A8}{\"{ }}
8484
  \DeclareUnicodeCharacter{00A9}{\copyright}
8485
  \DeclareUnicodeCharacter{00AA}{\ordf}
8486
  \DeclareUnicodeCharacter{00AB}{\guillemetleft}
8487
  \DeclareUnicodeCharacter{00AD}{\-}
8488
  \DeclareUnicodeCharacter{00AE}{\registeredsymbol}
8489
  \DeclareUnicodeCharacter{00AF}{\={ }}
8490
8491
  \DeclareUnicodeCharacter{00B0}{\ringaccent{ }}
8492
  \DeclareUnicodeCharacter{00B4}{\'{ }}
8493
  \DeclareUnicodeCharacter{00B8}{\cedilla{ }}
8494
  \DeclareUnicodeCharacter{00BA}{\ordm}
8495
  \DeclareUnicodeCharacter{00BB}{\guillemetright}
8496
  \DeclareUnicodeCharacter{00BF}{\questiondown}
8497
8498
  \DeclareUnicodeCharacter{00C0}{\`A}
8499
  \DeclareUnicodeCharacter{00C1}{\'A}
8500
  \DeclareUnicodeCharacter{00C2}{\^A}
8501
  \DeclareUnicodeCharacter{00C3}{\~A}
8502
  \DeclareUnicodeCharacter{00C4}{\"A}
8503
  \DeclareUnicodeCharacter{00C5}{\AA}
8504
  \DeclareUnicodeCharacter{00C6}{\AE}
8505
  \DeclareUnicodeCharacter{00C7}{\cedilla{C}}
8506
  \DeclareUnicodeCharacter{00C8}{\`E}
8507
  \DeclareUnicodeCharacter{00C9}{\'E}
8508
  \DeclareUnicodeCharacter{00CA}{\^E}
8509
  \DeclareUnicodeCharacter{00CB}{\"E}
8510
  \DeclareUnicodeCharacter{00CC}{\`I}
8511
  \DeclareUnicodeCharacter{00CD}{\'I}
8512
  \DeclareUnicodeCharacter{00CE}{\^I}
8513
  \DeclareUnicodeCharacter{00CF}{\"I}
8514
8515
  \DeclareUnicodeCharacter{00D0}{\DH}
8516
  \DeclareUnicodeCharacter{00D1}{\~N}
8517
  \DeclareUnicodeCharacter{00D2}{\`O}
8518
  \DeclareUnicodeCharacter{00D3}{\'O}
8519
  \DeclareUnicodeCharacter{00D4}{\^O}
8520
  \DeclareUnicodeCharacter{00D5}{\~O}
8521
  \DeclareUnicodeCharacter{00D6}{\"O}
8522
  \DeclareUnicodeCharacter{00D8}{\O}
8523
  \DeclareUnicodeCharacter{00D9}{\`U}
8524
  \DeclareUnicodeCharacter{00DA}{\'U}
8525
  \DeclareUnicodeCharacter{00DB}{\^U}
8526
  \DeclareUnicodeCharacter{00DC}{\"U}
8527
  \DeclareUnicodeCharacter{00DD}{\'Y}
8528
  \DeclareUnicodeCharacter{00DE}{\TH}
8529
  \DeclareUnicodeCharacter{00DF}{\ss}
8530
8531
  \DeclareUnicodeCharacter{00E0}{\`a}
8532
  \DeclareUnicodeCharacter{00E1}{\'a}
8533
  \DeclareUnicodeCharacter{00E2}{\^a}
8534
  \DeclareUnicodeCharacter{00E3}{\~a}
8535
  \DeclareUnicodeCharacter{00E4}{\"a}
8536
  \DeclareUnicodeCharacter{00E5}{\aa}
8537
  \DeclareUnicodeCharacter{00E6}{\ae}
8538
  \DeclareUnicodeCharacter{00E7}{\cedilla{c}}
8539
  \DeclareUnicodeCharacter{00E8}{\`e}
8540
  \DeclareUnicodeCharacter{00E9}{\'e}
8541
  \DeclareUnicodeCharacter{00EA}{\^e}
8542
  \DeclareUnicodeCharacter{00EB}{\"e}
8543
  \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}}
8544
  \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}}
8545
  \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}}
8546
  \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}}
8547
8548
  \DeclareUnicodeCharacter{00F0}{\dh}
8549
  \DeclareUnicodeCharacter{00F1}{\~n}
8550
  \DeclareUnicodeCharacter{00F2}{\`o}
8551
  \DeclareUnicodeCharacter{00F3}{\'o}
8552
  \DeclareUnicodeCharacter{00F4}{\^o}
8553
  \DeclareUnicodeCharacter{00F5}{\~o}
8554
  \DeclareUnicodeCharacter{00F6}{\"o}
8555
  \DeclareUnicodeCharacter{00F8}{\o}
8556
  \DeclareUnicodeCharacter{00F9}{\`u}
8557
  \DeclareUnicodeCharacter{00FA}{\'u}
8558
  \DeclareUnicodeCharacter{00FB}{\^u}
8559
  \DeclareUnicodeCharacter{00FC}{\"u}
8560
  \DeclareUnicodeCharacter{00FD}{\'y}
8561
  \DeclareUnicodeCharacter{00FE}{\th}
8562
  \DeclareUnicodeCharacter{00FF}{\"y}
8563
8564
  \DeclareUnicodeCharacter{0100}{\=A}
8565
  \DeclareUnicodeCharacter{0101}{\=a}
8566
  \DeclareUnicodeCharacter{0102}{\u{A}}
8567
  \DeclareUnicodeCharacter{0103}{\u{a}}
8568
  \DeclareUnicodeCharacter{0104}{\ogonek{A}}
8569
  \DeclareUnicodeCharacter{0105}{\ogonek{a}}
8570
  \DeclareUnicodeCharacter{0106}{\'C}
8571
  \DeclareUnicodeCharacter{0107}{\'c}
8572
  \DeclareUnicodeCharacter{0108}{\^C}
8573
  \DeclareUnicodeCharacter{0109}{\^c}
8574
  \DeclareUnicodeCharacter{0118}{\ogonek{E}}
8575
  \DeclareUnicodeCharacter{0119}{\ogonek{e}}
8576
  \DeclareUnicodeCharacter{010A}{\dotaccent{C}}
8577
  \DeclareUnicodeCharacter{010B}{\dotaccent{c}}
8578
  \DeclareUnicodeCharacter{010C}{\v{C}}
8579
  \DeclareUnicodeCharacter{010D}{\v{c}}
8580
  \DeclareUnicodeCharacter{010E}{\v{D}}
8581
8582
  \DeclareUnicodeCharacter{0112}{\=E}
8583
  \DeclareUnicodeCharacter{0113}{\=e}
8584
  \DeclareUnicodeCharacter{0114}{\u{E}}
8585
  \DeclareUnicodeCharacter{0115}{\u{e}}
8586
  \DeclareUnicodeCharacter{0116}{\dotaccent{E}}
8587
  \DeclareUnicodeCharacter{0117}{\dotaccent{e}}
8588
  \DeclareUnicodeCharacter{011A}{\v{E}}
8589
  \DeclareUnicodeCharacter{011B}{\v{e}}
8590
  \DeclareUnicodeCharacter{011C}{\^G}
8591
  \DeclareUnicodeCharacter{011D}{\^g}
8592
  \DeclareUnicodeCharacter{011E}{\u{G}}
8593
  \DeclareUnicodeCharacter{011F}{\u{g}}
8594
8595
  \DeclareUnicodeCharacter{0120}{\dotaccent{G}}
8596
  \DeclareUnicodeCharacter{0121}{\dotaccent{g}}
8597
  \DeclareUnicodeCharacter{0124}{\^H}
8598
  \DeclareUnicodeCharacter{0125}{\^h}
8599
  \DeclareUnicodeCharacter{0128}{\~I}
8600
  \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}}
8601
  \DeclareUnicodeCharacter{012A}{\=I}
8602
  \DeclareUnicodeCharacter{012B}{\={\dotless{i}}}
8603
  \DeclareUnicodeCharacter{012C}{\u{I}}
8604
  \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}}
8605
8606
  \DeclareUnicodeCharacter{0130}{\dotaccent{I}}
8607
  \DeclareUnicodeCharacter{0131}{\dotless{i}}
8608
  \DeclareUnicodeCharacter{0132}{IJ}
8609
  \DeclareUnicodeCharacter{0133}{ij}
8610
  \DeclareUnicodeCharacter{0134}{\^J}
8611
  \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}}
8612
  \DeclareUnicodeCharacter{0139}{\'L}
8613
  \DeclareUnicodeCharacter{013A}{\'l}
8614
8615
  \DeclareUnicodeCharacter{0141}{\L}
8616
  \DeclareUnicodeCharacter{0142}{\l}
8617
  \DeclareUnicodeCharacter{0143}{\'N}
8618
  \DeclareUnicodeCharacter{0144}{\'n}
8619
  \DeclareUnicodeCharacter{0147}{\v{N}}
8620
  \DeclareUnicodeCharacter{0148}{\v{n}}
8621
  \DeclareUnicodeCharacter{014C}{\=O}
8622
  \DeclareUnicodeCharacter{014D}{\=o}
8623
  \DeclareUnicodeCharacter{014E}{\u{O}}
8624
  \DeclareUnicodeCharacter{014F}{\u{o}}
8625
8626
  \DeclareUnicodeCharacter{0150}{\H{O}}
8627
  \DeclareUnicodeCharacter{0151}{\H{o}}
8628
  \DeclareUnicodeCharacter{0152}{\OE}
8629
  \DeclareUnicodeCharacter{0153}{\oe}
8630
  \DeclareUnicodeCharacter{0154}{\'R}
8631
  \DeclareUnicodeCharacter{0155}{\'r}
8632
  \DeclareUnicodeCharacter{0158}{\v{R}}
8633
  \DeclareUnicodeCharacter{0159}{\v{r}}
8634
  \DeclareUnicodeCharacter{015A}{\'S}
8635
  \DeclareUnicodeCharacter{015B}{\'s}
8636
  \DeclareUnicodeCharacter{015C}{\^S}
8637
  \DeclareUnicodeCharacter{015D}{\^s}
8638
  \DeclareUnicodeCharacter{015E}{\cedilla{S}}
8639
  \DeclareUnicodeCharacter{015F}{\cedilla{s}}
8640
8641
  \DeclareUnicodeCharacter{0160}{\v{S}}
8642
  \DeclareUnicodeCharacter{0161}{\v{s}}
8643
  \DeclareUnicodeCharacter{0162}{\cedilla{t}}
8644
  \DeclareUnicodeCharacter{0163}{\cedilla{T}}
8645
  \DeclareUnicodeCharacter{0164}{\v{T}}
8646
8647
  \DeclareUnicodeCharacter{0168}{\~U}
8648
  \DeclareUnicodeCharacter{0169}{\~u}
8649
  \DeclareUnicodeCharacter{016A}{\=U}
8650
  \DeclareUnicodeCharacter{016B}{\=u}
8651
  \DeclareUnicodeCharacter{016C}{\u{U}}
8652
  \DeclareUnicodeCharacter{016D}{\u{u}}
8653
  \DeclareUnicodeCharacter{016E}{\ringaccent{U}}
8654
  \DeclareUnicodeCharacter{016F}{\ringaccent{u}}
8655
8656
  \DeclareUnicodeCharacter{0170}{\H{U}}
8657
  \DeclareUnicodeCharacter{0171}{\H{u}}
8658
  \DeclareUnicodeCharacter{0174}{\^W}
8659
  \DeclareUnicodeCharacter{0175}{\^w}
8660
  \DeclareUnicodeCharacter{0176}{\^Y}
8661
  \DeclareUnicodeCharacter{0177}{\^y}
8662
  \DeclareUnicodeCharacter{0178}{\"Y}
8663
  \DeclareUnicodeCharacter{0179}{\'Z}
8664
  \DeclareUnicodeCharacter{017A}{\'z}
8665
  \DeclareUnicodeCharacter{017B}{\dotaccent{Z}}
8666
  \DeclareUnicodeCharacter{017C}{\dotaccent{z}}
8667
  \DeclareUnicodeCharacter{017D}{\v{Z}}
8668
  \DeclareUnicodeCharacter{017E}{\v{z}}
8669
8670
  \DeclareUnicodeCharacter{01C4}{D\v{Z}}
8671
  \DeclareUnicodeCharacter{01C5}{D\v{z}}
8672
  \DeclareUnicodeCharacter{01C6}{d\v{z}}
8673
  \DeclareUnicodeCharacter{01C7}{LJ}
8674
  \DeclareUnicodeCharacter{01C8}{Lj}
8675
  \DeclareUnicodeCharacter{01C9}{lj}
8676
  \DeclareUnicodeCharacter{01CA}{NJ}
8677
  \DeclareUnicodeCharacter{01CB}{Nj}
8678
  \DeclareUnicodeCharacter{01CC}{nj}
8679
  \DeclareUnicodeCharacter{01CD}{\v{A}}
8680
  \DeclareUnicodeCharacter{01CE}{\v{a}}
8681
  \DeclareUnicodeCharacter{01CF}{\v{I}}
8682
8683
  \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}}
8684
  \DeclareUnicodeCharacter{01D1}{\v{O}}
8685
  \DeclareUnicodeCharacter{01D2}{\v{o}}
8686
  \DeclareUnicodeCharacter{01D3}{\v{U}}
8687
  \DeclareUnicodeCharacter{01D4}{\v{u}}
8688
8689
  \DeclareUnicodeCharacter{01E2}{\={\AE}}
8690
  \DeclareUnicodeCharacter{01E3}{\={\ae}}
8691
  \DeclareUnicodeCharacter{01E6}{\v{G}}
8692
  \DeclareUnicodeCharacter{01E7}{\v{g}}
8693
  \DeclareUnicodeCharacter{01E8}{\v{K}}
8694
  \DeclareUnicodeCharacter{01E9}{\v{k}}
8695
8696
  \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}}
8697
  \DeclareUnicodeCharacter{01F1}{DZ}
8698
  \DeclareUnicodeCharacter{01F2}{Dz}
8699
  \DeclareUnicodeCharacter{01F3}{dz}
8700
  \DeclareUnicodeCharacter{01F4}{\'G}
8701
  \DeclareUnicodeCharacter{01F5}{\'g}
8702
  \DeclareUnicodeCharacter{01F8}{\`N}
8703
  \DeclareUnicodeCharacter{01F9}{\`n}
8704
  \DeclareUnicodeCharacter{01FC}{\'{\AE}}
8705
  \DeclareUnicodeCharacter{01FD}{\'{\ae}}
8706
  \DeclareUnicodeCharacter{01FE}{\'{\O}}
8707
  \DeclareUnicodeCharacter{01FF}{\'{\o}}
8708
8709
  \DeclareUnicodeCharacter{021E}{\v{H}}
8710
  \DeclareUnicodeCharacter{021F}{\v{h}}
8711
8712
  \DeclareUnicodeCharacter{0226}{\dotaccent{A}}
8713
  \DeclareUnicodeCharacter{0227}{\dotaccent{a}}
8714
  \DeclareUnicodeCharacter{0228}{\cedilla{E}}
8715
  \DeclareUnicodeCharacter{0229}{\cedilla{e}}
8716
  \DeclareUnicodeCharacter{022E}{\dotaccent{O}}
8717
  \DeclareUnicodeCharacter{022F}{\dotaccent{o}}
8718
8719
  \DeclareUnicodeCharacter{0232}{\=Y}
8720
  \DeclareUnicodeCharacter{0233}{\=y}
8721
  \DeclareUnicodeCharacter{0237}{\dotless{j}}
8722
8723
  \DeclareUnicodeCharacter{02DB}{\ogonek{ }}
8724
8725
  \DeclareUnicodeCharacter{1E02}{\dotaccent{B}}
8726
  \DeclareUnicodeCharacter{1E03}{\dotaccent{b}}
8727
  \DeclareUnicodeCharacter{1E04}{\udotaccent{B}}
8728
  \DeclareUnicodeCharacter{1E05}{\udotaccent{b}}
8729
  \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}}
8730
  \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}}
8731
  \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}}
8732
  \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}}
8733
  \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}}
8734
  \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}}
8735
  \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}}
8736
  \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}}
8737
8738
  \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}}
8739
  \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}}
8740
8741
  \DeclareUnicodeCharacter{1E20}{\=G}
8742
  \DeclareUnicodeCharacter{1E21}{\=g}
8743
  \DeclareUnicodeCharacter{1E22}{\dotaccent{H}}
8744
  \DeclareUnicodeCharacter{1E23}{\dotaccent{h}}
8745
  \DeclareUnicodeCharacter{1E24}{\udotaccent{H}}
8746
  \DeclareUnicodeCharacter{1E25}{\udotaccent{h}}
8747
  \DeclareUnicodeCharacter{1E26}{\"H}
8748
  \DeclareUnicodeCharacter{1E27}{\"h}
8749
8750
  \DeclareUnicodeCharacter{1E30}{\'K}
8751
  \DeclareUnicodeCharacter{1E31}{\'k}
8752
  \DeclareUnicodeCharacter{1E32}{\udotaccent{K}}
8753
  \DeclareUnicodeCharacter{1E33}{\udotaccent{k}}
8754
  \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}}
8755
  \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}}
8756
  \DeclareUnicodeCharacter{1E36}{\udotaccent{L}}
8757
  \DeclareUnicodeCharacter{1E37}{\udotaccent{l}}
8758
  \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}}
8759
  \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}}
8760
  \DeclareUnicodeCharacter{1E3E}{\'M}
8761
  \DeclareUnicodeCharacter{1E3F}{\'m}
8762
8763
  \DeclareUnicodeCharacter{1E40}{\dotaccent{M}}
8764
  \DeclareUnicodeCharacter{1E41}{\dotaccent{m}}
8765
  \DeclareUnicodeCharacter{1E42}{\udotaccent{M}}
8766
  \DeclareUnicodeCharacter{1E43}{\udotaccent{m}}
8767
  \DeclareUnicodeCharacter{1E44}{\dotaccent{N}}
8768
  \DeclareUnicodeCharacter{1E45}{\dotaccent{n}}
8769
  \DeclareUnicodeCharacter{1E46}{\udotaccent{N}}
8770
  \DeclareUnicodeCharacter{1E47}{\udotaccent{n}}
8771
  \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}}
8772
  \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}}
8773
8774
  \DeclareUnicodeCharacter{1E54}{\'P}
8775
  \DeclareUnicodeCharacter{1E55}{\'p}
8776
  \DeclareUnicodeCharacter{1E56}{\dotaccent{P}}
8777
  \DeclareUnicodeCharacter{1E57}{\dotaccent{p}}
8778
  \DeclareUnicodeCharacter{1E58}{\dotaccent{R}}
8779
  \DeclareUnicodeCharacter{1E59}{\dotaccent{r}}
8780
  \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}}
8781
  \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}}
8782
  \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}}
8783
  \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}}
8784
8785
  \DeclareUnicodeCharacter{1E60}{\dotaccent{S}}
8786
  \DeclareUnicodeCharacter{1E61}{\dotaccent{s}}
8787
  \DeclareUnicodeCharacter{1E62}{\udotaccent{S}}
8788
  \DeclareUnicodeCharacter{1E63}{\udotaccent{s}}
8789
  \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}}
8790
  \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}}
8791
  \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}}
8792
  \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}}
8793
  \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}}
8794
  \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}}
8795
8796
  \DeclareUnicodeCharacter{1E7C}{\~V}
8797
  \DeclareUnicodeCharacter{1E7D}{\~v}
8798
  \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}}
8799
  \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}}
8800
8801
  \DeclareUnicodeCharacter{1E80}{\`W}
8802
  \DeclareUnicodeCharacter{1E81}{\`w}
8803
  \DeclareUnicodeCharacter{1E82}{\'W}
8804
  \DeclareUnicodeCharacter{1E83}{\'w}
8805
  \DeclareUnicodeCharacter{1E84}{\"W}
8806
  \DeclareUnicodeCharacter{1E85}{\"w}
8807
  \DeclareUnicodeCharacter{1E86}{\dotaccent{W}}
8808
  \DeclareUnicodeCharacter{1E87}{\dotaccent{w}}
8809
  \DeclareUnicodeCharacter{1E88}{\udotaccent{W}}
8810
  \DeclareUnicodeCharacter{1E89}{\udotaccent{w}}
8811
  \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}}
8812
  \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}}
8813
  \DeclareUnicodeCharacter{1E8C}{\"X}
8814
  \DeclareUnicodeCharacter{1E8D}{\"x}
8815
  \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}}
8816
  \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}}
8817
8818
  \DeclareUnicodeCharacter{1E90}{\^Z}
8819
  \DeclareUnicodeCharacter{1E91}{\^z}
8820
  \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}}
8821
  \DeclareUnicodeCharacter{1E93}{\udotaccent{z}}
8822
  \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}}
8823
  \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}}
8824
  \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}}
8825
  \DeclareUnicodeCharacter{1E97}{\"t}
8826
  \DeclareUnicodeCharacter{1E98}{\ringaccent{w}}
8827
  \DeclareUnicodeCharacter{1E99}{\ringaccent{y}}
8828
8829
  \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}}
8830
  \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}}
8831
8832
  \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}}
8833
  \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}}
8834
  \DeclareUnicodeCharacter{1EBC}{\~E}
8835
  \DeclareUnicodeCharacter{1EBD}{\~e}
8836
8837
  \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}}
8838
  \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}}
8839
  \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}}
8840
  \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}}
8841
8842
  \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}}
8843
  \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}}
8844
8845
  \DeclareUnicodeCharacter{1EF2}{\`Y}
8846
  \DeclareUnicodeCharacter{1EF3}{\`y}
8847
  \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}}
8848
8849
  \DeclareUnicodeCharacter{1EF8}{\~Y}
8850
  \DeclareUnicodeCharacter{1EF9}{\~y}
8851
8852
  \DeclareUnicodeCharacter{2013}{--}
8853
  \DeclareUnicodeCharacter{2014}{---}
8854
  \DeclareUnicodeCharacter{2018}{\quoteleft}
8855
  \DeclareUnicodeCharacter{2019}{\quoteright}
8856
  \DeclareUnicodeCharacter{201A}{\quotesinglbase}
8857
  \DeclareUnicodeCharacter{201C}{\quotedblleft}
8858
  \DeclareUnicodeCharacter{201D}{\quotedblright}
8859
  \DeclareUnicodeCharacter{201E}{\quotedblbase}
8860
  \DeclareUnicodeCharacter{2022}{\bullet}
8861
  \DeclareUnicodeCharacter{2026}{\dots}
8862
  \DeclareUnicodeCharacter{2039}{\guilsinglleft}
8863
  \DeclareUnicodeCharacter{203A}{\guilsinglright}
8864
  \DeclareUnicodeCharacter{20AC}{\euro}
8865
8866
  \DeclareUnicodeCharacter{2192}{\expansion}
8867
  \DeclareUnicodeCharacter{21D2}{\result}
8868
8869
  \DeclareUnicodeCharacter{2212}{\minus}
8870
  \DeclareUnicodeCharacter{2217}{\point}
8871
  \DeclareUnicodeCharacter{2261}{\equiv}
8872
}% end of \utfeightchardefs
8873
8874
8875
% US-ASCII character definitions.
8876
\def\asciichardefs{% nothing need be done
8877
   \relax
8878
}
8879
8880
% Make non-ASCII characters printable again for compatibility with
8881
% existing Texinfo documents that may use them, even without declaring a
8882
% document encoding.
6380
%
8883
%
8884
\setnonasciicharscatcode \other
8885
8886
8887
\message{formatting,}
8888
6381
\newdimen\defaultparindent \defaultparindent = 15pt
8889
\newdimen\defaultparindent \defaultparindent = 15pt
6382
8890
6383
\chapheadingskip = 15pt plus 4pt minus 2pt
8891
\chapheadingskip = 15pt plus 4pt minus 2pt
Lines 6390-6396 Link Here
6390
% Don't be so finicky about underfull hboxes, either.
8898
% Don't be so finicky about underfull hboxes, either.
6391
\hbadness = 2000
8899
\hbadness = 2000
6392
8900
6393
% Following George Bush, just get rid of widows and orphans.
8901
% Following George Bush, get rid of widows and orphans.
6394
\widowpenalty=10000
8902
\widowpenalty=10000
6395
\clubpenalty=10000
8903
\clubpenalty=10000
6396
8904
Lines 6408-6416 Link Here
6408
  \fi
8916
  \fi
6409
}
8917
}
6410
8918
6411
% Parameters in order: 1) textheight; 2) textwidth; 3) voffset;
8919
% Parameters in order: 1) textheight; 2) textwidth;
6412
% 4) hoffset; 5) binding offset; 6) topskip; 7) physical page height; 8)
8920
% 3) voffset; 4) hoffset; 5) binding offset; 6) topskip;
6413
% physical page width.
8921
% 7) physical page height; 8) physical page width.
6414
%
8922
%
6415
% We also call \setleading{\textleading}, so the caller should define
8923
% We also call \setleading{\textleading}, so the caller should define
6416
% \textleading.  The caller should also set \parskip.
8924
% \textleading.  The caller should also set \parskip.
Lines 6437-6442 Link Here
6437
  \ifpdf
8945
  \ifpdf
6438
    \pdfpageheight #7\relax
8946
    \pdfpageheight #7\relax
6439
    \pdfpagewidth #8\relax
8947
    \pdfpagewidth #8\relax
8948
    % if we don't reset these, they will remain at "1 true in" of
8949
    % whatever layout pdftex was dumped with.
8950
    \pdfhorigin = 1 true in
8951
    \pdfvorigin = 1 true in
6440
  \fi
8952
  \fi
6441
  %
8953
  %
6442
  \setleading{\textleading}
8954
  \setleading{\textleading}
Lines 6451-6469 Link Here
6451
  \textleading = 13.2pt
8963
  \textleading = 13.2pt
6452
  %
8964
  %
6453
  % If page is nothing but text, make it come out even.
8965
  % If page is nothing but text, make it come out even.
6454
  \internalpagesizes{46\baselineskip}{6in}%
8966
  \internalpagesizes{607.2pt}{6in}% that's 46 lines
6455
                    {\voffset}{.25in}%
8967
                    {\voffset}{.25in}%
6456
                    {\bindingoffset}{36pt}%
8968
                    {\bindingoffset}{36pt}%
6457
                    {11in}{8.5in}%
8969
                    {11in}{8.5in}%
6458
}}
8970
}}
6459
8971
6460
% Use @smallbook to reset parameters for 7x9.5 (or so) format.
8972
% Use @smallbook to reset parameters for 7x9.25 trim size.
6461
\def\smallbook{{\globaldefs = 1
8973
\def\smallbook{{\globaldefs = 1
6462
  \parskip = 2pt plus 1pt
8974
  \parskip = 2pt plus 1pt
6463
  \textleading = 12pt
8975
  \textleading = 12pt
6464
  %
8976
  %
6465
  \internalpagesizes{7.5in}{5in}%
8977
  \internalpagesizes{7.5in}{5in}%
6466
                    {\voffset}{.25in}%
8978
                    {-.2in}{0in}%
6467
                    {\bindingoffset}{16pt}%
8979
                    {\bindingoffset}{16pt}%
6468
                    {9.25in}{7in}%
8980
                    {9.25in}{7in}%
6469
  %
8981
  %
Lines 6474-6479 Link Here
6474
  \defbodyindent = .5cm
8986
  \defbodyindent = .5cm
6475
}}
8987
}}
6476
8988
8989
% Use @smallerbook to reset parameters for 6x9 trim size.
8990
% (Just testing, parameters still in flux.)
8991
\def\smallerbook{{\globaldefs = 1
8992
  \parskip = 1.5pt plus 1pt
8993
  \textleading = 12pt
8994
  %
8995
  \internalpagesizes{7.4in}{4.8in}%
8996
                    {-.2in}{-.4in}%
8997
                    {0pt}{14pt}%
8998
                    {9in}{6in}%
8999
  %
9000
  \lispnarrowing = 0.25in
9001
  \tolerance = 700
9002
  \hfuzz = 1pt
9003
  \contentsrightmargin = 0pt
9004
  \defbodyindent = .4cm
9005
}}
9006
6477
% Use @afourpaper to print on European A4 paper.
9007
% Use @afourpaper to print on European A4 paper.
6478
\def\afourpaper{{\globaldefs = 1
9008
\def\afourpaper{{\globaldefs = 1
6479
  \parskip = 3pt plus 2pt minus 1pt
9009
  \parskip = 3pt plus 2pt minus 1pt
Lines 6489-6495 Link Here
6489
  % \global\normaloffset = -6mm
9019
  % \global\normaloffset = -6mm
6490
  % \global\bindingoffset = 10mm
9020
  % \global\bindingoffset = 10mm
6491
  % @end tex
9021
  % @end tex
6492
  \internalpagesizes{51\baselineskip}{160mm}
9022
  \internalpagesizes{673.2pt}{160mm}% that's 51 lines
6493
                    {\voffset}{\hoffset}%
9023
                    {\voffset}{\hoffset}%
6494
                    {\bindingoffset}{44pt}%
9024
                    {\bindingoffset}{44pt}%
6495
                    {297mm}{210mm}%
9025
                    {297mm}{210mm}%
Lines 6546-6553 Link Here
6546
% Perhaps we should allow setting the margins, \topskip, \parskip,
9076
% Perhaps we should allow setting the margins, \topskip, \parskip,
6547
% and/or leading, also. Or perhaps we should compute them somehow.
9077
% and/or leading, also. Or perhaps we should compute them somehow.
6548
%
9078
%
6549
\def\pagesizes{\parsearg\pagesizesxxx}
9079
\parseargdef\pagesizes{\pagesizesyyy #1,,\finish}
6550
\def\pagesizesxxx#1{\pagesizesyyy #1,,\finish}
6551
\def\pagesizesyyy#1,#2,#3\finish{{%
9080
\def\pagesizesyyy#1,#2,#3\finish{{%
6552
  \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
9081
  \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
6553
  \globaldefs = 1
9082
  \globaldefs = 1
Lines 6555-6561 Link Here
6555
  \parskip = 3pt plus 2pt minus 1pt
9084
  \parskip = 3pt plus 2pt minus 1pt
6556
  \setleading{\textleading}%
9085
  \setleading{\textleading}%
6557
  %
9086
  %
6558
  \dimen0 = #1
9087
  \dimen0 = #1\relax
6559
  \advance\dimen0 by \voffset
9088
  \advance\dimen0 by \voffset
6560
  %
9089
  %
6561
  \dimen2 = \hsize
9090
  \dimen2 = \hsize
Lines 6574-6579 Link Here
6574
9103
6575
\message{and turning on texinfo input format.}
9104
\message{and turning on texinfo input format.}
6576
9105
9106
% DEL is a comment character, in case @c does not suffice.
9107
\catcode`\^^? = 14
9108
6577
% Define macros to output various characters with catcode for normal text.
9109
% Define macros to output various characters with catcode for normal text.
6578
\catcode`\"=\other
9110
\catcode`\"=\other
6579
\catcode`\~=\other
9111
\catcode`\~=\other
Lines 6594-6601 Link Here
6594
\def\normalplus{+}
9126
\def\normalplus{+}
6595
\def\normaldollar{$}%$ font-lock fix
9127
\def\normaldollar{$}%$ font-lock fix
6596
9128
6597
% This macro is used to make a character print one way in ttfont
9129
% This macro is used to make a character print one way in \tt
6598
% where it can probably just be output, and another way in other fonts,
9130
% (where it can probably be output as-is), and another way in other fonts,
6599
% where something hairier probably needs to be done.
9131
% where something hairier probably needs to be done.
6600
%
9132
%
6601
% #1 is what to print if we are indeed using \tt; #2 is what to print
9133
% #1 is what to print if we are indeed using \tt; #2 is what to print
Lines 6627-6632 Link Here
6627
9159
6628
\catcode`\_=\active
9160
\catcode`\_=\active
6629
\def_{\ifusingtt\normalunderscore\_}
9161
\def_{\ifusingtt\normalunderscore\_}
9162
\let\realunder=_
6630
% Subroutine for the previous macro.
9163
% Subroutine for the previous macro.
6631
\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }
9164
\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }
6632
9165
Lines 6643-6688 Link Here
6643
\catcode`\$=\active
9176
\catcode`\$=\active
6644
\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix
9177
\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix
6645
9178
6646
% Set up an active definition for =, but don't enable it most of the time.
6647
{\catcode`\==\active
6648
\global\def={{\tt \char 61}}}
6649
6650
\catcode`+=\active
6651
\catcode`\_=\active
6652
6653
% If a .fmt file is being used, characters that might appear in a file
9179
% If a .fmt file is being used, characters that might appear in a file
6654
% name cannot be active until we have parsed the command line.
9180
% name cannot be active until we have parsed the command line.
6655
% So turn them off again, and have \everyjob (or @setfilename) turn them on.
9181
% So turn them off again, and have \everyjob (or @setfilename) turn them on.
6656
% \otherifyactive is called near the end of this file.
9182
% \otherifyactive is called near the end of this file.
6657
\def\otherifyactive{\catcode`+=\other \catcode`\_=\other}
9183
\def\otherifyactive{\catcode`+=\other \catcode`\_=\other}
6658
9184
9185
% Used sometimes to turn off (effectively) the active characters even after
9186
% parsing them.
9187
\def\turnoffactive{%
9188
  \normalturnoffactive
9189
  \otherbackslash
9190
}
9191
6659
\catcode`\@=0
9192
\catcode`\@=0
6660
9193
6661
% \rawbackslashxx outputs one backslash character in current font,
9194
% \backslashcurfont outputs one backslash character in current font,
6662
% as in \char`\\.
9195
% as in \char`\\.
6663
\global\chardef\rawbackslashxx=`\\
9196
\global\chardef\backslashcurfont=`\\
6664
9197
\global\let\rawbackslashxx=\backslashcurfont  % let existing .??s files work
6665
% \rawbackslash defines an active \ to do \rawbackslashxx.
6666
% \otherbackslash defines an active \ to be a literal `\' character with
6667
% catcode other.
6668
{\catcode`\\=\active
6669
 @gdef@rawbackslash{@let\=@rawbackslashxx}
6670
 @gdef@otherbackslash{@let\=@realbackslash}
6671
}
6672
6673
% \realbackslash is an actual character `\' with catcode other.
6674
{\catcode`\\=\other @gdef@realbackslash{\}}
6675
9198
6676
% \normalbackslash outputs one backslash in fixed width font.
9199
% \realbackslash is an actual character `\' with catcode other, and
6677
\def\normalbackslash{{\tt\rawbackslashxx}}
9200
% \doublebackslash is two of them (for the pdf outlines).
9201
{\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}}
6678
9202
9203
% In texinfo, backslash is an active character; it prints the backslash
9204
% in fixed width font.
6679
\catcode`\\=\active
9205
\catcode`\\=\active
9206
@def@normalbackslash{{@tt@backslashcurfont}}
9207
% On startup, @fixbackslash assigns:
9208
%  @let \ = @normalbackslash
9209
9210
% \rawbackslash defines an active \ to do \backslashcurfont.
9211
% \otherbackslash defines an active \ to be a literal `\' character with
9212
% catcode other.
9213
@gdef@rawbackslash{@let\=@backslashcurfont}
9214
@gdef@otherbackslash{@let\=@realbackslash}
6680
9215
6681
% Used sometimes to turn off (effectively) the active characters
9216
% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of
6682
% even after parsing them.
9217
% the literal character `\'.
6683
@def@turnoffactive{%
9218
%
9219
@def@normalturnoffactive{%
9220
  @let\=@normalbackslash
6684
  @let"=@normaldoublequote
9221
  @let"=@normaldoublequote
6685
  @let\=@realbackslash
6686
  @let~=@normaltilde
9222
  @let~=@normaltilde
6687
  @let^=@normalcaret
9223
  @let^=@normalcaret
6688
  @let_=@normalunderscore
9224
  @let_=@normalunderscore
Lines 6691-6704 Link Here
6691
  @let>=@normalgreater
9227
  @let>=@normalgreater
6692
  @let+=@normalplus
9228
  @let+=@normalplus
6693
  @let$=@normaldollar %$ font-lock fix
9229
  @let$=@normaldollar %$ font-lock fix
9230
  @markupsetuplqdefault
9231
  @markupsetuprqdefault
9232
  @unsepspaces
6694
}
9233
}
6695
9234
6696
% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of
6697
% the literal character `\'.  (Thus, \ is not expandable when this is in
6698
% effect.)
6699
%
6700
@def@normalturnoffactive{@turnoffactive @let\=@normalbackslash}
6701
6702
% Make _ and + \other characters, temporarily.
9235
% Make _ and + \other characters, temporarily.
6703
% This is canceled by @fixbackslash.
9236
% This is canceled by @fixbackslash.
6704
@otherifyactive
9237
@otherifyactive
Lines 6711-6719 Link Here
6711
@global@let\ = @eatinput
9244
@global@let\ = @eatinput
6712
9245
6713
% On the other hand, perhaps the file did not have a `\input texinfo'. Then
9246
% On the other hand, perhaps the file did not have a `\input texinfo'. Then
6714
% the first `\{ in the file would cause an error. This macro tries to fix
9247
% the first `\' in the file would cause an error. This macro tries to fix
6715
% that, assuming it is called before the first `\' could plausibly occur.
9248
% that, assuming it is called before the first `\' could plausibly occur.
6716
% Also back turn on active characters that might appear in the input
9249
% Also turn back on active characters that might appear in the input
6717
% file name, in case not using a pre-dumped format.
9250
% file name, in case not using a pre-dumped format.
6718
%
9251
%
6719
@gdef@fixbackslash{%
9252
@gdef@fixbackslash{%
Lines 6730-6744 Link Here
6730
@catcode`@# = @other
9263
@catcode`@# = @other
6731
@catcode`@% = @other
9264
@catcode`@% = @other
6732
9265
6733
@c Set initial fonts.
9266
@c Finally, make ` and ' active, so that txicodequoteundirected and
6734
@textfonts
9267
@c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}.  If we
6735
@rm
9268
@c don't make ` and ' active, @code will not get them as active chars.
9269
@c Do this last of all since we use ` in the previous @catcode assignments.
9270
@catcode`@'=@active
9271
@catcode`@`=@active
9272
@markupsetuplqdefault
9273
@markupsetuprqdefault
6736
9274
9275
@c Gnulib now utterly and painfully insists on no trailing whitespace.
9276
@c So we have to nuke it.
6737
9277
6738
@c Local variables:
9278
@c Local variables:
6739
@c eval: (add-hook 'write-file-hooks 'time-stamp)
9279
@c eval: (add-hook 'write-file-hooks 'time-stamp)
9280
@c eval: (add-hook 'write-file-hooks 'nuke-trailing-whitespace)
6740
@c page-delimiter: "^\\\\message"
9281
@c page-delimiter: "^\\\\message"
6741
@c time-stamp-start: "def\\\\texinfoversion{"
9282
@c time-stamp-start: "def\\\\texinfoversion{"
6742
@c time-stamp-format: "%:y-%02m-%02d.%02H"
9283
@c time-stamp-format: "%:y-%02m-%02d.%02H"
6743
@c time-stamp-end: "}"
9284
@c time-stamp-end: "}"
6744
@c End:
9285
@c End:
9286
9287
@c vim:sw=2:
9288
9289
@ignore
9290
   arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115
9291
@end ignore

Return to bug 228205