Saltar al contenido

Escribir árboles en LaTeX

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:

flecha rizada

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:

menos pervertido

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:

flecha sin doblar

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í:

árbol interino

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 DEl 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:

árbol final

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

mas arbol

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

menos lagunas

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:

árbol alineado

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

salida de código

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

ingrese la descripción de la imagen aquí

Nos encantaría que puedieras mostrar esta división si te fue útil.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Respuestas a preguntas comunes sobre programacion y tecnología