
Estou tentando criar uma árvore usando o pacote florestal, onde os nós folha estão todos na mesma camada.
No entanto, as linhas que ligam os nós mais altos atravessam outros nós. Existe alguma maneira de evitar isso com este pacote?
Aqui está o trecho de código relevante:
\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}
E aqui está uma imagem disso:
Responder1
Primeiro configurei os caminhos para usar arestas ortogonais (descritas na edge path
seção página 33 do manual florestal. Teoricamente também seria possível usar caminhos curvos, mas acho que isso levaria exponencialmente mais tempo.
Em seguida, aumentei a distância entre as crianças aumentando o s sep
valor (descrito na página 32 do manual) caso a caso. Em alguns níveis, 10mm eram suficientes, mas em outros, 20mm eram necessários.
Eu não tinha certeza se você substituiria "multiplicationOrDivision" e strings semelhantes por talvez símbolos ou ícones (o que eu recomendaria - ou permitiria quebras de linha nessas strings), então fiz apenas uma rápida aproximação das distâncias. É claro que para publicação significa que eles ainda precisariam ser ajustados.
Infelizmente, a imagem cresceu um pouco de tamanho. Talvez a sidewaysfigure
ou a \resizebox
possa se adequar ao contexto que você precisa?
Código:
\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}
Responder2
Se as bordas quadradas forem aceitáveis, elas provavelmente formarão a árvore mais bonita, como sugere.
No entanto, não há necessidade de configurar isso manualmente, pois o Forest atual fornece forked edges
em sua edges
biblioteca.
\usepackage[edges,linguistics]{forest}
e no preâmbulo da árvore
forked edges,
Eu também recomendaria fit=band
evitar a necessidade de mudar as coisas manualmente ou descobrir as dimensões corretas por tentativa e erro.
for tree={%
fit=band,
},
Definir inner xsep=0pt
a última camada para todos os nós também pode ajudar.
where n children=0{%
tier=word,
}{%
inner xsep=0pt,
},
Também dividi ...Or...
em nós multilinhas. Não sei se isso é aceitável para seu uso ou não, mas torna o diagrama mais gerenciável.
Eu recomendo configurar algumas macros: uma para adição/subtração e outra para multiplicação/divisão. Isso permitirá que você experimente diferentes opções simplesmente modificando as definições de macro comuns no preâmbulo.
Por exemplo:
\newcommand*\multordiv{Multiplication\\or\\Division}
\newcommand*\addorsub{Addition\\or\\Subtraction}
e algo para os asteriscos - eles deveriam estar centralizados e não no topo? Você pode considerar o uso do modo matemático para a última camada de nós.
\newcommand*\asthere{\textasteriskcentered}
Então a especificação da árvore
[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]
]
]
]
]
]
[{)}]
]
]
]
]
produz algo razoavelmente limpo e, se não muito compacto, pelo menos muito mais contido.
Código completo:
\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}