由多个括号组成的成对分隔符

由多个括号组成的成对分隔符

我想定义一个由多个括号组成的可拉伸分隔符,以便它们被拉伸到相同的高度,即如果我声明

\DeclarePairedDelimiter{\double}{((}{))}

然后\double{...}应该使外部()与内部大小相同,例如

在此处输入图片描述

这个分数的代码是

\delimitershortfall=0pt

\[
    \left(\left( \dfrac{x}{y}\right)\right)
\]

但现在我发现一些奇怪的行为:

在此处输入图片描述

我该如何修复它?

完整 MWE

\documentclass{article}

\usepackage{mathtools}

\usepackage{unicode-math}

\setmathfont{STIX Two Math}

\DeclarePairedDelimiter{\double}{((}{))}

\DeclarePairedDelimiter{\triple}{\{[(}{>)]}

\DeclarePairedDelimiter{\dif}{(}{))}


\begin{document}

    \begin{align}
        \double{x}\\
        \double*{\dfrac{n}{k}}\\
        \triple{x}\\
        \triple*{\dfrac{a}{b}}\\
        \dif*{\dfrac{x}{y}}
    \end{align}

\end{document}

答案1

size 命令仅适用于第一个分隔符,而不适用于后面的分隔符;没有错误消息,但您得到的是实际实现的副产品。

您可以使用\DeclarePairedDelimiterX

\documentclass{article}

\usepackage{mathtools}
\usepackage{unicode-math}

\setmathfont{STIX Two Math}

\DeclarePairedDelimiterX{\double}[1]{(}{)}{\delimsize(#1\delimsize)}
\DeclarePairedDelimiterX{\triple}[1]{\{}{]}{%
  \delimsize[\delimsize(#1\delimsize\rangle\delimsize)%
}
\DeclarePairedDelimiterX{\dif}[1]{(}{)}{#1\delimsize)}

\begin{document}

\begin{align}
\double{x}\\
\double*{\dfrac{n}{k}}\\
\triple{x}\\
\triple*{\dfrac{a}{b}}\\
\dif*{\dfrac{x}{y}}
\end{align}

\end{document}

在此处输入图片描述

完全重新实现,但分隔符的数量必须匹配,用于.平衡。

\documentclass{article}

\usepackage{mathtools,mleftright}
\usepackage{unicode-math}

\setmathfont{STIX Two Math}

\ExplSyntaxOn
\NewDocumentCommand{\DeclareMultiPairedDelimiter}{mmm}
 {
  \NewDocumentCommand{#1}{sO{}m}
   {
    \IfBooleanTF{##1}
     { \fraiman_multi_open_lr:n { #2 } }
     { \fraiman_multi_open:nn { ##2 } { #2 } }
    ##3
    \IfBooleanTF{##1}
     { \fraiman_multi_close_lr:n { #3 } }
     { \fraiman_multi_close:nn { ##2 }{ #3 } }
   }
 }

\cs_new_protected:Nn \fraiman_multi_open_lr:n
 {
  \tl_map_inline:nn { #1 } { \mleft ##1 }
 }
\cs_new_protected:Nn \fraiman_multi_close_lr:n
 {
  \tl_map_inline:nn { #1 } { \mright ##1 }
 }
\cs_new_protected:Nn \fraiman_multi_open:nn
 {
  \mathopen { \tl_map_inline:nn { #2 } {\tl_if_eq:nnF { ##1 } { . } { #1 ##1 } } }
 }
\cs_new_protected:Nn \fraiman_multi_close:nn
 {
  \mathclose { \tl_map_inline:nn { #2 } {\tl_if_eq:nnF { ##1 } { . } { #1 ##1 } } }
 }
\ExplSyntaxOff

\DeclareMultiPairedDelimiter{\double}{((}{))}
\DeclareMultiPairedDelimiter{\triple}{\{[(}{>)]}
\DeclareMultiPairedDelimiter{\dif}{(.}{))}

\begin{document}

\begin{align}
\double{x}\\
\double*{\dfrac{n}{k}}\\
\triple{x}\\
\triple*{\dfrac{a}{b}}\\
\dif*{\dfrac{x}{y}}
\end{align}

\end{document}

答案2

\usepackage{xparse,mleftright}

\ExplSyntaxOn

\NewDocumentCommand \double { s o m }
 {
  \IfBooleanTF {#1}
   { \mleft(\mleft( #3 \mright)\mright) }
   {
    \IfValueTF {#2}
     {
      \use:c { \cs_to_str:N #2 l } (
      \use:c { \cs_to_str:N #2 l } (
      #3
      \use:c { \cs_to_str:N #2 r } )
      \use:c { \cs_to_str:N #2 r } )
     }
     { (( #3 )) }
   }
 }

\ExplSyntaxOff

相关内容