라텍스 포레스트 패키지 노드 사이의 선 길이를 줄이시겠습니까?

라텍스 포레스트 패키지 노드 사이의 선 길이를 줄이시겠습니까?

Forest 패키지를 사용하여 Red-Black 트리를 만들려고 합니다. 프레젠테이션의 어느 시점에서 빨간색 노드 사이의 선을 줄여야 하지만 부모 노드는 검은색입니다.

\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순전히 편리하다는 점에 유의하십시오. 여러 트리에 동일한 콘텐츠가 필요하지 않은 경우 이를 무시하고 일반적인 방법으로 트리를 지정해야 합니다. 처음 세 트리의 사양이 동일하므로 중복을 피할 수 있습니다.

관련 정보