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) 名称换行后显然比全部排在一行要好看,大家可以和我前面发的博客比较。
原文地址:http://blog.51cto.com/14013986/2336815