替代解决方案

替代解决方案

我正在使用分析树包,根据本文档当不使用“.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}

示例 1

这是一个三角形屋顶的示例:

\begin{forest}
  my forest,
  where n children=0{font=\itshape}{}

所有终端节点都应以斜体表示。

  [S
    [NP
      [we]
    ]
    [VP
      [V
        [gave]
      ]
      [NP
        [them]
      ]
      [NP
        [a toy, triangle]
      ]
    ]
  ]
\end{forest}

示例 2

涉及特殊字符的示例:

\begin{forest}
  my forest
  [(VP)
    [(V)
      [\textit{(`saw)}]
    ]
    [NP
      [\textit{Sam's toy.}]
    ]
  ]
\end{forest}

示例 3

文档中涉及特殊字符的更复杂示例:

\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}

示例 4

\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}

在此处输入图片描述

相关内容