
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 \draw
Befehl 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}
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}
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 to
erweiterbaren Token zu liegen, die \b
nicht erweitert werden, bevor die Zusammensetzung to
der Operanden ausgewertet wird.
Ich kann ein Makro anbieten \SecondArgumentsFirstTokenTopLevelExpanded
, mit dem die oberste Ebene erweitert werden kann, \b
bevor 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}