Definieren neuer Unit-Befehle als Ableitungen von `\si`-Units

Definieren neuer Unit-Befehle als Ableitungen von `\si`-Units

In meinem Dokument muss ich eine große Anzahl verschiedener SI-Einheiten verwenden. Um mir das Tippen zu erleichtern, definiere ich neue Befehle normalerweise als \newcommand{\unitmass}{\si{\kilogram}}oder \newcommand{\unitmomentum}{\si{\kilogram\meter\per\second}}. Dann kann ich etwas wie 2.5\unitmassoder verwenden 3.4\unitmementumund fertig. Das erspart mir viel Tipparbeit.

Kein großes Problem, bis ich es brauche \si[2.5d-15]{\kilogram\meter\per\second}(beachten Sie die wissenschaftliche Notation der Zahl), was immer noch erfordert, dass ich den ganzen Kram eintippe. Eine Alternative besteht darin, die mathematische Notation nur für die Zahl zu verwenden, was $2.5\times 10^{-17}$\unitmomentum$keine großartige Option ist. Idealerweise würde ich etwas wie wollen, \unitmomentum[2.5d-15]um durchzukommen.

Das heißt, ich muss meine Befehle viel komplizierter definieren und es gibt Dutzende (und bald Hunderte) davon. Daher muss ich eine Vorlage für optionale Argumente akzeptierende Befehle definieren.

Mein erster Ansatz war

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

Es funktioniert, wenn ich mich damit zufrieden gebe, keine optionalen Argumente zu verwenden. Ich kann Dutzende von Anweisungen wie diese erteilen \SimpleSIunit{unittorque}{\newton\meter}und mein Grundbedürfnis ist erfüllt.

Was ich jedoch wirklich sagen möchte, ist

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

Das bringt offensichtlich nichts. Irgendwelche Ideen, wie ich das beheben kann?

Nachdem ich ausgesprochen habe \SimpleSIunit{unittorque}{\newton\meter}, möchte ich, dass diese vier Zeilen die gleiche Ausgabe erzeugen -

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

** PS:: EDIT nach Kommentar von @daleif **

Die Abstände werden von den folgenden Anweisungen berücksichtigt, bevor ich irgendetwas anderes mache. Dabei wird das savesymPaket verwendet. Ich behaupte nicht, dass der folgende Code meine Originalarbeit ist. Nennen Sie es Cargo-Kult-Programmierung, aber ich bin kein Student, der Hausaufgaben braucht. Dies ist meine professionelle Arbeit und ich verwende LaTeX als Werkzeug.

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

Antwort1

siunitxFür diese Art von Eingabe ist eine Funktion eingebaut.

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

Beachten Sie, dass diese units-ähnliche Syntax nicht die Standardeinstellung ist, da ich sie für nicht optimal halte.

verwandte Informationen