拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

LaTeX论文排版从入门到投稿:环境、公式、表格与参考文献

LaTeX论文排版从入门到投稿:环境、公式、表格与参考文献

第一次把三万多字的毕业论文塞进 Word,我前后删了二十几遍目录——改一个小节标题,页码全乱,公式编号跟着漂,参考文献的顺序还得手动对。后来一个师兄甩给我一个.tex文件,说“你照着改就行”,我花了一个周末把 LaTeX 啃下来,之后的几年里,论文、技术报告、甚至简历我都用 LaTeX 完成。这篇笔记是当时踩坑记录的汇总:LaTeX 到底解决什么问题、怎么下载安装、语法骨架长什么样、公式/图片/表格/参考文献这四件高频事怎么写,以及编译报错时从哪儿下手查。它不打算把 LaTeX 讲全——那得写一本书——只保证你看完能独立跑出一份符合期刊或学位论文格式要求的 PDF。

1. 为什么写论文的人最后都绕不开 LaTeX

1.1 Word 在长文档上的三个硬伤

先说清楚痛点,你才知道自己该不该折腾。Word 并不是不能用,短文档、几页的报告它一点问题没有,但只要文档超过一万字、包含几十个公式和上百条参考文献,麻烦就成倍增长。

第一个硬伤是交叉引用漂移。正文里写“如图 3-2 所示”,后来你在前面补了一张图,这张图变成图 3-3,正文那句话不会自动跟着改。你用 Word 的题注功能能解决一部分,但一旦有人用文本框、用了手动编号,整套体系就崩了。论文送审前我见过同学手动核对两百多处“见表 X-Y”,核到凌晨三点还漏了三处。

第二个硬伤是公式。Word 自带的公式编辑器这两年在往 LaTeX 语法靠,在公式框里切换到 LaTeX 输入模式,敲\frac{a}{b}回车就能变成分式,这条路径确实能用。但问题在于多行对齐、编号、跨行括号缩放,Word 处理起来很别扭,而且一旦你从别处粘贴带全角括号的公式代码,它就死活转不出来——这是“Word 的 LaTeX 无法正常显示”最常见的两个原因:一是粘贴的括号、逗号、加号是全角字符,二是缺少$定界符或者\begin{}没有配对闭合。

第三个硬伤是样式统一。行距、字号、标题格式、图注格式,改一处就要全文找一遍。Word 的样式功能理论上能解决,但绝大多数人写论文是“边写边调格式”,写到一半样式已经污染得不成样子。

1.2 LaTeX 的本质:把排版交给程序

LaTeX 的思路和 Word 完全相反。你在 Word 里看到的是“所见即所得”,敲下去什么样,屏幕上就是什么样。LaTeX 是“所想即所得”的近似版——你写的是内容加标记,比如\section{引言}、\cite{zhang2023},然后交给一个编译程序,几秒钟后吐出一份排版好的 PDF。

这个转变听起来麻烦,实际上是把“重复劳动”一次性买断了。你在导言区定义一次“三级标题用小四号黑体”,全文几十个三级标题全部生效;你写\ref{fig:arch},无论这张图前面插入多少内容,编号永远自动正确。

生活里有个类比:Word 像是手工切菜,每一刀都要自己控制厚薄;LaTeX 像是先磨好一把模具刀,之后所有菜都从同一个模具里压出来。前期磨刀花时间,量大之后效率差距就出来了。另外 LaTeX 的公式排版质量至今没有对手,学术期刊的正文大多就是用 LaTeX 排的,这也是为什么投英文期刊时编辑经常直接要.tex源文件。

1.3 哪些人真的适合,哪些人别折腾

我见过两类翻车的朋友:一类是文档只有五页、没有公式、没有文献,硬啃 LaTeX,两天没跑通环境就放弃了,还留下“LaTeX 很难”的心理阴影;另一类是明明要写八万字带两百个公式的学位论文,非要用 Word,最后排版阶段痛苦加倍。

