To draw an arrow, choose your arrow `kind`, then call the `draw` function (giving the path that the arrow will follow) or the `draw2` function (giving the starting and ending points of the arrow). If your favorite arrow `kind` does not exist, use the tools from this module to build your own!

`type kind`

The abstract type for arrow kinds.

### Drawing Arrows

If you need to place a label which is not TeX but any picture, if you need to place it at a symbolic position on the path, or if you need to place more than one label, you cannot do it directly using the `draw` commands. First draw the arrow, then use functions such as `Command.label`.

`val simple : ?color:Color.t -> ?brush:Brush.t -> ?pen:Pen.t -> ?dashed:Dash.t -> Path.t -> Command.t`

Draw a simple arrow following the given path.

- parameter color

  the color of the arrow

- parameter pen

  the pen to use to draw the body of the arrow

- parameter dashed

  the dash pattern to use to draw the body of the arrow

`val draw : ?kind:kind -> ?tex:string -> ?pos:float -> ?anchor:Command.position -> Path.t -> Command.t`

Draw an arrow following the given path.

- parameter kind

  the kind of arrow (default is `triangle_full`)

- parameter tex

  add a LaTeX label

- parameter pos

  label position on the path

- parameter anchor

  label anchor

`type ('a, 'b) arrow_from_to = ?kind:kind -> ?tex:string -> ?pos:float -> ?anchor:Command.position -> ?style:Path.joint -> ?outd:Path.direction -> ?ind:Path.direction -> ?sep:Num.t -> 'a -> 'b -> Command.t`

- `kind` the kind of arrow (default is `triangle_full`)
- `tex` add a LaTeX label
- `pos` label position on the path
- `anchor` label anchor
- `outd` the outgoing direction, at the beginning of the arrow
- `ind` the ingoing direction, at the end of the arrow
- `sep` add a little separation of the given distance

`val point_to_point : (Point.t, Point.t) arrow_from_to`

Use `point_to_point a b` to draw an arrow from `a` to `b`.

`val box_to_box : (Box.t, Box.t) arrow_from_to`

Use `box_to_box` to draw an arrow from `a` to `b`, stopping at the box boundaries. The arguments are the same as those of `point_to_point`.

`val point_to_box : (Point.t, Box.t) arrow_from_to`

Use `point_to_box` to draw an arrow from `a` to `b`, stopping at the box boundaries. The arguments are the same as those of `point_to_point`.

`val box_to_point : (Box.t, Point.t) arrow_from_to`

Use `box_to_point` to draw an arrow from `a` to `b`, stopping at the box boundaries. The arguments are the same as those of `point_to_point`.

### Built-in Kinds

`val classic : kind`

A simple arrow with one line and two straight lines for the head.

`val triangle : kind`

A simple arrow with a triangular head. Same as `classic` but with an extra line and some clipping.

`val triangle_full : kind`

A simple arrow with a triangular head filled with black.

`val implies : kind`

An arrow made of two parallel lines and a classic head.

`val iff : kind`

An arrow made of two parallel lines, a classic head and a classic foot.

`val mk_classic : ?color:Color.t -> unit -> kind`
`val mk_implies : ?color:Color.t -> unit -> kind`

### Heads

`type head_description`

The type of head descriptions (see `make_head` and `head` below).

`val make_head : ?cut:Path.t -> Command.t -> head_description`

Head description constructor. The command parameter is used to draw the head.

- parameter cut

  a path that can be used to cut the arrow body lines (only used by heads and feet, not by belts)

`type head = Point.t -> Point.t -> head_description`

If `h` is a head, `h p d` returns a head description used to draw the head at point `p` with direction `d`. Direction `d` is normalized before being given to the function.

`val head_classic : ?color:Color.t -> ?brush:Brush.t -> ?pen:Pen.t -> ?dashed:Dash.t -> ?angle:float -> ?size:Num.t -> head`

A simple head with two straight lines.

- parameter color

  the color of the head; default is black

- parameter pen

  the pen used to draw the head; default is `Brush.Pen.default`

- parameter dashed

  if given, the head is drawn using that dash_style

- parameter angle

  the angle between the two lines in degrees, default is 60 degrees

- parameter size

  the length of the two lines, default is 4bp

`val head_triangle : ?color:Color.t -> ?brush:Brush.t -> ?pen:Pen.t -> ?dashed:Dash.t -> ?angle:float -> ?size:Num.t -> head`

Same as `head_classic` except that the two lines are joined together to form a triangle.

`val head_triangle_full : ?color:Color.t -> ?angle:float -> ?size:Num.t -> head`

Same as `head_triangle` except that the triangle is not drawn (hence the absence of pen properties) but is filled with the given `color`.

### Building Your Own Kinds

Start from the empty kind `empty` and add features to it using `add_line`, `add_head`, ...

`val empty : kind`

The empty kind with no line nor head.

`val add_line : ?brush:Brush.t -> ?dashed:Dash.t -> ?color:Color.t -> ?pen:Pen.t -> ?from_point:float -> ?to_point:float -> ?dist:Num.t -> kind -> kind`

Add a line to a body. The line will be parallel to the path used to draw the arrow.

- parameter dashed

  the dash style used to draw the line (default is plain)

- parameter color

  the color of the line (default is black)

- parameter pen

  the pen used to draw the line (default is `Brush.Pen.default`)

- parameter from_point

  from `0.` (foot of the arrow) to `1.` (head of the arrow), the line will start from this point

- parameter to_point

  from `0.` (foot of the arrow) to `1.` (head of the arrow), the line will end at this point

- parameter dist

  the distance between the path of the arrow and this line (positive values are on the right of the arrows)

`val add_head : ?head:head -> kind -> kind`

Add a head at the end of the arrow.

- parameter head

  the kind of head to add (default is `head_classic`)

`val add_foot : ?head:head -> kind -> kind`

Add a foot (an inverted head) at the beginning of the arrow.

- parameter head

  the kind of head to add (default is `head_classic`)

`val add_belt : ?clip:bool -> ?rev:bool -> ?point:float -> ?head:head -> kind -> kind`

Add an arrow head at any point of an arrow.

- parameter clip

  if `true`, the arrow lines will be clipped after the belt (or before if the `rev` is `true`) (default is `false`)

- parameter rev

  if `true`, the head will be drawn in the opposite direction (default is `false`)

- parameter point

  the point where to draw the arrow (`0.` for the beginning, and `1.` for the end, or any number in-between) (default is `0.5`)

- parameter head

  the kind of head to add (default is `head_classic`)

### Miscellaneous

Warning: the following functions might be either deleted, modified and / or moved somewhere else. Don't use them if you need some backward compatibility.

`val draw_thick : ?style:Path.joint -> ?boxed:bool -> ?line_color:Color.t -> ?fill_color:Color.t -> ?outd:Path.direction -> ?ind:Path.direction -> ?width:Num.t -> ?head_length:Num.t -> ?head_width:Num.t -> Point.t -> Point.t -> Command.t`

Draw a thick arrow.