☰
Overleaf+BibTeX参考文献管理全攻略:从入门到实战
2026/10/4 18:23:17 网站建设 项目流程

写论文的时候,引用文献大概是绕不开的一道坎。手动编号、手动排版、手动改格式,遇到投稿要求一变,全部推倒重来,那滋味真的酸爽。后来我开始用Overleaf写论文,配合BibTeX管理参考文献,才算是把这块彻底理顺了。这篇内容就结合我这几年的实际使用经验,把Overleaf + BibTeX这套工作流从头到尾拆开讲清楚,包括怎么建.bib文件、正文里怎么插入引用、编译顺序为什么那么讲究,以及那些让新手原地崩溃的“问号”和“未定义引用”到底是怎么回事。无论你是刚接触LaTeX的本科生,还是被投稿系统虐过几次的研究生,这篇应该都能帮上忙。

1. 内容整体设计与思路拆解

1.1 为什么用BibTeX而不是手动管文献

先说点实在的。用Word写论文时,很多人是手动维护参考文献列表,用EndNote或Zotero插插引文,倒也凑合。但一旦遇到这几个场景,手动方案就很难受:

  • 投稿要求从“作者-年份”改成“顺序编号”,又或者要把参考文献从IEEE格式改成APA格式;
  • 论文写到一半,发现少引了一篇关键文献,要在中间插入,后面所有编号都得跟着变;
  • 同一个实验室几个人合作写一篇论文,每个人维护一份文献列表,最后合并时重复条目一堆。

用BibTeX之后,这些事情全变成“改一行代码”的事。文献信息集中放在一个.bib文件里,正文里只写一个引用键(比如\cite{smith2020}),编译时自动从bib数据库里拉出文献、排序、按指定样式格式化。改样式就是换个命令参数,增删文献就是加一行\cite{}或删掉一处引用,编号自动跟着变,完全不用手工维护。这个设计思路的本质,是把“内容”和“格式”彻底分开——文献信息是内容,引用样式是格式,BibTeX负责在两者之间做匹配。

1.2 Overleaf项目的基本文件构成

在Overleaf里建一个论文项目,默认会有.tex主文件,如果你想用BibTeX,还得再加一个.bib文件,并且.tex里要包含几行关键代码。我习惯把整个项目的文件结构设计成这样:

  • main.tex:论文主文件,负责文稿正文和整体结构。
  • references.bib:纯文本的文献数据库文件,所有参考文献信息都放这里。
  • main.pdf:编译输出的最终PDF(Overleaf会自动生成,不需要手动维护)。
  • .latexmkrc:可选,用来控制编译链设置的配置文件,一般不需要新建。

这个结构看起来很简洁,但背后的逻辑是:Overleaf会按照main.tex中的指令自动调用BibTeX工具,读取.bib文件,生成辅助文件(比如.aux、.bbl),经过多轮编译后最终输出带正确编号和引用列表的PDF。如果你不理解这中间到底发生了什么,就会遇到“为什么我编译了却看不到引用”这种令人抓狂的问题。

1.3 BibTeX在Overleaf中的工作路径

用一个通俗的类比来解释BibTeX的工作流程:.bib文件就像图书馆的图书目录,里面记载了每本书的作者、书名、年份、出版社等信息;你在正文里写的\cite{键名}就像一张借书单,告诉图书馆“我要借哪本书”;BibTeX工具则是图书管理员,它根据借书单去目录里匹配,并按照你要的格式(比如期刊要求GB/T 7714或IEEE)产出一份整齐的参考文献列表。

但“借书”这件事在LaTeX编译里不是一次完成的,而是分几步走。这也是很多人第一次用BibTeX时最容易懵的地方:

  1. 第一遍编译:LaTeX读取.tex文件,把正文里的\cite{}命令转换成辅助文件里的引用记录;
  2. BibTeX处理:bibtex命令读取.aux辅助文件,去.bib里查找对应的文献条目,生成.bbl文件(这是格式化好的参考文献列表);
  3. 第二遍和第三遍编译:LaTeX再读.aux和.bbl,把引用编号和文献列表最终写入PDF。

在Overleaf里,如果用的是自带的编译器(比如pdfLaTeX),并且菜单中选择的还是“Auto”(自动),系统一般会自动跑两到三遍,不需要你手动干预。但如果你改了编译器设置,或者用了自定义编译链,没搞清楚这个多轮编译关系,就会遇到各种灵异现象。

