ExplSyntax 开关内的数学下标

ExplSyntax 开关内的数学下标

我试图重写@egreg的回答以 foreach 方式重复使用 DeclarePairedDelimiter线程来解决另一个“代码重用”问题,但我认为我在 ExplSyntax 开关之间的数学下标方面遇到了一些问题。

\documentclass{article}

\usepackage{mathtools}
\usepackage{xparse}

\ExplSyntaxOn
\cs_new_protected:Nn \serafiel_definedelimiters:NN
 {
  \NewDocumentCommand #1 {E{_^}{{a+}{\alpha}}m}
   {
    \mathrm{#2}
    \c_math_subscript_token{##1}
    \c_math_superscript_token{##2}
    ##3
   }
 }
\cs_generate_variant:Nn \serafiel_definedelimiters:NN { cN }

\NewDocumentCommand{\definedelimiters}{m}
 {
  \clist_map_inline:nn { #1 }
   {
    \serafiel_definedelimiters:cN ##1 ##1
   }
 }
\ExplSyntaxOff

\definedelimiters{ D, I }

\begin{document}
\[
 \I x(t) \qquad \D x(t)
\]
\[
 \I_{b-}^{1-\alpha} x(t) \qquad \D_{b-}^{1-\alpha} x(t)
\]
\end{document}

我这样做了:

\documentclass{article}

\usepackage{mathtools}
\usepackage{xparse}

\NewDocumentCommand{\test}{m}
 {
  \expandafter\NewDocumentCommand\csname#1\endcsname{E{_^}{{a+}{\alpha}}m}
   {
    \mathrm{#1}_{##1}^{##2}##3
   }
 }

\test{I}
\test{D}

\begin{document}
\[
 \I x(t) \qquad \D x(t)
\]
\[
 \I_{b-}^{1-\alpha} x(t) \qquad \D_{b-}^{1-\alpha} x(t)
\]
\end{document}

但我想知道为什么我重写的代码不能按我预期的方式工作。

答案1

虽然有点不太理想,但是,它确实有效!

\documentclass{article}

\usepackage{mathtools}
\usepackage{xparse}

\ExplSyntaxOn
\cs_new_protected:Nn \serafiel_definedelimiters:NN
 {
  \use:x
   {
    \NewDocumentCommand #1
     {E{\char_generate:nn{`_}{8}^}{\exp_not:n{{a+}{\alpha}}}m}
   }
   {
    \mathrm{#2}
    \c_math_subscript_token{##1}
    \c_math_superscript_token{##2}
    ##3
   }
 }
\cs_generate_variant:Nn \serafiel_definedelimiters:NN { cN }

\NewDocumentCommand{\definedelimiters}{m}
 {
  \clist_map_inline:nn { #1 }
   {
    \serafiel_definedelimiters:cN ##1 ##1
   }
 }
\ExplSyntaxOff

\definedelimiters{ D, I }

\begin{document}
\[
 \I x(t) \qquad \D x(t)
\]
\[
 \I_{b-}^{1-\alpha} x(t) \qquad \D_{b-}^{1-\alpha} x(t)
\]
\end{document}

另一方面,以下是很多更简单:

\documentclass{article}

\usepackage{mathtools}
\usepackage{xparse}

\NewDocumentCommand{\genericmacro}{mE{_^}{{a+}{\alpha}}}{%
  \mathrm{#1}_{#2}^{#3}%
}
\NewDocumentCommand{\I}{}{\genericmacro{I}}
\NewDocumentCommand{\D}{}{\genericmacro{D}}

\begin{document}
\[
 \I x(t) \qquad \D x(t)
\]
\[
 \I_{b-}^{1-\alpha} x(t) \qquad \D_{b-}^{1-\alpha} x(t)
\]
\end{document}

在此处输入图片描述

答案2

我会定义

\cs_new_protected:Nn \math_sb:n { \c_math_subscript_token   { #1 } } % or, e.g., \math_subscript:n if you prefer
\cs_new_protected:Nn \math_sp:n { \c_math_superscript_token { #1 } } % or, e.g., \math_superscript:n if you prefer
\cs_new_protected:Nn \math_sbsp:nn { \math_sb:n { #1 } \math_sp:n { #2 } } % or \math_subsuperscript:n if you prefer or whatever
\cs_new_protected:Nn \math_sbsp:nnn { #1 \math_sbsp:nn { #2 } { #3 } } % for use in \math_sbsp:nnn { a } { b } { c } = a_b^c 

然后在 expl3 上下文中使用它们。


就你的情况而言,你的问题在于E{_^},你需要以某种方式将其输入_到 之外,\ExplSyntax(On|Off)这样它就不是 catcode 字母了。这是实现此目的的一种方法,但远非理想。

\cs_new_protected:Nn \serafiel_definedelimiters:nNN
 {
  \NewDocumentCommand #2 {#1}
   {
    \math_sbsp:nnn { \mathrm{#3} } {##1} {##2} ##3
   }
 }
\cs_generate_variant:Nn \serafiel_definedelimiters:nNN { ncN }

\NewDocumentCommand \definedelimitersaux { O{mmm} m }
 {
  \clist_map_inline:nn { #2 }
   {
    \serafiel_definedelimiters:ncN { #1 } { ##1 } ##1
   }
 }
\ExplSyntaxOff
\NewDocumentCommand\definedelimiters{m}{\definedelimitersaux[E{_^}{{a+}{\alpha}}m]{#1}}

\definedelimiters{D, I}

相关内容