如何在 tikz 中定义路径样式

如何在 tikz 中定义路径样式

我制作了一种使用 tikz 制作节点图的样式。我希望以某种方式格式化箭头,并使用格式化的文本作为标签。我的格式和 MWE 附在下面。

我想要将箭头样式定义为一个函数,该函数将接受三个输入:#1(起始节点)#2(终止节点)#3(标签文本)。此外,如果我想要一个像标签 2 中那样的弯曲箭头,它应该能够接受和的值,out in或者looseness我应该能够调整箭头代码,以便在只有三个输入的情况下将其变成弯曲的。 在此处输入图片描述

\documentclass{article}
\usepackage[svgnames]{xcolor}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows}
\usetikzlibrary{positioning}

\begin{document}

\tikzstyle{block} = [rectangle, fill=gray, text centered,
minimum height=8mm,node distance=10em,  rounded corners=1mm]

\begin{tikzpicture}

\node at (0,0) [block ] (n01) {Node 01};
\node at (3,-3) [block ] (n02) {Node 02};
\node at (-3,-3) [block ] (n03) {Node 03};


\path(n01) edge[ultra thick, -latex, draw=CornflowerBlue]
node[anchor=center,fill=white] {\textcolor{Tomato}{\textit{Label 1}}}(n02);

\path(n01) edge[ultra thick, -latex,draw=CornflowerBlue,out=270,in=90,looseness=.8]
node[anchor=center,fill=white]
 {\textcolor{Tomato}{\textit{Label 2}}} (n03);

\end{tikzpicture}

\end{document}

答案1

我认为您不应该为此创建带有参数的样式,主要是因为您创建的样式不会减少您仍然需要提供的参数数量。我只是建议一个更像 TikZ 的设置,并尝试阐明这个问题。

首先,\tikzstyle已弃用,现在应该使用 Key Handler 设置样式,/.style={keys}该样式自然会接受一个参数。因此,首先我们创建一组不接受任何参数的样式,这是我们的基础:

block/.style={rectangle, fill=gray, text centered, minimum height=8mm,node distance=10em, rounded corners=1mm},
my line style/.style={ultra thick, -{Latex}, draw=CornflowerBlue},
my label style/.style={text=Tomato, font=\itshape, fill=white},

现在我们可以构建使用基础风格但采用一些参数的变体,例如:

mylabel/.style={edge node={node[my label style]{#1}}}
my edge/.style={my line style, mylabel=#1},
my curved edge/.style n args={4}{my line style, out=#1, in=#2, looseness=#3, mylabel=#4},
normal edge/.style={my line style, out=-90, in=90, mylabel=#1},

第一个函数制作标签(标记边缘有几种解决方案,我使用了第一个浮现在我脑海中的解决方案),它应用我们之前创建的标签样式并设置文本。第二个函数将线样式应用于边缘,并接收传递给标签方的参数。弯曲边缘有几种变体,一种需要四个参数以实现完全灵活性,另一种具有in预设,out因此只需要传递标签,松散度可以像平常一样调整。

另一件需要考虑的事情是every anything样式,例如,every node等等。当你想把所有东西都设置为相同的样式并避免重复时,它们特别有用。every edgeevery path

我还冒昧地建议了其他几种绘图方法,使用定位库(也可以做成树,可能更明智)和arrows.meta替换弃用arrows库的库。

平均能量损失

\documentclass{article}
\usepackage[svgnames]{xcolor}
\usepackage{tikz}
\usetikzlibrary{arrows.meta,positioning}
\begin{document}
    \begin{tikzpicture}[%
        block/.style={rectangle, fill=gray, text centered, minimum height=8mm, rounded corners=1mm}
        ,my line style/.style={ultra thick, -{Latex}, draw=CornflowerBlue}
        ,my label style/.style={text=Tomato, font=\itshape, fill=white}
        ,every edge/.style={my line style}
        ,my edge/.style={my line style, mylabel=#1}
        ,my curved edge/.style n args={4}{my line style, out=#1, in=#2, looseness=#3, mylabel=#4}
        ,normal edge/.style={my line style, out=-90, in=90, mylabel=#1}
        ,mylabel/.style={edge node={node[my label style]{#1}}}]
    \scoped[every node/.style=block, node distance=6em and 3em]{
        \path (0,0) node (n01) {Node 01}
                    node[below right= of n01] (n02) {Node 02}
                    node[below left= of n01] (n03) {Node 03};
      };    

    \path (n01) edge[mylabel=Label 1] (n02)
     edge[normal edge=Label 2] (n03);   
    \end{tikzpicture}   
\end{document}

相关内容