场景推荐工具理由
5 页以内、无公式、无文献Word / WPS学习成本不划算
课程报告,10-30 页,少量公式Word 或 LaTeX 皆可看后续是否还会写论文
学位论文、期刊论文、书籍LaTeX交叉引用、公式、文献管理的收益最大
数学建模竞赛论文LaTeX 模板现成模板多,公式密集,排版规范
多人协作、需要版本对比LaTeX + Git纯文本,diff 清晰,比 Word 二进制好管太多

一句话判断:如果你预计这辈子还要写三篇以上带公式的长文档,学 LaTeX 就是稳赚不赔的投资。

2. 环境搭建:从零到跑出第一份 PDF

2.1 TeX 发行版怎么选,别在这步卡住

LaTeX 本身只是一套宏,真正干活的是底层的 TeX 引擎和一大堆宏包,它们被打包成“发行版”发布。新手最常卡在这里:网上教程一半说装 TeX Live,一半说装 MiKTeX,还有人推荐在线平台,看花了眼。

发行版平台特点适合谁
TeX LiveWindows / Linux / macOS宏包最全,一次装完约 5-7 GB,装完基本不用再补包稳妥派,写毕业论文首选
MiKTeXWindows按需下载宏包,初始体积小,缺什么自动补硬盘紧张、网络稳定的人
MacTeXmacOS本质是 TeX Live 的 Mac 封装版,约 5 GBMac 用户
在线平台浏览器免安装,云端编译,适合临时应急换电脑、给合作者看稿

我的建议很直接:硬盘够就装 TeX Live 或 MacTeX,一次装全,避免写到一半发现缺宏包还要在线拉取。Windows 用户从官网下载install-tl-windows.exe,安装时把“安装 TeX Live 到硬盘”和“调整搜索路径”两项都勾上,安装时间大概二十到四十分钟,取决于硬盘速度。MacBook 用户可以直接brew install --cask mactex,或者下 MacTeX 的 pkg 包双击安装;如果嫌 5 GB 太大,还有一个BasicTeX精简版,但缺点就是经常缺包,我个人不太推荐给第一次接触的人。

注意:安装路径不要带中文和空格。D:\论文\latex这种路径会让某些编译脚本直接报错,而且报错信息很含糊,查起来费时间。

2.2 编辑器怎么选:TeXstudio 还是 VS Code

装完发行版你还得有个写代码的地方,记事本也能写,但没有补全和高亮,效率低得离谱。主流就三条路。

TeXstudio是专门为 LaTeX 做的编辑器,开箱即用,侧边栏有结构树,编译按钮一点就走,公式、引用都有补全,缺点是界面偏老派,写多了会觉得它就是个“只干一件事的工具”。如果你只想尽快出 PDF,装它最省事。

VS Code + LaTeX Workshop是我现在的主力方案。优势在于你写 Python、Markdown、C++ 都在同一个编辑器里,切换成本为零,而且 LaTeX Workshop 的功能已经非常完整:保存自动编译、PDF 内嵌预览、正反向搜索(点 PDF 跳源码,点源码跳 PDF)、语法检查。

PyCharm也能写 LaTeX,装 TeXiFy 插件,或者在Settings → Tools → External Tools里加一条外部命令指向xelatex。但说实话,PyCharm 的重心是 Python 工程,LaTeX 只是顺带,补全和预览体验不如 VS Code,我试过一次就换回去了。

2.3 VS Code 配置 LaTeX 的完整流程

先说插件。打开扩展面板搜LaTeX Workshop,作者是 James Yu,装上即可,不用再装别的 LaTeX 相关插件,重复装会导致快捷键冲突。

然后是编译工具链配置。VS Code 默认的编译方式是latexmk,它会自动判断需要编译几次(交叉引用通常要编译两到三遍才能稳定,latexmk 会自动跑完),这对新手特别友好。打开settings.json(快捷键Ctrl+Shift+P搜 “Open Settings (JSON)”),贴入下面这段:

