☰
LaTeX 使用教程:从环境配置到中文公式、表格与参考文献排版
2026/10/1 16:22:20 网站建设 项目流程

第一次被 LaTeX 折腾到凌晨两点,是因为一份课程论文里的三十多个公式。那会儿我用 Word 硬扛,公式编号全靠手打,改一处删一行,后面所有编号集体错位,参考文献的引用序号也跟着乱。后来导师说了一句"你这排版不如用 LaTeX",我才算踏进了这个坑。这篇 LaTeX 使用教程就是从我这几年的实际使用里攒出来的,涵盖环境安装、VSCode 配置、中文排版、数学公式、图片表格、参考文献和报错排查,写完还会持续更新。它适合三类人:正在写学位论文的研究生、要交数学建模竞赛论文的本科生,以及任何被 Word 公式排版折磨过、想换套工作流的人。我不打算把它写成一份冷冰冰的命令手册,而是尽量按"我当初是怎么一步步摸过来的"这个顺序讲,包括我踩过的那些坑。

1. 我为什么劝你早点把 LaTeX 装上

1.1 Word 排版数学公式的真实困境

很多人对 LaTeX 的印象停留在"理工科才用",其实核心矛盾只有一个:当文档里的结构化内容变多时,手动排版的成本会指数级上涨。Word 处理纯文字文档没问题,但一旦涉及公式编号、图表引用、参考文献序号、目录页码,它就从"编辑器"变成了"你亲手维护的一套数据库"。你删掉中间一个公式,后面几十个编号得手动改;你换一份参考文献,全文的引用序号全乱。

我在写第一篇小论文时用 Word 排了大概 60 个公式。改稿时导师让我把第 12 个公式删掉,我删完之后花了四十分钟重排编号,还在第 37 个公式那里漏改了一个,被审稿意见指出来。这种错误不是能力问题,是工具本身的设计就没打算让机器帮你维护这些关系。

LaTeX 解决这个问题的思路很直接:你把内容和结构写下来,编号和引用交给编译器算。你写\label{eq:energy},引用写\eqref{eq:energy},不管中间插入删除多少个公式,编号永远是对的。这个差别用过一次就回不去了。

1.2 LaTeX 的"内容与格式分离"到底赢在哪

用一句更通俗的话讲:Word 是你一边写一边调格式,LaTeX 是你只管写内容,格式由一套规则渲染出来。这带来几个很实在的好处。

写正文的时候你脑子里想的是"这一段是第几级标题""这个公式要编号""这张图要有题注",而不是"这个标题用几号字、加不加粗、缩进多少"。你的注意力全部在内容上。等文章写完了,想换个模板——比如从单栏换成双栏,或者套上学校指定的学位论文模板——改一行\documentclass就行,正文一个字不用动。

另外一点是版本管理和协作。.tex文件是纯文本,用 Git 管理非常舒服,改了哪一行一目了然。Word 的二进制文件,两个人在同一份.docx上改,合并基本靠人肉。我现在的习惯是每个项目一个 Git 仓库,每次改完稿提交一次,导师提的意见对应哪个版本清清楚楚。

提示:如果你是团队协作写论文或竞赛论文,.tex+ Git 这个组合的价值比你想的大得多。尤其是竞赛那种三天写完几十页的情况,谁改了哪一段、哪个公式被谁动了,都有记录。

1.3 哪些人其实不需要折腾 LaTeX

说了这么多好处,也得说清楚它不适合谁。我见过不少人在一份两页的通知、一张单页简历上死磕 LaTeX,最后花的时间比用 Word 多三倍,收益几乎为零。

如果你的文档满足下面这些条件,就老实用 Word:篇幅短、几乎没有公式、没有交叉引用、格式要求宽松、需要频繁发给不装 LaTeX 的人来回改。反过来,只要你的文档里公式超过二十个、有几十条参考文献、或者有严格格式的模板要求,那 LaTeX 的投入产出比就非常划算。判断标准很简单:你手动维护编号、引用、目录的时间是否超过了学习成本。按我的经验,一篇正经的学位论文,这个临界点在你写第二章的时候就会到来。

2. 环境搭建:TeX Live、编辑器怎么搭配才不折腾

2.1 TeX Live 全量安装和 MiKTeX 按需安装怎么选

LaTeX 本身只是一套宏语言,要编译成 PDF 需要一个发行版。目前主流就两个:TeX Live和MiKTeX。

TeX Live 的特点是"一次装全",完整版大概 5 到 8 GB,包含了几乎所有你能想到的宏包和字体。装完之后基本不会再遇到"缺宏包"的问题,离线也能用。缺点就是下载慢、装得久,Windows 上如果杀毒软件实时扫描开着,装一个小时都算快的。

