\left
我如何定义一个宏(或多个宏),使其像原语和一样自动工作\right
,但不考虑\sum
或之类的运算符下方或上方的空间\bigcup
?
如果输入是,则修改后的左和右\mleft
/\mright
应该像 一样工作 ,而原始/产生。\[\Bigl(\sum_i^j\Bigr)\]
\[\mleft(\sum_i^j\mright)\]
\left
\right
\[\Biggl(\sum_i^j\Biggr)\]
虽然我已经有一个解决方案(sb),但它有一些注意事项,而且可能有更好的方法。
答案1
以下宏的\lrm
工作原理是首先使用\vphantom
带有括号的实际内容的 来获取正确的整体行高。然后它调用\left
并创建另一个\vphantom
,但这次它更改了 catcodes 并重新定义^
和_
以表示。最后,它实际上在调用 之前\relax
输出 中的内容。因为行高没有增加。\smash
\right
\smash
\begingroup
\catcode`_=\active
\catcode`^=\active
\gdef\lrm#1#2#3{%
\vphantom{#2}%
\left#1%
\vphantom{
\begingroup
\def\sb##1{\relax}%
\def\sp##1{\relax}%
\def_##1{\sb{##1}}%
\def^##1{\sp{##1}}%
\catcode`_=\active
\catcode`^=\active
\scantokens{ #2\endinput}%
\endgroup
}
\smash{#2}
\right#3%
}
\gdef\mleft#1#2\mright#3{\lrm{#1}{#2}{#3}}
\gdef\mmleft#1#2\mmright#3{\lrm{#1}{#2}{#3}}
\gdef\mmmleft#1#2\mmmright#3{\lrm{#1}{#2}{#3}}
\endgroup
这个解决方案有一些注意事项:
- 无法检测到宏内的下标和上标(在帮助
\expandonce
中\scantokens
,但会破坏大多数嵌套应用程序)。 \mleft
/\mright
不能嵌套,但\lrm
可以嵌套。\scantokens
需要 eTeX(即 pdftex、luatex、xetex...)。- 如果用于括住两个和的分数的括号,则得到的括号可能看起来太小。