我正在使用trees
tikzlibrary
结合一些pgfmath
命令来绘制下面的三元树:
到每个顶点u_i, 一定维是相关的。到目前为止,所有这些维标有v_1,但实际上我希望编号与u_i's,这样v_1毗邻u_1,v_2毗邻u_2, 等等。
代码:
\documentclass{minimal}
\usepackage{tikz}
\usetikzlibrary{trees}
\begin{document}
\pagestyle{empty}
\def\d{3} %degree
\newlength{\leveldist} %level distance
\centering
\begin{tikzpicture}[grow cyclic,circle,sibling angle=360/\d,draw]
\setlength{\leveldist}{10mm};
\tikzstyle{level 1}=[level distance=1.5\leveldist]
\tikzstyle{level 2}=[level distance=\leveldist,sibling angle=60]
\tikzstyle{level 3}=[level distance=\leveldist,sibling angle=40]
\tikzstyle{every node}=[inner sep=0mm,minimum size=1mm,draw]
\node (Ac) {$u$} child foreach \A in {1,...,\d}
{ node (A\A) {} child foreach \B in {2,...,\d}
{ node (A\A-\B) {$u_{\pgfmathparse{(\A-1)*2+\B-1}\pgfmathprintnumber{\pgfmathresult}}$} child foreach \C in {2,...,\d}
{ node (A\A-\B-\C) {\pgfmathparse{ifthenelse(array({0,1,1,1,0,1},(\A-1)*2+\B-2)==\C-2,"$v_1$","")} \pgfmathresult} }
}
};
\end{tikzpicture}
\end{document}
这里,使用"$v_{\pgfmathparse{(\A-1)*2+\B-1}\pgfmathprintnumber{\pgfmathresult}}$"
而不是"$v_1$"
来标记维(因为它适用于u_i在上面这行中)导致编译不会终止,可能是因为嵌套使用了这两个\pgfmathparse
命令。
另一种方法可能是引入一些变量来计算索引而不是就地进行计算,但我无法在这个结构内完成这项工作。
答案1
描述
正如您已经注意到的,使用 nested 似乎是不可能的,或者至少是困难的\pgfmathparse
。问题是,它\pgfmathparse
主要用于算术计算,而不是用于字符串构建,但在这种情况下,字符串必须与计算出的数字连接起来。因此,我利用了另一个包etoolbox
及其命令\ifdefstring
。
改编
- 使用
\ifdefstring
(来自包)来决定,取决于打印etoolbox
的结果或不打印任何内容。\pgfmathparse
$v_i$
- 使用类
article
而不是minimal
- 使用
tikzset
而不是tikzstyle
(见应该使用 \tikzset 还是 \tikzstyle 来定义 TikZ 样式?
代码
\documentclass{article}
\usepackage{etoolbox}
\usepackage{tikz}
\usetikzlibrary{trees}
\begin{document}
\pagestyle{empty}
\def\d{3} %degree
\newlength{\leveldist} %level distance
\centering
\begin{tikzpicture}[
grow cyclic,circle,sibling angle=360/\d,draw,
level 1/.style={level distance=1.5\leveldist},
level 2/.style={level distance=\leveldist,sibling angle=60},
level 3/.style={level distance=\leveldist,sibling angle=40},
every node/.style={inner sep=0mm,minimum size=1mm,draw},
]
\setlength{\leveldist}{10mm};
\node (Ac) {$u$} child foreach \A in {1,...,\d} {
node (A\A) {} child foreach \B in {2,...,\d} {
node (A\A-\B) {$u_{\pgfmathparse{(\A-1)*2+\B-1}\pgfmathprintnumber{\pgfmathresult}}$} child foreach \C in {2,...,\d} {
node (A\A-\B-\C) {%
\pgfmathparse{ifthenelse(array({0,1,1,1,0,1},(\A-1)*2+\B-2)==\C-2, (\A-1)*2+\B-1, 0)}
\ifdefstring{\pgfmathresult}{0}{}{$v_{\pgfmathprintnumber{\pgfmathresult}}$}
}
}
}
};
\end{tikzpicture}
\end{document}