XeTeX 中与 \pdfcreationdate 等效的是什么?

XeTeX 中与 \pdfcreationdate 等效的是什么?

我需要 1 秒分辨率的时间。

datetime用于\pdfcreationdate此,但仅限于 pdf(La)TeX。

在 XeLaTeX 下,结果是这样的:

\usepackage{datetime}
...
\newtimeformat{hhmmss}{\twodigit{\THEHOUR}\twodigit{\THEMINUTE}\twodigit{\THESECOND}}
\settimeformat{hhmmss}
\currenttime

总是产生00最后两位数字,例如:

113600

答案1

\pdfcreationdateXeTeX 中没有像 pdfTeX 和 LuaTeX 那样的命令。这是有技术原因的:XeTeX 以异步方式生成 PDF 文件,将生成的页面以xdv格式传送给xdvipdfmx。通常,这些文件保存在临时目录中,PDF 最终会移动到当前目录中。

.log可以使用 shell 转义,检查在作业开始时打开的文件的创建日期,但这依赖于系统。

\pdfcreationdate在 XeTeX 中模拟

我们也可以从 XeTeX (或 XeLaTeX) 使用 LuaTeX!创建以下文件creationdate.lua

os.remove("creationdate.timestamp")
io.output("creationdate.timestamp"):write(os.date("\\edef\\tempa{\\string D:%Y%m%d%H%M%S}\n\\def\\tempb{%z}"))\end{filecontents*}

然后在加载之前输入以下代码datetime

\ifdefined\pdfcreationdate\else
\begingroup
  \ifnum\shellescape=1
    \immediate\write18{texlua creationdate.lua}
    \input{creationdate.timestamp}
    \def\tempc#1#2#3#4#5{#1#2#3'#4#5'}
    \edef\tempb{\expandafter\tempc\tempb}
    \edef\x{\endgroup\def\noexpand\pdfcreationdate{\tempa\tempb}}\x
  \fi
\fi

如果文件存在,则将删除该文件creationdate.timestamp,并创建一个包含当前时间的新文件,其格式类似于\pdfcreationdatepdfTeX 中生成的格式。然后它将被读入;显示的时间将是脚本执行的时间。但是,任何最近的 TeX 发行版都应该有texlua(因为它有luatex),因此这应该尽可能独立于系统。

实际上,写的内容creationdate.timestamp是这样的

\edef\tempa{\string D:20120122195802}
\def\tempb{+0100}

然后对其内容进行一些处理,使其本质上

\def\pdfcreationdate{D:20120122195802+01'00'}

这是所要求的格式datetimeD必须有类别代码 12,因为这是\pdfcreationdate在 (pdf|Lua)TeX 中生成的)。

一个完整的示例,与 一起运行--shell-escape,一如既往(否则\pdfcreationdate将不会被定义并且会将秒数显示为“00”);如果已经存在(因此使用或作为引擎),datetime则宏不执行任何操作。\pdfcreationdatepdftexluatex


\begin{filecontents*}{creationdate.lua}
os.remove("creationdate.timestamp")
io.output("creationdate.timestamp"):write(os.date("\\edef\\tempa\{\\string D:%Y%m%d%H%M%S\}\n\\def\\tempb\{%z\}"))
\end{filecontents*}
\documentclass{standalone}
\ifdefined\pdfcreationdate\else
\begingroup
  \ifnum\shellescape=1
    \immediate\write18{texlua creationdate.lua}
    \input{creationdate.timestamp}
    \def\tempc#1#2#3#4#5{#1#2#3'#4#5'}
    \edef\tempb{\expandafter\tempc\tempb}
    \edef\x{\endgroup\def\noexpand\pdfcreationdate{\tempa\tempb}}\x
  \fi
\fi

\usepackage{datetime}
\newtimeformat{hhmmss}{\twodigit{\THEHOUR}\twodigit{\THEMINUTE}\twodigit{\THESECOND}}
\settimeformat{hhmmss}
\begin{document}
\currenttime
\end{document}

