如何在 TikZ 中将某些文本适合/缩放到上限函数?

如何在 TikZ 中将某些文本适合/缩放到上限函数?

我对创建这种类型的文本形状很感兴趣:

在此处输入图片描述

如何使某些文本适合/缩放到上限函数?

我想象一个像这样的新命令\funcText[function]{Text},但我很快就卡住了(文本维度的问题以匹配函数的定义域+实际上根据函数本身缩放字母)。

迄今为止的研究

上一个问题文本适合某些形状,如 Guillaume Apollinaire 的书法。基于这个著名的答案

绘制不同形状的文本

例子

例如,我想我可以应用该方法来使用带有下面文字的正态曲线。

在此处输入图片描述

\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{arrows.meta}
\usepackage{mathtools}
\begin{document}

\tikzset{
    myfonction/.style={
        >={Stealth[length=6pt]},
    },
}

\begin{tikzpicture}[
        myfonction,
        declare function={
            f(\x)=2*exp(-\x*\x/3);
            xmax=3.5;
            xmin=-3.4;
            x0=1.5;
            ymax=2.75;
        },
    ]

    \draw[thick] plot[domain=xmin:xmax,samples=51,smooth] (\x,{f(\x)});

\end{tikzpicture}
\end{document}

答案1

这是一个概念证明。可能需要进行调整。基本思想是使用该xstring包计算\strlen文本中的字符数( )(UTF-8 也可以——见下文),然后将每个字符单独放置并缩放为一个节点。水平放置通过计算 来确定(就像黎曼和一样)(xmax-xmin)/strlen。垂直缩放由函数确定(也像黎曼和一样)。

\functext[red]{2*exp(-\x*\x/3)}{-3.5}{3.5}{HELLOWORLD!}

在此处输入图片描述

\functext[blue,font=\sffamily\bfseries]{\x*\x/8+1}{-3.5}{3.5}{TEXT UNDER A PARABOLA!}

在此处输入图片描述

一般要求是

\functext[<tikz options>]{<function>}{<xmin>}{<xmax>}{<text>}

以下是代码:

\documentclass{article}

\usepackage{tikz,xstring}

\newcommand{\xfactor}{25}
\newcommand{\yfactor}{3.9}

\newcommand{\functext}[5][]{\StrLen{#5}[\strlen]\begin{tikzpicture}
    \draw[ultra thin, domain=#3:#4, smooth, variable=\x] plot (\x, {#2});
    \draw[ultra thin] (#3,0)--(#4,0);
    \foreach \n[evaluate=\n as \xt using #3+(#4-#3)/\strlen*(\n-.5),
        evaluate=\n as \x using \xt,
        evaluate={\yt=#2}]
        in {1,...,\strlen}{
    \node[inner sep=0pt,anchor=base,yscale=\yt*\yfactor,xscale=\xfactor/\strlen,#1] at (\xt,0) {\StrChar{#5}{\n}}; 
    }
    \end{tikzpicture}}

\begin{document}

\functext[red]{2*exp(-\x*\x/3)}{-3.5}{3.5}{HELLOWORLD!}

\vspace{1cm}
\functext[blue,font=\sffamily\bfseries]{\x*\x/8+1}{-3.5}{3.5}{TEXT UNDER A PARABOLA!}

\end{document}

两个全局常量\xfactor\yfactor控制字母的宽度和高度。 较大\xfactor会使字母更宽(如果太大则重叠)。 较大\yfactor会使字母相对于函数更高(如果太大则交叉)。 如果您希望字母和函数之间有空间,请减小此值。 字体更改可能需要调整这些因素。

\draw如果您不想绘制曲线(和 x 轴),可以删除宏中的前两个命令。

小写字母可以,但它们不会达到函数的效果(f、d 等除外)。\usepackage[T1]{fontenc}序言中需要 UTF-8 字符,并且除非您减少,否则重音大写字母可能会超出函数范围\yfactor

同样的技巧也适用于在两条曲线之间绘制文本。我们定义一个新的宏\funcstext,它接受 6 个参数(一个可选):

\funcstext[<tikz options>]{<function1>}{<function2>}{<xmin>}{<xmax>}{<text>}

\funcstext[green!50!black,font=\sffamily\bfseries]{2*exp(-\x*\x/3)}{-\x*\x/8}{-3.5}{3.5}{TEXT BETWEEN TWO CURVES!}

在此处输入图片描述

以下是该宏的代码:

\newcommand{\funcstext}[6][]{\StrLen{#6}[\strlen]\begin{tikzpicture}
    \draw[ultra thin, domain=#4:#5, smooth, variable=\x] plot (\x, {#2});
    \draw[ultra thin, domain=#4:#5, smooth, variable=\x] plot (\x, {#3});
    \foreach \n[evaluate=\n as \xt using #4+(#5-#4)/\strlen*(\n-.5),
        evaluate=\n as \x using \xt,
        evaluate={\yt=#2-#3},
        evaluate={\yb=#3}]
        in {1,...,\strlen}{
    \node[inner sep=0pt,anchor=base,yscale=\yt*\yfactor,xscale=\xfactor/\strlen,#1] at (\xt,\yb) {\StrChar{#6}{\n}}; 
    }
    \end{tikzpicture}}

即使函数相交,这也有效,并可能产生理想的结果:

\funcstext[orange,font=\sffamily\bfseries]{2*exp(-\x*\x/3)}{\x*\x/8}{-3.5}{3.5}{CAN I DRAW TEXT ON A MöBIUS STRIP?}

在此处输入图片描述

相关内容