Considere el siguiente 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}
¿Cómo puedo reducir del preámbulo (ya sea como una opción de paquete o una configuración) la separación entre el título de las subfiguras y el título de la figura?
Respuesta1
Es principalmente un efecto óptico. El espacio vertical es el mismo que se utiliza entre figura y pie de foto, pero se mide desde abajo, que en el caso de subfiguras es en el punto más bajo del paréntesis.
Aquí está la prueba:
\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}
Agregué reglas para mostrar el espaciado; la regla en la figura superior casi toca el cuadro negro; en la parte inferior, casi toca el nivel del paréntesis. En realidad, hay 1 punto más en la parte inferior, debido a \lineskip
.
Si desea que el espaciado vertical se mida desde la línea base de las subfigurasytus subtítulos son siempre de una sola línea, entonces puedes agregar
\AtBeginDocument{%
\def\endsubfigure{%
\par % ensure vertical mode
{\small\sbox0{()}\kern-\dp0}% back up by the depth of ()
\kern-\lineskip
\endminipage
}%
}
y el resultado sería
Sin embargo, el retroceso sería excesivo si un subtítulo se separara de las líneas.
Un método mucho más fácil sería
\captionsetup{skip=\dimexpr\abovecaptionskip-3pt}
\caption{A figure}
ajustando el 3pt
a su medida en los casos en que parezca necesario. Esto reducirá el salto entre los objetos (subfiguras y títulos) en la cantidad indicada.
Respuesta2
Establezca la skip
opción proporcionada porcaption
. Como se sugiere en elcaption
documentación, "[e]l espacio vertical entre el título y la figura o el contenido de la tabla está controlado por 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}
También puede configurar esto en el preámbulo del documento.
Respuesta3
Este problema es bastante difícil ya que hay varios casos que analizar. Podrías redefinir los títulos de tus subfiguras para restar algunos vspace
a continuación, pero esto quedaría mal para grupos de subfiguras de varias líneas.
O podrías deshacerte de algo de espacio encima del título cargándolo, \usepackage[aboveskip=5pt]{caption}
pero esto sería malo para las figuras normales.
Tal vez sería posible comprobar si hay subfiguras en una figura, pero esto sería un truco bastante grande. O podría redefinir el subfigure
entorno, lo que tampoco debería considerarse una mejor práctica.
Recomendaría poner un comando especial en cada figura que se aplique a este mismo problema. O escribe un comando de título especial que utiliza en esos casos. Ambos pueden manipularse posteriormente desde su preámbulo.
Estoy mostrando ambas maneras en lo siguiente:
% 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}
Respuesta4
Para acortar automáticamente el espacio vertical entre los títulos de subfiguras y los títulos de figuras (sin afectar el espacio vertical antes de los títulos que no tienen subfiguras), se puede agregar el siguiente código al preámbulo:
\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
Resultó ser bastante complicado debido a algunas circunstancias (Agregar cosas a \endsubfigure
las obras, pero no tiene efecto en los siguientes \caption
correos electrónicos, etc.)