是否因為嚴重的技術原因而避免在一張 tikzpicture 中重新定義節點名稱?

是否因為嚴重的技術原因而避免在一張 tikzpicture 中重新定義節點名稱?

這是徵求意見和經驗

  • 是否要避免(出於我無法想到的嚴重原因)在同一個 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}

相關內容