Latex bibliographystyle unsrturl 修改:如果有 DOI,则不显示 URL

Latex bibliographystyle unsrturl 修改:如果有 DOI,则不显示 URL

我正在使用unsrturl 书目样式除了一件事之外,它完全符合我的要求:

我希望只将 DOI 链接设为默认,如果没有 DOI 可供参考,则应显示 URL。我想我找到了必须修改的功能。不幸的是,我不知道该怎么做:

FUNCTION {output.web.refs}
{
  new.block
  inlinelinks
    'skip$ % links were inline -- don't repeat them
    { % If the generated DOI will be the same as the URL,
      % then don't print the URL (thanks to Joseph Wright for this code,
      % at http://tex.stackexchange.com/questions/5660)
      adddoiresolver
          doiurl doi empty$ { "X" } { doi } if$ * % DOI URL to be generated
          url empty$ { "Y" } { url } if$          % the URL, or "Y" if empty
          =                                       % are the strings equal?
          and
        'skip$
        { output.url }
      if$
      addeprints eprint empty$ not and
        { format.eprint output.nonnull }
        'skip$
      if$
      adddoiresolver doi empty$ not and
        { format.doi output.nonnull }
        'skip$
      if$
      addpubmedresolver pubmed empty$ not and
        { format.pubmed output.nonnull }
        'skip$
      if$
    }
  if$
}

答案1

BibTeX 风格的语言(如此小众甚至没有一个公认的名称)看起来有点奇怪,这个问题是一个很好的提示,可以进行一个简短的语言教程,重点介绍这个特定功能的工作原理(它说明了相当多的语言)。

你确实找到了正确的函数。我没有完全地当然,我理解你的要求,但无论如何,最好给出一个简洁的语言教程。完整详细信息请参阅“btxhak.pdf”文档在CTAN

背景:

  • 该语言是一种后缀堆栈语言,类似于 Postscript——函数从堆栈中弹出零个或多个项目,对其进行操作(可能产生副作用),然后将零个或多个结果推回。
  • new.block类似于产生输出的函数,在这种情况下是<newline> \newblock格式化输出的组件的开头。
  • 带有尾随的函数$是内置的,其他函数是本地定义的。

进一步来说:

  • 此文件output.web.refs中定义的函数.bst在各个点被调用,以格式化 URL/DOI/其他链接。
  • 它不期望在堆栈上找到任何东西,也不会在堆栈上留下任何东西(也就是说,这都是副作用)。
  • inlinelinks是一个常数,定义在文件顶部。在这里使用它会导致相应的数字被放入堆栈中。
  • adddoiresolver和 friends 也是常量开关,定义在文件的顶部。
  • if$从堆栈中弹出三个东西,即条件、真分支和假分支;每个分支都可以是函数调用、 中的调用序列{...}或无操作'skip$。它评估条件(0/空白为假,其他均为真),并执行相应的分支。
  • empty$如果相应的 BibTeX 字段为空,则该函数从堆栈中弹出一个内容并推送 true。因此,如果文件中的字段不存在或为空,则doi empty$计算结果为 true 。doi="...".bib
  • 该函数=弹出两个堆栈值,如果它们相等则推送 true。
  • 每次output.nonnull调用都会从堆栈中弹出一个项目(例如留下的format.doi)并打印它。因此,此函数不会在堆栈上留下任何东西。

(检查btxhak.pdf文档——我可能记错了其中几点)。

有了这些信息,您也许能够弄清楚该函数的作用,并对其进行适当的调整。如果您确实进行了调整,请确保重命名该文件并在顶部添加注释(这是标准的 LaTeX“变更控制”流程,非常引号化)。

我认为doi empty$ not and在第一行之后添加一行adddoiresolver可能会实现你的目标。

写入文件时的提示.bst

  • 创建一个test.bib涵盖所有测试用例的条目文件。
  • 创建一个test.aux包含的文件\bibstyle{myunsrturl.bst} \bibdata{test} \citation{*},然后执行bibtex test
  • 在开始更改内容之前,请确认其bibtex test工作正常且没有错误,然后进行微小更改并重新测试。
  • 到目前为止,最常见的错误是堆栈中剩余的内容太多或太少。BibTeX 的错误消息不太有用。

祝你好运。

相关内容