Определение новых команд единиц измерения как производных единиц `\si`

Определение новых команд единиц измерения как производных единиц `\si`

В моем документе мне нужно использовать большое количество различных единиц СИ. Чтобы облегчить набор текста, я обычно определяю новые команды как \newcommand{\unitmass}{\si{\kilogram}}или \newcommand{\unitmomentum}{\si{\kilogram\meter\per\second}}. Затем я могу использовать что-то вроде 2.5\unitmassили 3.4\unitmementumи сделать это. Это экономит мне массу усилий по набору текста.

Не такая уж и проблема, пока мне не понадобится \si[2.5d-15]{\kilogram\meter\per\second}(обратите внимание на научную запись числа), что все равно требует от меня набрать полный шебанг. Один из вариантов — использовать математическую запись только для числа, как в , $2.5\times 10^{-17}$\unitmomentum$что не является потрясающим вариантом. В идеале я хотел бы что-то вроде, \unitmomentum[2.5d-15]чтобы обойтись.

Это значит, что мне нужно определить свои команды намного сложнее, и их десятки (быстро достигающие сотни). Поэтому мне нужно определить шаблон необязательного аргумента, принимающего команды.

Мой первый подход заключался в следующем:

\newcommand{\SimpleSIunit}[2]{%
    \expandafter\newcommand\csname #1\endcsname{\si{#2}}%
}

Это работает, если я остаюсь довольным без дополнительных аргументов. Я могу выдать десятки директив, \SimpleSIunit{unittorque}{\newton\meter}и моя основная потребность будет удовлетворена.

Однако, что я действительно хочу сказать, так это

\newcommand{\SimpleSIunit}[2]{%
    \expandafter\newcommand[1][]\csname #1\endcsname{\si[##1]{#2}}%
}

Что, очевидно, не приносит пользы. Есть идеи, как это исправить?

После того, как я произнесу \SimpleSIunit{unittorque}{\newton\meter}, я хочу, чтобы эти четыре строки выдавали одинаковый результат -

2.5\unittorque
\unittorque[2.5]
2.5\si{\newton\meter}
\si[2.5]{\newton\meter}

** PS:: EDIT после комментария @daleif **

Пробелы обрабатываются следующими директивами, прежде чем я сделаю что-либо еще. Он использует пакет savesym. Я не притворяюсь, что код ниже — моя оригинальная работа. Называйте это программированием Cargo-cult, но я не студент, которому нужна домашняя работа. Это моя профессиональная работа, и я использую LaTeX в качестве инструмента.

% spacing of siunits
\newlength{\siunitspace}
\sisetup{number-unit-product = \hspace{\siunitspace}}

% new units -- to act as supplement to SI units package \si{unit}
\input{unitdef-v01-2018} % a seperate file maintains this

\savesymbol{si}
\newcommand{\si}[2][?]{%
    \if\relax#1\relax%
    \hspace{\siunitspace}\origsi{#2}\xspace%
    \else%
    \if?#1\hspace{\siunitspace}\origsi{#2}\xspace\else\SI{#1}{#2}\xspace\fi%
    \fi%
}

решение1

siunitxДля этого типа ввода имеется встроенная функциональность.

\documentclass{article}
\usepackage{siunitx}
\sisetup{free-standing-units, ,unit-optional-argument, space-before-unit}
\DeclareSIUnit{\unitmomentum}{\kilogram\meter\per\second}
\begin{document}
Some text $3.5\unitmomentum$ and $\unitmomentum[2.5e-3]$.
\end{document}

Обратите внимание, что этот unitsсинтаксис не является настройкой по умолчанию, поскольку я считаю его неоптимальным.

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