修改 abbrvnat.bst,在年份周围添加括号,并在作者后取消逗号

修改 abbrvnat.bst,在年份周围添加括号,并在作者后取消逗号

我正在修改 abbrvnat.bst 以 (1) 将年份移到作者后面,(2) 在年份两边加上括号,(3) 删除作者后面的逗号,(4) 将作者姓名列为 , (例如,Ozsu, M.T.而不是M. T. Ozsu,这是 abbrvnat 的排版方式)。我能够通过在format.date "year" output.check作者后面移动来执行 (1):

FUNCTION {article}
{ output.bibitem
  format.authors "author" output.check
  author format.key output
  format.date "year" output.check
  new.block
  ...

我尝试按照这里的一些相关文章来做 (2) 和 (3),但没有成功。我知道对于 (2),我需要修改以下定义,但我不知道如何修改:

FUNCTION {format.date}
{ year duplicate$ empty$
    { "empty year in " cite$ * warning$
       pop$ "" }
    'skip$
  if$
  month empty$
    'skip$
    { month
      " " * swap$ *
    }
  if$
  extra.label *
}

我认为对于(3),我需要修改以下内容,但是,我再次不知道该如何修改:

FUNCTION {format.authors}
{ author empty$
    { "" }
    { author format.names }
  if$
}

对于(4),我真的不知道......

我将非常感激您的帮助。

答案1

(3)和(4)可以一起解决。在你的 bst 文件中,有一行指定了名称的格式。它看起来像

{ s nameptr "{f.~}{vv~}{ll}{, jj}" format.name$ 't :=

您可以在函数中找到它format.names(位于文件的第 222 行左右abbrvnat.bst)。括号内的符号表示名称的不同部分及其格式,例如

  • f.代表缩写的名字(ff代表完整的名字)
  • vv代表“de”或“von”之类的词
  • ll代表姓氏
  • jj代表junior或类似的东西
  • 空格和标点符号代表其本身

您可以更改此行以更改名称的格式,例如

{ s nameptr "{vv~}{ll}{, f.}{, jj}" format.name$ 't :=

会给你“Ozsu, MT”而不是“MT Ozsu”(或者如果你是某个初级贵族,则会给你“de~Ozsu, MT, junior”而不是“MT de~Ozsu, junior”;-)

编辑(安德鲁·斯旺)对于(2),你可以使用以下格式格式化日期

FUNCTION {format.date}
{ year duplicate$ empty$
    { "empty year in " cite$ * warning$
       pop$ "" }
    'skip$
  if$
  "(" swap$ *
  extra.label *
   ")" * 
}

为了去掉年份前的逗号,你可以这样写你的冠词定义:

FUNCTION {article}
{ output.bibitem
  format.authors "author" output.check
  author format.key output
  after.sentence 'output.state :=
  format.date "year" output.check
  new.block
  ...

内部有状态0,...,分别3称为before.allmid.sentence和。 在此样式文件中,调用仅为状态 、 和 插入标点符号after.sentence。因此,对于无标点符号,将 设置为就足够了。after.blockoutput.checkoutput.nonnullbefore.allmid.sentenceafter.blockoutput.stateafter.sentence

相关内容