Мне интересно, есть ли способ генерировать записи BibTeX напрямую из исходного кода LuaLaTeX компилируемого документа. При наличии конкретной системы хранения исходный код LuaTeX может содержать всю необходимую информацию:
- Тип документа (статья, отчет, книга)
- Автор/Название
- Пользовательские имена переменных, такие как Версия, Отдел и т. д.
Если эти переменные доступны из части кода 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}