我正在使用分析树包,根据本文档当不使用“.N.”之类的快捷方式时,叶节点中可以包含括号之类的特殊字符。但是,即使我遵循这些规则,我仍然无法显示我的特殊字符。
梅威瑟:
\documentclass{article}
\usepackage{parsetree}
\begin{document}
\begin{parsetree}
\ptbegtree
\ptbeg{}\ptnode{ROOT}
\ptbeg{}\ptleaf{((parentheses))}
\ptend\ptend{}
\ptendtree
\end{parsetree}
\end{document}
不显示“((括号))”,而只显示“括号”。
答案1
文档中的示例运行良好,但您的示例是错误的。如果您希望在树中使用特殊字符,则需要使用低级命令代替环境parsetree
,而不是环境之外的东西。
文档内容如下:
环境
parsetree
只是一个包装器:(a)使这些特殊字符“活跃”(即特殊),以及(b)\ptbegtree
\ptendtree
分别调用环境开头和结尾的命令。如果我们直接使用后面这些命令,那么这些特殊字符将保留其正常含义,并且可以出现在节点标签中 [原文如此。]。但是,现在我们必须使用底层parsetree
命令来绘制树……
重点是,在parsetree
环境中,类别代码发生了变化。因此,特殊字符是较低级别命令的简写。
如果您需要在树的节点中使用这些字符,那么您需要将类别代码设置为其通常的样子。
一个解决方案是创建一个机制来暂时将代码改回来。然而,这不是该软件包支持的解决方案。
该包支持直接使用较低级别的命令,因此类别代码仍保持其原有状态。显然,这意味着您不能使用特殊字符作为简写。但您可以在节点内使用它们。
\documentclass{article}
\usepackage{parsetree}
\begin{document}
\ptbegtree
\ptbeg\ptnode{ROOT}
\ptbeg\ptleaf{((parentheses))}
\ptend
\ptend
\ptendtree
\ptbegtree
\ptbeg \ptnode{(VP)}
\ptbeg \ptnode{(V)} \ptleaf{(`saw)} \ptend
\ptbeg \ptnode{NP} \ptleaf{Sam's~~~toy.} \ptend
\ptend
\ptendtree
\end{document}
替代解决方案
诸如此类的现代包装森林或者配额树或者tikz-qtree肯定会使生活变得更加轻松。
以下是上述四个示例和/或文档分析树使用重做森林。这使得使用通用样式并使用括号符号非常简洁地指定树成为可能。
简要介绍一下森林以及括号语法的解释,请参阅我的答案的第二部分回答之前的一个问题。
\documentclass[border=10pt,tikz,multi]{standalone}
\usepackage{forest,array}
加载大批因为我们希望它的节点是多行数学的树。
定义两种标准样式:my forest
针对主要为文本节点的树和my maths forest
主要为数学节点的树。当然,您始终可以在节点内切换,但这样可以省去对每个节点重复相同切换的麻烦。
\forestset{
my forest/.style={
for tree={
parent anchor=south,
child anchor=north,
分支从父级下方的共同点开始,到子级的顶部中心结束。
align=center
将节点内容居中对齐。
}
},
my maths forest/.style={
for tree={
parent anchor=south,
child anchor=north,
align={@{}>{$}c<{$}@{}}
与以前一样,但节点的内容默认处于数学模式。
}
}
}
\begin{document}
从问题来看:
\begin{forest}
my forest
[ROOT
[\itshape(parentheses)]
]
\end{forest}
这是一个三角形屋顶的示例:
\begin{forest}
my forest,
where n children=0{font=\itshape}{}
所有终端节点都应以斜体表示。
[S
[NP
[we]
]
[VP
[V
[gave]
]
[NP
[them]
]
[NP
[a toy, triangle]
]
]
]
\end{forest}
涉及特殊字符的示例:
\begin{forest}
my forest
[(VP)
[(V)
[\textit{(`saw)}]
]
[NP
[\textit{Sam's toy.}]
]
]
\end{forest}
文档中涉及特殊字符的更复杂示例:
\begin{forest}
my maths forest
[{S\\see' (s, k)\\\lambda y see' ( y,k ) (s)}
[NP\\s
[Sam\\s
]
]
[{VP\\\lambda y see' ( y,k )\\\lambda x \lambda y see' ( y,x ) (k)}
[{V\\\lambda x \lambda y see' ( y,x ) }
[{saw\\\lambda x \lambda y see ( y,x )}
]
]
[NP\\k
[Kim\\k
]
]
]
]
\end{forest}
\end{document}
完整代码:
\documentclass[border=10pt,tikz,multi]{standalone}
\usepackage{forest,array}
\forestset{
my forest/.style={
for tree={
parent anchor=south,
child anchor=north,
align=center
}
},
my maths forest/.style={
for tree={
parent anchor=south,
child anchor=north,
align={@{}>{$}c<{$}@{}}
}
}
}
\begin{document}
\begin{forest}
my forest
[ROOT
[\itshape(parentheses)]
]
\end{forest}
\begin{forest}
my forest,
where n children=0{font=\itshape}{}
[S
[NP
[we]
]
[VP
[V
[gave]
]
[NP
[them]
]
[NP
[a toy, triangle]
]
]
]
\end{forest}
\begin{forest}
my forest
[(VP)
[(V)
[\textit{(`saw)}]
]
[NP
[\textit{Sam's toy.}]
]
]
\end{forest}
\begin{forest}
my maths forest
[{S\\see' (s, k)\\\lambda y see' ( y,k ) (s)}
[NP\\s
[Sam\\s
]
]
[{VP\\\lambda y see' ( y,k )\\\lambda x \lambda y see' ( y,x ) (k)}
[{V\\\lambda x \lambda y see' ( y,x ) }
[{saw\\\lambda x \lambda y see ( y,x )}
]
]
[NP\\k
[Kim\\k
]
]
]
]
\end{forest}
\end{document}
答案2
如果您使用环境,我认为没有任何理由可以使广告中的示例工作parsetree
。事实上,它们不能,因为\ptnode
和\ptleaf
宏在吸收其参数之前不会更改特殊字符的类别代码。
根据 cfr,使用和命令parsetree
时不应使用环境。但是,我们可以通过调整类别代码来充分利用两者的优势。方法如下。\ptnode
\ptleaf
\documentclass{article}
\usepackage{parsetree}
% Fix the wrong macros of parsetree.sty
\def\ptnodeaux#1{\setbox\ptx=\hbox\bgroup\ptuncatcodes\ptnodeauxaux{#1}}
\def\ptnodeauxaux#1#2{#1#2\egroup\ptxx=0.5\wd\ptx\ptnext}
\def\ptnode{\ptnodeaux{\ptnodefn\ptnodestrut}}
\def\ptleaf{\ptnodeaux{\ptleaffn\ptleafstrut}}
\def\ptuncatcodes{%
\catcode`(=12 \catcode`)=12
\catcode`.=12 \catcode``=12
\def~{\nobreakspace{}}%
}
\begin{document}
\begin{parsetree}
\ptbeg\ptnode{ROOT}
\ptbeg\ptleaf{(parentheses)}
\ptend\ptend
\end{parsetree}
\begin{parsetree}
\ptbeg \ptnode{(VP)}
\ptbeg \ptnode{(V)} \ptleaf{(`saw)} \ptend
\ptbeg \ptnode{NP} \ptleaf{Sam's~~~toy.} \ptend
\ptend
\end{parsetree}
\end{document}