LaTex绘图之forest宏包绘制语法分析树


在LaTeX中绘制语法分析树的方法有多种,以前我介绍过使用qtree宏包来绘制,但其功能有限,现在介绍功能更强的forest宏包。

下面的示例图案选自《编译原理》第2版第2章图2-5。完整示例代码如下:

% 博客园,繁星间漫步,陆巍的博客
\documentclass{article}

% 注意宏包顺序,有可能会报错
\usepackage{ctex}% 中文支持
\usepackage{geometry}% 用于页面设置
\usepackage{longtable}% 支持长表格跨页
\usepackage{qtree}% 绘制语法分析树
\usepackage{forest}% 绘制语法分析树

% 设置为A4纸,边距适中模式(参考永中office)
\geometry{
  a4paper,
  left = 19.1mm,
  right = 19.1mm,
  top = 25.4mm,
  bottom = 25.4mm
}

% ------------------ 开始 -------------------
\begin{document}
qtree宏包绘制的语法分析树
\begin{center}
  \Tree [.$list$
          [.$list$
            [.$list$ [.$digit$ 9 ]]
            -
            [.$digit$ 5 ]
          ]
          +
          [.$digit$ 2 ]
      ]
\end{center}

forest宏包绘制的语法分析树一
\begin{center}
  \begin{forest}
    [$list$,
      [$list$,
        [$list$ [$digit$ [9]]]
        [-]
        [$digit$ [5]]
      ]
      [+]
      [$digit$ [2]]
    ]
  \end{forest}
\end{center}

forest宏包绘制的语法分析树二
\begin{center}
  \begin{forest}
    [$list$,
      [$list$,
        [$list$ [$digit$ [9, tier = word]]]
        [-, tier = word]
        [$digit$ [5, tier = word]]
      ]
      [+, tier = word]
      [$digit$ [2, tier = word]]
    ]
  \end{forest}
\end{center}

forest宏包绘制的语法分析树三
\begin{center}
  \begin{forest}
    [$list$, s sep = 3em
      [$list$, s sep = 2em
        [$list$ [$digit$ [9, tier = word]]]
        [-, tier = word]
        [$digit$ [5, tier = word]]
      ]
      [+, tier = word, before computing xy={s/.average={s}{siblings}}]
      [$digit$ [2, tier = word]]
    ]
  \end{forest}
\end{center}

\end{document}

效果如下:

说明:
1、第一个例子使用的是qtree宏包绘制的;
2、使用forest宏包绘制的图形有三幅,第一幅没有做任何修饰,看上去与qtree绘制的差不多,只是节点和展开角度不一样;第二幅为了更好的展示,使用了tier=word语句;第三幅是在第二幅的基础上进行了角度上的调整,看上去就要美观一些。
3、forest宏包实际上是建立在tikz宏包的基础上。