我想知道是否有办法直接从正在编译的文档的 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
上面提到的解决方案几乎相同,但灵活性要差得多。
根据要求,“真空脚本”(没什么特别的,除了它还使用 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}