带星号的宏前的数学重音符,带有 unicode-math 或不带 amsmath

带星号的宏前的数学重音符,带有 unicode-math 或不带 amsmath

我有一个宏\makebold,它使用星号和快捷键\aaa。我试图使用\aaaafter\bar来生成带横线的粗体字母。

\documentclass{standalone}
\usepackage{xparse, unicode-math}

\DeclareDocumentCommand \makebold { s m }{%
    \mathbf{#2}%
}
\newcommand{\aaa}{\makebold*{b}}

\begin{document}Test $\bar\aaa$.\end{document}

产生以下内容:

! Missing { inserted.
<to be read again>
                   \l__xparse_processor_int
l.16 Test $\bar\aaa
                   $.

如果我删除s选项,它就会起作用DeclareDocumentCommand。我进一步尝试,

\documentclass{standalone}
\usepackage{amsmath}      % <- removing this line produces error
\usepackage{xparse}

\DeclareDocumentCommand \makebold { s m }{%
    \mathbf{#2}%
}
\newcommand{\aaa}{\makebold*{b}}

\begin{document}Test $\bar\aaa$.\end{document}

这有效。我删除了行\usepackage{amsmath},但不起作用。这是怎么回事?我该如何修改这两个宏,使它们在有unicode-math或没有的情况下都能工作amsmath

答案1

所有情况下的问题在于您没有在 参数周围使用括号\bar

当 TeX 扩展标记时,如果未amsmath加载包,\bar则会扩展为\mathaccent "7016\relax。此后,TeX 需要括号中的单个字符或子公式。在您的情况下,括号缺失,因此\aaa会扩展,并且该扩展的第一个标记\l__xparse_processor_int(来自\makebold)会导致问题。

然而,如果你加载amsmath包,\bar则会被重新定义,以便在扩展后的令牌时更加小心。

因此,最简单的解决方案就是使用大括号:\bar{\aaa}。如果您真的不想要这样,无论出于什么原因,您也可以重新定义\bar以自动在其参数周围添加大括号(并祈祷这不会在其他地方/其他包中中断):

\let\oldbar\bar
\renewcommand\bar[1]{\oldbar{#1}}

相关内容