패키지 포리스트의 노드 위에 그리는 우회선

패키지 포리스트의 노드 위에 그리는 우회선

리프 노드가 모두 동일한 계층에 있는 포리스트 패키지를 사용하여 트리를 생성하려고 합니다.

그러나 상위 노드를 연결하는 선은 다른 노드를 통해 잘립니다. 이 패키지로 이를 방지할 수 있는 방법이 있나요?

관련 코드 조각은 다음과 같습니다.

\begin{forest}    
    where n children=0{tier=word}{}    
    [equation, %for tree={parent anchor=south, child anchor=north}    
        [VARIABLE[y]]    
        [{=}]    
        [expression    
            [additionOrSubtraction    
                [multiplicationOrDivision    
                    [atom[VARIABLE[x]]]    
                ]    
                [{*}]    
                [atom    
                    [{(}]    
                    [expression    
                        [additionOrSubtraction    
                            [multiplicationOrDivision    
                                [atom[INTEGER[2]]]    
                            ]    
                            [{+}]    
                            [multiplicationOrDivision    
                                [atom[INTEGER[3]]]    
                                [{*}]    
                                [atom[VARIABLE[x]]]    
                            ]    
                        ]    
                    ]    
                    [{)}]    
                ]    
            ]    
        ]    
    ]        
\end{forest}

그리고 여기에 그 이미지가 있습니다: 그리고 여기 문제의 이미지가 있습니다

답변1

먼저 직각 모서리를 사용하도록 경로를 설정했습니다( edge path숲 매뉴얼 33페이지 섹션에 설명되어 있음). 이론적으로는 곡선 경로를 사용하는 것도 가능하지만 이 경우 시간이 기하급수적으로 더 걸릴 것 같습니다.

s sep다음에 는 사례별로 값(매뉴얼 32페이지에 설명)을 높여 아이들 사이의 거리를 넓혔습니다 . 어떤 수준에서는 10mm면 충분했지만 다른 수준에서는 20mm가 필요했습니다.

"multiplicationOrDivision" 및 유사한 문자열을 기호나 아이콘(권장하거나 이 문자열 내에서 줄바꿈을 허용함)으로 대체할 것인지 확신할 수 없었기 때문에 대략적인 거리를 간단히 계산했습니다. 물론 출판을 위해서는 여전히 미세 조정이 필요하다는 의미입니다.

아쉽게도 이미지 크기가 조금 커졌습니다. 아마도 a sidewaysfigure또는 a가 \resizebox필요한 상황에 맞을 수 있을까요?

결과:콜탁의 나무

암호:

 \documentclass{standalone}
\usepackage{forest}
\begin{document}
\begin{forest}for tree={% 
    edge path={\noexpand\path[\forestoption{edge}] (!u.parent anchor) -- +(0,-\baselineskip) -| (.child anchor)\forestoption{edge label};}},
    where n children=0{tier=word}{}    
    [equation, s sep=15mm %for tree={parent anchor=south, child anchor=north}    
        [VARIABLE[y]]    
        [{=}]    
        [expression    
            [additionOrSubtraction, s sep=20mm
                [multiplicationOrDivision
                    [atom[VARIABLE[x]]]    
                ]    
                [{*}]    
                [atom, s sep=20mm
                    [{(}]    
                    [expression    
                        [additionOrSubtraction, s sep=20mm
                            [multiplicationOrDivision    
                                [atom[INTEGER[2]]]    
                            ]    
                            [{+}]    
                            [multiplicationOrDivision, s sep=10mm  
                                [atom[INTEGER[3]]]    
                                [{*}]    
                                [atom[VARIABLE[x]]]    
                            ]    
                        ]    
                    ]    
                    [{)}]    
                ]    
            ]    
        ]    
    ]        
\end{forest}
\end{document}

답변2

사각형 모서리가 허용된다면 제안된 것처럼 아마도 가장 깔끔한 트리가 될 것입니다.

forked edges그러나 현재 Forest가 라이브러리 에서 제공하는 것처럼 이를 수동으로 구성할 필요는 없습니다 edges.

\usepackage[edges,linguistics]{forest}

그리고 트리의 서문에서

  forked edges,

fit=band또한 수동으로 작업을 전환하거나 시행착오를 통해 올바른 치수를 알아낼 필요가 없는 방법을 권장합니다 .

  for tree={%
    fit=band,
  },

모든 노드 막대에 대한 설정은 inner xsep=0pt마지막 계층도 도움이 될 수 있습니다.

  where n children=0{%
    tier=word,
  }{%
    inner xsep=0pt,
  },

또한 여러 줄 노드로 분할했습니다 ...Or.... 이것이 귀하의 사용에 적합한지 여부는 알 수 없지만 보다 관리하기 쉬운 다이어그램이 됩니다.

매크로 두 개를 설정하는 것이 좋습니다. 하나는 덧셈/뺄셈용이고 다른 하나는 곱셈/나눗셈용입니다. 이렇게 하면 서문의 일반적인 매크로 정의를 간단히 수정하여 다양한 옵션을 실험할 수 있습니다.

예를 들어:

\newcommand*\multordiv{Multiplication\\or\\Division}
\newcommand*\addorsub{Addition\\or\\Subtraction}

그리고 별표에 대한 것 - 이것들이 상단이 아닌 중앙에 있어야 합니까? 노드의 마지막 계층에 수학 모드를 사용하는 것을 고려할 수 있습니다.

\newcommand*\asthere{\textasteriskcentered}

그런 다음 트리 사양

  [equation
    [VARIABLE[y]]
    [{=}]
    [expression
      [\addorsub
        [\multordiv
          [atom
            [VARIABLE
              [x]
            ]
          ]
        ]
        [\asthere]
        [atom
          [{(}]
          [expression
            [\addorsub
              [\multordiv
                [atom
                  [INTEGER
                    [2]
                  ]
                ]
              ]
              [{+}]
              [\multordiv
                [atom
                  [INTEGER
                    [3]
                  ]
                ]
                [\asthere]
                [atom
                  [VARIABLE
                    [x]
                  ]
                ]
              ]
            ]
          ]
          [{)}]
        ]
      ]
    ]
  ]

합리적으로 깔끔하고, 아주 컴팩트하지는 않더라도 최소한 훨씬 더 많은 것을 포함하는 것을 생성합니다.

더 많이 포함된 나무

전체 코드:

\documentclass[border=5pt,tikz,multi]{standalone}
\usepackage[edges,linguistics]{forest}
\newcommand*\multordiv{Multiplication\\or\\Division}
\newcommand*\addorsub{Addition\\or\\Subtraction}
\newcommand*\asthere{\textasteriskcentered}
\begin{document}
\begin{forest}
  where n children=0{%
    tier=word,
  }{%
    inner xsep=0pt,
  },
  for tree={%
    fit=band,
  },
  forked edges,
  [equation
    [VARIABLE[y]]
    [{=}]
    [expression
      [\addorsub
        [\multordiv
          [atom
            [VARIABLE
              [x]
            ]
          ]
        ]
        [\asthere]
        [atom
          [{(}]
          [expression
            [\addorsub
              [\multordiv
                [atom
                  [INTEGER
                    [2]
                  ]
                ]
              ]
              [{+}]
              [\multordiv
                [atom
                  [INTEGER
                    [3]
                  ]
                ]
                [\asthere]
                [atom
                  [VARIABLE
                    [x]
                  ]
                ]
              ]
            ]
          ]
          [{)}]
        ]
      ]
    ]
  ]
\end{forest}
\end{document}

관련 정보