在 xcolor 表达式中使用 \macro

在 xcolor 表达式中使用 \macro

所以这似乎是不可能的:

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 和\foreachs 不能很好地结合在一起,因为 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),但它们在这里也失败了。

相关内容