我想用 TikZ 绘制所谓的键合图,其中元素(节点)通过半箭头连接。我可以使用“左/右”箭头,使用 3.0 ,或者使用 arrows、arrows.meta 包\draw[-{Straight Barb[left]}] (a) -- (b)
创建具有较大笔触的自己的箭头。\pgfarrowsdeclare
但是,格式规则规定半箭头的笔画必须始终向下(水平箭头)或向左(垂直箭头);对角箭头根据其角度被视为水平或垂直(当然,45° 是交叉点:比 45° 稍微垂直一点就是垂直)。
是否可以定义 pgf 箭头、tikzstyle 或其他宏来自动使笔触点向下或向左,而不是相对于路径向左/向右?
梅威瑟:
\documentclass[a4paper,12pt]{article}
\usepackage{tikz}
\usetikzlibrary{arrows,arrows.meta}
% Half-arrow with a large stroke
\pgfarrowsdeclare{ha}{ha}
{
\arrowsize=2pt
\advance\arrowsize by .5\pgflinewidth
\pgfarrowsleftextend{-4\arrowsize-.5\pgflinewidth}
\pgfarrowsrightextend{.5\pgflinewidth}
}
{
\arrowsize=0.2pt
\advance\arrowsize by .5\pgflinewidth
\pgfsetdash{}{0pt} % do not dash
\pgfsetroundjoin % fix join
\pgfsetroundcap % fix cap
\pgfpathmoveto{\pgfpoint{-8\arrowsize}{-8\arrowsize}}
\pgfpathlineto{\pgfpoint{0}{0}}
\pgfusepathqstroke
}
\begin{document}
\pgfversion %3.0.0
\begin{tikzpicture}
\node (a) at (0,0) {a};
\node (b) at (1,0) {b};
\node (c) at (1,1) {c};
\node (d) at (2,0) {d};
\node (e) at (1,-1) {e};
\draw[-{Straight Barb[right]}] (a) -- (b);
\draw[-ha] (b) -- (c);
\draw[-ha] (d) -- (b);
\draw[-ha] (b) -- (e);
\end{tikzpicture}
\end{document}
在这个 MWE 中,ab 和 be 是正确的,而 bc 和 db 指向错误的方向。我可以手动修复这个问题,通过将左改为右或 vv,但有没有办法自动完成这个操作?
答案1
您可以尝试提供装饰\pgfdecoratedangle
(对于直线,这会给出线的角度)并使用它来应用适当的箭头:
\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{decorations.pathreplacing,arrows.meta}
\tikzset{barbs/.style={
decoration={show path construction,
lineto code={
\draw
\pgfextra{%
\pgfmathparse{int(\pgfdecoratedangle/90)}% Possibly check for -ve values.
\ifcase\pgfmathresult
\tikzset{-{Straight Barb[right]}}
\or
\tikzset{-{Straight Barb[left]}}
\or
\tikzset{-{Straight Barb[left]}}
\else
\tikzset{-{Straight Barb[right]}}
\fi
} (\tikzinputsegmentfirst) -- (\tikzinputsegmentlast);
}
},
decorate
}}
\begin{document}
\begin{tikzpicture}
\node (o) {o};
\foreach \l [count=\i from 0] in {a,...,d}
\node (\l) at (\i*90:1) {\l};
\foreach \l in {a,...,d}
\draw [barbs] (\l) -- (o);
\end{tikzpicture}
\end{document}