저자별로 참고문헌을 필터링하시겠습니까?

저자별로 참고문헌을 필터링하시겠습니까?

여러 사람이 사용할 수 있는 출판물 목록용 템플릿을 만들고 싶습니다. 아이디어는 모든 출판물을 포함하는 하나의 bib 파일이 있다는 것입니다. 동료 검토 항목은 키워드 = pr로 표시됩니다. 그런 다음 모든 사람의 출판 목록을 하나의 파일로 병합하기 위해 모든 사람이 자신의 장 파일을 통합할 수 있는 scriptreport 유형의 마스터 파일이 있습니다. 챕터 파일은 모든 것의 핵심이므로 재사용이 가능해야 합니다. bib 파일에서 각 저자에 대한 항목을 필터링하고 두 개의 목록(동료 검토 및 비동료 검토)으로 인쇄해야 합니다. 내 문제는 이 경우 작성자별로 필터링하는 방법을 실제로 모른다는 것입니다. 두 파일의 대략적인 코드는 다음과 같습니다.

주인:

\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

이름으로 필터링하는 것은 그리 쉬운 일이 아닙니다. 한 가지 방법은 소스 맵과 정규 표현식을 사용하여 이름을 일치시키고 키워드를 추가하는 것입니다(예:biblatex: 참고문헌에서 특정 저자의 출판물을 분리합니다.).

문자열/매크로 비교를 사용하는 또 다른 방법은 다음과 같습니다.biblatex: 참고문헌에서 특정 저자의 출판물을 동적으로 필터링합니다.. 비슷하다biblatex를 사용하여 특정 저자를 굵게 표시문자열/매크로 비교 대신 해시를 사용하는 것을 선호합니다.

다음은 내 답변을 수정한 것입니다.https://tex.stackexchange.com/a/416416/35864굵은 이름부터 이름 필터링까지. 대부분의 코드는 간단히 복사할 수 있으며, 새로운 점은 임의의 조건에 따라 참고문헌 항목을 필터링하기 위해 두 개의 bibcheck를 정의하는 것입니다.

\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, 댓글로 미리 문의해주세요.

관련 정보