Ubuntu Manpages
% texinfo.tex -- TeX macros to handle Texinfo files. % % Load plain if necessary, i.e., if running under initex. \xpandafterifxsname fmtname\ndcsnameelaxinput plain % efexinfoversion{1999-01-05}% % % Copyright (C) 1985, 86, 88, 90, 91, 92, 93, 94, 95, 96, 97, 98 % Free Software Foundation, Inc. % % 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 % published by the Free Software Foundation; either version 2, or (at % your option) any later version. % % This texinfo.tex file is distributed in the hope that it will be % useful, but WITHOUT ANY WARRANTY; without even the implied warranty % of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU % General Public License for more details. % % You should have received a copy of the GNU General Public License % along with this texinfo.tex file; see the file COPYING. If not, write % to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, % Boston, MA 02111-1307, USA. % % In other words, you are welcome to use, share and improve this program. % You are forbidden to forbid anyone else to use, share and improve % what you give them. Help stamp out software-hoarding! % % Please try the latest version of texinfo.tex before submitting bug % reports; you can get the latest version from: % ftp://ftp.gnu.org/pub/gnu/texinfo.tex % /home/gd/gnu/doc/texinfo.tex on the GNU machines. % (and all GNU mirrors, see http://www.gnu.org/order/ftp.html) % ftp://tug.org/tex/texinfo.tex % ftp://ctan.org/macros/texinfo/texinfo.tex % (and all CTAN mirrors, finger ctan@ctan.org for a list). % The texinfo.tex in the texinfo distribution itself could well be out % of date, so if that's what you're using, please check. % % Send bug reports to bug-texinfo@gnu.org. % Please include a precise test case in each bug report, % including a complete document with which we can reproduce the problem. % % To process a Texinfo manual with TeX, it's most reliable to use the % texi2dvi shell script that comes with the distribution. For simple % manuals, however, you can get away with: % tex foo.texi % texindex foo.?? % tex foo.texi % tex foo.texi % dvips foo.dvi -o # or whatever, to process the dvi file. % The extra runs of TeX get the cross-reference information correct. % Sometimes one run after texindex suffices, and sometimes you need more % than two; texi2dvi does it as many times as necessary.

ssage{Loading texinfo [version exinfoversion]:}

% If in a .fmt file, print the version number % and turn on active characters that we couldn't do earlier because % they might have appeared in the input file name. \veryjob{ssage{[Texinfo version exinfoversion]}%
atcode`+=ctive atcode`_=ctive}

% Save some parts of plain tex whose names we will redefine.

xb= xbullet= xc=xcomma= xdot=. xdots=ots xend=\nd xequiv=\quiv xexclam= xi=i xlbrace= xrbrace= xstar= xt=

% We never want plain's outer + definition in Texinfo. % For @tex, we can use abalign. lax

ssage{Basics,} hardef

% If this character appears in an error message or help string, it % starts a new line in the output. 0wlinechar = `^^J

% Set up fixed words for English if not already set. ifxutwordAppendixndefined
efutwordAppendix{Appendix} ifxutwordChapterndefined
efutwordChapter{Chapter} ifxutwordfilendefined
efutwordfile{file} ifxutwordInfondefined
efutwordInfo{Info} ifxutwordMethodonndefined
efutwordMethodon{Method
on} ifxutwordonndefined
efutwordon{on} ifxutwordpagendefined
efutwordpage{page} ifxutwordsectionndefined
efutwordsection{section} ifxutwordSectionndefined
efutwordSection{Section} ifxutwordseendefined
efutwordsee{see} ifxutwordSeendefined
efutwordSee{See} ifxutwordShortContentsndefined
efutwordShortContents{Short
Contents} ifxutwordTableofContentsndefinedefutwordTableofContents{Table
of Contents}

% Ignore a token. % efbble#1{}

% Margin to add to right of even pages, to left of odd pages. 0wdimen ngoffset 0wdimen 0rmaloffset 0wdimenagewidth
0wdimenageheight

% Sometimes it is convenient to have everything in the transcript file % and nothing on the terminal. We don't just call racingall here, % since that produces some useless output on the terminal. % efoggingall{fs = 1 up}% ifx\TeXversionndefined efmmands2 racingstats2
racingpages1 racingoutput1 racinglostchars1
racingmacros2 racingparagraphs1 racingrestores1
owboxbreadthxdimenowboxdepthxdimen }% \lse efmmands3 racingstats2
racingpages1 racingoutput1 racinglostchars1
racingmacros2 racingparagraphs1 racingrestores1
racingscantokens1 racingassigns1 racingifs1
racinggroups1 racingnesting2
owboxbreadthxdimenowboxdepthxdimen }%

% For @cropmarks command. % Do @cropmarks to get crop marks. % 0wififcropmarks % % Dimensions to add cropmarks at corners. % Added by P. A. MacKay, 12 Nov. 1986 % 0wdimen 0wdimenornerlong ornerlong=1pc 0wdimenornerthick ornerthick=.3pt 0wdimenopandbottommargin opandbottommargin=.75in

% Main output routine. hardefPAGE = 255 pt = {otentsPAGE}}

0wboxbox 0wboxotlinebox

% a argument. Note that agecontents
% does insertions, but you have to call it yourself. ef
ifcropmarks
%
ifoddageno
dvanceffset
\lse dvanceffset
%
% Do this outside of the ipout so @code etc. will be expanded in
% the headline as they should be, not taken literally (outputting ''code).
tboxbox =
tboxotlinebox =
%
{%
% Have to do this stuff outside the ipout because we want it to
% take effect in 384oup defined by the
% before the ipout runs.
%
\scapechar = `\ % use backslash in output files.
indexdummies % don't expand commands in the output.
0rmalturnoffactive %  in index entries must not stay e.g., if
% the page break happens to be in the middle of an example.
ipout
ifcropmarks


o0pt{%

0interlineskip




}%
}%



ifoddagenoet


%
nvboxbox
agebody{#1}%

ifdimotlinebox > 0pt
% Only leave this space if the footline is nonempty.
% (We lessened
% The in's kefootline has no effect.

nvboxotlinebox

%
ifcropmarks
\group % end of
(centering)
1fill minus1fill
rnerthick


ot}%

ot}%
}%
0interlineskip

}%
\group %

}% end of ipout
}% end of group with urnoffactive
dvancepageno
ifnumptpenalty>-20000 \lseosupereject }

0winsertrgin imenrgin=xdimen

efagebody#1{ {atcode`@ =11 efagecontents#1{ifvoidopins\lsenvboxopins % marginal hacks, juha@viisa.uucp (Juha Takala) ifvoidrgin\lse % marginal info is present
lap{rn imen@=p#1 nvbox#1 ifvoidotins\lseotinsotnoterule nvboxotins ifr@ggedbottom rn-imen@ } }

% Here are the rules for the cropmarks. Note that they are % offset so that the space between them is truly % (P. A. MacKay, 12 November, 1986) % ef\wtop{nerthick depth0pt widthornerlong} ef0top{
{nerthick depthornerlong widthornerthick}} ef\wbot{nerthick widthornerlong} ef0bot{
{nerlong depthornerthick widthornerthick}}

% Parse an argument, then pass it to #1. The argument is the rest of % the input line (except we remove a trailing comment). #1 should be a % macro which expects an ordinary undelimited TeX argument. % efarsearg#1{%




tureletemparseargx
}

% If the next token is an obeyed space (from an @example environment or % the like), remove it and recurse. Otherwise, we're done. efarseargx{%

% elow, after the definition of pspaces.
ifx
\xpandafterarseargdiscardspace

\lse
\xpandafterarseargline

}

% Remove a single space (as the delimiter token to the macro call). {
efarseargdiscardspace
{tureletemparseargx}}

{
efarseargline#1^^M{%

\ndgroup % End of the group started in arsearg.

%
% First remove any @c comment, then any @comment.
% Result of each macro is put in oks0.
rgremovec #1elax %
\xpandafterrgremovecomment heoks0 ommentelax %
%
% Call the caller's macro, saved as 0xt in arsearg.

\xpandafter0xt\xpandafter{heoks0}%
}% }

% Since all {,omment} does is throw away the argument, we can let TeX % do that for us. The elax here is matched by the elax in the call % in arseargline;
it could be more or less anything, its purpose is % just to delimit the argument to the . efrgremovec#1#2elax{oks0 = {#1}} efrgremovecomment#1omment#2elax{oks0 = {#1}}

% rgremovec{,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 oks0. % % 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 emoveactivespaces as part of % rgremovec{,omment}, since @c uses arsearg,
and thus the argument % that arsearg
gets might well have any character at all in it. % efemoveactivespaces#1{%

ignoreactivespaces
\defemp{#1}%
obaloks0 = \xpandafter{emp}%
\ndgroup }

% Change the active space to expand to nothing. %

efignoreactivespaces{ \ndgroup

efushcr{ifxar
0xt}

%% These are used to keep @begin/@end levels from running away %% Call inENV within environments (after a 0wififENV alse efinENV{ifENVelax\lserue} efheck{% ifENV\rrmessage{Still within an environment; press RETURN to continue} \ndgroup} % This is not perfect, but it should reduce lossage

% @begin foo is the same as @foo, for now. 0whelpimple{Press RETURN to continue.}

ef \xpandafterifxsname #1\ndcsnameelax {\rrhelp=imple \rrmessage{Undefined command @begin #1}}\lse sname #1\ndcsname}

% @end foo executes the definition of o. % ef\nd{arsearg\ndxxx}
ef\ndxxx #1{%
emoveactivespaces{#1}%
\def\ndthing{heoks0}%
%
\xpandafterifxsname E\ndthing\ndcsnameelax
\xpandafterifxsname \ndthing\ndcsnameelax
% There's no o, i.e., no ``environment'' foo.
\rrhelp = imple
\rrmessage{Undefined command `@end \ndthing'}%
\lse
nmatchedenderror\ndthing

\lse
% Everything's ok; the right environment has been started.
sname E\ndthing\ndcsname
}

% There is an environment #1, but it hasn't been started. Give an error. % efnmatchedenderror#1{%
\rrhelp = imple
\rrmessage{This `@end #1' doesn't have a matching `@#1'}% }

% Define the control sequence #1 to give an unmatched @end error. % efefineunmatchedend#1{%
\xpandafterefsname E#1\ndcsname{nmatchedenderror{#1}}% }

% Single-spacing is done by various environments (specifically, in % 0nfillstart and quotations). 0wskipnglespaceskip nglespaceskip = 12.5pt efnglespace{%
% Why was this kern here? It messes up equalizing space above and below
% environments. --karl, 6may93
%{dvance ceskip
%rn
tleading nglespaceskip }

%% Simple single-character @ commands

% @@ prints an @ % Kludge this until the fonts are right (grr). ef@{{thar64}}

% This is turned off because it was never documented % and you can use @w{...} around a quote to suppress ligatures. %% Define @` and @' to be the same as ` and ' %% but suppressing ligatures. %ef`{{`}} %ef´{{'}}

% Used to generate quoted braces. eflbrace {{thar123}} efrbrace {{thar125}}
% Definitions to produce actual & command in an index.
atcode` = 12 atcode` = 12
atcode`= 1 atcode`] = 2
atcode`@ = 0 atcode`\ = 12
@gdef@lbracecmd[]%
@gdef@rbracecmd[]% @endgroup

% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent % Others are defined by plain TeX: @` @' @" @^ @~ @= @v @H. nt = . efingaccent#1{{ccent23 #1}} accent = nt = nt =

% Other special characters: @questiondown @exclamdown % Plain TeX defines: @AA @AE @O @OE @L (and lowercase versions) @ss. efquestiondown{?`} ef\xclamdown{!`}

% Dotless i and dotless j, used for accents. efimacro{i} efjmacro{j} efotless#1{%
efemp{#1}%
ifxempimacro texi

\lseifxempjmacro j
\lse \rrmessage{@dotless can be used only with i or j}%
}

% 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 enalty
-- and % since enalty
is valid in vertical mode, we'd end up putting the % penalty on the vertical list instead of in the new paragraph. {atcode`@ = 11
% Avoid using @M directly, because that causes trouble
% if the definition is written into an index file.
obalpenalty = @M
efie{vmodeenaltyiepenalty }
}

% @: forces normal size whitespace following. ef{acefactor=1000 }

% @* forces a line break. ef

% @. is an end-of-sentence period. ef.{.acefactor=3000 }

% @! is an end-of-sentence bang. ef{!acefactor=3000 }

% @? is an end-of-sentence query. ef{?acefactor=3000 }

% @w prevents a word break. Without the vmode, @w at the % beginning of a paragraph, when TeX is still in vertical mode, would % produce a whole line of output instead of starting the paragraph. ef168

% @group ... @end group forces ... to be all on one page, by enclosing % it in a TeX vbox. We use ead of ox % to keep its height that of a normal line. According to the rules for % opskip (p.114 of the TeXbook), the glue inserted is % max (opskip - item), 0). If that height is large, % therefore, no glue is inserted, and the space between the headline and % the text is small, which looks bad. % efoup{
ifnumatcode13=ctive \lse
\rrhelp = oupinvalidhelp
\rrmessage{@group invalid in context where filling is enabled}%

%
% The art below produces a box with normal height and large
% depth; thus, TeX puts nd (when the
% next line of text is done) p glue after it. (See p.82 of
% the TeXbook.) Thus, space below is not quite equal to space
% above. But it's pretty close.
efoup{%
\group % End the
\ndgroup % End the oup.
}%
%

% 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 oup, since there it would be on a line by itself.
% Hence this just inserts a strut at the beginning of each line.
\verypar = {rut}%
%
% Since we have a strut on every line, we don't need any of TeX's
% normal interline spacing.
interlineskip
%
% OK, but now we have to do something about blank
% lines in the input in @example-like environments, which normally
% just turn into ch will insert no space now that we've
% turned off the interline space. Simplest is to make them be an
% empty paragraph.
ifxar
\defar{vmode
ar}%

%
% Reset ^^M's definition to new definition of ar.



%
% 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.
omment } % % TeX puts in an \scapechar (i.e., `@') at the beginning of the help % message, so this ends up printing `@group can only ...'. % 0whelpoupinvalidhelp{% group can only be used in environments such as @example,^^J% where each line of input produces a line of output.}

% @need space-in-mils % forces a page break if there is not space-in-mils remaining.

0wdimenl l=0.001in

ef0ed{arsearg0edx}

% Old definition--didn't work. %ef0edx #1{ar
% %% This method tries to make TeX break the page naturally %% if the depth of the box does not fit. %{ %o #1l{ %revdepth=-1000pt
%}}

ef0edx#1{%
% Go into vertical mode, so we don't make a big box in the middle of a
% paragraph.
ar

%
% Don't add any leading before our big empty box, but allow a page
% break, since the best break might be right here.
llowbreak
0interlineskip
o #1l{
%
% 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
% 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 after the empty box. So we use a penalty of 9999.
%
% There is an extremely small chance that TeX will actually break the
% page at this enalty,
if there are no other feasible breakpoints in
% sight. (If the user is using lots of big @group commands, which
% almost-but-not-quite fill up a page, TeX will have a hard time doing
% good page breaking, for example.) However, I could not construct an
% example where a page broke at this enalty;
if it happens in a real
% document, then we can reconsider our strategy.
enalty9999

%
% Back up by the size of the box, whether we did a page break or not.
rn -#1l
%
% Do not allow a page break right after this kern.
0break }

% @br forces paragraph break

% @dots{} output an ellipsis using the current font. % We do .5em per period so that it has the same spacing in a typewriter % font as three actual period characters. % efots{%
vmode

0.25fil minus 0.25fil
...%
0.5fil minus 0.5fil
}% }

% @enddots{} is an end-of-sentence ellipsis. % ef\nddots{%
vmode

0.25fil minus 0.25fil
....%
0.5fil minus 0.5fil
}%
acefactor=3000 }

