Ist es aus schwerwiegenden technischen Gründen zu vermeiden, Knotennamen innerhalb eines Tikz-Bildes neu zu definieren?

Ist es aus schwerwiegenden technischen Gründen zu vermeiden, Knotennamen innerhalb eines Tikz-Bildes neu zu definieren?

Hier werden Meinungen und Erfahrungen zu

  • ob es (aus schwerwiegenden Gründen, die mir nicht einfallen) zu vermeiden ist, Knotennamen innerhalb ein und desselben Tikzpicture mehrmals neu zu definieren.

Kleines Beispiel

\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}

Ich habe nun schon seit einiger Zeit damit gearbeitet, in einigen Tikzpictures, ohne jemals Probleme feststellen zu können (die eindeutig darauf zurückzuführen wären).

Der Grund dafür ist in erster Linie, dass man sich bei Anwendungen, bei denen man keine aussagekräftigen Namen braucht, nicht überlegen muss, wie man einen Knoten benennt. (Wenn es eine andere Lösung für dieses Problem gibt, würde ich gerne darüber lesen, aber ich kann mir keine vorstellen; schließlich muss der Text, der den Knoten benennt, in die Tex-Datei eingegeben werden.)

Wenn das Ergebnis die gewünschte Darstellung ist und da der „Namensraum“ streng „lokal“ und auf den \begin{tikzpicture} ... \end{tikzpicture}Gültigkeitsbereich beschränkt zu sein scheint, kann ich an einer solchen Programmierpraxis nichts ernsthaft Verwerfliches erkennen.

Trotzdem bin ich neugierig, ob es da etwas Gefährliches gibt, an das ich nicht gedacht habe. Ich weiß natürlich, dassAbwesenheitder Gefahrenlage kann nie garantiert werden.

Antwort1

Das ist nicht wirklich eine große Sache. Stellen Sie sich vor, Sie möchten 10 unregelmäßige Rechtecke nebeneinander zeichnen. Dies ist wahrscheinlich der kürzeste Code, den Sie haben können.

\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}

Sie sehen: Das Schlüsselwort Xspielt eine wichtige Rolle im Code, obwohl es kein bestimmtes grafisches Objekt darstellt. Tatsächlich repräsentiert es immer dasneuster Knoten. Seitdem müssen Sie sich nicht mehr mit etwas wie herumschlagen, \node(\i+1)at(\i.east){}wobei \i+1für das mathematische Ergebnis von \iplus eins steht. (Können Sie diese Berechnung durchführen, ohne im Handbuch oder bei Google nachzuschlagen?) (Wenn Sie glauben, dass Sie das können, was ist das Problem im folgenden Code? Kein Handbuch/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]{}};

Vielleicht ist mein Programmierstil nicht so gängig wie sonst. Aber... siehe Handbuch

Vordefinierter Knoten current bounding box
Dieser Knoten hat die Form rectangle. Im Gegensatz zu normalen Knoten ändert sich seine Größe ständig und spiegelt immer die Größe des Begrenzungsrahmens des aktuellen Bildes wider.
Vordefinierter Knoten current path bounding box
Dieser Knoten hat ebenfalls die Form rectangle. Seine Größe entspricht der Größe des Begrenzungsrahmens des aktuellen Pfads.
Vordefinierter Knoten current subpath start
Dieser Knoten hat die Form coordinateund befindet sich am Anfang des aktuellen Unterpfads. Dies ist die Position des letzten Move-To-Vorgangs.

Obwohl es sich strenggenommen nicht um echte Knoten handelt (der Autor schummelt, sodass siesieht auswie echte Knoten), aber Sie verstehen, was ich meine.

Antwort2

Der folgende Code verfolgt alle definierten Namen innerhalb eines Bildes und löst einen Fehler aus, wenn versucht wird, einen Namen neu zu definieren. Ich halte es wirklich für eine schlechte Idee, diesen Code zu verwenden, und Sie haben schon früher seltsame Fragen zum Ausführen ähnlicher Dinge in TikZ gestellt. Ich kann nur den Rat aus früheren Antworten wiederholen

[...] ist dies auf lange Sicht nicht so produktiv, wie Sie denken.

Beachten Sie auch, dass diese Lösung im Widerspruch zudiese Antwort von mirzu einer weiteren seltsamen Frage von Ihnen!

\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}

verwandte Informationen