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:
- Tipo de Documento (Artigo, Relatório, Livro)
- Autor/Título
- 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 \directlua
permitirem gravar arquivos, então poderá ser possível gerar um .bib
arquivo 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 filecontents
ambiente e os salve em um .meta-bib
arquivo, 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 .sty
arquivo package ( ) que automatize esse processo; isso exigiria
Redefinindo
\title
para escrever o título longo no arquivo bib; deve-se tomar cuidado com classes de documentos que permitem argumentos opcionais para\title
.Redefinindo
\author
para 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\author
comando, e algumas classes de documentos não. E algumas classes de documentos listam autores individuais com múltiplas\author
chamadas, 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
filecontents
para 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 à
filecontents
soluçã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 lua
não seja obrigatório, lua
facilita 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}