Generando fuente BiBTeX desde LuaLaTeX

Generando fuente BiBTeX desde LuaLaTeX

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:

  1. Tipo de Documento (Artículo, Informe, Libro)
  2. Autor/Título
  3. 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 \directluapermiten escribir archivos, entonces podría ser posible generar un .bibarchivo 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 filecontentsentorno y guardarlo en un .meta-bibarchivo, 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 .styarchivo de paquete ( ) que automatice este proceso; esto requeriría

  • Redefinir \titlepara 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 \authorpara 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 \authorcomando, y otras no. Y algunas clases de documentos enumeran autores individuales con múltiples \authorllamadas, 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 filecontentsescribir 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 filecontentssolució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 luano es obligatorio, luafacilita la transferencia de información de un texto a un archivo. Por lo que tengo entendido, filecontentses 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}

información relacionada