luatex85: \pdfcreationdate 的新定义有问题

luatex85: \pdfcreationdate 的新定义有问题

包“datetime2”扫描了宏 \pdfcreationdate。由于“luatex85.sty”和 LuaTeX 0.95 中的定义发生变化,该操作失败。请参见以下示例:

\listfiles
\setcounter{errorcontextlines}{100}
\documentclass{article}
\usepackage{luatex85}
%\edef\pdfcreationdate{\pdfcreationdate}
\usepackage{datetime2}
\begin{document}
  \DTMnow
\end{document}

取消注释 edef 行后,问题就解决了。

答案1

不幸的是,这是一个难题。LuaTeX 的开发人员决定删除几个有利于语法的原语

\pdffeedback <keyword>

一些被移除的原语是可扩展的:

\pdftexrevision
\pdfxformname
\pdfcreationdate
\pdffontname
\pdffontobjnum
\pdffontsize
\pdfpageref
\pdfcolorstackinit

意思就是扩展步骤足以使它们实现扩展。请注意,现在也提供扩展步骤

\pdffeedback creationdate

被使用。该luatex85包提供了围绕新语法的旧名称,

\def\pdfcreationdate{\pdffeedback creationdate}

但这意味着需要扩展步骤,而这正是datetime2失败的地方,因为它

\expandafter\@dtm@parsepdfdatetime\pdfcreationdate\@dtm@endparsepdfdatetime

在特定情况下,您使用的解决方法很好,因为\pdfcreationdateinpdftex是“固定的”,并且一旦设置就不会改变。所以luatex85 可能确实如此\edef\pdfcreationdate{\pdffeedback creationdate}。但是,这不适用于其他旧原语,例如\pdffontsize,因为这需要一个参数(字体说明符)。

使用这些原语的包应该更新以执行两个扩展步骤或分支其代码。对于datetime2代码

\expandafter\expandafter\expandafter\@dtm@parsepdfdatetime\pdfcreationdate\@dtm@endparsepdfdatetime

适用于旧版pdftex或 LuaTeX 0.85 或更高版本。对于pdftex或更旧的 LuaTeX,第二个扩展步骤将尝试扩展D,因此不执行任何操作。对于 LuaTeX 0.85 或更高版本(已luatex85加载),双重扩展将提供预期的字符串。

更安全:

\ifdefined\pdffeedback
  \expandafter\@dtm@parsepdfdatetime
    \pdffeedback creationdate \@dtm@endparsepdfdatetime
\else
  \expandafter\@dtm@parsepdfdatetime
    \pdfcreationdate\@dtm@endparsepdfdatetime
\fi

然而,的另一部分需要另一个分支datetime2来使其独立于luatex85,在那里检查是否存在\pdfcreationdate

答案2

此问题已在 v1.5.1 (2016-06-05) 中修复datetime2。我通过定义新命令修复了此问题\dtm@pdfcreationdate

\ifdef\pdfcreationdate
{%
  \edef\dtm@pdfcreationdate{\pdfcreationdate}%
}%
{%
  \ifdef\pdffeedback
  {%
     \edef\dtm@pdfcreationdate{\pdffeedback creationdate}%
  }%
  {}%
}

然后使用\dtm@pdfcreationdate我之前使用过的地方\pdfcreationdate。这种方法具有以下优点:

  • 它不修改\pdfcreationdate

  • 它允许对定义进行任何潜在的未来改变,从而\pdfcreationdate可能需要更深层次的扩展。¹

  • 它适用于用户选择不加载luatex85(或在之后加载datetime2)的 LuaLaTeX 新版本。

(XeLaTeX 不提供\pdfcreationdate,仍然会触发后备模式,从 计算当前时间\time,但缺少秒和时区。)


¹ 我不希望发生这种情况,但是话又说回来,我也不希望 LuaTeX 下降\pdfcreationdate

相关内容