
我在 \newenvironment 中使用 tabular* 編寫了下表。工作正常,但我更喜歡將文字換行在一列上。該表使用“幻像”單元格來實現我想要的,即有一列佔用所有其他三(可見)列留下的所有可用寬度,即三列根據寫入其中的文本採用其最小寬度,而另一列則採用列佔用剩餘寬度。總寬度是 \linewidth,所以這就是我使用 tabular* 而不是 tabular 的原因。氣象局:
\documentclass{article}
\begin{document}
\begin{tabular*}{\linewidth {|c|l@{\extracolsep{\fill}}cc@{\extracolsep{0pt}}|r|r|}
minwidth& remaining width &&& minw & minw\\
x & x &&& x & x
\end{tabular*}
\end{document}
現在,我想要的是第二個可見列(“大”列)上的文字換行。由於動態調整的列,因此無法使用 parbox 或類似 p 的列。我不知道如何讀取第二列的列寬度以包含具有此寬度的 parbox 以允許文字換行。
是否可以讀取 tabular* 儲存目前儲存格寬度的長度?或者有一種方法可以包含一些段落框而不指定其長度?
由於[1],我無法使用禁忌。 tabularx 也可以工作,但是當將其包含在新環境中時,需要對 enddef 進行一些重新定義。 Tabularx 出現了另一個問題,我現在不記得了,但如果 tabular* 無法滿足我的需求,我將使用 tabularx 再次嘗試。
我確實讀過[2]。在 lrbox 的列定義中使用“<”和“>”並不能解決我的問題,因為框的大小僅限於其內容的大小,而不是結果列的大小。
另外,我嘗試使用 zref-savepos 保存兩列的 x 位置,以便稍後獲取其差異並減去 \tabcolsep 和 \arrayrulewidth:
\documentclass{article}
\usepackage{zref-savepos}
\newlength{\auxleng}
\newsavebox{\auxbox}
\newenvironment{auxenviron}
{\begin{lrbox}{\auxbox}}{\end{lrbox}\usebox{\auxbox}\global\setlength{\auxleng}{\wd\auxbox}}
\begin{document}
\begin{tabular*}{\linewidth}{|c|l@{\extracolsep{\fill}}cc@{\extracolsep{0pt}}|r|r|}
minw & \zsaveposx{XX}remaining width &&& \zsaveposx{XXX} minw & minw\\
x & \setlength{\auxleng}{\zposx{XXX} sp}\addtolength{\auxleng}{-\zposx{XX} sp}\parbox{\auxleng}{asdf}&&& x & x
\end{tabular*}
\end{document}
……但是每次編譯文件時,第二個引用都會向右移動,因為 tabular* 會重新計算第二列的位置。
答案1
包tabularx
可以提供幫助。由於您正在使用\newenvironment
,因此無法使用\begin{tabularx}
和\end{tabularx
} ,因為 then\end{tabularx}
是隱藏的。然而,\tabularx
並且\endtabularx
有效:
\documentclass{article}
\usepackage{tabularx}
\newenvironment{mytab}{%
\tabularx
}{%
\endtabularx
}
\begin{document}
\noindent
\begin{mytab}{\linewidth}{|c|X|r|}
minwidth& remaining width minw & minw\\
x & x & x\\
\end{mytab}
\end{document}
也可以透過包捕獲環境的內容environ
(對東西有一些限制\verb
)。也許您可以更輕鬆地在表格末尾添加神秘的東西。
\documentclass{article}
\usepackage{tabularx}
\usepackage{environ}
\NewEnviron{mytab}{%
\expandafter\mytabaction\expandafter{\BODY}%
}
\newcommand{\mytabaction}[1]{%
\begin{tabularx}#1\end{tabularx}%
}
\begin{document}
\noindent
\begin{mytab}{\linewidth}{|c|X|r|}
minwidth& remaining width minw & minw\\
x & x & x\\
\end{mytab}
\end{document}
答案2
正如tabularx
已經建議的那樣,我會給出tabulary
答案。另請注意,如果您指定表格為全寬(透過任何這些方法),您需要確保它沒有被段落縮排縮進,否則您的行將過滿。因此,您需要在表前加上\noindent
or 前綴,如此處設定\parindent
為零。
另請注意,如果您使用的是tabular*
不需要額外的列,您可以切換現有列的額外列間隔,唯一稍微棘手的一點是重新插入垂直線。
\documentclass{article}
\usepackage{tabulary}
% http://tex.stackexchange.com/questions/87097/is-it-possible-to-make-an-underfull-tabulary-spread-out/87543#87543
\makeatletter
\def\foo#1\def\TY@ratio#2#3!!{
\def\TY@checkmin{#1%
\@tempdima\TY@ratio\TY@tablewidth
\ifdim\@tempdima>\dimexpr\TY@linewidth+\hfuzz\relax
\advance\@tempdima-\TY@linewidth
\Gscale@div\@tempb\@tempdima\TY@tablewidth
\@tempdimb\TY@ratio\p@
\advance\@tempdimb-\@tempb\p@
\edef\TY@ratio{\strip@pt\@tempdimb}%
\fi
#3}}
\expandafter\foo\TY@checkmin!!
\makeatother
\begin{document}
\parindent0pt
\begin{tabular*}{\linewidth}
{|c|l@{\extracolsep{\fill}}cc@{\extracolsep{0pt}}|r|r|}
minwidth& remaining width &&& minw & minw\\
x & x &&& x & x
\end{tabular*}
\bigskip
\begin{tabular*}{\linewidth}
{|c|l!{\extracolsep{\fill}}>{\vline\kern\tabcolsep\hfill}r!{\extracolsep{0pt}}|r|}
minwidth& remaining width & minw & minw\\
x & x & x & x
\end{tabular*}
\bigskip
\begin{tabulary}
{\linewidth}{|c|L|r|r|}
minwidth& remaining width & minw & minw\\
x & x & x & x
\end{tabulary}
\end{document}
答案3
\documentclass{article}
\usepackage{tabularx}
\begin{document}
\noindent\rule{\linewidth}{1pt}
\bigskip\noindent
\begin{tabularx}{\linewidth} {|c|Xcc|r|r|}\hline
minwidth& remaining width &&& minw & minw\\
x & x &&& x & x
\end{tabularx}
\end{document}