ExplSyntax 的问题

ExplSyntax 的问题

我正在尝试定义一个灵活的“分隔符样式”命令。我在一个包中尝试了它,并\str_case:nnF返回了Undefined Control Sequence,而使用则\str_case:nnn进一步导致了另一个问题,这似乎与命令本身有关。所以我将它移到文档中,得到了以下代码:

\documentclass[a4paper]{report}
\usepackage{amsthm,xparse}
\ExplSyntaxOn
\newcommand{\delim}[3][lr]{
 \str_case:nnF { #1 }
    {
    { b }{\def\lsize{\big}\def\rsize{\big}}
    { B }{\def\lsize{\Big}\def\rsize{\Big}}
    { x }{\def\lsize{\bigg}\def\rsize{\bigg}}
    { X }{\def\lsize{\Bigg}\def\rsize{\Bigg}}
    { lr }{\def\lsize{\left}\def\rsize{\right}}
    { bB }{\def\lsize{\big}\def\rsize{\Big}}
    { Bb }{\def\lsize{\Big}\def\rsize{\big}}
    { xb }{\def\lsize{\bigg}\def\rsize{\big}}
    { xB }{\def\lsize{\bigg}\def\rsize{\Big}}
    { bx }{\def\lsize{\big}\def\rsize{\bigg}}
    { Bx }{\def\lsize{\Big}\def\rsize{\bigg}}
    { bX }{\def\lsize{\big}\def\rsize{\Bigg}}
    { BX }{\def\lsize{\Big}\def\rsize{\Bigg}}
    { xX }{\def\lsize{\bigg}\def\rsize{\Bigg}}
    { Xb }{\def\lsize{\Bigg}\def\rsize{\big}}
    { XB }{\def\lsize{\Bigg}\def\rsize{\Big}}
    { Xx }{\def\lsize{\Bigg}\def\rsize{\bigg}}
}
 \str_case:nnF { #2 }
    {
    { s }{\def\ldel{[}\def\rdel{]}}
    { r }{\def\ldel{(}\def\rdel{)}}
    { b }{\def\ldel{\lbrace}\def\rdel{\rbrace}}
    { v }{\def\ldel{|}\def\rdel{|}}
    { a }{\def\ldel{\langle}\def\rdel{\rangle}}
    { dv }{\def\ldel{\|}\def\rdel{\|}}
    { rs }{\def\ldel{(}\def\rdel{]}}
    { sr }{\def\ldel{[}\def\rdel{)}}
    { rb }{\def\ldel{(}\def\rdel{\rbrace}}
    { sb }{\def\ldel{[}\def\rdel{\rbrace}}
    { br }{\def\ldel{\lbrace}\def\rdel{)}}
    { bs }{\def\ldel{\lbrace}\def\rdel{]}}
    { ra }{\def\ldel{(}\def\rdel{\rangle}}
    { sa }{\def\ldel{[}\def\rdel{\rangle}}
    { ba }{\def\ldel{\lbrace}\def\rdel{\rangle}}
    { ar }{\def\ldel{\langle}\def\rdel{)}}
    { as }{\def\ldel{\langle}\def\rdel{]}}
    { ab }{\def\ldel{\langle}\def\rdel{\rbrace}}
    { rv }{\def\ldel{(}\def\rdel{|}}
    { sv }{\def\ldel{[}\def\rdel{|}}
    { bv }{\def\ldel{\lbrace}\def\rdel{|}}
    { av }{\def\ldel{\langle}\def\rdel{|}}
    { vr }{\def\ldel{|}\def\rdel{)}}
    { vs }{\def\ldel{|}\def\rdel{]}}
    { vb }{\def\ldel{|}\def\rdel{\rbrace}}
    { va }{\def\ldel{|}\def\rdel{\rangle}}
    { rdv }{\def\ldel{(}\def\rdel{\|}}
    { sdv }{\def\ldel{[}\def\rdel{\|}}
    { bdv }{\def\ldel{\lbrace}\def\rdel{\|}}
    { adv }{\def\ldel{\langle}\def\rdel{\|}}
    { vdv }{\def\ldel{|}\def\rdel{\|}}
    { dvr }{\def\ldel{\|}\def\rdel{)}}
    { dvs }{\def\ldel{\|}\def\rdel{]}}
    { dvb }{\def\ldel{\|}\def\rdel{\rbrace}}
    { dva }{\def\ldel{\|}\def\rdel{\rangle}}
    { dvv }{\def\ldel{\|}\def\rdel{|}}
    { lr }{\def\ldel{(}\def\rdel{\@empty}}
    { rr }{\def\ldel{)}\def\rdel{\@empty}}
    { ls }{\def\ldel{[}\def\rdel{\@empty}}
    { rs }{\def\ldel{]}\def\rdel{\@empty}}
    { lb }{\def\ldel{\lbrace}\def\rdel{\@empty}}
    { rb }{\def\ldel{\rbrace}\def\rdel{\@empty}}
    { la }{\def\ldel{\langle}\def\rdel{\@empty}}
    { ra }{\def\ldel{\rangle}\def\rdel{\@empty}}
    { ov }{\def\ldel{|}\def\rdel{\@empty}}
    { odv }{\def\ldel{\|}\def\rdel{\@empy}}
    { ssi }{\def\ldel{[}\def\rdel{\mathclose{[}}}
    { sis }{\def\ldel{\mathopen{]}}\def\rdel{]}}
    { sisi }{\def\ldel{\mathopen{]}}\def\rdel{\mathclose{[}}}
}
\ifx\rdel\@empty
    \lsize\ldel
\else
    \lsize\ldel #3 \rsize\rdel
\fi
}
\ExplSyntaxOff
%\ignopt{greek}

\begin{document}
$$\delim[lr]{r}{\fr{a}{b}}$$
\end{document}

然后最奇怪的事情发生了:

./delim_attempt.tex:3: Undefined control sequence.
<recently read> \ExplSyntaxOn 

l.3 \ExplSyntaxOn

我当时就想:“什么???”这怎么可能?

更新: 考虑到下面的评论,我将其更正为[r]{r}已加载xparse和已更新Expl,这意味着\str_case:nnF现在可以正常工作。因此代码已相应更改。顺便说一句,我怀疑空格可能会带来麻烦,我尝试删除它们(例如{ lr }-> {lr}),但上述代码的错误排版仍然存在。也就是说,代码给出:

./delim_attempt.tex:87: Undefined control sequence.
\\delim ...\@empty\lsize \ldel \else \lsize \ldel 
                                                  #3\rsize \rdel \fi 
l.87 $$\delim[lr]{r}{\frac{a}{b}}
                                 $$

\lsize\ldel #3 \rsize\rdel并通过在分支中注释\else,我可以排版:

rsrbvadvrssrrbsbbrbsrasabaarasabrvsvbvavvrvsvbvardvsdvbdvadvvdvdvrdvsdvbdvadvvlrrrlsrslbrblaraovod

这当然很简单不是我想要的是。

答案1

您误用了expl3;这是一个符合要求的版本:

\documentclass[a4paper]{report}
\usepackage{amsthm,xparse}
\ExplSyntaxOn
\NewDocumentCommand{\delim}{ O{lr} m m }
 {
  \mickg_delim:nnn { #1 } { #2 } { #3 }
 }

\tl_new:N \l_mickg_lsize_tl
\tl_new:N \l_mickg_rsize_tl
\tl_new:N \l_mickg_ldel_tl
\tl_new:N \l_mickg_rdel_tl

\cs_new_protected:Npn \mickg_delim:nnn #1 #2 #3
 {
  \str_case:nnF { #1 }
   {
    { b }{\tl_set:Nn \l_mickg_lsize_tl {\big} \tl_set:Nn \l_mickg_rsize_tl {\big}}
    { B }{\tl_set:Nn \l_mickg_lsize_tl {\Big} \tl_set:Nn \l_mickg_rsize_tl {\Big}}
    { x }{\tl_set:Nn \l_mickg_lsize_tl {\bigg} \tl_set:Nn \l_mickg_rsize_tl {\bigg}}
    { X }{\tl_set:Nn \l_mickg_lsize_tl {\Bigg} \tl_set:Nn \l_mickg_rsize_tl {\Bigg}}
    { lr }{\tl_set:Nn \l_mickg_lsize_tl {\left} \tl_set:Nn \l_mickg_rsize_tl {\right}}
    { bB }{\tl_set:Nn \l_mickg_lsize_tl {\big} \tl_set:Nn \l_mickg_rsize_tl {\Big}}
    { Bb }{\tl_set:Nn \l_mickg_lsize_tl {\Big} \tl_set:Nn \l_mickg_rsize_tl {\big}}
    { xb }{\tl_set:Nn \l_mickg_lsize_tl {\bigg} \tl_set:Nn \l_mickg_rsize_tl {\big}}
    { xB }{\tl_set:Nn \l_mickg_lsize_tl {\bigg} \tl_set:Nn \l_mickg_rsize_tl {\Big}}
    { bx }{\tl_set:Nn \l_mickg_lsize_tl {\big} \tl_set:Nn \l_mickg_rsize_tl {\bigg}}
    { Bx }{\tl_set:Nn \l_mickg_lsize_tl {\Big} \tl_set:Nn \l_mickg_rsize_tl {\bigg}}
    { bX }{\tl_set:Nn \l_mickg_lsize_tl {\big} \tl_set:Nn \l_mickg_rsize_tl {\Bigg}}
    { BX }{\tl_set:Nn \l_mickg_lsize_tl {\Big} \tl_set:Nn \l_mickg_rsize_tl {\Bigg}}
    { xX }{\tl_set:Nn \l_mickg_lsize_tl {\bigg} \tl_set:Nn \l_mickg_rsize_tl {\Bigg}}
    { Xb }{\tl_set:Nn \l_mickg_lsize_tl {\Bigg} \tl_set:Nn \l_mickg_rsize_tl {\big}}
    { XB }{\tl_set:Nn \l_mickg_lsize_tl {\Bigg} \tl_set:Nn \l_mickg_rsize_tl {\Big}}
    { Xx }{\tl_set:Nn \l_mickg_lsize_tl {\Bigg} \tl_set:Nn \l_mickg_rsize_tl {\bigg}}
   }
   { \tl_clear:N \l_mickg_lsize_tl \tl_clear:N \l_mickg_rsize_tl }
  \str_case:nnF { #2 }
   {
    { s }{\tl_set:Nn \l_mickg_ldel_tl {[} \tl_set:Nn \l_mickg_rdel_tl {]}}
    { r }{\tl_set:Nn \l_mickg_ldel_tl {(} \tl_set:Nn \l_mickg_rdel_tl {)}}
    { b }{\tl_set:Nn \l_mickg_ldel_tl {\lbrace} \tl_set:Nn \l_mickg_rdel_tl {\rbrace}}
    { v }{\tl_set:Nn \l_mickg_ldel_tl {|} \tl_set:Nn \l_mickg_rdel_tl {|}}
    { a }{\tl_set:Nn \l_mickg_ldel_tl {\langle} \tl_set:Nn \l_mickg_rdel_tl {\rangle}}
    { dv }{\tl_set:Nn \l_mickg_ldel_tl {\|} \tl_set:Nn \l_mickg_rdel_tl {\|}}
    { rs }{\tl_set:Nn \l_mickg_ldel_tl {(} \tl_set:Nn \l_mickg_rdel_tl {]}}
    { sr }{\tl_set:Nn \l_mickg_ldel_tl {[} \tl_set:Nn \l_mickg_rdel_tl {)}}
    { rb }{\tl_set:Nn \l_mickg_ldel_tl {(} \tl_set:Nn \l_mickg_rdel_tl {\rbrace}}
    { sb }{\tl_set:Nn \l_mickg_ldel_tl {[} \tl_set:Nn \l_mickg_rdel_tl {\rbrace}}
    { br }{\tl_set:Nn \l_mickg_ldel_tl {\lbrace} \tl_set:Nn \l_mickg_rdel_tl {)}}
    { bs }{\tl_set:Nn \l_mickg_ldel_tl {\lbrace} \tl_set:Nn \l_mickg_rdel_tl {]}}
    { ra }{\tl_set:Nn \l_mickg_ldel_tl {(} \tl_set:Nn \l_mickg_rdel_tl {\rangle}}
    { sa }{\tl_set:Nn \l_mickg_ldel_tl {[} \tl_set:Nn \l_mickg_rdel_tl {\rangle}}
    { ba }{\tl_set:Nn \l_mickg_ldel_tl {\lbrace} \tl_set:Nn \l_mickg_rdel_tl {\rangle}}
    { ar }{\tl_set:Nn \l_mickg_ldel_tl {\langle} \tl_set:Nn \l_mickg_rdel_tl {)}}
    { as }{\tl_set:Nn \l_mickg_ldel_tl {\langle} \tl_set:Nn \l_mickg_rdel_tl {]}}
    { ab }{\tl_set:Nn \l_mickg_ldel_tl {\langle} \tl_set:Nn \l_mickg_rdel_tl {\rbrace}}
    { rv }{\tl_set:Nn \l_mickg_ldel_tl {(} \tl_set:Nn \l_mickg_rdel_tl {|}}
    { sv }{\tl_set:Nn \l_mickg_ldel_tl {[} \tl_set:Nn \l_mickg_rdel_tl {|}}
    { bv }{\tl_set:Nn \l_mickg_ldel_tl {\lbrace} \tl_set:Nn \l_mickg_rdel_tl {|}}
    { av }{\tl_set:Nn \l_mickg_ldel_tl {\langle} \tl_set:Nn \l_mickg_rdel_tl {|}}
    { vr }{\tl_set:Nn \l_mickg_ldel_tl {|} \tl_set:Nn \l_mickg_rdel_tl {)}}
    { vs }{\tl_set:Nn \l_mickg_ldel_tl {|} \tl_set:Nn \l_mickg_rdel_tl {]}}
    { vb }{\tl_set:Nn \l_mickg_ldel_tl {|} \tl_set:Nn \l_mickg_rdel_tl {\rbrace}}
    { va }{\tl_set:Nn \l_mickg_ldel_tl {|} \tl_set:Nn \l_mickg_rdel_tl {\rangle}}
    { rdv }{\tl_set:Nn \l_mickg_ldel_tl {(} \tl_set:Nn \l_mickg_rdel_tl {\|}}
    { sdv }{\tl_set:Nn \l_mickg_ldel_tl {[} \tl_set:Nn \l_mickg_rdel_tl {\|}}
    { bdv }{\tl_set:Nn \l_mickg_ldel_tl {\lbrace} \tl_set:Nn \l_mickg_rdel_tl {\|}}
    { adv }{\tl_set:Nn \l_mickg_ldel_tl {\langle} \tl_set:Nn \l_mickg_rdel_tl {\|}}
    { vdv }{\tl_set:Nn \l_mickg_ldel_tl {|} \tl_set:Nn \l_mickg_rdel_tl {\|}}
    { dvr }{\tl_set:Nn \l_mickg_ldel_tl {\|} \tl_set:Nn \l_mickg_rdel_tl {)}}
    { dvs }{\tl_set:Nn \l_mickg_ldel_tl {\|} \tl_set:Nn \l_mickg_rdel_tl {]}}
    { dvb }{\tl_set:Nn \l_mickg_ldel_tl {\|} \tl_set:Nn \l_mickg_rdel_tl {\rbrace}}
    { dva }{\tl_set:Nn \l_mickg_ldel_tl {\|} \tl_set:Nn \l_mickg_rdel_tl {\rangle}}
    { dvv }{\tl_set:Nn \l_mickg_ldel_tl {\|} \tl_set:Nn \l_mickg_rdel_tl {|}}
    { lr }{\tl_set:Nn \l_mickg_ldel_tl {(} \tl_clear:N \l_mickg_rdel_tl}
    { rr }{\tl_set:Nn \l_mickg_ldel_tl {)} \tl_clear:N \l_mickg_rdel_tl}
    { ls }{\tl_set:Nn \l_mickg_ldel_tl {[} \tl_clear:N \l_mickg_rdel_tl}
    { rs }{\tl_set:Nn \l_mickg_ldel_tl {]} \tl_clear:N \l_mickg_rdel_tl}
    { lb }{\tl_set:Nn \l_mickg_ldel_tl {\lbrace} \tl_clear:N \l_mickg_rdel_tl}
    { rb }{\tl_set:Nn \l_mickg_ldel_tl {\rbrace} \tl_clear:N \l_mickg_rdel_tl}
    { la }{\tl_set:Nn \l_mickg_ldel_tl {\langle} \tl_clear:N \l_mickg_rdel_tl}
    { ra }{\tl_set:Nn \l_mickg_ldel_tl {\rangle} \tl_clear:N \l_mickg_rdel_tl}
    { ov }{\tl_set:Nn \l_mickg_ldel_tl {|} \tl_clear:N \l_mickg_rdel_tl}
    { odv }{\tl_set:Nn \l_mickg_ldel_tl {\|} \tl_clear:N \l_mickg_rdel_tl}
    { ssi }{\tl_set:Nn \l_mickg_ldel_tl {[} \tl_set:Nn \l_mickg_rdel_tl {\mathclose{[}}}
    { sis }{\tl_set:Nn \l_mickg_ldel_tl {\mathopen{]}} \tl_set:Nn \l_mickg_rdel_tl {]}}
    { sisi }{\tl_set:Nn \l_mickg_ldel_tl {\mathopen{]}} \tl_set:Nn \l_mickg_rdel_tl {\mathclose{[}}}
   }
   { \tl_set:Nn \l_mickg_ldel_tl {(} \tl_set:Nn \l_mickg_rdel_tl {)} } % some default
  \tl_if_empty:NTF \l_mickg_rdel_tl
   {
    \l_mickg_lsize_tl \l_mickg_ldel_tl #3
   }
   {
    \l_mickg_lsize_tl \l_mickg_ldel_tl #3 \l_mickg_rsize_tl \l_mickg_rdel_tl
   }
 }
\ExplSyntaxOff

\begin{document}
\[
\delim[lr]{r}{\frac{a}{b}}
\]
\end{document}

检查texdoc interface3更多信息。该\str_case:nnF函数需要三个参数:第一个是需要检查的字符串,第二个是一组{<string>}{<code>}用于决定要做什么的对;最后一个参数是在“以上都不是”的情况下要执行的代码。

请不要$$在 LaTeX 中使用。这是错误的。

在此处输入图片描述

答案2

这是 egreg 答案的替代方案,其主要目的是稍微整理一下您提出的语法并添加一些警告和错误消息。

还要注意,egreg 的回答中仍然存在问题,类似\delim{ssi}{\frac{a}{b}}这样的情况从您的代码延续到他的代码(和\mathopen\mathclose罪魁祸首)。

在此版本中,大小和分隔符选项均需要两个字母。如果只给出一个字母,则该字母将用于两个分隔符(唯一的例外是大小的“l”和“r”,其中任何一个都会给出一个\leftand\right配对)。

对于分隔符类型,小写字母表示标准方向,大写字母表示反向方向(例如,“rr”表示“(”和“)”,而“RR”表示“)”和“(”)。例外是“v”和“V”,它们分别表示单杠和双杠。当给出“-”时,相应的分隔符将被省略。

两个规范参数都是可选的,分别默认为“lr”和“rr”。

\documentclass[a4paper]{report}
\usepackage{xparse,pgffor}

\ExplSyntaxOn

\tl_new:N \l_mickg_left_delim_size_tl
\tl_new:N \l_mickg_right_delim_size_tl
\tl_new:N \l_mickg_left_delim_tl
\tl_new:N \l_mickg_right_delim_tl

\msg_new:nnnn { MickG } { Left ~ delimiter ~ size }
  { Incorrectly ~ specified ~ left ~ delimiter ~ size.  } {}
\msg_new:nnnn { MickG } { Right ~ delimiter ~ size }
  { Incorrectly ~ specified ~ right ~ delimiter ~ size. } {}
\msg_new:nnnn { MickG } { Delimiter ~ size }
  { Incorrect ~ delimiter ~ size ~ specification. } {}
\msg_new:nnnn { MickG } { Left ~ delimiter }
  { Incorrectly ~ specified ~ left ~ delimiter.  } {}
\msg_new:nnnn { MickG } { Right ~ delimiter }
  { Incorrectly ~ specified ~ right ~ delimiter. } {}
\msg_new:nnnn { MickG } { Delimiters }
  { Incorrect ~ delimiter ~ specification. } {}

\cs_new_protected:Npn \mickg_delims_size_set:n #1
  {
    % Test if one or two letters provided.
    \int_case:nnF { \tl_count:n {#1} }
      {
        { \c_two } { \tl_set:Nn \l_tmpa_tl {#1}   } % If two, use both.
        { \c_one } { \tl_set:Nn \l_tmpa_tl {#1#1} } % If one, use it twice.
      }
      % If not one or two letters, set to 'lr' and issue error.
      {
        \tl_set:Nn \l_tmpa_tl { lr }
        \msg_error:nn { MickG } { Delimiter ~ size }
      }
    % Ensure \left is always paired with \right
    \str_case_x:nnTF { \l_tmpa_tl }
      {
        { lr } { \prg_do_nothing: }
        { ll } { \msg_warning:nn { MickG } { Delimiter ~ size } } % Warn if 'l' was copied.
        { rr } { \msg_warning:nn { MickG } { Delimiter ~ size } } % Warn if 'r' was copied.
      }
      {
        \tl_set_eq:NN \l_mickg_left_delim_size_tl  \left
        \tl_set_eq:NN \l_mickg_right_delim_size_tl \right
      }
      % If not using \left and \rigth, set sizes independently.
      {
        \str_case_x:nnF { \tl_head:N \l_tmpa_tl }
          {
            { b } { \tl_set_eq:NN \l_mickg_left_delim_size_tl \bigl  }
            { B } { \tl_set_eq:NN \l_mickg_left_delim_size_tl \Bigl  }
            { x } { \tl_set_eq:NN \l_mickg_left_delim_size_tl \biggl }
            { X } { \tl_set_eq:NN \l_mickg_left_delim_size_tl \Biggl }
          }
          % Error if no match; default to empty token list.
          { 
            \tl_clear:N \l_mickg_left_delim_size_tl
            \msg_error:nn { MickG } { Left ~ delimiter ~ size } 
          } 
        \str_case_x:nnF { \tl_tail:N \l_tmpa_tl }
          {
            { b } { \tl_set_eq:NN \l_mickg_right_delim_size_tl \bigr   }
            { B } { \tl_set_eq:NN \l_mickg_right_delim_size_tl \Bigr   }
            { x } { \tl_set_eq:NN \l_mickg_right_delim_size_tl \biggr  }
            { X } { \tl_set_eq:NN \l_mickg_right_delim_size_tl \Biggr  }
          }
          % Error if no match; default to empty token list. 
          { 
            \tl_clear:N \l_mickg_right_delim_size_tl
            \msg_error:nn { MickG } { Right ~ delimiter ~ size } 
          }
      }
  }

\cs_new_protected:Npn \mickg_delims_type_set:n #1
  {
    % Test if one or two letters provided.
    \int_case:nnF { \tl_count:n {#1} }
      {
        { \c_two } { \tl_set:Nn \l_tmpa_tl {#1}   } % If two, use both.
        { \c_one } { \tl_set:Nn \l_tmpa_tl {#1#1} } % If one, use it twice.
      }
      % If not one or two letters, set to 'rr' and issue error.
      {
        \tl_set:Nn \l_tmpa_tl { rr }
        \msg_error:nn { MickG } { Delimiters }
      }
    % Test first letter.
    \str_case_x:nnF { \tl_head:N \l_tmpa_tl }
      {
        { r } { \tl_set_eq:NN \l_mickg_left_delim_tl (       }
        { R } { \tl_set_eq:NN \l_mickg_left_delim_tl )       }
        { s } { \tl_set_eq:NN \l_mickg_left_delim_tl [       }
        { S } { \tl_set_eq:NN \l_mickg_left_delim_tl ]       }
        { b } { \tl_set_eq:NN \l_mickg_left_delim_tl \lbrace }
        { B } { \tl_set_eq:NN \l_mickg_left_delim_tl \rbrace }
        { a } { \tl_set_eq:NN \l_mickg_left_delim_tl \langle }
        { A } { \tl_set_eq:NN \l_mickg_left_delim_tl \rangle }
        { v } { \tl_set_eq:NN \l_mickg_left_delim_tl |       }
        { V } { \tl_set_eq:NN \l_mickg_left_delim_tl \|      }
        { - } { \tl_set_eq:NN \l_mickg_left_delim_tl .       }
      }
      % Error if no match; default to "(" 
      { 
        \tl_set_eq:NN \l_mickg_left_delim_tl (
        \msg_error:nn { MickG } { Left ~ delimiter } 
      }
    % Test second letter.
    \str_case_x:nnF { \tl_tail:N \l_tmpa_tl }
      {
        { r } { \tl_set_eq:NN \l_mickg_right_delim_tl )       }
        { R } { \tl_set_eq:NN \l_mickg_right_delim_tl (       }
        { s } { \tl_set_eq:NN \l_mickg_right_delim_tl ]       }
        { S } { \tl_set_eq:NN \l_mickg_right_delim_tl [       }
        { b } { \tl_set_eq:NN \l_mickg_right_delim_tl \rbrace }
        { B } { \tl_set_eq:NN \l_mickg_right_delim_tl \lbrace }
        { a } { \tl_set_eq:NN \l_mickg_right_delim_tl \rangle }
        { A } { \tl_set_eq:NN \l_mickg_right_delim_tl \langle }
        { v } { \tl_set_eq:NN \l_mickg_right_delim_tl |       }
        { V } { \tl_set_eq:NN \l_mickg_right_delim_tl \|      }
        { - } { \tl_set_eq:NN \l_mickg_right_delim_tl .       }
      }
      % Error if no match; default to ")" 
      { 
        \tl_set_eq:NN \l_mickg_right_delim_tl )
        \msg_error:nn { MickG } { Right ~ delimiter } 
      }
  }

\cs_new_protected:Npn \mickg_delims_print:nnn #1 #2 #3
  {
    \mickg_delims_size_set:n {#1}
    \mickg_delims_type_set:n {#2}
    \l_mickg_left_delim_size_tl  \l_mickg_left_delim_tl
    #3
    \l_mickg_right_delim_size_tl \l_mickg_right_delim_tl
  }

\NewDocumentCommand \delim { O{ lr } O{ r } m }
  {
    \mickg_delims_print:nnn {#1} {#2} {#3}
  }

\ExplSyntaxOff

\begin{document}

% Test by iterating through the combinations.
\foreach \x in {b,B,x,X} {
  \foreach \y in {b,B,x,X} {
    \foreach \z in {r,R,s,S,b,B,a,A,v,V,-} {
      \foreach \w in {r,R,s,S,b,B,a,A,v,V,-} {
        % \delim does not expand the optional arguments but this could
        % easily be changed; I expand them here with an \edef
        \edef\foo{\noexpand\delim[\x\y][\z\w]}
        $\displaystyle\foo{\frac{a}{b}}$\quad
      }
    }
  }
}

\end{document}

答案3

1)xparse或者需要类似的包Expl

2) 第二个参数是必需的,所以\delim[lr]{r}{\fr{a}{b}}是正确的。顺便说一下,\fr= \displaystyle\frac

3)您需要一个“非上述情况”的代码,否则会产生奇怪的错误\str_case:nnF;或者,您可以使用\str_case:nn

4) 顺便说一句,如果不更新的话,Expl我不知道这两个函数是否都可用。有一件事是肯定的:\str_case:nnF被称为\str_case:nnn,或者这样的名称由类似的函数承担。

现在我仅测试该命令的其余可能性。

相关内容