Wie kann ich ein Makro (oder Makros) definieren, das automatisch funktioniert wie die Grundelemente \left
und , aber den Raum unter oder über Operatoren wie oder \right
nicht berücksichtigt ?\sum
\bigcup
Dieses geänderte linke und rechte \mleft
/ \mright
sollte so funktionieren,
\[\Bigl(\sum_i^j\Bigr)\]
als ob die Eingabe wäre \[\mleft(\sum_i^j\mright)\]
, während das ursprüngliche \left
/ \right
erzeugt \[\Biggl(\sum_i^j\Biggr)\]
.
Ich habe zwar bereits eine Lösung (sb), diese weist jedoch einige Einschränkungen auf und es könnte einen besseren Ansatz geben.
Antwort1
Das folgende Makro \lrm
verwendet zunächst a \vphantom
mit dem tatsächlichen Inhalt der Klammern, um die korrekte Gesamtzeilenhöhe zu erhalten. Dann ruft es \left
ein weiteres auf und erstellt es \vphantom
, aber dieses Mal ändert es die Catcodes und definiert ^
und _
neu in die Bedeutung \relax
. Schließlich gibt es tatsächlich den Inhalt innerhalb von a \smash
direkt vor dem Aufruf von aus \right
. Denn \smash
die Zeilenhöhe erhöht sich nicht.
\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
Diese Lösung weist einige Einschränkungen auf:
- Tief- und Hochstellungen innerhalb von Makros werden nicht erkannt (
\expandonce
innerhalb der\scantokens
Hilfen, würden aber die meisten verschachtelten Anwendungen beschädigen). \mleft
/\mright
können nicht verschachtelt werden, aber eine Verschachtelung\lrm
ist möglich.\scantokens
erfordert eTeX (d. h. pdftex, luatex, xetex …).- Bei Verwendung für Klammern um einen Bruch mit zwei Summen können die resultierenden Klammern zu klein aussehen.