% etex-mac.tex %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Petr Olsak January 2016 % This file is a part of csplain package. It is inputted during % csplain format generation when eTeX is detected (from ). % The \newcount, \newdimen, etc. allocators are redefined here in order % to access the extension register fields from eTeX (up to index 32768). % See the end of the file for more details \ifx\loccount\undefined \else \errmessage{etex.src macro package detected, don't use etex-mac} \endinput \fi \chardef\tmp=\catcode`@ \catcode`@=11 \let\inscOunt=\insc@unt \chardef\insc@unt=200 \def\et@xmaxregs{32768} % maximal index of registers in eTeX \outer\def\newinsert#1{% \newinsert re-defined: \global\advance\inscOunt by\m@ne \ifnum\inscOunt<\insc@unt \errmessage{No room for a new \string\insert, try to \chardef\insc@unt < 200}% \else \allocationnumber=\inscOunt \global\chardef#1=\allocationnumber \wlog{\string#1=\string\insert\the\allocationnumber}% \fi } \outer\def\et@newcount{\alloc@0\count\countdef\et@xmaxregs} \outer\def\et@newdimen{\alloc@1\dimen\dimendef\et@xmaxregs} \outer\def\et@newskip{\alloc@2\skip\skipdef\et@xmaxregs} \outer\def\et@newbox{\alloc@4\box\mathchardef\et@xmaxregs} \outer\def\newmuskip{\alloc@3\muskip\muskipdef\et@xmaxregs} \outer\def\newtoks{\alloc@5\toks\toksdef\et@xmaxregs} \def\ch@ck#1#2#3{% \ch@ck re-defined \ifnum\count1#1<#2\relax\else \ifnum#1<6 \ifnum#2<\et@xmaxregs \wlog{eTeX allocation of \string#3: skipping range \string\insc@unt...255}% \begingroup \escapechar=-1 \global \expandafter\let \csname new\string#3\expandafter\endcsname \csname et@new\string#3\endcsname \endgroup \count1#1=256 \ifx#3\box \ch@ckboxch \fi \else \errmessage{No room for a new #3}% \fi\fi\fi } \def\ch@ckboxch #1\global\chardef{#1\global\mathchardef} \newcount\marks@count \marks@count=0 % allocation starts from 1, 2, 3, ... \outer\def\newmarks{\et@alloc \marks@count \marks \mathchardef \et@xmaxregs} \def\et@alloc #1#2#3#4#5{% \global\advance#1by\@ne \ifnum#1<#4\relax \allocationnumber=#1% \global#3#5=\allocationnumber \wlog{\string#5=\string#2\the\allocationnumber}% \else \errmessage{No room for a new #3}\fi } \expandafter\def\expandafter\loggingall\expandafter{\loggingall \tracingcommands=3 \tracinglostchars=2 \errorstopmode \tracinggroups=1 \tracingifs=1 \tracingscantokens=1 \tracingnesting=1 \tracingassigns=2 } \catcode`@=\tmp \endinput The \newcount, \newdimen, \newskip and \newbox allocators are kept from plainTeX, but if the maximal number from plainTeX \insc@unt is reached then the range \insc@unt...255 is skipped and next indexes are set to 256, 257, ... The appropriate allocator macro is redefined to the macro \et@newcount, \et@newdimen etc. in such case. The \insc@unt is set as a constant 200. The \newinsert macro is redefined: it operates with \inscOunt register instead of \insc@unt. The allocated indexes are 254, 253, ..., \insc@unt. If the limit is reached then the error "No room for a new \insert" is printed. User can try to set \insc@unt constant to the value less than 200 in such case. The macros \newmuskip, \newtoks are redefined to allocate linear array of indexes 10, 11, ..., \et@xmaxregs. Another allocators (\newread, \newwrite, \newfam, \newlanguage) are unchanged. The new allocator \newmarks is defined as an example how to do this without the Knuth's dirty trick \count1#1. The \tracingall, \loggingall macros are re-defined in order to print more information provided by eTeX.