在最近的 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}