1. 程式人生 > 其它 >LaTeX之qtree巨集包繪製語法分析樹示例

LaTeX之qtree巨集包繪製語法分析樹示例

使用LaTeX中的qtree巨集包繪製語法分析樹示例。

繪製語法分析樹可以使用tikz巨集包來實現,並且tikz可以繪製很複雜的圖形。但如果只是需要一些簡單的圖形,使用qtree巨集包就可以滿足。

1. 環境

  • Ubuntu 20.04
  • LuaLaTeX 1.10.0

2. 示例程式碼:

% 部落格園,繁星間漫步,陸巍的部落格
\documentclass{article}% 中文板式:ctexart,英文版式:article

\usepackage{ctex}% 中文支援
\usepackage{geometry}% 用於頁面設定
\usepackage{qtree}% 繪製語法分析樹
\usepackage{tikz}% 繪圖
\usetikzlibrary{shapes}

\setmainfont{Ubuntu Mono}% 設定全域性英文字型

% 設定為A4紙,邊距適中模式(參考永中office)
\geometry{
  width = 210mm,
  height = 297mm,
  left = 19.1mm,
  right = 19.1mm,
  top = 25.4mm,
  bottom = 25.4mm
}

\begin{document}
部落格園,繁星間漫步,陸巍的部落格(https://www.cnblogs.com/among-the-stars)

\section{示例一}
\Tree [.E
        [.E
          [.T
            [.T [.F [.I 3 ]]]
            [.op2 * ]
            [.F [.I 5 ]]
          ]
        ]
        [.op1 + ]
        [.T
          [.F
            (
            [.E
              [.E [.T [.E [.I 1 ]]]]
              [.op1 - ]
              [.T [.I i ]]
            ]
            )
          ]
        ]
    ]


\section{示例二}
\Tree [.{Assignment Statement\\=}
        Identifier\\sum
        [.Expression\\+ Identifier\\num1 Identifier\\num2 ]
]

\section{示例三}
\Tree [.E ]\quad
\begin{tikzpicture}[every node/.style={single arrow, draw}, rotate border/.style={shape border uses incircle, shape border rotate=#1}]
  \node {第一步推導};
\end{tikzpicture}
\Tree [.E E op1 T ]
\begin{tikzpicture}[every node/.style={single arrow, draw}, rotate border/.style={shape border uses incircle, shape border rotate=#1}]
  \node {第二步推導};
\end{tikzpicture}
\Tree [.E E op1 [.T F ]]
\begin{tikzpicture}[every node/.style={single arrow, draw}, rotate border/.style={shape border uses incircle, shape border rotate=#1}]
  \node {第三步推導};
\end{tikzpicture}
\Tree [.E E op1 [.T [.F ( E ) ]]]
\begin{tikzpicture}[every node/.style={single arrow, draw}, rotate border/.style={shape border uses incircle, shape border rotate=#1}]
  \node {……};
\end{tikzpicture}

\centerline{圖3-2 構造語法樹示意圖}

\end{document}

3. 效果


4. 注意事項:

  • 在右中括號與字元之間一定要有空格,例如程式碼\Tree [.E E op1 [.T F ]],其中的F與]之間一定要有空格,否則編譯報錯。
  • 如果節點名稱比較長,需要多行時,可以使用大括號包含來表示,否則會被當作子節點處理。