Странное поведение 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, то возникнет ошибка: «Ошибка пакета tikz: (, +, ожидается координата, картинка или узел». как будто \draw не понимает координаты.

Я пробовал разные интервалы, заключал координаты в фигурные скобки и т. д., но безрезультатно.

решение1

Ульрих уже предоставил вам хорошее решениеэто работает для прямых соединений. Вопрос в том, что идет не так. Проблема в том, что парсер хочет видеть явное ((или опцию и т. д.), но не макрос, который расширяется до чего-то, начинающегося с a (после a 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;

или больше ТикZy версия

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

В качестве альтернативы вы можете дать ТикZ явные скобки.

\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, который можно использовать для \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}

Связанный контент