我正在排版一篇很长的数学文本(讲稿),其中我使用了字母
\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
所有文档中的先前语法(),因此需要进行一些“重写”。