用爱思唯尔(Elsevier)官方LaTeX模板投稿,结果参考文献编号不是按照正文引用顺序来的,这事儿我一开始还真没想到能折腾这么久。平时用LaTeX写论文,大家默认的规矩就是参考文献按引用先后自动编号,投IEEE、ACM、Springer的模板基本都这么干,结果到了Elsevier的elsarticle模板这儿,编译出来的参考文献列表居然按作者姓名字母排序,正文里引用的编号跟出现顺序对不上,改起来特别费劲。这个问题的本质不是LaTeX本身出错了,而是模板默认启用的参考文献样式跟“顺序编码制”的要求不一致。这篇就专门聊聊怎么把Elsevier官方模板改成按引用顺序编号,顺带把我在改这个过程中踩过的坑和排查思路一起整理出来,给正在被这个乱序问题折磨的同学一个能直接照着操作的方案。
这个乱序问题主要出现在用Elsevier官方elsarticle模板写稿、准备投期刊的时候。很多期刊的投稿指南都明确要求参考文献按正文中首次引用的顺序编号,也就是“顺序编码制”。但elsarticle模板为了兼容不同期刊的排版风格,默认加载的参考文献样式比较复杂,有时是作者-年份制,有时是字母排序的数值制,导致编译结果跟投稿要求不一致。适合谁来参考?正在用elsevier模板写论文、被参考文献编号顺序折腾过的研究生和科研人员,尤其是第一次投爱思唯尔旗下期刊、对LaTeX的bibtex机制还不太熟的同学。
1. 问题根源:elsarticle模板默认排序机制解析
1.1 为什么会出现“不按引用顺序编号”的现像
要搞清楚这个乱序问题,先得明白LaTeX参考文献处理的底层逻辑。LaTeX处理参考文献主要靠两套工具链:老牌的BibTeX和较新的biblatex/biber。elsarticle模板默认走的是BibTeX链路,也就是用.bib数据库文件配合.bst样式文件来生成参考文献列表。
关键点在于,\bibliographystyle{xxx}这一行决定了参考文献列表的排序方式。常见的.bst样式文件大致分两类:一类是plain、alpha、abbrv,它们默认按作者姓氏字母排序,不管你在正文里什么时候引用;另一类是unsrt,它才按正文中第一次引用的顺序排序。
elsarticle模板默认加载的样式文件是elsarticle-num.bst或elsarticle-num-names.bst,具体取决于模板版本和导言区的设置。我实测下来,elsarticle-num.bst这个样式在默认配置下,输出结果经常表现为按字母排序而不是按引用顺序。这就导致了标题里说的乱序问题:正文第1处引用的文献,在参考文献列表里排到了第37号,正文第30处引用的反而排到第1号。
1.2 模板里到底是哪一段代码在“捣鬼”
打开Elsevier官方elsarticle模板的主文件(通常是elsarticle-template.tex),在导言区一般能看到类似下面的代码:
\bibliographystyle{elsarticle-num}如果没有显式地写这行,模板会在文档末尾\bibliography{yourbibfile}附近自动设置。问题就出在这个elsarticle-num.bst身上——它内部实现了“先按作者字母排序,再按年份排序,最后按标题排序”的规则,而不是按引用顺序排序。
有的模板版本还会在导言区加载natbib宏包,比如:
\usepackage[numbers,sort&compress]{natbib}这个配置本身不影响排序方式,它只影响引用标注的格式(比如[1,3-5]这种压缩格式)。真正的排序逻辑是.bst文件里的函数控制的。所以即使你把natbib选项改成numbers,只要.bst文件还是elsarticle-num.bst,排序结果依然是字母序。
1.3 为什么有的期刊看不出问题,有的期刊一眼就露馅
这个现象有个迷惑性:如果一篇论文引用的文献恰好第一作者姓氏的首字母排序跟引用顺序差不多,那乱序问题就不太明显。但大多数论文做不到这么巧。尤其是文献综述部分,一上来就引用三五篇经典文献,这些文献的作者往往是领域大牛,姓氏五花八门,字母排序跟引用顺序几乎不可能一致。
再加上Elsevier旗下期刊数量庞大,不同期刊对参考文献格式要求本来就不同:有的要求顺序编码制,有的要求作者-年份制,有的允许字母排序。elsarticle模板为了通吃这些需求,默认配置就搞了一个“不会特别偏袒某种排序”的中庸方案,结果就是:如果你投稿的期刊要求顺序编码制,模板默认产出的参考文献列表十有八九是不合格的。
2. 针对性解决方案:让elsevier模板按引用顺序编号
2.1 方案一:把参考文献样式换成unsrt系列(最直接)
最直接的办法,就是把.bst样式文件换成unsrt.bst。这个名字一听就明白:unsorted,不排序,按引用顺序输出。
具体操作只有两步。第一步,在模板导言区找到\bibliographystyle{elsarticle-num}这一行,改成:
\bibliographystyle{unsrt}第二步,确保\bibliography{你的bib文件名}在文档末尾没被注释掉,然后重新编译。编译顺序必须是:latex -> bibtex -> latex -> latex,缺一步都不行。
unsrt.bst是LaTeX发行版自带的样式文件,几乎所有TeX发行版(TeX Live、MiKTeX)都内置了它,不像elsarticle-num.bst那样需要模板文件夹里额外放一份。所以这样改完,你不需要再下载任何文件,只要你的LaTeX环境正常,就一定能编译通过。
2.2 方案二:手动维护thebibliography环境(最笨但最稳)
如果不想依赖BibTeX,或者.bib文件因为各种原因没法正常处理,可以直接放弃自动生成参考文献列表,改为在文档里手写thebibliography环境。
\begin{thebibliography}{99} \bibitem{ref1} Author, A., Title of the paper, Journal Name, 2024. \bibitem{ref2} Author, B., Another title, Conference Proceedings, 2023. \end{thebibliography}这种方式下,参考文献的顺序完全由\bibitem的排列顺序决定,跟引用顺序天然一致,想乱都乱不了。正文里引用时用\cite{ref1}和\cite{ref2},编号会自动按\bibitem的出现顺序分配。
这个方案的缺点是:不能自动从.bib文件生成文献信息,需要手动整理每一篇文献的完整条目,而且格式要自己按期刊要求调,工作量不小。所以只推荐在参考文献数量不多(比如少于20篇)或者投稿前临时救急时使用。
2.3 方案三:保留elsarticle样式文件,通过natbib选项调整(不推荐)
网上有些人会说,通过修改\usepackage[numbers]{natbib}就能解决问题。我实测过,这个操作并不会改变参考文献列表的排序。natbib宏包控制的是正文中引用标注的格式([1]还是(Author, 2024)),不直接决定.bst文件对参考文献列表的排序规则。
还有一种变体操作:把\bibliographystyle{elsarticle-num}换成elsarticle-num-names.bst,这个样式在模板文件夹里经常跟主样式一起出现。但它主要用于作者-年份引用格式的期刊,换上之后正文引用会变成(作者, 年份)的形式,而不是[1]这种编号格式,反而更麻烦。除非你投稿的期刊明确要求作者-年份制,否则不建议动这个脑筋。
2.4 三种方案对比,我建议你这样选
| 方案 | 改造成本 | 稳定性 | 适用场景 |
|---|---|---|---|
| 换成unsrt.bst | 低(1行代码) | 高,自动生成文献列表 | 文献量较大,需要自动从.bib生成 |
| 手写thebibliography | 高(手动整理全部文献) | 很高,完全可控 | 文献量小,或.bib文件不可用 |
| 调natbib选项 | 低 | 无效,排序不受影响 | 仅对正文引用格式有要求时使用 |
我自己的建议是:如果你投的期刊明确要求“参考文献按正文引用顺序排序”,直接改成\bibliographystyle{unsrt},这是最优解。既保留了BibTeX的自动化能力,又彻底解决了排序问题,还不用动参考文献条目本身。
3. 实操过程:从乱序到顺序编码的完整改法
3.1 修改前先备份,别把模板改坏了
这一步非常重要。Elsevier官方模板通常包含多个文件,除了主.tex文件,还有elsarticle.cls类文件、.bst样式文件、graphicspath目录等。在你动任何代码之前,先把整个模板文件夹复制一份备份。别嫌多余,我见过太多人改乱了之后又找不到原始模板,只能重新去官网下载,浪费时间。
备份完成后,用你顺手的编辑器(TeXstudio、VS Code + LaTeX Workshop、Overleaf都行)打开主.tex文件。如果你是Overleaf用户,直接左键点左上角Menu,选择“Download”下载一份完整备份,然后在Overleaf的副本里改。Overleaf有个好处,改了马上能在线上编译预览,不用本地装环境。
3.2 在导言区找到样式设置并替换
在主.tex文件前部,找到导言区,也就是\documentclass[preprint,12pt]{elsarticle}到\begin{document}之间的区域。在这个区域里搜bibliographystyle,正常情况下能看到一行:
\bibliographystyle{elsarticle-num}如果没有搜到,说明模板把样式设置放在文档末尾了。那就Ctrl+F搜bibliography,一般会看到:
\bibliography{elsarticle-template}那就在这个\bibliography命令的上方手动加一行:
\bibliographystyle{unsrt}注意,\bibliographystyle必须放在\bibliography之前,或者至少在第一次\cite之后、\bibliography之前被执行,否则BibTeX可能读不到样式设置。
3.3 修改正文引用格式选项(可选)
如果你的期刊要求引用标注是[1]、[2,3]这样的数字编码格式,而模板原来默认的是(Author, 2024)这种格式,那还需要确认导言区有没有加载natbib宏包。如果有,确保选项是:
\usepackage[numbers,sort&compress]{natbib}numbers让引用标注显示为数字编号,sort&compress让连续的多篇引用压缩成[1-3]这种形式。如果不写sort&compress,多篇引用会显示成[1,2,3],虽然不放错,但版面显得啰嗦,期刊编辑看见了可能会让你改。
如果模板里压根没加载natbib,那\cite命令默认也能输出数字编号,因为elsarticle文档类本身支持\citet和\citep这类命令,不过效果还是加natbib更统一。
3.4 编译顺序错了,一切白搭
改完代码后,重新编译时需要注意:必须按latex -> bibtex -> latex -> latex的顺序编译。很多第一次用BibTeX的同学只编译了一次,发现参考文献列表是空的,或者显示[?],就以为代码改错了。
这里解释一下为什么必须编译四遍。第一遍latex扫描正文中的\cite命令,把引用信息写入.aux辅助文件;bibtex读取.aux文件,去.bib数据库里找对应的条目,生成.bbl文件;第二遍latex把.bbl里的参考文献列表插入文档,同时解析引用编号;第三遍latex把正文中的\cite标注替换成最终的编号。少一遍都有可能导致引用编号显示为[?]。
在TeXstudio里,可以直接用“工具 -> 命令 -> BibTeX”,然后连续编译两次,或者直接用F6编译、F8查看PDF的完整流程。在Overleaf里则是全自动的,点一下Recompile就行,不用管编译顺序。在VS Code的LaTeX Workshop插件里,需要配置一下recipes,让它自动执行latexmk,latexmk内部已经处理好了这些依赖关系。
3.5 编译成功后,怎么确认排序已经正确
编译完成后,不要急着提交,先做一个快速自查:看参考文献列表里第一篇是什么。回到正文里,\cite命令第一次出现的位置,它对应的应该就是参考文献列表的第一条。再看正文里最后一处引用,它对应的应该是参考文献列表的最后一条。
如果有多处引用,直接抽查三四个典型的引用位置:正文第1页的引用、正文中部的引用、正文最后一页的引用,比对这些在参考文献列表中的编号跟出现顺序是否一致。这个方法比肉眼通读整个参考文献列表快得多,也足够判断排序是否正确。
4. 常见问题与排查技巧实录
4.1 改了\bibliographystyle{unsrt},参考文献列表还是字母序
这种情况大概率是.bbl文件缓存问题。BibTeX处理完之后生成的.bbl文件会被LaTeX直接插入文档,如果你改完样式文件但没有重新运行BibTeX,.bbl文件里还是旧的内容,看起来就像没改一样。
处理方法很简单:把所有中间文件删掉再重新编译。具体来说,把.aux、.bbl、.blg、.log这些文件全部删除(在Overleaf里就是选中这些文件然后删除,本地用命令行的话可以执行rm *.aux *.bbl *.blg *.log),然后重新走一遍完整的编译流程。
还有一个隐蔽原因:你的.bst文件虽然改成了unsrt,但模板目录里还残留着旧.bst文件,LaTeX在搜索路径里优先找到旧文件。这时确保当前工作目录或者编译输出目录里没有同名旧unsrt.bst,最好在干净的副本里编译。
4.2 编译时提示找不到unsrt.bst文件
unsrt.bst是TeX Live和MiKTeX发行版自带的,理论上不可能找不到。如果提示找不到,说明你的LaTeX发行版安装的时候可能没装完整,或者路径配置有问题。
解决办法:打开终端或命令行,执行kpsewhich unsrt.bst(TeX Live用户)或miktex-kpsewhich unsrt.bst(MiKTeX用户)。如果返回一个路径,说明文件存在,问题出在项目配置或编辑器没有正确识别TeX发行版。如果返回空,说明确实没装全,最简单的办法是在你的LaTeX发行版管理器中重新安装“BibTeX additional styles”或“Bibtex Extra”组件,或者干脆用一个包含unsrt.bst的完整TeX Live安装。
4.3 正文引用编号变成[?]
[?]是LaTeX在引用解析失败时显示的占位符。出现这个符号,通常不是排序问题,而是编译链路断裂了。最常见的情况:只编译了一次,.aux文件里还没有引用信息,BibTeX没运行或者运行失败。
按前面说的四步编译流程重新走一遍,如果还不行,检查.blg文件(BibTeX的日志文件)里有没有报错。最常见的错误是.bib文件里格式错误,比如某个条目缺了author字段、title字段没写全、花括号不匹配等。BibTeX对格式要求比较严格,一个条目写错,后面的条目可能全部失效。
4.4 改了样式但正文引用标注依然是(作者, 年份)
这跟前面说的排序问题是两回事。如果你设置了\bibliographystyle{unsrt},参考文献列表按引用顺序编号了,但正文里的引用标注还是(Smith, 2024)这种作者-年份形式,那问题出在natbib宏包的加载选项上。
检查导言区:
\usepackage[numbers]{natbib}确认有numbers选项。如果没有加载natbib,那\citep这类命令可能被模板的elsarticle.cls类文件重定义成了别的格式。实在不行,把所有的\citep{...}和\citet{...}替换为普通的\cite{...},数字编号是最稳妥的。
4.5 Overleaf上改了不生效,刷新也没用
Overleaf的缓存机制偶尔会抽风。如果改了代码但预览没变化,先在Overleaf左下角点“Logs and output files”,看看有没有编译报错。有时候点击Recompile会默认使用“fast compile”模式,只编译改动的文件,可能不会触发BibTeX步骤。
这时先把右侧的“Menu -> Compiler”切到“pdfLaTeX”,然后在文档任意位置加一个空格再删掉(为了触发文件变更),再点Recompile。如果还是不行,在“Menu”里找到“Clear cached files”,强制清理全部缓存,然后重新编译。Overleaf的这个问题本质跟本地环境的.bbl缓存问题一样,清理干净就能解决。
4.6 连\cite都不显示编号,直接显示问号或空洞
这种情况一般是\cite命令引用的key在.bib文件里根本找不到。检查.bib文件里是否存在对应的条目,条目第一行是@article{你的key,,你在正文里写的是\cite{你的key},两者必须完全一致,大小写、空格都要一致。
BibTeX的key是区分大小写的,\cite{Smith2024}跟@article{smith2024}就匹配不上。另外一个常见坑是用了特殊字符,比如key里的下划线、冒号等,有时会引起解析问题,建议key只用字母数字和连字符。
5. 避坑经验与几点额外提醒
5.1 投稿前先用期刊官方要求自查参考文献格式
不同期刊对参考文献的格式要求差异很大,除了排序方式,还包括:作者姓名是全称还是缩写、期刊名是斜体还是正体、卷期页码的标注顺序、DOI是否必须列出等等。Elsevier官方模板虽然能统一处理大部分格式,但.bst样式文件决定的排序逻辑,跟期刊的“投稿指南”里写的参考文献要求不一定完全一致。
所以最稳妥的做法是:投稿前登录目标期刊的官网,找到“Guide for Authors”,翻到References那一节,逐条对照检查。如果期刊明确要求“References in order of citation”,那你的参考文献列表必须是顺序编码制。如果期刊说“References should be listed in alphabetical order”,那你反而不能改成unsrt,要继续用字母排序的样式。一句话总结:别默认“Elsevier模板一定符合所有期刊要求”,模板是通用的,你的投稿是特定的。
5.2 修改后的.tex文件建议单独保存,别污染原模板
我习惯的做法是:在模板副本里修改,并且只修改跟参考文献相关的几行代码,其他地方保持原样。这样既能快速定位改动,也方便在不同期刊之间切换时回退。如果要做对比实验,比如同时准备“顺序编码”和“字母排序”两个版本的项目文件夹,那就在两个副本里分别设置不同的\bibliographystyle,然后各自编译看效果。
Elsevier官方模板的.cls文件比较庞大,不建议去改它内部定义的任何命令。你只需要在导言区覆盖必要的配置,比如加载natbib、设置\bibliographystyle就够了。贸然改动.cls文件可能导致无法通过期刊的在线投稿系统编译检测。
5.3 注意\bibliography的路径问题
如果你的.bib文件跟主.tex文件不在同一个目录,\bibliography里要写相对路径,比如\bibliography{chapters/refs}表示chapters目录下的refs.bib。路径写错会导致BibTeX找不到数据库文件,编译日志里会报“I couldn't open database file”之类的错误。这时候优先检查路径,而不是怀疑样式设置。
5.4 多人协作时,把参考文献乱序问题列入自查清单
如果你在跟导师或同学合作写论文,建议把“参考文献是否按引用顺序排列”写进提交前的自查清单。这个点特别容易被忽略,因为LaTeX编译不报错,PDF也能正常生成,参考文献列表看起来也很完整,就是排列顺序不对。在多人协作的场景下,每个人往.bib文件里加文献,最后的排序可能跟任何人的预期都不一样。提前在项目说明里写清楚“如果投稿要求顺序编码,请使用unsrt样式”,可以省去很多沟通成本。
5.5 长期使用建议:为自己维护一个“投稿用”的LaTeX配置模板
我建议可以把自己常见期刊的参考文献配置整理成一个“配置速查表”:哪个期刊用unsrt,哪个期刊用elsarticle-num,哪个期刊要求作者-年份制,都记下来。这样以后再投类似的期刊,直接用对应的配置,不用每次都从零排查。这个习惯能帮你节省大量时间,尤其是同时准备多篇论文投稿的时候。
在实际操作中,还有个容易被忽略的点:改完样式之后,一定要打开编译日志(.log文件)看一眼有没有未知警告。有些LaTeX宏包的版本兼容性问题会在日志里出现warning,虽然不影响当前编译,但可能在编辑器更新或者换台电脑编译时忽然爆发。把这些warning处理掉,比临时改代码更划算。