我认为我应该能够给出一系列线条样式并使用计数器访问它们。果然,这很好;本文档
\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}