Después de mucho luchar ya hallamos la contestación de esta contratiempo que muchos lectores de nuestro sitio web han presentado. Si tienes algo más que aportar no dudes en aportar tu información.
Solución:
Aquí hay un enfoque diferente al problema que requiere menos intervención manual y tiene una sintaxis intuitiva. También te permite usarlo como edge
estilo en una rama existente del árbol sin especificar ningún nodo en absoluto.
documentclassarticle
usepackagetikz
usepackagetikz-qtree
usepackagetipa
usetikzlibrarydecorations,decorations.text
tikzsetdelink/.style=
decorate,
postaction=decorate,
decoration=text along path,
text align=center,
text=tiny,
transform=rotate=90
begindocument
begintikzpicture[baseline]
tikzsetfrontier/.style=distance from root=85pt
Tree
[.$omega$ edge[delink];
[.$sigma$ textipaP [.$mu$ e ] [.$mu$ node(a)t; ] ]
[.node(x)$sigma$; [.node(y)$mu$; e ] ]
[.node(b)$sigma$; edge[delink]; n [.$mu$ node(c)e; ] [.node(d)$mu$; ] ]
[.$sigma$ h [.$mu$ node(f)u; ] [.node(e)$mu$; ] ]
]
draw[delink] (d.south) -- (c.north);
draw[delink] (e.south) -- (f.north);
draw[delink] (x.south) -- (a.north);
endtikzpicture
enddocument
A forest
solución
los forest
El paquete proporciona una forma más sencilla de agregar nodos con nombre a los árboles, por lo que personalmente usaría forest
para hacer este tipo de árboles. Lo mismo delink
el estilo también se puede usar con él. Aquí está el mismo código usando forest
. Agregué código para formatear automáticamente el nivel segmentario usando tipa
(por lo que no es necesario envolverlos textipa
) y luego cada segmento estará en la misma fuente. Para que esto funcione, si un nodo mora no tiene dependientes segmentarios directos (es decir, está vinculado a un segmento que ya está dominado por un nodo mora), debe indicar explícitamente que el nodo está en el mora
nivel.
documentclassarticle
usepackagetikz
usepackage[linguistics]forest
usepackagetipa
usetikzlibrarydecorations,decorations.text
tikzsetdelink/.style=
decorate,
postaction=decorate,
decoration=text along path,
text align=center,
text=,
transform=rotate=90
newcommandsyl$sigma$
newcommandmor$mu$
newcommandword$omega$
forestsetprosodic tree/.style=
for tree=if n children=0tier=seg,font=tipaencoding,inner sep=0pt,s sep=1em
begindocument
beginforestprosodic tree
[word
[syl,edge=delink [P] [mor [e] ] [mor [t,name=a ] ] ]
[syl,name=x [mor,name=y [e] ] ]
[syl,name=b [n] [mor [e,name=c ] ] [mor,name=d,tier=mora ] ]
[syl [h] [mor [u,name=f ] ] [mor,name=e,tier=mora ] ]
]
draw[delink] (d.south) -- (c.north);
draw[delink] (e.south) -- (f.north);
draw[delink] (x.south) -- (a.north);
endforest
enddocument
EDITAR: Siguiendo la sugerencia de Alan Munn, un tiny
el signo igual se ve mejor y reduce la necesidad de cambiar de nodo.
Puedes poner un nodo con el símbolo =
en los bordes del árbol para simular un tachado.
Para las líneas manuales (p. Ej., Entre nodos x
y a
) puede agregar un nodo en la posición intermedia en la declaración del dibujo lineal. Para las líneas automáticas (por ejemplo, entre σ y μ), puede agregar un nodo separado en el punto medio. Tenga en cuenta que debe dar un nombre a los nodos del árbol para poder calcular la posición intermedia. Tenga en cuenta también que necesita el calc
tikzlibrary.
Si desea rotar el tachado (como en el ejemplo), puede agregar rotate=
al nodo. También puede calcular automáticamente el ángulo usando pgfmathanglebetweenpoints
si no desea estimar manualmente el valor. Sin embargo, es posible que aún sea necesario realizar algunos ajustes manuales. En mi humilde opinión, un tachado no rotado también se ve bien.
Puede cambiar la posición vertical del tachado cambiando la relación a, por ejemplo, 0.6
, y la posición horizontal agregando una pequeña cantidad a la coordenada, por ejemplo, +(0.05,0)
(o cambiar ambos con un componente y distinto de cero).
MWE:
documentclassarticle
usepackagetikz
usepackagetikz-qtree
usepackagetipa
usetikzlibrarycalc
begindocument
begintikzpicture[baseline]
tikzsetfrontier/.style=distance from root=85pt
Tree
[.$omega$
[.$sigma$ textipaP [.$mu$ e ] [.$mu$ node(a)t; ] ] [.node(x)$sigma$; [.node(y)$mu$; e ] ]
[.node(b)$sigma$; n [.$mu$ node(c)e; ] [.node(d)$mu$; ] ] [.$sigma$ h [.$mu$ node(f)u; ] [.node(e)$mu$; ] ] ]
% compute angle between nodes
pgfmathanglebetweenpointspgfpointanchorxcenterpgfpointanchoracenter
edefangleXApgfmathresult
draw (d.south) -- (c.north);
draw (e.south) -- (f.north);
draw (x.south) -- (a.north) node[rotate=60-angleXA,pos=.5,font=tiny] (st1) =;
% alternative, not rotated
%draw (x.south) -- (a.north) node[pos=.5,font=tiny] (st1) =;
% shifted node, normal size
% node at ($(x)!0.6!(y)+(0.04,0)$) (st2) =;
% alternative, not shifted, font=tiny:
node[font=tiny] at ($(x)!0.5!(y)$) (st2) =;
endtikzpicture
enddocument
Resultado: