Gerando fonte BiBTeX de LuaLaTeX

Gerando fonte BiBTeX de LuaLaTeX

Gostaria de saber se existe uma maneira de gerar as entradas do BibTeX diretamente da fonte LuaLaTeX do documento que está sendo compilado. Dado um sistema de arquivamento específico, a fonte LuaTeX pode ter todas as informações que se deseja:

  1. Tipo de Documento (Artigo, Relatório, Livro)
  2. Autor/Título
  3. Nomes de variáveis ​​personalizadas, como versão, departamento, etc.

Se essas variáveis ​​forem acessíveis a partir da parte lua do código, e se \directluapermitirem gravar arquivos, então poderá ser possível gerar um .bibarquivo como parte da compilação do documento.

Gostaria de saber se minha linha de investigação é válida e se alguém já tentou algo semelhante ao que descrevi acima.

Responder1

Lua definitivamente não é necessária. Meu modelo para meus próprios documentos de trabalho começa com

%% Metadata
\begin{filecontents}[overwrite,noheader]{\jobname.meta-bib}
@article
author = {test, test},
title = {title},
keywords = {GR},
\end{filecontents}
\documentclass{amsart}
\usepackage{...

Isso permite que você coloque quaisquer dados bibliográficos que desejar no filecontentsambiente e os salve em um .meta-bibarquivo, que você pode limpar usando um script de shell. (No meu caso, os dados que incluo estão incompletos [faltando algumas chaves e a chave de identificação] porque meu script de shell de aspiração os gera automaticamente, mas você pode fazer tudo manualmente.)

A solução acima é provavelmente a mais flexível, pois não requer conhecimento/suposições sobre classes de documentos individuais. Um método alternativo é escrever um .styarquivo package ( ) que automatize esse processo; isso exigiria

  • Redefinindo \titlepara escrever o título longo no arquivo bib; deve-se tomar cuidado com classes de documentos que permitem argumentos opcionais para \title.

  • Redefinindo \authorpara escrever as informações do autor no arquivo bib; isso pode ser extremamente difícil, pois algumas classes de documentos esperam o endereço do autor como parte do \authorcomando, e algumas classes de documentos não. E algumas classes de documentos listam autores individuais com múltiplas \authorchamadas, e algumas classes de documentos usam \author{Author1 \and Author2 \and Author3}.

    Minha incapacidade de automatizar isso totalmente para todas as classes de documentos comuns que uso é o motivo pelo qual voltei a usar apenas filecontentspara escrever os dados manualmente.

  • De qualquer forma, se o seu artigo for publicado, não há como encontrar as informações da publicação (revista, volume, data) apenas com base na fonte,a menos quevocê o codifica no arquivo TeX de alguma forma. Nesse caso, você volta para algo quase igual à filecontentssolução mencionada acima, mas com muito menos flexibilidade.


A pedido, o "script de vácuo" (nada sofisticado, exceto que também gera carimbos de data e hora usando informações de commit do 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

Responder2

Embora luanão seja obrigatório, luafacilita a transferência de informações do tex para o arquivo. Pelo que entendi, filecontentsé um ambiente literal e não é fácil passar variáveis ​​do TeX para ele. Então, criei um exemplo mínimo que mostro abaixo. Agora que podemos passar variáveis ​​para lua, podemos escrever um script tão complexo ou simples quanto necessário em lua para fazer as coisas funcionarem.

\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}

informação relacionada