带有 tikz-qtree 的句法树以及多行注释和标签

带有 tikz-qtree 的句法树以及多行注释和标签

我疯狂地尝试使用 tikz-qtree 包绘制句法树。以下是我得出的结论:

\begin{figure}
\centering
\begin{tikzpicture}[every node/.style={align=center},level distance=1.5cm]
\Tree [.S 
          [.{NP\\($\uparrow$~{\sc subj})~=~$\downarrow$}
              [.{N\\$\uparrow$~=~$\downarrow$}
                  [. John 
                  ] 
              ]
          ]
          [.{VP\\$\uparrow$~=~$\downarrow$}
              [.V
                  [.{saw\\$\uparrow$~=~$\downarrow$}]
                  ]
              [.{NP\\($\uparrow$~{\sc obj})~=~$\downarrow$}
                  [.{DET\\($\uparrow$~{\sc def})~=~+}
                  ]
                  [.{N\\$\uparrow$~=~$\downarrow$}
                      [. boy 
                      ]
                  ]
              ]
          ]
      ]
\end{tikzpicture}
\caption{test}
\end{figure}

但是,tex 一直抱怨参数失控,我似乎无法发现我做错了什么。我觉得我需要使用花括号,因为树上的标签跨越多行。有什么想法吗?

答案1

