Search code examples
latexclass-diagramtikz

Getting even space between classes in tikzuml


Consider the following class diagram:

\documentclass{article}
\usepackage{geometry}
\usepackage{graphicx}
\usepackage{amssymb}
\usepackage{amsmath}
\usepackage{amsthm}
\usepackage{empheq}
\usepackage{mdframed}
\usepackage{booktabs}
\usepackage{lipsum}
\usepackage{graphicx}
\usepackage{color}
\usepackage{psfrag}
\usepackage{pgfplots}
\usepackage{bm}
\usepackage{tikz}
\usepackage{tikz-uml}


\begin{document}

\begin{figure}[h!]
    \centering
    \begin{tikzpicture}
    \umlclass[]{Class1}
    {
        
    }
    {

    }
    \umlinterface[y=4]{Class2}{}
    {
        + createDocument(doc: str) : str \\
        + resolveDocument(id: str) : str \\
        + updateDocument(doc: str) : str \\
        + deleteDocument(id: str) : str \\
        + createStatusList(sl: str) \\
        + resolveStatusList(id: str) \\
        + updateStatusList(sl: str) \\
        + deleteStatusList(id: str)
    }
    \umlclass[x=-2,y=-3]{Class33333333333333333333333}{}{}
    \umlclass[x=3,y=-3]{Class4}{}{}
    
    \umlinherit{Class1}{Class2}
    \umlaggreg[geometry=|-|]{Class1}{Class33333333333333333333333}
    \umlaggreg[geometry=|-|]{Class1}{Class4}
\end{tikzpicture}
\end{figure}
    
\end{document}

Since Class3 is bigger in size I had to add a unit for the x coordinate of Class2 to keep some space between the two. Is this the correct approach? How can I get even space between classes by not playing with coordinates? Every time a class changes in size I often need to redefine many coords. Also, how to fix the alignment of the two classes in respect of Class 1?

enter image description here


Solution

  • You can use relative positioning from the TikZ positioning library:

    \documentclass{article}
    \usepackage{geometry}
    \usepackage{graphicx}
    \usepackage{amssymb}
    \usepackage{amsmath}
    \usepackage{amsthm}
    \usepackage{empheq}
    \usepackage{mdframed}
    \usepackage{booktabs}
    \usepackage{lipsum}
    \usepackage{graphicx}
    \usepackage{color}
    \usepackage{psfrag}
    \usepackage{pgfplots}
    \usepackage{bm}
    \usepackage{tikz}
    \usepackage{tikz-uml}
    
    \usetikzlibrary{positioning}
    
    
    \begin{document}
    
    \begin{figure}[h!]
        \centering
        \begin{tikzpicture}
        \umlinterface{Class2}{}
        {
            + createDocument(doc: str) : str \\
            + resolveDocument(id: str) : str \\
            + updateDocument(doc: str) : str \\
            + deleteDocument(id: str) : str \\
            + createStatusList(sl: str) \\
            + resolveStatusList(id: str) \\
            + updateStatusList(sl: str) \\
            + deleteStatusList(id: str)
        }
        \umlclass[below=1cm of Class2]{Class1}
        {
            
        }
        {
    
        }
    
        \umlclass[below left=2cm and 0.5cm of Class1]{Class33333333333333333333333}{}{}
        \umlclass[below right=2cm and 0.5cm of Class1]{Class4}{}{}
        
        \umlinherit{Class1}{Class2}
        \umlaggreg[geometry=|-|]{Class1}{Class33333333333333333333333}
        \umlaggreg[geometry=|-|]{Class1}{Class4}
    \end{tikzpicture}
    \end{figure}
        
    \end{document}
    

    enter image description here