在 LaTeX2e 中,\phantom
定义为
\def\vphantom{\v@true\h@false\ph@nt}
\def\hphantom{\v@false\h@true\ph@nt}
\def\phantom{\v@true\h@true\ph@nt}
\def\ph@nt{%
\ifmmode
\expandafter\mathpalette\expandafter\mathph@nt
\else
\expandafter\makeph@nt
\fi}
\def\makeph@nt#1{%
\setbox\z@\hbox{\color@begingroup#1\color@endgroup}\finph@nt}
\def\mathph@nt#1#2{%
\setbox\z@\hbox{$\m@th#1{#2}$}\finph@nt}
\def\finph@nt{%
\setbox\tw@\null
\ifv@ \ht\tw@\ht\z@ \dp\tw@\dp\z@\fi
\ifh@ \wd\tw@\wd\z@\fi \box\tw@}
这意味着,在数学模式下,
$\sqrt{\phantom{x^2}}$
大小相同
$\sqrt{\hbox{$x^2$}}$
但不同于
$\sqrt{x^2}$
因为x^2
处于\sqrt
狭窄模式。
我知道mathtools
包提供了一个\cramped
宏来解决这个问题,但是有没有自动的方法?
测试代码:
\documentclass{minimal}
\usepackage{mathtools}
\begin{document}
\fontsize{60}{72}\selectfont
$\sqrt{x^A} \sqrt{\hbox{$x^A$}}$
$\sqrt{\phantom{\cramped{x^A}}} \sqrt{\phantom{x^A}}$
\end{document}
答案1
我认为答案是“不”,即使使用 e-tex 原语,您也无法检测到这一点。也许 luatex 可以提供帮助?
感谢评论者,这应该在 luatex 中是可能的
\ifnum\mathstyle=\crampedtextstyle
或者对于 lualatex
\ifnum\luatexmathstyle=\luatexcrampedtextstyle
请注意,通常\over
可能会导致一些复杂情况阻止检测数学样式,请参阅luatex 手册中的\Ustack
( )。\luatexUstack
答案2
\phantom
以下是根据 David Carlisle 的回答编写的 LuaLaTeX 补丁:
\usepackage{ifluatex}
\usepackage{mathtools}
\ifluatex
\makeatletter
\def\ph@nt{%
\ifmmode
\ifodd\luatexmathstyle % 1,3,5,7 for cramped styles
\def\reserved@a{\cramped}%
\else
\let\reserved@a\relax
\fi
\expandafter\mathpalette\expandafter\mathph@nt
\else
\expandafter\makeph@nt
\fi}
\def\mathph@nt#1#2{%
\setbox\z@\hbox{$\m@th#1\reserved@a{#2}$}\finph@nt}
\makeatother
\fi
然后\phantom
可以检测狭窄的数学风格