是否可以定义具有以下形式的新命令:
\command{<marg>}[<oarg>]
我在包中看到过这种形式的命令fontspec
。但不确定如何实现。
答案1
您可以采取多种方法。
最简单的方法是使用xparse
然后你可以将命令定义为
\documentclass{article}
\usepackage{xparse}
\NewDocumentCommand{\mycommand}{ mO{a} }{#2 \rightarrow #1}
\pagestyle{empty}
\begin{document}
$\mycommand{A}$ vs $\mycommand{A}[b]$
\end{document}
或者,您可以使用\def
和\@ifnextchar[
来创建带有尾随可选参数的自己的命令。但这将充满问题。例如,任何[
跟在这样的宏后面的命令,无论中间是否有空格,都将被拾取。
xparse
通过不允许在最后一个强制参数和尾随可选参数之间有空格,可以很好地避免这种情况。
我推荐这种xparse
方法。不过,为了完整起见,我将向您展示至少一种通过\def
和 来实现此目的的方法\@ifnextchar
。
\documentclass{article}
\makeatletter
\newcommand\mycommand{\my@command}
\def\my@command#1{%%
\@ifnextchar[%]
{\@my@command{#1}}{\@my@command{#1}[a]}}
\def\@my@command#1[#2]{#2 \rightarrow #1}
\makeatother
\begin{document}
$\mycommand{A}$ vs $\mycommand{A}[b]$
\end{document}
答案2
我使用了一个名为xargs
(非免责声明:只是一个满意的用户)的包,它看起来非常适合这里 - 特别是命令\newcommandx
:
\newcommandx{\command}[argcount][arg, arg=default]{#1(#2)}
\newcommandx
工作原理与 相同\newcommand
,不同之处在于第二个可选参数不是命令第一个参数的默认值(使其成为可选参数);相反,它是一个逗号分隔的可选参数(编号)列表。可以通过在数字后加上=
所需的默认值来指定参数的默认值;如果没有给出,默认值为空。这是一个 MWE:
\documentclass{article}
\pagestyle{empty}
\usepackage{xargs}
\newcommandx{\mycommand}[2][2=a]{#2 \rightarrow #1}
\begin{document}
$\mycommand{A}$ vs $\mycommand{A}[b]$
\end{document}
下面是我实际使用过的命令,用于以莱布尼茨符号排版导数:
\newcommandx{\dd}[4][1, 2=\mathrm{d}, 4]{\ensuremath{\frac{#2^{#4}#1}{#2#3^{#4}}}}
\dd x
\dd[y]x
\dd[][\partial]x
\dd x[2]
\dd[y][\Delta]{x}[2]