我正在尝试在 TikZ 中绘制图形,但使用宏时它无法按预期工作。这是一个最小的例子:
\documentclass{minimal}
\usepackage{tikz}
\usetikzlibrary{graphs}
\usetikzlibrary{graphdrawing}
\usegdlibrary{layered}
\def\myedge#1#2{"#1" -> "#2"}
\begin{document}
% this works as expected
\begin{tikzpicture}
\graph[nodes={draw, circle}, layered layout, sibling distance=8mm, level distance=8mm] {
"a" -> "b";
"a" -> "c";
"b" -> "d";
"b" -> "e";
};
\end{tikzpicture}
% this doesn't work as expected
\begin{tikzpicture}
\graph[nodes={draw, circle}, layered layout, sibling distance=8mm, level distance=8mm] {
\myedge{a}{b};
\myedge{a}{c};
\myedge{b}{d};
\myedge{b}{e};
};
\end{tikzpicture}
\end{document}
在第二张图片中,我得到 0 条边和 4 个节点:"a" -> "b"
,,,,,"a" -> "c"
而"b" -> "d"
不是"b" -> "e"
5 个节点和 4 条边。
我怎样才能让它工作?
我实际上正在尝试以编程方式绘制图形(详细背景),因此\myedge
宏将被更复杂的东西取代。我曾考虑直接使用 PGF 而不是使用 TikZ,但我在 pgf 手册中找不到任何相关示例。事实上,如果不是太难的话,我更喜欢基于 PGF 的解决方案。
编辑:根据我对这个问题得到的答案,我想我应该更清楚地说明我正在尝试做什么。
有一个文件graph.tex
看起来像这样:
\myedge{a}{b}
\myedge{a}{c}
\myedge{b}{d}
\myedge{b}{e}
该文件由程序自动生成,我不想反复弄乱该程序的源代码,因此假设它graph.tex
已修复。
我想\input graph.tex
将 变成main.tex
,并且我想控制 中边的格式main.tex
。例如,如果我想将节点标签从a
、b
、c
等更改为Client a
、Client b
、 等或Theorem \ref{a}
、Theorem \ref{b}
等,那么我应该能够main.tex
通过更改 的定义从内部进行更改\myedge
。
这基本上就是关注点分离:生成程序graph.tex
不需要知道节点标签到底是什么。它只应该知道哪些实体链接到哪些其他实体。关于节点标签到底是什么的信息应该属于main.tex
。
答案1
我不会为 TikZ 烦恼graph
,graphdrawing
使用forest
包更简单(至少对我来说)实现你的目标,解决方案适用于 pdfLaTeX、XeLaTeX 以及 LuaLateX 引擎。代码也更短:
\documentclass[margin=3.14159 mm]{standalone}
\usepackage{forest}
\forestset{
myedge/.style={%
for tree = {circle, draw, minimum size=1.1em, inner sep=0pt,
l sep=8mm, s sep=8mm}
}
}
\begin{document}
\begin{forest} myedge
[a [c]
[b [d] [e]]
]
\end{forest}
\end{document}
答案2
也许是这样的——直接来自书上
\documentclass{minimal}
\usepackage{tikz}
\usetikzlibrary {graphs,quotes}
\usetikzlibrary {graphs,shapes.geometric}
\begin{document}
%\begin{tikzpicture}
\tikz
\graph [
grow down, branch right, nodes={circle,draw,minimum size=2em}] {
"" -> h [] -> {
c [] -> {
a [],
e []
},
j []
}
};
\tikz [new set=my nodes] {
\node [set=my nodes, circle, draw] at (1,1) {A};
\node [set=my nodes, circle, draw] at (1.5,0) {B};
\node [set=my nodes, circle, draw] at (1,-1) {C};
\node (d) [circle, draw] at (3,0) {D};
\graph { X [circle,draw]-> (my nodes) -> (d) };
}
\tikz \graph [simple,nodes={circle,draw}] {
% The larger tree, no special options in force
a -> {
b -> {c,d},
e -> {f,g},
h
},
{ [edges=red] % Now highlight a part of the tree
a -> e -> {f,g}
}
};
%\end{tikzpicture}
\end{document}