![如何在 BibLaTeX 的 textcite 命令中的最后一个元素前获得“and”?](https://linux22.com/image/260934/%E5%A6%82%E4%BD%95%E5%9C%A8%20BibLaTeX%20%E7%9A%84%20textcite%20%E5%91%BD%E4%BB%A4%E4%B8%AD%E7%9A%84%E6%9C%80%E5%90%8E%E4%B8%80%E4%B8%AA%E5%85%83%E7%B4%A0%E5%89%8D%E8%8E%B7%E5%BE%97%E2%80%9Cand%E2%80%9D%EF%BC%9F.png)
当在 BibLaTeX 中使用\textcite
或\textcites
与多个作者一起使用时,结果实际上不可用,必须手动修复,这几乎不是该命令的重点:
\documentclass{minimal}
\listfiles
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@article{alice,
author = {Alice, A.},
}
@book{bob,
author = {Bob, B.},
}
@collection{charlie,
editor = {Charlie, C.},
}
\end{filecontents}
\usepackage[style=numeric,sortcites]{biblatex}
\addbibresource{\jobname.bib}
\begin{document}
Refer to the works of \textcite{charlie,alice,bob}.
Refer to the works of \textcite{alice,bob} and \textcite{charlie}.
\end{document}
看起来像这样:
有人可能会争论第二个和第三个元素之间是否应该有一个逗号,但“and”在英语中肯定是必需的。那么有没有办法让 BibLaTeX 按照这种方式运行呢?
答案1
Biblatex 提供计数器citecount
和citetotal
。citetotal
保存传递给引用命令的有效条目键的总数,并且citecount
是正在处理的引用的计数器。因此,我们可以使用这样的计数器来识别引用是否是引用列表中的最后一个。的标准定义\textcite
使用宏textcite
,其中分隔符插入当前条目之后。因此,我们可以包含一个检查来识别我们是否正在处理倒数第二个条目,并打印“and”而不是分隔符。
textcite
这是biblatex 宏的修改版本
\makeatletter
\newbibmacro*{textcite}{%
\iffieldequals{namehash}{\cbx@lasthash}
{\multicitedelim}
{\cbx@tempa
\ifnameundef{labelname}
{\printfield[citetitle]{labeltitle}}
{\printnames{labelname}}%
\addspace\bibopenbracket}%
\ifnumequal{\value{citecount}}{1}
{\usebibmacro{prenote}}
{}%
\usebibmacro{cite}%
\savefield{namehash}{\cbx@lasthash}%
\ifnumequal{\value{citecount}}{\value{citetotal}-1}
{\gdef\cbx@tempa{\bibclosebracket\addspace\bibstring{and}\addspace}}%
{\gdef\cbx@tempa{\bibclosebracket\multicitedelim}}%
}
\makeatother
它产生: