xparse 参数中的下划线

xparse 参数中的下划线

在最近的 xparse 更新中,我注意到用作e{\sb^}参数的宏在使用时不再正常工作,_例如\testA_{a}。我尝试了以下解决方案在 expl3 语法下,冒号上的 SplitArgument 不起作用但似乎都不起作用。

以下是一个 MWE,它说明了该问题以及一些尝试过的解决方案,但这不是实际用例

\documentclass[fleqn]{article}

\usepackage{xparse}
\usepackage{amsmath}

\ExplSyntaxOn

\cs_new_protected:Npn \test_sub:n #1 { | \sb{#1} }
\cs_new_protected:Npn \test_sup:n #1 { | \sp{#1} }

\NewDocumentCommand{\testA}{ e{_^} }
{
    A
    \IfNoValueF{#1}{ \test_sub:n {#1} }
    \IfNoValueF{#2}{ \test_sup:n {#2} }
}

\NewDocumentCommand{\testB}{ e{\sb^} }
{
    A
    \IfNoValueF{#1}{ \test_sub:n {#1} }
    \IfNoValueF{#2}{ \test_sup:n {#2} }
}

\group_begin:
\char_set_lccode:nn { `? } { `: }
\char_set_catcode_math_subscript:n { `? }
\tex_lowercase:D {
    \group_end:
    \NewDocumentCommand{\testC}{ e{?^}}
}
{
    A
    \IfNoValueF{#1}{ \test_sub:n {#1} }
    \IfNoValueF{#2}{ \test_sup:n {#2} }
}

\group_begin:
\use:x{
    \group_end:
    \NewDocumentCommand\exp_not:N\testD{e{\tl_to_str:n { _ }^}}
}
{
    A
    \IfNoValueF{#1}{ \test_sub:n {#1} }
    \IfNoValueF{#2}{ \test_sup:n {#2} }
}

\ExplSyntaxOff

\begin{document}
    \begin{align*}
        \testA_{a} \quad \testA^{b} \quad \testA_{a}^{b} \quad \testA^{b}_{a} \\
        \testB_{a} \quad \testB^{b} \quad \testB_{a}^{b} \quad \testB^{b}_{a} \\
        \testC_{a} \quad \testC^{b} \quad \testC_{a}^{b} \quad \testC^{b}_{a} \\
        \testD_{a} \quad \testD^{b} \quad \testD_{a}^{b} \quad \testD^{b}_{a}
    \end{align*}
    Expected
    \begin{align*}
        A|_a \quad A|^b \quad A|_a|^b \quad A|_a|^b
    \end{align*}
\end{document}

并给出输出

在此处输入图片描述

编辑:我刚刚在 overleaf 上使用 texlive 2017、2018 和 2019 运行了相同的代码,这三个都给出了输出

在此处输入图片描述

这表明e{\sb^}以前曾经起作用(我不能说这是 xparse 的预期行为)。

答案1

您不能在下的_参数中使用,因为它变成了类别代码 11。e\ExplSyntaxOn_

最好的方法是在范围之外定义这样的命令\ExplSyntaxOn,但你也可以在其中执行此操作:

\documentclass[fleqn]{article}

\usepackage{xparse}
\usepackage{amsmath}

\ExplSyntaxOn

\cs_new_protected:Npn \test_sub:n #1 { | \sb{#1} }
\cs_new_protected:Npn \test_sup:n #1 { | \sp{#1} }

\exp_args:Nne \NewDocumentCommand{\testA}{ e{\char_generate:nn {`_}{8}^} }
  {
    A
    \IfNoValueF{#1}{ \test_sub:n {#1} }
    \IfNoValueF{#2}{ \test_sup:n {#2} }
  }

\ExplSyntaxOff

\begin{document}

\begin{equation*}
  \testA_{a} \quad \testA^{b} \quad \testA_{a}^{b} \quad \testA^{b}_{a} \\
\end{equation*}
Expected
\begin{equation*}
        A|_a \quad A|^b \quad A|_a|^b \quad A|_a|^b
\end{equation*}

\end{document}

诀窍在于生成具有正确类别代码(即 8)的字符。

在此处输入图片描述

答案2

我认为它从来没有起作用,至少我无法用 texlive 2018 重现它。我会在 expl3 catcodes 之外设置命令:

\documentclass[fleqn]{article}

\usepackage{xparse}
\usepackage{amsmath}


\ExplSyntaxOn

\cs_new_protected:Npn \test_sub:n #1 { | \sb{#1} }
\cs_new_protected:Npn \test_sup:n #1 { | \sp{#1} }

\ExplSyntaxOff
\NewDocumentCommand{\testA}{ e{_^} }
{
    A
    \IfNoValueF{#1}{ \csname test_sub:n\endcsname {#1} }
    \IfNoValueF{#2}{ \csname test_sup:n\endcsname {#2} }
}


\begin{document}
    \begin{align*}
        \testA_{a} \quad \testA^{b} \quad \testA_{a}^{b} \quad \testA^{b}_{a} \\
     \end{align*}
    Expected
    \begin{align*}
        A|_a \quad A|^b \quad A|_a|^b \quad A|_a|^b
    \end{align*}
\end{document}

相关内容