質問

質問

質問

.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 output_format オプション

Biber は、BibTeX .bib ファイルを出力できます。.bib 出力は、特定のドキュメントとは無関係にデータソース ファイル全体を変換する場合に、ツール モードで実行できます (セクション 3.12 を参照)。また、.bbl の代わりに、ドキュメントから引用されたエントリのみを含む新しい .bib ファイルが必要な場合にも便利です。これにより、たとえば、タイプセット用に最小限の完全なパッケージを誰かに送信できます。これを行うには、最初の LaTeX 実行後に、次のように Biber を呼び出します。

biber --output_format=bibtex test.bcf 

これにより、test.tex 内のすべての引用エントリが引用順に、さまざまな ouput_* オプションに従ってフォーマットされて含まれる、test_biber.bib という新しい .bib ファイルが作成されます。

そこで私はこれを試します:

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モードでの crossref データの使用について説明していますが、これはデータソース全体を変換する場合にのみ適用されるようです。したがって、これを に適用したい場合はorig.bib、それを実行してから、上記のコマンドを使用して (これで完了した) エントリを に抽出できますprawf3_biber.bib。[少なくとも、私はできると思います。テストはしていません。]

質問の再考

しかし、生成されたファイル内のエントリが.bib相互参照エントリのデータで完了していることをどのように確認すればよいでしょうか。それなし元の.bibファイルを変換し、それなし文書内の相互参照エントリを引用しますか?

答え1

ようやくやり方がわかりました。ドキュメントによると、--output_format私が行ったようにを使用することはtool、モードを呼び出すこととは別物であるようです。したがって、crossrefそこでのデータの扱い方は、ここで問題となっているケースとは関係ないようです。しかし、

biber --help

むしろ役に立つ。特に、--output_format=bibtex toolモードでのみ意味をなすしたがって、そのオプションは明らかにこのような場合に使用することを意図しているため、ドキュメントが示唆しているように、toolここでも mode を使用するのは理にかなっているはずです。さらに、コマンド ヘルプは、比較的単純な用途では理解がはるかに簡単です。mode に関するドキュメントでは、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 が相互参照されたエントリを「解決」する方法を回避し、すべてのエントリを別々に保持する必要がある場合 (たとえば、1 つのエッセイ集から複数の記事を引用しているため、各エッセイが完全な書誌参照を提供するのではなく、単に書誌内の書籍を指すようにする必要がある場合など)、次のようにすることができます。

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。私はこれを、基本的にラップして という単純なスクリプトで実行しましbbl2nocitegrepsed

#!/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 のサンプル ファイルを使用する場合、追加する必要があるのは次の 2 つだけです。

\input{tmpfile}

;の直前に\printbibliography、または代わりに次のようにすることもできます:

\InputIfFileExists{tmpfile.tex}{\input{tmpfile}}{\relax}

そして最後に、 で終わる新しい参考文献ファイルが作成されます。このファイル_biber.bibには、この場合は 6 つのエントリが含まれているはずです。

最後に注意すべき点は、参考文献の元の外観に戻すには、行をコメント アウトして、、、のシーケンスをもう一度実行する必要がある場合があることです。たとえば\Input...、上記の cfr のファイルでは、この手法により、6 つの項目すべてが参考文献に表示されることになりますが、これは望ましくない可能性があります。latexbiberlatex

関連情報