bm и siunitx прозрачное использование

bm и siunitx прозрачное использование

Я стараюсь иметь 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}

введите описание изображения здесь

Связанный контент