![释放 - 取消引用 - 释放 - 删除新的尺寸长度?](https://linux22.com/image/292894/%E9%87%8A%E6%94%BE%20-%20%E5%8F%96%E6%B6%88%E5%BC%95%E7%94%A8%20-%20%E9%87%8A%E6%94%BE%20-%20%E5%88%A0%E9%99%A4%E6%96%B0%E7%9A%84%E5%B0%BA%E5%AF%B8%E9%95%BF%E5%BA%A6%EF%BC%9F.png)
有点类似如何清除/删除计数器,我猜,但是\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 运行是“批处理模式”,因此在大多数情况下无需担心此类事情。skip
toks
请注意,如果您的情况足够可控,您可以使用组并按编号访问寄存器。此技巧例如在 中使用l3regex
,其中很多需要寄存器,使用数字是最明智的方法。当然,它确实限制了你可以做的事情:低级,因此需要大量的 TeX 洞察力。
答案2
如果你不需要加载更多包,可以使用\globaldefs
原始注册表。你可以输入
\globaldefs=-1 \newdimen\dx \globaldefs=0
代替
\newdimen\dx
分配是在本地完成的。但是您不能在同一组中的这个本地分配之后进行全局分配。宏etex
更复杂:它从内存阵列的第二侧进行本地分配,而不是全局分配。