具有冗余弧的森林结构

具有冗余弧的森林结构

我正在尝试使用这里提供的森林结构: https://tex.stackexchange.com/a/713546/,但在不同的树上。我得到了一张图片,但一条弧是多余的(从 (0,0) 到 (5,5)),我不明白为什么。即使生成了图形,也会出现错误消息:“没有名为 '' 的已知形状”。您能建议如何修复此问题吗?

\documentclass[tikz,border=5pt]{standalone}
% ateb: https://tex.stackexchange.com/a/713546/
\usepackage{forest}
\usetikzlibrary{arrows.meta}
\begin{document}    
\begin{forest}
  for tree={%
    edge+={-Latex},
    anchor=base,
    align=@{}c@{},
    font=\sffamily,
    s sep'+=10pt,
    if={ > On= On> & {n}{2} {level}{1} }{%
      edge path'={%
        (!uu2.parent anchor) edge (.child anchor)
        (!u.parent anchor) -- (.child anchor)
      },
    }{%
      edge path'={(!u.parent anchor) -- (.child anchor)},
    },
  },
  my label/.style={%
    if n=2{%
      label={[my label style]right:{#1}},
    }{%
      label={[my label style]left:{#1}},
    },
  },
  /tikz/my label style/.style={font=\sffamily},
  before computing xy={%
    tempdima/.max={ > OOw2+d {max x}{min x}{#1-#2} }{tree},
    for tree={%
      minimum width/.register=tempdima,
      draw,
      thin,
    },
    typeset nodes,
  },
  [{(0,0)}, my label={(0,0)}
    [{(1,1)}, my label={(0,0)}
      [{(2,2)}, my label={(0,0)}
            [{(3,3)}, my label={(0,0)}
                 [{(4,4)}, my label={(0,0)}]
            ]    
            [{(5,5)}, my label={(0,0)}]
      ]                   
    ]  
  ]
\end{forest}
\end{document}

答案1

这是一棵树,所以比上一个图简单。我们不需要添加额外的边,只需删除该代码即可解决这两个问题。也就是说,我们只需删除

if={ > On= On> & {n}{2} {level}{1} }{%
  edge path'={%
    (!uu2.parent anchor) edge (.child anchor)
    (!u.parent anchor) -- (.child anchor)
  },
}{%
  edge path'={(!u.parent anchor) -- (.child anchor)},
},

实际上,这两个问题其实是一样的。在每种情况下,Forest 都会尝试访问一个不存在的节点。箭头从根节点绘制,因为这是默认的起点。

Forest 尝试访问不存在的节点的原因在于我之前的回答取决于该特定树的结构。具体来说,对于树的较低层,它会追踪从每个第二个子节点到其祖父母的第二个子节点的路径。

if={ > On= On> & {n}{2} {level}{1} }{%

这区分了节点为第二个子节点且级别大于 1 的节点和其中一个条件失败的节点,即节点不是第二个子节点或节点处于级别 0 或 1。

我们有第二个孩子,并且级别大于 1,

  edge path'={%
    (!uu2.parent anchor) edge (.child anchor)
    (!u.parent anchor) -- (.child anchor)
  },

这绘制了两个箭头。第一个箭头从祖父母的第二个孩子节点绘制parent anchorchild anchor当前节点。这是代码依赖于树的结构的地方。如果没有这样的节点,我们会得到一个错误。

}{%

当其中一个条件不满足时,即级别为 0 或 1,或者节点不是第二个子节点,

  edge path'={(!u.parent anchor) -- (.child anchor)},

这将从父节点parent anchor到当前节点绘制一个箭头child anchor。这只是 Forest 默认执行的操作,因此我可以省略此操作。

},

此代码在新树中不起作用,因为没有祖父母的第二个孩子。但是我们无论如何都不需要第二个箭头,所以我们可以删除代码。

修改后的代码:

\documentclass[tikz,border=5pt]{standalone}
% ateb: https://tex.stackexchange.com/a/713546/
\usepackage{forest}
\usetikzlibrary{arrows.meta}
\begin{document}    
\begin{forest}
  for tree={%
    edge+={-Latex},
    anchor=base,
    align=@{}c@{},
    font=\sffamily,
    s sep'+=10pt,
  },
  my label/.style={%
    if n=2{%
      label={[my label style]right:{#1}},
    }{%
      label={[my label style]left:{#1}},
    },
  },
  /tikz/my label style/.style={font=\sffamily},
  before computing xy={%
    tempdima/.max={ > OOw2+d {max x}{min x}{#1-#2} }{tree},
    for tree={%
      minimum width/.register=tempdima,
      draw,
      thin,
    },
    typeset nodes,
  },
  [{(0,0)}, my label={(0,0)}
    [{(1,1)}, my label={(0,0)}
      [{(2,2)}, my label={(0,0)}
            [{(3,3)}, my label={(0,0)}
                 [{(4,4)}, my label={(0,0)}]
            ]    
            [{(5,5)}, my label={(0,0)}]
      ]                   
    ]  
  ]
\end{forest}
\end{document}

再次对 Okular 漏洞造成的低质量表示歉意,

修改的代码输出

相关内容