
A questão
Como posso garantir que as entradas com referência cruzada sejam incluídas em um .bib
arquivo gerado por biber
para um documento caso o documento não cite as próprias entradas com referência cruzada, mas apenas as entradas referentes a elas? Para ser claro, não quero que as entradas com referências cruzadas apareçam separadamente na lista de referências, mas preciso delas no .bib
arquivo para que os dados completos estejam disponíveis para as entradas que cito.
Fundo
Considere o seguinte documento que utiliza um banco de dados regular de entradas bibliográficas (incluídas aqui como 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}
Como esperado, isso produz o seguinte:
A promessa
Agora suponha que eu queira gerar um .bib
arquivo contendo apenas as entradas necessárias para este documento específico. (Obviamente, isso seria inútil com este exemplo, pois orig.bib
não contém mais nada, mas normalmente não é o caso, é claro.)
Voltando ao biber
manual de, encontro isto:
3.1.1 A opção output_format
Biber é capaz de gerar arquivos ... BibTeX .bib. A saída .bib é possível no modo ferramenta, quando você está convertendo um arquivo de fonte de dados inteiro independentemente de qualquer documento específico (consulte a seção 3.12). Também é útil quando você deseja, em vez de um .bbl, um novo arquivo .bib contendo apenas as entradas citadas de um documento para que você possa, por exemplo, enviar um pacote minimamente completo para composição tipográfica para alguém. Para fazer isso, após a primeira execução do LaTeX, você chamaria Biber assim:
biber --output_format=bibtex test.bcf
Isso resultaria em um novo arquivo .bib chamado test_biber.bib contendo todas as entradas citadas em test.tex, em ordem de citação, formatadas de acordo com as várias opções ouput_*.
Então eu tento isso:
biber --output_format=bibtex prawf3.bcf
O problema
Minha tentativa cria 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},
}
o que obviamente não é o que você esperaria, pois o uso deste .bib
arquivo claramente não produzirá os resultados necessários. Aquilo é:
\documentclass{article}
\usepackage[backend=biber]{biblatex}
\bibliography{prawf3_biber}
\begin{document}
\autocites{author-bk1,author-essays-intro,author-essay}
\printbibliography
\end{document}
encontrará problemas quando biber
for executado:
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)
o que obviamente é de se esperar, visto que as entradas com referências cruzadas não estão lá.
biber
O manual do discute o uso de dados crossref quando em tool
modo, mas isso parece se aplicar apenas ao converter uma fonte de dados inteira. Então, se eu quisesse aplicar isso orig.bib
, poderia fazer isso e então extrair as entradas (agora completas) prawf3_biber.bib
usando o comando acima. [Pelo menos, presumo que sim - não testei.]
A questão revisitada
Mas como posso garantir que as entradas no .bib
arquivo gerado sejam completadas com dados das entradas com referência cruzadasemconvertendo o .bib
arquivo original esemcitando as entradas com referências cruzadas no documento?
Responder1
Eu finalmente descobri como fazer isso. Na documentação, parece que usar o --output_format
modo como eu estava é diferente de invocar tool
o modo. Portanto, a forma como crossref
os dados são tratados não parece relevante para o caso que nos preocupa aqui. No entanto,
biber --help
é bastante mais útil. Em particular, afirma que--output_format=bibtex
só faz sentido no tool
modo. Portanto, como essa opção é claramente destinada ao uso nesse tipo de caso, como sugere a documentação, deve fazer sentido usar tool
mode aqui também. Além disso, o comando help também é muito mais simples de entender para usos relativamente simples. Enquanto a documentação sobre tool
o modo entra em detalhes sobre a configuração dos tipos corretos de processamento para diferentes transformações de fontes de dados, o comando help esclarece melhor as opções básicas.
Em particular, verifica-se que existe uma opção para fazer exatamente o que se deseja aqui:
biber --output_format=bibtex --output_resolve prawf3.bcf
O que isso faz é não incluir as entradas com referência cruzada no arquivo .bib
. O que ele faz écompletoas entradas que os utilizam com dados das entradas com referência cruzada. O resultado 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},
}
o que é realmente melhor para muitos propósitos do que incluir as entradas com referências cruzadas separadamente.
Responder2
Se possível, a resposta do cfr deve ser preferida por razões óbvias (especialmente por conveniência).
No entanto, se for necessário evitar a forma como Biber 'resolve' as entradas com referências cruzadas e manter todas as entradas separadas - por exemplo, talvez porque você cita vários artigos de uma coleção de ensaios e, portanto, ainda precisa que cada ensaio aponte apenas para o livro na bibliografia, em vez de cada um fornecer a referência bibliográfica completa - então você poderia fazer algo assim:
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`
Para que isso funcione, você precisa de alguma forma \input
do que está extraindo .bbl
. Eu fiz isso com um bbl2nocite
script estúpido, que é essencialmente apenas um encerramento grep
e 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
A outra modificação que você precisa fazer está no .tex
: you need to \input
que chamei tmpfile.tex
acima. Usando o arquivo de exemplo do cfr, tudo que você precisa adicionar é:
\input{tmpfile}
logo antes do \printbibliography
; ou você poderia fazer:
\InputIfFileExists{tmpfile.tex}{\input{tmpfile}}{\relax}
E, por fim, você obtém o novo arquivo bibliográfico, que termina em _biber.bib
, que deverá conter, neste caso, seis entradas.
Uma última coisa a observar é que talvez seja necessário comentar a \Input...
linha e percorrer uma sequência de latex
, biber
, e latex
novamente para voltar à aparência original da bibliografia. No arquivo cfr acima, por exemplo, esta técnica fará com que todos os seis itens apareçam na bibliografia, o que pode não ser desejado.