Comportamiento extraño de foreach

Comportamiento extraño de foreach

Estoy totalmente estupefacto.

Considere el siguiente código:

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

Si lo ejecuta "tal cual", funciona como se esperaba colocando la etiqueta de coordenadas en el lugar correcto.

Sin embargo, si descomentas la línea \draw entonces se produce el error: "Error de paquete tikz: (, +, coordenada, imagen o nodo esperado." como si \draw no entendiera las coordenadas.

Probé diferentes espacios, rodeando las coordenadas con llaves, etc., sin éxito.

Respuesta1

Ulrich ya te ha dado una buena solución.eso funciona para conexiones rectas. La pregunta es qué sale mal. El problema es que el analizador quiere ver una macro explícita ((o una opción, etc.) pero no una que se expanda a algo que comience con a (después de a to. Entonces, una forma de solucionar este problema aquí es expandir las macros primero y luego "activar" el \drawcomando.

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

ingrese la descripción de la imagen aquí

Por supuesto, hay muchas variaciones posibles, por ejemplo

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

o un mas Tikversión zy

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

Alternativamente, puedes darle a TikZ los paréntesis explícitos.

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

De todos modos, las conexiones se vuelven mucho mejores si nombras los nodos, en cuyo caso el problema no surge.

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

ingrese la descripción de la imagen aquí

Respuesta2

Cuando escribo \draw \a -- \b;en lugar de \draw \a to \b;, entonces todo parece funcionar.

Cuando escribo \draw \a \expandafter t\expandafter o\b;en lugar de \draw \a to \b;, todo parece funcionar también.

Parece que tolos tokens expandibles como \bno se expanden antes de evaluar la composición de tolos operandos.

Puedo ofrecer una macro \SecondArgumentsFirstTokenTopLevelExpandedque se puede utilizar para expandir el nivel superior antes de encontrar \bel operador -: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}

información relacionada