1. 项目概述LaTeX子图与并列图编排的艺术在撰写学术论文、技术报告或者学位论文时插图的质量和排版直接影响到文档的专业性和可读性。很多朋友在初次接触LaTeX时对于如何将多张图片整齐、美观地排列在一起感到头疼尤其是需要为子图添加独立的标签如(a)、(b)、(c)时。网上教程要么过于零散要么直接丢出一段复杂的代码让人望而生畏。今天我就结合自己多年撰写论文和报告的经验来彻底讲清楚如何在LaTeX中优雅地生成子图Subfigures和并列图Side-by-side Figures。简单来说LaTeX中的“子图”通常指的是使用subfigure或更现代的subcaption环境将多张图片组合在一个大的figure环境中并为每张小图分别添加标题和引用标签。而“并列图”则是一个更宽泛的概念它可能指简单的并排摆放也可能就是通过子图环境实现的。核心目标就一个实现精准、灵活的图片布局满足期刊和导师的苛刻要求。无论你是要展示实验结果的对比、算法流程的不同阶段还是多组数据的可视化掌握这套方法都能让你的文档瞬间提升一个档次。2. 核心思路与方案选型为何是subcaption宏包在LaTeX中实现多图排列历史上主要有几种方案古老的subfigure宏包、一度流行的subfig宏包以及现在被广泛推荐使用的subcaption宏包。为什么我强烈推荐直接从subcaption入手这背后有它的逻辑。subcaption宏包是caption宏包作者开发的它与LaTeX的核心文档类如article,report,book以及caption宏包本身有着最佳的兼容性。它解决了老宏包的一些棘手问题比如与hyperref宏包用于生成超链接冲突或者子图引用编号混乱等。它的语法更直观、更符合LaTeX的现代哲学——通过环境environment和命令command来声明结构而不是依赖一堆晦涩难记的命令。从功能上讲subcaption提供了subfigure和subtable环境你可以把它们直接嵌套在标准的figure或table环境里。每个子环境都可以有自己的\caption和\label并且主图还可以有一个整体的\caption。这种层次结构非常清晰也便于交叉引用你可以引用整个图3也可以单独引用图3(a)。因此我们的技术方案非常明确使用subcaption宏包在figure环境中嵌套多个subfigure环境来实现子图布局。我们将通过控制每个subfigure环境的宽度参数如0.48\textwidth来并排或堆叠图片并通过\caption和\label分别管理标题和标签。3. 环境准备与基础配置在开始编写代码之前我们需要确保LaTeX环境已经就绪。这里假设你已经安装了一个完整的LaTeX发行版如 TeX Live、MiKTeX 或 MacTeX并且使用一个顺手的编辑器比如 VS Code、TeXstudio 或 Overleaf 在线平台。3.1 宏包引入与文档头设置创建一个新的.tex文件在文档的导言区即\begin{document}之前我们需要引入必要的宏包。\documentclass[11pt, a4paper]{article} % 文档类这里以article为例 \usepackage{graphicx} % 必须用于插入图片的核心宏包 \usepackage{subcaption} % 核心用于创建子图 \usepackage{float} % 可选但推荐提供[H]等更灵活的浮动体位置控制 \usepackage{hyperref} % 可选用于生成交叉引用的超链接与subcaption兼容性好 \hypersetup{ colorlinkstrue, linkcolorblue, filecolormagenta, urlcolorcyan, }关键点解析graphicx这是处理图片的基石提供了\includegraphics命令。没有它图片无法插入。subcaption我们的主角。它自动加载caption宏包所以通常不需要单独\usepackage{caption}。float这个宏包不是必须的但它提供的[H]选项强制图片“就在此处”在调试排版或需要精确定位时非常有用。LaTeX默认的图片和表格是“浮动体”float它们的位置由算法决定不一定在你代码编写的位置。[H]能消除这种不确定性但过度使用可能影响最终排版美观。hyperref通常最后加载。它让文档中的引用如\ref{fig:my_label}变成可点击的链接极大方便了电子文档的阅读。subcaption与它的兼容性很好。3.2 图片资源管理将你计划使用的图片文件如result_a.png,model_flow.pdf,data_plot.jpg放在与你的.tex文件相同的目录下或者放在一个专门的子目录如./figures/中。如果使用子目录在\includegraphics命令中需要包含路径例如\includegraphics[width\linewidth]{./figures/result_a.png}。保持文件命名清晰、有规律会大大降低后期维护的成本。注意LaTeX 支持多种图片格式但为了获得最佳的输出效果尤其是涉及缩放时推荐使用 PDF、EPS矢量图或 PNG位图格式。JPEG 格式在包含文字或线条图时缩放后容易模糊。对于包含复杂图表、公式的图片优先导出为 PDF 或 EPS。4. 核心语法与基础编排实战一切就绪让我们从最简单的例子开始一步步构建复杂的布局。4.1 基础并列双图最常见的需求是将两张图并排显示各占一半宽度并分别标注为 (a) 和 (b)。\begin{figure}[htbp] % htbp是LaTeX推荐的浮动体位置参数 \centering % 让整个figure环境居中 \begin{subfigure}[b]{0.48\textwidth} % [b]表示子图底部对齐宽度为正文宽度的48% \centering \includegraphics[width\linewidth]{example-image-a} % \linewidth指子图环境的宽度 \caption{这是第一张子图的说明。} % 子图标题 \label{fig:sub1} % 子图标签用于引用 \end{subfigure} \hfill % 一个弹性填充将两个子图尽可能分开 \begin{subfigure}[b]{0.48\textwidth} \centering \includegraphics[width\linewidth]{example-image-b} \caption{这是第二张子图的说明。} \label{fig:sub2} \end{subfigure} \caption{这是一个整体的图标题用于说明这两张子图共同表达了什么内容。} \label{fig:two_subfigs} % 整个图的标签 \end{figure}代码逐行解读与避坑指南\begin{figure}[htbp][htbp]是位置指示符告诉LaTeX尝试将图放在此处h、页面顶部t、页面底部b或单独一页p。这是最常用的组合给予排版引擎最大的灵活性。如果你实在需要固定位置可以换成[H]需要float宏包但请谨慎使用。\centering这个命令让figure环境内的所有内容居中。注意它不是一个环境而是一个声明命令。\begin{subfigure}[b]{0.48\textwidth}[b]对齐选项。可以是t顶部对齐、c居中对齐默认、b底部对齐。当子图高度不一致时这个选项决定了它们以哪条边为基准对齐。通常使用[b]让标题底部对齐视觉效果更整齐。{0.48\textwidth}指定该子图环境占据的宽度。为什么是0.48而不是0.5因为我们需要在图片之间留出一点空隙由\hfill或后续的\quad产生如果都用0.5加上空隙就可能超过行宽导致换行或溢出。0.48是一个安全值。\includegraphics[width\linewidth]{...}\linewidth在这里的上下文里自动等于当前subfigure环境的宽度即0.48\textwidth。这样设置可以确保图片填满子图区域的宽度高度按比例自动缩放。这是最省心、最常用的方式。\hfill这是一个“弹性填充”命令。它会尽可能地将左右两边的盒子在这里是子图推开撑满整个\textwidth。这比使用固定的空格如\qquad更灵活能自动适应不同的布局需求。标签\label的放置务必将\label命令放在对应的\caption命令之后。因为\label记录的是上一个计数器如图号、表号、章节号的值。如果先写\label再写\caption\label记录的就是上一个图的编号会导致引用错误。这是一个非常常见且难以排查的坑4.2 多行多列复杂布局当需要展示超过两张图时我们可以通过组合多个subfigure环境并灵活运用换行和宽度控制来实现网格状排列。\begin{figure}[htbp] \centering % 第一行三个子图 \begin{subfigure}[b]{0.32\textwidth} \centering \includegraphics[width\linewidth]{example-image-a} \caption{情况 A} \label{fig:grid_a} \end{subfigure} \hfill \begin{subfigure}[b]{0.32\textwidth} \centering \includegraphics[width\linewidth]{example-image-b} \caption{情况 B} \label{fig:grid_b} \end{subfigure} \hfill \begin{subfigure}[b]{0.32\textwidth} \centering \includegraphics[width\linewidth]{example-image-c} \caption{情况 C} \label{fig:grid_c} \end{subfigure} \vspace{0.5cm} % 在两行图之间添加垂直间距 % 第二行两个子图可以居中显示 \begin{subfigure}[b]{0.48\textwidth} \centering \includegraphics[width0.8\linewidth]{example-image} % 图片宽度为子图宽度的80%周围留白 \caption{综合结果 1} \label{fig:grid_d} \end{subfigure} \hfill \begin{subfigure}[b]{0.48\textwidth} \centering \includegraphics[width0.8\linewidth]{example-image-duck} \caption{综合结果 2} \label{fig:grid_e} \end{subfigure} \caption{一个复杂的多行多例子图布局示例。第一行展示了三种不同条件下的结果第二行展示了两种综合分析的对比。} \label{fig:complex_grid} \end{figure}布局技巧与心得宽度计算对于一行N个等宽子图每个子图的宽度可以设为(1.0 - (N-1)*\subfigsep) / N倍的\textwidth其中\subfigsep是子图间的间隔默认通常很小。实践中直接使用略小于1/N的值更简单例如一行三个用0.32\textwidth一行四个用0.24\textwidth。垂直间距使用\vspace{长度}在行间添加固定间距。0.5cm是一个比较合适的视觉距离。你也可以使用\bigskip或\medskip等弹性间距命令。图片在子图中的位置通过调整\includegraphics的宽度如width0.8\linewidth可以让图片在子图区域内不撑满从而产生留白效果。配合\centering图片会水平居中。如果你想控制垂直位置可以将subfigure环境的对齐选项[b]改为[c]居中对齐但这可能会使同行子图的标题不在同一水平线上需要根据实际情况权衡。5. 高级定制与样式控制基础的排列只是第一步要让子图完全符合论文格式要求我们还需要对标题样式、编号格式、间距等进行精细控制。5.1 修改子图标题标签格式默认情况下子图标题的标签是“(a)”、“(b)”这样的括号小写字母。但有些期刊要求使用“a.”、“b.”或“Fig. 1a”等形式。subcaption宏包提供了强大的自定义能力。% 在导言区\begin{document}之前添加以下代码 \usepackage{subcaption} \captionsetup[sub]{labelformatsimple, labelsepcolon} % 设置子图标题格式 \renewcommand{\thesubfigure}{(\alph{subfigure})} % 默认格式显式声明一下 % 如果需要改为“a.”则使用 % \renewcommand{\thesubfigure}{\alph{subfigure}.} % 如果需要改为“Fig. 1a”则使用需加载caption宏包特定设置稍复杂 % \captionsetup[sub]{labelformatsimple, labelsepspace} % \renewcommand{\thesubfigure}{\thefigure\alph{subfigure}}关键命令解释\captionsetup[sub]专门用于设置子图sub的标题样式。labelformatsimple标签格式为“简单”模式即只显示计数器\thesubfigure定义的内容。labelsepcolon标签和标题文本之间的分隔符为冒号“:”。也可以是space空格、period句点等。\renewcommand{\thesubfigure}这是重新定义子图计数器subfigure的显示格式。\alph{subfigure}表示以小写字母形式显示该计数器的值。你可以将其包裹在任意文本中例如(\alph{subfigure})或\alph{subfigure}.。5.2 调整子图间距与整体宽度有时默认的间距\subfigsep可能太窄或太宽或者我们希望一组子图的总宽度小于版心宽度以实现居中。\begin{figure}[htbp] \centering % 方法一通过设置\hspace手动调整 \begin{subfigure}[b]{0.45\textwidth} % ... 内容 ... \end{subfigure} \hspace{1cm} % 固定的1厘米间距 \begin{subfigure}[b]{0.45\textwidth} % ... 内容 ... \end{subfigure} % 方法二使用\centering包裹一个定宽盒子 \centering \begin{minipage}{0.9\textwidth} % 总宽度设为正文的90% \centering \setlength{\subfigsep}{2em} % 临时增大子图间水平间距 \begin{subfigure}[b]{0.48\textwidth} % ... 内容 ... \end{subfigure} \hfill \begin{subfigure}[b]{0.48\textwidth} % ... 内容 ... \end{subfigure} \end{minipage} \caption{通过minipage控制整体宽度并调整间距的示例。} \label{fig:spacing_control} \end{figure}实操心得\hspace{长度}是插入固定水平间距最直接的方法直观但不够灵活。使用minipage环境将一组子图包裹起来并给minipage设置一个小于\textwidth的宽度是让整组图在页面中“缩进”或居中的好办法。minipage内部再使用\centering。\setlength{\subfigsep}{2em}可以改变subcaption宏包定义的子图间默认水平间距。这个设置的影响范围取决于你把它放在哪里。放在figure环境内只影响本图放在导言区则影响全局。em是一个相对单位等于当前字体中“M”的宽度。5.3 混合布局不同宽度的子图并非所有子图都需要等宽。例如你可能有一张主图需要更宽旁边并列两张窄一点的说明图。\begin{figure}[htbp] \centering \begin{subfigure}[t]{0.65\textwidth} % 主图较宽顶部对齐[t] \centering \includegraphics[width\linewidth]{main_result} \caption{主要实验结果趋势图。} \label{fig:mixed_main} \end{subfigure} \hfill \begin{minipage}[t]{0.3\textwidth} % 右侧用一个minipage装两个竖排子图 \centering \begin{subfigure}[t]{\linewidth} % 子图宽度继承minipage的宽度 \centering \includegraphics[width0.9\linewidth]{detail_a} \caption{局部细节A} \label{fig:mixed_a} \end{subfigure} \vspace{0.3cm} % 两个竖排子图间的间距 \begin{subfigure}[b]{\linewidth} % 这个用底部对齐[b] \centering \includegraphics[width0.9\linewidth]{detail_b} \caption{局部细节B} \label{fig:mixed_b} \end{subfigure} \end{minipage} \caption{混合宽度布局示例宽主图与右侧竖排双细节图结合。} \label{fig:mixed_layout} \end{figure}技巧解析这里的关键是引入了一个minipage环境作为右侧的容器其宽度设为0.3\textwidth。然后在这个窄容器内再垂直排列两个subfigure。注意对齐选项的混合使用主subfigure用[t]顶部对齐右侧minipage也用[t]这样它们的顶部会对齐。右侧内部的第一个子图也用[t]第二个用[b]是为了在minipage内部灵活控制位置你也可以都用[c]。这种嵌套minipage的方法提供了极大的布局灵活性可以构建出几乎任何你想要的网格结构。6. 交叉引用、列表与常见问题排查图片排好了接下来是如何在正文中优雅地引用它们以及如何处理那些让人头疼的编译警告和错误。6.1 正确的交叉引用方法LaTeX的交叉引用系统非常强大但必须遵循“先编译后引用”的原则。% 在正文中引用 如图 \ref{fig:two_subfigs} 所示我们对比了两种方法。具体来说左侧子图图 \ref{fig:sub1}展示了传统算法的输出而右侧子图图 \ref{fig:sub2}则展示了我们新方法的改进效果。 % 使用 \autoref 命令需要 hyperref 宏包可以自动加上“图”或“表”等字 如 \autoref{fig:complex_grid} 所示我们进行了五组实验。其中\autoref{fig:grid_c} 的结果最为显著。 % 引用子图时可以使用 \subref 命令来只生成子图标签如“(c)” 分析数据参见图 \subref{fig:grid_c}可以发现...为什么我的引用显示成“??”或者错误这是LaTeX新手遇到最多的问题。根本原因是你需要连续编译两次LaTeX文档。具体流程是第一次编译pdflatex或xelatex处理文档遇到\label时将其与当前的计数器如图号、章节号关联并将这些关联关系写入.aux辅助文件。但此时引用命令\ref还找不到正确的编号所以显示为“??”。第二次编译LaTeX读取上一次生成的.aux文件获取了所有标签对应的正确编号。此时\ref命令就能输出正确的数字了。在 Overleaf 或 TeXstudio 等集成环境中点击“编译”按钮通常会自动处理这个流程。但如果手动编译或者添加/删除了很多标签记得编译两次。如果问题依旧请检查\label是否放在了\caption之后。6.2 创建图表目录对于长篇文档如学位论文将所有的图和表格列一个目录是非常专业的表现。% 在导言区添加以下命令通常在 \begin{document} 之后\maketitle 之前 \listoffigures % 生成图目录 \listoftables % 生成表目录 % 或者如果你希望图目录显示得更紧凑可以设置 \usepackage[titles]{tocloft} \setlength{\cftfigindent}{0pt} % 取消图目录的缩进 \setlength{\cftfignumwidth}{2.5em} % 设置图编号的宽度\listoffigures命令会收集所有\caption中的文字连同页码生成一个名为“List of Figures”的章节。对于子图只有主图的\caption会被收录进图目录。6.3 常见编译错误、警告与解决方案实录在实际操作中你可能会遇到一些报错或警告。这里记录几个典型的案例和我的解决思路。问题一Undefined control sequence. \begin{subfigure}原因最可能的原因是忘记加载subcaption宏包。也可能是拼写错误如subfigure写成了subfigur。解决检查导言区是否有\usepackage{subcaption}。确保拼写正确。问题二图片找不到! LaTeX Error: File my_image not found.原因\includegraphics命令中指定的图片文件名或路径错误。LaTeX对文件名大小写敏感在Linux/Mac系统下且不支持带有空格的文件名除非用引号包裹或去掉空格。解决检查文件名拼写和大小写。检查文件路径。如果图片在子文件夹figs中应写为{figs/my_image.png}。避免在文件名中使用空格和特殊字符除连字符-和下划线_外。如果必须使用可以写成{my image.png}加引号。确认图片格式是LaTeX支持的如.pdf,.png,.jpg。对于.eps文件可能需要\usepackage{epstopdf}宏包现代LaTeX发行版通常自动处理。问题三Overfull \hbox警告原因内容如图片、子图的总宽度超出了指定的行宽\textwidth或\linewidth。这在调整子图宽度时非常常见比如两个0.5\textwidth的子图加上中间的\hfill或空格总宽度就超过了\textwidth。解决减小子图环境的宽度参数。将0.5\textwidth改为0.48\textwidth或更小。使用0.32\textwidth而不是0.33\textwidth来排三列图。仔细计算总宽度N * 子图宽度 (N-1) * 间隔宽度 \textwidth。问题四子图标题编号不正确不连续或重复原因通常是因为在同一文档中混用了不同的子图宏包如subfigure和subfig或者手动重置了计数器。解决坚持只使用subcaption一个宏包。检查文档中是否有\newcounter或\setcounter命令意外影响了figure或subfigure计数器。确保每个subfigure环境都正确闭合。问题五引用子图时链接跳转到整张图而不是子图位置使用hyperref时原因这是hyperref和浮动体位置不确定性的一个交互问题。hyperref的链接锚点可能定位到了figure环境的开始而非子图的具体位置。解决这个问题有时难以彻底避免。可以尝试将hyperref宏包放在所有其他宏包之后加载这本身就是最佳实践。对于要求极高的文档可以考虑使用\phantomsection命令手动设置锚点但这比较复杂。一个更实用的方法是确保在正文中引用子图时上下文描述清晰即使链接跳转到整图开头读者也能根据标题快速找到对应子图。7. 性能优化与最佳实践建议当文档中图片非常多时编译速度可能会变慢尤其是使用PDFLaTeX处理大量高分辨率PNG/JPG时。以下是一些提升体验的技巧。1. 将图片转换为PDF格式对于由绘图工具如Matplotlib, TikZ, Inkscape, Adobe Illustrator生成的图表直接导出为PDF格式。PDF是矢量图或高质量位图的容器LaTeX处理起来效率高且在任何缩放级别下都保持清晰。对于照片类图片如果不需要极高精度可以在导出时适当降低分辨率如150-300 DPI以减小文件体积。2. 使用\graphicspath命令如果你的图片都放在一个或多个子目录下每次插入都要写路径很麻烦。可以在导言区使用\graphicspath{{./figures/}{./images/}}这样\includegraphics{filename}命令会自动在./figures/和./images/目录下寻找filename。3. 为常用图片设置预定义命令如果同一张图片在文档中多次使用可以定义一个命令避免重复代码。% 在导言区定义 \newcommand{\myLogo}{\includegraphics[height1cm]{university_logo.pdf}} % 在正文中使用 这里是我们的机构标志\myLogo。4. 关于浮动体“乱跑”的最终策略LaTeX的浮动体figure,table设计初衷是为了避免糟糕的页面断页但这经常导致图片出现在“意想不到”的位置。我的策略是首先信任算法使用[htbp]先让LaTeX尝试自动排版大部分时候结果是可以接受的。其次适度使用[H]对于极其重要、必须紧跟某段文字之后的图使用[H]来自float宏包。但一篇文章中这类图不宜超过2-3个。最后使用\clearpage或\FloatBarrier如果一章或一节的末尾有多个浮动体堆积可以在章节结束前使用\clearpage命令强制输出所有未处理的浮动体。\usepackage{placeins}宏包提供了\FloatBarrier命令可以在任意位置设置浮动体屏障比\clearpage更灵活。终极方案接受它在提交给期刊或打印最终版前仔细检查整个文档。只要图片编号引用正确并且出现在合理的章节范围内比如不会离引用它的文字好几页远通常都是符合出版规范的。微调文字段落的长短有时可以“诱导”浮动体出现在更理想的位置。掌握LaTeX的子图排版本质上是在理解其“盒子模型”和“浮动体”概念的基础上通过subcaption等工具进行精细控制。从简单的并排双图到复杂的混合网格其核心思想都是一致的用subfigure环境划分区域用宽度和对齐参数控制布局用\caption和\label管理说明和引用。多动手尝试遇到问题仔细阅读编译日志中的错误信息你很快就能熟练地制作出出版级质量的插图。