1. 程式人生 > >在LaTeX中使用tikz巨集包及其擴充套件包共同繪製UML圖

在LaTeX中使用tikz巨集包及其擴充套件包共同繪製UML圖

  LaTeX巨集包tikz的繪圖功能很強,完全可以繪製UML的各種圖形,並且在tikz的基礎上擴展出不少這方面的巨集包。前面我介紹過巨集包tikz-uml,這個巨集包功能不錯,只是外觀上略微有些不足。所以我現在還是立足於tikz的基礎功能,結合tikz-uml巨集包一起繪製UML圖。
  下面直接給出示例程式碼、效果圖與說明。
 
作業系統:Ubuntu 16.04 64位桌面版
LaTeX工具:TeXstudio 2.10.8
 
示例一

% 51CTO陸巍的部落格
\documentclass[oneside, AutoFakeBold]{article}

\usepackage{geometry}          % 用於頁面設定
% 設定為A4紙,並按照MSOffice的預設尺寸設定四周邊距
\geometry{
  a4paper,
  left = 3.17cm,
  right = 3.17cm,
  top = 2.54cm,
  bottom = 2.54cm
}

% 顏色支援
\usepackage[dvipsnames, svgnames, x11names]{xcolor}
% 定義uml圖形底色.注意:內建pdf閱讀器的色彩顯示不準確,要以外部的pdf閱讀器為準.
% uml圖形的邊框、線段的顏色使用基礎色中的purple。
\definecolor{umlyellow}{RGB}{255, 251, 214}

% 漢字支援
\usepackage{xeCJK}
% 設定字型。注意順序,第一個定義的就是預設字型
\setCJKfamilyfont{song}{方正書宋簡體}
\newcommand{\song}{\CJKfamily{song}}
\setCJKfamilyfont{kaiti}{方正楷體簡體}
\newcommand{\kaiti}{\CJKfamily{kaiti}}
\setCJKfamilyfont{heiti}{方正黑體簡體}
\newcommand{\heiti}{\CJKfamily{heiti}}

% 繪圖支援
\usepackage{tikz}
\usetikzlibrary{arrows, positioning, shapes}

% UML繪圖支援
% tikz-uml巨集包並不在texlive中,需要單獨下載
% 下載後可放在自己定義的資料夾內,並在呼叫時指明完整路徑
\usepackage{/mydata/latex_package/tikzuml/tikz-uml}

% 設定斷字引數,數值越大,出現斷字的情況越少
\hyphenpenalty = 1000

% 定義uml基本圖形
\tikzstyle{basic_class} = [rectangle split, draw = purple, fill = umlyellow, text width = 3cm, rectangle split parts = 1, text centered]

% ------------------ 開始 -------------------

\begin{document}
  \heiti\large 示例一\song\normalsize
  \begin{center}
    \begin{tikzpicture}
      \node(AddEmployee)[basic_class, rectangle split parts = 2]{
        AddEmployee Transaction
        \nodepart{second}
        \begin{flushleft}
          - Name\\
          - Employeeid\\
          - Address
        \end{flushleft}
      };
      \node(AddHourly)[below left = of AddEmployee, basic_class]{
        AddHourly Employee Transaction
      };
      \node(AddCommissioned)[below = of AddEmployee, basic_class]{
        AddCommissioned Employee Transaction
      };
      \node(AddSalaried)[below right = of AddEmployee, basic_class]{
        AddSalaried Employee Transaction
      };
      \umlVHVinherit[arm1 = 1.2cm, draw = purple]{AddHourly}{AddEmployee}
      \umlinherit[draw = purple]{AddCommissioned}{AddEmployee}
      \umlVHVinherit[arm1 = 1.2cm, draw = purple]{AddSalaried}{AddEmployee}
    \end{tikzpicture}
    \\[0.4cm]\heiti 圖18.1 AddEmployeeTransaction類層次結構\song
  \end{center}
\end{document}

效果如下:
在LaTeX中使用tikz巨集包及其擴充套件包共同繪製UML圖
說明:
  1) 這個示例中使用了tikz的擴充套件巨集包tikz-uml,相關的下載在前面的部落格中有介紹,這裡不再贅述。
  2) 這裡的類圖並未使用tikz-uml中的\umlclass來繪製,這是因為在名稱上umlclass繪製方法不能換行,這樣就造成長名稱的class圖不好看。
  3) 名稱basic_class中的下劃線在TeXstudio中會提示錯誤,但在編譯時不會有問題。之所以用下劃線是受我在C++程式設計中使用的Google風格的影響,已經習慣這樣命名了。
  4) 注意basic_class定義語句中的rectangle split,這個用來分欄。
  5) 注意\hyphenpenalty = 1000語句,沒有的話系統會自動對英文單詞斷字,那樣就不好看了。
  6) 因為在定義basic_class時使用了text centered語句,所以node內的文字會居中排列,所以這裡單獨對屬性進行左對齊處理。多行時使用\begin{flushleft}來處理,如果只有一行的話可以使用\leftline{}命令。與\leftline相對應的對齊命令還有\centerline{}與\rightline{},這三個命令都有一個特點,就是隻能處理一行,不能在裡面換行,強制換行也不行,會出錯。估計tikz-uml巨集包中的\umlclass使用的是\centerline命令來居中排列名稱,所以造成無法換行。
  7) 箭頭線段使用的是tikz-uml提供的命令,這裡使用起來比較簡單方便。