如何使用datetime
包将当前时间打印到文件中。运行时,pdflatex
我正在生成一个文件foo.def
,我想在文件的顶部添加一条注释,格式为当前日期时间YYYY-MM-DD hh:mm:ss
。
datetime2
如果使用该包(即该行\def\UseOldDatetimePackage{}%
被注释),则以下 MWE 可以按预期工作并产生结果:
在 pdf、.log 文件和foo.def
文件中。
但是,如果按原样运行,即使用该datetime
包,pdf 会显示正确的结果,但 .log 文件会显示
当前时间 = \currenttime
以及foo.def
演出:
% \protect @day =\day \relax @month =\month \relax @year =\year \relax 2023/05/18 \protect \protect \c@HOUR =\currenthour \c@HOURXII =\c@HOUR \c@MINUTE =\currentminute \c@TOHOUR =\c@HOURXII \advance \c@TOHOUR 加 1\relax @DT@modctr =\c@TOHOUR \relax \divide @DT@modctr 加 12\relax \multiply @DT@modctr 加 12\relax \advance \c@TOHOUR 加 -@DT@modctr \c@TOMINUTE =\c@MINUTE \advance \c@TOMINUTE 加 -60\relax \multiply \c@TOMINUTE 加 -1\relax \c@SECOND =\当前秒 \放松 01:06:29\放松
那么,正确的解决方案是什么datetime
。
笔记:
- 最终将迁移到
datetime2
,但目前遇到一些问题,我需要更多时间来研究。 - MWE 需要
-shell-escape
运行选项。
代码:
\documentclass{article}
\let\OldToday\today
\def\UseOldDatetimePackage{}% <-- Works if this is commented
\ifdefined\UseOldDatetimePackage
\usepackage[yyyymmdd,hhmmss]{datetime}
\def\CurrentTime{\currenttime}%
\else
\usepackage[]{datetime2}
\def\CurrentTime{\DTMcurrenttime}
\fi
\def\TitleHeader{\today\space \CurrentTime}
\makeatletter
\newcommand{\WriteFooTexFile}{%
\immediate\write18{printf "\\n" > foo.def }% Initialize File
\immediate\write18{%
printf "\@percentchar s\string\\n"
"\@percentchar\space\TitleHeader" >>
foo.def }%
}%
\makeatother
\begin{document}
\TitleHeader
\typeout{current time = \CurrentTime}
\WriteFooTexFile
\end{document}
答案1
以下使用datetime
存储当前时间的计数器,但以可扩展的方式对输出格式进行硬编码:
\documentclass{article}
\let\OldToday\today
\def\UseOldDatetimePackage{}% <-- Works if this is commented
\ifdefined\UseOldDatetimePackage
\usepackage[yyyymmdd,hhmmss]{datetime}
\def\Today
{\the\year\dateseparator\twodigit\month\dateseparator\twodigit\day}
\def\CurrentTime
{%
\twodigit\currenthour\timeseparator
\twodigit\currentminute\timeseparator
\twodigit\currentsecond
}
\else
\usepackage[]{datetime2}
\def\Today{\today}
\def\CurrentTime{\DTMcurrenttime}
\fi
\def\TitleHeader{\Today\space \CurrentTime}
\makeatletter
\newcommand{\WriteFooTexFile}{%
\immediate\write18{printf "\\n" > foo.def }% Initialize File
\immediate\write18{%
printf "\@percentchar s\string\\n"
"\@percentchar\space\TitleHeader" >>
foo.def }%
}%
\makeatother
\begin{document}
\TitleHeader
\typeout{current time = \CurrentTime}
\WriteFooTexFile
\end{document}
答案2
这里有一个解决方案,不需要 shell-escape 即可使用 PDFLaTeX 或 LuaLaTeX 将当前日期和时间写入文件:
\documentclass{article}
\usepackage{listings}
\usepackage{iftex}
\makeatletter
\newwrite\foodef
\begingroup
\def\@splitcreationdate #1:#2#3#4#5#6#7#8#9{%
#2#3#4#5-#6#7-#8#9\@splithourminute
}%
\def\@splithourminute#1#2#3#4#5#6{ #1#2:#3#4:#5#6\@splitoffset}%
\def\@splitoffset #1'#2'{#1:#2}%
\immediate\openout\foodef \jobname.def
\ifpdftex
\immediate\write\foodef{\@percentchar\space
\expandafter\@splitcreationdate\pdfcreationdate}
\else
\ifluatex
\immediate\write\foodef{\@percentchar\space
\expandafter\@splitcreationdate\pdffeedback creationdate }
\fi
\fi
\immediate\closeout\foodef
\endgroup
\makeatother
\begin{document}
\lstinputlisting{\jobname.def}
\end{document}
写道,例如:
% 2023-05-18 11:29:06+02:00
到文件foo.def
(然后读取foo.def
,以便在 PDF 中显示该内容)。
抱歉,但我不知道如何使用 XeLaTeX 获得第二个。