跳到主要内容

图表处理

图表是学术论文和技术文档的重要组成部分。LaTeX 提供了强大的图表处理功能,但也因其"浮动体"机制而让初学者感到困惑。本章将深入讲解如何在 LaTeX 中插入和管理图片与表格,以及如何有效控制浮动体的位置。

图片插入基础

加载宏包

\usepackage{graphicx}       % 图片插入核心宏包
\usepackage{grffile} % 支持文件名中的特殊字符(可选)

基本插入方法

% 最简单的插入
\includegraphics{image.png}

% 指定宽度
\includegraphics[width=0.8\textwidth]{image.png}

% 指定高度
\includegraphics[height=5cm]{image.png}

% 指定缩放比例
\includegraphics[scale=0.5]{image.png}

% 同时指定宽度和高度(可能变形)
\includegraphics[width=5cm, height=3cm]{image.png}

% 保持比例缩放
\includegraphics[width=5cm, height=3cm, keepaspectratio]{image.png}

图片选项详解

选项说明示例
width设置宽度width=\textwidth
height设置高度height=5cm
scale缩放比例scale=0.5
angle旋转角度angle=90
origin旋转中心origin=c
trim裁剪(左下右上)trim=1cm 2cm 1cm 2cm
clip启用裁剪clip=true
keepaspectratio保持宽高比keepaspectratio

裁剪与旋转

% 裁剪图片(trim: 左 下 右 上)
\includegraphics[trim=1cm 2cm 1cm 2cm, clip]{image.png}

% 旋转图片
\includegraphics[angle=45]{image.png}

% 旋转并指定中心点
\includegraphics[angle=45, origin=c]{image.png} % 中心
\includegraphics[angle=45, origin=lt]{image.png} % 左上角

% 组合使用
\includegraphics[width=0.5\textwidth, angle=90]{image.png}

图片路径设置

% 设置图片搜索路径
\graphicspath{{figures/}{images/}{photos/}}

% 使用相对路径
\includegraphics{figures/chapter1/diagram.png}

% 使用绝对路径(不推荐,可移植性差)
\includegraphics{/home/user/project/images/image.png}

浮动体深入理解

什么是浮动体?

浮动体(float)是 LaTeX 中一种特殊的排版机制。当图片或表格太大无法放在当前位置时,LaTeX 会将其"浮动"到页面中更合适的位置。

为什么需要浮动体?

  • 避免页面底部出现大片空白
  • 保持正文排版的紧凑性
  • 自动优化页面布局

浮动体的类型

环境类型默认行为
figure图片浮动体可浮动到页顶、页底或单独页
table表格浮动体同上
algorithm算法浮动体同上

位置选项详解

\begin{figure}[htbp]
...
\end{figure}
选项含义优先级
hhere,当前位置首选
ttop,页面顶部次选
bbottom,页面底部再次
ppage,单独一页最后
!忽略限制覆盖

选项组合原则

% 推荐:允许 LaTeX 灵活选择
\begin{figure}[htbp]

% 更宽松
\begin{figure}[!htbp]

% 强制当前位置(需要 float 宏包)
\usepackage{float}
\begin{figure}[H]

浮动体计数器

LaTeX 对每页的浮动体数量有限制:

% 调整每页浮动体数量限制
\setcounter{topnumber}{5} % 页顶最多5个
\setcounter{bottomnumber}{5} % 页底最多5个
\setcounter{totalnumber}{10} % 每页总共最多10个

% 调整浮动体占页面的最大比例
\renewcommand{\topfraction}{0.9} % 页顶最多占90%
\renewcommand{\bottomfraction}{0.9} % 页底最多占90%
\renewcommand{\textfraction}{0.1} % 正文至少占10%
\renewcommand{\floatpagefraction}{0.7} % 浮动页至少70%是浮动体

浮动体控制技巧

精确位置控制

\usepackage{float}

% H 选项强制当前位置
\begin{figure}[H]
\centering
\includegraphics{image.png}
\caption{标题}
\end{figure}

阻止浮动跨节

\usepackage{placeins}

% 在特定位置强制输出所有浮动体
\FloatBarrier

% 自动在每个 section 前插入 FloatBarrier
\usepackage[section]{placeins}

强制输出所有浮动体

% 清空浮动体并换页
\clearpage

% 清空浮动体不换页(需要 afterpage 宏包)
\usepackage{afterpage}
\afterpage{\clearpage}

图片浮动体

标准用法

\begin{figure}[htbp]
\centering % 居中
\includegraphics[width=0.8\textwidth]{image.png}
\caption{图片标题} % 标题
\label{fig:example} % 标签(放在 caption 后)
\end{figure}

标题位置

% 标题在图片下方(默认)
\begin{figure}
\centering
\includegraphics{image.png}
\caption{标题在下方}
\end{figure}

% 标题在图片上方
\begin{figure}
\centering
\caption{标题在上方}
\includegraphics{image.png}
\end{figure}

% 标题在侧边(使用 sidecap 宏包)
\usepackage[leftcaption]{sidecap}
\begin{SCfigure}
\includegraphics{image.png}
\caption{标题在侧边}
\end{SCfigure}

子图处理

使用 subcaption 宏包处理子图:

\usepackage{subcaption}

\begin{figure}[htbp]
\centering
\begin{subfigure}[b]{0.45\textwidth}
\centering
\includegraphics[width=\textwidth]{image1.png}
\caption{子图A}
\label{fig:sub1}
\end{subfigure}
\hfill
\begin{subfigure}[b]{0.45\textwidth}
\centering
\includegraphics[width=\textwidth]{image2.png}
\caption{子图B}
\label{fig:sub2}
\end{subfigure}
\caption{总标题}
\label{fig:total}
\end{figure}

引用子图:

如图 \ref{fig:sub1} 所示...
整个图 \ref{fig:total} 显示...

表格排版

基本表格

\begin{tabular}{|c|c|c|}
\hline
列1 & 列2 & 列3 \\
\hline
数据1 & 数据2 & 数据3 \\
数据4 & 数据5 & 数据6 \\
\hline
\end{tabular}

列格式说明

格式说明
l左对齐
c居中
r右对齐
p{宽度}指定宽度,自动换行
m{宽度}垂直居中的段落列
b{宽度}底部对齐的段落列
|竖线分隔符
@{内容}自定义列间内容
% 自定义列间距
\begin{tabular}{l@{\hspace{2cm}}r}
左列 & 右列
\end{tabular}

% 取消列间距
\begin{tabular}{@{}lll@{}}
无边框表格
\end{tabular}

% 段落列
\begin{tabular}{p{3cm}p{5cm}}
短文本 & 这是一段很长的文本,会自动换行显示在多行中
\end{tabular}

专业表格(booktabs)

booktabs 宏包提供更专业的表格样式:

\usepackage{booktabs}

\begin{tabular}{lccc}
\toprule
方法 & 准确率 & 召回率 & F1值 \\
\midrule
方法A & 0.85 & 0.82 & 0.83 \\
方法B & 0.88 & 0.86 & 0.87 \\
方法C & 0.91 & 0.89 & 0.90 \\
\bottomrule
\end{tabular}

booktabs 线条对比

命令线条类型用途
\toprule粗线表格顶部
\midrule细线表头分隔
\bottomrule粗线表格底部
\cmidrule部分细线列分组
% 使用 \cmidrule 分组
\begin{tabular}{lcccc}
\toprule
& \multicolumn{2}{c}{实验1} & \multicolumn{2}{c}{实验2} \\
\cmidrule(lr){2-3} \cmidrule(lr){4-5}
方法 & 精度 & 召回 & 精度 & 召回 \\
\midrule
A & 0.9 & 0.8 & 0.85 & 0.75 \\
B & 0.88 & 0.82 & 0.80 & 0.78 \\
\bottomrule
\end{tabular}

跨行跨列

\usepackage{multirow}

% 跨列
\multicolumn{列数}{格式}{内容}

% 跨行
\multirow{行数}{宽度}{内容}

% 组合使用
\begin{tabular}{|c|c|c|}
\hline
\multirow{2}{*}{跨两行} & 数据1 & 数据2 \\
& 数据3 & 数据4 \\
\hline
\multicolumn{2}{|c|}{跨两列} & 数据5 \\
\hline
\end{tabular}

自动宽度表格

使用 tabularx 自动调整列宽:

\usepackage{tabularx}

% X 列自动填充剩余宽度
\begin{tabularx}{\textwidth}{|X|c|c|}
\hline
自动宽度列 & 固定宽度 & 固定宽度 \\
\hline
长文本会自动换行调整 & 数据 & 数据 \\
\hline
\end{tabularx}

长表格

跨页表格使用 longtable

\usepackage{longtable}

\begin{longtable}{|c|c|c|}
\hline
\multicolumn{3}{|c|}{表格标题} \\
\hline
列1 & 列2 & 列3 \\
\hline
\endfirsthead % 首页表头

\multicolumn{3}{c}{续表} \\
\hline
列1 & 列2 & 列3 \\
\hline
\endhead % 续页表头

\hline
\endfoot % 页脚

\hline
\endlastfoot % 最后一页页脚

数据1 & 数据2 & 数据3 \\
数据4 & 数据5 & 数据6 \\
% ... 更多数据 ...
\end{longtable}

表格浮动体

\begin{table}[htbp]
\centering
\caption{表格标题}
\label{tab:example}
\begin{tabular}{lcc}
\toprule
项目 & 数值1 & 数值2 \\
\midrule
A & 100 & 200 \\
B & 150 & 250 \\
\bottomrule
\end{tabular}
\end{table}

图片格式与选择

支持的格式

格式类型编译器支持推荐场景
PDF矢量pdfLaTeX, XeLaTeX, LuaLaTeX图表、示意图
EPS矢量所有(需转换)传统矢量图
PNG位图所有截图、照片(无损)
JPG位图所有照片(有损压缩)
SVG矢量需转换Web 图形

格式选择原则

矢量图 vs 位图

特性矢量图位图
缩放无损放大放大后模糊
文件大小复杂图形较大照片较小
适用图表、示意图、公式照片、截图
格式PDF, EPS, SVGPNG, JPG

推荐

  • 流程图、示意图、函数图像:使用 PDF 矢量图
  • 照片、截图:使用 PNG 或 JPG
  • 避免在 PDF 中嵌入位图格式的图表

转换工具

# PNG 转 PDF(保持分辨率)
convert image.png -density 300 image.pdf

# SVG 转 PDF
inkscape input.svg --export-pdf=output.pdf

# 批量转换
for f in *.svg; do inkscape "$f" --export-pdf="${f%.svg}.pdf"; done

图表目录

% 生成图表目录
\listoffigures % 图目录
\listoftables % 表目录

% 修改目录标题
\renewcommand{\listfigurename}{插图目录}
\renewcommand{\listtablename}{表格目录}

% 调整目录深度
\setcounter{lofdepth}{2} % 图目录深度
\setcounter{lotdepth}{2} % 表目录深度

常见问题与解决方案

问题1:图片总是跑很远

% 原因:浮动体参数限制太严格
% 解决方案1:使用 [!htbp] 放宽限制
\begin{figure}[!htbp]

% 解决方案2:调整浮动体参数
\renewcommand{\textfraction}{0.05}
\renewcommand{\topfraction}{0.95}
\renewcommand{\bottomfraction}{0.95}

% 解决方案3:使用 [H] 强制当前位置
\usepackage{float}
\begin{figure}[H]

问题2:图片标题太长

\usepackage{caption}

% 短标题用于目录
\caption[短标题]{这是一个非常非常长的详细标题,用于图表下方显示}

% 标题自动换行
\captionsetup{format=hang} % 悬挂缩进

% 调整标题格式
\captionsetup{
font=small, % 字体大小
labelfont=bf, % 标签加粗
labelsep=quad, % 标签分隔
justification=centering % 对齐方式
}

问题3:表格太宽

% 方案1:自动缩放
\usepackage{graphicx}
\resizebox{\textwidth}{!}{%
\begin{tabular}{...}
...
\end{tabular}
}

% 方案2:调整字体大小
{\small
\begin{tabular}{...}
...
\end{tabular}
}

% 方案3:使用 tabularx 自动调整
\usepackage{tabularx}
\begin{tabularx}{\textwidth}{Xcccc}
...
\end{tabularx}

% 方案4:旋转表格
\usepackage{rotating}
\begin{sidewaystable}
...
\end{sidewaystable}

问题4:图片找不到

% 检查文件扩展名是否正确
\includegraphics{image} % 自动搜索 image.pdf, image.png 等
\includegraphics{image.pdf} % 明确指定

% 检查路径设置
\graphicspath{{./figures/}{./images/}}

% 显示图片框(调试用)
\usepackage[demo]{graphicx} % 用灰色框代替图片

问题5:图表编号不连续

% 原因:使用了 \caption*{} 不编号
% 解决:使用 \caption{} 并检查计数器

% 重设计数器
\setcounter{figure}{0}
\setcounter{table}{0}

% 每章重新编号
\usepackage{chngcntr}
\counterwithin{figure}{chapter}
\counterwithin{table}{chapter}

最佳实践总结

图片排版建议

  1. 使用矢量图:图表优先使用 PDF 格式
  2. 合理设置宽度width=0.8\textwidth 是常用选择
  3. 保持位置灵活:优先使用 [htbp] 而非 [H]
  4. label 放在 caption 后:确保引用正确

表格排版建议

  1. 使用 booktabs:专业三线表更美观
  2. 避免竖线:现代排版倾向减少线条
  3. 合理对齐:数字右对齐,文本左对齐
  4. 单位统一:表头注明单位

浮动体控制建议

  1. 不要过度干预:让 LaTeX 自动优化布局
  2. 适当放宽参数:必要时调整浮动体计数器
  3. 善用 FloatBarrier:防止浮动体跨节
  4. 多次编译:确保引用正确更新

小结

本章详细介绍了 LaTeX 图表处理:

  • 图片插入:掌握 \includegraphics 的各种选项
  • 浮动体机制:理解位置选项和计数器限制
  • 浮动体控制:使用 floatplaceins 等宏包精确控制
  • 表格排版:掌握 tabularbooktabstabularx 等环境
  • 长表格处理:使用 longtable 处理跨页表格
  • 格式选择:根据场景选择合适的图片格式
  • 问题排查:解决常见的图表排版问题

掌握这些技巧,可以创建专业美观的图表排版效果。