我想用两种颜色(如蓝色/青色箭头)绘制多个箭头(如图所示)。我使用以下代码。
如何设置全局 tikzset 命令以在不同位置用不同的两种颜色绘制这些箭头?
\documentclass{beamer}
\beamertemplatenavigationsymbolsempty
\usepackage{tikz}
\usepackage{pgfplots}
\usetikzlibrary{arrows, arrows.meta}
\begin{document}
\begin{frame}[fragile,t]
\frametitle{}
\begin{tikzpicture}[scale=.9, transform shape]
\draw [thick,-latex](0,0) -- (4,0);
\draw [thick,-latex](0,0) -- (0,2.);
\draw [ultra thick, green, -latex'] (.2,.8) -- +(0:.76);
\draw [ultra thick, red, -latex'] (.4,.5) -- +(0:.76);
\draw [ultra thick, violet, -latex'] (.6,.2) -- +(0:.76);
\filldraw[left color=blue, right color=cyan] (2,1)-- ++(90:0.1)--++(0:1.)--++(90:0.1)--++(-45:.212)--++(-135:.212)--++(90:0.1)--cycle;
\end{tikzpicture}
\end{frame}
\end{document}
答案1
一个非常灵活的选项,适用于任何自定义“形状”,就是为箭头定义“pic”。您可以在 tikz 手册(版本 3.0.1a)第 18.2 节中阅读有关这些内容的所有内容。
这实际上是通过将代码放入一个带有两个参数的pic
调用中来完成的myarrow
:左颜色和右颜色。代码如下:
\documentclass{beamer}
\beamertemplatenavigationsymbolsempty
\usepackage{tikz}
\usepackage{pgfplots}
\usetikzlibrary{arrows, arrows.meta}
\begin{document}
\tikzset{
pics/myarrow/.style args = {#1,#2}{% left colour, right colour
code={
\filldraw[left color=#1, right color=#2]
(0,0)--++(90:0.1)--++(0:1.)--++(90:0.1)--++(-45:.212)
--++(-135:.212)--++(90:0.1)--cycle;
}
}
}
\begin{frame}[fragile,t]
\frametitle{}
\begin{tikzpicture}[scale=.9, transform shape]
\draw [thick,-latex](0,0) -- (4,0);
\draw [thick,-latex](0,0) -- (0,2.);
\draw [ultra thick, green, -latex'] (.2,.8) -- +(0:.76);
\draw [ultra thick, red, -latex'] (.4,.5) -- +(0:.76);
\draw [ultra thick, violet, -latex'] (.6,.2) -- +(0:.76);
\pic at (2,1) {myarrow={blue,cyan}};
\draw (1,2) pic{myarrow={green,yellow}};
\end{tikzpicture}
\end{frame}
\end{document}
里面的坐标myarrow
是相对于你放置箭头的位置的。如上所示,你可以pic
使用\draw
命令或\pic
命令来放置。
编辑
您可以向定义中添加额外的增强项来pic
更改长度等。当然,如果您希望能够更改长度、角度、...,那么您最终将添加许多额外的参数,这很快就会变得有点麻烦。另一种方法是定义一些 pgfkeys 来使用更易于管理的键值语法来控制额外的规范;例如,在这篇文章中就是这样做的如何在 tikz 中创建一个父节点,并将节点的各个部分指定为指针?。
在这种情况下,我认为最好的方法是添加第三个参数,并使用pic
受scope
控制的环境#3
。这允许您生成:
使用代码:
\documentclass{beamer}
\beamertemplatenavigationsymbolsempty
\usepackage{tikz}
\usepackage{pgfplots}
\usetikzlibrary{arrows, arrows.meta}
\begin{document}
\tikzset{
pics/myarrow/.style args = {#1,#2,#3}{% left colour, right colour
code={
\begin{scope}[#3]
\filldraw[left color=#1, right color=#2]
(0,0)--++(90:0.1)--++(0:1.)--++(90:0.1)--++(-45:.212)
--++(-135:.212)--++(90:0.1)--cycle;
\end{scope}
}
}
}
\begin{frame}[fragile,t]
\frametitle{}
\begin{tikzpicture}[scale=.9, transform shape]
\draw [thick,-latex](0,0) -- (4,0);
\draw [thick,-latex](0,0) -- (0,2.);
\draw (1,1.5) pic{myarrow={green,yellow,}};
\pic at (2,1) {myarrow={blue,cyan,}};
\pic at (.2,.8) {myarrow={green,blue,xscale=2}};
\pic at (.4,.5) {myarrow={red,yellow,scale=-1}};
\pic at (.6,.2) {myarrow={violet,blue!10!white,rotate=60}};
\pic at (4,-.2){myarrow={violet,red!10!white,{rotate=90,yscale=2}}};
\end{tikzpicture}
\end{frame}
\end{document}
这里要注意的一点是,如果你没有完全按照指定的方式使用 pics 的语法,那么它就非常难以处理:上面,你总是需要给出myarrrow
三个逗号分隔的参数。因此,上面的第二个例子中的尾随逗号myarrow={blue,cyan,}
设置为空,最后一个例子中的#3
第三个增强符号周围的括号设置为空。事实上,你可以滥用这一点,例如,使用rotate=90,yscale=2
myarrow={violet,red!10!white,{rotate=90,yscale=2}}}
\pic at (.4,.5) {myarrow={{red,draw=white},yellow,scale=-1}};
\filldraw
在 中的命令中添加可选增强功能myarrow
,在本例中将箭头的边框从黑色更改为白色。这会将上面最后一张图更改为:
请注意,从右到左指向的箭头有一个白色边框。
答案2
Tikzsingle arrow
在shapes.arrows
库中有一个预定义的形状。my arrow
样式有两个参数,第一个是左侧颜色,第二个是右侧颜色。可以通过将键添加middle color=<color>
到node
选项来选择中间颜色。
可以像往常一样调整大小node
,考虑到minimum width
键设置箭头的长度, minimum height
键设置尖端的宽度。此外,single arrow head extend
键可用于间接设置“尾部”的宽度。tail width = minimum height - 2 * head extend
.
编辑
我注意到,旋转箭头时,阴影不会随之旋转。为此,我稍微调整了样式my arrow
,将参数传递rotate
给shading angle
键,偏移 90°。
\documentclass{beamer}
\beamertemplatenavigationsymbolsempty
\usepackage{tikz}
\usetikzlibrary{shapes.arrows}
\tikzset{
my arrow/.style 2 args={
single arrow,
draw,
inner sep = 0pt,
minimum height = 1cm, % Arrow length
minimum width = 2.5mm, % Arrow width
single arrow head extend = 0.1mm,
left color = #1,
right color = #2,
rotate/.append style={shading angle=##1+90},
},
my arrow/.default={blue}{cyan},
}
\begin{document}
\begin{frame}[t]
\frametitle{}
\begin{tikzpicture}[scale=.9, transform shape]
\draw [thick,-latex](0,0) -- (4,0);
\draw [thick,-latex](0,0) -- (0,2.);
\node at (0.6,0.8) [my arrow={green}{blue}]{};
\node at (0.8,0.5) [my arrow={yellow}{red}]{};
\node at (1,0.2) [my arrow={purple}{violet},middle color=yellow]{};
\node at (2.5,1.1) [my arrow]{}; % The default is {blue}{cyan}
\node at (1.1,2) [my arrow={white}{red},minimum height=2cm,minimum width=4mm]{};
\node at (1,1.5) [my arrow={white}{red},minimum height=0.5cm,minimum width=1mm,single arrow head extend=0.5pt]{};
\node at (3.5,1) [my arrow={green}{red},minimum height=2cm,minimum width=4mm,rotate=45,middle color=white]{};
\end{tikzpicture}
\end{frame}
\end{document}
附言:没有必要将此框架用作fragile
。这会大大增加编译时间,因此我将其从 MWE 中删除(如果您需要在同一框架上执行其他操作,请忽略这一点)。