\foreach,最后一次迭代未执行

\foreach,最后一次迭代未执行

我有两个嵌套\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}

在此处输入图片描述

相关内容