
Quiero producir la siguiente figura con forest
:
Entonces, lo que estoy buscando es una especificación de estilo que diga que la hija 1 (frapp) y la hija 2 (hormiga) juntas se relacionan con A. La hija 2 (hormiga) es más importante, que está marcada en la figura por la línea descendente que se dobla hacia la derecha debajo ant
.
¿Hay alguna manera de integrarlo en el siguiente ejemplo?
\documentclass{article}
\usepackage{forest}
\begin{document}
\begin{forest}
[un exemple
[A
[frapp]
[ant] ] ]
\end{forest}
\end{document}
Son dos relaciones que involucran tres elementos: A es la madre de frapp y ant. Y la hormiga es la cabeza (elemento más importante) dentro de A. ¿Existe una buena manera de hacer esto con forest
estilos?
Editar:
Seguí la sugerencia y experimenté un poco con edge path
. Esto es lo que tengo:
\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}
Esto produce:
Una línea recta de longitud l
hacia el sur y una línea que cubre a las dos hijas. Luego tendría que elevar la línea para que vuelva a estar en el nivel de A (y agregar algo de curvatura). Pero no sé cómo saco la distancia. No es l
sino un poquito menos. Alternativamente, podría dibujar desde abajo de A, pero no sé qué tan lejos hacia la izquierda y hacia la derecha ir, ya que esto depende del tamaño de las hijas.
También tuve que especificar no edge
sobre la otra hija. Si esto pudiera evitarse de alguna manera, sería genial.
Edición 2:
Bien, siguiendo un comentario de cfr, me deshice de la no edge
especificación en el árbol:
\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}
Pero todavía no sé cómo debo dibujar la línea curva debajo de A. El comentario no me ayuda aquí.
Edición 3:
DE ACUERDO. Llegué hasta aquí:
\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}
Esto produce la siguiente imagen:
Hay varias cosas con las que no estoy satisfecho: El código contiene un desplazamiento manual hacia arriba de 14 puntos. Esto no funciona con otros tamaños de fuente.
Otra pregunta es cómo consigo que la línea horizontal tenga curvas. Encontré algunas formas de influir en la línea tikz
, pero estas son opciones para la ruta y no parece posible tener dos rutas de borde diferentes forest
. Entonces, si especifico opciones, rounded corners
afecta a todas las partes de la ruta, pero quiero tener dos rutas separadas. ¿Hay alguna forma de hacer esto?
Respuesta1
EDITARMi respuesta original solo funciona conbosqueversión 1. El código siguiente no solo es más simple, sino que funciona igualmente bien con la versión 1 y la versión 2.
Esta fue mi solución. Tenga en cuenta que la solución de Stefan Müller para configurar no edge
el hermano fue mucho más clara que mi uso explícito node walk
en la versión original de este código, aunque la versión actualizada a continuación es aún más simple.
Utilizo la tikz
tecla para dibujar la línea horizontal curva, en lugar de intentar ponerla en el edge
camino. Esto hace que sea fácil estar seguro de que los nodos a los que hago referencia existen, aunque esto podría incorporarse al dibujo edge
con un poco de cuidado.
'VIN' es, por supuesto, el equivalente de los nodos al 'VIP' de las personas.
\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}