Changing color in foreach using arrayjob

I am trying to change the color within a foreach statement. Here a way is described how to do it depending on the foreach variable. However, I want to use HTML color code, so I decided to use arrayjob. It seems that \definecolor cannot resolve \Color(\the\value{i}). I get the error:

! Incomplete \iffalse; all text was ignored after line 30.
<inserted text>
\fi


Minimalbeispiel:

\documentclass[12pt]{article}
\usepackage[a4paper, landscape, bottom=17.9mm, left=9.6mm, top=17.9mm, right=9.6mm, nohead, nofoot]{geometry}
\usepackage{arrayjob}
\usepackage{xcolor}
\usepackage{tikz}

\begin{document}

\newarray{\Color}
{
006400&%Dunkelgrün
008000&%Grün
228B22&%Waldgrün
2E8B57&%Seegrün
}
\newcounter{i}
\setcounter{i}{1}

\pagestyle{empty}
%%% Info %%%
\begin{tikzpicture}[x=1cm,y=1cm]
\foreach \x in {0,9,18}
{
\foreach \y in {0,6,12}
{
\definecolor{currentcolor}{HTML}{\Color(\the\value{i})}%006400
\draw[step=1mm,line width=0.1pt,color=currentcolor] (\x-4.255,\y-2.705) grid (\x+4.255,\y+2.705);
}
}
\end{tikzpicture}
\newpage
\end{document}

• Welcome to TeX.SX! Use arrayjobx, not arrayjob, with LaTeX. Why not using PGF arrays? Dec 19 '15 at 21:19

The arrayjob package should not be used with LaTeX, because it redefines \array; there is the substitute arrayjobx, but it's not useful for this application, because the construction \Color(\the\value{i}) is the set of instructions to print 006400, not the string itself.

You can use the array facilities built in PGF.

\documentclass[12pt]{article}
\usepackage[a4paper, landscape, bottom=17.9mm, left=9.6mm, top=17.9mm, right=9.6mm, nohead, nofoot]{geometry}
\usepackage{xcolor}
\usepackage{tikz}

\begin{document}

\newcommand{\Colors}{{%
"000000",%Schwarz
"8FBC8F",%Dunkles Schiefergrau
"708090",%Schiefergrau
"778899",%Helles Schiefergrau
"B0C4DE",%Helles Stahlblau
"696969",%Mattes Grau
"808080",%Grau
"A9A9A9",%Dunkelgrau
"C0C0C0"%Silber
}}

\newcounter{i}
\setcounter{i}{0}

\pagestyle{empty}
%%% Info %%%

\begin{tikzpicture}[x=1cm,y=1cm]
\foreach \x in {0,9,18}
{
\foreach \y in {0,6,12}
{
\pgfmathsetmacro{\thecurrentcolor}{\Colors[\value{i}]}
\definecolor{currentcolor}{HTML}{\thecurrentcolor}%006400
\draw[step=1mm,line width=0.1pt,color=currentcolor] (\x-4.255,\y-2.705) grid (\x+4.255,\y+2.705);
\stepcounter{i}
}
}
\end{tikzpicture}

\end{document}


A different implementation, nearer to how arrayjobx works, is with expl3 and xparse.

\documentclass[12pt]{article}
\usepackage[a4paper, landscape, bottom=17.9mm, left=9.6mm, top=17.9mm, right=9.6mm, nohead, nofoot]{geometry}
\usepackage{xcolor}
\usepackage{tikz}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\definearray}{mm}
{ % #1 is the array name, #2 the comma separated values
\seq_clear_new:c { l_tomson_array_#1_seq }
\seq_set_split:cnn { l_tomson_array_#1_seq } { , } { #2 }
\cs_if_exist:cF { #1 }
{
\cs_new:cpn { #1 } { \tomson_array_use:nn { #1 } }
}
}
\cs_generate_variant:Nn \seq_set_split:Nnn { c }
\cs_new:Nn \tomson_array_use:nn
{ % #1 is the array name, #2 is an integer
\seq_item:cn { l_tomson_array_#1_seq } { #2 }
}
\ExplSyntaxOff

\definearray{Colors}{
000000, % Schwarz
8FBC8F, % Dunkles Schiefergrau
708090, % Schiefergrau
778899, % Helles Schiefergrau
B0C4DE, % Helles Stahlblau
696969, % Mattes Grau
808080, % Grau
A9A9A9, % Dunkelgrau
C0C0C0  % Silber
}

\newcounter{i}
\setcounter{i}{1}

\begin{document}

\pagestyle{empty}
%%% Info %%%

\begin{tikzpicture}[x=1cm,y=1cm]
\foreach \x in {0,9,18}
{
\foreach \y in {0,6,12}
{
\definecolor{currentcolor}{HTML}{\Colors{\value{i}}}% 006400
\draw[step=1mm,line width=0.1pt,color=currentcolor] (\x-4.255,\y-2.705) grid (\x+4.255,\y+2.705);
\stepcounter{i}
}
}
\end{tikzpicture}

\end{document}


When you do \definearray{Colors}{...} you also define the macro \Colors that takes as argument an integer and extracts the corresponding item from the array.

• Thanks a lot you for your proper reply! The array facilities built in PGF are sufficient for my task. The stepcounter{i} needs to be in place of course. Dec 20 '15 at 8:46
• The first example throws an error (the second, more complicated example compiles fine). Do you reproduce the problem? May 27 '16 at 14:41
• @PatrickT Something seems to have changed. The counter should be set to 0. May 27 '16 at 14:47
• Thank you. I find the first approach quite clear. The relatively new foreach [count=\i] construction is also very clear. I must confess you lost me with your second example. Thanks again! May 27 '16 at 14:55