~logan/ubuntu/trusty/pinentry/0.8.3-1ubuntu1

« back to all changes in this revision

Viewing changes to doc/texinfo.tex

  • Committer: Bazaar Package Importer
  • Author(s): Peter Eisentraut
  • Date: 2005-01-27 19:10:07 UTC
  • mfrom: (1.1.1 upstream) (2.1.1 hoary)
  • Revision ID: james.westby@ubuntu.com-20050127191007-83ptn4mcw63mu085
Tags: 0.7.2-1
* New upstream release
* Added new -gtk2 flavor.
* Build dependencies revised accordingly.
* Added more copyright holders to debian/copyright.
* Removed compatibility symlinks.
* Converted to CDBS.

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