
我正在努力解決一個看似微不足道的垂直對齊問題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}