书目 - 用逗号分隔作者和标题

书目 - 用逗号分隔作者和标题

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.checkoutput.nonnulloutput)。问题是 和output.checkoutput.nonnull不同的输入,因此必须更改"<authors>" output.checkoutput.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
}

在此处输入图片描述

相关内容