我想定义一个新命令,用于两个略有不同的目的。我可以定义一个名为的新命令,\set
以便根据填充的参数数量来选择其定义吗?我想要{1,2,3}当我使用\set{1,2,3}
并且我想要{x | x> 0}当我使用\set{x}{x>0}
。
答案1
是的,这是可能的,例如使用\NewDocumentCommand
from ,使第二个参数表现得像一个可选参数,即使用参数修饰符。 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
另一种解决方案,同样使用mathtools
和xparse
。当用于由属性定义的集合时,元素和属性之间的分隔符是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
命令。