我正在使用 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.}%
{}{}%
{}{}}%
}