为什么在使用 '\vbox' 和 '\hbox' 时需要使用 '\vspace{0pt}' 来沿底线对齐表格和图形?

为什么在使用 '\vbox' 和 '\hbox' 时需要使用 '\vspace{0pt}' 来沿底线对齐表格和图形?

最近,我试着将一个表格和一个图形放在一起,使它们的底部彼此对齐。我设法使用\vbox和来做到\hbox这一点,但有一件事让我很困扰:为了使它正常工作,我必须\vspace{0pt}在 里面的 后面放一个\vbox{}。为什么?

为了说明这一点,下面是一个例子。请注意,我不需要 s 的vspace{0pt}\rule那么为什么只有表才需要它呢?

在此处输入图片描述

\documentclass{article}

\begin{document}
\newsavebox{\firstfig}
\newsavebox{\secondfig}
\newsavebox{\thirdfig}
\savebox{\firstfig}{%
  \begin{tabular}{ l c r }
    \hline
    1 & 2 & 3 \\
    4 & 5 & 6 \\
    7 & 8 & 9 \\
    \hline
  \end{tabular}
}
\savebox{\secondfig}{%
  \rule{5em}{5em}
}
\savebox{\thirdfig}{%
  \rule{2em}{2em}
}

\noindent
Without \textsf{\textbackslash vspace\{0pt\}}: \\
\mbox{}%
\vbox{\vbox{\hbox{\usebox{\firstfig}}}}
\vbox{\vbox{\hbox{\usebox{\secondfig}}}}

\vspace{3\baselineskip}

\noindent
With \textsf{\textbackslash vspace\{0pt\}}: \\
\mbox{}%
\vbox{\vbox{\hbox{\usebox{\firstfig}}\vspace{0pt}}}
\vbox{\vbox{\hbox{\usebox{\secondfig}}}}

\vspace{3\baselineskip}

\noindent
Without \textsf{\textbackslash vspace\{0pt\}}: \\
\mbox{}%
\vbox{\vbox{\hbox{\usebox{\thirdfig}}}}
\vbox{\vbox{\hbox{\usebox{\secondfig}}}}

\end{document}

答案1

理解盒子放置的一个基本概念是参考点。每个盒子都有一个参考点,其他物品也定义一个参考点。

TeX 在排版时处理的是项目列表。你主要感兴趣的是垂直列表,其中 TeX 只是堆积水平框和垂直空间项(加上其他与此不太相关的东西)。TeX 可以自动在水平框之间插入一些粘连(垂直间距),以确保这些参考点之间的等距。

水平盒子的参考点是什么? 答案是一样的:每个盒子(或里面的字符)都有一个参考点,TeX 通常会将这些盒子放在一起,使它们的参考点位于同一水平线上。 但是其中一些可能会垂直移动:这是由以下情况导致的盒子的情况:

\begin{tabular}{<arg>}
<tabular content>
\end{tabular}

其参考点位于排版表格顶部到底部的中间。

如果规则(或图像)没有移动(需要用户手动干预),则其参考点是左下角。

a 的参考点\vbox是其中最后一个项的参考点。因此,说 和 说\vbox{\vbox{...}}是一样的\vbox{...}

你的第一个例子
两个框的参考点位于同一水平线上(请记住“表格框”的参考点位于中间)。

你的第二个例子
两个箱子的参考点在同一水平线上:

\mbox{}% to ensure horizontal mode
\vbox{\vbox{\hbox{\usebox{\firstfig}}\vspace{0pt}}}
\vbox{\vbox{\hbox{\usebox{\secondfig}}}}

可以简化为

\mbox{}% to ensure horizontal mode
\vbox{\usebox{\firstfig}\vspace{0pt}}
\usebox{\secondfig}

最后\vbox一项是间距项,它将其底部定义为参考点。

你的第三个例子
这些框再次根据其参考点对齐:

\mbox{}% to ensure horizontal mode
\vbox{\vbox{\hbox{\usebox{\thirdfig}}}}
\vbox{\vbox{\hbox{\usebox{\secondfig}}}}

相当于

\mbox{}% to ensure horizontal mode
\usebox{\thirdfig}
\usebox{\secondfig}

因为封闭的框不会做任何改变参考点位置的事情。框包含规则,其参考点是左下角。

如何自动实现底部对齐

如果你说

\savebox{\firstfig}{%
  \begin{tabular}[b]{ l c r }
    \hline
    1 & 2 & 3 \\
    4 & 5 & 6 \\
    7 & 8 & 9 \\
    \hline
  \end{tabular}
}

(注意 的可选参数[b]\begin{tabular}表格的参考点位于其内部的底部项目,即\hline。因此

\usebox{\firstfig} \usebox{\secondfig}

将完成您要寻找的事情,而无需将东西放在外部\vbox

顶部对齐

顶部对齐稍微困难一些,但并非不可能。

\savebox{\firstfig}{%
  \begin{tabular}[t]{ l c r }
    \hline
    1 & 2 & 3 \\
    4 & 5 & 6 \\
    7 & 8 & 9 \\
    \hline
  \end{tabular}
}

的参考点将\firstfig是顶部\hline;因此您需要向下移动\secondfig

\usebox{\firstfig}
\raisebox{-\height}{\usebox{\secondfig}}

但第二个盒子会比第一个略低,因为参考点是底部\hline,它有厚度。使用calc包装可以调整它:

\usepackage{calc} % in the preamble

\usebox{\firstfig}
\raisebox{-\height+\arrayrulewidth}{\usebox{\secondfig}}

结束语

Martin Scharrer 编写的软件包adjustbox解决了许多此类问题,并提供了修改参考点和对象对齐的非常简单的方法。

答案2

原因是tabular具有一定的深度,即它在基线下传播。如果你将其更改为

  \begin{tabular}[b]{ l c r }

你得到了你想要的,因为有了标志[b],它就tabular与基线对齐(b为了底部基线)。

该命令\vspace{0pt}使其起作用,因为它使整个框的基线位于表格下方,即此处\vspace

相关内容