Tikz 手册中的分层图

Tikz 手册中的分层图

我想我在 vanilla latex 方面有相当多的经验(我曾用它写过几篇文档),但我刚刚开始使用 tikz。特别是,我试图重现 Till Tantau 编写的版本 3.0.1a 手册第 363 页上的图表。我想我没有正确设置我的环境。这是我使用的代码(就 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’不同于spaced stealth'(请注意撇号的细微差别,它们实际上是不同的 unicode 字符)。这是文档中的一个错误,在 -like 环境'中被修改,verbatim就好像它是一个文本环境一样。因此,复制粘贴在这个阶段实际上无法正常工作。(他们也有一个问题,即--变成一个短划线。)
  • 某些换行符的位置不对。例如,倒数第二行有"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 layoutspring 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}

相关内容