{ "latex-workshop.latex.recipes": [ { "name": "xelatex x2", "tools": ["xelatex", "xelatex"] }, { "name": "latexmk (xelatex)", "tools": ["latexmk-xe"] } ], "latex-workshop.latex.tools": [ { "name": "xelatex", "command": "xelatex", "args": [ "-synctex=1", "-interaction=nonstopmode", "-file-line-error", "%DOC%" ], "env": {} }, { "name": "latexmk-xe", "command": "latexmk", "args": [ "-synctex=1", "-interaction=nonstopmode", "-file-line-error", "-xelatex", "%DOC%" ], "env": {} } ], "latex-workshop.latex.autoBuild.run": "onSave", "latex-workshop.view.pdf.viewer": "tab", "latex-workshop.latex.clean.subfolder.enabled": true, "latex-workshop.latex.autoClean.run": "onBuilt", "latex-workshop.latex.clean.fileTypes": [ "*.aux", "*.bbl", "*.blg", "*.idx", "*.ind", "*.lof", "*.lot", "*.out", "*.toc", "*.acn", "*.acr", "*.alg", "*.glg", "*.glo", "*.gls", "*.fls", "*.log", "*.fdb_latexmk", "*.synctex.gz" ] }

逐条解释为什么这么配。-synctex=1是开启正反向搜索,没有它 PDF 和源码之间就点不动;-interaction=nonstopmode让编译遇到错误不弹窗卡住,而是把错误写进日志继续跑完,方便你一次性看到所有问题;-file-line-error把错误信息格式化成“文件名:行号:错误”,VS Code 能直接点着跳转,这个参数一定要加,能省下大量找错的时间。

"autoBuild.run": "onSave"是保存即编译,配合autoClean在编译成功后清理辅助文件,工作目录不会堆一堆.aux、.log、.out。我第一次写论文时目录里攒了三百多个临时文件,同步到网盘花了半小时,删完瞬间清爽。

配好之后,新建一个test.tex,按Ctrl+Alt+B编译,按Ctrl+Alt+V打开 PDF 预览。能出 PDF,环境就算通了。

2.4 中文支持与编译链选择,这是新手最大的坑

中文是绕不过去的一关。早期的CJK宏包方案早就过时了,现在统一用ctex 宏包族。做法很简单:文档类用ctexart(对应 article)、ctexrep、ctexbook,或者在标准文档类里加\usepackage{ctex}。

第二个坑是编译引擎。含中文的文档必须用 XeLaTeX 或 LuaLaTeX 编译,不能用 pdfLaTeX。pdfLaTeX 对中文字体的处理很麻烦,直接编译会报一堆“Missing character”或者干脆输出空白。在 VS Code 里就是选择刚才配好的xelatex x2或latexmk (xelatex)这条 recipe,TeXstudio 里则是在“选项 → 构建”里把默认编译器改成 XeLaTeX。

第三个坑是字体。学校模板常常要求正文宋体、标题黑体,写法是在导言区指定:

\usepackage{fontspec} \setmainfont{Times New Roman} \setCJKmainfont{SimSun} % 正文宋体 \setCJKsansfont{SimHei} % 无衬线黑体 \setCJKmonofont{FangSong} % 等宽仿宋

Mac 用户把字体名换成Songti SC、Heiti SC,Windows 用SimSun、SimHei。写错字体名的后果是编译不报错、但 PDF 里中文全变成方框或者默认字体,这种问题不查日志很难发现。

3. LaTeX 语法骨架:文档结构、宏包与交叉引用

3.1 一份能直接跑通的最小模板

与其背语法,不如先有一份能跑的骨架,再往里填东西。下面这份是我给学弟学妹用的通用模板,中文、公式、图片、表格、参考文献该有的都有:

