Ich muss ein „erweitertes“ UML-Diagramm für Problemrahmen zeichnen. Zu diesem Zweck habe ich tikz-uml installiert (weil ich tikz auch für andere Zeichnungen verwende).
Meine Pakete benötigen ein Stereotyp, aber die Tikz-UML-Dokumente sagen nichts darüber. Ich hätte gerne ein Typattribut, um ein Stereotyp zu definieren. Der folgende Code wird nicht kompiliert.
\tikzset{
type/.style={%
draw,
font={\guillemotleft #1 \guillemotright \\}}
}
\begin{tikzpicture}
\begin{umlpackage}[type=contextDiagram,x=0,y=0]{package-name}
\end{umlpackage}
\end{tikzpicture}
Das ist also, was ich erreichen möchte:
Oder gibt es ein anderes Paket, das leistungsfähiger ist?
Danke.
Antwort1
Das ist hässlich, weil es die Neudefinition einer ziemlich komplexen Umgebung erfordert, die nicht dafür konzipiert wurde (herkömmliches UML verfügt nicht über Stereotypen für Pakete). Aber es erfüllt seinen Zweck.
Ich gehe davon aus, dass die Version v1.0b (01. Februar 2013) von tikz-uml
zum Download verfügbar istHier.
Der hinzugefügte Code wird größtenteils aus dem entsprechenden Code in der Definition des internen \umlclass
Befehls übernommen, dertutStereotypen unterstützen.
\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}
Sie könnten erwägen,pgf-umlcd
stattdessen. Es scheint viele der gleichen Dinge zu unterstützen wie tikz-uml
, ist aber pgf-umlcd
auf CTAN (offizieller zugänglich) und hat im letzten Jahr Entwickleraktivität (nicht großartig, ich weiß, aber das Gleiche kann man von nicht sagen tikz-uml
). pgf-umlcd
Unterstützt jedoch auch keine Paketstereotypen, daher wären auch hier Änderungen erforderlich.
Antwort2
Ich habe diese Funktion zu tikz-uml hinzugefügt. Eine neue Version wird bald verfügbar sein. Ich war bisher ziemlich weit weg von tikz-uml, aber das Paket wird wieder verfügbar sein.