忽略下标和上标的 \left 和 \right 版本

忽略下标和上标的 \left 和 \right 版本

\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...)。
  • 如果用于括住两个和的分数的括号,则得到的括号可能看起来太小。

相关内容