Biblatex 能够检查姓名是否出现在不同的字段中,并能够调整显示的参考资料。例如,如果翻译和注释是由同一个人完成的,biblatex 会创建一个参考资料,用字符串(例如)将两个数据统一起来Trans. and annot. by [person X]
。如果我没记错的话,这是在 bibmacro translator+othersstrg
(在 biblatex.def 中定义)中使用检查两个姓名是否相等的宏来实现的ifnamesequal
。
不幸的是,如果字段相等annotator
,则introduction
不会进行检查。我怎样才能让 biblatex 不会在以下 MWE 中两次显示 Michel García 这个名字?即如何强制 biblatex 检查这两个字段是否相等?
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[style=verbose-trad2]{biblatex}
\addbibresource{stack.bib}
\begin{document}
\cite{repertorio1972}
\printbibliography
\end{document}
这是书目条目:
@Book{repertorio1972,
title = {Repertorio de príncipes de España},
year = 1972,
annotator = {García, Michel},
introduction = {García, Michel},
publisher = {CSIC},
location = {Jaén}
}
答案1
这些检查实际上是通过书目宏完成的。组合字符串在本地化模块(文件)中定义lbx
。默认定义是说明性的,而不是详尽的;它们没有考虑到注释、介绍、评论、前言和后记作者的所有类型的重叠。但是,您可以修改相关宏以biblatex.def
实现所需的输出。例如:
\NewBibliographyString{withannotatorin}
\DefineBibliographyStrings{english}{%
withannotatorin = {with annots\adddot and intro\adddot}}
\newbibmacro*{withannotatorin}{%
\ifboolexpr{ test {\ifnameundef{annotator}} or test {\ifnameundef{introduction}}
or not test {\ifnamesequal{annotator}{introduction}} }
{}
{\bibstring{withannotatorin}%
\setunit{\addspace}%
\printnames[withannotator]{annotator}%
\clearname{annotator}%
\clearname{introduction}}}
\renewbibmacro*{withothers}{%
\usebibmacro{withcommentator}%
\clearname{commentator}%
\newunit
\usebibmacro{withannotatorin}%
\usebibmacro{withannotator}%
\clearname{annotator}%
\newunit
\usebibmacro{withintroduction}%
\clearname{introduction}%
\newunit
\usebibmacro{withforeword}%
\clearname{foreword}%
\newunit
\usebibmacro{withafterword}%
\clearname{afterword}}