news 2026/10/9 3:56:16

中文LaTeX参考文献:解决BibTeX“et al”变“等”及上标设置

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
中文LaTeX参考文献:解决BibTeX“et al”变“等”及上标设置

写中文论文那段时间,我几乎每天都在被两个细节折磨:用BibTeX插入中文参考文献时,明明作者有六七个,参考文献列表里却齐刷刷给你甩出一个英文的“et al”;另一边,投稿模板要求正文里的引用序号必须做成上标[1],而LaTeX默认给出的却是平排数字[1]。这两个问题看似独立,其实经常在同一份稿件里同时出现,而且它们都指向同一个根源:你用的模板和工具链,是照着英文期刊习惯搭的。这篇文章就用bib插中文文献时的这个“等”和“et al”问题,以及参考文献上标和不上标的具体设置方法,一次讲透。无论你是刚开始写学位论文,还是被期刊返修意见逼到墙角,下面这几套方案都能直接抄。

1. 先说清楚:中文文献里的“et al”和上标,到底卡在哪

1.1 BibTeX默认的英文脾气:作者一多就给你et al

BibTeX本身只是个调度工具,它读.bib数据库,按照.bst样式文件里的规则把文献排版输出。你用的样式如果是plain、unsrt、abbrv、IEEEtran这一票“英文原装货”,那么它们的作者格式函数里,几乎都写了一行类似“3个作者以上就截断,用et al代替”的逻辑。英文文献这样处理没毛病,但中文文献的规范完全不同,GB/T 7714-2015要求的是:作者在3个以内全部列出,超过3个就列出前3位,然后加一个“等”字。于是同一个.bib数据库,英文样式会输出“Zhang San, Li Si, Wang Wu, et al.”,而你期望的是“张三,李四,王五,等.”。机器没做错,它只是不懂中文。

要判断你到底卡在哪一层,最快的方法不是改宏包,而是看.aux文件里\bibliographystyle写的是什么。我之前帮人排查过一个报错,某个投稿模板把样式指定成了unsrt.bst,导言区还加了一堆和natbib冲突的配置,结果怎么改中文都显示不出来。先把样式这件事搞清楚,后面所有方案才有讨论基础。

1.2 你真正要的其实是两件事:正文上标,列表正常

很多人把“参考文献上标”当成一个全局开关,其实得拆开看。学术写作里存在两种“上标需求”:

  • 第一种,也是绝大多数期刊和学位论文模板要求的:正文中引用的编号以上标形式出现,也就是你写下“已有研究表明[1]”时,那个[1]要小一号,飘在句号前面。
  • 第二种,偶尔出现的:参考文献表自身那一行开头的[1]编号也要上标。这种事非常少见,一般模板不会这么折磨人。

你需要的正常状态通常是:正文里上标[1],文献列表里的编号老老实实做普通[1]。这两种效果由不同机制控制,正文引用由宏包和引用命令控制,文献列表格式由bst样式(或biblatex样式)控制。只要认准这一点,后面设置上标和不上标就不会越搞越乱。

2. 最省心的办法:gbt7714样式一次解决“等”和上标

2.1 装好并能用:TeX Live自带,Overleaf更省事

如果你用的是TeX Live 2020以后的完整版,或者Overleaf在线编译,那么gbt7714宏包和配套的bst样式基本都预装好了。这套东西是照着GB/T 7714国标做的,中文作者列表、引用上标、文献排序压缩都替你考虑到了。

导言区最少只需要两行:

\usepackage[super,sort&compress]{gbt7714}

文末参考文献区域自然写:

\bibliographystyle{gbt7714-2015-numerical} \bibliography{refs}

这里的refs是你的.bib文件名,不带扩展名。编译顺序和普通BibTeX完全一样,四步走:

xelatex main bibtex main xelatex main xelatex main

第一次跑xelatex是为了生成.aux文件,里面记录了\cite命令用了哪些key;bibtex根据这些key去.bib里提取条目,生成.bbl;再跑两次xelatex,把引用编号和文献表真正排进正文。很多新手习惯只跑一遍xelatex,发现引用变成[?],那不是宏包的问题,是步骤没走完。

用这套样式后,三个以上作者的中文文献,在文献表里会按国标输出“张三,李四,王五,等.”,不再出现刺眼的“et al.”。这个效果我实测过很多次,从学位论文到期刊投稿都没翻过车。

