我发出了“向左转 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
使用旧的值。您能做什么呢?
\xdef\oDir{\oDirNew}
纠正此问题的一个直接方法是使用而不是 ,从而使重新定义成为全局的\COPY{\oDirNew}{\oDir}
。但是,您付出的代价是它\oDir
是全局的。- 另一种不构成
\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}
我还要提一下 Ti钾Z 有turn
密钥,您可以在这里使用它。它在 pgfmanual v3.1.4 的第 144 页中有描述。