我试图重写@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}