我正在使用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 的错误消息不太有用。
祝你好运。