如何对 pstree 中的树节点进行 y 分割?

如何对 pstree 中的树节点进行 y 分割?

因为我需要画边缘之间的线,当有多个子节点时,我希望有 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}

在此处输入图片描述

相关内容