我正在尝试编写一个宏,如果参数是复合的,它会自动将括号添加到表达式中。具体来说,我想使用符号定义一个用于两个向量内积的命令$v\cdot w$
。所以我会定义
\newcommand{\inner}[2]{#1\cdot #2}
但是,如果一个参数是复合表达式,如\inner{v}{w_1+w_2}
,则结果应该是$v\cdot(w_1+w_2)$
。我希望自动添加括号。原因是以后某个时候我可能会决定切换到角度符号<v,w_1+w_2>
,这样就不需要括号了。
我研究了类似这样的软件包xstring
来测试字符串长度。但是,我无法让它与下标表达式$x_i$
(不应添加括号)一起工作。
这样的事可能吗?
答案1
\documentclass{article}
\usepackage{xstring}
\newif\ifsum
\newcommand{\inner}[2]{%
\IfSubStr{#1}{+}{\sumtrue}{\sumfalse}%
\unless\ifsum
\IfSubStr{#1}{-}{\sumtrue}{\sumfalse}%
\fi%
\ifsum%
(#1)%
\else
#1%
\fi
\cdot%
\IfSubStr{#2}{+}{\sumtrue}{\sumfalse}%
\unless\ifsum
\IfSubStr{#2}{-}{\sumtrue}{\sumfalse}%
\fi%
\ifsum%
(#2)%
\else
#2%
\fi}
\begin{document}
$\inner{v}{w_1+w_2}$ $\inner{w_1+w_2}{v}$
\end{document}