1. 程式人生 > >LaTeX繪制UML圖形宏包開發過程記錄001

LaTeX繪制UML圖形宏包開發過程記錄001

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宏包的編寫格式

\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