*
假设我们有一个优先级为 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 并丢失了默认情况下应具有的任何间距规则,因此只获取此处指定的空间。