\documentclass[12pt, a4paper]{ctexart} % ---- 页面与字体 ---- \usepackage[top=2.5cm, bottom=2.5cm, left=3cm, right=3cm]{geometry} \usepackage{fontspec} \setmainfont{Times New Roman} \setCJKmainfont{SimSun} % ---- 数学 ---- \usepackage{amsmath, amssymb, amsthm, bm} % ---- 图与表 ---- \usepackage{graphicx} \usepackage{subcaption} \usepackage{booktabs} \usepackage{tabularx} \usepackage{longtable} \usepackage{multirow} % ---- 引用与超链接 ---- \usepackage[super, square, sort&compress]{natbib} \usepackage[hidelinks]{hyperref} \usepackage{cleveref} % ---- 自定义命令 ---- \newcommand{\dd}{\mathrm{d}} \newcommand{\R}{\mathbb{R}} \title{基于某某方法的某某研究} \author{张三\\某某大学某某学院} \date{\today} \begin{document} \maketitle \tableofcontents \newpage \section{引言} \label{sec:intro} 这里是引言正文,引用一篇文献 \cite{zhang2023}。 交叉引用写法:见第 \ref{sec:method} 节,公式见 \cref{eq:model}。 \section{方法} \label{sec:method} \subsection{模型建立} \begin{equation} \label{eq:model} \min_{x \in \R^n} f(x) = \sum_{i=1}^{n} \left( x_i - a_i \right)^2 \end{equation} \section{结论} \label{sec:conclusion} \bibliographystyle{plainnat} \bibliography{refs} \end{document}

这份模板值得注意几个地方。\label一定写在\caption或\section之后,写在前面会引用到上一节的编号,这是新手最常见的一类“引用错位”。hyperref建议放在宏包加载列表的靠后位置,它对加载顺序敏感,放太早会被后面的宏包覆盖配置。\newcommand定义常用符号,比如我习惯把所有微分 d 写成\dd,这样排版出来是正体 d,符合多数期刊的规范,改起来也只需改一处。

3.2 宏包怎么选:一张常用清单

宏包是 LaTeX 生态的精髓,也是它让人头大的地方——同名功能有好几个包。下面这张表是我这几年反复用下来的最终选择:

宏包作用使用要点
geometry页面边距论文模板一般要求上下 2.5cm、左 3cm
ctex中文支持用 XeLaTeX 编译
fontspec字体设置只在 XeLaTeX/LuaLaTeX 下生效
amsmath数学公式核心几乎必装,equation、align都靠它
amssymb数学符号补充提供\mathbb、\leqslant等
bm粗体数学符号用\bm{\alpha}而不是\boldsymbol
graphicx插图\includegraphics由它提供
subcaption子图比老的subfig、subfigure更新更稳
booktabs三线表用\toprule、\midrule、\bottomrule
tabularx自动换行表格配合X列使用
natbib或biblatex参考文献期刊模板给哪个就用哪个
hyperref超链接与书签加hidelinks去掉难看的红框
cleveref智能引用\cref{}自动输出“图 3”“式 (2)”

提示:宏包加载顺序有讲究,hyperref通常放最后几个;xcolor和hyperref一起用时,xcolor要写在前面。遇到莫名其妙的选项冲突,先调整顺序再排查。

3.3 章节、目录、交叉引用:一次讲透

章节命令有七个层级,实际论文里常用的就三个:\section、\subsection、\subsubsection。再深的层级一般不用,因为太深的编号读起来累,而且大多数期刊模板最多到三级。

目录不用手动写,\tableofcontents一条命令,编译两遍就自动生成。第一遍生成.toc文件,第二遍把内容填进 PDF,所以目录空白或者页码不对,先想想是不是只编译了一遍。\newpage加在目录后面让它单独占一页,学位论文一般还要求目录用罗马数字页码、正文用阿拉伯数字,这需要\pagenumbering{Roman}和\pagenumbering{arabic}配合使用。

