我正在使用 METAPOST 生成一些图表。我需要 SVG 格式的输出。我的标签是通过调用 LaTeXTex.mp
及其TEX
METAPOST 定义(也称为宏)生成的。
我的抱怨:不断地将内容写入文件并触发实例非常慢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 的明确支持(有关详细信息,请参阅手册)。