我知道可以使用 bibfilters 和 bibchecks 从参考书目中排除条目,但是否可以对索引执行等效操作?我查看了多个索引的示例,但据我了解,它们将所有条目或所有引用的条目放入索引中,或放入作者和标题索引中。但我想从 biblatex 生成的任何索引中排除单个作者的所有条目(无论是否被引用)。原因很简单:我不想为自己建立索引,即使我确实引用了我的论文。
答案1
我们可以通过检查名称哈希来过滤进入索引的内容。您可以在以下位置了解有关名称哈希的更多信息:我对“使用 biblatex 突出显示参考书目中的作者,允许参考书目样式对其进行格式化”的回答。可以说,Biber 为它遇到的每个名称创建一个唯一的哈希,您可以在中找到每个名称的哈希.bbl
。该哈希是一种方便的方法来检查两个名称是否相同,而无需展开所有名称部分并分别比较字符串。
因此,您需要先找到我们的“您的”哈希。然后在以下代码中将 Sir Humphrey 的哈希替换为您的哈希
\documentclass[british]{report}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{csquotes}
\usepackage[style=authoryear, backend=biber, indexing=true]{biblatex}
\DeclareIndexNameFormat{default}{%
\iffieldequalstr{hash}{dd90e644e3018ab2c6a7ffa2a58522d0}
{}
{\usebibmacro{index:name}
{\index}
{\namepartfamily}
{\namepartgiven}
{\namepartprefix}
{\namepartsuffix}}}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@book{appleby,
author = {Humphrey Appleby},
title = {On the Importance of the Civil Service},
date = {1980},
}
@book{applebywoolley,
author = {Humphrey Appleby and Bernard Woolley},
title = {On the Ablative in Greek},
date = {1980},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\addbibresource{biblatex-examples.bib}
\usepackage{imakeidx}
\makeindex
\begin{document}
\cite{sigfridsson,appleby,applebywoolley}
\printbibliography
\printindex
\end{document}
索引中没有列出 Humphrey 爵士。但是,它列出了他的合著者 Bernard Woolley。这与将options = {indexing=false}
整个条目放入参考书目中不同,因为参考书目不会编入索引。
如果你不喜欢在文件中查找哈希值.bbl
,你可以尝试以下基于我的自动解决方案的方法使用 biblatex 突出显示参考书目中的作者,并允许使用参考书目样式对其进行格式化\addnamehash
。使用此功能,您可以像在文件中输入名称一样输入要排除的名称.bib
。然后,代码将名称写入临时.bib
文件并自动提取名称哈希值。
\documentclass[british]{report}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{csquotes}
\usepackage[style=authoryear, backend=biber, indexing=true]{biblatex}
\makeatletter
\def\nhblx@bibfile@name{\jobname -namehashes.bib}
\newwrite\nhblx@bibfile
\immediate\openout\nhblx@bibfile=\nhblx@bibfile@name
\newcounter{nhblx@name}
\setcounter{nhblx@name}{0}
\newcommand*{\nhblx@writenametobib}[1]{%
\stepcounter{nhblx@name}%
\edef\nhblx@tmp@nocite{%
\noexpand\AfterPreamble{%
\noexpand\setbox0\noexpand\vbox{%
\noexpand\nhblx@getmethehash{nhblx@name@\the\value{nhblx@name}}}}%
}%
\nhblx@tmp@nocite
\immediate\write\nhblx@bibfile{%
@misc{nhblx@name@\the\value{nhblx@name}, author = {\unexpanded{#1}}, %
options = {dataonly=true},}%
}%
}
\AtEndDocument{%
\closeout\nhblx@bibfile}
\addbibresource{\nhblx@bibfile@name}
\newcommand*{\nhblx@hashes}{}
\DeclareNameFormat{nhblx@hashextract}{%
\xifinlist{\thefield{hash}}{\nhblx@hashes}
{}
{\listxadd{\nhblx@hashes}{\thefield{fullhash}}}}
\DeclareCiteCommand{\nhblx@getmethehash}
{}
{\printnames[nhblx@hashextract][1-999]{author}}
{}
{}
\newcommand*{\addnamehash}{\forcsvlist\nhblx@writenametobib}
\newcommand*{\resetnamehashes}{\def\nhblx@hashes{}}
\DeclareIndexNameFormat{default}{%
\savefield*{hash}{\nhblx@currentnamehash}%
\xifinlist{\nhblx@currentnamehash}{\nhblx@hashes}
{}
{\usebibmacro{index:name}
{\index}
{\namepartfamily}
{\namepartgiven}
{\namepartprefix}
{\namepartsuffix}}}
\makeatother
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@book{appleby,
author = {Humphrey Appleby},
title = {On the Importance of the Civil Service},
date = {1980},
}
@book{applebywoolley,
author = {Humphrey Appleby and Bernard Woolley},
title = {On the Ablative in Greek},
date = {1980},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\addbibresource{biblatex-examples.bib}
\usepackage{imakeidx}
\makeindex
\addnamehash{Humphrey Appleby}
\begin{document}
\cite{sigfridsson,appleby,applebywoolley}
\printbibliography
\printindex
\end{document}