% @page forces the start of a new page % efage{ar

% @exdent text.... % outputs text on separate line in roman font, starting at standard page margin

% This records the amount of indent in the innermost environment. % That's how much \xdent should take out. 0wskip\xdentamount

% This defn is used inside fill environments such as @defun. ef\xdent{arsearg\xdentyyy}
ef\xdentyyy #1{{

% This defn is used inside nofill environments such as @example. ef0fillexdent{arsearg0fillexdentyyy}
ef0fillexdentyyy #1{{dvance ntamount {

% @inmargin{TEXT} puts TEXT in the margin next to the current paragraph.

efinmargin#1{% rutkrn-rutdepth
o rutdepth{
0wskipinmarginspacing inmarginspacing=1cm efrutdepth{prutbox}

%

% @include file insert text of that file as input. % Allow normal characters that we make active in the argument (a file name). efinclude{
atcode`\=12
atcode`~=12
atcode`^=12
atcode`_=12
atcode`|=12
atcode`<=12
atcode`>=12
atcode`+=12
arseargincludezzz}
% Restore active chars for included file. efincludezzz#1{\ndgroup
% Read the included file in a group so nested @include's work.
efhisfile{#1}%
inputhisfile \ndgroup}

efhisfile{}

% @center line outputs that line, centered

efenter{arseargenterzzz}
efenterzzz #1{{dvance dvancekip enterline{#1}}}

% @sp n outputs n lines of vertical space

ef{arseargxxx}
efxxx #1{

% @comment ...line which is ignored... % @c is the same as @comment % @ignore ... @end ignore is another way to write a comment

efomment{`^M= atcode`@=acode`=acode`= ommentxxx} {atcode`^M=nxxx#1^^M{\ndgroup}}

nt

% @paragraphindent is defined for the Info formatting commands only. nt=omment

% Prevent errors for section commands. % Used in @ignore and in failing conditionals. efignoresections{% r=elax red=elax lax redsec=elax redsection=elax redsubsec=elax redsubsection=elax redsubsubsec=elax redsubsubsection=elax lax c=elax c=elax ction=elax ction=elax ndix=elax ndixsec=elax ndixsection=elax ndixsubsec=elax ndixsubsection=elax ndixsubsubsec=elax ndixsubsubsection=elax nts=elax lax page=elax }

% Used in nested conditionals, where we have to parse the Texinfo source % and so want to turn off most commands, in case they are used % incorrectly. % efignoremorecommands{%
fcodeindex = elax
fcv = elax
ffn = elax
ffnx = elax
findex = elax
fivar = elax
fmac = elax
fmethod = elax
fop = elax
fopt = elax
fspec = elax
ftp = elax
ftypefn = elax
ftypefun = elax
ftypevar = elax
ftypevr = elax
fun = elax
fvar = elax
fvr = elax
f = elax

x = elax
f = elax
= elax
rnewpage = elax
rstyle = elax
ryheading = elax
nheading = elax
ading = elax
ryfooting = elax
nfooting = elax
lax

= elax
lax
lax
sections = elax
lax
lax
ar = elax
m = elax }

% Ignore @ignore ... @end ignore. % efignore{oignore{ignore}}

% Ignore @ifinfo, @ifhtml, @ifnottex, @html, @menu, and @direntry text. % efifinfo{oignore{ifinfo}} efifhtml{oignore{ifhtml}} efifnottex{oignore{ifnottex}} efml}} efnu{oignore{menu}} efirentry{oignore{direntry}}

% @dircategory CATEGORY -- specify a category of the dir file % which this file should belong to. Ignore this in TeX. gory = omment

% Ignore text until a line `@end #1'. % efoignore#1{
% Don't complain about control sequences we have declared
ignoresections
%
% Define a command to swallow text until we reach `@end #1'.
% This @ is a catcode 12 token (that is the normal catcode of @ in
% this texinfo.tex file). We change the catcode of @ below to match.
ignoretext##1@end #1{\nddoignore}%
%
% Make sure that spaces turn into tokens that match what oignoretext wants.
atcode32 = 10
%
% Ignore braces, too, so mismatched braces don't cause trouble.
atcode` = 9
atcode` = 9
%
% We must not have @c interpreted as a control sequence.
atcode`@ = 12
%
% Make the letter c a comment character so that the rest of the line
% will be ignored. This way, the document can have (for example)
% @c @end ifinfo
% and the @end ifinfo will be properly ignored.
% (We've just changed @ to catcode 12.)
atcode` = 14
%
% And now expand that command.
oignoretext }

% What we do to finish off ignored text. % ef\nddoignore{\ndgroupignorespaces}%

0wififwarnedobs192lse ef
ifwarnedobselax\lse
% We need to warn folks that they may have trouble with TeX 3.0.
% This uses immediate144ather than ssage to get newlines.
immediate168
immediate528 users of Unix TeX 3.0!}
immediate456ips a bug in TeX version 3.0 (tex hangs).}
immediate336e running another version of TeX, relax.}
immediate336e running Unix TeX 3.0, kill this TeX process.}
immediate384ade your TeX installation if you can.}
immediate672g/pub/gnu/TeX.README.)}
immediate336e stuck with version 3.0, run the}
immediate240ipt ``tex3patch'' from the Texinfo distribution}
immediate456karound.}
immediate168
obal264
}

% **In TeX 3.0, setting text in 0llfont hangs tex. For a % workaround (which requires the file ``dummy.tfm'' to be installed), % uncomment the following line: %%%%%nt0llfont=dummy

% Ignore text, except that we keep track of conditional commands for % purposes of nesting, up to an `@end #1' command. % ef0stedignore#1{%

% 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
% the change of memory overflow, we follow the approach outlined on
% page 401 of the TeXbook: make the current font be a dummy font.
%
tbox0 =
% Don't complain about control sequences we have declared
ignoresections
%
% Define `@end #1' to end the box, which will in turn undefine the
% @end command again.
\xpandafterefsname E#1\ndcsname{\groupignorespaces}%
%
% 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 0llfont, a TeX primitive, and define
% all the font commands to also use 0llfont. 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.
%
0llfont
nrm = 0llfont nit = 0llfont nsl = 0llfont
nbf = 0llfont ntt = 0llfont
nsf = 0llfont
% Similarly for index fonts (mostly for their use in
% smallexample)



%
% Don't complain when characters are missing from the fonts.
racinglostchars = 0
%
% Don't bother to do space factor calculations.
enchspacing
%
% Don't report underfull hboxes.

%
% Do minimal line-breaking.
retolerance
= 10000
%
% Do not execute instructions in @tex
efex{oignore{tex}}%
% Do not execute macro definitions.
% `c' is a comment character, so the word `macro' will get cut off.
efcro{oignore{ma}}% }

% @set VAR sets the variable VAR to an empty value. % @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 arsearg;
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. Make sure the catcode of space is correct to avoid % losing inside @example, for instance. % eft{` =10
atcode`-=12 atcode`_=12 % Allow - and _ in VAR.
arseargtxxx}
eftxxx#1{tyyy#1 \ndsetyyy} eftyyy#1 #2\ndsetyyy{%
efemp{#2}%
ifxemp\mpty obal\xpandafter SET#1\ndcsname = \mpty
\lse tzzz{#1}#2\ndsetzzz % Remove the trailing space txxx inserted.

\ndgroup } % Can't use #2 and save some time, since emp or % 0xt or other control sequences that we've defined might get us into % an infinite loop. Consider `@set foo @cite{bar}'. eftzzz#1#2 \ndsetzzz{\xpandafterefsname SET#1\ndcsname{#2}}

% @clear VAR clears (i.e., unsets) the variable VAR. % eflear{arsearglearxxx}
eflearxxx#1{obal\xpandafter SET#1\ndcsname=elax}

% @value{foo} gets the text saved in variable foo. % {
atcode`_ = ctive
%
% We might end up with active _ or - characters in the argument if
% we're called from @code, as @code{@value{foo-bar_}}. So
% such active characters to their normal equivalents.
ef
atcode`-=12 atcode`_=12
indexbreaks rscore
} efndablevalue{#1}\ndgroup}

% We have this subroutine so that we can handle at least some @value's % properly in indexes (we % whose names contain - or _ still won't work, but we can't do anything % about that. The command has to be fully expandable, since the result % winds up in the index file. This means that if the variable's value % contains other Texinfo commands, it's almost certain it will fail % (although perhaps we could fix that with sufficient work to do a % one-level expansion on the result, instead of complete). % ef\xpandablevalue#1{%
\xpandafterifxsname SET#1\ndcsnameelax
{[No value for ``#1'']}%
\lse
sname SET#1\ndcsname
}

% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined % with @set. % efifset{arseargifsetxxx}
efifsetxxx #1{%
\xpandafterifxsname SET#1\ndcsnameelax
\xpandafterifsetfail
\lse
\xpandafterifsetsucceed
} efifsetsucceed{onditionalsucceed{ifset}} efifsetfail{0stedignore{ifset}} efineunmatchedend{ifset}

% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been % defined with @set, or has been undefined with @clear. % efifclear{arseargifclearxxx}
efifclearxxx #1{%
\xpandafterifxsname SET#1\ndcsnameelax
\xpandafterifclearsucceed
\lse
\xpandafterifclearfail
} efifclearsucceed{onditionalsucceed{ifclear}} efifclearfail{0stedignore{ifclear}} efineunmatchedend{ifclear}

% @iftex, @ifnothtml, @ifnotinfo always succeed; we read the text % following, through the first @end iftex (etc.). Make `@end iftex' % (etc.) valid only after an @iftex. % efiftex{onditionalsucceed{iftex}} efifnothtml{onditionalsucceed{ifnothtml}} efifnotinfo{onditionalsucceed{ifnotinfo}} efineunmatchedend{iftex} efineunmatchedend{ifnothtml} efineunmatchedend{ifnotinfo}

% 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 iftex 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.) % efonditionalsucceed#1{%
\defemp{%
% Remember the current value of #1.
{prevE#1} = 0ce{E#1}%
%
% At the `@end #1', redefine #1 to be its previous value.
ef0ce{E#1}{{E#1} = 0ce{prevE#1}}%
}%
emp }

% We need to expand lots of sname's, but we don't want to expand the % control sequences after we've constructed them. % ef0ce#1{\xpandafter0expandsname#1\ndcsname}

% @asis just yields its argument. Used with @table, for example. % efsis#1{#1}

% @math means output in math mode. % We don't use $'s directly in the definition of th because control % sequences like th are expanded when the toc file is written. Then, % 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 % control sequence to switch into and out of math mode. % % This isn't quite enough for @math to work properly in indices, but it % seems unlikely it will ever be needed there. % efth#1{implicitmath #1implicitmath}

% @bullet and @minus need the same treatment as @math, just above. eflletimplicitmath} efnus{implicitmath-implicitmath}

% @refill is a no-op. fill=elax

% If working on a large document in chapters, it is convenient to % be able to disable indexing, cross-referencing, and contents, for test runs. % This is done with @novalidate (before @setfilename). % 0wififlinks les. =

% @setfilename is done at the beginning of every texinfo file. % 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. eftfilename{%
iflinks
eadauxfile
%

xbackslash % Turn off hack to swallow `input texinfo'.
obalname=omment % Ignore extra @setfilename cmds.
%
% If texinfo.cnf is present on the system, read it.
% Useful for site-wide @afourpaper, etc.
% Just to be on the safe side, close the input stream before the input.

ifeof1 mp=elax \lse efemp{input texinfo.cnf }
losein1
emp
%
omment % Ignore the actual filename. }

% Called from tfilename. % ef
0windex{cp}%
0wcodeindex{fn}%
0wcodeindex{vr}%
0wcodeindex{tp}%
0wcodeindex{ky}%
0wcodeindex{pg}% }

% @bye.

ssage{fonts,} % Font-change commands.

% Texinfo sort of supports the sans serif font style, which plain TeX does not. % So we set up a analogous to plain's m, etc. 0wfamfam ef{m=fam ensf} s we call it

% We don't need math for this one. eftsl{enttsl}

% Use Computer Modern fonts at gstephalf (11pt). 0wcountinmagstep inmagstep=gstephalf

% Set the font macro #1 to the font named #2, adding on the % specified font prefix (normally `cm'). % #3 is the font's design size, #4 is a scale factor eftfont#1#2#3#4{nt#1=ntprefix#2#3 scaled #4}

% Use cm as the default font prefix. % To specify the font prefix, you must define ntprefix % before you read in texinfo.tex. ifxntprefixndefined efntprefix{cm} % Support font families that don't use the same naming scheme as CM. efmshape{r} efmbshape{bx} %where the normal face is bold ef ef} eftshape{tt} eftbshape{tt} eftslshape{sltt} efitshape{ti} efitbshape{bxti} efshape{sl} efbshape{bxsl} efshape{ss} efbshape{ss} efshape{csc} efbshape{csc}

ifx p=gstep1 tfontextrmmshape{12}{1000} tfontexttttshape{12}{1000} \lse tfontextrmmshape{10}{inmagstep} tfontexttttshape{10}{inmagstep} % Instead of cmb10, you many want to use cmbx10. % cmbx10 is a prettier font on its own, but cmb10 % looks better when embedded in a line with cmr10. tfontextbf tfontextititshape{10}{inmagstep} tfontextslshape{10}{inmagstep} tfontextsfshape{10}{inmagstep} tfontextscshape{10}{inmagstep} tfontextttsltslshape{10}{inmagstep} ntexti=cmmi10 scaled inmagstep ntextsy=cmsy10 scaled inmagstep

% A few fonts for @defun, etc. tfontefbf tfonteftttshape{10}{gstep1} eff{ntt=eftt nbf = efbf

% Fonts for indices and small examples (9pt). % We actually use the slanted font rather than the italic, % because texinfo normally uses the slanted fonts for that. % Do not make many font distinctions in general in the index, since they % aren't very useful. tfont0netttshape{9}{1000} tfont0nettsltslshape{10}{900} tfontindrmmshape{9}{1000} tfontindititshape{9}{1000} tfontindslshape{9}{1000} tt ttsl tfontindscshape{10}{900} ntindi=cmmi9 ntindsy=cmsy9

% Fonts for title page: tfontitlermmbshape{12}{gstep3} tfontitleititbshape{10}{gstep4} tfontitleslbshape{10}{gstep4} tfontitletttbshape{12}{gstep3} tfontitlettsltslshape{10}{gstep4} tfontitlesfbshape{17}{gstep1} bf=itlerm tfontitlescbshape{10}{gstep4} ntitlei=cmmi12 scaled gstep3 ntitlesy=cmsy10 scaled gstep4 efuthorrm{crm}

% Chapter (and unnumbered) fonts (17.28pt). tfonthaprmmbshape{12}{gstep2} tfonthapititbshape{10}{gstep3} tfonthapslbshape{10}{gstep3} tfonthaptttbshape{12}{gstep2} tfonthapttsltslshape{10}{gstep3} tfonthapsfbshape{17}{1000} tfonthapscbshape{10}{gstep3} nthapi=cmmi12 scaled gstep2 nthapsy=cmsy10 scaled gstep3

% Section fonts (14.4pt). tfontcrmmbshape{12}{gstep1} tfontcititbshape{10}{gstep2} tfontcslbshape{10}{gstep2} tfontctttbshape{12}{gstep1} tfontcttsltslshape{10}{gstep2} tfontcsfbshape{12}{gstep1} tfontcscbshape{10}{gstep2} ntci=cmmi12 scaled gstep1 ntcsy=cmsy10 scaled gstep2

% tfontecrm % tfontecititshape{10}{gstep1} % The letters were too crowded. % tfontecslshape{10}{gstep1} % tfontectttshape{10}{gstep1} % tfontecsfshape{10}{gstep1}

%tfontecrm cmb rather than cmbx. %tfontecititshape{10}{1315} % Also, the size is a little larger than %tfontecslshape{10}{1315} % being scaled magstep1. %tfontectttshape{10}{1315} %tfontecsfshape{10}{1315}

%cbf=ecrm

% Subsection fonts (13.15pt). tfontecrmmbshape{12}{gstephalf} tfontecititbshape{10}{1315} tfontecslbshape{10}{1315} tfontectttbshape{12}{gstephalf} tfontecttsltslshape{10}{1315} tfontecsfbshape{12}{gstephalf} cbfecrm tfontecscbshape{10}{gstep1} nteci=cmmi12 scaled gstephalf ntecsy=cmsy10 scaled 1315 % The smallcaps and symbol fonts should actually be scaled gstep1.5, % but that is not a standard magnification.

% In order for the font changes to affect most math symbols and letters, % we have to define the extfont of the standard families. Since % texinfo doesn't allow for producing subscripts and superscripts, we % don't bother to reset riptfont and riptscriptfont (which would % also require loading a lot more fonts). % efesetmathfonts{%
extfont0 = enrm extfont1 = eni extfont2 = ensy
extfontitfam = enit extfontfam = ensl extfontam = enbf
extfonttfam = entt extfontfam = ensf }

% The font-changing commands redefine the meanings of enSTYLE, instead % of just % in math mode, where it is the current m that is relevant in most % cases, not the current font. Plain TeX does efm=am % enbf}, for example. By redefining enbf, we obviate the need to % redefine . efextfonts{%
nrm=extrm nit=extit nsl=extsl
nbf=extbf ntt=exttt xtsc
nsf=extsf ni=exti nsy=extsy nttsl=extttsl
esetmathfonts} efitlefonts{%
nrm=itlerm nit=itleit nsl=itlesl
nbf=itlebf ntt=itlett sc
nsf=itlesf ni=itlei nsy=itlesy
nttsl=itlettsl
esetmathfonts tleading{25pt}} efitlefont#1{{itlefontsm #1}} efhapfonts{%
nrm=haprm nit=hapit nsl=hapsl
nbf=hapbf ntt=haptt
nsf=hapsf ni=hapi nsy=hapsy nttsl=hapttsl
esetmathfonts tleading{19pt}} efcfonts{%
nrm=crm nit=cit nsl=csl
nbf=cbf ntt=ctt
nsf=csf ni=ci nsy=csy nttsl=cttsl
esetmathfonts tleading{16pt}} efbsecfonts{%
nrm=ecrm nit=ecit nsl=ecsl
nbf=ecbf ntt=ectt csc
nsf=ecsf ni=eci nsy=ecsy nttsl=ecttsl
esetmathfonts tleading{15pt}} cfonts = bsecfonts % Maybe make sssec fonts scaled magstephalf? efindexfonts{%
nrm=indrm nit=indit nsl=indsl
nbf=indbf ntt=indtt
nsf=indsf ni=indi nsy=indsy nttsl=indttsl
esetmathfonts tleading{12pt}}

% Set up the default fonts, so we can use them for creating boxes. % extfonts

% Define these so they can be easily changed for other fonts. efngleleft{$ efngleright{$angle$}

% Count depth in font-changes, for error checks 0wcountntdepth ntdepth=0

% Fonts for short table of contents. tfontortcontrmmshape{12}{1000} tfontortcontbf tfontortcontslshape{12}{1000}

%% Add scribe-like font environments, plus @l for inline lisp (usually sans %% serif) and @ii for TeX italic

% artitalic{ARG} outputs arg in italics, followed by an italic correction % unless the following character is such as not to need one. efartitalicx{ifx0xt,\lseifx0xt-\lseifx0xt.\lse} efartslanted#1{{ #1}turelet0xtartitalicx} efartitalic#1{{it #1}turelet0xtartitalicx}

d d =artslanted

ef

% We can't just use \xhyphenpenalty, because that only has effect at % the end of a paragraph. Restore normal hyphenation at the end of the % group within which 0hyphenation is presumably called. % ef0hyphenation{nt = -1 ftergroupestorehyphenation} efestorehyphenation{nt = `- }

ef#1{%
{t awbackslash enchspacing #1}%
0ll } efmp#1{`close{#1}'0ll} tfontallrmmshape{8}{1000} ntallsy=cmsy9 efy#1{{allrmextfont2=allsy vmode
aise0.4pt


rn-0.4pt
rn-.06emaise0.4pt % The old definition, with no lozenge: %efy #1{{tsl 0hyphenation ppercase{#1}}0ll} eftrl #1{{t awbackslash

% @file, @option are the same as @samp. le=mp

% @code is a modification of @t, % which makes spaces the same size as normal in the surrounding text. efclose#1{%
{%
% Change normal interword space to be same as for the current font.
aceskip = ntdimen2nt
%
% Switch to typewriter.
t
%
% But ` ' produces the large typewriter interword space.
ef {{aceskip = 0pt{} }}%
%
% Turn off hyphenation.
0hyphenation
%
awbackslash
enchspacing
#1%
}%
0ll }

% We *must* turn on hyphenation at `-' and `_' in ode. % Otherwise, it is too hard to avoid overfull hboxes % in the Emacs manual, the Library manual, etc.

% Unfortunately, TeX uses one parameter ( % both hyphenation at - and hyphenation within words. % We must therefore turn them both off (close does that) % and arrange explicitly to hyphenate at a dash. % -- rms. {
atcode`-=ctive
atcode`_=ctive
%
obalefode{
atcode`-=ctive dash
atcode`_=ctive under
odex
}
%
% If we end up with any active - characters when handling the index,
% just treat them as a normal -.
obalefindexbreaks{atcode`-=ctive aldash} }

efealdash{-} efodedash{-iscretionary{}{}{}} efodeunder{ifusingtt{0rmalunderscoreiscretionary{}{}{}}{_}} efodex #1{close{#1}\ndgroup}

% %Was temporary

% @kbd is like @code, except that if the argument is just one @key command, % then @kbd has no effect.

% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always), % `example' (@kbd uses ttsl only inside of @example and friends), % or `code' (@kbd uses normal tty font always). efdinputstyle{arseargdinputstylexxx}
efdinputstylexxx#1{%
efrg{#1}%
ifxrg240
efdexamplefont{tsl}efdfont{tsl}%
\lseifxrg216
efdexamplefont{tsl}efdfont{t}%
\lseifxrg72de
efdexamplefont{t}efdfont{t}%
} ef480 ef432 ef72de{code}

% Default is kbdinputdistinct. (Too much of a hassle to call the macro, % the catcodes are wrong for parsearg to work.) efdexamplefont{tsl}efdfont{tsl}

ef efdfoo#1#2#3ar{ef ifx \lse{close{dfontk}} \lse{close{dfontk}}}

% For @url, @env, @command quotes seem unnecessary, so use ode.

% @uref (abbreviation for `urlref') takes an optional second argument % specifying the text to display. First (mandatory) arg is the url. % Perhaps eventually put in a hypertex ecial here. % efref#1{refxxx #1,,nish} efrefxxx#1,#2,#3nish{%
tbox0 =
ifdim168
nhbox0 (ode{#1})%
\lse
ode{#1}%
}

% rms does not like the angle brackets --karl, 17may97. % So now @email is just like @uref. %ef\mail#1{ngleleft{t #1}ngleright} f

% Check if we are currently using a typewriter font. Since all the % Computer Modern typewriter fonts have zero interword stretch (and % shrink), and it is reasonable to expect all typewriter fonts to have % this property, we can check that font parameter. % efifmonospace{ifdimntdimen3nt=0pt }

% 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 @dmn{}pt. % efmn#1{hinspace #1}

efd#1{efk{#1}\xpandafterdfook??ar}

% @l was never documented to mean ``switch to the Lisp font'', % and it is not used as such in any manual I can find. We need it for % Polish suppressed-l. --karl, 22sep96. %ef

% Explicit font changes: @r, @sc, undocumented @ii. ef#1{{m #1}} % roman font ef#1{{allcaps#1}} % smallcaps font efii#1{{it #1}} % italic font

% @acronym downcases the argument and prints in smallcaps. efcronym#1{{allcaps

% @pounds{} is a sterling sign. efounds{{it}

ssage{page headings,}

0wskipitlepagetopglue itlepagetopglue = 1.5in 0wskipitlepagebottomglue itlepagebottomglue = 2pc

% First the title page. Must do @settitle before @titlepage. 0wififseenauthor 0wififfinishedtitlepage

% Do an implicit @contents or @shortcontents after @end titlepage if the % user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage. % 0wififsetcontentsaftertitlepage
ntsaftertitlepage = tcontentsaftertitlepagetrue 0wififsetshortcontentsaftertitlepage
ntsaftertitlepage = tshortcontentsaftertitlepagetrue

eforttitlepage{arseargorttitlepagezzz}
eforttitlepagezzz #1{
\ndgroupage

efitlepage{nt=0pt extfonts
rm=enrm
efbtitlefont{btitlerm 0rmalbaselineskip = 13pt 0rmalbaselines}%
%
efuthorfont{uthorrm 0rmalbaselineskip = 16pt 0rmalbaselines}%
%
% Leave some space at the very top of the page.
etopglue
%
% Now you can print the title using @title.
efitle{arseargitlezzz}%

efitlezzz##1{{itlefontsm ##1}
% print a rule at the page bottom also.
nishedtitlepagefalse

% No rule at page bottom unless we print one at the top with @title.
nishedtitlepagetrue
%
% Now you can put text using @subtitle.
efbtitle{arseargbtitlezzz}%

efbtitlezzz##1{{btitlefont ightline{##1}}}%
%
% @author should come last, but may come many times.
efuthor{arsearguthorzzz}%

efuthorzzz##1{ifseenauthor\lse 1filllenauthortrue
{uthorfont {##1}}}%
%
% 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.

efage{%

iffinishedtitlepage\lse
nishtitlepage


=
% efage{ }

efitlepage{%
iffinishedtitlepage\lse
nishtitlepage

% It is important to do the page break before ending the group,
% because the headline and footline are only empty inside the group.
% If we use the new definition of age,
we always get a blank page
% after the title page, which we certainly don't want.

\ndgroup
%
% If they want short, they certainly want long too.
ifsetshortcontentsaftertitlepage
ortcontents
ontents
obalnts = elax
obalnts = elax

%
ifsetcontentsaftertitlepage
ontents
obalnts = elax
obalnts = elax

%
}

efnishtitlepage{%


nishedtitlepagetrue }

%%% Set up page headings and footings.

=lio

0wtoks\venheadline % headline on even pages 0wtoksheadline % headline on odd pages 0wtoks\venfootline % footline on even pages 0wtoksfootline % footline on odd pages

% Now make Tex use those variables ={{extfontsm ifoddageno
heheadline
\lse he\venheadline }} otline={{extfontsm ifoddageno
hefootline
\lse he\venfootline }

% Commands to set those variables. % For example, this is what @headings on does % @evenheading @thistitle|@thispage|@thischapter % @oddheading @thischapter|@thispage|@thistitle % @evenfooting @thisfile|| % @oddfooting ||@thisfile

ef\venheading{arsearg\venheadingxxx}
efheading{arseargheadingxxx}
ef\veryheading{arsearg\veryheadingxxx}

ef\venfooting{arsearg\venfootingxxx}
effooting{arseargfootingxxx}
ef\veryfooting{arsearg\veryfootingxxx}

{atcode`@=0 %

ef\venheadingxxx #1{\venheadingyyy #1@|@|@|@|nish} ef\venheadingyyy #1@|#2@|#3@|#4nish{% obal\venheadline={lap{enterline{#2}}

efheadingxxx #1{headingyyy #1@|@|@|@|nish} efheadingyyy #1@|#2@|#3@|#4nish{% obalheadline={lap{enterline{#2}}

ef\veryheadingxxx#1{headingxxx{#1}\venheadingxxx{#1}}%

ef\venfootingxxx #1{\venfootingyyy #1@|@|@|@|nish} ef\venfootingyyy #1@|#2@|#3@|#4nish{% obal\venfootline={lap{enterline{#2}}

effootingxxx #1{footingyyy #1@|@|@|@|nish} effootingyyy #1@|#2@|#3@|#4nish{%
obalfootline = {lap{enterline{#2}}
%
% Leave some space for the footline. Hopefully ok to assume
% @evenfooting will not be used by itself.
obaldvanceageheight
by -
obaldvance }

ef\veryfootingxxx#1{footingxxx{#1}\venfootingxxx{#1}} % }% unbind the catcode of @.

% @headings double turns headings on for double-sided printing. % @headings single turns headings on for single-sided printing. % @headings off turns them off. % @headings on same as @headings double, retained for compatibility. % @headings after turns on double-sided headings after this page. % @headings doubleafter turns on double-sided headings after this page. % @headings singleafter turns on single-sided headings after this page. % By default, they are off at the start of a document, % and turned `on' after @end titlepage.

ef HEADINGS#1\ndcsname}

ef obal\venheadline={ootline={ obalheadline={ootline={ % When we turn headings on, set the page number to 1. % For double-sided printing, put current file name in lower left corner, % chapter name on inside top of right hand pages, document % title on inside top of left hand pages, and page numbers on outside top % edge of all pages. ef obalageno=1
obal\venfootline={ obalfootline={ obal\venheadline={lio obalheadline={schapterlio}} obalntsalignmacro = hapoddpage } ntsalignmacro = happager

% For single-sided printing, chapter title goes across top left of page, % page number on top right. ef obalageno=1
obal\venfootline={ obalfootline={ obal\venheadline={schapterlio}} obalheadline={schapterlio}} obalntsalignmacro = happager } ef

ef ef obal\venfootline={ obalfootline={ obal\venheadline={lio obalheadline={schapterlio}} obalntsalignmacro = hapoddpage }

ef ef obal\venfootline={ obalfootline={ obal\venheadline={schapterlio}} obalheadline={schapterlio}} obalntsalignmacro = happager }

% Subroutines used in generating headings % Produces Day Month Year style of output. efoday{0mberayace ifcasenth Januarybuaryachpil July ace0mberyear}

% Use this if you want the Month Day, Year style of output. %efoday{ifcasenth %Januarybuaryachpil %July %ace0mberay, 0mberyear}

% @settitle line... specifies the title of the document, for headings % It generates no output of its own

efhistitle{No Title} efttitle{arseargttitlezzz}
efttitlezzz #1{efhistitle{#1}}

ssage{tables,} % Tables -- @table, @ftable, @vtable, @item(x), @kitem(x), @xitem(x).

% default indentation of table text 0wdimenableindent ableindent=.8in % default indentation of @itemize and @enumerate text 0wdimenitemindent itemindent=.3in % margin between end of table item and start of table text. 0wdimenitemmargin itemmargin=.1in

% used internally for itemindent minus itemmargin 0wdimenitemmax

% Note @table, @vtable, and @vtable define @item, @itemx, etc., with % these defs. % They also define itemindex % to index the item name in whatever manner is desired (perhaps none).

0wififitemxneedsnegativevskip

efitemxpar{arifitemxneedsnegativevskip0breakkip0break}

efinternalBitem{allbreak arseargitemzzz}
efinternalBitemx{itemxpar arseargitemzzz}

efinternalBxitem "#1"{efx{#1} allbreak arsearg efinternalBxitemx "#1"{efx{#1} itemxpar arsearg

efinternalBkitem{allbreak arseargtemzzz}
efinternalBkitemx{itemxpar arseargtemzzz}

eftemzzz #1{osubind {kw}{ode{#1}}{for {
itemzzz {#1}}

efnd {kw}{ode{#1}}{for {
itemzzz {#1}}

efitemzzz #1{
dvancekip
dvance
tbox0=
itemindex{#1}%
0break % This prevents a break before @itemx.
%
% 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
% line. We do not start a paragraph here because then if the next
% command is, e.g., @kindex, the whatsit would get put into the
% horizontal list on a line by itself, resulting in extra blank space.
ifdim 216
%
% Make this a paragraph so we get the arskip
glue and wrapping,
% but leave it ragged-right.

dvanceindent
dvance
dvanceightskip by0pt plus1fil
vmodenhbox0ar

\ndgroup
%
% We're going to be starting a paragraph, but we don't want the
% arskip
glue -- logically it's part of the @item we just started.
0break kip
%
% Stop a page break at the arskip
glue coming up. Unfortunately
% we can't prevent a possible page break at the following
%
0break
\ndgroup
itemxneedsnegativevskipfalse
\lse
% The item text fits into the space. Start a paragraph, so that the
% following text (if any) will end up on the same line.
0indent
% Do this with kerns and nhbox so that if there is a footnote in
% the item text, it can migrate to the main vertical list and
% eventually be printed.
0breakrn-ableindent
imen0 = itemmax dvanceimen0 by itemmargin dvanceimen0 by -24
nhbox0
0breakrnimen0
\ndgroup
itemxneedsnegativevskiptrue
}

efitem{\rrmessage{@item while not in a table}} efitemx{\rrmessage{@itemx while not in a table}} eftem{\rrmessage{@kitem while not in a table}} eftemx{\rrmessage{@kitemx while not in a table}} eftem while not in a table}} eftemx while not in a table}}

% Contains a kludge to get @end[description] to work. efescription{ablez{ontindex}{1}{}{}{}{}}

% @table, @ftable, @vtable. efable{ { efablex #1^^M{% ableyontindex#1 \ndtabley}}

efable{ablex} { efablex #1^^M{% ableyitemindex#1 \ndtabley efable{\ndgraffterenvbreak\ndgroup}% =elax}}

ef { ef abley eferenvbreak\ndgroup}% =elax}}

efontindex #1{} efitemindex #1{oind {fn}{ode{#1}}}% ef}{ode{#1}}}%

{ efabley#1#2 #3 #4 #5 #6 #7\ndtabley{\ndgroup% ablez{#1}{#2}{#3}{#4}{#5}{#6}}}

efablez #1#2#3#4#5#6{% boveenvbreak % efescription{able}% Necessary kludge. mindex=#1% ifnum 0#3>0 dvance % ifnum 0#4>0 ableindent=#4l % ifnum 0#5>0 dvance ightskip by #5l % efitemfont{#2}% itemmax=ableindent % dvance itemmax by -itemmargin % dvance indent % \xdentamount=ableindent arindent
= 0pt arskip
= allskipamount ifdim arskip=0pt
arskip=2pt
% efable{\ndgraffterenvbreak\ndgroup}% m = internalBitem % mx = internalBitemx % m = internalBkitem % mx = internalBkitemx % m % mx % }

% This is the counter used by @enumerate, which is really @itemize

0wcount itemno

efitemize{arseargitemizezzz}

efitemizezzz #1{%
nded by the @end itemize
itemizey {#1}{itemize} }

efitemizey #1#2{% boveenvbreak % itemmax=itemindent % dvance itemmax by -itemmargin % dvance mindent % \xdentamount=itemindent arindent
= 0pt % arskip
= allskipamount % ifdim arskip=0pt
arskip=2pt
% ef#2{\ndgraffterenvbreak\ndgroup}% efitemcontents{#1}% m=itemizeitem}

% Set sfcode to normal for the chars that usually have another value. % These are `.?!:;,' efenchspacing{code46=1000 code63=1000 code33=1000
code58=1000 code59=1000 code44=1000 }

% litoff TOKENS\ndmark defines rst to be the first token in % TOKENS, and est to be the remainder. % eflitoff#1#2\ndmark{efrst{#1}efest{#2}}%

% Allow an optional argument of an uppercase letter, lowercase letter, % or number, to specify the first label in the enumerated list. No % argument is the same as `1'. % ef\numerate{arsearg\numeratezzz}
ef\numeratezzz #1{\numeratey #1 \ndenumeratey} ef\numeratey #1 #2\ndenumeratey{%
nded by the @end enumerate
%
% If we were given no argument, pretend we were given `1'.
efhearg{#1}%
ifxhearg\mpty efhearg{1}
%
% Detect if the argument is a single token. If so, it might be a
% letter. Otherwise, the only valid thing it can be is a number.
% (We will always have one token, because of the test we just made.
% This is a good thing, since litoff doesn't work given nothing at
% all -- the first parameter is undelimited.)
\xpandafterlitoffhearg\ndmark
ifxest\mpty
% Only one token in the argument. It could still be anything.
% A ``lowercase letter'' is one whose ode is nonzero.
% An ``uppercase letter'' is one whose ode is both nonzero, and
% not equal to itself.
% Otherwise, we assume it's a number.
%
% We need the elax at the end of the ifnum lines to stop TeX from
% continuing to look for a <number>.
%
ifnumode\xpandafter`hearg=0elax
0mericenumerate % a number (we hope)
\lse
% It's a letter.
ifnumode\xpandafter`hearg=\xpandafter`heargelax
wercase letter
\lse
ppercaseenumerate % uppercase letter


\lse
% Multiple tokens in the argument. We hope it's a number.
0mericenumerate
}

% An @enumerate whose labels are integers. The starting integer is % given in hearg. % ef0mericenumerate{%
itemno = hearg
artenumeration{heitemno}% }

% The starting (lowercase) letter is in hearg. ef
itemno = \xpandafter`hearg
artenumeration{%
% Be sure we're not beyond the end of the alphabet.
ifnumitemno=0
\rrmessage{No more lowercase letters in @enumerate; get a bigger
alphabet}%

harodeitemno
}% }

% The starting (uppercase) letter is in hearg. efppercaseenumerate{%
itemno = \xpandafter`hearg
artenumeration{%
% Be sure we're not beyond the end of the alphabet.
ifnumitemno=0
\rrmessage{No more uppercase letters in @enumerate; get a bigger
alphabet}

harccodeitemno
}% }

% Call itemizey, adding a period to the first argument and supplying the % common last two arguments. Also subtract one from the initial value in % itemno, since @item increments itemno. % efartenumeration#1{%
dvanceitemno by -1
itemizey{#1.}\numerateushcr }

% @alphaenumerate and @capsenumerate are abbreviations for giving an arg % to @enumerate. % eflphaenumerate{\numerate{a}} efapsenumerate{\numerate{A}} eflphaenumerate{\numerate} efapsenumerate{\numerate}

% Definition of @item while inside @itemize.

efitemizeitem{% dvanceitemno by 1 {ak}% ifhmode \rrmessage{In hmode at itemizeitem} {arskip=0in
lty 1200}}% ushcr}

% @multitable macros % Amy Hendrickson, 8/18/94, 3/6/96 % % @multitable ... @end multitable 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

% Table can continue over pages but will only break between lines.

% To make preamble: % % Either define widths of columns in terms of percent of % @multitable @columnfractions .25 .3 .45 % @item ... % % Numbers following @columnfractions 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. % % For those who want to use more than one line's worth of words in % the preamble, break the line within one argument and it % will parse correctly, i.e., % % @multitable {Column 1 template} {Column 2 template} {Column 3 % template} % Not: % @multitable {Column 1 template} {Column 2 template} % {Column 3 template}

% 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, @multitable or @end multitable 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. % @end multitable

% Default dimensions may be reset by user. % @multitableparskip is vertical space between paragraphs in table. % @multitableparindent is paragraph indent in table. % @multitablecolmargin is horizontal space to be left between columns. % @multitablelinespace is space to leave between table items, baseline % to baseline. % 0pt means it depends on current normal line spacing. % 0wskipltitableparskip 0wskipltitableparindent 0wdimenltitablecolspace 0wskipltitablelinespace ltitableparskip=0pt ltitableparindent=6pt ltitablecolspace=12pt ltitablelinespace=0pt

% Macros used to set up halign preamble: % tuptableelax eftuptable{\ndsetuptable} lax eftions{olumnfractions} 0wififsetpercent

% #1 is the part of the @columnfraction before the decimal point, which % is presumably either 0 or the empty string (but we don't check, we % just throw it away). #2 is the decimal part, which we use as the % percent of column. efickupwholefraction#1.#2
{%
obaldvanceolcount by 1
\xpandaftercsname{.#2
tuptable }

0wcountolcount eftuptable#1{%
efrstarg{#1}%
ifxrstargtuptable
lax
\lse
ifxrstargtions
obaltpercenttrue
\lse
ifsetpercent
fraction
\lse
obaldvanceolcount by 1
tbox0=
% typically that is always in the input, anyway.
\xpandaftercsname{he72


ifxickupwholefraction

% Put the argument back for the ickupwholefraction
call, so
% we'll always have a period there to be parsed.
ef{ickupwholefraction#1}%

\lse

%

}

% multitable syntax efab{&pelax} % 2/2/96
% tiny skip here makes sure this column space is
% maintained, even if it is never used.

% @multitable ... @end multitable definitions: % efltitable{arseargotable}
efotable#1{
kip
mrcr
olerance=9500

tmultitablespacing
arskip=ltitableparskip

arindent=ltitableparindent


obalolcount=0
efltitable{obaltpercentfalser\group\group}%
%
% To parse everything between @multitable and @item:
tuptable#1 \ndsetuptable
%
% \verycr will reset column counter, olcount, at the end of
% each line. Every column entry will cause olcount to advance by one.
% The table preamble
% looks at the current olcount to find the correct column width.
\verycr{0align{%
%
% lbreak%% keeps underfull box messages off when table breaks over pages.
% Maybe so, but it also creates really weird page breaks when the table
% breaks over pages. Wouldn't
% manifests itself, so it can be fixed for real --karl.
obalolcount=0elax}}%
%
% This preamble sets up a generic column definition, which will
% be used as many times as user calls for columns.
% a single line and will also let text wrap and
% continue for many paragraphs if desired.

ltistrut\ndcsname
%
% In order to keep entries from bumping into each other
% we will add a colspace to all columns after
% the first one.
%
% If a template has been used, we will add ltitablecolspace
% to the width of each template entry.
%
% If the user has set preamble in terms of percent of
% use that dimension as the width of the column, and the
% will keep entries from bumping into each other. Table will start at
% left margin and final column will justify at right margin.
%
% Make sure we don't inherit ightskip from the outer environment.
ightskip=0pt
ifnumolcount=1
% The first column will be indented with the surrounding text.
dvance
\lse
ifsetpercent \lse
% If user has not set preamble in terms of percent of
% we will advance pace.
dvancepace

% In either case we will make colspace:
colspace

% Ignoring space at the beginning and end avoids an occasional spurious
% blank line, when TeX decides to break the line at the space before the
% box from the multistrut, so the strut ends up on a line by itself.
% For example:
% @multitable @columnfractions .11 .89
% @item @code{#}
% @tab Legal holiday which is valid in major parts of the whole country.
% Is automatically provided with highlighting sequences respectively marking
% characters.
0indentignorespaces##nskipltistrut}r }

eftmultitablespacing{% test to see if user has set ltitablelinespace. % If so, do nothing. If not, give it an appropriate dimension based on % current baselineskip. ifdimltitablelinespace=0pt %% strut to put in table in case some entry doesn't have descenders, %% to keep lines equally spaced %% Test to see if parskip is larger than space between lines of %% table. If not, do nothing. %% If so, set to same dimension as multitablelinespace. \lse efltistrut{ width0ptelax} ifdimltitableparskip>ltitablelinespace oballtitableparskip=ltitablelinespace obaldvanceltitableparskip-7pt %% to keep parskip somewhat smaller
%% than skip between lines in the table. % ifdimltitableparskip=0pt oballtitableparskip=ltitablelinespace obaldvanceltitableparskip-7pt %% to keep parskip somewhat smaller
%% than skip between lines in the table. }

ssage{indexing,} % Index generation facilities

% Define 0wwrite to be identical to plain tex's 0wwrite % except not sed within 0windex. {atcode`@=11 ef0wwrite{lloc@7120defxt@@n}}

% 0windex {foo} defines an index named foo. % It automatically defines oindex such that % oindex ...rest of line... puts an entry in the index foo. % It also defines oindfile to be the number of the output channel for % the file that accumulates this index. The file's extension is foo. % The name of an index should be no more than 2 characters long % for the sake of vms. % ef0windex#1{%
iflinks
\xpandafter0wwrite sname#1indfile\ndcsname
Oen the file

\xpandafterex\ndcsname{% % Define @#1index
0expandoindex{#1}} }

% @defindex foo == 0windex{foo}

efefindex{arsearg0windex}

% Define @defcodeindex, like @defindex except put all entries in @code.

ef0wcodeindex#1{%
iflinks
\xpandafter0wwrite sname#1indfile\ndcsname


\xpandafterex\ndcsname{%
0expandocodeindex{#1}} }

efefcodeindex{arsearg0wcodeindex}

% @synindex foo bar makes index foo feed into index bar. % Do this instead of @defindex foo if you don't want it as a separate index. % The loseout helps reduce unnecessary open files; the limit on the % Acorn RISC OS is a mere 16 files. efnindex#1 #2 {%
\xpandafterrnindexfoo\xpandafter=sname#2indfile\ndcsname
\xpandafterloseoutsname#1indfile\ndcsname
\xpandafter#1indfile\ndcsname=nindexfoo
\xpandafterex\ndcsname{% define index
0expandoindex{#2}}% }

% @syncodeindex foo bar similar, but put all entries made for index foo % inside @code. efncodeindex#1 #2 {%
\xpandafterrnindexfoo\xpandafter=sname#2indfile\ndcsname
\xpandafterloseoutsname#1indfile\ndcsname
\xpandafter#1indfile\ndcsname=nindexfoo
\xpandafterex\ndcsname{% define index
0expandocodeindex{#2}}% }

% Define oindex, the driver for all oindex macros. % Argument #1 is generated by the calling oindex macro, % and it is "foo", the name of the index.

% oindex just uses arsearg;
it calls oind for the actual work. % This is because oind is more useful to call from other macros.

% There is also osubind {index}{topic}{subtopic} % which makes an entry in a two-level index such as the operation index.

efoindex#1{\defindexname{#1}arseargngleindexer}
efngleindexer #1{oind{indexname}{#1}}

% like the previous two, but they put @code around the argument. efocodeindex#1{\defindexname{#1}arseargnglecodeindexer}
efnglecodeindexer #1{oind{indexname}{ode{#1}}}

efindexdummies{% ef { }% % Take care of the plain tex accent commands. ef ef`{ealbackslash `}% ef´{ealbackslash '}% ef{ealbackslash ^}% ef {ealbackslash ~}% ef={ealbackslash =}% ef ef{ealbackslash c}% ef{ealbackslash d}% ef{ealbackslash u}% ef ef % Take care of the plain tex special European modified letters. efralbackslash oe}% efe{ealbackslash ae}% efa{ealbackslash aa}% ef{ealbackslash OE}% ef}% efA}% ef efealbackslash O}% ef ef ef{ealbackslash ss}% % Take care of texinfo commands likely to appear in an index entry. % (Must be a way to avoid doing expansion at all, and thus not have to % laboriously list every single command here.) ef@{@}% will be @@ when we switch to @ as escape char. % Need these in case ex is in effect and is a elimiter again. % But can't use racecmd because texindex assumes % braces and backslashes are used only as delimiters. ef_{{ealbackslash _}}% ef408 ef }% %efm{ealbackslash rm }% ef{ealbackslash sl }% ef{ealbackslash sf}% eft{ealbackslash tt}% efr{ealbackslash gtr}% efalbackslash less}% eflbackslash hat}% efTeX{ealbackslash TeX}% efots{ealbackslash dots }% efesult{ealbackslash result}% ef\quiv{ealbackslash equiv}% ef\xpansion{ealbackslash expansion}% efrint{ealbackslash
print}% ef\rror{ealbackslash error}% efoint{ealbackslash
point}% efopyright{ealbackslash copyright}% efclose##1{ealbackslash tclose {##1}}% efode##1{ealbackslash code {##1}}% efref##1{ealbackslash uref {##1}}% efrl##1{ealbackslash url {##1}}% ef\nv##1{ealbackslash env {##1}}% efommand##1{ealbackslash command {##1}}% efotion {##1}}% efotless##1{ealbackslash dotless {##1}}% efmp##1{ealbackslash samp {##1}}% ef##1{ealbackslash ,{##1}}% ef##1{ealbackslash t {##1}}% ef##1{ealbackslash r {##1}}% efi##1{ealbackslash i {##1}}% ef1{ealbackslash b {##1}}% ef##1{ealbackslash sc {##1}}% efite##1{ealbackslash cite {##1}}% efy##1{ealbackslash key {##1}}% efle##1{ealbackslash file {##1}}% eflbackslash var {##1}}% efd##1{ealbackslash kbd {##1}}% effn##1{ealbackslash dfn {##1}}% ef\mph##1{ealbackslash emph {##1}}% efcronym##1{ealbackslash acronym {##1}}% % % Handle some cases of @value -- where the variable name does not % contain - or _, and the value does not contain any % (non-fully-expandable) commands. value % nsepspaces }

% If an index command is used in an @example environment, any spaces % therein should become regular spaces in the raw index file, not the % expansion of ie (\leavevmode enalty
@M  ). {
efnsepspaces{

% indexnofonts no-ops all font-change commands. % This is used when outputting the strings to sort the index by. efindexdummyfont#1{#1} efindexdummytex{TeX} efindexdummydots{...}

efindexnofonts{% % Just ignore accents. xdummyfont xdummyfont xdummyfont xdummyfont xdummyfont xdummyfont xdummyfont xdummyfont xdummyfont indexdummyfont indexdummyfont ss=indexdummyfont % Take care of the plain tex special European modified letters. efo}% efe{ae}% efa{aa}% ef{OE}% ef}% efA}% ef efO}% ef ef ef{ss}% xdummyfont xdummyfont xdummyfont xdummyfont xdummyfont =indexdummyfont xdummyfont %Don't no-op t, since it isn't a user-level command % and is used in the definitions of the active chars like <, >, |... %xdummyfont =indexdummyfont =indexdummyfont xdummyfont f=indexdummyfont xdummyfont xdummyfont le=indexdummyfont xdummyfont xdummyfont xdummyfont X=indexdummytex xdummydots ef@{@}% }

% To define ealbackslash, we must make  not be an escape. % We must first make another character (@) an escape % so we do not become unable to do a definition.

{atcode`@=0 atcode`\=
@gdef@realbackslash{}

xbackslash=0 %overridden during rintindex.

% For ifx comparisons. ef\mptymacro{\mpty}

% Most index entries go through here, but osubind is the general case. % efoind#1#2{osubind{#1}{#2}\mpty}

% Workhorse for all oindexes. % #1 is name of index, #2 is stuff to put there, #3 is subentry -- % \mpty if called from oind, as we usually are. The main exception % is with defuns, which call us directly. % efosubind#1#2#3{%
% Put the index entry in the margin if desired.
ifx
insertrgin{

{%
ount255=lty
{%
indexdummies % Must do this here, since
\scapechar=`\
{%
lio = 0% We will expand all macros now EXCEPT lio.
efawbackslashxx{indexbackslash}% indexbackslash isn't defined now
% so it will be output as is; and it will print as backslash.
%
efhirdarg{#3}%
%
% If third arg is present, precede it with space in sort key.
ifxhirdarg\mptymacro
ntry = \mpty
\lse
efbentry{ #3}%

%
% First process the index-string with all font commands turned off
% to get the string to sort by.
{indexnofonts exsorttmp{#2bentry}}%
%
% Now produce the complete index entry, with both the sort key and the
% original text, including any font commands.
oks0 = {#2}%
\defemp{%
672
ealbackslash entry{indexsorttmp}{lio}{heoks0}}%
}%
%
% If third (subentry) arg is present, add it to the index string.
ifxhirdarg\mptymacro \lse
oks0 = {#3}%
\defemp{emp{heoks0}}%

%
% If a skip is the last thing on the list now, preserve it
% by backing up by
% the skip again. Otherwise, the whatsit generated by the
% 600
% like this:
% @end defun
% @tindex whatever
% @defun ...
% will have extra space inserted, because the dbreak in the
% start of the @defun won't see the skip inserted by the @end of
% the previous defun.
%
% But don't do any of this if we're not in vertical mode. We
% don't want to do a
%
% Avoid page breaks due to these extra skips, too.
%
iflinks
ifvmode
ip0 =
ifdimk

%
emp % do the write
%
%
ifvmode ifdimip0 = 0pt \lse 0break

}%
}%
enaltyount255

}% }

% The index entry written in the file actually looks like % \ntry {sortstring}{page}{topic} % or % \ntry {sortstring}{page}{topic}{subtopic} % The texindex program reads in these files and writes files % containing these kinds of lines: % initial {c} % before the first topic whose initial is c % \ntry {topic}{pagelist} % for a topic that is used without subtopics % rimary
{topic} % for the beginning of a topic that is used with subtopics % condary {subtopic}{pagelist} % for each subtopic.

% Define the user-accessible indexing commands % @findex, @vindex, @kindex, @cindex.

efndex {index} efndex {index} efindex {pindex} ef efindex {pindex} efindex
{gindex}

efindexsub { { efindexsub "#1" #2^^M{\ndgroup % osubind{cp}{#2}{#1}}}

% Define the macros used in formatting output of the sorted index material.

% @printindex causes a particular index (the ??s file) to get printed. % It does not print any chapter heading (usually an @unnumbered). % efrintindex{arseargoprintindex}
efoprintindex#1{
obreak hapheadingskip{10000}%
%
indexfonts m
olerance = 9500
indexbreaks
%
% See if the index file exists and is nonempty.
% Change catcode of @ here so that if the index file contains
% initial {@}
% as its first line, TeX doesn't complain about mismatched braces
% (because it thinks @} is a control sequence).
atcode`@ = 11

ifeof 1
% \nddoublecolumns gets confused if there is no text in the index,
% 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
% there is some text.
(Index is nonexistent)
\lse
%
% If the index file exists but is empty, then
% false. We have to make TeX try to read something from the file, so
% it can discover if there is anything in it.
ead 1 to emp
ifeof 1
(Index is empty)
\lse
% Index files are almost Texinfo source, but we use  as the escape
% character. It would be better to use @, but that's too big a change
% to make right now.
efindexbackslash{awbackslashxx}%
atcode`\ = 0
\scapechar = `\
columns
input jobname.#1s
\nddoublecolumns


losein 1 \ndgroup}

% These macros are used by the sorted index file itself. % Change them to control the appearance of the index.

efinitial#1{{%
% Some minor font changes for the special characters.
ntt=ctt
%
% Remove any glue we may have, we'll be inserting our own.
emovelastskip
%
% We like breaks before the index initials, so insert a bonus.
enalty
-300
%
% Typeset the initial. Making this add up to a whole number of
% baselineskips increases the chance of the dots lining up from column
% to column. It still won't often be perfect, because of the stretch
% we need before each entry, but it's better.
%
% No shrink because it confuses ncecolumns.

{cbf #1}%

%
% Do our best not to break after the initial.
0break }}

% 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 % ef\ntry#1#2{
%
% Start a new paragraph if necessary, so our assignments below can't
% affect previous text.
ar

%
% Do not fill out the last line with white space.
arfillskip
= 0in
%
% No extra space above this paragraph.
arskip
= 0in
%
% Do not prefer a separate line ending with a hyphen to fewer lines.
nalhyphendemerits = 0
%
% nt 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.
%
% fter is reset to 1 (which is the value we want) at the start
% of each paragraph, so we need not do anything with that.

%
% When the entry text needs to be broken, just fill out the first line
% with blank space.
ightskip = 0pt plus1fil
%
% A bit of stretch before each entry for the benefit of balancing columns.
1pt
%
% Start a ``paragraph'' for the index entry so the line breaking
% parameters we've set above will have an effect.
0indent
%
% Insert the text of the index entry. TeX will do line-breaking on it.
#1%
% The following is kludged 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.
efempa{{m }}%
efempb{#2}%
\defempc{empa}%
\defempd{empb}%
ifxempcempd \lse%
%
% If we must, put the page number on a line of its own, and fill out
% this line with blank space. (The
% fill leaders glue in indexdotfill if the page number does fit.)

0ll0breakindexdotfill % Have leaders before the page number.
%
% The ` ' here is removed by the implicit nskip that TeX does as
% part of (the primitive) ar.
Without it, a spurious underfull
%
 #2% The page number ends the paragraph.
%
ar
\ndgroup}

% Like otfill except takes at least 1 em. efindexdotfill{leaders

efrimary
#1{

0wskipcondaryindent condaryindent=0.5cm

efcondary #1#2{ {arfillskip=0in
arskip=0in
0indent }}

% Define two-column mode, which we use to typeset indexes. % Adapted from the TeXbook, page 416, which is to say, % the manmac.tex format used to print the TeXbook itself. atcode`@=11

0wboxartialpage
0wdimenoublecolumnhsize

efcolumns{nded by \nddoublecolumns
% Grab any single-column material above us.
pt = {obaltboxartialpage
=
%
% Here is a possibility not foreseen in manmac: if we accumulate a
% whole lot of material, we might end up calling this pt
% routine twice in a row (see the doublecol-lose test, which is
% essentially a couple of indexes with @setchapternewpage off). In
% that case, we must prevent the second artialpage
from
% simply overwriting the first, causing us to lose the page.
% This will preserve it until a real output routine can ship it
% out. Generally, artialpage
will be empty when this runs and
% this will be a no-op.
nvboxartialpage

%
% Unvbox the main output page.
nvbox255
rn-opskip rn
}}%
\ject % run that output routine to set artialpage

%
% Use the double-column output routine for subsequent pages.
pt = {oublecolumnout}%
%
% Change the page size parameters. We could do this once outside this
% routine, in each of @smallbook, @afourpaper, and the default 8.5x11
% format, but then we repeat the same computation. Repeating a couple
% of assignments once per index is clearly meaningless for the
% execution time, so we may as well do it in one place.
%
% 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, oublecolumhsize, so we
% can restore it in agesofar,
after elf has (potentially)
% been clobbered.
%
oublecolumnhsize =
dvanceoublecolumnhsize by -.04154
ivideoublecolumnhsize by 2
ize
%
% Double the well. (We don't need a separate register here,
% since nobody clobbers
dvance
}

% The double-column output routine for all double-column pages except % the last. % efoublecolumnout{%
littopskip=opskip litmaxdepth=xdepth
% Get the available space for the double columns -- the normal
% (undoubled) page height minus any material left over from the
% previous page.
imen@ =
ivideimen@ by 2
%
% box0 will be the left-hand column, box2 the right.
tbox0=

nvbox255
enaltyptpenalty
} efagesofar{%

% Re-output the contents of the output page -- any previous material,
% followed by the two boxes we just split, in box0 and box2.
dvance
nvboxartialpage

%
ize
48
} ef\nddoublecolumns{%
pt = {%
% Split the last of the double-column material. Leave it on the
% current page, no automatic page break.
ncecolumns
%
% If we end up splitting too much material for the current page,
% though, there will be another page break right after this pt
% invocation ends. Having called ncecolumns once, we do not
% want to call it again. Therefore, reset pt to its normal
% definition right away. (We hope ncecolumns will never be
% called on to balance too much material, but if it is, this makes
% the output somewhat more palatable.)
obalpt = {otentsPAGE}}%
}%
\ject
\ndgroup % started in columns
%
% agegoal
was set to the doubled ince we restarted
% the current page. We're now back to normal single-column
% typesetting, so reset agegoal
to the normal
% \ndgroup where tored).
agegoal
= } efncecolumns{%
% Called at the end of the double column material.
tbox0 = ox255}% like re efficient, see p.120.
imen@ =
dvanceimen@ by opskip
dvanceimen@ by-
ivideimen@ by 2 % target to split to
%debugssage{final 2-column material height=hearget=heimen@.}%
littopskip = opskip
% Loop until we get a decent breakpoint.
{%

p
obaltbox3 = opy0
obaltbox1 =
ifdim
obaldvanceimen@ by 1pt
epeat
}%
%debugssage{split to heimen@, column heights: he
tbox0=ox1}%
tbox2=ox3}%
%
agesofar
} atcode`@ =

ssage{sectioning,} % Define chapters, sections, etc.

0wcounthapno 0wcountcno cno=0 0wcountbsecno bsecno=0 0wcountbsubsecno bsubsecno=0

% This counter is funny since it counts through charcodes of letters A, B, ... 0wcountppendixno ppendixno = `@ efppendixletter{harheppendixno}

% Each @chapter defines this as the name of the chapter. % page headings and footings can use it. @section does likewise. efhischapter{} efhissection{}

0wcountbsseclevel % used to calculate proper heading level 0wcountcbasecbase=0 % @raise/lowersections modify this count

% @raisesections: treat @section as chapter, @subsection as section, etc. efaisesections{obaldvancecbase by -1} sections % original BFox name

% @lowersections: treat @chapter as section, @section as subsection, etc. efns{obaldvancecbase by 1}

% Choose a numbered-heading macro % #1 is heading level if unmodified by @raisesections or @lowersections % #2 is text for heading ef0mhead#1#2{bsseclevel=cbasedvancebsseclevel by #1 ifcasebsseclevel
hapterzzz{#2}
czzz{#2}
0mberedsubseczzz{#2}
0mberedsubsubseczzz{#2} \lse
ifnum bsseclevel<0
hapterzzz{#2}
\lse
0mberedsubsubseczzz{#2}
}

% like 0mhead, but chooses appendix heading levels efpphead#1#2{bsseclevel=cbasedvancebsseclevel by #1 ifcasebsseclevel
ppendixzzz{#2}
ppendixsectionzzz{#2}
ppendixsubseczzz{#2}
ppendixsubsubseczzz{#2} \lse
ifnum bsseclevel<0
ppendixzzz{#2}
\lse
ppendixsubsubseczzz{#2}
}

% like 0mhead, but chooses numberless heading levels efnnmhead#1#2{bsseclevel=cbasedvancebsseclevel by #1 ifcasebsseclevel
nnumberedzzz{#2}
nnumberedseczzz{#2}
nnumberedsubseczzz{#2}
nnumberedsubsubseczzz{#2} \lse
ifnum bsseclevel<0
nnumberedzzz{#2}
\lse
nnumberedsubsubseczzz{#2}
}

% @chapter, @appendix, @unnumbered. efhischaptername{No Chapter Title} efhapteryyy #1{0mhead0{#1}} % normally numhead0 calls chapterzzz efhapterzzz #1{% cno=0 bsecno=0 bsubsecno=0 obaldvance hapno by 1 ssage{utwordChapterace
hehapno}% hapmacro {#1}{hehapno}% efhissection{#1}% efhischaptername{#1}% % We don't substitute the actual chapter name into hischapter % because we don't want its macros evaluated now. Chapter{} hehapno: 0expandhischaptername}% oks0 = {#1}% \defemp{0expand216y{ealbackslash chapentry{heoks0}%
{hehapno}}}% emp onoderef obalredsec obalction = 0mberedsubsec obalction = 0mberedsubsubsec }

efppendixyyy #1{pphead0{#1}} % normally apphead0 calls appendixzzz efppendixzzz #1{% cno=0 bsecno=0 bsubsecno=0 obaldvance ppendixno by 1 ssage{utwordAppendixace
ppendixletter}% hapmacro {#1}{utwordAppendix{}
ppendixletter}% efhissection{#1}% efhischaptername{#1}% Appendix{} ppendixletter: 0expandhischaptername}% oks0 = {#1}% \defemp{0expand216y{ealbackslash chapentry{heoks0}%
{utwordAppendix{}
ppendixletter}}}% emp ppendixnoderef obalndixsec obalction = ppendixsubsec obalction = ppendixsubsubsec }

% @centerchap is like @unnumbered, but the heading is centered. efenterchapyyy #1{{nterchapmacro nnumberedyyy{#1}}}

% @top is like @unnumbered. nmberedyyy}

nmbered{arseargnnumberedyyy}
efnnumberedyyy #1{nnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz efnnumberedzzz #1{% cno=0 bsecno=0 bsubsecno=0 % % This used to be simply ssage{#1}, but TeX fully expands the % argument to ssage. 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 ite 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 ssage, we just want `@cite' itself. We use % he<toks register> to achieve this: TeX expands he<toks> only once, % simply yielding the contents of <toks register>. (We also do this for % the toc entries.) oks0 = {#1}ssage{(heoks0)}% % nnumbchapmacro {#1}% efhischapter{#1}efhissection{#1}% oks0 = {#1}% \defemp{0expand216y{ealbackslash unnumbchapentry{heoks0}}}% emp nnumbnoderef obalredsec obalction = nnumberedsubsec obalction = nnumberedsubsubsec }

% Sections. efcyyy #1{0mhead1{#1}} % normally calls seczzz efczzz #1{% bsecno=0 bsubsecno=0 obaldvance cno by 1 % efhissection{#1}cheading {#1}{hehapno}{hecno}% oks0 = {#1}% \defemp{0expand216y{ealbackslash secentry{heoks0}%
{hehapno}{hecno}}}% emp onoderef 0break }

efppendixsecyyy #1{pphead1{#1}} % normally calls appendixsectionzzz efppendixsectionzzz #1{% bsecno=0 bsubsecno=0 obaldvance cno by 1 % efhissection{#1}cheading {#1}{ppendixletter}{hecno}% oks0 = {#1}% \defemp{0expand216y{ealbackslash secentry{heoks0}%
{ppendixletter}{hecno}}}% emp ppendixnoderef 0break }

nmberedsec{arseargnnumberedsecyyy}
efnnumberedsecyyy #1{nnmhead1{#1}} % normally calls unnumberedseczzz efnnumberedseczzz #1{% lainsecheading
{#1}efhissection{#1}% oks0 = {#1}% \defemp{0expand216y{ealbackslash unnumbsecentry{heoks0}}}% emp nnumbnoderef 0break }

% Subsections. sbsec{arsearg0mberedsubsecyyy}
ef0mberedsubsecyyy #1{0mhead2{#1}} % normally calls numberedsubseczzz ef0mberedsubseczzz #1{% efhissection{#1}bsubsecno=0 obaldvance bsecno by 1 % bsecheading {#1}{hehapno}{hecno}{hebsecno}% oks0 = {#1}% \defemp{0expand216y{ealbackslash subsecentry{heoks0}%
{hehapno}{hecno}{hebsecno}}}% emp onoderef 0break }

sbsec{arseargppendixsubsecyyy}
efppendixsubsecyyy #1{pphead2{#1}} % normally calls appendixsubseczzz efppendixsubseczzz #1{% efhissection{#1}bsubsecno=0 obaldvance bsecno by 1 % bsecheading {#1}{ppendixletter}{hecno}{hebsecno}% oks0 = {#1}% \defemp{0expand216y{ealbackslash subsecentry{heoks0}%
{ppendixletter}{hecno}{hebsecno}}}% emp ppendixnoderef 0break }

nmberedsubsec{arseargnnumberedsubsecyyy}
efnnumberedsubsecyyy #1{nnmhead2{#1}} %normally calls unnumberedsubseczzz efnnumberedsubseczzz #1{% lainsubsecheading
{#1}efhissection{#1}% oks0 = {#1}% \defemp{0expand216y{ealbackslash unnumbsubsecentry%
{heoks0}}}% emp nnumbnoderef 0break }

% Subsubsections. sbsubsec{arsearg0mberedsubsubsecyyy}
ef0mberedsubsubsecyyy #1{0mhead3{#1}} % normally numberedsubsubseczzz ef0mberedsubsubseczzz #1{% efhissection{#1}obaldvance bsubsecno by 1 % bsubsecheading {#1}
{hehapno}{hecno}{hebsecno}{hebsubsecno}% oks0 = {#1}% \defemp{0expand216y{ealbackslash subsubsecentry{heoks0}%
{hehapno}{hecno}{hebsecno}{hebsubsecno}}}% emp onoderef 0break }

sbsubsec{arseargppendixsubsubsecyyy}
efppendixsubsubsecyyy #1{pphead3{#1}} % normally appendixsubsubseczzz efppendixsubsubseczzz #1{% efhissection{#1}obaldvance bsubsecno by 1 % bsubsecheading {#1}
{ppendixletter}{hecno}{hebsecno}{hebsubsecno}% oks0 = {#1}% \defemp{0expand216y{ealbackslash subsubsecentry{heoks0}%
{ppendixletter}{hecno}{hebsecno}{hebsubsecno}}}% emp ppendixnoderef 0break }

nmberedsubsubsec{arseargnnumberedsubsubsecyyy}
efnnumberedsubsubsecyyy #1{nnmhead3{#1}} %normally unnumberedsubsubseczzz efnnumberedsubsubseczzz #1{% lainsubsubsecheading
{#1}efhissection{#1}% oks0 = {#1}% \defemp{0expand216y{ealbackslash unnumbsubsubsecentry%
{heoks0}}}% emp nnumbnoderef 0break }

% These are variants which are not "outer", so they can appear in @ifinfo. % Actually, they should now be obsolete; ordinary section commands should work. efinfotop{arseargnnumberedzzz}
efinfounnumbered{arseargnnumberedzzz}
efinfounnumberedsec{arseargnnumberedseczzz}
efinfounnumberedsubsec{arseargnnumberedsubseczzz}
efinfounnumberedsubsubsec{arseargnnumberedsubsubseczzz}

efinfoappendix{arseargppendixzzz}
efinfoappendixsec{arseargppendixseczzz}
efinfoappendixsubsec{arseargppendixsubseczzz}
efinfoappendixsubsubsec{arseargppendixsubsubseczzz}

efinfochapter{arsearghapterzzz}
efinfosection{arseargctionzzz}
efinfosubsection{arseargbsectionzzz}
efinfosubsubsection{arseargbsubsectionzzz}

% These macros control what the section commands do, according % to what kind of chapter we are in (ordinary, appendix, or unnumbered). % Define them by default for a numbered chapter. obalredsec obalction = 0mberedsubsec obalction = 0mberedsubsubsec

% Define @majorheading, @heading and @subheading

% NOTE on use of % 1) We use % overlong headings to fold. % 2) is set to 10000 because hyphenation in a % heading is obnoxious; this forbids it. % 3) Likewise, headings look best if no arindent
is used, and % if justification is not attempted. Hence aggedright.

