我需要输出特定数量的作者,这取决于引用是否出现过。如果引用没有出现,则引用
- 最多有五位作者,应列出所有作者
- 作者超过五位的,只列出第一作者,后接“et al.”
如果引用已经出现,则引用
- 最多有两位作者,应列出所有作者
- 有两位以上作者的论文应仅列出第一作者,后接“et al.”
使用奥黛丽的回答,我能够实现大部分。但是,我不知道如何在 patch 命令中查询作者数量。我假设我可以根据引用是否曾经被看到来设置 maxnames,但 Audrey 提到这可能不是最好的主意 - 还有其他方法吗?
非常感谢!
例子:
\documentclass[]{scrbook}
\usepackage{filecontents}
\begin{filecontents}{lit.bib}
@article{Amabile.1993,
author = {Amabile, Teresa M.},
year = {1993},
title = {Motivational Synergy: Toward new conceptualizations of intrinsic and extrinsic motivation in the workplace},
pages = {185},
volume = {3},
number = {3},
journal = {Human Resource Management Review}
}
@article{Stevenson.1990,
author = {Stevenson, Howard H. and Jarillo, J. Carlos},
year = {1990},
title = {A Paradigm of Entrepreneurship: Entrepreneurial Management},
pages = {17--27},
volume = {11},
journal = {Strategic Management Journal}
}
@article{Kivimaki.1997,
author = {Kivim{\"a}ki, Mika and Kuk, George and Elovainio, Marko and Thomson, Louise and Kalliom{\"a}ki-Levanto, Tiina and Heikkil{\"a}, Armo},
year = {1997},
title = {The Team Climate Inventory (TCI)-four or five factors? Testing the structure of TCI in samples of low and high complexity jobs},
pages = {375--389},
volume = {70},
number = {4},
journal = {Journal of Occupational and Organizational Psychology}
}
\end{filecontents}
\usepackage[
natbib=true,
style=authoryear-comp,
backend=biber,
maxcitenames=2,
citetracker=true,]{biblatex}
\usepackage{xpatch}
\AtEveryCitekey{\ifciteseen{}{\clearfield{namehash}}}
\xpatchbibmacro{cite}
{\printnames{labelname}}
{\ifciteseen
{\printnames{labelname}}
{\printnames[][1-5]{labelname}}}
{}
{}
\xpatchbibmacro{textcite}
{\printnames{labelname}}
{\ifciteseen
{\printnames{labelname}}
{\printnames[][1-5]{labelname}}}
{}
{}
% some natbib backwards compatibility
\let\citealp\cite
\let\cite\textcite
\addbibresource{lit.bib}
\begin{document}
\citet{Amabile.1993} \\ % Amabile (1993) - correct
\citet{Stevenson.1990} \\ % Stevenson and Jarillo (1990) - correct
\citet{Kivimaki.1997} \\ % incorrect, should be Kivimäki et al. (1997)
\citet{Amabile.1993} \\ % Amabile (1993) - correct
\citet{Stevenson.1990} \\ % Stevenson and Jarillo (1990) - correct
\citet{Kivimaki.1997} \\ % Kivimäki et al. (1997) - correct
\printbibliography
\end{document}
使用 \AtEveryCitekey 的解决方案如下;但是,我有点困惑,因为“使用 biber 作为后端,您可能希望避免弄乱 maxnames 计数器。”
\AtEveryCitekey{\ifciteseen{\defcounter{maxnames}{2}}%
{\defcounter{maxnames}{5}}}
答案1
biblatex
将字段中的名称数量存储在计数器<name>
中。因此,我们可以使用来<name>
获取 中的名称数量。labelname
\value{labelname}
\xpatchbibmacro{cite}
{\printnames{labelname}}
{\ifboolexpr{test {\ifciteseen} or
test {\ifnumgreater{\value{labelname}}{5}}}
{\printnames{labelname}}
{\printnames[][1-5]{labelname}}}
{}
{}
\xpatchbibmacro{textcite}
{\printnames{labelname}}
{\ifboolexpr{test {\ifciteseen} or
test {\ifnumgreater{\value{labelname}}{5}}}
{\printnames{labelname}}
{\printnames[][1-5]{labelname}}}
{}
{}
应该适合你。
仅当引用之前未见过且 中的名字不超过 5 个时,才会打印最多 5 个名字labelname
,这应该能满足您的需要。所有这些都假设在序言中将maxcitenames
设置为 ,2
就像在您的 MWE 中一样。
您的 MWE 加上我的修改后得到
maxnames
您不应该在文档中间乱动的原因是 Biber 会进行各种名称和列表消歧义。如果uniquelist
设置为除 之外的任何值false
,Biber 可以在合理范围内更改引文中显示的作者数量 - 该数字由计数器控制maxnames
。这意味着 Biber 可以本地覆盖全局设置的maxnames
值。Biber 还会分配消歧字母(“Smith 2006a”),并根据它算出的名称标签执行此操作。如果我们现在maxnames
在引文中更改自己,Biber 不会知道这一点,并且标签可能会有点偏离。