MiKTeX 的特点是"按需下载",初始安装只有几百 MB,编译时发现缺哪个宏包就自动去下载。它的好处是省空间,坏处是网络不稳或者学校模板依赖某些冷门宏包时,会卡在网络请求上,而且离线环境基本没法用。

我的建议是:如果你打算认真写论文,直接上 TeX Live 完整版。用一次就装好的时间,换后面几个月不再折腾,这笔账很划算。MiKTeX 更适合只是偶尔编译别人给的文档、磁盘空间紧张的场景。

对比项TeX LiveMiKTeX
安装体积5 到 8 GB(完整版)几百 MB 起,随用随下
宏包完整性一次装全,离线可用按需下载,依赖网络
安装时长40 到 90 分钟10 分钟左右
适合人群学位论文、竞赛论文长期使用偶尔编译、空间有限
跨平台Windows / macOS / Linux 一致以 Windows 为主

2.2 三平台安装的实操细节与坑

Windows 上的 TeX Live,我推荐两条路。第一条是去国内镜像站下载 ISO 镜像,挂载后运行install-tl-windows.bat;第二条是下载在线安装器,安装时手动把源改成国内镜像。后者体积小但依赖网络,前者更稳。安装过程中有一个地方特别容易出问题:安装路径千万别带中文和空格,默认的C:\texlive\2024就很好,别自作聪明改成D:\我的文档\latex 安装,后面遇到的一堆"文件找不到"报错都是这么来的。

安装完成后打开命令行验证:

tex --version xelatex --version latexmk --version

三条都能输出版本号,说明基本没问题。如果提示"不是内部或外部命令",说明环境变量没生效,重启一下终端或者重启系统。

macOS 上,用brew install --cask mactex-no-gui安装完整版,或者去官网下MacTeX.pkg。如果嫌大,可以装 BasicTeX,再用tlmgr按需补包,但对新手来说,缺包报错本身就是一道门槛,我一般直接推荐完整版。装完自带的 TeXShop 就能用,但后面我们还是会切到 VSCode。

Linux 上最简单,Ubuntu/Debian 系直接:

sudo apt update sudo apt install texlive-full

如果担心体积,可以只装核心加中文支持:texlive-xetex texlive-lang-chinese texlive-latex-extra texlive-science,后面缺什么再tlmgr install补。

2.3 VSCode + LaTeX Workshop 的完整配置

编辑器这块,我用得最久的是 VSCode 配上 LaTeX Workshop 插件。它的好处是一个窗口里同时管代码、预览 PDF、看报错、做正反向搜索,而且你写代码的那些习惯(多光标、快捷键、Git 集成)都能直接用上。

装插件很简单,在扩展市场搜LaTeX Workshop,作者是 James Yu 的那个。装完之后关键在配置,很多人装完发现编译用的是 pdfLaTeX,中文直接报错,就是这个没配。打开settings.json,把下面这段贴进去:

{ "latex-workshop.latex.tools": [ { "name": "xelatex", "command": "xelatex", "args": ["-synctex=1", "-interaction=nonstopmode", "-file-line-error", "%DOC%"] }, { "name": "bibtex", "command": "bibtex", "args": ["%DOCFILE%"] }, { "name": "biber", "command": "biber", "args": ["%DOC%"] } ], "latex-workshop.latex.recipes": [ { "name": "xelatex", "tools": ["xelatex"] }, { "name": "xelatex -> bibtex -> xelatex*2", "tools": ["xelatex", "bibtex", "xelatex", "xelatex"] }, { "name": "xelatex -> biber -> xelatex*2", "tools": ["xelatex", "biber", "xelatex", "xelatex"] } ], "latex-workshop.latex.recipe.default": "lastUsed", "latex-workshop.view.pdf.viewer": "tab", "latex-workshop.latex.autoBuild.run": "onFileChange", "latex-workshop.latex.autoClean.run": "onBuilt" }

这里有几个点值得单独说。%DOC%是当前文件名不带扩展名,%DOCFILE%是带扩展名的,别写反。-synctex=1生成同步信息,是正向和反向搜索的前提。-file-line-error让报错信息带上文件名和行号,排查时能省一半时间。-interaction=nonstopmode让它遇错不卡住等你按键,而是继续跑完并记录错误。

latex-workshop.view.pdf.viewer设成tab,PDF 就在 VSCode 的标签页里预览。配合侧边栏的 LaTeX 面板,点 PDF 里任意位置按Ctrl加左键就能跳到源码对应行,反过来在源码里按快捷键能跳到 PDF 对应位置,改公式的时候特别爽。

注意:autoClean.run设成onBuilt会在每次编译后清理中间文件。这在写短文档时很清爽,但写长论文时注意——如果你的引用还没解析成功就被清掉.aux,可能反复出现问号编号。这种情况把它关掉,等文档稳定了再手动清。

