LaTeX 插入图片:位置、大小、子图与并排

LaTeX 插入图片的完整写法:graphicx 的 includegraphics 常用选项,figure 浮动体与位置参数 htbp,图片总是跑到别的页面怎么办,subcaption 子图,两张图并排和图表并排,图题与交叉引用,以及图片找不到的报错。

最后核对:2026-10-24

在 LaTeX 里插图,需要分清两件事:\includegraphics 把图片文件放进来,figure 环境给它加标题、编号,并决定它出现在页面的什么位置。初学者最困惑的"图片乱跑",就是第二件事的结果,而且多数时候是有意为之。本文的示例使用 TeX Live 自带的 mwe 宏包里的占位图(example-image、example-image-a 等),打开就能编译,不需要上传图片。

怎么插入一张图片

% !TEX program = xelatex
% title: LaTeX 插入图片
\documentclass{ctexart}
\usepackage{graphicx} % 提供 \includegraphics
% 图片放在子文件夹时,可以告诉 LaTeX 去哪里找(路径以 / 结尾)
\graphicspath{{figures/}}

\begin{document}

\section{插入一张图}
% example-image 来自 mwe 宏包,TeX Live 自带,用来占位。
% 换成自己的图时写文件名即可,如 \includegraphics{plot.pdf};
% 扩展名可以省略,XeLaTeX 支持 PDF、PNG、JPG
图~\ref{fig:demo} 是一张宽度为行宽 60\% 的图。

\begin{figure}[htbp]
  \centering
  \includegraphics[width=0.6\linewidth]{example-image}
  % 图的标题放在图下方;\label 写在 \caption 之后
  \caption{示例图片}
  \label{fig:demo}
\end{figure}

\section{常用选项}
% width / height 只写一个时按比例缩放;scale 按倍数;angle 旋转
\begin{figure}[htbp]
  \centering
  \includegraphics[height=3cm]{example-image-a}\quad
  \includegraphics[scale=0.15]{example-image-b}\quad
  \includegraphics[width=3cm, angle=90]{example-image-c}
  \caption{height、scale 和 angle}
  \label{fig:options}
\end{figure}

% trim=左 下 右 上 裁掉边缘,必须同时写 clip 才真正裁切
\begin{figure}[htbp]
  \centering
  \includegraphics[width=0.4\linewidth, trim=40 40 40 40, clip]{example-image}
  \caption{裁切四边各 40bp}
  \label{fig:trim}
\end{figure}

图~\ref{fig:options} 和图~\ref{fig:trim} 演示了缩放、旋转和裁切。

\end{document}
LaTeX 插入图片在 JointTex 中打开

要点:

  • 导言区加载 graphicx 宏包,正文用 \includegraphics[选项]{文件名}。
  • XeLaTeX 和 pdfLaTeX 都能直接插入 PDF、PNG、JPG。矢量图(PDF)放大不失真,用 Python、MATLAB 等画的图表优先导出为 PDF。手里只有 EPS 时,最好先转换成 PDF 再插入。
  • 文件名的扩展名可以省略,LaTeX 会按顺序尝试。文件名里最好不要有空格和中文,路径分隔符一律写 /。
  • 图片放在子文件夹时,可以每次写 figures/plot.pdf,也可以在导言区用 \graphicspath{{figures/}} 指定搜索目录(注意两层花括号和末尾的 /)。

图片大小怎么调

\includegraphics 的常用选项:

选项作用
width=0.8\linewidth宽度为当前行宽的 80%,高度按比例缩放
height=5cm高度为 5cm,宽度按比例缩放
scale=0.5按原始尺寸缩放到一半
angle=90逆时针旋转 90 度
trim=左 下 右 上, clip裁掉四边,必须加 clip 才真正裁掉
keepaspectratio同时给出宽和高时,保持比例、取较小的一个

推荐用 \linewidth 的比例来写宽度,而不是写死的厘米数。这样换模板、改成双栏时,图片会跟着版面变化。只写 width 或只写 height 时图片不会变形;两者都写又没有 keepaspectratio,图片会被拉伸。

选项是从左到右依次生效的:[angle=90, height=3cm] 是先旋转再把高度缩放到 3cm,和 [height=3cm, angle=90] 的结果不同。

图题和交叉引用怎么写

  • \caption{...} 写图题,图题习惯放在图的下方,所以写在 \includegraphics 后面(表题则在表格上方,见表格)。
  • \label{fig:xxx} 必须写在 \caption 之后,正文用 图~\ref{fig:xxx} 引用。~ 是不可断行的空格,避免"图"和编号被分到两行。
  • 引用显示为 ?? 时,多编译一次即可;仍然是 ??,检查 \label 和 \ref 的名字是否一致、\label 是否在 \caption 之后。
  • 用 ctex 文档类时,图题前缀是"图";需要改成"图 1 标题"这样的格式,用 caption 宏包的 \captionsetup{labelsep=quad}。

