我在 \newenvironment 中使用 tabular* 编写了下表。效果不错,但我更喜欢在一列上换行。该表使用“幻像”单元格来实现我想要的效果,即一列占用其他三列(可见)留下的所有可用宽度,即三列根据写入其中的文本占用其最小宽度,而另一列占用剩余宽度。总宽度为 \linewidth,所以这就是我使用 tabular* 而不是 tabular 的原因。MWE:
\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],我无法使用 tabu。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
},因为那时\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
或,如这里设置\parindent
为零。
还要注意,如果您使用时tabular*
不需要额外的列,则可以将额外的列 sep 切换为现有列,唯一稍微棘手的是重新插入垂直规则。
\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}