该软件包braket
提供mathtools
了两个不同的命令来排版具有动态大小括号的集合。
例如braket
:
\documentclass{standalone}
\usepackage{braket}
\begin{document}
$\displaystyle \set{ \frac{x}{2} | x > 5 }$
$\displaystyle \Set{ \frac{x}{2} | x > 5 }$
\end{document}
以下示例为mathtools
:
\documentclass{standalone}
\RequirePackage{mathtools}
\DeclarePairedDelimiterX\setc[2]{\{}{\}}{\,#1 \;\delimsize\vert\; #2\,}
\begin{document}
$\displaystyle \setc{ \frac{x}{2} }{ x > 5 }$
$\displaystyle \setc*{ \frac{x}{2} }{ x > 5 }$
$\displaystyle \setc[\bigg]{ \frac{x}{2} }{ x > 5 }$
\end{document}
(setc
从https://tex.stackexchange.com/questions/448#124781)
我目前正在使用它,braket
因为它的界面更好。但是,最近我发现在相同情况下,我想手动指定括号大小,如示例中的第三种情况mathtools
。是否有可能将两个包的功能合并到一个命令中?
答案1
基于xparse
相同的原理,这里有一个解决方案,它允许更自然的语法——至少更接近手写的内容:\set{x ; P(x)}
。此外,它允许键入枚举集,例如\set{1, 2, 3,…}
。唯一的限制是,如果您必须在 \set 的参数中使用;
,则必须将其写为{;}
。
我还将 重写\set*
为,并选择使用经典技巧将\Set
默认可选参数定义为—— 即。我的经验告诉我,普通的 \set 通常看起来太小。但是,如果您需要或想要它,您只需编写。\set
\big
\set[]
无论如何,这是演示:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{fourier, heuristica}
\usepackage{xparse}
\usepackage{mathtools, nccmath}
\DeclarePairedDelimiterX{\set}[1]\{\}{\setargs{#1}}
\NewDocumentCommand{\setargs}{>{\SplitArgument{1}{;}}m}
{\setargsaux#1}
\NewDocumentCommand{\setargsaux}{mm}
{\IfNoValueTF{#2}{#1}{\,#1\nonscript\;\delimsize\vert\nonscript\:\allowbreak #2\,}}
%% 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{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}
答案2
感谢@Manuel 的提示和@egreg 的回答https://tex.stackexchange.com/a/182943/45603我找到了一个很好的解决方案。
\documentclass{standalone}
\usepackage{mathtools,xparse}
\NewDocumentCommand\set{sO{}m}{%
\begingroup
\IfBooleanTF{#1}
{\setInn*{#3}}
{\setInn[#2]{#3}}%
\endgroup
}
\DeclarePairedDelimiterX\setInn[1]\{\}{%
\activatebar
#1%
}
\newcommand{\activatebar}{%
\begingroup\lccode`~=`|
\lowercase{\endgroup\def~}{\;\delimsize\vert\;}%
\mathcode`|=\string"8000
}
\newcommand\Set{\set*}
\begin{document}
$\displaystyle \set{ \frac{x}{2} | x > 5 }$
$\displaystyle \set*{ \frac{x}{2} | x > 5 }$
$\displaystyle \set[\bigg]{ \frac{x}{2} | x > 5 }$
$\displaystyle \Set{ \frac{x}{2} | x > 5 }$
\end{document}
(向货物崇拜节目致敬)