程序包 pgf 错误:没有已知的名为 java 的形状 - 名称中的点存在问题

程序包 pgf 错误:没有已知的名为 java 的形状 - 名称中的点存在问题

我尝试设计一个类图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.sty1.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一些代码以接受可选节点名称,该节点名称可以不同于文本标签。

相关内容