2. 代码准备与核心配置实现

2.1 在Overleaf中新建.bib文件并写入第一条文献

在Overleaf左侧的文件栏里,点击“新建文件”按钮,输入文件名references.bib,回车确认。.bib文件本质上就是一个纯文本文件,只不过扩展名是.bib,里面的内容遵循BibTeX的条目语法。

打开这个刚刚创建的文件,手动输入或用工具导入第一条文献。一个最基本的期刊文章条目长这样:

@article{smith2020deep, author = {Smith, John and Brown, Alice}, title = {Deep Learning for Natural Language Processing}, journal = {Journal of Artificial Intelligence Research}, year = {2020}, volume = {68}, pages = {121--145}, doi = {10.1613/jair.1.12000} }

解析一下这个条目的各个部分:@article表示这是期刊文章类型的文献,{smith2020deep}是引用键,也就是你在正文里\cite{}要用的名字,后面以逗号分隔的每一行都是字段,分别描述了作者、标题、期刊名、年份、卷号、页码、DOI。引用键的命名我强烈建议用“第一作者姓氏+年份+简短关键词”的组合,比如smith2020deep,理由很简单:当你管理几十上百条文献时,这个命名规则能让你一眼看出这条文献是谁写的、哪一年、大概讲什么主题,而不是回忆ref1到底指的是什么。

2.2 主文档中引入bib文件并设置参考文献区

有了references.bib之后,还需要在main.tex里告诉LaTeX:“要用这个文献库,并且在文末输出参考文献列表。”通常你需要两行代码,放在\end{document}之前:

\bibliographystyle{plain} \bibliography{references}

第一行\bibliographystyle{plain}用来声明参考文献的格式化样式,常用的有plain(按作者字母排序,编号显示为[1][2])、unsrt(按引用顺序排序)、ieeetr(IEEE风格,适合电子工程与计算机类)、alpha(作者+年份的字母标记式编号)等。第二行\bibliography{references}是真正告诉BibTeX“去哪个.bib文件里找文献”。

这里有个细节我还要特别强调:\bibliography{}括号里写的是.bib文件的文件名,但不带.bib扩展名。比如文件叫references.bib,那么命令写成\bibliography{references},多写或者漏掉扩展名都会导致编译找不到文献库。

2.3 正文中插入引用命令

当你在正文的某个位置想引用某篇文献时,直接用\cite{}命令,把对应的引用键填进去就行:

近年来,深度学习方法在自然语言处理领域取得了显著进展 \cite{smith2020deep}。

如果你需要一次引用多篇文献,用逗号分隔所有键名:

多项研究都表明该方法的有效性 \cite{smith2020deep, chen2019attention, li2021survey}。

这里还想提醒一个容易踩的小坑:\cite{}的括号内不要有空格,或者至少不要把空格放在键名中间,否则BibTeX解析时可能会出错。特别是从某些文献管理工具里复制引用键时,容易把前后空格也一并复制,导致报错或显示为“未定义引用”。

2.4 编译器选择与编译链配置

Overleaf左上角的“Menu”按钮里,有一个“Compiler”选项,默认一般是pdfLaTeX。如果使用BibTeX,保持pdfLaTeX没问题。但如果你用了某些宏包或字体,可能需要选择XeLaTeX或LuaLaTeX,这时BibTeX依然可以用,但需要注意编译顺序。

通常我不建议手动去设置复杂的编译链,Overleaf的默认自动编译(Auto)已经能处理大多数场景。真正重要的是理解:当你修改了.bib文件的内容(比如新增条款)之后,需要重新编译,而且至少编译两次,第一次生成辅助文件,第二次把文献列表和编号写进PDF。如果只编译一次,你可能会在PDF里看到引用处显示成问号“?”或空白。

Overleaf还有一个细节:如果你在项目中直接编辑.bib文件,有时在线编译缓存不会自动清掉上一次的.aux和.bbl文件。如果遇到怎么编译都不更新文献列表的情况,点击Overleaf菜单里的“Clear cached files”(清除缓存文件),再重新编译基本能解决。

2.5 从数据库导入BibTeX条目的快捷方式

