LyX:作者年份与带有自定义 bst 的 natbib 包不兼容

LyX:作者年份与带有自定义 bst 的 natbib 包不兼容

我对 LyX 和引文有疑问。我想使用选项 Natbib : Author-Year 来显示引文,例如“(Gebel等人., 2009)”但我一直收到错误author-year not compatible with natbib package。我正在使用自定义“.bst”文件。如果我只想将数字显示为“[1]”,它可以正常工作

有人能帮我解决这个问题吗?使用 TeXmaker 效果会更好吗?

答案1

问题是 author-yearnatbib需要具有bibitem以下格式:

\bibitem[Short(year)Long]{citekey} ...

哪里Short是作者的简短列表(例如,您的情况下是 Gebel 等人)并且Long是作者的完整列表。因此,解决方案是更改.bst。您可以尝试查看bst您使用的文件是否有函数 output.bibitem,检查它是否在 和 其他 BibTeX 条目类型中被调用FUNCTION{book}FUNCTION{article}然后将该output.bibitem函数替换为:

FUNCTION {output.bibitem}
{ newline$
  "\bibitem[{" write$
  label write$
  ")" make.full.names duplicate$ short.list =
     { pop$ }
     { * }
   if$
  "}]{" * write$
  cite$ write$
  "}" write$
  newline$
  ""
  before.all 'output.state :=
}

否则,你因为在上一个问题中 在自定义参考书目样式 .bst 中将卷标设为粗体您编写了bst使用创建的自己的程序。您可以再次创建它,并为和custom-bib指定正确的选项。natbibauthor-year

答案2

对于那些可能仍然感兴趣的人..我对 Guido 的答案遇到了与 esmitex 相同的问题。我不得不修改它,因此我最终得到了以下解决方案:

FUNCTION {output.bibitem}用。。。来代替

    FUNCTION {output.bibitem}
    { newline$
      "\bibitem[{" write$ make.short.names "}(" * year empty$ {skip$} { year * } if$ "){" * make.full.names * "}]{" * write$
     cite$ write$
     "}" write$
     newline$
     ""
     before.all 'output.state :=
}

我还必须在上述代码前面添加以下附加函数:

    FUNCTION {format.full.names}
{'s :=
 "" 't :=
  #1 'nameptr :=
  s num.names$ 'numnames :=
  numnames 'namesleft :=
    { namesleft #0 > }
    { s nameptr
      "{vv~}{ll}" format.name$
      't :=
      nameptr #1 >
        {
          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$
}

FUNCTION {format.short.names}
{'s := 
  s num.names$ 'numnames :=
    numnames #1 >  
    { s #1 "{vv~}{ll}" format.name$ " " * bbl.etal emphasize * } 
    { numnames #1 =  { s #1 "{vv~}{ll}" format.name$ } { "NN" } if$ }
    if$
 }

FUNCTION {author.editor.key.full}
{ author empty$
    { editor empty$
        { key empty$
            { cite$ #1 #3 substring$ }
            'key
          if$
        }
        { editor format.full.names }
      if$
    }
    { author format.full.names }
  if$
}

FUNCTION {author.editor.key.short}
{ author empty$
    { editor empty$
        { key empty$
            { cite$ #1 #3 substring$ }
            'key
          if$
        }
        { editor format.short.names }
      if$
    }
    { author format.short.names }
  if$
}

FUNCTION {author.key.full}
{ author empty$
    { key empty$
         { cite$ #1 #3 substring$ }
          'key
      if$
    }
    { author format.full.names }
  if$
}

FUNCTION {author.key.short}
{ author empty$
    { key empty$
         { cite$ #1 #3 substring$ }
          'key
      if$
    }
    { author format.short.names }
  if$
}

FUNCTION {editor.key.full}
{ editor empty$
    { key empty$
         { cite$ #1 #3 substring$ }
          'key
      if$
    }
    { editor format.full.names }
  if$
}

FUNCTION {editor.key.short}
{ editor empty$
    { key empty$
         { cite$ #1 #3 substring$ }
          'key
      if$
    }
    { editor format.short.names }
  if$
}

FUNCTION {make.full.names}
{ type$ "book" =
  type$ "inbook" =
  or
    'author.editor.key.full
    { type$ "proceedings" =
        'editor.key.full
        'author.key.full
      if$
    }
  if$
}

FUNCTION {make.short.names}
{ type$ "book" =
  type$ "inbook" =
  or
    'author.editor.key.short
    { type$ "proceedings" =
        'editor.key.short
        'author.key.short
      if$
    }
  if$
}

如果您已经定义了这些函数,您可能希望保留它们或替换它们。
该函数make.short.names定义在使用 \citeauthor 或 \citet 时以文本内联方式显示的作者列表。此版本显示 John[11] 如果只有一位作者,则仅为约翰 [11]。

答案3

如果你使用 author-year 模式,则可能需要在 FUNCTION {output.bibitem} 中将“extra.label *”添加到“year *”中,并获得

FUNCTION {output.bibitem}
{ newline$
  "\bibitem[{" write$ make.short.names "}(" * year empty$ {skip$} { year * extra.label * } if$ "){" * make.full.names * "}]{" * write$
 cite$ write$
 "}" write$
 newline$
 ""
 before.all 'output.state :=
}

如果引用的是同一作者和同一年份,例如 Titman et al. (2010a,b)。否则,它看起来像 Titman et al. (2010,?)

相关内容