Intento tener paquetes bm
y siunitx
un uso transparente según esta respuesta:bm y siunitx no coinciden
\documentclass{article}
\usepackage{bm,siunitx}
\newif\ifbm
\bmfalse
% New bm
\let\Oldbm\bm
\renewcommand{\bm}[1]{%
\bmtrue\Oldbm{#1}\bmfalse}
% New num
\let\Oldnum\num
\renewcommand{\num}[2][]{%
\ifbm\Oldbm[math-rm=\mathbf,#1]{#2}%
\else\Oldbm{#2}%
\fi}
% New SI
\let\OldSI\SI
\renewcommand{\SI}[2][]{%
\ifbm\OldSI[
math-rm=\mathbf,
number-unit-product={\mbox{\bfseries\,}},#1
]{#2}%
\else\OldSI{#2}%
\fi}
\begin{document}
$\bm{bob\num{5}\SI{30}{\km}}$
\end{document}
Pero tengo este mensaje de error:
! Improper alphabetic constant.
<to be read again>
\reserved@d
l.25 $\bm{bob\num{5}}
$
Respuesta1
Hay errores en su código. Por ejemplo, estás utilizando \Oldbm
en lugar de \Oldnum
en la \num
definición. Y \SI
tiene tres argumentos, no dos.
Un código de trabajo sería el siguiente. Tenga en cuenta que, como ambos comandos tienen argumentos opcionales y, por lo tanto, son frágiles, deben estar protegidos por una llave. Entonces, en mi humilde opinión, no ganas mucho en comparación conhttps://tex.stackexchange.com/a/416405/2388
\documentclass{article}
\usepackage{bm,siunitx}
\newif\ifbm
\bmfalse
% New bm
\let\Oldbm\bm
\renewcommand{\bm}[1]{%
\bmtrue\Oldbm{#1}\bmfalse}
% New num
\let\Oldnum\num
\renewcommand{\num}[2][]{%
\ifbm {\Oldnum[math-rm=\mathbf,#1]{#2}}%
\else \Oldnum[#1]{#2}%
\fi}
% New SI
\let\OldSI\SI
\renewcommand{\SI}[3][]{%
\ifbm{\OldSI[
math-rm=\mathbf,
number-unit-product={\mbox{\bfseries\,}},#1
]{#2}{#3}}%
\else\OldSI[#1]{#2}{#3}%
\fi}
\begin{document}
\num{5} \SI{30}{\km}
$\bm{bob}$
$\bm{{\num{5}}}$
$\bm{bob{\num{5}\SI{30}{\km}}}$
\end{document}