使用ncbar
此问题的风格:TikZ 是否有与 PSTricks \ncbar 命令等效的命令?,条形图出现在节点的顶部还是底部取决于\tikztostart
和\tikztotarget
坐标的相对位置。如果\tikztostart
位于 的左侧\tikztotarget
,则条形图出现在顶部,但如果\tikztostart
位于 的右侧,则\tikztotarget
条形图出现在底部。将条形图的角度从 改为90
会将-90
其重新置于顶部。
我想制作一个宏,将条形图统一放在顶部,与起始节点和目标节点的相对位置无关。原则上,最简单的方法似乎是测试起始和目标坐标的相对位置,然后相应地调整角度,但我不知道该怎么做。
这是一个例子。我希望自动创建红色箭头,而无需明确传递角度。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\tikzset{
ncbar angle/.initial=90,
ncbar/.style={
to path={
(\tikztostart)
-- ($(\tikztostart)!#1!\pgfkeysvalueof{/tikz/ncbar angle}:(\tikztotarget)$)
-- ($(\tikztotarget)!($(\tikztostart)!#1!\pgfkeysvalueof{/tikz/ncbar angle}:(\tikztotarget)$)!\pgfkeysvalueof{/tikz/ncbar angle}:(\tikztostart)$)
-- (\tikztotarget)
}},
ncbar/.default=.5cm
}
\newcommand{\toparrow}[3][]{\draw[->] (#2) [ncbar,#1] to (#3);}
\begin{document}
\begin{tikzpicture}
\node[draw] (A) at (0,0) {A};
\node[draw] (B) at (1,0) {B};
\toparrow{A}{B}
\toparrow{B}{A}
\toparrow[ncbar angle=-90,red]{B.north east}{A.north west} % I want this automatically
\end{tikzpicture}
\end{document}
答案1
对原始版本进行了一些修改,希望逻辑正确,并有一个打开/关闭行为的开关
\documentclass[tikz]{standalone}
\usetikzlibrary{calc}
\newif\iftikzncbarauto
\tikzset{
ncbar angle/.initial=90,
ncbar auto/.is if=tikzncbarauto,
ncbar auto,
ncbar/.style={
to path={\iftikzncbarauto let \p1=(\tikztostart),\p2=(\tikztotarget),\n1={atan2(\y2-\y1,\x2-\x1)},\n3={(\n1<0?360+\n1:\n1)},\n2={((\n3<=270)&&(\n3>90)?-1:1)} in
\else let \n2=1 in \fi
(\tikztostart)
-- ($(\tikztostart)!#1!\n2*\pgfkeysvalueof{/tikz/ncbar angle}:(\tikztotarget)$)
-- ($(\tikztotarget)!($(\tikztostart)!#1!\n2*\pgfkeysvalueof{/tikz/ncbar angle}:(\tikztotarget)$)!\pgfkeysvalueof{/tikz/ncbar angle}:(\tikztostart)$)
-- (\tikztotarget)
}},
ncbar/.default=.5cm
}
\newcommand{\toparrow}[3][]{\draw[->] (#2) [ncbar,#1] to (#3);}
\begin{document}
\begin{tikzpicture}
\node[draw] (A) at (-1,1) {A};
\node[draw] (B) at (1,0) {B};
\toparrow{A}{B}
\toparrow{B}{A}
\toparrow[red]{B.north east}{A.north west} % I want this automatically
\end{tikzpicture}
\end{document}