如果未指定,则 newcommand 的第二个可选参数与第一个相同

如果未指定,则 newcommand 的第二个可选参数与第一个相同

我想定义一个\newcommand带有两个参数的函数,其中一个是可选的,这样如果我不指定第二个参数,输出结果将与第一个输入相同,如果指定了第二个参数,输出结果将与第一个输入相同。让我们举个例子:

\newcommand{\paren}[1]{\left(#1\right)} %this is just an example command

$A = a\paren{a}$

在此处输入图片描述

我想通过做类似的事情来获得同样的效果(这行不通)

\newcommand{\mypar}[2][#1]{#2\paren{#1}}
$A = \mypar{a} = \mypar[a]{a} \neq \mypab[b]{a}$

在此处输入图片描述

我认为#1在未指定第二个参数时插入默认参数就可以完成这项工作,但事实并非如此。

答案1

latex 格式有一个标准命令,用于以这种方式加倍可选参数(如用于\section[zz]{zz}

\documentclass{article}


\newcommand{\xmypar}[2][]{#2\left(#1\right)} %this is just an example command

\makeatletter
\newcommand\mypar{\@dblarg\xmypar}
\makeatother

\begin{document}

$\mypar{a}$

$\mypar[b]{a}$

\end{document}

答案2

标准\newcommand不支持它。内核提供\@dblarg

\makeatletter
\newcommand{\mypar}{\@dblarg\@mypar}
\def\@mypar[#1]#2{#2\paren{#1}}
\makeatletter

但是,您可以使用以下方式更加稳健、更轻松地完成此操作xparse

\usepackage{xparse}

\NewDocumentCommand{\mypar}{O{#2}m}{#2\paren{#1}}

完整示例:

\documentclass{article}
\usepackage{xparse}

\newcommand{\paren}[1]{\left(#1\right)} %this is just an example command

\NewDocumentCommand{\mypar}{O{#2}m}{#2\paren{#1}}

\begin{document}

$\mypar{a}$

$\mypar[b]{a}$

\end{document}

\paren当然,我并不赞同这个定义。;-)

在此处输入图片描述

答案3

你可以检查是否为空参数并用它来#1作为显示以下任一#1条件#2

在此处输入图片描述

\documentclass{article}

\usepackage{mleftright}

\newcommand{\paren}[1]{\mleft(#1\mright)} %this is just an example command
\newcommand{\mypar}[2][]{%
  \if\relax\detokenize{#1}\relax #2\else #1\fi\paren{#2}}

\begin{document}

$A = \mypar{a} = \mypar[a]{a} \neq \mypar[b]{a}$

\end{document}

下面的定义稍微简单一些,但也有效:

\newcommand{\mypar}[2][\relax]{%
  \ifx\relax#1\relax #2\else #1\fi\paren{#2}}

相关内容