我需要 1 秒分辨率的时间。
datetime
用于\pdfcreationdate
此,但仅限于 pdf(La)TeX。
在 XeLaTeX 下,结果是这样的:
\usepackage{datetime}
...
\newtimeformat{hhmmss}{\twodigit{\THEHOUR}\twodigit{\THEMINUTE}\twodigit{\THESECOND}}
\settimeformat{hhmmss}
\currenttime
总是产生00
最后两位数字,例如:
113600
答案1
\pdfcreationdate
XeTeX 中没有像 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
,并创建一个包含当前时间的新文件,其格式类似于\pdfcreationdate
pdfTeX 中生成的格式。然后它将被读入;显示的时间将是脚本执行的时间。但是,任何最近的 TeX 发行版都应该有texlua
(因为它有luatex
),因此这应该尽可能独立于系统。
实际上,写的内容creationdate.timestamp
是这样的
\edef\tempa{\string D:20120122195802}
\def\tempb{+0100}
然后对其内容进行一些处理,使其本质上
\def\pdfcreationdate{D:20120122195802+01'00'}
这是所要求的格式datetime
(D
必须有类别代码 12,因为这是\pdfcreationdate
在 (pdf|Lua)TeX 中生成的)。
一个完整的示例,与 一起运行--shell-escape
,一如既往(否则\pdfcreationdate
将不会被定义并且会将秒数显示为“00”);如果已经存在(因此使用或作为引擎),datetime
则宏不执行任何操作。\pdfcreationdate
pdftex
luatex
\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
然后你的命令将给出所需的结果。当然,必须检查stat
并date
接受所需的命令行选项。
西拉特克斯必须当然,可以使用命令行选项运行-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
您可以使用lualatex
或luatex
代替,没问题:
\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 `%´