梅威瑟:
\documentclass{article}
\begin{document}
\pdfcreationdate % LuaLaTeX: {\pdffeedback creationdate}
\end{document}
上面打印出如下字符串(我处于太平洋标准时区,即 -8h):
D:20171206082501-08’00’
我理解上述字符串的内容。我的问题涉及原始字符串格式的细节。我不是在问如何重新格式化它,因为有一些包(例如)datetime2
可以做到这一点。
从 TeX 标记和 catcode 等的角度来看,前缀有什么特别之处吗
D:
? 与其他非数字字符相同。打印显示引号是卷曲的,但我认为它们是原始字符串中的普通直引号,是吗?
现在到了最难的部分:据我所知,西半球时区前面有一个减号,而东半球时区前面有一个加号。不清楚格林威治时区会发生什么。是 +00'00' 吗?我深入研究了文件的代码,
pdfx.sty
似乎还有第三种情况,其中格林威治时间显示为Z
或类似的东西。是这样吗?
我为什么想知道:我已经有代码(来自其他人)来操作字符串\pdfcreationdate
,但操作方式非常不透明。我想重新编码,以便未来的维护者更容易阅读代码。但我不确定提供的确切字符串\pdfcreationdate
。
答案1
答案2
这是一种从适用于所有引擎的代码中提取的方法\pdfcreationdate
;使用 XeLaTeX 它仅提供年、月、日、时和分。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\prop_new:N \g_getdate_data_prop
\str_new:N \g_getdate_pdfdate_str
\cs_if_exist:NTF \pdfcreationdate
{
\str_gset:Nx \g_getdate_pdfdate_str { \pdfcreationdate }
}
{
\cs_if_exist:NTF \pdffeedback
{
\str_gset:Nx \g_getdate_pdfdate_str { \pdffeedback creationdate }
}
{
\str_gset:Nx \g_getdate_pdfdate_str
{
D:
\int_eval:n { \c_sys_year_int }
\int_compare:nT { \c_sys_month_int < 10 } { 0 }
\int_eval:n { \c_sys_month_int }
\int_compare:nT { \c_sys_day_int < 10 } { 0 }
\int_eval:n { \c_sys_day_int }
\int_compare:nT { \c_sys_hour_int < 10 } { 0 }
\int_eval:n { \c_sys_hour_int }
\int_compare:nT { \c_sys_minute_int < 10 } { 0 }
\int_eval:n { \c_sys_minute_int }
}
}
}
\prop_gput:Nnx \g_getdate_data_prop { year }
{
\str_range:Nnn \g_getdate_pdfdate_str { 3 } { 6 }
}
\prop_gput:Nnx \g_getdate_data_prop { month }
{
\str_range:Nnn \g_getdate_pdfdate_str { 7 } { 8 }
}
\prop_gput:Nnx \g_getdate_data_prop { day }
{
\str_range:Nnn \g_getdate_pdfdate_str { 9 } { 10 }
}
\prop_gput:Nnx \g_getdate_data_prop { hour }
{
\str_range:Nnn \g_getdate_pdfdate_str { 11 } { 12 }
}
\prop_gput:Nnx \g_getdate_data_prop { minute }
{
\str_range:Nnn \g_getdate_pdfdate_str { 13 } { 14 }
}
\prop_gput:Nnx \g_getdate_data_prop { second }
{
\str_range:Nnn \g_getdate_pdfdate_str { 15 } { 16 }
}
\prop_gput:Nnx \g_getdate_data_prop { diff }
{
\str_range:Nnn \g_getdate_pdfdate_str { 17 } { 17 }
}
\prop_gput:Nnx \g_getdate_data_prop { hourdiff }
{
\str_range:Nnn \g_getdate_pdfdate_str { 18 } { 19 }
}
\prop_gput:Nnx \g_getdate_data_prop { minutediff }
{
\str_range:Nnn \g_getdate_pdfdate_str { 21 } { 22 }
}
\NewExpandableDocumentCommand{\getdatestring}{}
{
\str_use:N \g_getdate_pdfdate_str
}
\NewExpandableDocumentCommand{\getdate}{m}
{
\prop_item:Nn \g_getdate_data_prop { #1 }
}
\NewExpandableDocumentCommand{\gettimedifference}{}
{
\str_if_eq:eeTF { \prop_item:Nn \g_getdate_data_prop {diff} } { Z }
{
0
}
{
$\prop_item:Nn \g_getdate_data_prop {diff}$
\prop_item:Nn \g_getdate_data_prop {hourdiff}
:
\prop_item:Nn \g_getdate_data_prop {minutediff}
}
}
\ExplSyntaxOff
\begin{document}
The year is \getdate{year}, the time is \getdate{hour}:\getdate{minute}
and the time difference with UTC is \gettimedifference
The full string is \getdatestring
\end{document}
可以定义附加宏,以便以更友好的方式提取各种信息。
输出我的时区:
带 UTC 时区的输出: