表格垂直居中:我做错了什么?

表格垂直居中:我做错了什么?

我知道这个主题有多个问题和答案,但我无法让它工作。我尝试了多个代码来制作表格,只要我不使用图像,我现在拥有的表格就可以工作。我非常想使用它们。

这是我的 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}

尽管如此,结果还是如此Q[c,m]最大能量值表

您可以看到第二列和第四列的内容低于预期,而第三列的内容较高:就好像图像的底部与其他列中的文本垂直对齐一样

如果您喜欢 overleaf,这里是我的 MWE 目录的链接: https://www.overleaf.com/read/wmbbxqyssxvd

我知道使用图像会使我的 MWE 变得复杂,但它是我的问题的核心。所以它们在这里: 联络官 联络飞机

后续问题:为什么 LaTeX 中的表格这么难用?

答案1

您需要将图像基线移动到图像垂直中心。这可以通过多种方式完成,但(在我看来)似乎最方便。这样做您不需要valign在列规范中选择选项:adjustboxm

\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}

在此处输入图片描述

另一种可能性nicematrixadjustbox

    \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}

在此处输入图片描述

相关内容