這是徵求意見和經驗
- 是否要避免(出於我無法想到的嚴重原因)在同一個 tikzpicture 內多次重新定義節點名稱。
小例子
\begin{tikzpicture}
\node (a) at (0,0) []{};
(..... code, possibly using the name (a)...... )
\node (a) at (0,1) []{};
(..... code, possibly using the name (a)...... )
\end{tikzpicture}
我已經在一些 tikzpictures 中使用此工具有一段時間了,但從未註意到問題(這顯然歸因於此)。
這樣做的首要原因是——在不需要有意義的名稱的應用程式中——不必考慮如何命名節點。 (如果這個問題有另一種解決方案,我有興趣閱讀它,但我無法想像一個;畢竟,命名節點的文字必須輸入到 tex 檔案中)
如果結果是人們想要的說明,並且由於“名稱空間”似乎是嚴格的“本地”並且僅限於範圍\begin{tikzpicture} ... \end{tikzpicture}
,那麼我找不到這種程式設計實踐有任何嚴重錯誤。
不過我很好奇這是否有什麼危險是我沒想到的。我知道,不用說,缺席永遠不能保證危險。
答案1
這其實沒什麼大不了的。您想要並排繪製 10 個不規則矩形的圖像,這可能是您可以擁有的最短的程式碼
\documentclass[border=9,tikz]{standalone}
\begin{document}
\tikz\path node(X){}foreach\i in{0,...,9}{
(X.east)node(X)[right,minimum size=rnd*30,draw]{}};
\end{document}
您會看到:關鍵字X
在程式碼中起著至關重要的作用,儘管它並不代表任何特定的圖形物件。事實上,它始終代表著最新節點。從那時起,您就不必為諸如\node(\i+1)at(\i.east){}
where\i+1
代表\i
加一的數學結果之類的問題而苦苦掙扎。 (你能在不查找手冊或Google的情況下執行此計算嗎?)(如果你認為可以,下面的程式碼有什麼問題?沒有manual/google/compiler)
\tikz\path node(0){}foreach\i[evaluate={\j=\i+1;}]in{0,...,9}{
(\i.east)node(\j)[right,minimum size=rnd*30,draw]{}};
也許我的程式設計風格不屬於主流。但是……看說明書
預定義節點
current bounding box
該節點的形狀為rectangle
。與普通節點不同,它的大小不斷變化,並且始終反映當前圖片的邊界框的大小。
預定義節點current path bounding box
這個節點也是有形狀的rectangle
。它的大小是目前路徑的邊界框的大小。
預定義節點current subpath start
此節點具有形狀coordinate
並且位於目前子路徑的開頭。這是最後一次移至操作的位置。
雖然嚴格來說它們並不是真正的節點(作者作弊所以它們看起來就像真實的節點一樣),但你明白了。
答案2
下面的程式碼追蹤一張圖片中所有已定義的名稱,如果嘗試重新定義名稱,則會引發錯誤。我真的認為使用這段程式碼是一個壞主意,並且您之前曾問過關於在 TikZ 中執行類似操作的奇怪問題。我只能重複之前答案中給的建議
[...] 從長遠來看,這並不像您想像的那樣富有成效。
另請注意,此解決方案與我的這個答案你的另一個奇怪的問題!
\documentclass{article}
\usepackage{xparse}
\usepackage{tikz}
\ExplSyntaxOn
\seq_new:N \g_tikz_labelcache_seq
\msg_new:nnn { TikZ } { label-defined } { Name~#1~already~defined! }
\NewDocumentCommand \checklabelname { m }
{
\seq_if_in:NoTF \g_tikz_labelcache_seq { #1 }
{ \msg_error:nnx { TikZ } { label-defined } { #1 } }
{ \seq_gpush:No \g_tikz_labelcache_seq { #1 } }
}
\NewDocumentCommand \resetlabellist { }
{
\seq_gclear:N \g_tikz_labelcache_seq
}
\ExplSyntaxOff
\makeatletter
\protected\def\tikz@fig@main#1{%
\checklabelname{\tikz@fig@name}%
\iftikz@node@is@pic%
\tikz@node@is@picfalse%
\tikz@subpicture@handle{#1}%
\else%
\tikz@@fig@main#1\egroup%
\fi}
% Reset list at end of picture to prevent carrying names over
\g@addto@macro\endtikzpicture{\resetlabellist}
\makeatother
\begin{document}
\begin{tikzpicture}
\node (B) {};
\end{tikzpicture}
\begin{tikzpicture}
\node (A) {};
\node (B) {};
\node (A) {};
\end{tikzpicture}
\end{document}