使用 crossref 和 biber 时参考列表中不需要的项目

使用 crossref 和 biber 时参考列表中不需要的项目

我刚开始使用 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,这意味着如果父条目被至少两个(不同的)子条目引用,它就会添加到参考书目中。您的示例中的情况就是如此:myjournalmyarticle1和引用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}

另一种方法是告诉biblatexmyjournal只是一个数据容器,而不是可以单独出现在参考书目中的条目。这是通过添加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。crossrefxrefcrossrefxrefxdataxdata

这似乎非常合适:首先不存在导致不良行为的亲子关系xdatacrossref

但需要注意的是,@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}

所有发布的示例都产生

[Mar19] Susan Martypants。“那件事”。在:《有趣的事情杂志》(2019 年)。//[Rof20] Peter Rofessor。“那另一件事”。在:《有趣的事情杂志》(2020 年)。

答案2

Manuel Weinkauf 的评论确实是解决方案:

\usepackage[backend=biber,style=alphabetic,mincrossrefs=99]{biblatex}

我将其添加为答案,以便可以关闭该问题。

相关内容