使大写字母变为 \mathcal 并使小写字母变为 \mathfrak 的命令

使大写字母变为 \mathcal 并使小写字母变为 \mathfrak 的命令

有没有办法制作一个命令\mixedfont{...},将大写字母转换为\mathcal字母,将小写字母转换为\mathfrak

例如,\mixedfont{AbcDef}应该给出与相同的输出\mathcal{A}\mathfrak{bc}\mathcal{D}\mathfrak{ef}

答案1

使用标记循环非常简单,它会依次处理参数的每个标记。输入中的所有字符都会通过 一次处理一个\Characterdirective。我假设内容只是字符……所有宏、空格和组都将从输入中丢弃。如果标点符号进入输入,它将被回显。

\documentclass{article}
\usepackage{amssymb,tokcycle}
\Characterdirective{%
  \tctestifcatnx A#1{\ifnum`#1<`[ \mathcal{#1}\else\mathfrak{#1}\fi}{#1}%
}
\newcommand\mixedfont[1]{\tokcyclexpress{#1}}
\begin{document}
$y = \mixedfont{AbcDef}$
\end{document}

在此处输入图片描述

如果您希望标记循环处理宏和组,则只需告诉它在输入中遇到它们时该做什么。当您处理带有参数的宏时,您不能再直接输出转换后的标记(就像我之前做的那样),而是将它们收集到标记列表中,并在最后输出标记列表。如果您尝试直接输出它们,那么宏会在您处理它们之前等待它们的参数。

\documentclass{article}
\usepackage{amssymb,tokcycle}
\newcommand\mixedfont[1]{\tokcycle
  {\tctestifcatnx A##1{\ifnum`##1<`[ \addcytoks{\mathcal{##1}}\else
   \addcytoks{\mathfrak{##1}}\fi}{\addcytoks{##1}}}% CHARACTERS
  {\processtoks{##1}}% GROUPS
  {\addcytoks{##1}}% MACROS
  {\addcytoks{##1}}% SPACES
  {#1}\the\cytoks}
\begin{document}
$y = \mixedfont{A\frac{b}{c}D^{2x+1}ef}$
\end{document}

在此处输入图片描述

答案2

这是两行expl3

\documentclass{article}
\usepackage{amsmath,amssymb}

\ExplSyntaxOn
\NewDocumentCommand{\calfrak}{m}
 {
  \tl_set:Nn \l_tmpa_tl { #1 }
  % search for strings of lowercase letters and replace them with \mathfrak{letters}
  \regex_replace_all:nnN { ([a-z]+) } { \c{mathfrak}\cB\{\1\cE\} } \l_tmpa_tl
  % search for strings of lowercase letters and replace them with \mathcal{LETTERS}
  \regex_replace_all:nnN { ([A-Z]+) } { \c{mathcal}\cB\{\1\cE\} } \l_tmpa_tl
  \tl_use:N \l_tmpa_tl
 }
\ExplSyntaxOff

\begin{document}

$\calfrak{AbcDef}$

\end{document}

在此处输入图片描述

相关内容