编辑:

编辑:

在此示例中,

\documentclass{article}
\usepackage{graphicx}
\usepackage{subcaption}
\begin{document}
\begin{figure}
  \centering
  \begin{subfigure}[t]{0.33\textwidth}
    \centering
    \includegraphics[width=\textwidth]{example-image-a}
    \caption{a}
  \end{subfigure}
  \begin{subfigure}[t]{0.33\textwidth}
    \centering
    \includegraphics[width=\textwidth]{example-image-b}
    \caption{b}
  \end{subfigure}
  \begin{subfigure}[t]{0.33\textwidth}
    \centering
    \includegraphics[width=\textwidth]{example-image-c}
    \caption{c}
  \end{subfigure}
\end{figure}
\end{document}

我选择了subfigure width同样 1/3,理由是这个数字\textwidth正好跨度。从结果来看,

在此处输入图片描述

可以推断出存在一些开销。

我如何进行最佳选择subfigure width,以便图形跨度textwidth恰好为 N = 2、3、4、... subfigures

答案1

实际情况是,每个子图之间都有一个新行,对于 TeX 来说,它与空格完全相同。因此,您得到的是三个子图,中间有两个空格。要修复此问题,请%在每个子图后添加一个,这样 TeX 就不会将其视为空格:

\documentclass{article}
\usepackage{graphicx}
\usepackage{subcaption}
\begin{document}
\begin{figure}
  \centering
  \begin{subfigure}[t]{0.33\textwidth}
    \centering% < useless
    \includegraphics[width=\textwidth]{example-image-a}
    \caption{a}
  \end{subfigure}% < HERE 
  \begin{subfigure}[t]{0.33\textwidth}
    \centering% < useless
    \includegraphics[width=\textwidth]{example-image-b}
    \caption{b}
  \end{subfigure}% < AND HERE
  \begin{subfigure}[t]{0.33\textwidth}
    \centering% < useless
    \includegraphics[width=\textwidth]{example-image-c}
    \caption{c}
  \end{subfigure}
\end{figure}
\end{document}

编辑:

由于我的答案被选中,即使这里有其他所有答案,我觉得有必要为后代添加一些解释;)

为何3 * 0.33\textwidth不适合\textwidth

首先,正如我上面所说,主要问题是当 TeX 读取一个space或一个new line字符时,它会将两者都理解为一个。对于多个s 或 ,space规则有所不同。TeX 将多个s 视为单个 s ,而将多个s 视为段落结尾。例如,如果您编译此内容:spacenew linesspacespacenew line

\documentclass{article}
\usepackage[paperwidth=4in]{geometry}
\begin{document}
This is written
on      several
separate  lines
separated    by
a    new   line
character    or
by       spaces.


But when processed by \TeX, the result is two normal paragraphs!
\end{document}

你会得到这个:

上述代码编译

new line当只写文本时,这一点非常明显,如上例所示。但使用数字时也是如此。如果在连续的\includegraphics或环境之间插入subfigure,TeX 会将它们视为空格!

在 Viesturs 的 MWE 中,子图环境由 s 分隔new line,TeX 将其视为空格。

为了检查 Viesturs 的 MWE 中空间的效果,我们可以首先使用\textwidth以下公式来测量大小:

textwidth: \the\textwidth

我们得到文字宽度,因此子图的宽度为0.33\textwidth,正好是113.85pt

此外,我们还可以测量当前字体的空间使用:

space: \the\fontdimen2\font\space plus \the\fontdimen3\font\space minus \the\fontdimen4\font

我们得到空间对于 TeX 来说,这意味着空间很3.333pt宽,但可以通过 进行拉伸1.666pt或收缩1.111pt

因此,假设 TeX 会尽可能地缩小空间以尝试将三个subfigures 放在一行中,则布局将有三个 图形113.85pt和两个 空格3.333pt minus 1.111pt( = 2.222pt)。因此内容的 是3 * 113.85pt + 2 * 2.222pt = 345.994pt,这0.994pt大于可用的\textwidth。因此 TeX 将放弃将其放在一行中并在插入第三个子图之前断开该行!

但是 Phelype,我该如何解决这个问题呢?!?!

