\DeclareMathOperator:当运算符后跟二元运算符时出现错误空格

\DeclareMathOperator:当运算符后跟二元运算符时出现错误空格

在这个答案中针对这个问题LaTeX 中数学符号的快捷方式和/或用户定义的快捷方式?,建议用 表示梯度\DeclareMathOperator{\grad}{grad}

\mathrm{grad}但是,与运算符后跟二元运算符(用 ∇ 代替“grad”)相比,这是次优的(错误的空间) ,如下面的 MWE 所示(其中只有方程式 ≡ 0 mod 3 是可以的):

\documentclass[convert,varwidth=4cm]{standalone}
\usepackage{mathtools}
\usepackage{amssymb}
%
\DeclareMathOperator{\grad}{grad}
\DeclareMathOperator{\Div}{div}
\DeclareMathOperator{\curl}{curl}
%
\DeclareMathOperator{\nablaop}{\nabla}
%
\begin{document}
\begin{align}
  \Div  F & = \grad         \cdot  F \\
  \Div  F & = \grad{}       \cdot  F \\
  \Div  F & = \mathrm{grad} \cdot  F \\
  \curl F & = \grad         \wedge F \\
  \curl F & = \grad{}       \wedge F \\
  \curl F & = \mathrm{grad} \wedge F \\
  \Div  F & = \nablaop      \cdot  F \\
  \Div  F & = \nablaop{}    \cdot  F \\
  \Div  F & = \nabla        \cdot  F \\
  \curl F & = \nablaop      \wedge F \\
  \curl F & = \nablaop{}    \wedge F \\
  \curl F & = \nabla        \wedge F
\end{align}
\end{document}

在此处输入图片描述

\DeclareMathOperator当该运算符后面跟着二元运算符时,有没有办法使 的行为正常?

答案1

如果您确信后面\grad会跟着一组固定的(但易于扩展的)二元运算符,那么这应该可以工作:

\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}

\DeclareMathOperator{\gradop}{grad}

\ExplSyntaxOn

% the list of admissible binary operators
\tl_const:Nn \c_denis_grad_ops_tl { \cdot \wedge }

\NewDocumentCommand{\grad}{}
 {
  \gradop
  \peek_after:Nw \denis_grad_check:
 }

\cs_new_protected:Nn \denis_grad_check:
 {
  \tl_map_inline:Nn \c_denis_grad_ops_tl
   {% if the token matches one in the list, issue {\!}
    \token_if_eq_meaning:NNT \l_peek_token ##1 { \tl_map_break:n { {\!} } }
   }
 } 

\ExplSyntaxOff

\begin{document}

\begin{gather*}
\grad F \\
\mathop{\mathrm{grad}} F\\
\grad \cdot F \\
\mathrm{grad}\cdot F \\
\grad \wedge F \\
\mathrm{grad}\wedge F 
\end{gather*}

\end{document}

在此处输入图片描述

如果列表中有一个二元运算符,我们会发出{\!}修复间距的信号:运算符和空原子之间的细小空间被抵消\!,空原子将为二元运算符周围的间距提供所需的位。

略有不同的版本,具有用于添加二元运算符的接口;初始声明

\OperatorBinary{\cdot,\wedge} % initialize

应在课堂上随身携带以下说明:

您可以定义运算符名称,这些运算符名称在后面跟二进制运算符号时表现良好

\DeclareMathOperatorX{<cs>}{<name>}

例如

\DeclareMathOperatorX{\grad}{grad}

可以像 一样使用,\grad f否则像 一样使用\grad\cdot F。预定义的可接受二元运算符列表包括\cdot\wedge,但可以在序言中通过以下方式进行扩充,例如,

\OperatorBinary{\times}

(参数可以是像初始声明中的一样的列表\OperatorBinary{\cdot,\wedge}。没有预定义此类型的运算符,用于\DeclareMathOperatorX定义您将要使用的运算符。

\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}

\ExplSyntaxOn

\NewDocumentCommand{\DeclareMathOperatorX}{mm}
 {
  \NewDocumentCommand{#1}{}
   {
    \operatorname{#2}
    \peek_after:Nw \denis_opx_check:
   }
 }
\NewDocumentCommand{\OperatorBinary}{m}
 {
  \clist_gput_right:Nn \g_denis_opx_binary_clist { #1 }
 }

\clist_new:N \g_denis_opx_binary_clist
\cs_new_protected:Nn \denis_opx_check:
 {
  \clist_map_inline:Nn \g_denis_opx_binary_clist
   {
    \token_if_eq_meaning:NNT \l_peek_token ##1 { \clist_map_break:n { {\!} } }
   }
 } 
\ExplSyntaxOff

\OperatorBinary{\cdot,\wedge} % initialize
\DeclareMathOperatorX{\grad}{grad}

\begin{document}

\begin{gather*}
\grad F \\
\mathop{\mathrm{grad}} F\\
\grad \cdot F \\
\mathrm{grad}\cdot F \\
\grad \wedge F \\
\mathrm{grad}\wedge F 
\end{gather*}

\end{document}

答案2

\DeclareMathOperator创建一个\mathop原子,它们被设计为用作前缀函数。在它们不被用作前缀应用的上下文中,比如这里的高阶组合,你总是可以\mathord通过用括号括起来创建一个原子,{\grad}其间距与\mathrm{grad}

相关内容