Bibtex:如果存在 DOI 并且关键字不存在,则删除 URL

Bibtex:如果存在 DOI 并且关键字不存在,则删除 URL

这个问题与以下内容高度相关: 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_matchmap_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如果没有,第一个映射将清除 URL
  • keyword如果存在但不匹配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}

[1] MA Kastenholz 和 Philippe H. Hünenberger。 “网址”。在: ()。 网址:http://dx.doi.org/10.1063/1.2172593。 [2] MA Kastenholz 和 Philippe H. Hünenberger。 “URL + DOI”。在: ()。 doi:10.1063/1.2172593。 [3] MA Kastenholz 和 Philippe H. Hünenberger。 “URL + DOI // primary”。在:()。 doi: 10.1063/1.2172593。网址:http://dx.doi.org/10.1063/1.2172593。 [4] MA Kastenholz 和 Philippe H. Hünenberger。 “URL + DOI // 次要”。在: ()。 doi: 10.1063/1.2172593。

相关内容