"indirekte" Variablen in foreach

"indirekte" Variablen in foreach

Ich versuche, drei „Graphen“ zu zeichnen, also nebeneinander liegende Rechtecke. Auf jedem Diagramm müssen vier Punkte platziert werden. Diese vier Punkte sind die „Ergebnisse“.

Die Verwendung einer foreachSchleife bietet sich für die Diagramme an, da das gesamte Layout und die Beschriftungen gleich sind.

Was ich nicht herausfinden kann, ist, wie ich die Datenliste an jede Iteration übergebe. In anderen Sprachen würde ich so etwas wie ein verschachteltes verwenden foreach, bei dem eine indirekte Variable verwendet wird, deren Name auf die zu plottenden Daten verweist, um die Datenpunkte zu platzieren. Ich kann in Tikz anscheinend keine Variablenindirektion finden.

Derzeit scheint es, dass das zweite \foreach nur einen Wert sieht, statt einer Liste mit vier Elementen. Vielleicht verwende ich die falsche Methode. Andere Strategien sind also willkommen.

MWE:

\documentclass[]{article}
\usepackage{tikz}

\usetikzlibrary{positioning}
\usetikzlibrary{calc}

\begin{document}

% Use A4 page shape. 
% Base size of one graph is A4 page, but with pt instead of mm.

\begin{tikzpicture}

\pgfmathsetmacro{\scale}{1.75}
\pgfmathsetmacro{\graphHeight}{297 pt/\scale}   
\pgfmathsetmacro{\graphWidth}{201 pt/\scale}

\def\labelsM{85, 10, 55, 75}
\def\labelsC{75, 20, 55, 65}
\def\labelsP{65, 30, 55, 55}

\def\graphInfo{ Graph one/{(-\graphWidth pt, 0pt)}/\labelsM,
                Graph two/{(0pt, 0pt)}/\labelsC,
                Graph three/{(\graphWidth pt, 0pt)}/\labelsP
                }



\foreach \name/\pos/\values in \graphInfo
        {
    % Draw box
    \node    [
                at = {\pos},
                draw, 
                rectangle, 
                line width = 2pt,
                minimum width = \graphWidth pt,
                minimum height = \graphHeight pt,
                fill = black!15,
                name=\name
                ] 
                {} ;

    % Name graph            
    \node   [
            font = \bfseries,
            below = 2pt of \name.south
            ]
            {\name} ;   

    % Vertical lines and labels (should be 4 equidistant vertical lines) 
    \foreach \s [count=\i] in \values {
        \coordinate  (top) at  ($(\name.north west)!\i/5!(\name.north east)$) ;
        \coordinate (bottom) at ($(\name.south west)!\i/5!(\name.south east)$) ;
        \draw [dashed] (top)  --  (bottom) ;
        % Data to be plotted when this works
        };

} % end foreach \name


\end{tikzpicture}

Antwort1

foreach expandiert nicht \valuesvollständig, sondern nur eine Ebene tief. Es sieht also nur \labelsMdie Werte und nicht die Werte. Expandieren Sie \valuesmindestens einmal, bevor Sie es verwenden:

\expandafter\let\expandafter\values\values

\expandafterexpandiert den übernächsten Befehl. Der erste \expandafterexpandiert also den zweiten \expandafter, der den zweiten expandiert \values, und \labelsXdann fährt TeX mit dem \letBefehl fort. Am Ende erhalten Sie \let\values\labelsX.)

verwandte Informationen