foreach 的奇怪行为

foreach 的奇怪行为

我完全惊呆了。

考虑以下代码:

\documentclass{standalone}
\usepackage{tikz}

\begin{document}

\begin{tikzpicture}

\foreach \a / \b in {
(20:1) / (90:1)
,(-20:1) / (-90:2)
}
{
\node at \a {$\a$};
\node at \b {$\b$};
%\draw \a to \b;
}
\end{tikzpicture}

\end{document}

如果您“按原样”运行它,它会通过将坐标标签放在正确的位置来按预期工作。

然而,如果取消注释 \draw 行,则会产生错误:“Package tikz Error: (, +, coordinate, pic or node expected.”就好像 \draw 无法理解坐标一样。

我尝试过不同的间距、用括号括起坐标等等,但都无济于事。

答案1

Ulrich 已经为你提供了一个很好的解决方案适用于直接连接。问题是哪里出了问题。问题是解析器希望看到显式((或选项等),而不是扩展为以 开头的宏(to因此,解决此问题的一种方法是先扩展宏,然后“激活”命令\draw

\documentclass{standalone}
\usepackage{tikz}

\begin{document}

\begin{tikzpicture}

\foreach \a / \b in {
(20:1) / (90:1)
,(-20:1) / (-90:2)
}
{
\node at \a {$\a$};
\node at \b {$\b$};
\edef\temp{\noexpand\draw \a to \b;}
\temp
}
\end{tikzpicture}

\end{document}

在此处输入图片描述

当然,还有很多可能的变化,例如

 \edef\temp{ to \b}
 \draw \a \temp;

或更多 TiZy 版本

 \draw [insert path/.expanded={\a to \b}];

或者你可以给 TiZ 明确的括号。

\documentclass{standalone}
\usepackage{tikz}

\begin{document}

\begin{tikzpicture}

\foreach \a/\b in {
20:1/90:1,%
-20:1/-90:2%
}
{
\node at (\a) {$(\a)$};
\node at (\b) {$(\b)$};
\draw (\a) to (\b);
}
\end{tikzpicture}

\end{document}

无论如何,如果您命名节点,连接就会变得更好,在这种情况下不会出现问题。

\documentclass{standalone}
\usepackage{tikz}

\begin{document}

\begin{tikzpicture}

\foreach \a / \b in {
(20:1) / (90:1)
,(-20:1) / (-90:2)
}
{
\node (a) at \a {$\a$};
\node (b) at \b {$\b$};
\draw (a) to (b);
}
\end{tikzpicture}

\end{document}

在此处输入图片描述

答案2

当我写\draw \a -- \b;而不是时\draw \a to \b;,一切似乎都顺利了。

当我写\draw \a \expandafter t\expandafter o\b;而不是时\draw \a to \b;,一切似乎也都顺利解决了。

似乎在to可扩展标记之后,在评估操作数\b的组成之前不要进行扩展。to

我可以提供一个宏\SecondArgumentsFirstTokenTopLevelExpanded,可用于在遇到-operator\b之前进行顶层扩展:to

\documentclass{standalone}

\newcommand\exchange[2]{#2#1}%
\newcommand\SecondArgumentsFirstTokenTopLevelExpanded[2]{%
  \expandafter\exchange\expandafter{#2}{#1}%
}%

\usepackage{tikz}

\begin{document}

\begin{tikzpicture}
\foreach \a / \b in {(20:1)/(90:1),(-20:1)/(-90:2)}{
  \node at \a {$\a$};
  \node at \b {$\b$};
  \draw \a \SecondArgumentsFirstTokenTopLevelExpanded{to}{\b};
}
\end{tikzpicture}

\end{document}

相关内容