tabularx:当 X 列换行时,在 r 或 l 列上进行底部对齐

tabularx:当 X 列换行时,在 r 或 l 列上进行底部对齐

在 tabularx 中,当 X 列换行超过一行时,l/r/c 列保持顶部对齐:MWE:

\begin{tabularx}{5cm}{lXr}
 1 & qwer asdf zxcv qwer asdf zxcv qwer asdf zxcv & 1 \\
 2 & qwer asdf zxcv & 2 
\end{tabularx}

如果我们重新定义 X 列,结果接近我想要的但根本不是:

\renewcommand{\tabularxcolumn}[1]{b{#1}}
\begin{tabularx}{5cm}{lXr}
 1 & qwer asdf zxcv qwer asdf zxcv qwer asdf zxcv & 1 \\
 2 & qwer asdf zxcv & 2 
\end{tabularx}

为什么重新定义 \tabularxcolumn 以将段落放在底部(或中间)会更改为将 X 列以外的所有列放在底部?

这并不是我想要的。第一列必须顶部对齐,第三列必须底部对齐。像这样:

\begin{tabularx}{5cm}{cXr}
 1 & qwer asdf zxcv qwer & \\
   & asdf zxcv qwer asdf & \\
   & zxcv & 1 \\
 2 & qwer asdf zxcv & 2 
\end{tabularx}

如果 X 列在所有其他列上留下的空间(在这种情况下,第一列底部的两行和第三列顶部的两行)可以填充,例如用中心点或其他什么,那就更好了。

答案1

在此处输入图片描述

这需要两次乳胶运行来测量

\documentclass{article}
\usepackage{tabularx}

\makeatletter
\def\savepos#1{\leavevmode\pdfsavepos\write\@auxout{%
\gdef\noexpand#1{\the\pdflastypos sp }}}

\def\xstart#1{\expandafter\savepos\csname save@start@#1\endcsname}

\def\xend#1{\expandafter\savepos\csname save@end@#1\endcsname}

\def\xpad#1#2#3{%
\vtop{%
\baselineskip\normalbaselineskip
#2%
\expandafter\ifx\csname save@start@#1\endcsname\relax
\else
\dimen@\csname save@start@#1\endcsname\relax
\loop
\ifdim\dimen@>\csname save@end@#1\endcsname
\advance\dimen@-\baselineskip
\hbox{$\cdot$}%
\repeat
\fi
#3%
}}


\def\xleft#1#2{\xpad{#1}{\hbox{#2}}{}}

\def\xright#1#2{\xpad{#1}{}{\hbox{#2}}}





\begin{document}

\begin{tabularx}{5cm}{cXr}
 \xleft{a}{1} & \xstart{a}qwer asdf zxcv qwer 
    asdf zxcv qwer asdf
    zxcv\xend{a} & \xright{a}{1} \\
 \xleft{b}{2} & \xstart{b}qwer asdf zxcv\xend{b} & \xright{b}{2} 
\end{tabularx}

\end{document}

相关内容