常见缩写的宏

常见缩写的宏

常见缩写的格式非常难以正确设置。我想要一些简单的宏,如下所示:

You should eat more fruit, \eg apples, bananas, oranges, \etc.

在定义这一点时,至少有三个相互关联的问题需要克服:

  1. 如果用在句子末尾,我们最终会得到两个句号。简单地在宏中省略句号似乎很难看(尤其是对于“eg”、“ie”等)。更好的解决方案是使用类似\consumeif{.},但我找不到更好的解决方案。
  2. 宏应该包括的行为\xspace
  3. 它还应该根据它是否结束一个句子来产生正确的间距,就像的逻辑一样\@

我(你)该如何编写这样的宏? 注意:我知道这个问题和其他人也喜欢它,但是这些答案并不能解决我的问题。

答案1

我认为\eg\ie宏的定义应与 不同\etc,因为它们永远不会位于句子末尾。\@\xspace如果需要,您可以简单地在末尾使用 来确保空格具有正确的宽度。\etc您可以使用\@ifnextchar{.}{<yes>}{<no>}来检查后面是否有句号。

\documentclass{article}

\usepackage{xspace}
\newcommand*{\eg}{e.g.\@\xspace}
\newcommand*{\ie}{i.e.\@\xspace}

\makeatletter
\newcommand*{\etc}{%
    \@ifnextchar{.}%
        {etc}%
        {etc.\@\xspace}%
}
\makeatother

\begin{document}
\noindent
You should eat more fruit, \eg apples, bananas, oranges, \etc. Next sentence.

\noindent
You should eat more fruit, \eg, apples, bananas, oranges, \etc but also tomatoes.

\end{document}

答案2

Phil Ratcliffe 最近向 CTAN 发布了两个软件包来解决这个问题:

  • xpunctuate“提供命令\xperiod\xcomma\xperiodcomma,其过程与 类似\xspace,并插入标点符号当且仅当这是必要的”,并且
  • foreign除其他事项外,它使用来自的命令xpunctuate来定义\eg\ie按照 OP 的请求。

这些命令尝试通过一个简单的约定来正确处理句子间距,图示比描述更好:

  • The forest is filled with lions, tigers, bears, \etc.” 变成
    The forest is filled with lions, tigers, bears, {\em etc}.
  • The forest is filled with lions, tigers, bears, \etc!” 变成
    The forest is filled with lions, tigers, bears, {\em etc}.!
  • Lions, tigers, bears, \etc fill the forest.” 变成
    Lions, tigers, bears, {\em etc}.\@ fill the forest.

(实际上,字体选择比我所展示的要复杂一些。)

甚至有代码在句子中间的\ie&后插入逗号\eg。(可以通过选项禁用此逗号[UKenglish]。)

答案3

在阅读@JC Salomons的回答后,我认为xpunctuate它最适合这项任务。由于我不需要该foreign软件包中的额外功能,因此我决定不使用它。

包提供的宏的实现对我来说并不简单,所以我想其他人可能也会遇到同样的问题。这是我\eg使用该xpunctuate包对宏的定义(请确保在序言中加载它):

\providecommand{\eg}[0]{e.g\xperiod}

解释:

  • \providecommand如果宏名尚未使用,则定义一个新宏。否则将发出错误。我选择这样做是为了避免在不知情的情况下覆盖其他包的重要宏,因为这可能会破坏其功能。

  • 接下来是宏名称:{\eg}

  • 然后定义参数的数量,在本例中是[0]。这是可选的,但我喜欢将其明确化。

  • 最后,定义宏。它由 组成e.g,后跟xpunctuate的宏\xperiod。如果宏后跟另一个单词,这将插入一个句号和一个单词间空格;如果宏后跟标点符号,则插入一个句号而不插入空格;如果宏后跟一个句号(即在句子末尾),则不插入任何内容。

这应该可以正确处理缩写的所有不同用例。

相关内容