Tabularx 和 \hsize 列调整

Tabularx 和 \hsize 列调整

在这个答案中:具有多行和多列的 Tabularx 表,我发现了\hsize调整表格X列宽的可能性tabularx

文档说明:

确保所有 X 列的宽度总和保持不变。

但答案是:

\begin{tabularx}{\textwidth}{|>{\hsize=0.5\hsize}X|
                    *{3}{ >{\hsize=1.5\hsize}X|}
                        }

这使得 4 列的总和为 5,如果没有填充足够的列,就会导致问题。

问题 :

  • 为什么它在示例中有效,而在以下示例中无效?

  • 计算\hsizes 的正确方法是什么?

在此处输入图片描述

\documentclass{article}
\usepackage{tabularx}
\begin{document}
\begin{table}

\begin{tabularx}{\linewidth}{|>{\hsize=0.5\hsize}X|
                        *{3}{ >{\hsize=1.5\hsize}X|}
                            }\hline
1&2&3&4\\\hline
\end{tabularx}

\bigskip

% My proposition if correctly understood the manuel
\begin{tabularx}{\linewidth}{|>{\hsize=0.5\hsize}X|
                        *{3}{ >{\hsize=1.16667\hsize}X|}
                            }\hline
1&2&3&4\\\hline
\end{tabularx}
\end{table}
\end{document}

答案1

看起来您需要三列等宽的列(我们将其宽度表示为x),加上另一列,其宽度是其他三列的三分之一;将其宽度表示为y。四列的总宽度应等于\linewidth

计算是重心坐标的计算:您必须求解线性系统:

3x + y = 4 % 4: number of columns of type "X"
x = 3y

很容易找到这将产生y=0.4x=1.2,因此代码:

\documentclass{article}
\usepackage{tabularx}
%% define a custom col. type to simplify expressing relative col. widths
\newcolumntype{H}[1]{>{\hsize=#1\hsize\arraybackslash}X}

\begin{document}

\begin{table}
\begin{tabularx}{\linewidth}{| H{0.4} | *{3}{H{1.2}|} } % 0.4+3*1.2=4
\hline
1&2&3&4\\
\hline
\end{tabularx}
\end{table}

\end{document} 

在此处输入图片描述

答案2

Bernard 的回答展示了如何在遵循文档中的规则的同时设置值tabularx,但要回答你关于在表格中不遵循规则会发生什么的问题。

在此处输入图片描述

首先请注意,正如所发布的,跨越列条目中存在一个小错误,它们的宽度没有居中。

计算的意图是宽度是自然宽度的两倍加上对列周围的空间和规则的调整,但是跨越的列已经应用了 1.5 倍乘数,因此跨越列不需要加上3\hsize2\hsize 列填充的调整。请参见示例中的第二个表格:

\documentclass{article}
\usepackage{tabularx}

\tracingtabularx
\begin{document}
\begin{table}

\begin{tabularx}{\linewidth}{@{\extracolsep{0pt}}|>{\hsize=0.5\hsize}X|
                         *{3}{>{\hsize=1.5\hsize}X|}
                            }\hline
1\dotfill X&
\multicolumn{2}{>{\hsize=\dimexpr2\hsize+2\tabcolsep+\arrayrulewidth\relax}X|}{text\dotfill X}&
4\dotfill X\\\hline
1\dotfill X&2\dotfill X&3\dotfill X&4\dotfill X\\\hline
\end{tabularx}

\bigskip

\begin{tabularx}{\linewidth}{@{\extracolsep{0pt}}|>{\hsize=0.5\hsize}X|
                         *{3}{>{\hsize=1.5\hsize}X|}
                            }\hline
1\dotfill X&
\multicolumn{2}{>{\hsize=\dimexpr3\hsize+2\tabcolsep+\arrayrulewidth\relax}X|}{text\dotfill X}&
4\dotfill X\\\hline
1\dotfill X&2\dotfill X&3\dotfill X&4\dotfill X\\\hline
\end{tabularx}


\end{table}
\end{document}

那么为什么第二个表可以工作,因为它不遵循任何一条tabularx规则

  • 确保所有 {\ttfamily X} 列的宽度总和保持不变。(在上面的例子中,新宽度的总和仍为默认宽度的两倍,与两个标准 {\ttfamily X} 列的宽度相同。)

  • 不要使用跨越任何 {\ttfamily X} 列的“\multicolumn”条目。

tabularx 文档中暗示了原因,它遵循了这些规则,并提供了有用的进一步文档

与大多数规则一样,如果您知道自己在做什么,就可以打破这些规则。

这里发生的本质情况是,最初猜测的宽度太窄,因为tabularx预计有 5 列,但tabularx寻找正确宽度的标准迭代试验会减少X每次试验的有效列数(考虑到X\multicolumn{c}标题“隐藏”的列,因此不会影响总表宽)。因此,事实证明,除了导致一次额外的试验迭代之外,tabularx最终结果是正确宽度的表格。但请注意,如果没有multicolumn最初的错误起点,它将tabularx进入一条路径,该路径永远不会收敛到给出正确表格的解决方案:

在此处输入图片描述

\documentclass{article}
\usepackage{tabularx}

\tracingtabularx
\begin{document}
\begin{table}

\begin{tabularx}{\linewidth}{@{\extracolsep{0pt}}|>{\hsize=0.5\hsize}X|
                         *{3}{>{\hsize=1.5\hsize}X|}
                            }\hline
1\dotfill X&
?&?&
4\dotfill X\\\hline
1\dotfill X&2\dotfill X&3\dotfill X&4\dotfill X\\\hline
\end{tabularx}



\end{table}
\end{document}

所以也许

与大多数规则一样,如果您知道自己在做什么,就可以打破这些规则。

或许可以表述为

与大多数规则一样,如果你幸运的话,这些规则可能会被打破。

相关内容