我尝试设计一个类图tikz-uml
:
\documentclass{article}
\usepackage{tikz-uml}
\begin{document}
\begin{tikzpicture}
\umlemptyclass[type=interface ]{java.util.Collection}
\umlemptyclass[type=interface, y=-4, x=-3]{java.util.List}
\umlemptyclass[type=interface, y=-4, x=0]{java.util.Queue}
\umlemptyclass[type=interface, y=-4, x=3]{java.util.Set}
% \umldep{java.util.List}{java.util.Collection}
% \umldep{java.util.Queue}{java.util.Collection}
% \umldep{java.util.Set}{java.util.Collection}
\end{tikzpicture}
\end{document}
上面的这个有效,但是当我尝试定义一个依赖项时
\umldep{java.util.List}{java.util.Collection}
我收到以下错误:
Package pgf Error: No shape named java is known. ...ldep{java.util.List}{java.util.Collection}
问题可能出在 中的点上java.util.List
,不是吗?但我不知道如何修复它。
感谢您的帮助!
答案1
该tikz-uml
包使用节点的标签文本作为内部节点名称。在 TikZ/pgf 中,某些字符在节点名称中是不允许的或有问题的,例如.
或,
或:
。tikz-uml
因此,在内部,在处理节点名称时会进行一些替换。您可以添加额外的替换,以便.
能够在类依赖项中引用这些节点。
至少,您需要编辑tikz-uml.sty
1.0 版第 457 行左右的内容,其中定义了通用类节点名称替换。将代码修改为类似于
\StrSubstitute{\tikzumlClassNodeName}{:}{@COLON@}[\tikzumlClassNodeName]%
\StrSubstitute{\tikzumlClassNodeName}{.}{-}[\tikzumlClassNodeName]%
\StrSubstitute{\tikzumlClassNodeName}{\_}{@UNDERSCORE@}[\tikzumlClassNodeName]%
仅在创建节点时替换.
为-
。要引用这些节点,您应该使用替换的字符串。
修改后的 MWE:
\documentclass{article}
\usepackage{tikz-uml}
\begin{document}
\begin{tikzpicture}
\umlemptyclass[type=interface ]{java.util.Collection}
\umlemptyclass[type=interface, y=-4, x=-3]{java.util.List}
\umlemptyclass[type=interface, y=-4, x=0]{java.util.Queue}
\umlemptyclass[type=interface, y=-4, x=3]{java.util.Set}
\umldep{java-util-List}{java-util-Collection}
\umldep{java-util-Queue}{java-util-Collection}
\umldep{java-util-Set}{java-util-Collection}
\end{tikzpicture}
\end{document}
结果:
etoolbox
可以通过使用/包含来自您自己文档的额外代码xpatch
以及修补其他节点名称宏来改进此方法,以便能够在\umldep
命令和类似命令中使用点。另一种选择(更简洁)是重写tikz-uml
一些代码以接受可选节点名称,该节点名称可以不同于文本标签。