Разделение между субтитрами и подзаголовками

Разделение между субтитрами и подзаголовками

Рассмотрим следующий 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и т. д.)

Связанный контент