数学科学网doi
给出包含 a和 a字段的 bibtex 条目url
。通常它们看起来像
@article {some-article,
[…]
DOI = {10.1016/j.apal.2008.12.003},
URL = {http://dx.doi.org/10.1016/j.apal.2008.12.003},
}
我使用amsalpha.bst
,修改为urlbst
来处理这两个字段。当然,这意味着它们都出现在我的参考书目中,完全是多余的!
我的问题是:解决这个问题的原则方法是什么?以下是我到目前为止想到的选项:
修改 bib 文件,以便检查这种冗余,并且在这种情况下不排版 url。如果可能的话,这似乎是理想的;有人已经做过这样的事情了吗?如果没有,是否有可能由具有一点编程经验但对 .bst 文件没有任何了解的人来完成?
使用 bibstyle 排版其中之一
url
而doi
不是两者。不太理想:其他 bib 条目可能只有一个而不是两者,或者可能具有与 doi 不同的 url。在这些情况下,在 bib 文件中手动注释掉(或删除)“url”字段。这就是我目前正在做的事情。看起来有点笨拙;而且,有点违反了“形式与内容分离”:字段与内容相同是正确的,但对它们进行排版是不合适的。
相关问题:如何在参考书目中获取 DOI 链接
答案1
所做的修改urlbst
非常明显,因此您想要的更改实际上并不太难(按照 BibTeX 标准)。如果您打开文件.bst
,则需要搜索名为 的函数output.web.refs
。需要修改才能读取
FUNCTION {output.web.refs}
{
new.block
output.url
addeprints eprint empty$ not and
{ format.eprint output.nonnull }
'skip$
if$
adddoiresolver doi empty$ not and
{
url empty$
{ format.doi output.nonnull }
{
doiurl doi * url =
'skip$
{ format.doi output.nonnull }
if$
}
if$
}
'skip$
if$
addpubmedresolver pubmed empty$ not and
{ format.pubmed output.nonnull }
'skip$
if$
}
这里发生的一切是,我添加了一个针对空 URL 的测试,并添加了第二个针对添加前缀后 URL 与 DOI 相同的测试。
答案2
最初的问题是关于标准的 BibTeX 样式,但受到 lockstep 的启发,我制定了一个biblatex
解决方案作为我其他答案的补充。这里的方法是将适当的前缀添加到原始 DOI,然后测试它是否与 URL 等效。需要处理前缀,\detokenize
因为这是 URL 字段的格式。
\documentclass{article}
\usepackage{biblatex}
\renewbibmacro*{doi+eprint+url}{%
\iftoggle{bbx:doi}
{%
\iffieldundef{doi}
{}
{%
\begingroup
\edef\URLorDOI{%
\detokenize{http://dx.doi.org/}%
\thefield{doi}%
}%
\iffieldequals{url}{\URLorDOI}
{\endgroup}
{%
\endgroup
\printfield{doi}%
}%
}%
}
{}%
\newunit\newblock
\iftoggle{bbx:eprint}
{\usebibmacro{eprint}}
{}%
\newunit\newblock
\iftoggle{bbx:url}
{\usebibmacro{url+urldate}}
{}}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@misc{A01,
author = {Author, A.},
year = {2001},
title = {Alpha},
doi = {10.1016/j.apal.2008.12.003},
}
@misc{B02,
author = {Buthor, B.},
year = {2002},
title = {Bravo},
url = {http://dx.doi.org/10.1016/j.apal.2008.12.003},
urldate = {2010-11-22},
}
@misc{C03,
author = {Cuthor, C.},
year = {2003},
title = {Charlie},
doi = {10.1016/j.apal.2008.12.003},
url = {http://dx.doi.org/10.1016/j.apal.2008.12.003},
urldate = {2010-11-22},
}
\end{filecontents}
\bibliography{\jobname}
\begin{document}
\nocite{*}
\printbibliography
\end{document}
答案3
我没有设法测试“类似”的doi
undurl
字段,但这里有一个使用的解决方案比布拉特克斯-url
仅urldate
当相应条目不包含字段时,才会排版字段doi
。
\documentclass{article}
\usepackage{biblatex}
\DeclareFieldFormat{url}{%
\iffieldundef{doi}{%
\mkbibacro{URL}\addcolon\space\url{#1}%
}{%
}%
}
\DeclareFieldFormat{urldate}{%
\iffieldundef{doi}{%
\mkbibparens{\bibstring{urlseen}\space#1}%
}{%
}%
}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@misc{A01,
author = {Author, A.},
year = {2001},
title = {Alpha},
doi = {10.1016/j.apal.2008.12.003},
}
@misc{B02,
author = {Buthor, B.},
year = {2002},
title = {Bravo},
url = {http://dx.doi.org/10.1016/j.apal.2008.12.003},
urldate = {2010-11-22},
}
@misc{C03,
author = {Cuthor, C.},
year = {2003},
title = {Charlie},
doi = {10.1016/j.apal.2008.12.003},
url = {http://dx.doi.org/10.1016/j.apal.2008.12.003},
urldate = {2010-11-22},
}
\end{filecontents}
\bibliography{\jobname}
\begin{document}
\nocite{*}
\printbibliography
\end{document}
答案4
当使用 BibLaTeX 时,这可以在数据级别非常轻松地完成,而无需摆弄输出模板甚至更改 .bib 文件。
只需使用\iffieldundef{field name}{undefined case}{defined case}
宏:
\AtEveryBibitem{%
\iffieldundef{url}{}{\clearfield{doi}}%
}
请注意,这不会如果 DOI 和 URL 相同按照 OP 的建议进行测试,但只是更简单的仅在没有 URL 时显示 DOI和其他一些答案的情况一样。