当句末出现带点的 SI 单位时删除双标点

当句末出现带点的 SI 单位时删除双标点

我正在写一个使用 SI 和原子单位后者通常用略显笨拙的符号书写

p = 1 天文单位

带点。(我知道,这不是很好,但我能做什么呢?)因为我使用的是 SI 单位,所以我想通过以下方式在整个过程中使用统一的单位方法:siunitx包,其优点是可以正确且轻松地设置原子单元的样式。这些可以通过自定义\DeclareSIUnit命令合并到 SI 包中,效果非常好:

\documentclass[aps,onecolumn,preprint,pra]{revtex4-1}

\usepackage{siunitx}
\DeclareSIUnit{\au}{{a.u.}}

\begin{document}

The momentum is $p=\SI{1}{\au}$, so the energy is $E=\SI{0.5}{\au}$. 
The position is therefore unknown.

\end{document}

问题是,句子末尾会出现两个句号,一个来自句号,a.u.另一个来自显式句号。可以通过手动删除后者来解决这个问题,但如果我移动内容,我很容易忘记一个。

是否有一种自动的方法可以让siunitx单位\au“吃掉”任何紧接着发生的时期?

答案1

拥有像这样的语法的希望很小\SI{10}{\au},因为这将涉及对的深入研究siunitx

诸如此类的语法\au{10}似乎是最好的选择。

\documentclass{article}
\usepackage{siunitx}

\ExplSyntaxOn
\NewDocumentCommand{\au}{m}
 {
  \SI{#1}{{a.u.}}
  \peek_charcode_remove:NT .
   {
    \mode_if_math:F { \spacefactor\sfcode`\.\scan_stop: }
   }
 }
\ExplSyntaxOff

\begin{document}

The star is at \au{10} from Earth.
Stars can be farther than \au{1000}.
The preceding period is considered
end of sentence.


% retry to see that space factor is honored
\sfcode`\.=20000 \xspaceskip=30pt

The star is at \au{10} from Earth.
Stars can be much much farther than \au{1000}.
The preceding period is considered
end of sentence.

\end{document}

我们排版\SI{10}{{a.u.}}然后查看下一个标记;如果它是一个句号,则将其删除,但空间因子会被重置,就好像句号在那里一样。

例子中,重复了该段落,以非常夸张的设置来表明哪些周期会影响空间因素。

在此处输入图片描述

还有一个变体,它还检查 是否\au{...}位于数学公式的末尾,但这需要您使用$。 还可以通过检查 来改进测试\),这留作练习。

\documentclass{article}
\usepackage{siunitx}

\ExplSyntaxOn
\NewDocumentCommand{\au}{m}
 {
  \SI{#1}{{a.u.}}
  \peek_charcode_remove:NTF .
   {
    \mode_if_math:F { \spacefactor\sfcode`\.\scan_stop: }
   }
   {
    \mode_if_math:T
     {
      \peek_catcode_ignore_spaces:NT $
       {
        \group_insert_after:N \jost_check_period:
       }
     }
   }
 }
\cs_new_protected:Npn \jost_check_period:
 {
  \peek_charcode_remove:NT .
   {
    \spacefactor\sfcode`\.\scan_stop:
   }
 }
\ExplSyntaxOff

\begin{document}

The star is at \au{10} from Earth.
Stars can be farther than \au{1000}.
The preceding period is considered
end of sentence.

This has the thing is math: $E=\au{10}$.

% retry to see that space factor is honored
\sfcode`\.=20000 \xspaceskip=30pt

The star is at \au{10} from Earth.
Stars can be much much farther than \au{1000}.
The preceding period is considered
end of sentence.

\end{document}

在此处输入图片描述

不过,我的意见是,您要么避免使用带有句点的符号,要么留下两个句点,它们代表不同的含义。

答案2

如果可行的话,您可能希望为此引入一个新命令。在我的解决方案中,您将无法编写\SI{123}{\au},但它将处理所有可能性。

% arara: pdflatex

\documentclass{article}
\usepackage{xspace}
\usepackage{siunitx}
\makeatletter
\DeclareRobustCommand{\au}[1]{%
    \@ifnextchar{.}
    {\SI{#1}{{a.u}}}
    {\SI{#1}{{a.u.}}\ifmmode\else\@\xspace\fi}%
}
\makeatother

\begin{document}
    In the middle \au{123} of a sentence. At the end of a sentence \au{123}. In inline $a\au{123}b$ and in a display equation \[a\au{123}b\]

    The momentum is $p=\au{1}$, so the energy is $E={}$\au{0.5}. % This is the only caveat here...
    The position is therefore unknown.
\end{document}

在此处输入图片描述

相关内容