LaTeX绘制UML图形宏包开发过程记录001

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LaTeX绘制UML图形宏包开发过程记录001相关的知识,希望对你有一定的参考价值。

因为工作需要,我在使用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设置命令 ------

ewcommand{setKeys}[1]{%
  pgfkeys{/keys/.cd,#1}%
}%

  这里定义一个命令(我更愿意把其称为函数):setKeys。作用就是读取用户输入的字符串,例如:setKeys{name = employee}。

% ------ 定义key获取命令 ------

ewcommand{getKeys}[1]{%
  pgfkeysvalueof{/keys/#1}%
}%

  这里定义命令:getKeys。实际上就是从前面读入的字符串中提取指定的关键字对应的内容,例如:getKeys{name}。结果就是把employee提取出来了。
  
3. 灵活使用ifthen宏包
  有了这个宏包,我们就可以进行逻辑判断了,内容请看相关参考文档,这里发一份示例:

ifthenelse{equal{}{getKeys{above right}}}{}{
enewcommand{
elativePosion}{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}%
%
%
egin{document}%
  egin{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的主要内容,如果未能解决你的问题,请参考以下文章

在LaTeX中使用tikz宏包及其扩展包共同绘制UML图

LaTeX宏包TikZ-UML使用备忘一

LaTeX绘制UML类图备忘

LuaLaTeX的中文支持设置与简单示例

在LaTeX中使用tikz宏包及其扩展包共同绘制UML图之备忘二

LuaLaTeX的中文支持设置与简单示例