我刚开始使用 biber / biblatex,无法理解它的某些行为。我无法想象我是第一个遇到此问题的人,但我找不到重复的问题。
我引用了同一期刊上发表的几篇文章。为了确保期刊信息在整个引用中保持一致,我创建了一个单独的 bib 条目,仅包含期刊信息。然后,我将该条目与文章条目进行交叉引用。示例文件references.bib
:
@article{myjournal,
journaltitle={Journal of Interesting Things},
publisher={Someone}
}
@article{myarticle1,
crossref={myjournal},
title={That thing},
author={Martypants, Susan},
year={2019},
}
@article{myarticle2,
crossref={myjournal},
title={That other thing},
author={Rofessor, Peter},
year={2020}
}
现在,当我在文档中引用myarticle1
和时,参考文献列表中会多出一行没有名称的内容,只包含期刊信息:myarticle2
产生此输出的最小工作示例是:
\documentclass{article}
\usepackage[backend=biber,style=alphabetic]{biblatex}
\addbibresource{references.bib}
\begin{document}
\cite{myarticle1,myarticle2}
\printbibliography{}
\end{document}
有趣的是,如果我仅引用两篇文章中的一篇,则不会出现“空”期刊项目。(即,用\cite{myarticle1,myarticle2}
结果替换\cite{myarticle1}
参考列表中的一项而不是三项。)
解决方法:我可以将期刊信息复制粘贴到每篇论文中,然后删除交叉引用。但是,如果我以后想更改期刊的某些信息(例如,添加出版商的地址),我必须浏览所有条目。或者,我可以手动从文件中删除条目.bbl
,这也会得到所需的输出。这两种解决方案都让我不太满意。
问题:构造结构的首选方式是什么.bib
,以便(a)我不必输入和维护重复的日记信息,以及(b)除非明确引用,否则日记条目不会作为参考文献列表中的单独项目出现?
感谢您的帮助!
答案1
该crossref
字段不仅仅涉及数据继承。它还涉及在条目之间建立某种父子关系(参见该xref
字段,它只对这种父子关系进行建模,而不对数据继承进行建模)。
这种父子关系的一个特点是,如果父条目被一定数量的子条目引用(即使没有明确引用),它就会自动添加到参考书目中。可以使用选项控制子引用的确切数量。mincrossrefs
其默认值为2
,这意味着如果父条目被至少两个(不同的)子条目引用,它就会添加到参考书目中。您的示例中的情况就是如此:myjournal
被myarticle1
和引用myarticle2
。
解决这个问题的一种方法是将其设置mincrossrefs
为更高的值(可能高得不合理),例如999
例如曼努埃尔·温考夫在里面评论。
\documentclass{article}
\usepackage[backend=biber, style=alphabetic, mincrossrefs=999]{biblatex}
\begin{filecontents}{\jobname.bib}
@article{myjournal,
journaltitle = {Journal of Interesting Things},
publisher = {Someone},
}
@article{myarticle1,
crossref = {myjournal},
title = {That thing},
author = {Martypants, Susan},
year = {2019},
}
@article{myarticle2,
crossref = {myjournal},
title = {That other thing},
author = {Rofessor, Peter},
year = {2020},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}
\autocite{myarticle1,myarticle2}
\printbibliography
\end{document}
另一种方法是告诉biblatex
它myjournal
只是一个数据容器,而不是可以单独出现在参考书目中的条目。这是通过添加options = {dataonly},
到条目来实现的。这与蝉的的建议options={skipbib=true},
,但稍微严格一些(因为它还可以避免创建标签,公平地说,这在这里无论如何都会失败)。myjournal
但是,当明确引用时,此解决方案甚至不会出现在参考书目中。
\documentclass{article}
\usepackage[backend=biber, style=alphabetic]{biblatex}
\begin{filecontents}{\jobname.bib}
@article{myjournal,
journaltitle = {Journal of Interesting Things},
publisher = {Someone},
options = {dataonly},
}
@article{myarticle1,
crossref = {myjournal},
title = {That thing},
author = {Martypants, Susan},
year = {2019},
}
@article{myarticle2,
crossref = {myjournal},
title = {That other thing},
author = {Rofessor, Peter},
year = {2020},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}
\autocite{myarticle1,myarticle2}
\printbibliography
\end{document}
如果您不想建立这种额外的父子关系,最好选择其他工具来完成这项工作:蝉建议@xdata
容器评论。这biblatex
解释xdata
如下(§2.2.3特殊字段,第 31 页)
此字段从一个或多个
@xdata
条目继承数据。从概念上讲,该字段与和xdata
相关:建立逻辑父/子关系并继承数据;建立逻辑父/子关系而不继承数据;继承数据而不建立关系。 的值可以是单个条目键或单独的键列表。有关更多详细信息,请参阅 §3.13.6。crossref
xref
crossref
xref
xdata
xdata
这似乎非常合适:首先不存在导致不良行为的亲子关系xdata
。crossref
但需要注意的是,@xdata
条目本身不能出现在参考书目中,也不能被引用。此外, 的字段继承@crossref
可以考虑父条目和子条目的条目类型,并且可以设置规则,例如父title
条目的字段@collection
可以继承booktitle
给@incollection
子条目。这对于 来说是不可能的(并且没有意义)@xdata
。
\documentclass{article}
\usepackage[backend=biber, style=alphabetic]{biblatex}
\begin{filecontents}{\jobname.bib}
@xdata{myjournal,
journaltitle = {Journal of Interesting Things},
publisher = {Someone},
}
@article{myarticle1,
xdata = {myjournal},
title = {That thing},
author = {Martypants, Susan},
year = {2019},
}
@article{myarticle2,
xdata = {myjournal},
title = {That other thing},
author = {Rofessor, Peter},
year = {2020},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}
\autocite{myarticle1,myarticle2}
\printbibliography
\end{document}
在此特定情况下,所有标准样式都将忽略spublisher
的字段@article
,因此您仅继承一个字段,即journal(title)
。单字段继承也可以用@string
条目建模。(但如果您想一次继承多个字段,那当然不是一个选择。)
\documentclass{article}
\usepackage[backend=biber, style=alphabetic]{biblatex}
\begin{filecontents}{\jobname.bib}
@string{myjournal = {Journal of Interesting Things}}
@article{myarticle1,
journal = myjournal,
title = {That thing},
author = {Martypants, Susan},
year = {2019},
}
@article{myarticle2,
journal = myjournal,
title = {That other thing},
author = {Rofessor, Peter},
year = {2020},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}
\autocite{myarticle1,myarticle2}
\printbibliography
\end{document}
所有发布的示例都产生
答案2
Manuel Weinkauf 的评论确实是解决方案:
\usepackage[backend=biber,style=alphabetic,mincrossrefs=99]{biblatex}
我将其添加为答案,以便可以关闭该问题。