tikz-uml にパッケージ ステレオタイプを追加するにはどうすればいいですか?

tikz-uml にパッケージ ステレオタイプを追加するにはどうすればいいですか?

問題のあるフレームの「拡張」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 図Diadgram パッケージ

それとも、もっと強力な別のパッケージがあるのでしょうか?

ありがとう。

答え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-umlcdCTAN に登録されており (より公式にアクセスしやすい)、過去 1 年間に開発者の活動がありました (あまり良くないことは承知していますが、 については同じことが言えませんtikz-uml)。ただし、pgf-umlcdはパッケージ ステレオタイプもサポートしていないため、ここでも変更が必要になります。

答え2

この機能を tikz-uml に追加しました。新しいリリースがまもなく利用可能になります。私はこれまで tikz-uml からかなり離れていましたが、パッケージは再び復活します。

関連情報