如何根据合并列的总宽度自动计算表格中多列的宽度

如何根据合并列的总宽度自动计算表格中多列的宽度

假设我有一张包含两个l类型列的表格,这两个列都包含相当短的文本。在下面的一行中,我想使用一个\multicolumn合并两个列的行。我希望它自动与上面提到的两个列一样宽。

我可以使用来实现这一点\multicolumn{2}{p{<width>}},并直观地估计所需的。从以下示例中可以看出,这不是很准确:

在此处输入图片描述

\documentclass{article}
\usepackage{lipsum}
\begin{document}

\begin{tabular}{|ll|}
Some text & some more text \\ \hline
\multicolumn{2}{|p{4.2cm}|}{\lipsum[4]}\\
\end{tabular}
\end{document}

为了获得更好的结果,我可以使用包\widthof中的命令calc来测量两列中最宽条目的宽度,并据此计算多列所需的宽度。

\documentclass{article}
\usepackage{lipsum}
\usepackage{calc}
\begin{document}
\begin{tabular}{|ll|}
Some text & some more text \\ 
text      & a significantly longer line of text\\ \hline
\multicolumn{2}{|p{\widthof{Some text}+\widthof{a significantly longer line of text}+2\tabcolsep}|}{\lipsum[4]}\\
\end{tabular}
\end{document} 

在此处输入图片描述

但是,这需要手动确定最宽的条目并在表中输入两次(一次在列中,一次在命令中\widthof),这使得这种方法容易出错并且不太灵活。

我知道这个tabularx包能够以某种方式自动计算使表格宽度达到指定长度所需的宽度,我想知道是否存在比上面描述的解决方案更自动化的解决方案。

答案1

这是原理证明,所有概念工作均由 David Carlisle 完成。这个答案。您需要运行两次。我相信一些 TeX 大师可以编写更好的代码,但这表明它是可行的。

\documentclass{article}
\usepackage{array}
\usepackage{lipsum}
\newlength{\cwidth}
\makeatletter% https://tex.stackexchange.com/a/152842/121799
\protected\def\z#1{\pdfsavepos\write\@auxout{\gdef\string\tpos#1{\the\pdflastxpos}}}%
\def\foo#1#2{\ifcsname tpos#1\endcsname\the\dimexpr\csname tpos#2\endcsname sp -\dimexpr\csname tpos#1\endcsname sp\relax\fi}
\makeatother

\begin{document}
\edef\numA{\foo{a}{c}}
\ifx\numA\empty
\typeout{rerun}
\else
\cwidth=\numA
\advance\cwidth by-2\tabcolsep
\fi

\begin{tabular}{|!{\z{a}}l!{\z{b}}l!{\z{c}}|}
some text & some more text \\ 
text      & a significantly longer line of text\\
\hline
\multicolumn{2}{|p{\cwidth}|}{\lipsum[1]}\\
\end{tabular}
\end{document}

在此处输入图片描述

答案2

tblr使用LaTeX3 包中的环境很容易tabularray

\documentclass{article}
\usepackage{tabularray}
\usepackage{lipsum}
\begin{document}
\SetTblrInner{hspan=minimal}
\begin{tblr}{|l|l|}
\hline
 Some text & some more text \\
\hline
 \SetCell[c=2]{l} \lipsum[4] & \\
\hline
\end{tblr}
\end{document}

在此处输入图片描述

答案3

仅使用一列并手动拆分第一行将避免此问题:

\documentclass{article}
\usepackage{lipsum}
\begin{document}

\begin{tabular}{|p{4.5cm}|}
\begin{tabular}{@{}ll@{}}
Some text & some more text\\
\end{tabular}\\
\hline
\lipsum[4]\\
\end{tabular}
\end{document}

相关内容