# Is there a \phantom considering cramped style?

In LaTeX2e, \phantom is defined as

\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@}

It means that, in math mode,

$\sqrt{\phantom{x^2}}$

has the same size of

$\sqrt{\hbox{$x^2$}}$

but differs from

$\sqrt{x^2}$

since x^2 in \sqrt is in cramped mode.

I know that mathtools package provides a \cramped macro to solve the problem, but is there an automatical method?

Test code:

\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}

-

I think the answer is "no" even with e-tex primitives you can not detect this. Perhaps luatex can jump to the rescue?

With thanks to the commenters, this should be possible in luatex

\ifnum\mathstyle=\crampedtextstyle

or for lualatex

\ifnum\luatexmathstyle=\luatexcrampedtextstyle

Note that as usual \over may cause some complications stopping the math style being detected, see \Ustack (\luatexUstack) in the luatex manual.

-
LuaTeX has \mathstyle, but strangely enough it's undefined in LuaLaTeX. – egreg Feb 21 '12 at 13:31
@egreg, so it does thanks, the luatex manual suggests \ifnum\mathstyle=\crampedtextstyle ought to work. – David Carlisle Feb 21 '12 at 13:36
@egreg: all luatex’s new commands are prefixed by \luatex in LuaLaTeX. – Khaled Hosny Feb 21 '12 at 13:48
Thanks. I think it's the solution. Can you copy the comment into the answer? I'll accept it. – Leo Liu Feb 21 '12 at 15:31

Here is the patch of \phantom for LuaLaTeX, based on David Carlisle's answer:

\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

Then \phantom can detect cramped math styles

-