2.4 TeXstudio 和 PyCharm 这两条备选路线

不是所有人都喜欢 VSCode 那套配置。TeXstudio是专门为 LaTeX 做的编辑器,内置 PDF 预览、符号面板、命令补全、错误高亮,开箱就能用。它的配置逻辑是把编译器改掉:选项 → 设置 → 构建,把默认编译器从 pdfLaTeX 改成 XeLaTeX,再在"构建与查看"里把编译链改成latexmk -xelatex,一条龙自动处理多轮编译和参考文献。TeXstudio 的符号面板对新手特别友好,希腊字母、积分号、箭头直接点,不用背命令。

PyCharm这条路我也试过。它本身不是 LaTeX 编辑器,但你完全可以用它写.tex:装个 TeXify 插件,语法高亮和补全就有了;或者走"设置 → 工具 → 外部工具",添加一个外部工具指向xelatex,把参数设成-synctex=1 -interaction=nonstopmode $FilePath$,工作目录设成$FileDir$,之后用快捷键调用就行。适合那种主力写 Python、顺手写点 LaTeX 笔记的人,不用为了写个公式再开一个编辑器。

至于在线编译平台,我一般只用来临时看一眼别人发来的文档,正式写论文不建议——网络、隐私、模板兼容都有坑,尤其是学校模板里那些自定义字体,在线平台大概率渲染不出来。

3. 从零写第一份中文文档:导言区到底放什么

3.1 最小可编译骨架

先看一份能跑起来的最小文档。这段建议你直接复制到hello.tex里,用 XeLaTeX 编译一遍,先建立"能跑"的信心,再往上加东西。

\documentclass[12pt,a4paper]{ctexart} \usepackage{geometry} \geometry{left=2.5cm, right=2.5cm, top=2.5cm, bottom=2.5cm} \usepackage{amsmath, amssymb} \usepackage{graphicx} \usepackage{booktabs} \usepackage{hyperref} \title{我的第一份 LaTeX 文档} \author{你的名字} \date{\today} \begin{document} \maketitle \section{引言} 这是一段中文正文,第一行写在这里。 这是另一段,前面空行表示新起一个段落。 \section{公式测试} 行内公式写 $E = mc^2$,行间公式单独放一行: \begin{equation} \int_{0}^{\infty} e^{-x^2} \, dx = \frac{\sqrt{\pi}}{2} \label{eq:gauss} \end{equation} 公式 \eqref{eq:gauss} 是一个经典的积分结果。 \end{document}

\documentclass到\begin{document}之间的部分叫导言区,用来声明文档类型、加载宏包、设置全局参数。\begin{document}之后才是正文。这个划分要记住,因为很多新手把\usepackage写到了正文里,报错信息还挺难懂。

3.2 中文支持:ctex 宏包和文档类怎么选

中文排版在 LaTeX 里是个历史遗留问题。老办法是用CJK宏包配合 pdfLaTeX,配置繁琐还经常出字体问题。现在的标准做法是走ctex,有三种用法。

第一种,直接用 ctex 提供的文档类:ctexart(对应 article)、ctexrep(对应 report)、ctexbook(对应 book)。这是最省事的,汉字字体、段落间距、标点压缩都按中文习惯预设好了。

第二种,用标准文档类加宏包:\documentclass{article}配\usepackage{ctex}。适合你已经有别人给的标准模板、不想改文档类的场景。

第三种,手动配置字体:\usepackage{fontspec}配\setCJKmainfont{...}。这是最灵活的,但也是最容易出问题的,字体名写错一个字符就是一条fontspec Error。新手不建议从这里开始。

这里有个必须强调的点:用 ctex 就必须用 XeLaTeX 或 LuaLaTeX 编译,不能用 pdfLaTeX。原因不复杂,pdfLaTeX 对 Unicode 和系统字体的支持很弱,而中文排版恰恰需要这两样。用 pdfLaTeX 编中文文档,轻则是乱码,重则直接报一堆字体找不到的错误。这是新手最常见的第一号坑。

3.3 编译引擎:XeLaTeX、LuaLaTeX 还是 pdfLaTeX

三个引擎的选择困扰了不少人,我用一张表说清楚。

引擎字体支持中文支持速度推荐场景
pdfLaTeX只支持 Type1 等老格式弱,需 CJK 宏包快纯英文老模板、期刊指定
XeLaTeX直接调用系统字体好,ctex 默认中等中英文混排,日常首选
LuaLaTeX直接调用系统字体好稍慢需要 Lua 脚本扩展、复杂宏包

