我对创建这种类型的文本形状很感兴趣:
如何使某些文本适合/缩放到上限函数?
我想象一个像这样的新命令\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?}