我正在尝试编写一个宏,用于rnd
Tikz 中的随机生成器(特别是),将数字映射到不同的间隔。
[0, 1] ---> [a, b]
f(x) = x*(b-a) + a
我到目前为止尝试的是:
\documentclass[tikz]{standalone}
\usetikzlibrary{hobby}
\newcommand{\interval}[3]{%
\pgfmathparse{(#3-#2)*#1 + #2}
}
\newcommand{\showinterval}[3]{%
\interval{#1}{#2}{#3}\pgfmathresult
}
\begin{document}
\tikzset{
potato/.pic = {
\draw[use Hobby shortcut,closed]
(0,0) .. (\showinterval{rnd}{0}{0.5},0.5) .. (1,0);
}
}
\begin{tikzpicture}
\draw (0, 0) rectangle (1, 1);
\draw (0,0) pic[scale=0.1] {potato};
\end{tikzpicture}
\end{document}
但我收到一个错误Incomplete \iffalse; all text was ignored
,似乎与 pgf 宏的不可扩展性有关。理论上,\showinterval
宏是为了避免这个问题而制作的。
缺陷在哪里?
答案1
我没有检查它出错的具体位置,但 TikZ 解析器通常会出现这种情况,如果你抛出涉及其自身机制的未经处理的宏,它经常会卡住。
这是另一种选择,通过使用定义适当的数学函数declare function
\documentclass[tikz]{standalone}
\usetikzlibrary{hobby}
\begin{document}
\begin{tikzpicture}[
potato/.pic = {\draw[use Hobby shortcut,closed] (0,0)
.. ({intervalmap(0,0.5,rnd)},0.5) .. (1,0);},
declare function={intervalmap(\a,\b,\s) = \s*(\b - \a) + \a;}
]
\draw (0, 0) rectangle (1, 1);
\draw (0,0) pic[scale=.1] {potato};
\end{tikzpicture}
\end{document}
答案2
其中一种方法是与 合作\pgfextra
。
\documentclass[tikz]{standalone}
\usetikzlibrary{hobby}
\newcommand{\myinterval}[3]{%
\pgfmathparse{(#3-#2)*#1 + #2}
\xdef\myx{\pgfmathresult}
}
\begin{document}
\tikzset{
potato/.pic = {
\draw[use Hobby shortcut,closed]
\pgfextra{\myinterval{rnd}{0}{0.5}}
(0,0) .. (\myx,0.5) .. (1,0);
}
}
\begin{tikzpicture}
\draw (0, 0) rectangle (1, 1);
\draw (0,0) pic[scale=0.1] {potato};
\end{tikzpicture}
\end{document}