![如何根据合并列的总宽度自动计算表格中多列的宽度](https://linux22.com/image/398497/%E5%A6%82%E4%BD%95%E6%A0%B9%E6%8D%AE%E5%90%88%E5%B9%B6%E5%88%97%E7%9A%84%E6%80%BB%E5%AE%BD%E5%BA%A6%E8%87%AA%E5%8A%A8%E8%AE%A1%E7%AE%97%E8%A1%A8%E6%A0%BC%E4%B8%AD%E5%A4%9A%E5%88%97%E7%9A%84%E5%AE%BD%E5%BA%A6.png)
假设我有一张包含两个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}