Luego de tanto luchar pudimos encontrar el resultado de este apuro que algunos los lectores de nuestra web han tenido. Si tienes algo que compartir no dejes de compartir tu comentario.
Solución:
La respuesta de Alan funciona bien, pero con la versión actual de Forest no es necesario definir el edge path
desde cero. En su lugar, podemos usar el edges
biblioteca con la opción forked edges
. Además, podemos eliminar growth parent anchor=east
ya que no hace nada (incluso en la versión anterior de Forest), y podemos usar el parent
y children
anclas en lugar de east
y west
para hacer el código más flexible.
parent anchor=children,
child anchor=parent,
forked edges,
edge=->,>=latex,
De hecho, grow=east
es suficiente por sí solo, para que podamos soltar parent anchor
y child anchor
especificaciones en conjunto.
Esto nos da la siguiente código para el mismo resultado que Alan mostró en su respuesta.
documentclass[tikz,multi,border=10pt]standalone
usepackage[edges]forest
begindocument
beginforest
for tree=
grow=east,
math content,
edge=->,>=latex,
,
forked edges
[tau>tau^0
[A_x
Sin embargo, en una inspección más cercana, las líneas podrían ser mejores:
La definición predeterminada de forked edges
es
forked edges/.style=
for tree=parent anchor=children,
for descendants=child anchor=parent,forked edge
,
Intentemos redefinirlo para que el forked edge
solo se usa si un nodo tiene más de un hijo agregando esta redefinición:
forestset
forked edges/.style=
for tree=parent anchor=children,
for descendants=
child anchor=parent,
if=n_children("!u")==1
forked edge
,
,
Este es mejor:
Sin embargo, la flecha todavía está en ángulo, no es del todo horizontal. Lo que tenemos que hacer es definir una alternativa edge path
para el caso en el que hay precisamente un niño.
El borde predeterminado se extrae del ancla principal del nodo principal (!u.parent anchor)
al ancla hijo del nodo secundario (.child anchor)
. Nos gustaría que el inicio de la flecha se alineara horizontalmente con (.child anchor)
. (En su lugar, podríamos alinear el punto final con el ancla principal del padre, por supuesto).
forestset
forked edges/.style=
for tree=parent anchor=children,
for descendants=
child anchor=parent,
if=n_children("!u")==1
edge path'=- .child anchor) -- (.child anchor)
,
forked edge,
,
,
Esto produce la flecha horizontal que estamos buscando:
Sin embargo, esta puede no ser la mejor solución. Si los nodos padre e hijo son de tamaño demasiado diferente, es posible que obtengamos una alineación extraña. Entonces, tal vez deberíamos decirle a Forest que alinee al niño con el padre para que el ancla del niño del niño se alinee con el ancla del padre del padre.
forestset
forked edges/.style=
for tree=parent anchor=children,
for descendants=
child anchor=parent,
if=n_children("!u")==1
!u.calign=child edge,
forked edge,
,
,
Hace el truco.
En este momento, el resultado se ve así:
Esto es mejor, pero sería bueno si pudiéramos alinear al hijo del medio con el padre cuando el padre tiene un número impar de hijos. Por ejemplo, si D
El borde de se alineó con la línea trazada desde el nodo raíz.
Esto es un poco más complicado, pero no tanto. Podemos usar el calign=child edge
truco de nuevo y configurar el hijo del medio para que sea el hijo "principal" de su padre.
Podemos agregar esto al preámbulo al comienzo de nuestro forest
medio ambiente:
beginforest
for tree=
...
if=isodd(n_children())
calign primary child/.pgfmath=(n_children()+1)/2,
calign=child edge,
,
,
De hecho, dado que cualquier nodo con exactamente 1 hijo tiene un número impar de hijos, también podemos descartar la redefinición de forked edges
ya que ahora obtendremos una flecha recta de todos modos:
documentclass[tikz,multi,border=10pt]standalone
usepackage[edges]forest
begindocument
beginforest
for tree=
grow=east,
math content,
edge=->,>=latex,
if=isodd(n_children())
calign primary child/.pgfmath=(n_children()+1)/2,
calign=child edge,
,
forked edges
[tau>tau^0
[A_x
Robarle código griego descaradamente a Marco:
beginforest
for tree=
grow'=east,
math content,
edge=->,>=latex,
if=isodd(n_children())
calign primary child/.pgfmath=(n_children()+1)/2,
calign=child edge,
,
forked edges
[tau>tau^0
[tauC_a(T-A_x)
[xi^n=fracxi^02cos left ( a_Aleft (Gamma-A_x-fracsigmaC_a right ) right )]
[xi_s^n=xi_s^n-fracxi_s^nxi_s^n-(xi^0-xi^n)]
[xi_s^n=xi_s^n-fracxi_s^nxi_s^n-(xi^0-xi^n)]
]
]
]
endforest
EDITAR
Su código produce 'huecos' porque [[
produce un nodo vacío y luego un nodo con [
. Para eliminar el nodo vacío, solo diga [
.
documentclassarticle
usepackageforest-1
begindocument
beginforest
for tree=
grow=east,
parent anchor=east,
child anchor=west,
math content,
edge=->, >=latex,
edge path=noexpandpath[forestoptionedge] (!u.parent anchor) -- +(5pt,0pt)
[T>T^0
[T>A_f
[C_a(T-A_f) C_a(T-A_s)
[ zeta^n=zeta^n-1 ]
[ zeta_s^n=zeta_s^n-1 ]
[ zeta_T^n=zeta_T^n-1 ]
]
]
]
[T
Tenga en cuenta que con la versión 1, hacer Necesito especificar el parent anchor=east, child anchor=west
y para cambiar el edge path
. No hay forked edges
. Además, no es fácil eliminar la torcedura cuando solo hay un niño porque calign=child edge
tiene errores en versiones anteriores a la 2.01. Aún puede hacerlo, pero sería mucho más fácil actualizar que solucionar el error. Esto no es un problema si su árbol no solo tiene hijos, pero si tiene otros árboles, podría serlo. Tampoco es fácil alinear los bordes por razones similares. Necesitarías hacer algo con edge path
para que funcione.
Con el paquete actual, por otro lado, su árbol se puede ajustar fácilmente para que se vea así y el código también es más simple:
documentclassarticle
usepackage[edges]forest
begindocument
beginforest
for tree=
grow'=east,
math content,
edge=->,>=latex,
if=isodd(n_children())
calign primary child/.pgfmath=(n_children()+1)/2,
calign=child edge,
,
forked edges
[T>T^0
[T>A_f
[C_a(T-A_f) C_a(T-A_s)
[ zeta^n=zeta^n-1 ]
[ zeta_s^n=zeta_s^n-1 ]
[ zeta_T^n=zeta_T^n-1 ]
]
]
]
[T
Esto no es muy difcil de hacer con forest
. El siguiente ejemplo debería ayudarlo a comenzar.
documentclassarticle
usepackageforest
begindocument
beginforestfor tree=
grow=east
parent anchor=east,
child anchor=west,
math content,
edge path=noexpandpath[forestoptionedge,->, >=latex]
(!u.parent anchor) -- +(5pt,0pt)
[tau>tau^0 [A_x
Considere que este no es el enfoque correcto en absoluto, pero no soy un experto y esta es la única forma que conozco.
documentclass[border=0.5cm]standalone
usepackagetikz
begindocument
begintikzpicture
% draw [help lines] (0,0) grid (13,13);
draw [thick] (0,0) -- (0,10);
draw [thick,-latex] (0,5) -- + (0.5,0) node [right] $AC_a(T-A_x)$;
draw [thick,-latex] (0,10) -- + (0.5,0) node [right] $T
Nos encantaría que puedieras mostrar esta división si te fue útil.