如何编辑 `plainnat.bst` 避免按键排序

如何编辑 `plainnat.bst` 避免按键排序

我使用natbibpackage and plainnatstyle 来引用和参考文献。不幸的是,当我引用同一作者但不同合著者的不同论文时,参考书目会按键排序。

例如:

在此处输入图片描述

Ho, Meyn 的键是Ho2006, Ho, Lambling 的键是Ho2011, Ho, Dreyfus 的键是Ho2012。当然,LaTeX 会考虑第二位作者姓氏之前的键。

我该如何解决它???

答案1

正如您在原帖的评论中提到的,MWE 是帮助其他人了解您想要实现的目标以及实现目标的方法所必需的。如果没有它,我无法确定我是否回答了您的问题,但我仍将在此提供一些可能对您有帮助的信息。

屏幕截图中的条目似乎属于 类型article。如果这是真的,那么natbibplainnat按以下方式对这些文章进行排序。注意:我使用的是 2007 版plainnat.bst,这是截至 2022 年发布此帖时的最新版本。

  1. presort函数(从第 1313 行开始)应用该author.sort规则(在第 1326 行)。

  2. author.sort函数(从第 1248 行开始)首先测试author字段是否为空。由于您的字段不为空,因此该函数将您的author字段传递给该sort.format.names函数。

  3. 我在下面粘贴了该函数的副本sort.format.names(从第 1207 行开始)以协助解释。从上面的示例来看,您的条目分别有 6、4 或 7 位作者,将分号视为分隔符,将句点视为结束块author。此处的代码看起来就像您在屏幕截图中显示的那样工作,按第一位作者排序,然后按年份对每个条目进行排序。您会注意到引用字段的函数开始发挥作用year

    a. 按第一作者排序后,并且

    b. 除了“其他”作者外,还有更多作者可供参考,并且

    c. 总共有两位以上的作者,并且

    d. 该函数位于第二作者(第二次循环while

    e.然后按年份排序。

请注意,BST 文件中的语言实现了后缀表示法。

FUNCTION {sort.format.names}
{ 's :=
  #1 'nameptr :=
  ""
  s num.names$ 'numnames :=
  numnames 'namesleft :=
    { namesleft #0 > }
    {
      s nameptr "{vv{ } }{ll{ }}{  ff{ }}{  jj{ }}" format.name$ 't :=
      nameptr #1 >
        {
          "   "  *
          namesleft #1 = t "others" = and
            { "zzzzz" * }
            { numnames #2 > nameptr #2 = and
                { "zz" * year field.or.null * "   " * }
                'skip$
              if$
              t sortify *
            }
          if$
        }
        { t sortify * }
      if$
      nameptr #1 + 'nameptr :=
      namesleft #1 - 'namesleft :=
    }
  while$
}

尽管如此,TeX Stack Exchange 帖子中有一个答案这里描述如何定制plainnat.bst文件以解决无作者排序问题。

相关内容