我正在努力解决一个看似微不足道的垂直对齐问题tabular
。考虑 3 列:两列包含应该软换行的文本,并且应该在顶部单元格。第三列(本例中为中间列)应在行内垂直居中。
例子:
\documentclass{scrartcl}
\usepackage{lipsum}
\usepackage{array}
\begin{document}
\begin{tabular}{m{4cm} m{1cm} m{4cm}}
\lipsum[1][1] & x & \lipsum[1][1]
\end{tabular}
\end{document}
这看起来符合预期,但前提是两个文本占据相同的高度。否则(只需将第二个更改\lipsum[1][1]
为\lipsum[1][1-2]
,结果是:
问题:第 1 列的内容未与单元格顶部对齐。
当然,将两个“长”列的对齐方式更改为p{4cm}
无济于事:
\documentclass{scrartcl}
\usepackage{lipsum}
\usepackage{array}
\begin{document}
\begin{tabular}{p{4cm} m{1cm} p{4cm}}
\lipsum[1][1] & x & \lipsum[1][1-2]
\end{tabular}
\end{document}
问题:现在中间的列不再垂直居中。
我想我明白为什么正在发生这种情况:所有这些对齐都是相对于当前单元格的第一个“行”,而不是相对于单元格本身。(如何)这可能吗?我正在寻找允许我生成的列规范:
在最好的情况下,我甚至不需要指定中间列的宽度。
答案1
答案2
其实并非如此简单。
您可以测量两个大盒子,然后将中间的盒子放在垂直中心。但是,TeX 可以为您完成此操作。
\documentclass{article}
\usepackage[latin]{babel} % for better hyphenation
\usepackage{lipsum} % for mock text
\usepackage{microtype} % for less overfull boxes
\newcommand{\mytwocols}[4][4cm]{%
\valign{##\cr
\mycol{\vtop}{#1}{#2}\vfill\cr
\noalign{\hspace{2\tabcolsep}}
\vfill\mycol{\vbox}{1cm}{#3}\vfill\cr
\noalign{\hspace{2\tabcolsep}}
\mycol{\vtop}{#1}{#4}\vfill\cr
}%
}
\newcommand{\mycol}[3]{%
#1{\hsize#2\relax\parindent0pt\relax\sloppy#3}%
}
\begin{document}
\mytwocols
{\lipsum[1][1]}
{x}
{\lipsum[1][1]}
\bigskip
\mytwocols
{\lipsum[1][1]}
{x}
{\lipsum[1][1-2]}
\bigskip
\mytwocols
{\lipsum[1][1-2]}
{x}
{\lipsum[1][1]}
\end{document}
答案3
或者使用
\phantom
\documentclass{scrartcl}
\usepackage{lipsum}
\usepackage{array}
\newcolumntype{M}[1]{>{\centering\let\newline\\\arraybackslash\hspace{0pt}}m{#1}}
\begin{document}
\begin{tabular}{p{4cm} M{5cm} p{4cm}}
\lipsum[1][1] & {\phantom{\lipsum[1][1-2]}} x & \lipsum[1][1-2]
\end{tabular}
\end{document}
答案4
一个手动但非常简单的解决方案可以是均衡左侧单元格的行数并使用一c
列作为“x”分隔符:
\documentclass{scrartcl}
\usepackage{lipsum}
\usepackage{array}
\begin{document}
\begin{tabular}{m{4cm}@{\qquad}c@{\qquad}m{4cm}}
\lipsum[1][1]\newline\newline\newline & x & \lipsum[1][1-2]
\end{tabular}
\end{document}