LaTeX繪制UML圖形宏包開發過程記錄001
阿新 • • 發佈:2019-01-05
latex 繪制圖形 rectangle 函數 int getname dev ext 字符串 因為工作需要,我在使用LaTeX編輯文件時經常要繪制UML圖形。雖然目前LaTeX有一些宏包支持繪制UML圖形,但總有這樣那樣的小問題,使用起來不是那麽滿意,所以想自己創建一個專門的宏包來繪制UML圖形。一方面可以加深對LaTeX的了解,另一方面也給工作上帶來便利。
LaTeX宏包中的TikZ繪圖宏包,功能很強大,LaTeX編輯的文檔中很多都用其來繪制圖形,所以我自然也以此宏包為基礎來編寫。本項目是從2019年1月1日在電腦上開始的,傳入騰訊雲開發者平臺是2019年1月3日開始,地址是lakeside-tikz-uml項目。有興趣的朋友可以去看看。我學習使用LaTeX的時間還很短,所以在編寫中會存在許多不足之處,請予指正。
從今天開始我將陸續在51CTO博客中記錄下開發過程中遇到的問題、解決辦法,以及一些心得體會。有興趣的朋友可以發郵件與我一起交流,
1. LaTeX宏包的編寫格式
2. 靈活使用pgfkeys功能
通過在網上看別人寫的代碼,了解到pgfkeys的使用方法。目前,我就是把pgfkeys當作字符串函數來用,使用方法是先定義關鍵字(可設置默認值),然後讀取用戶輸入的字符流,再從中提取指定關鍵字的內容,示例如下:
LaTeX宏包中的TikZ繪圖宏包,功能很強大,LaTeX編輯的文檔中很多都用其來繪制圖形,所以我自然也以此宏包為基礎來編寫。本項目是從2019年1月1日在電腦上開始的,傳入騰訊雲開發者平臺是2019年1月3日開始,地址是lakeside-tikz-uml項目。有興趣的朋友可以去看看。我學習使用LaTeX的時間還很短,所以在編寫中會存在許多不足之處,請予指正。
1. LaTeX宏包的編寫格式
\NeedsTeXFormat{LaTeX2e}[2007/10/19]%
\ProvidesPackage{lakeside-tikz-uml}[2019/01/01]%
% 需求的宏包
\RequirePackage{tikz}% 繪圖包
\RequirePackage{xcolor}% 色彩包
\RequirePackage{calc}% 計算包
\RequirePackage{ifthen}% 條件包
...
一開始我習慣性的在日期中使用減號,結果報錯,後面才註意到是日期分隔符的問題。宏包文件的擴展名是sty。
2. 靈活使用pgfkeys功能
通過在網上看別人寫的代碼,了解到pgfkeys的使用方法。目前,我就是把pgfkeys當作字符串函數來用,使用方法是先定義關鍵字(可設置默認值),然後讀取用戶輸入的字符流,再從中提取指定關鍵字的內容,示例如下:
\pgfkeys{%
/keys/.cd,%
name/.initial = #2,% 類名,默認與顯示名稱一樣
attr/.initial =,% 屬性
meth/.initial =,% 方法
...
}
這個是存放需要使用的關鍵字,其中/keys/.cd這一行是默認起始代碼,並不是要使用的關鍵字,必須有,keys可以用其他名字代替。
% ------ 定義key設置命令 ------
\newcommand{\setKeys}[1]{%
\pgfkeys{/keys/.cd,#1}%
}%
這裏定義一個命令(我更願意把其稱為函數):\setKeys。作用就是讀取用戶輸入的字符串,例如:\setKeys{name = employee}。
% ------ 定義key獲取命令 ------
\newcommand{\getKeys}[1]{%
\pgfkeysvalueof{/keys/#1}%
}%
這裏定義命令:\getKeys。實際上就是從前面讀入的字符串中提取指定的關鍵字對應的內容,例如:\getKeys{name}。結果就是把employee提取出來了。
3. 靈活使用ifthen宏包
有了這個宏包,我們就可以進行邏輯判斷了,內容請看相關參考文檔,這裏發一份示例:
\ifthenelse{\equal{}{\getKeys{above right}}}{}{\renewcommand{\relativePosion}{above right}}%
4. rectangle split形狀的最小高度問題
rectangle split形狀分為橫排與豎排兩種方式,默認是豎排。豎排情況下,最小高度參數minimum height無效。一般情況下,我們只是在簡單類下需要設定最小高度,這種情況下圖形只有一層,所以我的處理辦法就是把排列方式設置成橫排,然後最小高度參數就有效了。
5. 默認配色方案
我選用的默認配色方案是參照Rational Rose上面的,但在使用中可以完全自己設置,例如下面示例中的代碼與效果。
現在只是寫完了類圖的繪制代碼,下面放上示例代碼與效果圖:
% 51CTO 陸巍的博客
\documentclass{article}%
\usepackage{geometry}%
% 漢字支持
\usepackage{xeCJK}%
% 我的UML繪圖宏包
\usepackage{/mydata/my_opensource/lakeside-tikz-uml/lakeside-tikz-uml}%
%
%
\begin{document}%
\begin{tikzpicture}%
\umlClass[%
draw = red,%
text color = red!50!black,%
part1 fill = red!30!white,%
part2 fill = red!20!white,%
part3 fill = red!10!white,%
name = employee,%
attr = - name\\ - age,%
meth = + setName()\\ + getName()\\ + setAge()\\ + getAge(),%
]{Development Employee}%
\umlClass[%
right = 2cm of employee,%
draw = green,%
text color = green!50!black,%
part1 fill = green!30!white,%
part2 fill = green!20!white,%
part3 fill = green!10!white,%
name = addEmployee,%
attr = - name\\ - address,%
meth = + validate()\\ + execute(),%
]{AddEmployee Transaction}%
\umlInterface[%
x = 3cm,%
y = -4cm,%
draw = blue,%
text color = blue!50!black,%
part1 fill = blue!30!white,%
part2 fill = blue!20!white,%
part3 fill = blue!10!white,%
name = addEmployee1,%
meth = + validate()\\ + execute(),%
]{AddEmployee Transaction}%
\umlClass[%
below right = 2cm of addEmployee,%
type = <<anonymous>>\\,%
name = listener,%
]{Document Listener}%
\end{tikzpicture}%
\end{document}%
效果如下:
目前,\umlClass類圖繪制命令有22個參數可用,以後慢慢完善。在我的代碼托管倉庫中有說明文檔(也是用LaTeX寫的)。接下來的工作就是編寫關系表示線段的繪制命令。
LaTeX繪制UML圖形宏包開發過程記錄001