tikz 新手在这里。
我想制作“模板”绘图,其中一部分是一条线,然后在线的顶部放置不同大小的标签。
标签是一些乳胶代码(方程式)。
其中一个问题是,由于我每次都使用固定坐标,但方程本身可能长或短,所以我需要一种方法来让乳胶字体大小自动缩放以适应空间。
否则,每次我绘制新图时,我都必须反复尝试更改坐标或手动更改字体大小。以下是 MWE,可以更好地解释我的意思
\documentclass[11pt]{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\coordinate[label=left:A] (A) at (0,0);
\coordinate[label=right:B] (B) at (3,0);
\newcommand{\myLabel}{$\sin(x)+\cos(y)=\int_0^\infty e^{x y}\, dx$}
\draw (A) -- node[above] {\myLabel} ++(B);
\end{tikzpicture}
\end{document}
现在,我可以使用较小的字体再次尝试,或者更改坐标以使空间更大,以便新标签可以适应。
我不想改变坐标,因为如果这些是更大图表的一部分,则意味着我还必须改变其他坐标,并且事情将开始崩溃,因为一旦我改变一个坐标,我必须去更新所有其他坐标以保持形状相同。
所以我再试一次用较小的字体,像这样
\newcommand{\myLabel}{{\footnotesize{$\sin(x)+\cos(y)=\int_0^\infty e^{x y}\, dx$}}};
好的,好一点
但仍然不合适。所以我现在尝试
\newcommand{\myLabel}{{\tiny{$\sin(x)+\cos(y)=\int_0^\infty e^{x y}\, dx$}}};
好的,好一点了。
但这都是反复试验的结果。我想要一种方法来自动化这个过程,即告诉 tikz 将文本缩放到一行上两个坐标之间的大小以“适合”。
做这种事的好方法是什么?即我希望标签自动“适应”它们所在的空间,而不必每次更改标签时都编辑坐标。
答案1
一般策略是测量路径的长度,然后测量节点内容的宽度(第一个例子)来计算相关的比例因子,或者使用将adjustbox
节点缩放到路径的长度(第二个例子)。
\documentclass[11pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\coordinate[label=left:A] (A) at (0,0);
\coordinate[label=right:B] (B) at (3,0);
\newcommand{\myLabel}{$\sin(x)+\cos(y)=\int_0^\infty e^{x y}\, dx$}
\pgfmathsetmacro{\mywidth}{width("\myLabel")}
\draw let \p1=($(B)-(A)$),\n1={veclen(\x1,\y1)} in (A) --
node[above,scale={\n1/\mywidth}] {\myLabel} ++(B);
\end{tikzpicture}
\end{document}
你可以把它变成一种风格。这个案例可以根据实际用例进行调整,我不知道。
\documentclass[tikz,border=3.14mm]{standalone}
\usetikzlibrary{calc}
\usepackage{adjustbox}
\begin{document}
\begin{tikzpicture}[fitting label/.style args={between #1 and #2 with #3}{%
insert path={let \p1=($(#2)-(#1)$),\n1={veclen(\x1,\y1)}
in (#1) -- (#2) node[midway]{\adjustbox{width=\n1}{#3}}
}}]
\coordinate[label=left:A] (A) at (0,0);
\coordinate[label=right:B] (B) at (3,0);
\newcommand{\myLabel}{$\displaystyle\sin(x)+\cos(y)=\int\limits_0^\infty \mathrm{e}^{x y}\,
\mathrm{d}x$}
\draw[above,fitting label=between A and B with \myLabel];
\end{tikzpicture}
\end{document}