使用 TeX 可以更快地进行 Metapost SVG 输出吗?

使用 TeX 可以更快地进行 Metapost SVG 输出吗?

我正在使用 METAPOST 生成一些图表。我需要 SVG 格式的输出。我的标签是通过调用 LaTeXTex.mp及其TEXMETAPOST 定义(也称为宏)生成的。

我的抱怨:不断地将内容写入文件并触发实例非常慢latex

有没有更快的方法来实现相同的结果?(我记得,我可以在带有包的 TeX 文档中使用 METAPOST luamplib,速度很快,但它会生成 PDF,而不是 SVG。)

最小示例:

prologues:=3;
input TEX;

outputformat := "svg";
outputtemplate:="%j.%{outputformat}";

string texpre;
% texpre = "%&latex" & char(10) &
texpre = 
  "\documentclass{article}" & char(10) &
  "\begin{document}  " & char(10);

TEXPRE(texpre);
TEXPOST("\end{document}");

beginfig(1)
  draw fullcircle scaled 1in;
  string l;
  l = "Foo";
  dotlabel.bot(TEX("Label is " & l), origin);
endfig;
end

答案1

此处的缓慢与 SVG 输出格式无关。TEX()使用常规 PostScript 输出的宏也会遇到同样的缓慢。问题在于TEX()宏的实现。它的工作原理是将字符串写入文件,然后关闭文件,再读回文件。这样,您可以在将常规 MP 字符串传递给 TeX 之前将它们连接起来;这是您无法用 执行的操作btex ... etex
它很慢,因为它对每个标签都执行此操作。

但是,如果您稍微解开宏,就可以直接使用 MP 原语来使用写入文件关闭然后读回的技术。然后,您可以将所有标签写入一个文件,并通过 TeX(或 LaTeX)一次性处理它。如果您有很多标签,这会快得多。

以下是一个例子(SVG 格式):

prologues := 3;
outputtemplate := "%j%c.svg";
outputformat := "svg";

beginfig(1);

n:=26;
R:=100;

  path p; 
  p = for t=0 step 360/n until 360: right scaled R rotated t -- endfor cycle;
  draw p;

  for i=0 upto n-1:
      fill fullcircle scaled dotlabeldiam shifted point i of p;
      write "label(btex $" & char (65+i) & "_0$ etex, (" 
          & decimal (1.12 xpart (point i of p)) & "," 
          & decimal (1.12 ypart (point i of p)) & "));" to ".mplabels";
  endfor
  write EOF to ".mplabels";
  input .mplabels;

endfig;
end.

这将生成该图像(转换为 PNG 以便在此处显示...)

在此处输入图片描述

MP 已经制作了 26 个独立的动态标签,但它的运行速度就像我只制作一个标签一样快。

  • 请注意稍微有点挑剔的语法:write "string" to "file"需要文件作为适当的string,但input只想要一个没有标记的标识符"

  • EOF是一个内置值,它将 EOF 标记写入文件以关闭它。

答案2

您是否正在寻找latexmp包裹? 去引用:

MetaPost 包 latexMP 实现了一个用户友好的界面,用于访问 MetaPost 中基于 LaTeX 的排版功能。要排版的文本以字符串形式给出。这甚至允许在标签中使用动态文本元素(例如计数器)。与其他实现相比,它更加灵活,因为它可以直接替代 btex..etex,而且速度更快,例如与 tex.mp 提供的解决方案相比

答案3

请注意,METAPOST 自 v1.8 以来已增加对输出 SVG 的明确支持(有关详细信息,请参阅手册)。

相关内容