数値と単位を自動的に分割する siunitx の \SI マクロのラッパー

数値と単位を自動的に分割する siunitx の \SI マクロのラッパー

問題

私は、siunitx正しい間隔で数字や単位をタイプセットするために-packageを使用します。コマンドがあります

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

しかし、次のように書く方がはるかに簡単でしょう

\xSI{<number and unit>}

そして、LaTeX が自動的に数値と単位を分割して\SI{}{}内部的に呼び出すようにします。

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

正規表現機能がいくつか提供されることは知っていますexpl3が、私が知っているのは「通常の」LaTeX だけなので、どこから始めればよいかわかりません。

質問

数値と単位部分が自動的に分割されるように、SI{}{}(? を使用して)のラッパー関数を記述するにはどうすればよいですか?expl3

答え1

科学的な形式の数値の正規表現を見つけるここ

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

この関数は、結果のシーケンス内の項目番号 1 を最初に調べることで改良できます。一致するものが見つからない場合は、この項目番号は空ではありません。

とはいえ、私は \SI{...}{...} 入力するのはそれほど難しくなく、異なるものを互いに明確に区別します。

ここに画像の説明を入力してください

関連情報