我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}
在哪里:
\regenerate
是一个两个参数的宏。\use
是一个单参数宏。- '
IfChanged
将计算 h(命令),如果值已更改,它将调用:\regenerate{commands}{h(commands)}
然后\use{h(x}}
- 如果 h(commands) 没有改变,那么它只会调用
\use{h(x}}
\regenerate{commands}{h(commands)}
会进行一些计算,将输出放在名为h(commands)
- 该命令
\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 社区面临着同样的问题,并且确实有一些解决方案,但我并不熟悉。