Acrescentar uma especificação relativa a duas filhas, uma delas com estatuto especial, na floresta

Acrescentar uma especificação relativa a duas filhas, uma delas com estatuto especial, na floresta

Quero produzir a seguinte figura com forest:

Haste Tesnieriana

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 forestestilos?

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:

insira a descrição da imagem aqui

Uma linha reta de comprimento lsul 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 é, lmas 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 edgesobre 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 edgeespecificaçã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:

insira a descrição da imagem aqui

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 cornersisso 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 edgeno irmão foi muito mais simples do que meu uso explícito node walkna versão original deste código, embora a versão atualizada abaixo seja ainda mais simples.

Eu uso a tikzchave para desenhar a linha horizontal curva, em vez de tentar colocá-la no edgecaminho. Isso torna mais fácil ter certeza de que os nós aos quais me refiro existem, embora isso possa ser incorporado ao desenho edgecom 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}

caminhos sinuosos

informação relacionada