当我在数学模式下写单位时,我使用\,
例如来分隔它们:$3 \; kg \, m^2$
我想创建一个宏来为我执行此操作,因此我使用了xparse
如下方法:
\usepackage{xparse}
\NewDocumentCommand \units{O{}O{}O{}}{\;#1 \,#2 \,#3}
问题是,如果我只指定一个参数,我仍然会得到 2 个额外的空格,因为我的宏跳过了参数但没有跳过\,
。
我希望\,
如果我只指定 1 或 2 个参数,我的宏就会跳过额外的命令。
答案1
从根本上讲,你需要以可选参数的存在为条件。在xparse
\IfValueTF
这是通过TF
可选的是否需要T
rue 或F
alse 分支来完成的。
\documentclass{article}
\usepackage{xparse,amsmath}
\NewDocumentCommand\units{ o o o }{%
\IfValueT{#1}{\;#1}%
\IfValueT{#2}{\,#2}%
\IfValueT{#3}{\,#3}%
}
\begin{document}
This pumpkin weighs $3\units[\text{kg}]$. That's heavy!
I can run $12\units[\text{m}][\text{s}^{-1}]$. That's fast!
Something ridiculous $1\units[a][b][c]$. That's ridiculous!
Something $5\units$ something else.
\end{document}
一般来说,单位应该像常规文本一样设置。
一个更好的方法是使用siunitx
:
\documentclass{article}
\usepackage{siunitx}
\DeclareSIUnit{\aaa}{a}
\DeclareSIUnit{\bbb}{b}
\DeclareSIUnit{\ccc}{c}
\begin{document}
This pumpkin weighs $\SI{3}{\kilogram}$. That's heavy!
I can run $\SI{12}{\metre\per\second}$. That's fast!
Something ridiculous $\SI{1}{\aaa \bbb \ccc}$. That's ridiculous!
Something $5$ something else.
\end{document}
答案2
如果你有三个以上的单位怎么办?这里的单位用空格隔开,然后宏会负责使用细空格。
\documentclass{article}
\usepackage{xparse,amsmath}
\NewDocumentCommand\units{>{\SplitList{ }}m}{%
\ProcessList{#1}{\addunit}%
}
\NewDocumentCommand{\addunit}{m}{%
\,\mathrm{#1}%
}
\begin{document}
This pumpkin weighs $3\units{kg}$. That's heavy!
I can run $12\units{m s^{-1}}$. That's fast!
Something ridiculous $1\units{a b c}$. That's ridiculous!
\end{document}
当然,siunitx
要好得多。