答案1
这是一个可能的解决方案
\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}
\DeclareDocumentCommand\fff { O{1} O{A} O{2} } {#1 \underset{l}{\overset{#2}{\to}} #3 }
\begin{document}
\[
\fff \quad \fff[3][B][4]
\]
\end{document}
答案2
这里有一个解决方案xparse
——实际上它展示了xparse
与传统方法相比有多么优越:
\documentclass[10pt]{article}
\usepackage{amsmath}
\makeatletter
\def\fff{%
\bgroup
\@ifnextchar[{\@fff}{\@fff[]}%
}
\def\@fff[#1]{%
\ifx\\#1\\%
\def\@fffi{1}%
\else
\def\@fffi{#1}%
\fi
\@ifnextchar[{\@@fff}{\@@fff[]}%
}
\def\@@fff[#1]{%
\ifx\\#1\\%
\def\@fffii{A}%
\else
\def\@fffii{#1}%
\fi
\@ifnextchar[{\@@@fff}{\@@@fff[]}%
}
\def\@@@fff[#1]{%
\ifx\\#1\\%
\def\@fffiii{2}%
\else
\def\@fffiii{#1}%
\fi
\ensuremath{\@fffi
\underset{l}{\overset{\@fffii}{\to}}\@fffiii}%
\egroup
}
\makeatother
\begin{document}
\noindent
\fff \quad \fff[][][]\quad \fff[9]\quad \fff[][Z] \\
\fff[][][5]\quad \fff[3][B][4]\quad \fff
\end{document}
答案3
答案4
当尝试处理多个可选参数时,使用键值方法几乎总是更方便。以下是使用xkeyval
:
\documentclass{article}
\usepackage{xkeyval,amsmath}
\makeatletter
\define@cmdkey{myfam}{left}{}
\define@cmdkey{myfam}{right}{}
\define@cmdkey{myfam}{bottom}{}
\newcommand{\fff}[2][]{%
\setkeys{myfam}{%
left=1,right=2,bottom=l,% Defaults
#1}%
\underset{%
\overset
{\cmdKV@myfam@left \rightarrow \cmdKV@myfam@right}
{\scriptscriptstyle \cmdKV@myfam@bottom}%
}{#2}
}
\makeatother
\begin{document}
$ \fff{A} \quad \fff[left=a]{A} \quad \fff[right=b]{A} \quad \fff[left=c,right=d]{A} \quad \fff[left=e,right=f,bottom=h]{A} $
\end{document}
我已将一个参数设为\fff
必填项,但是它也可以在函数中进行硬编码,或者设为键值选项。
参考:如何创建带有键值的命令?