我想定义一个\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}}