我使用 biber 作为具有字母样式的 biblatex 的后端。我希望使 textcite 和 citeauthor 命令按如下方式运行:
如果我第一次对某个参考文献使用上述命令之一,我希望它打印所有作者姓名。然后在进一步引用时,我希望它仅显示第一作者姓名 + “et al.” 。到目前为止,我这样做的方式如下:
\DeclareCiteCommand*{\textcite*}{%
\defcounter{maxnames}{99}%
\defcounter{minnames}{99}%
\defcounter{uniquename}{0}%
\booltrue{citetracker}%
\boolfalse{pagetracker}%
\usebibmacro{prenote}
}{\ifciteindex{\indexnames{labelname}}{}%
\ifciteseen{\printnames[][1-1]{labelname}}{\printnames[][1-99]{labelname}}
}{\multicitedelim}{\usebibmacro{postnote}}
问题在于,一方面我需要调用 \textcite* 而不是 \textcite;另一方面 \textcite 和 \citeauthor 在这里是分开处理的,也就是说,如果我调用 \textcite,它会起作用,但是当我第一次调用 \citeauthor 时,它会再次引用所有名称。如果有人知道如何解决这个问题,我会非常高兴。谢谢。
好吧,我注意到,如果我调用 \textcite,作者姓名后面的引文将被省略。因此,我稍微修改了命令,如下所示:
\DeclareCiteCommand{\textcite}{%
\defcounter{maxnames}{99}%
\defcounter{minnames}{99}%
\defcounter{uniquename}{0}%
\booltrue{citetracker}%
\boolfalse{pagetracker}%
\usebibmacro{prenote}
}{\ifciteindex{\indexnames{labelname}}{}%
\ifciteseen{
{\printnames[][1-1]{labelname}\space\bibopenbracket}%
\ifnumequal{\value{citecount}}{1}{\usebibmacro{prenote}}{}%
\usebibmacro{cite}\bibclosebracket
}{
{\printnames[][1-99]{labelname}\space\bibopenbracket}%
\ifnumequal{\value{citecount}}{1}{\usebibmacro{prenote}}{}%
\usebibmacro{cite}\bibclosebracket
}
}{\multicitedelim}{\usebibmacro{postnote}}
但是使用此代码,我会得到一个包含名称和引文的引文,但它也会在引文后面添加一个空格,这看起来不太好看。有人知道如何纠正吗?谢谢?
@Seamus:我在 biblatex 中找不到这样的功能。如果您知道类似的东西,我将不胜感激。
答案1
textcite
如果对参考书目宏进行编辑而不是重新定义,则很容易避免间距问题\textcite
。
测试还涉及另一个问题\ifciteseen
。当labelname
始终是引文标签的一部分时,这是合适的。作者-年份样式就是这种情况(例如biblatex – 等从第二次引用开始?),但不是alphabetic
。解决此问题的一种方法是通过\textcite
或\citeauthor
使用 来跟踪已经引用的条目category
。
\documentclass{article}
\usepackage[backend=biber,style=alphabetic,maxcitenames=1]{biblatex}
\DeclareBibliographyCategory{nameseen}
\newbibmacro*{labelname}{%
\ifcategory{nameseen}
{\printnames{labelname}}
{\addtocategory{nameseen}{\thefield{entrykey}}%
\printnames[][1-99]{labelname}}}
% Based on generic definition from biblatex.def
\DeclareCiteCommand{\citeauthor}
{\boolfalse{citetracker}%
\boolfalse{pagetracker}%
\usebibmacro{prenote}}
{\ifciteindex
{\indexnames{labelname}}
{}%
\usebibmacro{labelname}}
{\multicitedelim}
{\usebibmacro{postnote}}
\makeatletter
% Based on definition from alphabetic.cbx
\renewbibmacro*{textcite}{%
\ifcategory{nameseen}
{}
{\clearfield{namehash}}%
\iffieldequals{namehash}{\cbx@lasthash}
{\multicitedelim}
{\cbx@tempa
\ifnameundef{labelname}
{}
{\usebibmacro{labelname}\space}%
\bibopenbracket}%
\ifnumequal{\value{citecount}}{1}
{\usebibmacro{prenote}}
{}%
\usebibmacro{cite}%
\savefield{namehash}{\cbx@lasthash}%
\gdef\cbx@tempa{\bibclosebracket\multicitedelim}}
\makeatother
\begin{filecontents}{\jobname.bib}
@article{bertram2,
title = {Gromov Invariants for Holomorphic Maps from Riemann Surfaces to Grassmannians},
author = {Bertram, Aaron and Daskalopoulos, Georgios and Wentworth, Richard},
journal = {Journal of the American Mathematical Society},
volume = {9},
number = {2},
pages = {529--571},
year = {1996}}
\end{filecontents}
\addbibresource{\jobname.bib}
\addbibresource{biblatex-examples.bib}
\begin{document}
Some filler text \parencite{companion,bertram}.
\Citeauthor{companion} showed that...
\Textcite{companion} showed that...
The results from \textcite{bertram,bertram2,companion}...
The results from \textcite{bertram,bertram2,companion}...
The results by \citeauthor{bertram,companion,yoon}...
\end{document}
该解决方案还可使用 BibTeX 作为后端。
其alphabetic-verb
风格与 类似alphabetic
,但不会生成紧凑的引用列表。要使解决方案正常工作,alphabetic-verb
请使用以下 的重新定义textcite
。
% Based on definition from alphabetic-verb.cbx
\renewbibmacro*{textcite}{%
\ifnameundef{labelname}
{}
{\usebibmacro{labelname}\space}%
\bibopenbracket
\ifnumequal{\value{citecount}}{1}
{\usebibmacro{prenote}}
{}%
\usebibmacro{cite}}