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

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 '12 at 13:31
  • 1
    @egreg, so it does thanks, the luatex manual suggests \ifnum\mathstyle=\crampedtextstyle ought to work. Feb 21 '12 at 13:36
  • 3
    @egreg: all luatex’s new commands are prefixed by \luatex in LuaLaTeX. 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
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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.