我有一个 bst 文件,将超过 5 位作者的条目缩短为等 但我想修改它以适用于 4 位以上作者。我相信这是相关的代码片段,但我该如何更改它以获得修改后的行为?
这个问题类似于更改 .bst 文件中的 BibTeX“format.names”函数,以强制对超过 3 位作者的条目使用“et al.”引用但由于这个bst文件已经成功执行了类似的功能,也许这个问题得到答案的概率会更高。
这种语法确实是一种 BeaST...如果有人能向我解释这里发生了什么,我将不胜感激。
FUNCTION {format.names}
{ 'bibinfo :=
duplicate$ empty$ 'skip$ {
's :=
"" 't :=
#1 'nameptr :=
s num.names$ 'numnames :=
numnames 'namesleft :=
{ namesleft #0 > }
{ s nameptr
"{vv~}{ll}{, f.}{, jj}"
format.name$
bibinfo bibinfo.check
't :=
nameptr #1 >
{
nameptr #1
#1 + =
numnames #5
> and
{ "others" 't :=
#1 'namesleft := }
'skip$
if$
namesleft #1 >
{ ", " * t * }
{
s nameptr "{ll}" format.name$ duplicate$ "others" =
{ 't := }
{ pop$ }
if$
t "others" =
{
" " * bbl.etal emphasize *
}
{
"\&"
space.word * t *
}
if$
}
if$
}
't
if$
nameptr #1 + 'nameptr :=
namesleft #1 - 'namesleft :=
}
while$
} if$
}
来源:http://mirror.unl.edu/ctan/macros/latex/contrib/nature/naturemag.bst
答案1
由于我完全不清楚的原因,将 #5 改为 #3 是可行的。看来 #5 和 #4 的行为相同...我很乐意接受一个能解释这里发生了什么的答案。
FUNCTION {format.names}
{ 'bibinfo :=
duplicate$ empty$ 'skip$ {
's :=
"" 't :=
#1 'nameptr :=
s num.names$ 'numnames :=
numnames 'namesleft :=
{ namesleft #0 > }
{ s nameptr
"{vv~}{ll}{, f.}{, jj}"
format.name$
bibinfo bibinfo.check
't :=
nameptr #1 >
{
nameptr #1
#1 + =
numnames #3
> and
{ "others" 't :=
#1 'namesleft := }
'skip$
if$
namesleft #1 >
{ ", " * t * }
{
s nameptr "{ll}" format.name$ duplicate$ "others" =
{ 't := }
{ pop$ }
if$
t "others" =
{
" " * bbl.etal emphasize *
}
{
"\&"
space.word * t *
}
if$
}
if$
}
't
if$
nameptr #1 + 'nameptr :=
namesleft #1 - 'namesleft :=
}
while$
} if$
}