我使用 custom-bib(makebst)创建了自己的参考书目文件,但是当我使用对一本书的引用运行它时,我得到了:
$ bibtex PhD
[...normal output]
Database file #1: PhD.bib
You can't pop an empty literal stack for entry oecd2001brc
while executing---line 1504 of file wdsphd.bst
那条线路上唯一的内容就是高层的ITERATE
通话。
该样式是通过以下选项创建的:
%% merlin.mbs (with options: `head,exlang,annote,seq-no,nm-rvvc,dt-beg,yr-par,xmth,tit-qq,qx,bt-qq,vol-bf,volp-sp,num-xser,pub-date,isbn,issn,doi,english,pp,ord,url,url-nl,nfss,,{}')
%% english.mbs (with options: `exlang,annote,seq-no,nm-rvvc,dt-beg,yr-par,xmth,tit-qq,qx,bt-qq,vol-bf,volp-sp,num-xser,pub-date,isbn,issn,doi,english,pp,ord,url,url-nl,nfss,,{}')
%% merlin.mbs (with options: `tail,exlang,annote,seq-no,nm-rvvc,dt-beg,yr-par,xmth,tit-qq,qx,bt-qq,vol-bf,volp-sp,num-xser,pub-date,isbn,issn,doi,english,pp,ord,url,url-nl,nfss,,{}')
书籍项目的代码如下:
FUNCTION {book}
{ output.bibitem
author empty$
{ format.editors "author and editor" output.check
}
{ format.authors output.nonnull
crossref missing$
{ "author and editor" editor either.or.check }
'skip$
if$
}
if$
format.btitle "title" output.check
crossref missing$
{ format.bvolume output
new.block
format.number.series output
new.sentence
format.publisher.address output
}
{
new.block
format.book.crossref output.nonnull
}
if$
format.edition output
format.isbn output
format.doi output
new.block
format.note output
fin.entry
write.url
}
这是条目:
@book{oecd2001brc,
author = {OECD},
doi = {10.1787/9789264193550-en},
isbn = {9789264186903},
publisher = {OECD Publishing},
title = {{Biological Resource Centres: Underpinning the future of life sciences and biotechnology}},
url = {http://www.oecd-ilibrary.org/science-and-technology/biological-resource-centres\_9789264193550-en},
year = {2001}
}
有没有办法从 bibtex 获得更好的堆栈跟踪?我现在所拥有的并没有真正告诉我发生了什么。如果可以简单地修复它,帮助也将不胜感激。
答案1
您在 中发现了一个错误custom-bib
,应该将其报告给其维护者。
具体来说,merlin.mbs
在函数中包含format.org.or.pub
以下代码,第 6907 行及以下行,需要按照指示进行更改
%<*pub-date&!ay>
year empty$
'skip$
{ t empty$ address empty$ and
'skip$
%<!pub-xc> { ", " * } %% removed: swap$ *
%<pub-xc> { " " * } %% removed: swap$ *
if$
year "year" bibinfo.check
%<dtbf> bolden
*
}
if$
%</pub-date&!ay>
pub-date&ay
它看起来像是我在此处粘贴的代码后面的案例的复制粘贴错误。
经过此更改,您的bst
文件应包含以下形式的函数:
FUNCTION {format.org.or.pub}
{ 't :=
""
year empty$
{ "empty year in " cite$ * warning$ }
'skip$
if$
address empty$ t empty$ and
year empty$ and
'skip$
{
add.blank "(" *
t empty$
{ address "address" bibinfo.check *
}
{ t *
address empty$
'skip$
{ ", " * address "address" bibinfo.check * }
if$
}
if$
year empty$
'skip$
{ t empty$ address empty$ and
'skip$
{
", " * %% originally: ", " swap$ * *
}
if$
year "year" bibinfo.check
*
}
if$
")" *
}
if$
}
关于文件调试bst
:有一个stack$
命令会在标准输出上显示堆栈,但它也会刷新堆栈,因此您几乎肯定会在后续执行中遇到错误。在文件的某个位置查看完整堆栈仍然很有帮助。使用以下命令bst
仅显示最顶部的堆栈项作为警告,干扰性较小
duplicate$ "On stack:'" swap$ * "'" * warning$
或前两件商品
duplicate$ "On stack:'" swap$ * "'" * warning$
swap$ duplicate$ " '" swap$ * "'" * warning$ swap$
使堆栈保持完整。