Следует ли по серьезным техническим причинам избегать переопределения имен узлов в пределах одного 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играет важную роль в коде, хотя оно не представляет собой какой-либо конкретный графический объект. Фактически, оно всегда представляетновейший узел. С тех пор вам не придется бороться с чем-то вроде того, \node(\i+1)at(\i.east){}где \i+1обозначает математический результат \iплюс один. (Можете ли вы выполнить это вычисление, не заглядывая в руководство или Google?) (Если вы думаете, что можете, в чем проблема в следующем коде? нет руководства/Google/компилятора)

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

Связанный контент