我想画一条中间带有箭头的线,并发现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 页)。
但是,您在问题中给出了两个特殊的例子,它们很容易制作,因为它们是先前存在的箭头的组合。
一个箭头周围有一个圆圈。您可以通过 将现有
latex
箭头与现有o
(圆圈)箭头组合在一起\pgfarrowsdeclarecombine
。此命令默认将一个箭头放在另一个箭头后面,但您可以指定移动第二个箭头的偏移量。在本例中,我发现(通过反复试验)可以-5pt
产生所需的结果。两个箭头一个接一个。命令
\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]
为 而不是o
,Straight 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}
结果: