我想知道是否有办法获得日期元素(年、月、日、时、分、秒)以创建自动递增的幸运版本号。例如,如果现在是 2018 年 3 月 19 日 15:30,我想生成一个数字,如:201803191530,格式为 YYYYMMDDHHmm。我希望能够以任何方式排列元素。理想的是某种命令\year \month \day \hour \minute \second
,例如,这样我就可以随心所欲地使用它们。
答案1
无需任何包的可扩展时间戳定义:
\documentclass{article}
\makeatletter
\edef\timestamp{%
\the\year
\two@digits\month
\two@digits\day
\two@digits{\numexpr(\time*2 - 59)/120\relax}%
\two@digits{\numexpr\time - 60*\numexpr(\time*2 - 59)/120\relax\relax}%
}
\makeatother
\typeout{Time stamp: \timestamp}
\begin{document}
Time stamp: \timestamp
\end{document}
评论:
\time
获取当天的会议纪要。- e-TeX
\numexpr
允许可扩展计算。但是,它会四舍五入。复杂的公式会绕过它。 \two@digits
来自 LaTeX 内核,用于正整数。如果数字小于 10,它会在前面添加一个零。
答案2
如果使用pdflatex
,则可以使用\pdfcreationdate
它来记录 PDF 文件打开输出时的时间戳,该时间戳是以下形式的字符串
D:20170421011556+02’00’
最后七个字符代表与 UTC 的差异。因此,这只是解析字符串的问题。我为您的时间戳添加了一个可能的定义,随意重新排序项目。
\documentclass{article}
\makeatletter
\begingroup
\def\set@time@data#1:#2\@nil{\set@time@data@a#2}
\def\set@time@data@a#1#2#3#4{%
\gdef\Year{#1#2#3#4}%
\set@time@data@b
}
\def\set@time@data@b#1#2#3#4{%
\gdef\Month{#1#2}%
\gdef\Day{#3#4}%
\set@time@data@c
}
\def\set@time@data@c#1#2#3#4#5#6{%
\gdef\Hour{#1#2}%
\gdef\Min{#3#4}%
\gdef\Sec{#5#6}%
\set@time@data@d
}
\def\set@time@data@d#1#2#3#4#5#6#7{}
% start up the business
\expandafter\set@time@data\pdfcreationdate\@nil
\endgroup
\edef\TimeStamp{\Year-\Month-\Day\space\Hour:\Min:\Sec}
\makeatother
\begin{document}
Time stamp: \TimeStamp
\medskip
\begin{tabular}{@{}ll}
Year & \Year \\
Month & \Month \\
Day & \Day \\
Hour & \Hour \\
Min & \Min \\
Sec & \Sec \\
\end{tabular}
\end{document}
类似,但语法更清晰(这里我只定义宏\TimeStamp
);只需在各个范围内移动即可。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\cs_set:Npx \TimeStamp
{
\str_range:Nnn \pdfcreationdate { 3 } { 6 } % year
-
\str_range:Nnn \pdfcreationdate { 7 } { 8 } % month
-
\str_range:Nnn \pdfcreationdate { 9 } { 10 } % day
\space
\str_range:Nnn \pdfcreationdate { 11 } { 12 } % hour
:
\str_range:Nnn \pdfcreationdate { 13 } { 14 } % minutes
:
\str_range:Nnn \pdfcreationdate { 15 } { 16 } % seconds
}
\ExplSyntaxOff
\begin{document}
Time stamp: \TimeStamp
\end{document}