\@(即反斜杠 at)的正确用法是什么?

\@(即反斜杠 at)的正确用法是什么?

这个答案\@用来句号和之前的\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 罗马字体的一些后果。

  1. 空格具有未修改的(通过\spacefactor)粘连值“3.33333pt 加 1.66666pt 减 1.11111pt”,也就是说,它们的自然宽度是 3.33333pt,但可以额外拉伸 1.66666pt(没有惩罚)并缩小 1.11111pt。
  2. 小写字母(有\sfcode1000 个)后面的空格具有上面列出的粘合符。
  3. 大写字母(有\sfcode999 个)后面的空格的粘连量为 3.33333pt 加上 1.66498pt 减去 1.11221pt。这与小写字母后面的空格差别不大。
  4. 逗号后面的空格(有\sfcode1250 个)本身跟在小写字母后面(例如,中的空格foo, bar),其粘连值为 3.33333pt 加上 2.08331pt 减去 0.88889pt。
  5. 句号后面的空格(有\sfcode3000 个)本身跟在小写字母后面(例如 中的空格),其粘连量为 4.44444pt 加上 4.99997pt 减去 0.37036pt。请注意,由于>= 2000,foo. bar自然宽度已通过字体参数 7 增大。\sfcode
  6. 位于大写字母后面的句号(或逗号)后面的空格具有与 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忘掉这件事。”这确实是最简单的做法,但除非在你的语言/期刊/其他东西中,所有空格都使用相同的基本宽度排版,否则我建议不是做那件事。

相关内容