如何使标签自动缩放以适合 tikz 中的两个坐标之间?

如何使标签自动缩放以适合 tikz 中的两个坐标之间?

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}

Mathematica 图形

现在,我可以使用较小的字体再次尝试,或者更改坐标以使空间更大,以便新标签可以适应。

我不想改变坐标,因为如果这些是更大图表的一部分,则意味着我还必须改变其他坐标,并且事情将开始崩溃,因为一旦我改变一个坐标,我必须去更新所有其他坐标以保持形状相同。

所以我再试一次用较小的字体,像这样

\newcommand{\myLabel}{{\footnotesize{$\sin(x)+\cos(y)=\int_0^\infty e^{x y}\, dx$}}};

好的,好一点

Mathematica 图形

但仍然不合适。所以我现在尝试

 \newcommand{\myLabel}{{\tiny{$\sin(x)+\cos(y)=\int_0^\infty e^{x y}\, dx$}}};

Mathematica 图形

好的,好一点了。

但这都是反复试验的结果。我想要一种方法来自动化这个过程,即告诉 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}

在此处输入图片描述

相关内容