有时因为我处理复杂的公式,所以我想在某些符号周围添加额外的空间,例如\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}