座標リストを使った tikz foreach の重要な使用法

座標リストを使った tikz foreach の重要な使用法

次のコードを動作させるのに苦労しています:

\documentclass{minimal}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}

\foreach \point in {(0,0),(0,2),(2,0),(2,2)} {
    \begin{scope}[shift={\point}]
        \fill (0,0) circle (0.1) ;
    \end{scope}
}

\end{tikzpicture}

\end{document}

ログには以下が含まれます

パッケージ tikz エラー: この座標を解析できません。

説明については、tikz パッケージのドキュメントを参照してください。 すぐにヘルプを表示するには、H と入力してください。 ...
l.11 } このエラー メッセージは、\errmessage コマンドによって生成されたため、明確なヘルプを提供することはできません。 エルキュール ポアロになったつもりで、すべての手がかりを調べ、順序と方法で真実を推測してください。

不足している文字: フォント nullfont に ( がありません。

文字が見つかりません: フォント nullfont に 0 がありません。

不足している文字: フォント nullfont に , がありません。

文字が見つかりません: フォント nullfont に 0 がありません。

不足している文字: フォント nullfont に ) がありません。

これらの座標を直接使用する方法はありますか、それとも X/Y スタイルに頼るべきでしょうか?

更新: (() が問題を解決するという主張に対応するため)。コンソールから Miktex インストールを完全に更新しました。ただし、次の行 (shift + () の使用に直接関連) がまだ表示されます。

ファイル: epstopdf-sys.cfg 2021/03/18 v2.0 MiKTeX用epstopdfの設定))

不足している文字: フォント nullfont に ) がありません。

不足している文字: フォント nullfont に ) がありません。

不足している文字: フォント nullfont に ) がありません。

不足している文字: フォント nullfont に ) がありません。

[1]

リスト内の各座標に対して正確に 1 つの中括弧 (異なる数のポイントでチェックされます)。

答え1

TikZ パーサー (shift座標の解析にも使用されます) が理解できないものを見つけた場合、通常はその前にあるものを展開しようとします。

これが理由です

\fill \point circle (0.1);

問題なく動作します。

ユーザーが間違った構文を記述した場合、TikZ にはフェイルセーフ機能があり、内部カウンターを減算し、このカウンターが 0 に達するまで拡張戦術のみを試みます。このカウンターは通常 100 から始まり、状況に応じて 1 または 10 ずつ減算されます。

特定の場所では、このカウンターは100にリセットされます。たとえば、パスの開始時(これが

\fill[shift=\point] (0,0) circle (0.1) ;

パーサーが有効なパス指定を見つけた場合、またはリセットされない画像の開始時またはスコープの開始時。その時点ではまだデフォルトで 0 で初期化されているため、解析でエラーが発生します。

使用はshift=(\point)、起こっているすべてのものの別の拡張があるため機能しますが、それは警告につながります

Missing character: There is no ) in font nullfont!

これは、解析しようとするためです

(0,0
(0そして何が起こるかというと、パーサーはバツ座標の値を秒0としてええ値です。ただし、TeX 入力ストリームの最後がそのまま残ります)。これは、次のようにした場合と似ています。

\path;
Foo
\path;

さて、なぜ(0エラーが発生しないのでしょうか? PGF/TikZの多くのものと同様に、これはPGFmathに入力されて評価されます…そしてPGFmathはそれを問題視しません。試してみてください

\pgfmathparse{(((((1}\pgfmathresult

あるいは

\pgfmathparse{1))))}\pgfmathresult

コメントで提案されているように、とを\expanded使用する代わりに、\noexpand.expandedキーハンドラーこれは、キーに渡す前に値を拡張するように PGFkeys に指示します。

(または、scope環境またはshiftキーのいずれかにパッチを適用するか、カウンターを手動でリセットしますが、TikZ が独自に拡張を行わない場合は、キー ハンドラーを使用すると他の場所で常にうまく機能します。)

コード

\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\foreach \point in {(0,0),(0,2),(2,0),(2,2)} {
  \begin{scope}[shift/.expanded=\point]
    \fill (0,0) circle[radius=.1];
  \end{scope}
}
\end{tikzpicture}
\end{document}

関連情報