標題和副標題之間的分離

標題和副標題之間的分離

考慮以下 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}

我新增了規則來顯示間距;上圖中的規則幾乎觸及黑盒子;在底部的情況下,它幾乎觸及括號的水平。實際上,由於\lineskip. ,底殼中多了 1pt 。

在此輸入影像描述

如果您希望從子圖的基線開始測量垂直間距你的小標題總是一行行,那麼你可以添加

\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

由於某些情況,結果證明它相當hacky(添加東西到\endsubfigure作品中,但對以下內容沒有影響\caption,等等...)

相關內容