关于使用pgf-umlcd进行UML类图相关的一个问题

关于使用pgf-umlcd进行UML类图相关的一个问题

我使用 Xu Yuan 编写的 pgf-umlcd 包(参见http://code.google.com/p/pgf-umlcd/) 来编写 UML 类图。它很容易使用 - 但是有一个错误,我不知道如何修复。

在下面的代码片段中,有一个关于 System.Lang 包的描述,编译该文件会导致出现错误消息:

!Package pgf Error: No shape named System is known....

\documentclass{minimal}
%%%% Tikz pictures
\usepackage{tikz} 
%%%% UML Class Diagrams
\usepackage[simplified]{pgf-umlcd} 
\begin{document}
\begin{tikzpicture}%[show background grid]
\begin{package}{System.Lang} % <<<<-------- The problem is here!

    \begin{interface}{ISet}{7,0}
        \attribute{NoOfItems}
        \operation{Add(element)}
    \end{interface}

\end{package}
\end{tikzpicture} 
\end{document}

我尝试过一些不方便的解决方法,比如也绘制 System 包 - 但那也不起作用。目前我只使用子文件夹名称而不是 System.Lang,这会导致新的问题,因为“反向根”的名称在我使用的系统中不是唯一的。

有任何想法吗?

答案1

这是由于包名称中的句点造成的System.Lang。该名称也用于命名包节点。但是在 TikZ 中,句点用于将节点名称与锚点分隔开,因此不能在名称本身中使用句点。

作为修复,您可以为package环境引入一个可选参数,该参数将用作节点名称而不是显示的包名称。

如果你添加

\renewenvironment{package}[2][\umlcdPackageTitle]{
\edef\umlcdPackageTitle{#2}
\def\umlcdPackageFit{}
\def\umlcdPackageName{#1}
}{
  \begin{pgfonlayer}{background}
  \node[umlcd style, draw, inner sep=0.5cm, fit = \umlcdPackageFit] (\umlcdPackageName) {};
  \node[umlcd style, draw, outer ysep=-0.5, anchor=south west] (\umlcdPackageName caption) at
  (\umlcdPackageName.north west) {\umlcdPackageTitle};
  \end{pgfonlayer}
}

在你的序言中,你可以使用创建一个新的包

\begin{package}[SystemLang]{System.Lang}

其中SystemLang是可用于绘制连接的内部节点名称,例如,System.Lang是将在包标题中使用的文本。正常语法\begin{package}{<package title>}也仍然有效。

\documentclass{minimal}
%%%% Tikz pictures
\usepackage{tikz} 
%%%% UML Class Diagrams
\usepackage[simplified]{pgf-umlcd} 

\renewenvironment{package}[2][\umlcdPackageTitle]{
\edef\umlcdPackageTitle{#2}
\def\umlcdPackageFit{}
\def\umlcdPackageName{#1}
}{
  \begin{pgfonlayer}{background}
  \node[umlcd style, draw, inner sep=0.5cm, fit = \umlcdPackageFit] (\umlcdPackageName) {};
  \node[umlcd style, draw, outer ysep=-0.5, anchor=south west] (\umlcdPackageName caption) at
  (\umlcdPackageName.north west) {\umlcdPackageTitle};
  \end{pgfonlayer}
}


\begin{document}
\begin{tikzpicture}%[show background grid]
\begin{package}[SystemLang]{System.Lang} % <<<<-------- The problem is here!

    \begin{interface}{ISet}{7,0}
        \attribute{NoOfItems}
        \operation{Add(element)}
    \end{interface}

\end{package}

\end{tikzpicture} 
\end{document}

相关内容