tabularray 中的图形垂直对齐被破坏

tabularray 中的图形垂直对齐被破坏

例子:

\documentclass[10pt]{article}

\usepackage[utf8]{inputenc}
\usepackage{mwe}
\usepackage{graphicx}
\usepackage{tabularray}
\UseTblrLibrary{varwidth}

\newcommand{\mymacro}{This macro expands \\ onto two lines}

\begin{document}

\begin{center}
\begin{tblr}{
        measure=vbox,
        width=0.9\linewidth,
        colspec={X[l,m] X[2,c,m]},
        hlines, vlines
    }
    {
        A single line of text \\
        Some additional text \\
        \mymacro
    } &
    \includegraphics[width=\linewidth, height=0.3\linewidth]{example-image}
\end{tblr}
\end{center}

\end{document}

图像的纵横比可能可变;我眼前的情况是更宽的。此外,为了说明而显示 h/vlines,我不需要它们。

图像左侧的文本垂直错位

准确地说,我希望两个单元格的边界框在垂直中心对齐,与内容无关。

我设法搞清楚了宏扩展(这不需要expand,它需要varwidth!),但我找不到任何控制图像对齐的东西。将图像包裹在 中几乎\begin{tblr}{c}...\end{tblr}可行,但它会发出无数警告,并且 h 间距是错误的。(我没有看到任何关于嵌套tblrs 的内容,这是否曾经被允许?)

可能相关:tabularray,包括 X 列中的 \linewidth 图形会导致较大的垂直空间 (正在adjustbox修葺廯 ...

答案1

更新。似乎设置第一个单元格可以h正确对齐两个元素。


您需要更正两个项目的基线。

我认为\SetCell{h}将文本的基线设置为其第一行。

然后,按照@UlrikeFischer 的建议,使用\raisebox{}{}将图像向下拖动,其高度减去一些校正(例如一行文本的高度)。通过这样做,您可以有效地将其基线向上移动。

然后两个元素的基线将匹配,您将获得所需的对齐。

图像

\documentclass[10pt]{article}
\usepackage{graphicx}
\usepackage{tabularray}
    \UseTblrLibrary{varwidth}

\newcommand{\mymacro}{This macro expands\\onto two lines}

\begin{document}
\centering
\begin{tblr}{
        colspec={X[h] X[2]},
        measure=vbox,
        width=0.9\linewidth,
    }
    {A line of text\\Some additional text\\\mymacro}
        & \includegraphics[width=\linewidth]{example-image}
\end{tblr}
\end{document}

编辑。中间垂直对齐

在此处输入图片描述

\documentclass[10pt]{article}
\usepackage{graphicx}
\usepackage{tabularray}
    \UseTblrLibrary{varwidth}

\newcommand{\mymacro}{This macro expands\\onto two lines}

\setlength{\fboxsep}{0pt}

\begin{document}
\centering
\begin{tblr}{
        colspec={X[h,m] X[2,m]},
        measure=vbox,
        width=0.9\linewidth,
    }
    \parbox{\linewidth}{A line of text\\Some additional text\\\mymacro}
        & \raisebox{-0.5\totalheight}{\includegraphics[width=\linewidth]{example-image}}
\end{tblr}
\end{document}

答案2

非常有趣。我猜这是由于 tabularray 计算中心的方式而导致的一些非预期行为。

真正好的修复只有通过作者更新软件包才有可能(或者有人提供补丁,但让作者更新软件包会更好)

简而言之,我认为原因如下...

首先,要使数组居中,您需要将内容放在一个框中,然后测量框的高度和深度。但是,如果您这样做,带有降部字符(例如y)的基线将位于不带降部字符(例如)的基线上方a

所以,我不确定 tabularray 是如何实现居中对齐的(源代码肯定是密集的。),但实验上这个片段:

\begin{tblr}{width=0.9\linewidth, colspec={X[m] X[2,m]}}
    {
        A line of text \\
        Some additional text \\
    } &
    {
    aa\includegraphics[width=\linewidth, height=0.3\linewidth]{example-image}
    \\
    bb\includegraphics[width=\linewidth, height=0.3\linewidth]{example-image}
}
\end{tblr}

给出输出

输出

所以我可以猜测它占据了(第一行支柱的顶部)和(最后一行支柱的底部)的中点。

在这种情况下,似乎最好取最大值(第一条线的支柱顶部,第一条线的实际顶部)。不确定这是否会比当前结果更差。

现在

\begin{tblr}{width=0.9\linewidth, colspec={X[m] X[2,m]}}
    some text & \rule{2pt}{15pt} other text with a tall column \rule{2pt}{15pt}
\end{tblr}

提供

输出

随着更改,基线将不再对齐。这是理想的吗……?

更实际的是,有非常高的内联公式,例如$5^{2^2}$,同样的问题。话虽如此,特别是这个公式在使用时已经扭曲了baselineskip,所以也许这不是问题……?


无论如何,根据我猜测它是如何工作的上面的解释,我可以想到一个解决方法(如果你理解了上面的内容,你应该能够理解为什么这个方法也能起作用)。

\begin{tblr}{
        measure=vbox,
        width=0.9\linewidth,
        colspec={X[l,m] X[2,c,m]},
        hlines, vlines
    }
    {
        A single line of text \\
        Some additional text \\
        \mymacro
    } &
    {
        random text here \\
        \includegraphics[width=\linewidth, height=0.3\linewidth]{example-image} \\
        random text here
    }
\end{tblr}

随机文本仅用于演示。请用\strut或任何您想要的不可见文本替换。

缺点是,只有当第一个单元格高于第二个单元格时,这才会起作用,但不幸的是这里并非如此。


我遇到了https://tex.stackexchange.com/a/112977/250119其中提到了adjustbox包,考虑到支柱顶部(0.7 \baselineskip)和支柱底部(-0.3 \baselineskip)的中点是0.2 \baselineskip,因此你可以像这样使用mvalign类型adjustbox

\def\adjboxvcenter{0.2\baselineskip}

\begin{center}
\begin{tblr}{
        measure=vbox,
        width=0.9\linewidth,
        colspec={X[l,m] X[2,c,m]},
        hlines, vlines
    }
    {
        A single line of text \\
        Some additional text \\
        \mymacro
    } &
    \adjustbox{valign=m}{\includegraphics[width=\linewidth, height=0.3\linewidth]{example-image}}
\end{tblr}
\end{center}

如果我上面的所有猜测都是正确的,那么这应该是完全居中的。

输出

附注:adjustbox 不是“假设”高度,而是(大概)测量高度,这样更方便一些……

是的,如果您使用 m 型 valign,那么使用 tabular 可能会更简单,但是 • 您需要其他东西来制作多条线 • \linewidth 是大线宽,而不是单元格宽度:

    \begin{tabular}{ll}
        \adjustbox{valign=m}{\begin{tabular}{l}
                A single line of text \\
                Some additional text \\
                \mymacro
        \end{tabular}} &
        \adjustbox{valign=m}{\includegraphics[width=0.6\linewidth, height=0.2\linewidth]{example-image}}
    \end{tabular}

相关内容