我正在尝试agsm.bst
正确格式化哈佛风格(或者至少按照我的大学要求的方式 :-) )。我有@InCollection
如下记录:
@incollection{Berndt99,
author = {T. J. Berndt},
title = {Friendships in adolescence},
booktitle = {Making sense of social development},
editor = {M. Woodhead and D. Faulkner and K. Littleton},
year = 1999,
publisher = {London: Routledge in association with the Open University},
}
需要格式化如下(bbl 摘录):
\harvarditem{Berndt}{1999}{Berndt99}
Berndt, T.~J. \harvardyearleft 1999\harvardyearright . `Friendships in
adolescence', in: M.~Woodhead, D.~Faulkner \harvardand\ K.~Littleton (eds)
{\em Making sense of social development}. London: Routledge in association
with the Open University.
默认情况下,agsm
产生
\harvarditem{Berndt}{1999}{Berndt99}
Berndt, T.~J. \harvardyearleft 1999\harvardyearright , `Friendships in
adolescence', in: M.~Woodhead, D.~Faulkner \harvardand\ K.~Littleton (eds)
{\em Making sense of social development}, London: Routledge in association
with the Open University.
我已遵循将 Bibtex 书目中的分隔符从逗号更改为句点已经,但不幸的是,这会将每个分隔逗号替换为句号,而不仅仅是我想要的。特别是,我现在在章节标题(“青春期的友谊”)后面也得到了一个句号,而我需要一个逗号。
如果我理解正确的话,agsm
它通过跟踪output.state
变量中的输出状态来管理这一点。但是,我不明白它是如何做到这一点的,以及如何让它区分引用的这两个部分。
有什么建议么?
非常感谢,
斯特芬
答案1
经过进一步研究,我找到了解决方案。这确实与如何output.nonnull
管理状态有关。这相当令人困惑,因为状态跟踪用于确定要放置什么分隔符下次再output.nonnull
调用。
原始代码如下:
INTEGERS { output.state before.all mid.sentence after.sentence after.block }
FUNCTION {init.state.consts}
{ #0 'before.all :=
#1 'mid.sentence :=
#2 'after.sentence :=
#3 'after.block :=
}
STRINGS { s t f }
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
}
打印年份时,output.state
仍然为before.all
,这意味着它会切换到mid.sentence
,下次会添加一个逗号。但是,对于所有其他部分,都会到达这个相同的分支。我将其更改为添加一个新状态after.year
,这使我能够标记年份已处理并且需要句号而不是逗号。请注意,在下面的新代码中,我只需要设置此状态,但不需要新的 if 分支来检查它;默认分支已经满足了我们的要求。
INTEGERS { output.state before.all mid.sentence after.sentence after.block after.year after.collection.title }
FUNCTION {init.state.consts}
{ #0 'before.all :=
#1 'mid.sentence :=
#2 'after.sentence :=
#3 'after.block :=
#4 'after.year :=
#5 'after.collection.title :=
}
STRINGS { s t f }
FUNCTION {output.nonnull}
{ 's :=
output.state mid.sentence =
{ ", " * write$ }
{ output.state before.all =
{
write$
after.year 'output.state :=
}
{ output.state after.block =
{
add.period$ write$
newline$
"\newblock " write$
}
{ add.period$ " " * write$ }
if$
mid.sentence 'output.state :=
}
if$
}
if$
s
}
我还添加了一个after.collection.title
状态(我可能已经重复使用了after.sentence
,但不想弄乱它),我将其设置在适当的位置以FUNCTION{incollection}
表明我们刚刚将集合标题推送到堆栈上:
FUNCTION {incollection}
{ output.bibitem
list.label.output
" \harvardyearleft " list.year * "\harvardyearright " * output.nonnull
title.field field.used =
{ skip$ }
{ format.title quote "title" output.check }
if$
author "author" item.check
crossref missing$
{ format.in.ed.booktitle "booktitle" output.check
after.collection.title 'output.state :=
....
这使得集合标题后面有一个句号而不是逗号。