我剛開始使用 biber / biblatex,並且無法理解它的一些行為。我無法想像我是第一個遇到這個問題的人,但我找不到重複的問題。
我引用了同一期刊上發表的幾篇文章。為了確保期刊資訊在整個引文中保持一致,我製作了一個單獨的參考文獻條目,僅包含期刊資訊。然後,我從文章條目中交叉引用該條目。範例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特殊領域,p。 31)
此欄位繼承一個或多個
@xdata
條目的資料。從概念上講,字段與andxdata
相關:建立邏輯上的父/子關係並繼承資料;建立邏輯父/子關係,無需繼承資料;繼承資料而不建立關係。的值可以是單一輸入鍵或單獨的鍵列表。詳細資訊請參閱第 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}
我將其添加為答案,以便可以關閉問題。