我有两个嵌套\foreach
循环。内循环运行正常,但外循环不运行。每次迭代期间应执行两个命令。
这两个命令在每次执行嵌套循环时都会发生变化。识别位置的命令工作正常,但使用根据外层循环的迭代分配的颜色的命令则不正常。
以下是我的原始代码和输出。请注意,前景色为红色,由
\ifthenelse{\a=2}{\def\mycolor{ red!20 }{}}
在输出中省略:
\documentclass{article}
\usepackage{graphicx}
\usepackage[margin=0.75in, heightrounded]{geometry}
\usepackage{tikz}
\newcommand\mycolor{ red!15 }
\usepackage{ifthen}
\begin{document}
\begin{center}
\begin{tikzpicture}[x=1.0cm, y=1.0cm]
\def\z{0.25}
\def\u{4.5}
\def\v{7.5}
\foreach \a in {0, 1, 2} {
\foreach \y in {0, 1, 2, 3} {
% Outer most rectangle
\draw[black!80, fill=black!35, rounded corners=5ex] (\y*\u, 11.0+\v*\a) rectangle (4.2+\y*\u, 18.0+\v*\a);
% Inner most rectangle
\ifthenelse{\a=0}{\def\mycolor{ blue!20 }{}}
\ifthenelse{\a=1}{\def\mycolor{ green!20 }{}}
\ifthenelse{\a=2}{\def\mycolor{ red!20 }{}}
\draw[top color=white, bottom color=\mycolor, rounded corners=4ex] (\y*\u+1*\z, 11.0+1*\z+\v*\a) rectangle (4.2+\y*\u-1*\z, 18.0-1*\z+\v*\a);
}
}
\end{tikzpicture}
\end{center}
\end{document}
我从类似的问题尝试了两个独立的修改: 为什么 TikZ 的 \foreach 不迭代列表的最后一个元素?:
1) 使用\foreach \a in {0, 1, 2.0001} {
给出错误Missing = inserted for \ifnum
,并将错误行标识为}
对此的结束\foreach
。
2)当我尝试
\foreach \aa in {0, 10, 20} {
\pgfmathsetmacro\a{0.1*\aa}
我犯了同样的错误: Missing = inserted for \ifnum
。
问题:为什么 foreach 中的迭代器不起作用?是关于\foreach
循环中解析算术,这不是我的问题。
如果我修改我的原始代码:
\ifthenelse{\a=0}{\def\mycolor{ blue!20 }{}}
\ifthenelse{\a=1}{\def\mycolor{ green!20 }{}}
\ifthenelse{\a=1}{\def\mycolor{ red!20 }{}}
然后我得到了正确的输出。但我不应该这样做,因为\a=1
在第二行和第三行中,中间行和上行都不
red
应该给出。green
有人可以提供一些正确的(不是我的\a=1
黑客)解决方案的指导吗?
答案1
您的语法错误\ifthenelse
。
\ifthenelse{\a=0}{\def\mycolor{blue!20}}{}
\ifthenelse{\a=1}{\def\mycolor{green!20}}{}
\ifthenelse{\a=2}{\def\mycolor{red!20}}{}
语法是
\ifthenelse{<test>}{<true>}{<false>}
你的代码把一切都搞乱了。
不过,你可以避免所有负担:
\documentclass{article}
\usepackage{graphicx}
\usepackage[margin=0.75in, heightrounded]{geometry}
\usepackage{tikz}
\begin{document}
\begin{center}
\begin{tikzpicture}[x=1.0cm, y=1.0cm]
\def\z{0.25}
\def\u{4.5}
\def\v{7.5}
\foreach \a/\b in {0/blue!20, 1/green!20, 2/red!20} {
\foreach \y in {0, 1, 2, 3} {
% Outer most rectangle
\draw[black!80, fill=black!35, rounded corners=5ex]
(\y*\u, 11.0+\v*\a) rectangle (4.2+\y*\u, 18.0+\v*\a);
% Inner most rectangle
\draw[top color=white, bottom color=\b, rounded corners=4ex]
(\y*\u+1*\z, 11.0+1*\z+\v*\a) rectangle (4.2+\y*\u-1*\z, 18.0-1*\z+\v*\a);
}
}
\end{tikzpicture}
\end{center}
\end{document}
答案2
您甚至可以进一步简化它。\a
只是一个计数器,因此您可能想要这样做
foreach \mycolor [count=\a starting from 0] in {blue!20,green!20,red!20}
完整代码:
\documentclass{article}
\usepackage[margin=0.75in, heightrounded]{geometry}
\usepackage{tikz}
\begin{document}
\begin{center}
\begin{tikzpicture}[x=1.0cm, y=1.0cm]
\def\z{0.25}
\def\u{4.5}
\def\v{7.5}
\foreach \mycolor [count=\a starting from 0] in {blue!20,green!20,red!20} {
\foreach \y in {0,..., 3} {
\draw[black!80, fill=black!35, rounded corners=5ex] (\y*\u, 11.0+\v*\a) rectangle (4.2+\y*\u, 18.0+\v*\a);
\draw[top color=white, bottom color=\mycolor, rounded corners=4ex] (\y*\u+1*\z, 11.0+1*\z+\v*\a) rectangle (4.2+\y*\u-1*\z, 18.0-1*\z+\v*\a);
}
}
\end{tikzpicture}
\end{center}
\end{document}