2.2 super选项把引用送上标,sort&compress收拾多引用

gbt7714宏包最讨喜的地方在于,它把“上标”和“等”这两件事整合在同一个宏包里。super选项让正文里的引用编号变成上标形式,sort&compress则让连续多篇引用合并成区间,例如\cite{a,b,c,d}会输出[1-4]而不是[1,2,3,4]。

最新的gbt7714宏包,一般配合\bibliographystyle{gbt7714-2015-numerical}或gbt7714-2005-numerical使用。2015对应新版国标,2005对应旧版。很多期刊模板虽然样式文件写的是旧版,但编辑部实际按新版审稿,我建议优先选2015。如果模板明确写了“按GB/T 7714-2005”,再切到2005。两种样式的bst文件可以同时安装,互相不干扰。

这里特别提醒一句:用了gbt7714后,就不要再在导言区加载natbib或cite宏包。gbt7714内部已经处理了引用命令,重复加载轻则警告,重则把super设置覆盖掉,导致上标失效。我接过一个投稿咨询,对方用了gbt7714又手贱加了句\usepackage[super]{natbib},结果参考文献表格式全乱,去掉一行代码立刻恢复正常。

3. 投稿指定样式时:自己动手改bst文件把et al换成等

3.1 先在bst里把“et al”的位置找出来

不是所有期刊都允许你用gbt7714。有些期刊的LaTeX模板写死了某个英文bst样式,比如IEEEtran、plainnat,你换成gbt7714,编辑那里的格式校验可能不通过。这时候就别硬刚模板了,直接改bst文件,把里面的“et al”字符串替换成“等”。

bst文件本质是个带特殊语法的小程序,别被它吓到。用任何文本编辑器打开你当前使用的bst文件,搜索et al或et~al,注意中间可能有波浪号,也可能有空格。多数基于plainnat改出来的样式,最终输出“et al”的地方在format.names函数附近,代码长这样:

{ " et~al." * }

或者:

{ "\bibstring{andothers}" * }

后者用了bibstrings机制,表面看不到“et al”,实际效果一样。两种写法的修改思路完全相同:把那一段输出替换成中文“等”。

3.2 动手替换与重编译

我是这样干的:先复制一份原bst文件,改个新名字,比如myj-ref.bst,放到主.tex文件同目录下,然后把\bibliographystyle{myj-ref}写进文档。这样万一改坏了,随时能退回原样式。

具体替换时要注意标点。原代码通常是前面已经输出了逗号,然后追加“et al.”,所以替换成“等”即可,不要画蛇添足再加逗号。改完大概是:

{ " 等." * }

如果你用的是全角标点习惯,可以写成等.,但为了排版统一,我更建议保持半角句点。替换完成后重新跑四步编译:xelatex、bibtex、xelatex、xelatex。看到文献表里出现“张三,李四,王五,等.”,这事儿就成了。

这里有一个非常容易踩的坑:bst文件必须保存为UTF-8无BOM编码。如果你的TeX Live环境是老GBK流传下来的,或者用Windows记事本保存成了带BOM格式,BibTeX会直接报错,或者干脆把中文变成乱码。我在给别人远程看问题的时候,这种编码问题占了将近一半。

3.3 实在不想动bst时的兜底方案

还有一种不动bst的办法:直接在.bib条目里手动干预。比如把作者字段写成:

author = {张三 and 李四 and 王五 and 等},

或者更粗暴一点:

author = {张三 and 李四 and 王五 and others},

同时靠bst默认的others处理成“et al”,然后再用编辑器的全局替换把.bbl里的“et al”替换成“等”。

这个方法最大的问题是污染数据:如果同一个bib条目还要供英文文档使用,那“等”就泄露到英文文献表里了,非常不专业。我的建议是:手动处理只适合“最后一篇文献死活搞不定”的应急场景,正常情况下还是用第2节的gbt7714或第3.2节的改bst方案。

4. 参考文献上标和不上标:三种设置思路任你选

4.1 方案一:gbt7714的super选项(推荐)

如果你已经采用了第2节的gbt7714方案,那么上标这件事已经跟着解决了。\usepackage[super,sort&compress]{gbt7714}一行命令,正文引用直接变成上标[1]。不想上标时,去掉super选项,保留sort&compress,出来的就是普通平排[1]。

