Пакет Latex Forest Уменьшить длину линий между узлами?

Пакет Latex Forest Уменьшить длину линий между узлами?

Используя пакет Forest, я пытаюсь создать красно-черное дерево. В какой-то момент в моей презентации мне нужно сократить линии между узлами, которые красные, но родители черные.

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

Вы можете увидеть результат работы кода ниже.

Рисунок 1

После этого шага я попытаюсь сделать что-то подобное.

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

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

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

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

решение1

Обратите внимание, что я использовал дерево, которое вы закодировали в качестве примера. Четвертое дерево не имеет красных узлов, поэтому, поскольку вопрос касается именно корректировки расстояний между красными детьми и черными родителями, в этом случае делать нечего.

Итак, вопрос в основном заключается в том, как отформатировать одно дерево тремя разными способами. В следующем коде @+\rbtreeрасширяется до спецификации скобок вашего дерева по модулю, немного убираясь с измененными стилями и тому подобным.

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

Этот код сокращает расстояния, но использует нестандартные значения для s adjustи l shortпоэтому красные потомки перекрывают друг друга и перекрывают своих черных родителей. not distinctотключает тени, отключает код, используемый для поощрения разделения узлов, и изменяет порядок, в котором рисуется дерево. Обычно деревья рисуются сверху вниз, но нам это не нужно, поэтому мы используем tree children-firstдля рисования дерева снизу вверх. Это заставляет потомков перекрывать родителей, а не перекрывать их.

одно дерево три пути

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

Обратите внимание, что использование \rbtree— это простое удобство. Если вам не нужен одинаковый контент в нескольких деревьях, вам следует игнорировать это и указывать деревья обычным способом. Это просто позволяет избежать дублирования, поскольку первые три дерева имеют идентичные спецификации.

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