我已经习惯了xspace
很长时间,在使用某些宏后添加空格。通常,使用宏来一致地格式化单词,例如:
\documentclass[]{article}
\usepackage{xspace}
\begin{document}
\newcommand{\matlab}{\textsc{matlab}\xspace}
\newcommand{\enterprise}{\emph{USS Enterprise\nocorr}\xspace}
For me, \matlab is the best; I like to program in \matlab.
The \enterprise was a famous ship.
\end{document}
在一个最近的问题,我评论说
这个包非常好,避免了每次使用以这种方式定义的宏的
xspace
需要。{}
有人回答我
很多人都这么说,但是 xspace 的作者却不太确定: xspace 的缺点
引用的帖子的结论是“如果你觉得它有用,那很好,它就在那里。但就我个人而言,[大卫·卡莱尔,原作者xspace
]不推荐它。”
然而,一个答案不久之后埃格尔似乎xspace
毫不犹豫地使用,在使用简单的宏时隐含地推荐它,例如:
\usepackage{xspace}
\newcommand{\Poincare}{Poincar\'e\xspace}
\newcommand{\adele}{ad\`ele\xspace}
\newcommand{\Cech}{\v{C}ech\xspace}
\newcommand{\Erdos}{Erd\H{o}s\xspace}
\makeatletter
\newcommand{\etale}{\'etal\@ifstar{\'e}{e\xspace}}
\makeatother
因此,我的问题可以归结为以下三个:
是否有任何可接受的(无争议的)用例
xspace
?(也许是如上图所示的 egreg 的情况,类似于我最初的例子?)什么类型的情况的使用
xspace
实际上可能会导致问题?(只是像上面例子中的斜体更正那样的事情吗\enterprise
?)如果间距问题是由宏引起的,那么
xspace
每次使用该宏时是否会以相同的方式失败,或者是否取决于使用该宏的上下文?
答案1
正如我在参考答案中评论的那样,部分问题在于xspace
回答这个问题并不是一件容易的事这问题。这就是 xpsace 失败的原因,而且很难给出确切的失败时间的有用总结。
xspace 必须提前判断是否要添加空格。基本上它看到标点符号就不会添加空格。但是宏看到标点符号和排版结果中出现标点符号不是一回事。
所以
\xspace,
检测,
到并且没有添加空格。
\xspace\mbox{,}
未检测到“,”
现在您可能不会在文档中输入这些内容,但如果您使用 babel 快捷方式来表示语言敏感的标点符号,或者使用智能引号包或任何其他一千种可能性,那么有效结果可能类似。
\xspace
因此,如果以结尾的宏后面的任意标记以允许看到任何应该抑制空格的字符的\xspace
方式定义,则基本上可以工作。\xspace