寄存器的本地分配

寄存器的本地分配

我在 TUGboat 的一期(第 9 卷,1988 年,第 3 期)中看到了以下代码。我对其进行了轻微修改。这样做的目的是避免全局分配寄存器。我的问题是 (1) 考虑到它们进行本地分配,使用它是否安全? (2) 为什么使用\count19作为限制而不是普通 TeX 的 255(或大约这个数字)。我们现在可以使用 eTeX 的 32767 个寄存器吗?

\def\declarecount{\allocate0\count}
\def\declaredimen{\allocate1\dimen}
\def\declareskip{\allocate2\skip}
\def\declaremuskip{\allocate3\muskip}
\def\declarebox{\allocate4\char}
\def\declaretoks{\allocate5\toks}
\def\allocate#1#2#3{\relax
  \advance\count1#1 by\@ne
  \ifnum\count1#1<\count19\else % why not or 255 or 32767 (eTeX)?
    \@latexerr{No room for a new \string#2!}\@ehd
  \fi
  \csname\expandafter\@gobble\string#2def\endcsname#3=\count1#1
}

答案1

早在 1988 年,\count19它就用于 Plain TeX 中存储最近分配的\insert

在当前的 Plain TeX(以及 LaTeX)中,要使用的计数器是\count20,因为\count19它可以跟踪语言。

以下是摘录latex.ltx(第 302 行及以上)

\message{registers,}
\count10=22 % allocates \count registers 23, 24, ...
\count11=9 % allocates \dimen registers 10, 11, ...
\count12=9 % allocates \skip registers 10, 11, ...
\count13=9 % allocates \muskip registers 10, 11, ...
\count14=9 % allocates \box registers 10, 11, ...
\count15=9 % allocates \toks registers 10, 11, ...
\count16=-1 % allocates input streams 0, 1, ...
\count17=-1 % allocates output streams 0, 1, ...
\count18=3 % allocates math families 4, 5, ...
\count19=0 % allocates \language codes 1, 2, ...
\count20=255 % allocates insertions 254, 253, ...
\countdef\insc@unt=20
\countdef\allocationnumber=21

就扩展池而言,您应该看看提供的宏etex.sty

\documentclass{article}
\usepackage{etex}

\newcount\myalloc
\def\tryalloc{%
  \begingroup
  \loop\ifnum\myalloc<350
    \advance\myalloc 1
    \expandafter\loccount\csname tempcount\romannumeral\myalloc\endcsname
    \expandafter\locdimen\csname tempdimen\romannumeral\myalloc\endcsname
    \expandafter\loctoks\csname temptoks\romannumeral\myalloc\endcsname
    \expandafter\meaning\csname tempcount\romannumeral\myalloc\endcsname\par
    \expandafter\meaning\csname tempdimen\romannumeral\myalloc\endcsname\par
    \expandafter\meaning\csname temptoks\romannumeral\myalloc\endcsname\par
  \repeat
  \endgroup
  \vskip 40pt
  \expandafter\meaning\csname tempcount\romannumeral350\endcsname}

\begin{document}
\ttfamily\tryalloc
\end{document}

您会看到\loc...从顶部(32767)向下分配寄存器,并且分组之后其含义就被遗忘了。

在 中简要讨论了这些命令,etex_src.html它们应该可用texdoc etex_src。该文件etex.sty本质上是 的 LaTeX 的逐字移植etex.src

答案2

请注意,例如对于计数寄存器,内容\count10内容\count19用于计算插入次数,正如 egreg 所解释的那样。

那不是19号,但最后插入分配。这是一个避免冲突的简单机制,因为插入同时使用一个框、一个计数器、一个维度和一个跳过寄存器。插入的分配从最大数字开始向下运行。

在 中latex.ltx\count20计算现在的插入数,设置为255

\count20=255 % allocates insertions 254, 253, ...

etex.sty,它启用了新的 eTeX 特性,使用了更复杂的方案(乍一看我没能理解,但我相信它可以访问所有新的寄存器:)

顺便说一句,它似乎还提供了本地寄存器分配方案(至少内联文档是这么说的),所以也许研究一下是个好主意用户界面的文档

相关内容