diff options
-rw-r--r-- | Master/texmf-dist/tex/latex/etex/etex.sty | 400 |
1 files changed, 400 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/etex/etex.sty b/Master/texmf-dist/tex/latex/etex/etex.sty new file mode 100644 index 00000000000..a5197718566 --- /dev/null +++ b/Master/texmf-dist/tex/latex/etex/etex.sty @@ -0,0 +1,400 @@ + +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{etex} +% [1997/08/12 v0.1 eTeX basic definition package (DPC)] + [1998/03/26 v2.0 eTeX basic definition package (PEB)] + +\DeclareOption{grouptypes}{\catcode`\G=9} +\DeclareOption{interactionmodes}{\catcode`\I=9} +\DeclareOption{nodetypes}{\catcode`\N=9} +\DeclareOption{iftypes}{\catcode`\C=9} +\DeclareOption{localalloclog}{\let\et@xwlog\wlog} % the default +\DeclareOption{localallocnolog}{\let\et@xwlog\@gobble} % be quiet +\DeclareOption{localallocshow}{\let\et@xwlog\typeout} % debugging + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% A basic interface to some etex primitives, closely modeled on +%% etex.src and etexdefs.lib provided by the core etex team. + +%% The etex.src `module' system is not copied here, the standard +%% LaTeX package option mechanism is used instead, +%% however the package options match the module names. +%% (Currently grouptypes, interactionmodes, nodetypes, iftypes.) +%% The individual type names are different too: We use, e.g., +%% +%% `\bottomleveltype' and `\simplegrouptype' instead of +%% `\grouptypes{bottomlevel}' and `\grouptypes{simple}'. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% Other Comments... + +%% The names of the `interactionmodes' are not too good. +%% In particular \scroll and \batch are likely to clash with existing +%% uses. These names have been changed into \batchinteractionmode, +%% \scrollinteractionmode etc. +%% Similarly, the names of the `groupetypes' have been changed, in +%% particular \mathgroup would conflict with the LaTeX kernel. + +%% \etex logo could have the same trick as \LaTeXe to pick up a bold +%% epsilon when needed. (Not done here, I hate wasting tokens on logos.) +%% This version does have a \m@th not in the original. + +%% The \globcountvector, \loccountvector, etc. allocation macros are +%% not (yet) implemented. + +%% Currently if run on a standard TeX, the package generates an error. +%% Perhaps it should instead load some code to try to fake +%% the new etex primitives in that case??? +%% Likewise, the package generates an error when used with e-TeX V 1 + +%% The etex.src language mechanism is not copied here. That facility +%% does not use any of the etex features. LaTeX should be customised +%% using the same hyphen.cfg mechanism as for a format built with a +%% standard TeX. + +%% David Carlisle + +%% Upgraded for e-TeX V 2.0 +%% Peter Breitenlohner + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +\ifx\eTeXversion\@undefined + \PackageError{etex} + {This package may only be run using an\MessageBreak + etex in extended mode} + {Perhaps you forgot the `*' when making the format with (e)initex.% + } +\fi + +\ifnum\eTeXversion<2 + \PackageError{etex} + {This package requires e-TeX V 2} + {You are probably using the obsolete e-TeX V 1.% + } +\fi + +\def\eTeX{% + $\m@th\varepsilon$-\TeX} + +\def\tracingall{% + \tracingcommands\thr@@ % etex + \tracingstats\tw@ + \tracingpages\@ne + \tracinglostchars\tw@ % etex + \tracingmacros\tw@ + \tracingparagraphs\@ne + \tracingrestores\@ne + \tracinggroups\@ne % etex + \tracingifs\@ne % etex + \tracingscantokens\@ne % etex + \tracingnesting\@ne % etex + \tracingassigns\@ne % etex + \errorcontextlines\maxdimen + \showoutput} + +\def\loggingall{% + \tracingall + \tracingonline\z@} + +\def\tracingnone{% + \tracingonline\z@ + \showboxdepth\m@ne + \showboxbreadth\m@ne + \tracingoutput\z@ + \errorcontextlines\m@ne + \tracingassigns\z@ + \tracingnesting\z@ + \tracingscantokens\z@ + \tracingifs\z@ + \tracinggroups\z@ + \tracingrestores\z@ + \tracingparagraphs\z@ + \tracingmacros\z@ + \tracinglostchars\@ne + \tracingpages\z@ + \tracingstats\z@ + \tracingcommands\z@} + +%% Register allocation +%% We have to adjust the Plain TeX / LaTeX register allocation counts +%% for our slightly modified book-keeping, but first we allocate our +%% insertion counter \et@xins, because \insc@ount of Plain TeX / LaTeX +%% will be used differently. + +\newcount\et@xins + +\advance\count10 by 1 % \count10=23 % allocates \count registers 23, 24, ... +\advance\count11 by 1 % \count11=10 % allocates \dimen registers 10, 11, ... +\advance\count12 by 1 % \count12=10 % allocates \skip registers 10, 11, ... +\advance\count13 by 1 % \count13=10 % allocates \muskip registers 10, 11, ... +\advance\count14 by 1 % \count14=10 % allocates \box registers 10, 11, ... +\advance\count15 by 1 % \count15=10 % allocates \toks registers 10, 11, ... +\advance\count16 by 1 % \count16=0 % allocates input streams 0, 1, ... +\advance\count17 by 1 % \count17=0 % allocates output streams 0, 1, ... +\advance\count18 by 1 % \count18=4 % allocates math families 4, 5, ... +\advance\count19 by 1 % \count19=0 % allocates \language codes 0, 1, ... + +\et@xins=\insc@unt % \et@xins=255 % allocates insertions 254, 253, ... + +%% We don't change the LaTeX 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\count1#1<#4% make sure there's still room + \allocationnumber\count1#1 + \global\advance\count1#1\@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. + +\def\alloc@@#1#2% + {\endgroup % restore \escapechar + \wlog{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 LaTeX definition of \newinsert + +\def\newinsert#1{% make sure there's still room for ... + \ch@ck0\et@xins\count{% ... a \count, ... + \ch@ck1\et@xins\dimen{% ... \dimen, ... + \ch@ck2\et@xins\skip{% ... \skip, ... + \ch@ck4\et@xins\box{% ... and \box register + \global\advance\et@xins\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\count1#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} + +% 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. + +\count260=277 % globally allocates \count registers 277, 278, ... +\count261=256 % globally allocates \dimen registers 256, 257, ... +\count262=256 % globally allocates \skip registers 256, 257, ... +\count263=256 % globally allocates \muskip registers 256, 257, ... +\count264=256 % globally allocates \box registers 256, 257, ... +\count265=256 % globally allocates \toks registers 256, 257, ... +\count266=1 % globally allocates \marks classes 1, 2, ... + +\count270=32768 % locally allocates \count registers 32767, 32766, ... +\count271=32768 % ditto for \dimen registers +\count272=32768 % ditto for \skip registers +\count273=32768 % ditto for \muskip registers +\count274=32768 % ditto for \box registers +\count275=32768 % ditto for \toks registers +\count276=32768 % ditto for \marks classes + +% \count registers 256-259 and 267-269 are not (yet) used + +% \def \et@xglob #1#2#3#4% <offset>, <type>, <method>, <register> +% \def \et@xloc #1#2#3#4% <offset>, <type>, <method>, <register> + +\def \globcount {\et@xglob 0\count \countdef} +\def \loccount {\et@xloc 0\count \countdef} +\def \globdimen {\et@xglob 1\dimen \dimendef} +\def \locdimen {\et@xloc 1\dimen \dimendef} +\def \globskip {\et@xglob 2\skip \skipdef} +\def \locskip {\et@xloc 2\skip \skipdef} +\def \globmuskip {\et@xglob 3\muskip \muskipdef} +\def \locmuskip {\et@xloc 3\muskip \muskipdef} +\def \globbox {\et@xglob 4\box \mathchardef} +\def \locbox {\et@xloc 4\box \mathchardef} +\def \globtoks {\et@xglob 5\toks \toksdef} +\def \loctoks {\et@xloc 5\toks \toksdef} +\def \globmarks {\et@xglob 6\marks \mathchardef} +\def \locmarks {\et@xloc 6\marks \mathchardef} + +\let\newmarks=\globmarks %% this used to be \newmark for e-TeX V 1.1 + +\def\et@xglob#1#2#3#4% + {\et@xchk#1#2{% make sure there's still room + \allocationnumber=\count26#1% + \global\advance\count26#1\@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\count27#1by\m@ne + \allocationnumber=\count27#1% + #3#4=\allocationnumber + \et@xwlog{\string#4=\string#2\the\allocationnumber\space(local)}}% + } + +%% The allocation messages for local allocations use \et@xwlog, such that +%% these messages can easily be switched on/off + +\let\et@xwlog=\wlog + +\def\et@xchk#1#2#3% + {\ifnum\count26#1<\count27#1 #3\else\errmessage{No room for a new #2}\fi} + +% Next we define \globcountblk, \loccountblk, etc., so that you can +% say \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. + +% \def \et@xgblk #1#2#3#4% <offset>, <type>, <register>, <size> +% \def \et@xlblk #1#2#3#4% <offset>, <type>, <register>, <size> + +\def\globcountblk {\et@xgblk 0\count } +\def\loccountblk {\et@xlblk 0\count } +\def\globdimenblk {\et@xgblk 1\dimen } +\def\locdimenblk {\et@xlblk 1\dimen } +\def\globskipblk {\et@xgblk 2\skip } +\def\locskipblk {\et@xlblk 2\skip } +\def\globmuskipblk {\et@xgblk 3\muskip } +\def\locmuskipblk {\et@xlblk 3\muskip } +\def\globboxblk {\et@xgblk 4\box } +\def\locboxblk {\et@xlblk 4\box } +\def\globtoksblk {\et@xgblk 5\toks } +\def\loctoksblk {\et@xlblk 5\toks } +\def\globmarksblk {\et@xgblk 6\marks } +\def\locmarksblk {\et@xlblk 6\marks } + +% \def\et@xchkblk#1#1#3#4% <offset>, <type>, <size>, <action> + +\def\et@xgblk#1#2#3#4% + {\et@xchkblk#1#2{#4}% make sure there's still room + {\allocationnumber\count26#1% + \global\advance\count26#1by#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\count27#1-#4% + \allocationnumber\count27#1% + \mathchardef#3\allocationnumber + \et@xwlog{\string#3=\string#2blk{\number#4} at + \the\allocationnumber\space(local)}% + }% + } + +\def\et@xchkblk#1#2#3#4% + {\ifnum#3<\z@ + \errmessage{Negative register block size \number#3}% + \else\ifnum\numexpr\count26#1+#3>\count27#1% + \errmessage{No room for new #2block of size \number#3}% + \else #4\fi \fi + } + +\catcode`\G=14 +\catcode`\I=14 +\catcode`\N=14 +\catcode`\C=14 + +\ProcessOptions + +%% Declare names for `grouptypes' + +G \chardef \bottomleveltype = 0 % for the outside world +G \chardef \simplegrouptype = 1 % for local structure only +G \chardef \hboxgrouptype = 2 % for `\hbox{}' +G \chardef \adjustedhboxgrouptype = 3 % for `\hbox{}' in vertical mode +G \chardef \vboxgrouptype = 4 % for `\vbox{}' +G \chardef \vtopgrouptype = 5 % for `\vtop{}' +G \chardef \aligngrouptype = 6 % for `\halign{}', `\valign{}' +G \chardef \noaligngrouptype = 7 % for `\noalign{}' +G \chardef \outputgrouptype = 8 % for output routine +G \chardef \mathgrouptype = 9 % for, e.g, `^{}' +G \chardef \discgrouptype = 10 % for `\discretionary{}{}{}' +G \chardef \insertgrouptype = 11 % for `\insert{}', `\vadjust{}' +G \chardef \vcentergrouptype = 12 % for `\vcenter{}' +G \chardef \mathchoicegrouptype = 13 % for `\mathchoice{}{}{}{}' +G \chardef \semisimplegrouptype = 14 % for `\begingroup...\endgroup' +G \chardef \mathshiftgrouptype = 15 % for `$...$' +G \chardef \mathleftgrouptype = 16 % for `\left...\right' + +%% Declare names for `interactionmodes' + +I \chardef \batchinteractionmode = 0 % omits all stops and omits terminal output +I \chardef \nonstopinteractionmode = 1 % omits all stops +I \chardef \scrollinteractionmode = 2 % omits error stops +I \chardef \errorstopinteractionmode = 3 % stops at every opportunity to interact + +%% Declare names for `nodetypes' + +N \chardef \charnode = 0 % character nodes +N \chardef \hlistnode = 1 % hlist nodes +N \chardef \vlistnode = 2 % vlist nodes +N \chardef \rulenode = 3 % rule nodes +N \chardef \insnode = 4 % insertion nodes +N \chardef \marknode = 5 % a mark node +N \chardef \adjustnode = 6 % an adjust node +N \chardef \ligaturenode = 7 % a ligature node +N \chardef \discnode = 8 % a discretionary node +N \chardef \whatsitnode = 9 % special extension nodes +N \chardef \mathnode = 10 % a math node +N \chardef \gluenode = 11 % node that points to a glue specification +N \chardef \kernnode = 12 % a kern node +N \chardef \penaltynode = 13 % a penalty node +N \chardef \unsetnode = 14 % an unset node +N \chardef \mathsnodes = 15 % nodes that occur only in maths mode + +%% Declare names for `iftypes' + +C \chardef \charif = 1 % \if +C \chardef \catif = 2 % \ifcat +C \chardef \numif = 3 % \ifnum +C \chardef \dimif = 4 % \ifdim +C \chardef \oddif = 5 % \ifodd +C \chardef \vmodeif = 6 % \ifvmode +C \chardef \hmodeif = 7 % \ifhmode +C \chardef \mmodeif = 8 % \ifmmode +C \chardef \innerif = 9 % \ifinner +C \chardef \voidif = 10 % \ifvoid +C \chardef \hboxif = 11 % \ifhbox +C \chardef \vboxif = 12 % \ifvbox +C \chardef \xif = 13 % \ifx +C \chardef \eofif = 14 % \ifeof +C \chardef \trueif = 15 % \iftrue +C \chardef \falseif = 16 % \iffalse +C \chardef \caseif = 17 % \ifcase +C \chardef \definedif = 18 % \ifdefined +C \chardef \csnameif = 19 % \ifcsname +C \chardef \fontcharif = 20 % \iffontchar + +\catcode`\G=11 +\catcode`\I=11 +\catcode`\N=11 +\catcode`\C=11 + |