我正在尝试绘制我感兴趣的函数图,为此我需要重新计算 for 循环中变量的值。按照此主题,我使用数学库附带的 for 循环。对于我的计算,我还需要循环计数器的二进制扩展,为此我使用了 bitset 包。但是,我无法让它工作,也不知道哪里出了问题。这是一个 MWE:
\documentclass[tikz,border=3.14mm]{standalone}
\usetikzlibrary{calc}
\usetikzlibrary{math}
\usepackage{pgfmath,pgffor}
\usepackage{bitset}
\begin{document}
\begin{tikzpicture}
\foreach \i in {1, ..., 10}{%
\bitsetSetDec{mybitset}{\i};
\tikzmath{
\x = 0;
\y = 0;
for \j in {0,...,3}{
\b = \bitsetGet{mybitset}{\j};
\x = \x + \b;
\y = \y +2* \b;
};
};
\draw[red,thick] (\x, \y) -- ({\x +0.25}, \y);
}
\end{tikzpicture}
\end{document}
在我看来,问题出在这一行:
\b = \bitsetGet{mybitset}{\j};
但我不知道该如何修复。有什么建议吗?提前谢谢!
答案1
欢迎!主要有两个问题:
- 您不能只是期望能够像这样分配宏的值。
- 似乎你不能选择
\j
大于 的\i
。
为了解决第一个问题,你可以声明一个返回值的函数。这个函数被调用bitsetGet
,它期望第一个参数是一个由分隔的字符串"..."
。限制循环变量,使第二个问题不会发生,这样就会得到
\documentclass[tikz,border=3.14mm]{standalone}
\usetikzlibrary{math}
\usepackage{bitset}
\pgfmathdeclarefunction{bitsetGet}{2}{\begingroup
\edef\temp{\noexpand\edef\noexpand\pgfmathresult{\bitsetGet{#1}{#2}}}%
\temp
\pgfmathsmuggle\pgfmathresult
\endgroup}
\begin{document}
\begin{tikzpicture}
\foreach \i in {4, ..., 10}{%
\bitsetSetDec{mybitset}{\i};
\tikzmath{
\x = 0;
\y = 0;
for \j in {0,1,2,3}{
\b = bitsetGet("mybitset",\j);
\x = \x + \b;
\y = \y +2* \b;
};
%print {$x=\x, y=\y$};
};
%\typeout{\x,\y}
\draw[red,thick] (\x, \y) -- ({\x +0.25}, \y);
}
\end{tikzpicture}
\end{document}
我在这里假设这是一个tikzmath
问题。显然,有更简单的方法可以获得此输出。但是,直到最近我才开始意识到它有多强大\pgfmathdeclarefunction
。(这里没有使用它的功能。在绘制某些东西并使用新技巧解析坐标时,它确实很方便。)