在此示例中,
\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 视为段落结尾。例如,如果您编译此内容:space
new lines
space
space
new 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 会尽可能地缩小空间以尝试将三个subfigure
s 放在一行中,则布局将有三个 图形113.85pt
和两个 空格3.333pt minus 1.111pt
( = 2.222pt
)。因此内容的 是3 * 113.85pt + 2 * 2.222pt = 345.994pt
,这0.994pt
大于可用的\textwidth
。因此 TeX 将放弃将其放在一行中并在插入第三个子图之前断开该行!
但是 Phelype,我该如何解决这个问题呢?!?!
嗯,Jimmy,关于 TeX 还有以下几点:
TeX 看到一个
%
符号后,会忽略当前行中该符号后面的所有内容。这就是 TeX(以及大多数编程语言)中注释以这种方式工作的原因。但对于我们现在面临的问题,这就是符号%
让 TeX 忽略new line
每个 之间的字符的原因subfigure
。TeX 会忽略前导
space
s!因此,以下内容之前的缩进\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
宽度以使图形精确跨越?\textwidth
subfigure
首先,请注意
\centering
代码中的所有四个指令都可以(事实上应该!)被省略。其次,假设你希望在相邻图像之间留出一些空白,你应该更改相对宽度三并排子图从
0.33\textwidth
到0.3\textwidth
或。类似地0.31\textwidth
,使用0.23\textwidth
或0.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
列数。子浮点数之间的间隙是,就像在任何环境中一样(并且可以更改)。X
tabularx
\tabcolsep
tabular
答案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