從 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檔案中,然後您可以使用 shell 腳本清理該檔案。 (在我的例子中,我包含的數據不完整[缺少一些大括號和識別鍵],因為我的清理 shell 腳本會自動產生這些數據,但您可以手動完成所有操作。)

上面的解決方案可能是最靈活的,因為它不需要有關各個文件類別的知識/假設。另一種方法是編寫一個套件 ( .sty) 檔案來自動執行此過程;這需要

  • 重新定義\title將長標題寫入bib檔案中;必須注意允許可選參數的文檔類別\title

  • 重新定義\author將作者資訊寫入bib檔案中;這可能非常困難,因為某些文檔類期望作者地址作為命令的一部分\author,而某些文檔類則不然。某些文檔類列出了具有多次\author呼叫的個人作者,而某些文檔類則使用\author{Author1 \and Author2 \and Author3}.

    我無法對我使用的所有常見文件類別完全自動化,這就是為什麼我恢復到僅使用filecontents手動寫出資料的原因。

  • 無論如何,如果你的論文最終發表了,你不可能僅根據來源找到發表資訊(期刊、卷數、日期),除非您以某種方式將其硬編碼到 TeX 檔案中。在這種情況下,您會得到與filecontents上述解決方案幾乎相同的解決方案,但靈活性要差很多。


根據請求,「vacuum script」(沒什麼特別的,除了它還使用 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這是一個逐字環境,從 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}

相關內容