手动敲每一条文献确实太折磨人,实际项目里我很少逐条手写。推荐几个最常用的获取BibTeX条目格式的途径:

  • Google Scholar:搜索某篇文献,点击标题下方的“引用”图标,在弹出的窗口底部选择“BibTeX”选项卡,复制内容存进.bib文件。
  • DBLP:计算机领域几乎每篇论文都有对应页面,点“BibTeX”链接即可获得标准格式。
  • arXiv:每篇文章详情页里都有“Export Citation”选项,选中BibTeX格式复制。
  • Zotero / EndNote:文献管理工具可以批量导出BibTeX格式,避免手动复制粘贴,适合需要一次性处理几十条文献的情况。

用这些方式拿到的条目,建议稍微检查一下字段是否完整,比如是否缺少year、booktitle或journal。有些网站的自动导出字段不全,或者作者名格式不统一,编译后可能出现奇怪的缩写。

3. 实操过程与核心环节实现

3.1 从零搭建一个可编译的实例

为了让你能直观感受整套流程,我直接用一个最小的但完整的实例演示一次。首先新建一个文本文件,命名为main.tex,写入以下内容:

\documentclass{article} \usepackage[UTF8]{ctex} \begin{document} \section{引言} 近年来,深度学习技术在很多领域展现出强大的能力, 尤其是在自然语言处理方向\cite{smith2020deep}。相关综述也指出, 注意力机制的引入是重要的转折点\cite{vaswani2017attention}。 \bibliographystyle{plain} \bibliography{references} \end{document}

这里用了ctex宏包,目的是支持中文编译。如果你在Overleaf中直接新建项目,系统默认是没有这个宏包的,需要确保项目的编译环境允许自动安装(Overleaf一般都能自动处理LaTeX宏包)。同时再新建一个references.bib,写入两条文献:

@article{smith2020deep, author = {Smith, John and Brown, Alice}, title = {Deep Learning for Natural Language Processing}, journal = {Journal of Artificial Intelligence Research}, year = {2020}, volume = {68}, pages = {121--145} } @inproceedings{vaswani2017attention, author = {Vaswani, Ashish and Shazeer, Noam and Parmar, Niki and others}, title = {Attention Is All You Need}, booktitle = {Advances in Neural Information Processing Systems}, year = {2017}, pages = {5998--6008} }

点击Overleaf页面顶部的“Recompile”(重新编译)按钮,理论上你应该能在PDF中看到正文中的[1]和[2],文末出现按作者字母顺序排列的参考文献列表。第一次跑的时候如果编译时间稍长,耐心等一下,因为需要完成多轮编译。

3.2 引用编号的顺序逻辑与样式选择

刚才示例里用的plain样式,会把参考文献按作者姓氏的字母顺序排序,然后赋予编号[1]、[2]。你正文中第一次引用的不一定永远是[1],而是看排序结果。如果你希望文献按照正文中出现的先后顺序编号,也就是第一次引用的文献标为[1],第二次标为[2],那要用unsrt样式。

\bibliographystyle{unsrt}

这一条我用得非常多,尤其是写会议论文时,很多模板默认要求按出现顺序编号。改成unsrt之后,编译结果就会按引用顺序重新排序,不需要你手动调整任何条目。

计算机相关的期刊或会议还经常要求IEEE风格,也就是作者名大写缩写、序号放在方括号里、条目格式与IEEE官方出版物一致:

\bibliographystyle{ieeetr}

具体选哪个样式,核心依据是目标期刊或会议的投稿要求。所以在动笔之前,先去翻一下投稿模板的官方说明或样例PDF,确定参考文献格式要求,再确定\bibliographystyle{}里的样式名。改样式是成本最低的操作,通常只需要换一行代码,然后重新编译。

3.3 在Overleaf中使用biblatex / biber作为替代方案

如果你使用的宏包是biblatex而不是传统的\bibliography{}+ BibTeX方式,那么流程会略有不同。Overleaf也支持biblatex,但需要做两处关键调整:

第一,在导言区(\begin{document}之前)引入宏包并声明bib资源:

\usepackage[style=numeric, sorting=none]{biblatex} \addbibresource{references.bib}

第二,在文末用\printbibliography命令代替\bibliography{}:

\begin{document} ... \printbibliography \end{document}

