我想使用graphs
TikZ 中的库和graphdrawing
算法来创建一个具有许多节点的图以及我将稍后创建和标记的连接。
我有一个更复杂的版本:
\tikz [nodes={fill=white, font=\footnotesize},
>={Stealth[round,sep]}]
\graph[layered layout, branch down sep, nodes=draw, edges=rounded corners]
{
"cat" -- "dog" -- {"cow", "goat", "sheep"};
"cow" -- "bull";
"dog" -- "rooster" -- "duck";
};
我想要做的是列出节点预先,并将它们标记为例如 a、b、c。然后我想在创建链时使用参考标签。
我之所以要这样做是因为每个节点的实际文本比“cat”长很多,并且我想避免每次想要建立新连接时都输入“supercalifragalistic”的混乱。
理想情况下我会有这样的事情:
\begin{tikzpicture}
\tikz [nodes={fill=white, font=\footnotesize},
>={Stealth[round,sep]}]
\node (a) {cat};
\node (b) {dog};
\node (c) {cow};
\node (d) {goat};
\node (e) {sheep};
\node (f) {bull};
\node (g) {rooster};
\node (i) {duck};
\graph[use existing nodes = true, layered layout, branch down sep, nodes=draw, edges=rounded corners]
{
"cat" -- "dog" -- {"cow", "goat", "sheep"};
"cow" -- "bull";
"dog" -- "rooster" -- "duck";
(a) -- (b) -- { (c), (d), (e)};
(c) -- (f);
(b) -- (g) -- (i);
};
\end{tikzpicture}
但是我使用这种方法时遇到了错误,包括attempting to create edge between nodes that are not in the graph
。
这可能吗?我看到了一种略有不同的方法,但确实有效,如下所示:
\begin{tikzpicture}[new set=import nodes]
\begin{scope}[nodes={set=import nodes}] % make all nodes part of this set
\node [red] (a) at (0,1) {$a$};
\node [red] (b) at (1,1) {$b$};
\node [red] (d) at (2,1) {$d$};
\end{scope}
\graph{
(import nodes);
% "import" the nodes
a -> b -> c -> d -> e;
};
\end{tikzpicture}
但是这里没有图形绘制算法(layered layout
),您必须指定节点的位置,这是我想避免的。
答案1
你可以直接声明它们,而不用使用
<node name>/<node text>
句法。
然后<node name>
在实际连接节点时引用它们。
代码
\documentclass[tikz,convert]{standalone}
\usetikzlibrary{arrows.meta,graphs,graphdrawing}
\usegdlibrary{layered}
\begin{document}
\tikz[
nodes={fill=white, font=\footnotesize},
>={Stealth[round,sep]}
]
\graph[
layered layout,
branch down sep,
nodes={draw, text height=height("a"), text depth=+0pt},
edges=rounded corners
] {
a/cat, b/dog, c/cow, d/goat, e/sheep, f/bull, g/rooster, i/duck,
a -- b -- {c, d, e},
c -- f,
b -- g -- i,
};
\end{document}