通过“\newcommand”或“\renewcommand”将数字参数传递给“calc”包命令?

通过“\newcommand”或“\renewcommand”将数字参数传递给“calc”包命令?

考虑以下 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更好地显示效果。

在此处输入图片描述

相关内容