AGSM 风格:句号在年份和收藏标题后面,但不在章节名称后面?

AGSM 风格:句号在年份和收藏标题后面,但不在章节名称后面?

我正在尝试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 :=
        ....

这使得集合标题后面有一个句号而不是逗号。

相关内容