我想创建一个层次结构,用于在 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:
答案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
,如果存在则插入。和 也是如此isbn
。issn
如果这些字段都不存在,则整个[...]
块将被忽略。
尽管使用 Bibulous 代替 Biblatex,这应该会产生所要求的行为。