调试在书籍项目上崩溃的自定义 bib bst 文件

调试在书籍项目上崩溃的自定义 bib bst 文件

我使用 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$

使堆栈保持完整。

相关内容