在 plain.bst 文件中,我需要修改作者,以便只显示第一作者,后面跟着“et al”。我要强调的是,出于这里不值得提及的原因,这必须在 bst 级别完成(我不能使用其他解决方案,例如用另一个 bst 或某些 usepackage 解决方案替换)。
我已经确定了(可能)需要修改的正确功能,但我不熟悉这种语言,并希望得到有关如何修改它的指导:
FUNCTION {format.names}
{ 's :=
#1 'nameptr :=
s num.names$ 'numnames :=
numnames 'namesleft :=
{ namesleft #0 > }
{ s nameptr "{ff~}{vv~}{ll}{, jj}" format.name$ 't :=
nameptr #1 >
{ namesleft #1 >
{ ", " * t * }
{ numnames #2 >
{ "," * }
'skip$
if$
t "others" =
{ " et~al." * }
{ " and " * t * }
if$
}
if$
}
't
if$
nameptr #1 + 'nameptr :=
namesleft #1 - 'namesleft :=
}
while$
}
我搜索了很久,但找不到合适的答案。
谢谢你!
答案1
这个答案模仿的是这个答案针对较早的查询,标题为BibTeX:如何将长作者列表缩减为“Firstauthor et al.”?。
我建议您按如下方式进行。
在您的 TeX 发行版中找到该文件
plain.bst
。复制一份并将副本命名为 。plainone.bst
(切勿编辑 TeX 发行版文件的原始副本。)在文本编辑器中打开
plainone.bst
。(你用来编辑 tex 文件的程序就可以了。)在 中
plainone.bst
,找到函数format.names
。(在我的文件副本中,该函数从第 183 行开始。)在此函数中,找到以下一组行:
{ namesleft #1 > { ", " * t * } { numnames #2 >
并将其替换为以下组:
{ nameptr #1 #1 + = numnames #1 > and { "others" 't := #1 'namesleft := } 'skip$ if$ namesleft #1 > { ", " * t * } { s nameptr "{ll}" format.name$ duplicate$ "others" = { 't := } { pop$ } if$ numnames #2 >
另外:如果你改变主意,想要截断作者列表,比如说,四作者(而不是多位作者),请将新代码块第 2 行的更改
nameptr #1
为,并将第 4 行的更改为。nameptr #4
numnames #1
numnames #4
将新的 bst 文件保存在主 tex 文件所在的目录中,或保存在 BibTeX 搜索的目录中。如果选择后一种方法,请确保适当更新 TeX 发行版的文件名数据库。(如果您不理解前面这句话的意思,您可能应该选择第一个选项。)
在主 tex 文件中,更改
\bibliographstyle{plain}
为 `\bibliographystyle{plainone} 并运行完整的重新编译循环 - LaTeX、BibTeX 和 LaTeX 两次 - 以完全传播所有更改。
祝您 BibTeX 愉快。
MWE 及其输出:
\documentclass{article}
\begin{filecontents}[overwrite]{mybib.bib}
@misc{a,author="Anne Author", title="U", year=3001}
@misc{ab,author="Anne Author and B", title="V", year=3002}
@misc{abc,author="Anne Author and B and C", title="W", year=3003}
@misc{abcd,author="Anne Author and B and C and D", title="X", year=3004}
\end{filecontents}
\usepackage{cite}
\begin{document}
\cite{a,ab,abc,abcd}
\bibliographystyle{plain-one} % <-- be sure to point to the new bst file
\bibliography{mybib}
\end{document}