¿Se debe evitar por razones técnicas serias redefinir los nombres de los nodos dentro de una tikzpicture?

¿Se debe evitar por razones técnicas serias redefinir los nombres de los nodos dentro de una tikzpicture?

Esto es pedir opiniones y experiencias sobre

  • si se debe evitar (por razones serias que no se me ocurren) redefinir, dentro de una misma imagen tikz, los nombres de nodos varias veces.

Pequeño ejemplo

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

He trabajado con esto desde hace algún tiempo, en algunas tikzpictures, sin notar problemas (eso sería claramente atribuible a esto).

La razón para hacerlo en primer lugar es que, en aplicaciones donde no se necesitan nombres significativos, no es necesario pensar en cómo nombrar un nodo. (Si hay otra solución a ese problema, me interesaría leer sobre ella, pero no puedo imaginar ninguna; después de todo, el texto que nombra el nodo debe ingresarse en el archivo tex)

Si el resultado es la ilustración que se pretende, y dado que el "espacio de nombres" parece ser estrictamente "local" y limitado al \begin{tikzpicture} ... \end{tikzpicture}alcance, no puedo encontrar nada gravemente malo en dicha práctica de programación.

Sin embargo, tengo curiosidad por saber si hay algo peligroso en esto que no se me hubiera ocurrido. Lo sé, no hace falta decirlo,ausencianunca se puede garantizar el peligro.

Respuesta1

Esto no es realmente gran cosa. Imagen que quieres dibujar 10 rectángulos irregulares uno al lado del otro, este es quizás el código más corto que puedes tener

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

Verá: la palabra clave Xjuega un papel vital en el código aunque no representa ningún objeto gráfico en particular. De hecho, siempre representa elnodo más nuevo. Desde entonces, no tendrás que luchar con algo como \node(\i+1)at(\i.east){}dónde \i+1representa el resultado matemático de \imás uno. (¿Puedes realizar este cálculo sin buscar el manual o Google?) (Si crees que puedes, ¿cuál es el problema en el siguiente código? no hay 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]{}};

Quizás mi estilo de codificación esté fuera de lo común. Pero... mira el manual.

Nodo predefinido current bounding box
Este nodo tiene forma rectangle. A diferencia de los nodos normales, su tamaño cambia constantemente y siempre refleja el tamaño del cuadro delimitador de la imagen actual.
Nodo predefinido current path bounding box
Este nodo también tiene forma rectangle. Su tamaño es el tamaño del cuadro delimitador de la ruta actual.
Nodo predefinido current subpath start
Este nodo tiene forma coordinatey se encuentra al comienzo del subtrayecto actual. Esta es la posición de la última operación de traslado.

Aunque no son nodos reales estrictamente hablando (el autor hace trampa para queaspectocomo nodos reales), pero ya entiendes la idea.

Respuesta2

El siguiente código realiza un seguimiento de todos los nombres definidos dentro de una imagen y genera un error si se intenta redefinir un nombre. Realmente creo que es una mala idea usar este código y antes has hecho preguntas extrañas sobre cómo hacer cosas similares en TikZ. Sólo puedo repetir los consejos dados en respuestas anteriores.

[...] esto no es tan productivo como se podría pensar a largo plazo.

También tenga en cuenta que esta solución entra en conflicto conesta respuesta mía¡A otra extraña pregunta tuya!

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

información relacionada