当我想使用\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}