\pdfcreationdate 的原始格式?

\pdfcreationdate 的原始格式?

梅威瑟:

\documentclass{article}
\begin{document}
\pdfcreationdate % LuaLaTeX: {\pdffeedback creationdate}
\end{document}

上面打印出如下字符串(我处于太平洋标准时区,即 -8h):

D:20171206082501-08’00’

我理解上述字符串的内容。我的问题涉及原始字符串格式的细节。我不是在问如何重新格式化它,因为有一些包(例如)datetime2可以做到这一点。

  1. 从 TeX 标记和 catcode 等的角度来看,前缀有什么特别之处吗D:? 与其他非数字字符相同。

  2. 打印显示引号是卷曲的,但我认为它们是原始字符串中的普通直引号,是吗?

  3. 现在到了最难的部分:据我所知,西半球时区前面有一个减号,而东半球时区前面有一个加号。不清楚格林威治时区会发生什么。是 +00'00' 吗?我深入研究了文件的代码,pdfx.sty似乎还有第三种情况,其中格林威治时间显示为Z或类似的东西。是这样吗?

我为什么想知道:我已经有代码(来自其他人)来操作字符串\pdfcreationdate,但操作方式非常不透明。我想重新编码,以便未来的维护者更容易阅读代码。但我不确定提供的确切字符串\pdfcreationdate

答案1

日期字符串的格式来自PDF 规范,请参阅“7.9.4 日期”部分。

  1. \string类别代码与或的结果相同\detokenize。除空格外的所有字符的类别代码均为 12(其他)。空格的类别代码为 10(空格)。

  2. “引号”是 ASCII 字符:撇号 (U+0027)

  3. Z世界时间,来自PDF规范:

    拉丁大写字母 Z 表示当地时间等于 UT。

答案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 时区的输出:

在此处输入图片描述

相关内容