Foreach bei mehrdimensionalen Array-Problemen

Foreach bei mehrdimensionalen Array-Problemen

Ich habe keine Erfahrung mit LaTeX/TikZ, daher mache ich vielleicht etwas Dummes.

Ich habe zwei Versionen dieses Codes. Eine funktioniert, die andere nicht, und ich bin mit meinem Latein am Ende, wenn ich versuche herauszufinden, warum die zweite nicht funktioniert.

Zunächst die Version, die funktioniert:

\documentclass[parskip]{scrartcl}
\usepackage[left=1cm, right = 3cm, top = 1cm, bottom = 1cm]{geometry}
\usepackage{tikz}
\usepackage{pifont} 
\usepackage{xifthen}
\usepackage[utf8]{inputenc}
\usepackage{forloop}
\usepackage[nomessages]{fp}


\usetikzlibrary{shapes}
\usetikzlibrary{calc}


\newcommand\sz{1.5cm}

%usage: size guid
\newcommand\hexboard[2]{
\begin{tikzpicture} [hexa/.style= {shape=regular polygon,regular polygon sides=6,minimum size=\sz, draw,inner sep=0,anchor=center,fill=lightgray!85!blue,rotate=0}, remember picture]
    \newcommand\sep{x}
    \pgfmathsetmacro\minCoord{int(-1*#1)} 
    \foreach \j in {\minCoord,...,#1}{% 
        \foreach \i in {\minCoord,...,#1}{%
            \ifthenelse{\cnttest{ \minCoord }{<}{ \i*\j }}{\node[hexa] (#2_h\i\sep\j) at ({(\i*.75*\sz)},{\j*\sz*sqrt(3)/2 - \i*\sz*sqrt(3)/4}) {\i\sep\j};}{}  
        }
    } 
\end{tikzpicture}
}

%usage: {{x1,y1}...} color opacity guid
\newcommand\targetedHexes[4]{
\begin{tikzpicture} [hexa/.style= {fill opacity = #3, shape=regular polygon,regular polygon sides=6,minimum size=\sz, draw,inner sep=0,anchor=center,fill=lightgray!85!blue,rotate=0}, remember picture, overlay]
    \foreach [count=\x] \pt in {#1} {
            \node [hexa, fill = #2] (target\x) at (#4_h\pt) {};
        }
\end{tikzpicture}
}
%usage: guid
\newcommand\drawSelf[1]{
\begin{tikzpicture} [hexa/.style= {fill opacity = .5, shape=regular polygon,regular polygon sides=6,minimum size=\sz, draw,inner sep=0,anchor=center,fill=lightgray!85!blue,rotate=0}, remember picture, overlay]
    \node [hexa, color = blue] (self) at (#1_h0x0){};
\end{tikzpicture}
}

\newcommand\areaEffect[2]{
    \hexboard{#1}{hello}
        \targetedHexes{#2}{red}{0.5}{hello}
    \drawSelf{hello}
}

\begin{document}
\areaEffect{2}{{0x1},{0x2},{1x0}}
\end{document}

Im Wesentlichen zeichnet es ein Hexagon-Raster und überschreibt dann bestimmte Hexagons (die als Koordinatenliste übergeben werden) mit einer anderen Farbe.

Ich möchte mehrere Gruppen angeben können, von denen jede ein anderes color/ erhält opacity. Das Ändern des obigen Befehls zum Ersetzen der letzten 10 Zeilen funktioniert jedoch nicht:

\newcommand\areaEffect[2]{
    \hexboard{#1}{hello}
    \foreach [count=\s] \section in {#2}{
            \targetedHexes{\section}{red}{0.15*\s}{hello}
    }
    \drawSelf{hello}
}

\begin{document}
\areaEffect{2}{{{0x1},{0x2}},{{1x0}}}
\end{document}

Insbesondere wird in der alten Version in \targetedHexes, in (target\x)at als (#4_h\pt)oder \ptausgewertet . In der neuen Version wird es als oder 0x1ausgewertet .0x2{0x1}{0x2}

Ich denke, meine Fragen sind die folgenden:

Was ist hier los? Warum sind diese unterschiedlich? Sollten sie nicht mehr oder weniger gleichwertig sein?

Wie behebe ich die zweite Version?

Vielen Dank für Ihre Zeit!

Antwort1

In der ersten Version wird durch gewöhnliche Parameterersetzung als erstes Argument \targetedHexesaufgerufen .{0x1},{0x2},{1x0}

In der zweiten Variante wird mit als erstem Argument \targetedHexesaufgerufen ; an dieser Stelle findet keine Erweiterung statt. Es hängt nun vom nachfolgenden Code ab, ob rechtzeitig erweitert wird; was offenbar nicht der Fall ist.\section\section

Das Erweitern \sectionvor dem Aufrufen targetedHexesscheint der Trick zu sein.

\newcommand\areaEffect[2]{
    \hexboard{#1}{hello}
    \foreach [count=\s] \section in {#2}{
            \expandafter\targetedHexes\expandafter{\section}{red}{0.15*\s}{hello}
    }
    \drawSelf{hello}
}

verwandte Informationen