经过几个小时的调查,我可以将我遇到的问题范围缩小到表格\multicolumn
以及它对和的\hspace
作用\linewidth
。
正如下面的 MWE 中所示,在普通单元格中,和都\hspace
给出\linewidth
了单元格的宽度(如果需要\tabcolsep
,我可以处理arrayrulesep
)。我会使用这个宽度在单元格中放置一个小页面或类似的东西。
问题是将这\multicolumn
两个尺寸重置为整个文本宽度。
无论如何,有没有办法检索正确的值?
注意 1:array
或booktabs
包对于这个问题没有任何帮助。
[编辑]
在我看来这似乎是一个错误,但正如@david-carisle在评论中指出的那样,多列是一l
列,然后是\mbox
,而不是\parbox
,所以没有本地\linewidth
。
整个用例涉及通过 Pandoc 生成的文档和自定义 Lua 过滤器,因此我将坚持使用longtable
环境。我知道我可以在过滤器中做一些计算,但实际用例比这个 MWE 复杂得多。这会使 lua 过滤器非常复杂。
我还编辑了 MWE,因此表格不会太宽。 [/编辑]
\documentclass[]{article}
\usepackage{longtable}
%\usepackage{array}
%\usepackage{booktabs}
\usepackage{calc}
\begin{document}
\setlength\LTleft{0pt}
\setlength\LTright\fill
linewidth=\the\linewidth
\footnotesize
\begin{longtable}[]{
p{\columnwidth) / 4}
p{\columnwidth) / 4}
p{\columnwidth) / 9}
p{\columnwidth) / 4}}
\hline
A & B & C & D \\
\hline
linewidth=\the\linewidth & \multicolumn{2}{l}{linewidth=\the\linewidth}& linewidth=\the\linewidth \\
hsize=\the\hsize & \multicolumn{2}{l}{hsize=\the\hsize}& hsize=\the\hsize \\
textwidth=\the\textwidth & \multicolumn{2}{l}{textwidth=\the\textwidth}& textwidth=\the\textwidth \\
columnwidth=\the\columnwidth & \multicolumn{2}{l}{columnwidth=\the\columnwidth}& columnwidth=\the\columnwidth \\
\hline
\end{longtable}
\end{document}
答案1
我认为您的目标是将longtable
环境的整体宽度设置为\textwidth
。(补充:由于您正在创建单列文档,\textwidth=\columnwidth
。)如果是这种情况,则设置 会立即出错可用的四列中每列的宽度为。\textwidth/4
这导致 longtable 的整体宽度超出;如果(文档类的默认值),超出部分等于。\textwidth
8\tabcolsep
\tabcolsep=6pt
article
8\tabcolsep=48pt\approx 0.664in=16.9mm
正如 @DavidCarlisle 在评论中指出的那样,您可以通过将可用列宽设置为 来修复计算,从而\textwidth/4-2\tabcolsep
写入\begin{longtable}{ *{4}{p{\dimexpr\textwidth/4-2\tabcolsep\relax}}}
。或者,您可以从 切换longtable
到板状的框架并书写\begin{xltabular}{\textwidth}{ XXXX }
。
\documentclass{article}
\usepackage{xltabular,ragged2e,booktabs}
\newcolumntype{L}{>{\RaggedRight}X} % suspend full justfication
\usepackage{lipsum} % filler text
\begin{document}
\begin{xltabular}{\textwidth}{ LLLL }
\toprule
\lipsum[1][1-3] & \lipsum[2][1-3] & \lipsum[3][1-4] & \lipsum[4][1-4] \\
\bottomrule
\end{xltabular}
\end{document}
答案2
看来(如果我正确理解了你的问题的话),这longtable
不是你想要得到的正确工具。相反,它尝试使用longtblr
包tabularray
并使用X
列类型:
\documentclass{article}
\usepackage{tabularray}
\usepackage{calc}
\usepackage{lipsum}
\begin{document}
\footnotesize
\begin{longtblr}{colspec = {X[l] X[l] X[0.444, l] X[l]},
cell{2-Z}{2} = {c=2}{},
hspan=minimal}
\hline
A & B & C & D \\
\hline
linewidth=\the\linewidth
& linewidth=\the\linewidth
& & linewidth=\the\linewidth \\
hsize=\the\hsize
& hsize=\the\hsize
& & hsize=\the\hsize \\
textwidth=\the\textwidth
& textwidth=\the\textwidth
& & textwidth=\the\textwidth \\
columnwidth=\the\columnwidth
& columnwidth=\the\columnwidth
& & columnwidth=\the\columnwidth \\
\hline
\lipsum[2][1-2]
& \lipsum[2][1-2]
& & \lipsum[2][1-2] \\
\hline
\end{longtblr}
\end{document}
答案3
似乎没有自动魔术解决方案来保持\linewidth
或\hsize
等于多列单元格中的可用宽度。因此答案是使用“p 列”并自行进行计算。
巧合的是,Pandoc 在 LaTeX 表中生成多单元格时刚刚切换到 p 列。
我的 MWE 是:
\documentclass[]{article}
\usepackage{longtable}
%\usepackage{array}
%\usepackage{booktabs}
\usepackage{calc}
\begin{document}
\setlength\LTleft{0pt}
\setlength\LTright\fill
linewidth=\the\linewidth
\footnotesize
\begin{longtable}[]{
p{\columnwidth / 4}
p{\columnwidth / 4}
p{\columnwidth / 9}
p{\columnwidth / 4}}
\hline
A & B & C & D \\
\hline
linewidth=\the\linewidth & \multicolumn{2}{p{13\columnwidth / 36 +2\tabcolsep}}{linewidth=\the\linewidth}& linewidth=\the\linewidth \\
hsize=\the\hsize & \multicolumn{2}{p{13\columnwidth / 36 +2\tabcolsep}}{hsize=\the\hsize}& hsize=\the\hsize \\
textwidth=\the\textwidth & \multicolumn{2}{p{13\columnwidth / 36 +2\tabcolsep}}{textwidth=\the\textwidth}& textwidth=\the\textwidth \\
columnwidth=\the\columnwidth & \multicolumn{2}{p{13\columnwidth / 36 +2\tabcolsep }}{columnwidth=\the\columnwidth}& columnwidth=\the\columnwidth \\
\hline
\end{longtable}
\end{document}