将 gitinfo2 包的输出与 datetime2 命令结合使用

将 gitinfo2 包的输出与 datetime2 命令结合使用

该包提供了以 ISO 格式返回当前提交日期的gitinfo2命令,例如。\gitAuthorDate2018-02-22

我想在我的文档中使用不同格式的日期,所以我尝试使用该datetime2包来保存输出\gitAuthorDate并重新格式化它。

下面是一个最小示例(在 git 版本控制目录中使用,并根据文档安装适当的钩子)gitinfo2

\documentclass{article}

\usepackage[grumpy,mark]{gitinfo2}

\usepackage[calc]{datetime2}
\DTMsavedate{commitdate}{\gitAuthorDate}

\begin{document}

Hello world!

\end{document}

不幸的是,这让我

Runaway argument?
\gitInf@authsdate \@dtm@endparsedate \cslet {@dtm@commitdate@year}{\@dtm@year \
ETC.
! Paragraph ended before \@dtm@parsedate was complete.
<to be read again> 
                   \par 
l.9 

我该如何修复这个错误,或者是否有其他方法可以重新格式化提供的日期\gitAuthorDate

编辑

根据 Nicola 的要求,以下是一段交互式会话的摘录,用于了解 \gitAuthorDate 如何扩展

*\show\gitAuthorDate
...
> \gitAuthorDate=\long macro:
->\gitInf@authsdate .
*\makeatletter
*\show\gitInf@authsdate
> \gitInf@authsdate=macro:
->2018-02-22.

答案1

(将评论变成答案。)\DTMsavedate对第二个参数中的第一个标记执行一级扩展,因此如果\gitAuthorDate直接定义为 2018-02-22,它将起作用,但如果以更复杂的方式定义,则不会起作用。鉴于您提供的扩展\gitAuthorDate,您可以使用您提出的解决方案:

\makeatletter\DTMsavedate{commitdate}{\gitInf@authsdate}\makeatother

但是,最好不要使用内部命令,以防软件包在以后的版本中更改它们。相反,更通用的解决方案是确保参数在传递给之前完全展开\DTMsavedate

\newcommand{\esavedate}[2]{%
  \begingroup
  \edef\x{\noexpand\endgroup\noexpand\DTMsavedate{#1}{#2}}\x
}

\esavedate{commitdate}{\gitAuthorDate}

相关内容