Desalineación de los nodos TikZ al usar posicionamiento

Desalineación de los nodos TikZ al usar posicionamiento

Al colocar varios nodos que contienen imágenes de TikZ entre sí (usando la positioningbiblioteca TikZ), parece que los nodos de las imágenes contenidas se desalinean ligeramente:

Desalineación de nodos

Esta imagen resulta del siguiente código.

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

Observe cómo la alineación en el primer árbol está bien. ¿Que está pasando aqui? ¿Cómo es que esto funciona bien si se especifican posiciones absolutas para los nodos, pero no con posicionamiento relativo?

Respuesta1

Lamentablemente, su código anida tikzpictures. Esto debe evitarse porque los valores de las claves pgf de la imagen ambiental se heredan. Tú tampoco necesitas hacer eso, Ti.kZ tiene pics para ese propósito. Incluso entonces, debe asegurarse de que vertexno herede el ancla del posicionamiento. rightimplica que el ancla es west, lo que explica que todos los vértices se conectan a su izquierda. Puedes evitar esto agregando anchor=centera las opciones de 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}

ingrese la descripción de la imagen aquí

Respuesta2

Como lo hizo el gato de Schrödinger, implementaría sus árboles como pic. Puede simplificar su código como:

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

En particular, tenga en cuenta que no necesita \FPevalni utiliza \ifodd. Además, \tikzstylese ha depreciado a favor de \tikzset.

Con esto implementado, mi comprensión de la biblioteca de posicionamiento a partir de ejemplos es que el siguiente código debería funcionar

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

pero por razones que no entiendo esto da error. En lugar de utilizar el positioning libraryprefiero plantar los árboles manualmente para dar:

ingrese la descripción de la imagen aquí

Como alternativa, puedes utilizar el simpático truco del gato de Schrödinger:

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

Aquí está el código completo:

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

información relacionada