我读完了 Metafun 手册的大部分内容,但似乎找不到任何关于相对定位系统的提及。我想到了两个用例。首先,我想根据与先前点相关的路径定位点,类似于++
tikz 中的符号。其次,我想将复杂的形状彼此相距一定距离。
我不知道如何使用 Metafun 来处理第一种情况,但这里有一个工作示例(在 ConTeXt 中),用于在 tikz 中通过连续加法增量绘制一条线:
%&context
\usemodule[tikz]
\starttext
\starttikzpicture
\path[draw, black] (0cm, 0cm) -- ++(1cm, 0cm) -- ++(0cm, 1cm);
\stoptikzpicture
% vs. absolute positioning in Metafun
\startMPcode
draw (0cm, 0cm) -- (1cm, 0cm) -- (1cm, 1cm);
\stopMPcode
\stoptext
对于最简单的情况,可以用第二种情况来解决xshifted
,但如果路径/图片的尺寸发生变化,就需要进行多次编辑。
%&context
\starttext
\startMPcode
path P;
% Works with one set of sizes
P = fullcircle;
draw P scaled 1cm;
draw P scaled 1cm xshifted 2cm;
\stopMPcode
\startMPcode
path P;
% xshift distance must be manually adapted with size changes
P = fullcircle;
draw P scaled 2cm;
draw P scaled 1cm xshifted 1cm;
\stopMPcode
\stoptext
我在类似命令中找到了相对定位的示例label.rt
,并且我知道盒装,但如果存在的话,我正在寻找一种更通用的方法——比如设置路径上任意点之间的距离,而不是定义边界框。
答案1
在我看来,MetaPost 是一种比 TikZ 更具声明性的语言。因此,如果需要相对坐标,我只需定义它们:
\starttext
\startMPpage[offset=1mm]
z0 = origin;
z1 = z0 + (1cm, 0cm);
z2 = z1 + (0cm, 1cm);
draw z0 -- z1 -- z2;
\stopMPpage
\stoptext
可以沿着路径分配变量,但这并不好看!
\starttext
\startMPpage[offset=1mm]
z0 = origin;
draw z0 -- hide (z1 = z0 + (1cm,0cm);) z1
-- hide (z2 = z1 + (0cm, 1cm);) z2;
\stopMPpage
\stoptext
但是,将其包装在宏后面并获得更好的界面相对简单:
\starttext
\startMPdefinitions
pair _interpolated_point;
primarydef a --++ b =
a -- hide (_interpolated_point := a + b;)
_interpolated_point
enddef;
\stopMPdefinitions
\startMPpage[offset=1mm]
draw origin --++ (1cm, 0) --++ (0, 1cm);
\stopMPpage
\stoptext
我不太清楚第二个问题问的是什么。