biblatex:动态过滤参考文献中特定作者的出版物

biblatex:动态过滤参考文献中特定作者的出版物

我正在使用 biblatex,我想从参考书目中删除那些特定人作为作者的条目(这是一篇博士论文,我自己的出版物应该放在单独的参考书目中)。

  • 可以通过在这些 bib 条目中使用特殊关键字,然后过滤掉该关键字来完成,但我不想修改 bib 条目。
  • 我能够通过创建一个类别(使用\DeclareBibliographyCategory)来管理它,然后手动将相关项目添加到其中,但是自动和动态的解决方案会更好。
  • \defbibcheck似乎正是我所寻找的功能,但我在子字符串检查代码方面遇到了问题。

作者姓名是一个姓名列表,在里面\defbibcheck可以使用 访问\thename{author}。它返回一个带有哈希、作者名字和姓氏、首字母的原始格式字符串。现在只需要进行子字符串检查。

然而

\defbibcheck{ownpublications}{
  % IfSubStr is from xstring package
  \IfSubStr{\thename{author}}{Author1}{
   \skipentry%
  }
}

打印所有参考文献,甚至包括作者中有 Author1 的参考文献。

如果我使用常量而不是 ,子字符串搜索和跳过将起作用,因此我认为这可能是扩展问题。我的 Tex/Latex 知识在涉及更多常规格式命令时非常有限,但我尝试了以下内容(以及其他带有和等\thename{author}的随机变体):\fullexpand\expandafter

\defbibcheck{ownpublications}{
  \edef\authorstring{\thename{author}}  
  \IfSubStr{\authorstring}{Author1}{
   \skipentry%
  }
}

但结果是一样的,没有跳过任何条目。

我尝试了其他各种检查,包括返回字符串的自定义宏,或使用来自实际 bib 条目的其他字段(如年份)的宏,所以问题可能不在于扩展而在于\thename

更新:一个完整​​的最小示例

\documentclass{article}

\usepackage{xstring}
\usepackage{filecontents}

\begin{filecontents}{\jobname.bib}
@book{texbook,
    author = {D.E. Knuth},
    title = {The {\TeX}book},
    publisher = {Addison Wesley},
    year = 1986
}

@Book{latexbook,
  author =       "Leslie Lamport",
  title =        "{\LaTeX} - A Document Preparation System - User's Guide and Reference Manual",
  publisher =    {Addison Wesley},  
  year =         "1985"  
}
\end{filecontents}

\usepackage[backend=biber,style=alphabetic]{biblatex}
\addbibresource{\jobname.bib}

\defbibcheck{ownpublications}{
  \edef\authorstring{\thename{author}}  
  \IfSubStr{\authorstring}{Lamport}{%
   \skipentry
  }{}
}

% document body
\begin{document}

Cite something, this should go in the references \cite{texbook}.

Full citation of other, this should appear only here, and not in the references: \fullcite{latexbook}

\printbibliography[check=ownpublications]

\end{document}

答案1

除非您需要名称中的部分字符串匹配,否则xstring没有必要。backend=biber您可以使用源映射功能根据源数据(例如文件bib)识别匹配的条目。它支持正则表达式。可以找到来自 PLK 的示例这里

使用任何 BibTeX 实现作为后端,可以bbl通过\ifdefstring(来自etoolbox) 和对文件中的数据进行匹配\indexnames。后者是一个biblatex将索引格式指令应用于名称列表中的每个项目的命令。以下是一个例子。

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[american]{babel}
\usepackage{csquotes}
\usepackage[backend=bibtex,style=alphabetic,refsection=section]{biblatex}
\bibliography{biblatex-examples}

% Variants of each could be added
\newcommand{\firstinit}{D.~E.}
\newcommand{\firstname}{Donald~E.}
\newcommand{\lastname}{Knuth}

\DeclareBibliographyCategory{byname}

\DeclareIndexNameFormat{byname}{% Test could be refined
  \ifboolexpr{ test {\ifdefstring{\lastname}{#1}}
               and ( test {\ifdefstring{\firstname}{#3}}
                     or test {\ifdefstring{\firstinit}{#4}} ) }
    {\addtocategory{byname}{\thefield{entrykey}}}
    {}}

\AtDataInput{%
  \indexnames[byname]{author}}

\begin{document}
\section{Knuth's books}
\nocite{*}
\printbibliography[type=book,category=byname,heading=none]
\section{Not Knuth's books}
\nocite{*}
\printbibliography[type=book,notcategory=byname,heading=none]
\end{document}

在此处输入图片描述

中的参数引用(#1#3等)对应\DeclareIndexNameFormat于名称的不同部分。更多详细信息请参阅手册biblatex这篇文章来自 domwass。每个 name 元素对应的数据都可以在bbl文件中找到。在上面的例子中,该字段author = {Knuth, Donald E.}的解析如下。

  \name{author}{1}{}{%
    {{}%
     {Knuth}{K.}%
     {Donald~E.}{D.~E.}%
     {}{}%
     {}{}}%
  }

相关内容