我问了这个问题的简化版本这里但不幸的是,在构建我的 MWE 时,一些细节似乎丢失了。
我的实际的目标是创建一个交替颜色的命令。我尝试了 David Carlisle 在该问题的回答中建议的解决方案,但这对我的情况不起作用:
\documentclass{article}
\usepackage{tikz}
\def\currentred{red\let\currentcol\currentgreen}
\def\currentgreen{green\let\currentol\currentblue}
\def\currentblue{blue\let\currentcol\currentred}
\let\currentcol\currentred
\begin{document}
\tikz{
\foreach \i in {1,...,10} {
\node at (\i,\i) {\color{\currentcol} \i}
}}
\end{document}
这会出现“TeX 容量超出”的错误。
答案1
只要你加载 Ti钾Z 您可以访问包含数组和模函数的 pgf 机制。要循环浏览颜色列表,
\def\LstColors{"myBlue","myYellow","myBrown"}
你需要做的就是说
\pgfmathsetmacro{\mycolor}{{\LstColors}[Mod(\i-1,3)]}
完整示例:
\documentclass{article}
\usepackage{tikz}
\definecolor{myBlue}{RGB}{0,114,206}
\definecolor{myYellow}{RGB}{255,199,44}
\definecolor{myBrown}{RGB}{154,51,36}
\begin{document}
\begin{tikzpicture}
\def\LstColors{"myBlue","myYellow","myBrown"}
\foreach \i in {1,...,10} {
\pgfmathsetmacro{\mycolor}{{\LstColors}[Mod(\i-1,3)]}
\node[color=\mycolor] at (\i,\i) {\i};}
\end{tikzpicture}
\end{document}
答案2
您可以使用引号来避免怪癖,\pgfmathparse
并\def
使用expl3
:
\documentclass{article}
\usepackage{tikz}
\usepackage{xparse}
\definecolor{myBlue}{RGB}{0,114,206}
\definecolor{myYellow}{RGB}{255,199,44}
\definecolor{myBrown}{RGB}{154,51,36}
\ExplSyntaxOn
\NewDocumentCommand{\setcolorlist}{m}
{
\seq_set_from_clist:Nn \l_luke_colorlist_seq { #1 }
% sequences are indexed from 1, so transfer the last item to the left
\seq_pop_right:NN \l_luke_colorlist_seq \l_tmpa_tl
\seq_put_left:NV \l_luke_colorlist_seq \l_tmpa_tl
}
\NewExpandableDocumentCommand{\getcolor}{m}
{
\seq_item:Nn \l_luke_colorlist_seq
{% mod out and add one
\int_mod:nn { #1 } { \seq_count:N \l_luke_colorlist_seq } + 1
}
}
\seq_new:N \l_luke_colorlist_seq
\ExplSyntaxOff
\begin{document}
\begin{tikzpicture}
\setcolorlist{myBlue,myYellow,myBrown}
\foreach \i in {1,...,10} {
\node[color=\getcolor{\i}] at (\i/2,\i/2) {\i};
}
\end{tikzpicture}
\quad
\begin{tikzpicture}
\setcolorlist{myBlue,myYellow}
\foreach \i in {1,...,10} {
\node[color=\getcolor{\i}] at (\i/2,\i/2) {\i};
}
\end{tikzpicture}
\end{document}
您可以在内部定义一个颜色列表tikzpicture
,并且它只能在本地使用,或者通过在文档前言中设置它来使其成为“全局”列表;这样的全局列表总是可以在本地被覆盖。