使用 biblatex 在索引中重复出现姓名

使用 biblatex 在索引中重复出现姓名

我使用biblatexwithindexing选项;此外,在文本中我有一些要索引的名称,使用通常的\index{}命令。由于我在参考书目和文本中有相同的作者,因此在索引中我发现了两个相同名称的出现,第一个来自文本,第二个来自参考书目,例如:

荷马,27,45,79
荷马,107

但这是错误的,而且令人困惑。我该如何统一名称的出现?

一个简单的例子:

\documentclass{article}
\usepackage{fontspec}
\usepackage[style=philosophy-verbose,scauthors=true,classical=true,%
volumeformat=romansc,indexing]{biblatex}
\usepackage{filecontents}
\usepackage{imakeidx}
\indexsetup{othercode=\footnotesize}
\makeindex[intoc=true]
\begin{filecontents*}{\jobname.bib}
@book{strawson:1966,
  author         = {Peter Strawson},
  title          = {The Bounds of Sense},
  publisher      = {Routledge},
  location       = {London},
  year           = {1966},
}
\end{filecontents*}
\addbibresource{\jobname.bib}

\begin{document}
De nobis ipsis silemus\footcite{strawson:1966}: De re autem, quae agitur,
petimus, as Strawson\index{Strawson, Peter} told
\newpage
De nobis ipsis silemus: De re autem, quae agitur,
petimus, as Strawson\index{Strawson, Peter} told
\newpage
De nobis ipsis silemus\footcite{strawson:1966}: De re autem, quae agitur,
petimus, as Strawson told
\newpage
De nobis ipsis silemus
De nobis ipsis silemus: De re autem, quae agitur,
petimus, as Strawson\index{Strawson, Peter} told
\newpage
De nobis ipsis silemus\footcite{strawson:1966}: De re autem, quae agitur,
petimus, as Strawson told

\printbibliography
\printindex
\end{document}

你会注意到 Strawson 出现了两次。example.idx我读到

\indexentry{Strawson, Peter}{1}
\indexentry{Strawson, Peter@Strawson, Peter}{1}
\indexentry{Strawson, Peter}{2}
\indexentry{Strawson, Peter@Strawson, Peter}{3}
\indexentry{Strawson, Peter}{4}
\indexentry{Strawson, Peter@Strawson, Peter}{5}
\indexentry{Strawson, Peter@Strawson, Peter}{5}

答案1

由于我不太明白的原因,索引发出biblatex以下形式的命令

\index{Strawson, Peter@Strawson, Peter}

.idx通过检查文件你可以看到

\indexentry{Strawson, Peter}{1}
\indexentry{Strawson, Peter@Strawson, Peter}{1}
\indexentry{Strawson, Peter}{2}
\indexentry{Strawson, Peter@Strawson, Peter}{3}
\indexentry{Strawson, Peter}{4}
\indexentry{Strawson, Peter@Strawson, Peter}{5}
\indexentry{Strawson, Peter@Strawson, Peter}{5}

您可以通过定义来解决此行为

