我正在尝试绘制三个“图形”,它们是并排的矩形。每个图形上都有四个点。这四个点就是“分数”。
foreach
对于图表来说,使用循环是很自然的,因为所有的布局和标签都是相同的。
我无法弄清楚如何将数据列表传递给每个迭代。在其他语言中,我会使用类似嵌套的东西foreach
,使用间接变量(其名称指向要绘制的数据)来放置数据点。我似乎无法在 tikz 中找到变量间接。
目前看来,第二个 \foreach 只看到一个值,而不是四个项目的列表。我可能使用了错误的方法。所以欢迎使用其他策略。
梅威瑟:
\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}
答案1
foreach 不会\values
完全展开,只会展开一层。因此它只能看到 ,\labelsM
而看不到值。\values
使用前至少展开一次:
\expandafter\let\expandafter\values\values
\expandafter
扩展下一个命令。因此,第一个命令\expandafter
扩展第二个命令,第二个命令\expandafter
又扩展第二个命令\values
,\labelsX
然后 TeX 继续执行该\let
命令。最后您将得到\let\values\labelsX
.)