注册 0-9 策略

注册 0-9 策略

我记得在某处看到过,如果寄存器 0-9 是偶数,则在本地使用;如果寄存器是奇数,则在全局使用(或者反过来)。一旦您在全局使用寄存器,其他人就无法安全地使用它。您基本上已经声明该寄存器仅供您使用,这就是\newlength\newcount\newsavebox的用途。

如果你要全局使用一个寄存器并且不想永久地绑定它,我建议您从中获取一个\@freelist并在完成后释放它。

答案1

在本地使用偶数临时寄存器、在全局使用奇数临时寄存器的策略是 Knuth 本人在 TeXbook 中提出的。

这是第一次提到他们的部分(第 122 页):

但是,有时您只想使用寄存器进行临时存储,并且您知道它不会与任何其他人的宏冲突。寄存器\count255\dimen255\skip255\muskip255\toks255传统上用于此类目的。此外,纯 TeX 保留\dimen0\dimen9\skip0\skip9\muskip0\muskip9\box0\box9用于“临时工作”;这些寄存器永远不会由操作分配\new...。我们已经看到 到 \count0\count9特殊的,并且\box255结果也是特殊的;所以除非您知道自己在做什么,否则应该避免使用这些寄存器。

Knuth 在第 346 页上更加精确地指出:

2.寄存器的分配。该文件的第二个主要部分 plain.tex为独立开发的宏系统提供了一个基础,使其能够和平共处,而不会干扰它们对寄存器的使用。其理念是宏编写者应遵守以下基本规则:

(1)0 到 9 号寄存器始终可供临时“临时”使用,但当任何其他宏可能控制时,它们的值始终被假定被破坏。(这适用于\dimen0\toks0\skip1\box3等寄存器;但 TeX 已保留\count0\count9页码标识。)

(2)寄存器\count255\dimen255\skip255\muskip255\toks255以同样的方式自由使用。

(3)对编号为 1、3、5、7 和 9 的临时寄存器的所有赋值应为\global;对其他临时寄存器(0、2、4、6、8、255)的所有赋值应为非\global。 (这可以防止第 27 章中讨论的“保存堆栈累积”现象。)

LaTeX 遵循相同的规则,因为寄存器分配系统与纯 TeX 相同。嗯,以前是这样的,因为现在 LaTeX 也使用扩展范围的寄存器,但对于最多 255 个寄存器,它基本上仍然相同。

\box1临时寄存器在 LaTeX 内核中被广泛使用,特别是盒子寄存器。您可以在 的代码中看到 的 (全局) 使用示例\bordermatrix

在全局范围内使用寄存器没有什么问题:在这种情况下,可能使用相同的寄存器可能会出现;通常类似

  \setbox\tw@\vbox{\unvcopy\z@\global\setbox\@ne\lastbox}%

这里有一个可能的问题:你可能有一些\box1在矩阵条目中使用的内容。假设你有一个需要用盒子寄存器构造的复杂符号,并且需要全局分配;只要你在所有用途中都依赖盒子寄存器的内容,这样就安全了。否则,分配一个新的寄存器。

有时,由于某些宏使用相同的寄存器,因此使用本地寄存器会产生奇怪的输出。在这种情况下,添加组级别通常可以解决问题。但 LaTeX 使用扩展范围,每种类型有超过 32000 个寄存器可用:如果有任何小疑问,请分配一个新寄存器。

相关内容