
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
inA\hfill1
展開為空,因此顯示的文字為“A1”,但下一行包含A\hfill2
可拉伸空間,直到最寬的儲存格大小(第一個:“標題 3”)。如果列可以換\hfill
行的行也能達到這樣的效果,那就太好了X
。
TIA。
答案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}