问题

问题

该命令\DeclarePairedDelimiter(来自mathtools包)允许使用分隔符大小命令\big,\Big,\bigg,\Bigg,并允许定义自定义成对分隔符。例如,宏\DeclarePairedDelimiter{\Paren}{\lparen}{\rparen}(使用mathtools命令\lparen\rparen)允许编写类似表达式\Paren[\Bigg]{x},其输出是字母“x”被最大括号括起来(当然,这不是“自定义”成对分隔符的一个非常有趣的例子)。

但是,有时可能需要使用独立命令来调用自定义的开始和结束分隔符:例如,每当分隔符之间的内容太长时,我更喜欢这样做,例如

\customleftdelimiter A very long math expression \customrightdelimiter

代替

\customdelimiter{A very long long math expression}

mathtools用户手册(版本 2022/06/29)第 28 页中,有这样一段内容:

笔记2:如果你想定义自己的手动缩放器宏,那么\foo定义\fool和也很重要\foor。当指定缩放器时,例如 \abs[\big]{〈arg〉},我们实际上使用 \bigl 和\bigr

问题是没有给出如何执行此操作的说明。也许DeclareOpeningDelimiter存在命令,但文档中没有描述mathtools

问题

如何定义\fool\foor命令,本着 mathtools 包裹

笔记:这是我之前问过的一个问题的重述,我将其删除了,因为它与另一个问题混在一起了(我会就该问题提出一个单独的问题)。

答案1

这是一个尊重嵌套级别的版本。

\documentclass{article}
\usepackage{mathtools}

\ExplSyntaxOn

\NewDocumentCommand{\definegenericpaired}{mmm}
 {% #1 = name, #2 = left delimiter, #3 = right delimiter
  \chibchas_lr_new:nnn { #1 } { #2 } { #3 }
 }

\int_new:N \g__chibchas_lr_nestlevel_int

\cs_new_protected:Nn \chibchas_lr_new:nnn
 {
  \ExpandArgs{c}\NewDocumentCommand{#1l}{so}
   {
    % store the star or the optional argument
    \tl_gclear_new:c { g__chibchas_lr_\int_to_arabic:n { \g__chibchas_lr_nestlevel_int }_tl }
    \IfBooleanTF{##1}
     {
      \tl_gset:cn { g__chibchas_lr_\int_to_arabic:n { \g__chibchas_lr_nestlevel_int }_tl } { \right }
     }
     {
      \IfNoValueF{##2}
       {
        \tl_gset:cn { g__chibchas_lr_\int_to_arabic:n { \g__chibchas_lr_nestlevel_int }_tl }
          { \use:c { \cs_to_str:N ##2 r } }
       }
     }
    % increase the nest level
    \int_gincr:N \g__chibchas_lr_nestlevel_int
    % deliver the left delimiter
    \IfBooleanTF{##1}
     { \left }
     { \IfNoValueF{##2} { \use:c { \cs_to_str:N ##2 l } } }
    #2
   }
  \ExpandArgs{c}\NewDocumentCommand{#1r}{}
   {
    % decrease the nest level
    \int_gdecr:N \g__chibchas_lr_nestlevel_int
    % deliver the right delimiter
    \tl_use:c { g__chibchas_lr_\int_to_arabic:n { \g__chibchas_lr_nestlevel_int }_tl } #3
   }
 }

\ExplSyntaxOff

\definegenericpaired{foo}{(}{)}
\definegenericpaired{baz}{[}{]}


\begin{document}

\[
\fool* \frac{1}{2} + \bazl[\Big] x + \fool y \foor - z \bazr - 1 \foor
\]

\end{document}

对于每个左分隔符,请求的大小都保存在全局标记列表变量中,因此可以在匹配的右分隔符处使用它。如果你忘记了一些,你就完了……

在此处输入图片描述

答案2

您可以使用\customldel\customrdel来定义左分隔符和右分隔符。左分隔符可以采用类似这样的参数,\big以便缩放分隔符以及与其配对的右分隔符。

您需要匹配左和右分隔符(即每个自定义左分隔符必须与自定义右分隔符配对),但您可以将预定义\lempty\rempty自定义分隔符用于空分隔符(\lempty也可以用于设置与之配对的右分隔符的比例)。

\documentclass{article}

\def\noscale#1{\ifx.#1 \else#1\fi}

\makeatletter
\def\mstrip{\expandafter\@gobble\string}
\let\customscale=\noscale
\def\customldel#1#2{%
    \expandafter\def\csname \mstrip#1@help\endcsname[##1]{%
        \begingroup%
        \edef\customscale{\expandafter\noexpand\csname \mstrip##1r\endcsname}%
        \csname \mstrip##1l\endcsname{#2}%
    }%
    \def#1{\@ifnextchar[ {\csname \mstrip#1@help\endcsname}%
                         {\begingroup\let\customscale=\noscale#2}}%
}

\def\customrdel#1#2{%
        \def#1{\customscale{#2}\endgroup}%
}
\makeatother

\begin{document}

\customldel{\lempty}.
\customrdel{\rempty}.
\customldel{\lcparen}(
\customrdel{\rcparen})

\[ \lempty[\bigg]\lcparen[\big] a\lcparen b\rempty c \rcparen\rcparen \]
\[ \bigl( a(b c \bigr) \biggr) \]

\end{document}

显示自定义分隔符

它的工作原理是将当前的比例量存储在寄存器中\customscale,该寄存器在自定义的右分隔符后恢复。\noscale用于没有缩放的情况,并检查空分隔符(.),如果没有,则打印。

相关内容