MWE

MWE

我想画一条波浪线,中间有一个箭头。TikZ 有一个路径变形装饰,可以绘制波浪线,还有一个标记装饰,可以放置箭头尖。因此,解决方案是将它们一起使用:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{decorations,decorations.pathmorphing,decorations.markings}
\begin{document}

\begin{tikzpicture}
 \draw[
         decoration={snake},
         decorate,
         postaction={decoration={markings,mark=at position 0.6 with {\arrow{>}}},decorate}
     ]
        (0,0) -- (2,0);
\end{tikzpicture}

\end{document}

不幸的是,这不起作用,导致

! Dimension too large.
<to be read again> 
                   \relax 
l.11         (0,0) -- (2,0);

我怀疑某个地方正在进行无限递归。

有解决方法吗?如果没有,是否有其他简单的解决方案?

(注:这可能与我之前的问题有关“将后续操作应用到 TikZ 中的每个路径”

答案1

问题不是由错误的语法或递归引起的。例如,如果你将位置更改为 1:

postaction={decoration={markings,mark=at position 1 with {\arrow{>}}},decorate}

您的文件编译时没有错误,并且您获得:

替代文本

与位置 0 类似。这不会将箭头放置在所需的位置,但它表明嵌套装饰的方式是可以的,尽管 TikZ 的计算似乎太难了。

答案2

是的,TikZ 的计算似乎太难了。一种可能性是fp使用fixedpointarithmetic

\documentclass{article}
\usepackage{tikz,fp}
\usetikzlibrary{decorations.markings,fixedpointarithmetic}

\usetikzlibrary{decorations,decorations.pathmorphing}
\begin{document}

\begin{tikzpicture}
 \draw[fixed point arithmetic,
         decoration={snake},
         decorate,
         postaction={decoration={markings,mark=at position 0.6 with {\arrow{>}}},decorate}
     ]
        (0,0) -- (2,0);
\end{tikzpicture}

\end{document} 

在此处输入图片描述

答案3

以下是使用以下定义tikzset\addarrow命令解决您问题的方法。要添加中间箭头,首先使用 绘制一条不可见的线 draw[arrowsize=10pt 0.8mm] path;(箭头的大小为 10pt,例如 0.8mm,用于补偿波浪线的幅度)。最后,使用\addarrow{color};绘制 10pt 箭头并使用指定的颜色添加箭头。

\tikzset{
    arrowsize/.style args={#1 #2}{ 
        decoration={
            markings,% switch on markings
            mark=
                at position 0.5
                with
                {
                    \coordinate (exy1) at (#1/-6.0,0pt+#2/2);
                    \coordinate (exy2) at (-0.5*#1,#1/3.0+#2/2);  % 3.0 adjustable 
                    \coordinate (exy3) at (0.5*#1,0pt+#2/2);
                    \coordinate (exy4) at (-0.5*#1,#1/-3.0+#2/2); % 3.0 adjustable 
                },  
        },
        postaction=decorate, opacity=0
    },
    arrowsize/.default= 6pt 0.8mm
}

\newcommand{\addarrow}[1]{
\fill[#1] (exy1) -- (exy2) -- (exy3) -- (exy4) -- cycle;
}

MWE [法国]

[不确定我是否完全理解了这个想法 - 编辑]

\documentclass[border=11pt,tikz]{standalone}
\usetikzlibrary{decorations.markings,decorations.pathmorphing}
\tikzset{
    arrowsize/.style args={#1 #2}{
        decoration={
            markings,% switch on markings
            mark=
                at position 0.5
                with
                {
                    \coordinate (exy1) at (#1/-6.0,0pt+#2/2);
                    \coordinate (exy2) at (-0.5*#1,#1/3.0+#2/2);  % 3.0 adjustable
                    \coordinate (exy3) at (0.5*#1,0pt+#2/2);
                    \coordinate (exy4) at (-0.5*#1,#1/-3.0+#2/2); % 3.0 adjustable
                },
        },
        postaction=decorate,
        opacity=0
    },
    arrowsize/.default= 6pt 0.8mm
}

\newcommand{\addarrow}[1]{
  \fill[#1] (exy1) -- (exy2) -- (exy3) -- (exy4) -- cycle;
}
\begin{document}

\begin{tikzpicture}
  \draw
  [
    preaction={
      decoration={snake},
      decorate,
      opacity=1,
      draw,
    },
    arrowsize=10pt 0.8mm,
  ] (0,0) -- (3,0);
  \addarrow{blue}
\end{tikzpicture}
\end{document}

蛇身上的箭

相关内容