biblatex - 等用于特定情况

biblatex - 等用于特定情况

我需要输出特定数量的作者,这取决于引用是否出现过。如果引用没有出现,则引用

  • 最多有五位作者,应列出所有作者
  • 作者超过五位的,只列出第一作者,后接“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 加上我的修改后得到

MWE 的引用

maxnames您不应该在文档中间乱动的原因是 Biber 会进行各种名称和列表消歧义。如果uniquelist设置为除 之外的任何值false,Biber 可以在合理范围内更改引文中显示的作者数量 - 该数字由计数器控制maxnames。这意味着 Biber 可以本地覆盖全局设置的maxnames值。Biber 还会分配消歧字母(“Smith 2006a”),并根据它算出的名称标签执行此操作。如果我们现在maxnames在引文中更改自己,Biber 不会知道这一点,并且标签可能会有点偏离。

相关内容