具有两个定义的新命令

具有两个定义的新命令

我想定义一个新命令,用于两个略有不同的目的。我可以定义一个名为的新命令,\set以便根据填充的参数数量来选择其定义吗?我想要{1,2,3}当我使用\set{1,2,3}并且我想要{x | x> 0}当我使用\set{x}{x>0}

答案1

是的,这是可能的,例如使用\NewDocumentCommandfrom ,使第二个参数表现得像一个可选参数,即使用参数修饰符。 xparse{}g

\set{}请注意,包中已经有一个宏braket,它提供集合的排版,所以我调用了该宏\myset\set{...}在里面使用。

原则上,这可以通过带有尾随可选参数来完成[],这也许更好,因为这强制您区分集合符号的列表版本和条件版本。

编辑我已将该\mybetterset{}[]命令作为变体添加\myset,使用[]作为第二个可选参数。

\documentclass{article}

\usepackage{braket}
\usepackage{mathtools}
\usepackage{xparse}

\NewDocumentCommand{\myset}{mg}{%
  \IfValueTF{#2}{%
    \set{#1\;\vert\;#2}
  }{%
    \set{#1}%
  }%
}

%% The better command with [] as optional argument

   \NewDocumentCommand{\mybetterset}{mo}{%
  \IfValueTF{#2}{%
    \set{#1\;\vert\;#2}
  }{%
    \set{#1}%
  }%
}

\usepackage{hyperref}

\begin{document}
$\myset{1,2,3}$

$\myset{x}{x > 0}$

$\mybetterset{1,2,3}$

$\mybetterset{x}[x>0]$


\end{document}

在此处输入图片描述

答案2

你可以这样做,但我不鼓励你这样做。最好定义一个区分\set{1,2,3}和 的命令\set{x|<condition>}

您可以在 的文档中找到也许更好的方法mathtools

\documentclass{article}

\usepackage{xparse}

\NewDocumentCommand{\set}{>{\SplitArgument{1}{|}}m}{\printset#1}

\NewDocumentCommand{\printset}{mm}{%
  \IfNoValueTF{#2}
   {% no |
    \{#1\}%
   }
   {% |
    \{\,#1\mid#2\,\}%
   }%
}

\begin{document}

$\set{1,2,3}=\set{x | 1\le x\le 3}$

\end{document}

在此处输入图片描述

答案3

这是另一个灵魂,带有可选参数

\documentclass{article}
\newcommand{\set}[2][]{\left\lbrace\if\relax\detokenize{#1}\relax\else#1\mid\fi#2\right\rbrace}

\begin{document}
bla bla
\[\set{a,b,c},\set[x]{x>0}\]
$\set{a,b,c},\set[x]{x>0}$
\end{document}

经典方法

\documentclass{article}

\makeatletter
\newcommand{\set}{\@ifnextchar[{\@@set}{\@set}}
\def\@set#1{\left\lbrace#1\right\rbrace}
\def\@@set[#1]#2{\@set{#1\mid#2}}
\makeatother

\begin{document}
bla bla
\[\set{a,b,c},\set[x]{x>0}\]
$\set{a,b,c},\set[x]{x>0}$
\end{document}

答案4

另一种解决方案,同样使用mathtoolsxparse。当用于由属性定义的集合时,元素和属性之间的分隔符是semicolon,因为它易于输入,并且很少用于数学(由属性定义的集合除外)。 .pdf 文件中的结果符号将是具有正确间距的竖线。如果出于某种原因您确实需要分号,只需将其括在一对括号中即可。因此,语法非常接近手写的语法:\set{x;P(x)}

使用星号版本的命令,括号和垂直线的大小将自动调整为内容的大小\set,或者手动进行微调,使用可选参数:\big, \Big, \bigg,\Bigg`。

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{fourier, erewhon}

\usepackage{xparse}
\usepackage{mathtools, nccmath}

\DeclarePairedDelimiterX{\set}[1]\{\}{\setargs{#1}}
\NewDocumentCommand{\setargs}{>{\SplitArgument{1}{;}}m}
{\setargsaux#1}
\NewDocumentCommand{\setargsaux}{mm}
{\IfNoValueTF{#2}{#1}{\nonscript\,#1\nonscript\;\delimsize\vert\nonscript\:\allowbreak #2\nonscript\,}}
%
% %% The following makes \big the default for the \set command
% \let\oldset\set
% \def\set{\futurelet\testchar\MaybeOptArgSet}
% \def\MaybeOptArgSet{\ifx[\testchar \let\next\OptArgSet
% \else \let\next\NoOptArgSet \fi \next}
% \def\OptArgSet[#1]#2{\oldset[#1]{#2}}
% \def\NoOptArgSet#1{\OptArgSet[\big]{#1}}
%
% \def\Set{\oldset*}%

%%% Syntax: \set{x ; P(x)})
\begin{document}

\begin{align*}
    & \set[\big]{x ; x > 5} & & \set*{x ; x > 5} \\[4pt]
    & \set[\bigg]{ \frac{x}{2} ; x > 5} & & \set*{ \frac{x}{2} ; x > 5} \\[4pt]
    & \set[\Bigg]{ \frac{1}{2},\frac{1}{3},\frac{1}{4},\dotsm} & & \set*{ \mfrac{1}{2},\mfrac{1}{3},\mfrac{1}{4},\dotsm}
\end{align*}

\end{document} 

在上面的代码中,我注释掉了一些导致默认隐式使用\big可选参数的行(我认为这样更好)。该\set*命令被替换为新Set命令。

在此处输入图片描述

相关内容