如何使用 metapost newinternal 变量

如何使用 metapost newinternal 变量

我正在尝试转换语句

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

dashed evenly withcolor green不是一个字符串,而是一个 token 列表。你想要

def varA = dashed evenly withcolor green enddef;

所以是一个宏。完整示例

def varA = dashed evenly withcolor green enddef;

beginfig(1);
drawarrow (0,0)--(100,100) varA ;
endfig;
end.

在此处输入图片描述

答案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、、filllabel命令,直到您drawoptions再次调用。

  • 请注意,颜色适用于标签和绘图,但虚线仅适用于绘制的箭头。

  • drawoptions重置全部选项,因此第二个明确地改变颜色,但也隐式地重置线条样式。

  • 因此该调用drawoptions();将重置所有默认值

  • 在普通的 MP 中,宏会在每个图形开始时beginfig自动调用来重置所有内容。drawoptions()

相关内容