efjorheading{arseargjorheadingzzz}
efjorheadingzzz #1{% {dvancehapheadingskip by 10pt hapbreak }% {hapfonts
arindent=0ptaggedright

m #1

efhapheading{arsearghapheadingzzz}
efhapheadingzzz #1{hapbreak % {hapfonts
arindent=0ptaggedright

m #1

% @heading, @subheading, @subsubheading. efarglainsecheading}
efbheading{arsearglainsubsecheading}
efbsubheading{arsearglainsubsubsecheading}

% These macros generate a chapter, section, etc. heading only % (including whitespace, linebreaking, etc. around it), % given all the information in convenient, parsed form.

%%% Args are the skip and penalty (usually negative) efobreak#1#2{arifdimstskipenalty#2}

eftchapterstyle #1 {sname CHAPF#1\ndcsname}

%%% Define plain chapter starts, and page on/off switching for it % Parameter controlling skip before chapter headings (if needed)

0wskiphapheadingskip

efhapbreak{obreak hapheadingskip {-4000}} efhappager{ar efhapoddpage{happager ifoddageno
\lse }

eftchapternewpage #1 {sname CHAPPAG#1\ndcsname}

efHAPPAGoff{% obalntsalignmacro = happager obalpmacro=hapbreak obalalignmacro=happager}

efHAPPAGon{% obalntsalignmacro = happager obalpmacro=happager obalalignmacro=happager obalef

efHAPPAGodd{ obalntsalignmacro = hapoddpage obalpmacro=hapoddpage obalalignmacro=hapoddpage obalef

HAPPAGon

efHAPFplain{ obal obal obalnterchapmacro=enterchfplain}

% Plain chapter opening. % #1 is the text, #2 the chapter number or empty if unnumbered. efhfplain#1#2{%
chapsepmacro

{%
hapfonts m
efhapnum{#2}%
tbox0 = }%


nhbox0 #1ar}%

}%
0breakp % no page break after a chapter title
0break }

% Plain opening for unnumbered. efnnchfplain#1{hfplain{#1}{}}

% @centerchap -- centered and unnumbered. nterparametersmaybe = elax efenterchfplain#1{{%
efenterparametersmaybe{%
dvanceightskip by 3ightskip

arfillskip
= 0pt
}%
hfplain{#1}{}% }}

HAPFplain % The default

efnnchfopen #1{% hapoddpage {hapfonts
arindent=0ptaggedright

m #1 }

efhfopen #1#2{hapoddpage {hapfonts arenalty
5000 % }

efenterchfopen #1{% hapoddpage {hapfonts
arindent=0pt

}

efHAPFopen{ obaln obaln obalnterchapmacro=enterchfopen}

% Section titles. 0wskipcheadingskip efcheadingbreak{obreak cheadingskip {-1000}} efcheading#1#2#3{ctionheading{sec}{#2.#3}{#1}} eflainsecheading#1{ctionheading{sec}{}{#1}}

% Subsection titles. 0wskip bsecheadingskip efbsecheadingbreak{obreak bsecheadingskip {-500}} efbsecheading#1#2#3#4{ctionheading{subsec}{#2.#3.#4}{#1}} eflainsubsecheading#1{ctionheading{subsec}{}{#1}}

% Subsubsection titles. cheadingskip = bsecheadingskip cheadingbreak = bsecheadingbreak efbsubsecheading#1#2#3#4#5{ctionheading{subsubsec}{#2.#3.#4.#5}{#1}} eflainsubsubsecheading#1{ctionheading{subsubsec}{}{#1}}

% Print any size section title. % % #1 is the section type (sec/subsec/subsubsec), #2 is the section % number (maybe empty), #3 the text. efctionheading#1#2#3{%
{%
\xpandafterdvancesname #1headingskip\ndcsname by arskip

sname #1headingbreak\ndcsname
}%
{%
% Switch to the right set of fonts.
sname #1fonts\ndcsname m
%
% Only insert the separating space if we have a section number.
efcnum{#2}%
tbox0 = }%
%


nhbox0 #3}%
}%
ifdimarskip<10pt
0breakrn10pt0breakrn-arskip
0break }

