LaTeX 插图与 TikZ 绘图
完全指南
图表是学术论文中不可或缺的元素——实验结果的可视化、系统架构的示意图、算法的流程图都依赖于高质量的图表。本教程涵盖从插入外部图片到使用 TikZ 从零绘制矢量图的完整知识。
插入图片
LaTeX 通过 graphicx 宏包提供的 \includegraphics 命令插入外部图片。支持的格式取决于编译引擎:PDFLaTeX 支持 PDF、PNG、JPG;XeLaTeX 和 LuaLaTeX 在此基础上还支持 EPS。
\usepackage{graphicx}
% 基本插入——直接指定文件名(不带扩展名更灵活)
\includegraphics{figures/architecture}
% 常用选项
\includegraphics[width=0.8\textwidth]{figures/result-plot}
\includegraphics[height=5cm]{figures/diagram}
\includegraphics[scale=0.5]{figures/photo}
% 组合选项:指定宽度并保持宽高比,同时旋转
\includegraphics[width=0.6\textwidth, angle=90]{figures/landscape-chart}最常用的选项是 width 和 height。推荐使用相对单位如 \textwidth 或 \linewidth,这样图片会随版面宽度自动缩放。如果只指定宽度或高度中的一个,LaTeX 会自动保持原始宽高比。
图片位置控制
在正式论文中,图片应该放在 figure 浮动体环境中。LaTeX 会根据你给出的位置偏好参数自动选择最佳放置位置:
h— here,尽量放在代码出现的位置t— top,放在页面顶部b— bottom,放在页面底部p— page,放在一个专门的浮动页上H— 强制放在当前位置(需要float宏包)
\usepackage{graphicx}
\usepackage{float} % 提供 [H] 选项
\begin{figure}[htbp]
\centering
\includegraphics[width=0.85\textwidth]{figures/training-loss}
\caption{训练过程中损失函数的变化曲线。
实线表示训练集损失,虚线表示验证集损失。}
\label{fig:training-loss}
\end{figure}
% 在正文中引用
如图~\ref{fig:training-loss}~所示,模型在第 50 个 epoch
后开始收敛。[htbp] 是最常用的组合,意思是:先尝试放在这里,不行就放顶部,再不行放底部,最后放浮动页。避免单独使用 [h],因为如果当前位置放不下,LaTeX 可能会把图片推到文档末尾。子图排版
当你需要在一个浮动体中并排放置多张图片(例如对比实验结果),可以使用 subcaption 宏包提供的 subfigure 环境。每个子图有独立的标题和标签,可以单独引用。
\usepackage{graphicx}
\usepackage{subcaption}
\begin{figure}[htbp]
\centering
\begin{subfigure}[b]{0.48\textwidth}
\centering
\includegraphics[width=\textwidth]{figures/result-baseline}
\caption{Baseline 方法}
\label{fig:baseline}
\end{subfigure}
\hfill
\begin{subfigure}[b]{0.48\textwidth}
\centering
\includegraphics[width=\textwidth]{figures/result-ours}
\caption{本文方法}
\label{fig:ours}
\end{subfigure}
\caption{两种方法在测试集上的分割结果对比。
(a) Baseline 存在明显的边界模糊;
(b) 本文方法的边界更加清晰。}
\label{fig:comparison}
\end{figure}
% 引用方式
图~\ref{fig:comparison}~展示了对比结果,其中
图~\ref{fig:baseline}~为 Baseline,
图~\ref{fig:ours}~为本文方法。关键技巧:两个子图的宽度之和应略小于 \textwidth(例如各 0.48),中间用 \hfill 填充间距。如果需要三张图并排,可以各设为 0.31 并加两个 \hfill。需要 2x2 排列时,在两行子图之间加一个空行或 \vspace。
TikZ 基础
TikZ 是 LaTeX 中最强大的矢量绘图工具,全称为 “TikZ ist kein Zeichenprogramm”(TikZ 不是一个绘图程序)。它通过声明式的代码描述图形,编译后生成高质量的矢量图,与正文字体和样式完美融合。
\usepackage{tikz}
\begin{tikzpicture}
% 绘制直线
\draw (0,0) -- (3,0);
% 绘制带箭头的线段
\draw[->, thick] (0,-0.5) -- (3,-0.5);
% 绘制矩形
\draw[blue, thick] (0,-1.5) rectangle (2,-2.5);
% 绘制填充矩形
\fill[blue!20] (2.5,-1.5) rectangle (4.5,-2.5);
\draw[blue, thick] (2.5,-1.5) rectangle (4.5,-2.5);
% 绘制圆
\draw[red, thick] (1,-4) circle (0.8);
% 绘制填充圆
\filldraw[fill=red!20, draw=red, thick] (3.5,-4) circle (0.8);
% 添加文字标注
\node at (1,-4) {A};
\node at (3.5,-4) {B};
\end{tikzpicture}TikZ 的核心概念:坐标用 (x,y) 表示(单位默认为厘米),\draw 绘制轮廓,\fill 填充区域,\filldraw 同时绘制轮廓并填充,\node 放置文字。颜色可以使用 blue!20 这样的混合语法表示 20% 的蓝色(即浅蓝色)。
流程图与架构图
TikZ 最常见的应用场景之一是绘制流程图。通过加载 shapes.geometric 和 positioning 库,你可以用节点和边轻松构建流程图。
\usepackage{tikz}
\usetikzlibrary{shapes.geometric, arrows.meta, positioning}
\begin{tikzpicture}[
node distance=1.5cm,
% 定义节点样式
startstop/.style={
rectangle, rounded corners, minimum width=3cm,
minimum height=1cm, text centered,
draw=black, fill=red!30
},
process/.style={
rectangle, minimum width=3cm, minimum height=1cm,
text centered, draw=black, fill=blue!20
},
decision/.style={
diamond, minimum width=3cm, minimum height=1cm,
text centered, draw=black, fill=green!20,
aspect=2
},
arrow/.style={
thick, ->, >=Stealth
}
]
% 放置节点
\node (start) [startstop] {开始};
\node (input) [process, below of=start] {输入数据};
\node (process) [process, below of=input] {数据预处理};
\node (decide) [decision, below of=process] {准确率 > 90\%?};
\node (output) [process, below of=decide,
yshift=-0.5cm] {输出模型};
\node (stop) [startstop, below of=output] {结束};
\node (adjust) [process, right of=decide,
xshift=3cm] {调整超参数};
% 连接节点
\draw [arrow] (start) -- (input);
\draw [arrow] (input) -- (process);
\draw [arrow] (process) -- (decide);
\draw [arrow] (decide) -- node[anchor=east] {是} (output);
\draw [arrow] (decide) -- node[anchor=south] {否} (adjust);
\draw [arrow] (adjust) |- (process);
\draw [arrow] (output) -- (stop);
\end{tikzpicture}流程图的核心思路是先定义样式(.style),再放置节点(\node),最后用 \draw 连接。-- 表示直线连接,|- 表示先竖后横的折线,-| 表示先横后竖。positioning 库让你可以用 below of、right of 等相对定位而非手动计算坐标。
神经网络架构图示例
TikZ 还非常适合绘制论文中常见的神经网络架构示意图。下面是一个简化的多层感知机(MLP):
\usepackage{tikz}
\usetikzlibrary{positioning}
\begin{tikzpicture}[
neuron/.style={circle, draw, minimum size=0.8cm,
inner sep=0pt, fill=blue!10},
input/.style={neuron, fill=green!15},
output/.style={neuron, fill=red!15},
layer label/.style={font=\small, text=gray},
]
% Input layer
\foreach \i in {1,...,3}
\node[input] (I-\i) at (0, -\i*1.2) {$x_{\i}$};
% Hidden layer
\foreach \j in {1,...,4}
\node[neuron] (H-\j) at (2.5, -\j*1.2+0.6) {$h_{\j}$};
% Output layer
\foreach \k in {1,...,2}
\node[output] (O-\k) at (5, -\k*1.2-0.6) {$y_{\k}$};
% Connections: input -> hidden
\foreach \i in {1,...,3}
\foreach \j in {1,...,4}
\draw[->, gray!60] (I-\i) -- (H-\j);
% Connections: hidden -> output
\foreach \j in {1,...,4}
\foreach \k in {1,...,2}
\draw[->, gray!60] (H-\j) -- (O-\k);
% Layer labels
\node[layer label, above=0.3cm of I-1] {Input};
\node[layer label, above=0.3cm of H-1] {Hidden};
\node[layer label, above=0.3cm of O-1] {Output};
\end{tikzpicture}CoCraft 的 AI 图表生成
TikZ 功能强大但学习曲线较陡。手动编写复杂图表的代码需要反复调整坐标和样式,耗时不少。CoCraft 的 AI 图表生成功能让你可以用自然语言描述想要的图表——例如 “画一个包含编码器和解码器的 Transformer 架构图”——AI 会自动生成对应的 TikZ 代码,并在编辑器中实时预览。你还可以上传手绘草图或参考图片,AI 会将其转化为精确的矢量图代码。
生成的代码完全可编辑,你可以在此基础上微调颜色、间距和标注,既省去了从零开始的繁琐,又保留了对每个细节的完全控制。
用 AI 生成 TikZ 图表
在 CoCraft 中用自然语言描述你想要的图表,AI 自动生成 TikZ 代码。
edit_document免费开始使用