Вопрос

Вопрос

Вопрос

Как я могу гарантировать, что перекрестно-ссылочные записи включены в .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 

В результате будет создан новый файл .bib с именем test_biber.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В руководстве обсуждается использование данных crossref в toolрежиме, но, похоже, это применимо только при конвертации всего источника данных. Так что если бы я хотел применить это к orig.bib, я мог бы это сделать, а затем извлечь (теперь уже полные) записи в prawf3_biber.bibс помощью указанной выше команды. [По крайней мере, я предполагаю, что смогу — я не проверял.]

Возвращение к вопросу

Но как я могу гарантировать, что записи в сгенерированном .bibфайле будут заполнены данными из перекрестно-связанных записей?безконвертация исходного .bibфайла ибезссылаясь на перекрестные ссылки в документе?

решение1

Я наконец понял, как это сделать. В документации это выглядит так, как будто использование --output_formatin the way I was отличается от invoking toolmode. Так что способ crossrefобработки данных там, похоже, не имеет отношения к рассматриваемому здесь случаю. Однако,

biber --help

гораздо более полезно. В частности, там говорится, что--output_format=bibtex имеет смысл только в toolрежиме. Так что, поскольку эта опция явно предназначена для использования в таких случаях, как предполагает документация, то toolздесь тоже имеет смысл использовать mode. Более того, справка по команде также намного проще для понимания при относительно простых вариантах использования. В то время как документация по toolmode подробно описывает настройку правильных видов обработки для различных преобразований источников данных, справка по команде лучше разъясняет основные параметры.

В частности, оказывается, что есть возможность сделать именно то, что здесь требуется:

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 следует считать предпочтительным по очевидным причинам (особенно из соображений удобства).

Однако если вам необходимо избежать того, как Бибер «разрешает» перекрестные ссылки на записи, и хранить все записи отдельно — например, потому что вы цитируете несколько статей из одного сборника эссе и вам, следовательно, все равно нужно, чтобы каждое эссе просто указывало на книгу в библиографии, а не предоставляло полную библиографическую ссылку, — то вы можете сделать что-то вроде этого:

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 выше, например, этот метод приведет к тому, что в библиографии будут показаны все шесть элементов, что может быть нежелательно.

Связанный контент