我正在使用 LuaLaTeX 处理 LaTeX 文档,并尝试在文档中包含 git 信息,以便在偶然发现打印的副本时更容易找到正确的版本。
借助这里的一些帖子,我已经能够获取文档中的大部分 git 信息:提交哈希和时间戳。这是按照方法进行的\input|"git log -1 --format=\@percentchar ci ./"
。
但现在我想使用时间戳作为日期,例如\maketitle
。所以我看到了这篇文章:是否可以解析 LaTeX 中的日期字符串并将其转换为不同的日期格式?只要我使用用 创建的测试日期,那里提供的解决方案对我来说就很有效\newcommand{\testDate}{2021-05-27 ...}
。但是,一旦我想使用从 git 检索到的日期,它就会停止工作。
下面你会发现一个 MWE,它会产生各种错误,具体取决于你注释掉哪一行
\documentclass{article}
\usepackage[ngerman]{babel}
% define a parser
\def\parsegitdate#1-#2-#3 #4\endparse{#3.#2.#1}
\begin{document}
\makeatletter
% first definiton
\newcommand{\gitdatex}{\input|"git log -1 --format=\@percentchar ci"}
% second definition
\def\gitdatey{\@@input|"git log -1 --format=\@percentchar ci"}
% third definition
\edef\gitdatez{\@@input|"git log -1 --format=\@percentchar ci"}
\makeatother
% print date for reference
\gitdatex
% version 1
\expandafter\parsegitdate\gitdatex\endparse
% version 2
\expandafter\parsegitdate\gitdatey\endparse
% version 3
\expandafter\parsegitdate\gitdatez\endparse
\end{document}
版本 1 和 2 的第一个和第二个定义给出了相同的错误:! Paragraph ended before \parsegitdate was complete.
显然定义没有正确扩展,实际的 git 命令而不是其结果被传递给了解析器。因此,我尝试了\edef
。
第三个定义\edef
和版本 3 产生所需的结果,只要我不包含\usepackage[ngerman]{babel}
。一旦我包含该包(使用选项ngerman
),我就会得到一个! Argument of \language@active@arg" has an extra }.
我怎样才能使它们结合起来发挥作用?
我也知道以下答案有点类似。但我实际上不想使用外部脚本。因此,gitinfo2 或 vsc bundle 不是我想要的解决方案。
顺便问一下:有人能给\endparse
我解释一下吗?我找不到任何信息来说明这实际上意味着什么以及做什么。
答案1
编辑:
所以我做了一些调查为什么右括号被传递到\edef
,并发现这个有用的帖子这里。显然,TeX 输入原语会寻找一个隐式符号\space
来表示需要读取的内容的结束,所以我们必须添加它。此外,\input
还会添加一个新的空行,这就是为什么如果您不通过 抑制它,代码就会出错\everyeof{\noexpand}
。最后,我们还需要\gitdate
通过 全局定义 now \xdef
。
因此,您的 MWE 更改为:
\documentclass{article}
\usepackage[ngerman]{babel}
% define a parser
\def\parsegitdate#1-#2-#3 #4\endparse{#3.#2.#1}
\makeatletter
\begingroup\everyeof{\noexpand}
\xdef\gitdate{\@@input|"git log -1 --format=\@percentchar ci ."\space}
\endgroup
\makeatother
\begin{document}
% print date for reference
\gitdate
\expandafter\parsegitdate\gitdate\endparse
\end{document}
原始帖子
叹
尝试了各种解决方案一段时间后,我似乎失去了理智。阅读这里的完成的帖子后,我又想到了一个主意:只需将定义移到 之外\begin{document}
。现在,这很简单。
\documentclass{article}
\usepackage[ngerman]{babel}
% define a parser
\def\parsegitdate#1-#2-#3 #4\endparse{#3.#2.#1}
\makeatletter
\edef\gitdate{\@@input|"git log -1 --format=\@percentchar ci"}
\makeatother
\begin{document}
% print date for reference
\gitdate
\expandafter\parsegitdate\gitdate\endparse
\end{document}