Biblatex でテキスト引用内の異なる著者名を同じ著者として扱うようにする

Biblatex でテキスト引用内の異なる著者名を同じ著者として扱うようにする

ある人が数冊の本を書いていますが、ミドルネームを含めたり省略したりする点に関しては、本ごとに一貫性がありません。テキストでこの著者を引用する場合、biblatex名前の異なるバージョンをすべて同じ著者として扱いたいと思います。 を使用すると、参考文献の並べ替えにこれを強制できますsortnameが、テキストの引用にこれを強制するにはどうすればよいでしょうか。

次の例は、テキスト引用が「Paul J[ohn] Smith」を「Paul John Smith」および「Paul Smith」とは異なる著者として扱う方法を示しています。最初の引用は (Smith 2002) と表示され、2 番目の引用は (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}

ここに画像の説明を入力してください

関連情報