为什么 \smash 会破坏表格后的垂直间距?

为什么 \smash 会破坏表格后的垂直间距?

在表格后使用\smash似乎会破坏垂直间距。而在段落后使用垂直间距则没问题。亲眼见证:

\noindent
\begin{tabular}[t]{@{}ll}%
  One\cr
  Two\cr
\end{tabular}

\smash{Three}

TeX 输出

\noindent
One\\
Two

\smash{Three}

TeX 输出

为什么会这样?TeX 在每种情况下都做了什么?

答案1

首先,永远不要使用\crin tabular,而始终使用\\

现在来谈谈问题。

  1. 默认情况下,高度tabular与深度相同。高度是框高出基线的垂直量,深度相同,但低于基线。

  2. \noindent\begin{tabular}...\end{tabular}<blank line>制作一个单行段落,将其打包在主垂直列表上的一个框中。

  3. \smash没有开始一个段落,事实上,您没有得到缩进,因为该框直接放在垂直列表中。

  4. \baselineskip在框之间,TeX会根据顶部框的深度和底部框的高度放置行间粘连,使基线分开,除非这会导致框重叠。如果

    \baselineskip-<depth of top box>-<height of bottom box> < \lineskiplimit
    

    TeX\lineskip则插入胶水。

  5. 底部的盒子高度为零,因为它被砸碎了。

  6. 计算结果让 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粘连。

在此处输入图片描述

相关内容