森林:父节点相对于子节点的位置不正确

森林:父节点相对于子节点的位置不正确

下面的树是由下面的代码生成的。在树中,父节点略微错位。您会注意到其子节点的边是不对称的:左侧的边比右侧的边略短。

我不知道是什么原因造成的——也许这与节点部分的使用有关。我如何确保此树中的父节点正确定位以确保边缘对称?

具有不对称边缘的简单计算树

编辑:薛定谔的猫提供了一个答案,这让我想起我希望解决方案能够在更复杂的树中保留树的不同级别之间的空间,并且即使添加更多分支也能保持父级与其子级之间的分离不变。

例如,在下面稍微复杂的树中,父节点和子节点之间以及兄弟节点之间的间距很好,但是在根节点和其子节点之间可以注意到相同的不对称,另外,树上的最低节点通过一条斜线与其父节点相连,而我希望它是一条垂直直线。

稍微复杂一点的计算树

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{shapes.multipart, positioning}

\usepackage{xinttools}

\usepackage{forest}

\def\numname#1{%
    \ifcase#1 \or one\or two\or three\or four\or five\or six\or seven\or eight\or nine\or ten\or eleven \or twelve\or thirteen\or fourteen\or fifteen\or sixteen\or seventeen\or eighteen\or nineteen\or twenty\fi%
}

\newcounter{cellnum}
\newcommand{\tape}[1]{%
    \setcounter{cellnum}{1}
    \xintFor* ##1 in {#1} \do {%
        \nodepart[text width=1.5ex, align=center]{\numname{\value{cellnum}}} $##1$%
        \stepcounter{cellnum}%
    }
    \addtocounter{cellnum}{-1}%
}

\begin{document}

\begin{forest}
    for tree={
        delay={
            content={\tape{#1}}
        },
        rectangle split,
        rectangle split horizontal,
        rectangle split parts=\value{cellnum},
        rectangle split part align=base,
        draw,
        l sep=6ex,
        s sep=2em,
        edge path={
            \noexpand\path[draw] 
            ([yshift=-2.5ex]!u.children) -- ([yshift=1ex].parent);
        },
        head/.style n args=2{
            tikz={\node[below=0cm of .\numname{#1} south, font=\scriptsize]{$#2$};}
        }
    }
    [111, head={1}{1}
        [0111, head={1}{2}]
        [111, head={2}{1}]
    ]
\end{forest}

\end{document}

答案1

您可以使用calign=fixed edge angles

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{shapes.multipart, positioning}

\usepackage{xinttools}

\usepackage{forest}

\def\numname#1{%
    \ifcase#1 \or one\or two\or three\or four\or five\or six\or seven\or eight\or nine\or ten\or eleven \or twelve\or thirteen\or fourteen\or fifteen\or sixteen\or seventeen\or eighteen\or nineteen\or twenty\fi%
}

\newcounter{cellnum}
\newcommand{\tape}[1]{%
    \setcounter{cellnum}{1}
    \xintFor* ##1 in {#1} \do {%
        \nodepart[text width=1.5ex, align=center]{\numname{\value{cellnum}}} $##1$%
        \stepcounter{cellnum}%
    }
    \addtocounter{cellnum}{-1}%
}

\begin{document}

\begin{forest}
    for tree={
        delay={
            content={\tape{#1}}
        },
        calign=fixed edge angles,
        rectangle split,
        rectangle split horizontal,
        rectangle split parts=\value{cellnum},
        rectangle split part align=base,
        draw,
        l sep=6ex,
        s sep=2em,
        edge path={
            \noexpand\path[draw] 
            ([yshift=-2.5ex]!u.children) -- ([yshift=1ex].parent);
        },
        head/.style n args=2{
            tikz={\node[below=0cm of .\numname{#1} south, font=\scriptsize]{$#2$};}
        }
    }
    [111, head={1}{1}
        [0111, head={1}{2}]
        [111, head={2}{1}]
    ]
\end{forest}

\end{document}

在此处输入图片描述

相关内容