使用全局设置在不同位置绘制两种颜色的多个箭头

使用全局设置在不同位置绘制两种颜色的多个箭头

我想用两种颜色(如蓝色/青色箭头)绘制多个箭头(如图所示)。我使用以下代码。

如何设置全局 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 中创建一个父节点,并将节点的各个部分指定为指针?

在这种情况下,我认为最好的方法是添加第三个参数,并使用picscope控制的环境#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=2myarrow={violet,red!10!white,{rotate=90,yscale=2}}}

\pic at (.4,.5) {myarrow={{red,draw=white},yellow,scale=-1}};

\filldraw在 中的命令中添加可选增强功能myarrow,在本例中将箭头的边框从黑色更改为白色。这会将上面最后一张图更改为:

在此处输入图片描述

请注意,从右到左指向的箭头有一个白色边框。

答案2

Tikzsingle arrowshapes.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,将参数传递rotateshading 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 中删除(如果您需要在同一框架上执行其他操作,请忽略这一点)。

相关内容