![\DeclareMathOperator:当运算符后跟二元运算符时出现错误空格](https://linux22.com/image/327106/%5CDeclareMathOperator%EF%BC%9A%E5%BD%93%E8%BF%90%E7%AE%97%E7%AC%A6%E5%90%8E%E8%B7%9F%E4%BA%8C%E5%85%83%E8%BF%90%E7%AE%97%E7%AC%A6%E6%97%B6%E5%87%BA%E7%8E%B0%E9%94%99%E8%AF%AF%E7%A9%BA%E6%A0%BC.png)
在这个答案中针对这个问题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}