我正在使用 Asymptote 绘制图形。我正在制作一个反正切图。我想给图形贴标签,但我希望标签伸出边界框。我想要这样做是因为如果我只让 Asymptote 将标签包含在边界框中,那么当我将图形放入文档并将其居中时,它看起来就会偏离中心(正确的说法是标签没有图形“重量”吗?)。
简而言之,如果将下面的内容更改为“说” \makebox[0em][l]{$\arctan(..)$}
,则 Asymptote 会将文本剪切到边界框中。我如何保留 bb,但让所有标签都显示出来?
// arctan.asy
import settings;
settings.outformat="pdf";
settings.render=0;
unitsize(1cm);
import graph;
real f(real x) {
return (atan(x)+(pi/2.0))/pi;
}
real xmin = -3.5;
real xmax = 3.5;
real ymin = -0.35;
real ymax = 1.5;
draw((xmin,0) -- (xmax,0), blue, arrow=None);
draw((0,ymin) -- (0,ymax), blue, arrow = None);
path g = graph(f,xmin,xmax);
draw(g,red);
label("\makebox[0em][c]{$\scriptstyle (\arctan(x)+(\pi/2))/\pi$}", (2.15,0.8), S);
显然,我可以通过目测来解决这个问题。但是有自动解决方案吗?
答案1
可能有更简单的方法,但这里有一个解决方案。centerAtOrigin
下面代码中显示的函数将在绘图上填充一个透明矩形。矩形按比例缩放并以原点为中心,使得图形原点位于左右中心。我在下面的绘图中添加了黑色边框,只是为了说明绘图左侧的白色边框。
// arctan.asy
import settings;
settings.outformat="pdf";
settings.render=0;
unitsize(1cm);
import graph;
real f(real x) {
return (atan(x)+(pi/2.0))/pi;
}
real xmin = -3.5;
real xmax = 3.5;
real ymin = -0.35;
real ymax = 1.5;
draw((xmin,0) -- (xmax,0), blue, arrow=None);
draw((0,ymin) -- (0,ymax), blue, arrow = None);
path g = graph(f,xmin,xmax);
draw(g,red);
label("$\scriptstyle (\arctan(x)+(\pi/2))/\pi$", (xmax,0.8), S);
void centerAtOrigin()
{
pair origMinPoint = min(currentpicture)/72*2.54;
pair origMaxPoint = max(currentpicture)/72*2.54;
pair origSize = size(currentpicture)/72*2.54;
real xmin = origMinPoint.x;
real xmax = origMaxPoint.x;
real ymin = origMinPoint.y;
if (xmax > fabs(xmin)) { xmin = -xmax; }
if (fabs(xmin) > xmax) { xmax = -xmin; }
fill(shift(xmin,ymin)*scale(xmax-xmin,origSize.y)*
unitsquare, opacity(0)+white);
}
centerAtOrigin();
编辑:即使标签位于边界框之外,此方法也不会显示标签,而是扩展另一侧的边界框,以保持垂直轴居中。