考虑以下 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
内容产生影响,等等......)