使用计数器值作为绘图样式名称的一部分

使用计数器值作为绘图样式名称的一部分

我认为我应该能够给出一系列线条样式并使用计数器访问它们。果然,这很好;本文档

\documentclass{article}
\usepackage{tikz,pgfplots}

\tikzset{%
  Line 1/.style={color=blue,dashdotted},
  Line 2/.style={color=red,densely dashed},
  Line 3/.style={color=black,densely dotted}
}

\newcounter{counter}
\newenvironment{test}{%
  \setcounter{counter}{1} 
  \begin{tikzpicture}
}{%
  \end{tikzpicture}
}

\newcommand{\tester}{%
  \draw[style=Line \thecounter] (\thecounter,0) -- (\thecounter,1);
  \stepcounter{counter}
}

\begin{document}
  \begin{test}
    \tester
    \tester
  \end{test}
\end{document}

给出

作品

正如预期的那样。但是,如果我更改环境和命令定义来执行某些绘图,即

\newenvironment{test}{%
  \setcounter{counter}{1} 
  \begin{tikzpicture}
    \begin{axis}
}{%
    \end{axis}
  \end{tikzpicture}
}

\newcommand{\tester}{%
  \addplot[style=Line \thecounter,id=plot_\thecounter] function{\thecounter + x*\thecounter};
  \stepcounter{counter}
}

我明白了:

不起作用

显然,第三样式用于两个图;它似乎使用计数器值所有\tester命令(即 的末尾axis)。请注意 的所有其他实例如何\thecounter按预期展开。

这是怎么回事?我该如何解决?

我认为你可以pgfplots轮换风格;不过,我想从每个情节的第一个风格开始。

答案1

实现此目的的 PGFplots 方法是定义plot cycle list使用

\pgfplotscreateplotcyclelist{<name>}{
<first style options>\\%
<second style options>\\%
...\\%
}`

循环列表将针对每个新轴重新开始。如果您想要对某个图使用手动定义的样式而不推进计数器plot cycle list,则可以调用\pgfplotsset{step cycle list=-1}

\documentclass{article}
\usepackage{pgfplots}

\pgfplotscreateplotcyclelist{raphaelslist}{
  blue, dashdotted\\%
  red, densely dashed\\%
  black,densely dotted\\%
}

\begin{document}
\begin{tikzpicture}
\begin{axis}[cycle list name=raphaelslist]
    \addplot function {1+x};
    \addplot [orange, ultra thick] {2+2*x};
    \pgfplotsset{cycle list shift=-1}
    \addplot function {3+3*x};
\end{axis}
\end{tikzpicture}


\end{document}

如果您想坚持使用自制计数器解决方案,则必须使用\edef绘图命令来扩展计数器:

\documentclass{article}
\usepackage{tikz,pgfplots}

\tikzset{%
  Line 1/.style={color=blue,dashdotted},
  Line 2/.style={color=red,densely dashed},
  Line 3/.style={color=black,densely dotted}
}

\newcounter{counter}

\newenvironment{test}{%
  \setcounter{counter}{1} 
  \begin{tikzpicture}
    \begin{axis}
}{%
    \end{axis}
  \end{tikzpicture}
}


\newcommand{\tester}{%
  \edef\doplot{
    \noexpand\addplot[style=Line \thecounter,id=plot_\thecounter] function{\thecounter + x*\thecounter};
  }
  \doplot
  \stepcounter{counter}
}


\begin{document}
  \begin{test}
    \tester
    \tester
  \end{test}
\end{document}

相关内容