资讯动态

LaTeX多图并排排版全攻略:从minipage到subcaption

发布时间:2026/8/15 1:22:59 来源:尧图企业网站定制
1. 项目概述为什么LaTeX图片排版值得深究如果你用过LaTeX写过论文、报告或者任何需要图文并茂的文档大概率都遇到过图片排版的“拦路虎”。最常见的一个场景就是我需要把两张、三张甚至更多图片并排放置每张图下面还得配上独立的说明文字caption。在Word里这似乎就是拖拽几下、插入几个文本框的事儿但在LaTeX里新手往往会发现图片要么乱跑、要么大小对不齐、要么说明文字“张冠李戴”最后文档末尾还多出一大片空白。这个看似简单的需求恰恰触及了LaTeX排版哲学的核心——内容与格式分离以及基于浮动体的排版机制。LaTeX的figure环境是一个“浮动体”float它的位置不是固定的LaTeX会为了优化整个页面的排版比如避免难看的空白而自动调整其位置。当你想要并排多个子图时直接在一个figure里放多个\includegraphics命令结果通常是图片上下堆叠而非左右并排。更复杂的是如何为每个子图添加独立的(a),(b)标签和说明同时又能让整个组合图拥有一个总标题因此掌握LaTeX中并排多张图片及添加说明的方法不仅仅是记住几个命令更是理解其背后minipage、subfigure/subcaption等环境的工作原理和适用场景。这对于撰写学术论文、技术报告、实验手册等规范性文档至关重要能极大提升文档的专业性和可读性。无论你是正在被毕业论文折磨的学生还是需要制作精美技术文档的工程师这套技能都能让你从排版琐事中解放出来更专注于内容本身。2. 核心思路与方案选型从minipage到subcaptionbox要实现多图并排核心思路是在一个固定的水平空间内划分出几个并排的“小容器”每个容器里独立放置图片和其说明。LaTeX提供了多种工具来实现这个思路我们需要根据复杂度、灵活性和兼容性进行选择。2.1 基础方案minipage环境minipage是LaTeX中最基础、最通用的创建固定宽度文本块的命令。你可以把它想象成页面中的一个小型“子页面”。用它来并排图片的原理很简单创建多个宽度合适的minipage让它们在同一行依次排列。为什么选择minipage它的优势在于极其简单和直接不依赖任何额外的宏包是LaTeX内核自带的功能。对于简单的两图并排且不需要复杂的子图标签时它是快速上手的首选。其工作原理是定义了一个具有指定宽度和高度的盒子盒子内的内容独立排版可以包含几乎任何内容文本、图片、表格等。它的局限性也很明显手动对齐繁琐你需要精确计算每个minipage的宽度并考虑它们之间的间隔\hspace。图片的垂直对齐顶部、居中、底部也需要额外调整。子图标签需手动管理minipage本身不提供像“(a)”、“(b)”这样的自动标签。你需要手动添加\textbf{(a)}之类的标记并且无法直接利用LaTeX的交叉引用系统来引用某个特定的子图。与caption的配合在minipage内使用\caption命令需要格外小心通常不建议这么做因为minipage不是浮动体其内的\caption不会加入图表目录。2.2 专业方案subfigure环境 (已过时) 与subcaption宏包历史上subfigure宏包是解决此问题的标准方案。它提供了subfigure环境可以很方便地创建带标签的子图。为什么不推荐subfigure虽然它曾经流行但该宏包已经多年未维护与现代的caption宏包在样式定制上可能存在冲突并且其语法相对陈旧。在当前的LaTeX实践中它已被更强大、更现代的subcaption宏包所取代。现代标准subcaption宏包subcaption宏包是目前最推荐、最专业的解决方案。它提供了两个核心环境subfigure和subtable其设计目标就是与标准的figure和table环境无缝集成。为什么subcaption是首选自动标签与引用它可以自动生成并管理子图标签如 (a), (b), (c)并且你可以像引用普通图表一样用\ref{fig:sub1}来精确引用某一个子图用\ref{fig:main}来引用整个组合图。样式高度可定制通过caption宏包subcaption通常与之配合使用你可以全局调整子图标签的格式字体、括号样式、编号体系等。完美的浮动体集成子图被完美地封装在父figure环境中共享一个浮动体位置和一个总标题 (\caption)同时每个子图又有自己的子标题 (\subcaption)。灵活的布局配合\hfill、\qquad等间距命令或tabular环境可以轻松实现复杂的多行多列图片排列。2.3 轻量级方案subcaptionbox命令subcaption宏包还提供了一个更简洁的命令\subcaptionbox。它可以说是minipage的“智能升级版”。\subcaptionbox解决了minipage的哪些痛点自动宽度你可以指定内容如图片\subcaptionbox会自动计算其宽度无需手动设定minipage的[width]参数。集成子标题直接在命令参数中写入子标题文本它会自动生成格式正确的子标题带标签并放置在图片下方或你指定的位置。引用支持和subfigure环境一样它生成的子图也可以被交叉引用。它最适合什么场景当你需要快速创建一个简单的、并排的子图结构且不希望嵌套多层环境代码时\subcaptionbox非常高效。它的语法更接近直接插入图片思维负担小。选择建议对于学术论文、书籍等正式文档无脑选择subcaption宏包并使用subfigure环境或\subcaptionbox命令。这是当前社区和大多数期刊模板的标准实践。minipage仅适用于极其简单的临时需求。3. 核心细节解析与实操要点理解了方案选型我们深入每个方案的实现细节。这里会包含大量的“为什么”和“注意事项”这些都是文档里不会写的实战经验。3.1 使用minipage的基础与陷阱假设我们要并排两张宽度为0.45倍行宽 (0.45\textwidth) 的图片中间留出0.1倍行宽的间隔。\begin{figure}[htbp] \centering % 第一个 minipage 宽度占页面宽度的45% \begin{minipage}[t]{0.45\textwidth} \centering \includegraphics[width\linewidth]{example-image-a} % \linewidth 在这里等于 minipage 的宽度 \par\vspace{2pt} % 微调图片和手动标签的间距 \textbf{(a)} 这是对图A的手动说明。 \label{fig:manual-a} % 注意这个 label 实际上引用的是整个 figure而不是子图 \end{minipage} \hfill % 这是一个弹性填充会把两个 minipage 推到两边中间产生最大间隔 % 第二个 minipage \begin{minipage}[t]{0.45\textwidth} \centering \includegraphics[width\linewidth]{example-image-b} \par\vspace{2pt} \textbf{(b)} 这是对图B的手动说明。 \label{fig:manual-b} % 同样这个 label 引用的是整个 figure \end{minipage} \caption{使用 minipage 并排两张图片的示例。} \label{fig:minipage-demo} \end{figure}关键细节与避坑指南[t]对齐参数\begin{minipage}[t]{width}中的[t]表示顶部对齐 (top)。这意味着多个并排的minipage的顶部基线会对齐。如果你使用[c]居中或[b]底部当每个minipage内内容高度不同时排版效果会非常奇怪。对于图片并排一律建议使用[t]顶部对齐这样图片的顶边是平的。\linewidth的妙用在minipage内部\linewidth这个长度变量会自动变为当前minipage的宽度。因此设置\includegraphics[width\linewidth]意味着让图片宽度刚好撑满这个“小容器”这是实现等宽图片最省事的方法。如果你硬编码为width0.4\textwidth一旦调整外层minipage的宽度图片大小不会自动适应。\hfill的作用\hfill是一个“弹性空间”glue它会尽可能伸展以填充所在行的剩余空间。放在两个minipage之间它会把左边的盒子向左推右边的盒子向右推从而在中间创造出均匀的间距。这比使用固定的\hspace{2cm}更灵活能自动适应不同的页面布局。\label的严重问题大坑注意看代码中的注释。在minipage内部放置的\label其引用的对象并不是这个子图而是外层最近的计数器——在这里就是figure环境。所以\ref{fig:manual-a}和\ref{fig:manual-b}输出的都是整个组合图的编号比如“图1”而不是你期望的“(a)”或“(b)”。minipage方案无法实现真正的子图交叉引用这是它最大的硬伤。手动标签的麻烦你需要自己写\textbf{(a)}如果后续增删子图所有标签都需要手动更新极易出错。3.2 使用subcaption宏包的专业实践首先在导言区引入宏包\usepackage{subcaption}。subcaption宏包会自动加载caption宏包所以通常不需要单独\usepackage{caption}。标准subfigure环境用法\begin{figure}[htbp] \centering \begin{subfigure}[t]{0.45\textwidth} \centering \includegraphics[width\linewidth]{example-image-a} \caption{子图A的详细说明。} \label{fig:sub-a} \end{subfigure} \hfill \begin{subfigure}[t]{0.45\textwidth} \centering \includegraphics[width\linewidth]{example-image-b} \caption{子图B的详细说明。} \label{fig:sub-b} \end{subfigure} \caption{使用 subcaption 宏包排版的并排图片示例。} \label{fig:sub-demo} \end{figure}使用\subcaptionbox命令的等价写法\begin{figure}[htbp] \centering \subcaptionbox{子图A的详细说明。\label{fig:box-a}}% [0.45\textwidth] % 子图的宽度 {\includegraphics[width\linewidth]{example-image-a}} \hfill \subcaptionbox{子图B的详细说明。\label{fig:box-b}}% [0.45\textwidth] {\includegraphics[width\linewidth]{example-image-b}} \caption{使用 \texttt{\textbackslash subcaptionbox} 命令排版的并排图片示例。} \label{fig:box-demo} \end{figure}核心优势解析自动化的标签与引用这是最核心的改进。\caption和\subcaption命令会自动处理编号。在文中你可以用图\ref{fig:sub-demo}中的\subref{fig:sub-a}来生成像“图1中的(a)”这样的引用。\subref命令是subcaption提供的专门用于引用子图标签。样式统一管理通过caption宏包的设置你可以一次性定义所有图表标题的字体、间距、编号格式。例如在导言区添加\usepackage{caption} \captionsetup[figure]{fontsmall, labelfontbf} % 设置图标题字体 \captionsetup[subfigure]{labelformatsimple, labelsepcolon} % 设置子图标签格式为 (a):这确保了全文图表风格一致这是手动使用minipage无法轻易实现的。更清晰的代码结构subfigure环境或\subcaptionbox命令将图片、子标题、标签捆绑成一个逻辑单元代码的意图一目了然易于维护和修改。3.3 复杂布局多行多列图片排列当需要排列多于两张图片例如2x2的四宫格时subcaption方案依然游刃有余。你可以嵌套使用或者结合tabular环境。方法一连续使用\hfill与换行\begin{figure}[htbp] \centering % 第一行 \begin{subfigure}[t]{0.45\textwidth} \centering \includegraphics[width\linewidth]{img1} \caption{图1} \label{fig:s1} \end{subfigure} \hfill \begin{subfigure}[t]{0.45\textwidth} \centering \includegraphics[width\linewidth]{img2} \caption{图2} \label{fig:s2} \end{subfigure} \\[4pt] % 换行并增加一点行间距 % 第二行 \begin{subfigure}[t]{0.45\textwidth} \centering \includegraphics[width\linewidth]{img3} \caption{图3} \label{fig:s3} \end{subfigure} \hfill \begin{subfigure}[t]{0.45\textwidth} \centering \includegraphics[width\linewidth]{img4} \caption{图4} \label{fig:s4} \end{subfigure} \caption{一个2x2的多图布局示例。} \label{fig:grid} \end{figure}方法二使用tabular环境进行更精确的网格控制\begin{figure}[htbp] \centering \begin{tabular}{{}cc{}} % {} 取消表格两边的边距使图片更靠近 % 第一行 \begin{subfigure}[t]{0.48\linewidth} \centering \includegraphics[width\linewidth]{img1} \caption{图1} \label{fig:t1} \end{subfigure} \begin{subfigure}[t]{0.48\linewidth} \centering \includegraphics[width\linewidth]{img2} \caption{图2} \label{fig:t2} \end{subfigure} \\ % 第二行 \begin{subfigure}[t]{0.48\linewidth} \centering \includegraphics[width\linewidth]{img3} \caption{图3} \label{fig:t3} \end{subfigure} \begin{subfigure}[t]{0.48\linewidth} \centering \includegraphics[width\linewidth]{img4} \caption{图4} \label{fig:t4} \end{subfigure} \end{tabular} \caption{使用 tabular 环境实现的2x2网格布局。} \label{fig:tabular-grid} \end{figure}实操心得对于简单的等宽等间距排列方法一\hfill 换行更直观。但如果需要更复杂的对齐比如某些列宽不同或者需要添加垂直分隔线方法二tabular提供了像素级的控制能力。使用tabular时注意用{}修饰列定义来消除默认的列间距否则图片之间会有不必要的空白。4. 实操过程与核心环节实现让我们通过一个完整的、贴近真实论文需求的例子将上述知识串联起来。我们的目标是创建一个包含3个子图的组合图子图宽度不等模拟实验结果对比图有独立标签和说明总标题格式符合学术规范并且能在文中正确引用。4.1 步骤一文档准备与宏包引入首先创建一个基本的LaTeX文档框架并引入必要的宏包。\documentclass[11pt, a4paper]{article} % 使用 article 文档类11pt字体A4纸 \usepackage{graphicx} % 必须插入图片 \usepackage{subcaption} % 核心子图支持会自动加载 caption 宏包 \usepackage{hyperref} % 可选但推荐使交叉引用可点击并解决某些引用问题 \usepackage{lipsum} % 仅用于示例生成填充文本 % 通过 caption 宏包进行样式微调 \captionsetup[figure]{fontsmall, labelfontbf, justificationcentering} % 图标题小号字体标签加粗居中 \captionsetup[subfigure]{labelformatparens, labelsepspace, fontfootnotesize} % 子图标签格式为(a)分隔符为空格字体更小 \begin{document} \section{实验结果与分析} \lipsum[1][1-3] % 一些示例文本 % 图片将插入在这里 \lipsum[2][1-3] % 更多示例文本用于展示浮动效果 \end{document}关键点解析hyperref宏包最好在最后引入除了少数如cleveref等特定宏包它能智能处理引用并生成PDF书签和可点击链接极大提升阅读体验。\captionsetup的设置在导言区进行是全局生效的。这里我们将子图标签格式设为括号(a)子标题字体设为footnotesize比主标题更小这是学术论文中常见的做法使得层次更清晰。4.2 步骤二构建浮动体与子图现在我们在\section后面插入我们的组合图代码。假设三张图分别是“方法示意图”、“原始数据图”和“结果对比图”且我们希望第二张图数据图稍宽一些。\begin{figure}[htbp] % 位置参数h-此处t-顶部b-底部p-独立页!-忽略某些限制 \centering % 整个 figure 环境居中 % 子图 (a)方法示意图宽度占页面30% \begin{subfigure}[t]{0.3\textwidth} \centering \includegraphics[width\linewidth, height5cm, keepaspectratio]{method_diagram.pdf} % 建议使用矢量图PDF \caption{本研究提出的方法框架示意图。} % 子标题 \label{fig:exp-method} \end{subfigure} \hfill % 弹性间隔将 (a) 和 (b) 推开 % 子图 (b)原始数据图宽度占页面45% \begin{subfigure}[t]{0.45\textwidth} \centering \includegraphics[width\linewidth]{raw_data_plot.png} % 位图如PNG \caption{实验采集的原始数据分布。注意在X轴附近的异常点。} % 子标题可以较长会自动换行 \label{fig:exp-data} \end{subfigure} \hfill % 弹性间隔将 (b) 和 (c) 推开 % 子图 (c)结果对比图宽度占页面20% \begin{subfigure}[t]{0.2\textwidth} \centering \includegraphics[width\linewidth]{result_comparison.pdf} \caption{与基线方法的性能对比柱状图。} \label{fig:exp-result} \end{subfigure} % 整个组合图的总标题 \caption{实验核心结果汇总。(a) 展示了方法框架(b) 呈现了原始数据特征其中可见少量异常点(c) 定量对比证明了本方法的优越性。} \label{fig:all-results} % 整个图的标签用于引用 \end{figure}关键参数与技巧[htbp]位置参数这是给LaTeX的“建议”。h(here) 表示尽量放在代码所在位置t(top) 放在页面顶部b(bottom) 页面底部p(page) 独立成页。LaTeX会综合评估页面剩余空间、浮动体大小等因素选择最合适的位置。不要只用[h]如果当前位置放不下LaTeX可能会将图片推到很后面导致“图全跑最后”的问题。[htbp]给了编译器更多灵活性。图片尺寸控制\includegraphics支持多种参数。width\linewidth最佳实践让图片宽度自适应容器。height5cm, keepaspectratio当你需要精确控制图片高度同时又不想它变形时这样设置。keepaspectratio会保持宽高比自动计算宽度。文件格式优先使用矢量图.pdf,.eps它们在缩放时不会失真。位图.png,.jpg应确保分辨率足够通常≥300 DPI用于印刷。子图宽度分配0.3 0.45 0.2 0.95为什么不是1因为我们在子图之间使用了\hfill它需要一定的空间来伸展。如果总和为1\hfill没有空间图片会紧挨在一起。留出一些余量比如总宽0.95可以让\hfill产生美观的间距。你也可以用固定的\hspace{1cm}来精确控制。总标题 (\caption) 的撰写技巧好的总标题应简要概括整个图的内容并可以依次提及子图 (a), (b), (c) 分别展示了什么。这帮助读者快速建立整体认知再通过子标题了解细节。4.3 步骤三在文中进行交叉引用图片插入后我们需要在正文中引用它。如图\ref{fig:all-results}所示本研究的主要实验成果包括方法框架、数据分析和性能对比。具体而言\subref{fig:exp-method}展示了我们提出的核心算法流程从\subref{fig:exp-data}中观察到的数据分布特性为我们调整参数提供了依据最终如\subref{fig:exp-result}的定量比较结果证实新方法在准确率上提升了约15\%。编译后效果假设这是文档中的图1“如图1所示本研究的主要实验成果...具体而言(a)展示了...(b)中观察到的...(c)的定量比较结果证实...”为什么这样引用\ref{fig:all-results}生成整个组合图的编号如“1”。\subref{fig:exp-method}生成对应子图的标签如“(a)”。\subref是subcaption宏包提供的命令专门用于此目的。不要用\ref去引用子图标签那样只会得到子图的计数器值一个数字而不是带括号的标签。5. 常见问题与排查技巧实录即使按照步骤操作在实际编译过程中还是会遇到各种问题。下面是我在多年使用中总结的“血泪教训”和解决方案。5.1 图片位置“乱飞”或集中在文档末尾问题现象图片没有出现在代码插入的附近而是全部堆积在了文档最后一页或某一节之后。根本原因LaTeX的浮动体figure,table机制。编译器为了优化版面避免大块空白或分页难看会自主决定浮动体的位置。[htbp]只是建议并非强制。解决方案放宽位置建议使用[!htbp]中的!可以放宽LaTeX内部的一些排版限制有时能让图片更靠近当前位置。使用float宏包强制放置在导言区加\usepackage{float}然后在figure环境中使用[H]大写H选项。这会将浮动体强制转换为一个不可浮动的“盒子”严格放在代码位置。\usepackage{float} ... \begin{figure}[H] % 强制定位慎用 ... \end{figure}警告过度使用[H]会导致页面出现大量难以消除的空白破坏整体排版美感。应仅在极其必要时如图表必须紧跟某段文字使用。微调浮动体参数高级在导言区可以修改LaTeX控制浮动体位置频率的参数例如\setcounter{topnumber}{2} % 页面顶部最多放置2个浮动体 \renewcommand{\topfraction}{0.7} % 页面顶部最多可被浮动体占据70%的面积 \setcounter{bottomnumber}{2} \renewcommand{\bottomfraction}{0.7} \setcounter{totalnumber}{4} \renewcommand{\textfraction}{0.2} % 正文至少占页面20% \renewcommand{\floatpagefraction}{0.7} % 浮动页中浮动体至少占70%这些参数调整需要反复尝试不推荐新手直接使用。接受浮动排版很多时候LaTeX自动排版的结果比我们手动固定更好看。只要在文中正确引用如图\ref{fig:xxx}所示读者都能找到对应的图。这是最推荐的心态。5.2 子图编号或引用错误问题现象编译后子图标签显示为“??”或者引用时显示错误编号。排查步骤编译次数LaTeX的交叉引用需要编译两到三次才能稳定。第一次编译生成.aux文件记录标签第二次编译读取并正确输出编号。如果使用了hyperref或cleveref宏包可能需要编译三次。修改标签或增删图表后务必连续编译两次。标签位置确保\label命令放在\caption或\subcaption之后。因为编号是在\caption执行时才生成的\label需要记录这个刚生成的编号。% 正确 \caption{...}\label{fig:xxx} % 错误 \label{fig:xxx}\caption{...}宏包冲突确保没有加载过时的subfigure宏包。subfigure和subcaption宏包绝对不能同时使用它们的命令会冲突。只使用\usepackage{subcaption}。清除辅助文件如果问题诡异尝试删除项目文件夹中所有的.aux,.log,.out,.toc,.lof,.lot等辅助文件然后重新编译。5.3 图片大小不一致或对齐参差不齐问题现象并排的图片底部或顶部没有对齐看起来歪歪扭扭。解决方案统一使用[t]顶部对齐如前所述在所有subfigure或minipage环境中使用[t]选项。检查图片原始尺寸即使设置了相同的width\linewidth如果图片原始宽高比差异巨大它们的高度也会不同。可以通过设置统一的height并保持宽高比来强制统一高度。\includegraphics[height4cm, keepaspectratio]{img1} \includegraphics[height4cm, keepaspectratio]{img2}使用tabular环境进行网格化对齐对于多行多列且对齐要求极高的场景tabular环境能提供单元格级别的严格对齐是终极解决方案。微调垂直偏移如果因图片内容本身如坐标轴标签导致视觉上未对齐可以在\includegraphics时使用valign参数需要graphicx宏包或将其放入\raisebox中进行微调但这属于比较精细的操作。5.4 总标题与子标题的格式定制问题需求想让子标题的编号是“a.”而不是“(a)”或者想改变字体、间距。解决方案全部通过\captionsetup在导言区搞定。\usepackage{subcaption} % 设置子图标签格式小写字母后跟点加粗 \captionsetup[subfigure]{labelformatsimple, labelsepperiod, fontbf} % 设置子图标题整体格式悬挂缩进左对齐小字体 \captionsetup[subfigure]{singlelinecheckfalse, justificationraggedright, fontfootnotesize} % 设置图标题总标题与上下文的间距 \captionsetup[figure]{skip10pt} % 标题与图片/正文的间距labelformat可选simple(a),parens(a),brace{a}。labelsep标签和标题文本之间的分隔符如colon(:),period(.),space( )。singlelinecheckfalse允许子标题多行显示并启用justification对齐设置。5.5 与期刊/会议模板的兼容性问题问题现象自己写的代码在标准文档类里工作正常但套用某个期刊的官方.cls模板后子图排版出错或编号重置。应对策略最后加载宏包在导言区将subcaption和hyperref等宏包放在所有其他宏包之后期刊模板本身可能修改了很多内部命令后加载的宏包设置优先级更高。\documentclass{...} % 期刊模板 \usepackage{...} % 模板要求的一些宏包 ... \usepackage{subcaption} % 你的宏包放在最后 \usepackage{hyperref}查阅模板文档许多学术模板如IEEEtran, ACM有自己推荐的子图处理方式。有些甚至提供了自定义的命令如IEEE的\subfloat。优先遵循模板指南。隔离测试创建一个最小的测试文档只包含图片排版代码和该期刊的文档类逐步排查是哪个宏包或模板命令导致了冲突。谨慎使用caption样式设置模板可能已经全局定义了标题样式。你的\captionsetup可能会被覆盖或产生冲突。如果模板样式可以接受尽量不修改。如果必须修改使用\captionsetup的局部作用域版本\begin{figure} \captionsetup[subfigure]{...} % 这里的设置只对本 figure 内的子图有效 ... % 你的子图代码 \end{figure}掌握这些排查技巧你就能解决LaTeX图片排版中99%的常见问题。核心原则是理解浮动体机制、善用现代宏包subcaption、通过多次编译解决引用问题、在追求精确控制时接受必要的妥协。最终让LaTeX的强大自动化能力为你服务而不是与之对抗。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价