我知道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
虽然进行了两次评估,但计数器仅进行了正确的次数。