![Tikz 매뉴얼의 계층형 그래프](https://rvso.com/image/327796/Tikz%20%EB%A7%A4%EB%89%B4%EC%96%BC%EC%9D%98%20%EA%B3%84%EC%B8%B5%ED%98%95%20%EA%B7%B8%EB%9E%98%ED%94%84.png)
나는 바닐라 라텍스(여러 문서를 작성하는 데 사용했던)에 대해 꽤 많은 경험이 있다고 생각하지만 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}