考虑以下 MnotWE:
\documentclass[12pt,letterpaper]{article}
\usepackage{lmodern}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{graphicx}
\usepackage{calc}
\newcommand{\scaleandcenter}[2]{\vcenter{\hbox{\scalebox{#1}{$#2$}}}}
\newcommand{\binscaled}[2]{\mathbin{\scaleandcenter{#1}{#2}}}
\newcommand{\smallbin}[1]{\binscaled{0.5}{#1}}
\newcommand{\setbinprecedence}[2]{\setlength{\medmuskip}{(1 + #1)*1mu plus (1 + #1)*1mu minus (1 + #1)*1mu} {#2}}
\let\origtimes\times
\renewcommand{\times}{\setbinprecedence{0}{\smallop{\origtimes}}}
\begin{document}
\begin{equation*}
a\times b + c\times b = 0
\end{equation*}
\end{document}
它会产生错误,因为它不喜欢我在\setlength
命令中的算术中使用参数的方式。如何正确地将参数作为数字传递以在calc
包命令中使用?
目的:我想建立一种“视觉优先级”样式,其中自定义操作数\times
比 + 周围的操作数更紧密,因为\times
应该比 + 具有“更高的优先级”。另一种说法是:“视觉上”时间周围的操作数应该紧密地分组在它周围,以直观地传递时间应该首先执行的概念。所以我希望medmuskips
根据运算符的优先级设置自定义(包括拉伸和收缩)。
答案1
该calc
包不适用于 muglue 表达式。你可以这样做没有通过说
\setlength{\medmuskip}{%
\muexpr (1+#1)mu plus (1+#1)mu minus (1+#1)mu\relax
}
但由于您在一个组中进行设置并使(重新定义的)成为\times
一个普通原子,所以这不起作用。
然而,还有一个更充分的理由:TeX\medmuskip
在整个公式中只使用一个值,即公式末尾保存的值。
例子:
\documentclass{article}
\begin{document}
$a+b$
$a+b\medmuskip=30mu$
${\medmuskip=30mu a+b}$
\end{document}
您会看到该设置\medmuskip
后加号被消化了,无论如何都会造成空间变大。同样,在组中设置参数也没有关系,因为公式末尾的值将是初始值。
如果要使二元运算符周围的空格比标准更紧密,请删除 的一小部分\medmuskip
。例如
\documentclass{article}
\usepackage{amsmath}
\newcommand{\tighttimes}{%
\mspace{-\muexpr\medmuskip/2}
\times
\mspace{-\muexpr\medmuskip/2}
}
\begin{document}
$a+b\tighttimes c$
\medmuskip=30mu
$a+b\tighttimes c$
\end{document}
第二个公式使用了夸张的值来\medmuskip
更好地显示效果。