bibtex
我正在使用plain.bst
样式(或者更确切地说是其波兰语版本)编制一本书的参考书目plplain.bst
。使用对类似问题的其他问题的答案,我进行了修改plplain.bst
,以更改姓名的默认顺序,现在我的参考书目中的示例性条目如下所示:
但是,我不知道如何说服bibtex
在名字的首字母后(标题前)放置一个逗号,以便得到如下内容:
[10] 姓氏,N.,头衔
如果有多个作者或多个字母首字母,情况也类似。我尝试修改bst
文件,但没有成功。目前,文件中负责名称语法的部分如下所示:
FUNCTION {format.names}
{ 's :=
#1 'nameptr :=
s num.names$ 'numnames :=
numnames 'namesleft :=
{ namesleft #0 > }
{ s nameptr "{vv }{ll}{, jj}{, f.}" format.name$ 't :=
nameptr #1 >
{ numnames #2 =
{ ", " * }
'skip$
if$
namesleft #1 >
{ ", " * t * }
{ numnames #2 >
{ "," * }
'skip$
if$
t "others" =
{ " i~in." * }
{ " " * t * }
if$
}
if$
}
't
if$
nameptr #1 + 'nameptr :=
namesleft #1 - 'namesleft :=
}
while$ }
如果您能向我解释如何实现我的目标,我将不胜感激。
根据 Guido 的回答和我实施他的解决方案时遇到的问题,我认为我可以添加
bst
他所引用的那些文件片段的代码。
FUNCTION {format.authors}
{ author empty$
{ "" }
{ author format.names }
if$
}
FUNCTION {output.nonnull}
{ 's :=
output.state mid.sentence =
{ ", " * write$ }
{ output.state after.block =
{ add.period$ write$
newline$
"\newblock " write$
}
{ output.state before.all =
'write$
{ add.period$ " " * write$ }
if$
}
if$
mid.sentence 'output.state :=
}
if$
s
}
FUNCTION {output.check}
{ 't :=
duplicate$ empty$
{ pop$ "empty " t * " in " * cite$ * warning$ }
'output.nonnull
if$
}
我可能误解了 Guido 的回答中的一些内容,所以如果您能帮助我弄清楚的话,那就太好了。
答案1
名称后的标点符号由函数确定output.check
,如果名称不为空,则调用该函数output.nonnull
。简而言之,output.nonnull
如果我们在句子中间,则打印逗号,或者句号或空格。样式使用变量output.state
来存储我们是在句子中间还是其他地方。因此,在格式化名称时必须设置该值。为了实现这一点,我们可以在函数末尾插入这样的赋值(后跟将swap$
名称的格式保存在堆栈中)
mid.sentence 'output.state :=
swap$
因此现在的功能是:
FUNCTION {format.names}
{ 's :=
#1 'nameptr :=
s num.names$ 'numnames :=
numnames 'namesleft :=
{ namesleft #0 > }
{ s nameptr "{vv }{ll}{, jj}{, f.}" format.name$ 't :=
nameptr #1 >
{ numnames #2 =
{ ", " * }
'skip$
if$
namesleft #1 >
{ ", " * t * }
{ numnames #2 >
{ "," * }
'skip$
if$
t "others" =
{ " i~in." * }
{ " " * t * }
if$
}
if$
}
't
if$
nameptr #1 + 'nameptr :=
namesleft #1 - 'namesleft :=
mid.sentence 'output.state :=
swap$
}
while$ }
注意,这将影响所有名称(作者和编辑)。如果只想在作者后插入逗号而不在编辑后插入逗号,可以format.authors
按如下方式修改该函数:
FUNCTION {format.authors}
{ author empty$
{ "" }
{ author format.names
mid.sentence 'output.state :=
swap$
}
if$
}
上述解决方案的一个问题是,不同的条目类型使用 或output.check
(output.nonnull
或output
)。问题是 和output.check
有output.nonnull
不同的输入,因此必须更改"<authors>" output.check
为output.nonnull
,这也需要编辑器做更多工作。
另一种方法是更改实际打印逗号 ( new.block
) 的函数。因此,我们可以创建一个my.new.block
具有以下定义的函数:
FUNCTION {my.new.block}
{ duplicate$ empty$
{ skip$ }
{
", " * }
if$
before.all 'output.state :=
new.block
}
并替换第一次出现的new.block
并在所有函数中用my.new.block
定义如何格式化各种条目类型的
例如,article
我们得到
FUNCTION {article}
{ output.bibitem
format.authors "authors" output.check
my.new.block % <=== was new.block
format.title "title" output.check
new.block
crossref missing$
{ journal emphasize "journal" output.check
format.vol.num.pages output
format.date "year" output.check
}
{ format.article.crossref output.nonnull
format.pages output
}
if$
new.block
note output
fin.entry
}