我正在绘制一个组织结构图,我想让箭头指向我绘制的每个节点。我还偷懒地使用单个绘制命令从每个节点绘制一条线作为我流程的最后一部分。[->]
在我展示的示例中,有没有办法指定一条通往 C 和 B 但不通往 hub1 的线,而不用单独绘制每条线?
\documentclass[10pt]{article}
\usepackage{tikz}
\usetikzlibrary{calc,positioning}
\tikzstyle{a}=[rectangle,draw]
\begin{document}
\begin{tikzpicture}
\node [a] (A) at (0,0) {A};
\node [a,below=1cm of A] (B) {B};
\node [a,left=1cm of B] (C) {C};
\node [a,right=1cm of B] (D) {D};
\node [below=0.25cm of A] (hub1) {};
\draw [->] (A.south) -- (hub1.south) -| (C.north) (hub1.south) -- (B.north) (hub1.south) -| (D.north);
\end{tikzpicture}
\end{document}
编辑来自下面的@texenthusiast 评论我尝试使用循环\foreach
来编辑它,但现在 B 的箭头指向错误的方向。有什么想法吗?
\documentclass[a6]{minimal}
\usepackage{tikz}
\usetikzlibrary{calc,positioning}
\tikzstyle{a}=[rectangle,draw]
\begin{document}
\begin{tikzpicture}
\node [a] (A) at (0,0) {A};
\node [a,below=1cm of A] (B) {B};
\node [a,left=1cm of B] (C) {C};
\node [a,right=1cm of B] (D) {D};
\coordinate [below=0.6cm of A] (hub1) {};
\foreach \a/\b/\c in {C/east/0.1cm,B/north/0,D/west/-0.1cm}
\draw [->] (hub1) -| ($(\a.\b)+(\c,0)$) -- (\a.\b);
\end{tikzpicture}
\end{document}
答案1
如果你希望箭头出现在每个路径部分,你应该使用edge
默认行为是一条线到(--
)的选项,其工作方式类似于to
仅在构造中
\path (A) edge (B)
edge (C);
第二条线是从到绘制(A)
的(C)
,而不是从到(B)
绘制的(C)
,就像
\draw (A) to (B) to (C);
当然,换行符不是 TikZ 语法的一部分,而只是强调了这一事实。
在下面的代码中,我已将其声明(hub1)
为坐标,以便不会出现带有边框的不可见节点。路径运算符-|
通常不可用,edge
但可以在中轻松声明to path
。
(hub1)
一般来说,使用这样的辅助坐标并不是一个坏主意。但是,如果你经常需要从(A)
到这样的路径(C)
,你可以相对容易地声明一条|-|
到路径。
除了两个之外,--
你也可以使用一个--
和一个-|
路径运算符。这只会影响节点定位。(如果需要,也可以“破解”一个真正的|-|
路径运算符,可以像或一样使用--
,-|
你可以在整个路径上放置节点而无需手动构建它。类似的事情已经做过在我的另一个回答中。
请注意,我明确避免使用\p1
,\p2
因为它们可能会覆盖在用户级别声明的坐标。
代码
\documentclass[tikz]{standalone}
\usetikzlibrary{positioning,calc}
\tikzset{
a/.style={rectangle,draw},
-|/.style={to path={-| (\tikztotarget) \tikztonodes}},
|-|/.style={to path={
let \p{qrr@to@start}=(\tikztostart), \p{qrr@to@target}=(\tikztotarget) in
-- (\x{qrr@to@start},.5*\y{qrr@to@start}+.5*\y{qrr@to@target}) -- (\x{qrr@to@target},.5*\y{qrr@to@start}+.5*\y{qrr@to@target}) \tikztonodes -- (\tikztotarget)
}
}
}
\begin{document}
\begin{tikzpicture}
\node [a] at (0,0) (A) {A};
\node [a,below=1cm of A] (B) {B};
\node [a, left=1cm of B] (C) {C};
\node [a,right=1cm of B] (D) {D};
\coordinate [below=0.5cm of A] (hub1) {};
\path [->] (A) edge (B)
(hub1) edge[-|] (C)
edge[-|] (D);
\end{tikzpicture}
\begin{tikzpicture}
\node [a] at (0,0) (A) {A};
\node [a,below=1cm of A] (B) {B};
\node [a, left=1cm of B] (C) {C};
\node [a,right=1cm of B] (D) {D};
\path[every edge/.append style={|-|}, ->] (A) edge (B)
edge (C)
edge (D);
\end{tikzpicture}
\end{document}
输出
答案2
我认为 texenthusiast 的想法是这样的:
\documentclass[10pt]{article}
\usepackage{tikz}
\usetikzlibrary{calc,positioning}
\tikzstyle{a}=[rectangle,draw]
\begin{document}
\begin{tikzpicture}
\node [a] (A) at (0,0) {A};
\node [a,below=1cm of A] (B) {B};
\node [a,left=1cm of B] (C) {C};
\node [a,right=1cm of B] (D) {D};
\coordinate [below=0.5cm of A] (hub1);
\draw (A.south) -- (hub1);
\foreach \n in {C,D,B}
\draw [->] (hub1) -| (\n.north);
\end{tikzpicture}
\end{document}
(如果我错了,请纠正我...)