将多列宽度设置为默认表格宽度

将多列宽度设置为默认表格宽度

我有一张两列的表格,其中有一列multicolumn横跨两列。上面的文本multicolumn相当长,所以我需要设置它的宽度,以便它能环绕四周。我可以用设置宽度,\multicolumn{2}{p{whatever}}{text}但我应该将“whatever”设置为多少呢?表格的实际宽度是多少?是否有一个变量保存该值?

我最初想到的是使用\textwidth,但事实并非如此。在草稿模式下构建文档显示它有点偏离。下表应该显示了我的问题。在草稿模式下,其侧面会显示一个黑框。

\begin{tabular}{l l}
  \toprule
  \multicolumn{2}{p{\textwidth}}{\lipsum[1]} \\
  \bottomrule
\end{tabular}

我确实有更多行,我只是让示例保持简单。我使用的是memoir文档类。里面的实际文本multicolumn使用的是seqsplit包。

编辑:我应该更具体一点地回答这个问题。唯一会导致表格超出限制的行是我也试图限制的行。我说的限制是为了让我不会收到过满警告。

所以我的问题可以更好地表述为如何找到桌子的可用空间以使其不会过满?

答案1

可用空间是p{\dimexpr\textwidth-2\tabcolsep\relax}由于 LaTeX 应用了列填充,假设您有\noindent\begin{tabular},否则表格本身将会偏移\parindent

但是,如果跨度比它所跨的列宽,TeX 会将所有多余的宽度放入最后一列。如果这是个问题,请编辑您的示例,使其成为一个完整的(小)文档,以显示问题。

答案2

了解列条目(特别是最宽的元素)可以让您准确计算宽度\multicolumn

\documentclass{article}
\usepackage{booktabs,calc,lipsum}% http://ctan.org/pkg/{booktabs,calc,lipsum}
\begin{document}
\begin{tabular}{l l}
  \toprule
  Some text & Some more text \\
  Short & Very super super long \\
  Longer than others & Shrt \\
  \multicolumn
    {2}
    {p{\widthof{Longer than others}+\widthof{Very super super long}+2\tabcolsep}}
    {\lipsum[1]} \\
  \bottomrule
\end{tabular}
\end{document}

calc提供\widthof{<stuff>}返回自然宽度<stuff>。每列都填充两个都双方\tabcolsep

答案3

除非所有列都指定了明确的宽度(pcolumns),否则在整个表格排版完成之前,表格的总宽度是无法获得的。TeX 仅在将整个表格加载到内存中后才选择列宽,因此这会使解决问题变得相当困难,因为必须指定文本宽度才能排版段落。

对于这个特定问题,全部列必须跨越,有一个自动解决方案:首先排版表格,忽略跨越列的段落以获取宽度,然后重新排版。

第一个参数\multipar是必要的,因为环境内没有列的总数tabular

\documentclass{article}
\usepackage{booktabs,lipsum}
\usepackage{environ}
\newsavebox{\funnytabularbox}
\newlength{\funnytabularwd}

\makeatletter
\NewEnviron{funnytabular}[1]
  {\begin{lrbox}{\funnytabularbox}
   \let\multipar\@gobbletwo
   \begin{tabular}{#1}\BODY\end{tabular}
   \end{lrbox}%
   \setlength{\funnytabularwd}{\wd\funnytabularbox}%
   \addtolength{\funnytabularwd}{-2\tabcolsep}%
   \let\multipar\@multipar
   \begin{tabular}{#1}\BODY\end{tabular}}

\newcommand\@multipar[2]{\multicolumn{#1}{p{\funnytabularwd}}{#2}}
\makeatother

\begin{document}
\begin{funnytabular}{l l}
  \toprule
  Some text & Some more text \\
  \midrule
  Short & Very super super long \\
  \midrule
  Longer than others & Shrt \\
 \midrule
  \multipar{2}{\lipsum*[1]} \\
  \bottomrule
\end{funnytabular}
\end{document}

在此处输入图片描述

答案4

我使用了下面的方法,这可能会对您的情况有所帮助(我需要多列宽度\multirow):

\usepackage{tabularx}
\usepackage{multirow}
...
\begin{tabularx}{\textwidth}{|*{9}{>{\centering\arraybackslash}X|}}
\hline
start
    & \multicolumn{7}{X}{\multirow{3}{\dimexpr(\hsize+2\tabcolsep)*7-2\tabcolsep\relax}{%
      Hello, this can be a long paragraph.}
    & \\
& & \\
& & end\\\hline
\end{tabularx}

神奇之处在于知道\hsize和的值,并通过 e-Tex 命令\tabcolsep进行计算。\dimexpr

相关内容