如何修改和重用 TikZ 中定义的树的各个部分?

如何修改和重用 TikZ 中定义的树的各个部分?

我已经使用该属性定义了一棵树pic以供以后重用,例如下面的 MWE。

\documentclass{standalone}
\usepackage{tikz}

\tikzset {
  my tree/.pic = {
    \node (4){4}
    child { node (5){5}
      child { node (15){15} }
      child { node (9){9} }
    }
    child { node (8){8}
      child { node (20){20} }
      child { node (10){10} }
    }
    ;
  },
  level 1/.style={sibling distance=35mm, level distance=1cm},
  level 2/.style={sibling distance=17mm, level distance=1cm},
  level 3/.style={sibling distance=10mm, level distance=1cm},
}

\begin{document}
\begin{tikzpicture}
  \pic{my tree};
\end{tikzpicture}
\end{document}

得出

主頁

我现在想在另一个tikzpicture环境中重新绘制my tree,但将子节点添加到某些节点,例如下面的红色节点

用所需的叶子重新绘制 mwe 树

或者插入一些节点,例如下面的红色节点 在此处输入图片描述

而不必完全重新定义树。

这可以在 TikZ 中实现吗?如果可以,怎么做?

答案1

抱歉,我这么说,但是因为编辑器无法自动缩进而不使用 Forest 是疯了。我不知道是否有编辑器可以正确缩进它 - 我的肯定不行 - 但是 Forest 树仍然比 Ti 更具可读性Z 的冗长等价物,即使不是,为了一点点自动格式化而牺牲功能和灵活性也太疯狂了。与手动格式化源代码的小部分相比,您很容易会花更多的时间从头开始破解解决方案。

无论如何,森林是这样做的方法。这里没有其他任何有意义的方法。(Lua 可能也可以做到这一点,但它不会提供 Forest 提供的现成配方。)

这是针对这个不知感恩的世界的森林解决方案。

首先,我们设置一个样式,my tree它定义了我们的基础树。它采用一个可选值,可用于指定修改树的代码。

\forestset{
  my tree/.style={
    delay={
      !r.replace by={[4, #1 [5[15][9]][8[20][10]]]},
    },
  },
}

然后我们可以使用

\Forest{
  my tree,
  []
}

第一棵经过修改的树

\Forest{
  my tree={
    before typesetting nodes={
      for nodewalk={fake=r,L}{prepend={[0, red]},append={[1, red]}},
    }
  },
  []
}

第二个是

\Forest{
  my tree={
    before typesetting nodes={
      for nodewalk={fake=r,l}{replace by={[40, red, append, prepend={[,phantom]}]}}
    },
  },
  []
}

您还可以在进行修改时命名基础树中的节点,以便于参考或按内容搜索等。

三棵树的变奏

\documentclass[border=10pt]{standalone}
\usepackage{forest}
\forestset{
  my tree/.style={
    delay={
      !r.replace by={[4, #1 [5[15][9]][8[20][10]]]},
    },
  },
}
\begin{document}
\Forest{
  my tree,
  []
}
\Forest{
  my tree={
    before typesetting nodes={
      for nodewalk={fake=r,L}{prepend={[0, red]},append={[1, red]}},
    }
  },
  []
}
\Forest{
  my tree={
    before typesetting nodes={
      for nodewalk={fake=r,l}{replace by={[40, red, append, prepend={[,phantom]}]}}
    },
  },
  []
}
\end{document}

相关内容