當「X」列在 tabularx 中換行時,列上的對齊方式不同

當「X」列在 tabularx 中換行時,列上的對齊方式不同

2013 年,我確實問過這個問題並得到了回答,但在另一個程式碼上實現時,我遇到了以前沒有出現過的新問題。

我有一個三列tabularx,其中兩個是l,rc,中間一列是一X列。如果該X列佔用多行,則所需的行為是第一列(例如該l列)頂部對齊(與該X列的第一行位於同一行,第三列底部對齊(在與列的最後一行相同的行X\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。在範例中,\hfillinA\hfill1展開為空,因此顯示的文字為“A1”,但下一行包含A\hfill2可拉伸空間,直到最寬的儲存格大小(第一個:“標題 3”)。如果列可以換\hfill行的行也能達到這樣的效果,那就太好了X

TIA。

[1]tabularx:當 X 列換行時,r 或 l 列底部對齊

答案1

無需重寫的最簡單的事情是允許您指定用於框的寬度,以允許\hfill拉伸。 (我想)可以使用\pdflatstpos用於測量 X 列的垂直範圍的機制來測量第一列和第三列的水平範圍,但它增加了很多複雜性,可能幾乎沒有實際用途。您可以使用此處的 2cm 固定寬度\settowidth來取得您所知道的最寬條目的寬度,而不是使用 2cm 固定寬度。

在此輸入影像描述

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

相關內容