如何修改 bst 以縮寫為 et al.在n位作者之後

如何修改 bst 以縮寫為 et al.在n位作者之後

我有一個 bst 文件,可以將超過 5 位作者的條目縮短為等人。 但我想修改它以便為 4 位以上的作者這樣做。我相信這是相關的程式碼片段,但我如何更改它以獲得修改後的行為?
這個問題類似於更改 .bst 檔案中的 BibTeX“format.names”函數以強制“et al.”超過 3 位作者的條目的引用但由於這個 bst 檔案已經成功地執行了類似的功能,也許這個問題得到答案的機率會更高。

這個語法確實是 BeaST...如果有人可以向我解釋這裡發生了什麼,我將非常感激。

FUNCTION {format.names}
{ 'bibinfo :=
  duplicate$ empty$ 'skip$ {
  's :=
  "" 't :=
  #1 'nameptr :=
  s num.names$ 'numnames :=
  numnames 'namesleft :=
    { namesleft #0 > }
    { s nameptr
      "{vv~}{ll}{, f.}{, jj}"
      format.name$
      bibinfo bibinfo.check
      't :=
      nameptr #1 >
        {
          nameptr #1
          #1 + =
          numnames #5
          > and
            { "others" 't :=
              #1 'namesleft := }
            'skip$
          if$
          namesleft #1 >
            { ", " * t * }
            {
              s nameptr "{ll}" format.name$ duplicate$ "others" =
                { 't := }
                { pop$ }
              if$
              t "others" =
                {
                  " " * bbl.etal emphasize *
                }
                {
                  "\&"
                  space.word * t *
                }
              if$
            }
          if$
        }
        't
      if$
      nameptr #1 + 'nameptr :=
      namesleft #1 - 'namesleft :=
    }
  while$
  } if$
}

來源:http://mirror.unl.edu/ctan/macros/latex/contrib/nature/naturemag.bst

答案1

由於我完全不清楚將 #5 更改為 #3 的原因。似乎 #5 和 #4 有相同的行為...我很樂意接受一個解釋這裡發生的事情的答案。

FUNCTION {format.names}
{ 'bibinfo :=
  duplicate$ empty$ 'skip$ {
  's :=
  "" 't :=
  #1 'nameptr :=
  s num.names$ 'numnames :=
  numnames 'namesleft :=
    { namesleft #0 > }
    { s nameptr
      "{vv~}{ll}{, f.}{, jj}"
      format.name$
      bibinfo bibinfo.check
      't :=
      nameptr #1 >
        {
          nameptr #1
          #1 + =
          numnames #3
          > and
            { "others" 't :=
              #1 'namesleft := }
            'skip$
          if$
          namesleft #1 >
            { ", " * t * }
            {
              s nameptr "{ll}" format.name$ duplicate$ "others" =
                { 't := }
                { pop$ }
              if$
              t "others" =
                {
                  " " * bbl.etal emphasize *
                }
                {
                  "\&"
                  space.word * t *
                }
              if$
            }
          if$
        }
        't
      if$
      nameptr #1 + 'nameptr :=
      namesleft #1 - 'namesleft :=
    }
  while$
  } if$
}

相關內容