日常结论很明确:写中文文档用 XeLaTeX。它会直接去系统里找字体,ctex在 Windows 上默认用中易宋体和中易黑体,在 macOS 上默认用 Songti SC,你基本不用管。只有两种情况需要换:一是目标期刊明确要求 pdfLaTeX 提交,二是你在做很复杂的自动化排版需要 Lua 脚本。数学建模这类竞赛模板,看清楚它 README 里写的引擎要求,大多数现在也是 XeLaTeX。

4. 正文排版:换行、分段和那些容易写错的符号

4.1 "换行"这件事,LaTeX 的规则和 Word 完全不一样

这是新手最容易懵的地方。在 Word 里你按回车就是换行,在 LaTeX 里,源码里的单个换行符等于一个空格,什么都不发生。真正的规则是:

  • 源码里空一行(中间没有非空白字符),才表示新起一个段落,段首会自动缩进两格。
  • \\是强制换行,用在当前段落内部,换行后不缩进,常出现在表格、居中环境、诗歌排版里。
  • \newline效果和\\接近,但用法上更"正式"一点,一般不产生额外的垂直间距。
  • \linebreak也会换行,但它的逻辑是"把这一行撑满再断",可能拉出一个难看的行距,普通正文别用。
  • \par是手动分段,等价于空一行。
  • \noindent放在段首,取消这一段的缩进。
  • \newpage、\clearpage是换页,\cleardoublepage会跳到下一个奇数页(双面排版用)。

我见过最常见的错误,就是在正文里每行末尾都加\\,看起来像"手动换行"。这么写的后果是编译日志里刷出一堆Underfull \hbox (badness 10000)警告,而且句子之间的行距、右边界都会变得很难看。正文一律用空行分段,不要用\\,这是铁律。

标题方面,\section{}是一级,\section*{}带星号是不编号不显示在目录里,\subsection{}、\subsubsection{}依次往下。再往下想细分就只能用\paragraph{},而且默认是行内标题,需要自己调格式。

4.2 强调、列表、引用和脚注

正文里的基本格式元素,用法很集中:

  • 加粗:\textbf{内容};斜体:\textit{内容};等宽:\texttt{代码}。注意 LaTeX 里传统上"强调"用\emph{},它会根据上下文自动切换斜体和正体,嵌套时效果比\textit好。
  • 无序列表:\begin{itemize} \item ... \end{itemize}。
  • 有序列表:\begin{enumerate} \item ... \end{enumerate}。想换成"(1)(2)"这种样式,用\begin{enumerate}[(1)](需要enumitem宏包)。
  • 描述列表:\begin{description} \item[术语] 解释 \end{description}。
  • 引用块:\begin{quote} ... \end{quote},整体缩进,适合放引文。
  • 脚注:\footnote{内容},编号自动生成,正文里在句末或标点后写。

列表这块我建议加一个enumitem宏包,它能统一控制列表的间距和缩进,写正式文档时特别有用。默认的itemize上下间距偏大,一页里放三四个列表排版会很松散,加一行\setlist{nosep}就紧凑了。

4.3 特殊字符转义对照表

LaTeX 里有一批字符是有特殊含义的,直接写在正文里会引发各种奇怪的报错。这张表建议存下来,写文档时对一下。

想输出的符号源码写法说明
#\#宏参数符号
$\$数学模式开关
%\%注释符号,不转义会把后面整行注释掉
&\&表格列分隔符
_\_下标符号
{}\{\}分组符号
~\textasciitilde{}不换行空格
^\textasciicircum{}上标符号
\\textbackslash{}命令前缀

其中%和&是最阴的两个。%会把后面的内容直接注释掉,你以为是排版问题,其实是内容被吃了。&放在正文里会直接报Misplaced alignment tab character &。还有中文输入法下打出的全角符号,比如全角分号、全角括号,在代码里会引起莫名其妙的错误,写命令的时候一定要切回半角输入。

提示:如果你要排版一段包含大量特殊字符的代码或路径,别一个个手动转义,用\verb|内容|或者verbatim环境,它会原样输出。但注意\verb不能出现在命令参数里。

5. 数学公式:从行内到多行对齐的完整打法

5.1 行内公式和行间公式的取舍

公式有两种基本形态。行内公式用$...$包起来,跟着文字走,比如$a^2 + b^2 = c^2$。它的特点是上下标会被压缩、分式会变小,为的是不破坏行距。行间公式单独占一行,用\[ ... \]或者equation环境。前者不带编号,后者自动编号。

选择原则很实际。短的、简单的、只是提一下的符号,用行内;有分式、求和、积分、矩阵这种"体积大"的公式,一律用行间,否则行内渲染出来挤成一团,或者行距被撑开得很难看。我见过有人在行内塞了一个三层嵌套分式,那一行的行距能顶三行,页面观感直接崩掉。

