长答案

长答案

使用该subcaption包将表格1并排放置时,如果将表格标题放在多于表格和子表格标题被放置在以下表格,如下例所示:

\documentclass{article}
\usepackage{booktabs,caption,subcaption}

\newcommand\exampletable{
  \begin{tabular}{ll}
    \toprule
    A & B\\
    \bottomrule
  \end{tabular}
}

\begin{document}

1) This looks OK:

\begin{table}[!h]
  \centering
  \begin{subtable}[t]{10em}
    \centering
    \exampletable
    \caption{Subcaption 1}
  \end{subtable}
  \begin{subtable}[t]{10em}
    \centering
    \exampletable
    \caption{Subcaption 2}
  \end{subtable}
  \caption{Main caption}
\end{table}

2) And this looks OK:

\begin{table}[!h]
  \caption{Main caption}
  \centering
  \begin{subtable}[t]{10em}
    \caption{Subcaption 1}
    \centering
    \exampletable
  \end{subtable}
  \begin{subtable}[t]{10em}
    \caption{Subcaption 2}
    \centering
    \exampletable
  \end{subtable}
\end{table}

3) Even this looks OK:

\begin{table}[!h]
  \centering
  \begin{subtable}[t]{10em}
    \caption{Subcaption 1}
    \centering
    \exampletable
  \end{subtable}
  \begin{subtable}[t]{10em}
    \caption{Subcaption 2}
    \centering
    \exampletable
  \end{subtable}
  \caption{Main caption}
\end{table}

4) But in this case, the spacing isn't nice:

\begin{table}[!h]
  \caption{Main caption}
  \centering
  \begin{subtable}[t]{10em}
    \centering
    \exampletable
    \caption{Subcaption 1}
  \end{subtable}
  \begin{subtable}[t]{10em}
    \centering
    \exampletable
    \caption{Subcaption 2}
  \end{subtable}
\end{table}

\end{document}

这会产生如下结果:

表 4 的表格和子表格标题之间的间距太小

表 4 是存在问题的情况。我更希望它看起来更像这样:

表 4 应如下所示

关于如何修复此问题,您有什么想法吗?理想情况下,我希望“自动”获得正确的间距,而无需在子表环境中插入显式 vspace 或任何类似内容。

1:同样适用于图形或其他类型的子浮点数。

答案1

约翰内斯·b为我指明了正确的方向,事实证明,使用\captionsetup[subtable]{position=auto}可以修复这四种情况下的间距。

长答案

经过一些实验,我发现\caption外部table环境的 以某种方式影响了\caption内部subtable环境的 使用。这导致我尝试将表包装\caption\begingroup-\endgroup对中以隔离任何副作用。在下面的 MWE 中,这是针对有问题的案例 4 完成的:

\documentclass{article}
\usepackage{booktabs,caption,subcaption,blindtext}
\captionsetup[subtable]{skip=20pt}

\newcommand\exampletable{
  \begin{tabular}{ll}
    \toprule
    A & B\\
    \bottomrule
  \end{tabular}
}

\begin{document}

A single line of text that shows the spacing between the text and the float.

\begin{table}[!h]
  \caption{Main caption}
  \centering
  \begin{subtable}[t]{10em}
    \centering
    \exampletable
    \caption{Subcaption 1}
  \end{subtable}
\end{table}

A single line of text that shows the spacing between the text and the float.

\begin{table}[!h]
  \begingroup
  \caption{Main caption}
  \endgroup
  \centering
  \begin{subtable}[t]{10em}
    \centering
    \exampletable
    \caption{Subcaption 1}
  \end{subtable}
\end{table}

A single line of text that shows the spacing between the text and the float.

\end{document}

结果证实了怀疑:

隔离组中的标题

上图中的表 2 对应于\caption在组内使用的情况。

在仔细研究caption源代码后,我们发现宏是在环境中\caption@position使用时设置的(除非全局覆盖,否则最初是未定义的),并且在环境中再次使用宏时会对其进行测试。换句话说,如果外部环境中的命令成功执行外部环境的命令,并且嵌套环境的标题位置尚未明确设置,则外部环境中的标题位置属性将覆盖嵌套环境中的标题位置。\captiontable\caption@iftop\captionsubtable\caption\caption

\caption@position为了证实这一点,我尝试重置表格标题后的值:

\begin{table}[!h]
  \caption{Main caption}
  \makeatletter
  \let\caption@position\@undefined
  \makeatother
  \centering
  \begin{subtable}[t]{10em}
    \centering
    \exampletable
    \caption{Subcaption 1}
  \end{subtable}
\end{table}

事实证明,这与将其包装\caption成一组有相同的效果。

请注意,上面的代码应该不是可以作为解决这个问题的方案!甚至 caption 包源代码也指出\caption@position不应依赖该宏。

那么为什么 position=auto 会起作用呢?

事实证明,使用将导致在输出子表标题之前\captionsetup[subtable]{position=auto}调用,并且参数将简单地执行,这正是我们想要的。\caption@setposition{auto}auto\let\caption@position\@undefined

答案2

虽然我同意上述评论,但问题似乎出在底部规则和子标题的交互上。事实上,如下所示,不涉及规则的东西没有间距问题。一个卑鄙的伎俩是将提供的底部规则替换booktabsspecialrule增加其下方间距的。

\documentclass{article}
\usepackage{booktabs,caption,subcaption}
\newcommand\exampletableA{
\LARGE A
}
\newcommand\exampletable{
  \begin{tabular}{ll}
  \toprule
    A & B\\\specialrule{\heavyrulewidth}{\aboverulesep}{2\belowrulesep}
  \end{tabular}
}
\captionsetup{skip=10pt}
\begin{document}

\begin{table}[!h]
  \caption{Main caption}
  \centering
  \begin{subtable}[t]{10em}
    \centering
    \exampletableA
    \caption{Subcaption 1}
  \end{subtable}
  \begin{subtable}[t]{10em}
    \centering
    \exampletableA
    \caption{Subcaption 2}
  \end{subtable}
\end{table}

\begin{table}[!h]
  \caption{Main caption}
  \centering
  \begin{subtable}[t]{10em}
    \centering
    \exampletable
    \caption{Subcaption 1}
  \end{subtable}
  \begin{subtable}[t]{10em}
    \centering
    \exampletable
    \caption{Subcaption 2}
  \end{subtable}
\end{table}
\end{document}

在此处输入图片描述

相关内容