![当句末出现带点的 SI 单位时删除双标点](https://linux22.com/image/306385/%E5%BD%93%E5%8F%A5%E6%9C%AB%E5%87%BA%E7%8E%B0%E5%B8%A6%E7%82%B9%E7%9A%84%20SI%20%E5%8D%95%E4%BD%8D%E6%97%B6%E5%88%A0%E9%99%A4%E5%8F%8C%E6%A0%87%E7%82%B9.png)
我正在写一个使用 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}