常见缩写的格式非常难以正确设置。我想要一些简单的宏,如下所示:
You should eat more fruit, \eg apples, bananas, oranges, \etc.
在定义这一点时,至少有三个相互关联的问题需要克服:
- 如果用在句子末尾,我们最终会得到两个句号。简单地在宏中省略句号似乎很难看(尤其是对于“eg”、“ie”等)。更好的解决方案是使用类似
\consumeif{.}
,但我找不到更好的解决方案。 - 宏应该包括的行为
\xspace
。 - 它还应该根据它是否结束一个句子来产生正确的间距,就像的逻辑一样
\@
。
我(你)该如何编写这样的宏? 注意:我知道这个问题和其他人也喜欢它,但是这些答案并不能解决我的问题。
答案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
。如果宏后跟另一个单词,这将插入一个句号和一个单词间空格;如果宏后跟标点符号,则插入一个句号而不插入空格;如果宏后跟一个句号(即在句子末尾),则不插入任何内容。
这应该可以正确处理缩写的所有不同用例。