Unix 系统上的另一种方法

不幸的是,XeTeX 不支持 的 pdfTeX 功能\input|<command>,因此必须采取间接的方式,创建一个辅助文件来读取。

  • 创建 Shell 脚本creationdate.sh
    #! /bin/sh
    rm -f $1.timestamp
    date -r `stat -f '%m' -t '%s' $1.log` '+D:%Y%m%d%H%M%S+000000' > $1.timestamp
  • 赋予文件可执行位
    chmod u+x creationdate.sh
  • 加载之前将以下内容放入文件中datetime

    \usepackage{catchfile}
    \ifdefined\pdfcreationdate\else
      \ifnum\shellescape=1
        \immediate\write18{./creationdate.sh \jobname}
        \CatchFileDef\pdfcreationdate{\jobname.timestamp}{\catcode`\D=12 }
      \fi
    \fi
    

然后你的命令将给出所需的结果。当然,必须检查statdate接受所需的命令行选项。

西拉特克斯必须当然,可以使用命令行选项运行-shell-escape。如果不是,则行为将与没有\pdfcreationdate可用时一样,即秒数将始终为“00”。如果文件使用 pdfLaTeX 或 LuaLaTeX 处理,\pdfcreationdate则将忽略此定义,但datetime仍然会很顺利,因为这些引擎已经具有\pdfcreationdate

在 Windows 上,可以设计合适的批处理脚本。


2016 年 7 月更新

使用新的texosquery脚本,代码可以简化:

\documentclass{standalone}
\usepackage{luatex85}

\ifdefined\pdfcreationdate\else
  \usepackage{texosquery}
  \TeXOSQueryNow{\pdfcreationdate}
  \edef\pdfcreationdate{\detokenize\expandafter{\pdfcreationdate}}
\fi

\usepackage{datetime}
\newtimeformat{hhmmss}{\twodigit{\THEHOUR}\twodigit{\THEMINUTE}\twodigit{\THESECOND}}
\settimeformat{hhmmss}
\begin{document}
\currenttime
\end{document}

我添加了luatex85以防使用 LuaLaTeX。这样,-shell-escape只有 XeLaTeX 才需要。with\edef\detokenize必需的,因为\TeXOSQueryNow返回以类别代码“字母”开头的宏D,而 中的宏则datetime假定类别代码为“其他”。

注意:目前,Java 应用程序似乎只能在 Java 1.7.0_52 或更高版本上运行,但我成功地在 1.7.0_45 上重新编译了它。如果该应用程序也可以在以前版本的 Java 上使用,那就太好了。

答案2

您可以使用lualatexluatex代替,没问题:

\documentclass{article}
\usepackage{luacode}
\begin{document}
Time: \luaexec{tex.print(os.date("\%X"))}

\end{document}

luatex

Time: \directlua{tex.print(os.date("\%X"))}
\bye

在此处输入图片描述

或不带冒号:"\%H\%M\%S"。所有可选参数:

%a  abbreviated weekday name (e.g., Wed)
%A  full weekday name (e.g., Wednesday)
%b  abbreviated month name (e.g., Sep)
%B  full month name (e.g., September)
%c  date and time (e.g., 09/16/98 23:48:10)
%d  day of the month (16) [01-31]
%H  hour, using a 24-hour clock (23) [00-23]
%I  hour, using a 12-hour clock (11) [01-12]
%M  minute (48) [00-59]
%m  month (09) [01-12]
%p  either "am" or "pm" (pm)
%S  second (10) [00-61]
%w  weekday (3) [0-6 = Sunday-Saturday]
%x  date (e.g., 09/16/98)
%X  time (e.g., 23:48:10)
%Y  full year (1998)
%y  two-digit year (98) [00-99]
%%  the character `%´

相关内容