13

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}

enter image description here

2 Answers 2

11

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.

4
  • 2
    LuaTeX has \mathstyle, but strangely enough it's undefined in LuaLaTeX.
    – egreg
    Feb 21, 2012 at 13:31
  • 1
    @egreg, so it does thanks, the luatex manual suggests \ifnum\mathstyle=\crampedtextstyle ought to work. Feb 21, 2012 at 13:36
  • 3
    @egreg: all luatex’s new commands are prefixed by \luatex in LuaLaTeX. Feb 21, 2012 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, 2012 at 15:31
5

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

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .