图表处理
图表是学术论文和技术文档的重要组成部分。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}
| 选项 | 含义 | 优先级 |
|---|---|---|
h | here,当前位置 | 首选 |
t | top,页面顶部 | 次选 |
b | bottom,页面底部 | 再次 |
p | page,单独一页 | 最后 |
! | 忽略限制 | 覆盖 |
选项组合原则:
% 推荐:允许 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}
图片格式与选择
支持的格式
| 格式 | 类型 | 编译器支持 | 推荐场景 |
|---|---|---|---|
| 矢量 | pdfLaTeX, XeLaTeX, LuaLaTeX | 图表、示意图 | |
| EPS | 矢量 | 所有(需转换) | 传统矢量图 |
| PNG | 位图 | 所有 | 截图、照片(无损) |
| JPG | 位图 | 所有 | 照片(有损压缩) |
| SVG | 矢量 | 需转换 | Web 图形 |
格式选择原则
矢量图 vs 位图:
| 特性 | 矢量图 | 位图 |
|---|---|---|
| 缩放 | 无损放大 | 放大后模糊 |
| 文件大小 | 复杂图形较大 | 照片较小 |
| 适用 | 图表、示意图、公式 | 照片、截图 |
| 格式 | PDF, EPS, SVG | PNG, 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}
最佳实践总结
图片排版建议
- 使用矢量图:图表优先使用 PDF 格式
- 合理设置宽度:
width=0.8\textwidth是常用选择 - 保持位置灵活:优先使用
[htbp]而非[H] - label 放在 caption 后:确保引用正确
表格排版建议
- 使用 booktabs:专业三线表更美观
- 避免竖线:现代排版倾向减少线条
- 合理对齐:数字右对齐,文本左对齐
- 单位统一:表头注明单位
浮动体控制建议
- 不要过度干预:让 LaTeX 自动优化布局
- 适当放宽参数:必要时调整浮动体计数器
- 善用 FloatBarrier:防止浮动体跨节
- 多次编译:确保引用正确更新
小结
本章详细介绍了 LaTeX 图表处理:
- 图片插入:掌握
\includegraphics的各种选项 - 浮动体机制:理解位置选项和计数器限制
- 浮动体控制:使用
float、placeins等宏包精确控制 - 表格排版:掌握
tabular、booktabs、tabularx等环境 - 长表格处理:使用
longtable处理跨页表格 - 格式选择:根据场景选择合适的图片格式
- 问题排查:解决常见的图表排版问题
掌握这些技巧,可以创建专业美观的图表排版效果。