¿Cómo puedo definir una macro (o macros) que funcione de forma automática como las primitivas \left
y \right
, pero no considere el espacio debajo o encima de operadores como \sum
o \bigcup
?
\mleft
Este / izquierdo y derecho modificado \mright
debería funcionar como
\[\Bigl(\sum_i^j\Bigr)\]
si la entrada fuera , mientras que el / \[\mleft(\sum_i^j\mright)\]
original produce .\left
\right
\[\Biggl(\sum_i^j\Biggr)\]
Si bien ya tengo una solución (algo), tiene algunas salvedades y podría haber un enfoque mejor.
Respuesta1
La siguiente macro \lrm
funciona usando primero a \vphantom
con el contenido real de los paréntesis para obtener la altura general correcta de la línea. Luego llama \left
y crea otro \vphantom
, pero esta vez cambia los catcodes y redefine ^
y _
to mean \relax
. Finalmente, en realidad genera el contenido justo \smash
antes de la llamada a \right
. Debido a \smash
la línea la altura no 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 solución tiene algunas advertencias:
- Los subíndices y superíndices dentro de las macros no se detectan (
\expandonce
en las\scantokens
ayudas, pero dañarían la mayoría de las aplicaciones anidadas). \mleft
/\mright
no se puede anidar, pero\lrm
es posible anidar.\scantokens
requiere eTeX (es decir, pdftex,luatex,xetex...).- Si se usan para paréntesis que rodean una fracción con dos sumas, los paréntesis resultantes pueden parecer demasiado pequeños.