带条件的累积 for 循环

带条件的累积 for 循环

我正在尝试执行 for 循环,以便每次迭代都考虑上一次迭代的结果。具体来说,我从一个定义(假设\newcommand\start{(0)})开始,然后进入循环。我检查一个条件(通过\ifnum),如果为正,我重新定义,\start以便它给出(0)--(ok)。然后进行新的迭代,如果\ifnum仍然为正,我重新定义\start将新文本添加--(ok)到前一个文本中(0)--(ok),以便总体上得到(0)--(ok)--(ok)。等等。这是我的代码。

\newcommand\start{(0)}
\newcommand\step{ }

\foreach \i in {1,...,5} {
\pgfmathparse{random(1,3)}

\ifnum\pgfmathresult=1
\renewcommand\step{\start --(ok)}
\else
    \ifnum\pgfmathresult=2
    \renewcommand\step{\start --(yes)}
    \else
        \ifnum\pgfmathresult=3
        \renewcommand\step{\start --(no)}
        \fi
    \fi
\fi

\renewcommand\start\step
}

\start

当然不行。我尝试使用\def\let等代替\newcommand\renewcommand,但结果没有改变,即使我承认我不是这些命令的专家。我想避免使用像etoolboxifthen

提前致谢。

答案1

该问题是由 引起的\renewcommand\start\step

  • 首先,由于的循环体\foreach是在 TeX 组内部执行的,所以这里需要使用全局赋值来\start在每次执行循环体后保存对的改变。
  • 然后,您还需要定义\start为的(完全)扩展,否则和\step之间会出现无限循环。\start\step

总结一下,改变

\renewcommand\start\step

\xdef\start{\step}

这里\xdef可以看作是的快捷方式\global\edef


在下面的完整示例中,我还将嵌套更改\ifnum ... \else ... \fi\ifcase ... \or ... \or ... \fi

\documentclass{article}
\usepackage{pgffor}

\begin{document}
\newcommand\start{(0)}
\newcommand\step{ }

\foreach \i in {1,...,5} {%
  \pgfmathparse{random(1,3)}%
  %
  \ifcase\pgfmathresult
  \or
    \renewcommand\step{\start -- (ok)}%
  \or
    \renewcommand\step{\start -- (yes)}%
  \or
    \renewcommand\step{\start -- (no)}%
  \else\fi
  %
  \xdef\start{\step}%
}

\start
\end{document}

答案2

您没有提供完整的代码。我猜您\foreach在里面使用了path,如果是这样,您需要将额外的代码放入 里面\pgfextra。这是一个示例代码。正如@muzimuzhi Z 所说,您需要使用\xdef

\documentclass[tikz, border=1cm]{standalone}
\usetikzlibrary{decorations}
\pgfdeclaredecoration{arrows}{draw}{
\state{draw}[width=\pgfdecoratedinputsegmentlength]{%
  \path [every arrow subpath/.try] \pgfextra{%
    \pgfpathmoveto{\pgfpointdecoratedinputsegmentfirst}%
    \pgfpathlineto{\pgfpointdecoratedinputsegmentlast}%
   };
}}
\tikzset{
  c/.style={every coordinate/.try},
  every arrow subpath/.style={->, draw, thick}
}
\def\temp{(o)}
\def\addtotemp#1{\xdef\temp{\temp#1}}

\begin{document}
\begin{tikzpicture}
  \coordinate (o) at (0, 0);
  \coordinate (yes) at (-1, 1);
  \coordinate (no) at (0, 2);
  \coordinate (ok) at (1, 1);
  \foreach \r in {0, 4, 8} {
    \def\temp{(o)}
    \draw[every coordinate/.style={yshift=\r cm},
      decoration=arrows, decorate,
    ] ([c]o) node[below] {o}
      \foreach \i [
        evaluate = \i as \random using {random(1, 3)},
      ] in {1, ..., 5} {
        \pgfextra{\typeout{xyz \temp}}
        \ifnum\random=1
          \pgfextra{\addtotemp{ -- (yes)}}
          to[->] ([c]yes) node[left] {yes}
        \else\ifnum\random=2
          \pgfextra{\addtotemp{ -- (no)}}
          -- ([c]no) node[above] {no}
        \else
          \pgfextra{\addtotemp{ -- (ok)}}
          -- ([c]ok) node[right] {ok}
        \fi\fi
      };
    \node[yshift=\r cm] at (0, -0.5) {\temp};
  }
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容