Ebenendiagramm aus dem Tikz-Handbuch

Ebenendiagramm aus dem Tikz-Handbuch

Ich schätze, ich habe ziemlich viel Erfahrung mit Vanilla Latex (das ich zum Schreiben mehrerer Dokumente verwendet habe), aber ich mache meine ersten Babyschritte mit Tikz. Insbesondere versuche ich, das Diagramm auf Seite 363 des Handbuchs für Version 3.0.1a von Till Tantau zu reproduzieren. Ich schätze, ich richte meine Umgebung nicht richtig ein. Hier ist der Code, den ich verwende (ein Kopieren und Einfügen aus dem Buch, soweit es den Teil nach begin{document} betrifft)

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

aber das führt bei mir zu einer Reihe von Fehlern, wenn ich das Skript pdflatex, insbesondere diesen

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

Aber auch wenn ich das Stealth-Bit entferne, erhalte ich immer noch diese Fehlermeldung

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

Nach dem, was ich hier gefunden habe

Wie verwende ich das TikZ-Graphzeichnungspaket mit KTikZ+LuaLaTeX?

es geht darum, \usegdlibrary{layered} im Skript zu verwenden. In diesem Fall sagt mir pdflatex jedoch, dass ich auf lualatex zurückgreifen muss. Fazit: Ich bin an diesem Punkt sehr verwirrt. Irgendwelche Vorschläge, um mir das Leben leichter zu machen?

Antwort1

Die Bibliothek zum Zeichnen von Diagrammen ist wahrscheinlich einer der komplexeren Teile, und außerdem ist dieses spezielle Diagramm auch ein besonders komplexes Diagramm.

Beim Durchsehen Ihres Codes sind mir einige Probleme aufgefallen:

  • Erstens gibt es eine ganze Reihe überflüssiger Bibliotheken. Das ist zwar nicht schädlich, aber auch nicht unbedingt empfehlenswert;
  • Die Algorithmen zum Zeichnen von Graphen sind recht komplex und ihre Implementierung in reinem TeX wäre unnötig schwierig (vielleicht wäre LaTeX3 besser?), daher werden sie in Lua implementiert. Daher müssen Sie mit LuaLaTeX kompilieren, um die Ausgabe zu generieren. Sie müssen nur lualatex document.texanstelle von ausführen, oder wenn Sie eine IDE verwenden, sollte es (hoffentlich) eine Option geben, die Sie als Compiler pdflatex document.texauswählen können ;lualatex
  • Es gibt zwei Probleme mit spaced stealthArrow:
    • Erstens scheint der Pfeilstil nirgends in der Dokumentation definiert zu sein. Es gibt ihn stealthund das entsprechende stealth', aber nein spaced stealth, also weiß ich eigentlich nicht, warum sie ihn in der Dokumentation verwenden (Bearbeiten: es scheint, dass dies veraltet ist und eigentlich aus der Dokumentation hätte entfernt werden sollen, siehe Kommentar von @cfr);
    • Zweitens, selbst wenn es existierte, hätten Sie spaced stealth’„which is different to“ spaced stealth'(beachten Sie den kleinen Unterschied beim Apostroph, es handelt sich tatsächlich um unterschiedliche Unicode-Zeichen). Dies ist derzeit ein Fehler in der Dokumentation, wobei „which“ 'innerhalb der -ähnlichen Umgebung geändert wird, verbatimals wäre es eine Textumgebung. Infolgedessen funktioniert das Kopieren und Einfügen derzeit nicht richtig. (Sie hatten auch ein Problem, „which“ --würde zu einem Halbgeviertstrich werden .)
  • Sie haben bestimmte Zeilenumbrüche an der falschen Stelle. Die vorletzte Zeile hat beispielsweise "System\nV.0". Dies wird (höchstwahrscheinlich) den Grafikalgorithmus beeinträchtigen, da dieser diesen Knoten als vom "System V.0"Scheitelpunkt verschieden behandelt.

Ich würde empfehlen, mit einem einfacheren Beispiel zu beginnen. Machen Sie sich zunächst mit einfachen Layouts vertraut und beginnen Sie dann, immer komplexere Layouts zu erstellen. Sehen Sie sich beispielsweise an, wie sich die folgenden Layouts ändern:

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

a -> b -> {c, d}

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

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

und so weiter. Sehen Sie sich auch an, wie verschiedene Algorithmen mit jedem der oben genannten Layouts funktionieren ( layered layout, spring layout, usw.)

Um auf Ihr ursprüngliches Beispiel zurückzukommen. Hier ist der korrigierte und zur besseren Lesbarkeit neu formatierte Code:

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

und hier ist die entsprechende Ausgabe:

Bildbeschreibung hier eingeben


Hinweis: Es gibt eineInkompatibilität zwischen der standaloneKlasse und LuaLaTeX. Bis die standaloneKlasse aktualisiert wird, müssen Sie \RequirePackage{luatex85}vor der Dokumentklassendeklaration Folgendes hinzufügen.

Antwort2

Eine Ergänzung zur obigen Antwort: Die Spaced Stealth-Funktion kann importiert werden mit:

\usetikzlibrary{arrows.spaced}

verwandte Informationen