Saltar al contenido

Escribe un árbol simple en LaTeX

Hola, descubrimos la solución a tu pregunta, deslízate y la obtendrás aquí.

Solución:

Estos árboles se pueden dibujar convenientemente con el grow cyclic opción. Este ejemplo es muy parecido al del manual pgf v3.1.5 en la p. 845

ingrese la descripción de la imagen aquí

documentclass[tikz,border=3mm]standalone
usetikzlibrarytrees
begindocument
begintikzpicture[grow cyclic,nodes=circle,fill,inner sep=1.5pt,
level 1/.style=level distance=2.5cm,sibling angle=-360/5,
level 2/.style=font=footnotesize, level distance=2cm,sibling angle=40,
rotate=-360/20,semithick]

node  % root
child foreach X in 1,...,5
node[label=540/5-X*360/5:X] 
      child  node[label=180+360/20-X*360/5-20:$b_X$]  
      child  node[label=180+360/20-X*360/5+20:$a_X$]  
  ;
endtikzpicture
enddocument

ingrese la descripción de la imagen aquí

Se puede hacer algo más versátil utilizando los ángulos hermanos reales en el cálculo del ancla de la etiqueta. Se almacena en pgfkeysvalueof/tikz/sibling angle y difiere de un nivel a otro. (No, no estoy orgulloso del xdef pero de esa manera el usuario solo tiene que ajustar el ángulo una vez).

documentclass[tikz,border=3mm]standalone
usetikzlibrarytrees
begindocument
begintikzpicture[grow cyclic,nodes=circle,fill,inner sep=1.5pt,
level 1/.style=level distance=2.5cm,sibling angle=-360/5,
level 2/.style=font=footnotesize, level distance=2cm,sibling angle=60,
rotate=-360/20,semithick]

node[label=above:$0$]  % root
child foreach X in 1,...,5
node[label=-1.5*pgfkeysvalueof/tikz/sibling angle+pgfkeysvalueof/tikz/sibling angle*X:X]xdefLevelOneSiblingAnglepgfkeysvalueof/tikz/sibling angle 
      child  node[label=180-LevelOneSiblingAngle/5+X*LevelOneSiblingAngle-pgfkeysvalueof/tikz/sibling angle/2:$b_X$]  
      child  node[label=180-LevelOneSiblingAngle/5+X*LevelOneSiblingAngle+pgfkeysvalueof/tikz/sibling angle/2:$a_X$]  
  ;
endtikzpicture
enddocument

ingrese la descripción de la imagen aquí

También se puede piratear el growth function para registrar el ángulo de rotación actual para que la colocación de los ángulos sea más conveniente. La idea de piratear la función de crecimiento no es para nada nueva, se pueden ver ejemplos muy buenos, por ejemplo, aquí, pero tal vez este truco sí lo sea. La pendiente del borde actual ahora está disponible en una función currangle. Decidí no incluir la rotación general, que está establecida por rotate, porque creo que es más limpio de esta manera. Es concebible que este truco también sea útil para mindmaps.

documentclass[tikz,border=3mm]standalone
usetikzlibrarytrees
makeatletter
def[email protected]@[email protected]%
  pgfmathsetmacrocurrentrotation(pgfkeysvalueof/tikz/sibling angle)*(-.5-.5*tikznumberofchildren+tikznumberofcurrentchild)%
  pgftransformrotatecurrentrotation%
  expandafterxdefcsname [email protected]@[email protected]@romannumeraltikztreelevelendcsnamecurrentrotation%
  pgftransformxshiftthetikzleveldistance%
%
pgfmathdeclarefunctioncurrangle0begingroup
pgfmathparse(pgfkeysvalueof/tikz/sibling angle)*(-.5-.5*tikznumberofchildren+tikznumberofcurrentchild)%
ifcasetikztreelevel
or
or
pgfmathparsepgfmathresult+[email protected]@[email protected]@i%
or
pgfmathparsepgfmathresult+[email protected]@[email protected]@i+[email protected]@[email protected]@ii%
fi
typeoutthetikznumberofcurrentchild:pgfmathresult%
pgfmathsmugglepgfmathresult
endgroup
tikzset
  recorded grow cyclic/.style=
    edge from parent/.append style=reset cm,
    growth function=[email protected]@[email protected],
  
%
tikzoptionrecorded clockwise fromlet[email protected]=[email protected]@[email protected]@[email protected]def[email protected]@[email protected]@start#1%
makeatother
begindocument
begintikzpicture[recorded grow cyclic,nodes=circle,fill,inner sep=1.5pt,
level 1/.style=level distance=2.5cm,sibling angle=-360/5,
level 2/.style=font=footnotesize, level distance=2cm,sibling angle=60,
semithick,rotate=-360/20]

node[label=above:$0$]  % root
child foreach X in 1,...,5
node[label=currangle-90-360/20:X] 
      child  node[label=currangle-360/20:$b_X$]  
      child  node[label=currangle-360/20:$a_X$]  
  ;
endtikzpicture
enddocument

ingrese la descripción de la imagen aquí

He aquí una forma de hacerlo.

documentclassarticle
usepackagetikz
usetikzlibraryarrows, positioning

begindocument

begintikzpicture[every node/.style=shape=circle,fill=black,circle,inner sep=1pt]
    node[label=above:$0$] (T0) 
        child [grow=126] node[label=above right:$1$] (T1) 
            child node[label=above:$b_1$] (Tb1) 
            child node[label=left:$a_1$] (Ta1)  
        child [grow= 54] node[label=above left:$2$] (T2) 
            child node[label=right:$b_2$] (Tb2) 
            child node[label=above:$a_2$] (Ta2)  
        child [grow=344] node[label=above:$3$] (T3) 
            child node[label=right:$a_3$] (Ta3) 
            child node[label=right:$b_3$] (Tb3)  
        child [grow=270] node[label=right:$4$] (T4) 
            child node[label=left:$a_4$] (Ta4) 
            child node[label=right:$b_4$] (Tb4)  
        child [grow=198] node[label=above:$5$] (T5) 
            child node[label=left:$a_5$] (Ta5) 
            child node[label=left:$b_5$] (Tb5)  ;
endtikzpicture

enddocument

Comentarios y calificaciones

Nos puedes añadir valor a nuestro contenido informacional añadiendo tu experiencia en las críticas.

¡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 *