TeX - LaTeX Asked by Ben Lerner on April 28, 2021
In this answer, @
is used after a period and before an xspace
, presumably to indicate that the preceding period (in “etc.”) was not sentence-final.
In these tips, @
is used before a period and after capital letters, to indicate that the preceding capital letters are sentence final.
Since @
is rather difficult to search for online, I thought I’d try to ask here: what exactly does @
do, and how do you use it properly/consistently? For instance, how should you input the following farcical sentence?
Languages like JS, HTML, etc. were not used by King Henry III.
EDIT: I’m accepting Barbara’s answer below as it (and the comments on it) indicate the initial intent of @
: “the period which follows is sentence-final”. Its counterpart is
(slash-space), which says “the period which precedes is sentence-medial”. Egreg’s answer explains in far more detail exactly how @
and spacefactor
work to cause the effects seen by @
and
after lower- and upper-case letters and punctuation. Both are very helpful answers.
Two correct answers to my made-up sentence above is
Languages like JS, HTML, etc. were not used by King Henry III@.
Languages like JS, HTML, etc.@ were not used by King Henry III@.
The former is arguably “better style”, while the latter demonstrably produces the correct result even if it seems less consistent about placement of @
versus periods. And a safe but slightly redundant answer blindly adds @
before every comma:
Languages like JS@, HTML@, etc. were not used by King Henry III@.
This last one is amenable to macro-izing: defacronym#1{textbf{#1}@xspace}
(or whatever style you’d prefer), where the xspace
disappears if the next character is punctuation, and the @
ensures that subsequent punctuation thinks it follows a lowercase word and not an uppercase initial.
i find the cited answer rather confusing, if not out-and-out backwards. @
before punctuation says that the period does fall at the end of a sentence. to quote from the latex manual (p.170):
@
Causes an "end-of-sentence" space after punctuation when typed before the punctuation character. Needed only if the character preceding the punctuation character is not a lowercase letter or a number.
so your farcical sentence is input as
Languages like JS, HTML, etc. were not used by King Henry III@.
only one @
, and that after a capital I.
Update:
I have been reminded, rather ignominiously, that @
is not defined in classic TeX. If used, the result is "! Undefined control sequence." (The corresponding command for TeX to render an end-of-sentence space following a period following an uppercase letter is null
.) @
is LaTeX only.
Correct answer by barbara beeton on April 28, 2021
The macro simply says
spacefactor 1000
Under nonfrenchspacing
, capital letters set the space factor to 999 and, by rule, the space factor never jumps from a value less than 1000 to a value greater than 1000. On the other hand, a comma sets the space factor to 1250, the period to 3000 and so on for other punctuation signs.
So with JS,
, the space factor after the comma is 1000
J (999) S (999) , (1250->1000)
while with JS,@
one has
J (999) S (999) , (1250->1000) @ (1000)
and with JS@,
we get
J (999) S (999) @ (1000) , (1250)
so that the right syntax is the latter.
Let's consider e.g.
, e.g.@
and e.g@.
:
e (1000) . (3000) g (1000) . (3000) , (1250)
e (1000) . (3000) g (1000) . (3000) @ (1000)
e (1000) . (3000) g (1000) @ (1000) . (3000)
so the right syntax is the middle one. However, a comma just after the second period would make @
unnecessary.
You should type your phrase as
Languages like JS@, HTML@, etc.@ were not used by King Henry III@.
otherwise the space after the commas would not expand (factor 1.25) and the space after etc.
would (factor 3000), which is not desired.
The simplest thing is to go frenchspacing
and forget about this.
Answered by egreg on April 28, 2021
This is an old question and this is not so much an answer, but an overly long comment.
The @
before the commas (as is shown in egreg's excellent answer) is not redundant. TeX's treatment of spacefactor
is straight-forward, but obscure.
The TeXbook and TeX by Topic have all the details—and most of this is taken from TeX by Topic—but essentially the following happens. When TeX inserts a space between words, the amount of space inserted depends on several factors. The key factors are the current font parameters 2, 3, 4, and 7, along with spaceskip
, xspaceskip
, and spacefactor
. spaceskip
and xspaceskip
are used to override the font parameters. As they're rarely used, let's ignore them here.
Normally, when a space is inserted, it has a natural width (font parameter 2), a stretch component (font parameter 3) and a shrink component (font parameter 4). The spacefactor
modifies this: The stretch component is multiplied by spacefactor
/1000 whereas the shrink component is divided by spacefactor
/1000.
When spacefactor
is at least 2000, then TeX increases the natural width of the space by font parameter 7. This is done to have wider spaces between sentences.
Each character added to the a line has an associated space factor code, sfcode
. The spacefactor
is set after each character as follows. Let n be the sfcode
for the character.
spacefactor
is unchanged. (This enables punctuation like parentheses and brackets to not affect the spacefactor
.)spacefactor
< 1000, then the spacefactor
is set to 1000. (This slightly confusing behavior enables D. Knuth
to use a normal space.)spacefactor
is set to n.Finally, the spacefactor
is set to 1000 at the beginning of paragraphs (including after indent
or noindent
), as well as after vrule
, an accent, or a box in horizontal mode.
So, with that in mind, let's consider some consequences of this using Computer Modern 10pt roman fonts.
spacefactor
) glue of "3.33333pt plus 1.66666pt minus 1.11111pt" which is to say their natural width is 3.33333pt but can stretch by an additional 1.66666pt (without penalty) and shrink by 1.11111pt.sfcode
1000) have exactly the glue listed above.sfcode
999) have glue 3.33333pt plus 1.66498pt minus 1.11221pt. This is imperceptibly different from spaces following lower case letters.sfcode
1250) which themselves follow a lower case letter (e.g., the space in foo, bar
) have glue 3.33333pt plus 2.08331pt minus 0.88889pt.sfcode
3000) which themselves follow a lower case letter (e.g., the space in foo. bar
) have glue 4.44444pt plus 4.99997pt minus 0.37036pt. Note that the natural width has been augmented by font parameter 7 because sfcode
>= 2000.Let's now consider the three short paragraphs in the following LaTeX document.
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}
Note that I've instructed TeX to write out what each page of output looks like to the log file. This output is pretty verbose, but you can see each box, glue, and character. For example, the first paragraph consists of this.
...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
There's a lot of interesting stuff here which I'm going to skip over to focus on the key points.
JS,
and HTML,
are normal spaces: glue 3.33333 plus 1.66666 minus 1.11111
etc.
is an inter-sentence space: glue 4.44444 plus 4.99997 minus 0.37036
III.
is a normal space.This is precisely what we'd expect by following the rules given above.
The minimum one should do to fix these problems is the second paragraph:
JS,
and HTML,
are still normal spaces.etc.
is a normal space.III@.
is an inter-sentence space.The correct thing to do is what egreg said and given in the third paragraph:
JS@,
and HTML@,
are glue 3.33333 plus 2.08331 minus 0.88889
.etc.
is a normal space.III@.
is an inter-sentence space.What does this matter? Imagine you had written Ruby, JS, and HTML@.
instead. We might expect (and would certainly want) the space following Ruby,
and the space following JS,
to be the same. Unfortunately, following the rules detailed above, this doesn't happen.
...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
In this format, it's readily apparent that the two spaces after the commas have different stretch and shrink components. Writing, Ruby, JS@, and HTML@.
has the correct behavior.
egreg writes, "The simplest thing is to go frenchspacing
and forget about this." It's certainly true that that is the simplest thing to do, but unless it's common to typeset all spaces with the same base width in your language/journal/whatever, I recommend not doing that.
Answered by TH. on April 28, 2021
For novices, a simple mnemonic rule is: @
is an invisible (zero-width) lowercase letter.
LaTeX considers a sequence <lowercase letter> <punctuation sign> <space>
as end of a phrase and adds extra space for readability: in That's all. Thanks
, LaTeX adds more space after all.
. Otherwise it doesn't add extra space after the punctuation sign: in A. Einstein
, the period does not end a sentence because the preceding letter is uppercase; in pi = 3.14
, the period does not end a sentence because the next character is not a space.
However, this rule sometimes fails:
(1) Apple Inc. sells phones
here, LaTeX thinks the period ends a sentence and wrongly adds an extra space.
(2) My school scores were all A. Einstein would be proud of me!
here, LaTeX does not realize that the period ends a sentence and does not add the expected space.
You can correct this using an invisible lowercase letter @
:
(1) Apple Inc.@ sells phones
here, the period does not end a sentence because it is no longer followed by a space.
(2) My school scores were all A@. Einstein would be proud of me!
here, the period does end a sentence because it is preceded by the "lowercase letter" @
.
This applies not only to a period but to commas, etc.: Score a, score b, score c.
is OK, but with uppercase the correct use is Score A@, score B@, score C@.
for LaTeX to realize that each comma ends a phrase (since it goes after a lowercase "letter" @
).
(This simplistic explanation is not technically correct; see technical details in other answers.)
Answered by Alexander Gelbukh on April 28, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP