foreach 的奇怪行為

foreach 的奇怪行為

我徹底傻眼了。

考慮以下程式碼:

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

如果您「按原樣」運行它,它將透過將座標標籤放置在正確的位置來按預期工作。

然而,如果您取消註解 \draw 行,則會產生錯誤:「Package tikz Error: (, +,co座標,pic 或預期節點。」就好像 \draw 無法理解座標一樣。

我嘗試過不同的間距、用大括號包圍座標等等,但都無濟於事。

答案1

Ulrich 已經為您提供了一個很好的解決方案適用於直接連接。問題是出了什麼問題。問題是解析器希望看到一個明確的((或一個選項等),而不是一個擴展為在(a 之後以 a 開頭的巨集to。因此,解決此問題的一種方法是先展開宏,然後「啟動」命令\draw

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

在此輸入影像描述

當然,有很多可能的變化,例如

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

或更多鈦kZy版

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

或者,你可以給 TikZ 顯式括號。

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

無論如何,如果您命名節點,連接就會變得更好,在這種情況下就不會出現問題。

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

在此輸入影像描述

答案2

當我寫\draw \a -- \b;而不是 時\draw \a to \b;,一切似乎都很順利。

當我寫\draw \a \expandafter t\expandafter o\b;而不是 時\draw \a to \b;,一切似乎也都順利了。

似乎在to可擴展標記之後,在評估 的操作數\b的組成之前不會擴展。to

我可以提供一個宏\SecondArgumentsFirstTokenTopLevelExpanded,可用於在遇到 - 運算符\b之前進行頂級擴展: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}

相關內容