Версия \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работает, сначала используя 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 ...).
  • Если использовать скобки, окружающие дробь с двумя суммами, полученные скобки могут выглядеть слишком маленькими.

Связанный контент