tikz gd绘图库不在边缘绘制箭头

tikz gd绘图库不在边缘绘制箭头

我正在使用带有力算法的图形绘制来放置节点和边,但由于某种原因,当使用 [spring layout] 时边不显示箭头。

在没有算法布局的情况下手动放置节点和边时,它可以正常工作。

我的问题是如何让弹簧布局像第二张 tikz 图片一样正确显示边缘箭头。

遵循 MWE。

\documentclass[tikz,border=5mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{positioning,  graphdrawing, quotes }
\usegdlibrary {force}

\tikzset{
    node distance = 20mm,
    provides/.style = {->},
    every edge quotes/.style = {fill=white,sloped},
}

\begin{document}

\begin{tikzpicture}[spring layout]
\node [draw] (a) {A};
\node [draw] (b) {B};
\draw [provides] (a) edge ["stuff"] (b);
\end{tikzpicture}

\begin{tikzpicture}
\node [draw] (a) {A};
\node [draw, below = of a] (b) {B};
\draw [provides] (a) edge ["stuff"] (b);
\end{tikzpicture}

\end{document}

答案1

图形绘制库似乎没有向用户提供五种不同类型的边( ---><-<->、 )。每条边都是一条边。(这与箭头尖端无关,这与边的方向有关,GD 库可能会以不同的方式解释这些方向。)-!---

edge当实际绘制边时(其中->表示箭头尖端规范),只有操作选项才会被转发到图形绘制算法。

所以你需要做

\path (a) edge [provides, "stuff"] (b);

甚至every edge不会被考虑。


这是一个黑客这会重载一些样式,这些样式既设置箭头尖端也设置边缘类型。此 hack 不适用于edge from parent(与child操作一起使用)并且很可能破坏其他内容。

最好使用spring layout例如也使用的适当的钩子。

代码

\documentclass[tikz,border=5mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{positioning, graphdrawing, quotes}
\usegdlibrary  {force}
\tikzset{
  node distance = 20mm,
  provides/.style = {->},
  every edge quotes/.style = {fill=white, sloped}}
\makeatletter
\tikzset{
  edge macro def/.code 2 args={%
    \def\tikz@gd@plain@edge@macro##1##2{%
      \pgfgdedge{\tikz@pp@name{\tikztostart}}{\tikz@pp@name{\tikztotarget}}{#1}{/tikz,#2,##1}{##2}}},
  --/.style ={arrows=-,   edge macro def= {--}{#1}},
  ->/.style ={arrows=->,  edge macro def= {->}{#1}},
  <-/.style ={arrows=<-,  edge macro def= {<-}{#1}},
  <->/.style={arrows=<->, edge macro def={<->}{#1}},
  -!-/.style={arrows=-,   edge macro def={-!-}{#1}, path only}}
\makeatother
\begin{document}

\begin{tikzpicture}[spring layout]
\node [draw] (a) {A};
\node [draw] (b) {B};
\path[provides] (a) edge ["stuff"] (b);
\end{tikzpicture}

\begin{tikzpicture}
\node [draw] (a) {A};
\node [draw, below = of a] (b) {B};
\path [provides] (a) edge ["stuff"] (b);
\end{tikzpicture}

\end{document}

相关内容