临时寄存器的别名

临时寄存器的别名

在我正在开发的包中,我有几个宏需要临时使用寄存器来计算一些东西,然后宏才能知道要打印什么(通常是长度或胶水,需要进行数学运算或与其他东西进行检查)。目前,我\new...在第一次使用这些临时寄存器之前放置了一个命令来创建它们,但我逐渐明白这不是一个好的做法,因为寄存器分配是 TeX 中的全局现象,因此如果包含命令的宏被\new...多次调用,它将保留多个寄存器(可能导致 TeX 在大型文档中耗尽)。

因此,我想将\new...命令从宏移到包的基层。我还想限制此类寄存器的数量,以便 TeX 可以重复使用它们。问题是,在我的函数中,我习惯给这些寄存器起一些有用的名称,以便阅读代码的人知道寄存器的用途(即寄存器可能不只是\distanceatob简单地称为\tempdistance)。因此,如果我简单地移动\new...命令,我最终会得到相当多的寄存器集合。

宏中是否有任何方法可以告诉 TeX 使用特定的保留寄存器,但使用与命令中不同的名称来引用它\new...

答案1

您可以定义

\newdimen\zzzz

在顶层,然后在本地使用

   \let\SensibleNameOne=\zzzz
   ...
   \SensibleNameOne=3in
   ...
   \let\SensibleNameTwo=\zzzz
   ...
   \SensibleNameTwo=4in
   ...

但是如果你这样做,你必须小心,最好不要在同一范围内为名称添加别名,因为如果你完全按照上面的操作,\SensibleNameOne将具有 4in 的值,因为它的含义与 相同\SensibleNameTwo

这在经典 TeX 中最有用,因为其中只有 256 个寄存器,在 etex 中有 32768 个寄存器,或者在 luatex 中有两倍于此的寄存器,所以问题不大。

如果您只打算在您控制的本地范围内使用它们,并且您知道不能嵌套另一个本地上下文,那么甚至可以避免分配任何寄存器。

graphics包需要一堆寄存器来保存测量结果和三角计算,它确实

\let\Grot@height\@ovxx
\let\Grot@left\@ovyy
\let\Grot@right\@ovdx
\let\Grot@depth\@ovdy
\let\Grot@l\@ovro
\let\Grot@r\@ovri
\let\Grot@h\@xdim
\let\Grot@d\@ydim
\let\Grot@x\@linelen
\let\Grot@y\@dashdim

它“借用”了图片模式格式中分配的一些寄存器。如果您这样做(我并不建议这样做),那么您需要确保所有组都受到控制,以便寄存器在正确的时间具有正确的含义,因此,例如,尽管这些寄存器超载,但分组确保您可以嵌套一个picture环境\rotatebox并将旋转的框放在picture环境中,并且寄存器始终在预期的时间具有预期的值。\rotatebox设置 \Grot@y永远不会影响图片模式下破折号的长度,即使它是(滥用)使用\@dashdim

相关内容