Несовпадение узлов TikZ при использовании позиционирования

Несовпадение узлов TikZ при использовании позиционирования

При позиционировании нескольких узлов, содержащих изображения TikZ, относительно друг друга (с использованием positioningбиблиотеки TikZ) создается впечатление, что узлы в содержащихся изображениях немного смещаются:

Несоосность узлов

Эта картинка получается в результате использования следующего кода

\documentclass{article}

\usepackage{tikz}
\usepackage{fp}

\usetikzlibrary{positioning}

\tikzstyle{vertex}=[circle, fill=black, minimum size=2pt, inner sep=0pt]

\newcommand{\makeTikzTree}[1]{%
    \FPeval{\result}{#1/2}
    \begin{tikzpicture}[thick, scale=0.4]
        \draw (0, 0) -- (0, -1) node[vertex]{};
        \ifodd#1
            \draw (0, 1) node[vertex]{} -- (0, 0);
            \foreach \x in {1, ..., \result} {
                \draw (-\x, 1) node[vertex]{} -- (0, 0);
                \draw (\x, 1) node[vertex]{} -- (0, 0);
            }
        \else
            \foreach \x in {0.5, ..., \result} {
                \draw (-\x, 1) node[vertex]{} -- (0, 0);
                \draw (\x, 1) node[vertex]{} -- (0, 0);
            }
        \fi
    \end{tikzpicture}
}

\begin{document}
\begin{center}
    \begin{tikzpicture}
        \node (tree1) {\makeTikzTree{5}};
        \node [right=of tree1] (tree2) {\makeTikzTree{4}};
        \node [right=of tree2] (tree3) {\makeTikzTree{7}};
    \end{tikzpicture}
\end{center}
\end{document}

Обратите внимание, что выравнивание на первом дереве выполнено отлично. Что здесь происходит? Почему это работает отлично, если указать абсолютные позиции для узлов, но не с относительным позиционированием?

решение1

К сожалению, ваш код вложен в tikzpictures. Этого следует избегать, поскольку значения ключей pgf окружающего изображения наследуются. Вам также не нужно этого делать, TiкZ имеет pics для этой цели. Даже тогда вам нужно убедиться, что vertexне наследует якорь от позиционирования. rightподразумевает, что якорь — это west, что объясняет, что все вершины соединяются слева. Вы можете избежать этого, добавив anchor=centerк опциям vertex.

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning}
\begin{document}
\begin{center}
    \begin{tikzpicture}[vertex/.style={circle, fill=black, minimum
    size=2pt,inner sep=0pt,anchor=center},
        pics/little tree/.style={code={
         \pgfmathtruncatemacro{\xmax}{#1/2}
         \draw (0, 0) -- (0, -1) node[vertex]{};
        \ifodd#1
            \draw (0, 1) node[vertex]{} -- (0, 0);
            \foreach \x in {1, ..., \xmax} {
                \draw (-\x, 1) node[vertex]{} -- (0, 0);
                \draw (\x, 1) node[vertex]{} -- (0, 0);
            }
        \else
            \foreach \x in {0.5, ..., \xmax} {
                \draw (-\x, 1) node[vertex]{} -- (0, 0);
                \draw (\x, 1) node[vertex]{} -- (0, 0);
            }
        \fi}}]
        \node[matrix] (tree1) {\pic[scale=0.4]{little tree=5};\\};
        \node[matrix,right=of tree1] (tree2) {\pic[scale=0.4]{little tree=4};\\};
        \node[matrix,right=of tree2] (tree3) {\pic[scale=0.4]{little tree=7};\\};
    \end{tikzpicture}
\end{center}
\end{document}

введите описание изображения здесь

решение2

Как это сделал кот Шредингера, я бы реализовал ваши деревья как pic. Вы можете упростить свой код следующим образом:

\tikzset{
  vertex/.style={circle, fill=black, minimum size=2pt, inner sep=0pt},
  pics/tree/.style = {
      code = {
      \begin{scope}[scale=0.4, thick]
        \node[vertex] (0) at (0,0){};
        \draw(0)--(0,1);
        \foreach \x in {1,...,#1} {
          \node[vertex] (n\x) at (\x-#1/2-1/2,2){};
          \draw(0,1)--(n\x);
        }
      \end{scope}
    }
  }
}

В частности, обратите внимание, что вам не нужно \FPevalили использовать \ifodd. Также, \tikzstyleбыл амортизирован в пользу \tikzset.

Учитывая это, я понимаю библиотеку позиционирования из примеров так, что следующий код должен работать

\begin{tikzpicture}
  \pic (tree1) at (0,0){tree=5};
  \pic[right=of tree1] (tree2) {tree=4};
  \pic[right=of tree2] (tree3) {tree=7};
\end{tikzpicture}

но по непонятным мне причинам это дает ошибку. Вместо того, чтобы использовать positioning libraryя предпочитаю сажать деревья вручную, чтобы получить:

введите описание изображения здесь

В качестве альтернативы можно воспользоваться хитрым трюком кота Шредингера:

\begin{tikzpicture}
  \node[matrix] (tree1) {\pic{tree=5};\\};
  \node[matrix,right=of tree1] (tree2) {\pic{tree=4};\\};
  \node[matrix,right=of tree2] (tree3) {\pic{tree=7};\\};
\end{tikzpicture} 

Вот полный код:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning}

\tikzset{
  vertex/.style={circle, fill=black, minimum size=2pt, inner sep=0pt},
  pics/tree/.style = {
      code = {
      \begin{scope}[scale=0.4, thick]
        \node[vertex] (0) at (0,0){};
        \draw(0)--(0,1);
        \foreach \x in {1,...,#1} {
          \node[vertex] (n\x) at (\x-#1/2-1/2,2){};
          \draw(0,1)--(n\x);
        }
      \end{scope}
    }
  }
}

\begin{document}
  \begin{center}
      \begin{tikzpicture}
        \pic at (0,0){tree=5};
        \pic at (2,0){tree=4};
        \pic at (4.5,0){tree=7};
      \end{tikzpicture}
  \end{center}

  % Schrödinger's cat's nice trick
  \begin{tikzpicture}
    \node[matrix] (tree1) {\pic{tree=5};\\};
    \node[matrix,right=of tree1] (tree2) {\pic{tree=4};\\};
    \node[matrix,right=of tree2] (tree3) {\pic{tree=7};\\};
  \end{tikzpicture} 

\end{document}

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