如何定義一個以自動方式工作的巨集(或多個巨集),如原語\left
and \right
,但不考慮運算子下方或上方的空間,如\sum
or \bigcup
?
修改後的 left 和 reight \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
,但這次它更改了 catcode 並重新定義了^
和_
的含義\relax
。最後,它實際上\smash
在呼叫 之前輸出 a 中的內容\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 ...)。- 如果用於包含兩個和的分數的括號,則產生的括號可能看起來太小。