我想定义一个命令,将其命名为\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}