如果确实需要在行内把公式渲染得"饱满"一点,可以加\displaystyle,比如$\displaystyle\sum_{i=1}^{n} a_i$,但要节制使用,它会让行距变大。

5.2 amsmath 的几个核心环境

写公式前先加载\usepackage{amsmath, amssymb},这是行业标准配置,align、cases、\text这些命令都靠它。

带编号的单行公式用equation:

\begin{equation} \label{eq:newton} F = G \frac{m_1 m_2}{r^2} \end{equation}

多行对齐用align,用&标对齐位置,用\\换行:

\begin{align} (a+b)^2 &= a^2 + 2ab + b^2 \label{eq:expand1} \\ (a-b)^2 &= a^2 - 2ab + b^2 \label{eq:expand2} \end{align}

不想让某一行编号,在那一行末尾加\nonumber,或者用align*环境整体不编号。分段函数用cases:

\begin{equation} f(x) = \begin{cases} x^2, & x \geq 0 \\ -x, & x < 0 \end{cases} \end{equation}

矩阵用pmatrix(圆括号)、bmatrix(方括号)、vmatrix(竖线),元素之间用&分列,\\分行。多行居中不对齐的用gather,需要内部再分组的用split套在equation里。

这里有一个容易忽略的细节:数学模式里直接写中文会报错。想在公式里放中文,用\text{中文}包起来,而\text需要amsmath加上中文支持(ctex 已经处理好)。另一个细节是,公式里的多字母变量名,比如velocity,不要直接写,会被当成 v 乘 e 乘 l 乘 o 乘 c 乘 i 乘 t 乘 y 的斜体连乘。正确写法是\mathit{velocity}或者用\mathrm{},看你要不要斜体。

5.3 希腊字母、运算符、关系符速查

背命令不现实,但高频的那批必须记熟,剩下的查表。下面这几张表覆盖了日常写作 90% 的需求。

希腊字母

小写源码大写源码
α\alphaΓ\Gamma
β\betaΔ\Delta
γ\gammaΘ\Theta
θ\thetaΛ\Lambda
λ\lambdaΠ\Pi
μ\muΣ\Sigma
π\piΦ\Phi
σ\sigmaΨ\Psi
φ\phiΩ\Omega
ω\omega

注意大写希腊字母里,只有那些"长得和拉丁字母不一样"的才有专门命令,像 Α、Β、Ε 这些直接写大写拉丁字母 A、B、E 就行,这是约定俗成的写法。

运算符和关系符

符号源码符号源码
×\times≤\leq
÷\div≥\geq
±\pm≠\neq
·\cdot≈\approx
∑\sum≡\equiv
∏\prod∈\in
∫\int∉\notin
∮\oint⊂\subset
∂\partial⊆\subseteq
∇\nabla∪\cup
∞\infty∩\cap
→\to⇒\Rightarrow
↦\mapsto⇔\Leftrightarrow

求和、积分、极限的上下限写法:\sum_{i=1}^{n}、\int_{0}^{1}、\lim_{x \to 0}。在行间公式里它们会自动排到符号的上下方,在行内会排到右下角,这个差别是引擎自动处理的,不用你干预。想要强制放在上下方,加\limits,比如$\sum\limits_{i=1}^{n}$。

括号自适应有个技巧:\left(和\right)会根据内容高度自动调整大小,比手动\big\Big\bigg省事。但注意\left和\right必须成对出现,跨行的时候要用\right.或\left.补一个"空"的另一半。这是Missing \right. inserted报错的来源。

5.4 编号、引用和多轮编译的关系

公式编号这件事值得单独说,因为它牵扯到 LaTeX 的一个核心机制:交叉引用靠中间文件传递信息,需要编译两遍。

流程是这样的:第一遍编译时,\label把标签和它对应的编号写进.aux文件;第二遍编译时,\ref和\eqref从.aux里读到编号填进正文。所以如果你新加了一个标签就立刻看 PDF,引用位置很可能显示成??。这不是错误,再编译一遍就好了。用latexmk或者 VSCode 的xelatex ×2配方,它会自动判断需要编译几遍。

标签的命名建议形成习惯,按类型加前缀:eq:给公式、fig:给图、tab:给表、sec:给章节。这样在补全时能快速认出目标类型,也避免不同元素重名导致引用错位。引用公式用\eqref{eq:newton},它自带括号;引用图、表、章节用\ref{fig:xxx},括号自己写。

6. 图片和表格:浮动体机制其实是个优点

6.1 graphicx 插图的正确姿势

插图靠graphicx宏包。基本写法:

\begin{figure}[htbp] \centering \includegraphics[width=0.8\textwidth]{figures/result.png} \caption{实验结果对比} \label{fig:result} \end{figure}

