我制作了一种使用 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 edge
every 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}