因为我需要画边缘之间的线,当有多个子节点时,我希望有 y 分割。目前我通过隐藏节点和来实现它nodesep=0
。不幸的是,我不知道如何重置nodesep
分割节点的直接父节点和子节点,因此间距是错误的(见屏幕截图)。
\documentclass{minimal}
\usepackage{pstricks,auto-pst-pdf}
\usepackage{pst-tree}
\newcommand{\terminal}[2][]{\TR[#1]{\boldsymbol{#2}}}
\newcommand{\nonterminal}[2][]{\TR[#1]{#2}}
\newcommand{\emptyword}{\TR{\epsilon}}
\newcommand{\derivationtree}[1]
{
\begin{postscript}
$ \pstree[treemode=R,nodesep=2pt,treesep=0.4cm,levelsep=1.5cm]{\TR{S}}{#1} $
\end{postscript}
}
\begin{document}
\derivationtree{
\pstree[nodesep=0]{\nonterminal{N_1}}
{
\pstree{\Tr{}}
{
\pstree[nodesep=2pt]{\nonterminal{N_1}}
{
\terminal{[}
}
\terminal{[}
}
}
}
\end{document}
在 pst-tree 手册中,有一个例子,其中\psedge
被重新定义为\ncdiag
。但我真的不知道如何做到这一点,以及如何仅针对一种情况限制效果。
答案1
通常人们会重新定义\psedge
但它可以与任何其他定义一起使用。
\documentclass{minimal}
\usepackage{pstricks,auto-pst-pdf}
\usepackage{pst-tree}
\newcommand\terminal[2][]{\TR[#1]{\boldsymbol{#2}}}
\newcommand\nonterminal[2][]{\TR[#1]{#2}}
\newcommand\emptyword{\TR{\epsilon}}
\def\psEdge#1#2{\ncdiagg[armA=1cm,angleA=0,angleB=180]{#1}{#2}}
\newcommand\derivationtree[1]{
\begin{postscript}
$ \pstree[treemode=R,nodesep=2pt,treesep=0.4cm,levelsep=1.5cm]{\TR{S}}{#1} $
\end{postscript}}
\begin{document}
\derivationtree{%
\pstree[thislevelsep=2.75cm]{\nonterminal{N_1}}{
\pstree{\nonterminal[edge=\psEdge]{N_1}}{ \terminal{[} }
\terminal[edge=\psEdge]{[}
}
}
\end{document}