是否可以让\newcount
、\newtoks
等尊重分组,以便例如\newcount\temp\temp=2{\newcount\temp\temp=1}\showthe\temp
给出 2(而不是 0)?
相关地,是否可以取消定义一个寄存器,以便适当的\new
命令(\newcount
,,\newtoks
等等)使用它?
答案1
除了 TH. 的评论之外,我想指出的是,etex
LaTeX 软件包确实包含诸如\loctoks
进行局部定义的功能。这包括两部分:
- 仅在当前组内创建新名称
- 在本地设置分配的跟踪号
这与您的要求不太一样,但我认为完全可以将其作为您想要的基础。您可以执行以下操作:
\let#1\undefined
\loc<thing>#1
因此全局定义被暂时删除,这意味着分配器将创建一个指向不同寄存器的新本地版本。
对于释放寄存器的问题,取消定义名称很容易。问题在于跟踪号。您可以将其减少 1,但很可能在设置您感兴趣的寄存器和再次删除它之间发生了其他分配。可以通过扩展分配系统以包含释放寄存器的列表,并在主跟踪号之前检查此列表来实现这一点。
在 的工作中expl3
,我们确实尝试了寄存器的本地分配,但最终决定它在 TeX 中效果并不好。在大多数语言中,局部变量是某个函数的局部变量。因此,您可以嵌套函数,并且知道可以创建多个具有相同名称的“新”变量。但在 TeX 中情况并非如此,其中本地表示“在当前组内”。需要监视组而不是函数,这似乎总体上使得拥有本地声明的变量变得不那么有用。当然,使用分组来拥有本地值主要是日常的 TeX 编程。
答案2
如果不重新实现各种 ,就无法做到这一点\newX
。实际上,大部分分配都是由单个宏 完成的\alloc@
,因此我认为您只需要重新实现它。
也就是说,使用 ε-TeX,文档可以访问的寄存器比 TeX 每个类 256 个要多得多。因此,每个包分配几个私有寄存器供自己使用其实并没有什么坏处。
当然,即使分配是全局的,使用也可以是局部的,因此,如果适当使用\begingroup
/ \endgroup
,通常可以只使用几个寄存器来同时保存许多值。
答案3
埃普莱恩附带\innernewcount
等\innernewtoks