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