Заставить biblatex обрабатывать разные имена авторов как одного и того же автора в текстовых цитатах

Заставить biblatex обрабатывать разные имена авторов как одного и того же автора в текстовых цитатах

Какой-то парень написал несколько книг, но он непоследователен от книги к книге, когда дело доходит до включения и/или сокращения своего второго имени. Когда я цитирую этого автора в тексте, я хотел бы biblatexрассматривать все разные версии его имени как одного и того же автора. Я могу применить это для сортировки в библиографии с помощью sortname, но что мне сделать, чтобы применить это для текстовых ссылок?

Следующий пример иллюстрирует, как текстовая ссылка рассматривает "Paul J[ohn] Smith" как автора, отличного от "Paul John Smith" и "Paul Smith". Первая ссылка должна отображаться как (Smith 2002), а вторая ссылка должна отображаться как (2001a, 2001b, 2002).

\documentclass{article}
\usepackage{csquotes}
\usepackage[
        bibstyle = authoryear,
        citestyle = authoryear-comp,
        dashed = false,
        sorting = nyt,
        sortcites = false,
        language = american,
        abbreviate = false,
        backend = biber]{biblatex}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@BOOK{smith2001a,
    AUTHOR = "Paul John Smith",
    TITLE = "My first book",  
    YEAR = "2001"}

@BOOK{smith2001b,
    AUTHOR = "Paul Smith",
    TITLE = "My second book",  
    YEAR = "2001",
    SORTNAME = "Paul John Smith"}

@BOOK{smith2002,
    AUTHOR = "Paul J[ohn] Smith",
    TITLE = "My third book",  
    YEAR = "2002",
    SORTNAME = "Paul John Smith"}
\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}
\noindent
Some clever guy said that \parencite{smith2002}.
In fact, Paul Smith has talked about this several times \parencite*{smith2001a,smith2001b,smith2002}.
\printbibliography
\end{document}

введите описание изображения здесь

решение1

Теперь есть макроинтерфейс biblatex для функции сопоставления источников, вы можете поместить его в преамбулу:

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map[overwrite]{
       \step[fieldsource=author, match=\regexp{Paul\s+(?:J\S+\s+)?Smith}, final]
       \step[fieldset=shortauthor, fieldvalue={Smith, Paul John}]
       \step[fieldset=sortname, fieldvalue={Smith, Paul John}]
    }
  }
}

Возможно, вам захочется настроить регулярное выражение. Я сделал его достаточно конкретным, чтобы не отследить ничего лишнего.

решение2

Это просто для того, чтобы показать, как решение PLK, представленное выше, работает на практике:

\documentclass{article}
\usepackage{csquotes}
\usepackage[
        bibstyle = authoryear,
        citestyle = authoryear-comp,
        dashed = false,
        sorting = nyt,
        sortcites = false,
        language = american,
        abbreviate = false,
        backend = biber]{biblatex}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@BOOK{smith2001a,
    AUTHOR = "Paul John Smith",
    TITLE = "My first book",  
    YEAR = "2001"}

@BOOK{smith2001b,
    AUTHOR = "Paul Smith",
    TITLE = "My second book",  
    YEAR = "2001",
    SORTNAME = "Paul John Smith"}

@BOOK{smith2002,
    AUTHOR = "Paul J[ohn] Smith",
    TITLE = "My third book",  
    YEAR = "2002",
    SORTNAME = "Paul John Smith"}
\end{filecontents}
\addbibresource{\jobname.bib}
\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map[overwrite]{
       \step[fieldsource=author, match=\regexp{Paul\s+(?:J\S+\s+)?Smith}, final]
       \step[fieldset=shortauthor, fieldvalue={Smith, Paul John}]
       \step[fieldset=sortname, fieldvalue={Smith, Paul John}]
    }
  }
}
\begin{document}
\noindent
Some clever guy said that \parencite{smith2002}.
In fact, Paul Smith has talked about this several times \parencite*{smith2001a,smith2001b,smith2002}.
\printbibliography
\end{document}

введите описание изображения здесь

Связанный контент