在我们的软件中,我们有一个模块,它通过 Latex 生成 PDF。其中一些包含表格,我希望它们横跨整个页面。由于列数各不相同,我使用tabularx
与所有X
列一起使用,它可以完成工作。
然而,在极少数情况下,如果表格包含许多列(似乎 19 是阈值),则它们最终会出现格式错误。
这可以:
\begin{tabularx}{\textwidth}{|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|}
0 & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10 & 11 & 12 & 13 & 14 & 15 & 16 & 17 & 18 \\
\end{tabularx}
输出(如预期):
如果我再添加一列,它就会中断:
\begin{tabularx}{\textwidth}{|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|}
0 & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10 & 11 & 12 & 13 & 14 & 15 & 16 & 17 & 18 & 19\\
\end{tabularx}
输出:
我可以解决这个问题,方法是在第 18 列左右之后使用p{1cm}
而不是X
。由于表格已经很大,因此不会过多扭曲布局。但我仍然想了解造成这种情况的原因以及是否存在其他解决方案。
答案1
只需一点数学运算,假设标准文本宽度为article
(345pt)、标准\tabcolsep
宽度为 (6pt) 和标准规则宽度为 (0.4pt)。
对于 19 列,你必须计算 (345-38*6-20*0.4)/19 = 5.73684(四舍五入),因此X
列的宽度只有 5.73684pt,每个数字大约为 5pt。事实上,在这种情况下,我得到了
Overfull \hbox (4.26317pt too wide)
并且 10-5.73684=4.26316 (小数点后第五位数字偏差一位是正常的)。
因此,如果你想确保 20 列包含两位数的条目,你需要调整参数;你需要
20 * 10 + 20 * 2 *
\tabcolsep
+ 21 * 0.4
减少\tabcolsep
到 3pt,即 328.4pt,适合:
\documentclass{article}
\usepackage{tabularx}
\begin{document}
\setlength{\tabcolsep}{3pt}
\noindent
\begin{tabularx}{\textwidth}{|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|}
0 & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10 & 11 & 12 & 13 & 14 & 15 & 16 & 17 & 18 & 19\\
\end{tabularx}
\end{document}
编译时没有任何警告。