嵌套使用 `\pgfmathparse` 进行图形绘制

嵌套使用 `\pgfmathparse` 进行图形绘制

我正在使用trees tikzlibrary结合一些pgfmath命令来绘制下面的三元树:

在此处输入图片描述

到每个顶点u_i, 一定是相关的。到目前为止,所有这些标有v_1,但实际上我希望编号与u_i's,这样v_1毗邻u_1v_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

改编

代码

\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}

结果

在此处输入图片描述

相关内容