Многоуровневый график из руководства Tikz

Многоуровневый график из руководства Tikz

Полагаю, у меня есть некоторый опыт работы с vanilla latex (который я использовал для написания нескольких документов), но я делаю первые шаги с tikz. В частности, я пытаюсь воспроизвести диаграмму на странице 363 Руководства для версии 3.0.1a Тилла Тантау. Полагаю, я неправильно настраиваю свою среду. Вот код, который я использую (копия и вставка из книги, поскольку касается части после begin{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";
};

но это приводит меня к ряду ошибок, когда я pdflatex скрипт, в частности этот

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

Однако даже если я уберу бит скрытности, я все равно получу это сообщение об ошибке

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

Согласно тому, что я нашел здесь

Как использовать пакет графических чертежей TikZ с KTikZ+LuaLaTeX?

это вопрос использования \usegdlibrary{layered} в скрипте. В этом случае, однако, pdflatex говорит мне, что мне нужно обратиться к lualatex. Итог: я очень запутался в этом месте. Есть какие-нибудь предложения, чтобы облегчить мне жизнь?

решение1

Библиотека рисования графиков, вероятно, является одной из наиболее сложных частей, и, вдобавок ко всему, эта конкретная диаграмма также является особенно сложной диаграммой.

Просматривая ваш код, я могу выделить несколько проблем:

  • Во-первых, есть довольно много лишних библиотек. Это не вредно, но и не совсем рекомендуется;
  • Алгоритмы рисования графов довольно сложны, и реализовать их в чистом TeX было бы неоправданно сложно (может быть, LaTeX3 будет лучше?), поэтому они реализованы в Lua. В результате вам нужно скомпилировать с LuaLaTeX, чтобы сгенерировать вывод. Вам просто нужно запустить lualatex document.texвместо pdflatex document.tex, или, если вы используете IDE, то должна (надеюсь) быть возможность выбрать lualatexв качестве компилятора;
  • Со стрелкой есть две проблемы spaced stealth:
    • Во-первых, стиль стрелки, похоже, нигде в документации не определен. Есть stealthи соответствующий stealth', но нет spaced stealth, так что я на самом деле не знаю, почему они используют его в документации (правка: похоже, что это устарело и на самом деле должно было быть удалено из документации, см. комментарий от @cfr);
    • Во-вторых, даже если бы он существовал, у вас есть spaced stealth’which отличается от spaced stealth'(обратите внимание на небольшую разницу в апострофе, на самом деле это разные символы юникода). Это ошибка в документации на данный момент, которая 'изменяется в verbatimсреде -like, как если бы это была текстовая среда. В результате копирование-вставка на самом деле не работает должным образом на этом этапе. (У них также была проблема, из-за которой --становилось тире .)
  • У вас есть некоторые новые строки в неправильном месте. Например, предпоследняя строка имеет "System\nV.0". Это (скорее всего) помешает графическому алгоритму, поскольку он будет считать этот узел отличным от вершины "System V.0".

Я бы рекомендовал вам начать с более простого примера. Начните с того, чтобы почувствовать простые макеты, а затем начните создавать все более и более сложные макеты. Например, посмотрите, как изменяются следующие макеты:

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

a -> b -> {c, d}

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

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

и т. д. Также посмотрите, как работают различные алгоритмы с каждым из вышеперечисленных макетов ( layered layout, spring layout, и т. д.)

Возвращаясь к вашему исходному примеру, вот исправленный код, переформатированный для большей удобочитаемости:

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

и вот соответствующий вывод:

введите описание изображения здесь


Примечание: естьнесовместимость между классом standaloneи LuaLaTeX. Пока standaloneкласс не будет обновлен, вам нужно будет добавить \RequirePackage{luatex85}перед объявлением класса документа.

решение2

Дополнение к ответу выше: «Разнесенный стелс» можно импортировать с помощью:

\usetikzlibrary{arrows.spaced}

Связанный контент