我有一个包含很多列的表格,这些列占据了我页面布局中的大部分可用水平空间。我想在表格底部添加某种“注释”,它:
- 跨越整个表格的宽度,但不影响其宽度
- 包含换行的文本,可以自动换行(首选)或手动指定换行符
到目前为止,我已经能够尽量减少这个问题:
\documentclass{article}
\usepackage{multirow}
\begin{document}
\begin{tabular}{lcccc}
{} & {(baseline)} & {case 1} & {case 2} & {case 3}{$^\ast$} \\
\hline
var 1 & 327 & 621 & 0.315 & 1189 \\
var 2 & 1604 & 1395 & -0.224 & 1395 \\
\hline
\multicolumn{5}{l}{\footnotesize$^\ast$some explanation on what this means which did \newline not fit into the cell, or in the table width}
\end{tabular}
\end{document}
得出以下结论:
正如您所看到的,\newline
很高兴被忽略(注意缺少的空格),并且最后一列被拉伸以容纳文本。
我见过一条建议将对齐方式更改为p{<some_width>}
。如果我这样做,它确实会遵循\newline
,但它会还在文本上强加我输入的任何宽度,除非我“正确”地猜测,否则它会拉伸表格或过早地换行。
我当然可以反复调整我为最后一列指定的宽度,但这很繁琐,而且我几乎确信有更好的方法来实现下面的图片,而不是一毫米一毫米地将宽度参数更改为不影响表格宽度的最大值:
=> 我该如何做?
如果相关的话:我的全尺寸表格也使用siunitx
和booktabs
进行格式化,也许它们会有所帮助。我在这里删除了它们以最小化 MWE。
我确实尝试过\multirow
在底部添加单元格,但这只会增加底部单元格的高度并使同一行文本垂直居中。
我会满足于只要有一些东西允许我使用\newline
而无需指定单元格宽度,当然自动换行到“表格已有的宽度”当然是更好的选择。
同样令人感兴趣的是:为什么\newline
只有在单元格宽度为还明确给出?这对我来说毫无意义...我认为它的主要用例是指定换行符为了允许更窄的列,然后让单元格宽度适应新的行长。或者它可能与 冲突multirow
?
编辑:更多对我来说没什么用的事情:
我可以在表格下方放置两个单元格,并在每个单元格中放置部分文本,但这样行距就会变得混乱(其中一个单元格在一个单元格中换行,另一个单元格有两个,您能分辨出哪个是哪个吗?):
答案1
我建议你看看三部分表包、其用户环境(称为threeparttable
和tablenotes
)及其用户宏\tnote
可以为您完成。重要的是,环境的宽度tablenotes
设置为关联tabular
环境的宽度——无需任何\newline
指令。
\documentclass{article}
\usepackage{booktabs,siunitx}
\newcolumntype{T}{S[table-format=4.0]} % for 3 of the 4 data columns
\usepackage[flushleft]{threeparttable}
\begin{document}
\begin{center}
\begin{threeparttable}
\begin{tabular}{@{} l T T S[table-format=-1.3] T }
\toprule
& {(baseline)} & {case 1\tnote{$\dagger$}} & {case 2} & {case 3\tnote{*}} \\
\midrule
var 1 & 327 & 621 & 0.315 & 1189 \\
var 2 & 1604 & 1395 & -0.224 & 1395 \\
\bottomrule
\end{tabular}
\smallskip
\footnotesize
\begin{tablenotes}
\item[$\dagger$] Some explanation of what this means which did not fit into the cell, but it fits below the table.
\item[*]Some explanation of what this means which did not fit into the cell, but it fits below the table.
\end{tablenotes}
\end{threeparttable}
\end{center}
\end{document}
附录:原帖作者要求我提供以下两点。
环境
threeparttable
最多包含 3 个正式元素:(a)tabular
类似环境;(b)\caption
指令;(c)tablenotes
环境。该threeparttable
机制将标题和表格注释材料的宽度限制为tabular
类似环境的宽度。threeparttable
要在环境中使用环境table
,应按如下方式修改上述代码:应更改\begin{center} \begin{threeparttable} \begin{tabular}{...} ... \end{tabular} \smallskip\footnotesize \begin{tablenotes} ... \end{tablenotes} \end{threeparttable} \end{center}
到
\begin{table} \centering % note: '\centering', not '\begin{center}' \begin{threeparttable} \caption{...} % <-- new \begin{tabular}{...} ... \end{tabular} \smallskip\footnotesize \begin{tablenotes} ... \end{tablenotes} \end{threeparttable} \end{table}
答案2
由于 Mico 不喜欢我在他的回答中添加更多细节,因此我将其发布在这里:
threeparttable
不是浮动环境,其“三个部分”是表格、注释和标题。因此,在使用table
浮动环境时,threeparttable
只需将 包裹在tabular
、注释和(可选,见下文)标题周围,如下所示:
\begin{table}
\centering
%any other setup, e.g. `\sisetup` when using `siunitx`
\begin{threeparttable}
\begin{tabular}
% ... the actual table, including `\tnote{}` tags
\end{tabular}
\footnotesize % optional, of course, otherwise notes have same text size as table content
\begin{tablenotes}
% explanations for the `\tnote{}` tags
\end{tablenotes}
\caption{the caption for the table}
\end{threeparttable}
\label{tab:tpt_example}
\end{table}
虽然包装文档指出标题应位于 内threeparttable
,我发现内部和外部都可以,并且都有用例:
table
将其保留在里面将导致标题具有与表格相同的宽度,但其他方面与普通标题相同。- 将其移到环境后面或前面
threeparttable
会导致其宽度与浮动环境相匹配table
。在某些情况下,这可能很有用,特别是对于较窄的表格,当标题包含更多文本并且左右有足够的空间时。
答案3
该软件包nicematrix
提供了一个{NiceTabular}
具有自己的命令的环境\tabularnote
来解决这种情况。
\documentclass{article}
\usepackage{enumitem}
\usepackage{nicematrix}
\usepackage{booktabs}
\begin{document}
\begin{table}
\centering
\begin{NiceTabular}{lcccc}
\toprule
& (baseline) & case 1 & case 2 & case 3\tabularnote{some explanation on what this means which did not fit into
the cell, or in the table width} \\
\midrule
var 1 & 327 & 621 & 0.315 & 1189 \\
var 2 & 1604 & 1395 & -0.224 & 1395 \\
\bottomrule
\end{NiceTabular}
\end{table}
\end{document}
您需要多次编译。