В моем документе мне нужно использовать большое количество различных единиц СИ. Чтобы облегчить набор текста, я обычно определяю новые команды как \newcommand{\unitmass}{\si{\kilogram}}
или \newcommand{\unitmomentum}{\si{\kilogram\meter\per\second}}
. Затем я могу использовать что-то вроде 2.5\unitmass
или 3.4\unitmementum
и сделать это. Это экономит мне массу усилий по набору текста.
Не такая уж и проблема, пока мне не понадобится \si[2.5d-15]{\kilogram\meter\per\second}
(обратите внимание на научную запись числа), что все равно требует от меня набрать полный шебанг. Один из вариантов — использовать математическую запись только для числа, как в , $2.5\times 10^{-17}$\unitmomentum$
что не является потрясающим вариантом. В идеале я хотел бы что-то вроде, \unitmomentum[2.5d-15]
чтобы обойтись.
Это значит, что мне нужно определить свои команды намного сложнее, и их десятки (быстро достигающие сотни). Поэтому мне нужно определить шаблон необязательного аргумента, принимающего команды.
Мой первый подход заключался в следующем:
\newcommand{\SimpleSIunit}[2]{%
\expandafter\newcommand\csname #1\endcsname{\si{#2}}%
}
Это работает, если я остаюсь довольным без дополнительных аргументов. Я могу выдать десятки директив, \SimpleSIunit{unittorque}{\newton\meter}
и моя основная потребность будет удовлетворена.
Однако, что я действительно хочу сказать, так это
\newcommand{\SimpleSIunit}[2]{%
\expandafter\newcommand[1][]\csname #1\endcsname{\si[##1]{#2}}%
}
Что, очевидно, не приносит пользы. Есть идеи, как это исправить?
После того, как я произнесу \SimpleSIunit{unittorque}{\newton\meter}
, я хочу, чтобы эти четыре строки выдавали одинаковый результат -
2.5\unittorque
\unittorque[2.5]
2.5\si{\newton\meter}
\si[2.5]{\newton\meter}
** PS:: EDIT после комментария @daleif **
Пробелы обрабатываются следующими директивами, прежде чем я сделаю что-либо еще. Он использует пакет savesym
. Я не притворяюсь, что код ниже — моя оригинальная работа. Называйте это программированием Cargo-cult, но я не студент, которому нужна домашняя работа. Это моя профессиональная работа, и я использую LaTeX в качестве инструмента.
% 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%
}
решение1
siunitx
Для этого типа ввода имеется встроенная функциональность.
\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}
Обратите внимание, что этот units
синтаксис не является настройкой по умолчанию, поскольку я считаю его неоптимальным.