向 \declaresourcemap 添加参数

向 \declaresourcemap 添加参数

这是我用来列出参考文献的 MWE:

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\usepackage[style=alphabetic, maxnames=6, natbib=true, backend=biber]{biblatex}
\addbibresource{biblatex-examples.bib}

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map{
      \step[fieldsource=author,
            match=Knuth,
            final]
       \step[fieldset=keywords, fieldvalue=knuth]
    }
    \map{
      \step[fieldsource=author,
            match=Sigfridsson,
            final]
      \step[fieldset=keywords, fieldvalue=sigfridsson]
    }
  }
}

\begin{document}
\nocite{sigfridsson,knuth:ct:a,companion,worman,knuth:ct:c}
\printbibliography[keyword=knuth]
\printbibliography[keyword=sigfridsson]
\printbibliography[notkeyword=knuth,notkeyword=sigfridsson]
\end{document}

我尝试在文档开始之前创建变量,以便我可以替换我的书目列表中文档中需要的任何作者。在理想情况下,我希望它看起来像这样:

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\usepackage[style=alphabetic, maxnames=6, natbib=true, backend=biber]{biblatex}
\addbibresource{biblatex-examples.bib}

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map{
      \step[fieldsource=author,
            match= x,
            final]
      \step[fieldset=keywords, fieldvalue= x]
    }
  }
}

\begin{document}
\nocite{*}
\printbibliography[keyword=x=anyauthorspecified]
\printbibliography[notkeyword=x=anyauthorspecified]
\end{document}

我希望这样做,这样我就可以重复使用,\declaresourcemap而不必在需要时为每个特定作者制作地图。我只需使用\printbibliography并指定我想要的作者

答案1

这个想法来自biblatex:动态过滤参考文献中特定作者的出版物可扩展

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[british]{babel}
\usepackage{csquotes}
\usepackage[backend=biber, style=alphabetic]{biblatex}
\bibliography{biblatex-examples}

\newcommand*{\generateauthorcategory}[3]{%
  \DeclareBibliographyCategory{by#1}%
  \DeclareIndexNameFormat{cat#1}{%
    \ifboolexpr{test {\ifdefstring{\namepartfamily}{#2}}
                and test {\ifdefstring{\namepartgiven}{#3}}}
      {\addtocategory{by#1}{\thefield{entrykey}}}
      {}}%
  \AtDataInput{\indexnames[cat#1][1-999]{author}}}

\generateauthorcategory{sigfridsson}{Sigfridsson}{Emma}
\generateauthorcategory{knuth}{Knuth}{Donald\bibnamedelima E.}
\generateauthorcategory{glashow}{Glashow}{Sheldon}

\defbibcheck{yr1986}{%
  \iffieldint{year}
    {\ifnumequal{\thefield{year}}{1986}
       {}
       {\skipentry}}
    {\skipentry}}

\defbibcheck{yr1984}{%
  \iffieldint{year}
    {\ifnumequal{\thefield{year}}{1984}
       {}
       {\skipentry}}
    {\skipentry}}

\begin{document}
\nocite{knuth:ct:a,knuth:ct:b,sigfridsson,glashow,cicero,worman}
\printbibliography[category=bysigfridsson, title=Sigfridsson]
\printbibliography[category=byknuth, check=yr1984, title=Knuth 1984]
\printbibliography[category=byknuth, check=yr1986, title=Knuth 1986]
\printbibliography[category=byglashow, title=Glashow]
\end{document}

该命令\generateauthorcategory{<catname>}{<family>}{<given>}生成一个类别by<catname>并添加作者姓氏等于<family>且名字等于的所有条目<given>。请注意,名字需要按照 的格式给出.bbl,这意味着它可能必须包含一些内部宏(\bibnamedelima\bibnamedelimd、...)(参见上面的 Knuth)。第一个参数<catname>必须是唯一的,并且它应该只包含 ASCII 字符(我更喜欢将其保持小写),它仅在内部使用并作为 的标识符by<catname>,因此它不需要与<family><given>参数有任何关系 - 但当然应该避免混淆。

您可以通过筛选类别来获取某个作者的所有条目by<catname>

要进行过滤,year您可以添加一个简单的 bibcheck

\defbibcheck{yr1986}{%
  \iffieldint{year}
    {\ifnumequal{\thefield{year}}{1986}
       {}
       {\skipentry}}
    {\skipentry}}

添加check=yr1986\printbibliography仅显示 1986 年以后的条目。使用\ifnumgreater和,\ifnumless您还可以检查年份范围。

相关内容