几个要点。\centering让图片在本行居中,注意它是命令不是环境,别写成\begin{center},后者会额外增加垂直间距。width=0.8\textwidth表示图片宽度占正文宽度的 80%,\textwidth在单栏文档里是正文宽度,双栏文档里要用\columnwidth。尺寸也可以用scale=按比例缩放,但我更推荐用宽度控制,因为换模板时宽度是按相对值算的,更稳。

\caption放\includegraphics下面,图的题注就在下方;如果你想题注在上方,把\caption挪到前面。\label一定要放在\caption后面,因为标签记录的是就近的编号,放前面会记到上一张图的编号上,这是个非常隐蔽的 bug。

图片路径管理有个技巧:如果所有图都在figures/目录下,在导言区写\graphicspath{{figures/}},正文里就只用写文件名,改目录结构的时候只改一处。

支持的格式方面,XeLaTeX 下 png、jpg、pdf 都没问题,矢量图优先用 pdf 或 eps。这里有个常见坑:文件名不要带中文和空格,Windows 下偶尔能编过,换到别的系统就是找不到文件。另外扩展名建议写全,result和result.png在不同环境下行为不一致。

6.2 为什么你的图片总是"跑"到后面去

这是被问得最多的问题之一:我代码写在第二章,图片渲染出来跑到第三章去了。这不是 bug,是浮动体机制。

LaTeX 把 figure 和 table 叫做浮动体,它的逻辑是:图片不一定非要待在源码所在的位置,如果当前页剩余空间放不下,就自动移动到后面某页,避免页面上留下大片空白。这个机制在排版密集的论文里其实是优点,能让页面利用率最大化。

问题在于,当图片较多、文本很满的时候,浮动体可能被推到好几页之后。控制它有几个办法。[htbp]这几个字母的意思是 here、top、bottom、page,按优先级给引擎授权,写[!htbp]里的感叹号表示"忽略一些美观限制",让它更倾向于待在原地。如果还是不行,用float宏包的[H]参数,强制"就在这里",代价是可能出现页面底部的大块空白。

\usepackage{float} ... \begin{figure}[H] \centering \includegraphics[width=0.7\textwidth]{figures/arch.pdf} \caption{系统架构} \label{fig:arch} \end{figure}

另一个办法是placeins宏包,在章节之间插一个\FloatBarrier,强制把之前的浮动体全部排完再继续,适合"这一节的图不能跑到下一节去"的需求。我自己写论文的习惯是:正文里正常用[htbp],如果某张图确实跑得太远,再单独上[H],不要全文都用[H],那样排版会很难看。

6.3 三线表、表格自动换行和跨页长表

表格是中文论文里比图片更麻烦的部分,因为学术界要求三线表,而三线表的线宽、间距都有讲究。用booktabs宏包,\toprule、\midrule、\bottomrule三条线,比\hline好看很多。

\begin{table}[htbp] \centering \caption{不同算法的性能对比} \label{tab:perf} \begin{tabular}{lccc} \toprule 算法 & 准确率 & 召回率 & 耗时/s \\ \midrule 方法 A & 0.92 & 0.89 & 12.4 \\ 方法 B & 0.95 & 0.93 & 18.7 \\ 方法 C & 0.94 & 0.91 & 9.3 \\ \bottomrule \end{tabular} \end{table}

{lccc}里的字母表示列对齐方式:l 左对齐、c 居中、r 右对齐,有几列写几个字母。表格里&分列、\\换行,和正文的规则完全相反,这一点初学者经常搞混。

表格自动换行是高频需求,因为单元格里的文字一长就会把表格撑出页面。有三种方案,各有适用场景。

第一种,用p{宽度}列类型,指定这一列的固定宽度,文字超过就自动换行:

\begin{tabular}{p{2.5cm} p{5cm} p{5cm}} \toprule 项目 & 说明 & 备注 \\ \midrule 数据预处理 & 对原始数据做归一化和异常值剔除 & 需要保留处理前后的对照样本 \\ \bottomrule \end{tabular}

第二种,用tabularx宏包配合X列,它会自动把剩余宽度平均分配给 X 列,不用手动算宽度,特别适合"表格宽度正好等于正文宽度"的需求:

\usepackage{tabularx} ... \begin{tabularx}{\textwidth}{lXX} \toprule 模块 & 功能描述 & 实现要点 \\ \midrule 采集层 & 负责多源数据的接入和缓存 & 采用生产者消费者模型降低耦合 \\ \bottomrule \end{tabularx}

第三种,单元格内部还要再分行的,用makecell宏包:\makecell[l]{第一行\\第二行}。注意这里的\\是在单元格内部换行,外面那层的\\才是表格行结束,用途不同。