交叉引用的核心就一对命令:\label{标签}打标记,\ref{标签}或\cref{标签}取用。标签命名我建议统一前缀,sec:章节、fig:图片、tab:表格、eq:公式,这样在长文档里搜标签时一目了然。\cref比\ref好用,它知道引用对象是什么类型,会自动补上“图”“表”“式”这些字,你不用手动敲,也就不会出现“如图 \ref{} 所示”这种半自动的别扭写法。

4. 论文写作四大高频场景实操

4.1 数学公式:从行内到多行对齐

公式是 LaTeX 的看家本领,也是最容易出问题的地方。基本分两类:行内公式和行间公式。

行内公式用一对美元符号包裹,比如设 $x \in \mathbb{R}^n$ 为决策变量,公式跟着文字走,不换行、不编号。行间公式用equation环境,独占一行且自动编号:

\begin{equation} \label{eq:loss} L(\theta) = \frac{1}{N} \sum_{i=1}^{N} \left( y_i - f(x_i; \theta) \right)^2 + \lambda \|\theta\|_2^2 \end{equation}

这里几个细节值得说。\frac{}{}是分式,分子分母各一个参数;\sum的上下限用_和^,在行间公式里会自动排到 sigma 的正上正下,在行内公式里则排在右下角,这是 LaTeX 自动判断的,不用手动干预;\left( ... \right)让括号随内容高度自动缩放,你写( )也能用,但遇到分式或者矩阵时括号会明显偏小,看起来很别扭,所以公式里的括号我基本一律用\left\right配对。

顺便说下很多人在搜的“左小括号 latex 代码”:普通情况下直接输入半角(和)就行,注意必须是英文半角,中文全角括号()会让编译器直接报“Unicode character not set up”。如果你在 Word 里粘贴 LaTeX 公式代码却转换失败,八成也是这个原因。

多行公式对齐用align环境,&是用于对齐的位置标记:

\begin{align} \label{eq:multi} f(x) &= (a + b)^2 \nonumber \\ &= a^2 + 2ab + b^2 \\ &= a^2 + b^2 + 2ab \end{align}

\nonumber表示这一行不编号,\\换行。如果一行公式太长需要折行但对齐要求不严,用multline环境;如果是一组并列公式想共用一个编号,用equation套aligned。

符号查不全的时候,最省事的办法是装一个符号表 PDF 放桌面,或者用在线工具画出符号反查命令。下面这张表是我用得最频繁的:

符号命令说明
α β γ\alpha \beta \gamma希腊字母小写
Γ Δ Θ\Gamma \Delta \Theta希腊字母大写
∑ ∫ ∏\sum \int \prod求和、积分、连乘
≤ ≥ ≠\leq \geq \neq不等号
≈ ∼ ≡\approx \sim \equiv约等于、相似、恒等
∈ ∉ ⊂\in \notin \subset集合关系
∀ ∃ ∞\forall \exists \infty量词与无穷
→ ⇒ ↔\rightarrow \Rightarrow \leftrightarrow箭头
∂ ∇\partial \nabla偏导与梯度
ℝ ℕ ℤ\mathbb{R} \mathbb{N} \mathbb{Z}黑板粗体数集
× · ±\times \cdot \pm乘号、点乘、正负

4.2 插图、子图与浮动体定位

插图用figure环境包\includegraphics:

\begin{figure}[htbp] \centering \includegraphics[width=0.8\textwidth]{figs/framework.pdf} \caption{整体框架示意图} \label{fig:framework} \end{figure}

[htbp]是位置建议,依次表示 here(当前位置)、top(页顶)、bottom(页底)、page(单独一页)。这四个字母是建议不是命令,LaTeX 会按自己的排版规则决定放哪。很多人抱怨“图跑到文档最后去了”,原因是图片太多、页面空间不够,LaTeX 只能把它们攒到后面统一放。解决办法有三:把\textwidth调小一点给人留空间,用\usepackage{float}加[H]强制原位(但会让页面底部留大片空白,不推荐在正式论文里用),或者干脆接受浮动,反正有\ref交叉引用,读者找得到。

