tikz/foreach-与变量结合的奇怪行为

tikz/foreach-与变量结合的奇怪行为

我发出了“向左转 x 度”的命令\tl{x}。因为这是弧和坐标的变换,所以我写了一些测试代码。附件是 MWE:

\documentclass[x11names]{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{calculator}

\makeatletter
\def\extractcoord#1#2#3{
  \path let \p1=(#3) in \pgfextra{
    \pgfmathsetmacro#1{\x{1}/\pgf@xx}
    \pgfmathsetmacro#2{\y{1}/\pgf@yy}
    \xdef#1{#1} \xdef#2{#2}
  };
}

\newcommand{\tl}[1]{
  \draw[fill] (\oXPos, \oYPos) coordinate (P) circle (0.5mm) node[right] {P};  
  \ADD{\oDir}{#1}{\oDirNew}
  \draw (\oXPos,\oYPos) arc (\oDir:\oDirNew:\oRad) coordinate (Z);
  \draw (Z) circle (1mm) node[left] {Z};
  \COPY{\oDirNew}{\oDir}
  \extractcoord\oXPos\oYPos{Z}
}

\begin{document}

\def\oRad{20}
\def\oDir{0}
\def\oXPos{0}
\def\oYPos{0}

\begin{tikzpicture}[x=1mm, y=1mm]
\foreach \x in {1,2} {
  \tl{90}
} 
\end{tikzpicture}

\def\oRad{20}
\def\oDir{0}
\def\oXPos{0}
\def\oYPos{0}

\begin{tikzpicture}[x=1mm, y=1mm]
  \tl{90}
  \tl{90}
\end{tikzpicture}
\end{document}
}

您会看到 tl 命令和测试代码:foreach-call 和 manual-double-call。

令人惊讶的是,foreach 与双重手动调用不同。也许这与我处理变量的方式有关,也可能与计算器包有关。

foreach 生成上面的图形,手动调用生成下面的图形。下面的图形将是预期的行为。

在此处输入图片描述

你能解释一下吗?显然我的 tl 代码有问题。

答案1

这是怎么回事?\foreach循环启动一个组。您对的更改\oDir只是局部的。因此在下一步中仍\oDir使用旧的值。您能做什么呢?

  1. \xdef\oDir{\oDirNew}纠正此问题的一个直接方法是使用而不是 ,从而使重新定义成为全局的\COPY{\oDirNew}{\oDir}。但是,您付出的代价是它\oDir是全局的。
  2. 另一种不构成\oDir全局的方法是使用循环remember\foreach

我正在说明第二种方法,因为它不太为人所知。

\documentclass[x11names]{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{calculator}

\makeatletter
\def\extractcoord#1#2#3{
  \path let \p1=(#3) in \pgfextra{
    \pgfmathsetmacro#1{\x{1}/\pgf@xx}
    \pgfmathsetmacro#2{\y{1}/\pgf@yy}
    \xdef#1{#1} \xdef#2{#2}
  };
}

\newcommand{\tl}[1]{
  \draw[fill] (\oXPos, \oYPos) coordinate (P) circle (0.5mm) node[right] {P};  
  \ADD{\oDir}{#1}{\oDirNew}
  \draw (\oXPos,\oYPos) arc (\oDir:\oDirNew:\oRad) coordinate (Z);
  \draw (Z) circle (1mm) node[left] {Z};
  \COPY{\oDirNew}{\oDir}
  \extractcoord\oXPos\oYPos{Z}
}

\begin{document}

\def\oRad{20}
\def\oDir{0}
\def\oXPos{0}
\def\oYPos{0}

\begin{tikzpicture}[x=1mm, y=1mm]
\foreach \x [remember=\oDir as \oDir] in {1,2} {
  \tl{90}
} 
\end{tikzpicture}

\def\oRad{20}
\def\oDir{0}
\def\oXPos{0}
\def\oYPos{0}

\begin{tikzpicture}[x=1mm, y=1mm]
  \tl{90}
  \tl{90}
\end{tikzpicture}
\end{document}

在此处输入图片描述

我还要提一下 TiZ 有turn密钥,您可以在这里使用它。它在 pgfmanual v3.1.4 的第 144 页中有描述。

相关内容