Versão de \left e \right que ignora subscritos e sobrescritos

Versão de \left e \right que ignora subscritos e sobrescritos

Como posso definir uma macro (ou macros) que funcione de forma automática como as primitivas \leftand \right, mas não considere o espaço abaixo ou acima de operadores como \sumor \bigcup?

\mleftEste / esquerdo e direito modificado \mrightdevem funcionar como \[\Bigl(\sum_i^j\Bigr)\]se a entrada fosse , enquanto o / \[\mleft(\sum_i^j\mright)\]original produz .\left\right\[\Biggl(\sum_i^j\Biggr)\]

Embora eu já tenha uma solução (sb), ela tem algumas ressalvas e pode haver uma abordagem melhor.

Responder1

A macro a seguir \lrmfunciona primeiro usando a \vphantomcom o conteúdo real dos parênteses para obter a altura geral correta da linha. Aí ele chama \lefte cria outro \vphantom, mas dessa vez ele altera os catcodes e redefine ^e _para mean \relax. Finalmente, ele realmente exibe o conteúdo \smashantes da chamada para \right. Por causa da \smashaltura da linha não aumenta.

\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

Esta solução tem algumas ressalvas:

  • Subscritos e sobrescritos nas macros não são detectados ( \expandoncenas \scantokensajudas, mas quebrariam a maioria dos aplicativos aninhados).
  • \mleft/ \mrightnão pode ser aninhado, mas o aninhamento \lrmé possível.
  • \scantokensrequer eTeX (ou seja, pdftex, luatex, xetex ...).
  • Se usado para parênteses em torno de uma fração com duas somas, os parênteses resultantes podem parecer muito pequenos.

informação relacionada