You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
892 lines
31 KiB
892 lines
31 KiB
%% e-TeX V2.1;0
|
|
%% Revision-date: 01-FEB-1999 22:36:22 /PB
|
|
%% Revision-history: (at-end)
|
|
|
|
% The version number in the first line is compared with the corresponding
|
|
% element in e-TeX, and an error reported if incompatibility is detected.
|
|
% The cycle and revision numbers (that is, the element(s) following the
|
|
% period) are not used in this comparison, allowing enhancements to be made to
|
|
% this module and recorded in its header without introducing a risk of conflict.
|
|
%
|
|
% This allows to use this file with e-TeX versions 2.0 and 2.1!
|
|
%
|
|
% Other files whose headers must be kept in synch include "etexdefs.lib" and
|
|
% "language.def".
|
|
|
|
% This is "etex.src", the (e-TeX) source file for the "etex" format file.
|
|
% To build the format from it, use one of the following commands or the
|
|
% local equivalent:
|
|
|
|
% Generic: einitex *etex.src \dump
|
|
% emTeX: etex -i *etex.src \dump
|
|
% VMS: etex /init /noformat *"etex.src \dump"
|
|
|
|
% Assume a purely IniTeX environment and set up a minimal \catcode r\'egime
|
|
|
|
\catcode `\{=1
|
|
\catcode `\}=2
|
|
\catcode `\#=6
|
|
\catcode `\^=7
|
|
\catcode `\@=\catcode `\A
|
|
|
|
% Define the basic error-reporting and abort mechanisms:
|
|
|
|
\def \et@xmsg #1#2%
|
|
{\begingroup
|
|
\def \n {^^J}%
|
|
\def \ { }%
|
|
\newlinechar=\expandafter `\n
|
|
\if E#1%
|
|
\errorcontextlines=0
|
|
\errmessage {e-TeX error: #2}%
|
|
\else
|
|
\message {\n ! e-TeX \if I#1 message%
|
|
\else \if W#1 warning%
|
|
\else \if F#1 fatal error%
|
|
\else
|
|
\ unknown (#1)%
|
|
\fi
|
|
\fi
|
|
\fi: #2%
|
|
}%
|
|
\fi
|
|
\endgroup
|
|
}
|
|
|
|
% Note: a future version may report errors in the %<fac>-<s>-<code>[, <text>]
|
|
% format, allowing the more verbose <text>s to be read from file rather than
|
|
% stored in the format.
|
|
|
|
\def \et@xabort #1%
|
|
{\et@xmsg {F}{#1}%
|
|
\batchmode
|
|
\end
|
|
}
|
|
|
|
% Make sure this file is being read by e-TeX in extended mode;
|
|
% If it is, prepare to check version/revision compatibility, otherwise abort.
|
|
|
|
\ifx \undefined \eTeXversion
|
|
\et@xabort {this file can be processed only in extended mode;\n
|
|
\ \ did you perhaps forget the asterisk?%
|
|
}%
|
|
\else
|
|
\begingroup
|
|
\catcode `\%=12
|
|
\catcode `\?=14
|
|
\xdef \et@xfilehdr
|
|
{\detokenize {%% e-TeX V}\the \eTeXversion \eTeXrevision}?
|
|
\xdef \et@xlibhdr
|
|
{\detokenize {%% e-TeXlib V}\the \eTeXversion \eTeXrevision}?
|
|
\endgroup
|
|
\fi
|
|
|
|
% Assume extended mode, but no additional \catcodes/\defs yet;
|
|
% set up a simple e-TeX condition-reporting system:
|
|
|
|
\def \et@xinf #1{\et@xmsg {I}{#1}} %%% not currently used
|
|
\def \et@xwarn #1{\et@xmsg {W}{#1}}
|
|
\def \et@xerr #1#2{{\errhelp={#2}\et@xmsg {E}{#1}}}
|
|
|
|
% deactivate the processing of patterns and exceptions; these will be
|
|
% reinstated later, after the \uselanguage mechanism has been defined.
|
|
|
|
\let \et@xpatterns=\patterns
|
|
\def \patterns
|
|
{\begingroup
|
|
\everyeof={\fi \endgroup}%
|
|
\message {[skipping from \noexpand \patterns to end-of-file...]}%
|
|
\iffalse
|
|
}
|
|
|
|
% Read "plain.tex" (\patterns & \hyphenation will be skipped)
|
|
|
|
\input plain
|
|
|
|
% restore the catcode of commercial-at (@), which will just have been clobbered
|
|
|
|
\catcode `\@=\catcode `\A
|
|
|
|
% Assume an extended Plain environment (i.e. there are no longer any
|
|
% restrictions on the coding techniques we can use). First prepare to
|
|
% carry out consistency checks on the file headers and the current e-TeX
|
|
% version/revision levels:
|
|
|
|
\newread \et@xinput
|
|
|
|
\def \etexhdrchk #1#2%
|
|
{\openin \et@xinput=#2
|
|
\ifeof \et@xinput
|
|
\chardef \etexstatus=0 % V1.0-1
|
|
\else
|
|
\begingroup
|
|
\endlinechar=-1
|
|
\readline \et@xinput to \et@xbuf
|
|
\closein \et@xinput
|
|
\def \p@rtition ##1.##2\endp@rtition {##1}% V2.1%0
|
|
\xdef \et@xbuf
|
|
{\expandafter \p@rtition \et@xbuf .\endp@rtition}% V2.1;0
|
|
\xdef \et@xtmp {\csname et@x#1hdr\endcsname}%
|
|
\xdef \et@xtmp
|
|
{\expandafter \p@rtition \et@xtmp .\endp@rtition}% V2.1;0
|
|
\endgroup
|
|
\ifx \et@xtmp \et@xbuf
|
|
\chardef \etexstatus=2 % V1.1;4
|
|
\else
|
|
\chardef \etexstatus=1 % V1.1;4
|
|
\fi
|
|
\fi
|
|
}
|
|
|
|
% Check the version number of this file:
|
|
|
|
\def \et@xfmtsrc {etex.src}
|
|
\etexhdrchk {file} {\et@xfmtsrc}
|
|
\ifcase \etexstatus
|
|
\et@xerr {unable to open format source file "\et@xfmtsrc";}
|
|
{This should not happen; please ensure that your system
|
|
allows a file to be opened for reading more than once
|
|
concurrently.%
|
|
}%
|
|
\or
|
|
\et@xwarn {format source file "\et@xfmtsrc" has wrong header;\n
|
|
\ \ expected: "\et@xfilehdr"; found: "\et@xbuf";%
|
|
}%
|
|
{You are using a version of e-TeX which may be incompatible
|
|
with the source for the format file you are trying to
|
|
compile; please ensure that you have the most recent
|
|
version of each. I will proceed, but you should treat
|
|
the results with caution...%
|
|
}%
|
|
\fi
|
|
|
|
% Module handling now implemented (V1.0-2)
|
|
|
|
\def \module #1{\iftrue}
|
|
\let \endmodule=\fi
|
|
|
|
\newtoks \et@xtoks
|
|
|
|
\def \et@xl@@d #1 #2\endl@ad %%% the "#1 #2" code avoids trailing spaces
|
|
{\ifcsname module:#1\endcsname
|
|
\et@xwarn {duplicate module name "#1"}%
|
|
\else
|
|
\csname module:#1\endcsname %%% we exploit the side-effect explicitly
|
|
\et@xtoks=\expandafter
|
|
{\the \et@xtoks
|
|
\expandafter \let \csname module:#1\endcsname=\undefined
|
|
}%
|
|
\fi
|
|
}
|
|
|
|
\def \et@xl@ad #1#2,#3\endl@ad %%% the #1#2 code avoids spurious leading spaces
|
|
{\et@xl@@d #1#2 \endl@ad
|
|
\if *#3*
|
|
\let \n@xt=\relax
|
|
\else
|
|
\def \n@xt {\et@xl@ad #3\endl@ad}%
|
|
\fi
|
|
\n@xt
|
|
}
|
|
|
|
\def \et@xload #1 %%% needed because of the embedded \ifs...
|
|
{\def \module ##1%
|
|
{\unless
|
|
\ifcsname module:##1\endcsname
|
|
\message {Skipping module "##1";}%
|
|
\else
|
|
\message {Loading module "##1";}%
|
|
}%
|
|
\input #1
|
|
\def \module ##1{\iftrue}%
|
|
}
|
|
|
|
\def \load #1 from #2 %%% selective module loading from an e-TeX library file
|
|
{\etexhdrchk {lib} {#2}%
|
|
\ifcase \etexstatus
|
|
\et@xerr {unable to open library file "#2"; load aborted.}
|
|
{I got an <eof> on trying to open your library file;
|
|
please make sure it exists, is readable and is not locked.%
|
|
}%
|
|
\or
|
|
\et@xerr {library file "#2" has wrong header;\n
|
|
\ \ expected: "\et@xlibhdr"; found: "\et@xbuf";\n
|
|
\ \ load aborted.%
|
|
}%
|
|
{The first line of your library does not start with
|
|
the correct e-TeX header; you may need to update the
|
|
file to be compatible with the current version of
|
|
e-TeX, or you may simply have specified the wrong file.%
|
|
}%
|
|
\else
|
|
\et@xtoks={\et@xtoks={}}%
|
|
\et@xl@ad #1,\endl@ad
|
|
\et@xload {#2}
|
|
\the \et@xtoks
|
|
\fi
|
|
}
|
|
|
|
\load interactionmodes from etexdefs.lib %%% \load <foo>[, <bar>...] from <baz>
|
|
|
|
\def \@sk #1#2#3%
|
|
{\ifnum \interactionmode=\interactionmodes {errorstop} %%% V2.0;15
|
|
\def \pr@mpt {\csname #1 \endcsname}%
|
|
\edef \pr@mptloop {{\escapechar=-1 \global \readline 16 to \pr@mpt}}%
|
|
\loop \pr@mptloop
|
|
\ch@ckforyn \pr@mpt {#2}%
|
|
\ifb@dresponse
|
|
\message {Please answer Y[es] or N[o]}%
|
|
\repeat
|
|
\else
|
|
\def \pr@mpt {#3}%
|
|
\ch@ckforyn \pr@mpt {#2}%
|
|
\fi
|
|
}
|
|
|
|
\def \ch@ckforyn #1#2% Bernd Raichle's improved version, V1.0-1
|
|
{\edef \@nswer {#1}%
|
|
\def \p@rse ##1##2\endp@rse
|
|
{\lowercase {\if y##1}\b@dresponsefalse \csname #2true\endcsname
|
|
\else \lowercase {\if n##1}\b@dresponsefalse \csname #2false\endcsname
|
|
\else
|
|
\b@dresponsetrue
|
|
\fi
|
|
\fi
|
|
}%
|
|
\expandafter \p@rse \@nswer \endp@rse
|
|
}
|
|
|
|
\def \usef@llback %%% V1.0-3
|
|
{\message {Using fallback mode (USenglish)}%
|
|
\addlanguage {USenglish}{hyphen}{}{2}{3}%
|
|
}
|
|
|
|
% OK, that's all the utilities defined; on with the real work:
|
|
% First, re-instate \patterns:
|
|
|
|
\let \patterns=\et@xpatterns
|
|
|
|
% Define the language-handling commands
|
|
|
|
\def \et@xlang {\csname newlanguage\endcsname}
|
|
|
|
\def \uselanguage #1%
|
|
{\ifcsname lang@#1\endcsname
|
|
\language=\csname lang@#1\endcsname
|
|
\lefthyphenmin=\csname lhm@#1\endcsname
|
|
\righthyphenmin=\csname rhm@#1\endcsname
|
|
\ifdefined \uselanguage@hook % V1.0-1
|
|
\uselanguage@hook {#1}% % V1.0-1
|
|
\fi
|
|
\else
|
|
\et@xerr {language #1 undefined.}%
|
|
{You are trying to use a language which has not previously
|
|
been defined; remember that any language you want to use
|
|
will need to have been specified at the time the format
|
|
was created.%
|
|
}%
|
|
\fi
|
|
}
|
|
|
|
\def \addlanguage #1#2#3#4#5% language patterns exceptions lhm rhm
|
|
{\expandafter \et@xlang \csname lang@#1\endcsname
|
|
\expandafter \chardef \csname lhm@#1\endcsname=#4 % V1.0-1
|
|
\expandafter \chardef \csname rhm@#1\endcsname=#5 % V1.0-1
|
|
\uselanguage {#1}%
|
|
\input #2
|
|
\if *#3*\else \input #3 \fi
|
|
\ifdefined \addlanguage@hook % V1.0-4
|
|
\addlanguage@hook {#1}% % V1.0-4
|
|
\fi
|
|
\edef \fmtversion {\fmtversion/#1}%
|
|
}
|
|
|
|
% Decrement \count 19, because \newlanguage will increment it again
|
|
|
|
\advance \count 19 by -1
|
|
|
|
% We are about to try to process a user/site-specific file "language.def",
|
|
% which establishes a Babel-like language selection environment. Since
|
|
% there is always a risk of a spurious file of that name being found,
|
|
% we look for an e-TeX header in the first line. If the file can be opened,
|
|
% but doesn't have the right header, we interrogate the user as to whether
|
|
% to use fallback mode; in this mode, we simply establish USenglish as the
|
|
% sole language, with the et@x patterns, exceptions and left- and right-
|
|
% hyphen minima for TeX. If we can't interrogate the user (e.g. not in
|
|
% \errorstopmode), or if the user elects not to use fallback, we abort;
|
|
% if the file can't be found/opened, we use fallback unconditionally.
|
|
|
|
\newif \ifb@dresponse
|
|
\newif \ifusef@llback
|
|
|
|
\def \l@ngdefnfile {language.def}
|
|
|
|
\etexhdrchk {file} {\l@ngdefnfile}
|
|
\ifcase \etexstatus
|
|
\et@xwarn {unable to open file "\l@ngdefnfile";}%
|
|
\usef@llback % unable to open "language.def"
|
|
\or
|
|
\et@xwarn {file "\l@ngdefnfile" has wrong header;\n
|
|
\ \ expected: "\et@xfilehdr"; found: "\et@xbuf";%
|
|
}%
|
|
\@sk {Use fallback?} {usef@llback} {y}%
|
|
\ifusef@llback
|
|
\usef@llback
|
|
\else
|
|
\input \l@ngdefnfile % use "language.def" after warning
|
|
\fi
|
|
\else
|
|
\input \l@ngdefnfile % "language.def" open & valid
|
|
\fi
|
|
|
|
% All that was just to set up natural language handling...
|
|
% The "real" work of "etex.src", however, is to augment the non-primitives
|
|
% of Plain.TeX to incorporate e-TeX specific features, and to add new
|
|
% non-primitives to simplify access to new e-TeX specific primitives.
|
|
|
|
\message {Augmenting the Plain TeX definitions:}
|
|
\message {\string \tracingall;}
|
|
|
|
\def \tracingall
|
|
{\tracingonline=\@ne
|
|
\tracingcommands=\thr@@ % plain.tex has \tw@
|
|
\tracingstats=\tw@
|
|
\tracingpages=\@ne
|
|
\tracingoutput=\@ne
|
|
\tracinglostchars=\tw@ % plain.tex has \@ne
|
|
\tracingmacros=\tw@
|
|
\tracingparagraphs=\@ne
|
|
\tracingrestores=\@ne
|
|
\showboxbreadth=\maxdimen
|
|
\showboxdepth=\maxdimen
|
|
\errorstopmode
|
|
\tracinggroups=\@ne
|
|
\tracingifs=\@ne
|
|
\tracingscantokens=\@ne
|
|
\tracingnesting=\@ne
|
|
\tracingassigns=\tw@
|
|
}
|
|
|
|
\message {Adding new e-TeX definitions:}
|
|
|
|
\message {\string \eTeX,}
|
|
\def \eTeX {$\varepsilon$-\TeX} %%% the simple version, not suitable for maths;
|
|
%%% a more sophisticated one may find its way
|
|
%%% into "etexdefs.lib" in due course.
|
|
|
|
\message {\string \loggingall,}
|
|
\def \loggingall {\tracingall \tracingonline=\z@}
|
|
|
|
\message {\string \tracingnone,}
|
|
\def \tracingnone
|
|
{\tracingassigns=\z@
|
|
\tracingnesting=\z@
|
|
\tracingscantokens=\z@
|
|
\tracingifs=\z@
|
|
\tracinggroups=\z@
|
|
\showboxdepth=\thr@@
|
|
\showboxbreadth=5
|
|
\tracingrestores=\z@
|
|
\tracingparagraphs=\z@
|
|
\tracingmacros=\z@
|
|
\tracinglostchars=\@ne
|
|
\tracingoutput=\z@
|
|
\tracingpages=\z@
|
|
\tracingstats=\z@
|
|
\tracingcommands=\z@
|
|
\tracingonline=\z@
|
|
}
|
|
|
|
\message {register allocation;}
|
|
|
|
\newcount \et@xins % our insertion counter (\insc@unt is used differently)
|
|
|
|
% We have to adjust the Plain TeX register allocation counts for our
|
|
% slightly modified book-keeping:
|
|
|
|
\advance \count 10 by 1 % \count 10=23 % allocates \count registers 23, 24, ...
|
|
\advance \count 11 by 1 % \count 11=10 % allocates \dimen registers 10, 11, ...
|
|
\advance \count 12 by 1 % \count 12=10 % allocates \skip registers 10, 11, ...
|
|
\advance \count 13 by 1 % \count 13=10 % allocates \muskip registers 10, 11, ...
|
|
\advance \count 14 by 1 % \count 14=10 % allocates \box registers 10, 11, ...
|
|
\advance \count 15 by 1 % \count 15=10 % allocates \toks registers 10, 11, ...
|
|
\advance \count 16 by 1 % \count 16=0 % allocates input streams 0, 1, ...
|
|
\advance \count 17 by 1 % \count 17=0 % allocates output streams 0, 1, ...
|
|
\advance \count 18 by 1 % \count 18=4 % allocates math families 4, 5, ...
|
|
\advance \count 19 by 1 % \count 19=0 % allocates \language codes 0, 1, ...
|
|
|
|
\et@xins=\insc@unt % \et@xins=255 % allocates insertions 254, 253, ...
|
|
|
|
% We don't change the Plain TeX definitions of \newcount, etc., but the
|
|
% \alloc@ macro doing the actual work is redefined.
|
|
|
|
% When the normal register pool for \count, \dimen, \skip, \muskip,
|
|
% \box, or \toks registers is exhausted, we switch to the extended pool.
|
|
|
|
\def \alloc@ #1#2#3#4#5%
|
|
{\ifnum \count 1#1 < #4% make sure there's still room
|
|
\allocationnumber=\count 1#1
|
|
\global \advance \count 1#1 by \@ne
|
|
\global #3#5=\allocationnumber
|
|
\wlog {\string #5=\string #2\the \allocationnumber}%
|
|
\else \ifnum #1 < 6
|
|
\begingroup \escapechar=\m@ne
|
|
\expandafter \alloc@@ \expandafter {\string #2}#5%
|
|
\else
|
|
\errmessage {No room for a new #2}%
|
|
\fi
|
|
\fi
|
|
}
|
|
|
|
% The \expandafter construction used here allows the generation of
|
|
% \newcount and \globcount from #1=count. Moreover (and more important)
|
|
% this construction avoids the appearance of \outer macros inside
|
|
% macro definitions or conditionals.
|
|
|
|
\def \alloc@@ #1#2%
|
|
{\endgroup % restore \escapechar
|
|
\message {Normal \csname#1\endcsname register pool exhausted,
|
|
switching to extended pool.}%
|
|
\global \expandafter
|
|
\let \csname new#1\expandafter \endcsname \csname glob#1\endcsname
|
|
\csname new#1\endcsname#2%
|
|
}
|
|
|
|
% We do change the Plain TeX definition of \newinsert
|
|
|
|
\outer \def \newinsert #1%make sure there's still room for ...
|
|
{\ch@ck 0 \et@xins \count % ... a \count, ...
|
|
{\ch@ck 1 \et@xins \dimen % ... \dimen, ...
|
|
{\ch@ck 2 \et@xins \skip % ... \skip, ...
|
|
{\ch@ck 4 \et@xins \box % ... and \box register
|
|
{\global \advance \et@xins by \m@ne
|
|
\unless
|
|
\ifnum \insc@unt < \et@xins
|
|
\global \insc@unt=\et@xins
|
|
\fi
|
|
\allocationnumber=\et@xins
|
|
\global \chardef #1=\allocationnumber
|
|
\wlog {\string #1=\string \insert \the \allocationnumber}%
|
|
}%
|
|
}%
|
|
}%
|
|
}%
|
|
}
|
|
|
|
\def \ch@ck #1#2#3#4%
|
|
{\ifnum \count 1#1 < #2#4\else \errmessage {No room for a new #3}\fi}
|
|
|
|
% And we define \reserveinserts, so that you can say \reserveinserts{17}
|
|
% in order to reserve room for up to 17 additional insertion classes that will
|
|
% not be taken away by \newcount, \newdimen, \newskip, or \newbox.
|
|
|
|
\outer \def \reserveinserts#1%
|
|
{\global \insc@unt=\numexpr \et@xins \ifnum #1 > \z@ -#1\fi \relax}
|
|
|
|
\message {extended register allocation;}
|
|
|
|
% Now, we define \globcount, \globbox, etc., so that you can say
|
|
% \globcount\foo and \foo will be defined (with \countdef) to be the
|
|
% next count register from the vastly larger but somewhat less efficient
|
|
% extended register pool. We also define \loccount, etc., but these
|
|
% register definitions are local to the current group.
|
|
|
|
\count 260=277 % globally allocates \count registers 277, 278, ...
|
|
\count 261=\@cclvi % globally allocates \dimen registers 256, 257, ...
|
|
\count 262=\@cclvi % globally allocates \skip registers 256, 257, ...
|
|
\count 263=\@cclvi % globally allocates \muskip registers 256, 257, ...
|
|
\count 264=\@cclvi % globally allocates \box registers 256, 257, ...
|
|
\count 265=\@cclvi % globally allocates \toks registers 256, 257, ...
|
|
\count 266=\@ne % globally allocates \marks classes 1, 2, ...
|
|
|
|
\def \et@xmaxregs {32768}
|
|
|
|
\count 270=\et@xmaxregs % locally allocates \count registers 32767, 32766, ...
|
|
\count 271=\et@xmaxregs % ditto for \dimen registers
|
|
\count 272=\et@xmaxregs % ditto for \skip registers
|
|
\count 273=\et@xmaxregs % ditto for \muskip registers
|
|
\count 274=\et@xmaxregs % ditto for \box registers
|
|
\count 275=\et@xmaxregs % ditto for \toks registers
|
|
\count 276=\et@xmaxregs % ditto for \marks classes
|
|
|
|
% \count registers 256-259 and 267-269 are not (yet) used
|
|
|
|
\outer \def \globcount {\et@xglob 0 \count \countdef}
|
|
\def \loccount {\et@xloc 0 \count \countdef}
|
|
\outer \def \globdimen {\et@xglob 1 \dimen \dimendef}
|
|
\def \locdimen {\et@xloc 1 \dimen \dimendef}
|
|
\outer \def \globskip {\et@xglob 2 \skip \skipdef}
|
|
\def \locskip {\et@xloc 2 \skip \skipdef}
|
|
\outer \def \globmuskip {\et@xglob 3 \muskip \muskipdef}
|
|
\def \locmuskip {\et@xloc 3 \muskip \muskipdef}
|
|
\outer \def \globbox {\et@xglob 4 \box \mathchardef}
|
|
\def \locbox {\et@xloc 4 \box \mathchardef}
|
|
\outer \def \globtoks {\et@xglob 5 \toks \toksdef}
|
|
\def \loctoks {\et@xloc 5 \toks \toksdef}
|
|
\outer \def \globmarks {\et@xglob 6 \marks \mathchardef}
|
|
\def \locmarks {\et@xloc 6 \marks \mathchardef}
|
|
|
|
\let\newmark=\globmarks %%% 2.0;14
|
|
\let\newmarks=\globmarks
|
|
|
|
\def \et@xglob #1#2#3#4%
|
|
{\et@xchk #1#2% make sure there's still room
|
|
{\allocationnumber=\count 26#1
|
|
\global \advance \count 26#1 by \@ne
|
|
\global #3#4=\allocationnumber
|
|
\wlog {\string #4=\string #2\the \allocationnumber}%
|
|
}%
|
|
}
|
|
|
|
\def \et@xloc#1#2#3#4%
|
|
{\et@xchk #1#2% make sure there's still room
|
|
{\advance \count 27#1 by \m@ne
|
|
\allocationnumber=\count 27#1
|
|
#3#4=\allocationnumber
|
|
\wlog {\string #4=\string #2\the \allocationnumber \space (local)}%
|
|
}%
|
|
}
|
|
|
|
\def \et@xchk #1#2#3%
|
|
{\ifnum \count 26#1 < \count 27#1
|
|
#3%
|
|
\else
|
|
\errmessage {No room for a new #2}%
|
|
\fi
|
|
}
|
|
|
|
% Next we define \globcountblk, \loccountblk, etc., so that one can
|
|
% write \globcountblk\foo{17} and \foo will be defined (with \mathchardef)
|
|
% as the first (the zeroth?) of a block of 17 consecutive registers.
|
|
% Thus the user is intended to reference elements <\foo+0> to <\foo+n-1>,
|
|
% where n is the length of the block allocated.
|
|
|
|
\outer \def \globcountblk {\et@xgblk 0 \count}
|
|
\def \loccountblk {\et@xlblk 0 \count}
|
|
\outer \def \globdimenblk {\et@xgblk 1 \dimen}
|
|
\def \locdimenblk {\et@xlblk 1 \dimen}
|
|
\outer \def \globskipblk {\et@xgblk 2 \skip}
|
|
\def \locskipblk {\et@xlblk 2 \skip}
|
|
\outer \def \globmuskipblk {\et@xgblk 3 \muskip}
|
|
\def \locmuskipblk {\et@xlblk 3 \muskip}
|
|
\outer \def \globboxblk {\et@xgblk 4 \box}
|
|
\def \locboxblk {\et@xlblk 4 \box}
|
|
\outer \def \globtoksblk {\et@xgblk 5 \toks}
|
|
\def \loctoksblk {\et@xlblk 5 \toks}
|
|
\outer \def \globmarksblk {\et@xgblk 6 \marks}
|
|
\def \locmarksblk {\et@xlblk 6 \marks}
|
|
|
|
% And, both to provide a higher-level interface to the block allocation
|
|
% scheme, and to demonstrate possible applications of the new \...expr
|
|
% primitives, we also define \globcountvector and \loccountvector (etc)
|
|
% which allow the user to access elements with embedded arithmetic, as in
|
|
|
|
% \globcountvector \foo {12}
|
|
% \foo {\count 0 + 3} = \foo {\count 1 * 2}
|
|
|
|
\outer \def \globcountvector {\et@xgvec 0 \count}
|
|
\def \loccountvector {\et@xlvec 0 \count}
|
|
\outer \def \globdimenvector {\et@xgvec 1 \dimen}
|
|
\def \locdimenvector {\et@xlvec 1 \dimen}
|
|
\outer \def \globskipvector {\et@xgvec 2 \skip}
|
|
\def \locskipvector {\et@xlvec 2 \skip}
|
|
\outer \def \globmuskipvector {\et@xgvec 3 \muskip}
|
|
\def \locmuskipvector {\et@xlvec 3 \muskip}
|
|
\outer \def \globboxvector {\et@xgvec 4 \box}
|
|
\def \locboxvector {\et@xlvec 4 \box}
|
|
\outer \def \globtoksvector {\et@xgvec 5 \toks}
|
|
\def \loctoksvector {\et@xlvec 5 \toks}
|
|
\outer \def \globmarksvector {\et@xgvec 6 \marks}
|
|
\def \locmarksvector {\et@xlvec 6 \marks}
|
|
|
|
\def \et@xgblk #1#2#3#4%
|
|
{\et@xchkblk #1#2{#4}% make sure there's still room
|
|
{\allocationnumber=\count 26#1
|
|
\global \advance \count 26#1 by #4%
|
|
\global \mathchardef #3=\allocationnumber
|
|
\wlog {\string #3=\string #2blk{\number #4} at \the \allocationnumber}%
|
|
}%
|
|
}
|
|
|
|
\def \et@xlblk #1#2#3#4%
|
|
{\et@xchkblk #1#2{#4}% make sure there's still room
|
|
{\advance \count 27#1 by -#4%
|
|
\allocationnumber=\count 27#1
|
|
\mathchardef #3=\allocationnumber
|
|
\wlog {\string #3=\string #2blk{\number #4}
|
|
at \the \allocationnumber \space (local)%
|
|
}%
|
|
}%
|
|
}
|
|
|
|
\begingroup
|
|
\catcode `\# = 12
|
|
\gdef \et@xhash {#}
|
|
\endgroup
|
|
|
|
\def \et@xgvec #1#2#3#4%
|
|
{\et@xchkblk #1#2{#4}% make sure there's still room
|
|
{\allocationnumber=\count 26#1
|
|
\global \advance \count 26#1 by #4%
|
|
\ifx #2\box
|
|
\def \2{}%
|
|
\else \ifx #2\marks
|
|
\def \2{}%
|
|
\else
|
|
\def \2{\string #2}%
|
|
\fi
|
|
\fi
|
|
\xdef #3##1{\2 \noexpand \numexpr \the \allocationnumber+##1\relax}%
|
|
\wlog {\string #3 {\et@xhash 1} =
|
|
\2 {\the \allocationnumber+\et@xhash 1} (global #2 vector)%
|
|
}%
|
|
}%
|
|
}
|
|
|
|
\def \et@xlvec #1#2#3#4%
|
|
{\et@xchkblk #1#2{#4}% make sure there's still room
|
|
{\advance \count 27#1 by -#4%
|
|
\allocationnumber=\count27#1
|
|
\mathchardef #3=\allocationnumber
|
|
\ifx #2\box
|
|
\def \2{}%
|
|
\else \ifx #2\marks
|
|
\def \2{}%
|
|
\else
|
|
\def \2{\string #2}%
|
|
\fi
|
|
\fi
|
|
\edef #3##1{\2 \noexpand \numexpr \the \allocationnumber+##1\relax}%
|
|
\wlog {\string #3 {\et@xhash 1} =
|
|
\2 {\the \allocationnumber+\et@xhash 1} (local #2 vector)%
|
|
}%
|
|
}%
|
|
}
|
|
|
|
\def \et@xchkblk #1#2#3#4%
|
|
{\ifnum #3 < \z@
|
|
\errmessage {Negative register block size \number #3}%
|
|
\else \ifnum \numexpr \count 26#1+#3 > \count 27#1
|
|
\errmessage {No room for new #2block of size \number#3}%
|
|
\else
|
|
#4%
|
|
\fi
|
|
\fi
|
|
}
|
|
|
|
% In an attempt to reduce the overheads of e-TeX, we recycle all possible
|
|
% resources, including (as a penultimate step) the recycler itself...
|
|
% The user can circumvent (or force) this during format creation,
|
|
% by \letting \ifrecycle=\iffalse (or \iftrue, to force it).
|
|
|
|
% As this file has grown by accretion, it is possible that we are no
|
|
% longer recycling all the resources we could; this will be investigated.
|
|
|
|
\def \mayber@cycle {\expandafter \ifrecycle}
|
|
\def \forcer@cycle {\expandafter \iftrue}
|
|
|
|
\ifdefined \ifrecycle
|
|
\mayber@cycle
|
|
\else
|
|
\forcer@cycle
|
|
\fi
|
|
|
|
% There's a concealed \if... lurking here, which explains the
|
|
% strange indentation of the code that follows (V1.0-1)
|
|
|
|
\def \r@cycle #1%
|
|
{\ifdefined #1
|
|
\message {\string #1,}\let #1=\und@fined
|
|
\else
|
|
\message {\string #1 (not defined),}
|
|
\fi
|
|
}
|
|
{\newlinechar=`\! \message {!Recycling:}}
|
|
|
|
\r@cycle \addlanguage
|
|
\r@cycle \@nswer
|
|
\r@cycle \@sk
|
|
\r@cycle \b@dresponsetrue
|
|
\r@cycle \b@dresponsefalse
|
|
\r@cycle \ch@ckforyn
|
|
\r@cycle \mayber@cycle
|
|
\r@cycle \et@xabort
|
|
\r@cycle \et@xbuf
|
|
\r@cycle \et@xfmtsrc
|
|
\r@cycle \et@xfilehdr
|
|
\r@cycle \et@xinf
|
|
\r@cycle \et@xpatterns
|
|
% \r@cycle \ifb@dresponse
|
|
% \r@cycle \ifusef@llback
|
|
\r@cycle \l@ngdefnfile
|
|
\r@cycle \n@xt
|
|
\r@cycle \p@rse
|
|
\r@cycle \pr@mpt
|
|
\r@cycle \pr@mptloop
|
|
\r@cycle \forcer@cycle
|
|
\r@cycle \usef@llback
|
|
\r@cycle \usef@llbacktrue
|
|
\r@cycle \usef@llbackfalse
|
|
|
|
% The following are retained, since they may be needed by user code; with a few
|
|
% (regrettable) exceptions, all of these are given the \etex or \et@x prefix,
|
|
% to reduce as far as possible the risk of them clashing with other used-defined
|
|
% names.
|
|
|
|
% The e-TeX team are willing to change the names of the remaining, at-risk,
|
|
% control sequences if it is demonstrated that the current names cause problems
|
|
% or difficulties.
|
|
|
|
\def \r@tain #1%
|
|
{\ifdefined #1
|
|
\message {\string #1,}
|
|
\else
|
|
\message {\string #1 (not defined),}
|
|
\fi
|
|
}
|
|
{\newlinechar=`\! \message {!Retaining:}}
|
|
|
|
\r@tain \et@xerr
|
|
\r@tain \et@xinput
|
|
\r@tain \et@xlibhdr
|
|
\r@tain \et@xmsg
|
|
\r@tain \et@xtoks
|
|
\r@tain \et@xwarn
|
|
\r@tain \et@xl@@d
|
|
\r@tain \et@xl@ad
|
|
\r@tain \et@xload
|
|
\r@tain \et@xlang
|
|
\r@tain \et@xhash
|
|
\r@tain \eTeX
|
|
\r@tain \etexhdrchk
|
|
% \r@tain \endmodule
|
|
\r@tain \etexstatus
|
|
\r@tain \module
|
|
\r@tain \uselanguage
|
|
|
|
\r@cycle \r@tain
|
|
\r@cycle \r@cycle
|
|
|
|
\fi
|
|
|
|
% And finally re-catcode commercial-at
|
|
|
|
\catcode `\@=12
|
|
\endinput
|
|
|
|
%% Revision-history:
|
|
|
|
01-FEB-1999: 2.1;0 Allow file to be used with e-TeX versions 2.0 and 2.1
|
|
|
|
25-MAR-1998: 2.0;19 Improved log message for \{glob|loc}{marks|box}vector (PEB)
|
|
|
|
24-MAR-1998: 2.0;18 Optimisation of one section made (DC & PEB),
|
|
a couple of \if tests made more robust,
|
|
and spacing improved in one macro.
|
|
|
|
24-MAR-1998: 2.0;17 Coding styles unified and all references to Peter
|
|
Breitenlohner eliminated from main code
|
|
|
|
23-MAR-1998: 2.0;16 Continued from 2.0;15
|
|
|
|
20-MAR-1998: 2.0;15 Changes made here and in "etexdefs.lib" to
|
|
improve compatibility with LaTeX, and
|
|
\{glob,loc}{marks,box}vector re-thought.
|
|
|
|
11-MAR-1998: 2.0;14 \newmark made synonym for \newmarks / PT
|
|
|
|
10-MAR-1998: 2.0;13 Missing brace re-inserted in \...lvec /PT
|
|
|
|
10-MAR-1998: 2.0;12 Typo corrected in Peter's name /PT
|
|
|
|
10-MAR-1998: 2.0;11 "\...lvec" failed to use \et@xhash; fixed / PT
|
|
|
|
10-MAR-1998: 2.0;10 \h@sh -> \et@xhash /PT
|
|
|
|
06-MAR-1998: 2.0;9 Final tweaks by PEB !
|
|
|
|
05-MAR-1998: <missing version number> Final tweaks by PT
|
|
|
|
28-Feb-1998: 2.0;8 Major re-work by PEB
|
|
|
|
24-Feb-1998: 2.0;7 \tracingnesting -> \tw@
|
|
|
|
24-FEB-1998: 2.0;6 version-mismatch reduced in severity;
|
|
\tracingall and ...none improved;
|
|
aesthetic spaces around "=" removed
|
|
|
|
24-Jan-1998: 2.0;5: block allocation of registers added
|
|
|
|
21-Jan-1998: 2.0;4: released to e-TeX team for testing/comments
|
|
|
|
20-Jan-1998: \glob... implemented, and coding simplified by
|
|
the implementation and use of of \max@xpr
|
|
|
|
06-Jan-1998: Alpha-testing complete of extended and local register allocation.
|
|
|
|
29-Dec-1997: The "%!" convention replaced by a corresponding "%%":
|
|
this should avoid any inadvertent conflict with Adobe conventions.
|
|
|
|
\tracingall augmented with
|
|
\tracinglostchars=\tw@ %%% Q -- should this be default?
|
|
\tracingnesting=\@ne
|
|
|
|
\tracingnone augmented.
|
|
|
|
05-DEC-1997: A long-standing bug removed: left- and right- hyphenmin
|
|
were transposed in fallback mode :-(((((
|
|
|
|
24-APR-1997: An interim release, to provide compatibility with Peter's
|
|
naming conventions for beta-test versions of e-TeX V2.
|
|
Consistency checking is now restricted to \eTeXversion,
|
|
and \eTeXrevision is ignored.
|
|
|
|
01-NOV-1996: V1.1;5: Final stage? Checking that everything possible
|
|
is recycled whilst nothing that is needed is lost. Retained
|
|
names given \etex or \et@x prefix wherever possible. Some
|
|
potentially dangerous cs-names commented out of the recycle/retain
|
|
lists because they were synonyms of members of the if-else-fi set.
|
|
The definition of the e-TeX logo added: this had somehow slipped
|
|
through the net! Intended to be the final revision before public
|
|
release, but awaiting comments from other members of the team.
|
|
|
|
31-OCT-1996: V1.1;4: errors noticed while proof-reading corrected; far
|
|
greater use made of concealed control sequences with
|
|
commercial-at (@); library file headers differentiated
|
|
from ordinary file headers; return-values for header-check
|
|
altered to allow fall-thru' if ok; fallback-use algorithm
|
|
significantly modified (major semantic shift).
|
|
|
|
29-OCT-1996: V1.1;3: tidying up prior to release; careful check on
|
|
which control words can be re-cycled; \recycle made more
|
|
robust, to check whether one is trying to re-cycle something
|
|
that was never 'cycled' in the first place (PEB suggestion);
|
|
\et@xmsg re-written to use \message or \errmessage as necessary;
|
|
\errhelps provided for all places they might be referenced.
|
|
|
|
27-OCT-1996: V1.1;2: minor version numbers re-introduced, using semi-colon
|
|
as delimiter and stopping pattern matching at the semi-colon;
|
|
\et@xfilehdr defined dynamically, based in \eTeXversion and
|
|
\eTeXrevision; \load now uses \etexhdrchk, so library
|
|
files are required to start with an e-TeX header; this will
|
|
have implications when e-TeX -> V2+, so this code should be
|
|
re-considered at this point.
|
|
|
|
17-OCT-1996: V1.1: minor version numbers eliminated, to reduce the
|
|
need for users to update their "language.def" files.
|
|
|
|
17-OCT-1996: V1.0-4: \addlanguage@hook added, version history moved to end.
|
|
|
|
17-OCT-1996: Version 1.0-3 does away with the "fallback" file.
|
|
|
|
16-OCT-1996: Version 1.0-2 implements module handling, so constant "3"
|
|
no longer used (see below).
|
|
|
|
13-Oct-1996: Replaced \def by \chardef where possible;
|
|
eliminated dependency on "etexdefs.def", hard-coding
|
|
in the constant "3" (with comment) instead;
|
|
used Bernd's \ch@ckforyn;
|
|
re-catcoded `\@ earlier, to reduce number of \[if]csnames;
|
|
commented the strange indentation of the \recycles at end.
|
|
|
|
11-Oct-1996: language handling commands modified (V1.0): PT/BR
|
|
|