最重要的是,如果你用biblatex,编译链应当设置为pdfLaTeX → Biber,而不是pdfLaTeX → BibTeX。在Overleaf的“Menu”中切换编译器,选pdfLaTeX,并在“Magic Comments”(魔法注释)中显式指定bibtex或biber。通常在文档第一行加上这么一行注释,Overleaf就能自动判断:

% !TeX program = pdflatex % !BIB program = biber

不过说实话,传统用法和biblatex二选一即可,不要混用。混用最容易出现的错误是:你在.tex里同时写了\bibliography{references}又用了\addbibresource{references.bib},编译系统就会一头雾水,甚至报错。

3.4 如何检查是否成功生成了参考文献列表

一个很实用的检查思路是:在Overleaf页面下方的日志窗口(Logs and output files)里,查看编译过程有没有出现与BibTeX相关的警告或错误。常见的正常输出里会出现Database file #1: references.bib这样的信息,表示BibTeX找到了参考文献数据库。如果这个文件没找到,日志里会提示I couldn't open database file ...。

如果你想手动查看生成的.bbl文件内容,可以在Overleaf的文件列表里找到它(点击左上角的小箭头显示所有文件)。.bbl文件里是BibTeX认为“最终会被LaTeX渲染成参考文献列表”的格式化内容。如果.bbl为空或者提示找不到键名,问题大概率出在.bib里的引用键和正文里的\cite{}键不一致。

3.5 实战中我固定使用的模板

这里分享一个我每次用Overleaf写论文都会套用的最小模板,你可以直接复制进自己的项目:

\documentclass[12pt]{article} \usepackage[UTF8]{ctex} \usepackage{hyperref} \title{基于BibTeX的Overleaf引用实践} \author{Your Name} \date{\today} \begin{document} \maketitle \section{实验验证} 我们引用一篇经典文献来验证流程 \cite{vaswani2017attention}, 同时补充近期工作 \cite{smith2020deep}。 \bibliographystyle{unsrt} \bibliography{references} \end{document}

hyperref宏包不是必须的,但我习惯加上,它能让PDF中的引用编号变成可点击的超链接,方便在屏幕上阅读时跳转。如果你投递的期刊对超链接有特殊要求,可以视情况去掉。

4. 常见问题与排查技巧实录

4.1 编译后正文只显示问号和未定义引用

这是几乎每个BibTeX新手都会碰到的问题。正文里\cite{key}显示成[?],参考文献列表是空的,或者列表里出现undefined citation。

排查步骤如下:

  1. 检查.bib里是否确实有对应的引用键,键名是否完全一致(区分大小写)。一个很容易犯的错是:从别处复制引用键时,复制到了隐藏的空格或换行符。
  2. 检查.tex里\bibliography{references}写的文件名是否和.bib文件名一致,并且没加.bib扩展名。
  3. 检查编译轮数是否足够。如果你在本地用命令行编译,顺序是pdflatex、bibtex、pdflatex、pdflatex。在Overleaf中,如果使用默认自动设置一般没问题,但如果刚改了.bib文件,建议手动多点一次“Recompile”。
  4. 点击Overleaf菜单里“Clear cached files”清缓存,再重新编译。

我在实践中发现,第三种情况占了大半原因。很多人以为保存文件后点一次重新编译就行,但BibTeX需要的是两到三轮编译,如果在线平台因为某种原因只跑了一轮,引用编号就还没确定。

4.2 “I found no \citation commands”是什么情况

日志里出现I found no \citation commands,说明BibTeX扫描.aux文件时,没有找到任何\citation{...}记录。这意味着正文里的\cite{}命令没有被LaTeX正确解析,或者.aux文件是旧的、空白的。

常见原因包括:

  • 想引文但还没在正文里写\cite{},空有一个.bib文件,自然没有引用可言;
  • 用了\citep{}、\citet{}等natbib命令,但导言区没有加载natbib宏包,导致引用命令没有被识别;
  • 编译链出错,第一次LaTeX编译就中断在\cite{}附近,导致.aux没生成完整。

解决办法是:先确认正文有\cite{};如果用了natbib语法,就在导言区加\usepackage{natbib};最后清缓存重新完整编译。

4.3 中文参考文献的处理

