bib 文件中存在冗余:如果与 doi 相同则有条件地抑制 url?

bib 文件中存在冗余:如果与 doi 相同则有条件地抑制 url?

数学科学网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 排版其中之一urldoi不是两者。不太理想:其他 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

我没有设法测试“类似”的doiundurl字段,但这里有一个使用的解决方案比布拉特克斯-urlurldate当相应条目不包含字段时,才会排版字段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和其他一些答案的情况一样。

相关内容