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

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

我希望多列中文本的 parbox 宽度能够根据多列所跨单元格的总宽度自动计算。(它们的宽度在表格的不同副本中会有所不同。)有办法吗?

详情如下:我的五列表格中有一行包含一个多列,横跨四列。我希望该多列中的文本能够正确换行,但我不想指定实际的数字宽度。相反,我希望宽度由上一行中第 2-5 列的实际总宽度决定。我以这种方式编写了表格的基本代码(为便于说明,已简化),使用暂定的数字宽度“2in”:

\begin{tabular}{c|c|c|c|c|} \cline{2-5}
{\bf A} & first & second & third & fourth, of variable length \\ \cline{2-5}
& \multicolumn{4}{|c|}{\parbox{2in}{fifth, also of highly variable length but
   long enough to need to wrap.}} \\ \cline{2-5}
\end{tabular}

我使用了 parbox,因为多列的内容包含我想作为一个单元处理的图像和文本,但为了让图片简单,我在这里省略了这些细节。结果看起来符合我的要求,只是多列的内容在左右两侧留出了太多空间,因为我手动设置的宽度设置不当。

要点:如何避免手动设置 parbox 宽度,而是根据其他列的宽度来计算?

[这个问题之前发布在 stackoverflow 上,但我被敦促在此网站上再次提问。感谢您的耐心。]


编辑) Martin Scharrer 的代码如下,它为我带来了一个有趣的问题:\colwidth 似乎只变得和第一个测量列一样大。我发现这只发生在我使用 XeLaTeX 中中文所需的某些包时:

\usepackage{xeCJK}
\usepackage{fontspec,xltxtra,xunicode}

输出变为:

列不工作

答案1

lrbox您可以使用环境将列捕获到一个框中,然后测量并累积它们的宽度(以及之间的列间距),从而测量列的宽度。

使用在包帮助下定义的特殊列类型array实际上使得在表格中处理起来非常容易。

\documentclass{article}

\usepackage{array}
\newlength{\mycolwidth}
% First column (re-)sets to width.
\newcolumntype{F}{>{\global\mycolwidth=-\tabcolsep\addmycolwidth}c<{\endaddmycolwidth}}
% All other to be measured cells have type `C` which uses `c` internally:
\newcolumntype{C}{>{\addmycolwidth}c<{\endaddmycolwidth}}
% The `P` type then uses the saved width:
\newcolumntype{P}{p{\mycolwidth}}

\newsavebox{\mycolwidthbox}% box to save cells in
\newenvironment{addmycolwidth}{%
   \begin{lrbox}{\mycolwidthbox}%% catch cell content into a box
}{%
   \end{lrbox}%
   \usebox{\mycolwidthbox}%% place cell content back
   % Add width and column sep: (globally because this code is still executed inside the cell which acts like a group)
   \global\advance\mycolwidth by \wd\mycolwidthbox
   \global\advance\mycolwidth by \tabcolsep
}

\begin{document}
\begin{tabular}{c|F|C|C|C|} \cline{2-5}
\textbf{A} & first & second & third & fourth, of variable length \\ \cline{2-5}
& \multicolumn{4}{P|}{fifth, also of highly variable length but
   long enough to need to wrap.} \\ \cline{2-5}
\end{tabular}

\begin{tabular}{c|F|C|C|C|} \cline{2-5}
\textbf{B} & first & second & third & fourth, of much much longer length \\ \cline{2-5}
&  \multicolumn{4}{P|}{fifth, also of highly variable length but
   long enough to need to wrap.} \\ \cline{2-5}
\end{tabular}
\end{document}

结果:

结果表

答案2

\documentclass{article}
\newsavebox\TBox \newlength\TWidth
\def\Tab#1{%
\sbox\TBox{\tabular{@{}c|c|c|c@{}}#1\endtabular}
  \usebox\TBox
  \global\TWidth=\wd\TBox\global\advance\TWidth by -\tabcolsep}  
\begin{document}

\begin{tabular}{c|c|} \cline{2-2}
\bf A & \Tab{first & second & third & fourth, of variable length}\\ \cline{2-2}
      & \parbox{\TWidth}{fifth, also of highly variable length but
                        long enough to need to wrap.}\\ \cline{2-2}
\end{tabular}

\end{document}

在此处输入图片描述

相关内容