图片格式上,矢量图(PDF、EPS)优先,无限放大不糊;照片类用 PNG 或 JPG。注意要写扩展名或不写都行,但要保证文件名里没有中文和空格。

子图用subcaption宏包:

\begin{figure}[htbp] \centering \begin{subfigure}[b]{0.48\textwidth} \centering \includegraphics[width=\textwidth]{figs/a.pdf} \caption{未加约束的结果} \label{fig:sub-a} \end{subfigure} \hfill \begin{subfigure}[b]{0.48\textwidth} \centering \includegraphics[width=\textwidth]{figs/b.pdf} \caption{加入约束后的结果} \label{fig:sub-b} \end{subfigure} \caption{消融实验对比} \label{fig:ablation} \end{figure}

两个子图各占 0.48 倍文本宽度,中间用\hfill撑开,加起来小于 1 才不会换行。引用时写\cref{fig:sub-a}得到“图 3a”,比手敲“图 3(a)”规范。这里有个坑:子图的\label必须写在子图内部的\caption之后,写到外面会引用到总图的编号。

4.3 三线表与表格自动换行

学术论文的表格讲究“三线表”,也就是顶线、表头线、底线三条横线,不用竖线。booktabs宏包专门做这件事:

\begin{table}[htbp] \centering \caption{不同方法的性能对比} \label{tab:compare} \begin{tabular}{lcc} \toprule 方法 & 准确率(\%) & 耗时(s) \\ \midrule 基线方法 & 82.4 & 12.3 \\ 改进方法 A & 88.1 & 15.7 \\ 本文方法 & 91.6 & 18.2 \\ \bottomrule \end{tabular} \end{table}

这里lcc表示三列,分别左对齐、居中、居中。&分列,\\换行。

表格自动换行是搜索量很高的一个问题,因为默认的tabular环境不会自动折行,单元格里的长文本会一直往右撑,最后冲出页面。三种解法:

第一种,用p{}指定列宽,例如\begin{tabular}{p{3cm}p{5cm}},内容超过宽度会自动折行,但换行后是左对齐且垂直方向默认顶端对齐。第二种,用tabularx配合X列,X 列会自动分配剩余宽度并折行:

\begin{tabularx}{\textwidth}{lXc} \toprule 缩写 & 含义说明 & 取值 \\ \midrule MAE & 平均绝对误差,衡量预测值与真实值之间偏差的平均水平 & 0.32 \\ RMSE & 均方根误差,对大偏差更敏感,常用于回归任务评估 & 0.45 \\ \bottomrule \end{tabularx}

第三种,如果只是某一格内容需要换行但对齐格式要自己控制,用makecell宏包,写成\makecell[c]{第一行\\第二行}就能在单元格内手动换行。三种方法我一般混用:大部分表格用tabularx,个别需要精细控制的用makecell。表格跨页的话,普通table环境做不到,得换longtable环境,它会在跨页时自动重复表头——学位论文里的符号说明表基本都是长表,这一步迟早会遇到。

4.4 参考文献:BibTeX 与 biblatex 怎么用

参考文献是 LaTeX 最省心的一块,前提是你先把.bib文件建好。条目格式长这样:

@article{zhang2023, author = {张三 and 李四}, title = {一种改进的某某算法}, journal = {某某学报}, year = {2023}, volume = {45}, number = {3}, pages = {123--130}, language = {zh} } @inproceedings{wang2022, author = {Wang, Lei and Chen, Ming}, title = {A Fast Method for Something}, booktitle = {Proceedings of the International Conference on Something}, year = {2022}, pages = {1--8}, publisher = {ACM} }

几个容易出错的点。中文作者用and连接,不要用顿号或逗号;页码区间用两个连字符--,用一个连字符排版出来是短横,不符合规范;language = {zh}是给部分样式识别中文用的,不加也不影响编译。

