所以这似乎是不可能的:
OrangeRed!\c!white
是\c
任意一种\def
公式,或者准确地说,在我的情况下是\pgfmathsetmacro
。这是 MWE
\documentclass{article}
\usepackage{mathtools}
% TIKZ & PGF
\usepackage[usenames,dvipsnames,svgnames]{xcolor}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\usepackage{tikz}
\usetikzlibrary{backgrounds, decorations.shapes, decorations.markings, shapes, patterns}
% % % % % % % % CIRCLES % % % % % % % %
% #1 angle
% #2 ray
% #3 shift
\pgfmathdeclarefunction{circleX}{3}
{%
\pgfmathparse{#3 + #2*cos(deg(#1))}%
}
\pgfmathdeclarefunction{circleY}{3}
{%
\pgfmathparse{#3 + #2*sin(deg(#1))}%
}
\begin{document}
\begin{tikzpicture}
\tikzset{
small dot/.style={fill=black, circle, scale=2}
}
\pgfmathsetmacro{\halfPi}{.5*pi}
\pgfmathsetmacro{\twoPi}{2*pi}
\pgfmathsetmacro{\r}{1}
\pgfmathsetmacro{\yshift}{0.25}
\begin{axis}[axis x line=center, axis y line=none, width=.5\textwidth, axis equal,
xtick={0,\halfPi,...,\twoPi}, xticklabels={$0$,$\frac{\pi}{2}$,$\pi$,$\frac{3\pi}{2}$,$2\pi$}]
\foreach \i in {0.25,0.5,...,1} { %
\pgfmathsetmacro{\c}{(1.2-\i)*100}
\pgfmathsetmacro{\xshift}{\i*2*pi}
%\addplot[OrangeRed!\c!white -> nope
%\addplot[color=OrangeRed!\c!white -> nope
%\addplot[color={OrangeRed!\c!white} -> nope
%\addplot[color/.expanded=OrangeRed!\c!white -> nope
\addplot[color=OrangeRed!50!white, samples=80, domain=0:2*pi]
({circleX(x,\r,\xshift)},{circleY(x,\r,\r+\yshift)});
}
\end{axis}
\end{tikzpicture}
\end{document}
有没有办法可以在表达式中使用宏xcolor
而不需要\definecolor{colorname}{rgb|cmyk|...}{color stuff definition}
?
答案1
您必须展开\c
(但我会使用不同的名称)才能\addplot
看到它:
\documentclass{article}
% TIKZ & PGF
\usepackage[usenames,dvipsnames,svgnames]{xcolor}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\usepackage{tikz}
\usetikzlibrary{backgrounds, decorations.shapes, decorations.markings, shapes, patterns}
% % % % % % % % CIRCLES % % % % % % % %
% #1 angle
% #2 ray
% #3 shift
\pgfmathdeclarefunction{circleX}{3}
{%
\pgfmathparse{#3 + #2*cos(deg(#1))}%
}
\pgfmathdeclarefunction{circleY}{3}
{%
\pgfmathparse{#3 + #2*sin(deg(#1))}%
}
\begin{document}
\begin{tikzpicture}
\tikzset{small dot/.style={fill=black, circle, scale=2}}
\pgfmathsetmacro{\halfPi}{.5*pi}
\pgfmathsetmacro{\twoPi}{2*pi}
\pgfmathsetmacro{\r}{1}
\pgfmathsetmacro{\yshift}{0.25}
\begin{axis}[
axis x line=center,
axis y line=none,
width=.5\textwidth,
axis equal,
xtick={0,\halfPi,...,\twoPi},
xticklabels={$0$,$\frac{\pi}{2}$,$\pi$,$\frac{3\pi}{2}$,$2\pi$}
]
\foreach \i in {0.25,0.5,...,1} {%
\pgfmathsetmacro{\mycol}{(1.2-\i)*100}
\edef\mycol{OrangeRed!\mycol}
\pgfmathsetmacro{\xshift}{\i*2*pi}
\expandafter\addplot\expandafter[%
\mycol!white,
samples=80,
domain=0:2*pi
]({circleX(x,\r,\xshift)},{circleY(x,\r,\r+\yshift)});
}
\end{axis}
\end{tikzpicture}
\end{document}
答案2
这是我发现的最好的方法,但我不知道你是否觉得它足够简单。它与定义颜色所需的努力大致相同。
\documentclass{article}
\usepackage{tikz,pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}
\pgfmathsetmacro{\a}{1}
\pgfmathsetmacro{\yshift}{1}
\foreach \i in {0.25,0.5,...,1} {%
\pgfmathsetmacro{\c}{(1.2-\i)*100}
\pgfmathsetmacro{\cx}{\i*2*pi}
\xdef\doplot{\noexpand\addplot[color=red!\c!yellow, samples=80]}
\doplot ({\cx + \a*cos(deg(x))},{\a + \yshift + \a*sin(deg(x))});
}
\end{axis}
\end{tikzpicture}
\end{document}
编辑:这回答了原始问题。
一切正常,除非我遗漏了什么:
\documentclass{article}
\usepackage{xcolor}
\begin{document}
\def\c{50}
Text in a {\color{red!\c!yellow} fancy} color.
\end{document}
答案3
众所周知,PGFPlots 和\foreach
s 不能很好地结合在一起,因为 PGFPlots 不会先处理图然后再绘制它们。(参见PGFplots foreach 相当于 TikZ 的多个变量,用斜线分隔有关 PGFPlot 作者本人的更多信息和解释。)该包提供了宏
\pgfplotsinvokeforeach{<list>}{<body>}
和
\pgfplotsforeachungrouped <list of variables> in {<list>}{<body>}
该手册甚至解释了问题以及\edef\temp
“预扩展”宏的用法。
然而,在您的示例中,我们可以避免这种情况,如果我们将颜色的计算推迟到实际绘制/绘制时,通过将计算移动到图内(宏\xshift
在所有情况下都会得到正确扩展,因为 PGFPlots 预计会有需要扩展的东西):
\pgfplotsinvokeforeach{0.25,0.5,...,1}{%
\pgfmathsetmacro{\xshift}{#1*2*pi}
\addplot[
/utils/exec=\pgfmathsetmacro\col{(1.2-#1)*100},
color=OrangeRed!\col!white, samples=80, domain=0:2*pi]
({circleX(x,\r,\xshift)},{circleY(x,\r,\r+\yshift)});
}
和我的qrr.misc
库及其.pgfmath strcat
处理程序你甚至可以做
color/.pgfmath strcat={"OrangeRed!",(1.2-#1)*100,"!white"}
该forest
包提供了类似的处理程序(.wrap pgfmath arg
),但它们在这里也失败了。