
Я использую опцию biblatex
with indexing
; более того, внутри текста у меня есть некоторые имена для индексации, с обычной \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
I read
\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
«использует префиксы» (что означает, что он всегда будет печатать Людвига ван Бетховена как Ван Бетховен, Людвиг, с заглавной буквы), то он помещает в индекс как «печать», так и «сортировку», разделенные @. Это делается для того, чтобы иметьmakeindex
Сортироватьиспользуя "ван Бетховен, Людвиг", ноРаспечатать"Van Beethoven, Ludwig". Последнее требует добавления команды 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, а затем копировать его, как предлагали Барбара Битон и Пол Стэнли. Это работало, но, помимо того, что было довольно неразборчиво, я чувствовал, что это не очень надежно для моего (большого) документа, так как любое изменение во внутренних компонентах 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) или что-то в этом роде).