大页面中 tabularx 的 \hbox 过满(***pt 太宽)

大页面中 tabularx 的 \hbox 过满(***pt 太宽)

最近我想在一个页面上创建一个包含许多列的大型表格。为了简化问题,我有一个最小工作示例,如下所示:

\documentclass{article}
\usepackage[paperheight=20.1cm, paperwidth=60cm]{geometry}
\usepackage{tabularx}
\begin{document}
\begin{table}[h]
\centering
\begin{tabularx}{\linewidth}{XXXXXXXXXXXXX}
a&a&a&a&a&a&a&a&a&a&a&a&a
\end{tabularx}
\end{table}
\end{document}

当我编译此 tex 文件时,我Overfull \hbox (5.00002pt too wide) in paragraph at lines**多次收到警告。并且输出不是我预期的: 输出 PDF 文件 但是,当我将 改为 时XXXXXXXXXXXXXp{3cm}p{3cm}p{3cm}p{3cm}p{3cm}p{3cm}p{3cm}p{3cm}p{3cm}p{3cm}p{3cm}p{3cm}p{3cm}一切又恢复正常。似乎列的宽度X没有正确确定。你能解释一下为什么会发生这种情况吗?

答案1

正如问题下的评论中所述,tabularx如果您使用,它会给出提示。debugshow 在这种情况下,它会进行特定测试以防止某些内部计算超出范围\maxdimen并产生错误和虚假结果。但在这种情况下,它过于谨慎,在没有必要的情况下后退。如果您只是删除测试,它会做正确的事情。

这里可能还有改进的空间,但这适用于您的测试文件

\documentclass{article}
\usepackage[paperheight=20.1cm, paperwidth=60cm]{geometry}
\usepackage[debugshow]{tabularx}

\makeatletter
\def\TX@arith{%
  \TX@false
  \@tempdimb\maxdimen
  \divide\@tempdimb\TX@cols
%  \ifdim\TX@col@width>\@tempdimb
%    \TX@typeout@{Don't exceed \maxdimen}%
%    \wd\@tempboxa\maxdimen
%  \fi
  \ifdim\TX@old@table=\wd\@tempboxa
    \TX@col@width\TX@old@col
    \TX@typeout@{Reached minimum width, backing up.}%
  \else
    \dimen@\wd\@tempboxa
    \advance\dimen@ -\TX@target
    \ifdim\dimen@<\TX@delta
      \TX@typeout@{Reached target.}%
    \else
      \ifnum\TX@cols>\@ne
        \advance\TX@cols\m@ne
      \fi
      \divide\dimen@\TX@cols
      \advance\dimen@ -\TX@col@width
      \ifdim \dimen@ >\z@
        \PackageWarning{tabularx}%
           {X Columns too narrow (table too wide)\MessageBreak}%
        \TX@col@width\TX@error@width\relax
      \else
        \TX@old@col\TX@col@width
        \TX@old@table\wd\@tempboxa
        \TX@col@width-\dimen@
        \TX@true
      \fi
    \fi
  \fi}
\makeatother
\begin{document}
\begin{table}[h]
\centering
X\dotfill X

\setlength\tabcolsep{3pt}
\begin{tabularx}{\linewidth}{XXXXXXXXXXXXX}
a&a&a&a&a&a&a&a&a&a&a&a&a
\end{tabularx}
\end{table}
\end{document}

在此处输入图片描述

答案2

显然,您需要至少 215pt 的线宽,这可能是因为您希望某些内容位于 13 列中。此操作没有任何错误:

\documentclass{article}%
\usepackage[paperheight=20.1cm, paperwidth=60cm]{geometry}%
\usepackage{tabularx}%
\begin{document}%
\begin{table}[h]%
\centering%
\begin{tabularx}{215pt}{XXXXXXXXXXXXX}%The maximum without a mistake is exactly {1170pt}. I cannot tell why.
a&a&a&a&a&a&a&a&a&a&a&a&a%
\end{tabularx}%
\end{table}%
\end{document}%

@Steven 提出的观点表明表格内有边距,并且 13 列太多,因为这也是可行的,有 12 列,并且附加了输出。

\documentclass{article}%
\usepackage[paperheight=20.1cm, paperwidth=60cm{geometry}%
\usepackage{tabularx}%
\begin{document}%
\begin{table}[h]%
\centering%
\begin{tabularx}{\linewidth}{XXXXXXXXXXXX}%
a&a&a&a&a&a&a&a&a&a&a&a%
\end{tabularx}%
\end{table}%
\end{document}%

屏幕截图 12 列

相关内容