如何在 METAPOST 中将 p.ABC 声明为路径

如何在 METAPOST 中将 p.ABC 声明为路径

在 METAPOST 中,有没有办法声明任何形式的表达p.ABC是一条路径?

(我猜,但也许有一个技巧。)

答案1

我可以几乎按照第 289 页上的想法来做Metafont 书籍

如果您不介意使用大写字母P来定义 apath并使用小写字母p来使用它,那么您可以这样做:

prologues := 3;
outputtemplate := "%j%c.eps";

def P suffix $ = path p.$; p.$ enddef;

beginfig(1);

 P.AnotherOne = ((up..down) scaled 42);
 P.ABC = origin .. 40 right rotated 50 .. 100 right rotated -30;

 draw p.ABC;

 drawarrow p.AnotherOne withcolor blue;
 drawarrow p.AnotherOne rotated 30 withcolor red;

endfig;
end.

然而,正如评论中指出的那样,我们可以做得更好。

我最初的努力是添加一些if not known这样的逻辑:

prologues := 3;
outputtemplate := "%j%c.eps";

def p suffix $ = if not known p.$: path p.$; fi p.$ enddef;

beginfig(1);

 p.AnotherOne = ((up..down) scaled 42);
 p.ABC = origin .. 40 right rotated 50 .. 100 right rotated -30;

 draw p.ABC;

 drawarrow p.AnotherOne withcolor blue;
 drawarrow p.AnotherOne rotated 30 withcolor red;

endfig;
end.

mpost 2.00 (TeXLive 2019)这样做只会给出 SIGSEGV 地址边界错误分段错误。我猜这是因为我试图p在其自己的定义中使用该符号。但有一个简单的更改可以使其工作:

prologues := 3;
outputtemplate := "%j%c.eps";

def p suffix $ = if not known p_.$: path p_.$; fi p_.$ enddef;

beginfig(1);

 p.AnotherOne = ((up..down) scaled 42);
 p.ABC = origin .. 40 right rotated 50 .. 100 right rotated -30;

 draw p.ABC;

 drawarrow p.AnotherOne withcolor blue;
 drawarrow p.AnotherOne rotated 30 withcolor red;

endfig;
end.

这使得p<suffix>扩展为一个名为 的标记p_<suffix>;并且如果该标记之前未定义,则会自动将其声明为路径。我认为这是 OP 想要的。

但用户可以感谢@AntonPetrunin 指出其他宏(例如hatchfill来自孵化.mp也用于p_临时路径,这可能会导致奇怪的问题,所以更安全的定义是这样的

def p suffix $ = if not known tt_p_.$: path tt_p_.$; fi tt_p_.$ enddef;

其中tt_是任意你喜欢的额外前缀。

笔记

  • 我们不能save在这里使用常规机制,因为这个繁琐程序的全部目的是使 tt_p_. 全局可见。因此,当我们使用其他宏包时,我们会面临全局变量冲突的风险。

  • 这个定义def p ...意味着代币p已经成为火花(具有主动意义的标记),所以你不能使用它作为一个标签不再需要。请参阅Metafont 书籍了解详情。

相关内容