Como posso definir uma macro (ou macros) que funcione de forma automática como as primitivas \left
and \right
, mas não considere o espaço abaixo ou acima de operadores como \sum
or \bigcup
?
\mleft
Este / esquerdo e direito modificado \mright
devem 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 \lrm
funciona primeiro usando a \vphantom
com o conteúdo real dos parênteses para obter a altura geral correta da linha. Aí ele chama \left
e cria outro \vphantom
, mas dessa vez ele altera os catcodes e redefine ^
e _
para mean \relax
. Finalmente, ele realmente exibe o conteúdo \smash
antes da chamada para \right
. Por causa da \smash
altura 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 (
\expandonce
nas\scantokens
ajudas, mas quebrariam a maioria dos aplicativos aninhados). \mleft
/\mright
não pode ser aninhado, mas o aninhamento\lrm
é possível.\scantokens
requer 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.