参数化左右运算符

参数化左右运算符

我们习惯使用\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#表示每个参数的位置。

相关内容