
問題
如果文件不引用交叉引用條目本身而僅引用引用它們的條目,如何確保交叉引用條目包含在.bib
由文件產生的文件中?biber
需要明確的是,我不希望交叉引用的條目單獨出現在引用列表中,但我需要它們在文件中,.bib
以便我引用的條目可以獲得完整的數據。
背景
考慮以下文檔,該文檔使用常規的參考書目條目資料庫(此處包含為orig.bib
):
\documentclass{article}
\usepackage[backend=biber]{biblatex}
\bibliography{orig}
\usepackage{filecontents}
\begin{filecontents}{orig.bib}
@bookinbook{author-bk1,
crossref = {author-bigbk},
title = {Originally a Separate Book},
pages = {345--789}}
@suppbook{author-essays-intro,
crossref = {author-essays},
title = {Introduction},
pages = {1--8}}
@incollection{author-essay,
crossref = {editor-collection},
title = {My Essay},
pages = {8-34},
author = {Author, Bit Busy}}
@book{author-bigbk,
author = {Author, Prolific},
title = {Collected Works},
year = 1453,
publisher = {Printers 'R Us},
address = {Milky Way}}
@book{author-essays,
title = {Essays},
author = {Author, Busy},
year = 1578,
publisher = {We Print 4U},
address = {Alpha Centauri}}
@book{editor-collection,
editor = {Editor, Fair},
booktitle = {Collection of People's Thoughts},
year = 1679,
publisher = {Great Collections in Print},
address = {Earth}}
\end{filecontents}
\begin{document}
\autocites{author-bk1,author-essays-intro,author-essay}
\printbibliography
\end{document}
正如預期的那樣,這會產生以下結果:
承諾
現在假設我想產生一個.bib
僅包含該特定文件所需條目的文件。 (顯然,對於這個範例來說,這是毫無意義的,因為它orig.bib
不包含任何其他內容,但當然,通常情況並非如此。)
翻閱biber
手冊,我發現:
3.1.1 輸出格式選項
Biber 能夠輸出... BibTeX .bib 檔案。當您獨立於任何特定文件轉換整個資料來源檔案時,.bib 輸出可以在工具模式下實現(請參閱第 3.12 節)。當您想要一個僅包含文檔中引用的條目的新 .bib 文件而不是 .bbl 時,它也很有用,以便您可以將用於排版的最低限度完整的包發送給某人。為此,您需要在第一次 LaTeX 運行後,像這樣呼叫 Biber:
biber --output_format=bibtex test.bcf
這將產生一個名為 test_biber.bib 的新 .bib 文件,其中包含 test.tex 中所有引用的條目,按引用順序排列,並根據各種 ouput_* 選項進行格式化。
所以我嘗試這個:
biber --output_format=bibtex prawf3.bcf
問題
我的嘗試創建了prawf3_biber.bib
:
@BOOKINBOOK{author-bk1,
CROSSREF = {author-bigbk},
PAGES = {345--789},
TITLE = {Originally a Separate Book},
}
@SUPPBOOK{author-essays-intro,
CROSSREF = {author-essays},
PAGES = {1--8},
TITLE = {Introduction},
}
@INCOLLECTION{author-essay,
AUTHOR = {Author, Bit Busy},
CROSSREF = {editor-collection},
PAGES = {8-34},
TITLE = {My Essay},
}
這顯然不是您所希望的,因為使用此.bib
文件顯然不會產生所需的結果。那是:
\documentclass{article}
\usepackage[backend=biber]{biblatex}
\bibliography{prawf3_biber}
\begin{document}
\autocites{author-bk1,author-essays-intro,author-essay}
\printbibliography
\end{document}
biber
運行時會遇到問題:
INFO - Found 3 citekeys in bib section 0
INFO - Processing section 0
INFO - Looking for bibtex format file 'prawf3_biber.bib' for section 0
INFO - Found BibTeX data source 'prawf3_biber.bib'
WARN - I didn't find a database entry for crossref 'author-bigbk' in entry 'author-bk1' - ignoring (section 0)
WARN - I didn't find a database entry for crossref 'author-essays' in entry 'author-essays-intro' - ignoring (section 0)
WARN - I didn't find a database entry for crossref 'editor-collection' in entry 'author-essay' - ignoring (section 0)
考慮到交叉引用的條目不存在,這顯然是可以預料的。
biber
的手冊確實討論了在tool
模式下使用交叉引用數據,但這似乎僅在轉換整個資料來源時適用。因此,如果我想將其應用到orig.bib
,我可以這樣做,然後我可以prawf3_biber.bib
使用上述命令提取(現已完成)條目。 [至少,我認為我可以——我還沒有測試過。
重新審視這個問題
但是如何確保產生的.bib
文件中的條目是使用交叉引用條目中的資料完成的沒有轉換原始.bib
檔案並沒有引用文件中的交叉引用條目?
答案1
我終於想出瞭如何做到這一點。在文件中,看起來好像--output_format
我使用的方式與呼叫模式不同tool
。因此,那裡處理數據的方式crossref
似乎與這裡關注的情況無關。然而,
biber --help
是比較有幫助的。它特別指出--output_format=bibtex
tool
僅在模式下有意義。因此,如文件所示,由於該選項顯然是用於這種情況,因此tool
在這裡使用模式也必須有意義。此外,對於相對簡單的用途,命令幫助也更容易理解。儘管模式文件tool
詳細介紹瞭如何為不同的資料來源轉換配置正確的處理類型,但命令幫助更好地闡明了基本選項。
特別是,事實證明有一個選項可以滿足這裡的需求:
biber --output_format=bibtex --output_resolve prawf3.bcf
這樣做的作用是不包括結果中的交叉引用條目.bib
。它所做的是完全的將它們與交叉引用條目中的資料一起使用的條目。所結果的prawf3_biber.bib
:
@BOOKINBOOK{author-bk1,
AUTHOR = {Author, Prolific},
BOOKAUTHOR = {Author, Prolific},
BOOKTITLE = {Collected Works},
LOCATION = {Milky Way},
PAGES = {345--789},
PUBLISHER = {Printers 'R Us},
TITLE = {Originally a Separate Book},
YEAR = {1453},
}
@SUPPBOOK{author-essays-intro,
AUTHOR = {Author, Busy},
BOOKAUTHOR = {Author, Busy},
BOOKTITLE = {Essays},
LOCATION = {Alpha Centauri},
PAGES = {1--8},
PUBLISHER = {We Print 4U},
TITLE = {Introduction},
YEAR = {1578},
}
@INCOLLECTION{author-essay,
AUTHOR = {Author, Bit Busy},
BOOKTITLE = {Collection of People's Thoughts},
EDITOR = {Editor, Fair},
LOCATION = {Earth},
PAGES = {8-34},
PUBLISHER = {Great Collections in Print},
TITLE = {My Essay},
YEAR = {1679},
}
實際上,對於許多目的而言,這比單獨包含交叉引用條目更好。
答案2
如果可能的話,由於顯而易見的原因(尤其是方便),cfr 的答案是首選。
然而,如果需要避免 Biber 如何「解決」交叉引用條目並將所有條目分開 - 例如,也許因為您引用了一本論文集中的多篇文章,因此您仍然需要讓每篇文章僅指向該書在參考書目中而不是每個都提供完整的參考書目——那麼你可以這樣做:
latex basefile.tex
biber -m 1 basefile.bcf # `--mincrossref | -m 1` produces a .bbl with all the references
bbl2nocite basefile tmpfile # see below
latex basefile.tex
biber --output_format=bibtex basefile.bcf # produces `basefile_biber.bib`
為了使其發揮作用,您需要\input
從某種方式中提取內容.bbl
。我用一個無意識的bbl2nocite
腳本做到了這一點,它本質上只是結束grep
並且sed
:
#!/bin/bash
#
# Find and convert all lines in a .bbl file from
# \entry{<key>}{<entrytype>}{}
# to
# \nocite{<key>}
#
# usage: bbl2nocite inputfile outputfile
INFILE=$1
OUTFILE=$2
grep '\\entry' $INFILE.bbl | sed 's/\\entry/\\nocite/g' | sed 's/}{.*/}/' > $OUTFILE.tex
您需要進行的其他修改是.tex
:您需要\input
我tmpfile.tex
上面所說的內容。使用cfr的範例文件,您需要新增的是:
\input{tmpfile}
\printbibliography
就在;之前或者你可以這樣做:
\InputIfFileExists{tmpfile.tex}{\input{tmpfile}}{\relax}
最後,您將獲得新的參考書目文件,該文件以 結尾_biber.bib
,在本例中應包含六個條目。
最後要注意的一點是,您可能需要註解掉該\Input...
行並再次運行一系列latex
、biber
、 ,latex
才能恢復到參考書目的原始外觀。例如,在上面的 cfr 檔案中,這種技術將導致所有六個項目都出現在參考書目中,這可能是不需要的。