Paquete Latex Forest ¿Reducir la longitud de las líneas entre los nodos?

Paquete Latex Forest ¿Reducir la longitud de las líneas entre los nodos?

Al utilizar el paquete Forest, intento crear un árbol rojo-negro. En algún momento de mi presentación necesito acortar las líneas entre los nodos que son rojos, pero los padres son negros.

\documentclass{article}
\usepackage{graphicx}
\usepackage{forest}

\begin{document}

\begin{forest}
    for tree={circle, draw, s sep=15pt, l sep=5pt, font=\tiny\color{white}\bfseries, minimum size=15pt},
        [, fill=black!80
            [, fill=black!80
                [, draw=none]
                [, draw=none]
            ]
            [, fill=red!80
                [, fill=black!80
                    [, fill=red!80
                        [, draw=none]
                        [, draw=none]
                    ]
                    [, fill=red!80
                        [, draw=none]
                        [, draw=none]
                    ]
                ]
                [, fill=black!80
                    [, draw=none]
                    [, fill=red!80
                        [, draw=none]
                        [, draw=none]
                    ]
                ]
            ]
        ]
\end{forest}
            
\end{document}

Puede ver el resultado generado por el siguiente código.

Figura 1

Después de este paso, estoy intentando hacer algo como esto.

Ignore la diferencia de estilo entre las figuras. Solo intento acortar la longitud de las líneas entre los nodos rojo-negro.

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Respuesta1

Tenga en cuenta que he utilizado el árbol que codificó como ejemplo. El cuarto árbol no tiene nodos rojos, por lo que, dado que la pregunta se refiere específicamente a ajustar las distancias entre los niños rojos y los padres negros, no hay nada que hacer en este caso.

Entonces, la pregunta básicamente es cómo formatear un árbol de tres maneras diferentes. En el siguiente código, @+\rbtreese expande a la especificación de corchetes de su módulo de árbol algunos ajustes con estilos modificados y similares.

\begin{forest}
  red black,
  @+\rbtree
\end{forest}

Esto produce el resultado que se muestra en su pregunta con modificaciones menores que lo acercan un poco más a lo que desea. Esta es la línea de base/punto de partida.

\begin{forest}
  red black,
  squash,
  @+\rbtree
\end{forest}

Esto se aproxima al siguiente árbol. Los nodos rojos se acercan a los padres negros, pero no se les permite superponerse.

\begin{forest}
  red black,
  squash,
  not distinct,
  s adjust'=4,
  l short'=10pt,
  @+\rbtree
\end{forest}

Este código acorta las distancias, pero utiliza valores no predeterminados para s adjustque l shortlos niños rojos se superpongan entre sí y se superpongan debajo de sus padres negros. not distinctdesactiva las sombras paralelas, desactiva el código utilizado para fomentar la separación de nodos y altera el orden en el que se dibuja el árbol. Normalmente, los árboles se dibujan de arriba hacia abajo, pero no queremos eso aquí, por lo que utilizamos tree children-firstpara dibujar el árbol de abajo hacia arriba. Esto hace que los niños se superpongan a los padres en lugar de superponerlos.

un árbol de tres maneras

\documentclass[tikz,border=5pt]{standalone}
\usepackage{forest}
\usetikzlibrary{shadows}
% ateb : https://tex.stackexchange.com/a/707076/ addaswyd o gwestiwn İbrahim Uğur ABA: https://tex.stackexchange.com/q/706871/
\forestset{%
  declare boolean={red node}{0},
  declare boolean={black node}{0},
  declare boolean={squashed}{0},
  declare boolean register={squash},
  declare boolean register={distinct},
  not squash,
  distinct,
  declare dimen register={l short},
  declare count register={s adjust},
  l short'=15pt,
  s adjust'=5,
  red black/.style={%
    for tree={%
      fit=band,
      circle, 
      draw, 
      s sep'=15pt, 
      l'=5pt, 
      l sep'=5pt,
      edge+=thick,
      if n children=0{%
        inner sep=.5pt,
        fill,
        before computing xy={l'=12pt},
      }{%
        text=white,
        font=\tiny\sffamily\bfseries, 
        minimum size=15pt,
      },
    },
    before typesetting nodes={%
      if squash={%
        for descendants={%
          if={ > OO& {red node}{!u.black node} }{%
            before computing xy={%
              l/.register=l short,
              if={ > OOw+P< {n} {!u.n children}{(##1+1)/2} }{%
                s/.process={ ORw2+Pw+d {n}{s adjust}{-##2*##1}{##1pt} }
              }{%
                s/.process={ ORw2+Pw+d {n}{s adjust}{##2*##1}{##1pt} }
              },
            },
          }{},
        },
        if distinct={%
          where black node={%
            tempcounta'=0,
            if nodewalk empty={filter={children}{>O{red node}}}{}{%
              for nodewalk={filter={children}{>O{red node}}}{%
                if={ > O_ > {n}{1} }{%
                  if={ > O {!p.red node} }{%
                    insert before={[,phantom]}
                  }{},
                }{},
              },
            },
          }{},
        }{%
          /tikz/circular drop shadow/.style={},
          draw tree processing order/.nodewalk style=tree children-first,
        },
      }{},
    },
  },
  red one/.style={fill=red,circular drop shadow,red node},
  black one/.style={fill=black,circular drop shadow,black node},
}
\bracketset{action character=@}
\NewDocumentCommand \rbtree {}{%
  [, black one
    [, black one
      []
      []
    ]
    [, red one
      [, black one
        [, red one
          []
          []
        ]
        [, red one
          []
          []
        ]
      ]
      [, black one
        []
        [, red one
          []
          []
        ]
      ]
    ]
  ]%
}
\begin{document}

\begin{forest}
  red black,
  @+\rbtree
\end{forest}
\begin{forest}
  red black,
  squash,
  @+\rbtree
\end{forest}
\begin{forest}
  red black,
  squash,
  not distinct,
  s adjust'=4,
  l short'=10pt,
  @+\rbtree
\end{forest}
            
\end{document}

Tenga en cuenta que el uso de \rbtreees pura conveniencia. A menos que necesite el mismo contenido en varios árboles, debe ignorarlo y especificar sus árboles de la forma habitual. Simplemente evita la duplicación ya que los primeros tres árboles tienen especificaciones idénticas.

información relacionada