TikZ:如何在线中间画箭头?

TikZ:如何在线中间画箭头?

像这样:

.------<------.
|             |
v             ^
|             |
'------>------'

我目前正在使用

\begin{scope}[very thick,->]
  \draw (-4,1)--(-4,0)--(0.1,0);
  \draw (0,0)--(4,0)--(4,1.1);
  \draw (4,1)--(4,2)--(-0.1,2);
  \draw (0,2)--(-4,2)--(-4,0.9);
\end{scope}

但这不太优雅。我更喜欢

\begin{scope}[very thick,middle decoration=>] 
             %           ^^^^^^^^^^^^^^^^^ a hypothetical option
  \draw (-4,0)--(4,0);
  \draw (4,0)--(4,2);
  \draw (4,2)--(-4,2);
  \draw (-4,2)--(-4,0);
\end{scope}

答案1

decorations库可用于各种此类用途。遗憾的是,它略显冗长。

\usetikzlibrary{decorations.markings}

\begin{scope}[very thick,decoration={
    markings,
    mark=at position 0.5 with {\arrow{>}}}
    ] 
    \draw[postaction={decorate}] (-4,0)--(4,0);
    \draw[postaction={decorate}] (4,0)--(4,2);
    \draw[postaction={decorate}] (4,2)--(-4,2);
    \draw[postaction={decorate}] (-4,2)--(-4,0);
\end{scope}

答案2

编辑:一个通用的解决方案是将一些样式(比如在中间放置一个箭头)应用到任意路径的每个段。

有两种风格:

  • 风格on each segment采用图书馆show path construction装饰decorations.pathreplacing在路径的每个部分上应用一些样式(其参数)

  • 该风格使用 Caramdir 的答案(通过库)mid arrow的方法来decorations.markings在路中间放一个箭头(其参数是箭头的颜色)。

首先,序言:

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing,decorations.markings}

两种风格:

\tikzset{
  % style to apply some styles to each segment of a path
  on each segment/.style={
    decorate,
    decoration={
      show path construction,
      moveto code={},
      lineto code={
        \path [#1]
        (\tikzinputsegmentfirst) -- (\tikzinputsegmentlast);
      },
      curveto code={
        \path [#1] (\tikzinputsegmentfirst)
        .. controls
        (\tikzinputsegmentsupporta) and (\tikzinputsegmentsupportb)
        ..
        (\tikzinputsegmentlast);
      },
      closepath code={
        \path [#1]
        (\tikzinputsegmentfirst) -- (\tikzinputsegmentlast);
      },
    },
  },
  % style to add an arrow in the middle of a path
  mid arrow/.style={postaction={decorate,decoration={
        markings,
        mark=at position .5 with {\arrow[#1]{stealth}}
      }}},
}

然后是结果和文档:

在此处输入图片描述

\begin{document}
\begin{tikzpicture}
  \path [draw=blue,postaction={on each segment={mid arrow=red}}]
  (.2,0) -- (3,1) arc (0:180:1.4 and 1) -- cycle
  (4,1) circle(.8)
  (6,1) ellipse(.5 and 1)
  (0,3) to [bend left] (3,4)
  (4,3) rectangle (6,4)
  ;
\end{tikzpicture}
\end{document}

答案3

更新日期:2020-02-22:此代码已被取代,不应再使用。它还嵌套了 tikzpictures,后来我意识到这不太好。Caramdir 的回答是最好的全方位解决方案,但如果你想要一个接近这个的解决方案,那么Kpym 的回答使用pics 具有与此相同的精神,但没有缺点。


鉴于您指定的精确语法是不可能的,这里有一些东西可以实现所需的效果,而不必指定中点的坐标。

\documentclass{article}
\thispagestyle{empty}
\usepackage{tikz}
\usetikzlibrary{arrows}
\newcommand{\midarrow}{\tikz \draw[-triangle 90] (0,0) -- +(.1,0);}

\begin{document}
\begin{tikzpicture}
\begin{scope}[very thick, every node/.style={sloped,allow upside down}]
  \draw (-4,0)-- node {\midarrow} (4,0);
  \draw (4,0)-- node {\midarrow} (4,2);
  \draw (4,2)-- node {\midarrow} (-4,2);
  \draw (-4,2)-- node {\midarrow} (-4,0);
\end{scope}
\end{tikzpicture}
\end{document}

arrowstikz 库只是为了获得更突出的箭头)

得出的结果为:

替代文本

(不确定右侧的垂直线是什么。它不在原文中,所以一定是 pdf->png 过程中的产物)

答案4

没有任何修饰,只有“独特”的路径,新代码如下:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{arrows}  

\begin{document}
\tikzset{%
          insert new path/.style={%
             insert path={%
                  node[midway,sloped]{\tikz \draw[#1,thick] (-.2pt,0) -- ++(.2 pt,0);}
                  }
             }
         }

\begin{tikzpicture}
\begin{scope}[a/.style = {insert new path = {-triangle 90}}]
  \draw[red] (-4,0) -- (4,0) -- (4,2) -- (-4,2) -- (-4,0);
  \draw[red] (0,-4pt)--(0,+4pt); % it's a  test
  \draw (-4,0)-- (4,0)[a] -- (4,2)[a] -- (-4,2)[a] -- (-4,0)[a];
\end{scope}
\end{tikzpicture}

\end{document}

可以使用类似以下方法调整箭头的位置node[midway,sloped,right=-2pt]

在此处输入图片描述

相关内容