使用表格*了解单元格宽度或包含段落框而不指定其宽度

使用表格*了解单元格宽度或包含段落框而不指定其宽度

我在 \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]不能在带有后记单元格的 \newenvironment 内包含“tabu”

[2]\parbox“textwidth”表示表格单元格子集的组合宽度

答案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}

在此处输入图片描述

相关内容