忽略下標和上標的 \left 和 \right 版本

忽略下標和上標的 \left 和 \right 版本

如何定義一個以自動方式工作的巨集(或多個巨集),如原語\leftand \right,但不考慮運算子下方或上方的空間,如\sumor \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 ...)。
  • 如果用於包含兩個和的分數的括號,則產生的括號可能看起來太小。

相關內容