
Пакет gitinfo2
предоставляет команду \gitAuthorDate
, которая возвращает дату текущего коммита в формате ISO, например, 2018-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
?
Редактировать
По просьбе Николы, вот отрывок из интерактивной сессии, чтобы увидеть, как расширяется \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}