Deve ser evitado, por razões técnicas sérias, redefinir nomes de nós dentro de uma imagem tikz?

Deve ser evitado, por razões técnicas sérias, redefinir nomes de nós dentro de uma imagem tikz?

Isto é pedir opiniões e experiências sobre

  • se deve ser evitado (por razões sérias que não consigo imaginar) redefinir, dentro de uma mesma imagem tikz, nomes de nós várias vezes.

Pequeno exemplo

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

Já trabalho com isso há algum tempo, em algumas tikzpictures, sem nunca notar problemas (isso seria claramente atribuível a isso).

A razão para fazer isso em primeiro lugar é – em aplicações onde não são necessários nomes significativos – não é necessário pensar em como nomear um nó. (Se houver outra solução para esse problema, eu teria interesse em ler sobre ela, mas não consigo imaginar uma; afinal, o texto que nomeia o nó deve ser inserido no arquivo tex)

Se o resultado for a ilustração que se pretende, e uma vez que o "espaço de nomes" parece ser estritamente "local" e confinado ao \begin{tikzpicture} ... \end{tikzpicture}escopo, não consigo encontrar nada de seriamente errado com tal prática de programação.

No entanto, estou curioso para saber se há algo perigoso nisso que eu não pensei. Eu sei disso, nem é preciso dizer,ausênciade perigo nunca pode ser garantida.

Responder1

Isso não é realmente um grande problema. Imagem que você deseja desenhar 10 retângulos irregulares lado a lado, esse talvez seja o código mais curto que você pode ter

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

Veja: a palavra-chave Xdesempenha um papel vital no código, embora não represente nenhum objeto gráfico específico. Na verdade, representa sempre onó mais novo. Desde então, você não precisa se preocupar com algo como \node(\i+1)at(\i.east){}onde \i+1representa o resultado matemático de \imais um. (Você pode realizar este cálculo sem consultar o manual ou o Google?) (Se você acha que pode, qual é o problema no código a seguir? no 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]{}};

Talvez meu estilo de codificação esteja fora do mainstream. Mas... veja o manual

Nó predefinido current bounding box
Este nó tem forma rectangle. Ao contrário dos nós normais, seu tamanho muda constantemente e sempre reflete o tamanho da caixa delimitadora da imagem atual.
Nó predefinido current path bounding box
Este nó também tem forma rectangle. Seu tamanho é o tamanho da caixa delimitadora do caminho atual.
Nó predefinido current subpath start
Este nó tem forma coordinatee está no início do subcaminho atual. Esta é a posição da última operação de mudança.

Embora não sejam nós reais estritamente falando (o autor trapaceia para que elesvisualcomo nós reais), mas essa é a ideia.

Responder2

O código abaixo rastreia todos os nomes definidos em uma imagem e gera um erro se tentar redefinir um nome. Eu realmente acho que é uma má ideia usar este código e você já fez perguntas estranhas sobre como fazer coisas semelhantes no TikZ. Só posso repetir o conselho dado nas respostas anteriores

[...] isto não é tão produtivo como se poderia pensar a longo prazo.

Esteja ciente também de que esta solução entra em conflito comessa minha respostapara outra pergunta estranha sua!

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

informação relacionada