背景
希望在 PDF 中包含当前日期、时间和时区。
问题
该datetime
软件包没有提供当前时区的宏。
问题
如何在 LaTeX 中编写宏来创建如下日期:
Sun Jan 09 20:17:18 EST 2011
在职的
迄今:
\usepackage{datetime}
\shortdayofweekname{\day}{\month}{\year}
\shortmonthname{} \twodigit{\day} \hhmmsstime{}
EST \number\year
我记不清楚时区(EST)。
有关的
- http://blog.jansoehlke.com/?Recipes&nr=16
- http://mirror.ctan.org/macros/latex/contrib/datetime/datetime.pdf
谢谢你!
答案1
您可以使用 pdfTeX 原语获取与 GMT 的偏移量\pdfcreationdate
:(毫无疑问 LuaTeX 有类似的东西)
\documentclass{article}
\begin{document}
\def\grabtimezone #1#2#3#4#5#6#7#8#9{\grabtimezoneB}
\def\grabtimezoneB #1#2#3#4#5#6#7{\grabtimezoneC}
\def\grabtimezoneC #1#2'#3'{sign: #1 / hr: #2 / min: #3}
\expandafter \grabtimezone\pdfcreationdate
\end{document}
如果您需要将其转换为时区字符串,则需要定义一个时区字典以匹配时间偏移。由于我认为这是多个时区的多对一映射,我不确定这将如何工作。
一旦您弄清楚了您的应用程序到底需要什么,我建议写信给作者,datetime
让其在该包中添加这样的功能。
更新要获得用于获取时区字符串输出的粗略查找表,您可以尝试以下操作:
\makeatletter
\@namedef{timezone+0930}{CST}
\@namedef{timezone+1000}{EST}
\@namedef{timezone+1030}{CST'}% daylight savings
\def\grabtimezone #1#2#3#4#5#6#7#8#9{\grabtimezoneB}
\def\grabtimezoneB #1#2#3#4#5#6#7{\grabtimezoneC}
\def\grabtimezoneC #1#2'#3'{%
\@ifundefined{timezone#1#2#3}
{No timezone for `#1#2#3'}
{\@nameuse{timezone#1#2#3}}%
}
\def\timezone{\expandafter\grabtimezone\pdfcreationdate}
\makeatother
\timezone
答案2
现在filemod
包可以返回任何文件的文件修改日期(可以通过 TeX 找到)。它基于宏\pdffilemoddate
。它适用于 pdf(La)TeX 和 Lua(La)TeX,但不适用于 Xe(La)TeX。
如果您想要了解主文件最后更改的时间,请\jobname
在下面的宏中将其用作文件名。如果您确实想要了解编译时间,可以使用以下技巧来使用宏:
\edef\pdfilemoddate#1{\pdfcreationdate}
然后让{<filename>}
论点保持空洞。
您可以使用以下方式打印(即排版日期、时间和时区)
\filemodprint{<filename>}
仅打印日期或时间+时区
\filemodprintdate{<filename>}
\filemodprinttime{<filename>}
它们使用\thefilemoddate
和\thefilemodtime
来格式化结果。这些宏分别获取{<YYYY>}{<MM>}{<DD>}
或{<HH>}{<mm>}{<SS>}{<TZ>}
作为参数。您可以重新定义它们以自定义格式打印日期或时间。还有一个\thefilemod
获取\filemodprint
所有七个参数并默认调用其他两个宏。
您还可以创建具有七个参数的自己的宏并使用:
\filemodparse{\mymacro}{<filename>}
那么时区将是#7
。