这个方案的优点是省心,缺点同样明显:如果期刊模板不允许你动参考文献样式,你没法单独把gbt7714的引用格式摘出来用。换句话说,这个方案和“改bst”是互斥的,你得先决定走哪条路。

4.2 方案二:natbib的super选项

如果不打算整个换掉当前bst,只是想单独让正文引用变成上标,可以试试natbib宏包的super选项:

\usepackage[super]{natbib}

natbib是个老牌引用宏包,数值式引用模式下加super,会让\citep、\citet输出的编号跳为上标。但要注意,super模式对作者-年份引用无效,只在数字引用模式下才起作用。而且natbib的super模式有时候不一定带方括号,不同模板表现不一样。

我之前在某个中文期刊模板里试过,natbib的super选项输出的是上标数字,方括号要自己用\bibpunct{[}{]}{,}{n}{}{,}补上。这个东西能不能一次调对,很看模板底子,所以我把方案三也一起放出来。

4.3 方案三:自定义\upcite命令(模板写死时救急)

有的模板把\cite命令以极其特殊的方式重定义了,你再去加宏包反而容易冲突。这时候最稳的做法是新增一个命令,不动原模板命令:

\let\oldcite\cite \newcommand{\upcite}[1]{\textsuperscript{[\oldcite{#1}]}}

正文里原来写\cite{key}的地方,改成\upcite{key},就是标准的上标[1];不想上标的旧引文继续用\cite{key},保持普通编号。这个方案几乎兼容所有模板,因为\textsuperscript是LaTeX最基础的数学/文本命令,不会和任何样式打架。

要说缺点,就是得批量替换正文里的引用命令。我一般用编辑器的正则替换:搜索\\cite\{,替换成\\upcite\{,一次性搞定。如果你的文档里既有上标引文又有不上标引文,那这正好是最灵活的做法,一个命令一个效果。

4.4 一个容易绕晕的点:正文上标不影响文献表编号

有些朋友设置了上标之后,发现“参考文献表里的[1]怎么还是普通大小”,以为设置失败了。其实这正是正常表现。正文引用上标是引用宏包控制的,文献表里编号的位置和字形由bst控制。两者本来就互不相干。如果哪天你看到文献表里的编号也变成上标,那反而说明模板或bst出了问题,正常期刊不会这么排。

同样道理,如果你追求“不上标”,只需要确保引用宏包没开super选项,并把自定义命令里的\textsuperscript去掉。说到底,上标与否是一个局部格式问题,别把它当成整个参考文献体系的开关。

5. 组合使用与翻车现场排查实录

5.1 组合起来:一份中文稿件的最小可用配置

把前面几套方案串起来,一份“能用且好看”的中文LaTeX稿件,导言区通常是这样的:

\documentclass[UTF8]{ctexart} \usepackage[super,sort&compress]{gbt7714} \begin{document} 引用在这里写:\cite{li2024} \bibliographystyle{gbt7714-2015-numerical} \bibliography{refs} \end{document}

如果你所在期刊不允许gbt7714,就把引用部分换成natbib或自定义命令,文献表用改过的bst。核心原则不变:正文引用归引用宏包管,文献表格式归bst管,两个层不要混着折腾。

5.2 常见问题速查表

整理了一下我这些年处理过的相关报错,做成速查表,碰到哪个就查哪个:

现象常见原因解决办法
中文参考文献乱码或变成问号.bib文件不是UTF-8编码;用了pdflatex+GBK.bib另存为UTF-8;改用xelatex
引用显示[?]没跑bibtex,或只跑了一遍xelatex按xelatex→bibtex→xelatex→xelatex顺序来
改了bst没效果没改\bibliographystyle,或者忘了重跑bibtex改成新bst名,重新编译四步
“et al”还是英文bst里替换不彻底,存在多处输出点搜索et al、et~al、andothers全部替换
找不到gbt7714-2015-numerical.bstTeX发行版太旧或宏包缺失用kpsewhich gbt7714-2015-numerical.bst检查,装texlive-publishers
加载gbt7714后上标失效导言区又加载了natbib或cite删掉多余的引用宏包,只留gbt7714
正文上标成功但文献表编号上标被模板奇怪的\renewcommand改了用第4.4节思路,检查模板对文献表编号的定义
英文文献也被改成“等”bst全局替换连英文条目也影响换gbt7714按语言自动区分,或者对不同条目用不同bst

5.3 我踩过的坑和最后留在编辑器里的习惯

第一个坑是编码。有段时间我图省事,用一个老的GBK编码的bib文件,换成XeLaTeX后中文全乱码。后来所有.bib和.bst文件统一存UTF-8,再也没出过问题。你在Windows下用记事本存文件时要特别小心,另存为时编码那里要选“UTF-8”,别选“UTF-8 BOM”。

第二个坑是“改一处没改全”。早期我用替换法只搜了et al,漏了andothers,结果部分文献还是英文“et al.”。后来我学乖了,一个bst文件拿到手,先全文搜三遍:et al、et~al、andothers,一个都不放过。这个习惯帮我省了不知多少返工。

第三个技巧是从某次期刊返修里学来的:投稿前把.bbl文件导出,直接在Word里校对参考文献表。因为很多期刊编辑最终是用Word做校对,你LaTeX排得再漂亮,他那边转格式也可能出幺蛾子。用gbt7714排好的.bbl,复制出来贴到Word里,中文“等”和上标[1]依然成立,至少格式上的沟通成本能降一大半。

说实话,LaTeX的中文文献问题,绝大多数都集中在样式规则和工具链习惯上。等你把bst机制、引用宏包、编码方式这三件事理顺了,再回头看“et al”和上标,会发现它们只是整个体系里两个小小的着力点。我自己现在写中文稿件,基本固定用XeLaTeX加gbt7714的组合,正文上标、文献表“等”、编号压缩三件事一次性到位,省下来的时间都用来改论文的实质内容了。希望这套经验也能让你少熬几个夜。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/9 3:56:06

【VSCode】Visual Studio Code基本设置快捷方式markdown编辑等实用插件 || 软件手册

【start:2023.01.09】 目录1. 引言2. 安装 VSCode3. 配置基本功能即时自动保存鼠标滚动缩放字体单行显示不下则换行标签页多行显示调整窗口字体的缩放级别焦点不滚动打开新文件时不覆盖原来的文件调整工作台颜色主题4. 修改文件存储位置C盘数据迁移文件解压插件5. 添…

作者头像 李华
网站建设 2026/10/9 3:55:26

基于非下采样小波包精细滤波的轴承故障诊断特征分析

1. 做轴承故障诊断,为什么我盯上了非下采样小波包搞设备状态监测和轴承故障诊断这些年,我踩过最多的坑就是“信号提出来了,但特征根本看不出来”。滚动轴承早期故障的信号非常微弱,本身就被设备的工频振动、环境噪声、结构共振这些…

作者头像 李华
网站建设 2026/10/9 3:55:03

SpringBoot+Vue船舶维保管理系统:从业务建模到答辩要点全拆解

每年到了毕设季,找我咨询项目的人就多起来了。问得最多的就是:有没有一个SpringBootVue的管理系统源码,业务别太无聊,技术栈别太旧,最好能直接跑起来改一改就交差?说实话,图书管理系统、学生管理…

作者头像 李华
网站建设 2026/10/9 3:54:58

Django在线考试系统毕业设计源码全解析:从环境搭建到答辩避坑

毕业设计做到最后关头,很多同学拿到手的是一个压缩包,标题往往是类似“django在线考试系统-计算机毕业设计源码11387”这样的形式。包里有一堆代码、一个说明文档,运气好还有一份数据库备份。这类题目的关键词已经很明确:后端用dj…

作者头像 李华
网站建设 2026/10/9 3:54:56

RPM与DEB打包实战:从原理到分发避坑

简介:一份面向Linux系统管理员与软件打包初学者的教程,系统讲解RPM与DEB两种主流软件包格式的完整制作流程。文档从包目录结构切入:DEB部分详述DEBIAN目录、control文件及preinst、postinst、prerm、postrm脚本职责;RPM部分介绍BU…

作者头像 李华
网站建设 2026/10/9 3:54:53

家装管理信息系统毕业设计:从需求分析到答辩的完整复盘

做了这么多年开发,每年到这个节点都能看到不少人在纠结毕业设计选题。今年刷到的热搜里,家装管理信息系统又上榜了,老实说,这个题当年也是我的毕业设计,一轮答辩直接拿了优秀。现在回头看,家装管理系统确实…

作者头像 李华