定义具有不同数量参数的相同命令

定义具有不同数量参数的相同命令

我想定义两个版本的命令\Set,具体取决于我是否提供一个或两个参数。例如:

\newcommand{\Set}[1]{\bigl\{ #1 \bigr\}}
\newcommand{\Set}[2]{\bigl\{ #1 \bigm| #2 \bigr\}}

但那不起作用。它抱怨命令的重新定义。

答案1

您不能像其他编程语言中的函数那样在 TeX 中“重载”宏。

您可以定义宏以使用普通可选参数作为两个参数之一,也可以定义一个特殊宏,如果后面跟着左括号,则向前看。该xparse包可以帮助您定义一个:

\documentclass{article}

\usepackage{amsmath}
\usepackage{xparse}

\NewDocumentCommand\Set{mg}{%
    \ensuremath{\bigl\{ #1 \IfNoValueTF{#2}{}{\bigm| #2} \bigr\}}%
}

\begin{document}

\[
\Set{A}{B}
\Set{A}
\]

\end{document}

这里m定义中的代表强制参数以及g由 TeX 组分隔的可选参数, IE {}

答案2

抱歉我迟到了。无论如何,gG参数说明符已被弃用。

最自然的语法是\Set{A}或 ,\Set{A | B}甚至比 更容易输入$\Set{A}{B}$

\documentclass{article}

\NewDocumentCommand{\Set}{ >{\SplitArgument{1}{|}}m }{\SetAux#1}
\NewDocumentCommand{\SetAux}{mm}{%
  \bigl\{%
  #1%
  \IfValueT{#2}{\bigm|#2}%
  \bigr\}%
}

\begin{document}

This is a simple set $A=\Set{1,2,3}$, but this is more
complex
\[
B=\Set{x\in C | x=x^2}.
\]

\end{document}

在此处输入图片描述

答案3

您可以创建两个具有不同参数数量(和名称)的宏,并在具有所需名称的复合宏中调用它们。在新宏中,根据使用传递的参数数量调用两个宏中的一个\IfNoValueTF

\documentclass{article}
%Import xparse for \IfNoValueTF 
\usepackage{xparse}

%Define behavior of the command with one parameter
\newcommand{\Seta}[1]{\bigl\{ #1 \bigr\}}

%Define behavior of the command with two parameter
\newcommand{\Setb}[2]{\bigl\{ #1 \bigm| #2 \bigr\}}

%Define a new command with the desired name. It checks if parameter #2 exists; 
%if no, it invokes the first command definition for single parameter (\Seta), else it invokes the \Setb
\NewDocumentCommand\Set{ m g }{
  \IfNoValueTF{#2}{\Seta{#1}}{\Setb{#1}{#2}}
}

\begin{document}
\[
\Set{A}{B}
\Set{A}
\]
\end{document}

相关内容