如果我使用该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}