我想定义一个由多个括号组成的可拉伸分隔符,以便它们被拉伸到相同的高度,即如果我声明
\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