我正在为命题逻辑公式制作解析树,我想让树的分支从主连接词开始。请注意,分支从每个节点的特定字符开始。以下是我正在寻找的示例:
这是使用幻影来演示的。以下是代码:
\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}