使用宏可以简化文档的准备、进一步的修改、一致性的维护,这些只是我们享受到的巨大好处中的一小部分。
但是使用宏是否会减慢编译过程呢?
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}{....}
将执行第二个参数n
times 并在终端上报告执行时间。我们来比较一下简单的宏扩展:
\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
。因此,差异6ms
是10^6
或每次扩展 6 纳秒!我不会担心宏扩展的速度 :-)