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