Here's an update on @runiq's extension to @clemens' code above (and partially an extension of my answer here), that is compatible with current versions of chemfig
(as of 2017, v1.2e), for an all-powerful -X>
arrow that can label above, below and midway along the arrow.

The output looks the same, but there has been a few under the hood changes, described below.
But first...
Quick Intro on how to use
The syntax is similar to the original -U>
arrow, and (obviously) identical to that of @runiq's -X>
arrow.
\arrow{-X>[#1][#2][#3][#4][#5][#6][#7][#8][#9]}
where arguments are:
[#1]
: Label to be placed at top arrow (start)
[#2]
: Label to be placed at top arrow (end)
[#3]
: Label to be placed at top arrow (midway)
[#4]
: Label to be placed at bottom arrow (start)
[#5]
: Label to be placed at bottom arrow (end)
[#6]
: Label to be placed at bottom arrow (midway)
[#7]
: Y-shift for the arrow, positive for upwards shift, vice versa
[#8]
: Radius of arc (default 0.333)
[#9]
: Angle for arc (default 60)
What has changed from @runiq's answer
- Overall code structure is different. This is based on the
-U>
definition from the chemfig
documentation.
- The arrow head is given by
-CF
, no longer -CF@full
, as pointed out in the comments.
- Included
CF@arrow@current@style
as a style when drawing the arrows. In short, this means the default arrow settings will be passed on to the -X>
arrow. Demonstrated below:

Code and result
\makeatletter
% Arguments:
% #1, #2, #3, #4, #5, #6: Labels as shown in the output figure
% #7: yshift for the arrow, positive for upwards shift, vice versa
% #8: radius of arc (default 0.333)
% #9: angle for arc (default 60)
\definearrow9{-X>}{%
\CF@arrow@shift@nodes{#7}%
\expandafter\draw\expandafter[\CF@arrow@current@style](\CF@arrow@start@node)--(\CF@arrow@end@node)node[midway](Xarrow@arctangent){};%
\CF@ifempty{#8}
{\def\CF@Xarrow@radius{0.333}}
{\def\CF@Xarrow@radius{#8}}%
\CF@ifempty{#9}%
{\def\CF@Xarrow@absangle{60}}
{\pgfmathsetmacro\CF@Xarrow@absangle{abs(#9)}}
% Draw top arrow (start)
\edef\CF@tmp@str{[\CF@ifempty{#1}{draw=none}{\unexpanded\expandafter{\CF@arrow@current@style}},-]}%
\expandafter\draw\CF@tmp@str (Xarrow@arctangent)%
arc[radius=\CF@compound@sep*\CF@current@arrow@length*\CF@Xarrow@radius,start angle=\CF@arrow@current@angle-90,delta angle=-\CF@Xarrow@absangle]node(Xarrow1@start){};
% Draw bottom arrow (end)
\edef\CF@tmp@str{[\CF@ifempty{#2}{draw=none}{\unexpanded\expandafter{\CF@arrow@current@style}},-CF]}%
\expandafter\draw\CF@tmp@str (Xarrow@arctangent)%
arc[radius=\CF@compound@sep*\CF@current@arrow@length*\CF@Xarrow@radius,%
start angle=\CF@arrow@current@angle-90,%
delta angle=\CF@Xarrow@absangle]%
node(Xarrow1@end){};
% Draw bottom arrow (start)
\edef\CF@tmp@str{[\CF@ifempty{#4}{draw=none}{\unexpanded\expandafter{\CF@arrow@current@style}},-]}%
\expandafter\draw\CF@tmp@str (Xarrow@arctangent)%
arc[radius=\CF@compound@sep*\CF@current@arrow@length*\CF@Xarrow@radius,start angle=\CF@arrow@current@angle+90,delta angle=\CF@Xarrow@absangle]node(Xarrow2@start){};
% Draw bottom arrow (end)
\edef\CF@tmp@str{[\CF@ifempty{#5}{draw=none}{\unexpanded\expandafter{\CF@arrow@current@style}},-CF]}%
\expandafter\draw\CF@tmp@str (Xarrow@arctangent)%
arc[radius=\CF@compound@sep*\CF@current@arrow@length*\CF@Xarrow@radius,%
start angle=\CF@arrow@current@angle+90,%
delta angle=-\CF@Xarrow@absangle]%
node(Xarrow2@end){};
% Insert labels
\pgfmathsetmacro\CF@tmp@stra{\CF@Xarrow@radius*cos(\CF@arrow@current@angle)<0?"-":"+"}%
\pgfmathsetmacro\CF@tmp@strb{\CF@Xarrow@radius*cos(\CF@arrow@current@angle)<0?"+":"-"}%
\ifdim\CF@Xarrow@radius pt>\z@
\CF@arrow@display@label{#1}{0}\CF@tmp@stra{Xarrow1@start}{#2}{1}\CF@tmp@stra{Xarrow1@end}%
\CF@arrow@display@label{#4}{0}\CF@tmp@strb{Xarrow2@start}{#5}{1}\CF@tmp@strb{Xarrow2@end}%
\CF@arrow@display@label{#3}{0.5}\CF@tmp@stra\CF@arrow@start@node{}{}{}\CF@arrow@end@node%
\CF@arrow@display@label{#6}{0.5}\CF@tmp@strb\CF@arrow@start@node{}{}{}\CF@arrow@end@node%
\else
\CF@arrow@display@label{#2}{0}\CF@tmp@stra{Xarrow1@start}{#1}{1}\CF@tmp@stra{Xarrow1@end}%
\CF@arrow@display@label{#5}{0}\CF@tmp@strb{Xarrow2@start}{#4}{1}\CF@tmp@strb{Xarrow2@end}%
\CF@arrow@display@label{#3}{0.5}\CF@tmp@stra\CF@arrow@start@node{}{}{}\CF@arrow@end@node%
\CF@arrow@display@label{#6}{0.5}\CF@tmp@strb\CF@arrow@start@node{}{}{}\CF@arrow@end@node%
\fi
}
\makeatother
With the above code placed in the preamble, the code below produces the following output:
\documentclass{article}
\usepackage{chemfig}
% <paste def. of -X> here>
\begin{document}
\begin{center}
\schemestart
A
\arrow{-X>[1][2][3][4][5][6][][0.333][60]}
B
\arrow{-X>[][2][][4][][][5pt][0.5][70]}% Note the yshift, radius and angle changes
C
\schemestop
\end{center}
\end{document}

Bugs?
Unfortunately, setting the radius (argument #8) as negative would flip the two U
arrows horizontally (i.e. they point from B to A), but the straight arrow will still point from A to B. As it stands, I don't see a way to fix this, barring a complete re-definition, or a definition of an alternate, reversed -X>
arrow.
\documentclass{article} \usepackage{chemfig} \begin{document} \schemestart A \arrow{-U>[X][Y]} B \schemestop \end{document}
, where without theU
theY
text would appear under the arrow. – Joseph Wright♦ Sep 30 '12 at 16:14