Wrapper für das \SI-Makro von siunitx zum automatischen Trennen von Zahl und Einheit

Wrapper für das \SI-Makro von siunitx zum automatischen Trennen von Zahl und Einheit

Problem

Ich verwende das siunitx-Paket, um Zahlen und Einheiten mit korrektem Abstand usw. zu setzen. Es gibt einen Befehl

\SI{<number>}{<unit>}

dafür. Es wäre jedoch viel einfacher, etwas wie

\xSI{<number and unit>}

und lassen Sie LaTeX die Nummer und die Einheit automatisch aufteilen und \SI{}{}intern anrufen.

\xSI{9.81m/s^2}  →  \SI{9.81}{m/s^2}
\xSI{1e-3m}      →  \SI{1e-3}{m}

Ich weiß, dass expl3es einige Regex-Funktionen bietet, aber da ich nur mit „normalem“ LaTeX vertraut bin, weiß ich nicht, wo ich anfangen soll.

Frage

Wie kann ich eine Wrapper-Funktion für SI{}{}(mithilfe von expl3?) schreiben, sodass die Zahlen- und Einheitenteile automatisch getrennt werden?

Antwort1

Sie finden einen regulären Ausdruck für Zahlen im wissenschaftlichen FormatHier

\documentclass{article}
\usepackage{siunitx,l3regex}
\ExplSyntaxOn
\NewDocumentCommand{\xSI}{ O{} m }
 {
  \ralfix_split:n { #2 }
  \ralfix_si:n { #1 }
 }

\seq_new:N \l__ralfix_pieces_seq
\cs_new_protected:Npn \ralfix_split:n #1
 {
  \regex_split:nnN
   {
    ( [ - + ]? [0-9]* [\.\,]? [0-9]+ ( [eE] [-+]? [0-9]+ )? )
    (.*)
   }
   { #1 }
   \l__ralfix_pieces_seq
 }
\cs_new_protected:Npn \ralfix_si:n #1
 {
  \use:x
   {
    \exp_not:n {\SI[#1]}
    {\seq_item:Nn \l__ralfix_pieces_seq {2}}
    {\seq_item:Nn \l__ralfix_pieces_seq {4}}
   }
 }
\ExplSyntaxOff
\begin{document}
\xSI{9.81m/s^2}

\xSI{1e-3m}

\xSI[output-decimal-marker={,}]{1,2e-33kV}
\end{document}

Die Funktion könnte verfeinert werden, indem zuerst das Element Nummer 1 in der resultierenden Sequenz untersucht wird. Diese ist nicht leer, wenn keine Übereinstimmung gefunden wurde.

Dennoch würde ich Ihnen empfehlen, \SI{...}{...} Das ist nicht viel schwieriger zu tippen und trennt verschiedene Dinge klar voneinander.

Bildbeschreibung hier eingeben

verwandte Informationen