~ubuntu-branches/ubuntu/raring/fftw3/raring-proposed

« back to all changes in this revision

Viewing changes to doc/texinfo.tex

  • Committer: Bazaar Package Importer
  • Author(s): Paul Brossier
  • Date: 2006-05-31 13:44:05 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20060531134405-ol9hrbg6bh81sg0c
Tags: 3.1.1-1
* New upstream release (closes: #350327, #338487, #338501)
* Add --enable-portable-binary to use -mtune instead of -march
* Use --with-gcc-arch=G5 / pentium4 on powerpc / i386
* Updated Standards-Version

Show diffs side-by-side

added added

removed removed

Lines of Context:
3
3
% Load plain if necessary, i.e., if running under initex.
4
4
\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
5
5
%
6
 
\def\texinfoversion{2003-02-03.16}
 
6
\def\texinfoversion{2004-05-16.08}
7
7
%
8
8
% Copyright (C) 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 Free Software
 
10
% Foundation, Inc.
10
11
%
11
12
% This texinfo.tex file is free software; you can redistribute it and/or
12
13
% modify it under the terms of the GNU General Public License as
23
24
% to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
24
25
% Boston, MA 02111-1307, USA.
25
26
%
26
 
% In other words, you are welcome to use, share and improve this program.
27
 
% You are forbidden to forbid anyone else to use, share and improve
28
 
% what you give them.   Help stamp out software-hoarding!
 
27
% As a special exception, when this file is read by TeX when processing
 
28
% a Texinfo source document, you may use the result without
 
29
% restriction.  (This has been our intent since Texinfo was invented.)
29
30
%
30
31
% Please try the latest version of texinfo.tex before submitting bug
31
32
% reports; you can get the latest version from:
32
 
%   ftp://ftp.gnu.org/gnu/texinfo/texinfo.tex
33
 
%     (and all GNU mirrors, see http://www.gnu.org/order/ftp.html)
 
33
%   http://www.gnu.org/software/texinfo/ (the Texinfo home page), or
34
34
%   ftp://tug.org/tex/texinfo.tex
35
 
%     (and all CTAN mirrors, see http://www.ctan.org),
36
 
%   and /home/gd/gnu/doc/texinfo.tex on the GNU machines.
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
 
35
%     (and all CTAN mirrors, see http://www.ctan.org).
 
36
% The texinfo.tex in any given distribution could well be out
41
37
% of date, so if that's what you're using, please check.
42
 
 
38
%
43
39
% Send bug reports to bug-texinfo@gnu.org.  Please include including a
44
40
% complete document in each bug report with which we can reproduce the
45
41
% problem.  Patches are, of course, greatly appreciated.
55
51
% The extra TeX runs get the cross-reference information correct.
56
52
% Sometimes one run after texindex suffices, and sometimes you need more
57
53
% than two; texi2dvi does it as many times as necessary.
58
 
 
54
%
59
55
% It is possible to adapt texinfo.tex for other languages, to some
60
56
% extent.  You can get the existing language-specific files from the
61
57
% full Texinfo distribution.
 
58
%
 
59
% The GNU Texinfo home page is http://www.gnu.org/software/texinfo.
 
60
 
62
61
 
63
62
\message{Loading texinfo [version \texinfoversion]:}
64
63
 
71
70
\message{Basics,}
72
71
\chardef\other=12
73
72
 
74
 
% We never want plain's outer \+ definition in Texinfo.
 
73
% We never want plain's \outer definition of \+ in Texinfo.
75
74
% For @tex, we can use \tabalign.
76
75
\let\+ = \relax
77
76
 
78
 
% Save some parts of plain tex whose names we will redefine.
 
77
% Save some plain tex macros whose names we will redefine.
79
78
\let\ptexb=\b
80
79
\let\ptexbullet=\bullet
81
80
\let\ptexc=\c
85
84
\let\ptexend=\end
86
85
\let\ptexequiv=\equiv
87
86
\let\ptexexclam=\!
 
87
\let\ptexfootnote=\footnote
88
88
\let\ptexgtr=>
89
89
\let\ptexhat=^
90
90
\let\ptexi=\i
 
91
\let\ptexindent=\indent
 
92
\let\ptexnoindent=\noindent
 
93
\let\ptexinsert=\insert
91
94
\let\ptexlbrace=\{
92
95
\let\ptexless=<
93
96
\let\ptexplus=+
94
97
\let\ptexrbrace=\}
 
98
\let\ptexslash=\/
95
99
\let\ptexstar=\*
96
100
\let\ptext=\t
97
101
 
99
103
% starts a new line in the output.
100
104
\newlinechar = `^^J
101
105
 
 
106
% Use TeX 3.0's \inputlineno to get the line number, for better error
 
107
% messages, but if we're using an old version of TeX, don't do anything.
 
108
%
 
109
\ifx\inputlineno\thisisundefined
 
110
  \let\linenumber = \empty % Pre-3.0.
 
111
\else
 
112
  \def\linenumber{l.\the\inputlineno:\space}
 
113
\fi
 
114
 
102
115
% Set up fixed words for English if not already set.
103
116
\ifx\putwordAppendix\undefined  \gdef\putwordAppendix{Appendix}\fi
104
117
\ifx\putwordChapter\undefined   \gdef\putwordChapter{Chapter}\fi
137
150
\ifx\putwordDefspec\undefined   \gdef\putwordDefspec{Special Form}\fi
138
151
\ifx\putwordDefvar\undefined    \gdef\putwordDefvar{Variable}\fi
139
152
\ifx\putwordDefopt\undefined    \gdef\putwordDefopt{User Option}\fi
140
 
\ifx\putwordDeftypevar\undefined\gdef\putwordDeftypevar{Variable}\fi
141
153
\ifx\putwordDeffunc\undefined   \gdef\putwordDeffunc{Function}\fi
142
 
\ifx\putwordDeftypefun\undefined\gdef\putwordDeftypefun{Function}\fi
143
154
 
144
155
% In some macros, we cannot use the `\? notation---the left quote is
145
156
% in some cases the escape char.
146
157
\chardef\colonChar = `\:
147
158
\chardef\commaChar = `\,
148
159
\chardef\dotChar   = `\.
149
 
\chardef\equalChar = `\=
150
160
\chardef\exclamChar= `\!
151
161
\chardef\questChar = `\?
152
162
\chardef\semiChar  = `\;
 
163
\chardef\underChar = `\_
 
164
 
153
165
\chardef\spaceChar = `\ %
154
 
\chardef\underChar = `\_
 
166
\chardef\spacecat = 10
 
167
\def\spaceisspace{\catcode\spaceChar=\spacecat}
155
168
 
156
169
% Ignore a token.
157
170
%
158
171
\def\gobble#1{}
159
172
 
160
 
% True if #1 is the empty string, i.e., called like `\ifempty{}'.
161
 
%
162
 
\def\ifempty#1{\ifemptyx #1\emptymarkA\emptymarkB}%
163
 
\def\ifemptyx#1#2\emptymarkB{\ifx #1\emptymarkA}%
 
173
% The following is used inside several \edef's.
 
174
\def\makecsname#1{\expandafter\noexpand\csname#1\endcsname}
164
175
 
165
176
% Hyphenation fixes.
166
 
\hyphenation{ap-pen-dix}
167
 
\hyphenation{mini-buf-fer mini-buf-fers}
168
 
\hyphenation{eshell}
169
 
\hyphenation{white-space}
 
177
\hyphenation{
 
178
  Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script
 
179
  ap-pen-dix bit-map bit-maps
 
180
  data-base data-bases eshell fall-ing half-way long-est man-u-script
 
181
  man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm
 
182
  par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces
 
183
  spell-ing spell-ings
 
184
  stand-alone strong-est time-stamp time-stamps which-ever white-space
 
185
  wide-spread wrap-around
 
186
}
170
187
 
171
188
% Margin to add to right of even pages, to left of odd pages.
172
189
\newdimen\bindingoffset
173
190
\newdimen\normaloffset
174
191
\newdimen\pagewidth \newdimen\pageheight
175
192
 
 
193
% For a final copy, take out the rectangles
 
194
% that mark overfull boxes (in case you have decided
 
195
% that the text looks ok even though it passes the margin).
 
196
%
 
197
\def\finalout{\overfullrule=0pt}
 
198
 
 
199
% @| inserts a changebar to the left of the current line.  It should
 
200
% surround any changed text.  This approach does *not* work if the
 
201
% change spans more than two lines of output.  To handle that, we would
 
202
% have adopt a much more difficult approach (putting marks into the main
 
203
% vertical list for the beginning and end of each change).
 
204
%
 
205
\def\|{%
 
206
  % \vadjust can only be used in horizontal mode.
 
207
  \leavevmode
 
208
  %
 
209
  % Append this vertical mode material after the current line in the output.
 
210
  \vadjust{%
 
211
    % We want to insert a rule with the height and depth of the current
 
212
    % leading; that is exactly what \strutbox is supposed to record.
 
213
    \vskip-\baselineskip
 
214
    %
 
215
    % \vadjust-items are inserted at the left edge of the type.  So
 
216
    % the \llap here moves out into the left-hand margin.
 
217
    \llap{%
 
218
      %
 
219
      % For a thicker or thinner bar, change the `1pt'.
 
220
      \vrule height\baselineskip width1pt
 
221
      %
 
222
      % This is the space between the bar and the text.
 
223
      \hskip 12pt
 
224
    }%
 
225
  }%
 
226
}
 
227
 
176
228
% Sometimes it is convenient to have everything in the transcript file
177
229
% and nothing on the terminal.  We don't just call \tracingall here,
178
230
% since that produces some useless output on the terminal.  We also make
197
249
    \tracingassigns1
198
250
  \fi
199
251
  \tracingcommands3  % 3 gives us more in etex
200
 
  \errorcontextlines\maxdimen
 
252
  \errorcontextlines16
201
253
}%
202
254
 
203
255
% add check for \lastpenalty to plain's definitions.  If the last thing
204
256
% we did was a \nobreak, we don't want to insert more space.
205
 
 
257
%
206
258
\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount
207
259
  \removelastskip\penalty-50\smallskip\fi\fi}
208
260
\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount
255
307
                   % the page break happens to be in the middle of an example.
256
308
    \shipout\vbox{%
257
309
      % Do this early so pdf references go to the beginning of the page.
258
 
      \ifpdfmakepagedest \pdfmkdest{\the\pageno} \fi
 
310
      \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi
259
311
      %
260
312
      \ifcropmarks \vbox to \outervsize\bgroup
261
313
        \hsize = \outerhsize
336
388
% the input line (except we remove a trailing comment).  #1 should be a
337
389
% macro which expects an ordinary undelimited TeX argument.
338
390
%
339
 
\def\parsearg#1{%
340
 
  \let\next = #1%
 
391
\def\parsearg{\parseargusing{}}
 
392
\def\parseargusing#1#2{%
 
393
  \def\next{#2}%
341
394
  \begingroup
342
395
    \obeylines
343
 
    \futurelet\temp\parseargx
344
 
}
345
 
 
346
 
% If the next token is an obeyed space (from an @example environment or
347
 
% the like), remove it and recurse.  Otherwise, we're done.
348
 
\def\parseargx{%
349
 
  % \obeyedspace is defined far below, after the definition of \sepspaces.
350
 
  \ifx\obeyedspace\temp
351
 
    \expandafter\parseargdiscardspace
352
 
  \else
353
 
    \expandafter\parseargline
354
 
  \fi
355
 
}
356
 
 
357
 
% Remove a single space (as the delimiter token to the macro call).
358
 
{\obeyspaces %
359
 
 \gdef\parseargdiscardspace {\futurelet\temp\parseargx}}
 
396
    \spaceisspace
 
397
    #1%
 
398
    \parseargline\empty% Insert the \empty token, see \finishparsearg below.
 
399
}
360
400
 
361
401
{\obeylines %
362
402
  \gdef\parseargline#1^^M{%
363
403
    \endgroup % End of the group started in \parsearg.
364
 
    %
365
 
    % First remove any @c comment, then any @comment.
366
 
    % Result of each macro is put in \toks0.
367
 
    \argremovec #1\c\relax %
368
 
    \expandafter\argremovecomment \the\toks0 \comment\relax %
369
 
    %
370
 
    % Call the caller's macro, saved as \next in \parsearg.
371
 
    \expandafter\next\expandafter{\the\toks0}%
 
404
    \argremovecomment #1\comment\ArgTerm%
372
405
  }%
373
406
}
374
407
 
375
 
% Since all \c{,omment} does is throw away the argument, we can let TeX
376
 
% do that for us.  The \relax here is matched by the \relax in the call
377
 
% in \parseargline; it could be more or less anything, its purpose is
378
 
% just to delimit the argument to the \c.
379
 
\def\argremovec#1\c#2\relax{\toks0 = {#1}}
380
 
\def\argremovecomment#1\comment#2\relax{\toks0 = {#1}}
 
408
% First remove any @comment, then any @c comment.
 
409
\def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm}
 
410
\def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm}
381
411
 
382
 
% \argremovec{,omment} might leave us with trailing spaces, though; e.g.,
 
412
% Each occurence of `\^^M' or `<space>\^^M' is replaced by a single space.
 
413
%
 
414
% \argremovec might leave us with trailing space, e.g.,
383
415
%    @end itemize  @c foo
384
 
% will have two active spaces as part of the argument with the
385
 
% `itemize'.  Here we remove all active spaces from #1, and assign the
386
 
% result to \toks0.
387
 
%
388
 
% This loses if there are any *other* active characters besides spaces
389
 
% in the argument -- _ ^ +, for example -- since they get expanded.
390
 
% Fortunately, Texinfo does not define any such commands.  (If it ever
391
 
% does, the catcode of the characters in questionwill have to be changed
392
 
% here.)  But this means we cannot call \removeactivespaces as part of
393
 
% \argremovec{,omment}, since @c uses \parsearg, and thus the argument
394
 
% that \parsearg gets might well have any character at all in it.
395
 
%
396
 
\def\removeactivespaces#1{%
397
 
  \begingroup
398
 
    \ignoreactivespaces
399
 
    \edef\temp{#1}%
400
 
    \global\toks0 = \expandafter{\temp}%
401
 
  \endgroup
402
 
}
403
 
 
404
 
% Change the active space to expand to nothing.
405
 
%
406
 
\begingroup
 
416
% This space token undergoes the same procedure and is eventually removed
 
417
% by \finishparsearg.
 
418
%
 
419
\def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M}
 
420
\def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M}
 
421
\def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{%
 
422
  \def\temp{#3}%
 
423
  \ifx\temp\empty
 
424
    % We cannot use \next here, as it holds the macro to run;
 
425
    % thus we reuse \temp.
 
426
    \let\temp\finishparsearg
 
427
  \else
 
428
    \let\temp\argcheckspaces
 
429
  \fi
 
430
  % Put the space token in:
 
431
  \temp#1 #3\ArgTerm
 
432
}
 
433
 
 
434
% If a _delimited_ argument is enclosed in braces, they get stripped; so
 
435
% to get _exactly_ the rest of the line, we had to prevent such situation.
 
436
% We prepended an \empty token at the very beginning and we expand it now,
 
437
% just before passing the control to \next.
 
438
% (Similarily, we have to think about #3 of \argcheckspacesY above: it is
 
439
% either the null string, or it ends with \^^M---thus there is no danger
 
440
% that a pair of braces would be stripped.
 
441
%
 
442
% But first, we have to remove the trailing space token.
 
443
%
 
444
\def\finishparsearg#1 \ArgTerm{\expandafter\next\expandafter{#1}}
 
445
 
 
446
% \parseargdef\foo{...}
 
447
%       is roughly equivalent to
 
448
% \def\foo{\parsearg\Xfoo}
 
449
% \def\Xfoo#1{...}
 
450
%
 
451
% Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my
 
452
% favourite TeX trick.  --kasal, 16nov03
 
453
 
 
454
\def\parseargdef#1{%
 
455
  \expandafter \doparseargdef \csname\string#1\endcsname #1%
 
456
}
 
457
\def\doparseargdef#1#2{%
 
458
  \def#2{\parsearg#1}%
 
459
  \def#1##1%
 
460
}
 
461
 
 
462
% Several utility definitions with active space:
 
463
{
407
464
  \obeyspaces
408
 
  \gdef\ignoreactivespaces{\obeyspaces\let =\empty}
409
 
\endgroup
 
465
  \gdef\obeyedspace{ }
 
466
 
 
467
  % Make each space character in the input produce a normal interword
 
468
  % space in the output.  Don't allow a line break at this space, as this
 
469
  % is used only in environments like @example, where each line of input
 
470
  % should produce a line of output anyway.
 
471
  %
 
472
  \gdef\sepspaces{\obeyspaces\let =\tie}
 
473
 
 
474
  % If an index command is used in an @example environment, any spaces
 
475
  % therein should become regular spaces in the raw index file, not the
 
476
  % expansion of \tie (\leavevmode \penalty \@M \ ).
 
477
  \gdef\unsepspaces{\let =\space}
 
478
}
410
479
 
411
480
 
412
481
\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
413
482
 
414
 
%% These are used to keep @begin/@end levels from running away
415
 
%% Call \inENV within environments (after a \begingroup)
416
 
\newif\ifENV \ENVfalse \def\inENV{\ifENV\relax\else\ENVtrue\fi}
417
 
\def\ENVcheck{%
418
 
\ifENV\errmessage{Still within an environment; press RETURN to continue}
419
 
\endgroup\fi} % This is not perfect, but it should reduce lossage
420
 
 
421
 
% @begin foo  is the same as @foo, for now.
 
483
% Define the framework for environments in texinfo.tex.  It's used like this:
 
484
%
 
485
%   \envdef\foo{...}
 
486
%   \def\Efoo{...}
 
487
%
 
488
% It's the responsibility of \envdef to insert \begingroup before the
 
489
% actual body; @end closes the group after calling \Efoo.  \envdef also
 
490
% defines \thisenv, so the current environment is known; @end checks
 
491
% whether the environment name matches.  The \checkenv macro can also be
 
492
% used to check whether the current environment is the one expected.
 
493
%
 
494
% Non-false conditionals (@iftex, @ifset) don't fit into this, so they
 
495
% are not treated as enviroments; they don't open a group.  (The
 
496
% implementation of @end takes care not to call \endgroup in this
 
497
% special case.)
 
498
 
 
499
 
 
500
% At runtime, environments start with this:
 
501
\def\startenvironment#1{\begingroup\def\thisenv{#1}}
 
502
% initialize
 
503
\let\thisenv\empty
 
504
 
 
505
% ... but they get defined via ``\envdef\foo{...}'':
 
506
\long\def\envdef#1#2{\def#1{\startenvironment#1#2}}
 
507
\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}}
 
508
 
 
509
% Check whether we're in the right environment:
 
510
\def\checkenv#1{%
 
511
  \def\temp{#1}%
 
512
  \ifx\thisenv\temp
 
513
  \else
 
514
    \badenverr
 
515
  \fi
 
516
}
 
517
 
 
518
% Evironment mismatch, #1 expected:
 
519
\def\badenverr{%
 
520
  \errhelp = \EMsimple
 
521
  \errmessage{This command can appear only \inenvironment\temp,
 
522
    not \inenvironment\thisenv}%
 
523
}
 
524
\def\inenvironment#1{%
 
525
  \ifx#1\empty
 
526
    out of any environment%
 
527
  \else
 
528
    in environment \expandafter\string#1%
 
529
  \fi
 
530
}
 
531
 
 
532
% @end foo executes the definition of \Efoo.
 
533
% But first, it executes a specialized version of \checkenv
 
534
%
 
535
\parseargdef\end{%
 
536
  \if 1\csname iscond.#1\endcsname
 
537
  \else
 
538
    % The general wording of \badenverr may not be ideal, but... --kasal, 06nov03
 
539
    \expandafter\checkenv\csname#1\endcsname
 
540
    \csname E#1\endcsname
 
541
    \endgroup
 
542
  \fi
 
543
}
 
544
 
422
545
\newhelp\EMsimple{Press RETURN to continue.}
423
546
 
424
 
\outer\def\begin{\parsearg\beginxxx}
425
 
 
426
 
\def\beginxxx #1{%
427
 
\expandafter\ifx\csname #1\endcsname\relax
428
 
{\errhelp=\EMsimple \errmessage{Undefined command @begin #1}}\else
429
 
\csname #1\endcsname\fi}
430
 
 
431
 
% @end foo executes the definition of \Efoo.
432
 
%
433
 
\def\end{\parsearg\endxxx}
434
 
\def\endxxx #1{%
435
 
  \removeactivespaces{#1}%
436
 
  \edef\endthing{\the\toks0}%
437
 
  %
438
 
  \expandafter\ifx\csname E\endthing\endcsname\relax
439
 
    \expandafter\ifx\csname \endthing\endcsname\relax
440
 
      % There's no \foo, i.e., no ``environment'' foo.
441
 
      \errhelp = \EMsimple
442
 
      \errmessage{Undefined command `@end \endthing'}%
443
 
    \else
444
 
      \unmatchedenderror\endthing
445
 
    \fi
446
 
  \else
447
 
    % Everything's ok; the right environment has been started.
448
 
    \csname E\endthing\endcsname
449
 
  \fi
450
 
}
451
 
 
452
 
% There is an environment #1, but it hasn't been started.  Give an error.
453
 
%
454
 
\def\unmatchedenderror#1{%
455
 
  \errhelp = \EMsimple
456
 
  \errmessage{This `@end #1' doesn't have a matching `@#1'}%
457
 
}
458
 
 
459
 
% Define the control sequence \E#1 to give an unmatched @end error.
460
 
%
461
 
\def\defineunmatchedend#1{%
462
 
  \expandafter\def\csname E#1\endcsname{\unmatchedenderror{#1}}%
463
 
}
464
 
 
465
547
 
466
548
%% Simple single-character @ commands
467
549
 
493
575
  !gdef!rbraceatcmd[@}]%
494
576
!endgroup
495
577
 
 
578
% @comma{} to avoid , parsing problems.
 
579
\let\comma = ,
 
580
 
496
581
% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
497
582
% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
498
583
\let\, = \c
502
587
\let\ubaraccent = \b
503
588
\let\udotaccent = \d
504
589
 
505
 
% Other special characters: @questiondown @exclamdown
 
590
% Other special characters: @questiondown @exclamdown @ordf @ordm
506
591
% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
507
592
\def\questiondown{?`}
508
593
\def\exclamdown{!`}
 
594
\def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}}
 
595
\def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}}
509
596
 
510
597
% Dotless i and dotless j, used for accents.
511
598
\def\imacro{i}
518
605
  \fi\fi
519
606
}
520
607
 
 
608
% The \TeX{} logo, as in plain, but resetting the spacing so that a
 
609
% period following counts as ending a sentence.  (Idea found in latex.)
 
610
%
 
611
\edef\TeX{\TeX \spacefactor=3000 }
 
612
 
 
613
% @LaTeX{} logo.  Not quite the same results as the definition in
 
614
% latex.ltx, since we use a different font for the raised A; it's most
 
615
% convenient for us to use an explicitly smaller font, rather than using
 
616
% the \scriptstyle font (since we don't reset \scriptstyle and
 
617
% \scriptscriptstyle).
 
618
%
 
619
\def\LaTeX{%
 
620
  L\kern-.36em
 
621
  {\setbox0=\hbox{T}%
 
622
   \vbox to \ht0{\hbox{\selectfonts\lllsize A}\vss}}%
 
623
  \kern-.15em
 
624
  \TeX
 
625
}
 
626
 
521
627
% Be sure we're in horizontal mode when doing a tie, since we make space
522
628
% equivalent to this in @example-like environments. Otherwise, a space
523
629
% at the beginning of a line will start with \penalty -- and
536
642
% @* forces a line break.
537
643
\def\*{\hfil\break\hbox{}\ignorespaces}
538
644
 
 
645
% @/ allows a line break.
 
646
\let\/=\allowbreak
 
647
 
539
648
% @. is an end-of-sentence period.
540
649
\def\.{.\spacefactor=3000 }
541
650
 
564
673
% explicit \vfill so that the extra space is at the bottom.  The
565
674
% threshold for doing this is if the group is more than \vfilllimit
566
675
% percent of a page (\vfilllimit can be changed inside of @tex).
567
 
 
676
%
568
677
\newbox\groupbox
569
678
\def\vfilllimit{0.7}
570
679
%
571
 
\def\group{\begingroup
572
 
  \ifnum\catcode13=\active \else
 
680
\envdef\group{%
 
681
  \ifnum\catcode`\^^M=\active \else
573
682
    \errhelp = \groupinvalidhelp
574
683
    \errmessage{@group invalid in context where filling is enabled}%
575
684
  \fi
576
 
  %
577
 
  % The \vtop we start below produces a box with normal height and large
578
 
  % depth; thus, TeX puts \baselineskip glue before it, and (when the
579
 
  % next line of text is done) \lineskip glue after it.  (See p.82 of
580
 
  % the TeXbook.)  Thus, space below is not quite equal to space
581
 
  % above.  But it's pretty close.
582
 
  \def\Egroup{%
583
 
    \egroup           % End the \vtop.
584
 
    % \dimen0 is the vertical size of the group's box.
585
 
    \dimen0 = \ht\groupbox  \advance\dimen0 by \dp\groupbox
586
 
    % \dimen2 is how much space is left on the page (more or less).
587
 
    \dimen2 = \pageheight   \advance\dimen2 by -\pagetotal
588
 
    % if the group doesn't fit on the current page, and it's a big big
589
 
    % group, force a page break.
590
 
    \ifdim \dimen0 > \dimen2
591
 
      \ifdim \pagetotal < \vfilllimit\pageheight
592
 
        \page
593
 
      \fi
594
 
    \fi
595
 
    \copy\groupbox
596
 
    \endgroup         % End the \group.
597
 
  }%
 
685
  \startsavinginserts
598
686
  %
599
687
  \setbox\groupbox = \vtop\bgroup
600
 
    % We have to put a strut on the last line in case the @group is in
601
 
    % the midst of an example, rather than completely enclosing it.
602
 
    % Otherwise, the interline space between the last line of the group
603
 
    % and the first line afterwards is too small.  But we can't put the
604
 
    % strut in \Egroup, since there it would be on a line by itself.
605
 
    % Hence this just inserts a strut at the beginning of each line.
606
 
    \everypar = {\strut}%
607
 
    %
608
 
    % Since we have a strut on every line, we don't need any of TeX's
609
 
    % normal interline spacing.
610
 
    \offinterlineskip
611
 
    %
612
 
    % OK, but now we have to do something about blank
613
 
    % lines in the input in @example-like environments, which normally
614
 
    % just turn into \lisppar, which will insert no space now that we've
615
 
    % turned off the interline space.  Simplest is to make them be an
616
 
    % empty paragraph.
617
 
    \ifx\par\lisppar
618
 
      \edef\par{\leavevmode \par}%
619
 
      %
620
 
      % Reset ^^M's definition to new definition of \par.
621
 
      \obeylines
622
 
    \fi
623
 
    %
624
688
    % Do @comment since we are called inside an environment such as
625
689
    % @example, where each end-of-line in the input causes an
626
690
    % end-of-line in the output.  We don't want the end-of-line after
630
694
    \comment
631
695
}
632
696
%
 
697
% The \vtop produces a box with normal height and large depth; thus, TeX puts
 
698
% \baselineskip glue before it, and (when the next line of text is done)
 
699
% \lineskip glue after it.  Thus, space below is not quite equal to space
 
700
% above.  But it's pretty close.
 
701
\def\Egroup{%
 
702
    % To get correct interline space between the last line of the group
 
703
    % and the first line afterwards, we have to propagate \prevdepth.
 
704
    \endgraf % Not \par, as it may have been set to \lisppar.
 
705
    \global\dimen1 = \prevdepth
 
706
  \egroup           % End the \vtop.
 
707
  % \dimen0 is the vertical size of the group's box.
 
708
  \dimen0 = \ht\groupbox  \advance\dimen0 by \dp\groupbox
 
709
  % \dimen2 is how much space is left on the page (more or less).
 
710
  \dimen2 = \pageheight   \advance\dimen2 by -\pagetotal
 
711
  % if the group doesn't fit on the current page, and it's a big big
 
712
  % group, force a page break.
 
713
  \ifdim \dimen0 > \dimen2
 
714
    \ifdim \pagetotal < \vfilllimit\pageheight
 
715
      \page
 
716
    \fi
 
717
  \fi
 
718
  \box\groupbox
 
719
  \prevdepth = \dimen1
 
720
  \checkinserts
 
721
}
 
722
%
633
723
% TeX puts in an \escapechar (i.e., `@') at the beginning of the help
634
724
% message, so this ends up printing `@group can only ...'.
635
725
%
642
732
 
643
733
\newdimen\mil  \mil=0.001in
644
734
 
645
 
\def\need{\parsearg\needx}
646
 
 
647
735
% Old definition--didn't work.
648
 
%\def\needx #1{\par %
 
736
%\parseargdef\need{\par %
649
737
%% This method tries to make TeX break the page naturally
650
738
%% if the depth of the box does not fit.
651
739
%{\baselineskip=0pt%
653
741
%\prevdepth=-1000pt
654
742
%}}
655
743
 
656
 
\def\needx#1{%
 
744
\parseargdef\need{%
657
745
  % Ensure vertical mode, so we don't make a big box in the middle of a
658
746
  % paragraph.
659
747
  \par
692
780
  \fi
693
781
}
694
782
 
695
 
% @br   forces paragraph break
 
783
% @br   forces paragraph break (and is undocumented).
696
784
 
697
785
\let\br = \par
698
786
 
699
 
% @dots{} output an ellipsis using the current font.
700
 
% We do .5em per period so that it has the same spacing in a typewriter
701
 
% font as three actual period characters.
702
 
%
703
 
\def\dots{%
704
 
  \leavevmode
705
 
  \hbox to 1.5em{%
706
 
    \hskip 0pt plus 0.25fil minus 0.25fil
707
 
    .\hss.\hss.%
708
 
    \hskip 0pt plus 0.5fil minus 0.5fil
709
 
  }%
710
 
}
711
 
 
712
 
% @enddots{} is an end-of-sentence ellipsis.
713
 
%
714
 
\def\enddots{%
715
 
  \leavevmode
716
 
  \hbox to 2em{%
717
 
    \hskip 0pt plus 0.25fil minus 0.25fil
718
 
    .\hss.\hss.\hss.%
719
 
    \hskip 0pt plus 0.5fil minus 0.5fil
720
 
  }%
721
 
  \spacefactor=3000
722
 
}
723
 
 
724
 
 
725
 
% @page    forces the start of a new page
 
787
% @page forces the start of a new page.
726
788
%
727
789
\def\page{\par\vfill\supereject}
728
790
 
734
796
\newskip\exdentamount
735
797
 
736
798
% This defn is used inside fill environments such as @defun.
737
 
\def\exdent{\parsearg\exdentyyy}
738
 
\def\exdentyyy #1{{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}}
 
799
\parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}
739
800
 
740
801
% This defn is used inside nofill environments such as @example.
741
 
\def\nofillexdent{\parsearg\nofillexdentyyy}
742
 
\def\nofillexdentyyy #1{{\advance \leftskip by -\exdentamount
743
 
\leftline{\hskip\leftskip{\rm#1}}}}
 
802
\parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount
 
803
  \leftline{\hskip\leftskip{\rm#1}}}}
744
804
 
745
805
% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
746
806
% paragraph.  For more general purposes, use the \margin insertion
771
831
% @inmargin{TEXT [, RIGHT-TEXT]}
772
832
% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right;
773
833
% else use TEXT for both).
774
 
 
834
%
775
835
\def\inmargin#1{\parseinmargin #1,,\finish}
776
836
\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing.
777
 
  \setbox0 = \hbox{\ignorespaces #2}% 
 
837
  \setbox0 = \hbox{\ignorespaces #2}%
778
838
  \ifdim\wd0 > 0pt
779
839
    \def\lefttext{#1}%  have both texts
780
840
    \def\righttext{#2}%
792
852
}
793
853
 
794
854
% @include file    insert text of that file as input.
795
 
% Allow normal characters that  we make active in the argument (a file name).
796
 
\def\include{\begingroup
 
855
%
 
856
\def\include{\parseargusing\filenamecatcodes\includezzz}
 
857
\def\includezzz#1{%
 
858
  \pushthisfilestack
 
859
  \def\thisfile{#1}%
 
860
  {%
 
861
    \makevalueexpandable
 
862
    \def\temp{\input #1 }%
 
863
    \expandafter
 
864
  }\temp
 
865
  \popthisfilestack
 
866
}
 
867
\def\filenamecatcodes{%
797
868
  \catcode`\\=\other
798
869
  \catcode`~=\other
799
870
  \catcode`^=\other
802
873
  \catcode`<=\other
803
874
  \catcode`>=\other
804
875
  \catcode`+=\other
805
 
  \parsearg\includezzz}
806
 
% Restore active chars for included file.
807
 
\def\includezzz#1{\endgroup\begingroup
808
 
  % Read the included file in a group so nested @include's work.
809
 
  \def\thisfile{#1}%
810
 
  \let\value=\expandablevalue
811
 
  \input\thisfile
812
 
\endgroup}
 
876
  \catcode`-=\other
 
877
}
 
878
 
 
879
\def\pushthisfilestack{%
 
880
  \expandafter\pushthisfilestackX\popthisfilestack\StackTerm
 
881
}
 
882
\def\pushthisfilestackX{%
 
883
  \expandafter\pushthisfilestackY\thisfile\StackTerm
 
884
}
 
885
\def\pushthisfilestackY #1\StackTerm #2\StackTerm {%
 
886
  \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}%
 
887
}
 
888
 
 
889
\def\popthisfilestack{\errthisfilestackempty}
 
890
\def\errthisfilestackempty{\errmessage{Internal error:
 
891
  the stack of filenames is empty.}}
813
892
 
814
893
\def\thisfile{}
815
894
 
816
895
% @center line
817
896
% outputs that line, centered.
818
897
%
819
 
\def\center{\parsearg\docenter}
820
 
\def\docenter#1{{%
821
 
  \ifhmode \hfil\break \fi
822
 
  \advance\hsize by -\leftskip
823
 
  \advance\hsize by -\rightskip
824
 
  \line{\hfil \ignorespaces#1\unskip \hfil}%
825
 
  \ifhmode \break \fi
826
 
}}
 
898
\parseargdef\center{%
 
899
  \ifhmode
 
900
    \let\next\centerH
 
901
  \else
 
902
    \let\next\centerV
 
903
  \fi
 
904
  \next{\hfil \ignorespaces#1\unskip \hfil}%
 
905
}
 
906
\def\centerH#1{%
 
907
  {%
 
908
    \hfil\break
 
909
    \advance\hsize by -\leftskip
 
910
    \advance\hsize by -\rightskip
 
911
    \line{#1}%
 
912
    \break
 
913
  }%
 
914
}
 
915
\def\centerV#1{\line{\kern\leftskip #1\kern\rightskip}}
827
916
 
828
917
% @sp n   outputs n lines of vertical space
829
918
 
830
 
\def\sp{\parsearg\spxxx}
831
 
\def\spxxx #1{\vskip #1\baselineskip}
 
919
\parseargdef\sp{\vskip #1\baselineskip}
832
920
 
833
921
% @comment ...line which is ignored...
834
922
% @c is the same as @comment
843
931
 
844
932
% @paragraphindent NCHARS
845
933
% We'll use ems for NCHARS, close enough.
846
 
% We cannot implement @paragraphindent asis, though.
847
 
 
934
% NCHARS can also be the word `asis' or `none'.
 
935
% We cannot feasibly implement @paragraphindent asis, though.
 
936
%
848
937
\def\asisword{asis} % no translation, these are keywords
849
938
\def\noneword{none}
850
939
%
851
 
\def\paragraphindent{\parsearg\doparagraphindent}
852
 
\def\doparagraphindent#1{%
 
940
\parseargdef\paragraphindent{%
853
941
  \def\temp{#1}%
854
942
  \ifx\temp\asisword
855
943
  \else
866
954
% We'll use ems for NCHARS like @paragraphindent.
867
955
% It seems @exampleindent asis isn't necessary, but
868
956
% I preserve it to make it similar to @paragraphindent.
869
 
\def\exampleindent{\parsearg\doexampleindent}
870
 
\def\doexampleindent#1{%
 
957
\parseargdef\exampleindent{%
871
958
  \def\temp{#1}%
872
959
  \ifx\temp\asisword
873
960
  \else
879
966
  \fi
880
967
}
881
968
 
 
969
% @firstparagraphindent WORD
 
970
% If WORD is `none', then suppress indentation of the first paragraph
 
971
% after a section heading.  If WORD is `insert', then do indent at such
 
972
% paragraphs.
 
973
%
 
974
% The paragraph indentation is suppressed or not by calling
 
975
% \suppressfirstparagraphindent, which the sectioning commands do.
 
976
% We switch the definition of this back and forth according to WORD.
 
977
% By default, we suppress indentation.
 
978
%
 
979
\def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent}
 
980
\def\insertword{insert}
 
981
%
 
982
\parseargdef\firstparagraphindent{%
 
983
  \def\temp{#1}%
 
984
  \ifx\temp\noneword
 
985
    \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent
 
986
  \else\ifx\temp\insertword
 
987
    \let\suppressfirstparagraphindent = \relax
 
988
  \else
 
989
    \errhelp = \EMsimple
 
990
    \errmessage{Unknown @firstparagraphindent option `\temp'}%
 
991
  \fi\fi
 
992
}
 
993
 
 
994
% Here is how we actually suppress indentation.  Redefine \everypar to
 
995
% \kern backwards by \parindent, and then reset itself to empty.
 
996
%
 
997
% We also make \indent itself not actually do anything until the next
 
998
% paragraph.
 
999
%
 
1000
\gdef\dosuppressfirstparagraphindent{%
 
1001
  \gdef\indent{%
 
1002
    \restorefirstparagraphindent
 
1003
    \indent
 
1004
  }%
 
1005
  \gdef\noindent{%
 
1006
    \restorefirstparagraphindent
 
1007
    \noindent
 
1008
  }%
 
1009
  \global\everypar = {%
 
1010
    \kern -\parindent
 
1011
    \restorefirstparagraphindent
 
1012
  }%
 
1013
}
 
1014
 
 
1015
\gdef\restorefirstparagraphindent{%
 
1016
  \global \let \indent = \ptexindent
 
1017
  \global \let \noindent = \ptexnoindent
 
1018
  \global \everypar = {}%
 
1019
}
 
1020
 
 
1021
 
882
1022
% @asis just yields its argument.  Used with @table, for example.
883
1023
%
884
1024
\def\asis#1{#1}
885
1025
 
886
1026
% @math outputs its argument in math mode.
887
 
% We don't use $'s directly in the definition of \math because we need
888
 
% to set catcodes according to plain TeX first, to allow for subscripts,
889
 
% superscripts, special math chars, etc.
890
 
891
 
\let\implicitmath = $%$ font-lock fix
892
1027
%
893
1028
% One complication: _ usually means subscripts, but it could also mean
894
1029
% an actual _ character, as in @math{@var{some_variable} + 1}.  So make
895
 
% _ within @math be active (mathcode "8000), and distinguish by seeing
896
 
% if the current family is \slfam, which is what @var uses.
897
 
898
 
{\catcode\underChar = \active
899
 
\gdef\mathunderscore{%
900
 
  \catcode\underChar=\active
901
 
  \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
902
 
}}
903
 
%
 
1030
% _ active, and distinguish by seeing if the current family is \slfam,
 
1031
% which is what @var uses.
 
1032
{
 
1033
  \catcode\underChar = \active
 
1034
  \gdef\mathunderscore{%
 
1035
    \catcode\underChar=\active
 
1036
    \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
 
1037
  }
 
1038
}
904
1039
% Another complication: we want \\ (and @\) to output a \ character.
905
1040
% FYI, plain.tex uses \\ as a temporary control sequence (why?), but
906
1041
% this is not advertised and we don't care.  Texinfo does not
907
1042
% otherwise define @\.
908
 
 
1043
%
909
1044
% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\.
910
1045
\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}
911
1046
%
912
1047
\def\math{%
913
1048
  \tex
914
 
  \mathcode`\_="8000 \mathunderscore
 
1049
  \mathunderscore
915
1050
  \let\\ = \mathbackslash
916
1051
  \mathactive
917
 
  \implicitmath\finishmath}
918
 
\def\finishmath#1{#1\implicitmath\Etex}
 
1052
  $\finishmath
 
1053
}
 
1054
\def\finishmath#1{#1$\endgroup}  % Close the group opened by \tex.
919
1055
 
920
1056
% Some active characters (such as <) are spaced differently in math.
921
 
% We have to reset their definitions in case the @math was an
922
 
% argument to a command which set the catcodes (such as @item or @section).
923
 
 
1057
% We have to reset their definitions in case the @math was an argument
 
1058
% to a command which sets the catcodes (such as @item or @section).
 
1059
%
924
1060
{
925
1061
  \catcode`^ = \active
926
1062
  \catcode`< = \active
935
1071
}
936
1072
 
937
1073
% @bullet and @minus need the same treatment as @math, just above.
938
 
\def\bullet{\implicitmath\ptexbullet\implicitmath}
939
 
\def\minus{\implicitmath-\implicitmath}
 
1074
\def\bullet{$\ptexbullet$}
 
1075
\def\minus{$-$}
 
1076
 
 
1077
% @dots{} outputs an ellipsis using the current font.
 
1078
% We do .5em per period so that it has the same spacing in a typewriter
 
1079
% font as three actual period characters.
 
1080
%
 
1081
\def\dots{%
 
1082
  \leavevmode
 
1083
  \hbox to 1.5em{%
 
1084
    \hskip 0pt plus 0.25fil
 
1085
    .\hfil.\hfil.%
 
1086
    \hskip 0pt plus 0.5fil
 
1087
  }%
 
1088
}
 
1089
 
 
1090
% @enddots{} is an end-of-sentence ellipsis.
 
1091
%
 
1092
\def\enddots{%
 
1093
  \dots
 
1094
  \spacefactor=3000
 
1095
}
 
1096
 
 
1097
% @comma{} is so commas can be inserted into text without messing up
 
1098
% Texinfo's parsing.
 
1099
%
 
1100
\let\comma = ,
940
1101
 
941
1102
% @refill is a no-op.
942
1103
\let\refill=\relax
952
1113
% So open here the files we need to have open while reading the input.
953
1114
% This makes it possible to make a .fmt file for texinfo.
954
1115
\def\setfilename{%
 
1116
   \fixbackslash  % Turn off hack to swallow `\input texinfo'.
955
1117
   \iflinks
956
 
     \readauxfile
 
1118
     \tryauxfile
 
1119
     % Open the new aux file.  TeX will close it automatically at exit.
 
1120
     \immediate\openout\auxfile=\jobname.aux
957
1121
   \fi % \openindices needs to do some work in any case.
958
1122
   \openindices
959
 
   \fixbackslash  % Turn off hack to swallow `\input texinfo'.
960
 
   \global\let\setfilename=\comment % Ignore extra @setfilename cmds.
 
1123
   \let\setfilename=\comment % Ignore extra @setfilename cmds.
961
1124
   %
962
1125
   % If texinfo.cnf is present on the system, read it.
963
1126
   % Useful for site-wide @afourpaper, etc.
964
 
   % Just to be on the safe side, close the input stream before the \input.
965
1127
   \openin 1 texinfo.cnf
966
 
   \ifeof1 \let\temp=\relax \else \def\temp{\input texinfo.cnf }\fi
967
 
   \closein1
968
 
   \temp
 
1128
   \ifeof 1 \else \input texinfo.cnf \fi
 
1129
   \closein 1
969
1130
   %
970
1131
   \comment % Ignore the actual filename.
971
1132
}
1001
1162
\newif\ifpdf
1002
1163
\newif\ifpdfmakepagedest
1003
1164
 
 
1165
% when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1
 
1166
% can be set).  So we test for \relax and 0 as well as \undefined,
 
1167
% borrowed from ifpdf.sty.
1004
1168
\ifx\pdfoutput\undefined
1005
 
  \pdffalse
1006
 
  \let\pdfmkdest = \gobble
1007
 
  \let\pdfurl = \gobble
1008
 
  \let\endlink = \relax
1009
 
  \let\linkcolor = \relax
1010
 
  \let\pdfmakeoutlines = \relax
1011
1169
\else
1012
 
  \pdftrue
1013
 
  \pdfoutput = 1
 
1170
  \ifx\pdfoutput\relax
 
1171
  \else
 
1172
    \ifcase\pdfoutput
 
1173
    \else
 
1174
      \pdftrue
 
1175
    \fi
 
1176
  \fi
 
1177
\fi
 
1178
%
 
1179
\ifpdf
1014
1180
  \input pdfcolor
 
1181
  \pdfcatalog{/PageMode /UseOutlines}%
1015
1182
  \def\dopdfimage#1#2#3{%
1016
1183
    \def\imagewidth{#2}%
1017
1184
    \def\imageheight{#3}%
1032
1199
    \ifnum\pdftexversion < 14 \else
1033
1200
      \pdfrefximage \pdflastximage
1034
1201
    \fi}
1035
 
  \def\pdfmkdest#1{{\normalturnoffactive \pdfdest name{#1} xyz}}
 
1202
  \def\pdfmkdest#1{{%
 
1203
    % We have to set dummies so commands such as @code in a section title
 
1204
    % aren't expanded.
 
1205
    \atdummies
 
1206
    \normalturnoffactive
 
1207
    \pdfdest name{#1} xyz%
 
1208
  }}
1036
1209
  \def\pdfmkpgn#1{#1}
1037
1210
  \let\linkcolor = \Blue  % was Cyan, but that seems light?
1038
1211
  \def\endlink{\Black\pdfendlink}
1041
1214
  \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
1042
1215
    \else \csname#1\endcsname \fi}
1043
1216
  \def\advancenumber#1{\tempnum=\expnumber{#1}\relax
1044
 
    \advance\tempnum by1
 
1217
    \advance\tempnum by 1
1045
1218
    \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
1046
 
  \def\pdfmakeoutlines{{%
1047
 
    \openin 1 \jobname.toc
1048
 
    \ifeof 1\else\begingroup
1049
 
      \closein 1 
1050
 
      % Thanh's hack / proper braces in bookmarks  
 
1219
  %
 
1220
  % #1 is the section text.  #2 is the pdf expression for the number
 
1221
  % of subentries (or empty, for subsubsections).  #3 is the node
 
1222
  % text, which might be empty if this toc entry had no
 
1223
  % corresponding node.  #4 is the page number.
 
1224
  %
 
1225
  \def\dopdfoutline#1#2#3#4{%
 
1226
    % Generate a link to the node text if that exists; else, use the
 
1227
    % page number.  We could generate a destination for the section
 
1228
    % text in the case where a section has no node, but it doesn't
 
1229
    % seem worthwhile, since most documents are normally structured.
 
1230
    \def\pdfoutlinedest{#3}%
 
1231
    \ifx\pdfoutlinedest\empty \def\pdfoutlinedest{#4}\fi
 
1232
    %
 
1233
    \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{#1}%
 
1234
  }
 
1235
  %
 
1236
  \def\pdfmakeoutlines{%
 
1237
    \begingroup
 
1238
      % Thanh's hack / proper braces in bookmarks
1051
1239
      \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace
1052
1240
      \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace
1053
1241
      %
1054
 
      \def\chapentry ##1##2##3{}
1055
 
      \def\secentry ##1##2##3##4{\advancenumber{chap##2}}
1056
 
      \def\subsecentry ##1##2##3##4##5{\advancenumber{sec##2.##3}}
1057
 
      \def\subsubsecentry ##1##2##3##4##5##6{\advancenumber{subsec##2.##3.##4}}
1058
 
      \let\appendixentry = \chapentry
1059
 
      \let\unnumbchapentry = \chapentry
1060
 
      \let\unnumbsecentry = \secentry
1061
 
      \let\unnumbsubsecentry = \subsecentry
1062
 
      \let\unnumbsubsubsecentry = \subsubsecentry
 
1242
      % Read toc silently, to get counts of subentries for \pdfoutline.
 
1243
      \def\numchapentry##1##2##3##4{%
 
1244
        \def\thischapnum{##2}%
 
1245
        \let\thissecnum\empty
 
1246
        \let\thissubsecnum\empty
 
1247
      }%
 
1248
      \def\numsecentry##1##2##3##4{%
 
1249
        \advancenumber{chap\thischapnum}%
 
1250
        \def\thissecnum{##2}%
 
1251
        \let\thissubsecnum\empty
 
1252
      }%
 
1253
      \def\numsubsecentry##1##2##3##4{%
 
1254
        \advancenumber{sec\thissecnum}%
 
1255
        \def\thissubsecnum{##2}%
 
1256
      }%
 
1257
      \def\numsubsubsecentry##1##2##3##4{%
 
1258
        \advancenumber{subsec\thissubsecnum}%
 
1259
      }%
 
1260
      \let\thischapnum\empty
 
1261
      \let\thissecnum\empty
 
1262
      \let\thissubsecnum\empty
 
1263
      %
 
1264
      % use \def rather than \let here because we redefine \chapentry et
 
1265
      % al. a second time, below.
 
1266
      \def\appentry{\numchapentry}%
 
1267
      \def\appsecentry{\numsecentry}%
 
1268
      \def\appsubsecentry{\numsubsecentry}%
 
1269
      \def\appsubsubsecentry{\numsubsubsecentry}%
 
1270
      \def\unnchapentry{\numchapentry}%
 
1271
      \def\unnsecentry{\numsecentry}%
 
1272
      \def\unnsubsecentry{\numsubsecentry}%
 
1273
      \def\unnsubsubsecentry{\numsubsubsecentry}%
1063
1274
      \input \jobname.toc
1064
 
      \def\chapentry ##1##2##3{%
1065
 
        \pdfoutline goto name{\pdfmkpgn{##3}}count-\expnumber{chap##2}{##1}}
1066
 
      \def\secentry ##1##2##3##4{%
1067
 
        \pdfoutline goto name{\pdfmkpgn{##4}}count-\expnumber{sec##2.##3}{##1}}
1068
 
      \def\subsecentry ##1##2##3##4##5{%
1069
 
        \pdfoutline goto name{\pdfmkpgn{##5}}count-\expnumber{subsec##2.##3.##4}{##1}}
1070
 
      \def\subsubsecentry ##1##2##3##4##5##6{%
1071
 
        \pdfoutline goto name{\pdfmkpgn{##6}}{##1}}
1072
 
      \let\appendixentry = \chapentry
1073
 
      \let\unnumbchapentry = \chapentry
1074
 
      \let\unnumbsecentry = \secentry
1075
 
      \let\unnumbsubsecentry = \subsecentry
1076
 
      \let\unnumbsubsubsecentry = \subsubsecentry
1077
 
      %
1078
 
      % Make special characters normal for writing to the pdf file.
1079
 
      % 
 
1275
      %
 
1276
      % Read toc second time, this time actually producing the outlines.
 
1277
      % The `-' means take the \expnumber as the absolute number of
 
1278
      % subentries, which we calculated on our first read of the .toc above.
 
1279
      %
 
1280
      % We use the node names as the destinations.
 
1281
      \def\numchapentry##1##2##3##4{%
 
1282
        \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}%
 
1283
      \def\numsecentry##1##2##3##4{%
 
1284
        \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}%
 
1285
      \def\numsubsecentry##1##2##3##4{%
 
1286
        \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}%
 
1287
      \def\numsubsubsecentry##1##2##3##4{% count is always zero
 
1288
        \dopdfoutline{##1}{}{##3}{##4}}%
 
1289
      %
 
1290
      % PDF outlines are displayed using system fonts, instead of
 
1291
      % document fonts.  Therefore we cannot use special characters,
 
1292
      % since the encoding is unknown.  For example, the eogonek from
 
1293
      % Latin 2 (0xea) gets translated to a | character.  Info from
 
1294
      % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100.
 
1295
      %
 
1296
      % xx to do this right, we have to translate 8-bit characters to
 
1297
      % their "best" equivalent, based on the @documentencoding.  Right
 
1298
      % now, I guess we'll just let the pdf reader have its way.
1080
1299
      \indexnofonts
1081
 
      \let\tt=\relax
1082
1300
      \turnoffactive
1083
1301
      \input \jobname.toc
1084
 
    \endgroup\fi
1085
 
  }}
 
1302
    \endgroup
 
1303
  }
 
1304
  %
1086
1305
  \def\makelinks #1,{%
1087
1306
    \def\params{#1}\def\E{END}%
1088
1307
    \ifx\params\E
1091
1310
      \let\nextmakelinks=\makelinks
1092
1311
      \ifnum\lnkcount>0,\fi
1093
1312
      \picknum{#1}%
1094
 
      \startlink attr{/Border [0 0 0]} 
 
1313
      \startlink attr{/Border [0 0 0]}
1095
1314
        goto name{\pdfmkpgn{\the\pgn}}%
1096
1315
      \linkcolor #1%
1097
1316
      \advance\lnkcount by 1%
1113
1332
  \def\ppn#1{\pgn=#1\gobble}
1114
1333
  \def\ppnn{\pgn=\first}
1115
1334
  \def\pdfmklnk#1{\lnkcount=0\makelinks #1,END,}
1116
 
  \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
1117
1335
  \def\skipspaces#1{\def\PP{#1}\def\D{|}%
1118
1336
    \ifx\PP\D\let\nextsp\relax
1119
1337
    \else\let\nextsp\skipspaces
1131
1349
  \def\pdfurl#1{%
1132
1350
    \begingroup
1133
1351
      \normalturnoffactive\def\@{@}%
1134
 
      \let\value=\expandablevalue
 
1352
      \makevalueexpandable
1135
1353
      \leavevmode\Red
1136
1354
      \startlink attr{/Border [0 0 0]}%
1137
1355
        user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
1138
 
        % #1
1139
1356
    \endgroup}
1140
1357
  \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
1141
1358
  \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
1142
1359
  \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
1143
1360
  \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
1144
1361
  \def\maketoks{%
1145
 
    \expandafter\poptoks\the\toksA|ENDTOKS|
 
1362
    \expandafter\poptoks\the\toksA|ENDTOKS|\relax
1146
1363
    \ifx\first0\adn0
1147
1364
    \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
1148
1365
    \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
1149
 
    \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 
 
1366
    \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9
1150
1367
    \else
1151
1368
      \ifnum0=\countA\else\makelink\fi
1152
1369
      \ifx\first.\let\next=\done\else
1162
1379
    \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}
1163
1380
    \linkcolor #1\endlink}
1164
1381
  \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
1165
 
\fi % \ifx\pdfoutput
 
1382
\else
 
1383
  \let\pdfmkdest = \gobble
 
1384
  \let\pdfurl = \gobble
 
1385
  \let\endlink = \relax
 
1386
  \let\linkcolor = \relax
 
1387
  \let\pdfmakeoutlines = \relax
 
1388
\fi  % \ifx\pdfoutput
1166
1389
 
1167
1390
 
1168
1391
\message{fonts,}
1169
 
% Font-change commands.
 
1392
 
 
1393
% Change the current font style to #1, remembering it in \curfontstyle.
 
1394
% For now, we do not accumulate font styles: @b{@i{foo}} prints foo in
 
1395
% italics, not bold italics.
 
1396
%
 
1397
\def\setfontstyle#1{%
 
1398
  \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd.
 
1399
  \csname ten#1\endcsname  % change the current font
 
1400
}
 
1401
 
 
1402
% Select #1 fonts with the current style.
 
1403
%
 
1404
\def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname}
 
1405
 
 
1406
\def\rm{\fam=0 \setfontstyle{rm}}
 
1407
\def\it{\fam=\itfam \setfontstyle{it}}
 
1408
\def\sl{\fam=\slfam \setfontstyle{sl}}
 
1409
\def\bf{\fam=\bffam \setfontstyle{bf}}
 
1410
\def\tt{\fam=\ttfam \setfontstyle{tt}}
1170
1411
 
1171
1412
% Texinfo sort of supports the sans serif font style, which plain TeX does not.
1172
 
% So we set up a \sf analogous to plain's \rm, etc.
 
1413
% So we set up a \sf.
1173
1414
\newfam\sffam
1174
 
\def\sf{\fam=\sffam \tensf}
 
1415
\def\sf{\fam=\sffam \setfontstyle{sf}}
1175
1416
\let\li = \sf % Sometimes we call it \li, not \sf.
1176
1417
 
1177
 
% We don't need math for this one.
1178
 
\def\ttsl{\tenttsl}
 
1418
% We don't need math for this font style.
 
1419
\def\ttsl{\setfontstyle{ttsl}}
1179
1420
 
1180
1421
% Default leading.
1181
1422
\newdimen\textleading  \textleading = 13.2pt
1226
1467
\def\scshape{csc}
1227
1468
\def\scbshape{csc}
1228
1469
 
 
1470
% Text fonts (11.2pt, magstep1).
1229
1471
\newcount\mainmagstep
1230
1472
\ifx\bigger\relax
1231
1473
  % not really supported.
1237
1479
  \setfont\textrm\rmshape{10}{\mainmagstep}
1238
1480
  \setfont\texttt\ttshape{10}{\mainmagstep}
1239
1481
\fi
1240
 
% Instead of cmb10, you may want to use cmbx10.
1241
 
% cmbx10 is a prettier font on its own, but cmb10
1242
 
% looks better when embedded in a line with cmr10
1243
 
% (in Bob's opinion).
1244
1482
\setfont\textbf\bfshape{10}{\mainmagstep}
1245
1483
\setfont\textit\itshape{10}{\mainmagstep}
1246
1484
\setfont\textsl\slshape{10}{\mainmagstep}
1250
1488
\font\texti=cmmi10 scaled \mainmagstep
1251
1489
\font\textsy=cmsy10 scaled \mainmagstep
1252
1490
 
1253
 
% A few fonts for @defun, etc.
1254
 
\setfont\defbf\bxshape{10}{\magstep1} %was 1314
 
1491
% A few fonts for @defun names and args.
 
1492
\setfont\defbf\bfshape{10}{\magstep1}
1255
1493
\setfont\deftt\ttshape{10}{\magstep1}
1256
 
\def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf}
 
1494
\setfont\defttsl\ttslshape{10}{\magstep1}
 
1495
\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf}
1257
1496
 
1258
1497
% Fonts for indices, footnotes, small examples (9pt).
1259
1498
\setfont\smallrm\rmshape{9}{1000}
1279
1518
\font\smalleri=cmmi8
1280
1519
\font\smallersy=cmsy8
1281
1520
 
1282
 
% Fonts for title page:
 
1521
% Fonts for title page (20.4pt):
1283
1522
\setfont\titlerm\rmbshape{12}{\magstep3}
1284
1523
\setfont\titleit\itbshape{10}{\magstep4}
1285
1524
\setfont\titlesl\slbshape{10}{\magstep4}
1325
1564
\setfont\ssecttsl\ttslshape{10}{1315}
1326
1565
\setfont\ssecsf\sfbshape{12}{\magstephalf}
1327
1566
\let\ssecbf\ssecrm
1328
 
\setfont\ssecsc\scbshape{10}{\magstep1}
 
1567
\setfont\ssecsc\scbshape{10}{1315}
1329
1568
\font\sseci=cmmi12 scaled \magstephalf
1330
1569
\font\ssecsy=cmsy10 scaled 1315
1331
 
% The smallcaps and symbol fonts should actually be scaled \magstep1.5,
1332
 
% but that is not a standard magnification.
 
1570
 
 
1571
% Reduced fonts for @acro in text (10pt).
 
1572
\setfont\reducedrm\rmshape{10}{1000}
 
1573
\setfont\reducedtt\ttshape{10}{1000}
 
1574
\setfont\reducedbf\bfshape{10}{1000}
 
1575
\setfont\reducedit\itshape{10}{1000}
 
1576
\setfont\reducedsl\slshape{10}{1000}
 
1577
\setfont\reducedsf\sfshape{10}{1000}
 
1578
\setfont\reducedsc\scshape{10}{1000}
 
1579
\setfont\reducedttsl\ttslshape{10}{1000}
 
1580
\font\reducedi=cmmi10
 
1581
\font\reducedsy=cmsy10
1333
1582
 
1334
1583
% In order for the font changes to affect most math symbols and letters,
1335
1584
% we have to define the \textfont of the standard families.  Since
1344
1593
}
1345
1594
 
1346
1595
% The font-changing commands redefine the meanings of \tenSTYLE, instead
1347
 
% of just \STYLE.  We do this so that font changes will continue to work
1348
 
% in math mode, where it is the current \fam that is relevant in most
1349
 
% cases, not the current font.  Plain TeX does \def\bf{\fam=\bffam
1350
 
% \tenbf}, for example.  By redefining \tenbf, we obviate the need to
1351
 
% redefine \bf itself.
 
1596
% of just \STYLE.  We do this because \STYLE needs to also set the
 
1597
% current \fam for math mode.  Our \STYLE (e.g., \rm) commands hardwire
 
1598
% \tenSTYLE to set the current font.
 
1599
%
 
1600
% Each font-changing command also sets the names \lsize (one size lower)
 
1601
% and \lllsize (three sizes lower).  These relative commands are used in
 
1602
% the LaTeX logo and acronyms.
 
1603
%
 
1604
% This all needs generalizing, badly.
 
1605
%
1352
1606
\def\textfonts{%
1353
1607
  \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
1354
1608
  \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
1355
 
  \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy \let\tenttsl=\textttsl
 
1609
  \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy
 
1610
  \let\tenttsl=\textttsl
 
1611
  \def\lsize{reduced}\def\lllsize{smaller}%
1356
1612
  \resetmathfonts \setleading{\textleading}}
1357
1613
\def\titlefonts{%
1358
1614
  \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl
1359
1615
  \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc
1360
1616
  \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy
1361
1617
  \let\tenttsl=\titlettsl
 
1618
  \def\lsize{chap}\def\lllsize{subsec}%
1362
1619
  \resetmathfonts \setleading{25pt}}
1363
1620
\def\titlefont#1{{\titlefonts\rm #1}}
1364
1621
\def\chapfonts{%
1365
1622
  \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
1366
1623
  \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
1367
1624
  \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl
 
1625
  \def\lsize{sec}\def\lllsize{text}%
1368
1626
  \resetmathfonts \setleading{19pt}}
1369
1627
\def\secfonts{%
1370
1628
  \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
1371
1629
  \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
1372
 
  \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy \let\tenttsl=\secttsl
 
1630
  \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy
 
1631
  \let\tenttsl=\secttsl
 
1632
  \def\lsize{subsec}\def\lllsize{reduced}%
1373
1633
  \resetmathfonts \setleading{16pt}}
1374
1634
\def\subsecfonts{%
1375
1635
  \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
1376
1636
  \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
1377
 
  \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl
 
1637
  \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy
 
1638
  \let\tenttsl=\ssecttsl
 
1639
  \def\lsize{text}\def\lllsize{small}%
1378
1640
  \resetmathfonts \setleading{15pt}}
1379
 
\let\subsubsecfonts = \subsecfonts % Maybe make sssec fonts scaled magstephalf?
 
1641
\let\subsubsecfonts = \subsecfonts
 
1642
\def\reducedfonts{%
 
1643
  \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl
 
1644
  \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc
 
1645
  \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy
 
1646
  \let\tenttsl=\reducedttsl
 
1647
  \def\lsize{small}\def\lllsize{smaller}%
 
1648
  \resetmathfonts \setleading{10.5pt}}
1380
1649
\def\smallfonts{%
1381
1650
  \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl
1382
1651
  \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc
1383
1652
  \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy
1384
1653
  \let\tenttsl=\smallttsl
 
1654
  \def\lsize{smaller}\def\lllsize{smaller}%
1385
1655
  \resetmathfonts \setleading{10.5pt}}
1386
1656
\def\smallerfonts{%
1387
1657
  \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl
1388
1658
  \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc
1389
1659
  \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy
1390
1660
  \let\tenttsl=\smallerttsl
 
1661
  \def\lsize{smaller}\def\lllsize{smaller}%
1391
1662
  \resetmathfonts \setleading{9.5pt}}
1392
1663
 
1393
1664
% Set the fonts to use with the @small... environments.
1396
1667
% About \smallexamplefonts.  If we use \smallfonts (9pt), @smallexample
1397
1668
% can fit this many characters:
1398
1669
%   8.5x11=86   smallbook=72  a4=90  a5=69
1399
 
% If we use \smallerfonts (8pt), then we can fit this many characters:
 
1670
% If we use \scriptfonts (8pt), then we can fit this many characters:
1400
1671
%   8.5x11=90+  smallbook=80  a4=90+  a5=77
1401
1672
% For me, subjectively, the few extra characters that fit aren't worth
1402
1673
% the additional smallness of 8pt.  So I'm making the default 9pt.
1403
 
 
1674
%
1404
1675
% By the way, for comparison, here's what fits with @example (10pt):
1405
1676
%   8.5x11=71  smallbook=60  a4=75  a5=58
1406
 
1407
 
% I wish we used A4 paper on this side of the Atlantic.
1408
 
 
1677
%
 
1678
% I wish the USA used A4 paper.
1409
1679
% --karl, 24jan03.
1410
1680
 
1411
1681
 
1412
1682
% Set up the default fonts, so we can use them for creating boxes.
1413
1683
%
1414
 
\textfonts
 
1684
\textfonts \rm
1415
1685
 
1416
1686
% Define these so they can be easily changed for other fonts.
1417
1687
\def\angleleft{$\langle$}
1422
1692
 
1423
1693
% Fonts for short table of contents.
1424
1694
\setfont\shortcontrm\rmshape{12}{1000}
1425
 
\setfont\shortcontbf\bxshape{12}{1000}
 
1695
\setfont\shortcontbf\bfshape{10}{\magstep1}  % no cmb12
1426
1696
\setfont\shortcontsl\slshape{12}{1000}
1427
1697
\setfont\shortconttt\ttshape{12}{1000}
1428
1698
 
1431
1701
 
1432
1702
% \smartitalic{ARG} outputs arg in italics, followed by an italic correction
1433
1703
% unless the following character is such as not to need one.
1434
 
\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else\/\fi\fi\fi}
 
1704
\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else
 
1705
                    \ptexslash\fi\fi\fi}
1435
1706
\def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx}
1436
1707
\def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx}
1437
1708
 
 
1709
% like \smartslanted except unconditionally uses \ttsl.
 
1710
% @var is set to this for defun arguments.
 
1711
\def\ttslanted#1{{\ttsl #1}\futurelet\next\smartitalicx}
 
1712
 
 
1713
% like \smartslanted except unconditionally use \sl.  We never want
 
1714
% ttsl for book titles, do we?
 
1715
\def\cite#1{{\sl #1}\futurelet\next\smartitalicx}
 
1716
 
1438
1717
\let\i=\smartitalic
1439
1718
\let\var=\smartslanted
1440
1719
\let\dfn=\smartslanted
1441
1720
\let\emph=\smartitalic
1442
 
\let\cite=\smartslanted
1443
1721
 
1444
1722
\def\b#1{{\bf #1}}
1445
1723
\let\strong=\b
1454
1732
% Set sfcode to normal for the chars that usually have another value.
1455
1733
% Can't use plain's \frenchspacing because it uses the `\x notation, and
1456
1734
% sometimes \x has an active definition that messes things up.
1457
 
 
1735
%
1458
1736
\catcode`@=11
1459
1737
  \def\frenchspacing{%
1460
1738
    \sfcode\dotChar  =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m
1466
1744
  {\tt \rawbackslash \frenchspacing #1}%
1467
1745
  \null
1468
1746
}
1469
 
\let\ttfont=\t
1470
1747
\def\samp#1{`\tclose{#1}'\null}
1471
1748
\setfont\keyrm\rmshape{8}{1000}
1472
1749
\font\keysy=cmsy9
1507
1784
  \null
1508
1785
}
1509
1786
 
1510
 
% We *must* turn on hyphenation at `-' and `_' in \code.
 
1787
% We *must* turn on hyphenation at `-' and `_' in @code.
1511
1788
% Otherwise, it is too hard to avoid overfull hboxes
1512
1789
% in the Emacs manual, the Library manual, etc.
1513
1790
 
1525
1802
    \catcode`\_=\active \let_\codeunder
1526
1803
    \codex
1527
1804
  }
1528
 
  %
1529
 
  % If we end up with any active - characters when handling the index,
1530
 
  % just treat them as a normal -.
1531
 
  \global\def\indexbreaks{\catcode`\-=\active \let-\realdash}
1532
1805
}
1533
1806
 
1534
1807
\def\realdash{-}
1552
1825
% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
1553
1826
%   `example' (@kbd uses ttsl only inside of @example and friends),
1554
1827
%   or `code' (@kbd uses normal tty font always).
1555
 
\def\kbdinputstyle{\parsearg\kbdinputstylexxx}
1556
 
\def\kbdinputstylexxx#1{%
 
1828
\parseargdef\kbdinputstyle{%
1557
1829
  \def\arg{#1}%
1558
1830
  \ifx\arg\worddistinct
1559
1831
    \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
1563
1835
    \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
1564
1836
  \else
1565
1837
    \errhelp = \EMsimple
1566
 
    \errmessage{Unknown @kbdinputstyle `\arg'}%
 
1838
    \errmessage{Unknown @kbdinputstyle option `\arg'}%
1567
1839
  \fi\fi\fi
1568
1840
}
1569
1841
\def\worddistinct{distinct}
1579
1851
\else{\tclose{\kbdfont\look}}\fi
1580
1852
\else{\tclose{\kbdfont\look}}\fi}
1581
1853
 
1582
 
% For @url, @env, @command quotes seem unnecessary, so use \code.
1583
 
\let\url=\code
 
1854
% For @indicateurl, @env, @command quotes seem unnecessary, so use \code.
 
1855
\let\indicateurl=\code
1584
1856
\let\env=\code
1585
1857
\let\command=\code
1586
1858
 
1612
1884
  \endlink
1613
1885
\endgroup}
1614
1886
 
 
1887
% @url synonym for @uref, since that's how everyone uses it.
 
1888
%
 
1889
\let\url=\uref
 
1890
 
1615
1891
% rms does not like angle brackets --karl, 17may97.
1616
1892
% So now @email is just like @uref, unless we are pdf.
1617
 
 
1893
%
1618
1894
%\def\email#1{\angleleft{\tt #1}\angleright}
1619
1895
\ifpdf
1620
1896
  \def\email#1{\doemail#1,,\finish}
1653
1929
\def\sc#1{{\smallcaps#1}}       % smallcaps font
1654
1930
\def\ii#1{{\it #1}}             % italic font
1655
1931
 
1656
 
% @acronym downcases the argument and prints in smallcaps.
1657
 
\def\acronym#1{{\smallcaps \lowercase{#1}}}
 
1932
\def\acronym#1{\doacronym #1,,\finish}
 
1933
\def\doacronym#1,#2,#3\finish{%
 
1934
  {\selectfonts\lsize #1}%
 
1935
  \def\temp{#2}%
 
1936
  \ifx\temp\empty \else
 
1937
    \space ({\unsepspaces \ignorespaces \temp \unskip})%
 
1938
  \fi
 
1939
}
1658
1940
 
1659
 
% @pounds{} is a sterling sign.
 
1941
% @pounds{} is a sterling sign, which is in the CM italic font.
 
1942
%
1660
1943
\def\pounds{{\it\$}}
1661
1944
 
 
1945
% @registeredsymbol - R in a circle.  The font for the R should really
 
1946
% be smaller yet, but lllsize is the best we can do for now.
 
1947
% Adapted from the plain.tex definition of \copyright.
 
1948
%
 
1949
\def\registeredsymbol{%
 
1950
  $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}%
 
1951
               \hfil\crcr\Orb}}%
 
1952
    }$%
 
1953
}
 
1954
 
 
1955
% Laurent Siebenmann reports \Orb undefined with:
 
1956
%  Textures 1.7.7 (preloaded format=plain 93.10.14)  (68K)  16 APR 2004 02:38
 
1957
% so we'll define it if necessary.
 
1958
 
1959
\ifx\Orb\undefined
 
1960
\def\Orb{\mathhexbox20D}
 
1961
\fi
 
1962
 
1662
1963
 
1663
1964
\message{page headings,}
1664
1965
 
1677
1978
\newif\ifsetshortcontentsaftertitlepage
1678
1979
 \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue
1679
1980
 
1680
 
\def\shorttitlepage{\parsearg\shorttitlepagezzz}
1681
 
\def\shorttitlepagezzz #1{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%
 
1981
\parseargdef\shorttitlepage{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%
1682
1982
        \endgroup\page\hbox{}\page}
1683
1983
 
1684
 
\def\titlepage{\begingroup \parindent=0pt \textfonts
1685
 
   \let\subtitlerm=\tenrm
1686
 
   \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}%
1687
 
   %
1688
 
   \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines
1689
 
                   \let\tt=\authortt}%
1690
 
   %
1691
 
   % Leave some space at the very top of the page.
1692
 
   \vglue\titlepagetopglue
1693
 
   %
1694
 
   % Now you can print the title using @title.
1695
 
   \def\title{\parsearg\titlezzz}%
1696
 
   \def\titlezzz##1{\leftline{\titlefonts\rm ##1}
1697
 
                    % print a rule at the page bottom also.
1698
 
                    \finishedtitlepagefalse
1699
 
                    \vskip4pt \hrule height 4pt width \hsize \vskip4pt}%
1700
 
   % No rule at page bottom unless we print one at the top with @title.
1701
 
   \finishedtitlepagetrue
1702
 
   %
1703
 
   % Now you can put text using @subtitle.
1704
 
   \def\subtitle{\parsearg\subtitlezzz}%
1705
 
   \def\subtitlezzz##1{{\subtitlefont \rightline{##1}}}%
1706
 
   %
1707
 
   % @author should come last, but may come many times.
1708
 
   \def\author{\parsearg\authorzzz}%
1709
 
   \def\authorzzz##1{\ifseenauthor\else\vskip 0pt plus 1filll\seenauthortrue\fi
1710
 
      {\authorfont \leftline{##1}}}%
1711
 
   %
1712
 
   % Most title ``pages'' are actually two pages long, with space
1713
 
   % at the top of the second.  We don't want the ragged left on the second.
1714
 
   \let\oldpage = \page
1715
 
   \def\page{%
 
1984
\envdef\titlepage{%
 
1985
  % Open one extra group, as we want to close it in the middle of \Etitlepage.
 
1986
  \begingroup
 
1987
    \parindent=0pt \textfonts
 
1988
    % Leave some space at the very top of the page.
 
1989
    \vglue\titlepagetopglue
 
1990
    % No rule at page bottom unless we print one at the top with @title.
 
1991
    \finishedtitlepagetrue
 
1992
    %
 
1993
    % Most title ``pages'' are actually two pages long, with space
 
1994
    % at the top of the second.  We don't want the ragged left on the second.
 
1995
    \let\oldpage = \page
 
1996
    \def\page{%
1716
1997
      \iffinishedtitlepage\else
1717
 
         \finishtitlepage
 
1998
         \finishtitlepage
1718
1999
      \fi
1719
 
      \oldpage
1720
2000
      \let\page = \oldpage
1721
 
      \hbox{}}%
1722
 
%   \def\page{\oldpage \hbox{}}
 
2001
      \page
 
2002
      \null
 
2003
    }%
1723
2004
}
1724
2005
 
1725
2006
\def\Etitlepage{%
1726
 
   \iffinishedtitlepage\else
1727
 
      \finishtitlepage
1728
 
   \fi
1729
 
   % It is important to do the page break before ending the group,
1730
 
   % because the headline and footline are only empty inside the group.
1731
 
   % If we use the new definition of \page, we always get a blank page
1732
 
   % after the title page, which we certainly don't want.
1733
 
   \oldpage
1734
 
   \endgroup
1735
 
   %
1736
 
   % Need this before the \...aftertitlepage checks so that if they are
1737
 
   % in effect the toc pages will come out with page numbers.
1738
 
   \HEADINGSon
1739
 
   %
1740
 
   % If they want short, they certainly want long too.
1741
 
   \ifsetshortcontentsaftertitlepage
1742
 
     \shortcontents
1743
 
     \contents
1744
 
     \global\let\shortcontents = \relax
1745
 
     \global\let\contents = \relax
1746
 
   \fi
1747
 
   %
1748
 
   \ifsetcontentsaftertitlepage
1749
 
     \contents
1750
 
     \global\let\contents = \relax
1751
 
     \global\let\shortcontents = \relax
1752
 
   \fi
 
2007
    \iffinishedtitlepage\else
 
2008
        \finishtitlepage
 
2009
    \fi
 
2010
    % It is important to do the page break before ending the group,
 
2011
    % because the headline and footline are only empty inside the group.
 
2012
    % If we use the new definition of \page, we always get a blank page
 
2013
    % after the title page, which we certainly don't want.
 
2014
    \oldpage
 
2015
  \endgroup
 
2016
  %
 
2017
  % Need this before the \...aftertitlepage checks so that if they are
 
2018
  % in effect the toc pages will come out with page numbers.
 
2019
  \HEADINGSon
 
2020
  %
 
2021
  % If they want short, they certainly want long too.
 
2022
  \ifsetshortcontentsaftertitlepage
 
2023
    \shortcontents
 
2024
    \contents
 
2025
    \global\let\shortcontents = \relax
 
2026
    \global\let\contents = \relax
 
2027
  \fi
 
2028
  %
 
2029
  \ifsetcontentsaftertitlepage
 
2030
    \contents
 
2031
    \global\let\contents = \relax
 
2032
    \global\let\shortcontents = \relax
 
2033
  \fi
1753
2034
}
1754
2035
 
1755
2036
\def\finishtitlepage{%
1756
 
   \vskip4pt \hrule height 2pt width \hsize
1757
 
   \vskip\titlepagebottomglue
1758
 
   \finishedtitlepagetrue
1759
 
}
 
2037
  \vskip4pt \hrule height 2pt width \hsize
 
2038
  \vskip\titlepagebottomglue
 
2039
  \finishedtitlepagetrue
 
2040
}
 
2041
 
 
2042
%%% Macros to be used within @titlepage:
 
2043
 
 
2044
\let\subtitlerm=\tenrm
 
2045
\def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}
 
2046
 
 
2047
\def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines
 
2048
                \let\tt=\authortt}
 
2049
 
 
2050
\parseargdef\title{%
 
2051
  \checkenv\titlepage
 
2052
  \leftline{\titlefonts\rm #1}
 
2053
  % print a rule at the page bottom also.
 
2054
  \finishedtitlepagefalse
 
2055
  \vskip4pt \hrule height 4pt width \hsize \vskip4pt
 
2056
}
 
2057
 
 
2058
\parseargdef\subtitle{%
 
2059
  \checkenv\titlepage
 
2060
  {\subtitlefont \rightline{#1}}%
 
2061
}
 
2062
 
 
2063
% @author should come last, but may come many times.
 
2064
% It can also be used inside @quotation.
 
2065
%
 
2066
\parseargdef\author{%
 
2067
  \def\temp{\quotation}%
 
2068
  \ifx\thisenv\temp
 
2069
    \def\quotationauthor{#1}% printed in \Equotation.
 
2070
  \else
 
2071
    \checkenv\titlepage
 
2072
    \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi
 
2073
    {\authorfont \leftline{#1}}%
 
2074
  \fi
 
2075
}
 
2076
 
1760
2077
 
1761
2078
%%% Set up page headings and footings.
1762
2079
 
1767
2084
\newtoks\evenfootline    % footline on even pages
1768
2085
\newtoks\oddfootline     % footline on odd pages
1769
2086
 
1770
 
% Now make Tex use those variables
 
2087
% Now make TeX use those variables
1771
2088
\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
1772
2089
                            \else \the\evenheadline \fi}}
1773
2090
\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
1781
2098
% @evenfooting @thisfile||
1782
2099
% @oddfooting ||@thisfile
1783
2100
 
 
2101
 
1784
2102
\def\evenheading{\parsearg\evenheadingxxx}
 
2103
\def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish}
 
2104
\def\evenheadingyyy #1\|#2\|#3\|#4\finish{%
 
2105
\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
 
2106
 
1785
2107
\def\oddheading{\parsearg\oddheadingxxx}
1786
 
\def\everyheading{\parsearg\everyheadingxxx}
 
2108
\def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish}
 
2109
\def\oddheadingyyy #1\|#2\|#3\|#4\finish{%
 
2110
\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
 
2111
 
 
2112
\parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
1787
2113
 
1788
2114
\def\evenfooting{\parsearg\evenfootingxxx}
 
2115
\def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish}
 
2116
\def\evenfootingyyy #1\|#2\|#3\|#4\finish{%
 
2117
\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
 
2118
 
1789
2119
\def\oddfooting{\parsearg\oddfootingxxx}
1790
 
\def\everyfooting{\parsearg\everyfootingxxx}
1791
 
 
1792
 
{\catcode`\@=0 %
1793
 
 
1794
 
\gdef\evenheadingxxx #1{\evenheadingyyy #1@|@|@|@|\finish}
1795
 
\gdef\evenheadingyyy #1@|#2@|#3@|#4\finish{%
1796
 
\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
1797
 
 
1798
 
\gdef\oddheadingxxx #1{\oddheadingyyy #1@|@|@|@|\finish}
1799
 
\gdef\oddheadingyyy #1@|#2@|#3@|#4\finish{%
1800
 
\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
1801
 
 
1802
 
\gdef\everyheadingxxx#1{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
1803
 
 
1804
 
\gdef\evenfootingxxx #1{\evenfootingyyy #1@|@|@|@|\finish}
1805
 
\gdef\evenfootingyyy #1@|#2@|#3@|#4\finish{%
1806
 
\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
1807
 
 
1808
 
\gdef\oddfootingxxx #1{\oddfootingyyy #1@|@|@|@|\finish}
1809
 
\gdef\oddfootingyyy #1@|#2@|#3@|#4\finish{%
 
2120
\def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish}
 
2121
\def\oddfootingyyy #1\|#2\|#3\|#4\finish{%
1810
2122
  \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
1811
2123
  %
1812
2124
  % Leave some space for the footline.  Hopefully ok to assume
1815
2127
  \global\advance\vsize by -\baselineskip
1816
2128
}
1817
2129
 
1818
 
\gdef\everyfootingxxx#1{\oddfootingxxx{#1}\evenfootingxxx{#1}}
1819
 
%
1820
 
}% unbind the catcode of @.
 
2130
\parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}}
 
2131
 
1821
2132
 
1822
2133
% @headings double      turns headings on for double-sided printing.
1823
2134
% @headings single      turns headings on for single-sided printing.
1831
2142
 
1832
2143
\def\headings #1 {\csname HEADINGS#1\endcsname}
1833
2144
 
1834
 
\def\HEADINGSoff{
 
2145
\def\HEADINGSoff{%
1835
2146
\global\evenheadline={\hfil} \global\evenfootline={\hfil}
1836
2147
\global\oddheadline={\hfil} \global\oddfootline={\hfil}}
1837
2148
\HEADINGSoff
1840
2151
% chapter name on inside top of right hand pages, document
1841
2152
% title on inside top of left hand pages, and page numbers on outside top
1842
2153
% edge of all pages.
1843
 
\def\HEADINGSdouble{
 
2154
\def\HEADINGSdouble{%
1844
2155
\global\pageno=1
1845
2156
\global\evenfootline={\hfil}
1846
2157
\global\oddfootline={\hfil}
1852
2163
 
1853
2164
% For single-sided printing, chapter title goes across top left of page,
1854
2165
% page number on top right.
1855
 
\def\HEADINGSsingle{
 
2166
\def\HEADINGSsingle{%
1856
2167
\global\pageno=1
1857
2168
\global\evenfootline={\hfil}
1858
2169
\global\oddfootline={\hfil}
1899
2210
% @settitle line...  specifies the title of the document, for headings.
1900
2211
% It generates no output of its own.
1901
2212
\def\thistitle{\putwordNoTitle}
1902
 
\def\settitle{\parsearg\settitlezzz}
1903
 
\def\settitlezzz #1{\gdef\thistitle{#1}}
 
2213
\def\settitle{\parsearg{\gdef\thistitle}}
1904
2214
 
1905
2215
 
1906
2216
\message{tables,}
1907
 
% Tables -- @table, @ftable, @vtable, @item(x), @kitem(x), @xitem(x).
 
2217
% Tables -- @table, @ftable, @vtable, @item(x).
1908
2218
 
1909
2219
% default indentation of table text
1910
2220
\newdimen\tableindent \tableindent=.8in
1916
2226
% used internally for \itemindent minus \itemmargin
1917
2227
\newdimen\itemmax
1918
2228
 
1919
 
% Note @table, @vtable, and @vtable define @item, @itemx, etc., with
 
2229
% Note @table, @ftable, and @vtable define @item, @itemx, etc., with
1920
2230
% these defs.
1921
2231
% They also define \itemindex
1922
2232
% to index the item name in whatever manner is desired (perhaps none).
1928
2238
\def\internalBitem{\smallbreak \parsearg\itemzzz}
1929
2239
\def\internalBitemx{\itemxpar \parsearg\itemzzz}
1930
2240
 
1931
 
\def\internalBxitem "#1"{\def\xitemsubtopix{#1} \smallbreak \parsearg\xitemzzz}
1932
 
\def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \itemxpar \parsearg\xitemzzz}
1933
 
 
1934
 
\def\internalBkitem{\smallbreak \parsearg\kitemzzz}
1935
 
\def\internalBkitemx{\itemxpar \parsearg\kitemzzz}
1936
 
 
1937
 
\def\kitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \lastfunction}}%
1938
 
                 \itemzzz {#1}}
1939
 
 
1940
 
\def\xitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \xitemsubtopic}}%
1941
 
                 \itemzzz {#1}}
1942
 
 
1943
2241
\def\itemzzz #1{\begingroup %
1944
2242
  \advance\hsize by -\rightskip
1945
2243
  \advance\hsize by -\tableindent
1946
 
  \setbox0=\hbox{\itemfont{#1}}%
 
2244
  \setbox0=\hbox{\itemindicate{#1}}%
1947
2245
  \itemindex{#1}%
1948
2246
  \nobreak % This prevents a break before @itemx.
1949
2247
  %
1997
2295
  \fi
1998
2296
}
1999
2297
 
2000
 
\def\item{\errmessage{@item while not in a table}}
2001
 
\def\itemx{\errmessage{@itemx while not in a table}}
2002
 
\def\kitem{\errmessage{@kitem while not in a table}}
2003
 
\def\kitemx{\errmessage{@kitemx while not in a table}}
2004
 
\def\xitem{\errmessage{@xitem while not in a table}}
2005
 
\def\xitemx{\errmessage{@xitemx while not in a table}}
2006
 
 
2007
 
% Contains a kludge to get @end[description] to work.
2008
 
\def\description{\tablez{\dontindex}{1}{}{}{}{}}
 
2298
\def\item{\errmessage{@item while not in a list environment}}
 
2299
\def\itemx{\errmessage{@itemx while not in a list environment}}
2009
2300
 
2010
2301
% @table, @ftable, @vtable.
2011
 
\def\table{\begingroup\inENV\obeylines\obeyspaces\tablex}
2012
 
{\obeylines\obeyspaces%
2013
 
\gdef\tablex #1^^M{%
2014
 
\tabley\dontindex#1        \endtabley}}
2015
 
 
2016
 
\def\ftable{\begingroup\inENV\obeylines\obeyspaces\ftablex}
2017
 
{\obeylines\obeyspaces%
2018
 
\gdef\ftablex #1^^M{%
2019
 
\tabley\fnitemindex#1        \endtabley
2020
 
\def\Eftable{\endgraf\afterenvbreak\endgroup}%
2021
 
\let\Etable=\relax}}
2022
 
 
2023
 
\def\vtable{\begingroup\inENV\obeylines\obeyspaces\vtablex}
2024
 
{\obeylines\obeyspaces%
2025
 
\gdef\vtablex #1^^M{%
2026
 
\tabley\vritemindex#1        \endtabley
2027
 
\def\Evtable{\endgraf\afterenvbreak\endgroup}%
2028
 
\let\Etable=\relax}}
2029
 
 
2030
 
\def\dontindex #1{}
2031
 
\def\fnitemindex #1{\doind {fn}{\code{#1}}}%
2032
 
\def\vritemindex #1{\doind {vr}{\code{#1}}}%
2033
 
 
2034
 
{\obeyspaces %
2035
 
\gdef\tabley#1#2 #3 #4 #5 #6 #7\endtabley{\endgroup%
2036
 
\tablez{#1}{#2}{#3}{#4}{#5}{#6}}}
2037
 
 
2038
 
\def\tablez #1#2#3#4#5#6{%
2039
 
\aboveenvbreak %
2040
 
\begingroup %
2041
 
\def\Edescription{\Etable}% Necessary kludge.
2042
 
\let\itemindex=#1%
2043
 
\ifnum 0#3>0 \advance \leftskip by #3\mil \fi %
2044
 
\ifnum 0#4>0 \tableindent=#4\mil \fi %
2045
 
\ifnum 0#5>0 \advance \rightskip by #5\mil \fi %
2046
 
\def\itemfont{#2}%
2047
 
\itemmax=\tableindent %
2048
 
\advance \itemmax by -\itemmargin %
2049
 
\advance \leftskip by \tableindent %
2050
 
\exdentamount=\tableindent
2051
 
\parindent = 0pt
2052
 
\parskip = \smallskipamount
2053
 
\ifdim \parskip=0pt \parskip=2pt \fi%
2054
 
\def\Etable{\endgraf\afterenvbreak\endgroup}%
2055
 
\let\item = \internalBitem %
2056
 
\let\itemx = \internalBitemx %
2057
 
\let\kitem = \internalBkitem %
2058
 
\let\kitemx = \internalBkitemx %
2059
 
\let\xitem = \internalBxitem %
2060
 
\let\xitemx = \internalBxitemx %
2061
 
}
 
2302
\envdef\table{%
 
2303
  \let\itemindex\gobble
 
2304
  \tablex
 
2305
}
 
2306
\envdef\ftable{%
 
2307
  \def\itemindex ##1{\doind {fn}{\code{##1}}}%
 
2308
  \tablex
 
2309
}
 
2310
\envdef\vtable{%
 
2311
  \def\itemindex ##1{\doind {vr}{\code{##1}}}%
 
2312
  \tablex
 
2313
}
 
2314
\def\tablex#1{%
 
2315
  \def\itemindicate{#1}%
 
2316
  \parsearg\tabley
 
2317
}
 
2318
\def\tabley#1{%
 
2319
  {%
 
2320
    \makevalueexpandable
 
2321
    \edef\temp{\noexpand\tablez #1\space\space\space}%
 
2322
    \expandafter
 
2323
  }\temp \endtablez
 
2324
}
 
2325
\def\tablez #1 #2 #3 #4\endtablez{%
 
2326
  \aboveenvbreak
 
2327
  \ifnum 0#1>0 \advance \leftskip by #1\mil \fi
 
2328
  \ifnum 0#2>0 \tableindent=#2\mil \fi
 
2329
  \ifnum 0#3>0 \advance \rightskip by #3\mil \fi
 
2330
  \itemmax=\tableindent
 
2331
  \advance \itemmax by -\itemmargin
 
2332
  \advance \leftskip by \tableindent
 
2333
  \exdentamount=\tableindent
 
2334
  \parindent = 0pt
 
2335
  \parskip = \smallskipamount
 
2336
  \ifdim \parskip=0pt \parskip=2pt \fi
 
2337
  \let\item = \internalBitem
 
2338
  \let\itemx = \internalBitemx
 
2339
}
 
2340
\def\Etable{\endgraf\afterenvbreak}
 
2341
\let\Eftable\Etable
 
2342
\let\Evtable\Etable
 
2343
\let\Eitemize\Etable
 
2344
\let\Eenumerate\Etable
2062
2345
 
2063
2346
% This is the counter used by @enumerate, which is really @itemize
2064
2347
 
2065
2348
\newcount \itemno
2066
2349
 
2067
 
\def\itemize{\parsearg\itemizezzz}
2068
 
 
2069
 
\def\itemizezzz #1{%
2070
 
  \begingroup % ended by the @end itemize
2071
 
  \itemizey {#1}{\Eitemize}
2072
 
}
2073
 
 
2074
 
\def\itemizey #1#2{%
2075
 
\aboveenvbreak %
2076
 
\itemmax=\itemindent %
2077
 
\advance \itemmax by -\itemmargin %
2078
 
\advance \leftskip by \itemindent %
2079
 
\exdentamount=\itemindent
2080
 
\parindent = 0pt %
2081
 
\parskip = \smallskipamount %
2082
 
\ifdim \parskip=0pt \parskip=2pt \fi%
2083
 
\def#2{\endgraf\afterenvbreak\endgroup}%
2084
 
\def\itemcontents{#1}%
2085
 
\let\item=\itemizeitem}
 
2350
\envdef\itemize{\parsearg\doitemize}
 
2351
 
 
2352
\def\doitemize#1{%
 
2353
  \aboveenvbreak
 
2354
  \itemmax=\itemindent
 
2355
  \advance\itemmax by -\itemmargin
 
2356
  \advance\leftskip by \itemindent
 
2357
  \exdentamount=\itemindent
 
2358
  \parindent=0pt
 
2359
  \parskip=\smallskipamount
 
2360
  \ifdim\parskip=0pt \parskip=2pt \fi
 
2361
  \def\itemcontents{#1}%
 
2362
  % @itemize with no arg is equivalent to @itemize @bullet.
 
2363
  \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi
 
2364
  \let\item=\itemizeitem
 
2365
}
 
2366
 
 
2367
% Definition of @item while inside @itemize and @enumerate.
 
2368
%
 
2369
\def\itemizeitem{%
 
2370
  \advance\itemno by 1  % for enumerations
 
2371
  {\let\par=\endgraf \smallbreak}% reasonable place to break
 
2372
  {%
 
2373
   % If the document has an @itemize directly after a section title, a
 
2374
   % \nobreak will be last on the list, and \sectionheading will have
 
2375
   % done a \vskip-\parskip.  In that case, we don't want to zero
 
2376
   % parskip, or the item text will crash with the heading.  On the
 
2377
   % other hand, when there is normal text preceding the item (as there
 
2378
   % usually is), we do want to zero parskip, or there would be too much
 
2379
   % space.  In that case, we won't have a \nobreak before.  At least
 
2380
   % that's the theory.
 
2381
   \ifnum\lastpenalty<10000 \parskip=0in \fi
 
2382
   \noindent
 
2383
   \hbox to 0pt{\hss \itemcontents \kern\itemmargin}%
 
2384
   \vadjust{\penalty 1200}}% not good to break after first line of item.
 
2385
  \flushcr
 
2386
}
2086
2387
 
2087
2388
% \splitoff TOKENS\endmark defines \first to be the first token in
2088
2389
% TOKENS, and \rest to be the remainder.
2093
2394
% or number, to specify the first label in the enumerated list.  No
2094
2395
% argument is the same as `1'.
2095
2396
%
2096
 
\def\enumerate{\parsearg\enumeratezzz}
2097
 
\def\enumeratezzz #1{\enumeratey #1  \endenumeratey}
 
2397
\envparseargdef\enumerate{\enumeratey #1  \endenumeratey}
2098
2398
\def\enumeratey #1 #2\endenumeratey{%
2099
 
  \begingroup % ended by the @end enumerate
2100
 
  %
2101
2399
  % If we were given no argument, pretend we were given `1'.
2102
2400
  \def\thearg{#1}%
2103
2401
  \ifx\thearg\empty \def\thearg{1}\fi
2168
2466
  }%
2169
2467
}
2170
2468
 
2171
 
% Call itemizey, adding a period to the first argument and supplying the
 
2469
% Call \doitemize, adding a period to the first argument and supplying the
2172
2470
% common last two arguments.  Also subtract one from the initial value in
2173
2471
% \itemno, since @item increments \itemno.
2174
2472
%
2175
2473
\def\startenumeration#1{%
2176
2474
  \advance\itemno by -1
2177
 
  \itemizey{#1.}\Eenumerate\flushcr
 
2475
  \doitemize{#1.}\flushcr
2178
2476
}
2179
2477
 
2180
2478
% @alphaenumerate and @capsenumerate are abbreviations for giving an arg
2185
2483
\def\Ealphaenumerate{\Eenumerate}
2186
2484
\def\Ecapsenumerate{\Eenumerate}
2187
2485
 
2188
 
% Definition of @item while inside @itemize.
2189
 
 
2190
 
\def\itemizeitem{%
2191
 
\advance\itemno by 1
2192
 
{\let\par=\endgraf \smallbreak}%
2193
 
\ifhmode \errmessage{In hmode at itemizeitem}\fi
2194
 
{\parskip=0in \hskip 0pt
2195
 
\hbox to 0pt{\hss \itemcontents\hskip \itemmargin}%
2196
 
\vadjust{\penalty 1200}}%
2197
 
\flushcr}
2198
2486
 
2199
2487
% @multitable macros
2200
2488
% Amy Hendrickson, 8/18/94, 3/6/96
2221
2509
%   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
2222
2510
%   @item ...
2223
2511
%   using the widest term desired in each column.
2224
 
%
2225
 
% For those who want to use more than one line's worth of words in
2226
 
% the preamble, break the line within one argument and it
2227
 
% will parse correctly, i.e.,
2228
 
%
2229
 
%     @multitable {Column 1 template} {Column 2 template} {Column 3
2230
 
%      template}
2231
 
% Not:
2232
 
%     @multitable {Column 1 template} {Column 2 template}
2233
 
%      {Column 3 template}
2234
2512
 
2235
2513
% Each new table line starts with @item, each subsequent new column
2236
2514
% starts with @tab. Empty columns may be produced by supplying @tab's
2237
2515
% with nothing between them for as many times as empty columns are needed,
2238
2516
% ie, @tab@tab@tab will produce two empty columns.
2239
2517
 
2240
 
% @item, @tab, @multitable or @end multitable do not need to be on their
2241
 
% own lines, but it will not hurt if they are.
 
2518
% @item, @tab do not need to be on their own lines, but it will not hurt
 
2519
% if they are.
2242
2520
 
2243
2521
% Sample multitable:
2244
2522
 
2282
2560
\def\xcolumnfractions{\columnfractions}
2283
2561
\newif\ifsetpercent
2284
2562
 
2285
 
% #1 is the part of the @columnfraction before the decimal point, which
2286
 
% is presumably either 0 or the empty string (but we don't check, we
2287
 
% just throw it away).  #2 is the decimal part, which we use as the
2288
 
% percent of \hsize for this column.
2289
 
\def\pickupwholefraction#1.#2 {%
 
2563
% #1 is the @columnfraction, usually a decimal number like .5, but might
 
2564
% be just 1.  We just use it, whatever it is.
 
2565
%
 
2566
\def\pickupwholefraction#1 {%
2290
2567
  \global\advance\colcount by 1
2291
 
  \expandafter\xdef\csname col\the\colcount\endcsname{.#2\hsize}%
 
2568
  \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}%
2292
2569
  \setuptable
2293
2570
}
2294
2571
 
2321
2598
  \go
2322
2599
}
2323
2600
 
 
2601
% multitable-only commands.
 
2602
%
 
2603
% @headitem starts a heading row, which we typeset in bold.
 
2604
% Assignments have to be global since we are inside the implicit group
 
2605
% of an alignment entry.  Note that \everycr resets \everytab.
 
2606
\def\headitem{\checkenv\multitable \crcr \global\everytab={\bf}\the\everytab}%
 
2607
%
 
2608
% A \tab used to include \hskip1sp.  But then the space in a template
 
2609
% line is not enough.  That is bad.  So let's go back to just `&' until
 
2610
% we encounter the problem it was intended to solve again.
 
2611
%                                       --karl, nathan@acm.org, 20apr99.
 
2612
\def\tab{\checkenv\multitable &\the\everytab}%
 
2613
 
2324
2614
% @multitable ... @end multitable definitions:
2325
2615
%
2326
 
\def\multitable{\parsearg\dotable}
2327
 
\def\dotable#1{\bgroup
 
2616
\newtoks\everytab  % insert after every tab.
 
2617
%
 
2618
\envdef\multitable{%
2328
2619
  \vskip\parskip
2329
 
  \let\item=\crcrwithfootnotes
2330
 
  % A \tab used to include \hskip1sp.  But then the space in a template
2331
 
  % line is not enough.  That is bad.  So let's go back to just & until
2332
 
  % we encounter the problem it was intended to solve again.  --karl,
2333
 
  % nathan@acm.org, 20apr99.
2334
 
  \let\tab=&%
2335
 
  \let\startfootins=\startsavedfootnote
 
2620
  \startsavinginserts
 
2621
  %
 
2622
  % @item within a multitable starts a normal row.
 
2623
  \let\item\crcr
 
2624
  %
2336
2625
  \tolerance=9500
2337
2626
  \hbadness=9500
2338
2627
  \setmultitablespacing
2340
2629
  \parindent=\multitableparindent
2341
2630
  \overfullrule=0pt
2342
2631
  \global\colcount=0
2343
 
  \def\Emultitable{%
2344
 
    \global\setpercentfalse
2345
 
    \crcrwithfootnotes\crcr
2346
 
    \egroup\egroup
 
2632
  %
 
2633
  \everycr = {%
 
2634
    \noalign{%
 
2635
      \global\everytab={}%
 
2636
      \global\colcount=0 % Reset the column counter.
 
2637
      % Check for saved footnotes, etc.
 
2638
      \checkinserts
 
2639
      % Keeps underfull box messages off when table breaks over pages.
 
2640
      %\filbreak
 
2641
        % Maybe so, but it also creates really weird page breaks when the
 
2642
        % table breaks over pages. Wouldn't \vfil be better?  Wait until the
 
2643
        % problem manifests itself, so it can be fixed for real --karl.
 
2644
    }%
2347
2645
  }%
2348
2646
  %
 
2647
  \parsearg\domultitable
 
2648
}
 
2649
\def\domultitable#1{%
2349
2650
  % To parse everything between @multitable and @item:
2350
2651
  \setuptable#1 \endsetuptable
2351
2652
  %
2352
 
  % \everycr will reset column counter, \colcount, at the end of
2353
 
  % each line. Every column entry will cause \colcount to advance by one.
2354
 
  % The table preamble
2355
 
  % looks at the current \colcount to find the correct column width.
2356
 
  \everycr{\noalign{%
2357
 
  %
2358
 
  % \filbreak%% keeps underfull box messages off when table breaks over pages.
2359
 
  % Maybe so, but it also creates really weird page breaks when the table
2360
 
  % breaks over pages. Wouldn't \vfil be better?  Wait until the problem
2361
 
  % manifests itself, so it can be fixed for real --karl.
2362
 
    \global\colcount=0\relax}}%
2363
 
  %
2364
2653
  % This preamble sets up a generic column definition, which will
2365
2654
  % be used as many times as user calls for columns.
2366
2655
  % \vtop will set a single line and will also let text wrap and
2367
2656
  % continue for many paragraphs if desired.
2368
 
  \halign\bgroup&\global\advance\colcount by 1\relax
2369
 
    \multistrut\vtop{\hsize=\expandafter\csname col\the\colcount\endcsname
2370
 
  %
2371
 
  % In order to keep entries from bumping into each other
2372
 
  % we will add a \leftskip of \multitablecolspace to all columns after
2373
 
  % the first one.
2374
 
  %
2375
 
  % If a template has been used, we will add \multitablecolspace
2376
 
  % to the width of each template entry.
2377
 
  %
2378
 
  % If the user has set preamble in terms of percent of \hsize we will
2379
 
  % use that dimension as the width of the column, and the \leftskip
2380
 
  % will keep entries from bumping into each other.  Table will start at
2381
 
  % left margin and final column will justify at right margin.
2382
 
  %
2383
 
  % Make sure we don't inherit \rightskip from the outer environment.
2384
 
  \rightskip=0pt
2385
 
  \ifnum\colcount=1
2386
 
    % The first column will be indented with the surrounding text.
2387
 
    \advance\hsize by\leftskip
2388
 
  \else
2389
 
    \ifsetpercent \else
2390
 
      % If user has not set preamble in terms of percent of \hsize
2391
 
      % we will advance \hsize by \multitablecolspace.
2392
 
      \advance\hsize by \multitablecolspace
2393
 
    \fi
2394
 
   % In either case we will make \leftskip=\multitablecolspace:
2395
 
  \leftskip=\multitablecolspace
2396
 
  \fi
2397
 
  % Ignoring space at the beginning and end avoids an occasional spurious
2398
 
  % blank line, when TeX decides to break the line at the space before the
2399
 
  % box from the multistrut, so the strut ends up on a line by itself.
2400
 
  % For example:
2401
 
  % @multitable @columnfractions .11 .89
2402
 
  % @item @code{#}
2403
 
  % @tab Legal holiday which is valid in major parts of the whole country.
2404
 
  % Is automatically provided with highlighting sequences respectively marking
2405
 
  % characters.
2406
 
  \noindent\ignorespaces##\unskip\multistrut}\cr
 
2657
  \halign\bgroup &%
 
2658
    \global\advance\colcount by 1
 
2659
    \multistrut
 
2660
    \vtop{%
 
2661
      % Use the current \colcount to find the correct column width:
 
2662
      \hsize=\expandafter\csname col\the\colcount\endcsname
 
2663
      %
 
2664
      % In order to keep entries from bumping into each other
 
2665
      % we will add a \leftskip of \multitablecolspace to all columns after
 
2666
      % the first one.
 
2667
      %
 
2668
      % If a template has been used, we will add \multitablecolspace
 
2669
      % to the width of each template entry.
 
2670
      %
 
2671
      % If the user has set preamble in terms of percent of \hsize we will
 
2672
      % use that dimension as the width of the column, and the \leftskip
 
2673
      % will keep entries from bumping into each other.  Table will start at
 
2674
      % left margin and final column will justify at right margin.
 
2675
      %
 
2676
      % Make sure we don't inherit \rightskip from the outer environment.
 
2677
      \rightskip=0pt
 
2678
      \ifnum\colcount=1
 
2679
        % The first column will be indented with the surrounding text.
 
2680
        \advance\hsize by\leftskip
 
2681
      \else
 
2682
        \ifsetpercent \else
 
2683
          % If user has not set preamble in terms of percent of \hsize
 
2684
          % we will advance \hsize by \multitablecolspace.
 
2685
          \advance\hsize by \multitablecolspace
 
2686
        \fi
 
2687
       % In either case we will make \leftskip=\multitablecolspace:
 
2688
      \leftskip=\multitablecolspace
 
2689
      \fi
 
2690
      % Ignoring space at the beginning and end avoids an occasional spurious
 
2691
      % blank line, when TeX decides to break the line at the space before the
 
2692
      % box from the multistrut, so the strut ends up on a line by itself.
 
2693
      % For example:
 
2694
      % @multitable @columnfractions .11 .89
 
2695
      % @item @code{#}
 
2696
      % @tab Legal holiday which is valid in major parts of the whole country.
 
2697
      % Is automatically provided with highlighting sequences respectively
 
2698
      % marking characters.
 
2699
      \noindent\ignorespaces##\unskip\multistrut
 
2700
    }\cr
 
2701
}
 
2702
\def\Emultitable{%
 
2703
  \crcr
 
2704
  \egroup % end the \halign
 
2705
  \global\setpercentfalse
2407
2706
}
2408
2707
 
2409
2708
\def\setmultitablespacing{% test to see if user has set \multitablelinespace.
2433
2732
                                      %% than skip between lines in the table.
2434
2733
\fi}
2435
2734
 
2436
 
% In case a @footnote appears inside an alignment, save the footnote
2437
 
% text to a box and make the \insert when a row of the table is
2438
 
% finished.  Otherwise, the insertion is lost, it never migrates to the
2439
 
% main vertical list.  --kasal, 22jan03.
2440
 
%
2441
 
\newbox\savedfootnotes
2442
 
%
2443
 
% \dotable \let's \startfootins to this, so that \dofootnote will call
2444
 
% it instead of starting the insertion right away.
2445
 
\def\startsavedfootnote{%
2446
 
  \global\setbox\savedfootnotes = \vbox\bgroup
2447
 
    \unvbox\savedfootnotes
2448
 
}
2449
 
\def\crcrwithfootnotes{%
2450
 
  \crcr
2451
 
  \ifvoid\savedfootnotes \else
2452
 
    \noalign{\insert\footins{\box\savedfootnotes}}%
2453
 
  \fi
2454
 
}
2455
2735
 
2456
2736
\message{conditionals,}
2457
 
% Prevent errors for section commands.
2458
 
% Used in @ignore and in failing conditionals.
2459
 
\def\ignoresections{%
2460
 
  \let\chapter=\relax
2461
 
  \let\unnumbered=\relax
2462
 
  \let\top=\relax
2463
 
  \let\unnumberedsec=\relax
2464
 
  \let\unnumberedsection=\relax
2465
 
  \let\unnumberedsubsec=\relax
2466
 
  \let\unnumberedsubsection=\relax
2467
 
  \let\unnumberedsubsubsec=\relax
2468
 
  \let\unnumberedsubsubsection=\relax
2469
 
  \let\section=\relax
2470
 
  \let\subsec=\relax
2471
 
  \let\subsubsec=\relax
2472
 
  \let\subsection=\relax
2473
 
  \let\subsubsection=\relax
2474
 
  \let\appendix=\relax
2475
 
  \let\appendixsec=\relax
2476
 
  \let\appendixsection=\relax
2477
 
  \let\appendixsubsec=\relax
2478
 
  \let\appendixsubsection=\relax
2479
 
  \let\appendixsubsubsec=\relax
2480
 
  \let\appendixsubsubsection=\relax
2481
 
  \let\contents=\relax
2482
 
  \let\smallbook=\relax
2483
 
  \let\titlepage=\relax
2484
 
}
2485
2737
 
2486
 
% Used in nested conditionals, where we have to parse the Texinfo source
2487
 
% and so want to turn off most commands, in case they are used
2488
 
% incorrectly.
 
2738
% @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext,
 
2739
% @ifnotxml always succeed.  They currently do nothing; we don't
 
2740
% attempt to check whether the conditionals are properly nested.  But we
 
2741
% have to remember that they are conditionals, so that @end doesn't
 
2742
% attempt to close an environment group.
2489
2743
%
2490
 
% We use \empty instead of \relax for the @def... commands, so that \end
2491
 
% doesn't throw an error.  For instance:
2492
 
% @ignore
2493
 
% @deffn ...
2494
 
% @end deffn
2495
 
% @end ignore
2496
 
2497
 
% The @end deffn is going to get expanded, because we're trying to allow
2498
 
% nested conditionals.  But we don't want to expand the actual @deffn,
2499
 
% since it might be syntactically correct and intended to be ignored.
2500
 
% Since \end checks for \relax, using \empty does not cause an error.
2501
 
2502
 
\def\ignoremorecommands{%
2503
 
  \let\defcodeindex = \relax
2504
 
  \let\defcv = \empty
2505
 
  \let\defcvx = \empty
2506
 
  \let\Edefcv = \empty
2507
 
  \let\deffn = \empty
2508
 
  \let\deffnx = \empty
2509
 
  \let\Edeffn = \empty
2510
 
  \let\defindex = \relax
2511
 
  \let\defivar = \empty
2512
 
  \let\defivarx = \empty
2513
 
  \let\Edefivar = \empty
2514
 
  \let\defmac = \empty
2515
 
  \let\defmacx = \empty
2516
 
  \let\Edefmac = \empty
2517
 
  \let\defmethod = \empty
2518
 
  \let\defmethodx = \empty
2519
 
  \let\Edefmethod = \empty
2520
 
  \let\defop = \empty
2521
 
  \let\defopx = \empty
2522
 
  \let\Edefop = \empty
2523
 
  \let\defopt = \empty
2524
 
  \let\defoptx = \empty
2525
 
  \let\Edefopt = \empty
2526
 
  \let\defspec = \empty
2527
 
  \let\defspecx = \empty
2528
 
  \let\Edefspec = \empty
2529
 
  \let\deftp = \empty
2530
 
  \let\deftpx = \empty
2531
 
  \let\Edeftp = \empty
2532
 
  \let\deftypefn = \empty
2533
 
  \let\deftypefnx = \empty
2534
 
  \let\Edeftypefn = \empty
2535
 
  \let\deftypefun = \empty
2536
 
  \let\deftypefunx = \empty
2537
 
  \let\Edeftypefun = \empty
2538
 
  \let\deftypeivar = \empty
2539
 
  \let\deftypeivarx = \empty
2540
 
  \let\Edeftypeivar = \empty
2541
 
  \let\deftypemethod = \empty
2542
 
  \let\deftypemethodx = \empty
2543
 
  \let\Edeftypemethod = \empty
2544
 
  \let\deftypeop = \empty
2545
 
  \let\deftypeopx = \empty
2546
 
  \let\Edeftypeop = \empty
2547
 
  \let\deftypevar = \empty
2548
 
  \let\deftypevarx = \empty
2549
 
  \let\Edeftypevar = \empty
2550
 
  \let\deftypevr = \empty
2551
 
  \let\deftypevrx = \empty
2552
 
  \let\Edeftypevr = \empty
2553
 
  \let\defun = \empty
2554
 
  \let\defunx = \empty
2555
 
  \let\Edefun = \empty
2556
 
  \let\defvar = \empty
2557
 
  \let\defvarx = \empty
2558
 
  \let\Edefvar = \empty
2559
 
  \let\defvr = \empty
2560
 
  \let\defvrx = \empty
2561
 
  \let\Edefvr = \empty
2562
 
  \let\clear = \relax
2563
 
  \let\down = \relax
2564
 
  \let\evenfooting = \relax
2565
 
  \let\evenheading = \relax
2566
 
  \let\everyfooting = \relax
2567
 
  \let\everyheading = \relax
2568
 
  \let\headings = \relax
2569
 
  \let\include = \relax
2570
 
  \let\item = \relax
2571
 
  \let\lowersections = \relax
2572
 
  \let\oddfooting = \relax
2573
 
  \let\oddheading = \relax
2574
 
  \let\printindex = \relax
2575
 
  \let\pxref = \relax
2576
 
  \let\raisesections = \relax
2577
 
  \let\ref = \relax
2578
 
  \let\set = \relax
2579
 
  \let\setchapternewpage = \relax
2580
 
  \let\setchapterstyle = \relax
2581
 
  \let\settitle = \relax
2582
 
  \let\up = \relax
2583
 
  \let\verbatiminclude = \relax
2584
 
  \let\xref = \relax
 
2744
\def\makecond#1{%
 
2745
  \expandafter\let\csname #1\endcsname = \relax
 
2746
  \expandafter\let\csname iscond.#1\endcsname = 1
2585
2747
}
 
2748
\makecond{iftex}
 
2749
\makecond{ifnotdocbook}
 
2750
\makecond{ifnothtml}
 
2751
\makecond{ifnotinfo}
 
2752
\makecond{ifnotplaintext}
 
2753
\makecond{ifnotxml}
2586
2754
 
2587
2755
% Ignore @ignore, @ifhtml, @ifinfo, and the like.
2588
2756
%
2589
2757
\def\direntry{\doignore{direntry}}
2590
 
\def\documentdescriptionword{documentdescription}
2591
2758
\def\documentdescription{\doignore{documentdescription}}
 
2759
\def\docbook{\doignore{docbook}}
2592
2760
\def\html{\doignore{html}}
 
2761
\def\ifdocbook{\doignore{ifdocbook}}
2593
2762
\def\ifhtml{\doignore{ifhtml}}
2594
2763
\def\ifinfo{\doignore{ifinfo}}
2595
2764
\def\ifnottex{\doignore{ifnottex}}
2599
2768
\def\menu{\doignore{menu}}
2600
2769
\def\xml{\doignore{xml}}
2601
2770
 
2602
 
% @dircategory CATEGORY  -- specify a category of the dir file
2603
 
% which this file should belong to.  Ignore this in TeX.
2604
 
\let\dircategory = \comment
2605
 
 
2606
 
% Ignore text until a line `@end #1'.
 
2771
% Ignore text until a line `@end #1', keeping track of nested conditionals.
2607
2772
%
 
2773
% A count to remember the depth of nesting.
 
2774
\newcount\doignorecount
 
2775
 
2608
2776
\def\doignore#1{\begingroup
2609
 
  % Don't complain about control sequences we have declared \outer.
2610
 
  \ignoresections
2611
 
  %
2612
 
  % Define a command to swallow text until we reach `@end #1'.
2613
 
  % This @ is a catcode 12 token (that is the normal catcode of @ in
2614
 
  % this texinfo.tex file).  We change the catcode of @ below to match.
2615
 
  \long\def\doignoretext##1@end #1{\enddoignore}%
 
2777
  % Scan in ``verbatim'' mode:
 
2778
  \catcode`\@ = \other
 
2779
  \catcode`\{ = \other
 
2780
  \catcode`\} = \other
2616
2781
  %
2617
2782
  % Make sure that spaces turn into tokens that match what \doignoretext wants.
2618
 
  \catcode\spaceChar = 10
2619
 
  %
2620
 
  % Ignore braces, too, so mismatched braces don't cause trouble.
2621
 
  \catcode`\{ = 9
2622
 
  \catcode`\} = 9
2623
 
  %
2624
 
  % We must not have @c interpreted as a control sequence.
2625
 
  \catcode`\@ = 12
2626
 
  %
2627
 
  \def\ignoreword{#1}%
2628
 
  \ifx\ignoreword\documentdescriptionword
2629
 
    % The c kludge breaks documentdescription, since
2630
 
    % `documentdescription' contains a `c'.  Means not everything will
2631
 
    % be ignored inside @documentdescription, but oh well...
2632
 
  \else
2633
 
    % Make the letter c a comment character so that the rest of the line
2634
 
    % will be ignored. This way, the document can have (for example)
2635
 
    %   @c @end ifinfo
2636
 
    % and the @end ifinfo will be properly ignored.
2637
 
    % (We've just changed @ to catcode 12.)
2638
 
    \catcode`\c = 14
2639
 
  \fi
2640
 
  %
2641
 
  % And now expand the command defined above.
2642
 
  \doignoretext
2643
 
}
2644
 
 
2645
 
% What we do to finish off ignored text.
2646
 
%
2647
 
\def\enddoignore{\endgroup\ignorespaces}%
2648
 
 
2649
 
\newif\ifwarnedobs\warnedobsfalse
2650
 
\def\obstexwarn{%
2651
 
  \ifwarnedobs\relax\else
2652
 
  % We need to warn folks that they may have trouble with TeX 3.0.
2653
 
  % This uses \immediate\write16 rather than \message to get newlines.
2654
 
    \immediate\write16{}
2655
 
    \immediate\write16{WARNING: for users of Unix TeX 3.0!}
2656
 
    \immediate\write16{This manual trips a bug in TeX version 3.0 (tex hangs).}
2657
 
    \immediate\write16{If you are running another version of TeX, relax.}
2658
 
    \immediate\write16{If you are running Unix TeX 3.0, kill this TeX process.}
2659
 
    \immediate\write16{  Then upgrade your TeX installation if you can.}
2660
 
    \immediate\write16{  (See ftp://ftp.gnu.org/non-gnu/TeX.README.)}
2661
 
    \immediate\write16{If you are stuck with version 3.0, run the}
2662
 
    \immediate\write16{  script ``tex3patch'' from the Texinfo distribution}
2663
 
    \immediate\write16{  to use a workaround.}
2664
 
    \immediate\write16{}
2665
 
    \global\warnedobstrue
2666
 
    \fi
2667
 
}
2668
 
 
2669
 
% **In TeX 3.0, setting text in \nullfont hangs tex.  For a
2670
 
% workaround (which requires the file ``dummy.tfm'' to be installed),
2671
 
% uncomment the following line:
2672
 
%%%%%\font\nullfont=dummy\let\obstexwarn=\relax
2673
 
 
2674
 
% Ignore text, except that we keep track of conditional commands for
2675
 
% purposes of nesting, up to an `@end #1' command.
2676
 
%
2677
 
\def\nestedignore#1{%
2678
 
  \obstexwarn
2679
 
  % We must actually expand the ignored text to look for the @end
2680
 
  % command, so that nested ignore constructs work.  Thus, we put the
2681
 
  % text into a \vbox and then do nothing with the result.  To minimize
2682
 
  % the chance of memory overflow, we follow the approach outlined on
2683
 
  % page 401 of the TeXbook.
2684
 
  %
2685
 
  \setbox0 = \vbox\bgroup
2686
 
    % Don't complain about control sequences we have declared \outer.
2687
 
    \ignoresections
2688
 
    %
2689
 
    % Define `@end #1' to end the box, which will in turn undefine the
2690
 
    % @end command again.
2691
 
    \expandafter\def\csname E#1\endcsname{\egroup\ignorespaces}%
2692
 
    %
2693
 
    % We are going to be parsing Texinfo commands.  Most cause no
2694
 
    % trouble when they are used incorrectly, but some commands do
2695
 
    % complicated argument parsing or otherwise get confused, so we
2696
 
    % undefine them.
2697
 
    %
2698
 
    % We can't do anything about stray @-signs, unfortunately;
2699
 
    % they'll produce `undefined control sequence' errors.
2700
 
    \ignoremorecommands
2701
 
    %
2702
 
    % Set the current font to be \nullfont, a TeX primitive, and define
2703
 
    % all the font commands to also use \nullfont.  We don't use
2704
 
    % dummy.tfm, as suggested in the TeXbook, because some sites
2705
 
    % might not have that installed.  Therefore, math mode will still
2706
 
    % produce output, but that should be an extremely small amount of
2707
 
    % stuff compared to the main input.
2708
 
    %
2709
 
    \nullfont
2710
 
    \let\tenrm=\nullfont \let\tenit=\nullfont \let\tensl=\nullfont
2711
 
    \let\tenbf=\nullfont \let\tentt=\nullfont \let\smallcaps=\nullfont
2712
 
    \let\tensf=\nullfont
2713
 
    % Similarly for index fonts.
2714
 
    \let\smallrm=\nullfont \let\smallit=\nullfont \let\smallsl=\nullfont
2715
 
    \let\smallbf=\nullfont \let\smalltt=\nullfont \let\smallsc=\nullfont
2716
 
    \let\smallsf=\nullfont
2717
 
    % Similarly for smallexample fonts.
2718
 
    \let\smallerrm=\nullfont \let\smallerit=\nullfont \let\smallersl=\nullfont
2719
 
    \let\smallerbf=\nullfont \let\smallertt=\nullfont \let\smallersc=\nullfont
2720
 
    \let\smallersf=\nullfont
2721
 
    %
2722
 
    % Don't complain when characters are missing from the fonts.
2723
 
    \tracinglostchars = 0
2724
 
    %
2725
 
    % Don't bother to do space factor calculations.
2726
 
    \frenchspacing
2727
 
    %
2728
 
    % Don't report underfull hboxes.
2729
 
    \hbadness = 10000
2730
 
    %
2731
 
    % Do minimal line-breaking.
2732
 
    \pretolerance = 10000
2733
 
    %
2734
 
    % Do not execute instructions in @tex.
2735
 
    \def\tex{\doignore{tex}}%
2736
 
    % Do not execute macro definitions.
2737
 
    % `c' is a comment character, so the word `macro' will get cut off.
2738
 
    \def\macro{\doignore{ma}}%
2739
 
}
 
2783
  \spaceisspace
 
2784
  %
 
2785
  % Count number of #1's that we've seen.
 
2786
  \doignorecount = 0
 
2787
  %
 
2788
  % Swallow text until we reach the matching `@end #1'.
 
2789
  \dodoignore {#1}%
 
2790
}
 
2791
 
 
2792
{ \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source.
 
2793
  \obeylines %
 
2794
  %
 
2795
  \gdef\dodoignore#1{%
 
2796
    % #1 contains the string `ifinfo'.
 
2797
    %
 
2798
    % Define a command to find the next `@end #1', which must be on a line
 
2799
    % by itself.
 
2800
    \long\def\doignoretext##1^^M@end #1{\doignoretextyyy##1^^M@#1\_STOP_}%
 
2801
    % And this command to find another #1 command, at the beginning of a
 
2802
    % line.  (Otherwise, we would consider a line `@c @ifset', for
 
2803
    % example, to count as an @ifset for nesting.)
 
2804
    \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}%
 
2805
    %
 
2806
    % And now expand that command.
 
2807
    \obeylines %
 
2808
    \doignoretext ^^M%
 
2809
  }%
 
2810
}
 
2811
 
 
2812
\def\doignoreyyy#1{%
 
2813
  \def\temp{#1}%
 
2814
  \ifx\temp\empty                       % Nothing found.
 
2815
    \let\next\doignoretextzzz
 
2816
  \else                                 % Found a nested condition, ...
 
2817
    \advance\doignorecount by 1
 
2818
    \let\next\doignoretextyyy           % ..., look for another.
 
2819
    % If we're here, #1 ends with ^^M\ifinfo (for example).
 
2820
  \fi
 
2821
  \next #1% the token \_STOP_ is present just after this macro.
 
2822
}
 
2823
 
 
2824
% We have to swallow the remaining "\_STOP_".
 
2825
%
 
2826
\def\doignoretextzzz#1{%
 
2827
  \ifnum\doignorecount = 0      % We have just found the outermost @end.
 
2828
    \let\next\enddoignore
 
2829
  \else                         % Still inside a nested condition.
 
2830
    \advance\doignorecount by -1
 
2831
    \let\next\doignoretext      % Look for the next @end.
 
2832
  \fi
 
2833
  \next
 
2834
}
 
2835
 
 
2836
% Finish off ignored text.
 
2837
\def\enddoignore{\endgroup\ignorespaces}
 
2838
 
2740
2839
 
2741
2840
% @set VAR sets the variable VAR to an empty value.
2742
2841
% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
2744
2843
% Since we want to separate VAR from REST-OF-LINE (which might be
2745
2844
% empty), we can't just use \parsearg; we have to insert a space of our
2746
2845
% own to delimit the rest of the line, and then take it out again if we
2747
 
% didn't need it.  Make sure the catcode of space is correct to avoid
2748
 
% losing inside @example, for instance.
 
2846
% didn't need it.
 
2847
% We rely on the fact that \parsearg sets \catcode`\ =10.
2749
2848
%
2750
 
\def\set{\begingroup\catcode` =10
2751
 
  \catcode`\-=12 \catcode`\_=12 % Allow - and _ in VAR.
2752
 
  \parsearg\setxxx}
2753
 
\def\setxxx#1{\setyyy#1 \endsetyyy}
 
2849
\parseargdef\set{\setyyy#1 \endsetyyy}
2754
2850
\def\setyyy#1 #2\endsetyyy{%
2755
 
  \def\temp{#2}%
2756
 
  \ifx\temp\empty \global\expandafter\let\csname SET#1\endcsname = \empty
2757
 
  \else \setzzz{#1}#2\endsetzzz % Remove the trailing space \setxxx inserted.
2758
 
  \fi
2759
 
  \endgroup
 
2851
  {%
 
2852
    \makevalueexpandable
 
2853
    \def\temp{#2}%
 
2854
    \edef\next{\gdef\makecsname{SET#1}}%
 
2855
    \ifx\temp\empty
 
2856
      \next{}%
 
2857
    \else
 
2858
      \setzzz#2\endsetzzz
 
2859
    \fi
 
2860
  }%
2760
2861
}
2761
 
% Can't use \xdef to pre-expand #2 and save some time, since \temp or
2762
 
% \next or other control sequences that we've defined might get us into
2763
 
% an infinite loop. Consider `@set foo @cite{bar}'.
2764
 
\def\setzzz#1#2 \endsetzzz{\expandafter\gdef\csname SET#1\endcsname{#2}}
 
2862
% Remove the trailing space \setxxx inserted.
 
2863
\def\setzzz#1 \endsetzzz{\next{#1}}
2765
2864
 
2766
2865
% @clear VAR clears (i.e., unsets) the variable VAR.
2767
2866
%
2768
 
\def\clear{\parsearg\clearxxx}
2769
 
\def\clearxxx#1{\global\expandafter\let\csname SET#1\endcsname=\relax}
 
2867
\parseargdef\clear{%
 
2868
  {%
 
2869
    \makevalueexpandable
 
2870
    \global\expandafter\let\csname SET#1\endcsname=\relax
 
2871
  }%
 
2872
}
2770
2873
 
2771
2874
% @value{foo} gets the text saved in variable foo.
 
2875
\def\value{\begingroup\makevalueexpandable\valuexxx}
 
2876
\def\valuexxx#1{\expandablevalue{#1}\endgroup}
2772
2877
{
2773
 
  \catcode`\_ = \active
 
2878
  \catcode`\- = \active \catcode`\_ = \active
2774
2879
  %
2775
 
  % We might end up with active _ or - characters in the argument if
2776
 
  % we're called from @code, as @code{@value{foo-bar_}}.  So \let any
2777
 
  % such active characters to their normal equivalents.
2778
 
  \gdef\value{\begingroup
 
2880
  \gdef\makevalueexpandable{%
 
2881
    \let\value = \expandablevalue
 
2882
    % We don't want these characters active, ...
2779
2883
    \catcode`\-=\other \catcode`\_=\other
2780
 
    \indexbreaks \let_\normalunderscore
2781
 
    \valuexxx}
 
2884
    % ..., but we might end up with active ones in the argument if
 
2885
    % we're called from @code, as @code{@value{foo-bar_}}, though.
 
2886
    % So \let them to their normal equivalents.
 
2887
    \let-\realdash \let_\normalunderscore
 
2888
  }
2782
2889
}
2783
 
\def\valuexxx#1{\expandablevalue{#1}\endgroup}
2784
2890
 
2785
2891
% We have this subroutine so that we can handle at least some @value's
2786
 
% properly in indexes (we \let\value to this in \indexdummies).  Ones
2787
 
% whose names contain - or _ still won't work, but we can't do anything
2788
 
% about that.  The command has to be fully expandable (if the variable
2789
 
% is set), since the result winds up in the index file.  This means that
2790
 
% if the variable's value contains other Texinfo commands, it's almost
2791
 
% certain it will fail (although perhaps we could fix that with
2792
 
% sufficient work to do a one-level expansion on the result, instead of
2793
 
% complete).
 
2892
% properly in indexes (we call \makevalueexpandable in \indexdummies).
 
2893
% The command has to be fully expandable (if the variable is set), since
 
2894
% the result winds up in the index file.  This means that if the
 
2895
% variable's value contains other Texinfo commands, it's almost certain
 
2896
% it will fail (although perhaps we could fix that with sufficient work
 
2897
% to do a one-level expansion on the result, instead of complete).
2794
2898
%
2795
2899
\def\expandablevalue#1{%
2796
2900
  \expandafter\ifx\csname SET#1\endcsname\relax
2804
2908
% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
2805
2909
% with @set.
2806
2910
%
2807
 
\def\ifset{\parsearg\doifset}
2808
 
\def\doifset#1{%
2809
 
  \expandafter\ifx\csname SET#1\endcsname\relax
2810
 
    \let\next=\ifsetfail
2811
 
  \else
2812
 
    \let\next=\ifsetsucceed
2813
 
  \fi
2814
 
  \next
 
2911
% To get special treatment of `@end ifset,' call \makeond and the redefine.
 
2912
%
 
2913
\makecond{ifset}
 
2914
\def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}}
 
2915
\def\doifset#1#2{%
 
2916
  {%
 
2917
    \makevalueexpandable
 
2918
    \let\next=\empty
 
2919
    \expandafter\ifx\csname SET#2\endcsname\relax
 
2920
      #1% If not set, redefine \next.
 
2921
    \fi
 
2922
    \expandafter
 
2923
  }\next
2815
2924
}
2816
 
\def\ifsetsucceed{\conditionalsucceed{ifset}}
2817
 
\def\ifsetfail{\nestedignore{ifset}}
2818
 
\defineunmatchedend{ifset}
 
2925
\def\ifsetfail{\doignore{ifset}}
2819
2926
 
2820
2927
% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been
2821
2928
% defined with @set, or has been undefined with @clear.
2822
2929
%
2823
 
\def\ifclear{\parsearg\doifclear}
2824
 
\def\doifclear#1{%
2825
 
  \expandafter\ifx\csname SET#1\endcsname\relax
2826
 
    \let\next=\ifclearsucceed
2827
 
  \else
2828
 
    \let\next=\ifclearfail
2829
 
  \fi
2830
 
  \next
2831
 
}
2832
 
\def\ifclearsucceed{\conditionalsucceed{ifclear}}
2833
 
\def\ifclearfail{\nestedignore{ifclear}}
2834
 
\defineunmatchedend{ifclear}
2835
 
 
2836
 
% @iftex, @ifnothtml, @ifnotinfo, @ifnotplaintext always succeed; we
2837
 
% read the text following, through the first @end iftex (etc.).  Make
2838
 
% `@end iftex' (etc.) valid only after an @iftex.
2839
 
%
2840
 
\def\iftex{\conditionalsucceed{iftex}}
2841
 
\def\ifnothtml{\conditionalsucceed{ifnothtml}}
2842
 
\def\ifnotinfo{\conditionalsucceed{ifnotinfo}}
2843
 
\def\ifnotplaintext{\conditionalsucceed{ifnotplaintext}}
2844
 
\defineunmatchedend{iftex}
2845
 
\defineunmatchedend{ifnothtml}
2846
 
\defineunmatchedend{ifnotinfo}
2847
 
\defineunmatchedend{ifnotplaintext}
2848
 
 
2849
 
% True conditional.  Since \set globally defines its variables, we can
2850
 
% just start and end a group (to keep the @end definition undefined at
2851
 
% the outer level).
2852
 
%
2853
 
\def\conditionalsucceed#1{\begingroup
2854
 
  \expandafter\def\csname E#1\endcsname{\endgroup}%
2855
 
}
 
2930
% The `\else' inside the `\doifset' parameter is a trick to reuse the
 
2931
% above code: if the variable is not set, do nothing, if it is set,
 
2932
% then redefine \next to \ifclearfail.
 
2933
%
 
2934
\makecond{ifclear}
 
2935
\def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}}
 
2936
\def\ifclearfail{\doignore{ifclear}}
 
2937
 
 
2938
% @dircategory CATEGORY  -- specify a category of the dir file
 
2939
% which this file should belong to.  Ignore this in TeX.
 
2940
\let\dircategory=\comment
2856
2941
 
2857
2942
% @defininfoenclose.
2858
2943
\let\definfoenclose=\comment
2903
2988
 
2904
2989
% @synindex foo bar    makes index foo feed into index bar.
2905
2990
% Do this instead of @defindex foo if you don't want it as a separate index.
2906
 
 
2991
%
2907
2992
% @syncodeindex foo bar   similar, but put all entries made for index foo
2908
2993
% inside @code.
2909
 
 
2994
%
2910
2995
\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}}
2911
2996
\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}}
2912
2997
 
2948
3033
% Take care of Texinfo commands that can appear in an index entry.
2949
3034
% Since there are some commands we want to expand, and others we don't,
2950
3035
% we have to laboriously prevent expansion for those that we don't.
2951
 
 
3036
%
2952
3037
\def\indexdummies{%
2953
3038
  \def\@{@}% change to @@ when we switch to @ as escape char in index files.
2954
3039
  \def\ {\realbackslash\space }%
2955
3040
  % Need these in case \tex is in effect and \{ is a \delimiter again.
2956
3041
  % But can't use \lbracecmd and \rbracecmd because texindex assumes
2957
 
  % braces and backslashes are used only as delimiters.  
 
3042
  % braces and backslashes are used only as delimiters.
2958
3043
  \let\{ = \mylbrace
2959
3044
  \let\} = \myrbrace
2960
3045
  %
2963
3048
  % words, not control letters, because the \space would be incorrect
2964
3049
  % for control characters, but is needed to separate the control word
2965
3050
  % from whatever follows.
2966
 
  % 
 
3051
  %
2967
3052
  % For control letters, we have \definedummyletter, which omits the
2968
3053
  % space.
2969
 
  % 
 
3054
  %
2970
3055
  % These can be used both for control words that take an argument and
2971
3056
  % those that do not.  If it is followed by {arg} in the input, then
2972
3057
  % that will dutifully get written to the index (or wherever).
2973
 
  % 
 
3058
  %
2974
3059
  \def\definedummyword##1{%
2975
3060
    \expandafter\def\csname ##1\endcsname{\realbackslash ##1\space}%
2976
3061
  }%
2977
3062
  \def\definedummyletter##1{%
2978
3063
    \expandafter\def\csname ##1\endcsname{\realbackslash ##1}%
2979
3064
  }%
 
3065
  \let\definedummyaccent\definedummyletter
2980
3066
  %
2981
3067
  % Do the redefinitions.
2982
3068
  \commondummies
2983
3069
}
2984
3070
 
2985
3071
% For the aux file, @ is the escape character.  So we want to redefine
2986
 
% everything using @ instead of \realbackslash.  When everything uses 
 
3072
% everything using @ instead of \realbackslash.  When everything uses
2987
3073
% @, this will be simpler.
2988
 
 
3074
%
2989
3075
\def\atdummies{%
2990
3076
  \def\@{@@}%
2991
3077
  \def\ {@ }%
2999
3085
  \def\definedummyletter##1{%
3000
3086
    \expandafter\def\csname ##1\endcsname{@##1}%
3001
3087
  }%
 
3088
  \let\definedummyaccent\definedummyletter
3002
3089
  %
3003
3090
  % Do the redefinitions.
3004
3091
  \commondummies
3006
3093
 
3007
3094
% Called from \indexdummies and \atdummies.  \definedummyword and
3008
3095
% \definedummyletter must be defined first.
3009
 
 
3096
%
3010
3097
\def\commondummies{%
3011
3098
  %
3012
3099
  \normalturnoffactive
3013
3100
  %
3014
 
  % Control letters and accents.
 
3101
  \commondummiesnofonts
 
3102
  %
3015
3103
  \definedummyletter{_}%
3016
 
  \definedummyletter{,}%
3017
 
  \definedummyletter{"}%
3018
 
  \definedummyletter{`}%
3019
 
  \definedummyletter{'}%
3020
 
  \definedummyletter{^}%
3021
 
  \definedummyletter{~}%
3022
 
  \definedummyletter{=}%
3023
 
  \definedummyword{u}%
3024
 
  \definedummyword{v}%
3025
 
  \definedummyword{H}%
3026
 
  \definedummyword{dotaccent}%
3027
 
  \definedummyword{ringaccent}%
3028
 
  \definedummyword{tieaccent}%
3029
 
  \definedummyword{ubaraccent}%
3030
 
  \definedummyword{udotaccent}%
3031
 
  \definedummyword{dotless}%
3032
3104
  %
3033
 
  % Other non-English letters.
 
3105
  % Non-English letters.
3034
3106
  \definedummyword{AA}%
3035
3107
  \definedummyword{AE}%
3036
3108
  \definedummyword{L}%
3042
3114
  \definedummyword{oe}%
3043
3115
  \definedummyword{o}%
3044
3116
  \definedummyword{ss}%
 
3117
  \definedummyword{exclamdown}%
 
3118
  \definedummyword{questiondown}%
 
3119
  \definedummyword{ordf}%
 
3120
  \definedummyword{ordm}%
3045
3121
  %
3046
3122
  % Although these internal commands shouldn't show up, sometimes they do.
3047
3123
  \definedummyword{bf}%
3053
3129
  \definedummyword{tclose}%
3054
3130
  \definedummyword{tt}%
3055
3131
  %
3056
 
  % Texinfo font commands.
3057
 
  \definedummyword{b}%
3058
 
  \definedummyword{i}%
3059
 
  \definedummyword{r}%
3060
 
  \definedummyword{sc}%
3061
 
  \definedummyword{t}%
3062
 
  %
 
3132
  \definedummyword{LaTeX}%
3063
3133
  \definedummyword{TeX}%
3064
 
  \definedummyword{acronym}%
3065
 
  \definedummyword{cite}%
3066
 
  \definedummyword{code}%
3067
 
  \definedummyword{command}%
3068
 
  \definedummyword{dfn}%
3069
 
  \definedummyword{dots}%
3070
 
  \definedummyword{emph}%
3071
 
  \definedummyword{env}%
3072
 
  \definedummyword{file}%
3073
 
  \definedummyword{kbd}%
3074
 
  \definedummyword{key}%
3075
 
  \definedummyword{math}%
3076
 
  \definedummyword{option}%
3077
 
  \definedummyword{samp}%
3078
 
  \definedummyword{strong}%
3079
 
  \definedummyword{uref}%
3080
 
  \definedummyword{url}%
3081
 
  \definedummyword{var}%
3082
 
  \definedummyword{w}%
3083
3134
  %
3084
3135
  % Assorted special characters.
3085
3136
  \definedummyword{bullet}%
3086
3137
  \definedummyword{copyright}%
 
3138
  \definedummyword{registeredsymbol}%
3087
3139
  \definedummyword{dots}%
3088
3140
  \definedummyword{enddots}%
3089
3141
  \definedummyword{equiv}%
3095
3147
  \definedummyword{print}%
3096
3148
  \definedummyword{result}%
3097
3149
  %
3098
 
  % Handle some cases of @value -- where the variable name does not
3099
 
  % contain - or _, and the value does not contain any
 
3150
  % Handle some cases of @value -- where it does not contain any
3100
3151
  % (non-fully-expandable) commands.
3101
 
  \let\value = \expandablevalue
 
3152
  \makevalueexpandable
3102
3153
  %
3103
3154
  % Normal spaces, not active ones.
3104
3155
  \unsepspaces
3107
3158
  \turnoffmacros
3108
3159
}
3109
3160
 
3110
 
% If an index command is used in an @example environment, any spaces
3111
 
% therein should become regular spaces in the raw index file, not the
3112
 
% expansion of \tie (\leavevmode \penalty \@M \ ).
3113
 
{\obeyspaces
3114
 
 \gdef\unsepspaces{\obeyspaces\let =\space}}
3115
 
 
 
3161
% \commondummiesnofonts: common to \commondummies and \indexnofonts.
 
3162
%
 
3163
% Better have this without active chars.
 
3164
{
 
3165
  \catcode`\~=\other
 
3166
  \gdef\commondummiesnofonts{%
 
3167
    % Control letters and accents.
 
3168
    \definedummyletter{!}%
 
3169
    \definedummyaccent{"}%
 
3170
    \definedummyaccent{'}%
 
3171
    \definedummyletter{*}%
 
3172
    \definedummyaccent{,}%
 
3173
    \definedummyletter{.}%
 
3174
    \definedummyletter{/}%
 
3175
    \definedummyletter{:}%
 
3176
    \definedummyaccent{=}%
 
3177
    \definedummyletter{?}%
 
3178
    \definedummyaccent{^}%
 
3179
    \definedummyaccent{`}%
 
3180
    \definedummyaccent{~}%
 
3181
    \definedummyword{u}%
 
3182
    \definedummyword{v}%
 
3183
    \definedummyword{H}%
 
3184
    \definedummyword{dotaccent}%
 
3185
    \definedummyword{ringaccent}%
 
3186
    \definedummyword{tieaccent}%
 
3187
    \definedummyword{ubaraccent}%
 
3188
    \definedummyword{udotaccent}%
 
3189
    \definedummyword{dotless}%
 
3190
    %
 
3191
    % Texinfo font commands.
 
3192
    \definedummyword{b}%
 
3193
    \definedummyword{i}%
 
3194
    \definedummyword{r}%
 
3195
    \definedummyword{sc}%
 
3196
    \definedummyword{t}%
 
3197
    %
 
3198
    % Commands that take arguments.
 
3199
    \definedummyword{acronym}%
 
3200
    \definedummyword{cite}%
 
3201
    \definedummyword{code}%
 
3202
    \definedummyword{command}%
 
3203
    \definedummyword{dfn}%
 
3204
    \definedummyword{emph}%
 
3205
    \definedummyword{env}%
 
3206
    \definedummyword{file}%
 
3207
    \definedummyword{kbd}%
 
3208
    \definedummyword{key}%
 
3209
    \definedummyword{math}%
 
3210
    \definedummyword{option}%
 
3211
    \definedummyword{samp}%
 
3212
    \definedummyword{strong}%
 
3213
    \definedummyword{tie}%
 
3214
    \definedummyword{uref}%
 
3215
    \definedummyword{url}%
 
3216
    \definedummyword{var}%
 
3217
    \definedummyword{verb}%
 
3218
    \definedummyword{w}%
 
3219
  }
 
3220
}
3116
3221
 
3117
3222
% \indexnofonts is used when outputting the strings to sort the index
3118
3223
% by, and when constructing control sequence names.  It eliminates all
3119
3224
% control sequences and just writes whatever the best ASCII sort string
3120
3225
% would be for a given command (usually its argument).
3121
3226
%
3122
 
\def\indexdummytex{TeX}
3123
 
\def\indexdummydots{...}
3124
 
%
3125
3227
\def\indexnofonts{%
 
3228
  % Accent commands should become @asis.
 
3229
  \def\definedummyaccent##1{%
 
3230
    \expandafter\let\csname ##1\endcsname\asis
 
3231
  }%
 
3232
  % We can just ignore other control letters.
 
3233
  \def\definedummyletter##1{%
 
3234
    \expandafter\def\csname ##1\endcsname{}%
 
3235
  }%
 
3236
  % Hopefully, all control words can become @asis.
 
3237
  \let\definedummyword\definedummyaccent
 
3238
  %
 
3239
  \commondummiesnofonts
 
3240
  %
 
3241
  % Don't no-op \tt, since it isn't a user-level command
 
3242
  % and is used in the definitions of the active chars like <, >, |, etc.
 
3243
  % Likewise with the other plain tex font commands.
 
3244
  %\let\tt=\asis
 
3245
  %
3126
3246
  \def\ { }%
3127
3247
  \def\@{@}%
3128
3248
  % how to handle braces?
3129
3249
  \def\_{\normalunderscore}%
3130
3250
  %
3131
 
  \let\,=\asis
3132
 
  \let\"=\asis
3133
 
  \let\`=\asis
3134
 
  \let\'=\asis
3135
 
  \let\^=\asis
3136
 
  \let\~=\asis
3137
 
  \let\==\asis
3138
 
  \let\u=\asis
3139
 
  \let\v=\asis
3140
 
  \let\H=\asis
3141
 
  \let\dotaccent=\asis
3142
 
  \let\ringaccent=\asis
3143
 
  \let\tieaccent=\asis
3144
 
  \let\ubaraccent=\asis
3145
 
  \let\udotaccent=\asis
3146
 
  \let\dotless=\asis
3147
 
  %
3148
 
  % Other non-English letters.
 
3251
  % Non-English letters.
3149
3252
  \def\AA{AA}%
3150
3253
  \def\AE{AE}%
3151
3254
  \def\L{L}%
3159
3262
  \def\ss{ss}%
3160
3263
  \def\exclamdown{!}%
3161
3264
  \def\questiondown{?}%
3162
 
  %
3163
 
  % Don't no-op \tt, since it isn't a user-level command
3164
 
  % and is used in the definitions of the active chars like <, >, |, etc.
3165
 
  % Likewise with the other plain tex font commands.
3166
 
  %\let\tt=\asis
3167
 
  %
3168
 
  % Texinfo font commands.
3169
 
  \let\b=\asis
3170
 
  \let\i=\asis
3171
 
  \let\r=\asis
3172
 
  \let\sc=\asis
3173
 
  \let\t=\asis
3174
 
  %
3175
 
  \let\TeX=\indexdummytex
3176
 
  \let\acronym=\asis
3177
 
  \let\cite=\asis
3178
 
  \let\code=\asis
3179
 
  \let\command=\asis
3180
 
  \let\dfn=\asis
3181
 
  \let\dots=\indexdummydots
3182
 
  \let\emph=\asis
3183
 
  \let\env=\asis
3184
 
  \let\file=\asis
3185
 
  \let\kbd=\asis
3186
 
  \let\key=\asis
3187
 
  \let\math=\asis
3188
 
  \let\option=\asis
3189
 
  \let\samp=\asis
3190
 
  \let\strong=\asis
3191
 
  \let\uref=\asis
3192
 
  \let\url=\asis
3193
 
  \let\var=\asis
3194
 
  \let\w=\asis
 
3265
  \def\ordf{a}%
 
3266
  \def\ordm{o}%
 
3267
  %
 
3268
  \def\LaTeX{LaTeX}%
 
3269
  \def\TeX{TeX}%
 
3270
  %
 
3271
  % Assorted special characters.
 
3272
  % (The following {} will end up in the sort string, but that's ok.)
 
3273
  \def\bullet{bullet}%
 
3274
  \def\copyright{copyright}%
 
3275
  \def\registeredsymbol{R}%
 
3276
  \def\dots{...}%
 
3277
  \def\enddots{...}%
 
3278
  \def\equiv{==}%
 
3279
  \def\error{error}%
 
3280
  \def\expansion{==>}%
 
3281
  \def\minus{-}%
 
3282
  \def\pounds{pounds}%
 
3283
  \def\point{.}%
 
3284
  \def\print{-|}%
 
3285
  \def\result{=>}%
 
3286
  %
 
3287
  % Don't write macro names.
 
3288
  \emptyusermacros
3195
3289
}
3196
3290
 
3197
3291
\let\indexbackslash=0  %overridden during \printindex.
3198
3292
\let\SETmarginindex=\relax % put index entries in margin (undocumented)?
3199
3293
 
3200
 
% For \ifx comparisons.
3201
 
\def\emptymacro{\empty}
3202
 
 
3203
3294
% Most index entries go through here, but \dosubind is the general case.
3204
 
%
3205
 
\def\doind#1#2{\dosubind{#1}{#2}\empty}
 
3295
% #1 is the index name, #2 is the entry text.
 
3296
\def\doind#1#2{\dosubind{#1}{#2}{}}
3206
3297
 
3207
3298
% Workhorse for all \fooindexes.
3208
3299
% #1 is name of index, #2 is stuff to put there, #3 is subentry --
3209
 
% \empty if called from \doind, as we usually are.  The main exception
3210
 
% is with defuns, which call us directly.
 
3300
% empty if called from \doind, as we usually are (the main exception
 
3301
% is with most defuns, which call us directly).
3211
3302
%
3212
3303
\def\dosubind#1#2#3{%
 
3304
  \iflinks
 
3305
  {%
 
3306
    % Store the main index entry text (including the third arg).
 
3307
    \toks0 = {#2}%
 
3308
    % If third arg is present, precede it with a space.
 
3309
    \def\thirdarg{#3}%
 
3310
    \ifx\thirdarg\empty \else
 
3311
      \toks0 = \expandafter{\the\toks0 \space #3}%
 
3312
    \fi
 
3313
    %
 
3314
    \edef\writeto{\csname#1indfile\endcsname}%
 
3315
    %
 
3316
    \ifvmode
 
3317
      \dosubindsanitize
 
3318
    \else
 
3319
      \dosubindwrite
 
3320
    \fi
 
3321
  }%
 
3322
  \fi
 
3323
}
 
3324
 
 
3325
% Write the entry in \toks0 to the index file:
 
3326
%
 
3327
\def\dosubindwrite{%
3213
3328
  % Put the index entry in the margin if desired.
3214
3329
  \ifx\SETmarginindex\relax\else
3215
 
    \insert\margin{\hbox{\vrule height8pt depth3pt width0pt #2}}%
3216
 
  \fi
3217
 
  {%
3218
 
    \count255=\lastpenalty
3219
 
    {%
3220
 
      \indexdummies % Must do this here, since \bf, etc expand at this stage
3221
 
      \escapechar=`\\
3222
 
      {%
3223
 
        \let\folio = 0% We will expand all macros now EXCEPT \folio.
3224
 
        \def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now
3225
 
        % so it will be output as is; and it will print as backslash.
3226
 
        %
3227
 
        % The main index entry text.
3228
 
        \toks0 = {#2}%
3229
 
        %
3230
 
        % If third arg is present, precede it with space in sort key.
3231
 
        \def\thirdarg{#3}%
3232
 
        \ifx\thirdarg\emptymacro \else
3233
 
           % If the third (subentry) arg is present, add it to the index
3234
 
           % line to write.
3235
 
          \toks0 = \expandafter{\the\toks0 \space #3}%
3236
 
        \fi
3237
 
        %
3238
 
        % Process the index entry with all font commands turned off, to
3239
 
        % get the string to sort by.
3240
 
        {\indexnofonts
3241
 
         \edef\temp{\the\toks0}% need full expansion
3242
 
         \xdef\indexsorttmp{\temp}%
3243
 
        }%
3244
 
        %
3245
 
        % Set up the complete index entry, with both the sort key and
3246
 
        % the original text, including any font commands.  We write
3247
 
        % three arguments to \entry to the .?? file (four in the
3248
 
        % subentry case), texindex reduces to two when writing the .??s
3249
 
        % sorted result.
3250
 
        \edef\temp{%
3251
 
          \write\csname#1indfile\endcsname{%
3252
 
            \realbackslash entry{\indexsorttmp}{\folio}{\the\toks0}}%
3253
 
        }%
3254
 
        %
3255
 
        % If a skip is the last thing on the list now, preserve it
3256
 
        % by backing up by \lastskip, doing the \write, then inserting
3257
 
        % the skip again.  Otherwise, the whatsit generated by the
3258
 
        % \write will make \lastskip zero.  The result is that sequences
3259
 
        % like this:
3260
 
        % @end defun
3261
 
        % @tindex whatever
3262
 
        % @defun ...
3263
 
        % will have extra space inserted, because the \medbreak in the
3264
 
        % start of the @defun won't see the skip inserted by the @end of
3265
 
        % the previous defun.
3266
 
        %
3267
 
        % But don't do any of this if we're not in vertical mode.  We
3268
 
        % don't want to do a \vskip and prematurely end a paragraph.
3269
 
        %
3270
 
        % Avoid page breaks due to these extra skips, too.
3271
 
        %
3272
 
        \iflinks
3273
 
          \ifvmode
3274
 
            \skip0 = \lastskip
3275
 
            \ifdim\lastskip = 0pt \else \nobreak\vskip-\skip0 \fi
3276
 
          \fi
3277
 
          %
3278
 
          \temp % do the write
3279
 
          %
3280
 
          \ifvmode \ifdim\skip0 = 0pt \else \nobreak\vskip\skip0 \fi \fi
3281
 
        \fi
3282
 
      }%
3283
 
    }%
3284
 
    \penalty\count255
3285
 
  }%
 
3330
    \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}%
 
3331
  \fi
 
3332
  %
 
3333
  % Remember, we are within a group.
 
3334
  \indexdummies % Must do this here, since \bf, etc expand at this stage
 
3335
  \escapechar=`\\
 
3336
  \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now
 
3337
      % so it will be output as is; and it will print as backslash.
 
3338
  %
 
3339
  % Process the index entry with all font commands turned off, to
 
3340
  % get the string to sort by.
 
3341
  {\indexnofonts
 
3342
   \edef\temp{\the\toks0}% need full expansion
 
3343
   \xdef\indexsorttmp{\temp}%
 
3344
  }%
 
3345
  %
 
3346
  % Set up the complete index entry, with both the sort key and
 
3347
  % the original text, including any font commands.  We write
 
3348
  % three arguments to \entry to the .?? file (four in the
 
3349
  % subentry case), texindex reduces to two when writing the .??s
 
3350
  % sorted result.
 
3351
  \edef\temp{%
 
3352
    \write\writeto{%
 
3353
      \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}%
 
3354
  }%
 
3355
  \temp
 
3356
}
 
3357
 
 
3358
% Take care of unwanted page breaks:
 
3359
%
 
3360
% If a skip is the last thing on the list now, preserve it
 
3361
% by backing up by \lastskip, doing the \write, then inserting
 
3362
% the skip again.  Otherwise, the whatsit generated by the
 
3363
% \write will make \lastskip zero.  The result is that sequences
 
3364
% like this:
 
3365
% @end defun
 
3366
% @tindex whatever
 
3367
% @defun ...
 
3368
% will have extra space inserted, because the \medbreak in the
 
3369
% start of the @defun won't see the skip inserted by the @end of
 
3370
% the previous defun.
 
3371
%
 
3372
% But don't do any of this if we're not in vertical mode.  We
 
3373
% don't want to do a \vskip and prematurely end a paragraph.
 
3374
%
 
3375
% Avoid page breaks due to these extra skips, too.
 
3376
%
 
3377
% But wait, there is a catch there:
 
3378
% We'll have to check whether \lastskip is zero skip.  \ifdim is not
 
3379
% sufficient for this purpose, as it ignores stretch and shrink parts
 
3380
% of the skip.  The only way seems to be to check the textual
 
3381
% representation of the skip.
 
3382
%
 
3383
% The following is almost like \def\zeroskipmacro{0.0pt} except that
 
3384
% the ``p'' and ``t'' characters have catcode \other, not 11 (letter).
 
3385
%
 
3386
\edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname}
 
3387
%
 
3388
% ..., ready, GO:
 
3389
%
 
3390
\def\dosubindsanitize{%
 
3391
  % \lastskip and \lastpenalty cannot both be nonzero simultaneously.
 
3392
  \skip0 = \lastskip
 
3393
  \edef\lastskipmacro{\the\lastskip}%
 
3394
  \count255 = \lastpenalty
 
3395
  %
 
3396
  % If \lastskip is nonzero, that means the last item was a
 
3397
  % skip.  And since a skip is discardable, that means this
 
3398
  % -\skip0 glue we're inserting is preceded by a
 
3399
  % non-discardable item, therefore it is not a potential
 
3400
  % breakpoint, therefore no \nobreak needed.
 
3401
  \ifx\lastskipmacro\zeroskipmacro
 
3402
  \else
 
3403
    \vskip-\skip0
 
3404
  \fi
 
3405
  %
 
3406
  \dosubindwrite
 
3407
  %
 
3408
  \ifx\lastskipmacro\zeroskipmacro
 
3409
    % if \lastskip was zero, perhaps the last item was a
 
3410
    % penalty, and perhaps it was >=10000, e.g., a \nobreak.
 
3411
    % In that case, we want to re-insert the penalty; since we
 
3412
    % just inserted a non-discardable item, any following glue
 
3413
    % (such as a \parskip) would be a breakpoint.  For example:
 
3414
    %   @deffn deffn-whatever
 
3415
    %   @vindex index-whatever
 
3416
    %   Description.
 
3417
    % would allow a break between the index-whatever whatsit
 
3418
    % and the "Description." paragraph.
 
3419
    \ifnum\count255>9999 \nobreak \fi
 
3420
  \else
 
3421
    % On the other hand, if we had a nonzero \lastskip,
 
3422
    % this make-up glue would be preceded by a non-discardable item
 
3423
    % (the whatsit from the \write), so we must insert a \nobreak.
 
3424
    \nobreak\vskip\skip0
 
3425
  \fi
3286
3426
}
3287
3427
 
3288
3428
% The index entry written in the file actually looks like
3320
3460
% @printindex causes a particular index (the ??s file) to get printed.
3321
3461
% It does not print any chapter heading (usually an @unnumbered).
3322
3462
%
3323
 
\def\printindex{\parsearg\doprintindex}
3324
 
\def\doprintindex#1{\begingroup
 
3463
\parseargdef\printindex{\begingroup
3325
3464
  \dobreak \chapheadingskip{10000}%
3326
3465
  %
3327
3466
  \smallfonts \rm
3328
3467
  \tolerance = 9500
3329
 
  \indexbreaks
 
3468
  \everypar = {}% don't want the \kern\-parindent from indentation suppression.
3330
3469
  %
3331
3470
  % See if the index file exists and is nonempty.
3332
3471
  % Change catcode of @ here so that if the index file contains
3353
3492
      % Index files are almost Texinfo source, but we use \ as the escape
3354
3493
      % character.  It would be better to use @, but that's too big a change
3355
3494
      % to make right now.
3356
 
      \def\indexbackslash{\rawbackslashxx}%
 
3495
      \def\indexbackslash{\backslashcurfont}%
3357
3496
      \catcode`\\ = 0
3358
3497
      \escapechar = `\\
3359
3498
      \begindoublecolumns
3391
3530
  \nobreak
3392
3531
}}
3393
3532
 
3394
 
% This typesets a paragraph consisting of #1, dot leaders, and then #2
3395
 
% flush to the right margin.  It is used for index and table of contents
3396
 
% entries.  The paragraph is indented by \leftskip.
3397
 
%
3398
 
\def\entry#1#2{\begingroup
3399
 
  %
3400
 
  % Start a new paragraph if necessary, so our assignments below can't
3401
 
  % affect previous text.
3402
 
  \par
3403
 
  %
3404
 
  % Do not fill out the last line with white space.
3405
 
  \parfillskip = 0in
3406
 
  %
3407
 
  % No extra space above this paragraph.
3408
 
  \parskip = 0in
3409
 
  %
3410
 
  % Do not prefer a separate line ending with a hyphen to fewer lines.
3411
 
  \finalhyphendemerits = 0
3412
 
  %
3413
 
  % \hangindent is only relevant when the entry text and page number
3414
 
  % don't both fit on one line.  In that case, bob suggests starting the
3415
 
  % dots pretty far over on the line.  Unfortunately, a large
3416
 
  % indentation looks wrong when the entry text itself is broken across
3417
 
  % lines.  So we use a small indentation and put up with long leaders.
3418
 
  %
3419
 
  % \hangafter is reset to 1 (which is the value we want) at the start
3420
 
  % of each paragraph, so we need not do anything with that.
3421
 
  \hangindent = 2em
3422
 
  %
3423
 
  % When the entry text needs to be broken, just fill out the first line
3424
 
  % with blank space.
3425
 
  \rightskip = 0pt plus1fil
3426
 
  %
3427
 
  % A bit of stretch before each entry for the benefit of balancing columns.
3428
 
  \vskip 0pt plus1pt
3429
 
  %
3430
 
  % Start a ``paragraph'' for the index entry so the line breaking
3431
 
  % parameters we've set above will have an effect.
3432
 
  \noindent
3433
 
  %
3434
 
  % Insert the text of the index entry.  TeX will do line-breaking on it.
3435
 
  #1%
3436
 
  % The following is kludged to not output a line of dots in the index if
3437
 
  % there are no page numbers.  The next person who breaks this will be
3438
 
  % cursed by a Unix daemon.
3439
 
  \def\tempa{{\rm }}%
3440
 
  \def\tempb{#2}%
3441
 
  \edef\tempc{\tempa}%
3442
 
  \edef\tempd{\tempb}%
3443
 
  \ifx\tempc\tempd\ \else%
3444
 
    %
3445
 
    % If we must, put the page number on a line of its own, and fill out
3446
 
    % this line with blank space.  (The \hfil is overwhelmed with the
3447
 
    % fill leaders glue in \indexdotfill if the page number does fit.)
3448
 
    \hfil\penalty50
3449
 
    \null\nobreak\indexdotfill % Have leaders before the page number.
3450
 
    %
3451
 
    % The `\ ' here is removed by the implicit \unskip that TeX does as
3452
 
    % part of (the primitive) \par.  Without it, a spurious underfull
3453
 
    % \hbox ensues.
3454
 
    \ifpdf
3455
 
      \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
 
3533
% \entry typesets a paragraph consisting of the text (#1), dot leaders, and
 
3534
% then page number (#2) flushed to the right margin.  It is used for index
 
3535
% and table of contents entries.  The paragraph is indented by \leftskip.
 
3536
%
 
3537
% A straightforward implementation would start like this:
 
3538
%       \def\entry#1#2{...
 
3539
% But this frozes the catcodes in the argument, and can cause problems to
 
3540
% @code, which sets - active.  This problem was fixed by a kludge---
 
3541
% ``-'' was active throughout whole index, but this isn't really right.
 
3542
%
 
3543
% The right solution is to prevent \entry from swallowing the whole text.
 
3544
%                                 --kasal, 21nov03
 
3545
\def\entry{%
 
3546
  \begingroup
 
3547
    %
 
3548
    % Start a new paragraph if necessary, so our assignments below can't
 
3549
    % affect previous text.
 
3550
    \par
 
3551
    %
 
3552
    % Do not fill out the last line with white space.
 
3553
    \parfillskip = 0in
 
3554
    %
 
3555
    % No extra space above this paragraph.
 
3556
    \parskip = 0in
 
3557
    %
 
3558
    % Do not prefer a separate line ending with a hyphen to fewer lines.
 
3559
    \finalhyphendemerits = 0
 
3560
    %
 
3561
    % \hangindent is only relevant when the entry text and page number
 
3562
    % don't both fit on one line.  In that case, bob suggests starting the
 
3563
    % dots pretty far over on the line.  Unfortunately, a large
 
3564
    % indentation looks wrong when the entry text itself is broken across
 
3565
    % lines.  So we use a small indentation and put up with long leaders.
 
3566
    %
 
3567
    % \hangafter is reset to 1 (which is the value we want) at the start
 
3568
    % of each paragraph, so we need not do anything with that.
 
3569
    \hangindent = 2em
 
3570
    %
 
3571
    % When the entry text needs to be broken, just fill out the first line
 
3572
    % with blank space.
 
3573
    \rightskip = 0pt plus1fil
 
3574
    %
 
3575
    % A bit of stretch before each entry for the benefit of balancing
 
3576
    % columns.
 
3577
    \vskip 0pt plus1pt
 
3578
    %
 
3579
    % Swallow the left brace of the text (first parameter):
 
3580
    \afterassignment\doentry
 
3581
    \let\temp =
 
3582
}
 
3583
\def\doentry{%
 
3584
    \bgroup % Instead of the swallowed brace.
 
3585
      \noindent
 
3586
      \aftergroup\finishentry
 
3587
      % And now comes the text of the entry.
 
3588
}
 
3589
\def\finishentry#1{%
 
3590
    % #1 is the page number.
 
3591
    %
 
3592
    % The following is kludged to not output a line of dots in the index if
 
3593
    % there are no page numbers.  The next person who breaks this will be
 
3594
    % cursed by a Unix daemon.
 
3595
    \def\tempa{{\rm }}%
 
3596
    \def\tempb{#1}%
 
3597
    \edef\tempc{\tempa}%
 
3598
    \edef\tempd{\tempb}%
 
3599
    \ifx\tempc\tempd
 
3600
      \ %
3456
3601
    \else
3457
 
      \ #2% The page number ends the paragraph.
 
3602
      %
 
3603
      % If we must, put the page number on a line of its own, and fill out
 
3604
      % this line with blank space.  (The \hfil is overwhelmed with the
 
3605
      % fill leaders glue in \indexdotfill if the page number does fit.)
 
3606
      \hfil\penalty50
 
3607
      \null\nobreak\indexdotfill % Have leaders before the page number.
 
3608
      %
 
3609
      % The `\ ' here is removed by the implicit \unskip that TeX does as
 
3610
      % part of (the primitive) \par.  Without it, a spurious underfull
 
3611
      % \hbox ensues.
 
3612
      \ifpdf
 
3613
        \pdfgettoks#1.%
 
3614
        \ \the\toksA
 
3615
      \else
 
3616
        \ #1%
 
3617
      \fi
3458
3618
    \fi
3459
 
  \fi%
3460
 
  \par
3461
 
\endgroup}
 
3619
    \par
 
3620
  \endgroup
 
3621
}
3462
3622
 
3463
3623
% Like \dotfill except takes at least 1 em.
3464
3624
\def\indexdotfill{\cleaders
3569
3729
  \wd0=\hsize \wd2=\hsize
3570
3730
  \hbox to\pagewidth{\box0\hfil\box2}%
3571
3731
}
3572
 
 
3732
%
3573
3733
% All done with double columns.
3574
3734
\def\enddoublecolumns{%
3575
3735
  \output = {%
3627
3787
\message{sectioning,}
3628
3788
% Chapters, sections, etc.
3629
3789
 
 
3790
% \unnumberedno is an oxymoron, of course.  But we count the unnumbered
 
3791
% sections so that we can refer to them unambiguously in the pdf
 
3792
% outlines by their "section number".  We avoid collisions with chapter
 
3793
% numbers by starting them at 10000.  (If a document ever has 10000
 
3794
% chapters, we're in trouble anyway, I'm sure.)
 
3795
\newcount\unnumberedno \unnumberedno = 10000
3630
3796
\newcount\chapno
3631
3797
\newcount\secno        \secno=0
3632
3798
\newcount\subsecno     \subsecno=0
3634
3800
 
3635
3801
% This counter is funny since it counts through charcodes of letters A, B, ...
3636
3802
\newcount\appendixno  \appendixno = `\@
 
3803
%
3637
3804
% \def\appendixletter{\char\the\appendixno}
3638
 
% We do the following for the sake of pdftex, which needs the actual
 
3805
% We do the following ugly conditional instead of the above simple
 
3806
% construct for the sake of pdftex, which needs the actual
3639
3807
% letter in the expansion, not just typeset.
 
3808
%
3640
3809
\def\appendixletter{%
3641
3810
  \ifnum\appendixno=`A A%
3642
3811
  \else\ifnum\appendixno=`B B%
3674
3843
 
3675
3844
% Each @chapter defines this as the name of the chapter.
3676
3845
% page headings and footings can use it.  @section does likewise.
 
3846
% However, they are not reliable, because we don't use marks.
3677
3847
\def\thischapter{}
3678
3848
\def\thissection{}
3679
3849
 
3680
3850
\newcount\absseclevel % used to calculate proper heading level
3681
 
\newcount\secbase\secbase=0 % @raise/lowersections modify this count
 
3851
\newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count
3682
3852
 
3683
3853
% @raisesections: treat @section as chapter, @subsection as section, etc.
3684
3854
\def\raisesections{\global\advance\secbase by -1}
3688
3858
\def\lowersections{\global\advance\secbase by 1}
3689
3859
\let\down=\lowersections % original BFox name
3690
3860
 
3691
 
% Choose a numbered-heading macro
3692
 
% #1 is heading level if unmodified by @raisesections or @lowersections
3693
 
% #2 is text for heading
3694
 
\def\numhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
3695
 
\ifcase\absseclevel
3696
 
  \chapterzzz{#2}
3697
 
\or
3698
 
  \seczzz{#2}
3699
 
\or
3700
 
  \numberedsubseczzz{#2}
3701
 
\or
3702
 
  \numberedsubsubseczzz{#2}
3703
 
\else
3704
 
  \ifnum \absseclevel<0
3705
 
    \chapterzzz{#2}
3706
 
  \else
3707
 
    \numberedsubsubseczzz{#2}
3708
 
  \fi
3709
 
\fi
3710
 
}
3711
 
 
3712
 
% like \numhead, but chooses appendix heading levels
3713
 
\def\apphead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
3714
 
\ifcase\absseclevel
3715
 
  \appendixzzz{#2}
3716
 
\or
3717
 
  \appendixsectionzzz{#2}
3718
 
\or
3719
 
  \appendixsubseczzz{#2}
3720
 
\or
3721
 
  \appendixsubsubseczzz{#2}
3722
 
\else
3723
 
  \ifnum \absseclevel<0
3724
 
    \appendixzzz{#2}
3725
 
  \else
3726
 
    \appendixsubsubseczzz{#2}
3727
 
  \fi
3728
 
\fi
3729
 
}
3730
 
 
3731
 
% like \numhead, but chooses numberless heading levels
3732
 
\def\unnmhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
3733
 
\ifcase\absseclevel
3734
 
  \unnumberedzzz{#2}
3735
 
\or
3736
 
  \unnumberedseczzz{#2}
3737
 
\or
3738
 
  \unnumberedsubseczzz{#2}
3739
 
\or
3740
 
  \unnumberedsubsubseczzz{#2}
3741
 
\else
3742
 
  \ifnum \absseclevel<0
3743
 
    \unnumberedzzz{#2}
3744
 
  \else
3745
 
    \unnumberedsubsubseczzz{#2}
3746
 
  \fi
3747
 
\fi
3748
 
}
3749
 
 
3750
 
% @chapter, @appendix, @unnumbered.
3751
 
\def\thischaptername{No Chapter Title}
3752
 
\outer\def\chapter{\parsearg\chapteryyy}
3753
 
\def\chapteryyy #1{\numhead0{#1}} % normally numhead0 calls chapterzzz
3754
 
\def\chapterzzz #1{%
3755
 
  \secno=0 \subsecno=0 \subsubsecno=0
3756
 
  \global\advance \chapno by 1 \message{\putwordChapter\space \the\chapno}%
3757
 
  \chapmacro {#1}{\the\chapno}%
3758
 
  \gdef\thissection{#1}%
3759
 
  \gdef\thischaptername{#1}%
3760
 
  % We don't substitute the actual chapter name into \thischapter
3761
 
  % because we don't want its macros evaluated now.
3762
 
  \xdef\thischapter{\putwordChapter{} \the\chapno: \noexpand\thischaptername}%
3763
 
  \writetocentry{chap}{#1}{{\the\chapno}}
3764
 
  \donoderef
 
3861
% we only have subsub.
 
3862
\chardef\maxseclevel = 3
 
3863
%
 
3864
% A numbered section within an unnumbered changes to unnumbered too.
 
3865
% To achive this, remember the "biggest" unnum. sec. we are currently in:
 
3866
\chardef\unmlevel = \maxseclevel
 
3867
%
 
3868
% Trace whether the current chapter is an appendix or not:
 
3869
% \chapheadtype is "N" or "A", unnumbered chapters are ignored.
 
3870
\def\chapheadtype{N}
 
3871
 
 
3872
% Choose a heading macro
 
3873
% #1 is heading type
 
3874
% #2 is heading level
 
3875
% #3 is text for heading
 
3876
\def\genhead#1#2#3{%
 
3877
  % Compute the abs. sec. level:
 
3878
  \absseclevel=#2
 
3879
  \advance\absseclevel by \secbase
 
3880
  % Make sure \absseclevel doesn't fall outside the range:
 
3881
  \ifnum \absseclevel < 0
 
3882
    \absseclevel = 0
 
3883
  \else
 
3884
    \ifnum \absseclevel > 3
 
3885
      \absseclevel = 3
 
3886
    \fi
 
3887
  \fi
 
3888
  % The heading type:
 
3889
  \def\headtype{#1}%
 
3890
  \if \headtype U%
 
3891
    \ifnum \absseclevel < \unmlevel
 
3892
      \chardef\unmlevel = \absseclevel
 
3893
    \fi
 
3894
  \else
 
3895
    % Check for appendix sections:
 
3896
    \ifnum \absseclevel = 0
 
3897
      \edef\chapheadtype{\headtype}%
 
3898
    \else
 
3899
      \if \headtype A\if \chapheadtype N%
 
3900
        \errmessage{@appendix... within a non-appendix chapter}%
 
3901
      \fi\fi
 
3902
    \fi
 
3903
    % Check for numbered within unnumbered:
 
3904
    \ifnum \absseclevel > \unmlevel
 
3905
      \def\headtype{U}%
 
3906
    \else
 
3907
      \chardef\unmlevel = 3
 
3908
    \fi
 
3909
  \fi
 
3910
  % Now print the heading:
 
3911
  \if \headtype U%
 
3912
    \ifcase\absseclevel
 
3913
        \unnumberedzzz{#3}%
 
3914
    \or \unnumberedseczzz{#3}%
 
3915
    \or \unnumberedsubseczzz{#3}%
 
3916
    \or \unnumberedsubsubseczzz{#3}%
 
3917
    \fi
 
3918
  \else
 
3919
    \if \headtype A%
 
3920
      \ifcase\absseclevel
 
3921
          \appendixzzz{#3}%
 
3922
      \or \appendixsectionzzz{#3}%
 
3923
      \or \appendixsubseczzz{#3}%
 
3924
      \or \appendixsubsubseczzz{#3}%
 
3925
      \fi
 
3926
    \else
 
3927
      \ifcase\absseclevel
 
3928
          \chapterzzz{#3}%
 
3929
      \or \seczzz{#3}%
 
3930
      \or \numberedsubseczzz{#3}%
 
3931
      \or \numberedsubsubseczzz{#3}%
 
3932
      \fi
 
3933
    \fi
 
3934
  \fi
 
3935
  \suppressfirstparagraphindent
 
3936
}
 
3937
 
 
3938
% an interface:
 
3939
\def\numhead{\genhead N}
 
3940
\def\apphead{\genhead A}
 
3941
\def\unnmhead{\genhead U}
 
3942
 
 
3943
% @chapter, @appendix, @unnumbered.  Increment top-level counter, reset
 
3944
% all lower-level sectioning counters to zero.
 
3945
%
 
3946
% Also set \chaplevelprefix, which we prepend to @float sequence numbers
 
3947
% (e.g., figures), q.v.  By default (before any chapter), that is empty.
 
3948
\let\chaplevelprefix = \empty
 
3949
%
 
3950
\outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz
 
3951
\def\chapterzzz#1{%
 
3952
  % section resetting is \global in case the chapter is in a group, such
 
3953
  % as an @include file.
 
3954
  \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
 
3955
    \global\advance\chapno by 1
 
3956
  %
 
3957
  % Used for \float.
 
3958
  \gdef\chaplevelprefix{\the\chapno.}%
 
3959
  \resetallfloatnos
 
3960
  %
 
3961
  \message{\putwordChapter\space \the\chapno}%
 
3962
  %
 
3963
  % Write the actual heading.
 
3964
  \chapmacro{#1}{Ynumbered}{\the\chapno}%
 
3965
  %
 
3966
  % So @section and the like are numbered underneath this chapter.
3765
3967
  \global\let\section = \numberedsec
3766
3968
  \global\let\subsection = \numberedsubsec
3767
3969
  \global\let\subsubsection = \numberedsubsubsec
3768
3970
}
3769
3971
 
3770
 
% we use \chapno to avoid indenting back
3771
 
\def\appendixbox#1{%
3772
 
  \setbox0 = \hbox{\putwordAppendix{} \the\chapno}%
3773
 
  \hbox to \wd0{#1\hss}}
3774
 
 
3775
 
\outer\def\appendix{\parsearg\appendixyyy}
3776
 
\def\appendixyyy #1{\apphead0{#1}} % normally apphead0 calls appendixzzz
3777
 
\def\appendixzzz #1{%
3778
 
  \secno=0 \subsecno=0 \subsubsecno=0
3779
 
  \global\advance \appendixno by 1
3780
 
  \message{\putwordAppendix\space \appendixletter}%
3781
 
  \chapmacro {#1}{\appendixbox{\putwordAppendix{} \appendixletter}}%
3782
 
  \gdef\thissection{#1}%
3783
 
  \gdef\thischaptername{#1}%
3784
 
  \xdef\thischapter{\putwordAppendix{} \appendixletter: \noexpand\thischaptername}%
3785
 
  \writetocentry{appendix}{#1}{{\appendixletter}}
3786
 
  \appendixnoderef
 
3972
\outer\parseargdef\appendix{\apphead0{#1}} % normally apphead0 calls appendixzzz
 
3973
\def\appendixzzz#1{%
 
3974
  \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
 
3975
    \global\advance\appendixno by 1
 
3976
  \gdef\chaplevelprefix{\appendixletter.}%
 
3977
  \resetallfloatnos
 
3978
  %
 
3979
  \def\appendixnum{\putwordAppendix\space \appendixletter}%
 
3980
  \message{\appendixnum}%
 
3981
  %
 
3982
  \chapmacro{#1}{Yappendix}{\appendixletter}%
 
3983
  %
3787
3984
  \global\let\section = \appendixsec
3788
3985
  \global\let\subsection = \appendixsubsec
3789
3986
  \global\let\subsubsection = \appendixsubsubsec
3790
3987
}
3791
3988
 
3792
 
% @centerchap is like @unnumbered, but the heading is centered.
3793
 
\outer\def\centerchap{\parsearg\centerchapyyy}
3794
 
\def\centerchapyyy #1{{\let\unnumbchapmacro=\centerchapmacro \unnumberedyyy{#1}}}
3795
 
 
3796
 
% @top is like @unnumbered.
3797
 
\outer\def\top{\parsearg\unnumberedyyy}
3798
 
 
3799
 
\outer\def\unnumbered{\parsearg\unnumberedyyy}
3800
 
\def\unnumberedyyy #1{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz
3801
 
\def\unnumberedzzz #1{%
3802
 
  \secno=0 \subsecno=0 \subsubsecno=0
 
3989
\outer\parseargdef\unnumbered{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz
 
3990
\def\unnumberedzzz#1{%
 
3991
  \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
 
3992
    \global\advance\unnumberedno by 1
 
3993
  %
 
3994
  % Since an unnumbered has no number, no prefix for figures.
 
3995
  \global\let\chaplevelprefix = \empty
 
3996
  \resetallfloatnos
3803
3997
  %
3804
3998
  % This used to be simply \message{#1}, but TeX fully expands the
3805
3999
  % argument to \message.  Therefore, if #1 contained @-commands, TeX
3812
4006
  % \the<toks register> to achieve this: TeX expands \the<toks> only once,
3813
4007
  % simply yielding the contents of <toks register>.  (We also do this for
3814
4008
  % the toc entries.)
3815
 
  \toks0 = {#1}\message{(\the\toks0)}%
3816
 
  %
3817
 
  \unnumbchapmacro {#1}%
3818
 
  \gdef\thischapter{#1}\gdef\thissection{#1}%
3819
 
  \writetocentry{unnumbchap}{#1}{{\the\chapno}}
3820
 
  \unnumbnoderef
 
4009
  \toks0 = {#1}%
 
4010
  \message{(\the\toks0)}%
 
4011
  %
 
4012
  \chapmacro{#1}{Ynothing}{\the\unnumberedno}%
 
4013
  %
3821
4014
  \global\let\section = \unnumberedsec
3822
4015
  \global\let\subsection = \unnumberedsubsec
3823
4016
  \global\let\subsubsection = \unnumberedsubsubsec
3824
4017
}
3825
4018
 
 
4019
% @centerchap is like @unnumbered, but the heading is centered.
 
4020
\outer\parseargdef\centerchap{%
 
4021
  % Well, we could do the following in a group, but that would break
 
4022
  % an assumption that \chapmacro is called at the outermost level.
 
4023
  % Thus we are safer this way:         --kasal, 24feb04
 
4024
  \let\centerparametersmaybe = \centerparameters
 
4025
  \unnmhead0{#1}%
 
4026
  \let\centerparametersmaybe = \relax
 
4027
}
 
4028
 
 
4029
% @top is like @unnumbered.
 
4030
\let\top\unnumbered
 
4031
 
3826
4032
% Sections.
3827
 
\outer\def\numberedsec{\parsearg\secyyy}
3828
 
\def\secyyy #1{\numhead1{#1}} % normally calls seczzz
3829
 
\def\seczzz #1{%
3830
 
  \subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
3831
 
  \gdef\thissection{#1}\secheading {#1}{\the\chapno}{\the\secno}%
3832
 
  \writetocentry{sec}{#1}{{\the\chapno}{\the\secno}}
3833
 
  \donoderef
3834
 
  \nobreak
3835
 
}
3836
 
 
3837
 
\outer\def\appendixsection{\parsearg\appendixsecyyy}
3838
 
\outer\def\appendixsec{\parsearg\appendixsecyyy}
3839
 
\def\appendixsecyyy #1{\apphead1{#1}} % normally calls appendixsectionzzz
3840
 
\def\appendixsectionzzz #1{%
3841
 
  \subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
3842
 
  \gdef\thissection{#1}\secheading {#1}{\appendixletter}{\the\secno}%
3843
 
  \writetocentry{sec}{#1}{{\appendixletter}{\the\secno}}
3844
 
  \appendixnoderef
3845
 
  \nobreak
3846
 
}
3847
 
 
3848
 
\outer\def\unnumberedsec{\parsearg\unnumberedsecyyy}
3849
 
\def\unnumberedsecyyy #1{\unnmhead1{#1}} % normally calls unnumberedseczzz
3850
 
\def\unnumberedseczzz #1{%
3851
 
  \plainsecheading {#1}\gdef\thissection{#1}%
3852
 
  \writetocentry{unnumbsec}{#1}{{\the\chapno}{\the\secno}}
3853
 
  \unnumbnoderef
3854
 
  \nobreak
 
4033
\outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz
 
4034
\def\seczzz#1{%
 
4035
  \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
 
4036
  \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}%
 
4037
}
 
4038
 
 
4039
\outer\parseargdef\appendixsection{\apphead1{#1}} % normally calls appendixsectionzzz
 
4040
\def\appendixsectionzzz#1{%
 
4041
  \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
 
4042
  \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}%
 
4043
}
 
4044
\let\appendixsec\appendixsection
 
4045
 
 
4046
\outer\parseargdef\unnumberedsec{\unnmhead1{#1}} % normally calls unnumberedseczzz
 
4047
\def\unnumberedseczzz#1{%
 
4048
  \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
 
4049
  \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}%
3855
4050
}
3856
4051
 
3857
4052
% Subsections.
3858
 
\outer\def\numberedsubsec{\parsearg\numberedsubsecyyy}
3859
 
\def\numberedsubsecyyy #1{\numhead2{#1}} % normally calls numberedsubseczzz
3860
 
\def\numberedsubseczzz #1{%
3861
 
  \gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
3862
 
  \subsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}%
3863
 
  \writetocentry{subsec}{#1}{{\the\chapno}{\the\secno}{\the\subsecno}}
3864
 
  \donoderef
3865
 
  \nobreak
3866
 
}
3867
 
 
3868
 
\outer\def\appendixsubsec{\parsearg\appendixsubsecyyy}
3869
 
\def\appendixsubsecyyy #1{\apphead2{#1}} % normally calls appendixsubseczzz
3870
 
\def\appendixsubseczzz #1{%
3871
 
  \gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
3872
 
  \subsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}%
3873
 
  \writetocentry{subsec}{#1}{{\appendixletter}{\the\secno}{\the\subsecno}}
3874
 
  \appendixnoderef
3875
 
  \nobreak
3876
 
}
3877
 
 
3878
 
\outer\def\unnumberedsubsec{\parsearg\unnumberedsubsecyyy}
3879
 
\def\unnumberedsubsecyyy #1{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
3880
 
\def\unnumberedsubseczzz #1{%
3881
 
  \plainsubsecheading {#1}\gdef\thissection{#1}%
3882
 
  \writetocentry{unnumbsubsec}{#1}{{\the\chapno}{\the\secno}{\the\subsecno}}
3883
 
  \unnumbnoderef
3884
 
  \nobreak
 
4053
\outer\parseargdef\numberedsubsec{\numhead2{#1}} % normally calls numberedsubseczzz
 
4054
\def\numberedsubseczzz#1{%
 
4055
  \global\subsubsecno=0  \global\advance\subsecno by 1
 
4056
  \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}%
 
4057
}
 
4058
 
 
4059
\outer\parseargdef\appendixsubsec{\apphead2{#1}} % normally calls appendixsubseczzz
 
4060
\def\appendixsubseczzz#1{%
 
4061
  \global\subsubsecno=0  \global\advance\subsecno by 1
 
4062
  \sectionheading{#1}{subsec}{Yappendix}%
 
4063
                 {\appendixletter.\the\secno.\the\subsecno}%
 
4064
}
 
4065
 
 
4066
\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
 
4067
\def\unnumberedsubseczzz#1{%
 
4068
  \global\subsubsecno=0  \global\advance\subsecno by 1
 
4069
  \sectionheading{#1}{subsec}{Ynothing}%
 
4070
                 {\the\unnumberedno.\the\secno.\the\subsecno}%
3885
4071
}
3886
4072
 
3887
4073
% Subsubsections.
3888
 
\outer\def\numberedsubsubsec{\parsearg\numberedsubsubsecyyy}
3889
 
\def\numberedsubsubsecyyy #1{\numhead3{#1}} % normally numberedsubsubseczzz
3890
 
\def\numberedsubsubseczzz #1{%
3891
 
  \gdef\thissection{#1}\global\advance \subsubsecno by 1 %
3892
 
  \subsubsecheading {#1}
3893
 
    {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
3894
 
  \writetocentry{subsubsec}{#1}{{\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}}
3895
 
  \donoderef
3896
 
  \nobreak
3897
 
}
3898
 
 
3899
 
\outer\def\appendixsubsubsec{\parsearg\appendixsubsubsecyyy}
3900
 
\def\appendixsubsubsecyyy #1{\apphead3{#1}} % normally appendixsubsubseczzz
3901
 
\def\appendixsubsubseczzz #1{%
3902
 
  \gdef\thissection{#1}\global\advance \subsubsecno by 1 %
3903
 
  \subsubsecheading {#1}
3904
 
    {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
3905
 
  \writetocentry{subsubsec}{#1}{{\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}}
3906
 
  \appendixnoderef
3907
 
  \nobreak
3908
 
}
3909
 
 
3910
 
\outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubsecyyy}
3911
 
\def\unnumberedsubsubsecyyy #1{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
3912
 
\def\unnumberedsubsubseczzz #1{%
3913
 
  \plainsubsubsecheading {#1}\gdef\thissection{#1}%
3914
 
  \writetocentry{unnumbsubsubsec}{#1}{{\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}}
3915
 
  \unnumbnoderef
3916
 
  \nobreak
3917
 
}
3918
 
 
3919
 
% These are variants which are not "outer", so they can appear in @ifinfo.
3920
 
% Actually, they should now be obsolete; ordinary section commands should work.
3921
 
\def\infotop{\parsearg\unnumberedzzz}
3922
 
\def\infounnumbered{\parsearg\unnumberedzzz}
3923
 
\def\infounnumberedsec{\parsearg\unnumberedseczzz}
3924
 
\def\infounnumberedsubsec{\parsearg\unnumberedsubseczzz}
3925
 
\def\infounnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz}
3926
 
 
3927
 
\def\infoappendix{\parsearg\appendixzzz}
3928
 
\def\infoappendixsec{\parsearg\appendixseczzz}
3929
 
\def\infoappendixsubsec{\parsearg\appendixsubseczzz}
3930
 
\def\infoappendixsubsubsec{\parsearg\appendixsubsubseczzz}
3931
 
 
3932
 
\def\infochapter{\parsearg\chapterzzz}
3933
 
\def\infosection{\parsearg\sectionzzz}
3934
 
\def\infosubsection{\parsearg\subsectionzzz}
3935
 
\def\infosubsubsection{\parsearg\subsubsectionzzz}
 
4074
\outer\parseargdef\numberedsubsubsec{\numhead3{#1}} % normally numberedsubsubseczzz
 
4075
\def\numberedsubsubseczzz#1{%
 
4076
  \global\advance\subsubsecno by 1
 
4077
  \sectionheading{#1}{subsubsec}{Ynumbered}%
 
4078
                 {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}%
 
4079
}
 
4080
 
 
4081
\outer\parseargdef\appendixsubsubsec{\apphead3{#1}} % normally appendixsubsubseczzz
 
4082
\def\appendixsubsubseczzz#1{%
 
4083
  \global\advance\subsubsecno by 1
 
4084
  \sectionheading{#1}{subsubsec}{Yappendix}%
 
4085
                 {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}%
 
4086
}
 
4087
 
 
4088
\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
 
4089
\def\unnumberedsubsubseczzz#1{%
 
4090
  \global\advance\subsubsecno by 1
 
4091
  \sectionheading{#1}{subsubsec}{Ynothing}%
 
4092
                 {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}%
 
4093
}
3936
4094
 
3937
4095
% These macros control what the section commands do, according
3938
4096
% to what kind of chapter we are in (ordinary, appendix, or unnumbered).
3939
4097
% Define them by default for a numbered chapter.
3940
 
\global\let\section = \numberedsec
3941
 
\global\let\subsection = \numberedsubsec
3942
 
\global\let\subsubsection = \numberedsubsubsec
 
4098
\let\section = \numberedsec
 
4099
\let\subsection = \numberedsubsec
 
4100
\let\subsubsection = \numberedsubsubsec
3943
4101
 
3944
4102
% Define @majorheading, @heading and @subheading
3945
4103
 
3952
4110
%          if justification is not attempted.  Hence \raggedright.
3953
4111
 
3954
4112
 
3955
 
\def\majorheading{\parsearg\majorheadingzzz}
3956
 
\def\majorheadingzzz #1{%
 
4113
\def\majorheading{%
3957
4114
  {\advance\chapheadingskip by 10pt \chapbreak }%
3958
 
  {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
3959
 
                    \parindent=0pt\raggedright
3960
 
                    \rm #1\hfill}}\bigskip \par\penalty 200}
 
4115
  \parsearg\chapheadingzzz
 
4116
}
3961
4117
 
3962
 
\def\chapheading{\parsearg\chapheadingzzz}
3963
 
\def\chapheadingzzz #1{\chapbreak %
 
4118
\def\chapheading{\chapbreak \parsearg\chapheadingzzz}
 
4119
\def\chapheadingzzz#1{%
3964
4120
  {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
3965
4121
                    \parindent=0pt\raggedright
3966
 
                    \rm #1\hfill}}\bigskip \par\penalty 200}
 
4122
                    \rm #1\hfill}}%
 
4123
  \bigskip \par\penalty 200\relax
 
4124
  \suppressfirstparagraphindent
 
4125
}
3967
4126
 
3968
4127
% @heading, @subheading, @subsubheading.
3969
 
\def\heading{\parsearg\plainsecheading}
3970
 
\def\subheading{\parsearg\plainsubsecheading}
3971
 
\def\subsubheading{\parsearg\plainsubsubsecheading}
 
4128
\parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{}
 
4129
  \suppressfirstparagraphindent}
 
4130
\parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{}
 
4131
  \suppressfirstparagraphindent}
 
4132
\parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{}
 
4133
  \suppressfirstparagraphindent}
3972
4134
 
3973
4135
% These macros generate a chapter, section, etc. heading only
3974
4136
% (including whitespace, linebreaking, etc. around it),
3977
4139
%%% Args are the skip and penalty (usually negative)
3978
4140
\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
3979
4141
 
3980
 
\def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
3981
 
 
3982
4142
%%% Define plain chapter starts, and page on/off switching for it
3983
4143
% Parameter controlling skip before chapter headings (if needed)
3984
4144
 
4001
4161
\global\let\pagealignmacro=\chappager
4002
4162
\global\def\HEADINGSon{\HEADINGSsingle}}
4003
4163
 
4004
 
\def\CHAPPAGodd{
 
4164
\def\CHAPPAGodd{%
4005
4165
\global\let\contentsalignmacro = \chapoddpage
4006
4166
\global\let\pchapsepmacro=\chapoddpage
4007
4167
\global\let\pagealignmacro=\chapoddpage
4009
4169
 
4010
4170
\CHAPPAGon
4011
4171
 
4012
 
\def\CHAPFplain{
4013
 
\global\let\chapmacro=\chfplain
4014
 
\global\let\unnumbchapmacro=\unnchfplain
4015
 
\global\let\centerchapmacro=\centerchfplain}
4016
 
 
4017
 
% Plain chapter opening.
4018
 
% #1 is the text, #2 the chapter number or empty if unnumbered.
4019
 
\def\chfplain#1#2{%
 
4172
% Chapter opening.
 
4173
%
 
4174
% #1 is the text, #2 is the section type (Ynumbered, Ynothing,
 
4175
% Yappendix, Yomitfromtoc), #3 the chapter number.
 
4176
%
 
4177
% To test against our argument.
 
4178
\def\Ynothingkeyword{Ynothing}
 
4179
\def\Yomitfromtockeyword{Yomitfromtoc}
 
4180
\def\Yappendixkeyword{Yappendix}
 
4181
%
 
4182
\def\chapmacro#1#2#3{%
4020
4183
  \pchapsepmacro
4021
4184
  {%
4022
4185
    \chapfonts \rm
4023
 
    \def\chapnum{#2}%
4024
 
    \setbox0 = \hbox{#2\ifx\chapnum\empty\else\enspace\fi}%
 
4186
    %
 
4187
    % Have to define \thissection before calling \donoderef, because the
 
4188
    % xref code eventually uses it.  On the other hand, it has to be called
 
4189
    % after \pchapsepmacro, or the headline will change too soon.
 
4190
    \gdef\thissection{#1}%
 
4191
    \gdef\thischaptername{#1}%
 
4192
    %
 
4193
    % Only insert the separating space if we have a chapter/appendix
 
4194
    % number, and don't print the unnumbered ``number''.
 
4195
    \def\temptype{#2}%
 
4196
    \ifx\temptype\Ynothingkeyword
 
4197
      \setbox0 = \hbox{}%
 
4198
      \def\toctype{unnchap}%
 
4199
      \def\thischapter{#1}%
 
4200
    \else\ifx\temptype\Yomitfromtockeyword
 
4201
      \setbox0 = \hbox{}% contents like unnumbered, but no toc entry
 
4202
      \def\toctype{omit}%
 
4203
      \xdef\thischapter{}%
 
4204
    \else\ifx\temptype\Yappendixkeyword
 
4205
      \setbox0 = \hbox{\putwordAppendix{} #3\enspace}%
 
4206
      \def\toctype{app}%
 
4207
      % We don't substitute the actual chapter name into \thischapter
 
4208
      % because we don't want its macros evaluated now.  And we don't
 
4209
      % use \thissection because that changes with each section.
 
4210
      %
 
4211
      \xdef\thischapter{\putwordAppendix{} \appendixletter:
 
4212
                        \noexpand\thischaptername}%
 
4213
    \else
 
4214
      \setbox0 = \hbox{#3\enspace}%
 
4215
      \def\toctype{numchap}%
 
4216
      \xdef\thischapter{\putwordChapter{} \the\chapno:
 
4217
                        \noexpand\thischaptername}%
 
4218
    \fi\fi\fi
 
4219
    %
 
4220
    % Write the toc entry for this chapter.  Must come before the
 
4221
    % \donoderef, because we include the current node name in the toc
 
4222
    % entry, and \donoderef resets it to empty.
 
4223
    \writetocentry{\toctype}{#1}{#3}%
 
4224
    %
 
4225
    % For pdftex, we have to write out the node definition (aka, make
 
4226
    % the pdfdest) after any page break, but before the actual text has
 
4227
    % been typeset.  If the destination for the pdf outline is after the
 
4228
    % text, then jumping from the outline may wind up with the text not
 
4229
    % being visible, for instance under high magnification.
 
4230
    \donoderef{#2}%
 
4231
    %
 
4232
    % Typeset the actual heading.
4025
4233
    \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
4026
 
          \hangindent = \wd0 \centerparametersmaybe
 
4234
          \hangindent=\wd0 \centerparametersmaybe
4027
4235
          \unhbox0 #1\par}%
4028
4236
  }%
4029
4237
  \nobreak\bigskip % no page break after a chapter title
4030
4238
  \nobreak
4031
4239
}
4032
4240
 
4033
 
% Plain opening for unnumbered.
4034
 
\def\unnchfplain#1{\chfplain{#1}{}}
4035
 
 
4036
4241
% @centerchap -- centered and unnumbered.
4037
4242
\let\centerparametersmaybe = \relax
4038
 
\def\centerchfplain#1{{%
4039
 
  \def\centerparametersmaybe{%
4040
 
    \advance\rightskip by 3\rightskip
4041
 
    \leftskip = \rightskip
4042
 
    \parfillskip = 0pt
4043
 
  }%
4044
 
  \chfplain{#1}{}%
4045
 
}}
4046
 
 
4047
 
\CHAPFplain % The default
4048
 
 
 
4243
\def\centerparameters{%
 
4244
  \advance\rightskip by 3\rightskip
 
4245
  \leftskip = \rightskip
 
4246
  \parfillskip = 0pt
 
4247
}
 
4248
 
 
4249
 
 
4250
% I don't think this chapter style is supported any more, so I'm not
 
4251
% updating it with the new noderef stuff.  We'll see.  --karl, 11aug03.
 
4252
%
 
4253
\def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
 
4254
%
4049
4255
\def\unnchfopen #1{%
4050
4256
\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
4051
4257
                       \parindent=0pt\raggedright
4052
4258
                       \rm #1\hfill}}\bigskip \par\nobreak
4053
4259
}
4054
 
 
4055
4260
\def\chfopen #1#2{\chapoddpage {\chapfonts
4056
4261
\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
4057
4262
\par\penalty 5000 %
4058
4263
}
4059
 
 
4060
4264
\def\centerchfopen #1{%
4061
4265
\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
4062
4266
                       \parindent=0pt
4063
4267
                       \hfill {\rm #1}\hfill}}\bigskip \par\nobreak
4064
4268
}
4065
 
 
4066
 
\def\CHAPFopen{
4067
 
\global\let\chapmacro=\chfopen
4068
 
\global\let\unnumbchapmacro=\unnchfopen
4069
 
\global\let\centerchapmacro=\centerchfopen}
4070
 
 
4071
 
 
4072
 
% Section titles.
 
4269
\def\CHAPFopen{%
 
4270
  \global\let\chapmacro=\chfopen
 
4271
  \global\let\centerchapmacro=\centerchfopen}
 
4272
 
 
4273
 
 
4274
% Section titles.  These macros combine the section number parts and
 
4275
% call the generic \sectionheading to do the printing.
 
4276
%
4073
4277
\newskip\secheadingskip
4074
 
\def\secheadingbreak{\dobreak \secheadingskip {-1000}}
4075
 
\def\secheading#1#2#3{\sectionheading{sec}{#2.#3}{#1}}
4076
 
\def\plainsecheading#1{\sectionheading{sec}{}{#1}}
 
4278
\def\secheadingbreak{\dobreak \secheadingskip{-1000}}
4077
4279
 
4078
4280
% Subsection titles.
4079
 
\newskip \subsecheadingskip
4080
 
\def\subsecheadingbreak{\dobreak \subsecheadingskip {-500}}
4081
 
\def\subsecheading#1#2#3#4{\sectionheading{subsec}{#2.#3.#4}{#1}}
4082
 
\def\plainsubsecheading#1{\sectionheading{subsec}{}{#1}}
 
4281
\newskip\subsecheadingskip
 
4282
\def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}}
4083
4283
 
4084
4284
% Subsubsection titles.
4085
 
\let\subsubsecheadingskip = \subsecheadingskip
4086
 
\let\subsubsecheadingbreak = \subsecheadingbreak
4087
 
\def\subsubsecheading#1#2#3#4#5{\sectionheading{subsubsec}{#2.#3.#4.#5}{#1}}
4088
 
\def\plainsubsubsecheading#1{\sectionheading{subsubsec}{}{#1}}
4089
 
 
4090
 
 
4091
 
% Print any size section title.
4092
 
%
4093
 
% #1 is the section type (sec/subsec/subsubsec), #2 is the section
4094
 
% number (maybe empty), #3 the text.
4095
 
\def\sectionheading#1#2#3{%
4096
 
  {%
4097
 
    \expandafter\advance\csname #1headingskip\endcsname by \parskip
4098
 
    \csname #1headingbreak\endcsname
4099
 
  }%
 
4285
\def\subsubsecheadingskip{\subsecheadingskip}
 
4286
\def\subsubsecheadingbreak{\subsecheadingbreak}
 
4287
 
 
4288
 
 
4289
% Print any size, any type, section title.
 
4290
%
 
4291
% #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is
 
4292
% the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the
 
4293
% section number.
 
4294
%
 
4295
\def\sectionheading#1#2#3#4{%
4100
4296
  {%
4101
4297
    % Switch to the right set of fonts.
4102
 
    \csname #1fonts\endcsname \rm
4103
 
    %
4104
 
    % Only insert the separating space if we have a section number.
4105
 
    \def\secnum{#2}%
4106
 
    \setbox0 = \hbox{#2\ifx\secnum\empty\else\enspace\fi}%
4107
 
    %
 
4298
    \csname #2fonts\endcsname \rm
 
4299
    %
 
4300
    % Insert space above the heading.
 
4301
    \csname #2headingbreak\endcsname
 
4302
    %
 
4303
    % Only insert the space after the number if we have a section number.
 
4304
    \def\sectionlevel{#2}%
 
4305
    \def\temptype{#3}%
 
4306
    %
 
4307
    \ifx\temptype\Ynothingkeyword
 
4308
      \setbox0 = \hbox{}%
 
4309
      \def\toctype{unn}%
 
4310
      \gdef\thissection{#1}%
 
4311
    \else\ifx\temptype\Yomitfromtockeyword
 
4312
      % for @headings -- no section number, don't include in toc,
 
4313
      % and don't redefine \thissection.
 
4314
      \setbox0 = \hbox{}%
 
4315
      \def\toctype{omit}%
 
4316
      \let\sectionlevel=\empty
 
4317
    \else\ifx\temptype\Yappendixkeyword
 
4318
      \setbox0 = \hbox{#4\enspace}%
 
4319
      \def\toctype{app}%
 
4320
      \gdef\thissection{#1}%
 
4321
    \else
 
4322
      \setbox0 = \hbox{#4\enspace}%
 
4323
      \def\toctype{num}%
 
4324
      \gdef\thissection{#1}%
 
4325
    \fi\fi\fi
 
4326
    %
 
4327
    % Write the toc entry (before \donoderef).  See comments in \chfplain.
 
4328
    \writetocentry{\toctype\sectionlevel}{#1}{#4}%
 
4329
    %
 
4330
    % Write the node reference (= pdf destination for pdftex).
 
4331
    % Again, see comments in \chfplain.
 
4332
    \donoderef{#3}%
 
4333
    %
 
4334
    % Output the actual section heading.
4108
4335
    \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
4109
 
          \hangindent = \wd0 % zero if no section number
4110
 
          \unhbox0 #3}%
 
4336
          \hangindent=\wd0  % zero if no section number
 
4337
          \unhbox0 #1}%
4111
4338
  }%
4112
 
  % Add extra space after the heading -- either a line space or a
4113
 
  % paragraph space, whichever is more.  (Some people like to set
4114
 
  % \parskip to large values for some reason.)  Don't allow stretch, though.
 
4339
  % Add extra space after the heading -- half of whatever came above it.
 
4340
  % Don't allow stretch, though.
 
4341
  \kern .5 \csname #2headingskip\endcsname
 
4342
  %
 
4343
  % Do not let the kern be a potential breakpoint, as it would be if it
 
4344
  % was followed by glue.
4115
4345
  \nobreak
4116
 
  \ifdim\parskip>\normalbaselineskip
4117
 
    \kern\parskip
4118
 
  \else
4119
 
    \kern\normalbaselineskip
4120
 
  \fi
 
4346
  %
 
4347
  % We'll almost certainly start a paragraph next, so don't let that
 
4348
  % glue accumulate.  (Not a breakpoint because it's preceded by a
 
4349
  % discardable item.)
 
4350
  \vskip-\parskip
 
4351
  %
 
4352
  % This \nobreak is purely so the last item on the list is a \penalty
 
4353
  % of 10000.  This is so other code, for instance \parsebodycommon, can
 
4354
  % check for and avoid allowing breakpoints.  Otherwise, it would
 
4355
  % insert a valid breakpoint between:
 
4356
  %   @section sec-whatever
 
4357
  %   @deffn def-whatever
4121
4358
  \nobreak
4122
4359
}
4123
4360
 
4127
4364
\newwrite\tocfile
4128
4365
 
4129
4366
% Write an entry to the toc file, opening it if necessary.
4130
 
% Called from @chapter, etc.  We supply {\folio} at the end of the
4131
 
% argument, which will end up as the last argument to the \...entry macro.
4132
 
%
4133
 
% Usage: \writetocentry{chap}{The Name of The Game}{{\the\chapno}}
 
4367
% Called from @chapter, etc.
 
4368
%
 
4369
% Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno}
 
4370
% We append the current node name (if any) and page number as additional
 
4371
% arguments for the \{chap,sec,...}entry macros which will eventually
 
4372
% read this.  The node name is used in the pdf outlines as the
 
4373
% destination to jump to.
 
4374
%
4134
4375
% We open the .toc file for writing here instead of at @setfilename (or
4135
4376
% any other fixed time) so that @contents can be anywhere in the document.
 
4377
% But if #1 is `omit', then we don't do anything.  This is used for the
 
4378
% table of contents chapter openings themselves.
4136
4379
%
4137
4380
\newif\iftocfileopened
 
4381
\def\omitkeyword{omit}%
 
4382
%
4138
4383
\def\writetocentry#1#2#3{%
4139
 
  \iftocfileopened\else
4140
 
    \immediate\openout\tocfile = \jobname.toc
4141
 
    \global\tocfileopenedtrue
4142
 
  \fi
4143
 
  %
4144
 
  \iflinks
4145
 
    \toks0 = {#2}%
4146
 
    \edef\temp{\write\tocfile{\realbackslash #1entry{\the\toks0}#3{\folio}}}%
4147
 
    \temp
4148
 
  \fi
4149
 
  %
4150
 
  % Tell \shipout to create a page destination if we're doing pdf, which
4151
 
  % will be the target of the links in the table of contents.  We can't
4152
 
  % just do it on every page because the title pages are numbered 1 and
4153
 
  % 2 (the page numbers aren't printed), and so are the first two pages
4154
 
  % of the document.  Thus, we'd have two destinations named `1', and
4155
 
  % two named `2'.
4156
 
  \ifpdf \pdfmakepagedesttrue \fi
 
4384
  \edef\writetoctype{#1}%
 
4385
  \ifx\writetoctype\omitkeyword \else
 
4386
    \iftocfileopened\else
 
4387
      \immediate\openout\tocfile = \jobname.toc
 
4388
      \global\tocfileopenedtrue
 
4389
    \fi
 
4390
    %
 
4391
    \iflinks
 
4392
      \toks0 = {#2}%
 
4393
      \toks2 = \expandafter{\lastnode}%
 
4394
      \edef\temp{\write\tocfile{\realbackslash #1entry{\the\toks0}{#3}%
 
4395
                               {\the\toks2}{\noexpand\folio}}}%
 
4396
      \temp
 
4397
    \fi
 
4398
  \fi
 
4399
  %
 
4400
  % Tell \shipout to create a pdf destination on each page, if we're
 
4401
  % writing pdf.  These are used in the table of contents.  We can't
 
4402
  % just write one on every page because the title pages are numbered
 
4403
  % 1 and 2 (the page numbers aren't printed), and so are the first
 
4404
  % two pages of the document.  Thus, we'd have two destinations named
 
4405
  % `1', and two named `2'.
 
4406
  \ifpdf \global\pdfmakepagedesttrue \fi
4157
4407
}
4158
4408
 
4159
4409
\newskip\contentsrightmargin \contentsrightmargin=1in
4160
4410
\newcount\savepageno
4161
4411
\newcount\lastnegativepageno \lastnegativepageno = -1
4162
4412
 
4163
 
% Finish up the main text and prepare to read what we've written
4164
 
% to \tocfile.
 
4413
% Prepare to read what we've written to \tocfile.
4165
4414
%
4166
4415
\def\startcontents#1{%
4167
 
   % If @setchapternewpage on, and @headings double, the contents should
4168
 
   % start on an odd page, unlike chapters.  Thus, we maintain
4169
 
   % \contentsalignmacro in parallel with \pagealignmacro.
4170
 
   % From: Torbjorn Granlund <tege@matematik.su.se>
4171
 
   \contentsalignmacro
4172
 
   \immediate\closeout\tocfile
4173
 
   %
4174
 
   % Don't need to put `Contents' or `Short Contents' in the headline.
4175
 
   % It is abundantly clear what they are.
4176
 
   \unnumbchapmacro{#1}\def\thischapter{}%
4177
 
   \savepageno = \pageno
4178
 
   \begingroup                  % Set up to handle contents files properly.
4179
 
      \catcode`\\=0  \catcode`\{=1  \catcode`\}=2  \catcode`\@=11
4180
 
      % We can't do this, because then an actual ^ in a section
4181
 
      % title fails, e.g., @chapter ^ -- exponentiation.  --karl, 9jul97.
4182
 
      %\catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi
4183
 
      \raggedbottom             % Worry more about breakpoints than the bottom.
4184
 
      \advance\hsize by -\contentsrightmargin % Don't use the full line length.
4185
 
      %
4186
 
      % Roman numerals for page numbers.
4187
 
      \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi
 
4416
  % If @setchapternewpage on, and @headings double, the contents should
 
4417
  % start on an odd page, unlike chapters.  Thus, we maintain
 
4418
  % \contentsalignmacro in parallel with \pagealignmacro.
 
4419
  % From: Torbjorn Granlund <tege@matematik.su.se>
 
4420
  \contentsalignmacro
 
4421
  \immediate\closeout\tocfile
 
4422
  %
 
4423
  % Don't need to put `Contents' or `Short Contents' in the headline.
 
4424
  % It is abundantly clear what they are.
 
4425
  \def\thischapter{}%
 
4426
  \chapmacro{#1}{Yomitfromtoc}{}%
 
4427
  %
 
4428
  \savepageno = \pageno
 
4429
  \begingroup                  % Set up to handle contents files properly.
 
4430
    \catcode`\\=0  \catcode`\{=1  \catcode`\}=2  \catcode`\@=11
 
4431
    % We can't do this, because then an actual ^ in a section
 
4432
    % title fails, e.g., @chapter ^ -- exponentiation.  --karl, 9jul97.
 
4433
    %\catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi
 
4434
    \raggedbottom             % Worry more about breakpoints than the bottom.
 
4435
    \advance\hsize by -\contentsrightmargin % Don't use the full line length.
 
4436
    %
 
4437
    % Roman numerals for page numbers.
 
4438
    \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi
4188
4439
}
4189
4440
 
4190
4441
 
4191
4442
% Normal (long) toc.
4192
4443
\def\contents{%
4193
 
   \startcontents{\putwordTOC}%
4194
 
     \openin 1 \jobname.toc
4195
 
     \ifeof 1 \else
4196
 
       \closein 1
4197
 
       \input \jobname.toc
4198
 
     \fi
4199
 
     \vfill \eject
4200
 
     \contentsalignmacro % in case @setchapternewpage odd is in effect
4201
 
     \pdfmakeoutlines
4202
 
   \endgroup
4203
 
   \lastnegativepageno = \pageno
4204
 
   \global\pageno = \savepageno
 
4444
  \startcontents{\putwordTOC}%
 
4445
    \openin 1 \jobname.toc
 
4446
    \ifeof 1 \else
 
4447
      \input \jobname.toc
 
4448
    \fi
 
4449
    \vfill \eject
 
4450
    \contentsalignmacro % in case @setchapternewpage odd is in effect
 
4451
    \ifeof 1 \else
 
4452
      \pdfmakeoutlines
 
4453
    \fi
 
4454
    \closein 1
 
4455
  \endgroup
 
4456
  \lastnegativepageno = \pageno
 
4457
  \global\pageno = \savepageno
4205
4458
}
4206
4459
 
4207
4460
% And just the chapters.
4208
4461
\def\summarycontents{%
4209
 
   \startcontents{\putwordShortTOC}%
4210
 
      %
4211
 
      \let\chapentry = \shortchapentry
4212
 
      \let\appendixentry = \shortappendixentry
4213
 
      \let\unnumbchapentry = \shortunnumberedentry
4214
 
      % We want a true roman here for the page numbers.
4215
 
      \secfonts
4216
 
      \let\rm=\shortcontrm \let\bf=\shortcontbf
4217
 
      \let\sl=\shortcontsl \let\tt=\shortconttt
4218
 
      \rm
4219
 
      \hyphenpenalty = 10000
4220
 
      \advance\baselineskip by 1pt % Open it up a little.
4221
 
      \def\secentry ##1##2##3##4{}
4222
 
      \def\subsecentry ##1##2##3##4##5{}
4223
 
      \def\subsubsecentry ##1##2##3##4##5##6{}
4224
 
      \let\unnumbsecentry = \secentry
4225
 
      \let\unnumbsubsecentry = \subsecentry
4226
 
      \let\unnumbsubsubsecentry = \subsubsecentry
4227
 
      \openin 1 \jobname.toc
4228
 
      \ifeof 1 \else
4229
 
        \closein 1
4230
 
        \input \jobname.toc
4231
 
      \fi
4232
 
     \vfill \eject
4233
 
     \contentsalignmacro % in case @setchapternewpage odd is in effect
4234
 
   \endgroup
4235
 
   \lastnegativepageno = \pageno
4236
 
   \global\pageno = \savepageno
 
4462
  \startcontents{\putwordShortTOC}%
 
4463
    %
 
4464
    \let\numchapentry = \shortchapentry
 
4465
    \let\appentry = \shortchapentry
 
4466
    \let\unnchapentry = \shortunnchapentry
 
4467
    % We want a true roman here for the page numbers.
 
4468
    \secfonts
 
4469
    \let\rm=\shortcontrm \let\bf=\shortcontbf
 
4470
    \let\sl=\shortcontsl \let\tt=\shortconttt
 
4471
    \rm
 
4472
    \hyphenpenalty = 10000
 
4473
    \advance\baselineskip by 1pt % Open it up a little.
 
4474
    \def\numsecentry##1##2##3##4{}
 
4475
    \let\appsecentry = \numsecentry
 
4476
    \let\unnsecentry = \numsecentry
 
4477
    \let\numsubsecentry = \numsecentry
 
4478
    \let\appsubsecentry = \numsecentry
 
4479
    \let\unnsubsecentry = \numsecentry
 
4480
    \let\numsubsubsecentry = \numsecentry
 
4481
    \let\appsubsubsecentry = \numsecentry
 
4482
    \let\unnsubsubsecentry = \numsecentry
 
4483
    \openin 1 \jobname.toc
 
4484
    \ifeof 1 \else
 
4485
      \input \jobname.toc
 
4486
    \fi
 
4487
    \closein 1
 
4488
    \vfill \eject
 
4489
    \contentsalignmacro % in case @setchapternewpage odd is in effect
 
4490
  \endgroup
 
4491
  \lastnegativepageno = \pageno
 
4492
  \global\pageno = \savepageno
4237
4493
}
4238
4494
\let\shortcontents = \summarycontents
4239
4495
 
4240
 
\ifpdf
4241
 
  \pdfcatalog{/PageMode /UseOutlines}%
4242
 
\fi
 
4496
% Typeset the label for a chapter or appendix for the short contents.
 
4497
% The arg is, e.g., `A' for an appendix, or `3' for a chapter.
 
4498
%
 
4499
\def\shortchaplabel#1{%
 
4500
  % This space should be enough, since a single number is .5em, and the
 
4501
  % widest letter (M) is 1em, at least in the Computer Modern fonts.
 
4502
  % But use \hss just in case.
 
4503
  % (This space doesn't include the extra space that gets added after
 
4504
  % the label; that gets put in by \shortchapentry above.)
 
4505
  %
 
4506
  % We'd like to right-justify chapter numbers, but that looks strange
 
4507
  % with appendix letters.  And right-justifying numbers and
 
4508
  % left-justifying letters looks strange when there is less than 10
 
4509
  % chapters.  Have to read the whole toc once to know how many chapters
 
4510
  % there are before deciding ...
 
4511
  \hbox to 1em{#1\hss}%
 
4512
}
4243
4513
 
4244
4514
% These macros generate individual entries in the table of contents.
4245
4515
% The first argument is the chapter or section name.
4247
4517
% The arguments in between are the chapter number, section number, ...
4248
4518
 
4249
4519
% Chapters, in the main contents.
4250
 
\def\chapentry#1#2#3{\dochapentry{#2\labelspace#1}{#3}}
 
4520
\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}}
4251
4521
%
4252
4522
% Chapters, in the short toc.
4253
4523
% See comments in \dochapentry re vbox and related settings.
4254
 
\def\shortchapentry#1#2#3{%
4255
 
  \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#3\egroup}%
 
4524
\def\shortchapentry#1#2#3#4{%
 
4525
  \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}%
4256
4526
}
4257
4527
 
4258
4528
% Appendices, in the main contents.
4259
 
\def\appendixentry#1#2#3{%
4260
 
  \dochapentry{\appendixbox{\putwordAppendix{} #2}\labelspace#1}{#3}}
4261
 
%
4262
 
% Appendices, in the short toc.
4263
 
\let\shortappendixentry = \shortchapentry
4264
 
 
4265
 
% Typeset the label for a chapter or appendix for the short contents.
4266
 
% The arg is, e.g., `Appendix A' for an appendix, or `3' for a chapter.
4267
 
% We could simplify the code here by writing out an \appendixentry
4268
 
% command in the toc file for appendices, instead of using \chapentry
4269
 
% for both, but it doesn't seem worth it.
4270
 
%
4271
 
\newdimen\shortappendixwidth
4272
 
%
4273
 
\def\shortchaplabel#1{%
4274
 
  % This space should be enough, since a single number is .5em, and the
4275
 
  % widest letter (M) is 1em, at least in the Computer Modern fonts.
4276
 
  % But use \hss just in case.
4277
 
  % (This space doesn't include the extra space that gets added after
4278
 
  % the label; that gets put in by \shortchapentry above.)
4279
 
  \dimen0 = 1em
4280
 
  \hbox to \dimen0{#1\hss}%
4281
 
}
 
4529
% Need the word Appendix, and a fixed-size box.
 
4530
%
 
4531
\def\appendixbox#1{%
 
4532
  % We use M since it's probably the widest letter.
 
4533
  \setbox0 = \hbox{\putwordAppendix{} M}%
 
4534
  \hbox to \wd0{\putwordAppendix{} #1\hss}}
 
4535
%
 
4536
\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}}
4282
4537
 
4283
4538
% Unnumbered chapters.
4284
 
\def\unnumbchapentry#1#2#3{\dochapentry{#1}{#3}}
4285
 
\def\shortunnumberedentry#1#2#3{\tocentry{#1}{\doshortpageno\bgroup#3\egroup}}
 
4539
\def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}}
 
4540
\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}}
4286
4541
 
4287
4542
% Sections.
4288
 
\def\secentry#1#2#3#4{\dosecentry{#2.#3\labelspace#1}{#4}}
4289
 
\def\unnumbsecentry#1#2#3#4{\dosecentry{#1}{#4}}
 
4543
\def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}}
 
4544
\let\appsecentry=\numsecentry
 
4545
\def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}}
4290
4546
 
4291
4547
% Subsections.
4292
 
\def\subsecentry#1#2#3#4#5{\dosubsecentry{#2.#3.#4\labelspace#1}{#5}}
4293
 
\def\unnumbsubsecentry#1#2#3#4#5{\dosubsecentry{#1}{#5}}
 
4548
\def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}}
 
4549
\let\appsubsecentry=\numsubsecentry
 
4550
\def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}}
4294
4551
 
4295
4552
% And subsubsections.
4296
 
\def\subsubsecentry#1#2#3#4#5#6{%
4297
 
  \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}{#6}}
4298
 
\def\unnumbsubsubsecentry#1#2#3#4#5#6{\dosubsubsecentry{#1}{#6}}
 
4553
\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}}
 
4554
\let\appsubsubsecentry=\numsubsubsecentry
 
4555
\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}}
4299
4556
 
4300
4557
% This parameter controls the indentation of the various levels.
4301
 
\newdimen\tocindent \tocindent = 3pc
 
4558
% Same as \defaultparindent.
 
4559
\newdimen\tocindent \tocindent = 15pt
4302
4560
 
4303
4561
% Now for the actual typesetting. In all these, #1 is the text and #2 is the
4304
4562
% page number.
4329
4587
  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
4330
4588
\endgroup}
4331
4589
 
4332
 
% Final typesetting of a toc entry; we use the same \entry macro as for
4333
 
% the index entries, but we want to suppress hyphenation here.  (We
4334
 
% can't do that in the \entry macro, since index entries might consist
4335
 
% of hyphenated-identifiers-that-do-not-fit-on-a-line-and-nothing-else.)
4336
 
\def\tocentry#1#2{\begingroup
4337
 
  \vskip 0pt plus1pt % allow a little stretch for the sake of nice page breaks
4338
 
  % Do not use \turnoffactive in these arguments.  Since the toc is
4339
 
  % typeset in cmr, characters such as _ would come out wrong; we
4340
 
  % have to do the usual translation tricks.
4341
 
  \entry{#1}{#2}%
4342
 
\endgroup}
 
4590
% We use the same \entry macro as for the index entries.
 
4591
\let\tocentry = \entry
4343
4592
 
4344
4593
% Space between chapter (or whatever) number and the title.
4345
4594
\def\labelspace{\hskip1em \relax}
4349
4598
 
4350
4599
\def\chapentryfonts{\secfonts \rm}
4351
4600
\def\secentryfonts{\textfonts}
4352
 
\let\subsecentryfonts = \textfonts
4353
 
\let\subsubsecentryfonts = \textfonts
 
4601
\def\subsecentryfonts{\textfonts}
 
4602
\def\subsubsecentryfonts{\textfonts}
4354
4603
 
4355
4604
 
4356
4605
\message{environments,}
4357
4606
% @foo ... @end foo.
4358
4607
 
4359
4608
% @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
4360
 
 
4609
%
4361
4610
% Since these characters are used in examples, it should be an even number of
4362
4611
% \tt widths. Each \tt character is 1en, so two makes it 1em.
4363
4612
%
4369
4618
 
4370
4619
% The @error{} command.
4371
4620
% Adapted from the TeXbook's \boxit.
4372
 
 
4621
%
4373
4622
\newbox\errorbox
4374
4623
%
4375
4624
{\tentt \global\dimen0 = 3em}% Width of the box.
4377
4626
% The text. (`r' is open on the right, `e' somewhat less so on the left.)
4378
4627
\setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt}
4379
4628
%
4380
 
\global\setbox\errorbox=\hbox to \dimen0{\hfil
 
4629
\setbox\errorbox=\hbox to \dimen0{\hfil
4381
4630
   \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
4382
4631
   \advance\hsize by -2\dimen2 % Rules.
4383
 
   \vbox{
 
4632
   \vbox{%
4384
4633
      \hrule height\dimen2
4385
4634
      \hbox{\vrule width\dimen2 \kern3pt          % Space to left of text.
4386
4635
         \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
4394
4643
% One exception: @ is still an escape character, so that @end tex works.
4395
4644
% But \@ or @@ will get a plain tex @ character.
4396
4645
 
4397
 
\def\tex{\begingroup
 
4646
\envdef\tex{%
4398
4647
  \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
4399
4648
  \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
4400
4649
  \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie
4401
4650
  \catcode `\%=14
4402
4651
  \catcode `\+=\other
4403
4652
  \catcode `\"=\other
4404
 
  \catcode `\==\other
4405
4653
  \catcode `\|=\other
4406
4654
  \catcode `\<=\other
4407
4655
  \catcode `\>=\other
4416
4664
  \let\equiv=\ptexequiv
4417
4665
  \let\!=\ptexexclam
4418
4666
  \let\i=\ptexi
 
4667
  \let\indent=\ptexindent
 
4668
  \let\noindent=\ptexnoindent
4419
4669
  \let\{=\ptexlbrace
4420
4670
  \let\+=\tabalign
4421
4671
  \let\}=\ptexrbrace
 
4672
  \let\/=\ptexslash
4422
4673
  \let\*=\ptexstar
4423
4674
  \let\t=\ptext
4424
4675
  %
4425
4676
  \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
4426
4677
  \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
4427
4678
  \def\@{@}%
4428
 
\let\Etex=\endgroup}
 
4679
}
 
4680
% There is no need to define \Etex.
4429
4681
 
4430
4682
% Define @lisp ... @end lisp.
4431
 
% @lisp does a \begingroup so it can rebind things,
 
4683
% @lisp environment forms a group so it can rebind things,
4432
4684
% including the definition of @end lisp (which normally is erroneous).
4433
4685
 
4434
4686
% Amount to narrow the margins by for @lisp.
4439
4691
% have any width.
4440
4692
\def\lisppar{\null\endgraf}
4441
4693
 
4442
 
% Make each space character in the input produce a normal interword
4443
 
% space in the output.  Don't allow a line break at this space, as this
4444
 
% is used only in environments like @example, where each line of input
4445
 
% should produce a line of output anyway.
4446
 
%
4447
 
{\obeyspaces %
4448
 
\gdef\sepspaces{\obeyspaces\let =\tie}}
4449
 
 
4450
 
% Define \obeyedspace to be our active space, whatever it is.  This is
4451
 
% for use in \parsearg.
4452
 
{\sepspaces%
4453
 
\global\let\obeyedspace= }
4454
 
 
4455
4694
% This space is always present above and below environments.
4456
4695
\newskip\envskipamount \envskipamount = 0pt
4457
4696
 
4469
4708
      \removelastskip
4470
4709
      % it's not a good place to break if the last penalty was \nobreak
4471
4710
      % or better ...
4472
 
      \ifnum\lastpenalty>10000 \else \penalty-50 \fi
 
4711
      \ifnum\lastpenalty<10000 \penalty-50 \fi
4473
4712
      \vskip\envskipamount
4474
4713
    \fi
4475
4714
  \fi
4501
4740
%
4502
4741
\newskip\lskip\newskip\rskip
4503
4742
 
4504
 
\def\cartouche{%
4505
 
\par  % can't be in the midst of a paragraph.
4506
 
\begingroup
4507
 
        \lskip=\leftskip \rskip=\rightskip
4508
 
        \leftskip=0pt\rightskip=0pt %we want these *outside*.
4509
 
        \cartinner=\hsize \advance\cartinner by-\lskip
4510
 
                          \advance\cartinner by-\rskip
4511
 
        \cartouter=\hsize
4512
 
        \advance\cartouter by 18.4pt % allow for 3pt kerns on either
4513
 
%                                    side, and for 6pt waste from
4514
 
%                                    each corner char, and rule thickness
4515
 
        \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
4516
 
        % Flag to tell @lisp, etc., not to narrow margin.
4517
 
        \let\nonarrowing=\comment
4518
 
        \vbox\bgroup
4519
 
                \baselineskip=0pt\parskip=0pt\lineskip=0pt
4520
 
                \carttop
4521
 
                \hbox\bgroup
4522
 
                        \hskip\lskip
4523
 
                        \vrule\kern3pt
4524
 
                        \vbox\bgroup
4525
 
                                \hsize=\cartinner
4526
 
                                \kern3pt
4527
 
                                \begingroup
4528
 
                                        \baselineskip=\normbskip
4529
 
                                        \lineskip=\normlskip
4530
 
                                        \parskip=\normpskip
4531
 
                                        \vskip -\parskip
 
4743
\envdef\cartouche{%
 
4744
  \ifhmode\par\fi  % can't be in the midst of a paragraph.
 
4745
  \startsavinginserts
 
4746
  \lskip=\leftskip \rskip=\rightskip
 
4747
  \leftskip=0pt\rightskip=0pt % we want these *outside*.
 
4748
  \cartinner=\hsize \advance\cartinner by-\lskip
 
4749
  \advance\cartinner by-\rskip
 
4750
  \cartouter=\hsize
 
4751
  \advance\cartouter by 18.4pt  % allow for 3pt kerns on either
 
4752
                                % side, and for 6pt waste from
 
4753
                                % each corner char, and rule thickness
 
4754
  \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
 
4755
  % Flag to tell @lisp, etc., not to narrow margin.
 
4756
  \let\nonarrowing=\comment
 
4757
  \vbox\bgroup
 
4758
      \baselineskip=0pt\parskip=0pt\lineskip=0pt
 
4759
      \carttop
 
4760
      \hbox\bgroup
 
4761
          \hskip\lskip
 
4762
          \vrule\kern3pt
 
4763
          \vbox\bgroup
 
4764
              \kern3pt
 
4765
              \hsize=\cartinner
 
4766
              \baselineskip=\normbskip
 
4767
              \lineskip=\normlskip
 
4768
              \parskip=\normpskip
 
4769
              \vskip -\parskip
 
4770
              \comment % For explanation, see the end of \def\group.
 
4771
}
4532
4772
\def\Ecartouche{%
4533
 
                                \endgroup
4534
 
                                \kern3pt
4535
 
                        \egroup
4536
 
                        \kern3pt\vrule
4537
 
                        \hskip\rskip
4538
 
                \egroup
4539
 
                \cartbot
4540
 
        \egroup
4541
 
\endgroup
4542
 
}}
 
4773
              \ifhmode\par\fi
 
4774
              \kern3pt
 
4775
          \egroup
 
4776
          \kern3pt\vrule
 
4777
          \hskip\rskip
 
4778
      \egroup
 
4779
      \cartbot
 
4780
  \egroup
 
4781
  \checkinserts
 
4782
}
4543
4783
 
4544
4784
 
4545
4785
% This macro is called at the beginning of all the @example variants,
4546
4786
% inside a group.
4547
4787
\def\nonfillstart{%
4548
4788
  \aboveenvbreak
4549
 
  \inENV % This group ends at the end of the body
4550
4789
  \hfuzz = 12pt % Don't be fussy
4551
4790
  \sepspaces % Make spaces be word-separators rather than space tokens.
4552
4791
  \let\par = \lisppar % don't ignore blank lines
4559
4798
  \ifx\nonarrowing\relax
4560
4799
    \advance \leftskip by \lispnarrowing
4561
4800
    \exdentamount=\lispnarrowing
4562
 
    \let\exdent=\nofillexdent
4563
 
    \let\nonarrowing=\relax
4564
 
  \fi
4565
 
}
4566
 
 
4567
 
% Define the \E... control sequence only if we are inside the particular
4568
 
% environment, so the error checking in \end will work.
4569
 
%
4570
 
% To end an @example-like environment, we first end the paragraph (via
4571
 
% \afterenvbreak's vertical glue), and then the group.  That way we keep
4572
 
% the zero \parskip that the environments set -- \parskip glue will be
4573
 
% inserted at the beginning of the next paragraph in the document, after
4574
 
% the environment.
4575
 
%
4576
 
\def\nonfillfinish{\afterenvbreak\endgroup}
4577
 
 
4578
 
% @lisp: indented, narrowed, typewriter font.
4579
 
\def\lisp{\begingroup
 
4801
  \fi
 
4802
  \let\exdent=\nofillexdent
 
4803
}
 
4804
 
 
4805
% If you want all examples etc. small: @set dispenvsize small.
 
4806
% If you want even small examples the full size: @set dispenvsize nosmall.
 
4807
% This affects the following displayed environments:
 
4808
%    @example, @display, @format, @lisp
 
4809
%
 
4810
\def\smallword{small}
 
4811
\def\nosmallword{nosmall}
 
4812
\let\SETdispenvsize\relax
 
4813
\def\setnormaldispenv{%
 
4814
  \ifx\SETdispenvsize\smallword
 
4815
    \smallexamplefonts \rm
 
4816
  \fi
 
4817
}
 
4818
\def\setsmalldispenv{%
 
4819
  \ifx\SETdispenvsize\nosmallword
 
4820
  \else
 
4821
    \smallexamplefonts \rm
 
4822
  \fi
 
4823
}
 
4824
 
 
4825
% We often define two environments, @foo and @smallfoo.
 
4826
% Let's do it by one command:
 
4827
\def\makedispenv #1#2{
 
4828
  \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}
 
4829
  \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}
 
4830
  \expandafter\let\csname E#1\endcsname \afterenvbreak
 
4831
  \expandafter\let\csname Esmall#1\endcsname \afterenvbreak
 
4832
}
 
4833
 
 
4834
% Define two synonyms:
 
4835
\def\maketwodispenvs #1#2#3{
 
4836
  \makedispenv{#1}{#3}
 
4837
  \makedispenv{#2}{#3}
 
4838
}
 
4839
 
 
4840
% @lisp: indented, narrowed, typewriter font; @example: same as @lisp.
 
4841
%
 
4842
% @smallexample and @smalllisp: use smaller fonts.
 
4843
% Originally contributed by Pavel@xerox.
 
4844
%
 
4845
\maketwodispenvs {lisp}{example}{%
4580
4846
  \nonfillstart
4581
 
  \let\Elisp = \nonfillfinish
4582
4847
  \tt
4583
4848
  \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
4584
4849
  \gobble       % eat return
4585
4850
}
4586
4851
 
4587
 
% @example: Same as @lisp.
4588
 
\def\example{\begingroup \def\Eexample{\nonfillfinish\endgroup}\lisp}
4589
 
 
4590
 
% @smallexample and @smalllisp: use smaller fonts.
4591
 
% Originally contributed by Pavel@xerox.
4592
 
\def\smalllisp{\begingroup
4593
 
  \def\Esmalllisp{\nonfillfinish\endgroup}%
4594
 
  \def\Esmallexample{\nonfillfinish\endgroup}%
4595
 
  \smallexamplefonts
4596
 
  \lisp
4597
 
}
4598
 
\let\smallexample = \smalllisp
4599
 
 
4600
 
 
4601
 
% @display: same as @lisp except keep current font.
4602
 
%
4603
 
\def\display{\begingroup
4604
 
  \nonfillstart
4605
 
  \let\Edisplay = \nonfillfinish
4606
 
  \gobble
4607
 
}
4608
 
%
4609
 
% @smalldisplay: @display plus smaller fonts.
4610
 
%
4611
 
\def\smalldisplay{\begingroup
4612
 
  \def\Esmalldisplay{\nonfillfinish\endgroup}%
4613
 
  \smallexamplefonts \rm
4614
 
  \display
4615
 
}
4616
 
 
4617
 
% @format: same as @display except don't narrow margins.
4618
 
%
4619
 
\def\format{\begingroup
4620
 
  \let\nonarrowing = t
4621
 
  \nonfillstart
4622
 
  \let\Eformat = \nonfillfinish
4623
 
  \gobble
4624
 
}
4625
 
%
4626
 
% @smallformat: @format plus smaller fonts.
4627
 
%
4628
 
\def\smallformat{\begingroup
4629
 
  \def\Esmallformat{\nonfillfinish\endgroup}%
4630
 
  \smallexamplefonts \rm
4631
 
  \format
4632
 
}
4633
 
 
4634
 
% @flushleft (same as @format).
4635
 
%
4636
 
\def\flushleft{\begingroup \def\Eflushleft{\nonfillfinish\endgroup}\format}
 
4852
% @display/@smalldisplay: same as @lisp except keep current font.
 
4853
%
 
4854
\makedispenv {display}{%
 
4855
  \nonfillstart
 
4856
  \gobble
 
4857
}
 
4858
 
 
4859
% @format/@smallformat: same as @display except don't narrow margins.
 
4860
%
 
4861
\makedispenv{format}{%
 
4862
  \let\nonarrowing = t%
 
4863
  \nonfillstart
 
4864
  \gobble
 
4865
}
 
4866
 
 
4867
% @flushleft: same as @format, but doesn't obey \SETdispenvsize.
 
4868
\envdef\flushleft{%
 
4869
  \let\nonarrowing = t%
 
4870
  \nonfillstart
 
4871
  \gobble
 
4872
}
 
4873
\let\Eflushleft = \afterenvbreak
4637
4874
 
4638
4875
% @flushright.
4639
4876
%
4640
 
\def\flushright{\begingroup
4641
 
  \let\nonarrowing = t
 
4877
\envdef\flushright{%
 
4878
  \let\nonarrowing = t%
4642
4879
  \nonfillstart
4643
 
  \let\Eflushright = \nonfillfinish
4644
4880
  \advance\leftskip by 0pt plus 1fill
4645
4881
  \gobble
4646
4882
}
 
4883
\let\Eflushright = \afterenvbreak
4647
4884
 
4648
4885
 
4649
4886
% @quotation does normal linebreaking (hence we can't use \nonfillstart)
4650
 
% and narrows the margins.
 
4887
% and narrows the margins.  We keep \parskip nonzero in general, since
 
4888
% we're doing normal filling.  So, when using \aboveenvbreak and
 
4889
% \afterenvbreak, temporarily make \parskip 0.
4651
4890
%
4652
 
\def\quotation{%
4653
 
  \begingroup\inENV %This group ends at the end of the @quotation body
 
4891
\envdef\quotation{%
4654
4892
  {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
4655
4893
  \parindent=0pt
4656
 
  % We have retained a nonzero parskip for the environment, since we're
4657
 
  % doing normal filling. So to avoid extra space below the environment...
4658
 
  \def\Equotation{\parskip = 0pt \nonfillfinish}%
4659
4894
  %
4660
4895
  % @cartouche defines \nonarrowing to inhibit narrowing at next level down.
4661
4896
  \ifx\nonarrowing\relax
4664
4899
    \exdentamount = \lispnarrowing
4665
4900
    \let\nonarrowing = \relax
4666
4901
  \fi
 
4902
  \parsearg\quotationlabel
 
4903
}
 
4904
 
 
4905
% We have retained a nonzero parskip for the environment, since we're
 
4906
% doing normal filling.
 
4907
%
 
4908
\def\Equotation{%
 
4909
  \par
 
4910
  \ifx\quotationauthor\undefined\else
 
4911
    % indent a bit.
 
4912
    \leftline{\kern 2\leftskip \sl ---\quotationauthor}%
 
4913
  \fi
 
4914
  {\parskip=0pt \afterenvbreak}%
 
4915
}
 
4916
 
 
4917
% If we're given an argument, typeset it in bold with a colon after.
 
4918
\def\quotationlabel#1{%
 
4919
  \def\temp{#1}%
 
4920
  \ifx\temp\empty \else
 
4921
    {\bf #1: }%
 
4922
  \fi
4667
4923
}
4668
4924
 
4669
4925
 
4670
4926
% LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>}
4671
 
% If we want to allow any <char> as delimiter, 
 
4927
% If we want to allow any <char> as delimiter,
4672
4928
% we need the curly braces so that makeinfo sees the @verb command, eg:
4673
4929
% `@verbx...x' would look like the '@verbx' command.  --janneke@gnu.org
4674
4930
%
4685
4941
%
4686
4942
% [Knuth] p. 380
4687
4943
\def\uncatcodespecials{%
4688
 
  \def\do##1{\catcode`##1=12}\dospecials}
 
4944
  \def\do##1{\catcode`##1=\other}\dospecials}
4689
4945
%
4690
4946
% [Knuth] pp. 380,381,391
4691
4947
% Disable Spanish ligatures ?` and !` of \tt font
4733
4989
  }
4734
4990
\endgroup
4735
4991
\def\setupverbatim{%
 
4992
  \nonfillstart
 
4993
  \advance\leftskip by -\defbodyindent
4736
4994
  % Easiest (and conventionally used) font for verbatim
4737
4995
  \tt
4738
4996
  \def\par{\leavevmode\egroup\box0\endgraf}%
4746
5004
  \everypar{\starttabbox}%
4747
5005
}
4748
5006
 
4749
 
% Do the @verb magic: verbatim text is quoted by unique 
4750
 
% delimiter characters.  Before first delimiter expect a 
 
5007
% Do the @verb magic: verbatim text is quoted by unique
 
5008
% delimiter characters.  Before first delimiter expect a
4751
5009
% right brace, after last delimiter expect closing brace:
4752
5010
%
4753
5011
%    \def\doverb'{'<char>#1<char>'}'{#1}
4754
5012
%
4755
5013
% [Knuth] p. 382; only eat outer {}
4756
5014
\begingroup
4757
 
  \catcode`[=1\catcode`]=2\catcode`\{=12\catcode`\}=12
 
5015
  \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other
4758
5016
  \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next]
4759
5017
\endgroup
4760
5018
%
4766
5024
%
4767
5025
%     \def\doverbatim#1@end verbatim{#1}
4768
5026
%
4769
 
% For Texinfo it's a lot easier than for LaTeX, 
 
5027
% For Texinfo it's a lot easier than for LaTeX,
4770
5028
% because texinfo's \verbatim doesn't stop at '\end{verbatim}':
4771
5029
% we need not redefine '\', '{' and '}'.
4772
5030
%
4773
5031
% Inspired by LaTeX's verbatim command set [latex.ltx]
4774
 
%% Include LaTeX hack for completeness -- never know
4775
 
%% \begingroup
4776
 
%% \catcode`|=0 \catcode`[=1
4777
 
%% \catcode`]=2\catcode`\{=12\catcode`\}=12\catcode`\ =\active
4778
 
%% \catcode`\\=12|gdef|doverbatim#1@end verbatim[
4779
 
%% #1|endgroup|def|Everbatim[]|end[verbatim]]
4780
 
%% |endgroup
4781
5032
%
4782
5033
\begingroup
4783
5034
  \catcode`\ =\active
4785
5036
  % ignore everything up to the first ^^M, that's the newline at the end
4786
5037
  % of the @verbatim input line itself.  Otherwise we get an extra blank
4787
5038
  % line in the output.
4788
 
  \gdef\doverbatim#1^^M#2@end verbatim{#2\end{verbatim}}%
 
5039
  \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}%
 
5040
  % We really want {...\end verbatim} in the body of the macro, but
 
5041
  % without the active space; thus we have to use \xdef and \gobble.
4789
5042
\endgroup
4790
5043
%
4791
 
\def\verbatim{%
4792
 
  \def\Everbatim{\nonfillfinish\endgroup}%
4793
 
  \begingroup
4794
 
    \nonfillstart
4795
 
    \advance\leftskip by -\defbodyindent
4796
 
    \begingroup\setupverbatim\doverbatim
 
5044
\envdef\verbatim{%
 
5045
    \setupverbatim\doverbatim
4797
5046
}
 
5047
\let\Everbatim = \afterenvbreak
 
5048
 
4798
5049
 
4799
5050
% @verbatiminclude FILE - insert text of file in verbatim environment.
4800
5051
%
4801
 
% Allow normal characters that we make active in the argument (a file name).
4802
 
\def\verbatiminclude{%
4803
 
  \begingroup
4804
 
    \catcode`\\=\other
4805
 
    \catcode`~=\other
4806
 
    \catcode`^=\other
4807
 
    \catcode`_=\other
4808
 
    \catcode`|=\other
4809
 
    \catcode`<=\other
4810
 
    \catcode`>=\other
4811
 
    \catcode`+=\other
4812
 
    \parsearg\doverbatiminclude
4813
 
}
4814
 
\def\setupverbatiminclude{%
4815
 
  \begingroup
4816
 
    \nonfillstart
4817
 
    \advance\leftskip by -\defbodyindent
4818
 
    \begingroup\setupverbatim
4819
 
}
 
5052
\def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude}
4820
5053
%
4821
5054
\def\doverbatiminclude#1{%
4822
 
     % Restore active chars for included file.
4823
 
  \endgroup
4824
 
  \begingroup
4825
 
    \let\value=\expandablevalue
4826
 
    \def\thisfile{#1}%
4827
 
    \expandafter\expandafter\setupverbatiminclude\input\thisfile
4828
 
  \endgroup
4829
 
  \nonfillfinish
4830
 
  \endgroup
 
5055
  {%
 
5056
    \makevalueexpandable
 
5057
    \setupverbatim
 
5058
    \input #1
 
5059
    \afterenvbreak
 
5060
  }%
4831
5061
}
4832
5062
 
4833
5063
% @copying ... @end copying.
4834
5064
% Save the text away for @insertcopying later.  Many commands won't be
4835
5065
% allowed in this context, but that's ok.
4836
 
 
5066
%
4837
5067
% We save the uninterpreted tokens, rather than creating a box.
4838
5068
% Saving the text in a box would be much easier, but then all the
4839
5069
% typesetting commands (@smallbook, font changes, etc.) have to be done
4840
5070
% beforehand -- and a) we want @copying to be done first in the source
4841
5071
% file; b) letting users define the frontmatter in as flexible order as
4842
5072
% possible is very desirable.
4843
 
 
5073
%
4844
5074
\def\copying{\begingroup
4845
5075
  % Define a command to swallow text until we reach `@end copying'.
4846
5076
  % \ is the escape char in this texinfo.tex file, so it is the
4863
5093
% end-of-line to be a \par, as would happen with the normal active
4864
5094
% definition of ^^M.  On the third hand, two ^^M's in a row should still
4865
5095
% generate a \par.
4866
 
 
5096
%
4867
5097
% Our approach is to make ^^M insert a space and a penalty1 normally;
4868
5098
% then it can also check if \lastpenalty=1.  If it does, then manually
4869
5099
% do \par.
4870
 
 
5100
%
4871
5101
% This messes up the normal definitions of @c[omment], so we redefine
4872
5102
% it.  Similarly for @ignore.  (These commands are used in the gcc
4873
5103
% manual for man page generation.)
4874
 
 
5104
%
4875
5105
% Seems pretty fragile, most line-oriented commands will presumably
4876
5106
% fail, but for the limited use of getting the copying text (which
4877
5107
% should be quite simple) inserted, we can hope it's ok.
4902
5132
\message{defuns,}
4903
5133
% @defun etc.
4904
5134
 
4905
 
% Allow user to change definition object font (\df) internally
4906
 
\def\setdeffont#1 {\csname DEF#1\endcsname}
4907
 
 
4908
5135
\newskip\defbodyindent \defbodyindent=.4in
4909
5136
\newskip\defargsindent \defargsindent=50pt
4910
5137
\newskip\deflastargmargin \deflastargmargin=18pt
4911
5138
 
4912
 
\newcount\parencount
 
5139
% Start the processing of @deffn:
 
5140
\def\startdefun{%
 
5141
  \ifnum\lastpenalty<10000
 
5142
    \medbreak
 
5143
  \else
 
5144
    % If there are two @def commands in a row, we'll have a \nobreak,
 
5145
    % which is there to keep the function description together with its
 
5146
    % header.  But if there's nothing but headers, we need to allow a
 
5147
    % break somewhere.  Check for penalty 10002 (inserted by
 
5148
    % \defargscommonending) instead of 10000, since the sectioning
 
5149
    % commands insert a \penalty10000, and we don't want to allow a break
 
5150
    % between a section heading and a defun.
 
5151
    \ifnum\lastpenalty=10002 \penalty2000 \fi
 
5152
    %
 
5153
    % Similarly, after a section heading, do not allow a break.
 
5154
    % But do insert the glue.
 
5155
    \medskip  % preceded by discardable penalty, so not a breakpoint
 
5156
  \fi
 
5157
  %
 
5158
  \parindent=0in
 
5159
  \advance\leftskip by \defbodyindent
 
5160
  \exdentamount=\defbodyindent
 
5161
}
 
5162
 
 
5163
\def\dodefunx#1{%
 
5164
  % First, check whether we are in the right environment:
 
5165
  \checkenv#1%
 
5166
  %
 
5167
  % As above, allow line break if we have multiple x headers in a row.
 
5168
  % It's not a great place, though.
 
5169
  \ifnum\lastpenalty=10002 \penalty3000 \fi
 
5170
  %
 
5171
  % And now, it's time to reuse the body of the original defun:
 
5172
  \expandafter\gobbledefun#1%
 
5173
}
 
5174
\def\gobbledefun#1\startdefun{}
 
5175
 
 
5176
% \printdefunline \deffnheader{text}
 
5177
%
 
5178
\def\printdefunline#1#2{%
 
5179
  \begingroup
 
5180
    % call \deffnheader:
 
5181
    #1#2 \endheader
 
5182
    % common ending:
 
5183
    \interlinepenalty = 10000
 
5184
    \advance\rightskip by 0pt plus 1fil
 
5185
    \endgraf
 
5186
    \nobreak\vskip -\parskip
 
5187
    \penalty 10002  % signal to \startdefun and \dodefunx
 
5188
    % Some of the @defun-type tags do not enable magic parentheses,
 
5189
    % rendering the following check redundant.  But we don't optimize.
 
5190
    \checkparencounts
 
5191
  \endgroup
 
5192
}
 
5193
 
 
5194
\def\Edefun{\endgraf\medbreak}
 
5195
 
 
5196
% \makedefun{deffn} creates \deffn, \deffnx and \Edeffn;
 
5197
% the only thing remainnig is to define \deffnheader.
 
5198
%
 
5199
\def\makedefun#1{%
 
5200
  \expandafter\let\csname E#1\endcsname = \Edefun
 
5201
  \edef\temp{\noexpand\domakedefun
 
5202
    \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}%
 
5203
  \temp
 
5204
}
 
5205
 
 
5206
% \domakedefun \deffn \deffnx \deffnheader
 
5207
%
 
5208
% Define \deffn and \deffnx, without parameters.
 
5209
% \deffnheader has to be defined explicitly.
 
5210
%
 
5211
\def\domakedefun#1#2#3{%
 
5212
  \envdef#1{%
 
5213
    \startdefun
 
5214
    \parseargusing\activeparens{\printdefunline#3}%
 
5215
  }%
 
5216
  \def#2{\dodefunx#1}%
 
5217
  \def#3%
 
5218
}
 
5219
 
 
5220
%%% Untyped functions:
 
5221
 
 
5222
% @deffn category name args
 
5223
\makedefun{deffn}{\deffngeneral{}}
 
5224
 
 
5225
% @deffn category class name args
 
5226
\makedefun{defop}#1 {\defopon{#1\ \putwordon}}
 
5227
 
 
5228
% \defopon {category on}class name args
 
5229
\def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
 
5230
 
 
5231
% \deffngeneral {subind}category name args
 
5232
%
 
5233
\def\deffngeneral#1#2 #3 #4\endheader{%
 
5234
  % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}.
 
5235
  \dosubind{fn}{\code{#3}}{#1}%
 
5236
  \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}%
 
5237
}
 
5238
 
 
5239
%%% Typed functions:
 
5240
 
 
5241
% @deftypefn category type name args
 
5242
\makedefun{deftypefn}{\deftypefngeneral{}}
 
5243
 
 
5244
% @deftypeop category class type name args
 
5245
\makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}}
 
5246
 
 
5247
% \deftypeopon {category on}class type name args
 
5248
\def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
 
5249
 
 
5250
% \deftypefngeneral {subind}category type name args
 
5251
%
 
5252
\def\deftypefngeneral#1#2 #3 #4 #5\endheader{%
 
5253
  \dosubind{fn}{\code{#4}}{#1}%
 
5254
  \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
 
5255
}
 
5256
 
 
5257
%%% Typed variables:
 
5258
 
 
5259
% @deftypevr category type var args
 
5260
\makedefun{deftypevr}{\deftypecvgeneral{}}
 
5261
 
 
5262
% @deftypecv category class type var args
 
5263
\makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}}
 
5264
 
 
5265
% \deftypecvof {category of}class type var args
 
5266
\def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} }
 
5267
 
 
5268
% \deftypecvgeneral {subind}category type var args
 
5269
%
 
5270
\def\deftypecvgeneral#1#2 #3 #4 #5\endheader{%
 
5271
  \dosubind{vr}{\code{#4}}{#1}%
 
5272
  \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
 
5273
}
 
5274
 
 
5275
%%% Untyped variables:
 
5276
 
 
5277
% @defvr category var args
 
5278
\makedefun{defvr}#1 {\deftypevrheader{#1} {} }
 
5279
 
 
5280
% @defcv category class var args
 
5281
\makedefun{defcv}#1 {\defcvof{#1\ \putwordof}}
 
5282
 
 
5283
% \defcvof {category of}class var args
 
5284
\def\defcvof#1#2 {\deftypecvof{#1}#2 {} }
 
5285
 
 
5286
%%% Type:
 
5287
% @deftp category name args
 
5288
\makedefun{deftp}#1 #2 #3\endheader{%
 
5289
  \doind{tp}{\code{#2}}%
 
5290
  \defname{#1}{}{#2}\defunargs{#3\unskip}%
 
5291
}
 
5292
 
 
5293
% Remaining @defun-like shortcuts:
 
5294
\makedefun{defun}{\deffnheader{\putwordDeffunc} }
 
5295
\makedefun{defmac}{\deffnheader{\putwordDefmac} }
 
5296
\makedefun{defspec}{\deffnheader{\putwordDefspec} }
 
5297
\makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} }
 
5298
\makedefun{defvar}{\defvrheader{\putwordDefvar} }
 
5299
\makedefun{defopt}{\defvrheader{\putwordDefopt} }
 
5300
\makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} }
 
5301
\makedefun{defmethod}{\defopon\putwordMethodon}
 
5302
\makedefun{deftypemethod}{\deftypeopon\putwordMethodon}
 
5303
\makedefun{defivar}{\defcvof\putwordInstanceVariableof}
 
5304
\makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof}
 
5305
 
 
5306
% \defname, which formats the name of the @def (not the args).
 
5307
% #1 is the category, such as "Function".
 
5308
% #2 is the return type, if any.
 
5309
% #3 is the function name.
 
5310
%
 
5311
% We are followed by (but not passed) the arguments, if any.
 
5312
%
 
5313
\def\defname#1#2#3{%
 
5314
  % Get the values of \leftskip and \rightskip as they were outside the @def...
 
5315
  \advance\leftskip by -\defbodyindent
 
5316
  %
 
5317
  % How we'll format the type name.  Putting it in brackets helps
 
5318
  % distinguish it from the body text that may end up on the next line
 
5319
  % just below it.
 
5320
  \def\temp{#1}%
 
5321
  \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi}
 
5322
  %
 
5323
  % Figure out line sizes for the paragraph shape.
 
5324
  % The first line needs space for \box0; but if \rightskip is nonzero,
 
5325
  % we need only space for the part of \box0 which exceeds it:
 
5326
  \dimen0=\hsize  \advance\dimen0 by -\wd0  \advance\dimen0 by \rightskip
 
5327
  % The continuations:
 
5328
  \dimen2=\hsize  \advance\dimen2 by -\defargsindent
 
5329
  % (plain.tex says that \dimen1 should be used only as global.)
 
5330
  \parshape 2 0in \dimen0 \defargsindent \dimen2
 
5331
  %
 
5332
  % Put the type name to the right margin.
 
5333
  \noindent
 
5334
  \hbox to 0pt{%
 
5335
    \hfil\box0 \kern-\hsize
 
5336
    % \hsize has to be shortened this way:
 
5337
    \kern\leftskip
 
5338
    % Intentionally do not respect \rightskip, since we need the space.
 
5339
  }%
 
5340
  %
 
5341
  % Allow all lines to be underfull without complaint:
 
5342
  \tolerance=10000 \hbadness=10000
 
5343
  \exdentamount=\defbodyindent
 
5344
  {%
 
5345
    % defun fonts. We use typewriter by default (used to be bold) because:
 
5346
    % . we're printing identifiers, they should be in tt in principle.
 
5347
    % . in languages with many accents, such as Czech or French, it's
 
5348
    %   common to leave accents off identifiers.  The result looks ok in
 
5349
    %   tt, but exceedingly strange in rm.
 
5350
    % . we don't want -- and --- to be treated as ligatures.
 
5351
    % . this still does not fix the ?` and !` ligatures, but so far no
 
5352
    %   one has made identifiers using them :).
 
5353
    \df \tt
 
5354
    \def\temp{#2}% return value type
 
5355
    \ifx\temp\empty\else \tclose{\temp} \fi
 
5356
    #3% output function name
 
5357
  }%
 
5358
  {\rm\enskip}% hskip 0.5 em of \tenrm
 
5359
  %
 
5360
  \boldbrax
 
5361
  % arguments will be output next, if any.
 
5362
}
 
5363
 
 
5364
% Print arguments in slanted roman (not ttsl), inconsistently with using
 
5365
% tt for the name.  This is because literal text is sometimes needed in
 
5366
% the argument list (groff manual), and ttsl and tt are not very
 
5367
% distinguishable.  Prevent hyphenation at `-' chars.
 
5368
%
 
5369
\def\defunargs#1{%
 
5370
  % use sl by default (not ttsl),
 
5371
  % tt for the names.
 
5372
  \df \sl \hyphenchar\font=0
 
5373
  %
 
5374
  % On the other hand, if an argument has two dashes (for instance), we
 
5375
  % want a way to get ttsl.  Let's try @var for that.
 
5376
  \let\var=\ttslanted
 
5377
  #1%
 
5378
  \sl\hyphenchar\font=45
 
5379
}
4913
5380
 
4914
5381
% We want ()&[] to print specially on the defun line.
4915
 
 
5382
%
4916
5383
\def\activeparens{%
4917
5384
  \catcode`\(=\active \catcode`\)=\active
 
5385
  \catcode`\[=\active \catcode`\]=\active
4918
5386
  \catcode`\&=\active
4919
 
  \catcode`\[=\active \catcode`\]=\active
4920
5387
}
4921
5388
 
4922
5389
% Make control sequences which act like normal parenthesis chars.
4923
5390
\let\lparen = ( \let\rparen = )
4924
5391
 
4925
 
{\activeparens % Now, smart parens don't turn on until &foo (see \amprm)
4926
 
 
4927
5392
% Be sure that we always have a definition for `(', etc.  For example,
4928
5393
% if the fn name has parens in it, \boldbrax will not be in effect yet,
4929
5394
% so TeX would otherwise complain about undefined control sequence.
4930
 
\global\let(=\lparen \global\let)=\rparen
4931
 
\global\let[=\lbrack \global\let]=\rbrack
4932
 
 
4933
 
\gdef\functionparens{\boldbrax\let&=\amprm\parencount=0 }
4934
 
\gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
4935
 
% This is used to turn on special parens
4936
 
% but make & act ordinary (given that it's active).
4937
 
\gdef\boldbraxnoamp{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb\let&=\ampnr}
4938
 
 
4939
 
% Definitions of (, ) and & used in args for functions.
4940
 
% This is the definition of ( outside of all parentheses.
4941
 
\gdef\oprm#1 {{\rm\char`\(}#1 \bf \let(=\opnested
 
5395
{
 
5396
  \activeparens
 
5397
  \global\let(=\lparen \global\let)=\rparen
 
5398
  \global\let[=\lbrack \global\let]=\rbrack
 
5399
  \global\let& = \&
 
5400
 
 
5401
  \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
 
5402
  \gdef\magicamp{\let&=\amprm}
 
5403
}
 
5404
 
 
5405
\newcount\parencount
 
5406
 
 
5407
% If we encounter &foo, then turn on ()-hacking afterwards
 
5408
\newif\ifampseen
 
5409
\def\amprm#1 {\ampseentrue{\bf\&#1 }}
 
5410
 
 
5411
\def\parenfont{%
 
5412
  \ifampseen
 
5413
    % At the first level, print parens in roman,
 
5414
    % otherwise use the default font.
 
5415
    \ifnum \parencount=1 \rm \fi
 
5416
  \else
 
5417
    % The \sf parens (in \boldbrax) actually are a little bolder than
 
5418
    % the contained text.  This is especially needed for [ and ] .
 
5419
    \sf
 
5420
  \fi
 
5421
}
 
5422
\def\infirstlevel#1{%
 
5423
  \ifampseen
 
5424
    \ifnum\parencount=1
 
5425
      #1%
 
5426
    \fi
 
5427
  \fi
 
5428
}
 
5429
\def\bfafterword#1 {#1 \bf}
 
5430
 
 
5431
\def\opnr{%
4942
5432
  \global\advance\parencount by 1
4943
 
}
4944
 
%
4945
 
% This is the definition of ( when already inside a level of parens.
4946
 
\gdef\opnested{\char`\(\global\advance\parencount by 1 }
4947
 
%
4948
 
\gdef\clrm{% Print a paren in roman if it is taking us back to depth of 0.
4949
 
  % also in that case restore the outer-level definition of (.
4950
 
  \ifnum \parencount=1 {\rm \char `\)}\sl \let(=\oprm \else \char `\) \fi
4951
 
  \global\advance \parencount by -1 }
4952
 
% If we encounter &foo, then turn on ()-hacking afterwards
4953
 
\gdef\amprm#1 {{\rm\&#1}\let(=\oprm \let)=\clrm\ }
4954
 
%
4955
 
\gdef\normalparens{\boldbrax\let&=\ampnr}
4956
 
} % End of definition inside \activeparens
4957
 
%% These parens (in \boldbrax) actually are a little bolder than the
4958
 
%% contained text.  This is especially needed for [ and ]
4959
 
\def\opnr{{\sf\char`\(}\global\advance\parencount by 1 }
4960
 
\def\clnr{{\sf\char`\)}\global\advance\parencount by -1 }
4961
 
\let\ampnr = \&
4962
 
\def\lbrb{{\bf\char`\[}}
4963
 
\def\rbrb{{\bf\char`\]}}
4964
 
 
4965
 
% Active &'s sneak into the index arguments, so make sure it's defined.
4966
 
{
4967
 
  \catcode`& = \active
4968
 
  \global\let& = \ampnr
4969
 
}
4970
 
 
4971
 
% \defname, which formats the name of the @def (not the args).
4972
 
% #1 is the function name.
4973
 
% #2 is the type of definition, such as "Function".
4974
 
%
4975
 
\def\defname#1#2{%
4976
 
  % How we'll output the type name.  Putting it in brackets helps
4977
 
  % distinguish it from the body text that may end up on the next line
4978
 
  % just below it.
4979
 
  \ifempty{#2}%
4980
 
    \def\defnametype{}%
4981
 
  \else
4982
 
    \def\defnametype{[\rm #2]}%
4983
 
  \fi
4984
 
  %
4985
 
  % Get the values of \leftskip and \rightskip as they were outside the @def...
4986
 
  \dimen2=\leftskip
4987
 
  \advance\dimen2 by -\defbodyindent
4988
 
  %
4989
 
  % Figure out values for the paragraph shape.
4990
 
  \setbox0=\hbox{\hskip \deflastargmargin{\defnametype}}%
4991
 
  \dimen0=\hsize \advance \dimen0 by -\wd0  % compute size for first line
4992
 
  \dimen1=\hsize \advance \dimen1 by -\defargsindent  % size for continuations
4993
 
  \parshape 2 0in \dimen0 \defargsindent \dimen1
4994
 
  %
4995
 
  % Output arg 2 ("Function" or some such) but stuck inside a box of
4996
 
  % width 0 so it does not interfere with linebreaking.
4997
 
  \noindent
4998
 
  %
4999
 
  {% Adjust \hsize to exclude the ambient margins,
5000
 
   % so that \rightline will obey them.
5001
 
   \advance \hsize by -\dimen2
5002
 
   \dimen3 = 0pt  % was -1.25pc
5003
 
   \rlap{\rightline{\defnametype\kern\dimen3}}%
5004
 
  }%
5005
 
  %
5006
 
  % Allow all lines to be underfull without complaint:
5007
 
  \tolerance=10000 \hbadness=10000
5008
 
  \advance\leftskip by -\defbodyindent
5009
 
  \exdentamount=\defbodyindent
5010
 
  {\df #1}\enskip        % output function name
5011
 
  % \defunargs will be called next to output the arguments, if any.
5012
 
}
5013
 
 
5014
 
% Common pieces to start any @def...
5015
 
% #1 is the \E... control sequence to end the definition (which we define).
5016
 
% #2 is the \...x control sequence (which our caller defines).
5017
 
% #3 is the control sequence to process the header, such as \defunheader.
5018
 
5019
 
\def\parsebodycommon#1#2#3{%
5020
 
  \begingroup\inENV
5021
 
  % If there are two @def commands in a row, we'll have a \nobreak,
5022
 
  % which is there to keep the function description together with its
5023
 
  % header.  But if there's nothing but headers, we want to allow a
5024
 
  % break after all.  Check for penalty 10002 (inserted by
5025
 
  % \defargscommonending) instead of 10000, since the sectioning
5026
 
  % commands insert a \penalty10000, and we don't want to allow a break
5027
 
  % between a section heading and a defun.
5028
 
  \ifnum\lastpenalty=10002 \penalty0 \fi
5029
 
  \medbreak
5030
 
  %
5031
 
  % Define the \E... end token that this defining construct specifies
5032
 
  % so that it will exit this group.
5033
 
  \def#1{\endgraf\endgroup\medbreak}%
5034
 
  %
5035
 
  \parindent=0in
5036
 
  \advance\leftskip by \defbodyindent
5037
 
  \exdentamount=\defbodyindent
5038
 
}
5039
 
 
5040
 
% Common part of the \...x definitions.
5041
 
5042
 
\def\defxbodycommon{%
5043
 
  % As with \parsebodycommon above, allow line break if we have multiple
5044
 
  % x headers in a row.  It's not a great place, though.
5045
 
  \ifnum\lastpenalty=10000 \penalty1000 \fi
5046
 
  %
5047
 
  \begingroup\obeylines
5048
 
}
5049
 
 
5050
 
% Process body of @defun, @deffn, @defmac, etc.
5051
 
%
5052
 
\def\defparsebody#1#2#3{%
5053
 
  \parsebodycommon{#1}{#2}{#3}%
5054
 
  \def#2{\defxbodycommon \activeparens \spacesplit#3}%
5055
 
  \catcode\equalChar=\active
5056
 
  \begingroup\obeylines\activeparens
5057
 
  \spacesplit#3%
5058
 
}
5059
 
 
5060
 
% #1, #2, #3 are the common arguments (see \parsebodycommon above).
5061
 
% #4, delimited by the space, is the class name.
5062
 
%
5063
 
\def\defmethparsebody#1#2#3#4 {%
5064
 
  \parsebodycommon{#1}{#2}{#3}%
5065
 
  \def#2##1 {\defxbodycommon \activeparens \spacesplit{#3{##1}}}%
5066
 
  \begingroup\obeylines\activeparens
5067
 
  % The \empty here prevents misinterpretation of a construct such as
5068
 
  %   @deffn {whatever} {Enharmonic comma}
5069
 
  % See comments at \deftpparsebody, although in our case we don't have
5070
 
  % to remove the \empty afterwards, since it is empty.
5071
 
  \spacesplit{#3{#4}}\empty
5072
 
}
5073
 
 
5074
 
% Used for @deftypemethod and @deftypeivar.
5075
 
% #1, #2, #3 are the common arguments (see \defparsebody).
5076
 
% #4, delimited by a space, is the class name.
5077
 
% #5 is the method's return type.
5078
 
%
5079
 
\def\deftypemethparsebody#1#2#3#4 #5 {%
5080
 
  \parsebodycommon{#1}{#2}{#3}%
5081
 
  \def#2##1 ##2 {\defxbodycommon \activeparens \spacesplit{#3{##1}{##2}}}%
5082
 
  \begingroup\obeylines\activeparens
5083
 
  \spacesplit{#3{#4}{#5}}%
5084
 
}
5085
 
 
5086
 
% Used for @deftypeop.  The change from \deftypemethparsebody is an
5087
 
% extra argument at the beginning which is the `category', instead of it
5088
 
% being the hardwired string `Method' or `Instance Variable'.  We have
5089
 
% to account for this both in the \...x definition and in parsing the
5090
 
% input at hand.  Thus also need a control sequence (passed as #5) for
5091
 
% the \E... definition to assign the category name to.
5092
 
5093
 
\def\deftypeopparsebody#1#2#3#4#5 #6 {%
5094
 
  \parsebodycommon{#1}{#2}{#3}%
5095
 
  \def#2##1 ##2 ##3 {\def#4{##1}%
5096
 
    \defxbodycommon \activeparens \spacesplit{#3{##2}{##3}}}%
5097
 
  \begingroup\obeylines\activeparens
5098
 
  \spacesplit{#3{#5}{#6}}%
5099
 
}
5100
 
 
5101
 
% For @defop.
5102
 
\def\defopparsebody #1#2#3#4#5 {%
5103
 
  \parsebodycommon{#1}{#2}{#3}%
5104
 
  \def#2##1 ##2 {\def#4{##1}%
5105
 
    \defxbodycommon \activeparens \spacesplit{#3{##2}}}%
5106
 
  \begingroup\obeylines\activeparens
5107
 
  \spacesplit{#3{#5}}%
5108
 
}
5109
 
 
5110
 
% These parsing functions are similar to the preceding ones
5111
 
% except that they do not make parens into active characters.
5112
 
% These are used for "variables" since they have no arguments.
5113
 
%
5114
 
\def\defvarparsebody #1#2#3{%
5115
 
  \parsebodycommon{#1}{#2}{#3}%
5116
 
  \def#2{\defxbodycommon \spacesplit#3}%
5117
 
  \catcode\equalChar=\active
5118
 
  \begingroup\obeylines
5119
 
  \spacesplit#3%
5120
 
}
5121
 
 
5122
 
% @defopvar.
5123
 
\def\defopvarparsebody #1#2#3#4#5 {%
5124
 
  \parsebodycommon{#1}{#2}{#3}%
5125
 
  \def#2##1 ##2 {\def#4{##1}%
5126
 
    \defxbodycommon \spacesplit{#3{##2}}}%
5127
 
  \begingroup\obeylines
5128
 
  \spacesplit{#3{#5}}%
5129
 
}
5130
 
 
5131
 
\def\defvrparsebody#1#2#3#4 {%
5132
 
  \parsebodycommon{#1}{#2}{#3}%
5133
 
  \def#2##1 {\defxbodycommon \spacesplit{#3{##1}}}%
5134
 
  \begingroup\obeylines
5135
 
  \spacesplit{#3{#4}}%
5136
 
}
5137
 
 
5138
 
% This loses on `@deftp {Data Type} {struct termios}' -- it thinks the
5139
 
% type is just `struct', because we lose the braces in `{struct
5140
 
% termios}' when \spacesplit reads its undelimited argument.  Sigh.
5141
 
% \let\deftpparsebody=\defvrparsebody
5142
 
%
5143
 
% So, to get around this, we put \empty in with the type name.  That
5144
 
% way, TeX won't find exactly `{...}' as an undelimited argument, and
5145
 
% won't strip off the braces.
5146
 
%
5147
 
\def\deftpparsebody #1#2#3#4 {%
5148
 
  \parsebodycommon{#1}{#2}{#3}%
5149
 
  \def#2##1 {\defxbodycommon \spacesplit{#3{##1}}}%
5150
 
  \begingroup\obeylines
5151
 
  \spacesplit{\parsetpheaderline{#3{#4}}}\empty
5152
 
}
5153
 
 
5154
 
% Fine, but then we have to eventually remove the \empty *and* the
5155
 
% braces (if any).  That's what this does.
5156
 
%
5157
 
\def\removeemptybraces\empty#1\relax{#1}
5158
 
 
5159
 
% After \spacesplit has done its work, this is called -- #1 is the final
5160
 
% thing to call, #2 the type name (which starts with \empty), and #3
5161
 
% (which might be empty) the arguments.
5162
 
%
5163
 
\def\parsetpheaderline#1#2#3{%
5164
 
  #1{\removeemptybraces#2\relax}{#3}%
5165
 
}%
5166
 
 
5167
 
% Split up #2 (the rest of the input line) at the first space token.
5168
 
% call #1 with two arguments:
5169
 
%  the first is all of #2 before the space token,
5170
 
%  the second is all of #2 after that space token.
5171
 
% If #2 contains no space token, all of it is passed as the first arg
5172
 
% and the second is passed as empty.
5173
 
%
5174
 
{\obeylines %
5175
 
 \gdef\spacesplit#1#2^^M{\endgroup\spacesplitx{#1}#2 \relax\spacesplitx}%
5176
 
 \long\gdef\spacesplitx#1#2 #3#4\spacesplitx{%
5177
 
   \ifx\relax #3%
5178
 
     #1{#2}{}%
5179
 
   \else %
5180
 
     #1{#2}{#3#4}%
5181
 
   \fi}%
5182
 
}
5183
 
 
5184
 
% Define @defun.
5185
 
 
5186
 
% This is called to end the arguments processing for all the @def... commands.
5187
 
%
5188
 
\def\defargscommonending{%
5189
 
  \interlinepenalty = 10000
5190
 
  \advance\rightskip by 0pt plus 1fil
5191
 
  \endgraf
5192
 
  \nobreak\vskip -\parskip
5193
 
  \penalty 10002  % signal to \parsebodycommon.
5194
 
}
5195
 
 
5196
 
% This expands the args and terminates the paragraph they comprise.
5197
 
5198
 
\def\defunargs#1{\functionparens \sl
5199
 
% Expand, preventing hyphenation at `-' chars.
5200
 
% Note that groups don't affect changes in \hyphenchar.
5201
 
% Set the font temporarily and use \font in case \setfont made \tensl a macro.
5202
 
{\tensl\hyphenchar\font=0}%
5203
 
#1%
5204
 
{\tensl\hyphenchar\font=45}%
5205
 
\ifnum\parencount=0 \else \errmessage{Unbalanced parentheses in @def}\fi%
5206
 
  \defargscommonending
5207
 
}
5208
 
 
5209
 
\def\deftypefunargs #1{%
5210
 
% Expand, preventing hyphenation at `-' chars.
5211
 
% Note that groups don't affect changes in \hyphenchar.
5212
 
% Use \boldbraxnoamp, not \functionparens, so that & is not special.
5213
 
\boldbraxnoamp
5214
 
\tclose{#1}% avoid \code because of side effects on active chars
5215
 
  \defargscommonending
5216
 
}
5217
 
 
5218
 
% Do complete processing of one @defun or @defunx line already parsed.
5219
 
 
5220
 
% @deffn Command forward-char nchars
5221
 
 
5222
 
\def\deffn{\defmethparsebody\Edeffn\deffnx\deffnheader}
5223
 
 
5224
 
\def\deffnheader #1#2#3{\doind {fn}{\code{#2}}%
5225
 
\begingroup\defname {#2}{#1}\defunargs{#3}\endgroup %
5226
 
\catcode\equalChar=\other % Turn off change made in \defparsebody
5227
 
}
5228
 
 
5229
 
% @defun == @deffn Function
5230
 
 
5231
 
\def\defun{\defparsebody\Edefun\defunx\defunheader}
5232
 
 
5233
 
\def\defunheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
5234
 
\begingroup\defname {#1}{\putwordDeffunc}%
5235
 
\defunargs {#2}\endgroup %
5236
 
\catcode\equalChar=\other % Turn off change made in \defparsebody
5237
 
}
5238
 
 
5239
 
% @deftypefun int foobar (int @var{foo}, float @var{bar})
5240
 
 
5241
 
\def\deftypefun{\defparsebody\Edeftypefun\deftypefunx\deftypefunheader}
5242
 
 
5243
 
% #1 is the data type.  #2 is the name and args.
5244
 
\def\deftypefunheader #1#2{\deftypefunheaderx{#1}#2 \relax}
5245
 
% #1 is the data type, #2 the name, #3 the args.
5246
 
\def\deftypefunheaderx #1#2 #3\relax{%
5247
 
\doind {fn}{\code{#2}}% Make entry in function index
5248
 
\begingroup\defname {\defheaderxcond#1\relax$.$#2}{\putwordDeftypefun}%
5249
 
\deftypefunargs {#3}\endgroup %
5250
 
\catcode\equalChar=\other % Turn off change made in \defparsebody
5251
 
}
5252
 
 
5253
 
% @deftypefn {Library Function} int foobar (int @var{foo}, float @var{bar})
5254
 
 
5255
 
\def\deftypefn{\defmethparsebody\Edeftypefn\deftypefnx\deftypefnheader}
5256
 
 
5257
 
% \defheaderxcond#1\relax$.$
5258
 
% puts #1 in @code, followed by a space, but does nothing if #1 is null.
5259
 
\def\defheaderxcond#1#2$.${\ifx#1\relax\else\code{#1#2} \fi}
5260
 
 
5261
 
% #1 is the classification.  #2 is the data type.  #3 is the name and args.
5262
 
\def\deftypefnheader #1#2#3{\deftypefnheaderx{#1}{#2}#3 \relax}
5263
 
% #1 is the classification, #2 the data type, #3 the name, #4 the args.
5264
 
\def\deftypefnheaderx #1#2#3 #4\relax{%
5265
 
\doind {fn}{\code{#3}}% Make entry in function index
5266
 
\begingroup
5267
 
\normalparens % notably, turn off `&' magic, which prevents
5268
 
%               at least some C++ text from working
5269
 
\defname {\defheaderxcond#2\relax$.$#3}{#1}%
5270
 
\deftypefunargs {#4}\endgroup %
5271
 
\catcode\equalChar=\other % Turn off change made in \defparsebody
5272
 
}
5273
 
 
5274
 
% @defmac == @deffn Macro
5275
 
 
5276
 
\def\defmac{\defparsebody\Edefmac\defmacx\defmacheader}
5277
 
 
5278
 
\def\defmacheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
5279
 
\begingroup\defname {#1}{\putwordDefmac}%
5280
 
\defunargs {#2}\endgroup %
5281
 
\catcode\equalChar=\other % Turn off change made in \defparsebody
5282
 
}
5283
 
 
5284
 
% @defspec == @deffn Special Form
5285
 
 
5286
 
\def\defspec{\defparsebody\Edefspec\defspecx\defspecheader}
5287
 
 
5288
 
\def\defspecheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
5289
 
\begingroup\defname {#1}{\putwordDefspec}%
5290
 
\defunargs {#2}\endgroup %
5291
 
\catcode\equalChar=\other % Turn off change made in \defparsebody
5292
 
}
5293
 
 
5294
 
% @defop CATEGORY CLASS OPERATION ARG...
5295
 
%
5296
 
\def\defop #1 {\def\defoptype{#1}%
5297
 
\defopparsebody\Edefop\defopx\defopheader\defoptype}
5298
 
%
5299
 
\def\defopheader#1#2#3{%
5300
 
  \dosubind{fn}{\code{#2}}{\putwordon\ \code{#1}}% function index entry
5301
 
  \begingroup
5302
 
    \defname{#2}{\defoptype\ \putwordon\ #1}%
5303
 
    \defunargs{#3}%
5304
 
  \endgroup
5305
 
}
5306
 
 
5307
 
% @deftypeop CATEGORY CLASS TYPE OPERATION ARG...
5308
 
%
5309
 
\def\deftypeop #1 {\def\deftypeopcategory{#1}%
5310
 
  \deftypeopparsebody\Edeftypeop\deftypeopx\deftypeopheader
5311
 
                       \deftypeopcategory}
5312
 
%
5313
 
% #1 is the class name, #2 the data type, #3 the operation name, #4 the args.
5314
 
\def\deftypeopheader#1#2#3#4{%
5315
 
  \dosubind{fn}{\code{#3}}{\putwordon\ \code{#1}}% entry in function index
5316
 
  \begingroup
5317
 
    \defname{\defheaderxcond#2\relax$.$#3}
5318
 
            {\deftypeopcategory\ \putwordon\ \code{#1}}%
5319
 
    \deftypefunargs{#4}%
5320
 
  \endgroup
5321
 
}
5322
 
 
5323
 
% @deftypemethod CLASS TYPE METHOD ARG...
5324
 
%
5325
 
\def\deftypemethod{%
5326
 
  \deftypemethparsebody\Edeftypemethod\deftypemethodx\deftypemethodheader}
5327
 
%
5328
 
% #1 is the class name, #2 the data type, #3 the method name, #4 the args.
5329
 
\def\deftypemethodheader#1#2#3#4{%
5330
 
  \dosubind{fn}{\code{#3}}{\putwordon\ \code{#1}}% entry in function index
5331
 
  \begingroup
5332
 
    \defname{\defheaderxcond#2\relax$.$#3}{\putwordMethodon\ \code{#1}}%
5333
 
    \deftypefunargs{#4}%
5334
 
  \endgroup
5335
 
}
5336
 
 
5337
 
% @deftypeivar CLASS TYPE VARNAME
5338
 
%
5339
 
\def\deftypeivar{%
5340
 
  \deftypemethparsebody\Edeftypeivar\deftypeivarx\deftypeivarheader}
5341
 
%
5342
 
% #1 is the class name, #2 the data type, #3 the variable name.
5343
 
\def\deftypeivarheader#1#2#3{%
5344
 
  \dosubind{vr}{\code{#3}}{\putwordof\ \code{#1}}% entry in variable index
5345
 
  \begingroup
5346
 
    \defname{\defheaderxcond#2\relax$.$#3}
5347
 
            {\putwordInstanceVariableof\ \code{#1}}%
5348
 
    \defvarargs{#3}%
5349
 
  \endgroup
5350
 
}
5351
 
 
5352
 
% @defmethod == @defop Method
5353
 
%
5354
 
\def\defmethod{\defmethparsebody\Edefmethod\defmethodx\defmethodheader}
5355
 
%
5356
 
% #1 is the class name, #2 the method name, #3 the args.
5357
 
\def\defmethodheader#1#2#3{%
5358
 
  \dosubind{fn}{\code{#2}}{\putwordon\ \code{#1}}% entry in function index
5359
 
  \begingroup
5360
 
    \defname{#2}{\putwordMethodon\ \code{#1}}%
5361
 
    \defunargs{#3}%
5362
 
  \endgroup
5363
 
}
5364
 
 
5365
 
% @defcv {Class Option} foo-class foo-flag
5366
 
 
5367
 
\def\defcv #1 {\def\defcvtype{#1}%
5368
 
\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}
5369
 
 
5370
 
\def\defcvarheader #1#2#3{%
5371
 
  \dosubind{vr}{\code{#2}}{\putwordof\ \code{#1}}% variable index entry
5372
 
  \begingroup
5373
 
    \defname{#2}{\defcvtype\ \putwordof\ #1}%
5374
 
    \defvarargs{#3}%
5375
 
  \endgroup
5376
 
}
5377
 
 
5378
 
% @defivar CLASS VARNAME == @defcv {Instance Variable} CLASS VARNAME
5379
 
%
5380
 
\def\defivar{\defvrparsebody\Edefivar\defivarx\defivarheader}
5381
 
%
5382
 
\def\defivarheader#1#2#3{%
5383
 
  \dosubind{vr}{\code{#2}}{\putwordof\ \code{#1}}% entry in var index
5384
 
  \begingroup
5385
 
    \defname{#2}{\putwordInstanceVariableof\ #1}%
5386
 
    \defvarargs{#3}%
5387
 
  \endgroup
5388
 
}
5389
 
 
5390
 
% @defvar
5391
 
% First, define the processing that is wanted for arguments of @defvar.
5392
 
% This is actually simple: just print them in roman.
5393
 
% This must expand the args and terminate the paragraph they make up
5394
 
\def\defvarargs #1{\normalparens #1%
5395
 
  \defargscommonending
5396
 
}
5397
 
 
5398
 
% @defvr Counter foo-count
5399
 
 
5400
 
\def\defvr{\defvrparsebody\Edefvr\defvrx\defvrheader}
5401
 
 
5402
 
\def\defvrheader #1#2#3{\doind {vr}{\code{#2}}%
5403
 
\begingroup\defname {#2}{#1}\defvarargs{#3}\endgroup}
5404
 
 
5405
 
% @defvar == @defvr Variable
5406
 
 
5407
 
\def\defvar{\defvarparsebody\Edefvar\defvarx\defvarheader}
5408
 
 
5409
 
\def\defvarheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
5410
 
\begingroup\defname {#1}{\putwordDefvar}%
5411
 
\defvarargs {#2}\endgroup %
5412
 
}
5413
 
 
5414
 
% @defopt == @defvr {User Option}
5415
 
 
5416
 
\def\defopt{\defvarparsebody\Edefopt\defoptx\defoptheader}
5417
 
 
5418
 
\def\defoptheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
5419
 
\begingroup\defname {#1}{\putwordDefopt}%
5420
 
\defvarargs {#2}\endgroup %
5421
 
}
5422
 
 
5423
 
% @deftypevar int foobar
5424
 
 
5425
 
\def\deftypevar{\defvarparsebody\Edeftypevar\deftypevarx\deftypevarheader}
5426
 
 
5427
 
% #1 is the data type.  #2 is the name, perhaps followed by text that
5428
 
% is actually part of the data type, which should not be put into the index.
5429
 
\def\deftypevarheader #1#2{%
5430
 
\dovarind#2 \relax% Make entry in variables index
5431
 
\begingroup\defname {\defheaderxcond#1\relax$.$#2}{\putwordDeftypevar}%
5432
 
  \defargscommonending
5433
 
\endgroup}
5434
 
\def\dovarind#1 #2\relax{\doind{vr}{\code{#1}}}
5435
 
 
5436
 
% @deftypevr {Global Flag} int enable
5437
 
 
5438
 
\def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader}
5439
 
 
5440
 
\def\deftypevrheader #1#2#3{\dovarind#3 \relax%
5441
 
\begingroup\defname {\defheaderxcond#2\relax$.$#3}{#1}
5442
 
  \defargscommonending
5443
 
\endgroup}
5444
 
 
5445
 
% Now define @deftp
5446
 
% Args are printed in bold, a slight difference from @defvar.
5447
 
 
5448
 
\def\deftpargs #1{\bf \defvarargs{#1}}
5449
 
 
5450
 
% @deftp Class window height width ...
5451
 
 
5452
 
\def\deftp{\deftpparsebody\Edeftp\deftpx\deftpheader}
5453
 
 
5454
 
\def\deftpheader #1#2#3{\doind {tp}{\code{#2}}%
5455
 
\begingroup\defname {#2}{#1}\deftpargs{#3}\endgroup}
5456
 
 
5457
 
% These definitions are used if you use @defunx (etc.)
5458
 
% anywhere other than immediately after a @defun or @defunx.
5459
 
5460
 
\def\defcvx#1 {\errmessage{@defcvx in invalid context}}
5461
 
\def\deffnx#1 {\errmessage{@deffnx in invalid context}}
5462
 
\def\defivarx#1 {\errmessage{@defivarx in invalid context}}
5463
 
\def\defmacx#1 {\errmessage{@defmacx in invalid context}}
5464
 
\def\defmethodx#1 {\errmessage{@defmethodx in invalid context}}
5465
 
\def\defoptx #1 {\errmessage{@defoptx in invalid context}}
5466
 
\def\defopx#1 {\errmessage{@defopx in invalid context}}
5467
 
\def\defspecx#1 {\errmessage{@defspecx in invalid context}}
5468
 
\def\deftpx#1 {\errmessage{@deftpx in invalid context}}
5469
 
\def\deftypefnx#1 {\errmessage{@deftypefnx in invalid context}}
5470
 
\def\deftypefunx#1 {\errmessage{@deftypefunx in invalid context}}
5471
 
\def\deftypeivarx#1 {\errmessage{@deftypeivarx in invalid context}}
5472
 
\def\deftypemethodx#1 {\errmessage{@deftypemethodx in invalid context}}
5473
 
\def\deftypeopx#1 {\errmessage{@deftypeopx in invalid context}}
5474
 
\def\deftypevarx#1 {\errmessage{@deftypevarx in invalid context}}
5475
 
\def\deftypevrx#1 {\errmessage{@deftypevrx in invalid context}}
5476
 
\def\defunx#1 {\errmessage{@defunx in invalid context}}
5477
 
\def\defvarx#1 {\errmessage{@defvarx in invalid context}}
5478
 
\def\defvrx#1 {\errmessage{@defvrx in invalid context}}
 
5433
  {\parenfont(}%
 
5434
  \infirstlevel \bfafterword
 
5435
}
 
5436
\def\clnr{%
 
5437
  {\parenfont)}%
 
5438
  \infirstlevel \sl
 
5439
  \global\advance\parencount by -1
 
5440
}
 
5441
 
 
5442
\newcount\brackcount
 
5443
\def\lbrb{%
 
5444
  \global\advance\brackcount by 1
 
5445
  {\bf[}%
 
5446
}
 
5447
\def\rbrb{%
 
5448
  {\bf]}%
 
5449
  \global\advance\brackcount by -1
 
5450
}
 
5451
 
 
5452
\def\checkparencounts{%
 
5453
  \ifnum\parencount=0 \else \badparencount \fi
 
5454
  \ifnum\brackcount=0 \else \badbrackcount \fi
 
5455
}
 
5456
\def\badparencount{%
 
5457
  \errmessage{Unbalanced parentheses in @def}%
 
5458
  \global\parencount=0
 
5459
}
 
5460
\def\badbrackcount{%
 
5461
  \errmessage{Unbalanced square braces in @def}%
 
5462
  \global\brackcount=0
 
5463
}
5479
5464
 
5480
5465
 
5481
5466
\message{macros,}
5484
5469
% To do this right we need a feature of e-TeX, \scantokens,
5485
5470
% which we arrange to emulate with a temporary file in ordinary TeX.
5486
5471
\ifx\eTeXversion\undefined
5487
 
 \newwrite\macscribble
5488
 
 \def\scanmacro#1{%
5489
 
   \begingroup \newlinechar`\^^M
5490
 
   % Undo catcode changes of \startcontents and \doprintindex
5491
 
   \catcode`\@=0 \catcode`\\=\other \escapechar=`\@
5492
 
   % Append \endinput to make sure that TeX does not see the ending newline.
5493
 
   \toks0={#1\endinput}%
5494
 
   \immediate\openout\macscribble=\jobname.tmp
5495
 
   \immediate\write\macscribble{\the\toks0}%
5496
 
   \immediate\closeout\macscribble
5497
 
   \let\xeatspaces\eatspaces
5498
 
   \input \jobname.tmp
5499
 
   \endgroup
5500
 
}
5501
 
\else
 
5472
  \newwrite\macscribble
 
5473
  \def\scantokens#1{%
 
5474
    \toks0={#1\endinput}%
 
5475
    \immediate\openout\macscribble=\jobname.tmp
 
5476
    \immediate\write\macscribble{\the\toks0}%
 
5477
    \immediate\closeout\macscribble
 
5478
    \input \jobname.tmp
 
5479
  }
 
5480
\fi
 
5481
 
5502
5482
\def\scanmacro#1{%
5503
 
\begingroup \newlinechar`\^^M
5504
 
% Undo catcode changes of \startcontents and \doprintindex
5505
 
\catcode`\@=0 \catcode`\\=\other \escapechar=`\@
5506
 
\let\xeatspaces\eatspaces\scantokens{#1\endinput}\endgroup}
5507
 
\fi
 
5483
  \begingroup
 
5484
    \newlinechar`\^^M
 
5485
    \let\xeatspaces\eatspaces
 
5486
    % Undo catcode changes of \startcontents and \doprintindex
 
5487
    \catcode`\@=0 \catcode`\\=\other \escapechar=`\@
 
5488
    % ... and \example
 
5489
    \spaceisspace
 
5490
    %
 
5491
    % Append \endinput to make sure that TeX does not see the ending newline.
 
5492
    %
 
5493
    % I've verified that it is necessary both for e-TeX and for ordinary TeX
 
5494
    %                                                   --kasal, 29nov03
 
5495
    \scantokens{#1\endinput}%
 
5496
  \endgroup
 
5497
}
5508
5498
 
5509
5499
\newcount\paramno   % Count of parameters
5510
5500
\newtoks\macname    % Macro name
5513
5503
                    % \do\macro1\do\macro2...
5514
5504
 
5515
5505
% Utility routines.
5516
 
% Thisdoes \let #1 = #2, except with \csnames.
 
5506
% This does \let #1 = #2, except with \csnames.
5517
5507
\def\cslet#1#2{%
5518
5508
\expandafter\expandafter
5519
5509
\expandafter\let
5610
5600
  \else \expandafter\parsemacbody
5611
5601
  \fi}
5612
5602
 
5613
 
\def\unmacro{\parsearg\dounmacro}
5614
 
\def\dounmacro#1{%
 
5603
\parseargdef\unmacro{%
5615
5604
  \if1\csname ismacro.#1\endcsname
5616
5605
    \global\cslet{#1}{macsave.#1}%
5617
5606
    \global\expandafter\let \csname ismacro.#1\endcsname=0%
5628
5617
 
5629
5618
% Called by \do from \dounmacro on each macro.  The idea is to omit any
5630
5619
% macro definitions that have been changed to \relax.
5631
 
 
5620
%
5632
5621
\def\unmacrodo#1{%
5633
5622
  \ifx#1\relax
5634
5623
    % remove this
5752
5741
    \expandafter\parsearg
5753
5742
  \fi \next}
5754
5743
 
5755
 
% We mant to disable all macros during \shipout so that they are not
 
5744
% We want to disable all macros during \shipout so that they are not
5756
5745
% expanded by \write.
5757
5746
\def\turnoffmacros{\begingroup \def\do##1{\let\noexpand##1=\relax}%
5758
5747
  \edef\next{\macrolist}\expandafter\endgroup\next}
5759
5748
 
 
5749
% For \indexnofonts, we need to get rid of all macros, leaving only the
 
5750
% arguments (if present).  Of course this is not nearly correct, but it
 
5751
% is the best we can do for now.  makeinfo does not expand macros in the
 
5752
% argument to @deffn, which ends up writing an index entry, and texindex
 
5753
% isn't prepared for an index sort entry that starts with \.
 
5754
 
5755
% Since macro invocations are followed by braces, we can just redefine them
 
5756
% to take a single TeX argument.  The case of a macro invocation that
 
5757
% goes to end-of-line is not handled.
 
5758
 
5759
\def\emptyusermacros{\begingroup
 
5760
  \def\do##1{\let\noexpand##1=\noexpand\asis}%
 
5761
  \edef\next{\macrolist}\expandafter\endgroup\next}
 
5762
 
5760
5763
 
5761
5764
% @alias.
5762
5765
% We need some trickery to remove the optional spaces around the equal
5763
5766
% sign.  Just make them active and then expand them all to nothing.
5764
 
\def\alias{\begingroup\obeyspaces\parsearg\aliasxxx}
 
5767
\def\alias{\parseargusing\obeyspaces\aliasxxx}
5765
5768
\def\aliasxxx #1{\aliasyyy#1\relax}
5766
 
\def\aliasyyy #1=#2\relax{\ignoreactivespaces
5767
 
\edef\next{\global\let\expandafter\noexpand\csname#1\endcsname=%
5768
 
           \expandafter\noexpand\csname#2\endcsname}%
5769
 
\expandafter\endgroup\next}
 
5769
\def\aliasyyy #1=#2\relax{%
 
5770
  {%
 
5771
    \expandafter\let\obeyedspace=\empty
 
5772
    \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}%
 
5773
  }%
 
5774
  \next
 
5775
}
5770
5776
 
5771
5777
 
5772
5778
\message{cross references,}
5773
 
% @xref etc.
5774
5779
 
5775
5780
\newwrite\auxfile
5776
5781
 
5782
5787
\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
5783
5788
  node \samp{\ignorespaces#1{}}}
5784
5789
 
5785
 
% @node's job is to define \lastnode.
5786
 
\def\node{\ENVcheck\parsearg\nodezzz}
5787
 
\def\nodezzz#1{\nodexxx [#1,]}
5788
 
\def\nodexxx[#1,#2]{\gdef\lastnode{#1}}
 
5790
% @node's only job in TeX is to define \lastnode, which is used in
 
5791
% cross-references.  The @node line might or might not have commas, and
 
5792
% might or might not have spaces before the first comma, like:
 
5793
% @node foo , bar , ...
 
5794
% We don't want such trailing spaces in the node name.
 
5795
%
 
5796
\parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse}
 
5797
%
 
5798
% also remove a trailing comma, in case of something like this:
 
5799
% @node Help-Cross,  ,  , Cross-refs
 
5800
\def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse}
 
5801
\def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}}
 
5802
 
5789
5803
\let\nwnode=\node
5790
 
\let\lastnode=\relax
5791
 
 
5792
 
% The sectioning commands (@chapter, etc.) call these.
5793
 
\def\donoderef{%
5794
 
  \ifx\lastnode\relax\else
5795
 
    \expandafter\expandafter\expandafter\setref{\lastnode}%
5796
 
      {Ysectionnumberandtype}%
5797
 
    \global\let\lastnode=\relax
5798
 
  \fi
5799
 
}
5800
 
\def\unnumbnoderef{%
5801
 
  \ifx\lastnode\relax\else
5802
 
    \expandafter\expandafter\expandafter\setref{\lastnode}{Ynothing}%
5803
 
    \global\let\lastnode=\relax
5804
 
  \fi
5805
 
}
5806
 
\def\appendixnoderef{%
5807
 
  \ifx\lastnode\relax\else
5808
 
    \expandafter\expandafter\expandafter\setref{\lastnode}%
5809
 
      {Yappendixletterandtype}%
5810
 
    \global\let\lastnode=\relax
5811
 
  \fi
5812
 
}
5813
 
 
 
5804
\let\lastnode=\empty
 
5805
 
 
5806
% Write a cross-reference definition for the current node.  #1 is the
 
5807
% type (Ynumbered, Yappendix, Ynothing).
 
5808
%
 
5809
\def\donoderef#1{%
 
5810
  \ifx\lastnode\empty\else
 
5811
    \setref{\lastnode}{#1}%
 
5812
    \global\let\lastnode=\empty
 
5813
  \fi
 
5814
}
5814
5815
 
5815
5816
% @anchor{NAME} -- define xref target at arbitrary point.
5816
5817
%
5817
5818
\newcount\savesfregister
5818
 
\gdef\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
5819
 
\gdef\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
5820
 
\gdef\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}
 
5819
%
 
5820
\def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
 
5821
\def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
 
5822
\def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}
5821
5823
 
5822
5824
% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an
5823
 
% anchor), namely NAME-title (the corresponding @chapter/etc. name),
5824
 
% NAME-pg (the page number), and NAME-snt (section number and type).
5825
 
% Called from \foonoderef.
5826
 
5827
 
% We have to set \indexdummies so commands such as @code in a section
5828
 
% title aren't expanded.  It would be nicer not to expand the titles in
5829
 
% the first place, but there's so many layers that that is hard to do.
5830
 
%
5831
 
% Likewise, use \turnoffactive so that punctuation chars such as underscore
5832
 
% and backslash work in node names.
5833
 
5834
 
\def\setref#1#2{{%
5835
 
  \atdummies
 
5825
% anchor), which consists of three parts:
 
5826
% 1) NAME-title - the current sectioning name taken from \thissection,
 
5827
%                 or the anchor name.
 
5828
% 2) NAME-snt   - section number and type, passed as the SNT arg, or
 
5829
%                 empty for anchors.
 
5830
% 3) NAME-pg    - the page number.
 
5831
%
 
5832
% This is called from \donoderef, \anchor, and \dofloat.  In the case of
 
5833
% floats, there is an additional part, which is not written here:
 
5834
% 4) NAME-lof   - the text as it should appear in a @listoffloats.
 
5835
%
 
5836
\def\setref#1#2{%
5836
5837
  \pdfmkdest{#1}%
5837
 
  %
5838
 
  \turnoffactive
5839
 
  \dosetq{#1-title}{Ytitle}%
5840
 
  \dosetq{#1-pg}{Ypagenumber}%
5841
 
  \dosetq{#1-snt}{#2}%
5842
 
}}
 
5838
  \iflinks
 
5839
    {%
 
5840
      \atdummies  % preserve commands, but don't expand them
 
5841
      \turnoffactive
 
5842
      \otherbackslash
 
5843
      \edef\writexrdef##1##2{%
 
5844
        \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef
 
5845
          ##1}{##2}}% these are parameters of \writexrdef
 
5846
      }%
 
5847
      \toks0 = \expandafter{\thissection}%
 
5848
      \immediate \writexrdef{title}{\the\toks0 }%
 
5849
      \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc.
 
5850
      \writexrdef{pg}{\folio}% will be written later, during \shipout
 
5851
    }%
 
5852
  \fi
 
5853
}
5843
5854
 
5844
5855
% @xref, @pxref, and @ref generate cross-references.  For \xrefX, #1 is
5845
5856
% the node name, #2 the name of the Info cross-reference, #3 the printed
5852
5863
\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
5853
5864
  \unsepspaces
5854
5865
  \def\printedmanual{\ignorespaces #5}%
5855
 
  \def\printednodename{\ignorespaces #3}%
5856
 
  \setbox1=\hbox{\printedmanual}%
5857
 
  \setbox0=\hbox{\printednodename}%
 
5866
  \def\printedrefname{\ignorespaces #3}%
 
5867
  \setbox1=\hbox{\printedmanual\unskip}%
 
5868
  \setbox0=\hbox{\printedrefname\unskip}%
5858
5869
  \ifdim \wd0 = 0pt
5859
5870
    % No printed node name was explicitly given.
5860
5871
    \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax
5861
5872
      % Use the node name inside the square brackets.
5862
 
      \def\printednodename{\ignorespaces #1}%
 
5873
      \def\printedrefname{\ignorespaces #1}%
5863
5874
    \else
5864
5875
      % Use the actual chapter/section title appear inside
5865
5876
      % the square brackets.  Use the real section title if we have it.
5866
5877
      \ifdim \wd1 > 0pt
5867
5878
        % It is in another manual, so we don't have it.
5868
 
        \def\printednodename{\ignorespaces #1}%
 
5879
        \def\printedrefname{\ignorespaces #1}%
5869
5880
      \else
5870
5881
        \ifhavexrefs
5871
5882
          % We know the real title if we have the xref values.
5872
 
          \def\printednodename{\refx{#1-title}{}}%
 
5883
          \def\printedrefname{\refx{#1-title}{}}%
5873
5884
        \else
5874
5885
          % Otherwise just copy the Info node name.
5875
 
          \def\printednodename{\ignorespaces #1}%
 
5886
          \def\printedrefname{\ignorespaces #1}%
5876
5887
        \fi%
5877
5888
      \fi
5878
5889
    \fi
5879
5890
  \fi
5880
5891
  %
5881
 
  % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not
5882
 
  % insert empty discretionaries after hyphens, which means that it will
5883
 
  % not find a line break at a hyphen in a node names.  Since some manuals
5884
 
  % are best written with fairly long node names, containing hyphens, this
5885
 
  % is a loss.  Therefore, we give the text of the node name again, so it
5886
 
  % is as if TeX is seeing it for the first time.
 
5892
  % Make link in pdf output.
5887
5893
  \ifpdf
5888
5894
    \leavevmode
5889
5895
    \getfilename{#4}%
5893
5899
         goto file{\the\filename.pdf} name{#1}%
5894
5900
     \else
5895
5901
       \startlink attr{/Border [0 0 0]}%
5896
 
         goto name{#1}%
 
5902
         goto name{\pdfmkpgn{#1}}%
5897
5903
     \fi
5898
5904
    }%
5899
5905
    \linkcolor
5900
5906
  \fi
5901
5907
  %
5902
 
  \ifdim \wd1 > 0pt
5903
 
    \putwordsection{} ``\printednodename'' \putwordin{} \cite{\printedmanual}%
 
5908
  % Float references are printed completely differently: "Figure 1.2"
 
5909
  % instead of "[somenode], p.3".  We distinguish them by the
 
5910
  % LABEL-title being set to a magic string.
 
5911
  {%
 
5912
    % Have to otherify everything special to allow the \csname to
 
5913
    % include an _ in the xref name, etc.
 
5914
    \indexnofonts
 
5915
    \turnoffactive
 
5916
    \otherbackslash
 
5917
    \expandafter\global\expandafter\let\expandafter\Xthisreftitle
 
5918
      \csname XR#1-title\endcsname
 
5919
  }%
 
5920
  \iffloat\Xthisreftitle
 
5921
    % If the user specified the print name (third arg) to the ref,
 
5922
    % print it instead of our usual "Figure 1.2".
 
5923
    \ifdim\wd0 = 0pt
 
5924
      \refx{#1-snt}%
 
5925
    \else
 
5926
      \printedrefname
 
5927
    \fi
 
5928
    %
 
5929
    % if the user also gave the printed manual name (fifth arg), append
 
5930
    % "in MANUALNAME".
 
5931
    \ifdim \wd1 > 0pt
 
5932
      \space \putwordin{} \cite{\printedmanual}%
 
5933
    \fi
5904
5934
  \else
5905
 
    % _ (for example) has to be the character _ for the purposes of the
5906
 
    % control sequence corresponding to the node, but it has to expand
5907
 
    % into the usual \leavevmode...\vrule stuff for purposes of
5908
 
    % printing. So we \turnoffactive for the \refx-snt, back on for the
5909
 
    % printing, back off for the \refx-pg.
5910
 
    {\turnoffactive \otherbackslash
5911
 
     % Only output a following space if the -snt ref is nonempty; for
5912
 
     % @unnumbered and @anchor, it won't be.
5913
 
     \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
5914
 
     \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
5915
 
    }%
5916
 
    % [mynode],
5917
 
    [\printednodename],\space
5918
 
    % page 3
5919
 
    \turnoffactive \otherbackslash \putwordpage\tie\refx{#1-pg}{}%
 
5935
    % node/anchor (non-float) references.
 
5936
    %
 
5937
    % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not
 
5938
    % insert empty discretionaries after hyphens, which means that it will
 
5939
    % not find a line break at a hyphen in a node names.  Since some manuals
 
5940
    % are best written with fairly long node names, containing hyphens, this
 
5941
    % is a loss.  Therefore, we give the text of the node name again, so it
 
5942
    % is as if TeX is seeing it for the first time.
 
5943
    \ifdim \wd1 > 0pt
 
5944
      \putwordsection{} ``\printedrefname'' \putwordin{} \cite{\printedmanual}%
 
5945
    \else
 
5946
      % _ (for example) has to be the character _ for the purposes of the
 
5947
      % control sequence corresponding to the node, but it has to expand
 
5948
      % into the usual \leavevmode...\vrule stuff for purposes of
 
5949
      % printing. So we \turnoffactive for the \refx-snt, back on for the
 
5950
      % printing, back off for the \refx-pg.
 
5951
      {\turnoffactive \otherbackslash
 
5952
       % Only output a following space if the -snt ref is nonempty; for
 
5953
       % @unnumbered and @anchor, it won't be.
 
5954
       \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
 
5955
       \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
 
5956
      }%
 
5957
      % output the `[mynode]' via a macro so it can be overridden.
 
5958
      \xrefprintnodename\printedrefname
 
5959
      %
 
5960
      % But we always want a comma and a space:
 
5961
      ,\space
 
5962
      %
 
5963
      % output the `page 3'.
 
5964
      \turnoffactive \otherbackslash \putwordpage\tie\refx{#1-pg}{}%
 
5965
    \fi
5920
5966
  \fi
5921
5967
  \endlink
5922
5968
\endgroup}
5923
5969
 
5924
 
% \dosetq is called from \setref to do the actual \write (\iflinks).
5925
 
%
5926
 
\def\dosetq#1#2{%
5927
 
  {\let\folio=0%
5928
 
   \edef\next{\write\auxfile{\internalsetq{#1}{#2}}}%
5929
 
   \iflinks \next \fi
5930
 
  }%
5931
 
}
5932
 
 
5933
 
% \internalsetq{foo}{page} expands into
5934
 
%   CHARACTERS @xrdef{foo}{...expansion of \page...}
5935
 
\def\internalsetq#1#2{@xrdef{#1}{\csname #2\endcsname}}
5936
 
 
5937
 
% Things to be expanded by \internalsetq.
5938
 
5939
 
\def\Ypagenumber{\folio}
5940
 
\def\Ytitle{\thissection}
 
5970
% This macro is called from \xrefX for the `[nodename]' part of xref
 
5971
% output.  It's a separate macro only so it can be changed more easily,
 
5972
% since square brackets don't work well in some documents.  Particularly
 
5973
% one that Bob is working on :).
 
5974
%
 
5975
\def\xrefprintnodename#1{[#1]}
 
5976
 
 
5977
% Things referred to by \setref.
 
5978
%
5941
5979
\def\Ynothing{}
5942
 
\def\Ysectionnumberandtype{%
 
5980
\def\Yomitfromtoc{}
 
5981
\def\Ynumbered{%
5943
5982
  \ifnum\secno=0
5944
5983
    \putwordChapter@tie \the\chapno
5945
5984
  \else \ifnum\subsecno=0
5950
5989
    \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno
5951
5990
  \fi\fi\fi
5952
5991
}
5953
 
 
5954
 
\def\Yappendixletterandtype{%
 
5992
\def\Yappendix{%
5955
5993
  \ifnum\secno=0
5956
5994
     \putwordAppendix@tie @char\the\appendixno{}%
5957
5995
  \else \ifnum\subsecno=0
5964
6002
  \fi\fi\fi
5965
6003
}
5966
6004
 
5967
 
% Use TeX 3.0's \inputlineno to get the line number, for better error
5968
 
% messages, but if we're using an old version of TeX, don't do anything.
5969
 
%
5970
 
\ifx\inputlineno\thisisundefined
5971
 
  \let\linenumber = \empty % Pre-3.0.
5972
 
\else
5973
 
  \def\linenumber{\the\inputlineno:\space}
5974
 
\fi
5975
 
 
5976
6005
% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME.
5977
6006
% If its value is nonempty, SUFFIX is output afterward.
5978
6007
%
5981
6010
    \indexnofonts
5982
6011
    \otherbackslash
5983
6012
    \expandafter\global\expandafter\let\expandafter\thisrefX
5984
 
      \csname X#1\endcsname
 
6013
      \csname XR#1\endcsname
5985
6014
  }%
5986
6015
  \ifx\thisrefX\relax
5987
6016
    % If not defined, say something at least.
6003
6032
  #2% Output the suffix in any case.
6004
6033
}
6005
6034
 
6006
 
% This is the macro invoked by entries in the aux file.
 
6035
% This is the macro invoked by entries in the aux file.  Usually it's
 
6036
% just a \def (we prepend XR to the control sequence name to avoid
 
6037
% collisions).  But if this is a float type, we have more work to do.
6007
6038
%
6008
 
\def\xrdef#1{\expandafter\gdef\csname X#1\endcsname}
 
6039
\def\xrdef#1#2{%
 
6040
  \expandafter\gdef\csname XR#1\endcsname{#2}% remember this xref value.
 
6041
  %
 
6042
  % Was that xref control sequence that we just defined for a float?
 
6043
  \expandafter\iffloat\csname XR#1\endcsname
 
6044
    % it was a float, and we have the (safe) float type in \iffloattype.
 
6045
    \expandafter\let\expandafter\floatlist
 
6046
      \csname floatlist\iffloattype\endcsname
 
6047
    %
 
6048
    % Is this the first time we've seen this float type?
 
6049
    \expandafter\ifx\floatlist\relax
 
6050
      \toks0 = {\do}% yes, so just \do
 
6051
    \else
 
6052
      % had it before, so preserve previous elements in list.
 
6053
      \toks0 = \expandafter{\floatlist\do}%
 
6054
    \fi
 
6055
    %
 
6056
    % Remember this xref in the control sequence \floatlistFLOATTYPE,
 
6057
    % for later use in \listoffloats.
 
6058
    \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0{#1}}%
 
6059
  \fi
 
6060
}
6009
6061
 
6010
6062
% Read the last existing aux file, if any.  No error if none exists.
 
6063
%
 
6064
\def\tryauxfile{%
 
6065
  \openin 1 \jobname.aux
 
6066
  \ifeof 1 \else
 
6067
    \readauxfile
 
6068
    \global\havexrefstrue
 
6069
  \fi
 
6070
  \closein 1
 
6071
}
 
6072
 
6011
6073
\def\readauxfile{\begingroup
6012
6074
  \catcode`\^^@=\other
6013
6075
  \catcode`\^^A=\other
6066
6128
  \catcode`\%=\other
6067
6129
  \catcode`+=\other % avoid \+ for paranoia even though we've turned it off
6068
6130
  %
6069
 
  % Make the characters 128-255 be printing characters
 
6131
  % This is to support \ in node names and titles, since the \
 
6132
  % characters end up in a \csname.  It's easier than
 
6133
  % leaving it active and making its active definition an actual \
 
6134
  % character.  What I don't understand is why it works in the *value*
 
6135
  % of the xrdef.  Seems like it should be a catcode12 \, and that
 
6136
  % should not typeset properly.  But it works, so I'm moving on for
 
6137
  % now.  --karl, 15jan04.
 
6138
  \catcode`\\=\other
 
6139
  %
 
6140
  % Make the characters 128-255 be printing characters.
6070
6141
  {%
6071
6142
    \count 1=128
6072
6143
    \def\loop{%
6076
6147
    }%
6077
6148
  }%
6078
6149
  %
6079
 
  % Turn off \ as an escape so we do not lose on
6080
 
  % entries which were dumped with control sequences in their names.
6081
 
  % For example, @xrdef{$\leq $-fun}{page ...} made by @defun ^^
6082
 
  % Reference to such entries still does not work the way one would wish,
6083
 
  % but at least they do not bomb out when the aux file is read in.
6084
 
  \catcode`\\=\other
6085
 
  %
6086
 
  % @ is our escape character in .aux files.
 
6150
  % @ is our escape character in .aux files, and we need braces.
6087
6151
  \catcode`\{=1
6088
6152
  \catcode`\}=2
6089
6153
  \catcode`\@=0
6090
6154
  %
6091
 
  \openin 1 \jobname.aux
6092
 
  \ifeof 1 \else
6093
 
    \closein 1
6094
 
    \input \jobname.aux
6095
 
    \global\havexrefstrue
6096
 
    \global\warnedobstrue
6097
 
  \fi
6098
 
  % Open the new aux file.  TeX will close it automatically at exit.
6099
 
  \openout\auxfile=\jobname.aux
 
6155
  \input \jobname.aux
6100
6156
\endgroup}
6101
6157
 
6102
6158
 
6103
 
% Footnotes.
 
6159
\message{insertions,}
 
6160
% including footnotes.
6104
6161
 
6105
6162
\newcount \footnoteno
6106
6163
 
6114
6171
% @footnotestyle is meaningful for info output only.
6115
6172
\let\footnotestyle=\comment
6116
6173
 
6117
 
\let\ptexfootnote=\footnote
6118
 
 
6119
6174
{\catcode `\@=11
6120
6175
%
6121
6176
% Auto-number footnotes.  Otherwise like plain.
6122
6177
\gdef\footnote{%
 
6178
  \let\indent=\ptexindent
 
6179
  \let\noindent=\ptexnoindent
6123
6180
  \global\advance\footnoteno by \@ne
6124
6181
  \edef\thisfootno{$^{\the\footnoteno}$}%
6125
6182
  %
6126
6183
  % In case the footnote comes at the end of a sentence, preserve the
6127
6184
  % extra spacing after we do the footnote number.
6128
6185
  \let\@sf\empty
6129
 
  \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi
 
6186
  \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi
6130
6187
  %
6131
6188
  % Remove inadvertent blank space before typesetting the footnote number.
6132
6189
  \unskip
6137
6194
% Don't bother with the trickery in plain.tex to not require the
6138
6195
% footnote text as a parameter.  Our footnotes don't need to be so general.
6139
6196
%
6140
 
% Oh yes, they do; otherwise, @ifset and anything else that uses
6141
 
% \parseargline fail inside footnotes because the tokens are fixed when
 
6197
% Oh yes, they do; otherwise, @ifset (and anything else that uses
 
6198
% \parseargline) fails inside footnotes because the tokens are fixed when
6142
6199
% the footnote is read.  --karl, 16nov96.
6143
6200
%
6144
 
% The start of the footnote looks usually like this:
6145
 
\gdef\startfootins{\insert\footins\bgroup}
6146
 
%
6147
 
% ... but this macro is redefined inside @multitable.
6148
 
%
6149
6201
\gdef\dofootnote{%
6150
 
  \startfootins
 
6202
  \insert\footins\bgroup
6151
6203
  % We want to typeset this text as a normal paragraph, even if the
6152
6204
  % footnote reference occurs in (for example) a display environment.
6153
6205
  % So reset some parameters.
6183
6235
}
6184
6236
}%end \catcode `\@=11
6185
6237
 
6186
 
% @| inserts a changebar to the left of the current line.  It should
6187
 
% surround any changed text.  This approach does *not* work if the
6188
 
% change spans more than two lines of output.  To handle that, we would
6189
 
% have adopt a much more difficult approach (putting marks into the main
6190
 
% vertical list for the beginning and end of each change).
6191
 
%
6192
 
\def\|{%
6193
 
  % \vadjust can only be used in horizontal mode.
6194
 
  \leavevmode
6195
 
  %
6196
 
  % Append this vertical mode material after the current line in the output.
6197
 
  \vadjust{%
6198
 
    % We want to insert a rule with the height and depth of the current
6199
 
    % leading; that is exactly what \strutbox is supposed to record.
6200
 
    \vskip-\baselineskip
6201
 
    %
6202
 
    % \vadjust-items are inserted at the left edge of the type.  So
6203
 
    % the \llap here moves out into the left-hand margin.
6204
 
    \llap{%
6205
 
      %
6206
 
      % For a thicker or thinner bar, change the `1pt'.
6207
 
      \vrule height\baselineskip width1pt
6208
 
      %
6209
 
      % This is the space between the bar and the text.
6210
 
      \hskip 12pt
6211
 
    }%
6212
 
  }%
6213
 
}
6214
 
 
6215
 
% For a final copy, take out the rectangles
6216
 
% that mark overfull boxes (in case you have decided
6217
 
% that the text looks ok even though it passes the margin).
6218
 
%
6219
 
\def\finalout{\overfullrule=0pt}
 
6238
% In case a @footnote appears in a vbox, save the footnote text and create
 
6239
% the real \insert just after the vbox finished.  Otherwise, the insertion
 
6240
% would be lost.
 
6241
% Similarily, if a @footnote appears inside an alignment, save the footnote
 
6242
% text to a box and make the \insert when a row of the table is finished.
 
6243
% And the same can be done for other insert classes.  --kasal, 16nov03.
 
6244
 
 
6245
% Replace the \insert primitive by a cheating macro.
 
6246
% Deeper inside, just make sure that the saved insertions are not spilled
 
6247
% out prematurely.
 
6248
%
 
6249
\def\startsavinginserts{%
 
6250
  \ifx \insert\ptexinsert
 
6251
    \let\insert\saveinsert
 
6252
  \else
 
6253
    \let\checkinserts\relax
 
6254
  \fi
 
6255
}
 
6256
 
 
6257
% This \insert replacement works for both \insert\footins{foo} and
 
6258
% \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}.
 
6259
%
 
6260
\def\saveinsert#1{%
 
6261
  \edef\next{\noexpand\savetobox \makeSAVEname#1}%
 
6262
  \afterassignment\next
 
6263
  % swallow the left brace
 
6264
  \let\temp =
 
6265
}
 
6266
\def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}}
 
6267
\def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1}
 
6268
 
 
6269
\def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi}
 
6270
 
 
6271
\def\placesaveins#1{%
 
6272
  \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname
 
6273
    {\box#1}%
 
6274
}
 
6275
 
 
6276
% eat @SAVE -- beware, all of them have catcode \other:
 
6277
{
 
6278
  \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials  %  ;-)
 
6279
  \gdef\gobblesave @SAVE{}
 
6280
}
 
6281
 
 
6282
% initialization:
 
6283
\def\newsaveins #1{%
 
6284
  \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}%
 
6285
  \next
 
6286
}
 
6287
\def\newsaveinsX #1{%
 
6288
  \csname newbox\endcsname #1%
 
6289
  \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts
 
6290
    \checksaveins #1}%
 
6291
}
 
6292
 
 
6293
% initialize:
 
6294
\let\checkinserts\empty
 
6295
\newsaveins\footins
 
6296
\newsaveins\margin
 
6297
 
6220
6298
 
6221
6299
% @image.  We use the macros from epsf.tex to support this.
6222
6300
% If epsf.tex is not installed and @image is used, we complain.
6226
6304
% undone and the next image would fail.
6227
6305
\openin 1 = epsf.tex
6228
6306
\ifeof 1 \else
6229
 
  \closein 1
6230
6307
  % Do not bother showing banner with epsf.tex v2.7k (available in
6231
6308
  % doc/epsf.tex and on ctan).
6232
6309
  \def\epsfannounce{\toks0 = }%
6233
6310
  \input epsf.tex
6234
6311
\fi
 
6312
\closein 1
6235
6313
%
6236
6314
% We will only complain once about lack of epsf.tex.
6237
6315
\newif\ifwarnednoepsf
6267
6345
    \nobreak\bigskip
6268
6346
    % Usually we'll have text after the image which will insert
6269
6347
    % \parskip glue, so insert it here too to equalize the space
6270
 
    % above and below. 
 
6348
    % above and below.
6271
6349
    \nobreak\vskip\parskip
6272
6350
    \nobreak
6273
6351
    \line\bgroup\hss
6287
6365
\endgroup}
6288
6366
 
6289
6367
 
 
6368
% @float FLOATTYPE,LOC ... @end float for displayed figures, tables, etc.
 
6369
% We don't actually implement floating yet, we just plop the float "here".
 
6370
% But it seemed the best name for the future.
 
6371
%
 
6372
\envparseargdef\float{\dofloat #1,,,\finish}
 
6373
 
 
6374
% #1 is the optional FLOATTYPE, the text label for this float, typically
 
6375
% "Figure", "Table", "Example", etc.  Can't contain commas.  If omitted,
 
6376
% this float will not be numbered and cannot be referred to.
 
6377
%
 
6378
% #2 is the optional xref label.  Also must be present for the float to
 
6379
% be referable.
 
6380
%
 
6381
% #3 is the optional positioning argument; for now, it is ignored.  It
 
6382
% will somehow specify the positions allowed to float to (here, top, bottom).
 
6383
%
 
6384
% We keep a separate counter for each FLOATTYPE, which we reset at each
 
6385
% chapter-level command.
 
6386
\let\resetallfloatnos=\empty
 
6387
%
 
6388
\def\dofloat#1,#2,#3,#4\finish{%
 
6389
  \let\thiscaption=\empty
 
6390
  \let\thisshortcaption=\empty
 
6391
  %
 
6392
  % don't lose footnotes inside @float.
 
6393
  \startsavinginserts
 
6394
  %
 
6395
  % We can't be used inside a paragraph.
 
6396
  \par
 
6397
  %
 
6398
  \vtop\bgroup
 
6399
    \def\floattype{#1}%
 
6400
    \def\floatlabel{#2}%
 
6401
    \def\floatloc{#3}% we do nothing with this yet.
 
6402
    %
 
6403
    \ifx\floattype\empty
 
6404
      \let\safefloattype=\empty
 
6405
    \else
 
6406
      {%
 
6407
        % the floattype might have accents or other special characters,
 
6408
        % but we need to use it in a control sequence name.
 
6409
        \indexnofonts
 
6410
        \turnoffactive
 
6411
        \xdef\safefloattype{\floattype}%
 
6412
      }%
 
6413
    \fi
 
6414
    %
 
6415
    % If label is given but no type, we handle that as the empty type.
 
6416
    \ifx\floatlabel\empty \else
 
6417
      % We want each FLOATTYPE to be numbered separately (Figure 1,
 
6418
      % Table 1, Figure 2, ...).  (And if no label, no number.)
 
6419
      %
 
6420
      \expandafter\getfloatno\csname\safefloattype floatno\endcsname
 
6421
      \global\advance\floatno by 1
 
6422
      %
 
6423
      {%
 
6424
        % This magic value for \thissection is output by \setref as the
 
6425
        % XREFLABEL-title value.  \xrefX uses it to distinguish float
 
6426
        % labels (which have a completely different output format) from
 
6427
        % node and anchor labels.  And \xrdef uses it to construct the
 
6428
        % lists of floats.
 
6429
        %
 
6430
        \edef\thissection{\floatmagic=\safefloattype}%
 
6431
        \setref{\floatlabel}{Yfloat}%
 
6432
      }%
 
6433
    \fi
 
6434
    %
 
6435
    % start with \parskip glue, I guess.
 
6436
    \vskip\parskip
 
6437
    %
 
6438
    % Don't suppress indentation if a float happens to start a section.
 
6439
    \restorefirstparagraphindent
 
6440
}
 
6441
 
 
6442
% we have these possibilities:
 
6443
% @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap
 
6444
% @float Foo,lbl & no caption:    Foo 1.1
 
6445
% @float Foo & @caption{Cap}:     Foo: Cap
 
6446
% @float Foo & no caption:        Foo
 
6447
% @float ,lbl & Caption{Cap}:     1.1: Cap
 
6448
% @float ,lbl & no caption:       1.1
 
6449
% @float & @caption{Cap}:         Cap
 
6450
% @float & no caption:
 
6451
%
 
6452
\def\Efloat{%
 
6453
    \let\floatident = \empty
 
6454
    %
 
6455
    % In all cases, if we have a float type, it comes first.
 
6456
    \ifx\floattype\empty \else \def\floatident{\floattype}\fi
 
6457
    %
 
6458
    % If we have an xref label, the number comes next.
 
6459
    \ifx\floatlabel\empty \else
 
6460
      \ifx\floattype\empty \else % if also had float type, need tie first.
 
6461
        \appendtomacro\floatident{\tie}%
 
6462
      \fi
 
6463
      % the number.
 
6464
      \appendtomacro\floatident{\chaplevelprefix\the\floatno}%
 
6465
    \fi
 
6466
    %
 
6467
    % Start the printed caption with what we've constructed in
 
6468
    % \floatident, but keep it separate; we need \floatident again.
 
6469
    \let\captionline = \floatident
 
6470
    %
 
6471
    \ifx\thiscaption\empty \else
 
6472
      \ifx\floatident\empty \else
 
6473
        \appendtomacro\captionline{: }% had ident, so need a colon between
 
6474
      \fi
 
6475
      %
 
6476
      % caption text.
 
6477
      \appendtomacro\captionline\thiscaption
 
6478
    \fi
 
6479
    %
 
6480
    % If we have anything to print, print it, with space before.
 
6481
    % Eventually this needs to become an \insert.
 
6482
    \ifx\captionline\empty \else
 
6483
      \vskip.5\parskip
 
6484
      \captionline
 
6485
    \fi
 
6486
    %
 
6487
    % If have an xref label, write the list of floats info.  Do this
 
6488
    % after the caption, to avoid chance of it being a breakpoint.
 
6489
    \ifx\floatlabel\empty \else
 
6490
      % Write the text that goes in the lof to the aux file as
 
6491
      % \floatlabel-lof.  Besides \floatident, we include the short
 
6492
      % caption if specified, else the full caption if specified, else nothing.
 
6493
      {%
 
6494
        \atdummies \turnoffactive \otherbackslash
 
6495
        \immediate\write\auxfile{@xrdef{\floatlabel-lof}{%
 
6496
          \floatident
 
6497
          \ifx\thisshortcaption\empty
 
6498
            \ifx\thiscaption\empty \else : \thiscaption \fi
 
6499
          \else
 
6500
            : \thisshortcaption
 
6501
          \fi
 
6502
        }}%
 
6503
      }%
 
6504
    \fi
 
6505
    %
 
6506
    % Space below caption, if we printed anything.
 
6507
    \ifx\printedsomething\empty \else \vskip\parskip \fi
 
6508
  \egroup  % end of \vtop
 
6509
  \checkinserts
 
6510
}
 
6511
 
 
6512
% Append the tokens #2 to the definition of macro #1, not expanding either.
 
6513
%
 
6514
\newtoks\appendtomacroAtoks
 
6515
\newtoks\appendtomacroBtoks
 
6516
\def\appendtomacro#1#2{%
 
6517
  \appendtomacroAtoks = \expandafter{#1}%
 
6518
  \appendtomacroBtoks = {#2}%
 
6519
  \edef#1{\the\appendtomacroAtoks \the\appendtomacroBtoks}%
 
6520
}
 
6521
 
 
6522
% @caption, @shortcaption are easy.
 
6523
%
 
6524
\long\def\caption#1{\checkenv\float \def\thiscaption{#1}}
 
6525
\def\shortcaption#1{\checkenv\float \def\thisshortcaption{#1}}
 
6526
 
 
6527
% The parameter is the control sequence identifying the counter we are
 
6528
% going to use.  Create it if it doesn't exist and assign it to \floatno.
 
6529
\def\getfloatno#1{%
 
6530
  \ifx#1\relax
 
6531
      % Haven't seen this figure type before.
 
6532
      \csname newcount\endcsname #1%
 
6533
      %
 
6534
      % Remember to reset this floatno at the next chap.
 
6535
      \expandafter\gdef\expandafter\resetallfloatnos
 
6536
        \expandafter{\resetallfloatnos #1=0 }%
 
6537
  \fi
 
6538
  \let\floatno#1%
 
6539
}
 
6540
 
 
6541
% \setref calls this to get the XREFLABEL-snt value.  We want an @xref
 
6542
% to the FLOATLABEL to expand to "Figure 3.1".  We call \setref when we
 
6543
% first read the @float command.
 
6544
%
 
6545
\def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}%
 
6546
 
 
6547
% Magic string used for the XREFLABEL-title value, so \xrefX can
 
6548
% distinguish floats from other xref types.
 
6549
\def\floatmagic{!!float!!}
 
6550
 
 
6551
% #1 is the control sequence we are passed; we expand into a conditional
 
6552
% which is true if #1 represents a float ref.  That is, the magic
 
6553
% \thissection value which we \setref above.
 
6554
%
 
6555
\def\iffloat#1{\expandafter\doiffloat#1==\finish}
 
6556
%
 
6557
% #1 is (maybe) the \floatmagic string.  If so, #2 will be the
 
6558
% (safe) float type for this float.  We set \iffloattype to #2.
 
6559
%
 
6560
\def\doiffloat#1=#2=#3\finish{%
 
6561
  \def\temp{#1}%
 
6562
  \def\iffloattype{#2}%
 
6563
  \ifx\temp\floatmagic
 
6564
}
 
6565
 
 
6566
% @listoffloats FLOATTYPE - print a list of floats like a table of contents.
 
6567
%
 
6568
\parseargdef\listoffloats{%
 
6569
  \def\floattype{#1}% floattype
 
6570
  {%
 
6571
    % the floattype might have accents or other special characters,
 
6572
    % but we need to use it in a control sequence name.
 
6573
    \indexnofonts
 
6574
    \turnoffactive
 
6575
    \xdef\safefloattype{\floattype}%
 
6576
  }%
 
6577
  %
 
6578
  % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE.
 
6579
  \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax
 
6580
    \ifhavexrefs
 
6581
      % if the user said @listoffloats foo but never @float foo.
 
6582
      \message{\linenumber No `\safefloattype' floats to list.}%
 
6583
    \fi
 
6584
  \else
 
6585
    \begingroup
 
6586
      \leftskip=\tocindent  % indent these entries like a toc
 
6587
      \let\do=\listoffloatsdo
 
6588
      \csname floatlist\safefloattype\endcsname
 
6589
    \endgroup
 
6590
  \fi
 
6591
}
 
6592
 
 
6593
% This is called on each entry in a list of floats.  We're passed the
 
6594
% xref label, in the form LABEL-title, which is how we save it in the
 
6595
% aux file.  We strip off the -title and look up \XRLABEL-lof, which
 
6596
% has the text we're supposed to typeset here.
 
6597
%
 
6598
% Figures without xref labels will not be included in the list (since
 
6599
% they won't appear in the aux file).
 
6600
%
 
6601
\def\listoffloatsdo#1{\listoffloatsdoentry#1\finish}
 
6602
\def\listoffloatsdoentry#1-title\finish{{%
 
6603
  % Can't fully expand XR#1-lof because it can contain anything.  Just
 
6604
  % pass the control sequence.  On the other hand, XR#1-pg is just the
 
6605
  % page number, and we want to fully expand that so we can get a link
 
6606
  % in pdf output.
 
6607
  \toksA = \expandafter{\csname XR#1-lof\endcsname}%
 
6608
  %
 
6609
  % use the same \entry macro we use to generate the TOC and index.
 
6610
  \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}%
 
6611
  \writeentry
 
6612
}}
 
6613
 
6290
6614
\message{localization,}
6291
6615
% and i18n.
6292
6616
 
6295
6619
% properly.  Single argument is the language abbreviation.
6296
6620
% It would be nice if we could set up a hyphenation file here.
6297
6621
%
6298
 
\def\documentlanguage{\parsearg\dodocumentlanguage}
6299
 
\def\dodocumentlanguage#1{%
 
6622
\parseargdef\documentlanguage{%
6300
6623
  \tex % read txi-??.tex file in plain TeX.
6301
 
  % Read the file if it exists.
6302
 
  \openin 1 txi-#1.tex
6303
 
  \ifeof1
6304
 
    \errhelp = \nolanghelp
6305
 
    \errmessage{Cannot read language file txi-#1.tex}%
6306
 
    \let\temp = \relax
6307
 
  \else
6308
 
    \def\temp{\input txi-#1.tex }%
6309
 
  \fi
6310
 
  \temp
 
6624
    % Read the file if it exists.
 
6625
    \openin 1 txi-#1.tex
 
6626
    \ifeof 1
 
6627
      \errhelp = \nolanghelp
 
6628
      \errmessage{Cannot read language file txi-#1.tex}%
 
6629
    \else
 
6630
      \input txi-#1.tex
 
6631
    \fi
 
6632
    \closein 1
6311
6633
  \endgroup
6312
6634
}
6313
6635
\newhelp\nolanghelp{The given language definition file cannot be found or
6355
6677
% Parameters in order: 1) textheight; 2) textwidth; 3) voffset;
6356
6678
% 4) hoffset; 5) binding offset; 6) topskip; 7) physical page height; 8)
6357
6679
% physical page width.
6358
 
 
6680
%
6359
6681
% We also call \setleading{\textleading}, so the caller should define
6360
6682
% \textleading.  The caller should also set \parskip.
6361
6683
%
6423
6745
  \parskip = 3pt plus 2pt minus 1pt
6424
6746
  \textleading = 13.2pt
6425
6747
  %
6426
 
  % Double-side printing via postscript on Laserjet 4050 
 
6748
  % Double-side printing via postscript on Laserjet 4050
6427
6749
  % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm.
6428
6750
  % To change the settings for a different printer or situation, adjust
6429
6751
  % \normaloffset until the front-side and back-side texts align.  Then
6464
6786
  \tableindent = 12mm
6465
6787
}}
6466
6788
 
6467
 
% A specific text layout, 24x15cm overall, intended for A4 paper.  
 
6789
% A specific text layout, 24x15cm overall, intended for A4 paper.
6468
6790
\def\afourlatex{{\globaldefs = 1
6469
6791
  \afourpaper
6470
6792
  \internalpagesizes{237mm}{150mm}%
6490
6812
% Perhaps we should allow setting the margins, \topskip, \parskip,
6491
6813
% and/or leading, also. Or perhaps we should compute them somehow.
6492
6814
%
6493
 
\def\pagesizes{\parsearg\pagesizesxxx}
6494
 
\def\pagesizesxxx#1{\pagesizesyyy #1,,\finish}
 
6815
\parseargdef\pagesizes{\pagesizesyyy #1,,\finish}
6495
6816
\def\pagesizesyyy#1,#2,#3\finish{{%
6496
6817
  \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
6497
6818
  \globaldefs = 1
6538
6859
\def\normalplus{+}
6539
6860
\def\normaldollar{$}%$ font-lock fix
6540
6861
 
6541
 
% This macro is used to make a character print one way in ttfont
6542
 
% where it can probably just be output, and another way in other fonts,
 
6862
% This macro is used to make a character print one way in \tt
 
6863
% (where it can probably be output as-is), and another way in other fonts,
6543
6864
% where something hairier probably needs to be done.
6544
6865
%
6545
6866
% #1 is what to print if we are indeed using \tt; #2 is what to print
6587
6908
\catcode`\$=\active
6588
6909
\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix
6589
6910
 
6590
 
% Set up an active definition for =, but don't enable it most of the time.
6591
 
{\catcode`\==\active
6592
 
\global\def={{\tt \char 61}}}
6593
 
 
6594
 
\catcode`+=\active
6595
 
\catcode`\_=\active
6596
 
 
6597
6911
% If a .fmt file is being used, characters that might appear in a file
6598
6912
% name cannot be active until we have parsed the command line.
6599
6913
% So turn them off again, and have \everyjob (or @setfilename) turn them on.
6602
6916
 
6603
6917
\catcode`\@=0
6604
6918
 
6605
 
% \rawbackslashxx outputs one backslash character in current font,
 
6919
% \backslashcurfont outputs one backslash character in current font,
6606
6920
% as in \char`\\.
6607
 
\global\chardef\rawbackslashxx=`\\
 
6921
\global\chardef\backslashcurfont=`\\
 
6922
\global\let\rawbackslashxx=\backslashcurfont  % let existing .??s files work
6608
6923
 
6609
 
% \rawbackslash defines an active \ to do \rawbackslashxx.
 
6924
% \rawbackslash defines an active \ to do \backslashcurfont.
6610
6925
% \otherbackslash defines an active \ to be a literal `\' character with
6611
6926
% catcode other.
6612
6927
{\catcode`\\=\active
6613
 
 @gdef@rawbackslash{@let\=@rawbackslashxx}
 
6928
 @gdef@rawbackslash{@let\=@backslashcurfont}
6614
6929
 @gdef@otherbackslash{@let\=@realbackslash}
6615
6930
}
6616
6931
 
6618
6933
{\catcode`\\=\other @gdef@realbackslash{\}}
6619
6934
 
6620
6935
% \normalbackslash outputs one backslash in fixed width font.
6621
 
\def\normalbackslash{{\tt\rawbackslashxx}}
 
6936
\def\normalbackslash{{\tt\backslashcurfont}}
6622
6937
 
6623
6938
\catcode`\\=\active
6624
6939
 
6635
6950
  @let>=@normalgreater
6636
6951
  @let+=@normalplus
6637
6952
  @let$=@normaldollar %$ font-lock fix
 
6953
  @unsepspaces
6638
6954
}
6639
6955
 
6640
6956
% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of
6641
6957
% the literal character `\'.  (Thus, \ is not expandable when this is in
6642
6958
% effect.)
6643
 
 
6959
%
6644
6960
@def@normalturnoffactive{@turnoffactive @let\=@normalbackslash}
6645
6961
 
6646
6962
% Make _ and + \other characters, temporarily.
6669
6985
% Say @foo, not \foo, in error messages.
6670
6986
@escapechar = `@@
6671
6987
 
6672
 
% These look ok in all fonts, so just make them not special.  
 
6988
% These look ok in all fonts, so just make them not special.
6673
6989
@catcode`@& = @other
6674
6990
@catcode`@# = @other
6675
6991
@catcode`@% = @other
6676
6992
 
6677
 
@c Set initial fonts.
6678
 
@textfonts
6679
 
@rm
6680
 
 
6681
6993
 
6682
6994
@c Local variables:
6683
6995
@c eval: (add-hook 'write-file-hooks 'time-stamp)
6686
6998
@c time-stamp-format: "%:y-%02m-%02d.%02H"
6687
6999
@c time-stamp-end: "}"
6688
7000
@c End:
 
7001
 
 
7002
@c vim:sw=2:
 
7003
 
 
7004
@ignore
 
7005
   arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115
 
7006
@end ignore