为什么使用microtype和xfrac会导致编译时间过长?

为什么使用microtype和xfrac会导致编译时间过长?

当我讨论另一个问题我遇到了这个问题:

我包括了xfrac包裹并且我的文档的编译时间增加了 100 倍。经过一番尝试,我发现microtype导致了问题。假设有以下文档:

\documentclass{minimal}
\usepackage{microtype}
\usepackage{xfrac}
\begin{document}
Divide $4$ by $2$: $\sfrac{4}{2}=\sfrac{40}{20}\neq
\sfrac{42}{22}\neq\sfrac{2}{3}=\sfrac{4}{6}$. If you use many
$\sfrac{1}{2}$, $\sfrac{7}{8}$ and
microtype together it will take loooong to compile.
\end{document}

如果插入更多文本副本,编译时间会更长。我插入了 16 份副本,文档编译时间约为 20 秒。当我删除包时,microtype它将在一秒钟内完成编译。

有人能解释一下为什么需要这么长时间吗?这可能是一个错误吗microtype

答案1

(首先是怀疑,现在是答案,按照约瑟夫的要求:)

您在使用 microtype 2.4 版本时遇到的性能问题已在 v2.5 中修复,可从以下网址获取tlcontrib

答案2

使用大量计算和循环的程序包可能会导致执行速度变慢。Microtype 进行了大量计算和迭代来优化字母和单词之间的间距并确定最佳行。我猜是 O(n 3 ) 时间。

请参阅我的回答对 TeX 的各种操作进行基准测试

xfrac任何使用 LaTeX3 的东西通常运行速度都比较慢。如果你追求速度,直接使用 TeX 吧。

答案3

我已经在示例文本上复制了 20 份您的 MWE。重要的是,如果您将所有 \sfrac命令替换为“普通”\frac命令,则带有和不带有微类型的程序之间的编译时间差异会感觉微不足道。这表明,导致速度大幅下降的并不是微类型包中的某些固有缺陷(或者,如果你愿意的话,是编程错误),而是宏中内置的某种额外的间距/可拉伸性功能,\sfrac迫使微类型加倍努力地工作。

顺便说一句,有了你提供的 20 份示例文本,带有和不带有微类型的程序的输出肯定是不是相同。具体来说,虽然两个 pdf 文件都由一个 24 行的长段落组成,但这些段落中只有 1-6 行和 18-24 行是相同的。这些块之间的 11 行,即 7-17 行,在启用微类型的版本中最初比在“普通”版本(没有微类型)中设置得更松散,但到第 17 行结束时,微类型版本已经完全赶上了普通版本(因此导致第 18-24 行再次相同)。并排查看这两个 pdf 文件乍一看并没有太大的视觉差异。然而,经过进一步检查,我注意到微类型版本在第 14-17 行中成功地更和谐地显示了较长的数学序列(即,单词间距更均匀)。当然,这不是很大的区别,但对于坚持不懈的人来说可能很重要……

最后,如果有人想尝试我所报告的内容,这是我的 MWE 版本:

\documentclass{minimal}
\usepackage{xfrac,microtype}
\newcommand{\textblock}{Divide $4$ by $2$: $\sfrac{4}{2} = 
  \sfrac{40}{20} \neq \sfrac{42}{22} \neq\sfrac{2}{3}= \sfrac{4}{6}$. 
  If you use many $\sfrac{1}{2}$, $\sfrac{7}{8}$ and
  microtype together it will take loooong to compile. }
\begin{document}
%% 20 repetitions of the text contained in "textblock"
\textblock \textblock \textblock \textblock \textblock
\textblock \textblock \textblock \textblock \textblock
\textblock \textblock \textblock \textblock \textblock
\textblock \textblock \textblock \textblock \textblock
\end{document}

相关内容