![未使用的 \newbox、\newcount、\newdimen、\newskip 等列表](https://linux22.com/image/336433/%E6%9C%AA%E4%BD%BF%E7%94%A8%E7%9A%84%20%5Cnewbox%E3%80%81%5Cnewcount%E3%80%81%5Cnewdimen%E3%80%81%5Cnewskip%20%E7%AD%89%E5%88%97%E8%A1%A8.png)
想要一个适当的命令列出未使用的Box
,,,从Counter
Dimension
Skip
华润/顺丰文件。
答案1
由于问题似乎是关于寄存器分配所占用的资源,因此应该注意,尽管名称\newbox
等\newcount
不会生成新的框或计数寄存器。
每种类型有 256 个或 32768 个或 65536 个寄存器可用(取决于引擎)。这些寄存器可用每时每刻无论您是否分配任何东西。
\count600=42
将计数寄存器 600 设置为 42,并且不需要您分配 600 个寄存器\newcount
。
\newcount\mycount
或者
\newbox\mybox
只需声明\newcount
或\newbox
成为数字与寄存器关联(\newbox
通常使用的情况下\chardef
)
因此,唯一未使用的额外资源就像用于存储命令名本身及其与寄存器的关联的空间\newcount
资源。\let\myname\@empty
在 etex 和 xetex 中,存在一个理论问题,即前 256 个“经典”寄存器的存储效率比扩展寄存器(存储为稀疏数组)更高,但在现代机器上,这不太可能产生任何可观察到的差异,并且在 luatex 中根本不是问题,它以相同的方式存储全套 65536 个寄存器。
如果你总是通过不可扩展的宏访问寄存器,那么这些宏可以扩展以记录使用情况,但一般来说这是不可能的,如果你有这样的用法
\newcount\mycount
...
\typeout{\the\mycount}
那么你不太可能\mycount
以任何可靠的方式在 tex 中记录使用情况。当然,在编辑器中搜索\mycount
源文件或使用 sed 或 perl 等很容易,所以这可能是最可靠的方法。
如果您的类文件有大量未使用的寄存器分配(或者甚至有大量已使用的寄存器分配),那么代码中就会出现非常奇怪的情况,很少有类有超过十个这样的分配。
答案2
下面是一个如何定位任何未使用的示例\newbox
。下面的 MWE 定义了三个框:
\newbox{\MyBoxA}
\newbox{\MyBoxB}
\newbox{\MyBoxC}
但只有盒子\MyBoxB
被使用过,因此其他两个被报告为未使用:
笔记:
\usepackage{debugboxes}
需要是前任何\newbox
。如果您注释掉
\usepackage{debugboxes}
,那么一切将正常工作,但是当包含它时,您会收到未使用的盒子的报告。包裹
filecontents
用于打包测试用例并创建debugboxes.sty
。实际用例中不需要它。
代码:
\begin{filecontents*}{debugboxes.sty}
\usepackage{pgffor}
\usepackage{etoolbox}
\usepackage{expl3}
%%% http://tex.stackexchange.com/questions/100542/how-to-extract-the-name-of-a-macro
\ExplSyntaxOn
\newcommand{\CsToStr}[1]{\cs_to_str:N #1}
\ExplSyntaxOff
%% http://tex.stackexchange.com/questions/14393/how-keep-a-running-list-of-strings-and-then-process-them-one-at-a-time
\newcommand\SaveboxList{}
\makeatletter
\newcommand{\AddToSaveboxList}[1]{%
\g@addto@macro\SaveboxList{#1,}%
}
\makeatother
\let\OldNewBox\newbox
\renewcommand{\newbox}[1]{%
\AddToSaveboxList{\CsToStr{#1}}%
\OldNewBox{#1}%
}%
\let\OldUsebox\usebox%
\renewcommand{\usebox}[1]{%
\csgdef{SaveboxUsed \CsToStr{#1}}{}%
\OldUsebox{#1}%
}%
\AtEndDocument{%
\bigskip
\section{Unused saveboxes}%
\foreach \x in \SaveboxList {%
\ifcsdef{SaveboxUsed \x}{}{%
\par\noindent\x
}%
}
}%
\end{filecontents*}
\documentclass{article}
\usepackage{debugboxes}% Comment this out if don't need the debugging,
\newbox{\MyBoxA}
\newbox{\MyBoxB}
\newbox{\MyBoxC}
\begin{document}
\savebox{\MyBoxB}{some content placed in box}
\usebox{\MyBoxB}
\end{document}