% This is a stripped-down version of etex.src, meant as companion to % minim-plain.tex. % % It follows e-TeX V2.1;0-luatex2. % % The following has been removed: % - Module loading % - Version checks % % The following has been retained: % - Language handling (somewhat simplified) % - Tracing and logging extensions % - The \eTeX symbol % - Register allocation \catcode `\@=\catcode `\A % Define the language-handling commands \def \uselanguage #1% {\ifcsname lang@#1\endcsname \language=\csname lang@#1\endcsname \lefthyphenmin=\csname lhm@#1\endcsname \righthyphenmin=\csname rhm@#1\endcsname \ifcsname lu@texhyphen@loaded@\the\language\endcsname \else \global\expandafter\def\csname lu@texhyphen@loaded@\the\language\endcsname{}% \directlua{ if not status.ini_version then require("luatex-hyphen") luatexhyphen.loadlanguage("\luatexluaescapestring{#1}", \the\language) end}% \fi \ifdefined\uselanguage@hook \uselanguage@hook{#1}\fi \else \begingroup\errorcontextlines=0\relax \errhelp {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.% }% \errmessage {Language #1 undefined.}\endgroup \fi} \def \addlanguage #1#2#3#4#5{% language patterns exceptions lhm rhm \expandafter\newlanguage \csname lang@#1\endcsname \expandafter\chardef \csname lhm@#1\endcsname=#4 \expandafter\chardef \csname rhm@#1\endcsname=#5 \csname if\directlua{% do we want to skip this language now? require("luatex-hyphen") if (luatexhyphen.lookupname("\luatexluaescapestring{#1}") == nil) or (\number\csname lang@#1\endcsname == 0) then tex.sprint("false") % no, load it (execute 'else' part) else tex.sprint("true") % yes, skip end}\endcsname \else \uselanguage {#1}% \input #2 \if *#3*\else \input #3 \fi \edef \fmtversion {\fmtversion/#1}% \fi \ifdefined\addlanguage@hook \addlanguage@hook{#1}\fi} % 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. \input language.def % 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; \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 } % And finally re-catcode commercial-at \catcode `\@=12