将多个子图并排排列

将多个子图并排排列

我希望我的图形的子图能够像这样排列:

,---,  ,---,
|   |  '---'
|   |   (b)
|   |  ,---,
'---'  '---'
 (a)    (c)

我希望底部两幅图像垂直对齐,右边两幅图像水平对齐。

我一直在尝试使用 subfigure 和 minipage 的组合,但无济于事:

\documentclass{article}
\usepackage{graphicx,caption,subcaption}

\usepackage{lipsum}


\begin{document}

\begin{figure}
        \centering
\begin{minipage}[t]{.45\columnwidth}
    \begin{subfigure}[t]{\columnwidth}
        \includegraphics[width=.9\columnwidth,height=\columnwidth]{example-image-a}
        \caption{}
    \end{subfigure}
\end{minipage}
\begin{minipage}[t]{.45\columnwidth}
    \begin{subfigure}[t]{\columnwidth}
        \centering
        \includegraphics[width=.9\columnwidth,height=.5\columnwidth]{example-image-b}
        \caption{}
    \end{subfigure}
    \begin{subfigure}[b]{\columnwidth}
        \includegraphics[width=.9\columnwidth,height=.5\columnwidth]{example-image-c}
        \caption{}
    \end{subfigure}
\end{minipage}
\end{figure}


\end{document}

生成:

,---, 
|   | 
|   | 
|   |  ,---,
'---'  '---'
 (a)    (b)
       ,---,
       '---'
        (c)

答案1

两种解决方案,一种是使用测量方法,另一种是将任务留给 TeX。

\documentclass[twocolumn]{article}
\usepackage{graphicx,caption,subcaption}

\usepackage{lipsum}

\newsavebox{\arrangebox}
\newlength{\arrangeht}

\begin{document}

\lipsum[2]

\begin{figure}[htp]
\centering

\sbox{\arrangebox}{%
  \begin{subfigure}[b]{0.45\columnwidth}
  \centering
  \includegraphics[width=.9\textwidth,height=6cm]{example-image}
  \caption{}
  \end{subfigure}%
}
\setlength{\arrangeht}{\ht\arrangebox}

\usebox{\arrangebox}\hfill
\begin{minipage}[b][\arrangeht][s]{0.45\columnwidth}
  \begin{subfigure}[t]{\textwidth}
  \centering
  \includegraphics[width=.9\textwidth,height=2cm]{example-image}
  \caption{}
  \end{subfigure}\vfill
  \begin{subfigure}[b]{\textwidth}
  \centering
  \includegraphics[width=.9\textwidth,height=2cm]{example-image}
  \caption{}
  \end{subfigure}
\end{minipage}

\end{figure}

\lipsum[3]

\begin{figure}[htp]
\centering

\valign{#\cr
  \hsize=0.45\columnwidth
  \begin{subfigure}{0.45\columnwidth}
  \centering
  \includegraphics[width=.9\textwidth,height=6cm]{example-image}
  \caption{}
  \end{subfigure}\cr\noalign{\hfill}
  \hsize=0.45\columnwidth
  \begin{subfigure}{0.45\columnwidth}
  \centering
  \includegraphics[width=.9\textwidth,height=2cm]{example-image}
  \caption{}
  \end{subfigure}\vfill
  \begin{subfigure}{0.45\columnwidth}
  \centering
  \includegraphics[width=.9\textwidth,height=2cm]{example-image}
  \caption{}
  \end{subfigure}\cr
}

\end{figure}

\lipsum

\end{document}

在此处输入图片描述

第一个解决方案是首先测量大图形的高度,以及它的子标题(定位[b])。

右半部分设置在minipage规定高度与左框相同的位置:

\begin{minipage}[<outer alignment>][<height>][<inner alignment>]

这里<inner alignment>的 是s,这意味着只使用显式跳过来间隔项目;在本例中,它是\vfill两个子图之间的 。<outer alignment>与左侧子图相同,即b

设置<height>\ht\arrangebox,即保存的框的高度。然后该框用于排版左侧子图。

第二种解决方案更加深奥,因为它依赖于一些基本的 TeX 构造的知识,特别是\valign。我将把它放入 LaTeX 环境中。

您将传递subcolumns每列的宽度。同一列中的子图以\nextsubfigure; 分隔,\nextsubcolumn下一列开始。

优点是可以尽可能多的列和子图随心所欲。例如,第一列为 2,第二列为 3,或其他。

\documentclass[twocolumn]{article}
\usepackage{graphicx,caption,subcaption}

\usepackage{lipsum}

% for the first solution
\newsavebox{\arrangebox}
\newlength{\arrangeht}

