Tikz マニュアルの階層化グラフ

Tikz マニュアルの階層化グラフ

私はバニラ ラテックス (いくつかの文書を書くのに使用しました) についてはかなりの経験があると思いますが、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.

ここで見つけたものによると

KTikZ+LuaLaTeX で TikZ グラフ描画パッケージを使用するにはどうすればよいですか?

それはスクリプトで \usegdlibrary{layered} を使用するかどうかの問題です。ただし、その場合、pdflatex は lualatex に頼る必要があると伝えます。結論: この時点で私は非常に混乱しています。私の生活を楽にするための提案はありますか?

答え1

グラフ描画ライブラリはおそらく最も複雑な部分の 1 つであり、さらにこの特定の図も特に複雑な図です。

コードを調べてみると、いくつか問題が見つかりました:

  • まず、余分なライブラリがかなりあります。これは有害ではありませんが、必ずしも推奨されるものでもありません。
  • グラフ描画アルゴリズムは非常に複雑で、純粋な TeX で実装するのは不必要に難しいため (LaTeX3 の方が良いかもしれません)、Lua で実装されています。そのため、出力を生成するには LuaLaTeX でコンパイルする必要があります。lualatex document.texの代わりにを実行するだけです。IDE を使用している場合は、コンパイラとしてpdflatex document.tex選択するオプションがあるはずです (そうであることを願います) 。lualatex
  • arrowには 2 つの問題がありますspaced stealth
    • まず、矢印のスタイルはドキュメントのどこにも定義されていないようです。stealthと対応する はありますstealth'が、ないのでspaced stealth、ドキュメントでなぜそれが使用されているのかわかりません (編集: これは非推奨になっているようで、実際にはドキュメントから削除されているはずです。@cfr のコメントを参照してください)。
    • 第二に、たとえ存在したとしても、 は とspaced stealth’は異なりますspaced stealth'(アポストロフィのわずかな違いに注意してください。これらは実際には異なる Unicode 文字です)。これは、現時点でのドキュメントのバグであり、 は-like 環境'内でテキスト環境であるかのように変更されます。その結果、この段階ではコピー アンド ペーストは実際には正しく機能しません。( がエンダッシュ になるverbatimという問題もありました。)--
  • 特定の改行が間違った場所にあります。たとえば、最後から 2 番目の行には があります"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

上記の回答への追加: 'spaced stealth' は、以下を使用してインポートできます。

\usetikzlibrary{arrows.spaced}

関連情報