解析 git 提交日期,例如日期时间

解析 git 提交日期,例如日期时间

我正在使用 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}

相关内容