biblatex 可以从其生成的索引中排除一位作者的所有 bib 条目吗?

biblatex 可以从其生成的索引中排除一位作者的所有 bib 条目吗?

我知道可以使用 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}

相关内容