
La pregunta
¿Cómo puedo garantizar que las entradas con referencias cruzadas se incluyan en un .bib
archivo generado por biber
para un documento en caso de que el documento no cite las entradas con referencias cruzadas en sí, sino solo las entradas que se refieren a ellas? Para ser claro, no quiero que las entradas con referencias cruzadas aparezcan por separado en la lista de referencias, pero las necesito en el .bib
archivo para que los datos completos estén disponibles para las entradas que cito.
Fondo
Considere el siguiente documento que utiliza una base de datos regular de entradas bibliográficas (incluidas aquí 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 era de esperar, esto produce lo siguiente:
La promesa
Ahora supongamos que quiero generar un .bib
archivo que contenga sólo las entradas necesarias para este documento en particular. (Obviamente, esto no tendría sentido con este ejemplo, ya que orig.bib
no contiene nada más, pero ese no suele ser el caso, por supuesto).
Volviendo al biber
manual de, encuentro esto:
3.1.1 La opción formato_salida
Biber es capaz de generar... archivos BibTeX .bib. La salida .bib es posible en el modo herramienta, cuando convierte un archivo de fuente de datos completo independientemente de cualquier documento en particular (consulte la sección 3.12). También es útil cuando desea, en lugar de un .bbl, un nuevo archivo .bib que contenga solo las entradas citadas de un documento para poder, por ejemplo, enviar un paquete mínimamente completo para su composición tipográfica a alguien. Para hacer esto, después de la primera ejecución de LaTeX, llame a Biber de esta manera:
biber --output_format=bibtex test.bcf
Esto daría como resultado un nuevo archivo .bib llamado test_biber.bib que contiene todas las entradas citadas en test.tex, en orden de citación, formateadas de acuerdo con las distintas opciones de ouput_*.
Entonces intento esto:
biber --output_format=bibtex prawf3.bcf
El problema
Mi intento crea 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},
}
lo cual obviamente no es lo que esperaría, ya que el uso de este .bib
archivo claramente no producirá los resultados requeridos. Eso es:
\documentclass{article}
\usepackage[backend=biber]{biblatex}
\bibliography{prawf3_biber}
\begin{document}
\autocites{author-bk1,author-essays-intro,author-essay}
\printbibliography
\end{document}
encontrará problemas cuando biber
se ejecute:
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)
lo cual obviamente es de esperarse dado que las entradas con referencias cruzadas no están allí.
biber
El manual analiza el uso de datos de referencia cruzada cuando está en tool
modo, pero eso parece aplicarse solo al convertir una fuente de datos completa. Entonces, si quisiera aplicar eso a orig.bib
, podría hacerlo y luego podría extraer las entradas (ahora completas) prawf3_biber.bib
usando el comando anterior. [Al menos, supongo que podría; no lo he probado.]
La cuestión revisada
Pero, ¿cómo puedo asegurarme de que las entradas en el .bib
archivo generado se completen con datos de las entradas con referencias cruzadas?sinconvertir el .bib
archivo original ysin¿Citando las entradas con referencias cruzadas en el documento?
Respuesta1
Finalmente descubrí cómo hacer esto. En la documentación, parece que usar el --output_format
modo en que lo hacía es distinto del tool
modo de invocación. Por lo tanto, la forma en que crossref
se tratan los datos allí no parece relevante para el caso que nos preocupa aquí. Sin embargo,
biber --help
es bastante más útil. En particular, afirma que--output_format=bibtex
sólo tiene sentido en el tool
modo. Entonces, dado que esa opción está claramente destinada a usarse en este tipo de casos, como sugiere la documentación, debe tener sentido usar tool
mode aquí también. Además, la ayuda del comando también es mucho más sencilla de entender para usos relativamente simples. Mientras que la documentación sobre tool
el modo detalla mucho cómo configurar los tipos correctos de procesamiento para diferentes transformaciones de fuentes de datos, la ayuda del comando aclara mejor las opciones básicas.
En particular, resulta que hay una opción para hacer exactamente lo que se quiere aquí:
biber --output_format=bibtex --output_resolve prawf3.bcf
Lo que esto hace es no incluir las entradas con referencias cruzadas en el archivo .bib
. Lo que hace en cambio escompletolas entradas que los utilizan con datos de las entradas cruzadas. La resultante 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},
}
lo que en realidad es mejor para muchos propósitos que incluir las entradas con referencias cruzadas por separado.
Respuesta2
Si es posible, se prefiere la respuesta de cfr por razones obvias (especialmente la conveniencia).
Sin embargo, si es necesario evitar cómo Biber 'resuelve' las entradas con referencias cruzadas y mantener todas las entradas separadas (por ejemplo, tal vez porque usted cita varios artículos de una colección de ensayos y, por lo tanto, aún necesita que cada ensayo simplemente apunte al libro) en la bibliografía en lugar de que cada uno proporcione la referencia bibliográfica completa; entonces podría hacer algo como esto:
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 esto funcione, necesita \input
lo que está extrayendo de .bbl
alguna manera. Hice esto con un bbl2nocite
script sin sentido, que básicamente consiste simplemente en concluir grep
y 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
La otra modificación que debes hacer está en .tex
: necesitas \input
lo que llamé tmpfile.tex
arriba. Usando el archivo de ejemplo de CFR, todo lo que necesita agregar es:
\input{tmpfile}
justo antes del \printbibliography
; o podrías hacer en su lugar:
\InputIfFileExists{tmpfile.tex}{\input{tmpfile}}{\relax}
Y, finalmente, obtienes el nuevo archivo de bibliografía, que termina en _biber.bib
, que debería contener, en este caso, seis entradas.
Una última cosa a tener en cuenta es que es posible que deba comentar la \Input...
línea y ejecutar una secuencia de latex
, biber
y latex
nuevamente para volver a la apariencia original de la bibliografía. En el archivo CFR anterior, por ejemplo, esta técnica hará que aparezcan los seis elementos en la bibliografía, lo que puede no ser deseado.