使用词汇表的无双点缩写

使用词汇表的无双点缩写

我想用缩写点来排版我的首字母缩略词,例如P.C.A.代表principal component analysis并使用宏。 这个问题 提供了一个技巧,可以避免在首字母缩略词位于句子末尾时出现双点,This could be done with a \pca.这样

这可以用 PCA 来实现

并不是

这可以用 PCA 来完成。

现在,我想将此方法与 的首字母缩略词相关命令结合起来glossaries。因此,我使用此命令定义了一个首字母缩略词

\newacronym{pca}{\pca}{principal component analysis}

然后使用它\gls{pca}

This could be done with a \gls{pca}.

但是,该glossaries命令在 \pca 和句号之间添加了一些字符,因此之前提到的技巧不起作用,我得到了双点。

你知道我该如何处理吗?

这是一个最小的工作示例。xspace可以删除包和命令;它们旨在符合英语用法。

\documentclass{article}
\usepackage[acronym]{glossaries}
\makeglossaries

\usepackage{xspace}
\makeatletter
\DeclareRobustCommand{\abren}[1]{%
    \@ifnextchar{.}%
        {#1}%
        {#1.\@\xspace}%
}
\makeatother

\newcommand{\pca}{\abren{P.C.A}}

\newacronym{pca}{\pca}{principal component analysis}

\begin{document}
This could be done with a \pca. %good

This could be done with a \gls{pca}. %good

This could be done with a \gls{pca}.%awkward
\end{document}

答案1

这是一个可能的解决方案:

\documentclass{article}
\usepackage[acronym]{glossaries}
\usepackage{xspace}
\makeglossaries

\newacronym{pca}{P.C.A.}{principal component analysis}

\makeatletter
\newcommand{\pgls}[1]{%
  \expandafter\csname ifglo@#1@flag\endcsname
    \gls{#1}\expandafter\@firstofone
  \else
    \gls{#1}\expandafter\@gobble
  \fi
  {\@ifnextchar.{\get@sf}{\xspace}}%
}
\def\get@sf#1{\spacefactor\the\sfcode`#1\relax}
\makeatother

\begin{document}
This could be done with a \pgls{pca}. Just to see the first usage.

This could be done with a \pgls{pca}. And the spacing?

This could be done with a P.C.A\@. And the spacing?

This could be done with a \pgls{pca} or not.

This could be done with a P.C.A. or not.

\end{document}

带有显式的行P.C.A.只是为了显示间距是否合适。宏\pgls检查我们是否是第一次使用该首字母缩略词。更复杂的事情,例如在其他时候使用扩展版本,可以通过 提供的普通命令获得glossaries

在此处输入图片描述

宏首先检查首字母缩略词是否已被使用。在这种情况下,条件\ifglo@pca@flag为真。因此,当它为假时,我们除了发出 之外不必做任何特殊的事情\gls{pca}\expandafter\csname ifglo@#1@flag\endcsname只需使用参数:\pgls{pca}它就会变成\ifglo@pca@flag所需的。

如果条件为真,则\fi评估最后一个标记之后的标记。这是检查后面是否有句点;如果有句点,则\get@sf执行,否则\xspace(这是必要的,因为\@ifnextchar会吞噬空格)。

如果有句点,\@ifnextchar则不删除它,它将成为的参数\get@sf,扩展为\spacefactor\the\sfcode.\relax`,从而设置所需的空间因子。

相关内容