
Estou tentando desenhar três "gráficos" que são retângulos situados lado a lado. Cada um tem quatro pontos para serem colocados neles. Esses quatro pontos são as “pontuações”.
Usar um foreach
loop é natural para os gráficos, pois todos o layout e rótulos são iguais.
O que não consigo descobrir é como passar a lista de dados para cada iteração. Em outras linguagens, eu usaria algo como nested foreach
, usando uma variável indireta cujo nome aponta para os dados a serem plotados, para colocar os pontos de dados. Não consigo encontrar indireção variável no tikz.
Atualmente, parece que o segundo \foreach está vendo apenas um valor, em vez de uma lista de quatro itens. Posso estar usando o método errado. Portanto, outras estratégias são bem-vindas.
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}
Responder1
foreach não se expande \values
completamente, mas apenas um nível de profundidade. Então ele vê apenas \labelsM
e não os valores. Expanda \values
pelo menos uma vez antes de usá-lo:
\expandafter\let\expandafter\values\values
\expandafter
expande o próximo comando. Então o primeiro \expandafter
expande o segundo \expandafter
que expande o segundo \values
para \labelsX
então o TeX continuar com o \let
comando. No final você obtém \let\values\labelsX
.)