我有一个宏\makebold
,它使用星号和快捷键\aaa
。我试图使用\aaa
after\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}}