2013 年我确实问过这个问题并得到了答案,但在另一段代码上实施时我遇到了以前没有出现过的新问题。
我有三列,tabularx
其中两列是或,中间一列是 。如果该列占用多行,则所需的行为是第一列(即列)顶部对齐(与列的第一行在同一行),第三列底部对齐(与列的最后一行在同一行)。空白列用类似 的内容填充。l
r
c
X
X
l
X
X
\cdot
原始帖子可在 [1] 找到;David Carlisle 提供的解决方案涉及新的命令来进行测量并将文本放置在所需位置:\xleft
、\xright
、\xstart
和。到目前为止,它运行良好\xend
。\xpad
- 如果第一列和第三列上的单元格包含多个文本字符,则填充的单元格将水平对齐到所涉及的其他单元格上的文本的开始/结束,而不是居中,这是所需的外观。
- 使用
\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”下方。整体外观看起来完全没有对齐。我更喜欢让它们全部在第一列和第三列(c
和r
列)上居中。
第二点是关于 的使用\hfill
。在示例中,\hfill
中的A\hfill1
扩展为零,因此显示的文本为“A1”,但下一行包含可拉伸空间,直到最宽单元格的大小(第一个:“title 3”)。如果 的效果也可以在列可以换行的行上实现,A\hfill2
那就太好了。\hfill
X
短暂性脑缺血。
答案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}