释放 - 取消引用 - 释放 - 删除新的尺寸长度?

释放 - 取消引用 - 释放 - 删除新的尺寸长度?

有点类似如何清除/删除计数器,我猜,但是\newdimen......所以,考虑一下 MWE:

\documentclass{standalone}

\usepackage{tikz}

\begin{document}
  \begin{tikzpicture}
    \newdimen\dx
    \def\mytest{AA}
    \typeout{\meaning\dx, \meaning\mytest}
  \end{tikzpicture}
  \typeout{\meaning\dx, \meaning\mytest}
\end{document}

代码输出到标准输出:

\dimen152, macro:->AA
\dimen152, undefined

我使用tikzpicture它作为一种分组方式;从输出中可以清楚地看出,对组中本地定义的宏的引用在组外不存在;但是,对\dx创建的长度的引用\newdimen确实存在。

因此,如果我想释放/取消引用\dx,以便\dimen152“返回”到“未使用”池\dimen(如果可能的话),我该怎么做?

答案1

标准寄存器分配代码(在 LaTeX2e 和纯 TeX 中)都是全局有效的。因此,一旦为寄存器命名,它就永远不会被删除。由此可见,在 LaTeX 中使用寄存器的通常方法是在前言中而不是在文档正文中分配它们。

etex包(以及内置于基于 e-TeX 的纯文本格式中的类似代码)确实有一组“本地分配器”,都称为\loc...。因此在这里你可以使用\locdimen

\RequirePackage{etex}
\documentclass{standalone}

\usepackage{tikz}

\begin{document}
  \begin{tikzpicture}
    \locdimen\dx
    \def\mytest{AA}
    \typeout{\meaning\dx, \meaning\mytest}
  \end{tikzpicture}
  \typeout{\meaning\dx, \meaning\mytest}
\end{document}

count但是,由于 e-TeX 为、dimen、和类型提供了 32k 个寄存器,muskip因此实际上这并非必需。TeX 运行是“批处理模式”,因此在大多数情况下无需担心此类事情。skiptoks

请注意,如果您的情况足够可控,您可以使用组并按编号访问寄存器。此技巧例如在 中使用l3regex,其中很多需要寄存器,使用数字是最明智的方法。当然,它确实限制了你可以做的事情:低级,因此需要大量的 TeX 洞察力。

答案2

如果你不需要加载更多包,可以使用\globaldefs原始注册表。你可以输入

\globaldefs=-1 \newdimen\dx \globaldefs=0

代替

\newdimen\dx

分配是在本地完成的。但是您不能在同一组中的这个本地分配之后进行全局分配。宏etex更复杂:它从内存阵列的第二侧进行本地分配,而不是全局分配。

相关内容