我可以定义一个在强制参数之后带有可选参数的命令吗?

我可以定义一个在强制参数之后带有可选参数的命令吗?

是否可以定义具有以下形式的新命令:

\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

    dy/dx

  • \dd[][\partial]x

    ∂/∂x

  • \dd x[2]

    d²/dx²

  • \dd[y][\Delta]{x}[2]

    Δ²y/Δx²

相关内容