![表格垂直居中:我做错了什么?](https://linux22.com/image/462529/%E8%A1%A8%E6%A0%BC%E5%9E%82%E7%9B%B4%E5%B1%85%E4%B8%AD%EF%BC%9A%E6%88%91%E5%81%9A%E9%94%99%E4%BA%86%E4%BB%80%E4%B9%88%EF%BC%9F.png)
我知道这个主题有多个问题和答案,但我无法让它工作。我尝试了多个代码来制作表格,只要我不使用图像,我现在拥有的表格就可以工作。我非常想使用它们。
这是我的 MWE:
\documentclass[border=5pt]{standalone}
\usepackage[utf8]{inputenc}
\usepackage{tikz,esvect}
\usepackage{tabularray}
\usepackage{multirow}
\begin{document}
\setlength\arraycolsep{1pt}
\begin{tblr}{
colspec = {Q[c,m]Q[c,m]Q[c,m]Q[c,m]},
stretch = 0,
rowsep = 6pt,
hlines = {1.2pt},
vlines = {1.2pt},
}
Famille
&
Nom
&
Schéma
&
Torseur Cinématique
\\
\SetCell[r=2]{} Liaison à direction
&
Glissière
&
\includegraphics[height=2cm]{glissiere.png}
&
$VVV = \displaystyle \frac{zz}{\displaystyle \int dx}$
\\
&
Plane
&
\includegraphics[height=2cm]{plane.png}
&
$VVV = \displaystyle \frac{zz}{\displaystyle \int dx}$
\\
\end{tblr}
\end{document}
您可以看到第二列和第四列的内容低于预期,而第三列的内容较高:就好像图像的底部与其他列中的文本垂直对齐一样
如果您喜欢 overleaf,这里是我的 MWE 目录的链接: https://www.overleaf.com/read/wmbbxqyssxvd
我知道使用图像会使我的 MWE 变得复杂,但它是我的问题的核心。所以它们在这里:
后续问题:为什么 LaTeX 中的表格这么难用?
答案1
您需要将图像基线移动到图像垂直中心。这可以通过多种方式完成,但(在我看来)似乎最方便。这样做您不需要valign
在列规范中选择选项:adjustbox
m
\documentclass[border=5pt]{standalone}
\usepackage[export]{adjustbox} % <---
\usepackage{tikz,esvect}
\usepackage{tabularray}
\UseTblrLibrary{amsmath}
\newcommand\ds{\displaystyle} % <---
\begin{document}
\begin{tblr}{colspec = {X[c] Q[c]Q[c] Q[c, mode=dmath]}, % <---
colsep = 2pt,
row{1} = {mode=text}, % <---
hlines = {1.2pt}, vlines = {1.2pt},
}
Famille & Nom & Schéma & Torseur Cinématique \\
\SetCell[r=2]{c} Liaison à direction
& Glissière & \includegraphics[height=2cm, valign=m]{example-image-duck}%{glissiere.png}
& VVV = \frac{zz}{\ds \int dx} \\
& Plane & \includegraphics[height=2cm, valign=m]{example-image-duck}%{plane.png}
& VVV = \frac{zz}{\ds \int dx}
\\
\end{tblr}
\end{document}
题外话:上面的 MWE 是
- 对于较短的代码,
\displaystyle
定义新的命令\ds
- 最后一列是显示数学样式(您真的需要分数积分作为显示样式吗?)
- 仅使用
tabularray
语法(\colsep
在表格序言中而不是\setlength\arraycolsep{1pt}
表格之前)
- 在某些情况下,当您为图像插入
tikz
代码时,将图像基线移动到其垂直中心,添加baseline=(current bounding box.center)
到tikzpicture
选项。
编辑:
如果某些单元格中的文本只有几行,则为了使其垂直居中,您应该将其替换X[c]
为 X[c, ]`:
\begin{tblr}{colspec = {X[c,m] Q[c,m]Q[c] Q[c, mode=dmath]}, % <---
colsep = 2pt,
row{1} = {mode=text}, % <---
hlines = {1.2pt}, vlines = {1.2pt},
}
Famille & Nom & Schéma & Torseur Cinématique \\
\SetCell[r=2]{c} Liaison à direction
& Glissière & \includegraphics[height=2cm, valign=m]{example-image-duck}%{glissiere.png}
& VVV = \frac{zz}{\ds \int dx} \\
& {Plane\\ Plane\\ Plane}
& \includegraphics[height=2cm, valign=m]{example-image-duck}%{plane.png}
& VVV = \frac{zz}{\ds \int dx}
\\
\end{tblr}
答案2
在我看来,这:
- 对于图像的垂直对齐,我们需要
h
而不是m
; - 第 2 列的文本与第 4 列的文本垂直对齐
=
,如果要与图像垂直对齐,除了手动调整{\\[-1ex]Plane}
或使用之外,我还没有找到其他方法adjustbox
代码
\documentclass[border=5pt]{standalone}
%https://tex.stackexchange.com/questions/680131/table-vertical-centering-what-am-i-doing-wrong
\usepackage{tabularray}
\usepackage{graphicx}
\usepackage{adjustbox}% <-- added
\begin{document}
\setlength\arraycolsep{1pt}
\begin{tblr}{
%colspec = {Q[c]Q[c]Q[c,h]Q[c]},
colspec = {*{4}{Q[c]}},% with adjsutbox
stretch = 0,
rowsep = 6pt,
hlines = {1.2pt},
vlines = {1.2pt},
}
Famille
&
Nom
&
Schéma
&
Torseur Cinématique
\\
\SetCell[r=2]{} Liaison à direction
&
Glissière
&
%\includegraphics[height=2cm]{example-image-a}
\adjustbox{valign=M}{\includegraphics[height=2cm]{example-image-a}}
&
$VVV = \displaystyle \frac{zz}{\displaystyle \int dx}$
\\
&
%{\\[-1ex]Plane}
%&
% \includegraphics[height=2cm]{example-image-b}
Plane
&
\adjustbox{valign=M}{\includegraphics[height=2cm] {example-image-b}}
&
$VVV = \displaystyle \frac{zz}{\displaystyle \int dx}$
\\
\end{tblr}
\end{document}
另一种可能性nicematrix
是adjustbox
\documentclass[border=5pt]{standalone}
\usepackage{nicematrix}
\usepackage{graphicx}
\usepackage{adjustbox}
\begin{document}
\begin{NiceTabular}{c c c}[hvlines,cell-space-limits=1mm]
%\Body
Glissière &
\adjustbox{valign=M}{\includegraphics[height=3cm]{example-image-b}}
& $VVV = \displaystyle \frac{zz}{\displaystyle \int dx}$ \\
\end{NiceTabular}
\end{document}