Как добавить стереотип пакета в tikz-uml?

Как добавить стереотип пакета в tikz-uml?

Мне нужно нарисовать "расширенную" UML-диаграмму для проблемных кадров. Для этого я установил tikz-uml (т.к. я также использую tikz для других чертежей).

Моим пакетам нужен стереотип, но в документации tikz-uml об этом ничего не сказано. Мне бы хотелось иметь атрибут типа для определения стереотипа. Код ниже не компилируется.

\tikzset{
  type/.style={%
    draw,
    font={\guillemotleft #1 \guillemotright \\}}
}

\begin{tikzpicture} 
\begin{umlpackage}[type=contextDiagram,x=0,y=0]{package-name} 
\end{umlpackage} 
\end{tikzpicture}

Итак, вот чего я хочу добиться:

диаграмма uml с одним пакетом contextDiadgram

Или есть другой пакет, более мощный?

Спасибо.

решение1

Это некрасиво, потому что требует обновления определения довольно сложной среды, которая не была разработана для этого (традиционный UML не имел бы стереотипов для пакетов). Но это делает свою работу.

Я предполагаю, что версия v1.0b (01 февраля 2013 г.) 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, но пакет снова будет жить.

Связанный контент