著者別に参考文献をフィルタリングしますか?

著者別に参考文献をフィルタリングしますか?

複数の人が使用できる出版物リストのテンプレートを作成したいと考えています。アイデアとしては、すべての出版物を含む 1 つの bib ファイルを用意することです。査読済みのエントリには、キーワード = pr が付けられます。次に、scriptreport タイプのマスター ファイルがあり、このファイルで各自のチャプター ファイルを統合して、全員の出版物リストを 1 つのファイルにマージできます。チャプター ファイルはすべての中核であり、再利用可能である必要があります。このファイルは、bib ファイルから各著者のエントリをフィルター処理し、2 つのリスト (査読済みと査読なし) に出力する必要があります。問題は、この場合、著者によるフィルター処理の方法がまったくわからないことです。2 つのファイルの大まかなコードは次のとおりです。

マスター:

\documentclass[a4paper]{scrreprt}

\usepackage{biblatex}

\title{Publication list}

\addbibresource{sample.bib}

\begin{document}
    \maketitle
    
    \tableofcontents
    \newpage
    
    \include{Researcher}
    \newpage
\end{document}

章:

\chapter*{Researcher}
\addcontentsline{toc}{chapter}{Researcher}
    
    \nocite{*}
    \printbibliography[keyword={pr}, title={Peer-reviewed}]
    
    \nocite{*}
    \printbibliography[notkeyword={pr}, title={Non-peer-reviewed}]

答え1

名前によるフィルタリングはそれほど簡単ではありません。1つの方法は、ソースマップと正規表現を使用して名前を一致させ、キーワードを追加することです(例:biblatex: 特定の著者の出版物を参考文献から分離する)。

文字列/マクロ比較を使用する別の方法は、biblatex: 参照文献内の特定の著者の出版物を動的にフィルタリングする。 に似ているbiblatex を使用して特定の著者を太字にする文字列/マクロの比較ではなくハッシュを使用することをお勧めします。

以下は私の回答の抜粋ですhttps://tex.stackexchange.com/a/416416/35864太字の名前から名前のフィルタリングまで。そこからのコードのほとんどはそのままコピーできますが、新しい点は、任意の条件で参考文献のエントリをフィルタリングするための 2 つの bibchecks を定義することです。

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[backend=biber,style=authoryear]{biblatex}

\addbibresource{biblatex-examples.bib}

\makeatletter
\def\fnblx@bibfile@name{\jobname -fnblx.bib}
\newwrite\fnblx@bibfile
\immediate\openout\fnblx@bibfile=\fnblx@bibfile@name

\immediate\write\fnblx@bibfile{%
  @comment{Auto-generated file}\blx@nl}

\newcounter{fnblx@name}
\setcounter{fnblx@name}{0}

\newcommand*{\fnblx@writenametobib}[1]{%
  \stepcounter{fnblx@name}%
  \edef\fnblx@tmp@nocite{%
    \noexpand\AfterPreamble{%
      \noexpand\setbox0\noexpand\vbox{%
        \noexpand\fnblx@getmethehash{fnblx@name@\the\value{fnblx@name}}}}%
  }%
  \fnblx@tmp@nocite
  \immediate\write\fnblx@bibfile{%
    @misc{fnblx@name@\the\value{fnblx@name}, author = {\unexpanded{#1}}, %
          options = {dataonly=true},}%
  }%
}

\AtEndDocument{%
  \closeout\fnblx@bibfile}

\addbibresource{\fnblx@bibfile@name}

\newcommand*{\fnblx@namehashes}{}
\DeclareNameFormat{fnblx@hashextract}{%
  \xifinlist{\thefield{hash}}{\fnblx@namehashes}
    {}
    {\listxadd{\fnblx@namehashes}{\thefield{hash}}}}

\DeclareCiteCommand{\fnblx@getmethehash}
  {}
  {\printnames[fnblx@hashextract][1-999]{author}}
  {}
  {}

\newtoggle{fnblx@tempa}
\DeclareIndexNameFormat{fnblx@checkfilternames}{%
  \xifinlist{\thefield{hash}}{\fnblx@namehashes}
    {\global\toggletrue{fnblx@tempa}}
    {}}

\newcommand*{\addbfilternames}{\forcsvlist\fnblx@writenametobib}
\newcommand*{\resetfilternames}{\def\fnblx@namehashes{}}

\defbibcheck{filternames}{%
  \global\togglefalse{fnblx@tempa}
  \indexnames[fnblx@checkfilternames][1-999]{labelname}%
  \iftoggle{fnblx@tempa}
    {}
    {\skipentry}}
    
\defbibcheck{notfilternames}{%
  \global\togglefalse{fnblx@tempa}
  \indexnames[fnblx@checkfilternames][1-999]{labelname}%
  \iftoggle{fnblx@tempa}
    {\skipentry}
    {}}
\makeatother


\begin{document}
\cite{sigfridsson,worman,geer,knuth:ct:a,knuth:ct:b}

\addbfilternames{Emma Sigfridsson}
\printbibliography[check=filternames, title={Works by Emma Sigfridsson}]
\printbibliography[check=notfilternames, title={Works not by Emma Sigfridsson}]

\resetfilternames
\addbfilternames{{Knuth, Donald E.}}
\printbibliography[check=filternames, title={Works by Donald Knuth}]
\printbibliography[check=notfilternames, title={Works not by Donald Knuth}]
\end{document}

フィルタリングされた 2 つの参考文献。

ユーザーインターフェースは、上記の使用例を見れば一目瞭然です。実装に関して、上記で説明されていない質問がある場合は、https://tex.stackexchange.com/a/416416/35864事前にコメント欄で質問してください。

関連情報