我们知道,\xrightarrow
可以给出上标(箭头上方)和下标(箭头下方)。例如
X\xrightarrow{f}Y
X\xrightarrow[g]{f}Y
但是,我想定义一个命令,使其具有以下样式:
X\xra Y Equals to X\rightarrow{} Y
X\xra^{f}Y Equals to X\xrightarrow{f}Y
X\xra_{g}Y Equals to X\xrightarrow[g]Y
如何解决这个问题?
答案1
按任意顺序检查^
和:_
\documentclass{article}
\usepackage{amsmath}
\makeatletter
\DeclareRobustCommand{\xra}{%
\def\xra@upper{}%
\def\xra@lower{}%
\xra@checksup
}
\newcommand{\xra@checksup}{\@ifnextchar^{\xra@sup}{\xra@checksub}}
\newcommand{\xra@sup}[2]{% #1 is ^
\def\xra@upper{#2}%
\xra@checksub
}
\newcommand{\xra@checksub}{\@ifnextchar_{\xra@sub}{\xra@do}}
\newcommand{\xra@sub}[2]{% #1 is _
\def\xra@lower{#2}%
\xra@checksup
}
\newcommand{\xra@do}{%
\ifx\xra@sub\@empty
\xrigtharrow{\xra@upper}%
\else
\xrightarrow[\xra@lower]{\xra@upper}
\fi
}
\makeatother
\begin{document}
$A \xra B$
$A\xra^{f} B$
$A\xra^{f}_{g} B$
$A\xra_{g} B$
$A\xra_{g}^{f} B$
\end{document}
答案2
这是一种方法。可能不是最好的
\documentclass[a4paper]{article}
\usepackage{xparse,amsmath,amssymb}
\NewDocumentCommand\xra{ t_ t^ m}{
\IfBooleanTF{#1}{
\xrightarrow[#3]{}
}{
\IfBooleanTF{#2}{
\xrightarrow{#3}
}{
\to #3
}
}
}
\begin{document}
\begin{align*}
X \xra_ t Y \\
X \xra^ t Y \\
X \xra Y \\
\end{align*}
\end{document}