ssage{toc,} 0wwriteocfile

% Write an entry to the toc file, opening it if necessary. % Called from @chapter, etc. We supply {lio} at the end of the % argument, which will end up as the last argument to the ...entry macro. % % We open the .toc file here instead of at @setfilename or any other % given time so that @contents can be put in the document anywhere. % 0wififtocfileopened ef216y#1{%
iftocfileopened\lse
immediate
obalocfileopenedtrue

iflinks 432 }

0wskipontentsrightmargin ontentsrightmargin=1in 0wcountvepageno 0wcounttivepageno tivepageno = -1

% Finish up the main text and prepare to read what we've written % to ocfile. % efartcontents#1{%
% If @setchapternewpage on, and @headings double, the contents should
% start on an odd page, unlike chapters. Thus, we maintain
% ontentsalignmacro in parallel with agealignmacro.

% From: Torbjorn Granlund <tege@matematik.su.se>
ontentsalignmacro
immediateloseoutocfile
%
% Don't need to put `Contents' or `Short Contents' in the headline.
% It is abundantly clear what they are.
nnumbchapmacro{#1}efhischapter{}%
vepageno = ageno

t up to handle contents files properly.
atcode`\=0 atcode`=1 atcode`=2 atcode`@=11
% We can't do this, because then an actual ^ in a section
% title fails, e.g., @chapter ^ -- exponentiation. --karl, 9jul97.
%atcode`=7 % to see ^^e4 as
aggedbottom % Worry more about breakpoints than the bottom.
dvancerightmargin % Don't use the full line length.
%
% Roman numerals for page numbers.
ifnum ageno>0
ageno
= tivepageno }

