我有下表
\documentclass{article}
\usepackage{array}
\usepackage{lipsum}
\usepackage{booktabs}
\usepackage[a4paper]{geometry}
\geometry{left=1cm,right=1cm,top=1cm,bottom=1cm}
\begin{document}
\begin{table}[ht]
\centering
\begin{tabular}{
|p{5cm}|m{5cm}|p{4cm}|
}
\hline
Column 1 & Column 2 & Column 3 \\
\hline
align me at bottom & align me vertically & \lipsum*[3] \\
\hline
\end{tabular}%
\end{table}
\end{document}
我想做的是让第一列在底部对齐,第二列垂直居中。我尝试了m
、b
和p
,但无法实现我想要的效果。我读到过这些列不能很好地相互交互,所以这可能是原因。此外,如果切换到tabularx
或其他包有帮助,我也可以接受。谢谢任何提示。
答案1
这是对 AboAmmar 的答案的一个小修改,其中一个人使用保存箱来测量第三列的高度。
\documentclass{article}
\usepackage{array}
\usepackage{lipsum}
\usepackage{booktabs}
\usepackage[a4paper]{geometry}
\geometry{left=1cm,right=1cm,top=1cm,bottom=1cm}
\begin{document}
\begin{table}[ht]
\centering
\begin{tabular}{|b{5cm}|l|l|}
\hline
Column 1 & Column 2 & Column 3 \\
\hline
\global\setbox0=\hbox{\parbox[b]{4cm}{\strut\lipsum*[3]}}% actually part of first column
align me at bottom & \raisebox{0.5\ht0}{\parbox[c]{5cm}{align me vertically}} & \usebox0 \\
\hline
\global\setbox0=\hbox{\parbox[b]{4cm}{\strut\lipsum*[4]}}% actually part of first column
align me at bottom & \raisebox{0.5\ht0}{\parbox[c]{5cm}{align me vertically}} & \usebox0 \\
\hline
\end{tabular}%
\end{table}
\end{document}
答案2
无需测量任何东西。诀窍是为底部对齐的文本使用新行。
\documentclass{article}
\usepackage{array}
\usepackage{lipsum}
\usepackage{booktabs}
\usepackage{adjustbox}
\usepackage[a4paper]{geometry}
\geometry{left=1cm,right=1cm,top=1cm,bottom=1cm}
\begin{document}
\begin{table}[ht]
\centering
\begin{tabular}{
|p{5cm}|m{5cm}|p{4cm}|
}
\hline
Column 1 & Column 2 & Column 3 \\
\hline
& \adjustbox{valign=c,minipage=5cm}{align me
vertically} & \adjustbox{valign=c,minipage=4cm}{\lipsum*[3]
\vspace*{-0.9\baselineskip}}
\\
align me at bottom & & \\
\hline
\end{tabular}%
\end{table}
\end{document}
答案3
、和说明p
符有点不直观,大多数初学者会认为它们是用于单元格边框内的绝对垂直对齐,而实际上它们是用于列之间的相对对齐。它们可以这样描述:m
b
p
表示正常细胞,它们就像 parbox,在顶线上对齐,b
表示底部对齐,因此基线位于底线,并且m
表示垂直中心对齐,即基线位于中心。
例如,如果写p{}m{}b{}
,则第一列单元格的顶部、第二列单元格的中间以及第三列单元格的底部将都位于同一行(相同高度)。
在您的示例中,您可以b{}
对所有列使用,然后,要使第二列居中对齐,您需要知道最高单元格的高度以及当前单元格的高度。最高单元格的高度为29\baselineskip
s,当前单元格只有一行1
,因此您需要\vbox
大约的高度(29-1)/2 = 14\baselineskip
来写入单元格的内容。
\documentclass[a4paper]{article}
\usepackage{array}
\usepackage{lipsum}
\usepackage{booktabs}
\usepackage[margin=1cm]{geometry}
\begin{document}
\begin{table}[ht]
\centering
\begin{tabular}{|b{5cm}|b{5cm}|b{4cm}|}
\hline
Column 1 & Column 2 & Column 3 \\
\hline
align me at bottom & \vbox to 14\baselineskip{align me vertically} & \lipsum*[3] \\
\hline
\end{tabular}%
\end{table}
\end{document}
答案4
使用 cals,可以轻松设置此类表格:
\documentclass{article}
\usepackage{ragged2e, cals, lipsum}
\begin{document}
\begin{table}[ht]
\begin{calstable}[c] % Centre the tabular
% Defining columns relative to the margin
\colwidths{{\dimexpr(\columnwidth)/14*5\relax}
{\dimexpr(\columnwidth)/14*5\relax}
{\dimexpr(\columnwidth)/14*4\relax}
}
% Set up the tabular
\makeatletter
\def\cals@framers@width{0.4pt} % Outside frame rules, reduce if the rule is too heavy
\def\cals@framecs@width{0.4pt}
\def\cals@cs@width{0.4pt} % Inside rules, reduce if the rule is too heavy
\def\cals@rs@width{0.4pt}
% R1
\thead{\bfseries
\brow
\alignL\cell{\vfil Column 1}
\cell{\vfil Column 2}
\cell{\vfil Column 3}
\erow
\mdseries
}
% R2 Body
\brow
\cell{\vfill Align me at bottom}
\cell{\vfil Align me vertically}
\cell{\RaggedRight\lipsum*[3]} % Ragged right looked better
\erow
\makeatletter
\end{calstable}\par % \par to align the tabular
\end{table}
\end{document}