
Вопрос
Как я могу гарантировать, что перекрестно-ссылочные записи включены в .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_format
in the way I was отличается от invoking tool
mode. Так что способ crossref
обработки данных там, похоже, не имеет отношения к рассматриваемому здесь случаю. Однако,
biber --help
гораздо более полезно. В частности, там говорится, что--output_format=bibtex
имеет смысл только в tool
режиме. Так что, поскольку эта опция явно предназначена для использования в таких случаях, как предполагает документация, то tool
здесь тоже имеет смысл использовать mode. Более того, справка по команде также намного проще для понимания при относительно простых вариантах использования. В то время как документация по tool
mode подробно описывает настройку правильных видов обработки для различных преобразований источников данных, справка по команде лучше разъясняет основные параметры.
В частности, оказывается, что есть возможность сделать именно то, что здесь требуется:
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 выше, например, этот метод приведет к тому, что в библиографии будут показаны все шесть элементов, что может быть нежелательно.