% Normal (long) toc. efontents{%
artcontents{utwordTableofContents}%


ifeof 1 \lse
losein 1
input jobname.toc


\ndgroup
tivepageno = ageno

ageno
= vepageno }

% And just the chapters. efmmarycontents{%
artcontents{utwordShortContents}%

%
ntry = ortchapentry
ntry = ortunnumberedentry
% We want a true roman here for the page numbers.
cfonts

m
= 10000
dvance little.
efcentry ##1##2##3##4{}
efnnumbsecentry ##1##2{}
efbsecentry ##1##2##3##4##5{}
efnnumbsubsecentry ##1##2{}
efbsubsecentry ##1##2##3##4##5##6{}
efnnumbsubsubsecentry ##1##2{}

ifeof 1 \lse
losein 1
input jobname.toc


\ndgroup
tivepageno = ageno

ageno
= vepageno } nts = mmarycontents

% These macros generate individual entries in the table of contents. % The first argument is the chapter or section name. % The last argument is the page number. % The arguments in between are the chapter number, section number, ...

% Chapter-level things, for both the long and short contents. efhapentry#1#2#3{ochapentry{#2ce#1}{#3}}

% See comments in ochapentry re vbox and related settings efortchapentry#1#2#3{%
ocentry{ortchaplabel{#2}ce #1}{oshortpageno{#3}}% }

% Typeset the label for a chapter or appendix for the short contents. % The arg is, e.g. `Appendix A' for an appendix, or `3' for a chapter. % We could simplify the code here by writing out an ppendixentry % command in the toc file for appendices, instead of using hapentry % for both, but it doesn't seem worth it. tbox0 = 0wdimenortappendixwidth ortappendixwidth = 24

efortchaplabel#1{%
% We typeset #1 in a box of constant width, regardless of the text of
% #1, so the chapter titles will come out aligned.
tbox0 =
imen0 = ifdim288ixwidth ortappendixwidth \lse 0pt
%
% 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 by ortchapentry above.)
dvanceimen0 by 1.1em
}

