为图形和继承定义“边类型”?

为图形和继承定义“边类型”?

我对 TikZ 还很陌生(但对 LaTeX 还不陌生),因为我目前正在写一篇重要的作品,其中我想使用一些不错的可扩展图形。
我目前的状态是,我可以用 定义节点类型\tikzset。我想对边做同样的事情,所以我需要边类型,因为我需要不同类型的边。

我想从我迄今为止所做的事情的一个简单的例子开始:

\documentclass{scrartcl}
\usepackage{tikz}
\usetikzlibrary{positioning}
\usetikzlibrary{arrows.meta}
\usetikzlibrary{shapes}
\usetikzlibrary{graphs}
\usetikzlibrary{quotes}

\begin{document}
\tikzset{
    role/.style = {rounded rectangle, minimum size=6mm, very thick, draw=blue!50,top color=white,bottom color=blue!20, font=\ttfamily\scriptsize,align=center,text=black},
    hv coll/.style = {to path={-| (\tikztotarget)}},
    vh coll/.style = {to path={|- (\tikztotarget)}},
}

\begin{tikzpicture}[node distance=5mm and 5mm,thick,black!50,graphs/every graph/.style={edges=rounded corners}]
    % nodes
    \node[role] (n1) {Node 1};
    \node[role] (n2) [below left=of n1] {Node 2};
    \node[role] (n3) [below right=of n1] {Node 3};
    \node[role] (n4) [below right=of n2] {Node 4};
    % connections
    \graph [use existing nodes] {
        n1 ->[hv coll] n3 ->[vh coll] n4;
        n1 ->[hv coll] n2 -> ["label" near end,font=\tiny] n3;
        n2 ->[vh coll] n4;
    };
\end{tikzpicture}

\end{document}

这里的所有边都相等。我希望有类似于 UML 边的边:组合、关联、继承和自己的其他边。我在节点之间尝试了n1以下n3内容:n1 {diamond}->[hv coll] n3

但在这里我得到了这个错误:No shape named n1 {diamond} is known

此外,我想知道如何在 中定义此类边,\tikzset以便我可以使用已定义的边名称(例如comp合成边)。然后,我还需要定义边标签的字体,因为必须避免对每条边重复指定(参见节点和near end,font=\tiny之间的标签)。n2n3

这是我关于边缘类型的问题的第一部分。

然后我想知道 TikZ 是否有继承概念。例如:样式hv旨在先绘制水平边缘,然后绘制垂直边缘。假设一个新的边缘类型comp,我该如何定义类似的东西hv comp而不复制/合并单独的定义(hvcomp)?这个问题总体上也很有趣。因此,例如,节点类型可以从其他节点类型继承。

答案1

我发现图表概念不太适合我的目的。我可以用定义path而不是来解决我的问题graph
以下是上面完全有效的更正示例:

\documentclass{scrartcl}

\usepackage{tikz}

\usetikzlibrary{positioning}
\usetikzlibrary{arrows.meta}
\usetikzlibrary{shapes}
\usetikzlibrary{graphs}
\usetikzlibrary{quotes}

\begin{document}

\tikzset{
    role/.style = {rounded rectangle, minimum size=6mm, very thick, draw=blue!50,top color=white,bottom color=blue!20, font=\ttfamily    \scriptsize,align=center,text=black},
    hv/.style = {to path={-| (\tikztotarget)}},
    vh/.style = {to path={|- (\tikztotarget)}},
    comp/.style = {Diamond-},
    ass/.style = {-{>[width=2pt 2]}},
    imp/.style = {-{Latex[open]}},
    proh/.style = {{Bar[sep=1pt]}-{Bar[sep=1pt]}}
}

\begin{tikzpicture}[node distance=5mm and 5mm,thick,
    every edge/.style={rounded corners,draw=black!50,font=\tiny,near end}]
    % nodes
    \node[role] (n1) {Node 1};
    \node[role] (n2) [below left=of n1] {Node 2};
    \node[role] (n3) [below right=of n1] {Node 3};
    \node[role] (n4) [below right=of n2] {Node 4};
    % connections
    \path
        (n1) edge[comp,hv] (n2)
        (n1) edge[comp,hv] (n3)
        (n2) edge[ass,"label"] (n3)
        (n4) edge[imp,hv] (n2)
        (n3) edge[proh,vh] (n4);
\end{tikzpicture}

\end{document}

边种类定义为\tikzsetcompassinhproh。其中,ass代表协会tikzpicture。此外,可以通过在其本身的配置中定义边标签的默认值every edge/.style

对于我来说这是一个可以接受的解决方案。

相关内容