为什么这种语法在 METAFUN/METAPOST 下会输出错误?

为什么这种语法在 METAFUN/METAPOST 下会输出错误?

鉴于此 MWE(在 ConTeXt 下编译)

\starttext
\startMPpage

%variables
u:=1mm ;
numeric l[];
l[1]:=30 ;
l[2]:=70 ;

draw (0,0) -- (0,100u) ;
%this does not work
%fill unitsquare xscaled (l[2]-l[1])*u yscaled 100*u shifted (l[1]*u,0) withcolor red ;

%this does
fill unitsquare xscaled (l[2]*u-l[1]*u) yscaled 100u shifted (l[1]*u,0) withcolor red ;

\stopMPpage
\stoptext

你能解释一下为什么吗

fill unitsquare xscaled (l[2]-l[1])*u yscaled 100*u shifted (l[1]*u,0) withcolor red ;

失败,而

fill unitsquare xscaled (l[2]*u-l[1]*u) yscaled 100*u shifted (l[1]*u,0) withcolor red ;

能完成这个工作吗?

从我(数学不太好)的角度来看,(l[2]-l[1])*u 应该完全相同,而这种误解常常导致我犯令人沮丧的错误。

我希望这不是重复的,但不知道如何给出一个合适的标题。

答案1

根据 Metapost 手册xscaled基本的,因此它与乘法具有相同的优先级。

它以一对路径或图片和一个数字作为参数,分别返回一对路径或图片;使用“不起作用”的语法,Metapost 正在做

unitsquare xscaled (l[2]-l[1])

然后尝试将结果乘以u,这是一个无效的操作。

当操作具有相同的优先级(例如所有主操作)时,Metapost 会在左侧关联。要获得不同的关联,您需要使用括号。

你得到的错误是

>> path
>> 2.83464
! Not implemented: (path)*(known numeric).
<to be read again> 
                   yscaled

当然((l[2]-l[1])*u)也可以,但是外面的括号不能省略。

相关内容