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 行のコメントを解除すると、\draw が座標を理解していないかのように、「パッケージ tikz エラー: (、+、座標、pic、またはノードが必要です。」というエラーが発生します。

さまざまな間隔を試したり、座標を中括弧で囲んだりしましたが、効果はありませんでした。

答え1

ウルリッヒはすでに素晴らしい解決策を提供してくれましたこれは、直接接続の場合は機能します。問題は、何が間違っているかです。問題は、パーサーが明示的な((またはオプションなど) を参照する必要があるが、(の後に で始まるものに展開されるマクロを参照する必要がないことですto。したがって、ここでこれを修正する 1 つの方法は、最初にマクロを展開してから、\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;

またはそれ以上Zyバージョン

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

あるいは、Tiを与えることもできますZ 明示的な括弧。

\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

-operator に遭遇する前にトップレベルを\SecondArgumentsFirstTokenTopLevelExpanded展開するために使用できるマクロを提供できます。\bto

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

関連情報