使用以下摘录,我如何将第二条边 (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)为此样式添加两个参数#1
(pos=#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
选项。