正文里用\cite{zhang2023}引用。如果要在引用处同时显示页码,写\cite[第 5 页]{zhang2023}。最后在文档末尾放两行:

\bibliographystyle{plainnat} \bibliography{refs}

refs是.bib文件的名字,不带扩展名。第一次编译时会出现“引用未定义”的警告,这是正常的,因为参考文献需要四步流程:XeLaTeX → BibTeX → XeLaTeX → XeLaTeX。用latexmk会自动跑完这四步,所以我在配置里主推latexmk (xelatex),能省掉大量“为什么引用显示成问号”的困惑。

如果期刊模板用的是biblatex(现在越来越多),写法就换成\usepackage[backend=biber,style=gb7714-2015]{biblatex}加\addbibresource{refs.bib},正文末尾用\printbibliography。注意biblatex配的是biber而不是bibtex,用错后端会报“Cannot find file .bcf”这类错误。

5. 报错与排查速查表

5.1 编译报错怎么读,从最后一条往前看

LaTeX 的报错信息量大且不友好,但有个规律:日志里第一个!开头的错误才是根因,后面的一串往往是它引发的连锁反应。所以不要从第一行开始读,先搜!定位。

按!找问题的做法有个前提,就是编译时加了-file-line-error,日志会输出成main.tex:57: Undefined control sequence,直接给出文件和行号。在 VS Code 里这个信息会显示在“问题”面板,点一下跳到出错行。

常见的几类错误:

报错信息原因解决办法
Undefined control sequence命令拼错或宏包没加载检查拼写,补\usepackage
Missing $ inserted数学符号写在文本模式里给内容加$...$或用equation环境
Runaway argument?花括号没配对找最近的\begin是否有\end
File 'xxx.pdf' not found图片路径或文件名不对检查相对路径和扩展名
LaTeX Error: Something's wrong--perhaps a missing \item表格或列表语法错误检查&数量和\\
Environment xxx undefined用了未加载的宏包提供的环境补对应宏包
Too many unprocessed floats浮动体排不下减少图片尺寸或数量
Citation 'xxx' undefined参考文献没编译完跑完 BibTeX/biber 四步流程

有个屡试不爽的技巧:遇到玄学问题,把.aux、.bbl、.toc、.out这些中间文件全删掉重新编译一遍。缓存文件不同步是很多“明明改了却不变”的原因,VS Code 里我设了autoClean.run: onBuilt之后这种情况基本绝迹。TeXstudio 里对应的是“工具 → 清理辅助文件”。

5.2 中文与字体问题的排查思路

中文相关的报错基本集中在三处。

第一处是引擎选错。日志里出现大量Missing character: There is no 你 in font或者中文直接消失,就是拿 pdfLaTeX 编中文了,换 XeLaTeX。

第二处是字体名不存在。日志写The font "SimHei" cannot be found,说明系统里没这个字体名字,可能是拼写差异(Mac 上是Heiti SC),也可能是字体确实没装。用fc-list命令(Linux/Mac)或者 Windows 的字体设置窗口确认准确名称。

第三处是编码。老模板可能写着\usepackage[GBK]{inputenc},这个写法在新版 TeX Live 里已经不必要甚至会有副作用,直接删掉,XeLaTeX 默认按 UTF-8 读取源文件。顺便说,编辑器保存文件时务必确认是 UTF-8 编码,有些从 Windows 记事本复制过来的内容会带 BOM 头,编译时容易出怪问题。

5.3 图片、表格、参考文献的典型故障

图片最常见的三个问题:格式不支持(.tif、.bmp在某些引擎下要额外处理,统一转 PDF 或 PNG 最省事)、文件名带中文或空格、路径用了反斜杠。LaTeX 里路径一律用正斜杠/,Windows 也一样,写figs/a.pdf而不是figs\a.pdf。

表格的典型故障是列数对不上。tabular后面声明了lcc三列,你写了四个&,就会报“Extra alignment tab”。反过来少写一个,会报“Misplaced \noalign”。这类错误定位不难,看日志行号找到具体那一行数一数&就行。

