Comportamento estranho do foreach

Comportamento estranho do foreach

Estou totalmente pasmo.

Considere o seguinte 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}

Se você executá-lo "como está", ele funcionará conforme o esperado, colocando a tag de coordenadas no local correto.

No entanto, se você descomentar a linha \draw, ele produzirá o erro: "Erro do pacote tikz: (, +, coordenada, foto ou nó esperado." como se \draw não entendesse as coordenadas.

Eu tentei espaçamentos diferentes, circundando coordenadas por colchetes e assim por diante, sem sucesso.

Responder1

Ulrich já forneceu uma boa soluçãoisso funciona para conexões diretas. A questão é o que está errado. A questão é que o analisador deseja ver uma macro explícita ((ou uma opção etc.), mas não uma macro que se expanda para algo começando com a (após a to. Portanto, uma maneira de corrigir isso aqui é expandir primeiro as macros e depois "ativar" o \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}

insira a descrição da imagem aqui

Claro, existem muitas variações possíveis, por exemplo

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

ou um Ti maiskVersão Zy

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

Alternativamente, você poderia dar TikZ os parênteses 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 qualquer forma, as conexões ficam muito melhores se você nomear os nós, e nesse caso o problema não 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}

insira a descrição da imagem aqui

Responder2

Quando escrevo \draw \a -- \b;em vez de \draw \a to \b;, tudo parece dar certo.

Quando escrevo \draw \a \expandafter t\expandafter o\b;em vez de \draw \a to \b;, tudo parece dar certo também.

Parece que toos tokens expansíveis \bnão são expandidos antes de avaliar a composição dos tooperandos.

Posso oferecer uma macro \SecondArgumentsFirstTokenTopLevelExpandedque pode ser usada para \bexpandir o nível superior antes que o tooperador - seja encontrado:

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

informação relacionada