答案1
为了同样的原因
\documentclass{article}
\begin{document}
\fbox{${\vphantom{X}}^{\rlap{\vrule height0pt depth0.1pt width 2cm}2}$}%
\fbox{${\kern0ptX}^2$}
\end{document}
生产
该规则只是为了表明高度相同。
实际上应该比较的是
\fbox{${\vphantom{X}}^{\rlap{\vrule height0pt depth0.1pt width 2cm}2}$}%
\fbox{$\hbox{$X$}^2$}
产生相同的输出。
当 TeX 必须向一个框添加上标时(并且括号中包含多个数学字符的子公式算作一个框),它不知道将上标附加到哪个字符,只知道框的高度。
在\vphantom{X}
数学模式下,TeX 会用 构建一个框\setbox0=\hbox{$X$}
,然后设置\wd0=0pt
并执行\box0
。除了设置宽度外,它与执行 相同\hbox{$X$}
。
将上标字段附加到单个数学字符是不同的,因为现在 TeX 对该对象有了更多的了解。
让我们研究一个更简单的案例
\documentclass{article}
\begin{document}
\showoutput
$\vphantom{X}^2$
${\vphantom{X}}^2$
\end{document}
日志文件的相关内容如下
....\mathon
....\hbox(6.83331+0.0)x0.0
....\hbox(4.51111+0.0)x4.48613, shifted -3.62892
.....\OT1/cmr/m/n/7 2
....\mathoff
和
....\mathon
....\hbox(6.83331+0.0)x0.0
.....\hbox(6.83331+0.0)x0.0
....\hbox(4.51111+0.0)x4.48613, shifted -4.36111
.....\OT1/cmr/m/n/7 2
....\mathoff
如果我们\showlists
在两个结束$
字符前添加,我们得到
### math mode entered at line 6
\mathchoice
D\mathord
D.\hbox(6.83331+0.0)x0.0
T\mathord
T.\hbox(6.83331+0.0)x0.0
S\mathord
S.\hbox(4.78334+0.0)x0.0
s\mathord
s.\hbox(3.41667+0.0)x0.0
\mathord
^\fam0 2
对于第一个公式
### math mode entered at line 8
\mathord
.\mathchoice
.D\mathord
.D.\hbox(6.83331+0.0)x0.0
.T\mathord
.T.\hbox(6.83331+0.0)x0.0
.S\mathord
.S.\hbox(4.78334+0.0)x0.0
.s\mathord
.s.\hbox(3.41667+0.0)x0.0
^\fam0 2
对于第二个公式。两者的区别很微妙:在第一种情况下,上标附加到空\mathord
原子上,在第二种情况下,上标附加到整个盒子上。
答案2
这只是用我自己的话来总结 egreg 的详细分析。
其效果是两种事物的结合。
首先,TeX 可以将上标应用于字符或框。字符:它知道得更多,可以将上标放在更好的位置。框:它只知道该框的尺寸“(括号中包含多个数学字符的子公式算作一个框)”。这解释了%5
、%6
和%8
。
\documentclass{minimal}
\begin{document}
\fbox{$X^2$}%
\fbox{${X}^2$}%
\fbox{${XX}^2$}
\end{document}
其次,在 后面直接写上标,\vphantom
某种程度上不适用于\vphantom
。这解释了%7
。
\documentclass{minimal}
\begin{document}
\fbox{$\vphantom{\rule{1pt}{30pt}}^2$}
\fbox{$\vphantom{\rule{1pt}{30pt}}{}^2$}
\fbox{${\vphantom{\rule{1pt}{30pt}}}^2$}
\end{document}