答案1
由于 XeTeX 没有计时功能,因此保留了 shell 转义功能。缺点是运行持续时间变化的外部程序的开销很大。
以下示例以纯文本和 LaTeX 格式运行。它是为 Linux 下的 Perl 编写的,需要开关-shell-escape
:
xetex -shell-escape test
xelatex -shell-escape test
接口是(宏名称以 为前缀xetk
):
\xetkresettimer
类似于\pdfresettimer
定时器重置。\xetksetelapsedtime
获取与上次调用的当前时间差\xetkresettimer
。\xetkelapsedtime
包含以十进制数表示的秒数时间,由 设定\xetksetelapsedtime
。
文件test.tex
:
\catcode`\@=11 % \makeatletter
\newread\xetk@pipe
\def\xetk@resetargs{}
\def\xetkresettimer{%
\begingroup
% the end of line character must be disabled,
% otherwise it could add active characters, ...
\endlinechar=-1 %
\openin\xetk@pipe="|perl -e '%
use Time::HiRes qw[gettimeofday];%
@t=gettimeofday;%
print qq[@t]%
'"\relax
\global\read\xetk@pipe to\xetk@resetargs
\closein\xetk@pipe
\endgroup
}
\xetkresettimer
\wlog{XeTeX timekeeping initialization: \xetk@resetargs}
\def\xetkelapsedtime{0}
\edef\xetksetelapsedtime{%
\begingroup
\endlinechar=-1 %
\openin\xetk@pipe="|perl -e '%
use Time::HiRes qw[tv_interval];%
print tv_interval(\string\@ARGV)%
' -- \noexpand\xetk@resetargs"\relax
\global\read\xetk@pipe to\noexpand\xetkelapsedtime
\closein\xetk@pipe
\endgroup
}
%%% Testing
\def\test{%
\xetkresettimer
\xetksetelapsedtime
\immediate\write16{* Elapsed time: \xetkelapsedtime\space s}%
}
\test
\test
\test
\test
\test
\csname @@end\endcsname\end % end job
宏\test
重置计时器(调用外部程序),不执行任何操作并再次调用外部程序来获取时间差:
* Elapsed time: 0.032371 s
* Elapsed time: 0.032007 s
* Elapsed time: 0.035123 s
* Elapsed time: 0.032473 s
* Elapsed time: 0.033759 s