创建箭头序列的最简单、最直接的方法是什么,例如
\begin{tikzpicture}
\draw[->] (0,0) -- (1,0) -- (2,0) -- (2,1) -- (1,1) -- (0,1) -- cycle;
\end{tikzpicture}
所以每对点之间的线都是一个箭头,两端都留有空隙?例如
\draw (2,1) -- (1,1);
实际上画
\draw[->] (1.9,1) -- (1.1,1);
我试过了:
\begin{tikzpicture}
\draw[->,shorten >=1mm,shorten <=1mm] (0,0) -- (1,0) -- (2,0) -- (2,1) -- (1,1) -- (0,1) -- cycle;
\end{tikzpicture}
我想这应该可行,但实际上它只是画了一条连接所有点的线。
我可能可以执行某种foreach
命令,如下所示:
\begin{tikzpicture}
\foreach \x/\y in %
{{(0,0)/(1,0)},{(1,0)/(2,0)},{(2,0)/(2,1)},{(2,1)/(1,1)},{(1,1)/(0,1)},{(0,1)/(0,0)}}
\draw[->,shorten >=1mm,shorten <=1mm] \x -- \y;
\end{tikzpicture}
但由于坐标重复,这种方法似乎有点笨拙。有没有更好的方法?
停止新闻
这个方法有效、简单、不使用任何花哨的宏,而且更重要的是符合我的编程风格:
\begin{tikzpicture}
\foreach \x [remember=\x as \lastx (initially {(0,0)})] in %
{(1,0),(2,0),(2,1),(1,1),(0,1),(0,0)}
{
\draw[->,shorten >=1mm,shorten <=1mm] \lastx -- \x;
\filldraw[fill=black] \x circle(0.05);
}
\end{tikzpicture}
答案1
一个装饰就可以实现:
\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{decorations}
\pgfdeclaredecoration{multiple arrows}{draw}{
\state{draw}[width=\pgfdecoratedinputsegmentlength]{
\draw [multiple arrows path/.try] (0,0) -- (\pgfdecoratedinputsegmentlength,0);
}
}
\tikzset{multiple arrows/.style={multiple arrows path/.style={#1},
decoration=multiple arrows, decorate}}
\begin{document}
\begin{tikzpicture}
\path [multiple arrows={shorten >=1mm, shorten <=1mm, -stealth}]
(0,0) -- (1,0) -- (2,0) -- (2,1) -- (1,1) -- (0,1) -- cycle;
\end{tikzpicture}
\end{document}
答案2
这是我的方法,了解了remember
选项foreach
,它实际上允许对连续的对象对进行迭代:
\begin{tikzpicture}
\foreach \x [remember=\x as \lastx (initially {(0,0)})] in %
{(1,0),(2,0),(2,1),(1,1),(0,1),(0,0)}
{
\draw[->,shorten >=1mm,shorten <=1mm] \lastx -- \x;
\filldraw[fill=black] \x circle(0.05);
}
\end{tikzpicture}
这种方法效果很好,而且概念上也很简单。
答案3
这是一个使用新命令的解决方案\myarrows
。此命令变为(...) -- (...) -- ...
一系列的\draw (...) -- (...);
。
\documentclass{article}
\usepackage{tikz}
\def\myarrows#1;{\myarrowsaux#1--;}
\def\myarrowsaux#1--#2--#3;{%
\draw[->, shorten >=1pt, shorten <=1pt] #1--#2;
\def\myarrowstemp{#3}%
\ifx\myarrowstemp\empty\else
\myarrowsaux #2--#3;
\fi}
\begin{document}
\begin{tikzpicture}
\myarrows (0,0) -- (1,0) -- (2,0) -- (2,1) -- (1,1) -- (0,1) -- (0,0);
\end{tikzpicture}
\end{document}