例子:
\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 间距是错误的。(我没有看到任何关于嵌套tblr
s 的内容,这是否曾经被允许?)
可能相关: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}