
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 \draw
comando.
\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}
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}
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 to
los tokens expandibles como \b
no se expanden antes de evaluar la composición de to
los operandos.
Puedo ofrecer una macro \SecondArgumentsFirstTokenTopLevelExpanded
que se puede utilizar para expandir el nivel superior antes de encontrar \b
el 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}