我正在尝试在 Metapost 中绘制下图所示的图形,其中重要的是框之间的边缘从“完美”框底线的中间开始,到“弦”框顶线的中间结束。使用命令boxit
制作一个带有所需文本的框后,我使用 设置其坐标.c
。然后我想在绘制框本身之前在框之间画一条线,但是,我无法引用.n
、.s
或框以外的任何坐标。经过一番头痛之后,我终于找到了一种解决方法来做我想做的事情,但它对我来说就像黑魔法一样。也许对和.c
的调用以某种方式生成了必要的信息。有人可以告诉我发生了什么吗?bpath.perfect
bpath.chordal
prologues := 3;
%outputtemplate := "%j-%c.mps";
input boxes;
beginfig(0);
% Boxes
boxit.perfect(btex perfect etex); perfect.c=(0,0);
boxit.chordal(btex chordal etex); chordal.c=15right+30down;
% Will crash:
draw perfect.s--chordal.n;
drawboxed(perfect, chordal);
endfig;
beginfig(1);
% Boxes
boxit.perfect(btex perfect etex); perfect.c=(0,0);
boxit.chordal(btex chordal etex); chordal.c=15right+30down;
% Black magic. This is never actually drawn.
path temp;
temp = perfect.c--chordal.c cutbefore bpath.perfect cutafter bpath.chordal;
% Works perfectly fine:
draw perfect.s--chordal.n;
drawboxed(perfect, chordal);
endfig;
我编译时收到的错误消息如下:
This is MetaPost, version 1.999 (TeX Live 2015) (kpathsea version 6.2.1)
(/usr/local/texlive/2015/texmf-dist/metapost/base/mpost.mp
(/usr/local/texlive/2015/texmf-dist/metapost/base/plain.mp
Preloading the plain mem file, version 1.005) ) (./mwe.mp
(/usr/local/texlive/2015/texmf-dist/metapost/base/boxes.mp)
>> -ypart perfect.nw
! Undefined y coordinate has been replaced by 0.
<to be read again>
{
--->{
curl1}..{curl1}
l.13 draw perfect.s--
chordal.n;
?
答案1
您boxes.mp
需要先调用drawboxed
或 ,drawunboxed
然后才能使用您定义的框的任何锚点后缀。
避免崩溃的最简单方法是在绘制连接之前绘制框;换句话说,交换命令的顺序,如下所示:
drawboxed(perfect, chordal);
draw perfect.s--chordal.n;
这样,您的示例编译时就不会出现错误。
fixpos
直到调用和宏时,锚点才会定义fixsize
。调用drawboxed
或时会自动调用这些宏drawunboxed
。
如果你想使用锚点前你画好框之后就必须自己打电话fixpos
。fixsize
所以在 OP 案例中,你可以这样做:
fixsize(perfect, chordal);
fixpos(perfect, chordal);
draw perfect.s--chordal.n;
drawboxed(perfect, chordal);
以避免第一次出现错误draw
。但通常先调用会更简洁drawboxed
。
OP“黑魔法”之所以有效,是因为bpath
宏也自动调用fixpos
了fixsize
。
欲了解更多详细信息,请浏览的源代码boxes.mp
。