更新:进一步研究

更新:进一步研究

假设我有一幅 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);

在此处输入图片描述

相关内容