在 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 书籍了解详情。