数式モードで大文字だけデフォルトでboldにするには

数式モードで大文字だけデフォルトでboldにするには

- Haruyuki Kawabe の投稿
返信数: 1
数式モードで$\EXP{ABCpqrDEFxyz}$のようにすると大文字のABC DEFの部分だけbold(\mathbfと同じ効果)になるようにしたかったので、

\newcommand{\change@uppercase@math}{%
\count0=`\A
\count1=`\A
\advance\count1"7600
\loop
\mathcode\count0\count1
\ifnum\count0<`\Z
\advance\count0\@ne
\advance\count1\@ne
\repeat}

\newcommand{\EXP}[1]{%
\begingroup\change@uppercase@math#1\endgroup%
}

というマクロを書いたのですが、$\EXP{ABCpqrDEFxyz}$を実行すると

\textfont 6 is undefined (character A).

というエラーになってしまいます。ただ、\EXPより前に一度でも\mathbfを
使っているとエラーにならないので\mathbfで\textfont 6が定義されるのだと思われますが、\mathbfのマクロ定義をみてもよくわかりませんでした。
どうすれば、上記のエラーを回避できるでしょうか。
(実は、\EXPを使わなくても${\fam6 A}$でも同じ状況ですので、\fam6と
\mathbfの違いがわかればよいのかもしれません。)
Haruyuki Kawabe への返信

Re: 数式モードで大文字だけデフォルトでboldにするには

- 匿 名 の投稿
要点は次のことではないでしょうか.

LaTeX2e では,\DeclareMathAlphabet で定義された数式用書体変更コマンド
(\mathbf,\mathsf など)に対応する family 番号は,
(数式のバージョンごとに)「オンデマンド」で設定されます.
したがって,\mathbf などと family 番号の対応は事前にはわかりませんし,
1 回も \mathbf を用いていない状態では \mathbf に対応する family 番号は
「未設定」です.
# \mathbf や \mathsf などの使用順によって変わる可能性がありますし,
# その他の要因(「disablejfam クラスオプションの適用の有無」「bm などの
# パッケージの読み込みの有無」など)によっても変わることがあります.

# なお,\DeclareSymbolFontAlphabet で定義された数式用書体変更コマンド
# (\mathrm など)の場合は,それらに対応する family 番号は定義の時点で
# わかります.

-----
件の \EXP のようなマクロを定義するには,単純には「\mathbf をあらかじめ
使って family 番号を確定させてからそれを読みとる」という方法が考えられます.
e.g.
\def\EXP#1{%
  {\mathbf{\xdef\@famno@for@mathbf{\hexnumber@\mathgroup}}%
  \change@uppercase@math #1}}
% \change@uppercase@math の定義では,
% "7600 の 6 を \@famno@for@mathbf に変更