如何重新定义产品命令以添加可选参数?

如何重新定义产品命令以添加可选参数?

我想重新定义产品命令(,,,,\times)以添加\cdot\otimes\wedge\odot可选负间距参数,但我不知道如何以正确的方式执行此操作。我需要新命令在未添加任何参数时\times与旧命令保持一致,并且(或??)是带有\times\times[?]\times{?}左侧添加了负空间. 如何正确做到这一点?

更具体地说,我需要新命令按以下方式工作:

a \times b给出与旧相同的输出a \times b

a \time[1] b输出结果与a \mskip-1mu \times b

a \time[2] b输出结果与a \mskip-2mu \times b

以下是可以使用的 MWE 代码:

\documentclass[11pt,letterpaper,twoside]{book}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[total={6in,10in},left=1.5in,top=0.5in,includehead,includefoot]{geometry}
\usepackage{microtype}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{mathtools}
\usepackage{tensor}

\begin{document}

TEST
\begin{align}
    a &\times b \\
    a \mskip-1mu &\times b \\
    a \mskip-2mu &\times b
\end{align}

\end{document}

答案1

您需要重新定义许多标准命令,这会使您的数学表达式非常脆弱,并且可能与其他包发生冲突并使共同作者感到困惑。

我会简单地定义类似

\newcommand\z[1]{\mskip-#1mu}

然后使用

a \z1\times b

当您想要调整间距时。(您可能希望给出一个比\z或可能不更有意义的名称,并保持简短)

答案2

您可以抽象重新定义:

\documentclass{article}
\usepackage{amsmath}

\ExplSyntaxOn
\NewDocumentCommand{\addspacer}{m}
 {
  \clist_map_function:nN { #1 } \cham_addspacer:N
 }

\cs_new_protected:Nn \cham_addspacer:N
 {
  \exp_args:Nc \NewCommandCopy { \cs_to_str:N #1 _kept } #1
  \RenewDocumentCommand #1 { O{0} }
   {
    \mskip-##1mu
    \use:c { \cs_to_str:N #1 _kept }
   }
 }

\ExplSyntaxOff

\addspacer{\times,\cdot,\otimes,\wedge}

\begin{document}

$a\times b$

$a\times[1]b$

$a\times[2]b$

$a\wedge b$

$a\wedge[1]b$

$a\wedge[2]b$

\end{document}

在此处输入图片描述

相关内容