efnnumbchapentry#1#2{ochapentry{#1}{#2}} efortunnumberedentry#1#2{ocentry{#1}{oshortpageno{#2}}}

% Sections. efcentry#1#2#3#4{osecentry{#2.#3ce#1}{#4}} efnnumbsecentry#1#2{osecentry{#1}{#2}}

% Subsections. efbsecentry#1#2#3#4#5{osubsecentry{#2.#3.#4ce#1}{#5}} efnnumbsubsecentry#1#2{osubsecentry{#1}{#2}}

% And subsubsections. efbsubsecentry#1#2#3#4#5#6{%
osubsubsecentry{#2.#3.#4.#5ce#1}{#6}} efnnumbsubsubsecentry#1#2{osubsubsecentry{#1}{#2}}

% This parameter controls the indentation of the various levels. 0wdimenocindent ocindent = 3pc

% Now for the actual typesetting. In all these, #1 is the text and #2 is the % page number. % % If the toc has to be broken over pages, we want it to be at chapters % if at all possible; hence the enalty.
efochapentry#1#2{%
enalty-300


hapentryfonts
ocentry{#1}{opageno{#2}}%
\ndgroup
0break }

efosecentry#1#2{
centryfonts nt
ocentry{#1}{opageno{#2}}% \ndgroup}

efosubsecentry#1#2{
bsecentryfonts nt
ocentry{#1}{opageno{#2}}% \ndgroup}

efosubsubsecentry#1#2{
bsubsecentryfonts nt
ocentry{#1}{opageno{#2}}% \ndgroup}

% Final typesetting of a toc entry; we use the same \ntry macro as for % the index entries, but we want to suppress hyphenation here. (We % can't do that in the \ntry macro, since index entries might consist % of hyphenated-identifiers-that-do-not-fit-on-a-line-and-nothing-else.) efocentry#1#2{
1pt % allow a little stretch for the sake of nice page breaks
% Do not use urnoffactive in these arguments. Since the toc is
% typeset in cmr, so characters such as _ would come out wrong; we
% have to do the usual translation tricks.
\ntry{#1}{#2}% \ndgroup}

% Space between chapter (or whatever) number and the title. efce{

efopageno#1{{m #1}} efoshortpageno#1{{m #1}}

efhapentryfonts{cfonts m} efcentryfonts{extfonts} centryfonts = extfonts centryfonts = extfonts

ssage{environments,}

% Since these characters are used in examples, it should be an even number of % t widths. Each t character is 1en, so two makes it 1em. % Furthermore, these definitions must come after we define our fonts. 0wboxblarrowbox 0wboxwbox 0wboxushcharbox
0wbox 0wbox\quivbox 0wbox\rrorbox

%{entt %obaltboxblarrowbox = %obaltboxwbox = %obaltboxushcharbox
= %obaltbox\quivbox = % Adapted from the manmac format (p.420 of TeXbook) %obaltbox % depth .1ex %}

% @point{}, @result{}, @expansion{}, @print{}, @equiv{}. efoint{$ar$}
efesult{vmodeaise.15ex ef\xpansion{vmodeaise.1ex efrint{vmode ef\quiv{vmode

% Adapted from the TeXbook's {entt obalimen0 = 3em}% Width of the box. imen2 = .55pt % Thickness of rules % The text. (`r' is open on the right, `e' somewhat less so on the left.) tbox0 =

obaltbox\rrorbox=

dvance.



ve/below.
rn3ptight.

% The @error{} command. ef\rror{vmodepy\rrorbox}

% @tex ... @end tex escapes into raw Tex temporarily. % One exception: @ is still an escape character, so that @end tex works. % But @ or @@ will get a plain tex @ character.

efex{
atcode `\=0 atcode `=1 atcode `=2
atcode `3 atcode `=4 atcode ` atcode `=7 atcode `_=8 atcode ` =13
atcode `=14
atcode 43=12 % plus
atcode`
atcode`==12
atcode`=12
atcode`<=12
atcode`>=12
\scapechar=`\
%

t
xc
xcomma
xdot
xdots
xequiv
xexclam
xi
xlbrace

xrbrace
xstar
xt
%
ef\ndldots{thinner{
ef\nddots{elaxifmmode\ndldots\lse$thsurround=0pt \ndldots$}%
ef@{@}% x=\ndgroup}

% Define @lisp ... @endlisp. % @lisp does a bind things, % including the definition of @endlisp (which normally is erroneous).

% Amount to narrow the margins by for @lisp. 0wskipng ng=0.4in

% This is the definition that ^^M gets inside @lisp, @example, and other % such environments. 0ll is better than a space, since it doesn't % have any width. ef

% Make each space character in the input produce a normal interword % space in the output. Don't allow a line break at this space, as this % is used only in environments like @example, where each line of input % should produce a line of output anyway. % { efpspaces{

% Define e our active space, whatever it is. This is % for use in arsearg.
{pspaces% obal

% This space is always present above and below environments. 0wskip\nvskipamount \nvskipamount = 0pt

% Make spacing and below environment symmetrical. We use arskip
here % to help in doing that, since in @example-like environments arskip
% is reset to zero; thus the fterenvbreak inserts no space -- but the % start of the next paragraph will insert arskip
% efboveenvbreak{{dvance\nvskipamount by arskip
\ndgraf ifdimmount emovelastskip enalty-50
kipamount }}

renvbreak = boveenvbreak

% 0narrowing is a flag. If "set", @lisp etc don't narrow margins. lax

% @cartouche ... @end cartouche: draw rectangle w/rounded corners around % environment contents. ntircle=lcircle10 0wdimenircthick 0wdimenartouter0wdimenartinner 0wskip0rmbskip0wskip0rmpskip0wskip0rmlskip ircthick=ntdimen8ircle % eftl{{irclehar'013 eftr{{ efbl{{irclehar'012 efbr{{ efarttop{
tlrscthick
kip}} efartbot{
blrscthick
kip}} % 0wskipkipskip

uche{%

want these *outside*.
artinner=
dvanceartinner by-skip
artouter=
dvanceartouter by 18.4pt % allow for 3pt kerns on either % side, and for 6pt waste from % each corner char, and rule thickness
0rmbskip=rskip 0rmlskip=p
% Flag to tell @lisp, etc., not to narrow margin.
nt

rskip=0ptp=0pt
arttop


n3pt


rn3pt


p=0rmlskip
arskip=0rmpskip

kip efartouche{%
\ndgroup
rn3pt
\group
rn3pt
kip
\group
artbot
\group \ndgroup }}

% This macro is called at the beginning of all the @example variants, % inside a group. ef0nfillstart{%
boveenvbreak
inENV % This group ends at the end of the body
ussy
pspaces % Make spaces be word-separators rather than space tokens.
nglespace
blank lines

arskip
= 0pt
arindent
= 0pt
\mergencystretch = 0pt % don't try to avoid overfull boxes
% @cartouche defines 0narrowing to inhibit narrowing
% at next level down.
ifx0narrowingelax
dvance
\xdentamount=ng
nt=0fillexdent
lax
}

% Define the ... control sequence only if we are inside the particular % environment, so the error checking in \nd will work. % % To end an @example-like environment, we first end the paragraph (via % fterenvbreak's vertical glue), and then the group. That way we keep % the zero arskip
that the environments set -- arskip
glue will be % inserted at the beginning of the next paragraph in the document, after % the environment. % ef0nfillfinish{fterenvbreak\ndgroup}

% @lisp: indented, narrowed, typewriter font. ef
0nfillstart

t
xamplefont % Allow @kbd to do something special.
bble % eat return }

% @example: Same as @lisp. ef\xample{f\xample{0nfillfinish\ndgroup}

% @small... is usually equivalent to the non-small (@smallbook % redefines). We must call \xample (or whatever) last in the % definition, since it reads the return following the @example (or % whatever) command. % % This actually allows (for example) @end display inside an % @smalldisplay. Too bad, but makeinfo will catch the error anyway. % efalldisplay{falldisplay{0nfillfinish\ndgroup}isplay} efallexample{fallexample{0nfillfinish\ndgroup} efallformat{fallformat{0nfillfinish\ndgroup}rmat} efalllisp{falllisp{0nfillfinish\ndgroup}

% Real @smallexample and @smalllisp (when @smallbook): use smaller fonts. % Originally contributed by Pavel@xerox. efalllispx{
efalllisp{0nfillfinish\ndgroup}%
efallexample{0nfillfinish\ndgroup}%
indexfonts
}

% @display: same as @lisp except keep current font. % efisplay{
0nfillstart

bble }

% @smalldisplay (when @smallbook): @display plus smaller fonts. % efalldisplayx{
efalldisplay{0nfillfinish\ndgroup}%
indexfonts m
isplay }

% @format: same as @display except don't narrow margins. % efrmat{

0nfillstart
rmat = 0nfillfinish
bble }

% @smallformat (when @smallbook): @format plus smaller fonts. % efallformatx{
efallformat{0nfillfinish\ndgroup}%
indexfonts m
rmat }

% @flushleft (same as @format). % efushleft{fushleft{0nfillfinish\ndgroup}rmat}

% @flushright. % efushright{

0nfillstart
ushright = 0nfillfinish
dvance
bble }

% @quotation does normal linebreaking (hence we can't use 0nfillstart) % and narrows the margins. % efquotation{%
nds at the end of the @quotation body
{arskip=0pt
boveenvbreak}% because boveenvbreak inserts arskip

nglespace
arindent=0pt

% We have retained a nonzero parskip for the environment, since we're
% doing normal filling. So to avoid extra space below the environment...
efquotation{arskip
= 0pt 0nfillfinish}%
%
% @cartouche defines 0narrowing to inhibit narrowing at next level down.
ifx0narrowingelax
dvance
dvanceightskip by ng
\xdentamount = ng
lax
}

ssage{defuns,} % Define formatter for defuns % First, allow user to change definition object font (f) internally eftdeffont #1 {sname DEF#1\ndcsname}

0wskipefbodyindent efbodyindent=.4in 0wskipefargsindent efargsindent=50pt 0wskipeftypemargin eftypemargin=12pt 0wskipeflastargmargin eflastargmargin=18pt

0wcountarencount
% define nctionparens, which makes ( and ) and & do special things. % nctionparens affects the group it is contained in. efctiveparens{% atcode`active atcode`=ctive atcode`=ctive atcode`

% Make control sequences which act like normal parenthesis chars.

{ctiveparens % Now, smart parens don't turn on until &foo (see mprm)

% Be sure that we always have a definition for `(', etc. For example, % if the fn name has parens in it, t be in effect yet, % so TeX would otherwise complain about undefined control sequence. obal obal

efnctionparens{unt=0 } ef % This is used to turn on special parens % but make & act ordinary (given that it's active). efamp{

% Definitions of (, ) and & used in args for functions. % This is the definition of ( outside of all parentheses. ef
obaldvancearencount
by 1 } % % This is the definition of ( when already inside a level of parens. ef % eflrm{% Print a paren in roman if it is taking us back to depth of 0.
% also in that case restore the outer-level definition of (.
ifnum arencount=1
{m har `}
obaldvance arencount
by -1 } % If we encounter &foo, then turn on ()-hacking afterwards efmprm#1 {{m#1} % ef0rmalparens{ } % End of definition inside ctiveparens %% These parens (in lder than the %% contained text. This is especially needed for [ and ] ef eflnr{{har`}obaldvancearencount
by -1 } efmpnr{} ef{{ efbrb{{

% First, defname, which formats the header line itself. % #1 should be the function name. % #2 should be the type of definition, such as "Function".

efefname #1#2{% % Get the values of y were % outside the @def... imen2= dvanceimen2 by -efbodyindent 0indent tbox0= imen0= imen1=indent %size for continuations arshape
2 0in imen0 efargsindent imen1 % Now output arg 2 ("Function" or some such) % ending at eftypemargin from the right margin, % but stuck inside a box of width 0 so it does not interfere with linebreaking {% Adjust , % so that ightline will obey them. dvance lap{ightline{{m #2} % Make all lines underfull and no complaints: olerance=10000 dvancefbodyindent \xdentamount=efbodyindent {f #1}\nskip % Generate function name }

% Actually process the body of a definition % #1 should be the terminating control sequence, such as efun. % #2 should be the "another name" control sequence, such as efunx. % #3 should be the control sequence that actually processes the header, % such as efunheader.

efefparsebody #1#2#3{nt for definitionbody dbreak % % Define the end token that this defining construct specifies % so that it will exit this group. ef#1{\ndgraf\ndgroupdbreak}% ef#2{ arindent=0in
dvancefbodyindent \xdentamount=efbodyindent atcode 61=ctive % 61 is `='

% #1 is the ... control sequence to end the definition (which we define). % #2 is the ...x control sequence for consecutive fns (which we define). % #3 is the control sequence to call to resume processing. % #4, delimited by the space, is the class name. % efefmethparsebody#1#2#3#4 { dbreak % % Define the end token that this defining construct specifies % so that it will exit this group. ef#1{\ndgraf\ndgroupdbreak}% ef#2##1 { arindent=0in
dvancefbodyindent \xdentamount=efbodyindent

% @deftypemethod has an extra argument that nothing else does. Sigh. % #1 is the ... control sequence to end the definition (which we define). % #2 is the ...x control sequence for consecutive fns (which we define). % #3 is the control sequence to call to resume processing. % #4, delimited by the space, is the class name. % #5 is the method's return type. % efeftypemethparsebody#1#2#3#4 #5 { dbreak % % Define the end token that this defining construct specifies % so that it will exit this group. ef#1{\ndgraf\ndgroupdbreak}% ef#2##1 ##2 { arindent=0in
dvancefbodyindent \xdentamount=efbodyindent

efefopparsebody #1#2#3#4#5 { dbreak % % Define the end token that this defining construct specifies % so that it will exit this group. ef#1{\ndgraf\ndgroupdbreak}% ef#2##1 ##2 {ef#4{##1}% arindent=0in
dvancefbodyindent \xdentamount=efbodyindent

% These parsing functions are similar to the preceding ones % except that they do not make parens into active characters. % These are used for "variables" since they have no arguments.

efefvarparsebody #1#2#3{nt for definitionbody dbreak % % Define the end token that this defining construct specifies % so that it will exit this group. ef#1{\ndgraf\ndgroupdbreak}% ef#2{ arindent=0in
dvancefbodyindent \xdentamount=efbodyindent atcode 61=ctive %

% This is used for ef{tp,vr}parsebody. It could probably be used for % some of the others, too, with some judicious conditionals. % efarsebodycommon#1#2#3{%


dbreak %
% Define the end token that this defining construct specifies
% so that it will exit this group.
ef#1{\ndgraf\ndgroupdbreak}%
ef#2##1 {
arindent=0in

dvancefbodyindent
\xdentamount=efbodyindent
}

efefvrparsebody#1#2#3#4 {%
arsebodycommon{#1}{#2}{#3}%

acesplit{#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 acesplit reads its undelimited argument. Sigh. % ftpparsebody=efvrparsebody % % So, to get around this, we put \mpty in with the type name. That % way, TeX won't find exactly `{...}' as an undelimited argument, and % won't strip off the braces. % efeftpparsebody #1#2#3#4 {%
arsebodycommon{#1}{#2}{#3}%

acesplit{arsetpheaderline{#3{#4}}}\mpty
}

% Fine, but then we have to eventually remove the \mpty *and* the % braces (if any). That's what this does. % efemoveemptybraces\mpty#1elax{#1}

% After acesplit has done its work, this is called -- #1 is the final % thing to call, #2 the type name (which starts with \mpty), and #3 % (which might be empty) the arguments. % efarsetpheaderline#1#2#3{%

#1{emoveemptybraces#2elax}{#3}% }%

efefopvarparsebody #1#2#3#4#5 { dbreak % % Define the end token that this defining construct specifies % so that it will exit this group. ef#1{\ndgraf\ndgroupdbreak}% ef#2##1 ##2 {ef#4{##1}% arindent=0in
dvancefbodyindent \xdentamount=efbodyindent

% Split up #2 at the first space token. % call #1 with two arguments: % the first is all of #2 before the space token, % the second is all of #2 after that space token. % If #2 contains no space token, all of it is passed as the first arg % and the second is passed as empty.

{ efacesplit#1#2^^M{\ndgroupacesplitfoo{#1}#2 elaxacesplitfoo}% o#1#2 #3#4acesplitfoo{% ifxelax #3% #1{#2}{}\lse #1{#2}{#3#4}}}

% So much for the things common to all kinds of definitions.

% Define @defun.

% First, define the processing that is wanted for arguments of efun % Use this to expand the args and terminate the paragraph they make up

efefunargs #1{nctionparens % Expand, preventing hyphenation at `-' chars. % Note that groups don't affect changes in #1% ifnumarencount=0
\lse \rrmessage{Unbalanced parentheses in @def}% interlinepenalty=10000 dvanceightskip by 0pt plus 1fil \ndgraf0breakkip0break }

efeftypefunargs #1{% % Expand, preventing hyphenation at `-' chars. % Note that groups don't affect changes in % Use amp, not nctionparens, so that & is not special. amp close{#1}% avoid ode because of side effects on active chars interlinepenalty=10000 dvanceightskip by 0pt plus 1fil \ndgraf0breakkip0break }

% Do complete processing of one @defun or @defunx line already parsed.

% @deffn Command forward-char nchars

efeffn{efmethparsebodyeffneffnxeffnheader}

efeffnheader #1#2#3{oind {fn}{ode{#2}}% fname {#2}{#1}efunargs{#3}\ndgroup % atcode 61= }

% @defun == @deffn Function

efefun{efparsebodyefunefunxefunheader}

efefunheader #1#2{oind {fn}{ode{#1}}% Make entry in function index fname {#1}{Function}% efunargs {#2}\ndgroup % atcode 61= }

% @deftypefun int foobar (int @var{foo}, float @var{bar})

efeftypefun{efparsebodyeftypefuneftypefunxeftypefunheader}

% #1 is the data type. #2 is the name and args. efeftypefunheader #1#2{eftypefunheaderx{#1}#2 elax} % #1 is the data type, #2 the name, #3 the args. efeftypefunheaderx #1#2 #3elax{% oind {fn}{ode{#2}}% Make entry in function index fname {efheaderxcond#1elax$$$#2}{Function}% eftypefunargs {#3}\ndgroup % atcode 61= }

% @deftypefn {Library Function} int foobar (int @var{foo}, float @var{bar})

efeftypefn{efmethparsebodyeftypefneftypefnxeftypefnheader}

% efheaderxcond#1elax$$$ % puts #1 in @code, followed by a space, but does nothing if #1 is null. efefheaderxcond#1#2$$${ifx#1elax\lseode{#1#2} }

% #1 is the classification. #2 is the data type. #3 is the name and args. efeftypefnheader #1#2#3{eftypefnheaderx{#1}{#2}#3 elax} % #1 is the classification, #2 the data type, #3 the name, #4 the args. efeftypefnheaderx #1#2#3 #4elax{% oind {fn}{ode{#3}}% Make entry in function index 0rmalparens % notably, turn off `&' magic, which prevents % at least some C++ text from working efname {efheaderxcond#2elax$$$#3}{#1}% eftypefunargs {#4}\ndgroup % atcode 61= }

% @defmac == @deffn Macro

efefmac{efparsebodyefmacefmacxefmacheader}

efefmacheader #1#2{oind {fn}{ode{#1}}% Make entry in function index fname {#1}{Macro}% efunargs {#2}\ndgroup % atcode 61= }

% @defspec == @deffn Special Form

efefspec{efparsebodyefspecefspecxefspecheader}

efefspecheader #1#2{oind {fn}{ode{#1}}% Make entry in function index fname {#1}{Special Form}% efunargs {#2}\ndgroup % atcode 61= }

% This definition is run if you use @defunx % anywhere other than immediately after a @defun or @defunx.

efeffnx #1 {\rrmessage{@deffnx in invalid context}} efefunx #1 {\rrmessage{@defunx in invalid context}} efefmacx #1 {\rrmessage{@defmacx in invalid context}} efefspecx #1 {\rrmessage{@defspecx in invalid context}} efeftypefnx #1 {\rrmessage{@deftypefnx in invalid context}} efeftypemethodx #1 {\rrmessage{@deftypemethodx in invalid context}} efeftypefunx #1 {\rrmessage{@deftypefunx in invalid context}}

% @defmethod, and so on

% @defop CATEGORY CLASS OPERATION ARG...

efefop #1 {efefoptype{#1}% efopparsebodyefopefopxefopheaderefoptype}

efefopheader #1#2#3{% osubind {fn}{ode{#2}}{utwordon #1}%
Make entry in function index fname {#2}{efoptype{} on #1}% efunargs {#3}\ndgroup % }

% @deftypemethod CLASS RETURN-TYPE METHOD ARG... % efeftypemethod{%
eftypemethparsebodyeftypemethodeftypemethodxeftypemethodheader} % % #1 is the class name, #2 the data type, #3 the method name, #4 the args. efeftypemethodheader#1#2#3#4{%
osubind{fn}{ode{#3}}{utwordon ode{#1}}%
entry in function index

efname{efheaderxcond#2elax$$$#3}{utwordMethodon ode{#1}}%

eftypefunargs{#4}%
\ndgroup }

% @defmethod == @defop Method % efefmethod{efmethparsebodyefmethodefmethodxefmethodheader} % % #1 is the class name, #2 the method name, #3 the args. efefmethodheader#1#2#3{%
osubind{fn}{ode{#2}}{utwordon ode{#1}}%
entry in function index

efname{#2}{utwordMethodon ode{#1}}%

efunargs{#3}%
\ndgroup }

% @defcv {Class Option} foo-class foo-flag

efefcv #1 {efefcvtype{#1}% efopvarparsebodyefcvefcvxefcvarheaderefcvtype}

efefcvarheader #1#2#3{% osubind {vr}{ode{#2}}{of #1}% Make entry in var index fname {#2}{efcvtype{} of #1}% efvarargs {#3}\ndgroup % }

% @defivar == @defcv {Instance Variable}

efefivar{efvrparsebodyefivarefivarxefivarheader}

efefivarheader #1#2#3{% osubind {vr}{ode{#2}}{of #1}% Make entry in var index fname {#2}{Instance Variable of #1}% efvarargs {#3}\ndgroup % }

% These definitions are run if you use @defmethodx, etc., % anywhere other than immediately after a @defmethod, etc.

efefopx #1 {\rrmessage{@defopx in invalid context}} efefmethodx #1 {\rrmessage{@defmethodx in invalid context}} efefcvx #1 {\rrmessage{@defcvx in invalid context}} efefivarx #1 {\rrmessage{@defivarx in invalid context}}

% Now @defvar

% First, define the processing that is wanted for arguments of @defvar. % This is actually simple: just print them in roman. % This must expand the args and terminate the paragraph they make up efefvarargs #1{0rmalparens #1% interlinepenalty=10000 \ndgraf0breakkip0break}

% @defvr Counter foo-count

efefvr{efvrparsebodyefvrefvrxefvrheader}

efefvrheader #1#2#3{oind {vr}{ode{#2}}% fname {#2}{#1}efvarargs{#3}\ndgroup}

% @defvar == @defvr Variable

efefvar{efvarparsebodyefvarefvarxefvarheader}

efefvarheader #1#2{oind {vr}{ode{#1}}% Make entry in var index fname {#1}{Variable}% efvarargs {#2}\ndgroup % }

% @defopt == @defvr {User Option}

efefopt{efvarparsebodyefoptefoptxefoptheader}

efefoptheader #1#2{oind {vr}{ode{#1}}% Make entry in var index fname {#1}{User Option}% efvarargs {#2}\ndgroup % }

% @deftypevar int foobar

efeftypevar{efvarparsebodyeftypevareftypevarxeftypevarheader}

% #1 is the data type. #2 is the name, perhaps followed by text that % is actually part of the data type, which should not be put into the index. efeftypevarheader #1#2{% ovarind#2 elax% Make entry in variables index fname {efheaderxcond#1elax$$$#2}{Variable}% interlinepenalty=10000 \ndgraf0breakkip0break \ndgroup} efovarind#1 #2elax{oind{vr}{ode{#1}}}

% @deftypevr {Global Flag} int enable

efeftypevr{efvrparsebodyeftypevreftypevrxeftypevrheader}

efeftypevrheader #1#2#3{ovarind#3 elax% fname {efheaderxcond#2elax$$$#3}{#1} interlinepenalty=10000 \ndgraf0breakkip0break \ndgroup}

% This definition is run if you use @defvarx % anywhere other than immediately after a @defvar or @defvarx.

efefvrx #1 {\rrmessage{@defvrx in invalid context}} efefvarx #1 {\rrmessage{@defvarx in invalid context}} efefoptx #1 {\rrmessage{@defoptx in invalid context}} efeftypevarx #1 {\rrmessage{@deftypevarx in invalid context}} efeftypevrx #1 {\rrmessage{@deftypevrx in invalid context}}

% Now define @deftp % Args are printed in bold, a slight difference from @defvar.

efeftpargs #1{varargs{#1}}

% @deftp Class window height width ...

efeftp{eftpparsebodyeftpeftpxeftpheader}

efeftpheader #1#2#3{oind {tp}{ode{#2}}% fname {#2}{#1}eftpargs{#3}\ndgroup}

% This definition is run if you use @deftpx, etc % anywhere other than immediately after a @deftp, etc.

efeftpx #1 {\rrmessage{@deftpx in invalid context}}

ssage{macros,} % @macro.

% To do this right we need a feature of e-TeX, antokens, % which we arrange to emulate with a temporary file in ordinary TeX. ifx\TeXversionndefined
0wwritecscribble
efanmacro#1{%
char`^M
immediatem
immediate144ibble{#1}%
immediateloseoutcscribble
s
input jobname.tmp
\ndgroup } \lse efanmacro#1{% char`^M santokens{#1}\ndgroup}

0wcountaramno
% Count of parameters 0wtokscname % Macro name 0wififrecursive % Is it recursive?

% Utility routines. % Thisdoes xcept with snames. efslet#1#2{% \xpandafter\xpandafter \xpandafter \xpandafter\xpandafter sname#1\ndcsname sname#2\ndcsname}

% Trim leading and trailing spaces off a string. % Concepts from aro-bend problem 15 (see CTAN). {atcode`@=11 ef\atspaces #1{\xpandafterrim@\xpandafter{#1 }} efrim@ #1{rim@@ @#1 @ #1 @ @@} efrim@@ #1@ #2@ #3@@{rim@@@\mpty #2 @} efnbrace#1{#1} nbrace{efrim@@@ #1 } #2@{#1} }

% Trim a single trailing ^^M off a string. {atcode`^M=12atcode`Q=3% ef\atcr #1{\atcra #1Q^^MQ}% ef\atcra#1^^MQ{\atcrb#1Q}% ef\atcrb#1Q#2Q{#1}% }

% Macro bodies are absorbed as an argument in a context where % all characters are catcode 10, 11 or 12, except  which is active % (as in normal texinfo). It is necessary to change the definition of .

% It's necessary to have hard CRs when the macro is executed. This is % done by making ^^M (\ndlinechar) catcode 12 when reading the macro % body, and then making it the 0wlinechar in anmacro.

efcrobodyctxt{%
atcode` =12
atcode`=12
atcode`_=12
atcode`=12
atcode`<=12
atcode`>=12
atcode`+=12
atcode`=12
atcode`=12
atcode`@=12
atcode`^M=12
sembodybackslash}

efcroargctxt{%
atcode` =12
atcode`=12
atcode`_=12
atcode`=12
atcode`<=12
atcode`>=12
atcode`+=12
atcode`@=12
atcode`\=12}

% odybackslash is the definition of  in @macro bodies. % It maps o => sname macarg.foo\ndcsname => #N % where N is the macro parameter number. % We define sname macarg.\ndcsname to be ealbackslash, so % \ in macro replacement text gets you a backslash.

{atcode`@=0 @catcode`@=@active
@gdef@usembodybackslash{@let=@mbodybackslash}
@gdef@mbodybackslash#1@csname macarg.#1@endcsname} } \xpandafterefsname macarg.\ndcsname{ealbackslash}

efcro{ecursivefalsearseargcroxxx}
efmacro{ecursivetruearseargcroxxx}

efcroxxx#1{%
targs{#1}% now cname is the macname and rgl the arglist
ifxrgl\mpty % no arguments
aramno=0%

\lse
\xpandafterarsemargdef
rgl;%

\xpandafterifx sname macsave.hecname\ndcsname elax
slet{macsave.hecname}{hecname}%
\lse
ssage{Warning: redefining hecname}%


ifrecursive \xpandafterarsermacbody

\lse \xpandafterarsemacbody

}

efnmacro{arseargnmacroxxx}
efnmacroxxx#1{%
\xpandafterifx sname macsave.hecname\ndcsname elax
\rrmessage{Macro hecname not defined.}%
\lse
slet{#1}{macsave.#1}%
\xpandafter macsave.hecname\ndcsname ndefined
}

% This makes use of the obscure feature that if the last token of a % <parameter list> is #, then the preceding argument is delimited by % an opening brace, and that opening brace is not consumed. eftargs#1{targsxxx#1{}} eftargsxxx#1#{tmacname #1 elaxtmacargs} eftmacname #1 #2elax{cname={#1}} eftmacargs#1{efrgl{#1}}

% Parse the optional {params} list. Set up aramno
and aramlist
% so efmacro knows what to do. Define carg.blah for each blah % in the params list, to be ##N where N is the position in that list. % That gets used by odybackslash (above).

% We need to get `macro parameter char #' into several definitions. % The technique used is stolen from LaTeX: let % unexpandable, insert that wherever you need a #, and then redefine % it to # just before using the token list produced. % % The same technique is used to protect \atspaces till just before % the macro is used.

efarsemargdef#1;{aramno=0efaramlist{}%

margdefxxx#1,;,} efarsemargdefxxx#1,{%

if#1;lax
\lse margdefxxx
dvancearamno
by 1%
\xpandafter\defsname macarg.\atspaces{#1}\ndcsname
{s{ramno}}%
\defaramlist{aramlistramno,}%

0xt}

% These two commands read recursive and nonrecursive macro bodies. % (They're different since rec and nonrec macros end differently.)

dy#1@end macro% {groupefmacro}% dy#1@end rmacro% {groupefmacro}%

% This defines the macro itself. There are six cases: recursive and % nonrecursive macros of zero, one, and many arguments. % Much magic with \xpandafter here. % so that macro definitions will survive the file % they're defined in; @include reads the file inside a group. efefmacro{%
holders to macro parameter chars
ifrecursive
ifcasearamno

% 0
\xpandaftercsname{%
0expandanmacro{emp}}%

\xpandaftercsname{%
ctxt
0expandlinesnamehecname xxx\ndcsname}%
\xpandaftercsname##1{%
\group0expandanmacro{emp}}%
\lse % many
\xpandaftercsname{%
ctxt
0expandsnamehecname xx\ndcsname}
\xpandaftercsname##1{%
snamehecname xxx\ndcsname ##1,}%
\xpandafter\xpandafter
\xpandafter
\xpandafter\xpandafter
snamehecname xxx\ndcsname
aramlist{\group0expandanmacro{emp}}%


\lse
ifcasearamno

% 0
\xpandaftercsname{%
0expand0recurse{hecname}%
0expandanmacro{emp}\group}%

\xpandaftercsname{%
ctxt
0expandlinesnamehecname xxx\ndcsname}%
\xpandaftercsname##1{%
\group
0expand0recurse{hecname}%
0expandanmacro{emp}\group}%
\lse % many
\xpandaftercsname{%
ctxt
0expandsnamehecname xx\ndcsname}
\xpandaftercsname##1{%
snamehecname xxx\ndcsname ##1,}%
\xpandafter\xpandafter
\xpandafter
\xpandafter\xpandafter
snamehecname xxx\ndcsname
aramlist{%

\group
0expand0recurse{hecname}%
0expandanmacro{emp}\group}%

}

ef0recurse#1{

% line decides whether the next nonwhitespace character is a % {. If so it reads up to the closing }, if not, it reads the whole % line. Whatever was read is then fed to the next control sequence % as an argument (by arsebrace
or arsearg)
efline#1{turelet0harlinexxx} eflinexxx{%
ifx0har
\xpandafterarsearg

0xt}

ssage{cross references,} 0wwriteuxfile

0wififhavexrefs % True if xref values are known. 0wififwarnedxrefs % True if we warned once that they aren't known.

% @inforef is relatively simple. efinforef #1{inforefzzz #1,,,,**} efinforefzzz #1,#2,#3,#4**{utwordSee{}
utwordInfo{}
utwordfile{}
le{ignorespaces #3{}},
node mp{ignorespaces#1{}}}

% @node's job is to define ef0de{heckarsearg0dezzz}
ef0dezzz#1{0dexxx [#1,]} ef0dexxx[#1,#2]{ef =0de

% The sectioning commands (@chapter, etc.) call these. efonoderef{%
ifxx\lse
\xpandafter\xpandafter\xpandaftertref{
{Ysectionnumberandtype}%
obal
} efnnumbnoderef{%
ifxx\lse
\xpandafter\xpandafter\xpandaftertref{
obal
} efppendixnoderef{%
ifxx\lse
\xpandafter\xpandafter\xpandaftertref{
{Yappendixletterandtype}%
obal
}

% @anchor{NAME} -- define xref target at arbitrary point. % efnchor#1{tref{#1}{Ynothing}}

% tref{NAME}{SNT} defines a cross-reference point NAME, namely % NAME-title, NAME-pg, and NAME-SNT. Called from onoderef. We have % to set indexdummies so commands such as @code in a section title % aren't expanded. It would be nicer not to expand the titles in the % first place, but there's so many layers that that is hard to do. % eftref#1#2{{%
indexdummies
osetq{#1-title}{Ytitle}%
osetq{#1-pg}{Ypagenumber}%
osetq{#1-snt}{#2} }}

% @xref, @pxref, and @ref generate cross-references. For % the node name, #2 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 omitted. % efxref#1{utwordsee{}
efdSee{} efef#1{ ef
efrintedmanual{ignorespaces
#5}%
efrintednodename{ignorespaces
#3}%
tbox1=
tbox0=
ifdim 168
% No printed node name was explicitly given.
\xpandafterifxsname SETxref-automatic-section-title\ndcsnameelax
% Use the node name inside the square brackets.
efrintednodename{ignorespaces
#1}%
\lse
% Use the actual chapter/section title appear inside
% the square brackets. Use the real section title if we have it.
ifdim 168
% It is in another manual, so we don't have it.
efrintednodename{ignorespaces
#1}%
\lse
ifhavexrefs
% We know the real title if we have the xref values.
efrintednodename{efx{#1-title}{}}%

\lse
% Otherwise just copy the Info node name.
efrintednodename{ignorespaces
#1}%
%



%
% If we use nhbox0 and nhbox1 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 168
utwordsection{}
``rintednodename''
in ite{rintedmanual}%

\lse
% _ (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 vmode... purposes of
% printing. So we urnoffactive for the efx-snt, back on for the
% printing, back off for the efx-pg.
{0rmalturnoffactive
% Only output a following space if the -snt ref is nonempty; for
% @unnumbered and @anchor, it won't be.
tbox2 =
ifdim 528
}%
% [mynode],
[rintednodename],ace

% page 3
urnoffactive utwordpageieefx{#1-pg}{}%

\ndgroup}

% osetq is the interface for calls from other macros

% Use 0rmalturnoffactive so that punctuation chars such as underscore % and backslash work in node names. (urnoffactive doesn't do .) efosetq#1#2{%
{lio=0
0rmalturnoffactive
\def0xt{336nalsetq{#1}{#2}}}%
iflinks
0xt

}% }

% internalsetq {foo}{page} expands into % CHARACTERS 'xrdef {foo}{...expansion of age...} % When the aux file is read, ' is the escape character

efinternalsetq #1#2{'xrdef {#1}{sname #2\ndcsname}}

% Things to be expanded by internalsetq

efagenumber{lio}

efitle{hissection}

efothing{}

efectionnumberandtype{% ifnumcno=0 utwordChapter \lse ifnum bsecno=0 utwordSection \lse ifnum bsubsecno=0 % utwordSection \lse % utwordSection }

efppendixletterandtype{% ifnumcno=0 utwordAppendixheppendixno{}%
\lse ifnum bsecno=0 utwordSectionheppendixno.hecno
% \lse ifnum bsubsecno=0 % utwordSectionheppendixno.hecno.hebsecno
% \lse % utwordSectionheppendixno.hecno.hebsecno.hebsubsecno
% }

ef

% 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. % ifxinputlinenohisisundefined
\lse
efneno:ace}

% Define efx{NAME}{SUFFIX} to reference a cross-reference string named NAME. % If its value is nonempty, SUFFIX is output afterward.

efefx#1#2{%
\xpandafterifxsname X#1\ndcsnameelax
% If not defined, say something at least.
ngleleft un-de-finedngleright
iflinks
ifhavexrefs
ssage{ned cross reference `#1'.}%
\lse
ifwarnedxrefs\lse
obal312
ssage{Cross reference values unknown; you must run TeX again.}%



\lse
% It's defined, so just use it.
sname X#1\ndcsname

#2% Output the suffix in any case. }

% This is the macro invoked by entries in the aux file. % ef
% Reenable  as an escape while reading the second argument.
atcode`\ = 0
fterassignment\ndgroup
\xpandafterefsname X#1\ndcsname }

% Read the last existing aux file, if any. No error if none exists. efeadauxfile{
atcode`^@=
atcode`^A=
atcode`^B=
atcode`^C=
atcode`^D=
atcode`^E=
atcode`^F=
atcode`^G=
atcode`^H=
atcode`^K=
atcode`^L=
atcode`^N=
atcode`^P=
atcode`^Q=
atcode`^R=
atcode`^S=
atcode`^T=
atcode`^U=
atcode`^V=
atcode`^W=
atcode`^X=
atcode`^Z=
atcode`^[=
atcode`^=
atcode`^]=
atcode`^^=
atcode`^_=
atcode`@=
atcode`=
% It was suggested to define this as 7, which would allow ^^e4 etc.
% in xref tags, i.e., node names. But since ^^e4 notation isn't
% supported in the main text, it doesn't seem desirable. Furthermore,
% that is not enough: for node names that actually contain a ^
% character, we would end up writing a line like this: 'xrdef {'hat
% b-title}{'hat b} and st
% argument, and n expandable control sequence. It could
% all be worked out, but why? Either we support ^^ or we don't.
%
% The other change necessary for this was to define uxhat:
% efuxhat{ef^{'hat }}% extra space so ok if followed by letter
% and then to call uxhat in tq.
%
atcode` =
atcode`
atcode`]=
atcode`
atcode`_=
atcode`=
atcode`<=
atcode`>=
atcode`
atcode` atcode`=
atcode`+= hough we've turned it off
% Make the characters 128-255 be printing characters
{%
ount 1=128
efp{%
atcodeount 1=
dvanceount 1 by 1
ifnum ount 1<256 p
}%
}%
% The aux file uses ' as the escape (for now).
% Turn off  as an escape so we do not lose on
% entries which were dumped with control sequences in their names.
% For example, 'xrdef {$ ...} made by @defun ^^
% Reference to such entries still does not work the way one would wish,
% but at least they do not bomb out when the aux file is read in.
atcode`=1
atcode`=2
atcode`=
atcode`´=0
atcode`\=
%

ifeof 1 \lse
losein 1
input jobname.aux
obal
obal264

% Open the new aux file. TeX will close it automatically at exit.
\ndgroup}

% Footnotes.

0wcount otnoteno

% The trailing space in the following definition for supereject is % vital for proper filling; pages come out unaligned when you do a % pagealignmacro call if that space before the closing brace is % removed. (Generally, numeric constants should always be followed by a % space to prevent strange expansion errors.) efpereject{arenalty
-20000otnoteno =0 }

% @footnotestyle is meaningful for info output only. otnotestyle=omment

xfootnote=otnote

{atcode `@=11 % % Auto-number footnotes. Otherwise like plain. efotnote{%
obaldvanceotnoteno by @ne
\defhisfootno{$^{heotnoteno}$}%
%
% In case the footnote comes at the end of a sentence, preserve the
% extra spacing after we do the footnote number.

ifhmode\def@sf{acefactorheacefactor}
%
% Remove inadvertent blank space before typesetting the footnote number.
nskip
hisfootno@sf
otnotezzz }%

% 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. % % Oh yes, they do; otherwise, @ifset and anything else that uses % arseargline
fail inside footnotes because the tokens are fixed when % the footnote is read. --karl, 16nov96. % otnotezzz{insertotins
% 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.
interlinepenaltyinterfootnotelinepenalty
littopskipbox % top baseline for broken footnotes
litmaxdepthprutbox
oatingpenalty@MM

ightskipskip
aceskipskip
kipskip
arindentefaultparindent

%
% Hang the footnote text off the number.

extindent{hisfootno}%
%
% 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.
otstrut
turelet0xt@t } ef@t{ifcat@t
\lset 0xt} ef@t{roup@foot eft#1{#1@foot} ef@foot{rut\group}

}%end atcode `@=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. % efpfactor{.08333} efrutheightpercent{.70833} efrutdepthpercent {.29167} % eftleading#1{%
0rmalbaselineskip = #1elax
0rmallineskip = pfactor0rmalbaselineskip
0rmalbaselines
tboxrutbox =
utheightpercent
depth rutdepthpercent
}% }

% @| 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). % ef{%
% n only be used in horizontal mode.
vmode
%
% Append this vertical mode material after the current line in the output.

% We want to insert a rule with the height and depth of the current
% leading; that is exactly what rutbox is supposed to record.

%
% re inserted at the left edge of the type. So
% the eft-hand margin.

%
% For a thicker or thinner bar, change the `1pt'.

%
% This is the space between the bar and the text.

}%
}% }

% 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). % efnalout{

% @image. We use the macros from epsf.tex to support this. % If epsf.tex is not installed and @image is used, we complain. % % Check for and read epsf.tex up front. If we read it only at @image % time, we might be inside a group, and then its definitions would get % undone and the next image would fail. esf.tex ifeof 1 \lse
losein 1
% Do not bother showing banner with post-v2.7 epsf.tex (available in
% doc/epsf.tex until it shows up on ctan).
ef\psfannounce{oks0 = }%
input epsf.tex % 0wififwarnednoepsf 0whelp0epsfhelp{epsf.tex must be installed for images to
work. It is also included in the Texinfo distribution, or you can get
it from ftp://ftp.tug.org/tex/epsf.tex.} % % Only complain once about lack of epsf.tex. efimage#1{%
ifx\psfboxndefined
ifwarnednoepsf \lse
\rrhelp = 0epsfhelp
\rrmessage{epsf.tex not found, images will be ignored}%
obal336

\lse
imagexxx #1,,,nish
} % % Arguments to @image: % #1 is (mandatory) image filename; we tack on .eps extension. % #2 is (optional) width, #3 is (optional) height. % #4 is just the usual extra ignored arg for parsing this stuff. efimagexxx#1,#2,#3,#4nish{%
% \psfbox itself resets \psf?size at each figure.
tbox0 =
tbox0 =
% If the image is by itself, center it.
ifvmode
0breakdskip
0break
enterline{\psfbox{#1.eps}}%

\lse
\psfbox{#1.eps}%
}

ssage{paper sizes,} % And other related parameters.

0wdimenefaultparindent efaultparindent = 15pt

hapheadingskip = 15pt plus 4pt minus 2pt cheadingskip = 12pt plus 3pt minus 2pt bsecheadingskip = 9pt plus 2pt minus 2pt

% Prevent underfull vbox error messages.

% Don't be so finicky about underfull hboxes, either.

% Following George Bush, just get rid of widows and orphans. 384 lubpenalty=10000

% Use TeX 3.0's \mergencystretch to help line breaking, but if we're % 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 % makes it come to about 9pt for the 8.5x11 format. We % call this whenever the paper size is set. % eftemergencystretch{%
ifx\mergencystretchhisisundefined
% Allow us to assign to \mergencystretch anyway.
ef\mergencystretch{imen0}%
\lse
\mergencystretch =
ivide\mergencystretch by 45
}

% Parameters in order: 1) textheight; 2) textwidth; 3) voffset; % 4) hoffset; 5) binding offset; 6) topskip. Then whoever calls us can % set arskip
and call tleading for % efinternalpagesizes#1#2#3#4#5#6{%

opskip = #6elax
littopskip = opskip
%

dvancekip

dvance
ageheight
=
%


dvance
agewidth
=
%
0rmaloffset = #4elax
ngoffset = #5elax
%
arindent
= efaultparindent
temergencystretch }

% @letterpaper (the default). efrpaper{{obaldefs = 1
arskip
= 3pt plus 2pt minus 1pt
tleading{13.2pt}%
%
% If page is nothing but text, make it come out even.
internalpagesizes{46 }}

% Use @smallbook to reset parameters for 7x9.5 (or so) format. efallbook{{obaldefs = 1
arskip
= 2pt plus 1pt
tleading{12pt}%
%
internalpagesizes{7.5in}{5.in}{ffset}{16pt}%
%
ng = 0.3in
olerance = 700

ontentsrightmargin = 0pt
eftypemargin = 0pt
efbodyindent = .5cm
%

xample = alllispx

}}

% Use @afourpaper to print on European A4 paper. effourpaper{{obaldefs = 1
tleading{12pt}%
arskip
= 3pt plus 2pt minus 1pt
%
internalpagesizes{53
%
olerance = 700
}}

% A specific text layout, 24x15cm overall, intended for A4 paper. Top margin % 29mm, hence bottom margin 28mm, nominal side margin 3cm. effourlatex{{obaldefs = 1
tleading{13.6pt}%
%
fourpaper
internalpagesizes{237mm}{150mm}{3.6mm}{3.6mm}{3mm}{7mm}%
%
obaldefs = 0 }}

% Use @afourwide to print on European A4 paper in wide format. effourwide{%
fourpaper
internalpagesizes{9.5in}{6.5in}{ffset}{ngoffset}{7mm}%
%
obaldefs = 0 }

% @pagesizes TEXTHEIGHT[,TEXTWIDTH] % Perhaps we should allow setting the margins, opskip, arskip,
% and/or leading, also. Or perhaps we should compute them somehow. % efagesizes{arseargagesizesxxx}
efagesizesxxx#1{agesizesyyy
#1,,nish} efagesizesyyy#1,#2,#3nish{{%

tbox0 =
obaldefs = 1
%
arskip
= 3pt plus 2pt minus 1pt
tleading{13.2pt}%
%
internalpagesizes{#1}{et}{ngoffset}{44pt}% }}

% Set default to letter. % rpaper

ssage{and turning on texinfo input format.}

% Define macros to output various characters with catcode for normal text. atcode` atcode` = atcode`= atcode`_= atcode`= atcode`<= atcode`>= atcode`+= ef0rmaldoublequote{"} ef0rmaltilde{~} ef0rmalcaret{^} ef0rmalunderscore{_} ef0rmalverticalbar{|} ef0rmalless{<} ef0rmalgreater{>} ef0rmalplus{+}

% This macro is used to make a character print one way in ttfont % where it can probably just be output, and another way in other fonts, % where something hairier probably needs to be done. % % #1 is what to print if we are indeed using t; #2 is what to print % otherwise. Since all the Computer Modern typewriter fonts have zero % interword stretch (and shrink), and it is reasonable to expect all % typewriter fonts to have this, we can check that font parameter. % efifusingtt#1#2{ifdim ntdimen3hent=0pt #1\lse #2}

% Turn off all special characters except @ % (and those which the user can use as if they were ordinary). % Most of these we simply print from the t font, but for some, we can % use math or other variants that look better in normal text.

atcode` efctivedoublequote{{thar34}} doublequote atcode` =ctive ef~{{thar126}} hardef atcode`=ctive ef^{{t

atcode`_=ctive ef_{ifusingtt0rmalunderscore_} % Subroutine for the previous macro. ef_{vmode rn.06em

atcode`=ctive ef|{{thar124}} hardef atcode`<=ctive ef<{{t hardef r=`> atcode`>=ctive ef>{{t r}} atcode`+=ctive ef+{{t har 43}} %atcode 27=ctive %ef^^[{$iamondsuit$}

% Set up an active definition for =, but don't enable it most of the time. {atcode`==ctive obalef={{t har 61}}}

atcode`+=ctive atcode`_=ctive

% If a .fmt file is being used, characters that might appear in a file % name cannot be active until we have parsed the command line. % So turn them off again, and have \veryjob (or @setfilename) turn them on. % cive is called near the end of this file. efcive{atcode`+=acode`_=

atcode`@=0

% awbackslashxx output one backslash character in current font obalhardefawbackslashxx=`\ %{atcode`\= %@gdef@rawbackslashxx{}

% awbackslash redefines  as input to do awbackslashxx. {atcode`\=ctive @gdef@rawbackslash{@let=@rawbackslashxx }}

% 0rmalbackslash outputs one backslash in fixed width font. ef0rmalbackslash{{tawbackslashxx}}

% Say @foo, not o, in error messages. \scapechar=`@

% atcode 17=0 % Define control-q atcode`\=ctive

% 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}

% Make _ and + cers, temporarily. % This is canceled by @fixbackslash. @otherifyactive

% If a .fmt file is being used, we don't want the `input texinfo' to show up. % That is what \atinput is for; after that, the `´ should revert to printing % a backslash. % @gdef@eatinput input texinfo{@fixbackslash} @global@let = @eatinput

% 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 % that, assuming it is called before the first `´ could plausibly occur. % Also back turn on active characters that might appear in the input % file name, in case not using a pre-dumped format. % @gdef@fixbackslash{@ifx@eatinput @let = @normalbackslash @fi
@catcode`+=@active @catcode`@_=@active}

% These look ok in all fonts, so just make them not special. The @rm below % makes sure that the current font starts out as the newly loaded cmr10 @catcode`@$=@other @catcode`@%=@other @catcode`@&=@other @catcode`@#=@other

@textfonts @rm

@c Local variables: @c eval: (add-hook 'write-file-hooks 'time-stamp) @c page-delimiter: "^\\message" @c time-stamp-start: "def\\texinfoversion{" @c time-stamp-format: "%:y-%02m-%02d" @c time-stamp-end: "}" @c End: