我正在尝试学习如何biblatex
使用;定制参考书目\defbibenvironment
,特别是尝试使参考书目尽可能紧凑。
我感兴趣的一个具体调整是删除该eprint
字段,但仅针对那些也在期刊中发布的条目,即那些具有非空字段的条目journaltitle
。
有没有办法\clearfield
在第四个参数中使用\defbibenvironment
另一个字段的值(或存在)作为条件?
附言:我\defbinenvironment
之所以建议这样做,是因为过去当我在一份文档中拥有多个不同风格的参考书目时,这种方法对我很有用。\defbinenvironment
只要答案允许这样做,我很乐意不使用这种方法。
答案1
您可以使用 测试字段是否存在\iffieldundef{<field name>}{<true>}{<false>}
。请记住知道三种不同类型的字段:普通字段、列表和名称列表。分别使用、和biblatex
进行测试。您可以在文档中找到每个字段的“类型” 。\iffieldundef
\iflistundef
\ifnameundef
biblatex
通常人们不会删除字段\defbibenvironment
(尽管这在技术上是可行的),更常见的习惯用法是
\AtEveryBibitem{%
\iffieldundef{journaltitle}
{}
{\clearfield{eprint}}%
}
请注意\AtEveryBibitem
仅适用于参考书目。如果您还需要影响引文(包括),您也\fullcite
需要复制代码。\AtEveryCitekey
如果要删除某个字段,通常使用 Biber sourcemap 而不是 会更优雅\clearfield
。这会在输入阶段清除该字段,这意味着该字段被完全忽略,而不仅仅是在游戏后期才“被遗忘”。
对于您的用例,我会假设一个条目有一个非空值,journaltitle
当且仅当它是一个,@article
这样我们就可以去
\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage{csquotes}
\usepackage[backend=biber, style=authoryear]{biblatex}
\DeclareSourcemap{
\maps[datatype = bibtex]{
\map{
\pertype{article}
\step[fieldset=eprint, null]
}
}
}
\addbibresource{biblatex-examples.bib}
\begin{document}
Lorem \autocite{sigfridsson,baez/article,baez/online,wassenberg}
\printbibliography
\end{document}
如果您有@article
不带journal
/ 的s journaltitle
(我个人认为这是错误的:@article
只有当文章实际发表在期刊上时才是正确的选择),那么您也可以明确测试journal
/ journaltitle
(回想一下,前者是后者的遗留别名,我们需要先解决)
\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage{csquotes}
\usepackage[backend=biber, style=authoryear]{biblatex}
\DeclareSourcemap{
\maps[datatype = bibtex]{
\map{
\step[fieldsource=journal, fieldtarget=journaltitle]
\step[fieldsource=journaltitle, final]
\step[fieldset=eprint, null]
}
}
}
\addbibresource{biblatex-examples.bib}
\begin{document}
Lorem \autocite{sigfridsson,baez/article,baez/online,wassenberg}
\printbibliography
\end{document}