使用 LaTeX 创建语法树

使用 LaTeX 创建语法树

是否可以用 LaTeX 创建这棵树? 在此处输入图片描述

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{trees}

\begin{document}

\begin{tikzpicture}
\node {E}
      child {  node {F}   }

      child {  node {+}}

      child {  node {T}

      child {  node {T}
      child{node{F}

      child{node{8}} }}

      child { node {*} }

      child { node {F}

      child{node{2}}}};





\end{tikzpicture}

\end{document} 

我设法创建了树,但缺少属性,例如{Fv: = 2} 在此处输入图片描述

答案1

将 Gonzalo 的答案改编为该tikz-qtree包,我们可以获得类似的结果。请注意,严格来说,您不需要将\nodes 分配给您未使用其他 TikZ 命令引用的节点。

\documentclass{article}
\usepackage{tikz-qtree}
\usepackage{mathtools}
\usetikzlibrary{positioning}
\begin{document}

\begin{tikzpicture}
\Tree [.\node(a) {E}; 
          [.\node (b) {F}; ] 
          [.\node (c) {+}; ] 
          [.\node (d) {T};
            [.\node (e) {T}; 
              [.\node (f) {F}; [.\node (g) {8}; ]]]
            [.\node (h) {*}; ]
            [.\node (i) {F};
              [.\node (j) {2}; ]
            ]
          ]
      ]
\begin{scope}[every node/.style={font=\footnotesize}]
\node[right=of a] (na) {\{E.v${}\coloneqq{}$+T.v\}};
\node[right=of d] (nd) {\{T.v${}\coloneqq{}$F.v$^{*}$T.v\}};
\node[right=of i] (ni) {\{F.v${}\coloneqq{}$2\}};
\node[left=of b] (nb) {\{F.v${}\coloneqq{}$5\}};
\node[left=of e] (ne) {\{T.v${}\coloneqq{}$F.v\}};
\node[left=of f] (nf) {\{F.v${}\coloneqq{}$8\}};
\foreach \i in {a,b,d,e,f,i}
  \draw[dotted] (\i) -- (n\i);
\end{scope}
\end{tikzpicture}
\end{document}

代码输出

答案2

您可以命名节点,然后使用这些名称使用其他\nodepositioning库来放置注释(我不确定注释应该采用文本模式还是数学模式,但您可以轻松更改);一个简单的\foreach循环就可以绘制虚线:

\documentclass{scrartcl}
\usepackage{mathtools}
\usepackage{tikz}
\usetikzlibrary{trees,positioning}

\begin{document}

\begin{tikzpicture}
\node (a) {E}
child {node (b) {F}
}
child {node (c) {+}
}
child {node (d) {T}
child {node (e) {T} 
  child {node (f) {F}  child {node  (g) {8}} }  
  }
child {node  (h) {*}}
child {node  (i) {F} child {node  (j) {2}}}
};
\begin{scope}[every node/.style={font=\footnotesize}]
\node[right=of a] (na) {\{E.v${}\coloneqq{}$+T.v\}};
\node[right=of d] (nd) {\{T.v${}\coloneqq{}$F.v$^{*}$T.v\}};
\node[right=of i] (ni) {\{F.v${}\coloneqq{}$2\}};
\node[left=of b] (nb) {\{F.v${}\coloneqq{}$5\}};
\node[left=of e] (ne) {\{T.v${}\coloneqq{}$F.v\}};
\node[left=of f] (nf) {\{F.v${}\coloneqq{}$8\}};
\foreach \i in {a,b,d,e,f,i}
  \draw[dotted] (\i) -- (n\i);
\end{scope}
\end{tikzpicture}

\end{document}

在此处输入图片描述

在评论中,要求注释为红色,并且树带有标题:

\documentclass{scrartcl}
\usepackage{mathtools}
\usepackage{tikz}
\usetikzlibrary{trees,positioning}

\begin{document}
An example of a cross-reference to Figure~\ref{fig:tree}.

\begin{figure}
\centering
\begin{tikzpicture}
\node (a) {E}
child {node (b) {F}
}
child {node (c) {+}
}
child {node (d) {T}
child {node (e) {T} 
  child {node (f) {F}  child {node  (g) {8}} }  
  }
child {node  (h) {*}}
child {node  (i) {F} child {node  (j) {2}}}
};
\begin{scope}[every node/.style={font=\footnotesize,color=red}]
\node[right=of a] (na) {\{E.v${}\coloneqq{}$+T.v\}};
\node[right=of d] (nd) {\{T.v${}\coloneqq{}$F.v$^{*}$T.v\}};
\node[right=of i] (ni) {\{F.v${}\coloneqq{}$2\}};
\node[left=of b] (nb) {\{F.v${}\coloneqq{}$5\}};
\node[left=of e] (ne) {\{T.v${}\coloneqq{}$F.v\}};
\node[left=of f] (nf) {\{F.v${}\coloneqq{}$8\}};
\foreach \i in {a,b,d,e,f,i}
  \draw[dotted] (\i) -- (n\i);
\end{scope}
\end{tikzpicture}
\caption{A syntactic tree}
\label{fig:tree}
\end{figure}

\end{document}

在此处输入图片描述

相关内容