Betrachten Sie die folgenden 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}
Wie reduziere ich ab der Präambel (entweder als Paketoption oder als Einstellung) die Trennung zwischen der Beschriftung der Unterabbildungen und der Beschriftung der Abbildung?
Antwort1
Es handelt sich dabei hauptsächlich um einen optischen Effekt. Der vertikale Abstand ist derselbe wie zwischen Abbildung und Bildunterschrift, wird jedoch von unten gemessen, was im Fall von Unterabbildungen der tiefste Punkt in den Klammern ist.
Hier ist der Beweis:
\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}
Ich habe Linien hinzugefügt, um den Abstand anzuzeigen. Die Linie in der oberen Abbildung berührt fast das schwarze Kästchen, im unteren Fall berührt sie fast die Höhe der Klammern. Tatsächlich ist im unteren Fall 1pt mehr vorhanden, aufgrund von \lineskip
.
Wenn Sie möchten, dass der vertikale Abstand von der Grundlinie der Unterfiguren gemessen wirdUndIhre Untertitel sind immer Einzeiler, dann könnten Sie hinzufügen
\AtBeginDocument{%
\def\endsubfigure{%
\par % ensure vertical mode
{\small\sbox0{()}\kern-\dp0}% back up by the depth of ()
\kern-\lineskip
\endminipage
}%
}
und das Ergebnis wäre
Allerdings wäre der Aufwand zu groß, wenn eine Unterüberschrift über mehrere Zeilen hinweg umbrochen wird.
Eine viel einfachere Methode wäre
\captionsetup{skip=\dimexpr\abovecaptionskip-3pt}
\caption{A figure}
3pt
in den Fällen, in denen dies notwendig erscheint, entsprechend anpassen . Dadurch wird der Abstand zwischen den Objekten (Unterabbildungen und Bildunterschrift) um den angegebenen Betrag reduziert.
Antwort2
Stellen Sie die skip
Option ein, die bereitgestellt wird voncaption
. Wie imcaption
Dokumentation, „Der vertikale Abstand zwischen der Bildunterschrift und dem Bild- bzw. Tabelleninhalt wird gesteuert durch 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}
Sie können dies auch in der Dokumentpräambel festlegen.
Antwort3
Dieses Problem ist ziemlich schwierig, da mehrere Fälle betrachtet werden müssen. Sie könnten Ihre Unterabbildungsbeschriftungen neu definieren, um einige vspace
davon unten zu entfernen, aber das würde bei mehrzeiligen Unterabbildungsgruppen schlecht aussehen.
Oder Sie könnten durch Laden etwas Platz über der Beschriftung loswerden, \usepackage[aboveskip=5pt]{caption}
aber das wäre für normale Zahlen schlecht.
Vielleicht könnte man prüfen, ob eine Abbildung Unterabbildungen enthält, aber das wäre ein ziemlich großer Aufwand. Oder man könnte die subfigure
Umgebung neu definieren, was ebenfalls nicht als Best Practice gelten sollte.
Ich würde empfehlen, in jede Abbildung einen speziellen Befehl einzufügen, der genau dieses Problem behandelt. Oder Sie schreiben einen speziellen Beschriftungsbefehl, den Sie in diesen Fällen verwenden. Beides lässt sich nachträglich von Ihrer Präambel aus manipulieren.
Im Folgenden zeige ich beide Wege:
% 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}
Antwort4
Um den vertikalen Abstand zwischen Bildunterschriften und Abbildungsunterschriften automatisch zu verkürzen (ohne den vertikalen Abstand vor Beschriftungen ohne Unterabbildungen zu beeinträchtigen), kann der Präambel der folgende Code hinzugefügt werden:
\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
Aufgrund bestimmter Umstände stellte es sich als ziemlicher Hack heraus (das Hinzufügen von Dingen \endsubfigure
funktioniert, hat aber keine Auswirkung auf folgende \caption
s usw. ...).