texinfo.tex
- Provided by: xemacs21-basesupport (Version: 2009.02.17.dfsg.2-4)
- Source: xemacs21-packages
- Report a bug
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: