重大な技術的理由により、1 つの tikzpicture 内でノード名を再定義することは避けるべきでしょうか?

重大な技術的理由により、1 つの 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特定のグラフィックオブジェクトを表すわけではありませんが、コード内で重要な役割を果たします。実際、キーワードは常に最新ノードそれ以来、 がプラス 1の数学的結果を表すなど\node(\i+1)at(\i.east){}といったことに悩む必要がなくなりました。(マニュアルや Google を参照せずにこの計算を実行できますか?) (できると思う場合、次のコードの問題点は何ですか? マニュアル/Google/コンパイラなし)\i+1\i

\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

以下のコードは、1 つの画像内で定義されているすべての名前を追跡し、名前を再定義しようとするとエラーを発生させます。このコードを使用するのは悪い考えだと思います。また、以前にも 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}

関連情報