跨页的长表格必须用longtable环境,它会自动在每页重复表头。用\endhead标记表头,\endfirsthead标记首页表头。这个功能在附录里放参数表、结果明细表时非常有必要。

如果表格实在超宽,还有个"暴力"办法:\resizebox{\textwidth}{!}{表格},把整个表格缩放到正文宽度。用它的问题是字号会跟着缩小,正文 12pt 的文档里缩出来 8pt 的字,可读性差,建议只作为最后手段,优先考虑换列类型或者把表格改成转置形式。

7. 参考文献和模板:别从零造轮子

7.1 手写文献表、BibTeX 和 biblatex 三条路

参考文献有三条路,复杂度递增,收益也递增。

最原始的是thebibliography环境,一条条手写:

\begin{thebibliography}{99} \bibitem{knuth1984} D. E. Knuth. \emph{The TeXbook}. Addison-Wesley, 1984. \bibitem{lamport1994} L. Lamport. \emph{LaTeX: A Document Preparation System}. Addison-Wesley, 1994. \end{thebibliography}

正文里用\cite{knuth1984}引用。这种方式的好处是零依赖,缺点是格式全手动,改了顺序或者删了一条,所有序号得自己维护,一旦超过二十条就非常痛苦。

第二条路是 BibTeX,把文献信息集中写在一个.bib文件里,正文用\cite{}引用,编译时自动生成文献表。.bib文件的条目长这样:

@article{zhang2023, author = {张三 and 李四}, title = {一种改进的优化算法}, journal = {计算机学报}, year = {2023}, volume = {46}, number = {3}, pages = {512--525} }

然后在.tex末尾写:

\bibliographystyle{gbt7714-numerical} \bibliography{ref}

中文文献要配gbt7714样式,这需要单独安装对应的.bst文件。英文用plain、unsrt、ieeetr这些内置样式,unsrt是按引用顺序排、plain是按作者字母排,选哪个看目标期刊要求。

BibTeX 的编译链是:xelatex → bibtex → xelatex → xelatex,四步。少一步就会出现引用显示成[?]的情况。

第三条路是 biblatex 加 biber,这是更现代的方案,配置在导言区:

\usepackage[backend=biber, style=gbt7714]{biblatex} \addbibresource{ref.bib}

正文末尾写\printbibliography。编译链是xelatex → biber → xelatex → xelatex。biblatex 的优势是可以精细控制引用格式,比如\citeauthor、\citeyear、\textcite这些命令,写综述类文章时很方便。缺点是一些老模板还只支持 BibTeX,套模板前先看清楚要求。

不管你走哪条路,.bib文件的编码必须是 UTF-8,从数据库导出的条目经常带上不兼容的字符,中文作者名、带特殊符号的期刊名都是排查重点。

7.2 学校模板和竞赛模板的正确用法

绝大多数人第一次认真用 LaTeX,都用的是别人给的模板:学校学位论文模板、数学建模竞赛模板、期刊投稿模板。这些模板通常包含一个.cls(文档类)或.sty(宏包)文件,加上一个示范用的main.tex。

使用模板的核心原则只有一条:不要改.cls和.sty文件,所有个性化改动写在main.tex的导言区。原因是模板文件是学校统一维护的,格式审查时可能对比版本;而且它内部定义了大量格式命令,你改一处可能连锁影响别处。

正确的打开方式是这样几步。把模板解压到一个纯英文路径的目录下,先原样编译一遍,确认能出 PDF,这一步是排除环境问题的基准。编译时注意它要求的引擎,数学建模的cumcmthesis这类模板通常要求 XeLaTeX,有的还要求特定的编译链,看README或者模板自带的说明文件。然后逐块替换内容:把示例正文换成你自己的,但保留它的章节命令、图表命令结构。

填写封面信息时,很多模板把姓名、学号、导师这些做成自定义命令,比如\school{}、\major{},改之前先在.cls里搜一下命令名,确认参数类型。直接往模板里硬写文字,很容易被格式检查判不合格。

竞赛模板还有几个专属坑。一是版本,数学建模的模板每年可能有更新,用旧版本套新要求,格式对不上。二是封面页和承诺书,通常有严格的字数限制和签名位,改动要谨慎。三是附录代码,竞赛论文一般要求附录放完整代码,用listings或minted宏包排版,minted需要系统装 Python 和 pygments,如果编译环境不干净,改用listings更稳。四是一页页的排版要求,比如摘要页、目录页的页眉页脚,模板一般已经处理好,不要自己去动fancyhdr的设置。

