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

그래프 그리기 라이브러리는 아마도 가장 복잡한 부분 중 하나일 것이며, 게다가 이 특정 다이어그램은 특히 복잡한 다이어그램이기도 합니다.

귀하의 코드를 살펴보면 다음과 같은 몇 가지 문제를 확인할 수 있습니다.

  • 첫째, 불필요한 라이브러리가 꽤 많습니다. 이는 해롭지는 않지만 정확하게 권장되는 것도 아닙니다.
  • 그래프 그리기 알고리즘은 매우 복잡하고 이를 순수 TeX에서 구현하는 것은 불필요하게 어려울 수 있으므로(LaTeX3이 더 좋을 수도 있습니다.) Lua에서 구현됩니다. 결과적으로 출력을 생성하려면 LuaLaTeX로 컴파일해야 합니다. lualatex document.tex대신 실행하면 됩니다 . 또는 IDE를 사용하는 경우 컴파일러로 pdflatex document.tex선택할 수 있는 옵션이 있어야 합니다 .lualatex
  • 화살표 에는 두 가지 문제가 있습니다 spaced stealth.
    • 첫째, 화살표 스타일은 문서 어디에도 정의되어 있지 않은 것 같습니다. stealth및 해당 항목이 있지만 실제로는 왜 문서에서 이를 사용하는지 stealth'모르겠습니다 spaced stealth(편집: 이 항목은 더 이상 사용되지 않으며 문서에서 실제로 제거되어야 하는 것으로 보입니다. @cfr의 주석 참조).
    • 둘째, 존재하더라도 다음 spaced stealth’과 다른 점이 있습니다 spaced stealth'(아포스트로피의 약간의 차이에 주목하세요. 실제로는 별개의 유니코드 문자입니다). 이것은 마치 텍스트 환경인 것처럼 -like 환경 '내에서 수정되는 현재 문서의 버그입니다 . verbatim결과적으로 이 단계에서는 복사-붙여넣기가 실제로 제대로 작동하지 않습니다. (또한 --en-dash가 되는 문제도 있었습니다 .)
  • 잘못된 위치에 특정 개행 문자가 있습니다. 예를 들어 마지막 두 번째 줄에는 "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}

관련 정보