我有修改的我的问题基于命令第一版的问题(谢谢)。这是第二版的问题。我想我已经找到问题代码。
有问题的“bst”文件可以在以下位置找到这里,并且可以在中找到最小的“bib”文件那里。
通常,当收到错误消息'你不能弹出一个空的文字堆栈来输入5427079 在执行---行时1116文件 roblike.bst',这意味着文件'bib'中的关联项目是丢失的。
执行文件 roblike.bst 的第 1119 行时,无法弹出条目 5427079 的空文字堆栈
然而,错误信息指向一个无用的代码. 代码如下1116是ITERATE {call.type$}
。
我怎么知道缺少了什么?
第一次尝试:找到一种方法来追踪 BibTeX。
如何追踪BibTeX 的工作原理是什么?我的第一个尝试是找到一种方法来运行“bst”文件一步步从第一版的评论来看,我认为答案是不。因此,我转向用于处理文章类型的代码,它包含:
FUNCTION {article}
{ output.bibitem
format.authors "author" output.check
author format.key output % special for
new.block
format.title "title" output.check
new.block
crossref missing$
{ format.journals
format.year.vol.num.pages output
}
{ format.article.crossref output.nonnull
format.pages output
}
if$
new.block
note output
fin.entry
}
以及两个相关功能:
FUNCTION {format.article.crossref}
{ "In" % this is for gmjlike
" \cite{" * crossref * "}" *
}
FUNCTION {format.year.vol.num.pages}
{
volume empty$
{ "empty volume in " cite$ * warning$ }
{ write$
", {\bf " volume * "}" * extra.label *
mid.sentence 'output.state :=
}
if$
number empty$
'skip$
{ "(" number * ")" * *
volume empty$
{ "there's a number but no volume in " cite$ * warning$ }
'skip$
if$
}
if$
pages empty$
'skip$
{ duplicate$ empty$
{ pop$ format.pages }
{ ", " * pages n.dashify * }
if$
}
if$
year empty$
{ "empty year in " cite$ * warning$ }
{ write$
" (" year * ")" * extra.label *
mid.sentence 'output.state :=
}
if$
}
进入5427079在文件中围兜:
@article{5427079,
author = {Bioucas-Dias, Jos{\'e} M. and Figueiredo, M{\'a}rio A. T.},
journal = {IEEE Transactions on Image Processing},
number = {7},
pages = {1720-1730},
title = {Multiplicative Noise Removal Using Variable Splitting and Constrained Optimization},
volume = {19},
year = {2010}}
我认为我没有丢失该物品的任何东西。
第二次尝试:我想我知道哪里出了问题。
由于 BibTeX 无法逐步运行,我可以通过提供适当的测试用例来指导工作流程。
我添加crossref项目5427079并引用\cite{5427079} \cite{Rokach2010}
,这导致没有错误。
@article{5427079,
author = {Bioucas-Dias, Jos{\'e} M. and Figueiredo, M{\'a}rio A. T.},
journal = {IEEE Transactions on Image Processing},
number = {7},
pages = {1720-1730},
title = {Multiplicative Noise Removal Using Variable Splitting and Constrained Optimization},
volume = {19},
crossref = {Rokach2010},
year = {2010}}
Warning--can't use both author and editor fields in Rokach2010
(There was 1 warning)
Process exited normally
这意味着下面的代码是好的。
{
format.article.crossref output.nonnull
format.pages output
}
所以问题仅限于以下代码。
{
format.journals
format.year.vol.num.pages output
}
然后我消除这crossref 项目和参考这第二行。BibTeX 再次没有报告错误。
{
format.journals
% format.year.vol.num.pages output
}
所以问题在于下面这行。
format.year.vol.num.pages output
然后我恢复这第二行并引用第一行。错误再次出现。
{
% format.journals
format.year.vol.num.pages output
}
那么,我认为format.year.vol.num.pages
问题肯定出在功能上。所以,我引用里面的所有内容. 该函数是空的!
FUNCTION {format.year.vol.num.pages}
{
% volume empty$
% { "empty volume in " cite$ * warning$ }
% { write$
% ", {\bf " volume * "}" * extra.label *
% mid.sentence 'output.state :=
% }
% if$
% number empty$
% 'skip$
% { "(" number * ")" * *
% volume empty$
% { "there's a number but no volume in " cite$ * warning$ }
% 'skip$
% if$
% }
% if$
% pages empty$
% 'skip$
% { duplicate$ empty$
% { pop$ format.pages }
% { ", " * pages n.dashify * }
% if$
% }
% if$
% year empty$
% { "empty year in " cite$ * warning$ }
% { write$
% " (" year * ")" * extra.label *
% mid.sentence 'output.state :=
% }
% if$
}
问题依旧!奇怪!
You can't pop an empty literal stack for entry 5427079
while executing---line 1119 of file roblike.bst
答案1
该.bst
文件存在几个问题。
我认为我可以隔离导致您在问题中询问的特定错误的问题,但是我看到的代码并不能使我相信这是该.bst
文件的唯一问题。
由于该.bst
语言是基于堆栈的并且使用逆波兰表示法,因此事情可能会变得难以理解。
您已经确定了有问题的代码部分:函数format.journals
和format.year.vol.num.pages
。
format.journals
定义为
FUNCTION {format.journals}
{ journal empty$
{ "" }
{ journal emphasize "," * "journal" output.check }
if$
}
假设您journal
的条目中有一个@article
,这会使堆栈保持为空,因为output.check
会写出堆栈上的第一个项目然后将其删除。
不幸的是,如果日志为空,函数会将一个空字符串推送到堆栈。因此,在这种情况下,行为会大不相同。
事实上,如果您从示例条目中删除journal
,BibTeX 编译时不会出现错误消息,但输出完全是垃圾。
如果您查看 BibTeX 生成的输出(尽管存在错误),journal
您会发现它包含两个逗号,其中一个是此函数添加的,因此我们可以在此处删除逗号。这使我们能够将函数简化为以下内容
FUNCTION {format.journals}
{ journal emphasize "journal" output.check }
顺便说一下,它确实apalike.bst
做了这件事(只是没有为其定义函数)。
format.year.vol.num.pages
定义为
FUNCTION {format.year.vol.num.pages}
{
volume empty$
{ "empty volume in " cite$ * warning$ }
{ write$
", {\bf " volume * "}" * extra.label *
mid.sentence 'output.state :=
}
if$
number empty$
'skip$
{ "(" number * ")" * *
volume empty$
{ "there's a number but no volume in " cite$ * warning$ }
'skip$
if$
}
if$
pages empty$
'skip$
{ duplicate$ empty$
{ pop$ format.pages }
{ ", " * pages n.dashify * }
if$
}
if$
year empty$
{ "empty year in " cite$ * warning$ }
{ write$
" (" year * ")" * extra.label *
mid.sentence 'output.state :=
}
if$
}
再次,根据所采取的条件路径,函数可以使堆栈处于不同的状态。
如果没有volume
,函数只会发出警告,否则保留堆栈不变。
如果有volume
,函数首先从堆栈中弹出一个项目并将其写入,然后将更多内容添加到堆栈中。由于format.journals
堆栈为空,这将导致错误。
也做了类似的事情year
。
函数的设置方式意味着所有条件都应该将其内容推送到堆栈并将其连接起来,以便最后堆栈上有一个可以写出的长字符串。
此外,函数似乎extra.label
在随机位置提及,并且output.state
似乎毫无理由地设置。修复此问题和另一个逗号后,我们可以
FUNCTION {format.year.vol.num.pages}
{
volume empty$
{
"empty volume in " cite$ * warning$
""
}
{
"{\bf " volume * "}" *
}
if$
number empty$
'skip$
{ "(" number * ")" * *
volume empty$
{ "there's a number but no volume in " cite$ * warning$ }
'skip$
if$
}
if$
pages empty$
'skip$
{ duplicate$ empty$
{ pop$ format.pages }
{ ", " * pages n.dashify * }
if$
}
if$
year empty$
{ "empty year in " cite$ * warning$ }
{
" (" year * extra.label * ")" * *
}
if$
}
按照这里所示修复这两个函数可使示例再次顺利编译。但可能会有更多错误。
需要注意的是,该.bst
文件很大程度上基于apalike.bst
(所有提及的apalike
都替换为gmjlike
),这是一种作者-年份样式。当前形式的样式不提供作者-年份数据,因此只能用作数字样式。但数字样式应该计算最长的标签以在参考书目中正确缩进,而这apalike
并非必须的。这意味着这种样式会产生未对齐的参考书目。
我强烈建议您停止使用这种风格,或者立即联系该风格的开发商或经销商,告知他们这些问题。