未使用的 \newbox、\newcount、\newdimen、\newskip 等列表

未使用的 \newbox、\newcount、\newdimen、\newskip 等列表

想要一个适当的命令列出未使用的Box,,,从CounterDimensionSkip华润/顺丰文件。

答案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}

相关内容