我有一个 bst 文件,它处理 bib 条目中的“协作”字段,如下所示:
@article{test,
author = "Smith, J.",
title = "The Foo Title",
collaboration = "BAR",
journal = "Stack",
volume = 0,
pages = "1-10",
year = 2013
}
产量:
J. Smith (BAR Collaboration), The Foo Title, Stack 0, 1–10 (2013).
这没有问题,但“协作”字段中已包含协作一词的条目除外。
我的问题是,是否有一种简单的方法可以修改下面的函数,以便仅在需要时添加“Collaboration”或“Collaborations”字符串?
修改后的函数需要不区分大小写,并且不区分单数/复数。
当前功能如下:
FUNCTION {format.collaboration}
{ collaboration empty$
{ "" }
{ collaboration num.names$ #1 >
{" (" collaboration * " Collaborations)" * }
{" (" collaboration * " Collaboration)" * }
if$
}
if$
}
不幸的是,bibtex 的逆向波兰格式使得学习曲线非常陡峭,以至于驯服野兽文档及其示例并没有真正帮助我。
等我找到解决办法时,我本来可以更改我的所有 bib 条目以使其符合要求。但今后,如果有一个功能,我就不必再为此担心了,那就太好了。
谢谢!
答案1
我们使用string.length
Tame the Beast 中的函数,该or
函数应该已包含在您的bst
文件中。然后我们定义一个简单的搜索函数,用于测试一个字符串是否包含在另一个字符串中。使用这个函数,我们可以测试字段中的“collaboration”和“Collaboration” collaboration
。请注意,我们不需要测试复数形式,因为搜索单数形式也会找到那些复数。
INTEGERS{ l }
FUNCTION{ string.length }
{
#1 'l :=
{duplicate$ duplicate$ #1 l substring$ = not}
{ l #1 + 'l :=}
while$
pop$ l
}
INTEGERS {find.length search.start search.end done}
STRINGS {find.string find.pattern}
FUNCTION {contains}
{
'find.pattern :=
'find.string :=
find.pattern string.length 'find.length :=
#1 'search.start :=
find.string string.length find.length - #2 + 'search.end :=
#0 'done :=
{ search.start search.end < }
{
find.string search.start find.length substring$ find.pattern =
{
#1 'done :=
search.end 'search.start :=%% stop searching
}
{ #1 search.start + 'search.start := }
if$
}
while$
done
}
FUNCTION {format.collaboration}
{ collaboration empty$
{ "" }
{ collaboration num.names$ #1 >
{ " (" collaboration *
collaboration "collaboration" contains
collaboration "Collaboration" contains or
{ ")" * }
{ " Collaborations)" * }
if$
}
{ " (" collaboration *
collaboration "collaboration" contains
collaboration "Collaboration" contains or
{ ")" * }
{ " Collaboration)" * }
if$
}
if$
}
if$
}
最后,我建议不要使用这些黑客技术,而是更改文件bib
。BibTeX 只是用来格式化参考书目,而不是更改内容。如果您想使用其他样式,或切换到biblatex
,那些不一致的 BibTeX 条目会再次困扰您。