在单位符号周围使用正确的间距

在单位符号周围使用正确的间距

这是我在 2003 年开发的旧软件包。其想法是涵盖国际系统单位 (SI) 和其他类型的单位,大致遵循该文件中的指导方针。

单位应该使用某种直线字体(罗马字体与斜体或倾斜字体),它们不是缩写,也不应该使用句号,并且应该用空格与数量分开(如果印刷上可能的话,可以用一个小空格),也应该与后面的标点符号分开。

因此我定义了一个宏\unit,它将对以下参数进行排版,\mathrm 处理前面的空格以\,将其与数量分开,并在后面添加一个额外的空格(如果后面跟着标点符号)。它还采用了一个可选参数来排版指数。

它还有一个附加宏\newunit,可以为最常见的单位创建命令。

我还尝试让这些命令在普通文本和数学模式下运行。

下面的代码显示了定义的宏和示例:

\documentclass[twocolumn]{article}
\makeatletter
  %%% Modified from xspace
  \DeclareRobustCommand\uspace{\futurelet\@let@token\@uspace}
  \def\@uspace{%
    \ifx\@let@token\bgroup\else
    \ifx\@let@token\egroup\else
    \ifx\@let@token\/\else
    \ifx\@let@token\ \else
    \ifx\@let@token~\else
    \ifx\@let@token.\,\else
    \ifx\@let@token!\,\else
    \ifx\@let@token,\,\else
    \ifx\@let@token:\,\else
    \ifx\@let@token;\,\else
    \ifx\@let@token?\,\else
    \ifx\@let@token/\else
    \ifx\@let@token'\else
    \ifx\@let@token)\,\else
    \ifx\@let@token-\else
    \ifx\@let@token\@xobeysp\else
    \ifx\@let@token\space\else
    \ifx\@let@token\@sptoken\else
     \space
     \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
  \newcommand\unit[1]{\def\@tempa{#1}\unit@}
  \newcommand\unit@[1][\@empty]{%
    \ensuremath{\,%
      \textrm{\@tempa}%
      \ifx#1\@empty\else
       ^{#1}\fi}%
    \uspace}
  \newcommand\newunit[2]{%
    \@namedef{#1}{\unit{#2}}}
  \newcommand\degree{%
    \ensuremath{^\circ}}
\makeatother
% SI official and common derivated units
\newunit{m}{m}
\newunit{kg}{kg}
\newunit{sec}{s}
\newunit{amp}{A}
\newunit{ohm}{$\Omega$}
\newunit{kelvin}{\degree K}
\newunit{celcius}{\degree C}

\begin{document}
\newunit{cm}{cm}
One inch is 2.54\cm and one square inch is 6.4516\cm[2].
\[(2.54\cm)^2=6.4516\cm[2]\]

\newunit{farenheit}{\degree F}
Water freezes at 32\farenheit and boils at 212\farenheit.
\[100\celcius=212\farenheit-32\farenheit\]

International unit system defines the Ampere (\amp) and the
second (\sec), however it does ot define the Culomb (\unit{C})
prefering the compund Ampere-second (\amp\sec).
(Although it should look as \unit{As}.)
\[1\unit{C} = 1\amp\sec = 1\unit{As}.\]

If a tension of 12\unit{V} on a resistor of 15\ohm will produce
a current of 0.8\amp.
\[\frac{12\unit{V}}{15\ohm}=0.8\amp\]

The gravitational field on Eath's surface is 1\unit{g}, and this
is roughly equal to 9.8\unit{N}/\kg or 32\unit{ft}/\sec[2].
\[1\unit{g} \simeq 9.8\frac{\unit{N}}{\kg}
 = 9.8\m\sec[-2] \simeq 32\frac{\unit{ft}}{\sec[2]}\]

\end{document}

示例输出

在大多数运行文本和数学模式下它都能正常工作,但是输出有时会留下太宽的空格,而这些空格不应该是空格。

我可以使用什么样的技巧来消除不需要的空间,同时保留我想要的空间?

我注意到该命令\mathrel处理空格的方式与我预期的类似\unit

(度数符号前面的空格可能会被分开处理,因为它会影响这些单位的所有实例。)

((我注意到该包siunitx可能已经完成了我尝试做的事情;虽然使用该包可能会解决我的印刷问题,但它并不能解决我的“我想知道怎么做”的问题。))

相关内容