![表格单元格中 tikz 图片的垂直对齐](https://linux22.com/image/273220/%E8%A1%A8%E6%A0%BC%E5%8D%95%E5%85%83%E6%A0%BC%E4%B8%AD%20tikz%20%E5%9B%BE%E7%89%87%E7%9A%84%E5%9E%82%E7%9B%B4%E5%AF%B9%E9%BD%90.png)
我提前为问一个之前被问过的问题道歉。我读过 SE 上关于垂直对齐的其他帖子,但我对 Latex 很陌生,很难理解它们。我有一张两列表。一列是文本,另一列是 tikz 图片。下面是一个简化的示例。
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tabular}{|p{0.5\textwidth}|c|}
\hline
Hello World &
\begin{tikzpicture}
\draw (-3, -3) rectangle (3,3);
\draw (-3,-3) -- (3,3);
\draw (-3,3) -- (3,-3);
\end{tikzpicture} \\
\hline
\end{tabular}
\end{document}
当我在 Crunchbang (debian) 上使用 texlive 中的 pdflatex 进行编译时,Hello World 与第一个单元格的底部对齐。我认为在我的列参数中使用 p{...} 可以实现顶部对齐。有人能解释一下为什么这不起作用以及正确的方法吗?
答案1
此问题是由于左侧的文本被 tikzpicture 向下推造成的。可以使用以下方法解决adjustbox
包裹:
\documentclass{article}
\usepackage{tikz}
\usepackage{adjustbox}
\begin{document}
\begin{tabular}{|p{0.5\textwidth}|c|}
\hline
Hello World &
\adjustbox{valign=t}{\begin{tikzpicture}
\draw (-3, -3) rectangle (3,3);
\draw (-3,-3) -- (3,3);
\draw (-3,3) -- (3,-3);
\end{tikzpicture}}\\
\hline
\end{tabular}
\end{document}
编辑:好的,这里针对您遇到的问题的性质再做一些解释。
在 LaTeX 中,tabular
环境会将相邻单元格的内容对齐,使它们的参考点位于同一水平线上。该选项的作用p{width}
是用 包围列的内容\parbox[t]{...}
。另一方面,默认情况下,由 生成的图片tikz
的基线位于底部。这就是为什么您的示例中左侧的文本被图片向下推的原因。
baseline=0pt
的参数通过tikz
将 x 轴的位置强制到基线上来调整这一点。或者,您也可以使用baseline=(current bounding box.north)
将图片的上端放在参考线上(或用 围绕图片\raisebox{-171.11646pt}{...}
,虽然我不太清楚为什么 参数不-6cm
等于,但它可能与默认线宽-170.07874pt
有关系)。此外,开头的 所做的是将单元格的参考点移动到该位置,这就是您似乎实现顶部对齐的原因。PGF
0.4pt
\vspace{0pt}
baseline
下面是一张图片,展示了 tikzpicture 的三个选项(不带、带baseline
和带)之间的区别baseline=(current bounding box.north)
,注意每种情况下参考点的位置(使用layouts
包标记):
现在让我们回到我的答案。adjustbox
with 选项的valign=T
作用与 基本相同baseline=(current bounding box.north)
,它将基线移动到图片的顶部。尽管如此,它还是valign=t
将基线0.7\baselineskip
从顶部移开,因此您可以获得更好的对齐效果(adjustbox
with 也适用tabularx
):
答案2
发帖后,我发现我的问题实际上与 tikzpicture 的垂直对齐有关。如果我用多行文本替换上述代码的那部分,我就会得到我想要的对齐方式。沿着这些思路搜索,我在 SE 上发现了几个答案,我可以将它们结合起来解决我的问题。我还切换到 tabularx,因为我更喜欢 X 语法而不是 p{...}。
\documentclass{article}
\usepackage{tikz}
\usepackage{tabularx}
\begin{document}
\begin{tabularx}{\textwidth}{|c|X|}
\hline
Hello World &
\vspace{0pt}
\begin{tikzpicture}[baseline]
\draw (-3, -3) rectangle (3,3);
\draw (-3,-3) -- (3,3);
\draw (-3,3) -- (3,-3);
\end{tikzpicture}
\\
\hline
\end{tabularx}
\end{document}
有两个键:一个是将 [baseline](默认为 0pt)添加到 tikzpicture。如果我只这样做,我会将文本大致对齐到图片的中间。有人建议使用 \vspace{0pt},我尝试了一下,发现它可以将文本移动到顶部。我不清楚为什么这个解决方案有效,但确实有效。