Как определить макрос (или макросы), который работает автоматически, как примитивы \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
работает, сначала используя a \vphantom
с фактическим содержимым скобок, чтобы получить правильную общую высоту строки. Затем он вызывает \left
и создает другой \vphantom
, но на этот раз он изменяет catcodes и переопределяет ^
и _
для значения \relax
. Наконец, он фактически выводит содержимое в a \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 ...).- Если использовать скобки, окружающие дробь с двумя суммами, полученные скобки могут выглядеть слишком маленькими.