我使用 biblatex,并希望我的参考书目仅包含 DOI 字段(只要有 DOI 信息可用)。这涉及两件事:
每当存在 DOI 字段时,Biblatex 都必须抑制 URL 字段。这可以通过序言中的以下代码来实现。(这是 Joseph Wright 的答案的简化版本这里)。
\renewbibmacro*{doi+eprint+url}{% \iftoggle{bbx:doi} {\printfield{doi}} {}% \newunit\newblock \iftoggle{bbx:eprint} {\usebibmacro{eprint}} {}% \newunit\newblock \iftoggle{bbx:url} {% \iffieldundef{doi} {\usebibmacro{url+urldate}} {% \clearfield{url}% }% } {}}
因此,每次 bibtex 文件中出现 DOI 字段时,URL 字段就会被清除。
我的 bibtex 文件从以下位置导出佐特罗。不幸的是,Zotero 尚未为所有条目类型提供 DOI 字段,因此我经常将 DOI 信息输入到 URL 字段中,例如http://dx.doi.org/10.1145/1364782.1364794。所以我的问题是:是否可以让 biblatex 从 URL 字段中获取 DOI 信息,将其存储到 DOI 字段中,然后仅将其写入参考书目?
我猜必须修改
\usebibmacro{url+urldate}
条件:首先,检查 URL 字段是否包含“dx.doi.org/”(理想情况下应该允许使用 http 和 https)。如果包含,则取出“dx.doi.org/”后面的所有内容,将其复制到 DOI 字段(带有\restorefield
?)中,然后\printfield{doi}
。如果不包含,即如果它不是 DOI-URL,则\usebibmacro{url+urldate}
。
那可能吗?
答案1
如果biber
用作后端,则可以使用该\DeclareSourcemap
设施来更改字段。
对于当前的情况,解决方案是使用以下代码重新映射url
具有初始部分的条目:dx.doi.org
\DeclareSourcemap{
\maps[datatype=bibtex]{
\map{
\step[ % copies url to doi field if it starts with http://dx.doi.org/
fieldsource=url,
match=\regexp{http://dx.doi.org/(.+)},
fieldtarget=doi,
]
\step[ % removes http://dx.doi.org/ string from doi field
fieldsource=doi,
match=\regexp{http://dx.doi.org/(.+)},
replace=\regexp{$1}
]
}
\map{ % removes url + urldate field from all entries that have a doi field
\step[fieldsource=doi, final]
\step[fieldset=url, null]
\step[fieldset=urldate, null]
}
}
}
里面的实际值\regexp
是可以调整的。
第一步,我们doi
为每个url
与正则表达式匹配的条目创建一个字段,novel 字段具有该字段的值url
。第二步,我们删除 doi“命名空间”。
在第二个\map
序列中,如果存在 doi 字段,则清除 url 和 urldate 字段,以模仿原始问题第一部分中的行为。