在表格后使用\smash
似乎会破坏垂直间距。而在段落后使用垂直间距则没问题。亲眼见证:
\noindent
\begin{tabular}[t]{@{}ll}%
One\cr
Two\cr
\end{tabular}
\smash{Three}
\noindent
One\\
Two
\smash{Three}
为什么会这样?TeX 在每种情况下都做了什么?
答案1
首先,永远不要使用\cr
in tabular
,而始终使用\\
。
现在来谈谈问题。
默认情况下,高度
tabular
与深度相同。高度是框高出基线的垂直量,深度相同,但低于基线。\noindent\begin{tabular}...\end{tabular}<blank line>
制作一个单行段落,将其打包在主垂直列表上的一个框中。\smash
没有开始一个段落,事实上,您没有得到缩进,因为该框直接放在垂直列表中。\baselineskip
在框之间,TeX会根据顶部框的深度和底部框的高度放置行间粘连,使基线分开,除非这会导致框重叠。如果\baselineskip-<depth of top box>-<height of bottom box> < \lineskiplimit
TeX
\lineskip
则插入胶水。底部的盒子高度为零,因为它被砸碎了。
计算结果让 TeX 认为没有发生重叠
结果:重叠。
如果您向 中添加两行并“显示”框,则这一点会更加明显tabular
。要理解这种效果,您需要记住 延伸tabular
到最后一行的基线以下,因为每行都有一个\strut
。
\documentclass{article}
\fboxrule=0.1pt % hair rule
\fboxsep=-\fboxrule % don't add to the box dimensions
\newcommand{\showbaseline}{\makebox[0pt][l]{\leaders\hrule\hskip3cm}}
\begin{document}
\noindent\showbaseline
\fbox{\begin{tabular}{@{}l}
One\\
Two
\end{tabular}}
\smash{\showbaseline\fbox{Three}}
\noindent\showbaseline
\fbox{\begin{tabular}{@{}l}
One\\
Two\\
Three\\
Four
\end{tabular}}
\smash{\showbaseline\fbox{Five}}
\end{document}
在第一个例子中,您会看到基线正好相隔 12pt,而在第二个例子中,底部距离tabular
第二条基线 1pt,因为在这种情况下,TeX 插入了\lineskip
粘连。