Me pregunto si hay alguna manera de generar las entradas BibTeX directamente desde la fuente LuaLaTeX del documento que se está compilando. Dado un sistema de archivo particular, la fuente LuaTeX podría tener toda la información que uno desearía:
- Tipo de Documento (Artículo, Informe, Libro)
- Autor/Título
- Nombres de variables personalizados como versión, departamento, etc.
Si se puede acceder a estas variables desde la parte lua del código y si \directlua
permiten escribir archivos, entonces podría ser posible generar un .bib
archivo como parte de la compilación del documento.
Me pregunto si mi línea de investigación es válida y si alguien ya ha intentado algo similar a lo que describí anteriormente.
Respuesta1
Definitivamente no se requiere Lua. Mi plantilla para mis propios documentos de trabajo comienza con
%% Metadata
\begin{filecontents}[overwrite,noheader]{\jobname.meta-bib}
@article
author = {test, test},
title = {title},
keywords = {GR},
\end{filecontents}
\documentclass{amsart}
\usepackage{...
Esto le permite colocar cualquier dato bibliográfico que desee dentro del filecontents
entorno y guardarlo en un .meta-bib
archivo, que luego puede aspirar usando un script de shell. (En mi caso, los datos que incluyo están incompletos [faltan algunas llaves y la clave de identificación] porque mi script de shell de aspiración los genera automáticamente, pero puedes hacer todo a mano).
La solución anterior es probablemente la más flexible, ya que no requiere conocimientos ni suposiciones sobre clases de documentos individuales. Un método alternativo es escribir un .sty
archivo de paquete ( ) que automatice este proceso; esto requeriría
Redefinir
\title
para escribir el título largo en el archivo dorsal; Se debe tener cuidado con las clases de documentos que permiten argumentos opcionales para\title
.Redefinir
\author
para escribir la información del autor en el archivo bib; Esto puede ser extremadamente difícil ya que algunas clases de documentos esperan la dirección del autor como parte del\author
comando, y otras no. Y algunas clases de documentos enumeran autores individuales con múltiples\author
llamadas, y algunas clases de documentos usan\author{Author1 \and Author2 \and Author3}
.Mi incapacidad para automatizar completamente esto para todas las clases de documentos comunes que uso es la razón por la que volví a
filecontents
escribir los datos a mano.En cualquier caso, si su artículo termina publicado, no hay forma de que pueda encontrar la información de publicación (revista, volumen, fecha) basándose únicamente en la fuente.a menos quelo codificas en el archivo TeX de alguna manera. En este caso, volverá a algo que es casi igual a la
filecontents
solución mencionada anteriormente pero con mucha menos flexibilidad.
A pedido, el "script de vacío" (nada sofisticado, excepto que también genera marcas de tiempo usando información de confirmación de Git)
#!/bin/bash
BIBFILE="entries.bib"
echo '% Automatically generated entries database' > $BIBFILE
echo -n '% Updated: ' >> $BIBFILE
date >> $BIBFILE
for texfile in `git ls-tree master --name-only *tex`
do
bname=`basename -s .tex $texfile`
if [ ${bname}.meta-bib -ot $texfile ]
then
echo "${texfile} out of date, skipping."
else
moddate=`git log -n 1 --date="format:%F %R" --format="format:%cd" ${texfile}`
modcommit=`git log -n 1 --format="format:%h" ${texfile}`
origdate=`git log --date="format:%F" --format="format:%cd" --diff-filter=A ${texfile}`
head -n 1 ${bname}.meta-bib >> $BIBFILE
echo "{ $bname," >> $BIBFILE
tail -n +2 ${bname}.meta-bib >> $BIBFILE
echo "lastdate = {${moddate}}," >> $BIBFILE
echo "lastcommit = {${modcommit}}," >> $BIBFILE
echo "origdate = {${origdate}}," >> $BIBFILE
echo "url = {${texfile}}," >> $BIBFILE
echo '}' >> $BIBFILE
fi
done
Respuesta2
Si bien lua
no es obligatorio, lua
facilita la transferencia de información de un texto a un archivo. Por lo que tengo entendido, filecontents
es un entorno similar al literal y no es fácil pasarle variables desde TeX. Entonces, se me ocurrió un ejemplo mínimo propio que muestro a continuación. Ahora que podemos pasar variables a lua, podemos escribir un script tan complejo o tan simple como sea necesario en lua para que todo funcione.
\documentclass{article}
\title{New Article}
\author{New Author}
\RequirePackage{luatextra}
\begin{luacode}
function writebib(author)
bibtex_file = io.open("meta.bib", "w")
bibtex_file:write("@techreport{alpha,title={Me},author={")
bibtex_file:write(author)
bibtex_file:write("}}")
end
\end{luacode}
\begin{document}
\maketitle
\makeatletter
\directlua{writebib("\luaescapestring{\@author}")}
\makeatother
\end{document}