\newcommand{\nindex}[1]{\index{#1@#1}}

\nindex{Strawson, Peter}并在文本中使用。更改后,.idx我得到的文件如下:

\indexentry{Strawson, Peter@Strawson, Peter}{1}
\indexentry{Strawson, Peter@Strawson, Peter}{1}
\indexentry{Strawson, Peter@Strawson, Peter}{2}
\indexentry{Strawson, Peter@Strawson, Peter}{3}
\indexentry{Strawson, Peter@Strawson, Peter}{4}
\indexentry{Strawson, Peter@Strawson, Peter}{5}
\indexentry{Strawson, Peter@Strawson, Peter}{5}

这是索引,只有一个条目:

在此处输入图片描述

也许还有其他解决方法biblatex,但我不知道。

答案2

您看到的结果已被 egreg 正确诊断。但可能有一个更简单的解决方法。实际上,这不是\indexname我错误猜测的,而是由于前缀“van”、“von”、“de la”等的处理。

如果biblatex“使用前缀”(这意味着它将始终将 Ludwig van Beethoven 打印为 Van Beethoven, Ludwig,大写),则它会将“打印”和“排序”条目放入索引中,并用 @ 分隔。这样做是为了能够makeindex 种类使用“范贝多芬,路德维希”,但是打印“范·贝多芬,路德维希”。后者需要在文件中添加 LaTeX 命令 ( \MakeCapital {van}),如果将其裸露在索引条目中,将导致排序困难。

简单的解决方案useprefixes=false您可以通过在加载时 设置选项来避免这种biblatex情况。这也许可以解决您的问题,除非您需要“useprefixes”,即您有“van Beethoven”之类的条目,而您想打印“Van Beethoven”并按 V 排序。在大多数情况下,在英语的排序惯例中,这至少是一个很好的解决方案,而且可能就是您想要的。

不那么简单的解决方案 或者,如果您想保留“useprefixes”选项,以下代码将尝试确保附加命名(van Beethoven, Ludwig@\MakeCapital{van} Beethoven Ludwig仅有的当名称实际上被使用时前缀,因此解决了您的问题(但是,如果处理带有前缀的名称,则需要使用 egreg 的方法,即,您必须确保带有前缀的名称的索引条目采用上面给出的形式)。

\makeatletter
\renewcommand*{\mkbibindexname}[4]{%
\ifuseprefix
   {\ifblank{#3}% no PREFIX
       {\@firstofone #1% remove spurious braces                                    
       \ifblank{#4}{}{ #4}%                                        
       \ifblank{#2#3}{}{,}%
       \ifblank{#2}{}{ #2}}%
       {#3 % PREFIX                                                      
         \@firstofone #1%removespuriousbraces
         \ifblank{#4}{}{ #4}%
         \ifblank{#2}{}{, #2}%
         \actualoperator
         \ifblank{#3}{}{\MakeCapital{#3} %
         #1%       
         \ifblank{#4}{}{ #4}%
         \ifblank{#2}{}{, #2}}}}
    {\@firstofone #1% NOT "using prefix" remove spurious braces                                    
     \ifblank{#4}{}{ #4}%                                                      
     \ifblank{#2#3}{}{,}%                                                      
     \ifblank{#2}{}{ #2}%                                                      
     \ifblank{#3}{}{ #3}}}
\makeatother

答案3

我使用另一种解决方案:定义不打印任何内容的假引用命令,但将“引用”参考文献的作者添加到索引中。

正如已经指出的,问题在于 biblatex 容易在将作者姓名添加到索引之前以各种方式转换作者姓名;问题中提到的 @ 问题只是其中之一。例如,我在处理特殊字符(如重音符)时遇到了一个烦人的问题:要索引名称“Châtelet, Émilie du”,biblatex 实际上会调用\indexentry,因此Ch\IeC {\^a}telet, \IeC {\'E}milie du手动调用\index{Châtelet, Émilie du}会创建重复的条目。因此,每当我想手动将条目添加到索引时,我都必须检查文件.idx以查看 biblatex 做了什么,然后复制它,正如 barbara beeton 和 Paul Stanley 所建议的那样。它起作用了,但除了难以辨认之外,我觉得它对我的(大)文档来说不是很强大,因为 biblatex 内部或我的选项(比如关于前缀)的任何更改都可能破坏我所有的手动条目。

现在,如果我定义:

\newbibmacro*{idxauthor}{%
  \ifciteindex
    {\indexnames{author}}
    {}}
\DeclareCiteCommand{\idxauthor}
  {}%
  {\usebibmacro{idxauthor}}
  {}
  {}

\newbibmacro*{idxeditor}{%
  \ifciteindex
    {\indexnames{editor}}
    {}}
\DeclareCiteCommand{\idxeditor}
  {}%
  {\usebibmacro{idxeditor}}
  {}
  {}

\newbibmacro*{idxtransl}{%
  \ifciteindex
    {\indexnames{translator}}
    {}}
\DeclareCiteCommand{\idxtransl}
  {}%
  {\usebibmacro{idxtransl}}
  {}
  {}

然后我可以调用\idxauthor{strawson:1966}来为 Strawson 添加一个手动索引条目,它依赖于 biblatex 内部来发出与 a 完全相同的索引命令,\cite{strawson:1966}但不执行其他任何操作(特别是不会打印 Strawson (1966) 或其他内容)。

相关内容