更改 decorations.markings 中箭头的样式

更改 decorations.markings 中箭头的样式

我想画一条中间带有箭头的线,并发现decoration.markings库以及\arrow仅在那里可用的命令。

但是,我发现很少有信息表明该命令有哪些选项和箭头可用\arrow

通过反复尝试,我终于能够在线中间画出一个简单的箭头

\tikzset{kb/.style={postaction={decorate,decoration={markings,mark=at position .5 with {\arrow{angle 90};}}}}}

但是我怎样才能改变箭头的样式,即让箭头周围有一个圆圈,或者让两个箭头一个接一个地排列?

答案1

所以你的问题是如何定义新类型的箭头以将其用作装饰?

新箭头尖的定义与您将在何处使用它们无关,无论是作为命令的一部分\draw[->],还是作为装饰内命令的一部分\arrow。手册中涵盖新箭头种类定义的部分是第 784 页

一般来说,定义箭头的任意形状很困难,因为你必须使用低级pgf*命令。此外,如果你想让箭头接受样式并具有可扩展性,你必须了解元箭头(第 785 页)。

但是,您在问题中给出了两个特殊的例子,它们很容易制作,因为它们是先前存在的箭头的组合。

  1. 一个箭头周围有一个圆圈。您可以通过 将现有latex箭头与现有o(圆圈)箭头组合在一起\pgfarrowsdeclarecombine。此命令默认将一个箭头放在另一个箭头后面,但您可以指定移动第二个箭头的偏移量。在本例中,我发现(通过反复试验)可以-5pt产生所需的结果。

  2. 两个箭头一个接一个。命令\pgfarrowsdeclaredouble就是为此而设计的。

请看下面的代码:

\documentclass[11pt]{article}
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing,decorations.markings,arrows}

\pgfarrowsdeclarecombine[-5pt]{circled}{circled}{latex}{latex}{o}{o}
\pgfarrowsdeclaredouble{doubled}{doubled}{stealth}{stealth}

\tikzset{
kb1/.style={postaction={decorate,
   decoration={markings,mark=at position .5 with {\arrow{circled};}}}
   },
kb2/.style={postaction={decorate,
   decoration={markings,mark=at position .5 with {\arrow{doubled};}}}
   },   
}

\begin{document}
\begin{tikzpicture}%
    \draw[kb1] (0,0) -- + (2,0);
    \draw[kb2] (0,.5) -- + (2,0);
\end{tikzpicture}
\end{document}

生成结果:

结果

更新

原帖者在评论中指出,如果箭头是这样的angle 90,那么圆圈就太小了。

修复它有点困难而且有点儿不专业。

标准箭头不可自定义,因此您必须使用“元箭头”。此类箭头需要最新版本的 pgf/tikz 和包arrows.meta,其中定义了箭头尖端的新名称。例如,“空心圆”箭头的名称Circle[open]为 而不是oStraight Barb箭头将替换angle 90。请参阅最新 pgfmanual 第 202 页

但是,我不知道是否可以将不同的选项传递给“复合箭头”的不同部分。我们需要为“角度 90”和“圆”赋予不同的大小,但我不知道该怎么做。

但是我发现了一个窍门。如果你只将新的元箭头用于圆圈,将旧的元箭头arrow 90用于尖端,那么你传递的选项\arrow将只用于复合箭头的“元”部分,这样只有圆圈部分会调整大小。

使用这个想法:

\documentclass[11pt]{article}
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing,decorations.markings,arrows,arrows.meta}

\pgfarrowsdeclarecombine[-2mm]{circled}{circled}{angle 90}{angle 90}{Circle[open]}{Circle[open]}
\pgfarrowsdeclaredouble{doubled}{doubled}{angle 90}{angle 90}

\tikzset{
kb1/.style={postaction={decorate,
   decoration={markings,mark=at position .5 with {\arrow{circled[width=3mm,length=3mm]};}}}
   },
kb2/.style={postaction={decorate,
   decoration={markings,mark=at position .5 with {\arrow{doubled};}}}
   },   
}

\begin{document}
\begin{tikzpicture}%
    \draw[kb1] (0,0) -- + (2,0);
    \draw[kb2] (0,.5) -- + (2,0);
\end{tikzpicture}
\end{document}

结果:

结果

相关内容