如何绘制/填充标签周围的任何路径?

如何绘制/填充标签周围的任何路径?

有没有办法在 MetaPost/MetaFun 中绘制和/或填充标签周围的任何路径?

根据手册(第 27 页)我们可以将fill/unfillbbox和一起使用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 bbbox宏总是产生正方形。它还会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

圈出 A 和 B

相关内容