ARTICLE DETAIL

资讯详情

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

VSCode + LaTeX 参考文献:BibTeX 编译链与中英文排序

VSCode + LaTeX 参考文献:BibTeX 编译链与中英文排序 上回写了BUAA_latex在VSCode里编辑论文的基本配置当时评论区不少人问我参考文献怎么处理。说实话参考文献这块确实是LaTeX新人最容易劝退的环节之一特别是北航模板这种自带一堆样式文件和目录结构的项目配置稍微不对编译出来要么引用全是问号要么参考文献列表干脆不生成。这篇记录我就专门写参考文献把我从零开始配置、反复踩坑的过程完整过一遍内容包括VSCode里LaTeX Workshop的编译链配置、.bib文件的组织、中英文文献排序、以及几个高频问题的排查方法。适合正在用BUAA_latex或者其他ctexbook类模板写论文的同学参考哪怕你用的不是北航模板只要参考文献走的是BibTeX流程大部分内容也能直接用。1. 为什么参考文献一编译就崩BUAA_latex的坑到底在哪1.1 BUAA_latex模板的参考文献机制BUAA_latex模板实际上是ctexbook文档类加一堆自定义样式组成的。它的参考文献入口通常在main.tex里写着\bibliographystyle{...}和\bibliography{...}。其中\bibliographystyle指定的是格式样式文件比如gbt7714-numerical.bst如果你用的是新一点的分支可能直接在导言区用biblatex宏包。两种方案差别很大配置方法也不同。我第一次用的时候没看模板文档照着网上的教程直接把biblatex的\addbibresource塞进去结果模板自带的gbt7714.bst根本没被调用编译出来参考文献格式全乱。这里多说一句BUAA_latex不同分支的版本差异挺大有的仓库还停留在CTeX旧目录结构有的已经改成biblatex-gb7714-2015。所以你拿到模板后第一件事不是打开VSCode而是先看清楚主文件里到底用的是哪种方式。判断方法很简单搜索主文件里有没有\bibliography{。如果有说明走的是BibTeX如果看到\addbibresource那就是biblatex。这两种流程后面我都会提到。另外很多模板会在.cls或.sty文件里默认定义好\bibliographystyle这种情况下你在main.tex里只需要写\bibliography{refs}就行。如果你自行在正文末尾又加了一个\bibliographystyle可能会导致样式被覆盖成你自己指定的那套和学校要求不一致。所以在动手之前建议先用官方模板的示例文档编一次确认原始状态下的参考文献长什么样再开始做自定义。1.2 为什么非要用VSCode写LaTeX我之前一直用TeXstudio对于小论文没什么问题但BUAA_latex这个模板文件太多了想全局搜一个命令、跳转定义、管理多个.tex文件TeXstudio用起来总觉得差点意思。VSCode的好处在于插件生态非常完整LaTeX Workshop只是其中一个扩展还有各种代码片段、Git集成、远程SSH。特别是当你同时要改.cls、.sty、.bib、多个章节文件的时候VSCode的全局搜索和文件树比传统的TeX IDE要顺手得多。当然VSCode不是开箱即用的安装完扩展还得手动配置编译工具链。很多同学装了LaTeX Workshop后点一下“Build”没有任何反应或者编译报错就是因为VSCode只是编辑器它需要调用系统里的latexmk、xelatex这些可执行程序。所以环境准备那部分一定不能跳过。我见过有人卡在“无法启动编译”上折腾了一下午最后发现只是系统PATH里没把TeX Live的安装目录加进去。至于VSCode插件市场里面的LaTeX相关扩展我只推荐LaTeX Workshop其他辅助类插件比如LaTeX Utilities、Code Spell Checker都可以按需装但核心编译功能不要依赖过多插件否则几个插件之间的设置互相干扰反而不容易定位问题。插件的安装和使用VSCode官方文档和各大社区都有相关教程这篇就不重复了重点还是回到参考文献编译链路本身。1.3 为什么推荐BibTeX而不是手动排版参考文献最原始的做法是手动在.tex里写\begin{thebibliography}{99}然后一条条\bibitem。论文只有二三十篇参考文献时还能忍但毕设论文动辄五六十篇手动维护编号顺序、格式对齐、交叉引用简直是一场灾难。BibTeX的思路是把所有文献条目统一放在.bib文件里正文只通过\cite{key}引用最后由样式文件自动生成编号和列表。好处非常明显插入新文献、删除旧文献编号会自动重排格式统一和正文中的引用位置自动对应。北航模板自带的.bst文件基本都是为BibTeX设计的所以正常情况下你只需要管好.bib文件的条目质量剩下的事都交给工具链。这也是我推荐走BibTeX的核心原因把机械劳动交给机器人只负责判断哪些文献值得引用。而且BibTeX的.bib文件是纯文本量大了之后配合VSCode的全局搜索、批量替换整理起来很方便。相比之下Word里用EndNote直接插入引用一旦源文献信息有误后续修改经常把整个文章格式拖乱LaTeX这边只要把.bib条目改对重新编译一次全部引用和列表都会同步更新。2. VSCode里的LaTeX编译链怎么配置才对2.1 需要的组件我的环境是Windows 11 VSCode TeX Live 2023。如果你用macOS装MacTeXLinux下装TeX Live完整版也行。这里唯一的建议是不要装精简版。BUAA_latex模板用到很多宏包精简版经常缺包出现“File not found”报错时你会很想砸电脑。装完整版虽然有几个G但换来的是省心。VSCode这边需要装LaTeX Workshop扩展。这个扩展本身已经包含编译、预览、同步跳转、清理辅助文件等能力不用再装其他LaTeX插件。如果你还需要用Git顺手装GitLens配合模板版本管理很好用。PDF预览我一般直接用LaTeX Workshop内置的Tab页它支持正向同步也就是从源码跳PDF、从PDF跳源码都可以日常写论文足够了。安装扩展之后记得打开设置页确认一下latex-workshop.latex.recipe.default是否设置成你需要的配方。有些版本默认会直接调用latexmk有些版本默认调用pdflatex如果你的模板是中文的pdflatex大概率会出现乱码或者字体问题所以一定要把默认编译方式切到XeLaTeX。这个操作可以在settings.json里改也可以在VSCode设置界面的搜索框里输入“latex recipe”快速找到。2.2 关键配置tools里的xelatex、latexmk和bibtexLaTeX Workshop把每个可执行命令抽象成tool再在recipe里组合调用。BUAA_latex默认用XeLaTeX编译因为模板里面大量中文内容XeLaTeX配合ctex宏包对中文支持最好。我在settings.json里配置的tools是这样latex-workshop.latex.tools: [ { name: xelatex, command: xelatex, args: [ -synctex1, -interactionnonstopmode, -file-line-error, -pdf, %DOC% ] }, { name: bibtex, command: bibtex, args: [%DOCFILE%] }, { name: latexmk, command: latexmk, args: [ -xelatex, -synctex1, -interactionnonstopmode, -file-line-error, %DOC% ] } ]这里几个参数很关键。-synctex1是生成同步索引文件没有它VSCode的Ctrl点击跳转就废了。-interactionnonstopmode是让编译出错时不要停下来等键盘输入否则一遇到警告就挂起在自动化编译时非常难受。-file-line-error让错误信息带文件路径和行号方便你在VSCode的“问题”面板里点跳转。%DOC%这个变量表示当前打开的LaTeX主文件带完整文件名bibtex工具里我用的是%DOCFILE%它表示不带后缀的文件名。如果你在BibTeX的配置里误用了%DOC%BibTeX会把.tex后缀也当成主文件名的一部分最后因为找不到.aux而报错。这是个非常细的坑我在帮别人看配置的时候发现过好几次。2.3 一键配方recipes配置recipes的作用是把tool按顺序串起来。如果你用的是latexmk其实它自己会根据辅助文件判断是否需要调用bibtex一个配方就够了。但为了排查问题我推荐多配一个手动顺序执行的配方latex-workshop.latex.recipes: [ { name: xelatex - bibtex - xelatex - xelatex, tools: [xelatex, bibtex, xelatex, xelatex] }, { name: latexmk (xelatex), tools: [latexmk] } ]当你发现参考文献不更新时用第一个配方强制跑完整流程平时直接用latexmk配方自动化处理更快。在VSCode里按CtrlAltB或点侧边栏的“Build LaTeX project”就能看到这两个配方。你还可以在keybindings.json里给常用配方绑快捷键我习惯把latexmk绑定到CtrlAltM把完整四连绑定到CtrlAltB写论文时基本只按这两个键。需要强调的是第一个配方名字里的连接符-只是我自己起的你可以改成任何名字关键是tools顺序不能错。如果你用的是biblatex方案那么第二个工具要换成biber而不是bibtextools里同样要新增一个名为biber的配置命令和参数类似只是可执行程序是biber。这点很容易被忽略很多人用biblatex还按BibTeX的配方跑结果编译后引用一直报错。3. .bib文件怎么写才不会让参考文献列表翻车3.1 .bib条目的标准写法.bib文件本质是一个纯文本数据库每个条目以类型{引用key, 字段值}的形式组织。类型有article、book、inproceedings、thesis等每类字段不完全一样。拿北航论文最常见的例子来说期刊论文要写清楚作者、标题、期刊、年、卷、期、页码会议论文要补充会议名和出版社信息学位论文要标出学校名称和年份。article{zhang2022defect, author {张明远 and 李华}, title {基于深度学习的飞机表面缺陷检测方法}, journal {航空学报}, year {2022}, volume {43}, number {5}, pages {125--136}, doi {10.7527/S1000-6893.2021.26731} } inproceedings{smith2021survey, author {Smith, John and Brown, Alice}, title {A Survey of Computer Vision Methods in Industrial Inspection}, booktitle {Proceedings of the IEEE International Conference on Computer Vision}, year {2021}, pages {123--130}, address {Montreal, Canada} }引用key是给正文\cite命令用的建议用“作者姓氏年份关键词”的结构比如zhang2022defect这样在正文里看到引用key就知道是哪篇文献不用点开.bib文件。字段值里的特殊字符需要转义比如要写成\%要写成\%否则BibTeX解析时会报错。需要注意的是BibTeX对字段顺序不敏感但对大小写敏感程度取决于样式文件有的样式会把title直接转成小写因此标题里真正需要大写的专有名词要用花括号包起来比如{UAV}否则编译后标题可能变成小写。3.2 从EndNote和各种学术搜索导出BibTeX很多同学习惯用EndNote管理文献最后在LaTeX里却不知道怎么把库里的条目搬过来。EndNote本身支持导出BibTeX格式操作并不复杂选中你要导出的条目打开File-ExportOutput style下拉框里选择“BibTeX Export”导出后得到一个.txt文件把扩展名改成.bib再放进项目目录就能用。不过EndNote导出的文件通常会有不少冗余字段比如abstract、keywords、notes这些字段里常包含换行、特殊符号直接放进.bib可能会导致编号出错。我的习惯是导出后在VSCode里打开用正则表达式把abstract {...},和keywords {...},整体删掉只保留核心字段。除了EndNote谷歌学术、DBLP、知网等平台也都提供BibTeX导出入口挑一个你最常用的学术搜索引擎导出后统一放到同一个refs.bib里管理即可。在从这些平台批量导入时还要注意中文字段乱码问题。如果你从知网或万方导出的中文文献是GBK编码而你的TeX Live在Windows下默认按UTF-8读取那么.tex文件里引用的中文标题或作者名很可能变成乱码。解决办法是在导出后先用VSCode打开左下角状态栏确认编码是UTF-8如果不是就通过“重新打开编码”改成UTF-8再保存。这一步不处理好后面的参考文献列表会出现一堆乱码而且很难排查。3.3 中英文文献混排与先中后英排序北航论文的参考文献规范一般是中文文献在前、英文文献在后各自按作者拼音或字母顺序排列。如果你用的gbt7714-numerical.bst它已经实现了这个逻辑并不需要你手动去排序。我实测过同一份.bib文件里中文英文混着放最终生成的列表会自动把中文条目放在英文前面中文按拼音排序英文按作者字母排序。但如果你用的是biblatex方案情况会复杂一些有些版本默认排序是按英语字母结果中文条目混在英文条目中间看起来非常乱。解决办法是在导言区加上排序设置比如\usepackage[backendbibtex, stylegb7714-2015, sortcitestrue, sortlocalezh_CN]{biblatex}。其中sortlocalezh_CN是关键它能保证按中文拼音排序。如果你的biblatex版本不支持这个选项那就老老实实用模板自带的BibTeX方案别自己在导言区和宏包较劲。另外有些同学问“endnote参考文献先中后英怎么设置”理论上EndNote可以让分组里的中文英文分开但把EndNote和LaTeX连用时排序的最终决定权在LaTeX的样式文件EndNote里的排序并不会影响BibTeX输出。所以我的建议是直接在.bib文件层面不管顺序完全交给gbt7714-numerical.bst处理。如果你最后发现中文英文的先后顺序还是不对可以检查一下是不是模板里同时加载了多个样式文件或者把.bst文件换一个版本。3.4 引用命令与交叉引用自动编号正文里的引用命令很简单单篇引用是\cite{zhang2022defect}多篇引用是\cite{smith2021survey, zhang2022defect}。编译后这些引用会变成上标形式的编号或者带方括号的编号由样式决定。很多人问交叉引用后删除正文某处引用参考文献列表的编号会不会自动更新答案是会。因为LaTeX的交叉引用机制是每次编译时重新读取.aux文件再交给BibTeX重新生成.bbl列表最后再编译两次更新正文中的编号。只要编译链完整无论你删除还是新增引用编号都会跟着变。有一个容易踩的坑是修改完引用后如果只编译一次PDF里的引用显示可能是旧的甚至出现问号。这不是文件坏了而是辅助文件还没刷新。我一般会建议在写完一小节、准备细看PDF前强制跑一遍完整四连或者直接用latexmk的-g参数强制重新编译所有文件。另外如果你发现正文里有多处引用同一个keyLaTeX会合并成同一个编号如果你需要在一处强制显示多篇参考文献可以用\cite{key1,key2}注意逗号后面不要加空格有些版本会对空格敏感。4. 从空模板到编译出规范参考文献列表的完整实操4.1 在主文件中挂接参考文献现在假设你已经有了一个编译通过的空BUAA_latex模板那么要在正文后面加入参考文献最简单的做法是在最后一个\end{document}之前加两行\bibliographystyle{gbt7714-numerical} \bibliography{refs}\bibliography的参数是.bib文件名不需要写后缀。如果你有多个.bib文件可以写成\bibliography{refs, extra}中间用逗号分隔。模板一般已经在某个配置文件中写好了\bibliographystyle此时你只需确保\bibliography{...}对应的.bib文件存在。如果你用的是biblatex则需要在导言区加\usepackage[backendbibtex, stylegb7714-2015]{biblatex} \addbibresource{refs.bib}正文末尾用\printbibliography而不是\bibliography。两种方案不能混用否则会编译报错。我见过有人用biblatex写了\cite但还留着模板里的\bibliography结果参考文献列表变成空的怎么排查都找不出来。一般情况下我会在项目根目录新建一个refs.bib并把.bib文件也纳入Git版本管理。这样即使某天项目目录被清理只要Git仓库还在参考文献数据就能找回来。论文写作周期长达几个月.bib文件里可能积累了一两百条文献不做版本管理的话一次误删除就会让人崩溃。4.2 完整编译流程为什么需要跑这么多遍TeX的编译流程不像普通程序一遍就能出结果它需要多趟迭代来解决引用关系。第一次跑XeLaTeX会生成.aux文件里面记录所有\cite的key和位置接着跑BibTeX读取.aux文件去.bib中查找对应条目生成.bbl文件这个.bbl就是最终的参考文献列表然后再跑两次XeLaTeX第一次把.bbl的编号填进正文第二次修正交叉引用编号。这就是“xelatex - bibtex - xelatex - xelatex”四个步骤的由来。如果你使用latexmk工具它会在内部自动判断并执行这些步骤你不需要手动一个个敲。但要注意latexmk的判断依据是文件时间戳如果你修改了.bib里的某个条目内容但改动前后时间戳没变比如从EndNote导出后直接覆盖某些工具会保留旧时间戳latexmk可能不会重新执行BibTeX这时需要手动使用“完整四连”配方或者用latexmk -g强制重新编译。我在实际写作中通常只在新增了引用或修改了.bib前使用手动的“完整四连”其他时候都用latexmk自动配方。这个习惯帮我省了很多不必要的等待时间。LaTeX编译本身很快但反复跑四遍对大型文档来说也有一两分钟能省则省。4.3 用LaTeX Workshop的Snippet提高录入效率在VSCode里写refs.bib文件每次手动敲article{然后补全字段很烦。LaTeX Workshop本身预置了一些snippet但我觉得仍不够快。我更喜欢在.bib文件里输入a时直接触发自定义片段生成一条包含常用字段的模板。在VSCode里打开用户代码片段新建一个bib.json加入类似这样的内容{ Article: { prefix: a, body: [ article{${1:key},, author {${2:author}},,
返回列表