diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/etex-pkg |
Initial commit
Diffstat (limited to 'macros/latex/contrib/etex-pkg')
-rw-r--r-- | macros/latex/contrib/etex-pkg/README | 17 | ||||
-rw-r--r-- | macros/latex/contrib/etex-pkg/etex.sty | 507 |
2 files changed, 524 insertions, 0 deletions
diff --git a/macros/latex/contrib/etex-pkg/README b/macros/latex/contrib/etex-pkg/README new file mode 100644 index 0000000000..c914b54cbc --- /dev/null +++ b/macros/latex/contrib/etex-pkg/README @@ -0,0 +1,17 @@ +The package provides a straightforward interface to many of the extensions +offered by e-TeX; in particular, it modifies LaTeX's register +allocation macros to make use of the extended register range. + +Note that for LaTeX releases from 2015 onwards, this package +is not required to use the extended register range. + +Maintained by David Carlisle, with sources at + +https://github.com/davidcarlisle/dpctex/tree/master/etex-pkg + +Please report issues at + +https://github.com/davidcarlisle/dpctex/issues + + + diff --git a/macros/latex/contrib/etex-pkg/etex.sty b/macros/latex/contrib/etex-pkg/etex.sty new file mode 100644 index 0000000000..ed2577c20f --- /dev/null +++ b/macros/latex/contrib/etex-pkg/etex.sty @@ -0,0 +1,507 @@ +% \iffalse meta-comment +% +% Copyright 1997, 1998, 2008 2015 2016 LaTeX Project and Peter Breitenlohner. +% +% This file (etex.sty) may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3 of +% this license or (at your option) any later version. The latest +% version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3 or later is part of all distributions of LaTeX +% version 2003/12/01 or later. +% +% This work has the LPPL maintenance status "maintained". +% +% The Current Maintainer of this work is David Carlisle. +% https://github.com/davidcarlisle/dpctex/issues +% \fi + +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{etex} +% [1997/08/12 v0.1 eTeX basic definition package (DPC)] +% [1998/03/26 v2.0 eTeX basic definition package (PEB)] +% [2015/03/02 v2.1 eTeX basic definition package (PEB,DPC)] +% [2015/07/06 v2.2 eTeX basic definition package (PEB,DPC)] +% [2015/07/08 v2.3 eTeX basic definition package (PEB,DPC)] +% [2015/09/02 v2.4 eTeX basic definition package (PEB,DPC)] +% [2016/01/07 v2.5 eTeX basic definition package (PEB,DPC)] +% [2016/01/11 v2.6 eTeX basic definition package (PEB,DPC)] + [2016/08/01 v2.7 eTeX basic definition package (PEB,DPC)] + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% 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 + +% 2.2 +% Check if the new latex 2015/01/01 allocation is already using +% extended reisters. If so it is too late to change allocation scheme. +% Older versions of LaTeX would have given an error when the classic +% TeX registers were all allocated, but newer formats allocate from +% the extended range, so usually this package is not needed. +\@tempswafalse +\ifnum\count10>\@cclv\@tempswatrue\else +\ifnum\count11>\@cclv\@tempswatrue\else +\ifnum\count12>\@cclv\@tempswatrue\else +\ifnum\count13>\@cclv\@tempswatrue\else +\ifnum\count14>\@cclv\@tempswatrue\else +\ifnum\count15>\@cclv\@tempswatrue +\fi\fi\fi\fi\fi\fi + +\if@tempswa +\PackageWarningNoLine{etex}{% +Extended allocation already in use.\MessageBreak +etex.sty code will not be used.\MessageBreak +To force etex package to load, add\MessageBreak +\string\RequirePackage{etex}\MessageBreak +at the start of the document} + +% 2.5 define the global allocation to be the standard ones +% as extended allocation is already in use. Helps with +% compatibility with some packages that use these commands +% after loading etex. +% 2.6 avoid error from outer if used with (e)plain +\expandafter\let\csname globcount\expandafter\endcsname + \csname newcount\endcsname +\expandafter\let\csname globdimen\expandafter\endcsname + \csname newdimen\endcsname +\expandafter\let\csname globskip\expandafter\endcsname + \csname newskip\endcsname +\expandafter\let\csname globmuskip\expandafter\endcsname + \csname newmuskip\endcsname +\expandafter\let\csname globtoks\expandafter\endcsname + \csname newtoks\endcsname +\expandafter\let\csname globmarks\expandafter\endcsname + \csname newmarks\endcsname +% end of 2.5/2.6 change + +\expandafter\endinput\fi + +% End of 2.2 addition. + +% 2.3 move option handling after the above error checks. +\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 +% End of 2.3 addition. + +% v2.7 +% \extrafloats does not work with this package +% but make it give a sensible error, not mis-parse \ifnum. +% +% Note that using \extrafloats earlier might not be safe as +% it could in principle clash with registers used for local allocation. +% However it probably works (as local allocation is used locally...). +% A better fix would be not to load this package with current LaTeX. +% This current etex package is just provided to force the old behaviour +% and such documents should not be using new features such as \extrafloats). +\ifdefined\extrafloats +\def\extrafloats#1{% + \PackageError{etex}{% + \noexpand\extrafloats is incompatible with etex.sty allocation.\MessageBreak + Try using \noexpand\extrafloats before loading etex}% + \@ehc} +\fi +% end of v2.7 change + +\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, ... + + +%% To ensure working in LaTeX 2015 release do define \newcount etc +%% with their pre 2015 LaTeX definitions +\def\newcount{\alloc@0\count\countdef\insc@unt} +\def\newdimen{\alloc@1\dimen\dimendef\insc@unt} +\def\newskip{\alloc@2\skip\skipdef\insc@unt} +\def\newmuskip{\alloc@3\muskip\muskipdef\@cclvi} +\def\newbox{\alloc@4\box\chardef\insc@unt} +\def\newtoks{\alloc@5\toks\toksdef\@cclvi} +\def\newread{\alloc@6\read\chardef\sixt@@n} +\def\newwrite{\alloc@7\write\chardef\sixt@@n} +\def\new@mathgroup{\alloc@8\mathgroup\chardef\sixt@@n} +\let\newfam\new@mathgroup +\def\newlanguage{\alloc@9\language\chardef\@cclvi} + +%% 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. + +% 2.4 Remove \outer to match LaTeX allocations +% which are never \outer unlike plain TeX. + +%\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 + |