[Tex/LaTex] Extensible injection arrow

arrowspackages

I want to label an \rightarrowtail, but the arrow is too short for my label. So I want an extensible version of this arrow. I've tried the extpfeil package, but am not sure how to use it to create my arrow. At present, I would know how if I had an arrow-like symbol that looked like the following:

" >-- "

However, I am unaware of any such symbol. Detexify and the symbol list don't seem to have it either. How should I make my arrow?

Best Answer

Another option would be to use TikZ to define an \xrightarrowtail macro:

\documentclass{amsart}
\usepackage{tikz}

\makeatletter
\newbox\xrat@below
\newbox\xrat@above
\newcommand{\xrightarrowtail}[2][]{%
  \setbox\xrat@below=\hbox{\ensuremath{\scriptstyle #1}}%
  \setbox\xrat@above=\hbox{\ensuremath{\scriptstyle #2}}%
  \pgfmathsetlengthmacro{\xrat@len}{max(\wd\xrat@below,\wd\xrat@above)+.6em}%
  \mathrel{\tikz [>->,baseline=-.75ex]
                 \draw (0,0) -- node[below=-2pt] {\box\xrat@below}
                                node[above=-2pt] {\box\xrat@above}
                       (\xrat@len,0) ;}}
\makeatother

\begin{document}
  \[ f : G \xrightarrowtail[{\star}]{\text{\textbf{Grp}}} H \]
\end{document}

This produces the output

An extensible right arrow with a tail drawn with TikZ.

(The amsart document class is only used to get \text, and not used in the macro definition.)

Edit: I realize I should probably explain what's going on here. It's not too complicated: we allocate boxes \xrat@below and \xrat@above to store the text we're going to place above and below, and we fill them with our arguments set as script-style math. We then set \xrat@len, which will be the arrow length, to the larger of the two widths plus .6 ems for padding on either side. We then simply draw the arrow, placing the below box below and above box below. It's worth noting that the values in +.6em, baseline=.75ex, below=-2pt, and above=-2pt are all completely arbitrary, and result from me tinkering briefly; changing them might give better results for your use case. The baseline option moved the arrow up to the middle, instead of having it trail along the ground, and the below and above options set the text closer to the arrow, which is desired in this context.

A better solution would probably be to figure out how to use amsmath's \ext@arrow command (which it uses to define \xleftarrow and \xrightarrow, and which other packages for similar commands seem to use as well), but I can't figure out how it works. Strike that, this would require the missing \arrowtail (>--) macro which you were asking about in the first place (since extpfeil uses \ext@arrow under the hood as well). I suppose the best bet might be to create such a character in Metafont or some such, but I'm not sure how to do that.