看来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
要求t
或e
参数中使用的标记与执行命令时找到的标记相同,这意味着它的 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}