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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在LaTeX中使用tikz宏包及其扩展包共同绘制UML图相关的知识,希望对你有一定的参考价值。

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}{方正书宋简体}

ewcommand{song}{CJKfamily{song}}
setCJKfamilyfont{kaiti}{方正楷体简体}

ewcommand{kaiti}{CJKfamily{kaiti}}
setCJKfamilyfont{heiti}{方正黑体简体}

ewcommand{heiti}{CJKfamily{heiti}}

% 绘图支持
usepackage{tikz}
usetikzlibrary{arrows, positioning, shapes}

% UML绘图支持
% tikz-uml宏包并不在texlive中,需要单独下载
% 下载后可放在自己定义的文件夹内,并在调用时指明完整路径
usepackage{/mydata/latex_package/tikzuml/tikz-uml}

% 设置断字参数,数值越大,出现断字的情况越少
hyphenpenalty = 1000

% 定义uml基本图形
	ikzstyle{basic_class} = [rectangle split, draw = purple, fill = umlyellow, text width = 3cm, rectangle split parts = 1, text centered]

% ------------------ 开始 -------------------

egin{document}
  heitilarge 示例一song
ormalsize
  egin{center}
    egin{tikzpicture}
      
ode(AddEmployee)[basic_class, rectangle split parts = 2]{
        AddEmployee Transaction
        
odepart{second}
        egin{flushleft}
          - Name          - EmployeeId          - Address
        end{flushleft}
      };
      
ode(AddHourly)[below left = of AddEmployee, basic_class]{
        AddHourly Employee Transaction
      };
      
ode(AddCommissioned)[below = of AddEmployee, basic_class]{
        AddCommissioned Employee Transaction
      };
      
ode(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内的文字会居中排列,所以这里单独对属性进行左对齐处理。多行时使用egin{flushleft}来处理,如果只有一行的话可以使用leftline{}命令。与leftline相对应的对齐命令还有centerline{}与 ightline{},这三个命令都有一个特点,就是只能处理一行,不能在里面换行,强制换行也不行,会出错。估计tikz-uml宏包中的umlclass使用的是centerline命令来居中排列名称,所以造成无法换行。
  7) 箭头线段使用的是tikz-uml提供的命令,这里使用起来比较简单方便。
  8) 名称换行后显然比全部排在一行要好看,大家可以和我前面发的博客比较。

以上是关于在LaTeX中使用tikz宏包及其扩展包共同绘制UML图的主要内容,如果未能解决你的问题,请参考以下文章

LaTeX宏包TikZ-UML使用备忘一

利用TikZ 宏包在 LaTeX 中绘制流程图

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

LaTeX中的TikZ宏包绘图简单示例

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

TeX系列: tikz-3dplot绘图宏包