我需要为问题框架绘制一个“扩展”的 uml 图。为此,我安装了 tikz-uml(因为我还使用 tikz 进行其他绘图)。
我的包需要一个原型,但 tikz-uml 文档对此只字未提。我希望有一个 type 属性来定义原型。下面的代码无法编译。
\tikzset{
type/.style={%
draw,
font={\guillemotleft #1 \guillemotright \\}}
}
\begin{tikzpicture}
\begin{umlpackage}[type=contextDiagram,x=0,y=0]{package-name}
\end{umlpackage}
\end{tikzpicture}
这就是我想要实现的目标:
或者有其他更强大的软件包吗?
谢谢。
答案1
这很丑陋,因为它需要重新定义一个相当复杂的环境,而这个环境并不是为此而设计的(传统的 UML 不会有包的刻板印象)。但它完成了工作。
我认为是 v1.0b 版本(2013 年 2 月 1 日)tikz-uml
,可供下载这里。
添加的代码大部分借鉴了内部命令定义中的等效代码\umlclass
,做支持刻板印象。
\documentclass{standalone}
\usepackage[T1]{fontenc} % for guillemots (package doc uses babel to fake them)
\usepackage{tikz-uml}
\makeatletter
\renewenvironment{umlpackage}[2][]{%
\pgfkeys{/tikzuml/package/.cd,%
x/.initial=0, y/.initial=0,%
name/.initial=tikzumlEmpty, draw/.initial=\tikzumldrawcolor, type/.initial=\empty,%
fill/.initial=\tikzumlfillpackagecolor, text/.initial=\tikzumltextcolor,%
.unknown/.code={%
\let\keyname=\pgfkeyscurrentname%
\errmessage{TIKZUML ERROR : in umlpackage, invalid option \keyname}%
}}%
\pgfkeys{/tikzuml/package/.cd, #1}%
\pgfkeys{/tikzuml/package/.cd,%
x/.get=\xshift, y/.get=\yshift, name/.get=\tikzumlpackagename,%
draw/.get=\tikzumlpackagedraw, fill/.get=\tikzumlpackagefill,%
text/.get=\tikzumlpackagetext, type/.get=\umlpackagetype,}%
%
\ifthenelse{\equal{\umlpackagetype}{}}{%
\def\tikzumlpackagetype{}%
}{%
\def\tikzumlpackagetype{\guillemotleft\umlpackagetype\guillemotright \\}%
}%
\ifnum\thetikzumlPackageLevel>0%
\let\tikzumlPackage@nameold\tikzumlPackage@fitname%
\def\tikzumlPackage@name{#2}%
\begingroup%
\def\_{@}\edef\x{\endgroup%
\def\noexpand\tikzumlPackage@fitname{\tikzumlPackage@name}}\x%
\let\tikzumlPackage@parentold\tikzumlPackage@parent%
\edef\tikzumlPackage@parent{\tikzumlPackage@parentold @@\tikzumlPackage@nameold}%
\else%
\def\tikzumlPackage@parent{}%
\def\tikzumlPackage@name{#2}%
\begingroup%
\def\_{@}\edef\x{\endgroup%
\def\noexpand\tikzumlPackage@fitname{\tikzumlPackage@name}}\x%
\fi%
%
\let\tikzumlPackage@nodeNameold\tikzumlPackage@nodeName%
%
\begingroup%
\def\_{_}\edef\x{\endgroup%
\def\noexpand\tikzumlPackage@nodeName{\tikzumlPackage@name}}\x%
%
\ifthenelse{\equal{\tikzumlpackagename}{tikzumlEmpty}}{}{%
\def\tikzumlPackage@nodeName{\tikzumlpackagename}%
}%
%
\StrSubstitute{\tikzumlPackage@nodeName}{.}{@POINT@}{\tikzumlPackage@nodeName}%
%
\expandafter\gdef\csname tikzumlPackageFit\tikzumlPackage@parent @@\tikzumlPackage@fitname\endcsname{}%
%
\setcounter{tikzumlPackageClassNum}{0}%
\setcounter{tikzumlPackageSubPackageNum}{0}%
\stepcounter{tikzumlPackageLevel}%
%
\begin{scope}[xshift=\xshift cm, yshift=\yshift cm]%
}{%
\addtocounter{tikzumlPackageLevel}{-1}%
\begin{pgfonlayer}{package\thetikzumlPackageLevel}%
%
% if contains no class, one define a fictive node to enable the fit option
\ifnum\c@tikzumlPackageClassNum=0%
\ifnum\c@tikzumlPackageSubPackageNum=0%
\node[inner sep=1.5ex] (\tikzumlPackage@nodeName-root) at (0,0) {\phantom{\tikzumlPackage@nodeName}};%
\expandafter\xdef\csname tikzumlPackageFit\tikzumlPackage@parent @@\tikzumlPackage@fitname\endcsname{(\tikzumlPackage@nodeName-root)}%
%
\fi%
\fi%
%
\ifnum\c@tikzumlPackageLevel>0%
\def\tikzumlPackageFitTmp{\csname tikzumlPackageFit\tikzumlPackage@parent\endcsname}%
\expandafter\xdef\csname tikzumlPackageFit\tikzumlPackage@parent\endcsname{\tikzumlPackageFitTmp (\tikzumlPackage@nodeName) (\tikzumlPackage@nodeName-caption)}%
\stepcounter{tikzumlPackageSubPackageNum}%
\fi%
%
\node[draw=\tikzumlpackagedraw, fill=\tikzumlpackagefill, text=\tikzumlpackagetext, font=\tikzumlfont, inner sep=1.5ex, fit = \csname tikzumlPackageFit\tikzumlPackage@parent @@\tikzumlPackage@fitname\endcsname] (\tikzumlPackage@nodeName) {};%
\node[draw=\tikzumlpackagedraw, fill=\tikzumlpackagefill, text=\tikzumlpackagetext, font=\tikzumlfont, minimum height=1.5em, outer ysep=-0.3, anchor=south west,align=center] (\tikzumlPackage@nodeName-caption) at (\[email protected] west) {\tikzumlpackagetype \textbf{\tikzumlPackage@name}};%
\end{pgfonlayer}%
\end{scope}%
}%
\makeatother
\tikzumlset{font={\small\sffamily}}
\begin{document}
\begin{tikzpicture}
\begin{umlpackage}[x=0,y=0,type=contextDiagram]{package-name}
\end{umlpackage}
\begin{umlpackage}[x=5,y=0]{package-name-no-type}
\end{umlpackage}
\end{tikzpicture}
\end{document}
您可以考虑使用pgf-umlcd
相反。它看起来支持许多与 相同的功能tikz-uml
,但它pgf-umlcd
位于 CTAN(更正式的可访问性)上,并且去年有开发人员活动(我知道这不是很好,但 的情况并非如此tikz-uml
)。但是,pgf-umlcd
也不支持包定型,因此也需要对其进行修改。
答案2
我将此功能添加到 tikz-uml。新版本即将推出。到目前为止,我还没有使用过 tikz-uml,但该软件包将再次上线。