version 1.1, 1995/01/10 18:57:47
|
version 1.3, 1995/09/06 21:00:32
|
Line 1
|
Line 1
|
%% TeX macros to handle texinfo files |
%% TeX macros to handle texinfo files |
|
|
% Copyright (C) 1985, 1986, 1988, 1990, 1991 Free Software Foundation, Inc. |
% Copyright (C) 1985, 86, 88, 90, 91, 92, 93, 1994 Free Software Foundation, Inc. |
|
|
%This texinfo.tex file is free software; you can redistribute it and/or |
%This texinfo.tex file is free software; you can redistribute it and/or |
%modify it under the terms of the GNU General Public License as |
%modify it under the terms of the GNU General Public License as |
Line 22
|
Line 22
|
%You are forbidden to forbid anyone else to use, share and improve |
%You are forbidden to forbid anyone else to use, share and improve |
%what you give them. Help stamp out software-hoarding! |
%what you give them. Help stamp out software-hoarding! |
|
|
\def\texinfoversion{2.72} |
% This automatically updates the version number based on RCS. |
|
\def\deftexinfoversion$#1: #2 ${\def\texinfoversion{#2}} |
|
\deftexinfoversion$Revision$ |
\message{Loading texinfo package [Version \texinfoversion]:} |
\message{Loading texinfo package [Version \texinfoversion]:} |
\message{} |
|
|
|
% Print the version number if in a .fmt file. |
% Print the version number if in a .fmt file. |
\everyjob{\message{[Texinfo version \texinfoversion]}\message{}} |
\everyjob{\message{[Texinfo version \texinfoversion]}\message{}} |
|
|
% Save some parts of plain tex whose names we will redefine. |
% Save some parts of plain tex whose names we will redefine. |
|
|
|
\let\ptextilde=\~ |
\let\ptexlbrace=\{ |
\let\ptexlbrace=\{ |
\let\ptexrbrace=\} |
\let\ptexrbrace=\} |
\let\ptexdots=\dots |
\let\ptexdots=\dots |
Line 45
|
Line 47
|
\let\ptexl=\l |
\let\ptexl=\l |
\let\ptexL=\L |
\let\ptexL=\L |
|
|
\def\tie{\penalty 10000\ } % Save plain tex definition of ~. |
% Be sure we're in horizontal mode when doing a tie, since we make space |
|
% equivalent to this in @example-like environments. Otherwise, a space |
|
% at the beginning of a line will start with \penalty -- and |
|
% since \penalty is valid in vertical mode, we'd end up putting the |
|
% penalty on the vertical list instead of in the new paragraph. |
|
{\catcode`@ = 11 |
|
\gdef\tie{\leavevmode\penalty\@M\ } |
|
} |
|
\let\~ = \tie % And make it available as @~. |
|
|
\message{Basics,} |
\message{Basics,} |
\chardef\other=12 |
\chardef\other=12 |
Line 54
|
Line 64
|
% starts a new line in the output. |
% starts a new line in the output. |
\newlinechar = `^^J |
\newlinechar = `^^J |
|
|
|
% Set up fixed words for English. |
|
\ifx\putwordChapter\undefined{\gdef\putwordChapter{Chapter}}\fi% |
|
\def\putwordInfo{Info}% |
|
\ifx\putwordSee\undefined{\gdef\putwordSee{See}}\fi% |
|
\ifx\putwordsee\undefined{\gdef\putwordsee{see}}\fi% |
|
\ifx\putwordfile\undefined{\gdef\putwordfile{file}}\fi% |
|
\ifx\putwordpage\undefined{\gdef\putwordpage{page}}\fi% |
|
\ifx\putwordsection\undefined{\gdef\putwordsection{section}}\fi% |
|
\ifx\putwordSection\undefined{\gdef\putwordSection{Section}}\fi% |
|
\ifx\putwordTableofContents\undefined{\gdef\putwordTableofContents{Table of Contents}}\fi% |
|
\ifx\putwordShortContents\undefined{\gdef\putwordShortContents{Short Contents}}\fi% |
|
\ifx\putwordAppendix\undefined{\gdef\putwordAppendix{Appendix}}\fi% |
|
|
|
% Ignore a token. |
|
% |
|
\def\gobble#1{} |
|
|
\hyphenation{ap-pen-dix} |
\hyphenation{ap-pen-dix} |
\hyphenation{mini-buf-fer mini-buf-fers} |
\hyphenation{mini-buf-fer mini-buf-fers} |
\hyphenation{eshell} |
\hyphenation{eshell} |
Line 69
|
Line 96
|
% since that produces some useless output on the terminal. |
% since that produces some useless output on the terminal. |
% |
% |
\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}% |
\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}% |
\def\loggingall{\tracingcommands2 \tracingstats2 |
\def\loggingall{\tracingcommands2 \tracingstats2 |
\tracingpages1 \tracingoutput1 \tracinglostchars1 |
\tracingpages1 \tracingoutput1 \tracinglostchars1 |
\tracingmacros2 \tracingparagraphs1 \tracingrestores1 |
\tracingmacros2 \tracingparagraphs1 \tracingrestores1 |
\showboxbreadth\maxdimen\showboxdepth\maxdimen |
\showboxbreadth\maxdimen\showboxdepth\maxdimen |
}% |
}% |
|
|
Line 112
|
Line 139
|
% site of the centerlined box. (P. A. MacKay, 12 November, 1986) |
% site of the centerlined box. (P. A. MacKay, 12 November, 1986) |
% |
% |
\def\croppageout#1{\hoffset=0pt % make sure this doesn't mess things up |
\def\croppageout#1{\hoffset=0pt % make sure this doesn't mess things up |
|
{\escapechar=`\\\relax % makes sure backslash is used in output files. |
\shipout |
\shipout |
\vbox to \outervsize{\hsize=\outerhsize |
\vbox to \outervsize{\hsize=\outerhsize |
\vbox{\line{\ewtop\hfill\ewtop}} |
\vbox{\line{\ewtop\hfill\ewtop}} |
Line 133
|
Line 161
|
\vbox{\moveright\cornerthick\nsbot}} |
\vbox{\moveright\cornerthick\nsbot}} |
\nointerlineskip |
\nointerlineskip |
\vbox{\line{\ewbot\hfill\ewbot}} |
\vbox{\line{\ewbot\hfill\ewbot}} |
} |
}} |
\advancepageno |
\advancepageno |
\ifnum\outputpenalty>-20000 \else\dosupereject\fi} |
\ifnum\outputpenalty>-20000 \else\dosupereject\fi} |
% |
% |
% Do @cropmarks to get crop marks |
% Do @cropmarks to get crop marks |
\def\cropmarks{\let\onepageout=\croppageout } |
\def\cropmarks{\let\onepageout=\croppageout } |
|
|
|
\newinsert\margin \dimen\margin=\maxdimen |
|
|
\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}} |
\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}} |
{\catcode`\@ =11 |
{\catcode`\@ =11 |
\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi |
\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi |
|
% marginal hacks, juha@viisa.uucp (Juha Takala) |
|
\ifvoid\margin\else % marginal info is present |
|
\rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi |
\dimen@=\dp#1 \unvbox#1 |
\dimen@=\dp#1 \unvbox#1 |
\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi |
\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi |
\ifr@ggedbottom \kern-\dimen@ \vfil \fi} |
\ifr@ggedbottom \kern-\dimen@ \vfil \fi} |
Line 160
|
Line 193
|
\def\nsbot{\vbox |
\def\nsbot{\vbox |
{\hrule height\cornerlong depth\cornerthick width\cornerthick}} |
{\hrule height\cornerlong depth\cornerthick width\cornerthick}} |
|
|
% Parse an argument, then pass it to #1. |
% Parse an argument, then pass it to #1. The argument is the rest of |
% The argument can be delimited with [...] or with "..." or braces |
% the input line (except we remove a trailing comment). #1 should be a |
% or it can be a whole line. |
% macro which expects an ordinary undelimited TeX argument. |
% #1 should be a macro which expects |
% |
% an ordinary undelimited TeX argument. |
\def\parsearg#1{% |
|
\let\next = #1% |
\def\parsearg #1{\let\next=#1\begingroup\obeylines\futurelet\temp\parseargx} |
\begingroup |
|
\obeylines |
|
\futurelet\temp\parseargx |
|
} |
|
|
|
% If the next token is an obeyed space (from an @example environment or |
|
% the like), remove it and recurse. Otherwise, we're done. |
\def\parseargx{% |
\def\parseargx{% |
\ifx \obeyedspace\temp \aftergroup\parseargdiscardspace \else% |
% \obeyedspace is defined far below, after the definition of \sepspaces. |
\aftergroup \parseargline % |
\ifx\obeyedspace\temp |
\fi \endgroup} |
\expandafter\parseargdiscardspace |
|
\else |
|
\expandafter\parseargline |
|
\fi |
|
} |
|
|
|
% Remove a single space (as the delimiter token to the macro call). |
{\obeyspaces % |
{\obeyspaces % |
\gdef\parseargdiscardspace {\begingroup\obeylines\futurelet\temp\parseargx}} |
\gdef\parseargdiscardspace {\futurelet\temp\parseargx}} |
|
|
\gdef\obeyedspace{\ } |
|
|
|
\def\parseargline{\begingroup \obeylines \parsearglinex} |
|
{\obeylines % |
{\obeylines % |
\gdef\parsearglinex #1^^M{\endgroup \next {#1}}} |
\gdef\parseargline#1^^M{% |
|
\endgroup % End of the group started in \parsearg. |
|
% |
|
% First remove any @c comment, then any @comment. |
|
% Result of each macro is put in \toks0. |
|
\argremovec #1\c\relax % |
|
\expandafter\argremovecomment \the\toks0 \comment\relax % |
|
% |
|
% Call the caller's macro, saved as \next in \parsearg. |
|
\expandafter\next\expandafter{\the\toks0}% |
|
}% |
|
} |
|
|
|
% Since all \c{,omment} does is throw away the argument, we can let TeX |
|
% do that for us. The \relax here is matched by the \relax in the call |
|
% in \parseargline; it could be more or less anything, its purpose is |
|
% just to delimit the argument to the \c. |
|
\def\argremovec#1\c#2\relax{\toks0 = {#1}} |
|
\def\argremovecomment#1\comment#2\relax{\toks0 = {#1}} |
|
|
|
% \argremovec{,omment} might leave us with trailing spaces, though; e.g., |
|
% @end itemize @c foo |
|
% will have two active spaces as part of the argument with the |
|
% `itemize'. Here we remove all active spaces from #1, and assign the |
|
% result to \toks0. |
|
% |
|
% This loses if there are any *other* active characters besides spaces |
|
% in the argument -- _ ^ +, for example -- since they get expanded. |
|
% Fortunately, Texinfo does not define any such commands. (If it ever |
|
% does, the catcode of the characters in questionwill have to be changed |
|
% here.) But this means we cannot call \removeactivespaces as part of |
|
% \argremovec{,omment}, since @c uses \parsearg, and thus the argument |
|
% that \parsearg gets might well have any character at all in it. |
|
% |
|
\def\removeactivespaces#1{% |
|
\begingroup |
|
\ignoreactivespaces |
|
\edef\temp{#1}% |
|
\global\toks0 = \expandafter{\temp}% |
|
\endgroup |
|
} |
|
|
|
% Change the active space to expand to nothing. |
|
% |
|
\begingroup |
|
\obeyspaces |
|
\gdef\ignoreactivespaces{\obeyspaces\let =\empty} |
|
\endgroup |
|
|
|
|
\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next} |
\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next} |
|
|
Line 192
|
Line 280
|
\endgroup\fi} % This is not perfect, but it should reduce lossage |
\endgroup\fi} % This is not perfect, but it should reduce lossage |
|
|
% @begin foo is the same as @foo, for now. |
% @begin foo is the same as @foo, for now. |
\newhelp\EMsimple{Type <Return> to continue} |
\newhelp\EMsimple{Type <Return> to continue.} |
|
|
\outer\def\begin{\parsearg\beginxxx} |
\outer\def\begin{\parsearg\beginxxx} |
|
|
Line 201
|
Line 289
|
{\errhelp=\EMsimple \errmessage{Undefined command @begin #1}}\else |
{\errhelp=\EMsimple \errmessage{Undefined command @begin #1}}\else |
\csname #1\endcsname\fi} |
\csname #1\endcsname\fi} |
|
|
%% @end foo executes the definition of \Efoo. |
% @end foo executes the definition of \Efoo. |
%% foo can be delimited by doublequotes or brackets. |
% |
|
|
\def\end{\parsearg\endxxx} |
\def\end{\parsearg\endxxx} |
|
|
\def\endxxx #1{% |
\def\endxxx #1{% |
\expandafter\ifx\csname E#1\endcsname\relax |
\removeactivespaces{#1}% |
\expandafter\ifx\csname #1\endcsname\relax |
\edef\endthing{\the\toks0}% |
\errmessage{Undefined command @end #1}\else |
% |
\errorE{#1}\fi\fi |
\expandafter\ifx\csname E\endthing\endcsname\relax |
\csname E#1\endcsname} |
\expandafter\ifx\csname \endthing\endcsname\relax |
\def\errorE#1{ |
% There's no \foo, i.e., no ``environment'' foo. |
{\errhelp=\EMsimple \errmessage{@end #1 not within #1 environment}}} |
\errhelp = \EMsimple |
|
\errmessage{Undefined command `@end \endthing'}% |
|
\else |
|
\unmatchedenderror\endthing |
|
\fi |
|
\else |
|
% Everything's ok; the right environment has been started. |
|
\csname E\endthing\endcsname |
|
\fi |
|
} |
|
|
% Single-spacing is done by various environments. |
% There is an environment #1, but it hasn't been started. Give an error. |
|
% |
|
\def\unmatchedenderror#1{% |
|
\errhelp = \EMsimple |
|
\errmessage{This `@end #1' doesn't have a matching `@#1'}% |
|
} |
|
|
\newskip\singlespaceskip \singlespaceskip = \baselineskip |
% Define the control sequence \E#1 to give an unmatched @end error. |
|
% |
|
\def\defineunmatchedend#1{% |
|
\expandafter\def\csname E#1\endcsname{\unmatchedenderror{#1}}% |
|
} |
|
|
|
|
|
% Single-spacing is done by various environments (specifically, in |
|
% \nonfillstart and \quotations). |
|
\newskip\singlespaceskip \singlespaceskip = 12.5pt |
\def\singlespace{% |
\def\singlespace{% |
{\advance \baselineskip by -\singlespaceskip |
% Why was this kern here? It messes up equalizing space above and below |
\kern \baselineskip}% |
% environments. --karl, 6may93 |
\baselineskip=\singlespaceskip |
%{\advance \baselineskip by -\singlespaceskip |
|
%\kern \baselineskip}% |
|
\setleading \singlespaceskip |
} |
} |
|
|
%% Simple single-character @ commands |
%% Simple single-character @ commands |
Line 230
|
Line 341
|
% Kludge this until the fonts are right (grr). |
% Kludge this until the fonts are right (grr). |
\def\@{{\tt \char '100}} |
\def\@{{\tt \char '100}} |
|
|
% Define @` and @' to be the same as ` and ' |
% This is turned off because it was never documented |
% but suppressing ligatures. |
% and you can use @w{...} around a quote to suppress ligatures. |
\def\`{{`}} |
%% Define @` and @' to be the same as ` and ' |
\def\'{{'}} |
%% but suppressing ligatures. |
|
%\def\`{{`}} |
|
%\def\'{{'}} |
|
|
% Used to generate quoted braces. |
% Used to generate quoted braces. |
|
|
Line 251
|
Line 364
|
% @. is an end-of-sentence period. |
% @. is an end-of-sentence period. |
\def\.{.\spacefactor=3000 } |
\def\.{.\spacefactor=3000 } |
|
|
|
% @enddots{} is an end-of-sentence ellipsis. |
|
\gdef\enddots{$\mathinner{\ldotp\ldotp\ldotp\ldotp}$\spacefactor=3000} |
|
|
|
% @! is an end-of-sentence bang. |
|
\gdef\!{!\spacefactor=3000 } |
|
|
|
% @? is an end-of-sentence query. |
|
\gdef\?{?\spacefactor=3000 } |
|
|
% @w prevents a word break. Without the \leavevmode, @w at the |
% @w prevents a word break. Without the \leavevmode, @w at the |
% beginning of a paragraph, when TeX is still in vertical mode, would |
% beginning of a paragraph, when TeX is still in vertical mode, would |
% produce a whole line of output instead of starting the paragraph. |
% produce a whole line of output instead of starting the paragraph. |
Line 263
|
Line 385
|
% max (\topskip - \ht (first item), 0). If that height is large, |
% max (\topskip - \ht (first item), 0). If that height is large, |
% therefore, no glue is inserted, and the space between the headline and |
% therefore, no glue is inserted, and the space between the headline and |
% the text is small, which looks bad. |
% the text is small, which looks bad. |
% |
% |
\def\group{\begingroup |
\def\group{\begingroup |
\ifnum\catcode13=\active \else |
\ifnum\catcode13=\active \else |
\errhelp = \groupinvalidhelp |
\errhelp = \groupinvalidhelp |
\errmessage{@group invalid in context where filling is enabled}% |
\errmessage{@group invalid in context where filling is enabled}% |
\fi |
\fi |
\def\Egroup{\egroup\endgroup}% |
% |
|
% The \vtop we start below produces a box with normal height and large |
|
% depth; thus, TeX puts \baselineskip glue before it, and (when the |
|
% next line of text is done) \lineskip glue after it. (See p.82 of |
|
% the TeXbook.) Thus, space below is not quite equal to space |
|
% above. But it's pretty close. |
|
\def\Egroup{% |
|
\egroup % End the \vtop. |
|
\endgroup % End the \group. |
|
}% |
|
% |
\vtop\bgroup |
\vtop\bgroup |
|
% We have to put a strut on the last line in case the @group is in |
|
% the midst of an example, rather than completely enclosing it. |
|
% Otherwise, the interline space between the last line of the group |
|
% and the first line afterwards is too small. But we can't put the |
|
% strut in \Egroup, since there it would be on a line by itself. |
|
% Hence this just inserts a strut at the beginning of each line. |
|
\everypar = {\strut}% |
|
% |
|
% Since we have a strut on every line, we don't need any of TeX's |
|
% normal interline spacing. |
|
\offinterlineskip |
|
% |
|
% OK, but now we have to do something about blank |
|
% lines in the input in @example-like environments, which normally |
|
% just turn into \lisppar, which will insert no space now that we've |
|
% turned off the interline space. Simplest is to make them be an |
|
% empty paragraph. |
|
\ifx\par\lisppar |
|
\edef\par{\leavevmode \par}% |
|
% |
|
% Reset ^^M's definition to new definition of \par. |
|
\obeylines |
|
\fi |
|
% |
|
% Do @comment since we are called inside an environment such as |
|
% @example, where each end-of-line in the input causes an |
|
% end-of-line in the output. We don't want the end-of-line after |
|
% the `@group' to put extra space in the output. Since @group |
|
% should appear on a line by itself (according to the Texinfo |
|
% manual), we don't worry about eating any user text. |
|
\comment |
} |
} |
% |
% |
% TeX puts in an \escapechar (i.e., `@') at the beginning of the help |
% TeX puts in an \escapechar (i.e., `@') at the beginning of the help |
% message, so this ends up printing `@group can only ...'. |
% message, so this ends up printing `@group can only ...'. |
% |
% |
\newhelp\groupinvalidhelp{% |
\newhelp\groupinvalidhelp{% |
group can only be used in environments such as @example,^^J% |
group can only be used in environments such as @example,^^J% |
where each line of input produces a line of output.} |
where each line of input produces a line of output.} |
Line 306 where each line of input produces a line
|
Line 469 where each line of input produces a line
|
\allowbreak |
\allowbreak |
\nointerlineskip |
\nointerlineskip |
\vtop to #1\mil{\vfil}% |
\vtop to #1\mil{\vfil}% |
% |
% |
% TeX does not even consider page breaks if a penalty added to the |
% TeX does not even consider page breaks if a penalty added to the |
% main vertical list is 10000 or more. But in order to see if the |
% main vertical list is 10000 or more. But in order to see if the |
% empty box we just added fits on the page, we must make it consider |
% empty box we just added fits on the page, we must make it consider |
% page breaks. On the other hand, we don't want to actually break the |
% page breaks. On the other hand, we don't want to actually break the |
% page after the empty box. So we use a penalty of 9999. |
% page after the empty box. So we use a penalty of 9999. |
% |
% |
% There is an extremely small chance that TeX will actually break the |
% There is an extremely small chance that TeX will actually break the |
% page at this \penalty, if there are no other feasible breakpoints in |
% page at this \penalty, if there are no other feasible breakpoints in |
% sight. (If the user is using lots of big @group commands, which |
% sight. (If the user is using lots of big @group commands, which |
Line 362 where each line of input produces a line
|
Line 525 where each line of input produces a line
|
% @include file insert text of that file as input. |
% @include file insert text of that file as input. |
|
|
\def\include{\parsearg\includezzz} |
\def\include{\parsearg\includezzz} |
\def\includezzz #1{{\def\thisfile{#1}\input #1 |
%Use \input\thisfile to avoid blank after \input, which may be an active |
}} |
%char (in which case the blank would become the \input argument). |
|
%The grouping keeps the value of \thisfile correct even when @include |
|
%is nested. |
|
\def\includezzz #1{\begingroup |
|
\def\thisfile{#1}\input\thisfile |
|
\endgroup} |
|
|
\def\thisfile{} |
\def\thisfile{} |
|
|
Line 419 where each line of input produces a line
|
Line 587 where each line of input produces a line
|
\let\titlepage=\relax |
\let\titlepage=\relax |
} |
} |
|
|
\def\ignore{\begingroup\ignoresections |
% Used in nested conditionals, where we have to parse the Texinfo source |
% Make sure that spaces turn into tokens that match what \ignorexxx wants. |
% and so want to turn off most commands, in case they are used |
\catcode32=10 |
% incorrectly. |
\ignorexxx} |
% |
\long\def\ignorexxx #1\end ignore{\endgroup\ignorespaces} |
\def\ignoremorecommands{% |
|
\let\defcv = \relax |
\def\direntry{\begingroup\direntryxxx} |
\let\deffn = \relax |
\long\def\direntryxxx #1\end direntry{\endgroup\ignorespaces} |
\let\deffnx = \relax |
|
\let\defindex = \relax |
% Conditionals to test whether a flag is set. |
\let\defivar = \relax |
|
\let\defmac = \relax |
\def\ifset{\begingroup\ignoresections\parsearg\ifsetxxx} |
\let\defmethod = \relax |
|
\let\defop = \relax |
\def\ifsetxxx #1{\endgroup |
\let\defopt = \relax |
\expandafter\ifx\csname IF#1\endcsname\relax \let\temp=\ifsetfail |
\let\defspec = \relax |
\else \let\temp=\relax \fi |
\let\deftp = \relax |
\temp} |
\let\deftypefn = \relax |
\def\Eifset{} |
\let\deftypefun = \relax |
\def\ifsetfail{\begingroup\ignoresections\ifsetfailxxx} |
\let\deftypevar = \relax |
\long\def\ifsetfailxxx #1\end ifset{\endgroup\ignorespaces} |
\let\deftypevr = \relax |
|
\let\defun = \relax |
\def\ifclear{\begingroup\ignoresections\parsearg\ifclearxxx} |
\let\defvar = \relax |
|
\let\defvr = \relax |
\def\ifclearxxx #1{\endgroup |
\let\ref = \relax |
\expandafter\ifx\csname IF#1\endcsname\relax \let\temp=\relax |
\let\xref = \relax |
\else \let\temp=\ifclearfail \fi |
\let\printindex = \relax |
\temp} |
\let\pxref = \relax |
\def\Eifclear{} |
\let\settitle = \relax |
\def\ifclearfail{\begingroup\ignoresections\ifclearfailxxx} |
\let\include = \relax |
\long\def\ifclearfailxxx #1\end ifclear{\endgroup\ignorespaces} |
\let\lowersections = \relax |
|
\let\down = \relax |
|
\let\raisesections = \relax |
|
\let\up = \relax |
|
\let\set = \relax |
|
\let\clear = \relax |
|
\let\item = \relax |
|
\let\message = \relax |
|
} |
|
|
|
% Ignore @ignore ... @end ignore. |
|
% |
|
\def\ignore{\doignore{ignore}} |
|
|
|
% Also ignore @ifinfo, @ifhtml, @html, @menu, and @direntry text. |
|
% |
|
\def\ifinfo{\doignore{ifinfo}} |
|
\def\ifhtml{\doignore{ifhtml}} |
|
\def\html{\doignore{html}} |
|
\def\menu{\doignore{menu}} |
|
\def\direntry{\doignore{direntry}} |
|
|
|
% Ignore text until a line `@end #1'. |
|
% |
|
\def\doignore#1{\begingroup |
|
% Don't complain about control sequences we have declared \outer. |
|
\ignoresections |
|
% |
|
% Define a command to swallow text until we reach `@end #1'. |
|
\long\def\doignoretext##1\end #1{\enddoignore}% |
|
% |
|
% Make sure that spaces turn into tokens that match what \doignoretext wants. |
|
\catcode32 = 10 |
|
% |
|
% And now expand that command. |
|
\doignoretext |
|
} |
|
|
|
% What we do to finish off ignored text. |
|
% |
|
\def\enddoignore{\endgroup\ignorespaces}% |
|
|
|
\newif\ifwarnedobs\warnedobsfalse |
|
\def\obstexwarn{% |
|
\ifwarnedobs\relax\else |
|
% We need to warn folks that they may have trouble with TeX 3.0. |
|
% This uses \immediate\write16 rather than \message to get newlines. |
|
\immediate\write16{} |
|
\immediate\write16{***WARNING*** for users of Unix TeX 3.0!} |
|
\immediate\write16{This manual trips a bug in TeX version 3.0 (tex hangs).} |
|
\immediate\write16{If you are running another version of TeX, relax.} |
|
\immediate\write16{If you are running Unix TeX 3.0, kill this TeX process.} |
|
\immediate\write16{ Then upgrade your TeX installation if you can.} |
|
\immediate\write16{If you are stuck with version 3.0, run the} |
|
\immediate\write16{ script ``tex3patch'' from the Texinfo distribution} |
|
\immediate\write16{ to use a workaround.} |
|
\immediate\write16{} |
|
\warnedobstrue |
|
\fi |
|
} |
|
|
|
% **In TeX 3.0, setting text in \nullfont hangs tex. For a |
|
% workaround (which requires the file ``dummy.tfm'' to be installed), |
|
% uncomment the following line: |
|
%%%%%\font\nullfont=dummy\let\obstexwarn=\relax |
|
|
|
% Ignore text, except that we keep track of conditional commands for |
|
% purposes of nesting, up to an `@end #1' command. |
|
% |
|
\def\nestedignore#1{% |
|
\obstexwarn |
|
% We must actually expand the ignored text to look for the @end |
|
% command, so that nested ignore constructs work. Thus, we put the |
|
% text into a \vbox and then do nothing with the result. To minimize |
|
% the change of memory overflow, we follow the approach outlined on |
|
% page 401 of the TeXbook: make the current font be a dummy font. |
|
% |
|
\setbox0 = \vbox\bgroup |
|
% Don't complain about control sequences we have declared \outer. |
|
\ignoresections |
|
% |
|
% Define `@end #1' to end the box, which will in turn undefine the |
|
% @end command again. |
|
\expandafter\def\csname E#1\endcsname{\egroup\ignorespaces}% |
|
% |
|
% We are going to be parsing Texinfo commands. Most cause no |
|
% trouble when they are used incorrectly, but some commands do |
|
% complicated argument parsing or otherwise get confused, so we |
|
% undefine them. |
|
% |
|
% We can't do anything about stray @-signs, unfortunately; |
|
% they'll produce `undefined control sequence' errors. |
|
\ignoremorecommands |
|
% |
|
% Set the current font to be \nullfont, a TeX primitive, and define |
|
% all the font commands to also use \nullfont. We don't use |
|
% dummy.tfm, as suggested in the TeXbook, because not all sites |
|
% might have that installed. Therefore, math mode will still |
|
% produce output, but that should be an extremely small amount of |
|
% stuff compared to the main input. |
|
% |
|
\nullfont |
|
\let\tenrm = \nullfont \let\tenit = \nullfont \let\tensl = \nullfont |
|
\let\tenbf = \nullfont \let\tentt = \nullfont \let\smallcaps = \nullfont |
|
\let\tensf = \nullfont |
|
% Similarly for index fonts (mostly for their use in |
|
% smallexample) |
|
\let\indrm = \nullfont \let\indit = \nullfont \let\indsl = \nullfont |
|
\let\indbf = \nullfont \let\indtt = \nullfont \let\indsc = \nullfont |
|
\let\indsf = \nullfont |
|
% |
|
% Don't complain when characters are missing from the fonts. |
|
\tracinglostchars = 0 |
|
% |
|
% Don't bother to do space factor calculations. |
|
\frenchspacing |
|
% |
|
% Don't report underfull hboxes. |
|
\hbadness = 10000 |
|
% |
|
% Do minimal line-breaking. |
|
\pretolerance = 10000 |
|
% |
|
% Do not execute instructions in @tex |
|
\def\tex{\doignore{tex}} |
|
} |
|
|
% @set foo to set the flag named foo. |
% @set VAR sets the variable VAR to an empty value. |
% @clear foo to clear the flag named foo. |
% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE. |
|
% |
|
% Since we want to separate VAR from REST-OF-LINE (which might be |
|
% empty), we can't just use \parsearg; we have to insert a space of our |
|
% own to delimit the rest of the line, and then take it out again if we |
|
% didn't need it. |
|
% |
\def\set{\parsearg\setxxx} |
\def\set{\parsearg\setxxx} |
\def\setxxx #1{ |
\def\setxxx#1{\setyyy#1 \endsetyyy} |
\expandafter\let\csname IF#1\endcsname=\set} |
\def\setyyy#1 #2\endsetyyy{% |
|
\def\temp{#2}% |
|
\ifx\temp\empty \global\expandafter\let\csname SET#1\endcsname = \empty |
|
\else \setzzz{#1}#2\endsetzzz % Remove the trailing space \setxxx inserted. |
|
\fi |
|
} |
|
\def\setzzz#1#2 \endsetzzz{\expandafter\xdef\csname SET#1\endcsname{#2}} |
|
|
|
% @clear VAR clears (i.e., unsets) the variable VAR. |
|
% |
\def\clear{\parsearg\clearxxx} |
\def\clear{\parsearg\clearxxx} |
\def\clearxxx #1{ |
\def\clearxxx#1{\global\expandafter\let\csname SET#1\endcsname=\relax} |
\expandafter\let\csname IF#1\endcsname=\relax} |
|
|
% @value{foo} gets the text saved in variable foo. |
|
% |
|
\def\value#1{\expandafter |
|
\ifx\csname SET#1\endcsname\relax |
|
{\{No value for ``#1''\}} |
|
\else \csname SET#1\endcsname \fi} |
|
|
% Some texinfo constructs that are trivial in tex |
% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined |
|
% with @set. |
|
% |
|
\def\ifset{\parsearg\ifsetxxx} |
|
\def\ifsetxxx #1{% |
|
\expandafter\ifx\csname SET#1\endcsname\relax |
|
\expandafter\ifsetfail |
|
\else |
|
\expandafter\ifsetsucceed |
|
\fi |
|
} |
|
\def\ifsetsucceed{\conditionalsucceed{ifset}} |
|
\def\ifsetfail{\nestedignore{ifset}} |
|
\defineunmatchedend{ifset} |
|
|
|
% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been |
|
% defined with @set, or has been undefined with @clear. |
|
% |
|
\def\ifclear{\parsearg\ifclearxxx} |
|
\def\ifclearxxx #1{% |
|
\expandafter\ifx\csname SET#1\endcsname\relax |
|
\expandafter\ifclearsucceed |
|
\else |
|
\expandafter\ifclearfail |
|
\fi |
|
} |
|
\def\ifclearsucceed{\conditionalsucceed{ifclear}} |
|
\def\ifclearfail{\nestedignore{ifclear}} |
|
\defineunmatchedend{ifclear} |
|
|
|
% @iftex always succeeds; we read the text following, through @end |
|
% iftex). But `@end iftex' should be valid only after an @iftex. |
|
% |
|
\def\iftex{\conditionalsucceed{iftex}} |
|
\defineunmatchedend{iftex} |
|
|
|
% We can't just want to start a group at @iftex (for example) and end it |
|
% at @end iftex, since then @set commands inside the conditional have no |
|
% effect (they'd get reverted at the end of the group). So we must |
|
% define \Eiftex to redefine itself to be its previous value. (We can't |
|
% just define it to fail again with an ``unmatched end'' error, since |
|
% the @ifset might be nested.) |
|
% |
|
\def\conditionalsucceed#1{% |
|
\edef\temp{% |
|
% Remember the current value of \E#1. |
|
\let\nece{prevE#1} = \nece{E#1}% |
|
% |
|
% At the `@end #1', redefine \E#1 to be its previous value. |
|
\def\nece{E#1}{\let\nece{E#1} = \nece{prevE#1}}% |
|
}% |
|
\temp |
|
} |
|
|
\def\iftex{} |
% We need to expand lots of \csname's, but we don't want to expand the |
\def\Eiftex{} |
% control sequences after we've constructed them. |
\def\ifinfo{\begingroup\ignoresections\ifinfoxxx} |
% |
\long\def\ifinfoxxx #1\end ifinfo{\endgroup\ignorespaces} |
\def\nece#1{\expandafter\noexpand\csname#1\endcsname} |
|
|
\long\def\menu #1\end menu{} |
% @asis just yields its argument. Used with @table, for example. |
|
% |
\def\asis#1{#1} |
\def\asis#1{#1} |
|
|
% @math means output in math mode. |
% @math means output in math mode. |
Line 476 where each line of input produces a line
|
Line 842 where each line of input produces a line
|
% we read the toc file back, the $'s will be normal characters (as they |
% we read the toc file back, the $'s will be normal characters (as they |
% should be, according to the definition of Texinfo). So we must use a |
% should be, according to the definition of Texinfo). So we must use a |
% control sequence to switch into and out of math mode. |
% control sequence to switch into and out of math mode. |
% |
% |
% This isn't quite enough for @math to work properly in indices, but it |
% This isn't quite enough for @math to work properly in indices, but it |
% seems unlikely it will ever be needed there. |
% seems unlikely it will ever be needed there. |
% |
% |
\let\implicitmath = $ |
\let\implicitmath = $ |
\def\math#1{\implicitmath #1\implicitmath} |
\def\math#1{\implicitmath #1\implicitmath} |
|
|
|
% @bullet and @minus need the same treatment as @math, just above. |
|
\def\bullet{\implicitmath\ptexbullet\implicitmath} |
|
\def\minus{\implicitmath-\implicitmath} |
|
|
\def\node{\ENVcheck\parsearg\nodezzz} |
\def\node{\ENVcheck\parsearg\nodezzz} |
\def\nodezzz#1{\nodexxx [#1,]} |
\def\nodezzz#1{\nodexxx [#1,]} |
\def\nodexxx[#1,#2]{\gdef\lastnode{#1}} |
\def\nodexxx[#1,#2]{\gdef\lastnode{#1}} |
|
\let\nwnode=\node |
\let\lastnode=\relax |
\let\lastnode=\relax |
|
|
\def\donoderef{\ifx\lastnode\relax\else |
\def\donoderef{\ifx\lastnode\relax\else |
\expandafter\expandafter\expandafter\setref{\lastnode}\fi |
\expandafter\expandafter\expandafter\setref{\lastnode}\fi |
\let\lastnode=\relax} |
\global\let\lastnode=\relax} |
|
|
\def\unnumbnoderef{\ifx\lastnode\relax\else |
\def\unnumbnoderef{\ifx\lastnode\relax\else |
\expandafter\expandafter\expandafter\unnumbsetref{\lastnode}\fi |
\expandafter\expandafter\expandafter\unnumbsetref{\lastnode}\fi |
\let\lastnode=\relax} |
\global\let\lastnode=\relax} |
|
|
\def\appendixnoderef{\ifx\lastnode\relax\else |
\def\appendixnoderef{\ifx\lastnode\relax\else |
\expandafter\expandafter\expandafter\appendixsetref{\lastnode}\fi |
\expandafter\expandafter\expandafter\appendixsetref{\lastnode}\fi |
\let\lastnode=\relax} |
\global\let\lastnode=\relax} |
|
|
\let\refill=\relax |
\let\refill=\relax |
|
|
% @setfilename is done at the beginning of every texinfo file. |
% @setfilename is done at the beginning of every texinfo file. |
% So open here the files we need to have open while reading the input. |
% So open here the files we need to have open while reading the input. |
% This makes it possible to make a .fmt file for texinfo. |
% This makes it possible to make a .fmt file for texinfo. |
Line 517 where each line of input produces a line
|
Line 888 where each line of input produces a line
|
\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} |
\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} |
|
|
\def\inforef #1{\inforefzzz #1,,,,**} |
\def\inforef #1{\inforefzzz #1,,,,**} |
\def\inforefzzz #1,#2,#3,#4**{See Info file \file{\losespace#3{}}, |
\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, |
node \samp{\losespace#1{}}} |
node \samp{\ignorespaces#1{}}} |
\def\losespace #1{#1} |
|
|
|
\message{fonts,} |
\message{fonts,} |
|
|
Line 534 where each line of input produces a line
|
Line 904 where each line of input produces a line
|
%% Try out Computer Modern fonts at \magstephalf |
%% Try out Computer Modern fonts at \magstephalf |
\let\mainmagstep=\magstephalf |
\let\mainmagstep=\magstephalf |
|
|
|
% Set the font macro #1 to the font named #2, adding on the |
|
% specified font prefix (normally `cm'). |
|
\def\setfont#1#2{\font#1=\fontprefix#2} |
|
|
|
% Use cm as the default font prefix. |
|
% To specify the font prefix, you must define \fontprefix |
|
% before you read in texinfo.tex. |
|
\ifx\fontprefix\undefined |
|
\def\fontprefix{cm} |
|
\fi |
|
|
\ifx\bigger\relax |
\ifx\bigger\relax |
\let\mainmagstep=\magstep1 |
\let\mainmagstep=\magstep1 |
\font\textrm=cmr12 |
\setfont\textrm{r12} |
\font\texttt=cmtt12 |
\setfont\texttt{tt12} |
\else |
\else |
\font\textrm=cmr10 scaled \mainmagstep |
\setfont\textrm{r10 scaled \mainmagstep} |
\font\texttt=cmtt10 scaled \mainmagstep |
\setfont\texttt{tt10 scaled \mainmagstep} |
\fi |
\fi |
% Instead of cmb10, you many want to use cmbx10. |
% Instead of cmb10, you many want to use cmbx10. |
% cmbx10 is a prettier font on its own, but cmb10 |
% cmbx10 is a prettier font on its own, but cmb10 |
% looks better when embedded in a line with cmr10. |
% looks better when embedded in a line with cmr10. |
\font\textbf=cmb10 scaled \mainmagstep |
\setfont\textbf{b10 scaled \mainmagstep} |
\font\textit=cmti10 scaled \mainmagstep |
\setfont\textit{ti10 scaled \mainmagstep} |
\font\textsl=cmsl10 scaled \mainmagstep |
\setfont\textsl{sl10 scaled \mainmagstep} |
\font\textsf=cmss10 scaled \mainmagstep |
\setfont\textsf{ss10 scaled \mainmagstep} |
\font\textsc=cmcsc10 scaled \mainmagstep |
\setfont\textsc{csc10 scaled \mainmagstep} |
\font\texti=cmmi10 scaled \mainmagstep |
\font\texti=cmmi10 scaled \mainmagstep |
\font\textsy=cmsy10 scaled \mainmagstep |
\font\textsy=cmsy10 scaled \mainmagstep |
|
|
% A few fonts for @defun, etc. |
% A few fonts for @defun, etc. |
\font\defbf=cmbx10 scaled \magstep1 %was 1314 |
\setfont\defbf{bx10 scaled \magstep1} %was 1314 |
\font\deftt=cmtt10 scaled \magstep1 |
\setfont\deftt{tt10 scaled \magstep1} |
\def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf} |
\def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf} |
|
|
% Fonts for indices and small examples. |
% Fonts for indices and small examples. |
% We actually use the slanted font rather than the italic, |
% We actually use the slanted font rather than the italic, |
% because texinfo normally uses the slanted fonts for that. |
% because texinfo normally uses the slanted fonts for that. |
% Do not make many font distinctions in general in the index, since they |
% Do not make many font distinctions in general in the index, since they |
% aren't very useful. |
% aren't very useful. |
\font\ninett=cmtt9 |
\setfont\ninett{tt9} |
\font\indrm=cmr9 |
\setfont\indrm{r9} |
\font\indit=cmsl9 |
\setfont\indit{sl9} |
\let\indsl=\indit |
\let\indsl=\indit |
\let\indtt=\ninett |
\let\indtt=\ninett |
\let\indsf=\indrm |
\let\indsf=\indrm |
Line 575 where each line of input produces a line
|
Line 956 where each line of input produces a line
|
\font\indsy=cmsy9 |
\font\indsy=cmsy9 |
|
|
% Fonts for headings |
% Fonts for headings |
\font\chaprm=cmbx12 scaled \magstep2 |
\setfont\chaprm{bx12 scaled \magstep2} |
\font\chapit=cmti12 scaled \magstep2 |
\setfont\chapit{ti12 scaled \magstep2} |
\font\chapsl=cmsl12 scaled \magstep2 |
\setfont\chapsl{sl12 scaled \magstep2} |
\font\chaptt=cmtt12 scaled \magstep2 |
\setfont\chaptt{tt12 scaled \magstep2} |
\font\chapsf=cmss12 scaled \magstep2 |
\setfont\chapsf{ss12 scaled \magstep2} |
\let\chapbf=\chaprm |
\let\chapbf=\chaprm |
\font\chapsc=cmcsc10 scaled\magstep3 |
\setfont\chapsc{csc10 scaled\magstep3} |
\font\chapi=cmmi12 scaled \magstep2 |
\font\chapi=cmmi12 scaled \magstep2 |
\font\chapsy=cmsy10 scaled \magstep3 |
\font\chapsy=cmsy10 scaled \magstep3 |
|
|
\font\secrm=cmbx12 scaled \magstep1 |
\setfont\secrm{bx12 scaled \magstep1} |
\font\secit=cmti12 scaled \magstep1 |
\setfont\secit{ti12 scaled \magstep1} |
\font\secsl=cmsl12 scaled \magstep1 |
\setfont\secsl{sl12 scaled \magstep1} |
\font\sectt=cmtt12 scaled \magstep1 |
\setfont\sectt{tt12 scaled \magstep1} |
\font\secsf=cmss12 scaled \magstep1 |
\setfont\secsf{ss12 scaled \magstep1} |
\font\secbf=cmbx12 scaled \magstep1 |
\setfont\secbf{bx12 scaled \magstep1} |
\font\secsc=cmcsc10 scaled\magstep2 |
\setfont\secsc{csc10 scaled\magstep2} |
\font\seci=cmmi12 scaled \magstep1 |
\font\seci=cmmi12 scaled \magstep1 |
\font\secsy=cmsy10 scaled \magstep2 |
\font\secsy=cmsy10 scaled \magstep2 |
|
|
% \font\ssecrm=cmbx10 scaled \magstep1 % This size an font looked bad. |
% \setfont\ssecrm{bx10 scaled \magstep1} % This size an font looked bad. |
% \font\ssecit=cmti10 scaled \magstep1 % The letters were too crowded. |
% \setfont\ssecit{cmti10 scaled \magstep1} % The letters were too crowded. |
% \font\ssecsl=cmsl10 scaled \magstep1 |
% \setfont\ssecsl{sl10 scaled \magstep1} |
% \font\ssectt=cmtt10 scaled \magstep1 |
% \setfont\ssectt{tt10 scaled \magstep1} |
% \font\ssecsf=cmss10 scaled \magstep1 |
% \setfont\ssecsf{ss10 scaled \magstep1} |
|
|
%\font\ssecrm=cmb10 scaled 1315 % Note the use of cmb rather than cmbx. |
%\setfont\ssecrm{b10 scaled 1315} % Note the use of cmb rather than cmbx. |
%\font\ssecit=cmti10 scaled 1315 % Also, the size is a little larger than |
%\setfont\ssecit{ti10 scaled 1315} % Also, the size is a little larger than |
%\font\ssecsl=cmsl10 scaled 1315 % being scaled magstep1. |
%\setfont\ssecsl{sl10 scaled 1315} % being scaled magstep1. |
%\font\ssectt=cmtt10 scaled 1315 |
%\setfont\ssectt{tt10 scaled 1315} |
%\font\ssecsf=cmss10 scaled 1315 |
%\setfont\ssecsf{ss10 scaled 1315} |
|
|
%\let\ssecbf=\ssecrm |
%\let\ssecbf=\ssecrm |
|
|
\font\ssecrm=cmbx12 scaled \magstephalf |
\setfont\ssecrm{bx12 scaled \magstephalf} |
\font\ssecit=cmti12 scaled \magstephalf |
\setfont\ssecit{ti12 scaled \magstephalf} |
\font\ssecsl=cmsl12 scaled \magstephalf |
\setfont\ssecsl{sl12 scaled \magstephalf} |
\font\ssectt=cmtt12 scaled \magstephalf |
\setfont\ssectt{tt12 scaled \magstephalf} |
\font\ssecsf=cmss12 scaled \magstephalf |
\setfont\ssecsf{ss12 scaled \magstephalf} |
\font\ssecbf=cmbx12 scaled \magstephalf |
\setfont\ssecbf{bx12 scaled \magstephalf} |
\font\ssecsc=cmcsc10 scaled \magstep1 |
\setfont\ssecsc{csc10 scaled \magstep1} |
\font\sseci=cmmi12 scaled \magstephalf |
\font\sseci=cmmi12 scaled \magstephalf |
\font\ssecsy=cmsy10 scaled \magstep1 |
\font\ssecsy=cmsy10 scaled \magstep1 |
% The smallcaps and symbol fonts should actually be scaled \magstep1.5, |
% The smallcaps and symbol fonts should actually be scaled \magstep1.5, |
% but that is not a standard magnification. |
% but that is not a standard magnification. |
|
|
% Fonts for title page: |
% Fonts for title page: |
\font\titlerm = cmbx12 scaled \magstep3 |
\setfont\titlerm{bx12 scaled \magstep3} |
\let\authorrm = \secrm |
\let\authorrm = \secrm |
|
|
% In order for the font changes to affect most math symbols and letters, |
% In order for the font changes to affect most math symbols and letters, |
Line 630 where each line of input produces a line
|
Line 1011 where each line of input produces a line
|
% texinfo doesn't allow for producing subscripts and superscripts, we |
% texinfo doesn't allow for producing subscripts and superscripts, we |
% don't bother to reset \scriptfont and \scriptscriptfont (which would |
% don't bother to reset \scriptfont and \scriptscriptfont (which would |
% also require loading a lot more fonts). |
% also require loading a lot more fonts). |
% |
% |
\def\resetmathfonts{% |
\def\resetmathfonts{% |
\textfont0 = \tenrm \textfont1 = \teni \textfont2 = \tensy |
\textfont0 = \tenrm \textfont1 = \teni \textfont2 = \tensy |
\textfont\itfam = \tenit \textfont\slfam = \tensl \textfont\bffam = \tenbf |
\textfont\itfam = \tenit \textfont\slfam = \tensl \textfont\bffam = \tenbf |
Line 643 where each line of input produces a line
|
Line 1024 where each line of input produces a line
|
% in math mode, where it is the current \fam that is relevant in most |
% in math mode, where it is the current \fam that is relevant in most |
% cases, not the current. Plain TeX does, for example, |
% cases, not the current. Plain TeX does, for example, |
% \def\bf{\fam=\bffam \tenbf} By redefining \tenbf, we obviate the need |
% \def\bf{\fam=\bffam \tenbf} By redefining \tenbf, we obviate the need |
% to redefine \bf itself. |
% to redefine \bf itself. |
\def\textfonts{% |
\def\textfonts{% |
\let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl |
\let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl |
\let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc |
\let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc |
\let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy |
\let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy |
\resetmathfonts} |
\resetmathfonts} |
\def\chapfonts{% |
\def\chapfonts{% |
\let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl |
\let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl |
\let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc |
\let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc |
\let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy |
\let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy |
\resetmathfonts} |
\resetmathfonts} |
Line 671 where each line of input produces a line
|
Line 1052 where each line of input produces a line
|
\resetmathfonts} |
\resetmathfonts} |
|
|
% Set up the default fonts, so we can use them for creating boxes. |
% Set up the default fonts, so we can use them for creating boxes. |
% |
% |
\textfonts |
\textfonts |
|
|
% Count depth in font-changes, for error checks |
% Count depth in font-changes, for error checks |
\newcount\fontdepth \fontdepth=0 |
\newcount\fontdepth \fontdepth=0 |
|
|
% Fonts for short table of contents. |
% Fonts for short table of contents. |
\font\shortcontrm=cmr12 |
\setfont\shortcontrm{r12} |
\font\shortcontbf=cmbx12 |
\setfont\shortcontbf{bx12} |
\font\shortcontsl=cmsl12 |
\setfont\shortcontsl{sl12} |
|
|
%% Add scribe-like font environments, plus @l for inline lisp (usually sans |
%% Add scribe-like font environments, plus @l for inline lisp (usually sans |
%% serif) and @ii for TeX italic |
%% serif) and @ii for TeX italic |
Line 699 where each line of input produces a line
|
Line 1080 where each line of input produces a line
|
\def\b#1{{\bf #1}} |
\def\b#1{{\bf #1}} |
\let\strong=\b |
\let\strong=\b |
|
|
\def\t#1{{\tt \exhyphenpenalty=10000\rawbackslash \frenchspacing #1}\null} |
% We can't just use \exhyphenpenalty, because that only has effect at |
|
% the end of a paragraph. Restore normal hyphenation at the end of the |
|
% group within which \nohyphenation is presumably called. |
|
% |
|
\def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation} |
|
\def\restorehyphenation{\hyphenchar\font = `- } |
|
|
|
\def\t#1{% |
|
{\tt \nohyphenation \rawbackslash \frenchspacing #1}% |
|
\null |
|
} |
\let\ttfont = \t |
\let\ttfont = \t |
%\def\samp #1{`{\tt \rawbackslash \frenchspacing #1}'\null} |
%\def\samp #1{`{\tt \rawbackslash \frenchspacing #1}'\null} |
\def\samp #1{`\tclose{#1}'\null} |
\def\samp #1{`\tclose{#1}'\null} |
\def\key #1{{\tt \exhyphenpenalty=10000\uppercase{#1}}\null} |
\def\key #1{{\tt \nohyphenation \uppercase{#1}}\null} |
\def\ctrl #1{{\tt \rawbackslash \hat}#1} |
\def\ctrl #1{{\tt \rawbackslash \hat}#1} |
|
|
\let\file=\samp |
\let\file=\samp |
|
|
% @code is a modification of @t, |
% @code is a modification of @t, |
% which makes spaces the same size as normal in the surrounding text. |
% which makes spaces the same size as normal in the surrounding text. |
\newdimen\tclosesave |
\def\tclose#1{% |
\newdimen\tcloserm |
{% |
\def\tclose#1{{\rm \tcloserm=\fontdimen2\font \tt \tclosesave=\fontdimen2\font |
% Change normal interword space to be same as for the current font. |
\fontdimen2\font=\tcloserm |
\spaceskip = \fontdimen2\font |
% prevent breaking lines at hyphens. |
% |
\exhyphenpenalty=10000 |
% Switch to typewriter. |
\def\ {{\fontdimen2\font=\tclosesave{} }}% |
\tt |
\rawbackslash \frenchspacing #1\fontdimen2\font=\tclosesave}\null} |
% |
\let\code=\tclose |
% But `\ ' produces the large typewriter interword space. |
|
\def\ {{\spaceskip = 0pt{} }}% |
|
% |
|
% Turn off hyphenation. |
|
\nohyphenation |
|
% |
|
\rawbackslash |
|
\frenchspacing |
|
#1% |
|
}% |
|
\null |
|
} |
|
|
|
% We *must* turn on hyphenation at `-' and `_' in \code. |
|
% Otherwise, it is too hard to avoid overful hboxes |
|
% in the Emacs manual, the Library manual, etc. |
|
|
|
% Unfortunately, TeX uses one parameter (\hyphenchar) to control |
|
% both hyphenation at - and hyphenation within words. |
|
% We must therefore turn them both off (\tclose does that) |
|
% and arrange explicitly to hyphenate an a dash. |
|
% -- rms. |
|
{ |
|
\catcode`\-=\active |
|
\catcode`\_=\active |
|
\global\def\code{\begingroup \catcode`\-=\active \let-\codedash \catcode`\_=\active \let_\codeunder \codex} |
|
% The following is used by \doprintindex to insure that long function names |
|
% wrap around. It is necessary for - and _ to be active before the index is |
|
% read from the file, as \entry parses the arguments long before \code is |
|
% ever called. -- mycroft |
|
\global\def\indexbreaks{\catcode`\-=\active \let-\realdash \catcode`\_=\active \let_\realunder} |
|
} |
|
\def\realdash{-} |
|
\def\realunder{_} |
|
\def\codedash{-\discretionary{}{}{}} |
|
\def\codeunder{\normalunderscore\discretionary{}{}{}} |
|
\def\codex #1{\tclose{#1}\endgroup} |
|
|
%\let\exp=\tclose %Was temporary |
%\let\exp=\tclose %Was temporary |
|
|
% @kbd is like @code, except that if the argument is just one @key command, |
% @kbd is like @code, except that if the argument is just one @key command, |
% then @kbd has no effect. |
% then @kbd has no effect. |
|
|
\def\xkey{\key} |
\def\xkey{\key} |
Line 733 where each line of input produces a line
|
Line 1161 where each line of input produces a line
|
% Typeset a dimension, e.g., `in' or `pt'. The only reason for the |
% Typeset a dimension, e.g., `in' or `pt'. The only reason for the |
% argument is to make the input look right: @dmn{pt} instead of |
% argument is to make the input look right: @dmn{pt} instead of |
% @dmn{}pt. |
% @dmn{}pt. |
% |
% |
\def\dmn#1{\thinspace #1} |
\def\dmn#1{\thinspace #1} |
|
|
\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par} |
\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par} |
|
|
\def\l#1{{\li #1}\null} % |
\def\l#1{{\li #1}\null} % |
|
|
\def\r#1{{\rm #1}} % roman font |
\def\r#1{{\rm #1}} % roman font |
% Use of \lowercase was suggested. |
% Use of \lowercase was suggested. |
Line 753 where each line of input produces a line
|
Line 1181 where each line of input produces a line
|
% First the title page. Must do @settitle before @titlepage. |
% First the title page. Must do @settitle before @titlepage. |
\def\titlefont#1{{\titlerm #1}} |
\def\titlefont#1{{\titlerm #1}} |
|
|
\newtoks\realeverypar |
|
\newif\ifseenauthor |
\newif\ifseenauthor |
\newif\iffinishedtitlepage |
\newif\iffinishedtitlepage |
|
|
|
\def\shorttitlepage{\parsearg\shorttitlepagezzz} |
|
\def\shorttitlepagezzz #1{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}% |
|
\endgroup\page\hbox{}\page} |
|
|
\def\titlepage{\begingroup \parindent=0pt \textfonts |
\def\titlepage{\begingroup \parindent=0pt \textfonts |
\let\subtitlerm=\tenrm |
\let\subtitlerm=\tenrm |
% I deinstalled the following change because \cmr12 is undefined. |
% I deinstalled the following change because \cmr12 is undefined. |
Line 774 where each line of input produces a line
|
Line 1205 where each line of input produces a line
|
\def\titlezzz##1{\leftline{\titlefont{##1}} |
\def\titlezzz##1{\leftline{\titlefont{##1}} |
% print a rule at the page bottom also. |
% print a rule at the page bottom also. |
\finishedtitlepagefalse |
\finishedtitlepagefalse |
\vskip4pt \hrule height 4pt \vskip4pt}% |
\vskip4pt \hrule height 4pt width \hsize \vskip4pt}% |
% No rule at page bottom unless we print one at the top with @title. |
% No rule at page bottom unless we print one at the top with @title. |
\finishedtitlepagetrue |
\finishedtitlepagetrue |
% |
% |
Line 786 where each line of input produces a line
|
Line 1217 where each line of input produces a line
|
\def\author{\parsearg\authorzzz}% |
\def\author{\parsearg\authorzzz}% |
\def\authorzzz##1{\ifseenauthor\else\vskip 0pt plus 1filll\seenauthortrue\fi |
\def\authorzzz##1{\ifseenauthor\else\vskip 0pt plus 1filll\seenauthortrue\fi |
{\authorfont \leftline{##1}}}% |
{\authorfont \leftline{##1}}}% |
% |
% |
% Most title ``pages'' are actually two pages long, with space |
% Most title ``pages'' are actually two pages long, with space |
% at the top of the second. We don't want the ragged left on the second. |
% at the top of the second. We don't want the ragged left on the second. |
\let\oldpage = \page |
\let\oldpage = \page |
Line 814 where each line of input produces a line
|
Line 1245 where each line of input produces a line
|
} |
} |
|
|
\def\finishtitlepage{% |
\def\finishtitlepage{% |
\vskip4pt \hrule height 2pt |
\vskip4pt \hrule height 2pt width \hsize |
\vskip\titlepagebottomglue |
\vskip\titlepagebottomglue |
\finishedtitlepagetrue |
\finishedtitlepagetrue |
} |
} |
Line 988 July\or August\or September\or October\o
|
Line 1419 July\or August\or September\or October\o
|
% They also define \itemindex |
% They also define \itemindex |
% to index the item name in whatever manner is desired (perhaps none). |
% to index the item name in whatever manner is desired (perhaps none). |
|
|
|
\newif\ifitemxneedsnegativevskip |
|
|
|
\def\itemxpar{\par\ifitemxneedsnegativevskip\vskip-\parskip\nobreak\fi} |
|
|
\def\internalBitem{\smallbreak \parsearg\itemzzz} |
\def\internalBitem{\smallbreak \parsearg\itemzzz} |
\def\internalBitemx{\par \parsearg\itemzzz} |
\def\internalBitemx{\itemxpar \parsearg\itemzzz} |
|
|
\def\internalBxitem "#1"{\def\xitemsubtopix{#1} \smallbreak \parsearg\xitemzzz} |
\def\internalBxitem "#1"{\def\xitemsubtopix{#1} \smallbreak \parsearg\xitemzzz} |
\def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \par \parsearg\xitemzzz} |
\def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \itemxpar \parsearg\xitemzzz} |
|
|
\def\internalBkitem{\smallbreak \parsearg\kitemzzz} |
\def\internalBkitem{\smallbreak \parsearg\kitemzzz} |
\def\internalBkitemx{\par \parsearg\kitemzzz} |
\def\internalBkitemx{\itemxpar \parsearg\kitemzzz} |
|
|
\def\kitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \lastfunction}}% |
\def\kitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \lastfunction}}% |
\itemzzz {#1}} |
\itemzzz {#1}} |
Line 1011 July\or August\or September\or October\o
|
Line 1446 July\or August\or September\or October\o
|
\nobreak % This prevents a break before @itemx. |
\nobreak % This prevents a break before @itemx. |
% |
% |
% Be sure we are not still in the middle of a paragraph. |
% Be sure we are not still in the middle of a paragraph. |
\parskip=0in |
%{\parskip = 0in |
\par |
%\par |
|
%}% |
% |
% |
% If the item text does not fit in the space we have, put it on a line |
% If the item text does not fit in the space we have, put it on a line |
% by itself, and do not allow a page break either before or after that |
% by itself, and do not allow a page break either before or after that |
Line 1020 July\or August\or September\or October\o
|
Line 1456 July\or August\or September\or October\o
|
% command is, e.g., @kindex, the whatsit would get put into the |
% command is, e.g., @kindex, the whatsit would get put into the |
% horizontal list on a line by itself, resulting in extra blank space. |
% horizontal list on a line by itself, resulting in extra blank space. |
\ifdim \wd0>\itemmax |
\ifdim \wd0>\itemmax |
\setbox0=\hbox{\hskip \leftskip \hskip -\tableindent \unhbox0}\box0 |
% |
|
% Make this a paragraph so we get the \parskip glue and wrapping, |
|
% but leave it ragged-right. |
|
\begingroup |
|
\advance\leftskip by-\tableindent |
|
\advance\hsize by\tableindent |
|
\advance\rightskip by0pt plus1fil |
|
\leavevmode\unhbox0\par |
|
\endgroup |
|
% |
|
% We're going to be starting a paragraph, but we don't want the |
|
% \parskip glue -- logically it's part of the @item we just started. |
|
\nobreak \vskip-\parskip |
|
% |
|
% Stop a page break at the \parskip glue coming up. Unfortunately |
|
% we can't prevent a possible page break at the following |
|
% \baselineskip glue. |
\nobreak |
\nobreak |
|
\endgroup |
|
\itemxneedsnegativevskipfalse |
\else |
\else |
% The item text fits into the space. Start a paragraph, so that the |
% The item text fits into the space. Start a paragraph, so that the |
% following text (if any) will end up on the same line. Since that |
% following text (if any) will end up on the same line. Since that |
% text will be indented by \tableindent, we make the item text be in |
% text will be indented by \tableindent, we make the item text be in |
% a zero-width box. |
% a zero-width box. |
\noindent |
\noindent |
\rlap{\hskip -\tableindent\box0}% |
\rlap{\hskip -\tableindent\box0}\ignorespaces% |
|
\endgroup% |
|
\itemxneedsnegativevskiptrue% |
\fi |
\fi |
\endgroup |
|
} |
} |
|
|
\def\item{\errmessage{@item while not in a table}} |
\def\item{\errmessage{@item while not in a table}} |
Line 1052 July\or August\or September\or October\o
|
Line 1507 July\or August\or September\or October\o
|
{\obeylines\obeyspaces% |
{\obeylines\obeyspaces% |
\gdef\ftablex #1^^M{% |
\gdef\ftablex #1^^M{% |
\tabley\fnitemindex#1 \endtabley |
\tabley\fnitemindex#1 \endtabley |
\def\Eftable{\endgraf\endgroup\afterenvbreak}% |
\def\Eftable{\endgraf\afterenvbreak\endgroup}% |
\let\Etable=\relax}} |
\let\Etable=\relax}} |
|
|
\def\vtable{\begingroup\inENV\obeylines\obeyspaces\vtablex} |
\def\vtable{\begingroup\inENV\obeylines\obeyspaces\vtablex} |
{\obeylines\obeyspaces% |
{\obeylines\obeyspaces% |
\gdef\vtablex #1^^M{% |
\gdef\vtablex #1^^M{% |
\tabley\vritemindex#1 \endtabley |
\tabley\vritemindex#1 \endtabley |
\def\Evtable{\endgraf\endgroup\afterenvbreak}% |
\def\Evtable{\endgraf\afterenvbreak\endgroup}% |
\let\Etable=\relax}} |
\let\Etable=\relax}} |
|
|
\def\dontindex #1{} |
\def\dontindex #1{} |
Line 1086 July\or August\or September\or October\o
|
Line 1541 July\or August\or September\or October\o
|
\parindent = 0pt |
\parindent = 0pt |
\parskip = \smallskipamount |
\parskip = \smallskipamount |
\ifdim \parskip=0pt \parskip=2pt \fi% |
\ifdim \parskip=0pt \parskip=2pt \fi% |
\def\Etable{\endgraf\endgroup\afterenvbreak}% |
\def\Etable{\endgraf\afterenvbreak\endgroup}% |
\let\item = \internalBitem % |
\let\item = \internalBitem % |
\let\itemx = \internalBitemx % |
\let\itemx = \internalBitemx % |
\let\kitem = \internalBkitem % |
\let\kitem = \internalBkitem % |
Line 1115 July\or August\or September\or October\o
|
Line 1570 July\or August\or September\or October\o
|
\parindent = 0pt % |
\parindent = 0pt % |
\parskip = \smallskipamount % |
\parskip = \smallskipamount % |
\ifdim \parskip=0pt \parskip=2pt \fi% |
\ifdim \parskip=0pt \parskip=2pt \fi% |
\def#2{\endgraf\endgroup\afterenvbreak}% |
\def#2{\endgraf\afterenvbreak\endgroup}% |
\def\itemcontents{#1}% |
\def\itemcontents{#1}% |
\let\item=\itemizeitem} |
\let\item=\itemizeitem} |
|
|
\def\bullet{$\ptexbullet$} |
|
\def\minus{$-$} |
|
|
|
% Set sfcode to normal for the chars that usually have another value. |
% Set sfcode to normal for the chars that usually have another value. |
% These are `.?!:;,' |
% These are `.?!:;,' |
\def\frenchspacing{\sfcode46=1000 \sfcode63=1000 \sfcode33=1000 |
\def\frenchspacing{\sfcode46=1000 \sfcode63=1000 \sfcode33=1000 |
Line 1129 July\or August\or September\or October\o
|
Line 1581 July\or August\or September\or October\o
|
|
|
% \splitoff TOKENS\endmark defines \first to be the first token in |
% \splitoff TOKENS\endmark defines \first to be the first token in |
% TOKENS, and \rest to be the remainder. |
% TOKENS, and \rest to be the remainder. |
% |
% |
\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}% |
\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}% |
|
|
% Allow an optional argument of an uppercase letter, lowercase letter, |
% Allow an optional argument of an uppercase letter, lowercase letter, |
% or number, to specify the first label in the enumerated list. No |
% or number, to specify the first label in the enumerated list. No |
% argument is the same as `1'. |
% argument is the same as `1'. |
% |
% |
\def\enumerate{\parsearg\enumeratezzz} |
\def\enumerate{\parsearg\enumeratezzz} |
\def\enumeratezzz #1{\enumeratey #1 \endenumeratey} |
\def\enumeratezzz #1{\enumeratey #1 \endenumeratey} |
\def\enumeratey #1 #2\endenumeratey{% |
\def\enumeratey #1 #2\endenumeratey{% |
Line 1157 July\or August\or September\or October\o
|
Line 1609 July\or August\or September\or October\o
|
% An ``uppercase letter'' is one whose \lccode is both nonzero, and |
% An ``uppercase letter'' is one whose \lccode is both nonzero, and |
% not equal to itself. |
% not equal to itself. |
% Otherwise, we assume it's a number. |
% Otherwise, we assume it's a number. |
% |
% |
% We need the \relax at the end of the \ifnum lines to stop TeX from |
% We need the \relax at the end of the \ifnum lines to stop TeX from |
% continuing to look for a <number>. |
% continuing to look for a <number>. |
% |
% |
\ifnum\lccode\expandafter`\thearg=0\relax |
\ifnum\lccode\expandafter`\thearg=0\relax |
\numericenumerate % a number (we hope) |
\numericenumerate % a number (we hope) |
\else |
\else |
% It's a letter. |
% It's a letter. |
Line 1179 July\or August\or September\or October\o
|
Line 1631 July\or August\or September\or October\o
|
|
|
% An @enumerate whose labels are integers. The starting integer is |
% An @enumerate whose labels are integers. The starting integer is |
% given in \thearg. |
% given in \thearg. |
% |
% |
\def\numericenumerate{% |
\def\numericenumerate{% |
\itemno = \thearg |
\itemno = \thearg |
\startenumeration{\the\itemno}% |
\startenumeration{\the\itemno}% |
Line 1214 July\or August\or September\or October\o
|
Line 1666 July\or August\or September\or October\o
|
% Call itemizey, adding a period to the first argument and supplying the |
% Call itemizey, adding a period to the first argument and supplying the |
% common last two arguments. Also subtract one from the initial value in |
% common last two arguments. Also subtract one from the initial value in |
% \itemno, since @item increments \itemno. |
% \itemno, since @item increments \itemno. |
% |
% |
\def\startenumeration#1{% |
\def\startenumeration#1{% |
\advance\itemno by -1 |
\advance\itemno by -1 |
\itemizey{#1.}\Eenumerate\flushcr |
\itemizey{#1.}\Eenumerate\flushcr |
Line 1222 July\or August\or September\or October\o
|
Line 1674 July\or August\or September\or October\o
|
|
|
% @alphaenumerate and @capsenumerate are abbreviations for giving an arg |
% @alphaenumerate and @capsenumerate are abbreviations for giving an arg |
% to @enumerate. |
% to @enumerate. |
% |
% |
\def\alphaenumerate{\enumerate{a}} |
\def\alphaenumerate{\enumerate{a}} |
\def\capsenumerate{\enumerate{A}} |
\def\capsenumerate{\enumerate{A}} |
\def\Ealphaenumerate{\Eenumerate} |
\def\Ealphaenumerate{\Eenumerate} |
Line 1239 July\or August\or September\or October\o
|
Line 1691 July\or August\or September\or October\o
|
\vadjust{\penalty 1200}}% |
\vadjust{\penalty 1200}}% |
\flushcr} |
\flushcr} |
|
|
|
% @multitable macros |
|
% Amy Hendrickson, 8/18/94 |
|
% |
|
% @multitable ... @endmultitable will make as many columns as desired. |
|
% Contents of each column will wrap at width given in preamble. Width |
|
% can be specified either with sample text given in a template line, |
|
% or in percent of \hsize, the current width of text on page. |
|
|
|
% Table can continue over pages but will only break between lines. |
|
|
|
% To make preamble: |
|
% |
|
% Either define widths of columns in terms of percent of \hsize: |
|
% @multitable @percentofhsize .2 .3 .5 |
|
% @item ... |
|
% |
|
% Numbers following @percentofhsize are the percent of the total |
|
% current hsize to be used for each column. You may use as many |
|
% columns as desired. |
|
|
|
% Or use a template: |
|
% @multitable {Column 1 template} {Column 2 template} {Column 3 template} |
|
% @item ... |
|
% using the widest term desired in each column. |
|
|
|
|
|
% Each new table line starts with @item, each subsequent new column |
|
% starts with @tab. Empty columns may be produced by supplying @tab's |
|
% with nothing between them for as many times as empty columns are needed, |
|
% ie, @tab@tab@tab will produce two empty columns. |
|
|
|
% @item, @tab, @multicolumn or @endmulticolumn do not need to be on their |
|
% own lines, but it will not hurt if they are. |
|
|
|
% Sample multitable: |
|
|
|
% @multitable {Column 1 template} {Column 2 template} {Column 3 template} |
|
% @item first col stuff @tab second col stuff @tab third col |
|
% @item |
|
% first col stuff |
|
% @tab |
|
% second col stuff |
|
% @tab |
|
% third col |
|
% @item first col stuff @tab second col stuff |
|
% @tab Many paragraphs of text may be used in any column. |
|
% |
|
% They will wrap at the width determined by the template. |
|
% @item@tab@tab This will be in third column. |
|
% @endmultitable |
|
|
|
% Default dimensions may be reset by user. |
|
% @intableparskip will set vertical space between paragraphs in table. |
|
% @intableparindent will set paragraph indent in table. |
|
% @spacebetweencols will set horizontal space to be left between columns. |
|
% @spacebetweenlines will set vertical space to be left between lines. |
|
|
|
%%%% |
|
% Dimensions |
|
|
|
\newdimen\intableparskip |
|
\newdimen\intableparindent |
|
\newdimen\spacebetweencols |
|
\newdimen\spacebetweenlines |
|
\intableparskip=0pt |
|
\intableparindent=6pt |
|
\spacebetweencols=12pt |
|
\spacebetweenlines=12pt |
|
|
|
%%%% |
|
% Macros used to set up halign preamble: |
|
\let\endsetuptable\relax |
|
\def\xendsetuptable{\endsetuptable} |
|
\let\percentofhsize\relax |
|
\def\xpercentofhsize{\percentofhsize} |
|
\newif\ifsetpercent |
|
|
|
\newcount\colcount |
|
\def\setuptable#1{\def\firstarg{#1}% |
|
\ifx\firstarg\xendsetuptable\let\go\relax% |
|
\else |
|
\ifx\firstarg\xpercentofhsize\global\setpercenttrue% |
|
\else |
|
\ifsetpercent |
|
\if#1.\else% |
|
\global\advance\colcount by1 % |
|
\expandafter\xdef\csname col\the\colcount\endcsname{.#1\hsize}% |
|
\fi |
|
\else |
|
\global\advance\colcount by1 |
|
\setbox0=\hbox{#1}% |
|
\expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}% |
|
\fi% |
|
\fi% |
|
\let\go\setuptable% |
|
\fi\go} |
|
%%%% |
|
% multitable syntax |
|
\def\tab{&} |
|
|
|
%%%% |
|
% @multitable ... @endmultitable definitions: |
|
|
|
\def\multitable#1\item{\bgroup |
|
\let\item\cr |
|
\tolerance=9500 |
|
\hbadness=9500 |
|
\parskip=\intableparskip |
|
\parindent=\intableparindent |
|
\overfullrule=0pt |
|
\global\colcount=0\relax% |
|
\def\Emultitable{\global\setpercentfalse\global\everycr{}\cr\egroup\egroup}% |
|
% To parse everything between @multitable and @item : |
|
\def\one{#1}\expandafter\setuptable\one\endsetuptable |
|
% Need to reset this to 0 after \setuptable. |
|
\global\colcount=0\relax% |
|
% |
|
% This preamble sets up a generic column definition, which will |
|
% be used as many times as user calls for columns. |
|
% \vtop will set a single line and will also let text wrap and |
|
% continue for many paragraphs if desired. |
|
\halign\bgroup&\global\advance\colcount by 1\relax% |
|
\vtop{\hsize=\expandafter\csname col\the\colcount\endcsname |
|
% In order to keep entries from bumping into each other |
|
% we will add a \leftskip of \spacebetweencols to all columns after |
|
% the first one. |
|
% If a template has been used, we will add \spacebetweencols |
|
% to the width of each template entry. |
|
% If user has set preamble in terms of percent of \hsize |
|
% we will use that dimension as the width of the column, and |
|
% the \leftskip will keep entries from bumping into each other. |
|
% Table will start at left margin and final column will justify at |
|
% right margin. |
|
\ifnum\colcount=1 |
|
\else |
|
\ifsetpercent |
|
\else |
|
% If user has <not> set preamble in terms of percent of \hsize |
|
% we will advance \hsize by \spacebetweencols |
|
\advance\hsize by \spacebetweencols |
|
\fi |
|
% In either case we will make \leftskip=\spacebetweencols: |
|
\leftskip=\spacebetweencols |
|
\fi |
|
\noindent##}\cr% |
|
% \everycr will reset column counter, \colcount, at the end of |
|
% each line. Every column entry will cause \colcount to advance by one. |
|
% The table preamble |
|
% looks at the current \colcount to find the correct column width. |
|
\global\everycr{\noalign{\nointerlineskip\vskip\spacebetweenlines |
|
\filbreak%% keeps underfull box messages off when table breaks over pages. |
|
\global\colcount=0\relax}}} |
|
|
\message{indexing,} |
\message{indexing,} |
% Index generation facilities |
% Index generation facilities |
|
|
Line 1313 July\or August\or September\or October\o
|
Line 1918 July\or August\or September\or October\o
|
\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} |
\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} |
|
|
\def\indexdummies{% |
\def\indexdummies{% |
|
% Take care of the plain tex accent commands. |
|
\def\"{\realbackslash "}% |
|
\def\`{\realbackslash `}% |
|
\def\'{\realbackslash '}% |
|
\def\^{\realbackslash ^}% |
|
\def\~{\realbackslash ~}% |
|
\def\={\realbackslash =}% |
|
\def\b{\realbackslash b}% |
|
\def\c{\realbackslash c}% |
|
\def\d{\realbackslash d}% |
|
\def\u{\realbackslash u}% |
|
\def\v{\realbackslash v}% |
|
\def\H{\realbackslash H}% |
|
% Take care of the plain tex special European modified letters. |
|
\def\oe{\realbackslash oe}% |
|
\def\ae{\realbackslash ae}% |
|
\def\aa{\realbackslash aa}% |
|
\def\OE{\realbackslash OE}% |
|
\def\AE{\realbackslash AE}% |
|
\def\AA{\realbackslash AA}% |
|
\def\o{\realbackslash o}% |
|
\def\O{\realbackslash O}% |
|
\def\l{\realbackslash l}% |
|
\def\L{\realbackslash L}% |
|
\def\ss{\realbackslash ss}% |
|
% Take care of texinfo commands likely to appear in an index entry. |
\def\_{{\realbackslash _}}% |
\def\_{{\realbackslash _}}% |
\def\w{\realbackslash w }% |
\def\w{\realbackslash w }% |
\def\bf{\realbackslash bf }% |
\def\bf{\realbackslash bf }% |
Line 1339 July\or August\or September\or October\o
|
Line 1970 July\or August\or September\or October\o
|
\def\file##1{\realbackslash file {##1}}% |
\def\file##1{\realbackslash file {##1}}% |
\def\var##1{\realbackslash var {##1}}% |
\def\var##1{\realbackslash var {##1}}% |
\def\kbd##1{\realbackslash kbd {##1}}% |
\def\kbd##1{\realbackslash kbd {##1}}% |
|
\def\dfn##1{\realbackslash dfn {##1}}% |
|
\def\emph##1{\realbackslash emph {##1}}% |
} |
} |
|
|
% \indexnofonts no-ops all font-change commands. |
% \indexnofonts no-ops all font-change commands. |
Line 1348 July\or August\or September\or October\o
|
Line 1981 July\or August\or September\or October\o
|
\def\indexdummydots{...} |
\def\indexdummydots{...} |
|
|
\def\indexnofonts{% |
\def\indexnofonts{% |
|
% Just ignore accents. |
|
\let\"=\indexdummyfont |
|
\let\`=\indexdummyfont |
|
\let\'=\indexdummyfont |
|
\let\^=\indexdummyfont |
|
\let\~=\indexdummyfont |
|
\let\==\indexdummyfont |
|
\let\b=\indexdummyfont |
|
\let\c=\indexdummyfont |
|
\let\d=\indexdummyfont |
|
\let\u=\indexdummyfont |
|
\let\v=\indexdummyfont |
|
\let\H=\indexdummyfont |
|
% Take care of the plain tex special European modified letters. |
|
\def\oe{oe}% |
|
\def\ae{ae}% |
|
\def\aa{aa}% |
|
\def\OE{OE}% |
|
\def\AE{AE}% |
|
\def\AA{AA}% |
|
\def\o{o}% |
|
\def\O{O}% |
|
\def\l{l}% |
|
\def\L{L}% |
|
\def\ss{ss}% |
\let\w=\indexdummyfont |
\let\w=\indexdummyfont |
\let\t=\indexdummyfont |
\let\t=\indexdummyfont |
\let\r=\indexdummyfont |
\let\r=\indexdummyfont |
Line 1380 July\or August\or September\or October\o
|
Line 2038 July\or August\or September\or October\o
|
|
|
\let\indexbackslash=0 %overridden during \printindex. |
\let\indexbackslash=0 %overridden during \printindex. |
|
|
|
\let\SETmarginindex=\relax %initialize! |
|
% workhorse for all \fooindexes |
|
% #1 is name of index, #2 is stuff to put there |
\def\doind #1#2{% |
\def\doind #1#2{% |
|
% Put the index entry in the margin if desired. |
|
\ifx\SETmarginindex\relax\else% |
|
\insert\margin{\hbox{\vrule height8pt depth3pt width0pt #2}}% |
|
\fi% |
{\count10=\lastpenalty % |
{\count10=\lastpenalty % |
{\indexdummies % Must do this here, since \bf, etc expand at this stage |
{\indexdummies % Must do this here, since \bf, etc expand at this stage |
\escapechar=`\\% |
\escapechar=`\\% |
Line 1436 July\or August\or September\or October\o
|
Line 2101 July\or August\or September\or October\o
|
% \secondary {subtopic}{pagelist} |
% \secondary {subtopic}{pagelist} |
% for each subtopic. |
% for each subtopic. |
|
|
% Define the user-accessible indexing commands |
% Define the user-accessible indexing commands |
% @findex, @vindex, @kindex, @cindex. |
% @findex, @vindex, @kindex, @cindex. |
|
|
\def\findex {\fnindex} |
\def\findex {\fnindex} |
Line 1464 July\or August\or September\or October\o
|
Line 2129 July\or August\or September\or October\o
|
\tex |
\tex |
\dobreak \chapheadingskip {10000} |
\dobreak \chapheadingskip {10000} |
\catcode`\%=\other\catcode`\&=\other\catcode`\#=\other |
\catcode`\%=\other\catcode`\&=\other\catcode`\#=\other |
\catcode`\$=\other\catcode`\_=\other |
\catcode`\$=\other |
\catcode`\~=\other |
\catcode`\~=\other |
|
\indexbreaks |
% |
% |
% The following don't help, since the chars were translated |
% The following don't help, since the chars were translated |
% when the raw index was written, and their fonts were discarded |
% when the raw index was written, and their fonts were discarded |
Line 1483 July\or August\or September\or October\o
|
Line 2149 July\or August\or September\or October\o
|
% |
% |
% See if the index file exists and is nonempty. |
% See if the index file exists and is nonempty. |
\openin 1 \jobname.#1s |
\openin 1 \jobname.#1s |
\ifeof 1 |
\ifeof 1 |
% \enddoublecolumns gets confused if there is no text in the index, |
% \enddoublecolumns gets confused if there is no text in the index, |
% and it loses the chapter title and the aux file entries for the |
% and it loses the chapter title and the aux file entries for the |
% index. The easiest way to prevent this problem is to make sure |
% index. The easiest way to prevent this problem is to make sure |
Line 1519 July\or August\or September\or October\o
|
Line 2185 July\or August\or September\or October\o
|
\removelastskip \penalty-200 \vskip \initialskipamount\fi |
\removelastskip \penalty-200 \vskip \initialskipamount\fi |
\line{\secbf#1\hfill}\kern 2pt\penalty10000}} |
\line{\secbf#1\hfill}\kern 2pt\penalty10000}} |
|
|
|
% This typesets a paragraph consisting of #1, dot leaders, and then #2 |
|
% flush to the right margin. It is used for index and table of contents |
|
% entries. The paragraph is indented by \leftskip. |
|
% |
\def\entry #1#2{\begingroup |
\def\entry #1#2{\begingroup |
\parfillskip=0in \parskip=0in \parindent=0in |
|
% |
% |
% \hangindent is only relevant when the page number and the entry text |
% Start a new paragraph if necessary, so our assignments below can't |
% don't fit on one line. In that case, bob suggests starting the dots |
% affect previous text. |
% pretty far over on the line. |
\par |
% \hangafter is reset to 1 at the start of each paragraph. |
% |
\hangindent=.75\hsize |
% Do not fill out the last line with white space. |
\noindent |
\parfillskip = 0in |
|
% |
|
% No extra space above this paragraph. |
|
\parskip = 0in |
|
% |
|
% Do not prefer a separate line ending with a hyphen to fewer lines. |
|
\finalhyphendemerits = 0 |
|
% |
|
% \hangindent is only relevant when the entry text and page number |
|
% don't both fit on one line. In that case, bob suggests starting the |
|
% dots pretty far over on the line. Unfortunately, a large |
|
% indentation looks wrong when the entry text itself is broken across |
|
% lines. So we use a small indentation and put up with long leaders. |
% |
% |
% Don't break the text of the index entry. |
% \hangafter is reset to 1 (which is the value we want) at the start |
\hbox{#1}% |
% of each paragraph, so we need not do anything with that. |
|
\hangindent=2em |
% |
% |
% If we must, put the page number on a line of its own, and fill out |
% When the entry text needs to be broken, just fill out the first line |
% this line with blank space. (The \hfil is overwhelmed with the |
% with blank space. |
% fill leaders glue in \indexdotfill if the page number does fit.) |
\rightskip = 0pt plus1fil |
\hfil\penalty50 |
% |
\null\nobreak\indexdotfill % Have leaders before the page number. |
% Start a ``paragraph'' for the index entry so the line breaking |
% |
% parameters we've set above will have an effect. |
% The `\ ' here is removed by the implicit \unskip that TeX does as |
\noindent |
% part of (the primitive) \par. Without, a spurious underfull \hbox ensues. |
% |
\ #2% The page number ends the paragraph. |
% Insert the text of the index entry. TeX will do line-breaking on it. |
|
#1% |
|
% The following is kluged to not output a line of dots in the index if |
|
% there are no page numbers. The next person who breaks this will be |
|
% cursed by a Unix daemon. |
|
\def\tempa{{\rm }}% |
|
\def\tempb{#2}% |
|
\edef\tempc{\tempa}% |
|
\edef\tempd{\tempb}% |
|
\ifx\tempc\tempd\ \else% |
|
% |
|
% If we must, put the page number on a line of its own, and fill out |
|
% this line with blank space. (The \hfil is overwhelmed with the |
|
% fill leaders glue in \indexdotfill if the page number does fit.) |
|
\hfil\penalty50 |
|
\null\nobreak\indexdotfill % Have leaders before the page number. |
|
% |
|
% The `\ ' here is removed by the implicit \unskip that TeX does as |
|
% part of (the primitive) \par. Without it, a spurious underfull |
|
% \hbox ensues. |
|
\ #2% The page number ends the paragraph. |
|
\fi% |
\par |
\par |
\endgroup} |
\endgroup} |
|
|
% Like \dotfill except takes at least 1 em. |
% Like \dotfill except takes at least 1 em. |
\def\indexdotfill{\cleaders |
\def\indexdotfill{\cleaders |
\hbox{$\mathsurround=0pt \mkern1.5mu . \mkern1.5mu$}\hskip 1em plus 1fill} |
\hbox{$\mathsurround=0pt \mkern1.5mu ${\it .}$ \mkern1.5mu$}\hskip 1em plus 1fill} |
|
|
\def\primary #1{\line{#1\hfil}} |
\def\primary #1{\line{#1\hfil}} |
|
|
Line 1559 July\or August\or September\or October\o
|
Line 2262 July\or August\or September\or October\o
|
}} |
}} |
|
|
%% Define two-column mode, which is used in indexes. |
%% Define two-column mode, which is used in indexes. |
%% Adapted from the TeXBook, page 416 |
%% Adapted from the TeXbook, page 416. |
\catcode `\@=11 |
\catcode `\@=11 |
|
|
\newbox\partialpage |
\newbox\partialpage |
|
|
\newdimen\doublecolumnhsize \doublecolumnhsize = 3.11in |
\newdimen\doublecolumnhsize |
\newdimen\doublecolumnvsize \doublecolumnvsize = 19.1in |
|
\newdimen\availdimen@ |
|
|
|
\def\begindoublecolumns{\begingroup |
\def\begindoublecolumns{\begingroup |
\output={\global\setbox\partialpage= |
% Grab any single-column material above us. |
\vbox{\unvbox255\kern -\topskip \kern \baselineskip}}\eject |
\output = {\global\setbox\partialpage |
|
=\vbox{\unvbox255\kern -\topskip \kern \baselineskip}}% |
|
\eject |
|
% |
|
% Now switch to the double-column output routine. |
\output={\doublecolumnout}% |
\output={\doublecolumnout}% |
\hsize=\doublecolumnhsize \vsize=\doublecolumnvsize} |
% |
\def\enddoublecolumns{\output={\balancecolumns}\eject |
% Change the page size parameters. We could do this once outside this |
\endgroup \pagegoal=\vsize} |
% routine, in each of @smallbook, @afourpaper, and the default 8.5x11 |
|
% format, but then we repeat the same computation. Repeating a couple |
\def\doublecolumnout{\splittopskip=\topskip \splitmaxdepth=\maxdepth |
% of assignments once per index is clearly meaningless for the |
\dimen@=\pageheight \advance\dimen@ by-\ht\partialpage |
% execution time, so we may as well do it once. |
\setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ |
% |
\onepageout\pagesofar \unvbox255 \penalty\outputpenalty} |
% First we halve the line length, less a little for the gutter between |
|
% the columns. We compute the gutter based on the line length, so it |
|
% changes automatically with the paper format. The magic constant |
|
% below is chosen so that the gutter has the same value (well, +- < |
|
% 1pt) as it did when we hard-coded it. |
|
% |
|
% We put the result in a separate register, \doublecolumhsize, so we |
|
% can restore it in \pagesofar, after \hsize itself has (potentially) |
|
% been clobbered. |
|
% |
|
\doublecolumnhsize = \hsize |
|
\advance\doublecolumnhsize by -.04154\hsize |
|
\divide\doublecolumnhsize by 2 |
|
\hsize = \doublecolumnhsize |
|
% |
|
% Double the \vsize as well. (We don't need a separate register here, |
|
% since nobody clobbers \vsize.) |
|
\vsize = 2\vsize |
|
\doublecolumnpagegoal |
|
} |
|
|
|
\def\enddoublecolumns{\eject \endgroup \pagegoal=\vsize \unvbox\partialpage} |
|
|
|
\def\doublecolumnsplit{\splittopskip=\topskip \splitmaxdepth=\maxdepth |
|
\global\dimen@=\pageheight \global\advance\dimen@ by-\ht\partialpage |
|
\global\setbox1=\vsplit255 to\dimen@ \global\setbox0=\vbox{\unvbox1} |
|
\global\setbox3=\vsplit255 to\dimen@ \global\setbox2=\vbox{\unvbox3} |
|
\ifdim\ht0>\dimen@ \setbox255=\vbox{\unvbox0\unvbox2} \global\setbox255=\copy5 \fi |
|
\ifdim\ht2>\dimen@ \setbox255=\vbox{\unvbox0\unvbox2} \global\setbox255=\copy5 \fi |
|
} |
|
\def\doublecolumnpagegoal{% |
|
\dimen@=\vsize \advance\dimen@ by-2\ht\partialpage \global\pagegoal=\dimen@ |
|
} |
\def\pagesofar{\unvbox\partialpage % |
\def\pagesofar{\unvbox\partialpage % |
\hsize=\doublecolumnhsize % have to restore this since output routine |
\hsize=\doublecolumnhsize % have to restore this since output routine |
% changes it to set cropmarks (P. A. MacKay, 12 Nov. 1986) |
|
\wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}} |
\wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}} |
\def\balancecolumns{% |
\def\doublecolumnout{% |
% Unset the glue. |
\setbox5=\copy255 |
\setbox255=\vbox{\unvbox255} |
{\vbadness=10000 \doublecolumnsplit} |
\dimen@=\ht255 |
\ifvbox255 |
\advance\dimen@ by\topskip \advance\dimen@ by-\baselineskip |
\setbox0=\vtop to\dimen@{\unvbox0} |
\divide\dimen@ by2 |
\setbox2=\vtop to\dimen@{\unvbox2} |
\availdimen@=\pageheight \advance\availdimen@ by-\ht\partialpage |
\onepageout\pagesofar \unvbox255 \penalty\outputpenalty |
% If the remaining data is too big for one page, |
\else |
% output one page normally, then work with what remains. |
\setbox0=\vbox{\unvbox5} |
\ifdim \dimen@>\availdimen@ |
\ifvbox0 |
{ |
\dimen@=\ht0 \advance\dimen@ by\topskip \advance\dimen@ by-\baselineskip |
\splittopskip=\topskip \splitmaxdepth=\maxdepth |
\divide\dimen@ by2 \splittopskip=\topskip \splitmaxdepth=\maxdepth |
\dimen@=\pageheight \advance\dimen@ by-\ht\partialpage |
{\vbadness=10000 |
\setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ |
\loop \global\setbox5=\copy0 |
\onepageout\pagesofar |
\setbox1=\vsplit5 to\dimen@ |
} |
\setbox3=\vsplit5 to\dimen@ |
% Recompute size of what remains, in case we just output some of it. |
\ifvbox5 \global\advance\dimen@ by1pt \repeat |
\dimen@=\ht255 |
\setbox0=\vbox to\dimen@{\unvbox1} |
\advance\dimen@ by\topskip \advance\dimen@ by-\baselineskip |
\setbox2=\vbox to\dimen@{\unvbox3} |
\divide\dimen@ by2 |
\global\setbox\partialpage=\vbox{\pagesofar} |
|
\doublecolumnpagegoal |
|
} |
|
\fi |
\fi |
\fi |
\setbox0=\vbox{\unvbox255} |
} |
\splittopskip=\topskip |
|
{\vbadness=10000 \loop \global\setbox3=\copy0 |
|
\global\setbox1=\vsplit3 to\dimen@ |
|
\ifdim\ht3>\dimen@ \global\advance\dimen@ by1pt \repeat} |
|
\setbox0=\vbox to\dimen@{\unvbox1} \setbox2=\vbox to\dimen@{\unvbox3} |
|
\pagesofar} |
|
|
|
\catcode `\@=\other |
\catcode `\@=\other |
\message{sectioning,} |
\message{sectioning,} |
Line 1672 July\or August\or September\or October\o
|
Line 2405 July\or August\or September\or October\o
|
\def\dfn##1{\realbackslash dfn {##1}} |
\def\dfn##1{\realbackslash dfn {##1}} |
} |
} |
|
|
|
\newcount\absseclevel % used to calculate proper heading level |
|
\newcount\secbase\secbase=0 % @raise/lowersections modify this count |
|
|
|
% @raisesections: treat @section as chapter, @subsection as section, etc. |
|
\def\raisesections{\global\advance\secbase by -1} |
|
\let\up=\raisesections % original BFox name |
|
|
|
% @lowersections: treat @chapter as section, @section as subsection, etc. |
|
\def\lowersections{\global\advance\secbase by 1} |
|
\let\down=\lowersections % original BFox name |
|
|
|
% Choose a numbered-heading macro |
|
% #1 is heading level if unmodified by @raisesections or @lowersections |
|
% #2 is text for heading |
|
\def\numhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1 |
|
\ifcase\absseclevel |
|
\chapterzzz{#2} |
|
\or |
|
\seczzz{#2} |
|
\or |
|
\numberedsubseczzz{#2} |
|
\or |
|
\numberedsubsubseczzz{#2} |
|
\else |
|
\ifnum \absseclevel<0 |
|
\chapterzzz{#2} |
|
\else |
|
\numberedsubsubseczzz{#2} |
|
\fi |
|
\fi |
|
} |
|
|
|
% like \numhead, but chooses appendix heading levels |
|
\def\apphead#1#2{\absseclevel=\secbase\advance\absseclevel by #1 |
|
\ifcase\absseclevel |
|
\appendixzzz{#2} |
|
\or |
|
\appendixsectionzzz{#2} |
|
\or |
|
\appendixsubseczzz{#2} |
|
\or |
|
\appendixsubsubseczzz{#2} |
|
\else |
|
\ifnum \absseclevel<0 |
|
\appendixzzz{#2} |
|
\else |
|
\appendixsubsubseczzz{#2} |
|
\fi |
|
\fi |
|
} |
|
|
|
% like \numhead, but chooses numberless heading levels |
|
\def\unnmhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1 |
|
\ifcase\absseclevel |
|
\unnumberedzzz{#2} |
|
\or |
|
\unnumberedseczzz{#2} |
|
\or |
|
\unnumberedsubseczzz{#2} |
|
\or |
|
\unnumberedsubsubseczzz{#2} |
|
\else |
|
\ifnum \absseclevel<0 |
|
\unnumberedzzz{#2} |
|
\else |
|
\unnumberedsubsubseczzz{#2} |
|
\fi |
|
\fi |
|
} |
|
|
|
|
\def\thischaptername{No Chapter Title} |
\def\thischaptername{No Chapter Title} |
\outer\def\chapter{\parsearg\chapterzzz} |
\outer\def\chapter{\parsearg\chapteryyy} |
|
\def\chapteryyy #1{\numhead0{#1}} % normally numhead0 calls chapterzzz |
\def\chapterzzz #1{\seccheck{chapter}% |
\def\chapterzzz #1{\seccheck{chapter}% |
\secno=0 \subsecno=0 \subsubsecno=0 |
\secno=0 \subsecno=0 \subsubsecno=0 |
\global\advance \chapno by 1 \message{Chapter \the\chapno}% |
\global\advance \chapno by 1 \message{\putwordChapter \the\chapno}% |
\chapmacro {#1}{\the\chapno}% |
\chapmacro {#1}{\the\chapno}% |
\gdef\thissection{#1}% |
\gdef\thissection{#1}% |
\gdef\thischaptername{#1}% |
\gdef\thischaptername{#1}% |
% We don't substitute the actual chapter name into \thischapter |
% We don't substitute the actual chapter name into \thischapter |
% because we don't want its macros evaluated now. |
% because we don't want its macros evaluated now. |
\xdef\thischapter{Chapter \the\chapno: \noexpand\thischaptername}% |
\xdef\thischapter{\putwordChapter{} \the\chapno: \noexpand\thischaptername}% |
{\chapternofonts% |
{\chapternofonts% |
\edef\temp{{\realbackslash chapentry {#1}{\the\chapno}{\noexpand\folio}}}% |
\edef\temp{{\realbackslash chapentry {#1}{\the\chapno}{\noexpand\folio}}}% |
\escapechar=`\\% |
\escapechar=`\\% |
Line 1693 July\or August\or September\or October\o
|
Line 2498 July\or August\or September\or October\o
|
\global\let\subsubsection = \numberedsubsubsec |
\global\let\subsubsection = \numberedsubsubsec |
}} |
}} |
|
|
\outer\def\appendix{\parsearg\appendixzzz} |
\outer\def\appendix{\parsearg\appendixyyy} |
|
\def\appendixyyy #1{\apphead0{#1}} % normally apphead0 calls appendixzzz |
\def\appendixzzz #1{\seccheck{appendix}% |
\def\appendixzzz #1{\seccheck{appendix}% |
\secno=0 \subsecno=0 \subsubsecno=0 |
\secno=0 \subsecno=0 \subsubsecno=0 |
\global\advance \appendixno by 1 \message{Appendix \appendixletter}% |
\global\advance \appendixno by 1 \message{Appendix \appendixletter}% |
\chapmacro {#1}{Appendix \appendixletter}% |
\chapmacro {#1}{\putwordAppendix{} \appendixletter}% |
\gdef\thissection{#1}% |
\gdef\thissection{#1}% |
\gdef\thischaptername{#1}% |
\gdef\thischaptername{#1}% |
\xdef\thischapter{Appendix \appendixletter: \noexpand\thischaptername}% |
\xdef\thischapter{\putwordAppendix{} \appendixletter: \noexpand\thischaptername}% |
{\chapternofonts% |
{\chapternofonts% |
\edef\temp{{\realbackslash chapentry |
\edef\temp{{\realbackslash chapentry |
{#1}{Appendix \appendixletter}{\noexpand\folio}}}% |
{#1}{\putwordAppendix{} \appendixletter}{\noexpand\folio}}}% |
\escapechar=`\\% |
\escapechar=`\\% |
\write \contentsfile \temp % |
\write \contentsfile \temp % |
\appendixnoderef % |
\appendixnoderef % |
Line 1712 July\or August\or September\or October\o
|
Line 2518 July\or August\or September\or October\o
|
\global\let\subsubsection = \appendixsubsubsec |
\global\let\subsubsection = \appendixsubsubsec |
}} |
}} |
|
|
\outer\def\top{\parsearg\unnumberedzzz} |
\outer\def\top{\parsearg\unnumberedyyy} |
\outer\def\unnumbered{\parsearg\unnumberedzzz} |
\outer\def\unnumbered{\parsearg\unnumberedyyy} |
|
\def\unnumberedyyy #1{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz |
\def\unnumberedzzz #1{\seccheck{unnumbered}% |
\def\unnumberedzzz #1{\seccheck{unnumbered}% |
\secno=0 \subsecno=0 \subsubsecno=0 \message{(#1)} |
\secno=0 \subsecno=0 \subsubsecno=0 |
|
% |
|
% This used to be simply \message{#1}, but TeX fully expands the |
|
% argument to \message. Therefore, if #1 contained @-commands, TeX |
|
% expanded them. For example, in `@unnumbered The @cite{Book}', TeX |
|
% expanded @cite (which turns out to cause errors because \cite is meant |
|
% to be executed, not expanded). |
|
% |
|
% Anyway, we don't want the fully-expanded definition of @cite to appear |
|
% as a result of the \message, we just want `@cite' itself. We use |
|
% \the<toks register> to achieve this: TeX expands \the<toks> only once, |
|
% simply yielding the contents of the <toks register>. |
|
\toks0 = {#1}\message{(\the\toks0)}% |
|
% |
\unnumbchapmacro {#1}% |
\unnumbchapmacro {#1}% |
\gdef\thischapter{#1}\gdef\thissection{#1}% |
\gdef\thischapter{#1}\gdef\thissection{#1}% |
{\chapternofonts% |
{\chapternofonts% |
Line 1728 July\or August\or September\or October\o
|
Line 2548 July\or August\or September\or October\o
|
\global\let\subsubsection = \unnumberedsubsubsec |
\global\let\subsubsection = \unnumberedsubsubsec |
}} |
}} |
|
|
\outer\def\numberedsec{\parsearg\seczzz} |
\outer\def\numberedsec{\parsearg\secyyy} |
|
\def\secyyy #1{\numhead1{#1}} % normally calls seczzz |
\def\seczzz #1{\seccheck{section}% |
\def\seczzz #1{\seccheck{section}% |
\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 % |
\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 % |
\gdef\thissection{#1}\secheading {#1}{\the\chapno}{\the\secno}% |
\gdef\thissection{#1}\secheading {#1}{\the\chapno}{\the\secno}% |
Line 1741 July\or August\or September\or October\o
|
Line 2562 July\or August\or September\or October\o
|
\penalty 10000 % |
\penalty 10000 % |
}} |
}} |
|
|
\outer\def\appendixsection{\parsearg\appendixsectionzzz} |
\outer\def\appenixsection{\parsearg\appendixsecyyy} |
\outer\def\appendixsec{\parsearg\appendixsectionzzz} |
\outer\def\appendixsec{\parsearg\appendixsecyyy} |
|
\def\appendixsecyyy #1{\apphead1{#1}} % normally calls appendixsectionzzz |
\def\appendixsectionzzz #1{\seccheck{appendixsection}% |
\def\appendixsectionzzz #1{\seccheck{appendixsection}% |
\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 % |
\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 % |
\gdef\thissection{#1}\secheading {#1}{\appendixletter}{\the\secno}% |
\gdef\thissection{#1}\secheading {#1}{\appendixletter}{\the\secno}% |
Line 1755 July\or August\or September\or October\o
|
Line 2577 July\or August\or September\or October\o
|
\penalty 10000 % |
\penalty 10000 % |
}} |
}} |
|
|
\outer\def\unnumberedsec{\parsearg\unnumberedseczzz} |
\outer\def\unnumberedsec{\parsearg\unnumberedsecyyy} |
|
\def\unnumberedsecyyy #1{\unnmhead1{#1}} % normally calls unnumberedseczzz |
\def\unnumberedseczzz #1{\seccheck{unnumberedsec}% |
\def\unnumberedseczzz #1{\seccheck{unnumberedsec}% |
\plainsecheading {#1}\gdef\thissection{#1}% |
\plainsecheading {#1}\gdef\thissection{#1}% |
{\chapternofonts% |
{\chapternofonts% |
Line 1766 July\or August\or September\or October\o
|
Line 2589 July\or August\or September\or October\o
|
\penalty 10000 % |
\penalty 10000 % |
}} |
}} |
|
|
\outer\def\numberedsubsec{\parsearg\numberedsubseczzz} |
\outer\def\numberedsubsec{\parsearg\numberedsubsecyyy} |
|
\def\numberedsubsecyyy #1{\numhead2{#1}} % normally calls numberedsubseczzz |
\def\numberedsubseczzz #1{\seccheck{subsection}% |
\def\numberedsubseczzz #1{\seccheck{subsection}% |
\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 % |
\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 % |
\subsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}% |
\subsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}% |
Line 1779 July\or August\or September\or October\o
|
Line 2603 July\or August\or September\or October\o
|
\penalty 10000 % |
\penalty 10000 % |
}} |
}} |
|
|
\outer\def\appendixsubsec{\parsearg\appendixsubseczzz} |
\outer\def\appendixsubsec{\parsearg\appendixsubsecyyy} |
|
\def\appendixsubsecyyy #1{\apphead2{#1}} % normally calls appendixsubseczzz |
\def\appendixsubseczzz #1{\seccheck{appendixsubsec}% |
\def\appendixsubseczzz #1{\seccheck{appendixsubsec}% |
\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 % |
\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 % |
\subsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}% |
\subsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}% |
Line 1792 July\or August\or September\or October\o
|
Line 2617 July\or August\or September\or October\o
|
\penalty 10000 % |
\penalty 10000 % |
}} |
}} |
|
|
\outer\def\unnumberedsubsec{\parsearg\unnumberedsubseczzz} |
\outer\def\unnumberedsubsec{\parsearg\unnumberedsubsecyyy} |
|
\def\unnumberedsubsecyyy #1{\unnmhead2{#1}} %normally calls unnumberedsubseczzz |
\def\unnumberedsubseczzz #1{\seccheck{unnumberedsubsec}% |
\def\unnumberedsubseczzz #1{\seccheck{unnumberedsubsec}% |
\plainsecheading {#1}\gdef\thissection{#1}% |
\plainsecheading {#1}\gdef\thissection{#1}% |
{\chapternofonts% |
{\chapternofonts% |
Line 1803 July\or August\or September\or October\o
|
Line 2629 July\or August\or September\or October\o
|
\penalty 10000 % |
\penalty 10000 % |
}} |
}} |
|
|
\outer\def\numberedsubsubsec{\parsearg\numberedsubsubseczzz} |
\outer\def\numberedsubsubsec{\parsearg\numberedsubsubsecyyy} |
|
\def\numberedsubsubsecyyy #1{\numhead3{#1}} % normally numberedsubsubseczzz |
\def\numberedsubsubseczzz #1{\seccheck{subsubsection}% |
\def\numberedsubsubseczzz #1{\seccheck{subsubsection}% |
\gdef\thissection{#1}\global\advance \subsubsecno by 1 % |
\gdef\thissection{#1}\global\advance \subsubsecno by 1 % |
\subsubsecheading {#1} |
\subsubsecheading {#1} |
Line 1819 July\or August\or September\or October\o
|
Line 2646 July\or August\or September\or October\o
|
\penalty 10000 % |
\penalty 10000 % |
}} |
}} |
|
|
\outer\def\appendixsubsubsec{\parsearg\appendixsubsubseczzz} |
\outer\def\appendixsubsubsec{\parsearg\appendixsubsubsecyyy} |
|
\def\appendixsubsubsecyyy #1{\apphead3{#1}} % normally appendixsubsubseczzz |
\def\appendixsubsubseczzz #1{\seccheck{appendixsubsubsec}% |
\def\appendixsubsubseczzz #1{\seccheck{appendixsubsubsec}% |
\gdef\thissection{#1}\global\advance \subsubsecno by 1 % |
\gdef\thissection{#1}\global\advance \subsubsecno by 1 % |
\subsubsecheading {#1} |
\subsubsecheading {#1} |
Line 1834 July\or August\or September\or October\o
|
Line 2662 July\or August\or September\or October\o
|
\penalty 10000 % |
\penalty 10000 % |
}} |
}} |
|
|
\outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz} |
\outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubsecyyy} |
|
\def\unnumberedsubsubsecyyy #1{\unnmhead3{#1}} %normally unnumberedsubsubseczzz |
\def\unnumberedsubsubseczzz #1{\seccheck{unnumberedsubsubsec}% |
\def\unnumberedsubsubseczzz #1{\seccheck{unnumberedsubsubsec}% |
\plainsecheading {#1}\gdef\thissection{#1}% |
\plainsecheading {#1}\gdef\thissection{#1}% |
{\chapternofonts% |
{\chapternofonts% |
Line 1987 July\or August\or September\or October\o
|
Line 2816 July\or August\or September\or October\o
|
\let\paragraphindent=\comment |
\let\paragraphindent=\comment |
|
|
% Section fonts are the base font at magstep2, which produces |
% Section fonts are the base font at magstep2, which produces |
% a size a bit more than 14 points in the default situation. |
% a size a bit more than 14 points in the default situation. |
|
|
\def\secheading #1#2#3{\secheadingi {#2.#3\enspace #1}} |
\def\secheading #1#2#3{\secheadingi {#2.#3\enspace #1}} |
\def\plainsecheading #1{\secheadingi {#1}} |
\def\plainsecheading #1{\secheadingi {#1}} |
Line 1999 July\or August\or September\or October\o
|
Line 2828 July\or August\or September\or October\o
|
\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000 } |
\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000 } |
|
|
|
|
% Subsection fonts are the base font at magstep1, |
% Subsection fonts are the base font at magstep1, |
% which produces a size of 12 points. |
% which produces a size of 12 points. |
|
|
\def\subsecheading #1#2#3#4{\subsecheadingi {#2.#3.#4\enspace #1}} |
\def\subsecheading #1#2#3#4{\subsecheadingi {#2.#3.#4\enspace #1}} |
Line 2029 July\or August\or September\or October\o
|
Line 2858 July\or August\or September\or October\o
|
|
|
\newskip\contentsrightmargin \contentsrightmargin=1in |
\newskip\contentsrightmargin \contentsrightmargin=1in |
\def\startcontents#1{% |
\def\startcontents#1{% |
|
\pagealignmacro |
|
\immediate\closeout \contentsfile |
\ifnum \pageno>0 |
\ifnum \pageno>0 |
\pageno = -1 % Request roman numbered pages. |
\pageno = -1 % Request roman numbered pages. |
\fi |
\fi |
\pagealignmacro |
% Don't need to put `Contents' or `Short Contents' in the headline. |
\immediate\closeout \contentsfile |
|
% Don't need to put `Contents' or `Short Contents' in the headline. |
|
% It is abundantly clear what they are. |
% It is abundantly clear what they are. |
\unnumbchapmacro{#1}\def\thischapter{}% |
\unnumbchapmacro{#1}\def\thischapter{}% |
\begingroup % Set up to handle contents files properly. |
\begingroup % Set up to handle contents files properly. |
\catcode`\\=0 \catcode`\{=1 \catcode`\}=2 \catcode`\@=11 |
\catcode`\\=0 \catcode`\{=1 \catcode`\}=2 \catcode`\@=11 |
|
\catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi |
\raggedbottom % Worry more about breakpoints than the bottom. |
\raggedbottom % Worry more about breakpoints than the bottom. |
\advance\hsize by -\contentsrightmargin % Don't use the full line length. |
\advance\hsize by -\contentsrightmargin % Don't use the full line length. |
} |
} |
|
|
|
|
% Normal (long) toc. |
% Normal (long) toc. |
\outer\def\contents{% |
\outer\def\contents{% |
\startcontents{Table of Contents}% |
\startcontents{\putwordTableofContents}% |
\input \jobname.toc |
\input \jobname.toc |
\endgroup |
\endgroup |
\vfill \eject |
\vfill \eject |
Line 2054 July\or August\or September\or October\o
|
Line 2884 July\or August\or September\or October\o
|
|
|
% And just the chapters. |
% And just the chapters. |
\outer\def\summarycontents{% |
\outer\def\summarycontents{% |
\startcontents{Short Contents}% |
\startcontents{\putwordShortContents}% |
% |
% |
\let\chapentry = \shortchapentry |
\let\chapentry = \shortchapentry |
\let\unnumbchapentry = \shortunnumberedentry |
\let\unnumbchapentry = \shortunnumberedentry |
Line 2085 July\or August\or September\or October\o
|
Line 2915 July\or August\or September\or October\o
|
|
|
% See comments in \dochapentry re vbox and related settings |
% See comments in \dochapentry re vbox and related settings |
\def\shortchapentry#1#2#3{% |
\def\shortchapentry#1#2#3{% |
\vbox{\hyphenpenalty=10000\tolerance=5000 |
\tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno{#3}}% |
\parindent=0pt\strut\raggedright |
|
{#2\labelspace #1}\dotfill\doshortpageno{#3}}% |
|
} |
} |
|
|
\def\unnumbchapentry#1#2{\dochapentry{#1}{#2}} |
% Typeset the label for a chapter or appendix for the short contents. |
\def\shortunnumberedentry#1#2{% |
% The arg is, e.g. `Appendix A' for an appendix, or `3' for a chapter. |
\vbox{\hyphenpenalty=10000\tolerance=5000 |
% We could simplify the code here by writing out an \appendixentry |
\parindent=0pt\strut\raggedright |
% command in the toc file for appendices, instead of using \chapentry |
#1\dotfill\doshortpageno{#2}}% |
% for both, but it doesn't seem worth it. |
|
\setbox0 = \hbox{\shortcontrm \putwordAppendix } |
|
\newdimen\shortappendixwidth \shortappendixwidth = \wd0 |
|
|
|
\def\shortchaplabel#1{% |
|
% We typeset #1 in a box of constant width, regardless of the text of |
|
% #1, so the chapter titles will come out aligned. |
|
\setbox0 = \hbox{#1}% |
|
\dimen0 = \ifdim\wd0 > \shortappendixwidth \shortappendixwidth \else 0pt \fi |
|
% |
|
% This space should be plenty, since a single number is .5em, and the |
|
% widest letter (M) is 1em, at least in the Computer Modern fonts. |
|
% (This space doesn't include the extra space that gets added after |
|
% the label; that gets put in in \shortchapentry above.) |
|
\advance\dimen0 by 1.1em |
|
\hbox to \dimen0{#1\hfil}% |
} |
} |
|
|
|
\def\unnumbchapentry#1#2{\dochapentry{#1}{#2}} |
|
\def\shortunnumberedentry#1#2{\tocentry{#1}{\doshortpageno{#2}}} |
|
|
% Sections. |
% Sections. |
\def\secentry#1#2#3#4{\dosecentry{#2.#3\labelspace#1}{#4}} |
\def\secentry#1#2#3#4{\dosecentry{#2.#3\labelspace#1}{#4}} |
\def\unnumbsecentry#1#2{\dosecentry{#1}{#2}} |
\def\unnumbsecentry#1#2{\dosecentry{#1}{#2}} |
Line 2114 July\or August\or September\or October\o
|
Line 2960 July\or August\or September\or October\o
|
% This parameter controls the indentation of the various levels. |
% This parameter controls the indentation of the various levels. |
\newdimen\tocindent \tocindent = 3pc |
\newdimen\tocindent \tocindent = 3pc |
|
|
% Now for the actual typesetting. In all these, #1 is the text and #2 is the |
% Now for the actual typesetting. In all these, #1 is the text and #2 is the |
% page number. |
% page number. |
% |
% |
% If the toc has to be broken over pages, we would want to be at chapters |
% If the toc has to be broken over pages, we would want to be at chapters |
% if at all possible; hence the \penalty. |
% if at all possible; hence the \penalty. |
\def\dochapentry#1#2{% |
\def\dochapentry#1#2{% |
\penalty-300 \vskip\baselineskip |
\penalty-300 \vskip\baselineskip |
% This \vbox (and similar ones in dosecentry etc.) used to be a |
\begingroup |
% \line; changed to permit linebreaks for long headings. See |
\chapentryfonts |
% comments above \majorheading. Here we also use \strut to |
\tocentry{#1}{\dopageno{#2}}% |
% keep the top end of the vbox from jamming up against the previous |
\endgroup |
% entry in the table of contents. |
|
\vbox{\chapentryfonts |
|
\hyphenpenalty=10000\tolerance=5000 % this line and next introduced |
|
\parindent=0pt\strut\raggedright % with \line -> \vbox change |
|
#1\dotfill |
|
\dopageno{#2}}% |
|
\nobreak\vskip .25\baselineskip |
\nobreak\vskip .25\baselineskip |
} |
} |
|
|
\def\dosecentry#1#2{% |
\def\dosecentry#1#2{\begingroup |
\vbox{\secentryfonts \leftskip=\tocindent |
\secentryfonts \leftskip=\tocindent |
\hyphenpenalty=10000\tolerance=5000 |
\tocentry{#1}{\dopageno{#2}}% |
\parindent=0pt\strut\raggedright #1\dotfill |
\endgroup} |
\dopageno{#2}}% |
|
} |
\def\dosubsecentry#1#2{\begingroup |
|
\subsecentryfonts \leftskip=2\tocindent |
\def\dosubsecentry#1#2{% |
\tocentry{#1}{\dopageno{#2}}% |
\vbox{\subsecentryfonts \leftskip=2\tocindent |
\endgroup} |
\hyphenpenalty=10000\tolerance=5000 |
|
\parindent=0pt\strut\raggedright #1\dotfill |
\def\dosubsubsecentry#1#2{\begingroup |
\dopageno{#2}}% |
\subsubsecentryfonts \leftskip=3\tocindent |
} |
\tocentry{#1}{\dopageno{#2}}% |
|
\endgroup} |
\def\dosubsubsecentry#1#2{% |
|
\vbox{\subsubsecentryfonts \leftskip=3\tocindent |
% Final typesetting of a toc entry; we use the same \entry macro as for |
\hyphenpenalty=10000\tolerance=5000 |
% the index entries, but we want to suppress hyphenation here. (We |
\parindent=0pt\strut\raggedright #1\dotfill |
% can't do that in the \entry macro, since index entries might consist |
\dopageno{#2}}% |
% of hyphenated-identifiers-that-do-not-fit-on-a-line-and-nothing-else.) |
} |
% |
|
\def\tocentry#1#2{\begingroup |
|
\hyphenpenalty = 10000 |
|
\entry{#1}{#2}% |
|
\endgroup} |
|
|
% Space between chapter (or whatever) number and the title. |
% Space between chapter (or whatever) number and the title. |
\def\labelspace{\hskip1em \relax} |
\def\labelspace{\hskip1em \relax} |
Line 2169 July\or August\or September\or October\o
|
Line 3013 July\or August\or September\or October\o
|
|
|
\message{environments,} |
\message{environments,} |
|
|
% Since these characters are used in examples, it should be an even number of |
% Since these characters are used in examples, it should be an even number of |
% \tt widths. Each \tt character is 1en, so two makes it 1em. |
% \tt widths. Each \tt character is 1en, so two makes it 1em. |
% Furthermore, these definitions must come after we define our fonts. |
% Furthermore, these definitions must come after we define our fonts. |
\newbox\dblarrowbox \newbox\longdblarrowbox |
\newbox\dblarrowbox \newbox\longdblarrowbox |
Line 2233 July\or August\or September\or October\o
|
Line 3077 July\or August\or September\or October\o
|
\catcode`\>=12 |
\catcode`\>=12 |
\escapechar=`\\ |
\escapechar=`\\ |
% |
% |
|
\let\~=\ptextilde |
\let\{=\ptexlbrace |
\let\{=\ptexlbrace |
\let\}=\ptexrbrace |
\let\}=\ptexrbrace |
\let\.=\ptexdot |
\let\.=\ptexdot |
Line 2252 July\or August\or September\or October\o
|
Line 3097 July\or August\or September\or October\o
|
% Amount to narrow the margins by for @lisp. |
% Amount to narrow the margins by for @lisp. |
\newskip\lispnarrowing \lispnarrowing=0.4in |
\newskip\lispnarrowing \lispnarrowing=0.4in |
|
|
% This is the definition that ^M gets inside @lisp |
% This is the definition that ^^M gets inside @lisp, @example, and other |
% phr: changed space to \null, to avoid overfull hbox problems. |
% such environments. \null is better than a space, since it doesn't |
{\obeyspaces% |
% have any width. |
\gdef\lisppar{\null\endgraf}} |
\def\lisppar{\null\endgraf} |
|
|
% Cause \obeyspaces to make each Space cause a word-separation |
% Make each space character in the input produce a normal interword |
% rather than the default which is that it acts punctuation. |
% space in the output. Don't allow a line break at this space, as this |
% This is because space in tt font looks funny. |
% is used only in environments like @example, where each line of input |
|
% should produce a line of output anyway. |
|
% |
{\obeyspaces % |
{\obeyspaces % |
\gdef\sepspaces{\def {\ }}} |
\gdef\sepspaces{\obeyspaces\let =\tie}} |
|
|
\newskip\aboveenvskipamount \aboveenvskipamount= 0pt |
% Define \obeyedspace to be our active space, whatever it is. This is |
\def\aboveenvbreak{{\advance\aboveenvskipamount by \parskip |
% for use in \parsearg. |
\endgraf \ifdim\lastskip<\aboveenvskipamount |
{\sepspaces% |
\removelastskip \penalty-50 \vskip\aboveenvskipamount \fi}} |
\global\let\obeyedspace= } |
|
|
|
% This space is always present above and below environments. |
|
\newskip\envskipamount \envskipamount = 0pt |
|
|
|
% Make spacing and below environment symmetrical. We use \parskip here |
|
% to help in doing that, since in @example-like environments \parskip |
|
% is reset to zero; thus the \afterenvbreak inserts no space -- but the |
|
% start of the next paragraph will insert \parskip |
|
% |
|
\def\aboveenvbreak{{\advance\envskipamount by \parskip |
|
\endgraf \ifdim\lastskip<\envskipamount |
|
\removelastskip \penalty-50 \vskip\envskipamount \fi}} |
|
|
\def\afterenvbreak{\endgraf \ifdim\lastskip<\aboveenvskipamount |
\let\afterenvbreak = \aboveenvbreak |
\removelastskip \penalty-50 \vskip\aboveenvskipamount \fi} |
|
|
|
% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins. |
% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins. |
\let\nonarrowing=\relax |
\let\nonarrowing=\relax |
Line 2299 July\or August\or September\or October\o
|
Line 3157 July\or August\or September\or October\o
|
\begingroup |
\begingroup |
\lskip=\leftskip \rskip=\rightskip |
\lskip=\leftskip \rskip=\rightskip |
\leftskip=0pt\rightskip=0pt %we want these *outside*. |
\leftskip=0pt\rightskip=0pt %we want these *outside*. |
\cartinner=\hsize \advance\cartinner by-\lskip |
\cartinner=\hsize \advance\cartinner by-\lskip |
\advance\cartinner by-\rskip |
\advance\cartinner by-\rskip |
\cartouter=\hsize |
\cartouter=\hsize |
\advance\cartouter by 18pt % allow for 3pt kerns on either |
\advance\cartouter by 18pt % allow for 3pt kerns on either |
Line 2332 July\or August\or September\or October\o
|
Line 3190 July\or August\or September\or October\o
|
\cartbot |
\cartbot |
\egroup |
\egroup |
\endgroup |
\endgroup |
}} |
}} |
|
|
\def\lisp{\aboveenvbreak |
|
\begingroup\inENV % This group ends at the end of the @lisp body |
% This macro is called at the beginning of all the @example variants, |
\hfuzz=12truept % Don't be fussy |
% inside a group. |
% Make spaces be word-separators rather than space tokens. |
\def\nonfillstart{% |
\sepspaces % |
\aboveenvbreak |
% Single space lines |
\inENV % This group ends at the end of the body |
\singlespace % |
\hfuzz = 12pt % Don't be fussy |
% The following causes blank lines not to be ignored |
\sepspaces % Make spaces be word-separators rather than space tokens. |
% by adding a space to the end of each line. |
\singlespace |
\let\par=\lisppar |
\let\par = \lisppar % don't ignore blank lines |
\def\Elisp{\endgroup\afterenvbreak}% |
\obeylines % each line of input is a line of output |
\parskip=0pt |
\parskip = 0pt |
% @cartouche defines \nonarrowing to inhibit narrowing |
\parindent = 0pt |
% at next level down. |
\emergencystretch = 0pt % don't try to avoid overfull boxes |
\ifx\nonarrowing\relax |
% @cartouche defines \nonarrowing to inhibit narrowing |
\advance \leftskip by \lispnarrowing |
% at next level down. |
\exdentamount=\lispnarrowing |
\ifx\nonarrowing\relax |
\let\exdent=\nofillexdent |
\advance \leftskip by \lispnarrowing |
\let\nonarrowing=\relax |
\exdentamount=\lispnarrowing |
\fi |
\let\exdent=\nofillexdent |
\parindent=0pt |
\let\nonarrowing=\relax |
\obeyspaces \obeylines \tt \rawbackslash |
\fi |
\def\next##1{}\next} |
} |
|
|
|
% To ending an @example-like environment, we first end the paragraph |
\let\example=\lisp |
% (via \afterenvbreak's vertical glue), and then the group. That way we |
\def\Eexample{\Elisp} |
% keep the zero \parskip that the environments set -- \parskip glue |
|
% will be inserted at the beginning of the next paragraph in the |
\let\smallexample=\lisp |
% document, after the environment. |
\def\Esmallexample{\Elisp} |
% |
|
\def\nonfillfinish{\afterenvbreak\endgroup}% |
% Macro for 9 pt. examples, necessary to print with 5" lines. |
|
% From Pavel@xerox. This is not really used unless the |
% This macro is |
% @smallbook command is given. |
\def\lisp{\begingroup |
|
\nonfillstart |
\def\smalllispx{\aboveenvbreak\begingroup\inENV |
\let\Elisp = \nonfillfinish |
% This group ends at the end of the @lisp body |
\tt |
\hfuzz=12truept % Don't be fussy |
\rawbackslash % have \ input char produce \ char from current font |
% Make spaces be word-separators rather than space tokens. |
\gobble |
\sepspaces % |
} |
% Single space lines |
|
\singlespace % |
% Define the \E... control sequence only if we are inside the |
% The following causes blank lines not to be ignored |
% environment, so the error checking in \end will work. |
% by adding a space to the end of each line. |
% |
\let\par=\lisppar |
% We must call \lisp last in the definition, since it reads the |
\def\Esmalllisp{\endgroup\afterenvbreak}% |
% return following the @example (or whatever) command. |
%%%% Smaller baseline skip for small examples. |
% |
\baselineskip 10pt |
\def\example{\begingroup \def\Eexample{\nonfillfinish\endgroup}\lisp} |
\parskip=0pt |
\def\smallexample{\begingroup \def\Esmallexample{\nonfillfinish\endgroup}\lisp} |
% @cartouche defines \nonarrowing to inhibit narrowing |
\def\smalllisp{\begingroup \def\Esmalllisp{\nonfillfinish\endgroup}\lisp} |
% at next level down. |
|
\ifx\nonarrowing\relax |
% @smallexample and @smalllisp. This is not used unless the @smallbook |
\advance \leftskip by \lispnarrowing |
% command is given. Originally contributed by Pavel@xerox. |
\exdentamount=\lispnarrowing |
% |
\let\exdent=\nofillexdent |
\def\smalllispx{\begingroup |
\let\nonarrowing=\relax |
\nonfillstart |
\fi |
\let\Esmalllisp = \nonfillfinish |
\parindent=0pt |
\let\Esmallexample = \nonfillfinish |
\obeyspaces \obeylines \ninett \indexfonts \rawbackslash |
% |
\def\next##1{}\next} |
% Smaller interline space and fonts for small examples. |
|
\setleading{10pt}% |
|
\indexfonts \tt |
|
\rawbackslash % make \ output the \ character from the current font (tt) |
|
\gobble |
|
} |
|
|
% This is @display; same as @lisp except use roman font. |
% This is @display; same as @lisp except use roman font. |
|
% |
|
\def\display{\begingroup |
|
\nonfillstart |
|
\let\Edisplay = \nonfillfinish |
|
\gobble |
|
} |
|
|
\def\display{\begingroup\inENV %This group ends at the end of the @display body |
% This is @format; same as @display except don't narrow margins. |
\aboveenvbreak |
% |
% Make spaces be word-separators rather than space tokens. |
\def\format{\begingroup |
\sepspaces % |
\let\nonarrowing = t |
% Single space lines |
\nonfillstart |
\singlespace % |
\let\Eformat = \nonfillfinish |
% The following causes blank lines not to be ignored |
\gobble |
% by adding a space to the end of each line. |
} |
\let\par=\lisppar |
|
\def\Edisplay{\endgroup\afterenvbreak}% |
|
\parskip=0pt |
|
% @cartouche defines \nonarrowing to inhibit narrowing |
|
% at next level down. |
|
\ifx\nonarrowing\relax |
|
\advance \leftskip by \lispnarrowing |
|
\exdentamount=\lispnarrowing |
|
\let\exdent=\nofillexdent |
|
\let\nonarrowing=\relax |
|
\fi |
|
\parindent=0pt |
|
\obeyspaces \obeylines |
|
\def\next##1{}\next} |
|
|
|
% This is @format; same as @lisp except use roman font and don't narrow margins |
|
|
|
\def\format{\begingroup\inENV %This group ends at the end of the @format body |
|
\aboveenvbreak |
|
% Make spaces be word-separators rather than space tokens. |
|
\sepspaces % |
|
\singlespace % |
|
% The following causes blank lines not to be ignored |
|
% by adding a space to the end of each line. |
|
\let\par=\lisppar |
|
\def\Eformat{\endgroup\afterenvbreak} |
|
\parskip=0pt \parindent=0pt |
|
\obeyspaces \obeylines |
|
\def\next##1{}\next} |
|
|
|
% @flushleft and @flushright |
|
|
|
\def\flushleft{% |
|
\begingroup\inENV %This group ends at the end of the @format body |
|
\aboveenvbreak |
|
% Make spaces be word-separators rather than space tokens. |
|
\sepspaces % |
|
% The following causes blank lines not to be ignored |
|
% by adding a space to the end of each line. |
|
% This also causes @ to work when the directive name |
|
% is terminated by end of line. |
|
\let\par=\lisppar |
|
\def\Eflushleft{\endgroup\afterenvbreak}% |
|
\parskip=0pt \parindent=0pt |
|
\obeyspaces \obeylines |
|
\def\next##1{}\next} |
|
|
|
\def\flushright{% |
|
\begingroup\inENV %This group ends at the end of the @format body |
|
\aboveenvbreak |
|
% Make spaces be word-separators rather than space tokens. |
|
\sepspaces % |
|
% The following causes blank lines not to be ignored |
|
% by adding a space to the end of each line. |
|
% This also causes @ to work when the directive name |
|
% is terminated by end of line. |
|
\let\par=\lisppar |
|
\def\Eflushright{\endgroup\afterenvbreak}% |
|
\parskip=0pt \parindent=0pt |
|
\advance \leftskip by 0pt plus 1fill |
|
\obeyspaces \obeylines |
|
\def\next##1{}\next} |
|
|
|
% @quotation - narrow the margins. |
% @flushleft (same as @format) and @flushright. |
|
% |
|
\def\flushleft{\begingroup |
|
\let\nonarrowing = t |
|
\nonfillstart |
|
\let\Eflushleft = \nonfillfinish |
|
\gobble |
|
} |
|
\def\flushright{\begingroup |
|
\let\nonarrowing = t |
|
\nonfillstart |
|
\let\Eflushright = \nonfillfinish |
|
\advance\leftskip by 0pt plus 1fill |
|
\gobble} |
|
|
|
% @quotation does normal linebreaking (hence we can't use \nonfillstart) |
|
% and narrows the margins. |
|
% |
\def\quotation{% |
\def\quotation{% |
\begingroup\inENV %This group ends at the end of the @quotation body |
\begingroup\inENV %This group ends at the end of the @quotation body |
{\parskip=0pt % because we will skip by \parskip too, later |
{\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip |
\aboveenvbreak}% |
\singlespace |
\singlespace |
\parindent=0pt |
\parindent=0pt |
% We have retained a nonzero parskip for the environment, since we're |
\def\Equotation{\par\endgroup\afterenvbreak}% |
% doing normal filling. So to avoid extra space below the environment... |
% @cartouche defines \nonarrowing to inhibit narrowing |
\def\Equotation{\parskip = 0pt \nonfillfinish}% |
% at next level down. |
% |
\ifx\nonarrowing\relax |
% @cartouche defines \nonarrowing to inhibit narrowing at next level down. |
\advance \leftskip by \lispnarrowing |
\ifx\nonarrowing\relax |
\advance \rightskip by \lispnarrowing |
\advance\leftskip by \lispnarrowing |
\exdentamount=\lispnarrowing |
\advance\rightskip by \lispnarrowing |
\let\nonarrowing=\relax |
\exdentamount = \lispnarrowing |
\fi} |
\let\nonarrowing = \relax |
|
\fi |
|
} |
|
|
\message{defuns,} |
\message{defuns,} |
% Define formatter for defuns |
% Define formatter for defuns |
Line 2502 July\or August\or September\or October\o
|
Line 3327 July\or August\or September\or October\o
|
\def\activeparens{% |
\def\activeparens{% |
\catcode`\(=\active \catcode`\)=\active \catcode`\&=\active |
\catcode`\(=\active \catcode`\)=\active \catcode`\&=\active |
\catcode`\[=\active \catcode`\]=\active} |
\catcode`\[=\active \catcode`\]=\active} |
|
|
|
% Make control sequences which act like normal parenthesis chars. |
|
\let\lparen = ( \let\rparen = ) |
|
|
{\activeparens % Now, smart parens don't turn on until &foo (see \amprm) |
{\activeparens % Now, smart parens don't turn on until &foo (see \amprm) |
|
|
|
% Be sure that we always have a definition for `(', etc. For example, |
|
% if the fn name has parens in it, \boldbrax will not be in effect yet, |
|
% so TeX would otherwise complain about undefined control sequence. |
|
\global\let(=\lparen \global\let)=\rparen |
|
\global\let[=\lbrack \global\let]=\rbrack |
|
|
\gdef\functionparens{\boldbrax\let&=\amprm\parencount=0 } |
\gdef\functionparens{\boldbrax\let&=\amprm\parencount=0 } |
\gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} |
\gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} |
|
|
Line 2552 July\or August\or September\or October\o
|
Line 3388 July\or August\or September\or October\o
|
\advance \hsize by -\dimen2 \advance \hsize by -\dimen3 |
\advance \hsize by -\dimen2 \advance \hsize by -\dimen3 |
\rlap{\rightline{{\rm #2}\hskip \deftypemargin}}}% |
\rlap{\rightline{{\rm #2}\hskip \deftypemargin}}}% |
% Make all lines underfull and no complaints: |
% Make all lines underfull and no complaints: |
\tolerance=10000 \hbadness=10000 |
\tolerance=10000 \hbadness=10000 |
\advance\leftskip by -\defbodyindent |
\advance\leftskip by -\defbodyindent |
\exdentamount=\defbodyindent |
\exdentamount=\defbodyindent |
{\df #1}\enskip % Generate function name |
{\df #1}\enskip % Generate function name |
Line 2574 July\or August\or September\or October\o
|
Line 3410 July\or August\or September\or October\o
|
\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent |
\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent |
\exdentamount=\defbodyindent |
\exdentamount=\defbodyindent |
\begingroup % |
\begingroup % |
\catcode 61=\active % |
\catcode 61=\active % 61 is `=' |
\obeylines\activeparens\spacesplit#3} |
\obeylines\activeparens\spacesplit#3} |
|
|
\def\defmethparsebody #1#2#3#4 {\begingroup\inENV % |
\def\defmethparsebody #1#2#3#4 {\begingroup\inENV % |
Line 2617 July\or August\or September\or October\o
|
Line 3453 July\or August\or September\or October\o
|
\catcode 61=\active % |
\catcode 61=\active % |
\obeylines\spacesplit#3} |
\obeylines\spacesplit#3} |
|
|
\def\defvrparsebody #1#2#3#4 {\begingroup\inENV % |
% This is used for \def{tp,vr}parsebody. It could probably be used for |
\medbreak % |
% some of the others, too, with some judicious conditionals. |
% Define the end token that this defining construct specifies |
% |
% so that it will exit this group. |
\def\parsebodycommon#1#2#3{% |
\def#1{\endgraf\endgroup\medbreak}% |
\begingroup\inENV % |
\def#2##1 {\begingroup\obeylines\spacesplit{#3{##1}}}% |
\medbreak % |
\parindent=0in |
% Define the end token that this defining construct specifies |
\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent |
% so that it will exit this group. |
\exdentamount=\defbodyindent |
\def#1{\endgraf\endgroup\medbreak}% |
\begingroup\obeylines\spacesplit{#3{#4}}} |
\def#2##1 {\begingroup\obeylines\spacesplit{#3{##1}}}% |
|
\parindent=0in |
|
\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent |
|
\exdentamount=\defbodyindent |
|
\begingroup\obeylines |
|
} |
|
|
|
\def\defvrparsebody#1#2#3#4 {% |
|
\parsebodycommon{#1}{#2}{#3}% |
|
\spacesplit{#3{#4}}% |
|
} |
|
|
|
% This loses on `@deftp {Data Type} {struct termios}' -- it thinks the |
|
% type is just `struct', because we lose the braces in `{struct |
|
% termios}' when \spacesplit reads its undelimited argument. Sigh. |
|
% \let\deftpparsebody=\defvrparsebody |
|
% |
|
% So, to get around this, we put \empty in with the type name. That |
|
% way, TeX won't find exactly `{...}' as an undelimited argument, and |
|
% won't strip off the braces. |
|
% |
|
\def\deftpparsebody #1#2#3#4 {% |
|
\parsebodycommon{#1}{#2}{#3}% |
|
\spacesplit{\parsetpheaderline{#3{#4}}}\empty |
|
} |
|
|
|
% Fine, but then we have to eventually remove the \empty *and* the |
|
% braces (if any). That's what this does, putting the result in \tptemp. |
|
% |
|
\def\removeemptybraces\empty#1\relax{\def\tptemp{#1}}% |
|
|
|
% After \spacesplit has done its work, this is called -- #1 is the final |
|
% thing to call, #2 the type name (which starts with \empty), and #3 |
|
% (which might be empty) the arguments. |
|
% |
|
\def\parsetpheaderline#1#2#3{% |
|
\removeemptybraces#2\relax |
|
#1{\tptemp}{#3}% |
|
}% |
|
|
\def\defopvarparsebody #1#2#3#4#5 {\begingroup\inENV % |
\def\defopvarparsebody #1#2#3#4#5 {\begingroup\inENV % |
\medbreak % |
\medbreak % |
Line 2676 July\or August\or September\or October\o
|
Line 3550 July\or August\or September\or October\o
|
% Expand, preventing hyphenation at `-' chars. |
% Expand, preventing hyphenation at `-' chars. |
% Note that groups don't affect changes in \hyphenchar. |
% Note that groups don't affect changes in \hyphenchar. |
\functionparens |
\functionparens |
\code{#1}% |
\tclose{#1}% avoid \code because of side effects on active chars |
\interlinepenalty=10000 |
\interlinepenalty=10000 |
\advance\rightskip by 0pt plus 1fil |
\advance\rightskip by 0pt plus 1fil |
\endgraf\penalty 10000\vskip -\parskip\penalty 10000% |
\endgraf\penalty 10000\vskip -\parskip\penalty 10000% |
Line 2712 July\or August\or September\or October\o
|
Line 3586 July\or August\or September\or October\o
|
% #1 is the data type, #2 the name, #3 the args. |
% #1 is the data type, #2 the name, #3 the args. |
\def\deftypefunheaderx #1#2 #3\relax{% |
\def\deftypefunheaderx #1#2 #3\relax{% |
\doind {fn}{\code{#2}}% Make entry in function index |
\doind {fn}{\code{#2}}% Make entry in function index |
\begingroup\defname {\code{#1} #2}{Function}% |
\begingroup\defname {\defheaderxcond#1\relax$$$#2}{Function}% |
\deftypefunargs {#3}\endgroup % |
\deftypefunargs {#3}\endgroup % |
\catcode 61=\other % Turn off change made in \defparsebody |
\catcode 61=\other % Turn off change made in \defparsebody |
} |
} |
Line 2721 July\or August\or September\or October\o
|
Line 3595 July\or August\or September\or October\o
|
|
|
\def\deftypefn{\defmethparsebody\Edeftypefn\deftypefnx\deftypefnheader} |
\def\deftypefn{\defmethparsebody\Edeftypefn\deftypefnx\deftypefnheader} |
|
|
|
% \defheaderxcond#1\relax$$$ |
|
% puts #1 in @code, followed by a space, but does nothing if #1 is null. |
|
\def\defheaderxcond#1#2$$${\ifx#1\relax\else\code{#1#2} \fi} |
|
|
% #1 is the classification. #2 is the data type. #3 is the name and args. |
% #1 is the classification. #2 is the data type. #3 is the name and args. |
\def\deftypefnheader #1#2#3{\deftypefnheaderx{#1}{#2}#3 \relax} |
\def\deftypefnheader #1#2#3{\deftypefnheaderx{#1}{#2}#3 \relax} |
% #1 is the classification, #2 the data type, #3 the name, #4 the args. |
% #1 is the classification, #2 the data type, #3 the name, #4 the args. |
\def\deftypefnheaderx #1#2#3 #4\relax{% |
\def\deftypefnheaderx #1#2#3 #4\relax{% |
\doind {fn}{\code{#3}}% Make entry in function index |
\doind {fn}{\code{#3}}% Make entry in function index |
\begingroup\defname {\code{#2} #3}{#1}% |
\begingroup |
|
\normalparens % notably, turn off `&' magic, which prevents |
|
% at least some C++ text from working |
|
\defname {\defheaderxcond#2\relax$$$#3}{#1}% |
\deftypefunargs {#4}\endgroup % |
\deftypefunargs {#4}\endgroup % |
\catcode 61=\other % Turn off change made in \defparsebody |
\catcode 61=\other % Turn off change made in \defparsebody |
} |
} |
Line 2854 July\or August\or September\or October\o
|
Line 3735 July\or August\or September\or October\o
|
% #1 is the data type. #2 is the name. |
% #1 is the data type. #2 is the name. |
\def\deftypevarheader #1#2{% |
\def\deftypevarheader #1#2{% |
\doind {vr}{\code{#2}}% Make entry in variables index |
\doind {vr}{\code{#2}}% Make entry in variables index |
\begingroup\defname {\code{#1} #2}{Variable}% |
\begingroup\defname {\defheaderxcond#1\relax$$$#2}{Variable}% |
\interlinepenalty=10000 |
\interlinepenalty=10000 |
\endgraf\penalty 10000\vskip -\parskip\penalty 10000 |
\endgraf\penalty 10000\vskip -\parskip\penalty 10000 |
\endgroup} |
\endgroup} |
Line 2864 July\or August\or September\or October\o
|
Line 3745 July\or August\or September\or October\o
|
\def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader} |
\def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader} |
|
|
\def\deftypevrheader #1#2#3{\doind {vr}{\code{#3}}% |
\def\deftypevrheader #1#2#3{\doind {vr}{\code{#3}}% |
\begingroup\defname {\code{#2} #3}{#1} |
\begingroup\defname {\defheaderxcond#2\relax$$$#3}{#1} |
\interlinepenalty=10000 |
\interlinepenalty=10000 |
\endgraf\penalty 10000\vskip -\parskip\penalty 10000 |
\endgraf\penalty 10000\vskip -\parskip\penalty 10000 |
\endgroup} |
\endgroup} |
Line 2885 July\or August\or September\or October\o
|
Line 3766 July\or August\or September\or October\o
|
|
|
% @deftp Class window height width ... |
% @deftp Class window height width ... |
|
|
\def\deftp{\defvrparsebody\Edeftp\deftpx\deftpheader} |
\def\deftp{\deftpparsebody\Edeftp\deftpx\deftpheader} |
|
|
\def\deftpheader #1#2#3{\doind {tp}{\code{#2}}% |
\def\deftpheader #1#2#3{\doind {tp}{\code{#2}}% |
\begingroup\defname {#2}{#1}\deftpargs{#3}\endgroup} |
\begingroup\defname {#2}{#1}\deftpargs{#3}\endgroup} |
Line 2905 July\or August\or September\or October\o
|
Line 3786 July\or August\or September\or October\o
|
% \setref{foo} defines a cross-reference point named foo. |
% \setref{foo} defines a cross-reference point named foo. |
|
|
\def\setref#1{% |
\def\setref#1{% |
%\dosetq{#1-title}{Ytitle}% |
\dosetq{#1-title}{Ytitle}% |
\dosetq{#1-pg}{Ypagenumber}% |
\dosetq{#1-pg}{Ypagenumber}% |
\dosetq{#1-snt}{Ysectionnumberandtype}} |
\dosetq{#1-snt}{Ysectionnumberandtype}} |
|
|
\def\unnumbsetref#1{% |
\def\unnumbsetref#1{% |
%\dosetq{#1-title}{Ytitle}% |
\dosetq{#1-title}{Ytitle}% |
\dosetq{#1-pg}{Ypagenumber}% |
\dosetq{#1-pg}{Ypagenumber}% |
\dosetq{#1-snt}{Ynothing}} |
\dosetq{#1-snt}{Ynothing}} |
|
|
\def\appendixsetref#1{% |
\def\appendixsetref#1{% |
%\dosetq{#1-title}{Ytitle}% |
\dosetq{#1-title}{Ytitle}% |
\dosetq{#1-pg}{Ypagenumber}% |
\dosetq{#1-pg}{Ypagenumber}% |
\dosetq{#1-snt}{Yappendixletterandtype}} |
\dosetq{#1-snt}{Yappendixletterandtype}} |
|
|
Line 2924 July\or August\or September\or October\o
|
Line 3805 July\or August\or September\or October\o
|
% cross-reference, #3 the printed node name, #4 the name of the Info |
% cross-reference, #3 the printed node name, #4 the name of the Info |
% file, #5 the name of the printed manual. All but the node name can be |
% file, #5 the name of the printed manual. All but the node name can be |
% omitted. |
% omitted. |
% |
|
\def\pxref#1{see \xrefX[#1,,,,,,,]} |
|
\def\xref#1{See \xrefX[#1,,,,,,,]} |
|
\def\ref#1{\xrefX[#1,,,,,,,]} |
|
\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup% |
|
\def\printedmanual{\ignorespaces #5}% |
|
\def\printednodename{\ignorespaces #3}% |
|
% |
|
\setbox1=\hbox{\printedmanual}% |
|
\setbox0=\hbox{\printednodename}% |
|
\ifdim \wd0=0pt% |
|
\def\printednodename{\ignorespaces #1}% |
|
%%% Uncommment the following line to make the actual chapter or section title |
|
%%% appear inside the square brackets. |
|
%\def\printednodename{#1-title}% |
|
\fi% |
|
% |
% |
% |
\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]} |
% If we use \unhbox0 and \unhbox1 to print the node names, TeX does |
\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} |
% not insert empty discretionaries after hyphens, which means that it |
\def\ref#1{\xrefX[#1,,,,,,,]} |
% will not find a line break at a hyphen in a node names. Since some |
\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup |
% manuals are best written with fairly long node names, containing |
\def\printedmanual{\ignorespaces #5}% |
% hyphens, this is a loss. Therefore, we simply give the text of |
\def\printednodename{\ignorespaces #3}% |
% the node name again, so it is as if TeX is seeing it for the first |
\setbox1=\hbox{\printedmanual}% |
% time. |
\setbox0=\hbox{\printednodename}% |
\ifdim \wd1>0pt |
\ifdim \wd0 = 0pt |
section ``\printednodename'' in \cite{\printedmanual}% |
% No printed node name was explicitly given. |
\else% |
\ifx\SETxref-automatic-section-title\relax % |
\turnoffactive% |
% Use the actual chapter/section title appear inside |
\refx{#1-snt}{} [\printednodename], page\tie\refx{#1-pg}{}% |
% the square brackets. Use the real section title if we have it. |
\fi |
\ifdim \wd1>0pt% |
|
% It is in another manual, so we don't have it. |
|
\def\printednodename{\ignorespaces #1}% |
|
\else |
|
\ifhavexrefs |
|
% We know the real title if we have the xref values. |
|
\def\printednodename{\refx{#1-title}}% |
|
\else |
|
% Otherwise just copy the Info node name. |
|
\def\printednodename{\ignorespaces #1}% |
|
\fi% |
|
\fi |
|
\def\printednodename{#1-title}% |
|
\else |
|
% Use the node name inside the square brackets. |
|
\def\printednodename{\ignorespaces #1}% |
|
\fi |
|
\fi |
|
% |
|
% If we use \unhbox0 and \unhbox1 to print the node names, TeX does not |
|
% insert empty discretionaries after hyphens, which means that it will |
|
% not find a line break at a hyphen in a node names. Since some manuals |
|
% are best written with fairly long node names, containing hyphens, this |
|
% is a loss. Therefore, we give the text of the node name again, so it |
|
% is as if TeX is seeing it for the first time. |
|
\ifdim \wd1 > 0pt |
|
\putwordsection{} ``\printednodename'' in \cite{\printedmanual}% |
|
\else |
|
% _ (for example) has to be the character _ for the purposes of the |
|
% control sequence corresponding to the node, but it has to expand |
|
% into the usual \leavevmode...\vrule stuff for purposes of |
|
% printing. So we \turnoffactive for the \refx-snt, back on for the |
|
% printing, back off for the \refx-pg. |
|
{\turnoffactive \refx{#1-snt}{}}% |
|
\space [\printednodename],\space |
|
\turnoffactive \putwordpage\tie\refx{#1-pg}{}% |
|
\fi |
\endgroup} |
\endgroup} |
|
|
% \dosetq is the interface for calls from other macros |
% \dosetq is the interface for calls from other macros |
|
|
% Use \turnoffactive so that punctuation chars such as underscore |
% Use \turnoffactive so that punctuation chars such as underscore |
% work in node names. |
% work in node names. |
\def\dosetq #1#2{{\let\folio=0 \turnoffactive% |
\def\dosetq #1#2{{\let\folio=0 \turnoffactive \auxhat% |
\edef\next{\write\auxfile{\internalsetq {#1}{#2}}}% |
\edef\next{\write\auxfile{\internalsetq {#1}{#2}}}% |
\next}} |
\next}} |
|
|
Line 2975 section ``\printednodename'' in \cite{\p
|
Line 3876 section ``\printednodename'' in \cite{\p
|
|
|
\def\Ypagenumber{\folio} |
\def\Ypagenumber{\folio} |
|
|
\def\Ytitle{\thischapter} |
\def\Ytitle{\thissection} |
|
|
\def\Ynothing{} |
\def\Ynothing{} |
|
|
\def\Ysectionnumberandtype{% |
\def\Ysectionnumberandtype{% |
\ifnum\secno=0 Chapter\xreftie\the\chapno % |
\ifnum\secno=0 \putwordChapter\xreftie\the\chapno % |
\else \ifnum \subsecno=0 Section\xreftie\the\chapno.\the\secno % |
\else \ifnum \subsecno=0 \putwordSection\xreftie\the\chapno.\the\secno % |
\else \ifnum \subsubsecno=0 % |
\else \ifnum \subsubsecno=0 % |
Section\xreftie\the\chapno.\the\secno.\the\subsecno % |
\putwordSection\xreftie\the\chapno.\the\secno.\the\subsecno % |
\else % |
\else % |
Section\xreftie\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno % |
\putwordSection\xreftie\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno % |
\fi \fi \fi } |
\fi \fi \fi } |
|
|
\def\Yappendixletterandtype{% |
\def\Yappendixletterandtype{% |
\ifnum\secno=0 Appendix\xreftie'char\the\appendixno{}% |
\ifnum\secno=0 \putwordAppendix\xreftie'char\the\appendixno{}% |
\else \ifnum \subsecno=0 Section\xreftie'char\the\appendixno.\the\secno % |
\else \ifnum \subsecno=0 \putwordSection\xreftie'char\the\appendixno.\the\secno % |
\else \ifnum \subsubsecno=0 % |
\else \ifnum \subsubsecno=0 % |
Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno % |
\putwordSection\xreftie'char\the\appendixno.\the\secno.\the\subsecno % |
\else % |
\else % |
Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno % |
\putwordSection\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno % |
\fi \fi \fi } |
\fi \fi \fi } |
|
|
\gdef\xreftie{'tie} |
\gdef\xreftie{'tie} |
|
|
% Use TeX 3.0's \inputlineno to get the line number, for better error |
% Use TeX 3.0's \inputlineno to get the line number, for better error |
% messages, but if we're using an old version of TeX, don't do anything. |
% messages, but if we're using an old version of TeX, don't do anything. |
% |
% |
\ifx\inputlineno\thisisundefined |
\ifx\inputlineno\thisisundefined |
\let\linenumber = \empty % Non-3.0. |
\let\linenumber = \empty % Non-3.0. |
\else |
\else |
Line 3080 Section\xreftie'char\the\appendixno.\the
|
Line 3981 Section\xreftie'char\the\appendixno.\the
|
\catcode `\$=\other |
\catcode `\$=\other |
\catcode `\#=\other |
\catcode `\#=\other |
\catcode `\&=\other |
\catcode `\&=\other |
|
% `\+ does not work, so use 43. |
|
\catcode 43=\other |
|
% Make the characters 128-255 be printing characters |
|
{% |
|
\count 1=128 |
|
\def\loop{% |
|
\catcode\count 1=\other |
|
\advance\count 1 by 1 |
|
\ifnum \count 1<256 \loop \fi |
|
}% |
|
}% |
% the aux file uses ' as the escape. |
% the aux file uses ' as the escape. |
% Turn off \ as an escape so we do not lose on |
% Turn off \ as an escape so we do not lose on |
% entries which were dumped with control sequences in their names. |
% entries which were dumped with control sequences in their names. |
Line 3089 Section\xreftie'char\the\appendixno.\the
|
Line 4001 Section\xreftie'char\the\appendixno.\the
|
\catcode `\{=1 \catcode `\}=2 |
\catcode `\{=1 \catcode `\}=2 |
\catcode `\%=\other |
\catcode `\%=\other |
\catcode `\'=0 |
\catcode `\'=0 |
|
\catcode`\^=7 % to make ^^e4 etc usable in xref tags |
\catcode `\\=\other |
\catcode `\\=\other |
\openin 1 \jobname.aux |
\openin 1 \jobname.aux |
\ifeof 1 \else \closein 1 \input \jobname.aux \global\havexrefstrue |
\ifeof 1 \else \closein 1 \input \jobname.aux \global\havexrefstrue |
|
\global\warnedobstrue |
\fi |
\fi |
% Open the new aux file. Tex will close it automatically at exit. |
% Open the new aux file. Tex will close it automatically at exit. |
\openout \auxfile=\jobname.aux |
\openout \auxfile=\jobname.aux |
Line 3114 Section\xreftie'char\the\appendixno.\the
|
Line 4028 Section\xreftie'char\the\appendixno.\the
|
\let\ptexfootnote=\footnote |
\let\ptexfootnote=\footnote |
|
|
{\catcode `\@=11 |
{\catcode `\@=11 |
\long\gdef\footnote #1{\global\advance \footnoteno by \@ne |
% |
\unskip |
% Auto-number footnotes. Otherwise like plain. |
\edef\thisfootno{$^{\the\footnoteno}$}% |
\gdef\footnote{% |
\let\@sf\empty |
\global\advance\footnoteno by \@ne |
\ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi |
\edef\thisfootno{$^{\the\footnoteno}$}% |
\thisfootno\@sf \footnotezzz{#1}} |
% |
% \parsearg\footnotezzz} |
% In case the footnote comes at the end of a sentence, preserve the |
|
% extra spacing after we do the footnote number. |
\long\gdef\footnotezzz #1{\insert\footins{ |
\let\@sf\empty |
\interlinepenalty\interfootnotelinepenalty |
\ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi |
\splittopskip\ht\strutbox % top baseline for broken footnotes |
% |
\splitmaxdepth\dp\strutbox \floatingpenalty\@MM |
% Remove inadvertent blank space before typesetting the footnote number. |
\leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip |
\unskip |
\footstrut\parindent=\defaultparindent\hang\textindent{\thisfootno}#1\strut}} |
\thisfootno\@sf |
|
\footnotezzz |
|
}% |
|
|
|
% Don't bother with the trickery in plain.tex to not require the |
|
% footnote text as a parameter. Our footnotes don't need to be so general. |
|
% |
|
\long\gdef\footnotezzz#1{\insert\footins{% |
|
% We want to typeset this text as a normal paragraph, even if the |
|
% footnote reference occurs in (for example) a display environment. |
|
% So reset some parameters. |
|
\interlinepenalty\interfootnotelinepenalty |
|
\splittopskip\ht\strutbox % top baseline for broken footnotes |
|
\splitmaxdepth\dp\strutbox |
|
\floatingpenalty\@MM |
|
\leftskip\z@skip |
|
\rightskip\z@skip |
|
\spaceskip\z@skip |
|
\xspaceskip\z@skip |
|
\parindent\defaultparindent |
|
% |
|
% Hang the footnote text off the number. |
|
\hang |
|
\textindent{\thisfootno}% |
|
% |
|
% Don't crash into the line above the footnote text. Since this |
|
% expands into a box, it must come within the paragraph, lest it |
|
% provide a place where TeX can split the footnote. |
|
\footstrut |
|
#1\strut}% |
|
} |
|
|
}%end \catcode `\@=11 |
}%end \catcode `\@=11 |
|
|
|
% Set the baselineskip to #1, and the lineskip and strut size |
|
% correspondingly. There is no deep meaning behind these magic numbers |
|
% used as factors; they just match (closely enough) what Knuth defined. |
|
% |
|
\def\lineskipfactor{.08333} |
|
\def\strutheightpercent{.70833} |
|
\def\strutdepthpercent {.29167} |
|
% |
|
\def\setleading#1{% |
|
\normalbaselineskip = #1\relax |
|
\normallineskip = \lineskipfactor\normalbaselineskip |
|
\normalbaselines |
|
\setbox\strutbox =\hbox{% |
|
\vrule width0pt height\strutheightpercent\baselineskip |
|
depth \strutdepthpercent \baselineskip |
|
}% |
|
} |
|
|
|
% @| inserts a changebar to the left of the current line. It should |
|
% surround any changed text. This approach does *not* work if the |
|
% change spans more than two lines of output. To handle that, we would |
|
% have adopt a much more difficult approach (putting marks into the main |
|
% vertical list for the beginning and end of each change). |
|
% |
|
\def\|{% |
|
% \vadjust can only be used in horizontal mode. |
|
\leavevmode |
|
% |
|
% Append this vertical mode material after the current line in the output. |
|
\vadjust{% |
|
% We want to insert a rule with the height and depth of the current |
|
% leading; that is exactly what \strutbox is supposed to record. |
|
\vskip-\baselineskip |
|
% |
|
% \vadjust-items are inserted at the left edge of the type. So |
|
% the \llap here moves out into the left-hand margin. |
|
\llap{% |
|
% |
|
% For a thicker or thinner bar, change the `1pt'. |
|
\vrule height\baselineskip width1pt |
|
% |
|
% This is the space between the bar and the text. |
|
\hskip 12pt |
|
}% |
|
}% |
|
} |
|
|
|
% For a final copy, take out the rectangles |
|
% that mark overfull boxes (in case you have decided |
|
% that the text looks ok even though it passes the margin). |
|
% |
|
\def\finalout{\overfullrule=0pt} |
|
|
|
|
% End of control word definitions. |
% End of control word definitions. |
|
|
\message{and turning on texinfo input format.} |
\message{and turning on texinfo input format.} |
Line 3150 Section\xreftie'char\the\appendixno.\the
|
Line 4148 Section\xreftie'char\the\appendixno.\the
|
\newdimen\defaultparindent \defaultparindent = 15pt |
\newdimen\defaultparindent \defaultparindent = 15pt |
\parindent = \defaultparindent |
\parindent = \defaultparindent |
\parskip 18pt plus 1pt |
\parskip 18pt plus 1pt |
\baselineskip 15pt |
\setleading{15pt} |
\advance\topskip by 1.2cm |
\advance\topskip by 1.2cm |
|
|
% Prevent underfull vbox error messages. |
% Prevent underfull vbox error messages. |
Line 3164 Section\xreftie'char\the\appendixno.\the
|
Line 4162 Section\xreftie'char\the\appendixno.\the
|
% using an old version of TeX, don't do anything. We want the amount of |
% using an old version of TeX, don't do anything. We want the amount of |
% stretch added to depend on the line length, hence the dependence on |
% stretch added to depend on the line length, hence the dependence on |
% \hsize. This makes it come to about 9pt for the 8.5x11 format. |
% \hsize. This makes it come to about 9pt for the 8.5x11 format. |
% |
% |
\ifx\emergencystretch\thisisundefined \else |
\ifx\emergencystretch\thisisundefined |
|
% Allow us to assign to \emergencystretch anyway. |
|
\def\emergencystretch{\dimen0}% |
|
\else |
\emergencystretch = \hsize |
\emergencystretch = \hsize |
\divide\emergencystretch by 45 |
\divide\emergencystretch by 45 |
\fi |
\fi |
|
|
% Use @smallbook to reset parameters for 7x9.5 format (or else 7x9.25) |
% Use @smallbook to reset parameters for 7x9.5 format (or else 7x9.25) |
\def\smallbook{ |
\def\smallbook{ |
|
|
|
% These values for secheadingskip and subsecheadingskip are |
|
% experiments. RJC 7 Aug 1992 |
|
\global\secheadingskip = 17pt plus 6pt minus 3pt |
|
\global\subsecheadingskip = 14pt plus 6pt minus 3pt |
|
|
\global\lispnarrowing = 0.3in |
\global\lispnarrowing = 0.3in |
\global\baselineskip 12pt |
\setleading{12pt} |
\advance\topskip by -1cm |
\advance\topskip by -1cm |
\global\parskip 3pt plus 1pt |
\global\parskip 3pt plus 1pt |
\global\hsize = 5in |
\global\hsize = 5in |
\global\doublecolumnhsize=2.4in \global\doublecolumnvsize=15.0in |
|
\global\vsize=7.5in |
\global\vsize=7.5in |
\global\tolerance=700 |
\global\tolerance=700 |
\global\hfuzz=1pt |
\global\hfuzz=1pt |
\global\contentsrightmargin=0pt |
\global\contentsrightmargin=0pt |
|
\global\deftypemargin=0pt |
|
\global\defbodyindent=.5cm |
|
|
\global\pagewidth=\hsize |
\global\pagewidth=\hsize |
\global\pageheight=\vsize |
\global\pageheight=\vsize |
Line 3195 Section\xreftie'char\the\appendixno.\the
|
Line 4203 Section\xreftie'char\the\appendixno.\the
|
\def\afourpaper{ |
\def\afourpaper{ |
\global\tolerance=700 |
\global\tolerance=700 |
\global\hfuzz=1pt |
\global\hfuzz=1pt |
\global\baselineskip=12pt |
\setleading{12pt} |
\global\parskip 15pt plus 1pt |
\global\parskip 15pt plus 1pt |
|
|
\global\vsize= 53\baselineskip |
\global\vsize= 53\baselineskip |
Line 3206 Section\xreftie'char\the\appendixno.\the
|
Line 4214 Section\xreftie'char\the\appendixno.\the
|
\global\advance\outerhsize by 0.5in |
\global\advance\outerhsize by 0.5in |
\global\outervsize=\vsize |
\global\outervsize=\vsize |
\global\advance\outervsize by 0.6in |
\global\advance\outervsize by 0.6in |
\global\doublecolumnhsize=\hsize |
|
\global\divide\doublecolumnhsize by 2 |
|
\global\advance\doublecolumnhsize by -0.1in |
|
\global\doublecolumnvsize=\vsize |
|
\global\multiply\doublecolumnvsize by 2 |
|
\global\advance\doublecolumnvsize by 0.1in |
|
|
|
\global\pagewidth=\hsize |
\global\pagewidth=\hsize |
\global\pageheight=\vsize |
\global\pageheight=\vsize |
} |
} |
|
|
%% For a final copy, take out the rectangles |
% Allow control of the text dimensions. Parameters in order: textheight; |
%% that mark overfull boxes (in case you have decided |
% textwidth; \voffset; \hoffset (!); binding offset. All require a dimension; |
%% that the text looks ok even though it passes the margin). |
% header is additional; added length extends the bottom of the page. |
\def\finalout{\overfullrule=0pt} |
|
|
\def\changepagesizes#1#2#3#4#5{ |
|
\global\vsize= #1 |
|
\advance\vsize by \topskip |
|
\global\voffset= #3 |
|
\global\hsize= #2 |
|
\global\outerhsize=\hsize |
|
\global\advance\outerhsize by 0.5in |
|
\global\outervsize=\vsize |
|
\global\advance\outervsize by 0.6in |
|
\global\pagewidth=\hsize |
|
\global\pageheight=\vsize |
|
\global\normaloffset= #4 |
|
\global\bindingoffset= #5} |
|
|
|
% This layout is compatible with Latex on A4 paper. |
|
|
|
\def\afourlatex{\changepagesizes{22cm}{15cm}{7mm}{4.6mm}{5mm}} |
|
|
% Define macros to output various characters with catcode for normal text. |
% Define macros to output various characters with catcode for normal text. |
\catcode`\"=\other |
\catcode`\"=\other |
Line 3248 Section\xreftie'char\the\appendixno.\the
|
Line 4267 Section\xreftie'char\the\appendixno.\the
|
% otherwise. Since all the Computer Modern typewriter fonts have zero |
% otherwise. Since all the Computer Modern typewriter fonts have zero |
% interword stretch (and shrink), and it is reasonable to expect all |
% interword stretch (and shrink), and it is reasonable to expect all |
% typewriter fonts to have this, we can check that font parameter. |
% typewriter fonts to have this, we can check that font parameter. |
% |
% |
\def\ifusingtt#1#2{\ifdim \fontdimen3\the\font=0pt #1\else #2\fi} |
\def\ifusingtt#1#2{\ifdim \fontdimen3\the\font=0pt #1\else #2\fi} |
|
|
% Turn off all special characters except @ |
% Turn off all special characters except @ |
Line 3263 Section\xreftie'char\the\appendixno.\the
|
Line 4282 Section\xreftie'char\the\appendixno.\the
|
\def~{{\tt \char '176}} |
\def~{{\tt \char '176}} |
\chardef\hat=`\^ |
\chardef\hat=`\^ |
\catcode`\^=\active |
\catcode`\^=\active |
|
\def\auxhat{\def^{'hat}} |
\def^{{\tt \hat}} |
\def^{{\tt \hat}} |
|
|
\catcode`\_=\active |
\catcode`\_=\active |
Line 3290 Section\xreftie'char\the\appendixno.\the
|
Line 4310 Section\xreftie'char\the\appendixno.\the
|
%\catcode 27=\active |
%\catcode 27=\active |
%\def^^[{$\diamondsuit$} |
%\def^^[{$\diamondsuit$} |
|
|
% Used sometimes to turn off (effectively) the active characters |
|
% even after parsing them. |
|
\def\turnoffactive{\let"=\normaldoublequote |
|
\let~=\normaltilde |
|
\let^=\normalcaret |
|
\let_=\normalunderscore |
|
\let|=\normalverticalbar |
|
\let<=\normalless |
|
\let>=\normalgreater |
|
\let+=\normalplus} |
|
|
|
% Set up an active definition for =, but don't enable it most of the time. |
% Set up an active definition for =, but don't enable it most of the time. |
{\catcode`\==\active |
{\catcode`\==\active |
\global\def={{\tt \char 61}}} |
\global\def={{\tt \char 61}}} |
Line 3325 Section\xreftie'char\the\appendixno.\the
|
Line 4334 Section\xreftie'char\the\appendixno.\the
|
% \catcode 17=0 % Define control-q |
% \catcode 17=0 % Define control-q |
\catcode`\\=\active |
\catcode`\\=\active |
|
|
|
% Used sometimes to turn off (effectively) the active characters |
|
% even after parsing them. |
|
@def@turnoffactive{@let"=@normaldoublequote |
|
@let\=@realbackslash |
|
@let~=@normaltilde |
|
@let^=@normalcaret |
|
@let_=@normalunderscore |
|
@let|=@normalverticalbar |
|
@let<=@normalless |
|
@let>=@normalgreater |
|
@let+=@normalplus} |
|
|
|
@def@normalturnoffactive{@let"=@normaldoublequote |
|
@let\=@normalbackslash |
|
@let~=@normaltilde |
|
@let^=@normalcaret |
|
@let_=@normalunderscore |
|
@let|=@normalverticalbar |
|
@let<=@normalless |
|
@let>=@normalgreater |
|
@let+=@normalplus} |
|
|
% If a .fmt file is being used, we don't want the `\input texinfo' to show up. |
% If a .fmt file is being used, we don't want the `\input texinfo' to show up. |
% That is what \eatinput is for; after that, the `\' should revert to printing |
% That is what \eatinput is for; after that, the `\' should revert to printing |
% a backslash. |
% a backslash. |
% |
% |
@gdef@eatinput input texinfo{@fixbackslash} |
@gdef@eatinput input texinfo{@fixbackslash} |
@global@let\ = @eatinput |
@global@let\ = @eatinput |
|
|
% On the other hand, perhaps the file did not have a `\input texinfo'. Then |
% On the other hand, perhaps the file did not have a `\input texinfo'. Then |
% the first `\{ in the file would cause an error. This macro tries to fix |
% the first `\{ in the file would cause an error. This macro tries to fix |
% that, assuming it is called before the first `\' could plausibly occur. |
% that, assuming it is called before the first `\' could plausibly occur. |
% |
% |
@gdef@fixbackslash{@ifx\@eatinput @let\ = @normalbackslash @fi} |
@gdef@fixbackslash{@ifx\@eatinput @let\ = @normalbackslash @fi} |
|
|
%% These look ok in all fonts, so just make them not special. The @rm below |
%% These look ok in all fonts, so just make them not special. The @rm below |