数学“元运算符”添加点并保留数学类

数学“元运算符”添加点并保留数学类

我想定义一个命令,将其命名为\dotted,它在某些其他数学字符*旁边的正确位置添加一个句点:在函数类标记(即 Ord 和 Op)的右侧,以及运算符类标记(即 Bin 和 Rel)的左侧。这个“元运算符”当然应该保留原始“运算符”的间距。我想出了以下初步解决方案:

\documentclass{article}

\newcommand{\dottedord}[1]{\mathord{#1.}}
\newcommand{\dottedop}[1]{\mathop{#1.}}
\newcommand{\dottedbin}[1]{\mathbin{.#1}}
\newcommand{\dottedrel}[1]{\mathrel{.}#1}

\begin{document}
\[x = \dottedord{\sigma}(y) \qquad x = \sigma(y)\]
\[x = \dottedop{\log}(y) \qquad x = \log(y)\]
\[x = y \dottedbin{+} z \qquad x = y + z\]
% This case is special...
\[x \dottedrel{=} y \qquad x \mathrel{.=} y \qquad x = y\]
\end{document}

方程输出

我如何将这四个命令统一为一个,根据参数类型进行分派——是否有类似\mathchoice数学类型的命令?为什么我需要将参数放在\dottedrel外面\mathrel才能获得令人满意的间距?

如果存在更根本的需要改进的地方,我当然也很乐意听到。

*这是Julia 的语法用于矢量化或“广播”,可应用于所有函数和运算符,但在这里并不真正相关。

答案1

您可以使用\binrel@由 定义的测试amsmath(准确地说是由amsbsy)来区分\mathrel\mathbin。如果测试未返回其中一个,您可以定义自己的\mathop和其他;请参阅我的这个答案有关的详细信息\binrel@,的想法\phg@ordop是类似的。

如果您不必支持具有限制的操作员,这就足够了。

\documentclass[a4paper]{article}
\usepackage{amsmath}
%\usepackage{amsbsy}% loaded by amsmath

\makeatletter
\DeclareRobustCommand{\dotted}[1]{%
  \begingroup
  \binrel@{#1}%
  \ifx\binrel@@\mathbin \mathbin{.{#1}}\else
  \ifx\binrel@@\mathrel \mathrel{.}#1\else
  \phg@ordop{#1}\fi\fi
  \endgroup
}
\def\phg@ordop#1{%
  \sbox\z@{\thinmuskip=0mu$#1a$}%
  \sbox\tw@{\thinmuskip=1000mu$#1a$}%
  \ifdim\wd\tw@>\wd\z@
    % operator
    \mathop{{#1}.}%
  \else
    #1.
  \fi
}
\makeatother

\begin{document}

\begin{gather*}
x = \dotted{\sigma}(y) \qquad x = \sigma(y) \\
x = \dotted{\log}(y) \qquad x = \log(y) \\
x = \dotted{\log} y \qquad x = \log y \\
x = y \dotted{+} z \qquad x = y + z \\
x \dotted{=} y \qquad x = y
\end{gather*}

\end{document}

在此处输入图片描述

相关内容