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的主要内容,如果未能解决你的问题,请参考以下文章