How to use custom symbols as marks on fletcher arrows?

This is great. Here’s a slight tweak ensuring the correct use of the rev mark property, and using the tip/tail-origin/end properties to make the alignments look right:

#import "@preview/fletcher:0.5.7" as fletcher: diagram, node, edge
#fletcher.MARKS.update(m => {
  import fletcher.cetz.draw
  m + (
    "]": (
      rev: false,
      size: 6,
      depth: 3,
      draw: mark => draw.line(
        (-mark.depth, mark.size),
        (0, mark.size),
        (0, -mark.size),
        (-mark.depth, -mark.size),
        fill: none,
      ),
      tail-origin: mark => -mark.depth,
    ),
    "[": (inherit: "]", rev: true),
    ")": (
      rev: false,
      size: 8,
      angle: 50deg,
      draw: mark => draw.arc(
        (0, 0),
        start: -mark.angle,
        stop: mark.angle,
        radius: mark.size,
        fill: none,
        anchor: "origin",
      ),
      tail-end: mark => mark.size,
      tip-end: mark => mark.size,
      tip-origin: mark => mark.size,
      tail-origin: mark => mark.size*calc.cos(mark.angle),
    ),
    "(": (inherit: ")", rev: true),
  )
})

#diagram(spacing: (20mm, 5mm), $
  a edge("[-]") & b edge("(-)") & c \
  a edge("]-[") & b edge(")-(") & c \
$)

#table(
  columns: 2,
  fletcher.mark-debug("("),
  fletcher.mark-demo("("),
  fletcher.mark-debug("["),
  fletcher.mark-demo("["),
)

3 Likes