当“X”列在 tabularx 中换行时,列上的对齐方式不同

当“X”列在 tabularx 中换行时,列上的对齐方式不同

2013 年我确实问过这个问题并得到了答案,但在另一段代码上实施时我遇到了以前没有出现过的新问题。

我有三列,tabularx其中两列是或,中间一列是 。如果该列占用多行,则所需的行为是第一列(即列)顶部对齐(与列的第一行在同一行),第三列底部对齐(与列的最后一行在同一行)。空白列用类似 的内容填充。lrcXXlXX\cdot

原始帖子可在 [1] 找到;David Carlisle 提供的解决方案涉及新的命令来进行测量并将文本放置在所需位置:\xleft\xright\xstart和。到目前为止,它运行良好\xend\xpad

  1. 如果第一列和第三列上的单元格包含多个文本字符,则填充的单元格将水平对齐到所涉及的其他单元格上的文本的开始/结束,而不是居中,这是所需的外观。
  2. 使用\hbox打印单元格内容会抑制可拉伸空间的使用,例如\hfill,并且右列的一个单元格必须具有模式text\hfill text以扩展两个单词之间的空间直到列宽(取自较长的单元格,在我的情况下为列标题)。

下面的代码是 David Carlisle 提供的解决方案,用来展示我现在想要的内容:

\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}
title 1 & title 2 & title 3 \\

 \xleft{a}{7890} & \xstart{a}qwer asdf zxcv qwer 
    asdf zxcv qwer asdf
    zxcv\xend{a} & \xright{a}{1} \\
 \xleft{b}{50} & \xstart{b}qwer asdf zxcv\xend{b} & \xright{b}{A\hfill1} \\
 90 & ..... & B\hfill2
\end{tabularx}
\end{document}

我们可以看到,“7890”下方的点与此单元格的开头对齐,即数字“7”下方,而“50”单元格下方的点则位于“5”下方。整体外观看起来完全没有对齐。我更喜欢让它们全部在第一列和第三列(cr列)上居中。

第二点是关于 的使用\hfill。在示例中,\hfill中的A\hfill1扩展为零,因此显示的文本为“A1”,但下一行包含可拉伸空间,直到最宽单元格的大小(第一个:“title 3”)。如果 的效果也可以在列可以换行的行上实现,A\hfill2那就太好了。\hfillX

短暂性脑缺血。

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

答案1

最简单的方法就是允许你指定框的宽度,以便框\hfill可以拉伸。我猜想,可以使用用于\pdflatstpos测量 X 列垂直延伸的机制来测量第 1 列和第 3 列的水平延伸,但这会增加很多复杂性,而实际用途可能不大。与其像这里一样使用 2cm 固定宽度,不如使用它\settowidth来获取你所知道的最宽条目的宽度。

在此处输入图片描述

\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#3{\xpad{#1}{\hbox\ifx!#3!\else to #3\fi{#2}}{}}
\def\xright#1#2#3{\xpad{#1}{}{\hbox\ifx!#3!\else to #3\fi{#2}}}

\begin{document}
\begin{tabularx}{5cm}{lXr}
\multicolumn{1}{c}{title 1}& title 2 & title 3 \\

 \xleft{a}{7890}{} & \xstart{a}qwer asdf zxcv qwer 
    asdf zxcv qwer asdf
    zxcv\xend{a} & \xright{a}{1}{2cm} \\
 \xleft{b}{50}{} & \xstart{b}qwer asdf zxcv\xend{b} & \xright{b}{A\hfill1}{2cm} \\
 90 & ..... & B\hfill2
\end{tabularx}
\end{document}

相关内容