我使用 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}