在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提供的命令,這裏使用起來比較簡單方便。
  8) 名稱換行後顯然比全部排在一行要好看,大家可以和我前面發的博客比較。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章