我正在和 Ti 合作钾Z 并且基本上正在绘制一棵树,但我的需求要求节点在坐标空间中的位置精确且大小精确。为此,我发现使用命令\draw
可以让我进行最精细的控制。但是,我希望每个节点都沿着源自其父节点的边缘进行标记(或者,对于根节点,只是右侧的一个标签)。
从这里的一些其他有用的答案中,我得到了以下 MWE,它非常接近我想要的:
\documentclass[letterpaper]{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{decorations.markings}
\begin{document}
\begin{tikzpicture}[x=10mm,y=10mm,
name/.style={%
postaction={ decorate,transform shape,
decoration={ markings, mark=at position 1.0 with \node #1;}}}]
% Set styles for tree nodes
\tikzstyle{gen0} = [circle, minimum width=16pt, fill, inner sep=0pt]
\tikzstyle{gen1} = [circle, minimum width=12pt, fill, inner sep=0pt]
% ==============================
\draw[black!50] (0,0) grid (8,8);
\draw[name={[right]{nodeA}}] (3,8) node[gen0]{};
\draw[name={[above left]{nodeB}}] (3,8) -- (0,4) node[gen1]{};
\draw[name={[above left]{nodeC}}] (3,8) -- (7,2) node[gen1]{};
% ==============================
\end{tikzpicture}
\end{document}
实际输出如下所示:
我的目标是得到类似我在 Photoshop 中制作的模型:
具体来说,我希望标签与边缘每个节点的,而不是来自中心,这样它们就不会被遮盖住。我还想能够选择标签出现在路径的哪一侧,这样它们就不会颠倒过来。
此外,如果有更好的方法可以更普遍地使用\node
和\path
命令而不是单个\draw
命令来实现这种精确定位的树结构,那将非常有帮助。我的实际用例将有几十个节点,它们分布在几代中,绝对坐标精确到小数点后几位,所以我宁愿不必不断重新列出父节点的坐标来绘制每条边。
答案1
我建议你将圆节点的放置与线条和标签分开。这样做的好处是,TikZ 知道线条从节点的边缘开始,这使得标签放置变得更容易:
\documentclass[letterpaper]{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{decorations.markings}
\begin{document}
\begin{tikzpicture}[x=10mm,y=10mm]
% Set styles for tree nodes
\tikzstyle{gen0} = [circle, minimum width=16pt, fill, inner sep=0pt]
\tikzstyle{gen1} = [circle, minimum width=12pt, fill, inner sep=0pt]
% ==============================
\draw[black!50] (0,0) grid (8,8);
\node [gen0, label=right:nodeA] (A) at (3,8) {};
\node [gen1] (B) at (0,4) {};
\node [gen1] (C) at (7,2) {};
\draw (B) -- (A) node [pos=0, sloped, anchor=south west, inner sep=1pt] {nodeB};
\draw (A) -- (C) node [pos=1, sloped, anchor=south east, inner sep=1pt] {nodeC};
% ==============================
\end{tikzpicture}
\end{document}