
次のコードを動作させるのに苦労しています:
\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}