如何一次重新定义多个命令?

如何一次重新定义多个命令?

有时因为我处理复杂的公式,所以我想在某些符号周围添加额外的空间,例如\longrightarrow, \subset, \cong等等。

以下是 MWE:

\documentclass{article}
\usepackage{ifthen}

\let\OLDsubset\subset
\renewcommand{\subset}[1][0]{
    \ifthenelse{\equal{#1}{0}}{\OLDsubset}{}
    \ifthenelse{\equal{#1}{1}}{\;\OLDsubset\;}{}
    \ifthenelse{\equal{#1}{2}}{\;\;\OLDsubset\;\;}{}
    \ifthenelse{\equal{#1}{3}}{\quad\OLDsubset\quad}{}
}

\begin{document}
$$A \subset B$$
$$A \subset[2] B$$
\end{document}

它运行良好,但我的问题如下。有没有办法创建一个单一的“元命令”(宏),例如,\AddSpace以命令作为参数,然后例如\AddSpace{\subset}自动生成上述代码。

目标是能够使用与上面相同的代码来执行其他命令\subseteq, \cong不是最初采用可选参数(为了安全起见)等,而不必为每个命令复制粘贴相同的代码。

我知道multidef包,但它似乎不是合适的工具。我尝试了以下想法:这里,但收效甚微。也许可以使用xparse包、和\RenewDocumentCommand等?


注意:我同意不是想要有这样的东西:

\newcommand{\AddMoreSpace}[2][1]{
    \ifthenelse{\equal{#1}{1}}{\;#2\;}{}
    \ifthenelse{\equal{#1}{2}}{\;\;#2\;\;}{}
    \ifthenelse{\equal{#1}{3}}{\quad #2 \quad}{}
}

因为使用例如

$$A \AddMoreSpace{\subset} B$$
$$A \AddMoreSpace[2]{\subset} B$$

太“复杂”/太长,写不出来……

答案1

该命令\;是的简写\mskip\thickmuskip,因此您可以将其乘以,而不是加以。

\watson<oldcommand使用技巧将旧的命令名称保存起来\csname

\documentclass{article}
\usepackage{amsmath}

\newcommand{\AddSpaceToCommand}[1]{%
  \expandafter\NewCommandCopy\csname watson\string#1\endcsname #1%
  \renewcommand#1[1][0]{%
    \mspace{\muexpr\thickmuskip*##1\relax}%
    \csname watson\string#1\endcsname
    \mspace{\muexpr\thickmuskip*##1\relax}%
  }%
}

\AddSpaceToCommand{\subset}
\AddSpaceToCommand{\mapsto}

\begin{document}

$a \subset b$

$a \subset[1] b$

$a \subset[2] b$

$a \subset[3] b$

$a \mapsto b$

$a \mapsto[1] b$

$a \mapsto[2] b$

$a \mapsto[3] b$

\end{document}

在此处输入图片描述

答案2

经过一番搜索,我终于找到了解决问题的方法。欢迎任何评论——以下 MWE 可能显示一些“不良做法”(但至少有效!)...

\documentclass{article}
\usepackage{ifthen}

\newcommand{\AddSpace}[1]{
    \expandafter\let\csname old#1\expandafter\endcsname\csname#1\endcsname
    \expandafter\renewcommand\csname #1\endcsname[1][0]{%
        \ifthenelse{\equal{##1}{0}}{\csname old#1\endcsname}{}%
        \ifthenelse{\equal{##1}{1}}{\;\csname old#1\endcsname\;}{}%
        \ifthenelse{\equal{##1}{2}}{\;\;\csname old#1\endcsname\;\;}{}%
        \ifthenelse{\equal{##1}{3}}{\quad\csname old#1\endcsname\quad}{}%       
    }%
}

\AddSpace{subset}
\AddSpace{mapsto}


\begin{document}

$a \subset[3] b$

$a \subset b$

$a \mapsto[2] b$

$a \mapsto b$

\end{document}

相关内容