Генерация исходного кода BiBTeX из LuaLaTeX

Генерация исходного кода BiBTeX из LuaLaTeX

Мне интересно, есть ли способ генерировать записи BibTeX напрямую из исходного кода LuaLaTeX компилируемого документа. При наличии конкретной системы хранения исходный код LuaTeX может содержать всю необходимую информацию:

  1. Тип документа (статья, отчет, книга)
  2. Автор/Название
  3. Пользовательские имена переменных, такие как Версия, Отдел и т. д.

Если эти переменные доступны из части кода lua и если она \directluaпозволяет записывать файлы, то можно сгенерировать .bibфайл в ходе компиляции документа.

Мне интересно, обоснована ли моя линия расследования и пытался ли кто-то уже сделать что-то подобное тому, что я описал выше.

решение1

Lua определенно не требуется. Мой шаблон для моих собственных рабочих документов начинается с

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

Это позволяет вам помещать любые библиографические данные в filecontentsсреду и сохранять их в .meta-bibфайл, который затем можно очистить с помощью скрипта оболочки. (В моем случае данные, которые я включаю, неполны [отсутствуют некоторые скобки и идентификационный ключ], поскольку мой скрипт очистки генерирует их автоматически, но вы можете сделать все вручную.)

Решение выше, вероятно, является наиболее гибким, поскольку оно не требует знаний/предположений об отдельных классах документов. Альтернативный метод — написать файл пакета ( .sty), который автоматизирует этот процесс; это потребует

  • Переопределение \titleдля записи длинного заголовка в файл bib; необходимо соблюдать осторожность для классов документов, которые допускают необязательные аргументы для \title.

  • Переопределение \authorзаписи информации об авторе в файл bib; это может быть чрезвычайно сложно, поскольку некоторые классы документов ожидают адрес автора как часть команды \author, а некоторые классы документов — нет. А некоторые классы документов перечисляют отдельных авторов с несколькими \authorвызовами, а некоторые классы документов используют \author{Author1 \and Author2 \and Author3}.

    Из-за невозможности полностью автоматизировать этот процесс для всех распространенных классов документов, которые я использую, мне пришлось вернуться к простому filecontentsнаписанию данных вручную.

  • В любом случае, если ваша статья будет опубликована, вы не сможете найти информацию о публикации (журнал, том, дата), основываясь только на источнике.пока невы как-то жестко кодируете это в файле TeX. В этом случае вы возвращаетесь к чему-то, что почти то же самое, что и filecontentsрешение, упомянутое выше, но с гораздо меньшей гибкостью.


По запросу «скрипт очистки» (ничего особенного, кроме того, что он также генерирует временные метки, используя информацию о коммитах 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

решение2

Хотя luaэто не обязательно, luaэто упрощает передачу информации из tex в файл. Насколько я понимаю, filecontentsэто среда типа verbatim, и передавать ей переменные из TeX нелегко. Поэтому я придумал свой собственный минимальный пример, который показываю ниже. Теперь, когда можно передавать переменные в lua, можно написать как сложный, так и простой скрипт, который нужен в lua, чтобы все заработало.

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

Связанный контент