将表格内容垂直对齐一列,将另一列对齐到底部

将表格内容垂直对齐一列,将另一列对齐到底部

我有下表

\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}

我想做的是让第一列在底部对齐,第二列垂直居中。我尝试了mbp,但无法实现我想要的效果。我读到过这些列不能很好地相互交互,所以这可能是原因。此外,如果切换到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符有点不直观,大多数初学者会认为它们是用于单元格边框内的绝对垂直对齐,而实际上它们是用于列之间的相对对齐。它们可以这样描述:mb

  • p表示正常细胞,它们就像 parbox,在顶线上对齐,

  • b表示底部对齐,因此基线位于底线,并且

  • m表示垂直中心对齐,即基线位于中心。

例如,如果写p{}m{}b{},则第一列单元格的顶部、第二列单元格的中间以及第三列单元格的底部将都位于同一行(相同高度)。

在您的示例中,您可以b{}对所有列使用,然后,要使第二列居中对齐,您需要知道最高单元格的高度以及当前单元格的高度。最高单元格的高度为29\baselineskips,当前单元格只有一行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}

在此处输入图片描述

相关内容