我想定义两个版本的命令\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
抱歉我迟到了。无论如何,g
和G
参数说明符已被弃用。
最自然的语法是\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}