有没有办法在 MetaPost/MetaFun 中绘制和/或填充标签周围的任何路径?
根据手册(第 27 页)我们可以将fill
/unfill
与bbox
和一起使用thelabel
,但是,没有任何内容,比如说 。label@#
我显然尝试了手动示例,label@#
但似乎失败了。
setbound.. to..
另外,我未能正确设置标签周围的自定义路径(椭圆、星形、三角形等)为draw
/ fill
。
fill unitsquare scaled 1cm xscaled 3 yscaled 3 withcolor gray ;
picture l ; l = thelabel(btex $A$ etex, (1cm,1cm));
unfill bbox l ; draw l ;
给我们
因此,我尝试在标签周围设置一个“自定义”圆圈,而不是默认圆圈llcorner p--lrcorner p--urcorner p--ulcorner p--cycle
:
fill unitsquare scaled 1cm xscaled 3 yscaled 3 withcolor gray ;
picture l ; l = thelabel(btex $A$ etex, (1cm,1cm));
path b ; b = llcorner l..lrcorner l..urcorner l..ulcorner l..cycle ;
setbounds l to b ;
fill bbox l withcolor green ;
draw l ;
未返回预期结果:
完成所有这些的正确方法是什么?
答案1
您也可以使用普通的 Metapost 做您想做的事情。您几乎已经完成了,但您只需要让它更简单一点:
\documentclass[border=5mm]{standalone}
\usepackage{luamplib}
\begin{document}
\begin{mplibcode}
beginfig(1);
fill unitsquare scaled 1cm xscaled 3 yscaled 3 withcolor 1/2;
picture l; l = thelabel(btex $A$ etex, (1cm,1cm));
path b; b = llcorner l..lrcorner l..urcorner l..ulcorner l..cycle ;
fill b withcolor green ;
draw l;
endfig;
\end{mplibcode}
\end{document}
编译它lualatex
(或者适应普通 MP)得到这个:
您的b
路径如您所料是圆形的,但却bbox b
是正方形。因此,我所做的不同之处在于填充b
而不是bbox b
。bbox
宏总是产生正方形。它还会bboxmargin
在路径或图像周围添加空间。因此您可以编写
path b; b = for i=1 upto 4: point i of bbox l .. endfor cycle;
这样就可以画出一个不那么紧密的圆圈,就像这样:
但一般来说,先画出你想要的形状,然后在其中心添加标签可能更容易。所以你可以这样做:
\documentclass[border=5mm]{standalone}
\usepackage{luamplib}
\begin{document}
\begin{mplibcode}
beginfig(1);
fill unitsquare scaled 1cm xscaled 3 yscaled 3 withcolor 1/2;
path b; b = fullcircle scaled 16 shifted (1cm, 1cm);
fill b withcolor green;
label(btex $B$ etex, center b);
endfig;
\end{mplibcode}
\end{document}
哪个可能有点“干净”?(尽管您可能需要经过反复试验才能猜测标签的直径。)
答案2
你离得不是那么远,但总是bbox
一个矩形。下面是一个例子,我用它来curved
转换边界框。我还添加了一个带有一些随机性的选项。
精彩MetaFun 手册有很多值得学习的好东西。附录 C 在构建和转换路径时非常方便。玩得开心!
\startMPpage[offset=1dk]
fill unitsquare scaled 1cm xscaled 3 yscaled 3 withcolor "darkgray" ;
picture l ; l := thelabel(btex $A$ etex, (1cm,1cm)) ;
path b ; b := curved boundingbox l ;
fill b withcolor darkgreen ;
draw l ;
draw boundingbox l withcolor "orange" withpen pencircle scaled 0.1;
l := thelabel(btex $B$ etex, (2cm,2cm)) ;
b := (curved boundingbox l)
randomrotatedcontrols 1cm ;
fill b withcolor darkred ;
draw l ;
draw boundingbox l withcolor "orange" withpen pencircle scaled 0.1;
\stopMPpage