该命令\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
用于没有缩放的情况,并检查空分隔符(.
),如果没有,则打印。