% for the second solution
\newenvironment{subcolumns}[1]
 {\valign\bgroup\hsize=#1##\cr}
 {\crcr\egroup}
\newcommand{\nextsubcolumn}{\cr\noalign{\hfill}}
\newcommand{\nextsubfigure}{\vfill}

\begin{document}

\lipsum[2]

\begin{figure}[htp]
\centering

\sbox{\arrangebox}{%
  \begin{subfigure}[b]{0.45\columnwidth}
  \centering
  \includegraphics[width=.9\textwidth,height=6cm]{example-image}
  \caption{}
  \end{subfigure}%
}
\setlength{\arrangeht}{\ht\arrangebox}

\usebox{\arrangebox}\hfill
\begin{minipage}[b][\arrangeht][s]{0.45\columnwidth}
  \begin{subfigure}[t]{\textwidth}
  \centering
  \includegraphics[width=.9\textwidth,height=2cm]{example-image}
  \caption{}
  \end{subfigure}\vfil
  \begin{subfigure}[b]{\textwidth}
  \centering
  \includegraphics[width=.9\textwidth,height=2cm]{example-image}
  \caption{}
  \end{subfigure}
\end{minipage}

\end{figure}

\lipsum[3]

\begin{figure}[htp]
\centering

\begin{subcolumns}{0.45\columnwidth}
  \begin{subfigure}{0.45\columnwidth}
  \centering
  \includegraphics[width=.9\textwidth,height=6cm]{example-image}
  \caption{}
  \end{subfigure}
\nextsubcolumn
  \begin{subfigure}{0.45\columnwidth}
  \centering
  \includegraphics[width=.9\textwidth,height=2cm]{example-image}
  \caption{}
  \end{subfigure}
\nextsubfigure
  \begin{subfigure}{0.45\columnwidth}
  \centering
  \includegraphics[width=.9\textwidth,height=2cm]{example-image}
  \caption{}
  \end{subfigure}
\end{subcolumns}

\end{figure}

\lipsum

\end{document}

答案2

raster使用来自的库的解决方案tcolorbox

我将右侧的两张图片放在一个一列的环境中,这样这两张图片就互相叠在一起了。我为第一张图片设置了高度,为第二张raster图片设置了宽度(as )。我还用它来模仿古典和实用风格。\linewidth\subcaptionbox\caption\label

这个raster环境本身是另一个环境的第二个元素,raster我将左侧的大图片放在该环境中。它的高度是通过\myspace计算嵌套的总高度得出的raster,这要归功于选项raster equal height=rows(一行上的元素将具有相同的高度)。

如果尺寸不匹配,您可以尝试其他设置。请参阅tcolorbox 文档图书馆栅格大约第 277 页……)

您需要至少编译两次以确保正确调整框。

\documentclass{article}

\usepackage[demo]{graphicx}
\usepackage{tcolorbox}
\tcbuselibrary{most}
\usepackage{subcaption}
\usepackage{cleveref}


\begin{document}
    \begin{figure}
        \begin{tcbitemize}[raster equal height=rows,
        raster every box/.style=blankest]
        \tcbitem[space to=\myspace]
            \subcaptionbox{Sub1\label{fig:A}}{\includegraphics[height=\myspace,width=\linewidth]{figA}}
        \tcbitem
            \begin{tcbitemize}[raster columns=1]
                \tcbitem \centering\subcaptionbox{Sub2}{\includegraphics[height=5cm]{figB}}
                \tcbitem \subcaptionbox{Sub3}{\includegraphics[width=\linewidth]{figC}}
            \end{tcbitemize}
        \end{tcbitemize}
        \caption{Figure}
        \label{fig:F}
    \end{figure}

See \cref{fig:F}, \cref{fig:A}.
\end{document}

在此处输入图片描述

答案3

您已经表示您还没有准备好应对复杂的解决方案,因此这个答案是一个捷径的例子,因为它避免了复杂性,所以需要稍微调整一下才能得到正确的外观。当我面临最后期限时,我常常会感激这样的解决方案。

\documentclass[10pt]{article}
\usepackage[paperwidth=11cm,paperheight=15cm,margin=1.5cm]{geometry}
\usepackage{graphicx,subcaption}

\begin{document}

\noindent The preceding line.
\begin{figure}[htp]
    \centering
    \begin{subfigure}{.45\columnwidth}
        \includegraphics[width=3cm,height=8cm]{example-image-a}
        \caption{}
    \end{subfigure}
\begin{minipage}[s][6.87cm]{.45\columnwidth}
    \begin{subfigure}{\columnwidth}
        \includegraphics[width=3cm,height=3cm]{example-image-b}
        \caption{}
    \end{subfigure}
    \vfil
    \begin{subfigure}{\columnwidth}
        \includegraphics[width=3cm,height=3cm]{example-image-c}
        \caption{}
    \end{subfigure}
\end{minipage}
\end{figure}

\noindent The following line.

\end{document}

第一个subfigure不需要minipage,因为 之后没有自动换行符。右边的subfigure两个用 隔开, 对齐。的高度需要猜测。尝试一个明显太小的值,然后逐步增加。我没花很长时间就得到了这里使用的高度。subfigures\vfilminipage[s]minipage

提供的代码的结果

警告:还有更复杂的解决方案,但并不是每个使用 LaTeX 的人都想成为 LaTeX 专家。即便如此,随着你对 LaTeX 越来越熟悉,你可能希望在以后尝试更复杂的解决方案。

相关内容