![以 2x2 方式排列 3 个子图和 1 个对齐标题](https://linux22.com/image/363152/%E4%BB%A5%202x2%20%E6%96%B9%E5%BC%8F%E6%8E%92%E5%88%97%203%20%E4%B8%AA%E5%AD%90%E5%9B%BE%E5%92%8C%201%20%E4%B8%AA%E5%AF%B9%E9%BD%90%E6%A0%87%E9%A2%98.png)
我有 3 个大图和相应的标题,它们很长且没有补偿(有些比其他的长)。我想以 2x2 的方式排列它们,这样我在第一行中有子图 a 和 b,在第二行中有子图 c 和标题,占据子图 c 留下的空间。到目前为止,我设法通过以下方式实现了这一点:
\documentclass[pra,aps,onecolumn,eqsecnum,notitlepage]{revtex4-1}
\usepackage{epsf}
\usepackage{epsfig}
\usepackage{psfrag}
\usepackage{color}
\usepackage{graphicx}
\usepackage{lmodern,bm}
\usepackage{subcaption}
\usepackage[inline]{enumitem}
\begin{document}
\begin{figure*}[ht!]
\begin{subfigure}[b]{.495\textwidth}
\includegraphics[width=\linewidth]{./subfig_a.png}
\caption{}
\end{subfigure}
\hfill
\begin{subfigure}[b]{.495\textwidth}
\includegraphics[width=\linewidth]{./subfig_b.png}
\caption{}
\end{subfigure}
\begin{subfigure}[b]{.495\textwidth}
\includegraphics[width=\linewidth]{./subfig_c.png}
\caption{}
\end{subfigure}
\hfill
\begin{minipage}[b]{.495\textwidth}
\captionsetup{singlelinecheck=off}
\caption{\label{wholefig} \footnotesize
(a) Long text caption for subfig a.
(b) Not so long text caption for subfig b.
(c) More text caption for subfig c.}
\end{minipage}
\end{figure*}
\end{document}
这样,我只能得到子图后面的 (a)(b)(c),并在小页面中手动写入位于右下角的子标题。非常烦人的是,我无法对齐其中的文本,而且由于它很长,所以在我看来非常丑陋。我尝试使用 \captionsetup{singlelinecheck=off},但这没有帮助。
编辑:正如下文所述,问题的一部分似乎是 Revtex 无法与标题或子标题包很好地配合使用。我在这里添加了 Revtex 标签。
有人遇到过类似的问题吗?谢谢!
答案1
Revtex4 定义了\@makecaption
标题包中未改变的内容。此定义用于\unhbox
格式化的标题,删除了格式。
该解决方案替代了\@makecaption
标题\caption@makecaption
包提供的解决方案。
\documentclass[pra,aps,onecolumn,eqsecnum,notitlepage]{revtex4-1}
%\documentclass{article}
\usepackage{epsf}
\usepackage{epsfig}
\usepackage{psfrag}
\usepackage{color}
\usepackage{graphicx}
\usepackage{lmodern,bm}
\usepackage[inline]{enumitem}
\usepackage{subcaption}
\makeatletter
\let\@makecaption=\caption@makecaption
\makeatother
\begin{document}
\begin{figure*}[ht!]
\begin{subfigure}[b]{.495\textwidth}
\includegraphics[width=\linewidth]{example-image-a}
\caption{}
\end{subfigure}
\hfill
\begin{subfigure}[b]{.495\textwidth}
\includegraphics[width=\linewidth]{example-image-b}
\caption{}
\end{subfigure}
\begin{subfigure}[b]{.495\textwidth}
\includegraphics[width=\linewidth]{example-image-c}
\caption{}
\end{subfigure}
\hfill
\begin{minipage}[b]{.495\textwidth}
%\captionsetup{justification=justified}
\caption{\footnotesize
(a) Long text caption for subfig a.
(b) Not so long text caption for subfig b.
(c) More text caption for subfig c.}
\label{wholefig}
\end{minipage}
\end{figure*}
\end{document}
答案2
您可以使用floatrow
包来做到这一点:它定义了一个\RawCaption
用于将标题放置为浮动框的命令:
\documentclass{article}%
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[demo]{graphicx}
\usepackage{caption,subcaption}
\usepackage[inline]{enumitem}
\usepackage{floatrow}
\captionsetup[subfigure]{singlelinecheck=off, labelfont={bf}}
\captionsetup[figure]{font={footnotesize}}
\begin{document}
\begin{figure}[!htb]
\ffigbox{}{%
\begin{subfloatrow*}
\ffigbox[.495\textwidth]{\subcaption{}\label{subf:a}}{\includegraphics[width=\linewidth]{./subfig_a.png}}
\ffigbox[.495\textwidth]{\subcaption{}\label{subf:b}}{\includegraphics[width=\linewidth]{./subfig_b.png}}%
\end{subfloatrow*}%
\renewlengthtocommand\settowidth\Mylen{\subfloatrowsep}\vskip\Mylen
\CenterFloatBoxes\floatsetup[subfigure]{heightadjust=object}%none
\begin{subfloatrow*}
\ffigbox[.495\textwidth]{\subcaption{}\label{subf:c}}{\includegraphics[width=\linewidth]{./subfig_c.png}}
\ffigbox[][][b]{}{\captionsetup{justification=RaggedRight}\RawCaption{\caption{\label{wholefig}\footnotesize
(a) Long text caption for subfig a.
(b) Not so long text caption for subfig b.
(c)~More text caption for subfig c. \vspace{\baselineskip}
}}}
\end{subfloatrow*}
}%
\end{figure}
\end{document}