从 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上面提到的解决方案几乎相同,但灵活性要差得多。


根据要求,“真空脚本”(没什么特别的,除了它还使用 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}

相关内容