Я стараюсь иметь bm
и siunitx
использовать прозрачные пакеты на основе этого ответа:несоответствие bm и siunitx
\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}
Но у меня есть это сообщение об ошибке:
! Improper alphabetic constant.
<to be read again>
\reserved@d
l.25 $\bm{bob\num{5}}
$
решение1
В вашем коде есть ошибки. Например, вы используете \Oldbm
вместо \Oldnum
в \num
определении. И \SI
имеет три аргумента, а не два.
Рабочий код будет следующим. Имейте в виду, что поскольку обе команды имеют необязательные аргументы и поэтому хрупкие, их нужно защитить скобками. Так что imho вы не много выигрываете по сравнению сhttps://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}