我记得在某处看到过,如果寄存器 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 个寄存器可用:如果有任何小疑问,请分配一个新寄存器。