在 this article作者讨论了使用\ @在完全停止之后放置正确的间距,而不是在句子的末尾,例如:先生等等。
宏建议
\newcommand\etc{etc\@ifnextchar.{}{.\@}}
并不完美,因为(\etc more text)
(etc.more text)
会产生\etc
。
我见过很多作者制作了自己的etc.\
宏版本,主要是\etc
的版本。
\ie
,\etal
,\eg
,{{1}}的哪些宏在大多数情况下会产生最好的效果?
一般来说这个品味太过个人化了吗?
答案 0 :(得分:18)
早些时候我曾使用宏等“et al。”等,但现在我不鼓励人们定义那种宏。
你已经观察到一个问题:让定义正确以便他们正确处理所有特殊情况(包括与其他软件包的交互 - 例如重新定义“\ cite”命令和调整的那些)是非常棘手的。引用前的间距)。
但更重要的是,即使你拥有一堆适合您需求的宏并且您知道如何使用它们,您的共同作者也可能会感到困惑准确地说如何在各种特殊情况下正确使用你的宏。
因此,我建议您避免使用宏来处理诸如“等”之类的琐碎事情。并使用标准的Latex标记简单地拼出所有内容。毕竟,大多数情况下不需要任何特殊处理(“eg”通常后面跟一个逗号;“et al。”通常后跟“〜\ cite”等),无论何时需要特殊处理,所有Latex用户应该知道如何使用“\”和“\ @”等命令。
答案 1 :(得分:5)
技术挑战!我们可以通过查看下一个字符的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}
但是,我认为Jukka的建议听起来很合理:我会说问题会解决他的\ etc宏我们应该看到Tex的双倍间距实施中的错误(Will Robertson应该要求他的支票):如果你知道错误存在,您可以通过在“。)”之类的情况下放入\ _来直接解决它,或者您可以使用棘手的代码,这意味着您不必在这种情况下进行思考,但是您增加了复杂性你排版的方式对于下一个意外故障不适合你,你可能已经介绍过了。
Postscript 修复了以前的版本,感谢tex.stackexchange.com上的Joseph Wright noticing a stupid error。
答案 2 :(得分:5)
在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
答案 3 :(得分:4)
您是否尝试过使用xspace
套餐?
示例宏:
\def\etc{etc.\@\xspace}
有些测试:
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命令“吃掉” 解码器。
答案 4 :(得分:1)
所有LaTeX命令都会消除它们之后的空间。如果你想要一个空间,你需要逃避它:
\etc\ and more
这是必要的,因为您需要清楚命令名称的结束位置。 \etcno space
无法正确解释。