如何重新定义中缀(二进制、关系)运算符间距,以便能够以视觉方式传达优先级?

如何重新定义中缀(二进制、关系)运算符间距,以便能够以视觉方式传达优先级?

*假设我们有一个优先级为 0(最高优先级)的中缀二元运算符,以及另一个@优先级为 1(低于 *)的中缀二元运算符。另外,假设我们有两个关系运算符~(优先级 2)和~(优先级 3)。

笔记:我选择的符号并不重要,我尝试选择任意符号,因为我可能需要在我的用例中定义任意运算符。

涉及这些运算符的表达式应如下所示:

a*b @ c*d ~ a*b || a*b ~ c @ d

此表达式中的空格与优先级匹配(优先级 0 为 0 个空格,依此类推)。

我想在 LaTeX 中做类似的事情,通过使用如下命令定义运算符:

\precedenceop{<relational or binary operator?>}{<precedence level>}{<symbol>}

我今天了解到:

  • \medmuskip控制二元运算符、\thickmuskip关系运算符的间距

  • 我可以使用该xstring包来处理条件情况

所以我设想我的命令将是这样的:

\usepackage{amsmath}
\usepackage{xstring}

\newcommand{\precedenceop}[3]{%
    \IfEqCase{#1}{%
        {rel}{<do stuff with \thickmuskip using #2 (the precedence level) and #3 (the symbol)>}%
        {bin}{<do stuff with \medmuskip using #2 (the precedence level) and #3 (the symbol)>}%
    }[\PackageError{tree}{Undefined option to tree: #1 (should be rel or bin)}{}]%
}

我提出的另一个问题尝试以不同的方式解决问题,并提出了使用类似方法来操纵跳过的建议解决方案:

\mspace{-\muexpr\medmuskip/2}
    <symbol, #3>
\mspace{-\muexpr\medmuskip/2}

但是,如果这个解决方案中的 可以被 #2 的某个函数(最好是某种类型的乘法,因为这样 0 将映射到 0mu,1 可以映射到 2mu,2 可以映射到 4mu,依此类推)所取代,那就2更好了。

无论如何,我该如何让各个部分正确地组合在一起以实现我想要的效果呢?

答案1

在此处输入图片描述

\documentclass{article}




\newcommand\declareop[3]{%
\newcommand#1{%
\mskip\muexpr\medmuskip*#2\relax
{#3}%
\mskip\muexpr\medmuskip*#2\relax
}}

\declareop\mytimes{0}{*}
\declareop\myat{1}{@}
\declareop\mysim{2}{\sim}
\declareop\myor{3}{\|}

\begin{document}

\[
a\mytimes b
\myat
c\mytimes d
\mysim
a\mytimes b
\myor
a\mytimes b
\mysim
c\myat d
\]
\end{document}

这使用 muskip 表达式将基\medmuskip值乘以优先级整数,将拉伸和收缩缩放相同的量。原始符号被{}(如{#3}定义中所示)包围,因此它被转换为 mathord 并丢失了默认情况下应具有的任何间距规则,因此只获取此处指定的空间。

相关内容