在 BiBTeX 中为 doi、url、isbn 和 issn 定义 bibstyle 输出层次结构

在 BiBTeX 中为 doi、url、isbn 和 issn 定义 bibstyle 输出层次结构

我想创建一个层次结构,用于在 BiBTeX 中打印 doi、url、isbn 和 issn。类似于以下内容(此处“真实”表示 bib 字段可用/有效):

if "doi" real
   print doi
else
  if "url" real
     print url
  else
    if "isbn" real
       print isbn
    else
      if "issn" real
         print issn
      end
    end
  end
end

因此“doi”是需要打印的最重要的字段!

我看过bib 文件中存在冗余:如果与 doi 相同则有条件地抑制 url?Biblatex:仅当未定义 DOI 时才打印 ISBN得到一些想法,但没有运气。

梅威瑟:tex 文件

\documentclass{article}
\usepackage{natbib}
\begin{document}
\bibliographystyle{testplainnat}
\citep{test1,test2,test3,test4,test5,test6,test7,test8,test9,test10}
\bibliography{testbib}
\end{document}

围兜:BIB 文件

@Article{test1,
  author =   {Author, A},
  title =    {Title A},
  journal =    {journal},
  year =     2001,
  doi =      {no.},
  note =     {(doi only!)}
}

@Article{test2,
  author =   {Author, B},
  title =    {Title B},
  journal =    {journal},
  year =     2002,
  url =      {no.},
  note =     {(url only!)}
}

@Article{test3,
  author =   {Author, C},
  title =    {Title C},
  journal =    {journal},
  year =     2003,
  isbn =     {no.},
  note =     {(isbn only!)}
}

@Article{test4,
  author =   {Author, D},
  title =    {Title D},
  journal =    {journal},
  year =     2004,
  issn =     {no.},
  note =     {(issn only!)}
}

@Article{test5,
  author =   {Author, E},
  title =    {Title E},
  journal =    {journal},
  year =     2005,
  url =      {no.},
  doi =      {no.},
  note =     {(doi and url)}
}

@Article{test6,
  author =   {Author, F},
  title =    {Title F},
  journal =    {journal},
  year =     2006,
  isbn =     {no.},
  doi =      {no.},
  url =      {no.},
  note =     {(doi, url and isbn)}
}

@Article{test7,
  author =   {Author, G},
  title =    {Title G},
  journal =    {journal},
  year =     2007,
  isbn =     {no.},
  issn =     {no.},
  doi =      {no.},
  url =      {no.},
  note =     {(doi, url, isbn and issn)}
}

@Article{test8,
  author =   {Author, H},
  title =    {Title H},
  journal =    {journal},
  year =     2008,
  isbn =     {no.},
  doi =      {no.},
  note =     {(doi and isbn)}
}

@Article{test9,
  author =   {Author, I},
  title =    {Title I},
  journal =    {journal},
  year =     2009,
  issn =     {no.},
  doi =      {no.},
  note =     {(doi and issn)}
}

@Article{test10,
  author =   {Author, J},
  title =    {Title J},
  journal =    {journal},
  year =     2010,
  isbn =     {no.},
  url =      {no.},
  note =     {(url and isbn)}
}

bst:

测试-plainnat-bst 文件

答案1

如果您对编辑 BST 文件不太了解,也许声明不同的发布类型是最不容易出错的方法。在testplainnat.bst-file 的最后,您有针对每个文档类型的函数,例如:

FUNCTION {article}
{ output.bibitem
  format.authors "author" output.check
  author format.key output
  new.block
  format.title "title" output.check
  new.block
  crossref missing$
    { journal emphasize "journal" output.check
      eid empty$
        { format.vol.num.pages output }
        { format.vol.num.eid output }
      if$
      format.date "year" output.check
    }
    { format.article.crossref output.nonnull
      eid empty$
        { format.pages output }
        { format.eid output }
      if$
    }
  if$
  format.isbn output
  format.issn output
  format.doi output
  format.url output
  new.block
  note output
  fin.entry
}

有趣的是

  format.isbn output
  format.issn output
  format.doi output
  format.url output
  new.block

“使用 doi 或 url 或 issn” 的 IF-ELSE 语句如下所示:

  format.isbn output
  format.doi empty$
  {
    format.url output empty$
    {
      format.issn output empty$
    }
    {
      format.url output
    }
  }
  {
    format.doi output
  }
  if$  
  new.block

我想你从这个例子中已经明白了。基本上就是

<value to test> empty$
{<run this cmd if empty>}
{<run this cmd if not empty>}

和一些嵌套。

当然,您需要对每个文档类型(如FUNCTION {book}等)重复此操作,但这比更改格式* 函数本身更容易处理。

(这来自一个认为更改 bst 文件很容易但在适应 biblatex 风格方面遇到实际问题的人)。

答案2

最近开发的吸水工程直接处理此问题。对于文件中的文章类型条目*.bib,示例模板定义如下:

article = <au>, \enquote{<title>,} <journal>, <volume>: [<startpage>--<endpage>|<startpage>|<eid>|] (<year>).[ <doi>| <url>| <isbn>| <issn>]

模板末尾有一个“选项块”,其作用是,如果doi在数据库条目中找到一个字段,则将其插入此处。如果找不到,则查找字段url,如果存在则插入。和 也是如此isbnissn如果这些字段都不存在,则整个[...]块将被忽略。

尽管使用 Bibulous 代替 Biblatex,这应该会产生所要求的行为。

相关内容