Wie füge ich in tikz-uml ein Paketstereotyp hinzu?

Wie füge ich in tikz-uml ein Paketstereotyp hinzu?

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:

UML-Diagramm mit einem ContextDiadgram-Paket

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-umlzum Download verfügbar istHier.

Der hinzugefügte Code wird größtenteils aus dem entsprechenden Code in der Definition des internen \umlclassBefehls ü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}

Bildbeschreibung hier eingeben

Sie könnten erwägen,pgf-umlcdstattdessen. Es scheint viele der gleichen Dinge zu unterstützen wie tikz-uml, ist aber pgf-umlcdauf 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-umlcdUnterstü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.

verwandte Informationen