![如何使用 metapost newinternal 变量](https://linux22.com/image/432446/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20metapost%20newinternal%20%E5%8F%98%E9%87%8F.png)
我正在尝试转换语句
drawarrow (0,0)--(100,100) dashed evenly withcolor green;
到
newinternal string varA ;
varA := "dashed evenly withcolor green" ;
drawarrow (0,0)--(100,100) varA ;
但它在 方面失败了drawarrow
。任何帮助都将不胜感激。谢谢。
答案1
答案2
除了def
,您还可以应用scantokens
将字符串转换为标记。只需确保您的字符串是 MetaPost 合理的代码:
newinternal string varA ;
varA := "dashed evenly withcolor green";
drawarrow (0,0)--(100,100) scantokens(varA);
现在,您可以存储一个字符串列表,以便稍后进行标记,但除非您确实需要将 MetaPost 块作为字符串,否则它没什么用。另一个例子:
string Vars[];
Vars[1] := "dashed evenly withcolor green";
Vars[2] := "dashed evenly withcolor red";
drawarrow (0,0)--( 100, 100) scantokens(Vars[1]);
drawarrow (0,0)--(-100,-100) scantokens(Vars[2]);
我实际上不会推荐它,因为你可能会遇到一些扩展问题(正如@egreg所说,MetaPost 和 TeX 一样,使用令牌,因此面临同样的问题),但对于最简单的情况来说它是没问题的。
答案3
Plain Metapost 已经提供了一种将同一组绘图选项应用于一系列绘图命令的机制。因此,实现(我认为)您要尝试执行的操作的另一种方法是:
prologues := 3;
outputtemplate := "%j%c.eps";
defaultfont := "phvr8r";
beginfig(1);
drawoptions(dashed evenly withcolor 1/2 green);
drawarrow origin -- (100, 100);
label.urt("Green but not dashed", (100, 100));
drawoptions(withcolor 2/3 red);
drawarrow origin -- 84 dir 72;
drawarrow origin -- 74 dir 82;
drawoptions(); % back to default colors and style
drawarrow origin -- 84 dir 13;
endfig;
end.
编译此mpost
得到
笔记
您设置的绘图选项将
drawoptions
应用于所有后续的draw
、、fill
或label
命令,直到您drawoptions
再次调用。请注意,颜色适用于标签和绘图,但虚线仅适用于绘制的箭头。
drawoptions
重置全部选项,因此第二个明确地改变颜色,但也隐式地重置线条样式。因此该调用
drawoptions();
将重置所有默认值在普通的 MP 中,宏会在每个图形开始时
beginfig
自动调用来重置所有内容。drawoptions()