假设我有一幅 TikZ 绘图:
- 有两个高度不同的矩形
- 每个矩形旁边都有一些需要添加的文本(例如A和是)
- 上面的文字必须可缩放,以与图表的步骤相匹配(此处3 步或半步)
- 下方文本的高度必须与其所在的矩形的高度完全匹配
- 所有文本应在完全相同的网格线上左对齐
- 整个绘图应该是可扩展的(文本和形状)
我的解决方案相当笨拙,就是不断改变字体大小,直到达到我或多或少满意的结果(你可以看到它还远远不够完美)。有没有办法计算这个,以便我可以设置字体大小n 个网格步骤这样我可以将 A 设置为正好 6 个台阶高吗?
这是我目前取得的进展:
\documentclass{article}
\RequirePackage{lmodern}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[thick,scale=1, every node/.style={transform shape}]
\draw[step=1cm,gray,thin] (-1,-1) grid (10,10);
\fill[gray] (0,0) -- (4,0) -- (4,2) -- (0,2) -- (0,0);
\draw[red, ultra thick,|<->|] (5,0) -- (5,2);
\node[font={\fontsize{83}{0}\selectfont\bfseries}] at (7,1) {Z};
\fill[gray] (0,3) -- (4,3) -- (4,9) -- (0,9) -- (0,3);
\draw[green, ultra thick,|<->|] (5,3) -- (5,6);
\node[font={\fontsize{124}{0}\selectfont\bfseries}] at (7,4.45) {A};
\end{tikzpicture}
\end{document}
它看起来是这样的:
更新:进一步研究
首先,我必须感谢 AndréC 传播这个消息并吸引其他专家发表评论和回答——谢谢!
我收到了一些非常有用的评论,它们为我进一步的研究提供了正确的关键词。
显然,TeX 只知道字形边界框的大小,但不知道字形本身的大小。我从一位评论者那里了解到了这一点,我非常尊重她的观点。我尽职尽责,试图证实和反驳她的说法。然而,我搜索得越多,就越能证实这一点(这里,这里, 和那里) 在测量以及在网格内精确放置字形/文本时总会涉及一些反复试验。
答案1
完成的。
import animate;
settings.tex="pdflatex";
settings.outformat="pdf";
animation Ani;
size(300);
void grid(pair A, pair B, pen p=currentpen)
{
for (int i=(int) A.x+1; i < B.x; ++i) { draw((i,A.y)--(i,B.y),p); }
for (int j=(int) A.y+1; j < B.y; ++j) { draw((A.x,j)--(B.x,j),p); }
draw(box(A,B),p);
}
grid((-1,-1),(10,10),gray);
fill((0,0) -- (4,0) -- (4,2) -- (0,2)--cycle,gray);
fill((0,3) -- (4,3) -- (4,9) -- (0,9)--cycle,gray);
for(int i=1; i<=10; ++i){
save();
real height=i/10;
path[] checkA=texpath("Asymptote");
int a=4,b=6;
pair minA=min(checkA),maxA=max(checkA);
real le=abs((maxA.x,minA.y)-minA),he=abs((minA.x,maxA.y)-minA);
transform sca=scale(height*a/le,height*b/he);
minA=min(sca*checkA);
maxA=max(sca*checkA);
pair cente=(minA+maxA)/2;
fill(shift((5,3)+(cente-minA))*sca*checkA);
path[] checkZ=texpath("My drawing tool");
int a=4,b=2;
pair minZ=min(checkZ),maxZ=max(checkZ);
real le=abs((maxZ.x,minZ.y)-minZ),he=abs((minZ.x,maxZ.y)-minZ);
transform sca=scale(height*a/le,height*b/he);
minZ=min(sca*checkZ);
maxZ=max(sca*checkZ);
pair cente=(minZ+maxZ)/2;
fill(shift((5,0)+(cente-minZ))*sca*checkZ);
Ani.add();
restore();
}
erase();
Ani.movie(BBox(3mm,Fill(white)));
渐近线真的可以做到!
您可以一步一步地检查以了解我的代码。
此函数path[] texpath(Label L)
返回 TEX 绘制标签 L 时将填充的路径数组。
size(300);
void grid(pair A, pair B, pen p=currentpen)
{
for (int i=(int) A.x+1; i < B.x; ++i) { draw((i,A.y)--(i,B.y),p); }
for (int j=(int) A.y+1; j < B.y; ++j) { draw((A.x,j)--(B.x,j),p); }
draw(box(A,B),p);
}
grid((-1,-1),(10,10),gray);
fill((0,0) -- (4,0) -- (4,2) -- (0,2)--cycle,gray);
fill((0,3) -- (4,3) -- (4,9) -- (0,9)--cycle,gray);
path[] checkA=texpath("A");
int a=4,b=6;
pair minA=min(checkA),maxA=max(checkA);
real le=abs((maxA.x,minA.y)-minA),he=abs((minA.x,maxA.y)-minA);
transform sca=scale(a/le,b/he);
minA=min(sca*checkA);
maxA=max(sca*checkA);
pair cente=(minA+maxA)/2;
fill(shift((5,3)+(cente-minA))*sca*checkA);
path[] checkZ=texpath("Z");
int a=4,b=2;
pair minZ=min(checkZ),maxZ=max(checkZ);
real le=abs((maxZ.x,minZ.y)-minZ),he=abs((minZ.x,maxZ.y)-minZ);
transform sca=scale(a/le,b/he);
minZ=min(sca*checkZ);
maxZ=max(sca*checkZ);
pair cente=(minZ+maxZ)/2;
fill(shift((5,0)+(cente-minZ))*sca*checkZ);