在 booktabs 表格中指定换行符而不指定单元格宽度

在 booktabs 表格中指定换行符而不指定单元格宽度

我有一个包含很多列的表格,这些列占据了我页面布局中的大部分可用水平空间。我想在表格底部添加某种“注释”,它:

  • 跨越整个表格的宽度,但不影响其宽度
  • 包含换行的文本,可以自动换行(首选)或手动指定换行符

到目前为止,我已经能够尽量减少这个问题:

\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} 

得出以下结论:

表格有 5 列,底部有一些文本。最后一列被拉伸以容纳文本,并且在代码指定 \newline 命令的地方缺少一个空格

正如您所看到的,\newline很高兴被忽略(注意缺少的空格),并且最后一列被拉伸以容纳文本。

我见过一条建议将对齐方式更改为p{<some_width>}。如果我这样做,它确实会遵循\newline,但它会在文本上强加我输入的任何宽度,除非我“正确”地猜测,否则它会拉伸表格或过早地换行。

我当然可以反复调整我为最后一列指定的宽度,但这很繁琐,而且我几乎确信有更好的方法来实现下面的图片,而不是一毫米一毫米地将宽度参数更改为不影响表格宽度的最大值:

底部的文本现在会换行到应换行的位置,如果文本不存在,则换行宽度与表格的宽度相同

=> 我该如何做?

如果相关的话:我的全尺寸表格也使用siunitxbooktabs进行格式化,也许它们会有所帮助。我在这里删除了它们以最小化 MWE。

我确实尝试过\multirow在底部添加单元格,但这只会增加底部单元格的高度并使同一行文本垂直居中。

我会满足于只要有一些东西允许我使用\newline而无需指定单元格宽度,当然自动换行到“表格已有的宽度”当然是更好的选择。

同样令人感兴趣的是:为什么\newline只有在单元格宽度为明确给出?这对我来说毫无意义...我认为它的主要用例是指定换行符为了允许更窄的列,然后让单元格宽度适应新的行长。或者它可能与 冲突multirow

编辑:更多对我来说没什么用的事情:

我可以在表格下方放置两个单元格,并在每个单元格中放置部分文本,但这样行距就会变得混乱(其中一个单元格在一个单元格中换行,另一个单元格有两个,您能分辨出哪个是哪个吗?): 两个几乎完全相同的表格并排摆放。左侧表格有两个单元格用于“脚注”,每个单元格中有一行文本,而另一个表格有一个单元格用于包装注释。左侧表格的注释行距非常大,非常尴尬。

答案1

我建议你看看三部分表包、其用户环境(称为threeparttabletablenotes)及其用户宏\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} 

您需要多次编译。

上述代码的输出

相关内容