如何使用 abbrevs 包防止缩写后出现空格?

如何使用 abbrevs 包防止缩写后出现空格?

如果我使用该abbrevs包并使用以下代码定义 \newabbrev

\newabbrev\gb{Great Britain}

并在以下示例中使用它(取自xspace 包文档):

\gb, a small island off the coast of France

我得到了“大不列颠,法国海岸外的一个小岛”,其中逗号前插入了一个多余的空格

在 xspace 包文档中,他们还定义了“Great Britain”的缩写,但使用的\newcommand是 而不是\newabbrev,而且他们还遇到了逗号前多余空格的问题。他们通过将宏放在\xspace全名后面来解决这个问题,即Great Britain\xspace。当我按照他们的示例并将缩写重新定义为

\newabbrev\gb{Great Britain\xspace}

它有相反的效果,即额外的逗号前添加了多余的空格(我无法在此处说明)。我也尝试过插入\@之前的内容xspace(我发现您可以在这个非常相似的问题),但这并没有什么效果。

有没有办法防止\newabbrev使用缩写后插入空格?我使用这个abbrevs包的原因是它提供了一种方法,可以在第一次使用缩写时使用一个扩展,在休息时使用另一个扩展。我也可以换成其他允许我做同样事情的包。

答案1

这似乎是abbrevs包中的一个错误。它应该测试缩写的以下标记与中的标记,如果它不是的一部分,\nospacelist则插入。但是,负责测试的宏检查了错误的条件:\space\nospacelist

\newcommand\maybe@space@{%
  \@tempswatrue
  \expandafter   \@tfor
    \expandafter \reserved@a
    \expandafter :%
    \expandafter =%
                 \nospacelist
                 \do \t@st@ic
  \if@tempswa
    \space
  \fi
}

测试结果\@tempswa为真,但由于宏\t@st@ic(在中定义latex.ltx并在此处进行实际测试)使用\maybe@ic

\def \t@st@ic {%
  \expandafter\let\expandafter\reserved@b\expandafter=\reserved@a\relax
  \ifx\reserved@b\@let@token
    \maybe@icfalse
    \@break@tfor
  \fi
}

它应该使用/检查那个。稍微重新定义一下就\maybe@space@可以解决这个问题:

\documentclass{article}
\usepackage{abbrevs}
\newabbrev\gb{Great Britain}

\makeatletter
\renewcommand\maybe@space@{%
  % \@tempswatrue % <= this is in the original
  \maybe@ictrue % <= this is new
  \expandafter   \@tfor
    \expandafter \reserved@a
    \expandafter :%
    \expandafter =%
                 \nospacelist
                 \do \t@st@ic
  % \if@tempswa % <= this is in the original
  \ifmaybe@ic % <= this is new
    \space
  \fi
}
\makeatother
\begin{document}

\gb, a small island \\
\gb is an island

\end{document}

在此处输入图片描述

相关内容