自然推理(或类似)如 TikZ 树

自然推理(或类似)如 TikZ 树

我想知道是否有可能让 TikZ 树以类似于自然演绎(证明)树的方式呈现。具体来说,我想要一棵树,它不是从父级到子级的边缘,而是在每个子树上有水平线(假设树向上或向下生长)。

我对 TikZ 还不熟悉,目前最好的解决方案是绘制没有边的树,然后使用库fit为所有子树构建边界框,然后使用边界框的锚点画线,这并不是一个令人满意的解决方案。

(我怀疑我可以使用链条,但据我所知,你会失去树的便捷符号。)

编辑:如果可以方便地以某种\foreach方式遍历树节点,那么繁琐的部分至少可以自动化,这样的事情可能吗?

编辑:我想人们可以对其进行调整level distance以使边缘水平,但这感觉像是一次黑客攻击。

编辑:这是我所追求的一个例子

例子

制作

\begin{tikzpicture}[grow'=up,level distance=4ex,
                  edge from parent/.code={},
                  level/.style={sibling distance=10em/#1}]
  \node (A) {A}
    child { node (B) {B}
      child { node (D) {D} }
      child { node (E) {E} } }
    child { node (C) {C}
      child { node (F) {F} }
      child { node (G) {G}
              child { node (H) {H} }
              child { node (I) {I} }
              child { node (J) {J} } } } ;
  \node (SubA) [fit=(B) (C)] {};
  \node (SubB) [fit=(D) (E)] {};
  \node (SubC) [fit=(F) (G)] {};
  \node (SubG) [fit=(H) (I) (J)] {};
  \foreach \root in {SubA, SubB, SubC, SubG}{
    \draw [thick] (\root.south west) -- (\root.south east);
  };
\end{tikzpicture}

答案1

您可以指定产生水平线。以下是从库中的edge from parent path预定义样式改编而来的样式:edge from parent fork uptrees

\documentclass[oneside]{article}

\usepackage{tikz}

\begin{document}
\begin{tikzpicture}[
    edge from parent path={
        (\tikzparentnode\tikzparentanchor) 
        +(0pt,.5\tikzleveldistance)  
        -- (0pt,-.5\tikzleveldistance -| \tikzchildnode\tikzchildanchor) 
        -- +(0.25cm,0pt) 
        -- +(-0.25cm,0pt)
    },
    grow'=up,level distance=4ex,
    level/.style={sibling distance=10em/#1}]
  \node (A) {A}
    child { node (B) {B}
      child { node (D) {D} }
      child { node (E) {E} } }
    child { node (C) {C}
      child { node (F) {F} }
      child { node (G) {G}
              child { node (H) {H} }
              child { node (I) {I} }
              child { node (J) {J} } } } ;

\end{tikzpicture}

\end{document}

相关内容