我不确定为什么这个命令对我来说不起作用。
\newcommand{\sprod}[2]{\left|\left< {#1} \right| \! \left. \! {#2} \right>\right|}
当我$\sprod{\psi,\phi}$
在正文中时,我的编译器说“缺少}插入”
有人可以解释一下这个问题吗?
答案1
您正在\sprod
使用两个参数进行定义,但只提供了一个参数;调用应该是\sprod{\psi}{\phi}
。
然而,通过更多的工作,我们可以定义一个更好的设置,使用带有逗号的语法。
\documentclass{article}
\usepackage{mathtools,xparse}
\DeclarePairedDelimiter{\abs}{\lvert}{\rvert}
\DeclarePairedDelimiterX{\iprod}[1]{\langle}{\rangle}{\splitprod{#1}}
\NewDocumentCommand{\splitprod}{>{\SplitArgument{1},}{m}}{\dosplitprod#1}
\NewDocumentCommand{\dosplitprod}{mm}{%
#1\nonscript\;\delimsize|\nonscript\;#2%
}
\NewDocumentCommand{\sprod}{sO{}m}{%
\IfBooleanTF{#1}
{\abs*{\iprod*{#3}}}
{\abs[#2]{\iprod[#2]{#3}}}%
}
\begin{document}
\[
\sprod{\psi,\phi}+\sprod[\big]{\psi,\phi}+\sprod*{\frac{\psi}{2},\phi}
\]
\end{document}
宏\iprod
执行相同的操作,但没有外面的条。
和 的可选参数\sprod
指定\iprod
大小;使用 可以自动调整大小。这种方式比用和\sprod*
填充宏更好,因为后者很少能达到预期效果。\left
\right
需要做一些解释。让我们检查一下\iprod
宏;使用如下语法\iprod{a}{b}
,它会更简单:
\DeclarePairedDelimiterX{\iprod}[1]{\langle}{\rangle}{%
#1\nonscript\;\delimsize|\nonscript\;#2%
}
(请参阅的文档mathtools
)。但是,正如您所希望的那样,\iprod{a,b}
我使用xparse
逗号来拆分参数,并将其传递给\dosplitprod
提供位的宏#1\nonscript\;\delimsize|\nonscript\;#2
。
因为\sprod
我只是\iprod
在里面嵌套\abs
,并向两个宏传递相同的参数。