让我们看看下面的截图匿名化文档的有效方法以及给出的评论。
在离开宏之前,是否可以删除已在宏中声明的长度、计数器、暗淡等?
答案1
不,这是不可能的:\newlength
分配一个寄存器,并且此分配是永久性的。如果您\newlength
在组内执行此操作,您将在组末尾丢失寄存器名称,但该寄存器将不可重复使用。
事实上可能是可能的:定义一个\startlocalallocations
修改和的宏\newlength
,\newcounter
以便从那时起的分配存储在一个方便的宏中,比如说\allocationsmade
,然后定义\removelocalallocations
用于\allocationsmade
恢复启动命令之前的状态。
虽然可行(至少在原则上),但这完全没用。寄存器应该分配外部宏定义:可以根据需要多次设置和使用。因此,正确的定义方式\blind
是
\newlength{\sowide}
\newlength{\sohigh}
\def\blind#1{%
...
\settowidth{\sowide}{#1}%
\settoheight{\sohigh}{H}%
...}
一切正常。无需分配临时变量。
注意:该包etex
允许本地分配。但这在与此非常不同的环境中很有用:人们可以考虑为某些特定用途分配一个寄存器块,此时它们不是按名称调用,而是按编号调用。请参阅浮动机制的实现,了解一个略有不同的示例,其中分配了一个寄存器块,它们被称为\bx@A
、、\bx@B
...,\bx@R
以便可以通过了解上一个使用的寄存器的编号来使用下一个空闲寄存器。