用BibTeX处理中文文献,最大的坑是作者名拼音化。很多中文文献在数据库中作者字段写作Wang, Xiaoming,但如果你希望中文论文的参考文献列表里显示中文姓名(比如“王晓明”),就需要在.bib里直接使用中文:

@article{wang2024example, author = {王晓明 and 李静}, title = {基于深度学习的文本分类方法研究}, journal = {计算机学报}, year = {2024}, volume = {47}, number = {3}, pages = {600--612} }

还需要注意一点:BibTeX的排序逻辑基于作者姓氏的ASCII/拼音编码,如果混合中文和英文文献,plain样式有时会出现排序不太符合预期的现象。这时可以改用unsrt按引用顺序排列,或者使用专门面向中文学位论文的样式文件(比如gbt7714相关的bst文件),Overleaf中也有对应的模板。

另外,正文里如果中文文献和英文文献混排,而且你用了ctex宏包,请确认编译编译器选择为XeLaTeX或pdfLaTeX(看你的中文字体情况),否则可能出现中文乱码。

4.4 参考文献列表里出现奇怪的字符或乱码

.bib文件里不要直接复制网页上的特殊字符,比如弯引号、全角括号。曾经有位朋友从网页上复制标题,结果标题里带了一个不可见的Unicode控制字符,编译后参考文献列表里出现了类似“?”的乱码。最稳的做法是:

  • 在文本编辑器里把.bib文件的编码改为UTF-8;
  • 从可靠的学术数据库(DBLP、Google Scholar、arXiv)复制条目,而不是从PDF里手动抄;
  • 如果发现乱码,先检查具体的词条内容,把可疑字符删掉重新输入。

4.5 表格:常见报错信息与解决方案速查

日志或现象可能原因解决方案
Citation 'xxx' undefined引用键不存在或拼写不一致核对.bib中的键名与\cite{}
I couldn't open database file references.bib.bib文件名或路径不对确认\bibliography{references}与文件同名
I found no \citation commands正文没有引用命令或.aux异常在正文加\cite{},清缓存重编译
The style file: plain.bst相关报错样式文件缺失或编译环境引入失败改用标准样式或在Overleaf重新选择编译器
参考文献顺序不对样式排序逻辑不符合要求按需更换plain为unsrt或ieeetr
中文家人名显示异常编码或编译器问题用XeLaTeX编译,并保证.bib为UTF-8
修改.bib后PDF不变缓存或编译轮数不足点击“Clear cached files”后重新编译

4.6 我踩过的一个最隐蔽的坑

最后聊一个我亲身经历过的隐蔽坑。有一次我写一篇期刊论文,正文中用了\cite{authoryear}这种带字母的键名,编译始终报Citation undefined,但我把.bib里的键名反复对照了很多遍,确认一致。折腾了半天,最后发现是.bib文件里某个条目的字段值中不小心混入了一个未知的换行符,导致BibTeX解析到一半就提前结束了整个数据库文件,后面的条目全部没有被读取。

从此以后,我养成了一个习惯:每次从网页复制.bib条目后,都先检查大括号是否闭合、逗号是否齐全,再粘贴进.bib文件里。如果某个条目解析错误,BibTeX日志里通常会有Warning--I didn't find a database entry for "..."这样的提示,要养成看日志的习惯,而不是死盯PDF输出。

5. 进阶用法补充

5.1 多个.bib文件的管理方式

当你手头的文献库越攒越多,把所有文献都塞进一个references.bib确实会变得非常臃肿。我个人的做法是:按论文项目来拆分,每篇论文项目里只放与该文相关的文献子集。如果是在同一个Overleaf项目里想引用多个文献数据库,也可以这样写:

\bibliography{references, additional}

注意这里多个文件名用逗号分隔,不要加空格(或者保持统一风格),BibTeX会依次查找这些文件。

5.2 使用LaTeX Workshop或本地编辑器配合Overleaf

有些人习惯在本地用VS Code的LaTeX Workshop插件编辑.tex和.bib,然后在Overleaf里协作。我的做法是本地编辑完,直接把.bib文件传到Overleaf项目中。这样可以充分利用本地编辑器的拼写检查和快捷键,同时享受Overleaf的在线协作和自动编译。传文件时需要注意保持.bib文件UTF-8编码,Overleaf对UTF-8支持很友好,但如果本地编辑器默认存成了GBK,中文就会乱。

