Gráfico em camadas do manual Tikz

Gráfico em camadas do manual Tikz

Suponho que tenho alguma experiência com látex baunilha (que usei para escrever vários documentos), mas estou dando meus primeiros passos com o tikz. Em particular, estou tentando reproduzir o diagrama da página 363 do Manual da versão 3.0.1a de Till Tantau. Suponho que não estou configurando meu ambiente corretamente. Aqui está o código que estou usando (copie e cole do livro no que diz respeito à parte após o início {document})

 \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";
};

mas isso me leva a uma série de erros quando pdflatex o script, em particular este

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

No entanto, mesmo se eu remover o bit furtivo, ainda recebo esta mensagem de erro

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

De acordo com o que encontrei aqui

Como faço para usar o pacote de desenho gráfico TikZ com KTikZ + LuaLaTeX?

é uma questão de usar \usegdlibrary{layered} no script. Nesse caso, porém, o pdflatex me diz que preciso recorrer ao lualatex. Resumindo: estou muito confuso neste momento. Alguma sugestão para facilitar minha vida?

Responder1

A biblioteca de desenho gráfico é provavelmente uma das partes mais complexas e, além disso, este diagrama específico também é um diagrama particularmente complexo.

Olhando seu código, posso identificar alguns problemas:

  • Em primeiro lugar, existem algumas bibliotecas supérfluas. Isto não é prejudicial, mas também não é exatamente recomendado;
  • Os algoritmos de desenho de gráficos são bastante complexos, e implementá-los em TeX puro seria desnecessariamente difícil (talvez LaTeX3 fosse melhor?), então eles são implementados em Lua. Como resultado, você precisa compilar com LuaLaTeX para gerar a saída. Você só precisa executar lualatex document.texem vez de pdflatex document.tex, ou se estiver usando um IDE, deverá (espero) haver uma opção para selecionar lualatexcomo compilador;
  • Existem dois problemas com spaced stealtha seta:
    • Em primeiro lugar, o estilo da seta não parece estar definido em nenhum lugar da documentação. Existe stealthe o correspondente stealth', mas não, spaced stealthna verdade não sei por que eles o usam na documentação (editar: parece que isso foi obsoleto e deveria ter sido removido da documentação, veja o comentário de @cfr);
    • Em segundo lugar, mesmo que existisse, você tem spaced stealth’qual é diferente spaced stealth'(observe a ligeira diferença no apóstrofo, na verdade são caracteres Unicode distintos). Este é um bug na documentação no momento em que 'é modificado dentro do verbatimambiente -like como se fosse um ambiente de texto. Como resultado, copiar e colar não funciona corretamente neste estágio. (Eles também tiveram um problema que --se tornaria um travessão .)
  • Você tem certas novas linhas no lugar errado. Por exemplo, a penúltima linha tem "System\nV.0". Isso (provavelmente) interferirá no algoritmo gráfico, pois tratará esse nó como sendo distinto do "System V.0"vértice.

Eu recomendaria que você começasse com um exemplo mais simples. Comece sentindo os layouts simples e depois comece a construir layouts cada vez mais complexos. Por exemplo, dê uma olhada em como os seguintes layouts mudam:

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

a -> b -> {c, d}

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

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

e assim por diante. Veja também como diferentes algoritmos funcionam com cada um dos layouts acima ( layered layout, spring layout, etc.)

Voltando ao seu exemplo original, aqui está o código corrigido e reformatado para torná-lo mais legível:

\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}

e aqui está a saída correspondente:

insira a descrição da imagem aqui


Nota: existe umincompatibilidade entre na standaloneclasse e LuaLaTeX. Até que a standaloneclasse seja atualizada, você precisará adicionar \RequirePackage{luatex85}antes da declaração da classe do documento.

Responder2

Uma adição à resposta acima: O stealth espaçado pode ser importado usando:

\usetikzlibrary{arrows.spaced}

informação relacionada