答案1
我认为你主要想要的是项目你(五)并且你不需要任何真正复杂的东西:之后
\DeclareMathOperator{\proj}{proj}
在序言中,你可以输入
\proj_{\mathbf{u}}(\mathbf{v})
在文档中。但是,如果你想要更花哨的东西,
\documentclass{article}
\usepackage{amsmath}
\DeclareMathOperator{\projop}{proj}
\NewDocumentCommand{\proj}{mm}{%
\projop_{#1}(#2)%
}
\NewDocumentCommand{\cproj}{mm}{%
\frac{\langle #2,#1\rangle}{\langle #1,#1\rangle}%
}
\RenewDocumentCommand{\vec}{m}{\mathbf{#1}}
\begin{document}
This is the inline usage $\proj{\vec{u}}{\vec{v}}$, but the definition
can be seen as follows
\[
\proj{\vec{u}}{\vec{v}}=\cproj{\vec{u}}{\vec{v}}
\]
\end{document}
我建议对向量使用适当的命名,这样您就可以使它们的实现独立于输入。如果您想要其他东西而不是\mathbf
,只需更改定义即可。
答案2
\documentclass{article}
\usepackage{amsmath}
\ExplSyntaxOn
\NewDocumentCommand{ \proj }{ s s m m }
{ \IfBooleanTF{ #1 }
{ \IfBooleanTF{ #2 }
{ \frac{\langle #3,#4\rangle}{\|#3\|^2} #3 }
{ \frac{\langle #3,#4\rangle}{\langle #3,#3\rangle} #3 } }
{ \operatorname{proj}\c_math_subscript_token{#3} #4 }
}
\ExplSyntaxOff
\begin{document}
\[\proj{u}{v} = \proj*{u}{v} = \proj**{u}{v}\]
\end{document}
答案3
我们可以定义\proj
不带 expl3 的宏:
\documentclass{article}
\usepackage{amsmath}
\def\proj{\futurelet\next\projA}
\def\projA{\ifx\next*\expandafter\projB\else \expandafter\projD\fi}
\def\projB*{\futurelet\next\projC}
\def\projC{\ifx\next*\expandafter\projF\else \expandafter\projE\fi}
\def\projD#1#2{{\rm proj}_{#1}#2}
\def\projE#1#2{{\langle#1,#2\rangle\over\langle#1,#1\rangle}#1}
\def\projF*#1#2{{\langle#1,#2\rangle\over\|#1\|^2}#1}
\expandafter\let\expandafter\over\csname @@over\endcsname % to suppress amsmath obscure warning
\begin{document}
$$
\proj{u}{v} = \proj*{u}{v} = \proj**{u}{v}
$$
\end{document}