标题和副标题之间的分离

标题和副标题之间的分离

考虑以下 MWE

\documentclass{article}
\usepackage{caption}
\usepackage{subcaption}
\begin{document}
\begin{figure}
  \begin{subfigure}[t]{.5\linewidth}
    \centering
    \rule{3cm}{3cm}
    \caption{First subfigure}
  \end{subfigure}%
  \begin{subfigure}[t]{.5\linewidth}
    \centering
    \rule{3cm}{3cm}
    \caption{Second subfigure}
  \end{subfigure}
\caption{A figure}
\end{figure}
\end{document}

如何从序言中(作为包选项或设置)减少子图标题和图标题之间的分离?

答案1

它主要是一种视觉效果。垂直空间与图形和标题之间的空间相同,但它是从底部测量的,对于子图来说,底部是括号中的最低点。

证明如下:

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

\DeclareRobustCommand{\vr}[1]{\smash{\rule{0.2pt}{#1}}}
\DeclareRobustCommand{\hr}{\makebox[0pt][l]{\rule{10cm}{0.2pt}}}

\begin{document}

\begin{figure}[htp]
\centering
    \rule{6cm}{3cm}
\caption{A figure\vr{18pt}}
\end{figure}

\begin{figure}[htp]
  \begin{subfigure}[t]{.5\linewidth}
    \centering
    \rule{3cm}{3cm}
    \caption{\hr First subfigure}
  \end{subfigure}%
  \begin{subfigure}[t]{.5\linewidth}
    \centering
    \rule{3cm}{3cm}
    \caption{Second subfigure}
  \end{subfigure}

\caption{A figure\vr{18pt}}
\end{figure}
\end{document}

我添加了规则来显示间距;上图中的规则几乎触及黑框;在下图中,它几乎触及括号的水平。实际上,由于 ,下图中多出了 1pt \lineskip

在此处输入图片描述

如果你希望垂直间距从子图的基线测量你的副标题总是一行,那么你可以添加

\AtBeginDocument{%
  \def\endsubfigure{%
    \par % ensure vertical mode
    {\small\sbox0{()}\kern-\dp0}% back up by the depth of ()
    \kern-\lineskip
    \endminipage
  }%
}

结果是

在此处输入图片描述

然而,如果子字幕跨行的话,备份就太多了。

一个更简单的方法是

\captionsetup{skip=\dimexpr\abovecaptionskip-3pt}
\caption{A figure}

3pt在必要时调整以适应。这将减少对象(子图和标题)之间的跳跃量。

答案2

设置skip选项,由caption. 正如caption文档,“标题和图形或表格内容之间的垂直空间由以下因素控制skip=<amount>:”

在此处输入图片描述

\documentclass{article}
\usepackage{caption,subcaption,graphicx}
\begin{document}

\begin{figure}[t]
  \begin{subfigure}[t]{.5\linewidth}
    \centering
    \includegraphics[width=3cm]{example-image-a}
    \caption{First subfigure}
  \end{subfigure}%
  \begin{subfigure}[t]{.5\linewidth}
    \centering
    \includegraphics[width=3cm]{example-image-b}
    \caption{Second subfigure}
  \end{subfigure}
\caption{A figure}
\end{figure}

\begin{figure}[t]
  \captionsetup{skip=0pt}
  \begin{subfigure}[t]{.5\linewidth}
    \centering
    \includegraphics[width=3cm]{example-image-a}
    \caption{First subfigure}
  \end{subfigure}%
  \begin{subfigure}[t]{.5\linewidth}
    \centering
    \includegraphics[width=3cm]{example-image-b}
    \caption{Second subfigure}
  \end{subfigure}
\caption{A figure}
\end{figure}

Hello world.

\end{document}

您也可以在文档序言中设置此项。

答案3

这个问题相当难,因为有几种情况需要考虑。您可以重新定义子图标题以减去vspace下面的一些内容,但这对多行子图组来说看起来很糟糕。

或者您可以通过加载来摆脱标题上方的某些空间,\usepackage[aboveskip=5pt]{caption}但这对正常图形不利。

也许可以检查图中是否有子图,但这将是一个相当大的黑客行为。或者您可以重新定义环境,subfigure但这也不应该被视为最佳实践。

我建议在每个图中放置一个适用于这个问题的特殊命令。或者你写一个特殊的标题命令,用于这些情况。两者都可以在你的序言中操作。

下面我将展示这两种方式:

% arara: pdflatex

\documentclass{article}
\usepackage{caption}
\usepackage{subcaption}
\newcommand*\myCaption[1]{\captionsetup{aboveskip=2pt}\caption{#1}} % 10 pt is the default
\newcommand{\mySubFigureHack}{\captionsetup{aboveskip=2pt}}

\begin{document}
    \begin{figure}
        \begin{subfigure}[t]{.5\linewidth}
            \centering
            \rule{3cm}{3cm}
            \caption{First subfigure}
        \end{subfigure}%
        \begin{subfigure}[t]{.5\linewidth}
            \centering
            \rule{3cm}{3cm}
            \caption{Second subfigure}
        \end{subfigure}
        \myCaption{A figure}
    \end{figure}
    \begin{figure}
        \mySubFigureHack
        \begin{subfigure}[t]{.5\linewidth}
            \centering
            \rule{3cm}{3cm}
            \caption{First subfigure}
        \end{subfigure}%
        \begin{subfigure}[t]{.5\linewidth}
            \centering
            \rule{3cm}{3cm}
            \caption{Second subfigure}
        \end{subfigure}
        \caption{A figure}
    \end{figure}
\end{document} 

在此处输入图片描述

答案4

为了自动缩短子图标题和图标题之间的垂直空间(不影响没有子图的标题前的垂直空间),可以在序言中添加以下代码:

\usepackage{etoolbox}
\newcommand{\belowSubcaptionSkip}{-1ex}
\pretocmd{\figure}{%% \pretocmd{\figure}... is needed because \caption is not defined outside
    \apptocmd{\endsubfigure}{\gdef\hackingMacroThatAlignsSubfigureCaptions{\vspace{\belowSubcaptionSkip}}}{}{}%% Remember that a subfigure occured. \gdef (global \def) is needed as normal \def does not work.
    \pretocmd{\caption}{\hackingMacroThatAlignsSubfigureCaptions\gdef\hackingMacroThatAlignsSubfigureCaptions{}}{}{}%% Apply the skip if applicable. Reset the skip.
}{}{}
\def\hackingMacroThatAlignsSubfigureCaptions{} %% Avoid errors in case the first figure does not have subfigures

由于某些情况,它变得相当黑客化(将东西添加到\endsubfigure作品中,但不会对后续\caption内容产生影响,等等......)

相关内容