在 这篇文章中,作者讨论了使用\ @在完全停止之后放置正确的间距,例如先生等等.
宏建议
\newcommand\etc{etc\@ifnextchar.{}{.\@}}
Run Code Online (Sandbox Code Playgroud)
因为(\etc more text)它产生的情况不是很完美(etc.more text).
我见过很多作者都制作了自己的\etc宏版本,主要是变体etc.\.
对于什么是宏\etc,\ie,\etal,\eg产生在大多数情况下最好的结果?
一般来说,这个品味太过个人化吗?
Juk*_*ela 19
早些时候我使用宏等"et al."等,但现在我不鼓励人们定义那种宏.
一个问题是你已经观察到的:让定义正确以便他们正确处理所有特殊情况(包括与其他包的交互 - 例如那些重新定义"\ cite"命令并在引用之前调整间距)是非常棘手的. ).
但更重要的是,即使您有一堆适合您需求的宏并且您知道如何使用它们,您的共同作者也可能会对在各种特殊情况下如何正确使用您的宏感到困惑.
因此,我建议您避免使用宏来处理诸如"等"之类的琐碎事情.并使用标准的Latex标记简单地拼出所有内容.毕竟,大多数情况下不需要任何特殊处理("eg"通常后面跟一个逗号;"et al."通常后跟"〜\ cite"等),无论何时需要特殊处理,所有Latex用户应该知道如何使用诸如"\"和"\ @"之类的命令.
您是否尝试过使用该xspace软件包?
示例宏:
\def\etc{etc.\@\xspace}
Run Code Online (Sandbox Code Playgroud)
一些测试:
Run Code Online (Sandbox Code Playgroud)Cat, dog, \etc. And so on. \\ Cat, dog, \etc! And so on. \\ Cat, dog, \etc, and so on. \\ Cat (dog, \etc). And so on. \\
产生:

从文档:
xspace 包提供了一个命令,它查看命令流中它后面的内容,并决定是否插入一个空格来替换被 TeX 命令解码器“吃掉”的一个空格。
在CVPR的样式包中,它定义为:
\usepackage{xspace}
% Add a period to the end of an abbreviation unless there's one
% already, then \xspace.
\makeatletter
\DeclareRobustCommand\onedot{\futurelet\@let@token\@onedot}
\def\@onedot{\ifx\@let@token.\else.\null\fi\xspace}
\def\eg{\emph{e.g}\onedot} \def\Eg{\emph{E.g}\onedot}
\def\ie{\emph{i.e}\onedot} \def\Ie{\emph{I.e}\onedot}
\def\cf{\emph{c.f}\onedot} \def\Cf{\emph{C.f}\onedot}
\def\etc{\emph{etc}\onedot} \def\vs{\emph{vs}\onedot}
\def\wrt{w.r.t\onedot} \def\dof{d.o.f\onedot}
\def\etal{\emph{et al}\onedot}
\makeatother
Run Code Online (Sandbox Code Playgroud)
技术挑战!我们可以通过查看下一个字符的catcode并查看它是否是一个字母来避免空格后的字母问题; 这可以使用Latex3的expl3宏\peek_charcode:NTF(我的第一个探索代码!)完成:
\documentclass{article}
\usepackage{expl3}
\ExplSyntaxOn
\newcommand\latinabbrev[1]{
\peek_meaning:NTF . {% Same as \@ifnextchar
#1\@}%
{ \peek_catcode:NTF a {% Check whether next char has same catcode as \'a, i.e., is a letter
#1.\@ }%
{#1.\@}}}
\ExplSyntaxOff
%Omit final dot from each def.
\def\eg{\latinabbrev{e.g}}
\def\etal{\latinabbrev{et al}}
\def\etc{\latinabbrev{etc}}
\def\ie{\latinabbrev{i.e}}
\begin{document}
Maybe a list, \eg, a, b, c, and d. Which is to say (\ie) a, b, \etc. Consider Knuth, \cf The TeXbook.
\end{document}
Run Code Online (Sandbox Code Playgroud)
Jukka的建议我认为是合理的:我会说问题会解决他的\ etc宏我们应该看到Tex的双间距实现中的一个错误(Will Robertson应该要求他的检查):如果你知道这个bug在那里,你可以通过在诸如".)"之类的情况下放入\ _来直接解决它,或者你可以使用棘手的代码,这意味着你不必在这种情况下思考,但是你增加了你的方式的复杂性排版不适合你的下一个意外故障,你可能已经介绍过了.
Postscript以前的版本已修复,感谢Joseph Wright在tex.stackexchange.com上注意到一个愚蠢的错误.