xparse e 和 t 类型参数与 newtxmath 的下标校正选项不兼容

xparse e 和 t 类型参数与 newtxmath 的下标校正选项不兼容

看来subscriptcorrection新数学与 e 和 t 型参数不兼容解析使用_。使用改编自 egreg 的答案的示例这里这里,以下内容按预期进行编译:

\documentclass{article}

\usepackage{xparse}
\usepackage{newtxmath}
\usepackage{xcolor}

\NewDocumentCommand{\MyMacro}{t_}{A\IfBooleanT{#1}{\MyMacroAux}}
\NewDocumentCommand{\MyMacroAux}{m}{_{\textcolor{red}{#1}}}
\NewDocumentCommand{\MyOtherMacro}{e_}{
    \IfNoValueTF{#1}
        {\mathbf{A}}
        {A_{\textcolor{red}{#1}}}
    }

\begin{document}
\textbf{t-type:} With a subscript: $\MyMacro_{\pi}$

Without any subscript: $\MyMacro$

\textbf{e-type:} With a subscript: $\MyOtherMacro_{\pi}$

Without any subscript: $\MyOtherMacro$
\end{document}

在此处输入图片描述

但是subscriptcorrection启用后,相同的代码编译时不会出现错误,但宏没有效果:

在此处输入图片描述

newtxmath.sty 中由包选项启用的以下几行表明这是一个 catcode 问题:

\AtBeginDocument{\mathcode`\_=\string"8000 \catcode`\_=12\relax} \begingroup
 \catcode`\_=13
 \gdef_{\expandafter\s@@b@}
\endgroup

我知道这\catcode`\_=13会产生_一个活动字符,但我无法确定这与 xparse 的 e 或 t 类型命令定义如何交互。有没有一种解决方法可以达到这种效果,subscriptcorrection同时让 e 和 t 类型命令按预期运行?

答案1

xparse要求te参数中使用的标记与执行命令时找到的标记相同,这意味着它的 catcode 和 charcode 必须都匹配。

subscriptcorrection导致您的命令不起作用 的部分是\AtBeginDocument{\catcode`\_=12\relax},这使得下划线成为另一个(catcode 12)字符\begin{document},但在定义命令的序言中,下划线仍然是 catcode 7,这就是_在您的命令中固定的含义。

您可以通过在定义命令时临时将下划线 catcode 设为 12 来解决这个问题:

\documentclass{article}

\usepackage{xparse}
\usepackage[subscriptcorrection]{newtxmath}
\usepackage{xcolor}

\begingroup
  \catcode`\_=12
  \long\def\next#1{\endgroup#1}%
\next{%
\NewDocumentCommand{\MyMacro}{t_}{A\IfBooleanT{#1}{\MyMacroAux}}
\NewDocumentCommand{\MyMacroAux}{m}{_{\textcolor{red}{#1}}}
\NewDocumentCommand{\MyOtherMacro}{e_}{
    \IfNoValueTF{#1}
        {\mathbf{A}}
        {A_{\textcolor{red}{#1}}}
    }
}

\begin{document}
\textbf{t-type:} With a subscript: $\MyMacro_{\pi}$

Without any subscript: $\MyMacro$

\textbf{e-type:} With a subscript: $\MyOtherMacro_{\pi}$

Without any subscript: $\MyOtherMacro$
\end{document}

相关内容