盒子里面有没有一个开关可以关闭 LaTeX 计数器?

盒子里面有没有一个开关可以关闭 LaTeX 计数器?

我知道amsmath排版至少要对其材料进行两次,第一次用于测量,并且要采取措施避免一些计数器被更新两次。

是否有一个开关可供宏编写者用来通知 LaTeX,当需要排版#1框内的一些未知内容时,不要更新计数器(在 LaTeX 中是全局的),这些内容稍后将被丢弃?


egreg根据从的回答中收集的信息和(迟来的)查看来源而更新。正如我上面所说,这并不是amsmath为了避免一些计数器需要更新;它避免了所有计数器的更新,因为它使用了一个列表全部计数器名称由 latex 内核保持最新,旨在允许任何人使用它来做事情全部这些名称。因此,结论是amsmath定义了宏对,\savecounters@/\restorecounters@因为它需要该功能,但任何人都可以复制它们的定义(\savecounters@定义\restorecounters@将做什么)并使用它们,而无需加载amsmath甚至任何部分,即可获得相同的效果。只需替换\@nx\noexpand

答案1

这基本上是amsmath为了避免测量时计数器步进两次的问题。计数器值的更改应在测量阶段进行,否则存在从一位数变为两位数会破坏所进行的测量的风险。

\documentclass{article}

\usepackage{amsmath,xcolor}

\newcounter{xyz}
\newcommand{\doxyz}{\stepcounter{xyz}--\thexyz--}

\makeatletter
\newdimen\jfbu@width
\newcommand{\processtwice}[1]{%
  \begingroup
  \savecounters@
  % here we do the measurement
  \sbox\z@{#1}%
  \global\jfbu@width=2\wd\z@
  % and we restore the counters' values
  \restorecounters@
  \endgroup
  \colorbox{yellow}{\makebox[\jfbu@width]{#1}}%
}
\makeatother

\begin{document}

\processtwice{\doxyz}

\processtwice{\doxyz}

\end{document}

如您所见,#1虽然进行了两次评估,但计数器仅进行了正确的次数。

在此处输入图片描述

相关内容