参考文献的故障集中在“显示成问号”和“顺序不对”。问号就是编译次数不够,多跑两遍;顺序不对通常是用错了样式,unsrt是按引用顺序排,plain是按作者字母排,学位论文一般要求按引用顺序,那就用unsrt或者国标样式。

提示:投稿前一定要用期刊给的官方模板和官方示例文件编译一遍,把自己的内容替换进去,而不是拿自己的模板硬套。我见过因为模板版本不对被退回来重排的情况,白耽误一周。

6. 我的实战工作流与投稿前避坑清单

6.1 目录结构与文件拆分

当文档超过三十页,把内容全塞进一个.tex会非常难受,编译一次要等好几秒,滚动条拉半天。我习惯按章节拆文件:

paper/ ├── main.tex % 主文件,只管导言区和 \input ├── refs.bib % 参考文献 ├── figs/ % 所有图片 │ ├── framework.pdf │ └── result.png ├── chapters/ │ ├── 01-intro.tex │ ├── 02-method.tex │ └── 03-experiment.tex └── settings/ └── packages.tex % 宏包集中加载

主文件里用\input{chapters/01-intro}引入,注意不带扩展名。好处是几个人分别写不同章节时不会互相踩,合并时也不会有冲突;另一个好处是编译时可以只编译单章(用\includeonly),改一段不用等全文跑完。

宏包集中放在settings/packages.tex,主文件里\input{settings/packages}一次引入。这样做的好处在投稿时特别明显:期刊要求的格式和我们平时用的不一样,只要改这一个文件里的宏包配置和页面设置,正文一个字都不用动。

6.2 用 Git 管论文,比你想的有用

学位论文改十几稿是常态,导师批注版、外审版、答辩版、最终版,文件名后缀能排到_最终版_真的最终版_v3。用 Git 管起来之后,这个问题彻底消失。git diff能精确到词级别地告诉你这两稿之间改了什么,写“修改说明”时直接把 diff 导出,比对着两个 PDF 一页页看快得多。

纯文本文件的另一个好处是不会出现“文件损坏打不开”的惨剧。我曾经在交稿前两小时遇到 Word 文档提示修复,心跳直接飙到一百二,LaTeX 这种纯文本加 Git 的组合从根本上避免了这种风险。

实际操作上,.gitignore里把编译产生的中间文件排除掉就行:

*.aux *.log *.out *.toc *.bbl *.blg *.synctex.gz *.fls *.fdb_latexmk *.pdf

PDF 要不要排除看个人习惯,排除掉可以让仓库干净,但如果你想让导师直接看 PDF,也可以保留。

6.3 投稿前的自检清单

这是我每次交稿前都会过一遍的清单,能挡掉大部分低级错误:

  • 全文搜索??,确认没有未解析的引用和文献;
  • 点开目录,确认页码和实际页面对得上,三级标题都在;
  • 逐张图核对图注和图内标注是否一致,子图编号是否有漏;
  • 表格检查单位是否标注,数字是否统一小数位数;
  • 公式检查是否每个被引用的公式都有编号,没引用的用\nonumber去掉编号;
  • 参考文献逐条核对,特别是中文文献的作者格式和页码;
  • 用 PDF 阅读器看一遍全文,确认没有图片被挤到页边、没有表格跨页断得不合理;
  • 如果期刊要求匿名评审,检查正文和 PDF 属性里有没有作者信息残留。

最后分享一个我踩过的坑:有一次投稿前一天,我把\bibliographystyle从plain改成期刊要求的样式,忘了重新跑编译,直接提交了 PDF,结果参考文献格式完全不对,被编辑退回重投。改任何导言区配置之后,务必完整编译一遍并肉眼检查输出结果,不要只看编译没有报错就以为万事大吉。编译通过和排版正确是两件事,这一点在 LaTeX 里尤其明显。

返回列表