使用 #1 时在 PGF 轴内执行 for 循环

使用 #1 时在 PGF 轴内执行 for 循环

\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}

这将导致以下输出(我不确定这是否是您的意图):

在此处输入图片描述

相关内容