嗯,Jimmy,关于 TeX 还有以下几点:

  1. TeX 看到一个%符号后,会忽略当前行中该符号后面的所有内容。这就是 TeX(以及大多数编程语言)中注释以这种方式工作的原因。但对于我们现在面临的问题,这就是符号%让 TeX 忽略new line每个 之间的字符的原因subfigure

  2. TeX 会忽略前导spaces!因此,以下内容之前的缩进\begin{subfigure}也会被忽略!

因此,就 TeX 而言,这是:

  \end{subfigure}% < HERE 
  \begin{subfigure}[t]{0.33\textwidth}

与此完全相同:

  \end{subfigure}\begin{subfigure}[t]{0.33\textwidth}
  %              ^ No spaces!!!

space并观察到第二个在 s之间没有任何subfigure。现在,如果我们进行前面的计算而不使用空格,我们会得到3 * 113.85pt = 341.55pt,它适合当前的\textwidth

这对某些人来说似乎很明显,但对于初学者来说,要迅速发现为什么3 * 0.33\textwidth不适合是很棘手的\textwidth。几个月前,我经常发现自己天真地把数字改成0.33\textwidth一行0.329\textwidth:P

免责声明:以上所有内容在正常排版模式下有效。在逐字、数学或其他特殊环境中,规则有所不同!

答案2

对于 N = 2、3、4、...环境,如何最佳地选择subfigure宽度以使图形精确跨越?\textwidthsubfigure

  • 首先,请注意\centering代码中的所有四个指令都可以(事实上应该!)被省略。

  • 其次,假设你希望在相邻图像之间留出一些空白,你应该更改相对宽度并排子图从0.33\textwidth0.3\textwidth或。类似地0.31\textwidth,使用0.23\textwidth0.24\textwidth并排的子图,0.48\textwidth以及并排的子图。

  • 最后,使用\hfill指令来最大化放置在一条线上的子图之间的分离。

在此处输入图片描述

\documentclass{article}
\usepackage{graphicx,subcaption}
\begin{document}
\begin{figure}
  \begin{subfigure}[t]{0.31\textwidth}
    \includegraphics[width=\textwidth]{example-image-a}
    \caption{a}
  \end{subfigure}\hfill%  % <-- \hfill is new
  \begin{subfigure}[t]{0.31\textwidth}
    \includegraphics[width=\textwidth]{example-image-b}
    \caption{b}
  \end{subfigure}\hfill%  % <-- \hfill is new
  \begin{subfigure}[t]{0.31\textwidth}
    \includegraphics[width=\textwidth]{example-image-c}
    \caption{c}
  \end{subfigure}

\bigskip\bigskip
  \begin{subfigure}[t]{0.23\textwidth}
    \includegraphics[width=\textwidth]{example-image-a}
    \caption{dd}
  \end{subfigure}\hfill%
  \begin{subfigure}[t]{0.23\textwidth}
    \includegraphics[width=\textwidth]{example-image-b}
    \caption{ee}
  \end{subfigure}\hfill%
  \begin{subfigure}[t]{0.23\textwidth}
    \includegraphics[width=\textwidth]{example-image-c}
    \caption{f\kern0ptf}
  \end{subfigure}\hfill%
  \begin{subfigure}[t]{0.23\textwidth}
    \includegraphics[width=\textwidth]{example-image-a}
    \caption{gg}
  \end{subfigure}

\caption{Seven subfigures}
\end{figure}
\end{document}

答案3

以下用途tabularx自动执行指定均匀分布的元素数量的过程\textwidth

在此处输入图片描述

\documentclass{article}

\usepackage{graphicx,subcaption,tabularx}

