![Tikz 手册中的分层图](https://linux22.com/image/327796/Tikz%20%E6%89%8B%E5%86%8C%E4%B8%AD%E7%9A%84%E5%88%86%E5%B1%82%E5%9B%BE.png)
我想我在 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 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}