包“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
在特定情况下,您使用的解决方法很好,因为\pdfcreationdate
inpdftex
是“固定的”,并且一旦设置就不会改变。所以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
。