我想画一条波浪线,中间有一个箭头。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}