Estoy intentando dibujar tres "gráficos", que son rectángulos situados uno al lado del otro. Cada uno tiene cuatro puntos que se les colocarán. Estos cuatro puntos son las "puntuaciones".
Usar un foreach
bucle es natural para los gráficos, ya que todo el diseño y las etiquetas son iguales.
Lo que no puedo entender es cómo pasar la lista de datos a cada iteración. En otros idiomas, usaría algo como anidado foreach
, usando una variable indirecta cuyo nombre apunta a los datos a trazar, para colocar los puntos de datos. Parece que no puedo encontrar una dirección indirecta variable en tikz.
En la actualidad, parece que el segundo \foreach solo ve un valor, en lugar de una lista de cuatro elementos. Puede que esté usando el método equivocado. Por eso, otras estrategias son bienvenidas.
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}
Respuesta1
foreach no se expande \values
completamente sino solo un nivel de profundidad. Entonces ve sólo \labelsM
y no los valores. Expande \values
al menos una vez antes de usarlo:
\expandafter\let\expandafter\values\values
\expandafter
expande el siguiente comando. Entonces el primero \expandafter
expande el segundo \expandafter
, que expande el segundo \values
y \labelsX
luego TeX continúa con el \let
comando. Al final obtienes \let\values\labelsX
.)