下面的代码产生了一个负面幻像(来自这个答案):
\newcommand{\negphantom}[1]{\settowidth{\dimen0}{#1}\hspace*{-\dimen0}}
然而,当在方程中使用时,
$$a\negphantom{\inf_{t>0}t^2}b$$
我收到错误。解决方法是
$$a\negphantom{$\inf_{t>0}t^2$}b$$
是否可以negphantom
以这样一种方式进行定义,使其尊重在方程式内或不在方程式内?(后一种解决方案并不完美,因为不在\inf
显示样式中)。
答案1
检查数学模式然后使用\mathpalette
:
\documentclass{article}
\usepackage{amsmath}
\makeatletter
\newlength{\negph@wd}
\DeclareRobustCommand{\negphantom}[1]{%
\ifmmode
\mathpalette\negph@math{#1}%
\else
\negph@do{#1}%
\fi
}
\newcommand{\negph@math}[2]{\negph@do{$\m@th#1#2$}}
\newcommand{\negph@do}[1]{%
\settowidth{\negph@wd}{#1}%
% \hspace*{-\negph@wd}% % for TESTING
\hspace*{\negph@wd}% % for TESTING
}
\makeatother
\begin{document}
\begin{gather}
a\negphantom{\inf_{t>0}t^2}b \\
a{\inf_{t>0}t^2}b \\
\textstyle a\negphantom{\inf_{t>0}t^2}b \\
\textstyle a{\inf_{t>0}t^2}b \\
\scriptstyle a\negphantom{\inf_{t>0}t^2}b \\
\scriptstyle a{\inf_{t>0}t^2}b \\
\scriptscriptstyle a\negphantom{\inf_{t>0}t^2}b \\
\scriptscriptstyle a{\inf_{t>0}t^2}b
\end{gather}
\end{document}
现在我们确定所有情况下空间都是正确的,我们可以删除调试位并写下最终的定义:
\makeatletter
\newlength{\negph@wd}
\DeclareRobustCommand{\negphantom}[1]{%
\ifmmode
\mathpalette\negph@math{#1}%
\else
\negph@do{#1}%
\fi
}
\newcommand{\negph@math}[2]{\negph@do{$\m@th#1#2$}}
\newcommand{\negph@do}[1]{%
\settowidth{\negph@wd}{#1}%
\hspace*{-\negph@wd}%
}
\makeatother