將 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}

相關內容