您遇到了qtree/用户经常遇到的一个错误tikz-qtree:包语法要求所有右括号前面都必须有空格。如果您添加空格(或换行符,如杰西的回答在结束括号之前节点,你的 MWE 编译没有错误:

\documentclass{article}

\usepackage{tikz}
\usepackage{tikz-qtree}

\begin{document}

\begin{figure}
    \centering
    \begin{tikzpicture}[every node/.style={align=center},level distance=1.5cm]
    \Tree [.S 
    [.{NP\\($\uparrow$~{\sc subj})~=~$\downarrow$}
    [.{N\\$\uparrow$~=~$\downarrow$}
    [. John 
    ] 
    ]
    ]
    [.{VP\\$\uparrow$~=~$\downarrow$}
    [.V
    [.{saw\\$\uparrow$~=~$\downarrow$} ] % the space before the closing bracket is crucial
    ]
    [.{NP\\($\uparrow$~{\sc obj})~=~$\downarrow$}
    [.{DET\\($\uparrow$~{\sc def})~=~+}
    ]
    [.{N\\$\uparrow$~=~$\downarrow$}
    [. boy 
    ]
    ]
    ]
    ]
    ]
    \end{tikzpicture}
    \caption{test}
\end{figure}

\end{document}

在此处输入图片描述

编辑

下面我对您的代码做了一些额外的改进:

  • 将弃用的更改\sc\textsc{}cfr 建议的
  • 更改every nodeevery tree node并添加anchor=north,使 V 节点的顶部与 NP 节点的顶部垂直对齐
  • 将层距增加限制在第二层及以下,以便 S 与其子层之间的垂直空间不会太大

\documentclass{article}

\usepackage{tikz}
\usepackage{tikz-qtree}

\begin{document}

\begin{figure}
    \centering
    \begin{tikzpicture}[every tree node/.style={align=center,anchor=north},level 2+/.style={level distance=1.5cm}] % changed "every node" to "every tree node" and added "anchor=north" so that the top of the V node is vertically aligned with the top of the NP node; increased the level distance for only the 2nd level and lower
    \Tree [.S 
    [.{NP\\($\uparrow$~\textsc{subj})~=~$\downarrow$} % changed \sc to \textsc{}
    [.{N\\$\uparrow$~=~$\downarrow$}
    [. John 
    ] 
    ]
    ]
    [.{VP\\$\uparrow$~=~$\downarrow$}
    [.V
    [.{saw\\$\uparrow$~=~$\downarrow$} ]
    ]
    [.{NP\\($\uparrow$~\textsc{obj})~=~$\downarrow$} % changed \sc to \textsc{}
    [.{DET\\($\uparrow$~\textsc{def})~=~+} % changed \sc to \textsc{}
    ]
    [.{N\\$\uparrow$~=~$\downarrow$}
    [. boy 
    ]
    ]
    ]
    ]
    ]
    \end{tikzpicture}
    \caption{test}
\end{figure}

\end{document}

在此处输入图片描述

答案2

这是调试后的结果。发现的错误以<---表示。

编辑:有两种方法可以做到这一点。新的在顶部,旧的在后面。将两个支架放在一起后即可找到新的。

在此处输入图片描述

代码

\documentclass[]{standalone}
\usepackage{graphicx}
\usepackage{tikz-qtree}
\usetikzlibrary{trees}
\begin{document}
%\begin{figure}

new solution

\centering
\begin{tikzpicture}[every node/.style={align=center},level distance=1.5cm]
\Tree [.S 
          [.{NP\\($\uparrow$~{\scshape subj})~=~$\downarrow$}
              [.{\strut N\\$\uparrow$~=~$\downarrow$}
                  [. John 
                  ] 
              ]
          ]
          [.{VP\\$\uparrow$~=~$\downarrow$}  
              [.V
                  [.{ saw\\$\uparrow$~=~$\downarrow$}
                  ]] % <---  this is how it work, 
              [.{NP\\($\uparrow$~{\scshape obj})~=~$\downarrow$} 
                  [.{DET\\($\uparrow$~{\scshape def})~=~+}
                  ]
                  [.{N\\$\uparrow$~=~$\downarrow$}
                      [. boy 
                      ]
                  ]
              ]
          ]
        ]
\end{tikzpicture}

% Old solution
\centering
\begin{tikzpicture}[every node/.style={align=center},level distance=1.5cm]
\Tree [.S 
          [.{NP\\($\uparrow$~{\scshape subj})~=~$\downarrow$}
              [.{N\\$\uparrow$~=~$\downarrow$}
                  [. John 
                  ] 
              ]
          ]
          [.{VP\\$\uparrow$~=~$\downarrow$}  
              [.V
                  [.{saw\\$\uparrow$~=~$\downarrow$} % <---
                  ]
              [.{NP\\($\uparrow$~{\scshape obj})~=~$\downarrow$} 
                  [.{DET\\($\uparrow$~{\scshape def})~=~+}
                  ]
                  [.{N\\$\uparrow$~=~$\downarrow$}
                      [. boy 
                      ]
                  ]
               ]
               ]
          ]
       ]   %<---
\end{tikzpicture}
%\caption{test}
%\end{figure}
\end{document}

答案3

这个forest版本利用了一些新命令,使树的编码稍微简单一些。(tikz-qtree当然,您也可以将这些命令与解决方案一起使用。)

\upit{arg}

接受一个强制参数,arg。它排版一个向上的箭头,后跟arg小写字母,全部用括号括起来。

\updown{arg}

接受一个可选参数arg,但允许您使用{}而不是[],这样您就不必将所有内容都括在花括号中,以避免将参数读为新节点。如果未指定任何参数,它将排版一个向上箭头、一个等号和一个向下箭头。否则,它将排版为argas \upit,添加一个等号并以向下箭头结束。

我包含了基本树的代码:

树 1

还有一个似乎很常见的变体:

树 2

代码中唯一的区别是添加了

if n children=0{tier=terminal}{},

第二种情况是树形配置。

\documentclass[tikz, border=5pt, varwidth, multi]{standalone}
\usepackage{forest, mathtools, xparse}
\standaloneenv{forest}
\begin{document}
  \newcommand*\upit[1]{\ensuremath{(\uparrow\,\text{\scshape #1})}}
  \NewDocumentCommand\updown { g }{%
    \IfNoValueTF{#1}{%
      \ensuremath{\uparrow\,=\,\downarrow}%
    }{%
      \ensuremath{(\uparrow\,\text{\scshape #1})\,=\,\downarrow}%
    }}
  \begin{forest}
    for tree={
      parent anchor=south,
      child anchor=north,
      align=center,
      base=top,
    }
    [S
      [NP\\\updown{subj}
        [N\\\updown
          [John
          ]
        ]
      ]
      [VP\\\updown
        [V
          [saw\\\updown
          ]
        ]
        [NP\\\updown{obj}
          [DET\\{$\upit{def} = +$}
            [the
            ]
          ]
          [N\\\updown
            [boy
            ]
          ]
        ]
      ]
    ]
  \end{forest}
  \begin{forest}
    for tree={
      parent anchor=south,
      child anchor=north,
      align=center,
      base=top,
      if n children=0{tier=terminal}{},
    }
    [S
      [NP\\\updown{subj}
        [N\\\updown
          [John
          ]
        ]
      ]
      [VP\\\updown
        [V
          [saw\\\updown
          ]
        ]
        [NP\\\updown{obj}
          [DET\\{$\upit{def} = +$}
            [the
            ]
          ]
          [N\\\updown
            [boy
            ]
          ]
        ]
      ]
    ]
  \end{forest}
\end{document}

相关内容