我想在我排版使用的语法树的一部分周围画一个框pst-jtree
。这是一个简化的示例:
\documentclass{article}
\usepackage{pstricks}
\usepackage{pst-jtree}
\begin{document}
\jtree[scaleby=1.5 1]
\! = {S}
:{NP}! {VP} "{\psset{scaleby=1 1}}
:{V}(<vert>{saw}) {NP}@NP "{\psset{scaleby=0.75 1}}
:{D}(<vert>{the}@the ) {N}(<vert>{cat}@cat ).
\! =:{D}(<vert>{The}) {N}(<vert>{dog}).
\ncbox[nodesep=5pt, linearc=0.2]{the}{cat}
\endjtree
\end{document}
这将产生以下输出:
但是,我希望框的顶部也包含 NP 节点,如下所示(使用图像编辑软件创建):
但是,我似乎找不到使用 来将一个框放在三个节点周围的方法pstricks
。理想的情况是,如果有类似于tikz
的fit
库提供的功能来执行此操作。(将树中的文本标记为 tikz 节点不起作用,因为 tikz 节点坐标始终位于边界框的顶部。)有什么方法可以做到这一点吗?
答案1
\documentclass{article}
\usepackage{pstricks}
\usepackage{pst-jtree}
\begin{document}
\jtree[scaleby=1.5 1]
\! = {S}
:{NP}! {VP} "{\psset{scaleby=1 1}}
:{V}(<vert>{saw}) {NP}@NP "{\psset{scaleby=0.75 1}}
:{D}(<vert>{the}@the ) {N}(<vert>{cat}@cat ).
\! =:{D}(<vert>{The}) {N}(<vert>{dog}).
\psframe[framearc=0.2,linestyle=dashed](!\psGetNodeCenter{the} the.x 0.5 sub the.y 0.5 sub)
(!\psGetNodeCenter{NP} \psGetNodeCenter{cat} cat.x 0.5 add NP.y 0.6 add)
\endjtree
\end{document}
答案2
正如评论中指出的那样,所以用 画树要容易得多forest
。但如果你坚持的话,只要稍微修改一下就可以了。现在很少有pstricks
巫师了,而且我已经很久没用过它了,所以我当然不符合条件。
我已添加forest
版本以供比较。
不必要的语言评论:终端节点和它们的类别标签之间的线在语法上不合理,因此<vert>
应删除所有终端节点。
\documentclass{article}
\usepackage{pstricks}
\usepackage{pst-jtree}
\usepackage[linguistics]{forest}
\begin{document}
\jtree[scaleby=1.5 1]
\! = {S}
:{NP}! {VP} "{\psset{scaleby=1 1}}
:{V}(<vert>{saw}) {\Rnode[href=-2]{NP}{NP}}@NP "{\psset{scaleby=0.75 1}}
:{D}(<vert>{the}@the ) {N}(<vert>{cat}@cat ).
\! =:{D}({The}) {N}(<vert>{dog}).
\ncbox[nodesep=5pt,boxsize=3,offset=1.5,linearc=.5]{the}{NP}
\endjtree
\begin{forest}
[S
[NP [D\\the] [N\\dog]]
[VP [V\\saw]
[NP,tikz={\node[draw,rounded corners,fit to=tree]{};} [D\\the][N\\cat]]
]
]
\end{forest}
\end{document}