在节点之间水平移动路径

在节点之间水平移动路径

使用以下摘录,我如何将第二条边 (edge2) 在 n1 和 n2 之间进行 x 移位,以使其不与第一条边重叠?此外,有没有办法将文本添加到每条边,使它们不重叠?

在此处输入图片描述

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{chains}
\usetikzlibrary{arrows}

\begin{document}
\begin{tikzpicture}
[node distance=0mm, text height=1.5ex, text depth=.25ex,
attribute/.style={rectangle,minimum size=8mm,very thin,draw=black!50,font=\ttfamily},
link/.style={thin, to path={-- ++(0,8mm) -| (\tikztotarget)}, >= triangle 45, shorten >= 0pt}]
\node (n1) [attribute] {\small NODE1};
\node (n2) [attribute, right=of n1] {\small NODE2};
\path (n1) edge [->, link] (n2);
\path (n1) edge [->, link] (n2); %this edge to x-shift
\end{tikzpicture}
\end{document}

答案1

使用选项可以沿 x 方向移动某些东西xshift。但是,默认情况下,引用节点的点不会移动。为此,需要transform canvas

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{chains,arrows}

\begin{document}
\begin{tikzpicture}
    [node distance=0mm, text height=1.5ex, text depth=.25ex,
    attribute/.style={rectangle,minimum size=8mm,very thin,draw=black!50,font=\ttfamily},
    link/.style={thin, to path={-- ++(0,8mm) -| (\tikztotarget)}, >= triangle 45, shorten >= 0pt}]
\node (n1) [attribute] {\small NODE1};
\node (n2) [attribute, right=of n1] {\small NODE2};
\path (n1) edge [->, link,transform canvas={xshift=-3mm}](n2);
\path (n1) edge [->, link,transform canvas={xshift=3mm}] (n2);
\end{tikzpicture}
\end{document}

结果

node {...}通常,只需在 之后添加一个描述即可向边添加描述edge。但是,您的link样式会更改to path,因此 TikZ 不再知道将节点放在哪里。因此,必须将 更改to path为包含\tikztonodes在正确的位置(请参阅 (v2.10) 手册中的第 14.14 节“路径操作”)。为了获得正确的位置,还需要稍微改变绘制路径的方式:

to path={-- ++(0,8mm) -- ($(\tikztotarget)+(0,8mm)$) \tikztonodes -- (\tikztotarget)}

现在,可以像往常一样添加节点。为了避免重叠,可能需要添加额外的班次:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{chains,arrows,calc}

\begin{document}
\begin{tikzpicture}
    [node distance=0mm, text height=1.5ex, text depth=.25ex,
    attribute/.style={rectangle,minimum size=8mm,very thin,draw=black!50,font=\ttfamily},
    link/.style={thin, to path={-- ++(0,8mm) -- ($(\tikztotarget)+(0,8mm)$) \tikztonodes -- (\tikztotarget)}, >= triangle 45, shorten >= 0pt}]
\node (n1) [attribute] {\small NODE1};
\node (n2) [attribute, right=of n1] {\small NODE2};
\path (n1) edge [->, link,transform canvas={xshift=-3mm}] node[above,xshift=-1.5mm] {\small test} (n2);
\path (n1) edge [->, link,transform canvas={xshift=3mm}] node[above, xshift=1.5mm] {\small test 2} (n2);
\end{tikzpicture}
\end{document}

结果

答案2

(我后来找到的第二个和第三个解决方案如下)

一个解决方案(但我不确定它是不是最好的)是移动边缘的起点,如代码的这个修改版本所示:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{chains}
\usetikzlibrary{arrows}

\begin{document}
\begin{tikzpicture}
[node distance=0mm, text height=1.5ex, text depth=.25ex,
attribute/.style={rectangle,minimum size=8mm,very thin,draw=black!50,font=\ttfamily},
link/.style={thin, to path={-- ++(0,8mm) -| (\tikztotarget)}, >= triangle 45, shorten >= 0pt}]
\node (n1) [attribute] {\small NODE1};
\node (n2) [attribute, right=of n1] {\small NODE2};
\path (n1) edge [->, link] (n2);
\path[blue] (n1) edge [->,link, to path={($(\tikztostart)+(0.2,0.4)$) -- ++(0,5mm) -| ($(\tikztotarget)+(0.2,0.4)$)}, >= triangle 45] (n2);
\end{tikzpicture}
\end{document}

第二种解决方案是使用transform canvas:(我的代码中仅包含要修改的路径)

\path[blue, transform canvas={shift={(0.2,0)}}] (n1) edge [->,link, >= triangle 45] (n2);

第三个解决方案是

\path (n1.70) edge [->,link, >= triangle 45] (n2.70);

符号n1.70表示沿边界从东向(逆时针)旋转70度得到的一个点。

(最后两个解决方案来自平行箭头

这三种解决方案并未给出完全相同的结果。

答案3

我同意该 transform canvas解决方案,但另一个解决方案是:

1)修改样式的使用link(边缘从 开始a.north并结束于b.north

2)为此样式添加两个参数#1pos=#1用于标签)和#2边缘的“高度”,并在边缘上添加(中间)坐标(问题:pos = 0将标签放在第一个角);

3)使用xshift。

\documentclass{scrartcl}
\usepackage{tikz}
\usetikzlibrary{arrows,positioning}

\begin{document}

\begin{tikzpicture}
[node distance=0mm, text height=1.5ex, text depth=.25ex,
attribute/.style 2 args={rectangle,minimum size=8mm,%
                         very thin,draw=black!50,font=\ttfamily},
link/.style 2 args={thin, to path={--++(0,#2) -| (\tikztotarget)%
                    coordinate[pos=#1] (mid)}, >= triangle 45, shorten >= 0pt}]
\node (n1) [attribute] {NODE 1};
\node (n2) [attribute, right=of n1] { NODE 2};
\path (n1.north) edge [->, link={0}{4mm}]  (n2.north)  ; 
\node[above] at (mid){\footnotesize test 1};   
\path[blue] ([xshift=.3cm]n1.north) edge [->, link={.5}{4mm}] ([xshift=.3cm]n2.north); 
\node[blue,above] at (mid){\footnotesize test 2}; 
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案4

你会发现有用这个例子. 研究一下这个arm选项。

相关内容