次の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}
間隔を示すために罫線を追加しました。上の図の罫線は黒いボックスにほぼ触れており、下の場合、括弧のレベルにほぼ触れています。実際には、 のため、下の場合の方が 1 ポイント多くなっています\lineskip
。
垂直間隔をサブ図のベースラインから測定したい場合そしてサブキャプションが常に1行である場合は、
\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
機能するものを追加すると、後続の s には影響しない\caption
など)。