\newenvironment{distsubfig}[1]
  {\noindent\tabularx{\textwidth}{@{} *{#1}{X} @{}}}
  {\endtabularx\par}

\begin{document}

\begin{figure}
  \begin{distsubfig}{3}
    \includegraphics[width=\linewidth]{example-image-a}
    \caption{a}
    &
    \includegraphics[width=\linewidth]{example-image-b}
    \caption{b}
    &
    \includegraphics[width=\linewidth]{example-image-c}
    \caption{c}
  \end{distsubfig}

  \bigskip

  \begin{distsubfig}{5}
    \includegraphics[width=\linewidth]{example-image-a}
    \subcaption{a}
    &
    \includegraphics[width=\linewidth]{example-image-b}
    \subcaption{b}
    &
    \includegraphics[width=\linewidth]{example-image-c}
    \subcaption{c}
    &
    \includegraphics[width=\linewidth]{example-image-a}
    \subcaption{e}
    &
    \includegraphics[width=\linewidth]{example-image-b}
    \subcaption{f}
  \end{distsubfig}
  \begin{distsubfig}{4}
    \includegraphics[width=\linewidth]{example-image-c}
    \subcaption{g}
    &
    \includegraphics[width=\linewidth]{example-image-a}
    \subcaption{h}
    &
    \includegraphics[width=\linewidth]{example-image-b}
    \subcaption{i}
    &
    \includegraphics[width=\linewidth]{example-image-c}
    \subcaption{j}
  \end{distsubfig}
  \caption{A figure caption}
\end{figure}

\end{document}

环境distsubfig采用单个参数:在 上均匀分布的子浮点数;或者,在 中使用的\textwidth列数。子浮点数之间的间隙是,就像在任何环境中一样(并且可以更改)。Xtabularx\tabcolseptabular

答案4

这是一个版本,您只需要指定每行的子图数量。

\documentclass{article}
\usepackage{subcaption}
\usepackage{graphicx}
\usepackage{showframe}

\newlength{\minsubgap}
\newlength{\maxsubgap}
\setlength{\minsubgap}{3pt}  % set to suit
\setlength{\maxsubgap}{12pt} % set to suit

\newlength{\viesturssubfigurewidth}
\newlength{\viesturssubfiguregap}

\newenvironment{bunchofsubfigures}[1] % #1 = images per row
 {%
  \setlength{\viesturssubfiguregap}{%
    \dimexpr\minsubgap+(\maxsubgap-\minsubgap)*2/(#1)\relax
  }%
  \setlength{\viesturssubfigurewidth}{%
    \dimexpr(\textwidth-\viesturssubfiguregap*(#1-1))/(#1)\relax
  }
  \setlength{\leftskip}{-0.1pt plus 1fil}%
  \setlength{\rightskip}{0pt}%
 }
 {{\parfillskip=-0.1pt plus 1fil\par}}
\newcommand{\viesturssub}[2]{% #1 = subcaption, #2 = image name
  \subcaptionbox{#1}{\includegraphics[width=\viesturssubfigurewidth]{#2}}%
  \hspace{\viesturssubfiguregap}\ignorespaces
}

\begin{document}

\begin{figure}[htp]

\begin{bunchofsubfigures}{2}
\viesturssub{Caption}{example-image}
\viesturssub{Caption}{example-image}
\viesturssub{Caption}{example-image}
\end{bunchofsubfigures}

\caption{Full caption}

\end{figure}

\begin{figure}[htp]

\begin{bunchofsubfigures}{3}
\viesturssub{Caption}{example-image}
\viesturssub{Caption}{example-image}
\viesturssub{Caption}{example-image}
\viesturssub{Caption}{example-image}
\viesturssub{Caption}{example-image}
\viesturssub{Caption}{example-image}
\end{bunchofsubfigures}

\caption{Full caption}

\end{figure}

\begin{figure}[htp]

\begin{bunchofsubfigures}{5}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\end{bunchofsubfigures}

\caption{Full caption}

\end{figure}

\begin{figure}[htp]

\begin{bunchofsubfigures}{6}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\end{bunchofsubfigures}

\caption{Full caption}

\end{figure}

\begin{figure}[htp]

\begin{bunchofsubfigures}{7}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\end{bunchofsubfigures}

\caption{Full caption}

\end{figure}

\begin{figure}[htp]

\begin{bunchofsubfigures}{8}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\viesturssub{}{example-image}
\end{bunchofsubfigures}

\caption{Full caption}

\end{figure}

\end{document}

每行两个数字之间的距离为;随着每行数字数量的增加,\maxsubgap距离会逐渐增加。选择这两个值以满足您的需求。\minsubgap

在此处输入图片描述

相关内容