使用 make like 功能加速 LaTeX 软件包

使用 make like 功能加速 LaTeX 软件包

gnuplottex经常使用软件包来绘制图表,我自己的bashful软件包用于将计算机输出包含在我编写的文档中。另一个此类软件包允许将 metapost 输出包含在文档中。

问题是,在 LaTeX 中运行所有这些命令会使文档处理非常慢。我寻求一个增强版的(比如)gnuplottex,它给出了

\begin{gnuplot}[terminal=pdf,]
 gnuplot commands
\end{gnuplot}

会计算校验和gnuplot commands,将其与前一次运行的值进行比较,如果它们不同,则将再次运行 gnuplot;否则,它将只使用之前生成的 pdf 文件。我想您需要为此使用辅助文件,但我不确定我是否理解其中的权衡:应该在辅助文件中保存校验和还是保存整个数据?如何比较?

据推测,调用语法将是:

\IfChanged{commands}{\regenerate}{\reuse}

其中\regenerate,用户宏采用单个参数,该参数将commands作为参数传递。命令 \reuse 会以某种方式重用上一次运行的输出。我甚至不确定这是正确的语法。

另一个挑战是以这样一种方式设计命令,使得用户不必添加标签来使其与其他调用区分开来。


澄清:其中一种方法如下:让 h 成为生成(比如说)32 位数字的哈希函数。然后,您可以得到以下类型的命令:

\IfChanged{命令}{\regenerate}{\use}

在哪里:

  1. \regenerate是一个两个参数的宏。
  2. \use是一个单参数宏。
  3. 'IfChanged将计算 h(命令),如果值已更改,它将调用: \regenerate{commands}{h(commands)}然后\use{h(x}}
  4. 如果 h(commands) 没有改变,那么它只会调用\use{h(x}}
  5. \regenerate{commands}{h(commands)}会进行一些计算,将输出放在名为h(commands)
  6. 该命令\use{h(x}}将包含文件h(commands)

我希望这能稍微澄清一下我的想法。我得再考虑一下具体的设计。


更多关于上下文:我至少想到了三个应用程序 - 第一个是使用该bashful包在屏幕上显示计算机输出,其次是使用 gnuplottex 绘制函数(而不是数据),以及(c)使用 metapost 绘制 uml 图和其他东西。

该命令将不是运行外部“make”来生成实验数据非常有用。为此,需要一个命令来执行以下伪代码的 LaTeX 等效代码:

  If (updated(rawDataFile(s) ))
    exec(Make).
  Include(outputFile)

但我认为这不是什么大问题,因为你总是可以从命令行运行:

  % make all; pdflatex main.tex

答案1

您基本上是在寻找 Make 工具提供的功能。当源文件发生更改时,它会触发派生文件的创建。但是,它仅在源代码未包含在 LaTeX 文件中而是保留在单独的文件中时才有效。这种权衡将很难克服。

如果结果还依赖于可能已更改的其他文件(例如来自实验的数据),则计算源的哈希值不足以决定是否需要重新计算结果。(依赖关系是一团乱麻,即使使用像 Make 这样的东西也是如此。)我知道 R/Sweave 社区面临着同样的问题,并且确实有一些解决方案,但我并不熟悉。

相关内容