Separação entre legenda e sublegenda

Separação entre legenda e sublegenda

Considere o seguinte 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}

Como faço para reduzir do preâmbulo (seja como opção de pacote ou configuração) a separação entre a legenda das subfiguras e a legenda da figura?

Responder1

É principalmente um efeito óptico. O espaço vertical é o mesmo utilizado entre a figura e a legenda, mas é medido a partir da parte inferior, que no caso das subfiguras fica no ponto mais baixo entre parênteses.

Aqui está a prova:

\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}

Adicionei regras para mostrar o espaçamento; a régua da figura superior quase toca a caixa preta; no caso inferior, quase toca o nível dos parênteses. Na verdade, há 1 ponto a mais no caso inferior, devido a \lineskip.

insira a descrição da imagem aqui

Se você quiser que o espaçamento vertical seja medido a partir da linha de base das subfigurasesuas sublegendas são sempre uma linha, então você pode adicionar

\AtBeginDocument{%
  \def\endsubfigure{%
    \par % ensure vertical mode
    {\small\sbox0{()}\kern-\dp0}% back up by the depth of ()
    \kern-\lineskip
    \endminipage
  }%
}

e o resultado seria

insira a descrição da imagem aqui

No entanto, o backup seria demais se uma sublegenda quebrasse as linhas.

Um método muito mais fácil seria

\captionsetup{skip=\dimexpr\abovecaptionskip-3pt}
\caption{A figure}

adequando-o 3ptnos casos em que tal se afigure necessário. Isto reduzirá o salto entre os objetos (subfiguras e legenda) na quantidade indicada.

Responder2

Defina a skipopção, fornecida porcaption. Como sugerido nocaptiondocumentação, "[o] espaço vertical entre a legenda e o conteúdo da figura ou tabela é controlado por skip=<amount>":

insira a descrição da imagem aqui

\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}

Você também pode definir isso no preâmbulo do documento.

Responder3

Este problema é bastante difícil, pois há vários casos a serem analisados. Você poderia redefinir as legendas das subfiguras para subtrair algumas vspaceabaixo, mas isso não ficaria bem para grupos de subfiguras com várias linhas.

Ou você pode eliminar algum espaço acima da legenda carregando, \usepackage[aboveskip=5pt]{caption}mas isso seria ruim para números normais.

Talvez fosse possível verificar se há subfiguras em uma figura, mas isso seria um grande truque. Ou você pode redefinir o subfigureambiente que também não deve ser considerado uma prática recomendada.

Eu recomendaria colocar um comando especial em cada figura que se aplica a este problema. Ou você escreve um comando de legenda especial que usa nesses casos. Ambos podem ser manipulados posteriormente a partir do seu preâmbulo.

Estou mostrando as duas maneiras a seguir:

% 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} 

insira a descrição da imagem aqui

Responder4

Para reduzir automaticamente o espaço vertical entre legendas de subfiguras e legendas de figuras (sem afetar o espaço vertical antes de legendas que não possuem subfiguras), o seguinte código pode ser adicionado ao 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

Acabou sendo bastante hackeado devido a algumas circunstâncias (adicionar coisas às \endsubfigureobras, mas não afeta os seguintes \captionprogramas, etc ...)

informação relacionada