在这个答案,\@
用来后句号和之前的\xspace
,大概是为了表明前句号(在“等”中)不是句子的结尾。
在这些建议,\@
用来前句号和大写字母后,表示前面的大写字母是句子最后。
由于\@
在网上很难找到,我想在这里问一下:它到底是\@
做什么的,如何正确/一致地使用它?例如,你应该如何输入以下滑稽的句子?
亨利三世国王并没有使用 JS、HTML 等语言。
编辑:我接受芭芭拉的以下回答,因为它(以及对它的评论)表明了\@
“关注是句子的结尾”。它的对应词是\
(斜线空格),表示“句号先于是句子中间的”。Egreg 的回答更详细地解释了如何\@
以及\spacefactor
工作方式原因\@
大小写字母和标点符号的影响\
。这两个答案都很有帮助。
上面我编造的句子有两个正确答案:
Languages like JS, HTML, etc.\ were not used by King Henry III\@.
Languages like JS, HTML, etc.\@ were not used by King Henry III\@.
前者可以说是“更好的风格”,而后者显然能产生正确的结果,即使它在句号\@
和句号的位置上似乎不太一致。一个安全但略显多余的答案是盲目地\@
在每个逗号前添加:
Languages like JS\@, HTML\@, etc.\ were not used by King Henry III\@.
最后一个适合宏化:(\def\acronym#1{\textbf{#1}\@\xspace}
或任何你喜欢的风格),\xspace
如果下一个字符是标点符号,则消失,并且\@
确保后续标点符号认为它遵循小写单词而不是大写首字母。
答案1
我发现所引用的答案相当令人困惑,如果不是彻头彻尾的倒退的话。 \@
标点符号之前表示句号做位于句末。引用 Latex 手册(第 170 页):
\@
在标点符号前输入时,标点符号后会出现“句末”空格。仅当标点符号前的字符不是小写字母或数字时才需要。
所以你的荒谬句子输入为
Languages like JS, HTML, etc.\ were not used by King Henry III\@.
只有一个\@
,并且位于大写“I”之后。
更新:
我被提醒了,这\@
在经典 TeX 中没有定义,这有点丢脸。如果使用,结果是“!未定义的控制序列。”(TeX 在大写字母后的句号后呈现句末空格的相应命令是\null
.) \@
仅适用于 LaTeX。
答案2
宏简单地说
\spacefactor 1000
在 下\nonfrenchspacing
,大写字母将空间因子设置为 999,并且按照规则,空间因子永远不会从小于 1000 的值跳转到大于 1000 的值。另一方面,逗号将空间因子设置为 1250,句号设置为 3000,其他标点符号也是如此。
因此JS,
,逗号后的空间因子为 1000
J (999) S (999) , (1250->1000)
而JS,\@
其中一个
J (999) S (999) , (1250->1000) \@ (1000)
我们JS\@,
得到
J (999) S (999) \@ (1000) , (1250)
所以正确的语法是后者。
让我们考虑e.g.
和e.g.\@
:e.g\@.
e (1000) . (3000) g (1000) . (3000) , (1250)
e (1000) . (3000) g (1000) . (3000) \@ (1000)
e (1000) . (3000) g (1000) \@ (1000) . (3000)
因此正确的语法是中间的那个。但是,第二个句号后面紧接着一个逗号就没有\@
必要了。
您应该将短语输入为
Languages like JS\@, HTML\@, etc.\@ were not used by King Henry III\@.
否则,逗号后的空格将不会扩大(因子 1.25),而后面的空格etc.
则会扩大(因子 3000),这是不希望的。
最简单的事情就是忘掉\frenchspacing
这件事。
答案3
对于新手来说,一个简单的助记规则是:\@
是一个不可见的(零宽度)小写字母。
LaTeX 将序列视为<lowercase letter> <punctuation sign> <space>
短语的结尾,并增加了额外的空格以提高可读性:在 中That's all. Thanks
,LaTeX 在 后添加了更多空格all.
。否则,它不会在标点符号后添加额外的空格:在 中A. Einstein
,句号不会结束句子,因为前面的字母是大写的;在 中pi = 3.14
,句号不会结束句子,因为下一个字符不是空格。
然而,这条规则有时会失效:
(1) Apple Inc. sells phones
这里,LaTeX 认为句号结束了一个句子并错误地添加了一个额外的空格。
(2) My school scores were all A. Einstein would be proud of me!
这里,LaTeX 没有意识到句号结束了一个句子,因此没有添加预期的空格。
您可以使用不可见的小写字母来纠正这个问题\@
:
(1) Apple Inc.\@ sells phones
在这里,句号并不是句子的结束,因为它后面不再有空格。
(2) My school scores were all A\@. Einstein would be proud of me!
在这里,句号确实结束了一个句子,因为它前面有“小写字母” \@
。
这不仅适用于句号,也适用于逗号等:Score a, score b, score c.
可以,但大写字母的正确用法是Score A\@, score B\@, score C\@.
让 LaTeX 意识到每个逗号都结束一个短语(因为它位于小写“字母”后面\@
)。
(这种简单的解释在技术上并不正确;请参阅其他答案中的技术细节。)
答案4
这是一个老问题,这与其说是一个答案,不如说是一个过长的评论。
逗号前面\@
的(如 egreg 的优秀答案所示)是不是多余的。TeX 的处理\spacefactor
很直接,但不太清楚。
TeXbook 和 TeX by Topic 包含所有详细信息(其中大部分内容取自 TeX by Topic),但本质上会发生以下情况。当 TeX 在单词之间插入空格时,插入的空格量取决于几个因素。关键因素是当前字体参数 2、3、4 和 7,以及\spaceskip
、\xspaceskip
和\spacefactor
。\spaceskip
并\xspaceskip
用于覆盖字体参数。由于它们很少使用,我们在这里忽略它们。
通常,插入空格时,它具有自然宽度(字体参数 2)、拉伸分量(字体参数 3)和收缩分量(字体参数 4)。修改\spacefactor
此:拉伸分量乘以\spacefactor
/1000,而收缩分量除以\spacefactor
/1000。
当\spacefactor
至少为 2000 时,TeX 会通过字体参数 7 增加空间的自然宽度。这样做是为了让句子之间的空间更宽。
添加到行中的每个字符都有一个关联的空间因子代码\sfcode
。\spacefactor
每个字符后的设置如下。让n成为\sfcode
角色的。
- 如果n= 0,
\spacefactor
则保持不变。(这使得括号和方括号等标点符号不会影响\spacefactor
。) - 如果n> 1000 且
\spacefactor
< 1000,则\spacefactor
设置为 1000。(这种有点令人困惑的行为使得D. Knuth
能够使用正常空间。) - 否则,
\spacefactor
设置为n。
最后,\spacefactor
在段落开头(包括\indent
或之后\noindent
)以及\vrule
、重音符 或水平模式下的框之后,将 设置为 1000。
因此,考虑到这一点,让我们考虑一下使用 Computer Modern 10pt 罗马字体的一些后果。
- 空格具有未修改的(通过
\spacefactor
)粘连值“3.33333pt 加 1.66666pt 减 1.11111pt”,也就是说,它们的自然宽度是 3.33333pt,但可以额外拉伸 1.66666pt(没有惩罚)并缩小 1.11111pt。 - 小写字母(有
\sfcode
1000 个)后面的空格具有上面列出的粘合符。 - 大写字母(有
\sfcode
999 个)后面的空格的粘连量为 3.33333pt 加上 1.66498pt 减去 1.11221pt。这与小写字母后面的空格差别不大。 - 逗号后面的空格(有
\sfcode
1250 个)本身跟在小写字母后面(例如,中的空格foo, bar
),其粘连值为 3.33333pt 加上 2.08331pt 减去 0.88889pt。 - 句号后面的空格(有
\sfcode
3000 个)本身跟在小写字母后面(例如 中的空格),其粘连量为 4.44444pt 加上 4.99997pt 减去 0.37036pt。请注意,由于>= 2000,foo. bar
自然宽度已通过字体参数 7 增大。\sfcode
- 位于大写字母后面的句号(或逗号)后面的空格具有与 1 中相同的粘连效果。
现在让我们考虑以下 LaTeX 文档中的三个简短的段落。
\documentclass{article}
\tracingoutput=1
\showboxbreadth=1000
\showboxdepth=1000
\begin{document}
Languages like JS, HTML, etc. were not used by King Henry III. Next.
Languages like JS, HTML, etc.\ were not used by King Henry III\@. Next.
Languages like JS\@, HTML\@, etc.\ were not used by King Henry III\@. Next.
\end{document}
请注意,我已指示 TeX 将每页输出的内容写到日志文件中。此输出非常冗长,但您可以看到每个框、粘连和字符。例如,第一段由以下内容组成。
...\hbox(6.94444+1.94444)x345.0, glue set 16.08281fil
....\hbox(0.0+0.0)x15.0
....\OT1/cmr/m/n/10 L
....\OT1/cmr/m/n/10 a
....\OT1/cmr/m/n/10 n
....\OT1/cmr/m/n/10 g
....\OT1/cmr/m/n/10 u
....\OT1/cmr/m/n/10 a
....\OT1/cmr/m/n/10 g
....\OT1/cmr/m/n/10 e
....\OT1/cmr/m/n/10 s
....\glue 3.33333 plus 1.66666 minus 1.11111
....\OT1/cmr/m/n/10 l
....\OT1/cmr/m/n/10 i
....\OT1/cmr/m/n/10 k
....\kern-0.27779
....\OT1/cmr/m/n/10 e
....\glue 3.33333 plus 1.66666 minus 1.11111
....\OT1/cmr/m/n/10 J
....\OT1/cmr/m/n/10 S
....\OT1/cmr/m/n/10 ,
....\glue 3.33333 plus 1.66666 minus 1.11111
....\OT1/cmr/m/n/10 H
....\OT1/cmr/m/n/10 T
....\OT1/cmr/m/n/10 M
....\OT1/cmr/m/n/10 L
....\OT1/cmr/m/n/10 ,
....\glue 3.33333 plus 1.66666 minus 1.11111
....\OT1/cmr/m/n/10 e
....\OT1/cmr/m/n/10 t
....\OT1/cmr/m/n/10 c
....\OT1/cmr/m/n/10 .
....\glue 4.44444 plus 4.99997 minus 0.37036
....\OT1/cmr/m/n/10 w
....\kern-0.27779
....\OT1/cmr/m/n/10 e
....\OT1/cmr/m/n/10 r
....\OT1/cmr/m/n/10 e
....\glue 3.33333 plus 1.66666 minus 1.11111
....\OT1/cmr/m/n/10 n
....\OT1/cmr/m/n/10 o
....\OT1/cmr/m/n/10 t
....\glue 3.33333 plus 1.66666 minus 1.11111
....\OT1/cmr/m/n/10 u
....\OT1/cmr/m/n/10 s
....\OT1/cmr/m/n/10 e
....\OT1/cmr/m/n/10 d
....\glue 3.33333 plus 1.66666 minus 1.11111
....\OT1/cmr/m/n/10 b
....\kern-0.27779
....\OT1/cmr/m/n/10 y
....\glue 3.33333 plus 1.66666 minus 1.11111
....\OT1/cmr/m/n/10 K
....\OT1/cmr/m/n/10 i
....\OT1/cmr/m/n/10 n
....\OT1/cmr/m/n/10 g
....\glue 3.33333 plus 1.66666 minus 1.11111
....\OT1/cmr/m/n/10 H
....\OT1/cmr/m/n/10 e
....\OT1/cmr/m/n/10 n
....\OT1/cmr/m/n/10 r
....\OT1/cmr/m/n/10 y
....\glue 3.33333 plus 1.66666 minus 1.11111
....\OT1/cmr/m/n/10 I
....\kern0.27779
....\OT1/cmr/m/n/10 I
....\kern0.27779
....\OT1/cmr/m/n/10 I
....\OT1/cmr/m/n/10 .
....\glue 3.33333 plus 1.66666 minus 1.11111
....\OT1/cmr/m/n/10 N
....\OT1/cmr/m/n/10 e
....\OT1/cmr/m/n/10 x
....\OT1/cmr/m/n/10 t
....\OT1/cmr/m/n/10 .
....\penalty 10000
....\glue(\parfillskip) 0.0 plus 1.0fil
....\glue(\rightskip) 0.0
这里有很多有趣的东西,我将跳过它们并集中讨论关键点。
JS,
和之后的粘连HTML,
是正常空间:\glue 3.33333 plus 1.66666 minus 1.11111
- 后面设置的粘合符
etc.
是句间空格:\glue 4.44444 plus 4.99997 minus 0.37036
- 之后的胶水设置
III.
是正常的空间。
这正是我们按照上述规则所期望的结果。
解决这些问题至少应该做的是第二段:
- 胶水凝固后
JS,
,HTML,
仍存在正常间隙。 - 之后的胶水设置
etc.\
是正常的空间。 - 其后的粘连符
III\@.
是句间空格。
正确的做法是按照 egreg 在第三段中所说和给出的:
- 胶水凝固后
JS\@,
,HTML\@,
就\glue 3.33333 plus 2.08331 minus 0.88889
。 - 之后的胶水设置
etc.\
是正常的空间。 - 其后的粘连符
III\@.
是句间空格。
这有什么关系?想象Ruby, JS, and HTML\@.
一下你写的是。我们可能期望(并且肯定希望)后面的空格Ruby,
和后面的空格JS,
相同。不幸的是,按照上面详述的规则,这种情况不会发生。
...\hbox(6.94444+1.94444)x345.0, glue set 232.08315fil
....\hbox(0.0+0.0)x15.0
....\OT1/cmr/m/n/10 R
....\OT1/cmr/m/n/10 u
....\OT1/cmr/m/n/10 b
....\kern-0.27779
....\OT1/cmr/m/n/10 y
....\kern-0.83334
....\OT1/cmr/m/n/10 ,
....\glue 3.33333 plus 2.08331 minus 0.88889
....\OT1/cmr/m/n/10 H
....\OT1/cmr/m/n/10 T
....\OT1/cmr/m/n/10 M
....\OT1/cmr/m/n/10 L
....\OT1/cmr/m/n/10 ,
....\glue 3.33333 plus 1.66666 minus 1.11111
....\OT1/cmr/m/n/10 a
....\OT1/cmr/m/n/10 n
....\OT1/cmr/m/n/10 d
....\glue 3.33333 plus 1.66666 minus 1.11111
....\OT1/cmr/m/n/10 J
....\OT1/cmr/m/n/10 S
....\OT1/cmr/m/n/10 .
....\penalty 10000
....\glue(\parfillskip) 0.0 plus 1.0fil
....\glue(\rightskip) 0.0
在此格式中,很容易看出逗号后的两个空格具有不同的拉伸和收缩组件。写作,Ruby, JS\@, and HTML\@.
具有正确的行为。
egreg 写道:“最简单的方法就是\frenchspacing
忘掉这件事。”这确实是最简单的做法,但除非在你的语言/期刊/其他东西中,所有空格都使用相同的基本宽度排版,否则我建议不是做那件事。