LuaLaTeX から BiBTeX ソースを生成する

LuaLaTeX から BiBTeX ソースを生成する

コンパイルされているドキュメントの LuaLaTeX ソースから直接 BibTeX エントリを生成する方法があるかどうか疑問に思っています。特定のファイリング システムでは、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このプロセスを自動化するパッケージ()ファイルを作成することですが、これには

  • 長いタイトルを bib ファイルに書き込むように再定義します\title。 のオプション引数を許可するドキュメント クラスには注意が必要です\title

  • \author著者情報を bib ファイルに書き込むように再定義します。一部のドキュメント\authorクラスではコマンドの一部として著者のアドレスを期待しますが、一部のドキュメント クラスでは期待しないため、これは非常に困難になる可能性があります。また、一部のドキュメント クラスでは複数の\author呼び出しで個々の著者をリストし、一部のドキュメント クラスでは を使用します\author{Author1 \and Author2 \and Author3}

    私が使用するすべての一般的なドキュメント クラスに対してこれを完全に自動化することができなかったため、手動filecontentsでデータを書き出す方法に戻りました。

  • いずれにせよ、論文が出版された場合、情報源だけに基づいて出版情報(ジャーナル、巻、日付)を見つけることはできません。ない限り何らかの方法で TeX ファイルにハードコードします。 この場合、上記のソリューションとほぼ同じになりますfilecontentsが、柔軟性が大幅に低下します。


リクエストに応じて、「vacuum スクリプト」(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は必須ではありませんが、 luaTex からファイルに情報を転送するのが簡単になります。私の理解では、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}

関連情報