使用 xparse 创建宏,在参数之间创建空格

使用 xparse 创建宏,在参数之间创建空格

当我在数学模式下写单位时,我使用\,例如来分隔它们:$3 \; kg \, m^2$

我想创建一个宏来为我执行此操作,因此我使用了xparse如下方法:

\usepackage{xparse}

\NewDocumentCommand \units{O{}O{}O{}}{\;#1 \,#2 \,#3}

问题是,如果我只指定一个参数,我仍然会得到 2 个额外的空格,因为我的宏跳过了参数但没有跳过\,

我希望\,如果我只指定 1 或 2 个参数,我的宏就会跳过额外的命令。

答案1

从根本上讲,你需要以可选参数的存在为条件。在xparse\IfValueTF这是通过TF可选的是否需要True 或False 分支来完成的。

在此处输入图片描述

\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要好得多。

相关内容