还有一点不得不提:模板里的空白示例内容要删干净。我见过交稿时毕业论文里还留着"此处填写摘要"的,这种低级错误在截止日期前一晚特别容易发生。建议在正式提交前,用编辑器的搜索功能把"示例""请填写""TODO"这类关键词过一遍。

8. 那些让我熬夜的报错,和排查套路

8.1 从 .log 文件读错误:先看第一条 error

LaTeX 的报错有个特点:一个错误往往会引发后面一连串错误,比如漏了一个右花括号,后面可能刷出几十条报错。所以第一条报错通常最接近根因,修了它,后面的可能一起消失。

编译失败时,去看同目录下的.log文件。里面以!开头的行、以及l.123这样的行号标记是关键。配合 VSCode 里配的-file-line-error,报错面板会直接给出"文件名:行号:错误信息",点一下跳到出错位置,效率高很多。

我的排查顺序是这样的:先看报错面板的第一条,跳到对应行,检查命令拼写、括号配对、环境是否闭合。如果把出问题的段落整段注释掉(选中后按快捷键注释),编译通过了,说明问题就在这段里。然后在这段里二分注释,很快就能定位到具体那行。这个方法笨,但在面对几百行的文档时是最快的手段。

8.2 高频报错对照表

下面这些是我这几年遇到频率最高的报错,配上原因和处理方式。

报错信息常见原因处理方式
Undefined control sequence命令拼写错误,或宏包没加载检查拼写,确认\usepackage到位
Missing $ inserted数学符号写在文本模式,常见是_、^用$包起公式,或转义符号
File 'xxx.sty' not found宏包缺失tlmgr install xxx补装
Package fontspec Error: The font cannot be found字体名写错或本机没装换成系统已装字体名
Misplaced alignment tab character &正文里直接写了&改成\&
Emergency stop括号或环境严重不匹配从后往前找未闭合的环境
Runaway argument?花括号少了一个检查最近几行的{}配对
! LaTeX Error: File 'xxx.png' not found图片路径错、文件名带空格中文用相对路径,文件名纯英文
引用显示为[?]或??没跑 bibtex 或多轮编译不够跑完整编译链
中文显示为乱码用了 pdfLaTeX 编中文换成 XeLaTeX

Emergency stop这个最吓人,但原因往往很朴素。它的意思是"我不干了",通常出现在\begin{document}之后,原因是导言区里某个宏包加载失败,或者括号从某一行开始就再也没配对上。这时候我会先把导言区里除文档类之外的\usepackage全注释掉,逐个放开,很快就能找到哪个宏包出的问题。

8.3 Word 公式和 LaTeX 公式的互转

现实工作中总会遇到要跟用 Word 的人交换文件的场景,这里说两个方向的转换。

Word 公式转 LaTeX:从 Word 复制公式粘贴到.tex里,通常得到的是乱码或者图片,不行。新版 Word 的公式编辑器支持 LaTeX 语法输入,在公式设计工具里可以切换"Unicode Math"和"LaTeX"两种模式,切到 LaTeX 后输入的\frac{a}{b}会被解释成公式。反过来,你想把 LaTeX 公式放进 Word,先在公式编辑器里把模式切成 LaTeX,粘贴进去,再按空格或者回车,它就会渲染成规范公式,不再是一串反斜杠命令。

批量文档转 LaTeX:pandoc可以把.docx转成.tex,命令是pandoc input.docx -o output.tex。它的优点是快,缺点也很明显:转换后的格式很"素",公式可能变成 OMML 的残留、图片位置混乱、样式全丢。我的用法是只拿它来提取纯文字内容,公式和图表全部手动重排,千万别指望一键转换能直接投出去。

还有个细节值得一提:Word 里显示的 LaTeX 源码如果直接粘到.tex里没反应,先确认你粘的位置不在verbatim或者代码环境内,那些环境会原样输出。另外一个常见问题是公式里的中文——Word 转换过来的公式里混着中文注释,得手动用\text{}包起来,否则一编译就报错。

最后说个我自己的更新习惯。这篇教程我打算持续更新,每次遇到新的坑、新的宏包用法、新的模板问题,就补一节进去。LaTeX 这个工具的特点是"你用得越深,要学的东西越多",但绝大部分人只需要掌握本文覆盖的这批内容就能顺利写完一篇论文。剩下那些冷门排版需求,等真正遇到再查,比一开始就啃完一整本手册高效得多。我个人的经验是:先用起来,报错就是最好的老师,每次报错修好之后,你对这套系统的理解都会比看十页文档更扎实。

有一个小技巧我一直用:给自己建一个snippets.tex文件,把常用的导言区配置、三线表模板、公式环境、参考文献配置全部存进去,新开一个文档就复制这份模板改,不用每次从头回忆命令。这个文件用一年下来能省掉大量翻文档的时间,也建议你从今天开始攒。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询