定义新运算符时面临的问题

定义新运算符时面临的问题

使用LaTeX,我想定义一个新的运算符,特别是投影运算符。我可以定义该运算符,但它不能按我想要的方式工作。

这是我定义运算符的方式:

\newcommand{\proj}[1]{\text{proj}~(#1)}

但我想这样定义运算符:每当我给它两个输入(u,v)时,它都会返回proj_u(v)之类的,但我无法做到这一点。

最终结果应如下所示: 它应该看起来像这样

在此处输入图片描述

这是我的代码和结果:

答案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}

相关内容