图片为什么总是跑到别的页面

figure 是浮动体:LaTeX 会把它挪到合适的位置,避免页面底部留下大片空白。它的可选参数告诉 LaTeX 允许放在哪里:

参数含义
hhere,大约在源码所在的位置
ttop,页面顶部
bbottom,页面底部
ppage,单独放在一个只有浮动体的页面
!放宽 LaTeX 对浮动体数量和占页比例的限制

几个经常被误解的地方:

  • 字母的顺序不重要。[bt] 和 [tb] 效果一样,LaTeX 总是按自己的固定顺序尝试这些位置。
  • 只写 [h] 往往适得其反。当前位置放不下时,LaTeX 会提示 `h' float specifier changed to `ht';更糟的情况是图片被推到文末。一般写 [htbp],给它最多的选择。
  • 不写参数时,article 和 book 等标准文档类的默认值是 tbp,也就是不会放在当前位置。
  • ! 不等于"必须放在这里"。它只是让 LaTeX 少考虑一些限制。

如果确实需要图片固定在源码的位置(比如实验报告、作业),有两个办法:

\usepackage{float}       % 提供 [H]
\begin{figure}[H]        % 大写 H:不再浮动,就放在这里
  ...
\end{figure}

\usepackage{placeins}    % 提供 \FloatBarrier
\FloatBarrier            % 在这之前的浮动体必须先排完

[H] 让图片不再浮动,代价是当前页放不下时,图片会整体移到下一页,并在当前页留下空白。\FloatBarrier 更温和,常放在每节开头,保证上一节的图不会跑进下一节。对于论文,更好的习惯是:用 [htbp],正文用"如图 3 所示"引用,而不是写"如下图所示",这样图片在哪一页都不影响阅读。

子图怎么做:图 1(a)、图 1(b)

几张图共用一个编号、各自带 (a)(b) 小标题时,用 subcaption 宏包的 subfigure 环境:

% !TEX program = xelatex
% title: 子图(subcaption)
\documentclass{ctexart}
\usepackage{graphicx}
\usepackage{subcaption} % 提供 subfigure 环境和子图编号 (a)(b)

\begin{document}

如图~\ref{fig:compare} 所示,图~\ref{fig:left} 是处理前,
图~\ref{fig:right} 是处理后;也可以只引用子图编号:\subref{fig:right}。

\begin{figure}[htbp]
  \centering
  % subfigure 的参数是子图所占宽度,两个 0.45 加中间的 \hfill 正好一行
  \begin{subfigure}{0.45\linewidth}
    \centering
    \includegraphics[width=\linewidth]{example-image-a}
    \caption{处理前}
    \label{fig:left}
  \end{subfigure}
  \hfill
  \begin{subfigure}{0.45\linewidth}
    \centering
    \includegraphics[width=\linewidth]{example-image-b}
    \caption{处理后}
    \label{fig:right}
  \end{subfigure}
  % 总标题和总标签放在所有子图之后
  \caption{处理前后对比}
  \label{fig:compare}
\end{figure}

% 2×2 排列:每行两个子图,行与行之间空一行(或用 \par)换行
\begin{figure}[htbp]
  \centering
  \begin{subfigure}{0.4\linewidth}
    \includegraphics[width=\linewidth]{example-image-a}
    \caption{第一组}
  \end{subfigure}\quad
  \begin{subfigure}{0.4\linewidth}
    \includegraphics[width=\linewidth]{example-image-b}
    \caption{第二组}
  \end{subfigure}

  \medskip
  \begin{subfigure}{0.4\linewidth}
    \includegraphics[width=\linewidth]{example-image-c}
    \caption{第三组}
  \end{subfigure}\quad
  \begin{subfigure}{0.4\linewidth}
    \includegraphics[width=\linewidth]{example-image}
    \caption{第四组}
  \end{subfigure}
  \caption{2×2 子图}
  \label{fig:grid}
\end{figure}

\end{document}
子图(subcaption)在 JointTex 中打开
  • subfigure 的参数是这个子图占的宽度,几个子图的宽度加上间距不能超过行宽,否则会被挤到下一行。
  • 子图之间用 \hfill 撑开,或用 \quad 留固定间距;想换行就空一行。
  • 每个子图有自己的 \caption 和 \label,\ref 得到"1a"这样的编号,\subref 只得到"a"。总标题写在所有子图之后。
  • 旧教程里常见的 subfigure 宏包及其后继 subfig 宏包已经多年没有维护。它们和 subcaption 定义了同名的计数器,混用会报错(例如 Command \c@subfigure already defined),一篇文档里只选一种。

