使用 brackett 和 mathtools 自动调整括号大小

使用 brackett 和 mathtools 自动调整括号大小

该软件包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}

setchttps://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}

(向货物崇拜节目致敬)

相关内容