这个问题与以下内容高度相关: Biblatex:仅当没有 URL 时才使用 doi
但是,我无法让它在我的示例中工作。我有以下设置。我的大多数 bib 条目包含 DOI、URL,有时还包含关键字(并非总是存在)。如果 DOI 存在且关键字不包含单词“primary”,我想删除(忽略)URL。换句话说,如果它是主要来源,则不要删除任何内容。
我设置了一个biber.conf
,因为它更简单,它看起来像这样:
<config><sourcemap>
<maps datatype="bibtex" map_overwrite="1">
<map map_overwrite="1">
<map_step map_field_source="doi" map_final="1"/>
<map_step map_field_source="keywords" map_match=".*primary.*" map_final="1"/>
<map_step map_field_set="url" map_null="1"/>
</map>
</maps>
</sourcemap></config>
令人惊讶的是,这不起作用。它的作用恰恰相反。现在,如果存在“primary”关键字,则 URL 将被删除。我发现这确实违反直觉。所以我尝试了相反的方法,并将其更改为map_match
。map_notmatch
这有效,但并非总是有效。我注意到,只有当keywords
条目存在时,URL 才会被正确删除。如果 bib 条目中根本没有keywords
字段,则不会过滤 URL(请参阅下面的 MWE)。
<map_step map_field_source="keywords" map_notmatch=".*primary.*" map_final="1"/>
现在,这对我来说没有任何意义。如果关键字包含“primary”,我们会终止,map_final
但如果根本没有keywords
字段,我们就不会终止?所以我尝试添加一个额外的映射步骤来检查是否存在keywords
,但它也不起作用。有人可以帮忙吗?
梅威瑟:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[backend=biber]{biblatex}
\addbibresource{\jobname.bib}
\usepackage{filecontents}
% kastenholz1 URL is not filtered... WHY? (maybe because no keywords field is present?)
\begin{filecontents}{\jobname.bib}
@article{kastenholz1,
author = {Kastenholz, M. A. and H{\"u}nenberger, Philippe H.},
title = {Computation of methodology\hyphen independent ionic solvation free
energies from molecular simulations},
url = {http://dx.doi.org/10.1063/1.2172593},
doi = {10.1063/1.2172593},
}
@article{kastenholz2,
author = {Kastenholz, M. A. and H{\"u}nenberger, Philippe H.},
title = {Computation of methodology\hyphen independent ionic solvation free
energies from molecular simulations},
url = {http://dx.doi.org/10.1063/1.2172593},
doi = {10.1063/1.2172593},
keywords = {secondary}
}
@article{kastenholz3,
author = {Kastenholz, M. A. and H{\"u}nenberger, Philippe H.},
title = {Computation of methodology\hyphen independent ionic solvation free
energies from molecular simulations},
url = {http://dx.doi.org/10.1063/1.2172593},
}
@article{kastenholz4,
author = {Kastenholz, M. A. and H{\"u}nenberger, Philippe H.},
title = {Computation of methodology\hyphen independent ionic solvation free
energies from molecular simulations},
url = {http://dx.doi.org/10.1063/1.2172593},
doi = {10.1063/1.2172593},
keywords = {primary}
}
\end{filecontents}
\begin{document}
\nocite{*}
\printbibliography
\end{document}
比伯配置文件
<config>
<sourcemap>
<maps datatype="bibtex" map_overwrite="1">
<map map_overwrite="1">
<map_step map_field_source="doi" map_final="1"/>
<map_step map_field_source="keywords" map_notmatch=".*primary.*" map_final="1"/>
<map_step map_field_set="url" map_null="1"/>
</map>
</maps>
</sourcemap>
</config>
输出:
答案1
biber.conf
问题中显示的第一个映射步骤的结果并不出人意料。
关键字final
表示只有满足此步骤的条件,才会执行以下步骤。因为map_step map_field_source="doi" map_final="1"
这意味着该字段doi
必须存在。因为map_step map_field_source="keywords" map_match=".*primary.*" map_final="1"
这意味着该字段的内容keywords
必须与正则表达式匹配.*primary.*
(即,如果该字段包含子字符串primary
)。因此,在我们的示例中,我们仅删除主要来源的 DOI。
notmatch
让我们更接近我们想要的结果,但不幸的notmatch
是,如果相关字段不存在,则结果为 false。这意味着我们无法在一次映射中轻松完成任务。
我建议您使用两种映射:
keyword
如果没有,第一个映射将清除 URLkeyword
如果存在但不匹配primary
,则第二个映射将清除 URL 。
在下面的 MWE 中,我使用了\DeclareSourcemap
而不是biber.conf
,因为这样可以让示例更加独立(另外,我发现\DeclareSourcemap
语法更容易使用)。如果您需要相关xml
语法的帮助,请查看该.bcf
文件。
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[backend=biber]{biblatex}
\DeclareSourcemap{
\maps[datatype = bibtex]{
\map{
\step[notfield = keywords, final]
\step[fieldsource = doi, final]
\step[fieldset = url, null]
}
\map{
\step[fieldsource = keywords, notmatch = \regexp{\bprimary\b}, final]
\step[fieldsource = doi, final]
\step[fieldset = url, null]
}
}
}
\begin{filecontents}{\jobname.bib}
@article{kastenholz1,
author = {Kastenholz, M. A. and Hünenberger, Philippe H.},
title = {URL + DOI},
url = {http://dx.doi.org/10.1063/1.2172593},
doi = {10.1063/1.2172593},
}
@article{kastenholz2,
author = {Kastenholz, M. A. and Hünenberger, Philippe H.},
title = {URL + DOI // secondary},
url = {http://dx.doi.org/10.1063/1.2172593},
doi = {10.1063/1.2172593},
keywords = {secondary},
}
@article{kastenholz3,
author = {Kastenholz, M. A. and Hünenberger, Philippe H.},
title = {URL},
url = {http://dx.doi.org/10.1063/1.2172593},
}
@article{kastenholz4,
author = {Kastenholz, M. A. and Hünenberger, Philippe H.},
title = {URL + DOI // primary},
url = {http://dx.doi.org/10.1063/1.2172593},
doi = {10.1063/1.2172593},
keywords = {primary},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}
\nocite{*}
\printbibliography
\end{document}