하나의 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특정 그래픽 개체를 나타내지는 않지만 코드에서 중요한 역할을 합니다. 사실, 그것은 항상최신 노드. 그 이후로 당신은 더하기 1 의 수학적 결과를 나타내는 \node(\i+1)at(\i.east){}곳 과 같은 문제로 어려움을 겪을 필요가 없습니다 . (매뉴얼이나 구글을 검색하지 않고 이 계산을 수행할 수 있습니까?) (할 수 있다고 생각한다면 다음 코드의 문제점은 무엇입니까? no manual/google/compiler)\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

아래 코드는 한 그림 내에서 정의된 모든 이름을 추적하고 이름을 재정의하려고 하면 오류를 발생시킵니다. 나는 정말로 이 코드를 사용하는 것이 나쁜 생각이라고 생각하며 이전에 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}

관련 정보