\foreach
在 PGF 中不起作用,所以替代方案似乎是 \pgfplotsinvokeforeach
。我的问题是我想定义自己的宏,这些宏将插入到轴环境中,例如
\documentclass{article}
\usepackage{pgfplots}
\usepgfplotslibrary{fillbetween}
\usepackage{tikz}
\def\plotsine#1#2#3{
\addplot[name path=F1, domain=0:360, samples=100, draw=#3, line width=1.0]
({ x*3.14/180 }, { sin(x*#2) });
% Want to insert a loop here, but how?
% Cannot use \foreach
%\foreach \i in {0,...,#2+1}
%{
% \node (#1\i) at ($(\i,0)$) {};
%}
% This doesn't work because symbol #1 is overloaded
%\pgfplotsinvokeforeach {1,2,...,#2+1} {
% \node (#1) at (#1,0) {#1};
%}
}
\begin{document}
\begin{tikzpicture}
\begin{axis}[axis equal,hide axis]
\plotsine{N1}{3}{red}
\plotsine{N2}{5}{blue}
\plotsine{N3}{0}{black}
\end{axis}
\end{tikzpicture}
\end{document}
在此示例中,我希望\plotsine{}{}
在轴环境中可用,以便可以非常快速地在轴上绘制多个。我想在里面运行一个循环,例如在每个 $x$ 截距处放置一个节点,我无法使用它,\pgfplotsinvokeforeach
因为它明确依赖于对 的访问#1
,这会产生冲突。
在这个环境中还有其他循环吗?
答案1
我不太明白输出应该是什么样子,但是如果您需要引用嵌套宏定义的参数,您应该#
在相关的占位符中添加另一个参数,这样#1
就会变成##1
。
除此之外,请注意pgfplots
已经加载了tikz
包,因此无需tikz
再次加载。此外,建议告诉pgfplots
包它应该使用兼容模式,以便使用最新的功能。这在这里很重要,因为它允许您使用简单的符号,例如(1,0)
将节点定位在轴上的相关位置。否则您需要使用(axis cs:1,0)
。
因此,你的代码可能看起来像这样:
\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}
\def\plotsine#1#2#3{
\addplot[domain=0:360, samples=100, draw=#3, line width=1.0]
({ x*3.14/180 }, { sin(x*#2) });
\pgfplotsinvokeforeach {1,2,...,#2+1} {
\node (##1) at (##1,0) {#1};
}
}
\begin{document}
\begin{tikzpicture}
\begin{axis}[axis equal,hide axis]
\plotsine{N1}{3}{red}
\plotsine{N2}{5}{blue}
\plotsine{N3}{0}{black}
\end{axis}
\end{tikzpicture}
\end{document}
这将导致以下输出(我不确定这是否是您的意图):