使用该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 是存在问题的情况。我更希望它看起来更像这样:
关于如何修复此问题,您有什么想法吗?理想情况下,我希望“自动”获得正确的间距,而无需在子表环境中插入显式 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
使用时设置的(除非全局覆盖,否则最初是未定义的),并且在环境中再次使用宏时会对其进行测试。换句话说,如果外部环境中的命令成功执行外部环境的命令,并且嵌套环境的标题位置尚未明确设置,则外部环境中的标题位置属性将覆盖嵌套环境中的标题位置。\caption
table
\caption@iftop
\caption
subtable
\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
虽然我同意上述评论,但问题似乎出在底部规则和子标题的交互上。事实上,如下所示,不涉及规则的东西没有间距问题。一个卑鄙的伎俩是将提供的底部规则替换booktabs
为specialrule
增加其下方间距的。
\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}