
Quero produzir a seguinte figura com forest
:
Então, o que estou procurando é uma especificação de estilo que diga que a filha 1 (frapp) e a filha 2 (formiga) juntas se relacionam com A. A filha 2 (formiga) é mais importante, o que é marcado na figura pela linha descendente dobrando para a direita abaixo ant
.
Existe uma maneira de integrá-lo ao exemplo abaixo?
\documentclass{article}
\usepackage{forest}
\begin{document}
\begin{forest}
[un exemple
[A
[frapp]
[ant] ] ]
\end{forest}
\end{document}
São duas relações envolvendo três elementos: A é a mãe do frapp e da formiga. E formiga é a cabeça (elemento mais importante) dentro de A. Existe uma maneira legal de fazer isso com forest
estilos?
Editar:
Segui a sugestão e experimentei um pouco edge path
. Isto é o que eu tenho:
\documentclass{article}
\usepackage{forest}
\forestset{
dg translation/.style={edge path={\noexpand\path[\forestoption{edge}]
(!u.parent anchor)-- +(0,-l)
(!p.north west)--(.north east)\forestoption{edge label};}}
}
\begin{document}
\begin{forest}
[un example
[A
[frapp, no edge]
[ant, dg translation] ] ]
\end{forest}
\end{document}
Isso produz:
Uma linha reta de comprimento l
sul e uma linha que cobre as duas filhas. Eu teria então que elevar a linha para que ficasse no nível A novamente (e adicionar um pouco de curvatura). Mas não sei como consigo a distância. Não é, l
mas um pouco menos. Alternativamente eu poderia desenhar de baixo de A mas não sei até onde ir para a esquerda e para a direita, pois isso depende do tamanho das filhas.
Eu também tive que especificar no edge
sobre a outra filha. Se isso pudesse de alguma forma ser evitado, seria ótimo.
Editar 2:
OK, seguindo um comentário do cfr, me livrei da no edge
especificação na árvore:
\documentclass{article}
\usepackage{forest}
\forestset{
dg translation/.style={edge path={\noexpand\path[\forestoption{edge}]
(!u.parent anchor)-- +(0,-l)
(!p.north west)--(.north east)\forestoption{edge label};},!p.edge'={}}
}
\begin{document}
\begin{forest}
[un example
[A
[frapp]
[ant, dg translation] ] ]
\end{forest}
\end{document}
Mas ainda não sei como devo traçar a linha curva abaixo de A. O comentário não me ajuda aqui.
Editar 3:
OK. Cheguei até aqui:
\documentclass{article}
\usepackage{forest}
\usetikzlibrary{calc}
\forestset{
dg translation/.style={edge path={\noexpand\path[\forestoption{edge}, rounded corners=3pt]
% the line downwards
(!u.parent anchor)-- +($(0,-l)-(0,12pt)$)-- +($(12pt,-l)-(0,12pt)$)
% the horizontal line
($(!p.north west)+(0,l)-(0,14pt)$)--($(.north east)+(0,l)-(0,14pt)$)\forestoption{edge label};},!p.edge'={}}
}
\begin{document}
\begin{forest}
[un exemple
[A
[frapp]
[ant, dg translation] ] ]
\end{forest}
\end{document}
Isso produz a seguinte imagem:
Há várias coisas com as quais estou insatisfeito: O código contém uma mudança manual de 14 pontos para cima. Isso não funciona com outros tamanhos de fonte.
Outra questão é como faço para que a linha horizontal fique curvada. Encontrei algumas maneiras de influenciar a linha em tikz
, mas essas são opções para o caminho e parece não ser possível ter dois caminhos de borda diferentes em forest
. Portanto, se eu especificar opções, rounded corners
isso afetará todas as partes do caminho, mas quero ter dois caminhos separados. Existe uma maneira de fazer isso?
Responder1
EDITARMinha resposta original funciona apenas comflorestaversão 1. O código abaixo não é apenas mais simples, mas funciona igualmente bem com a versão 1 e a versão 2.
Esta foi a minha solução. Observe que a solução de Stefan Müller para configuração no edge
no irmão foi muito mais simples do que meu uso explícito node walk
na versão original deste código, embora a versão atualizada abaixo seja ainda mais simples.
Eu uso a tikz
chave para desenhar a linha horizontal curva, em vez de tentar colocá-la no edge
caminho. Isso torna mais fácil ter certeza de que os nós aos quais me refiro existem, embora isso possa ser incorporado ao desenho edge
com um pouco de cuidado.
'VIN' é, obviamente, o equivalente dos nós ao 'VIP' das pessoas.
\documentclass[tikz,border=10pt]{standalone}
\usepackage{forest}
\begin{document}
\begin{forest}
for tree={
parent anchor=south,
child anchor=north,
},
vin/.style={
child anchor=south west,
edge path={
\noexpand\path [draw, \forestoption{edge}]
(!u.parent anchor) -- (!u.parent anchor |- .west) [out=-90, in=180] to (.child anchor)\forestoption{edge label};
},
for parent={
before packing={
tikz={
\draw (!1.north west |- .parent anchor) [out=30, in=170] to (.parent anchor) [out=-10, in=-150] to (!l.north east |- .parent anchor);
},
},
},
before typesetting nodes={
!p.no edge,
},
}
[un exemple
[A
[frapp
]
[ant, vin
]
]
]
\end{forest}
\end{document}