我正在尝试执行 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
,但结果没有改变,即使我承认我不是这些命令的专家。我想避免使用像etoolbox
、ifthen
提前致谢。
答案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}