如何防止 \mathclap 将 \stepcounter 增加四倍

如何防止 \mathclap 将 \stepcounter 增加四倍

当我想使用\stepcounter内部迭代计数器时\mathllap\mathclap或者\mathrlap计数器迭代 4 而不是 1。例如,以下 MWE

\documentclass{article}
\usepackage{mathtools}
\newcounter{mycounter}


\begin{document}
$\mathclap{\stepcounter{mycounter}xyz}$

\arabic{mycounter}
\end{document}

输出

XYZ4
  ​

尽管

\documentclass{article}
\usepackage{mathtools}
\newcounter{mycounter}


\begin{document}
\stepcounter{mycounter}$\mathclap{xyz}$

\arabic{mycounter}
\end{document}

输出所需的

XYZ
  1

正如预期的那样。

在这个简单的例子中,第二个 MWE 是一个简单的解决方法,但是当在以下 MWE 中移动类似物\stepcounter的外部不那么容易时,我该如何以更优雅的方式处理这个问题:\mathclap

\documentclass{article}
\usepackage{mathtools}
\newcounter{mycounter}
\newcommand{\printMyNextCounter}{\stepcounter{mycounter}\arabic{mycounter}}


\begin{document}
$\mathclap{\printMyNextCounter xyz}$

\printMyNextCounter
\end{document} 

输出

2xyz
   5

我认为这几乎可以看作是一个错误。 可以修复这个错误吗?

答案1

您可以注入\mathclap相同的技巧amsmath来避免问题\text以及相关命令(例如\textrm和类似命令)。

\documentclass{article}
\usepackage{mathtools}

\MHInternalSyntaxOn
%%% original definitions
%\def\MT_mathllap:Nn #1#2{{}\llap{$\m@th#1{#2}$}}
%\def\MT_mathrlap:Nn #1#2{{}\rlap{$\m@th#1{#2}$}}
%\def\MT_mathclap:Nn #1#2{{}\clap{$\m@th#1{#2}$}}
%%% modified definitions
\def\MT_mathllap:Nn #1#2{{}\llap{$\check@choice{#1}\m@th#1{#2}$}}
\def\MT_mathrlap:Nn #1#2{{}\rlap{$\check@choice{#1}\m@th#1{#2}$}}
\def\MT_mathclap:Nn #1#2{{}\clap{$\check@choice{#1}\m@th#1{#2}$}}
\MHInternalSyntaxOff

\makeatletter
\def\check@choice#1{\ifx#1\displaystyle\firstchoice@true\else\firstchoice@false\fi}
\makeatother

\newcounter{mycounter}

\begin{document}

$\mathclap{\stepcounter{mycounter}xyz}$

\arabic{mycounter}

\end{document}

在此处输入图片描述

答案2

您可以安排在四次评估中重置计数器

在此处输入图片描述

\documentclass{article}
\usepackage{mathtools}
\newcounter{mycounter}
\newcounter{mycounterx}
\newcommand{\printMyNextCounter}{\stepcounter{mycounter}\arabic{mycounter}}
\newcommand\mymathclap[1]{%
\setcounter{mycounterx}{\value{mycounter}}%
\mathclap{\setcounter{mycounter}{\value{mycounterx}}#1}%
}

\begin{document}
$\mymathclap{\printMyNextCounter xyz}$

\printMyNextCounter
\end{document}

这四个评估来自于\mathchoice原始的,并且您会看到,数学模式下大多数需要对下标做出反应并改变大小等的框命令\sqrt\phantom存在相同的问题\mathclap

答案3

接下来是卑鄙的伎俩。TeX 原语\mathchoice被重新定义:

\let\orimathchoice=\mathchoice
\def\mathchoice#1#2#3#4{\orimathchoice{#1}{\noadvance#2}{\noadvance#3}{\noadvance#4}}
\def\noadvance{\def\stepcounter##1{}}

% your code:

\documentclass{article}
\usepackage{mathtools}
\newcounter{mycounter}
\newcommand{\printMyNextCounter}{\stepcounter{mycounter}\arabic{mycounter}}

\begin{document}
$\mathclap{\printMyNextCounter xyz}$

\printMyNextCounter
\end{document} 

相关内容