从节点的特定字符开始的树分支

从节点的特定字符开始的树分支

我正在为命题逻辑公式制作解析树,我想让树的分支从主连接词开始。请注意,分支从每个节点的特定字符开始。以下是我正在寻找的示例:

预期的

这是使用幻影来演示的。以下是代码:

\documentclass{article}
\usepackage{forest}
\forestset{
    parse tree/.style={for tree={s sep=3em, minimum size=1.5em}}
}

\begin{document}
\begin{center}
    \begin{forest}
        parse tree
        [\phantom{ssssssssssssssssss}$\neg (\neg P \to (Q \lor R))$
            [\phantom{sssss}$\neg P \to (Q \lor R)$
                [\phantom{ss}$\neg P$ [$P$]]
                [$Q \lor R$
                    [$Q$]
                    [$R$]
                ]
            ]
        ]
    \end{forest}
\end{center}
\end{document}

我希望解决方案可以包含 Forest 包,但我对任何足够容易使用的东西都可以满意!

答案1

我不是这方面的专家forest,但是如何用 来减少部分方程的大小呢mathtools?例如:

\documentclass{article}
\usepackage{forest}
\usepackage{mathtools}
\forestset{
    parse tree/.style={for tree={s sep=3em, minimum size=1.5em}}
}

\begin{document}
\begin{center}
    \begin{forest}
        parse tree
        [$\neg\mathrlap{(\neg P \to (Q \lor R))}$
        [$\mathllap{\neg} \to \mathrlap{(Q \lor R)}$
        [$\neg \mathrlap{P}$ [$P$]]
                [$Q \lor R$
                    [$Q$]
                    [$R$]
                ]
            ]
        ]
    \end{forest}
\end{center}
\end{document}

在此处输入图片描述

...唯一的问题可能是最终框的边界框,它可能(将会)是错误的。如果这是一个可行的解决方案,您可以使用宏:

\newcommand{\balancemath}[3]{\mathllap{#1} #2 \mathrlap{#3}}
\begin{document}
\begin{center}
    \begin{forest}
        parse tree
        [$\balancemath{}{\neg}{(\neg P \to (Q \lor R))}$
        [$\balancemath{\neg}{\to}{(Q \lor R)}$
        [$\balancemath{}{\neg}{P}$ [$P$]]
                [$Q \lor R$
                    [$Q$]
                    [$R$]
                ]
            ]
        ]
    \end{forest}
\end{center}

...以获得相同的结果。如果需要,可以更改宏(并非易事),使其具有幻影边界框,以便它包含完整的公式。

答案2

即使这个答案没有解决 OP 的主要问题(从连接词下方开始分支),我也会添加它,因为(i)它为同一问题(逻辑解析树)提供了解决方案并且(ii)我已经为自己开发了它。

\documentclass{article}

\usepackage{forest}

\forestset{
  declare toks={left}{},
  declare toks={right}{},
  declare boolean={paren}{false},
  formula as tree/.style={
    formula@as@tree,
    for tree={
      content format={\ensuremath{%
        \noexpand\color{lightgray}\forestoption{left}%
        \noexpand\color{black}\forestoption{content}%
        \noexpand\color{lightgray}\forestoption{right}%
        }},
    },
  },
  formula@as@tree/.style={
    % assuming unary or binary branching nodes
    delay={
      for descendants children-first={
        if n=1{
          if={n_children("!u")==1}{
            append content to parent,
          }{
            prepend content to parent,
          }
        }{
          append content to parent,
        },
      },
    },
  },
  prepend content to parent/.style={
    if paren={
      !u.+left/.process={OOOw3}{left}{content}{right}{(##1##2##3)},
    }{
      !u.+left/.process={OOOw3}{left}{content}{right}{##1##2##3},
    },
  },
  append content to parent/.style={
    if paren={
      !u.right+/.process={OOOw3}{left}{content}{right}{(##1##2##3)},      
    }{
      !u.right+/.process={OOOw3}{left}{content}{right}{##1##2##3},
    }
  }, 
}

\begin{document}


\begin{forest} formula as tree
  [\neg
    [\rightarrow,paren
      [\neg
        [P]
      ]
      [\vee,paren
        [Q]
        [R]
      ]
    ]
  ]
\end{forest}


\end{document}

在此处输入图片描述

相关内容