
리프 노드가 모두 동일한 계층에 있는 포리스트 패키지를 사용하여 트리를 생성하려고 합니다.
그러나 상위 노드를 연결하는 선은 다른 노드를 통해 잘립니다. 이 패키지로 이를 방지할 수 있는 방법이 있나요?
관련 코드 조각은 다음과 같습니다.
\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}