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

當 TikZ 解析器(也用於解析座標shift)發現它不理解的東西時,它通常會嘗試擴展它前面的內容。

這就是為什麼

\fill \point circle (0.1);

工作順利。

如果使用者編寫了錯誤的語法,TikZ 具有故障保護功能,因為它會遞減內部計數器,並且只會嘗試擴展策略,直到該計數器達到 0。

在某些地方,該計數器會重設為 100,例如在路徑的開頭(這就是為什麼

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

有效)或當解析器成功找到有效的路徑規範。它沒有重置在圖片的開頭或範圍的開頭。由於此時它仍然是預設值並且初始化為 0,因此解析會拋出錯誤。

使用shift=(\point)作品是因為一切都發生了另一種擴展,但它會導致警告

Missing character: There is no ) in font nullfont!

這是因為它現在嘗試解析

(0,0
所發生的情況是解析器將(0其識別為X座標值和第二個0y價值。但它在 TeX 輸入流上留下了最後一個),類似於您所做的:

\path;
Foo
\path;

現在,為什麼不(0出現任何錯誤?與 PGF/TikZ 中的許多內容一樣,這將被饋送到 PGFmath 並進行評估…而 PGFmath 對此沒有任何問題。嘗試

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

甚至

\pgfmathparse{1))))}\pgfmathresult

我建議使用而不是按照評論中的建議使用\expandedand\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}

相關內容