已经奏效的方法
我正在使用\immediate\write18
GNUdate
命令进行一些日期/时间运算。生成的 ISO 格式的时间戳(例如2011-09-09T09:59:59Z
)被写入临时文件/tmp/date.txt
,然后其内容被读入宏\ScriptResult
,我可以愉快地打印它。到目前为止一切顺利。
什么没有还工作
然后,我尝试使用包\DTMsavetimestamp
中的datetime2
保存\ScriptResult
到可以通过\DTMusedate
和\DTMusetime
(也是 的一部分datetime2
)打印的时间戳。但是,这会破坏编译。
我完全确信这是由于某些与扩展相关的问题造成的。:)
最小(非)工作示例
将以下文件保存到test.tex
并尝试通过pdflatex -shell-escape test.tex
(-shell-escape
由于\write18
)进行编译。编译将失败。然后,您可以尝试注释该行\DTMsavetimestamp{mytimestamp}{\ScriptResult}
并取消注释该行\DTMsavetimestamp{mytimestamp}{2011-09-09T09:59:59Z}
,之后 MWE 可以正常编译。这就是我认为该问题与扩展有关的原因。
% NOTE: Compile via: pdflatex -shell-escape
\documentclass{article}
\usepackage{datetime2}
\begin{document}
\def\mydate{2015-01-01}%
\def\mytime{12:23}%
\def\offset{-7}
% Black magic that works just fine and we should not have to worry about
\immediate\write18{echo '\mydate\space\mytime\space\offset hours' | sed -e 's/://' | xargs -0 date +\%Y-\%m-\%dT\%H:\%M:\%SZ -d > /tmp/date.txt}%
% Write temporary file content to \ScriptResult. NOTE: Works
% Inspired from: http://tex.stackexchange.com/a/251574/38212
\newread\myscriptresult
\immediate\openin\myscriptresult=/tmp/date.txt
\read\myscriptresult to \ScriptResult
\immediate\closein\myscriptresult
% Print \ScriptResult. NOTE: Works
\noindent Return value read from \verb|/tmp/date.txt|: \ScriptResult\\
\DTMsavetimestamp{mytimestamp}{\ScriptResult}% TODO: This breaks compilation...
%\DTMsavetimestamp{mytimestamp}{2011-09-09T09:59:59Z}% ... whereas this works.
\noindent Date: \DTMusedate{mytimestamp}\\
\noindent Time: \DTMusetime{mytimestamp}
\end{document}
限制
我正在寻找一个可以继续使用该datetime2
软件包的解决方案。如果有解决方案不是需要写入临时文件/tmp/date.txt
,这实际上是值得欢迎的(但这不是优先事项)。
答案1
使用管道输入可以正常工作:
\documentclass{article}
\usepackage{datetime2}
\begin{document}
\def\mydate{2015-01-01}%
\def\mytime{12:23}%
\def\offset{-7}
\makeatletter
\begingroup\endlinechar=-1\relax
\edef\pc{\expandafter\@gobble\string\%}
\everyeof{\noexpand}%
\edef\x{\endgroup\def\noexpand\ScriptResult{%
\@@input|"echo '\mydate\space\mytime\space\offset hours'
| sed -e 's/://'
| xargs -0 date +\pc Y-\pc m-\pc dT\pc H:\pc M:\pc SZ -d" }}\x
\makeatother
Result: \ScriptResult
\DTMsavetimestamp{mytimestamp}{\ScriptResult}
\noindent Date: \DTMusedate{mytimestamp}\\
\noindent Time: \DTMusetime{mytimestamp}
\end{document}
生成:
我猜测写入文件并读回会为语法中的一个或多个字符引入类别代码更改。如果我尝试,则会出现相同的错误:
\documentclass{article}
\usepackage{datetime2}
\begin{document}
\edef\ScriptResult{\detokenize{2015-01-01T05:23:00Z}}
Result: \ScriptResult
\DTMsavetimestamp{mytimestamp}{\ScriptResult}
\noindent Date: \DTMusedate{mytimestamp}\\
\noindent Time: \DTMusetime{mytimestamp}
\end{document}
或者,读取结果时有一些微妙的差异,但date.txt
我没有注意到。
编辑:我想到最初的问题可能是由于\ScriptResult
在读取时在末尾添加了虚假空格date.txt
,这可能会导致相同的错误消息。