TiKZ:在绘制语句中的每对点之间放置缩短的箭头?

TiKZ:在绘制语句中的每对点之间放置缩短的箭头?

创建箭头序列的最简单、最直接的方法是什么,例如

\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}

相关内容