我们习惯使用\left
和\right
运算符,每个运算符后跟分隔符,等等。\{\}[]().\lvert\rvert
我的问题是:是否可以生成一个快捷命令,\lr
使其\lr{\{, \}, \frac{a}{b}}
输出与 相同的输出\left\{ \frac{a}{b} \right\}
?
此致,
布鲁诺·佩索托
答案1
不确定这有什么用处……
\documentclass{article}
\NewDocumentCommand{\lr}{>{\SplitArgument{2}{,}}m}{%
\dolr#1%
}
\NewDocumentCommand{\dolr}{mmm}{%
\left#1 #3 \right#2%
}
\begin{document}
\[
\lr{\{,\},\frac{a}{b}}
+
\lr{(,),\frac{a}{b}}
+
\lr{[,],\frac{a}{b}}
\]
\end{document}
给\SplitArgument{2}{,}
定的参数作为三个括号组传递给内部宏,因此我们可以\dolr
根据需要定义三个参数。
也许更有趣的是更灵活的键值接口。可以通过big
或类似方式手动指定大小;用于自动调整大小。使用*
。分隔符的形状使用类似于amsmath
矩阵的语法指定:
p
括号内b
用于括号B
用于牙套v
用于单条V
用于双杆a
用于尖括号
如果您有非标准分隔符,您可以随时执行left=<del>
和right=<del>
。
在强制参数中,\lr
您可以使用|
它来生成像外部围栏一样延伸的垂直条。
\documentclass{article}
\usepackage{amsmath}
\usepackage{mleftright}
\ExplSyntaxOn
\NewDocumentCommand{\lr}{O{}m}
{
\group_begin:
\keys_set:nn { peixoto/lr } { size, left=., right=., #1 }
\char_set_active_eq:nN { `| } \__peixote_lr_del:
\char_set_mathcode:nn { `| } { "8000 }
\peixoto_lr:n { #2 }
\group_end:
}
\keys_define:nn { peixoto/lr }
{
left .tl_set:N = \l__peixoto_lr_leftdel_tl,
right .tl_set:N = \l__peixoto_lr_rightdel_tl,
lp .meta:n = { left=( },
rp .meta:n = { right=) },
p .meta:n = { lp,rp },
lb .meta:n = { left=[ },
rb .meta:n = { right=] },
b .meta:n = { lb,rb },
lB .meta:n = { left=\{ },
rB .meta:n = { right=\} },
B .meta:n = { lB,rB },
lv .meta:n = { left=\lvert },
rv .meta:n = { right=\rvert },
v .meta:n = { lv,rv },
lV .meta:n = { left=\lVert },
rV .meta:n = { right=\rVert },
V .meta:n = { lV,rV },
la .meta:n = { left=\langle },
ra .meta:n = { right=\rangle },
a .meta:n = { la,ra },
size .code:n =
\tl_set:Nx \l__peixoto_leftsize_tl { \exp_not:c { __peixoto_lr_#1l: } }
\tl_set:Nx \l__peixoto_midsize_tl { \exp_not:c { __peixoto_lr_#1m: } }
\tl_set:Nx \l__peixoto_rightsize_tl { \exp_not:c { __peixoto_lr_#1r: } },
size .default:n = {},
big .meta:n = { size = big },
Big .meta:n = { size = Big },
bigg .meta:n = { size = bigg },
Bigg .meta:n = { size = Bigg },
* .code:n =
\tl_set:Nn \l__peixoto_leftsize_tl { \mleft }
\tl_set:Nn \l__peixoto_midsize_tl { \;\middle\vert\; }
\tl_set:Nn \l__peixoto_rightsize_tl { \mright },
}
\tl_new:N \l__peixoto_leftsize_tl
\tl_new:N \l__peixoto_rightsize_tl
\cs_new_protected:Nn \peixoto_lr:n
{
\l__peixoto_leftsize_tl\l__peixoto_lr_leftdel_tl
#1
\l__peixoto_rightsize_tl\l__peixoto_lr_rightdel_tl
}
\cs_new:Nn \__peixoto_lr_l: {}
\cs_new:Nn \__peixoto_lr_m: {\mid}
\cs_new:Nn \__peixoto_lr_r: {}
\clist_map_inline:nn { big,Big,bigg,Bigg }
{
\cs_new_eq:cc {__peixoto_lr_#1l:} {#1l}
\cs_new_protected:cn {__peixoto_lr_#1m:} {\use:c{#1m}\vert}
\cs_new_eq:cc {__peixoto_lr_#1r:} {#1r}
}
\cs_new_protected:Nn \__peixote_lr_del: { \tl_use:N \l__peixoto_midsize_tl }
\ExplSyntaxOff
% example shorthands
\NewDocumentCommand{\lrp}{O{}m}{\lr[p,#1]{#2}}
\NewDocumentCommand{\bra}{O{}m}{\lr[la,rv,#1]{#2}}
\NewDocumentCommand{\ket}{O{}m}{\lr[lv,ra,#1]{#2}}
\NewDocumentCommand{\braket}{O{}m}{\lr[a,#1]{#2}}
\begin{document}
\[
\lr[B,*]{\frac{a}{b}}
+
\lr[p,Big]{\frac{a}{b}}
+
\lr[b,bigg]{\frac{a}{b}}
+
\lr[v,*]{\frac{a}{b}}
+
\lr[V,*]{\frac{a}{b}}
+
\lr[a,*]{\frac{a}{b}}
+
\lr[la,rv,Big]{\frac{a}{b}}
\]
\[
\lr[p]{a+b}^2
\quad
\lr[b,big]{a\lr[p]{b+c}^2-1}^3
\]
\[
\ket{x}\bra{y}+\lrp[big]{a+b}+\braket{a | b}
\]
\[
\ket[big]{x}\bra[Big]{y}+\braket[bigg]{a | b}
\]
\end{document}
答案2
可以使用本机命令声明
\documentclass{article}
\newcommand{\lr}[3]{\left#1 #3 \right#2}
\begin{document}
$\lr{\{} {\}} {\frac{a}{b}}$
\end{document}
解释:
3
中的数字[3]
表示该命令需要 3 个参数。然后,every#
表示每个参数的位置。