Gráfico en capas del manual de Tikz

Gráfico en capas del manual de Tikz

Supongo que tengo bastante experiencia con el látex de vainilla (que he usado para escribir varios documentos), pero estoy dando mis primeros pasos con tikz. En particular, estoy intentando reproducir el diagrama de la página 363 del Manual para la versión 3.0.1a de Till Tantau. Supongo que no estoy configurando mi entorno correctamente. Aquí está el código que estoy usando (una copia y pega del libro en lo que respecta a la parte después de comenzar {documento})

 \documentclass{article} % say
 \usepackage{tikz}
 \usetikzlibrary{arrows.meta}
 \usetikzlibrary{angles}
 \usetikzlibrary{trees}
 \usetikzlibrary{arrows,decorations.pathmorphing,
 backgrounds,positioning,fit,petri}
 \usetikzlibrary{graphs}
 \usetikzlibrary{bending}
 \usetikzlibrary{automata}
 % \usetikzlibrary{graphdrawing,graphs} 
 % \usegdlibrary{layered}
 \usetikzlibrary{shapes.multipart}
 \begin{document}

\tikz [nodes={text height=.7em, text depth=.2em,
draw=black!20, thick, fill=white, font=\footnotesize},
>=spaced stealth’, rounded corners, semithick]
\graph [layered layout, level distance=1cm, sibling
sep=.5em,sibling    distance=1cm] {
"5th Edition" -> { "6th Edition", "PWB 1.0" };
"6th Edition" -> { "LSX" [>child anchor=45], "1 BSD", "Mini Unix",   
"Wollongong", "Interdata" };
"Interdata" -> { "Unix/TS 3.0", "PWB 2.0", "7th Edition" };
"7th Edition" -> { "8th Edition", "32V", "V7M", "Ultrix-11",
"Xenix",    "UniPlus+" };
"V7M" -> "Ultrix-11";
"8th Edition" -> "9th Edition";
"1 BSD" -> "2 BSD" -> "2.8 BSD" -> { "Ultrix-11", "2.9 BSD" };
"32V" -> "3 BSD" -> "4 BSD" -> "4.1 BSD" -> { "4.2 BSD", "2.8 BSD", 
"8th Edition" };
"4.2 BSD" -> { "4.3 BSD", "Ultrix-32" };
"PWB 1.0" -> { "PWB 1.2" -> "PWB 2.0", "USG 1.0" -> { "CB Unix 1",  
"USG 2.0" }};
"CB Unix 1" -> "CB Unix 2" -> "CB Unix 3" -> { "Unix/TS++", "PDP-11 
Sys V" };
{ "USG 2.0" -> "USG 3.0", "PWB 2.0", "Unix/TS 1.0" } -> "Unix/TS 3.0";
{ "Unix/TS++", "CB Unix 3", "Unix/TS 3.0" } -> "TS 4.0" -> "System  
V.0" -> "System V.2" -> "System V.3";
};

pero esto me lleva a una serie de errores cuando hago el script en pdflatex, en particular este

    ! Package pgf Error: Unknown arrow tip kind 'spaced stealth’'.

Sin embargo, incluso si elimino el bit oculto, sigo recibiendo este mensaje de error.

  ! Package pgfkeys Error: I do not know the key '/tikz/graphs  
  /layered layout' and I am going to ignore it. Perhaps you  
  misspelled it.

Según lo que encontré aquí

¿Cómo uso el paquete de dibujo gráfico TikZ con KTikZ+LuaLaTeX?

es cuestión de usar \usegdlibrary{layered} en el script. Sin embargo, en ese caso, pdflatex me dice que necesito recurrir a lualatex. En pocas palabras: estoy muy confundido en este punto. ¿Alguna sugerencia para hacerme la vida más fácil?

Respuesta1

La biblioteca de dibujo de gráficos es probablemente una de las partes más complejas y, además, este diagrama en particular también es un diagrama particularmente complejo.

Al revisar su código, hay algunos problemas que puedo identificar:

  • En primer lugar, existen bastantes bibliotecas superfluas. Esto no es perjudicial, pero tampoco es exactamente recomendable;
  • Los algoritmos de dibujo de gráficos son bastante complejos e implementarlos en TeX puro sería innecesariamente difícil (¿tal vez LaTeX3 podría ser mejor?), Por lo que se implementan en Lua. Como resultado, necesitas compilar con LuaLaTeX para generar el resultado. Sólo necesita ejecutar lualatex document.texen lugar de pdflatex document.tex, o si está utilizando un IDE, entonces (con suerte) debería haber una opción para seleccionar lualatexcomo compilador;
  • Hay dos problemas con spaced stealthla flecha:
    • En primer lugar, el estilo de la flecha no parece estar definido en ninguna parte de la documentación. Existe stealthy el correspondiente stealth', pero no, spaced stealthasí que en realidad no sé por qué lo usan en la documentación (editar: parece que esto ha quedado obsoleto y en realidad debería haberse eliminado de la documentación, consulte el comentario de @cfr);
    • En segundo lugar, incluso si existiera, tiene spaced stealth’cuál es diferente spaced stealth'(observe la ligera diferencia en el apóstrofe, en realidad son caracteres Unicode distintos). Este es un error en la documentación en este momento por el cual 'se modifica dentro del verbatimentorno similar a como si fuera un entorno de texto. Como resultado, copiar y pegar no funciona correctamente en esta etapa. (También tuvieron un problema por el cual --se convertía en un tablero ).
  • Tienes ciertas nuevas líneas en el lugar equivocado. Por ejemplo, la penúltima línea tiene "System\nV.0". Esto (muy probablemente) interferirá con el algoritmo gráfico, ya que tratará ese nodo como si fuera distinto del "System V.0"vértice.

Le recomendaría que comience con un ejemplo más simple. Comience por tener una idea de los diseños simples y luego comience a crear diseños cada vez más complejos. Por ejemplo, observe cómo cambian los siguientes diseños:

a -> b -> c,
b -> d,

a -> b -> {c, d}

a -> b -> {c -> x, d}

{a, b} -> {c -> x, d}

etcétera. También eche un vistazo a cómo funcionan los diferentes algoritmos con cada uno de los diseños anteriores ( layered layout, spring layoutetc.)

Volviendo a su ejemplo original, aquí está el código arreglado y reformateado para hacerlo más legible:

\documentclass[tikz]{standalone}
\usepackage{tikz}
\usetikzlibrary{arrows}
\usetikzlibrary{graphs}
\usetikzlibrary{graphdrawing}
\usegdlibrary{layered}

\begin{document}
\tikz [
    nodes={
      text height=.7em,
      text depth=.2em,
      draw=black!20,
      thick, 
      fill=white, 
      font=\footnotesize
    },
    >=stealth',
    rounded corners,
    semithick
  ] 
  \graph [
    layered layout,
    level distance=1cm,
    sibling sep=.5em,
    sibling distance=1cm
  ] {
    "5th Edition" -> {"6th Edition", "PWB 1.0" };
    "6th Edition" -> { 
      "LSX" [>child anchor=45], 
      "1 BSD", 
      "Mini Unix",   
      "Wollongong", 
      "Interdata" };
    "Interdata" -> { 
      "Unix/TS 3.0", 
      "PWB 2.0", 
      "7th Edition" };
    "7th Edition" -> { 
      "8th Edition", 
      "32V", 
      "V7M", 
      "Ultrix-11",
      "Xenix",    
      "UniPlus+" };
    "V7M" -> "Ultrix-11";
    "8th Edition" -> "9th Edition";
    "1 BSD" -> "2 BSD" 
            -> "2.8 BSD" 
            -> { "Ultrix-11", "2.9 BSD" };
    "32V" -> "3 BSD" 
          -> "4 BSD" 
          -> "4.1 BSD" 
          -> { "4.2 BSD", "2.8 BSD", "8th Edition" };
    "4.2 BSD" -> { "4.3 BSD", "Ultrix-32" };
    "PWB 1.0" -> { 
      "PWB 1.2" -> "PWB 2.0", 
      "USG 1.0" -> { 
        "CB Unix 1", 
        "USG 2.0" }};
    "CB Unix 1" -> "CB Unix 2" 
                -> "CB Unix 3" 
                -> { "Unix/TS++", "PDP-11 Sys V" };
    { 
      "USG 2.0" -> "USG 3.0",
      "PWB 2.0",
      "Unix/TS 1.0"
    } -> "Unix/TS 3.0";
    { 
      "Unix/TS++", 
      "CB Unix 3", 
      "Unix/TS 3.0" 
    } -> "TS 4.0" 
      -> "System  
    V.0" -> "System V.2" 
         -> "System V.3";
};
\end{document}

y aquí está el resultado correspondiente:

ingrese la descripción de la imagen aquí


Nota: Hay unincompatibilidad entre en elstandalone clase y LuaLaTeX. Hasta que se actualice la standaloneclase, deberá agregarla \RequirePackage{luatex85}antes de la declaración de clase del documento.

Respuesta2

Una adición a la respuesta anterior: el sigilo espaciado se puede importar usando:

\usetikzlibrary{arrows.spaced}

información relacionada