两张图怎么并排

如果两张图要各自编号(图 1、图 2,而不是图 1(a)(b)),在一个 figure 里放两个 minipage,每个 minipage 写自己的 \caption。图和表并排时,外层用 figure,表格那一边用 caption 宏包的 \captionof{table}{...},就能得到"表"的编号:

% !TEX program = xelatex
% title: 两张图并排
\documentclass{ctexart}
\usepackage{graphicx}
\usepackage{caption} % 提供 \captionof,可在任意盒子里写图题或表题
\usepackage{booktabs}

\begin{document}

\section{两张独立编号的图并排}
% 一个 figure 里放两个 minipage,每个 minipage 有自己的 \caption,
% 得到“图 1”“图 2”两个编号(子图则是“图 1(a)(b)”)
\begin{figure}[htbp]
  \centering
  \begin{minipage}{0.45\linewidth}
    \centering
    \includegraphics[width=\linewidth]{example-image-a}
    \caption{左边的图}
    \label{fig:a}
  \end{minipage}\hfill
  \begin{minipage}{0.45\linewidth}
    \centering
    \includegraphics[width=\linewidth]{example-image-b}
    \caption{右边的图}
    \label{fig:b}
  \end{minipage}
\end{figure}

图~\ref{fig:a} 和图~\ref{fig:b} 各有编号。

\section{图和表并排}
% 外层用 figure,表格那一边用 \captionof{table}{...} 得到“表”的编号
\begin{figure}[htbp]
  \centering
  \begin{minipage}{0.48\linewidth}
    \centering
    \includegraphics[width=\linewidth]{example-image}
    \caption{实验装置}
    \label{fig:setup}
  \end{minipage}\hfill
  \begin{minipage}{0.48\linewidth}
    \centering
    \captionof{table}{装置参数}
    \label{tab:params}
    \begin{tabular}{lc}
      \toprule
      参数 & 数值 \\
      \midrule
      长度 & 1.2 m \\
      质量 & 3.5 kg \\
      \bottomrule
    \end{tabular}
  \end{minipage}
\end{figure}

图~\ref{fig:setup} 的参数列在表~\ref{tab:params} 中。

\end{document}
两张图并排在 JointTex 中打开

两个 minipage 之间如果有空行,它们会被排到上下两行;\hfill 前后不要留空行。

双栏论文里,图片怎么横跨两栏

期刊和会议的双栏模板里,figure 只有一栏宽,width=\linewidth 指的也是一栏的宽度。需要横跨两栏的大图时,用带星号的 figure* 环境,宽度写 \textwidth:

\begin{figure*}[t]
  \centering
  \includegraphics[width=\textwidth]{example-image}
  \caption{横跨两栏的图}
  \label{fig:wide}
\end{figure*}

figure* 默认只能放在页面顶部,或单独成页,所以它常常出现在源码位置的下一页,这是正常现象。表格也一样,横跨两栏用 table*。

插图之前,图片本身要准备好什么

  • 分辨率:位图(PNG、JPG)要按最终印刷尺寸准备足够的分辨率,具体数值以期刊或学校的投稿要求为准;小截图放大后会模糊,能导出矢量图就不要用截图。
  • 字体大小:图中文字最好与正文字号相近。先按版面宽度设置好画布尺寸再导出,比导出大图后在 LaTeX 里缩小更清楚。
  • 白边:图片四周的大片空白会让图看起来偏小,可以在导出时裁掉,或用上面的 trim 和 clip 选项裁掉。

报错:图片找不到

  • pdfLaTeX:File `figs/plot.png' not found。
  • XeLaTeX:日志里先有一条 LaTeX Warning: File `figs/plot.png' not found,接着是 Unable to load picture or PDF file 'figs/plot.png'。

先检查三件事:文件确实上传到了项目里,路径相对于主文件(main.tex)所在的目录,文件名的大小写与实际一致。Windows 不区分大小写,Plot.PNG 和 plot.png 在本地都能编译;在线编译运行在 Linux 上,大小写不同就是两个文件。更多报错见常见编译报错解读。

本文示例都可以在 JointTex 中一键打开为新项目,把占位图换成自己上传的图片即可。

JointTex

Browser compatibility

JointTex could not start

The application did not finish loading. Check your connection, then try again.

Supported versions

  • Chrome and Edge 88 or later
  • Firefox 84 or later
  • Safari and iOS Safari 14 or later
Reload