5.3 用注释管理未引用但仍需保留的文献

.bib里面有些文献你可能暂时没引用,但准备后面用,这时候不用删掉,在条目前面加个注释标记就行:

% 这篇后续可能要用到 @article{li2021survey, ... }

BibTeX默认只处理被\cite{}引用到的条目。即使.bib文件里躺着几百条文献,只要正文没引用,参考文献列表里就不会出现它们。这个特性很实用,你可以放心把整个课题组常用文献都放进去,按需引用。

5.4 Overleaf修订模式与引用插入的结合

顺带提一个经常被问到的问题:Overleaf的修订模式下能不能正常使用BibTeX?实际是可以的。你在修订模式下插入的\cite{}命令和引文内容一样会保留修订标记,审稿人能看到你在对应位置加了引用。不过要提醒的是,启动修订模式后,修改.bib文件不会产生修订标记,因为.bib不算最终文档的主体内容。这是Overleaf的设计逻辑,不是配置有误。

如果合作者需要审阅文献列表的改动,建议在聊天区或单独的notes文档里说明新增了哪些文献。这个操作细节相信很多人在实际协作中都会碰到。

6. 针对不同使用场景的实操建议

6.1 课程论文或本科毕业论文

本科阶段写毕业论文,参考文献数量通常不多,几十条以内。我的建议是:先在Google Scholar或学校图书馆数据库找到每条文献的标准BibTeX条目,统一粘贴进一个.bib文件,然后全文使用\cite{}插入。格式样式优先看学校模板是否有现成的.bst文件,如果没有,直接用gbt7714或者plain都能保证基本规范。重要的是让每一条文献的字段都干净完整,尤其是作者、年份、页码和DOI,这些是评审老师看得最多的。

6.2 期刊投稿与会议投稿

投稿场景下,参考文献样式往往有严格规定。常见的几种样式我在前面已经提到,这里补充一个更普适的方法:很多期刊模板自带.bst样式文件,你只要把模板项目下载下来,把\bibliographystyle{}里的名字替换成模板要求的名字即可。如果模板使用natbib和biblatex方案,就别再混用传统的BibTeX方案,优先遵循模板自带的设置。

6.3 多人协作与版本管理

Overleaf的协作模式非常适合多人一起写文章。但多人协作时.bib文件冲突问题比较棘手。我的经验是:指定一个人专门负责维护.bib文件,其他人不要同时去编辑文献库,否则很容易互相覆盖。假如必须多人编辑,建议在组内约定好引用键命名规则(比如统一用“姓氏+年份+第一个单词”的格式),这样就算是不同人添加新条目,键名也不会产生冲突。另外,Overleaf的“Track Changes”(修订模式)建议在最终统稿阶段打开,平时写作阶段可以先关掉,不然屏幕上全是修订气泡,影响协作效率。

7. 为什么我在实际项目里依然坚持用BibTeX

也许你会问,Overleaf提供了那么多参考文献管理方案,比如自带的可视化引用面板,甚至可以直接连接Zotero,为什么还要手动写BibTeX?我的回答是:BibTeX作为一种纯文本方案,它最大的优势在于稳定、透明、不过度依赖平台。哪怕某一天Overleaf出了新的功能,或者你换到其他LaTeX工具链,只要有一个.bib文件和几个\cite{}命令,你的论文引用系统就能完整迁移。

我试过在本地TeX Live、VS Code、Overleaf之间来回切换,唯一不需要改的就是.bib文件格式和LaTeX命令。这种可迁移性,在写长文档、会议投稿和跨工具协作时真的非常重要。

另外,BibTeX的条目格式本身也是一种很好的“知识管理”方式。当你积累了三五年文献,回头翻看自己的.bib文件,条目里的作者、期刊、卷号、页码信息一应俱全,比浏览器书签或者碎片化的PDF存檔都更有条理。

写了这么多年论文,我最深的体会就是:参考文献管理最大的门槛不是工具本身,而是你愿不愿意在建项目时多花十分钟把.bib文件结构和样式需求想清楚。前期把路铺好了,后期所有修改都只是改几行参数的事。希望这篇内容能帮你把Overleaf和BibTeX这套组合用顺手,写论文的时候少一点折腾,多一点从容。

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

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

立即咨询