
Проблема
Я использую 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{...}{...}
что не намного сложнее для набора и четко отделяет разные вещи друг от друга.