最近,我试着将一个表格和一个图形放在一起,使它们的底部彼此对齐。我设法使用\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
。