Definición de nuevos comandos de unidad como derivados de unidades `\si`

Definición de nuevos comandos de unidad como derivados de unidades `\si`

En mi documento, necesito utilizar una gran cantidad de unidades SI diferentes. Para facilitar mi escritura, normalmente defino nuevos comandos como \newcommand{\unitmass}{\si{\kilogram}}o \newcommand{\unitmomentum}{\si{\kilogram\meter\per\second}}. Entonces puedo usar algo como 2.5\unitmasso 3.4\unitmementumy listo. Me ahorra mucho esfuerzo de mecanografía.

No es un gran problema hasta que lo necesite \si[2.5d-15]{\kilogram\meter\per\second}(observe la notación científica del número), lo que aún requiere que escriba el asunto completo. Una alternativa es usar notación matemática solo para el número, lo cual $2.5\times 10^{-17}$\unitmomentum$no es una excelente opción. Idealmente me gustaría algo así \unitmomentum[2.5d-15]para salir adelante.

Lo que significa que tengo que definir mis comandos de manera mucho más complicada y hay docenas (que rápidamente llegan a cientos) de ellos. Por lo tanto, debo definir una plantilla de argumentos opcionales que acepten comandos.

Mi primer acercamiento fue

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

Funciona si me quedo contento sin argumentos opcionales. Puedo emitir docenas de directivas similares \SimpleSIunit{unittorque}{\newton\meter}y mi necesidad básica está cubierta.

Sin embargo, lo que realmente quiero es decir

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

Lo cual evidentemente no sirve de nada. ¿Alguna idea de cómo puedo rectificarlo?

Después de pronunciar \SimpleSIunit{unittorque}{\newton\meter}, quiero que estas cuatro líneas produzcan el mismo resultado:

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

** PD:: EDITAR después del comentario de @daleif **

Las siguientes directivas se encargan de los espacios antes de hacer cualquier otra cosa. Utiliza el savesympaquete. No pretendo que el código siguiente sea mi trabajo original. Llámelo programación de culto a Cargo, pero no soy un estudiante que necesite una tarea. Este es mi trabajo profesional y uso LaTeX como herramienta.

% 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%
}

Respuesta1

Hay una funcionalidad integrada siunitxpara este tipo de entrada.

\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}

Tenga en cuenta que esta unitssintaxis similar a - no es la configuración predeterminada, ya que creo que no es óptima.

información relacionada