
我徹底傻眼了。
考慮以下程式碼:
\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}