LaTeX 中使用宏会减慢编译过程吗?

LaTeX 中使用宏会减慢编译过程吗?

使用宏可以简化文档的准备、进一步的修改、一致性的维护,这些只是我们享受到的巨大好处中的一小部分。

但是使用宏是否会减慢编译过程呢?

LaTeX 如何处理宏?就地替换?

答案1

尝试以下输入文件expansion.tex

\def\1{\empty\empty\empty\empty\empty\empty\empty\empty\empty\empty}
\def\2{\1\1\1\1\1\1\1\1\1\1}
\def\3{\2\2\2\2\2\2\2\2\2\2}
\def\4{\3\3\3\3\3\3\3\3\3\3}
\def\5{\4\4\4\4\4\4\4\4\4\4}
\def\6{\5\5\5\5\5\5\5\5\5\5}
\def\7{\6\6\6\6\6\6\6\6\6\6}
\def\8{\7\7\7\7\7\7\7\7\7\7}
\def\9{\8\8\8\8\8\8\8\8\8\8}
\def\0{\9\9\9\9\9\9\9\9\9\9}

\do

\bye

并使用

time tex '\def\do{\7}\input expansion'

我明白了

real    0m0.532s
user    0m0.504s
sys     0m0.012s

您可以轻松计算出所需的宏扩展数量。使用\8代替\7我得到

real    0m4.340s
user    0m4.126s
sys     0m0.017s

是的,这当然是指数增长;不要尝试\0 ;-)\6得到

real    0m0.157s
user    0m0.142s
sys     0m0.012s

这表明,使用宏不会减慢编译合理文档的速度。

宏就是宏:当需要扩展宏时,TeX 会用当前存储在内存中的替换文本所产生的标记来替换该宏。

答案2

使用 ConTeXt,可以获得有关排版时间的更细粒度的信息。宏是\testfeature

\testfeature{n}{....}

将执行第二个参数ntimes 并在终端上报告执行时间。我们来比较一下简单的宏扩展:

\def\ABC{ABC}
\starttext
\testfeature{100000}{ABC}
\testfeature{100000}{\ABC}
\stoptext

得出:

system          > starting feature test

\wait =
system          > 100000 feature tests done (0.060s)

\wait =
system          > starting feature test

\wait =
system          > 100000 feature tests done (0.066s)

\wait =

因此,排版ABC 10^6时间是0.060s,而排版\ABC 10^6时间是0.066s。因此,差异6ms10^6每次扩展 6 纳秒!我不会担心宏扩展的速度 :-)

相关内容