我对 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
指定正确的选项。natbib
author-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,?)