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}
效果如下:
說明:
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) 名稱換行後顯然比全部排在一行要好看,大家可以和我前面發的博客比較。