\newcommand 带变量名

\newcommand 带变量名

我正在排版一篇很长的数学文本(讲稿),其中我使用了字母

\mathbb A
\mathcal A
\mathfrak A

所以我决定给它们起名字

\A \sA \fA

(分别为 bb A、script A 和 fraktur A)。现在我想通过创建一个助手来缩短我的序言

\newcommand{\mathletter}[1]{%
    \newcommand{\#1}{\mathbb #1}
    \newcommand{\s#1}{\mathcal #1}
    \newcommand{\f#1}{\mathfrak #1}
}

这不起作用,因为 \#1 等似乎没有展开。
我如何编写一个宏来定义这三个命令,给定一个字母作为输入?

谢谢你的帮助。

答案1

感谢@Snicksie,我能够想到以下几点:

请注意,这并不是真正“漂亮”,它会覆盖命令 \H、\L、\O、\P、\S,但我已经确认我不需要它们中的任何一个,并且“手动”取消定义它们,所以当我监督任何其他命令时,我都会收到错误。

\newcommand{\mathletter}[1]{%
    \expandafter\newcommand\csname #1\endcsname{\mathbb #1}
    \expandafter\newcommand\csname s#1\endcsname{\mathcal #1}
    \expandafter\newcommand\csname f#1\endcsname{\mathfrak #1}
}%
\let\H\undefined
\let\L\undefined
\let\O\undefined
\let\P\undefined
\let\S\undefined
\mathletter A
\mathletter B
\mathletter C
...
\mathletter Z

另一个非常优雅的解决方案,感谢@StevenB.Segelets,它是定义:

\def\B#1{\mathbb #1}
\def\C#1{\mathcal #1}
\def\F#1{\mathfrak #1}

然后使用这些略有不同的命令。这不会重新定义任何现有宏,因此可能是一种更干净的解决方案,但需要更改\A, \sA, \fA所有文档中的先前语法(),因此需要进行一些“重写”。

相关内容