我想知道是否有一種方法可以直接從正在編譯的文檔的 LuaLaTeX 原始碼產生 BibTeX 條目。給定一個特定的檔案系統,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
檔案中,然後您可以使用 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}