Seltsames Verhalten von foreach

Seltsames Verhalten von foreach

Ich bin völlig sprachlos.

Betrachten Sie den folgenden Code:

\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}

Wenn Sie es „wie es ist“ ausführen, funktioniert es wie erwartet, indem das Koordinaten-Tag an der richtigen Stelle platziert wird.

Jedoch, wenn Sie die \draw-Zeile auskommentieren, erzeugt es den Fehler: „Package tikz Error: (, +, Coordinate, Pic or Node expected.“ als ob \draw die Koordinaten nicht verstehen würde.

Ich habe unterschiedliche Abstände ausprobiert, Koordinaten mit Klammern umgeben usw., aber ohne Erfolg.

Antwort1

Ulrich hat dir schon eine schöne Lösung gegebendas funktioniert für direkte Verbindungen. Die Frage ist, was schief läuft. Das Problem ist, dass der Parser ein explizites ((oder eine Option usw.) sehen möchte, aber kein Makro, das sich zu etwas erweitert, das mit einem (nach einem beginnt to. Eine Möglichkeit, dies hier zu beheben, besteht darin, zuerst die Makros zu erweitern und dann den \drawBefehl zu „aktivieren“.

\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}

Bildbeschreibung hier eingeben

Natürlich sind viele Variationen möglich, z.B.

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

oder ein mehr TikZy-Version

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

Alternativ können Sie Ti gebenkZ die expliziten Klammern.

\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}

Die Verbindungen werden auf jeden Fall wesentlich schöner, wenn Sie den Knoten Namen geben. In diesem Fall tritt das Problem nicht auf.

\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}

Bildbeschreibung hier eingeben

Antwort2

Wenn ich \draw \a -- \b;statt schreibe \draw \a to \b;, dann scheint alles zu klappen.

Wenn ich \draw \a \expandafter t\expandafter o\b;statt schreibe \draw \a to \b;, dann scheint auch alles zu klappen.

Scheint nach toerweiterbaren Token zu liegen, die \bnicht erweitert werden, bevor die Zusammensetzung toder Operanden ausgewertet wird.

Ich kann ein Makro anbieten \SecondArgumentsFirstTokenTopLevelExpanded, mit dem die oberste Ebene erweitert werden kann, \bbevor der to-Operator auftritt:

\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}

verwandte Informationen