Ellipses & Correct Space FactorEllipsis with a period/fullstopDefining xthinspace: Thin space only if not...
CBP Reminds Travelers to Allow 72 Hours for ESTA. Why?
What are these green text/line displays shown during the livestream of Crew Dragon's approach to dock with the ISS?
Is divide-by-zero a security vulnerability?
How to acknowledge an embarrassing job interview, now that I work directly with the interviewer?
The change directory (cd) command is not working with a USB drive
When should a commit not be version tagged?
Did 5.25" floppies undergo a change in magnetic coating?
Is there a German word for “analytics”?
What if I store 10TB on azure servers and then keep the vm powered off?
How to mitigate "bandwagon attacking" from players?
Difference between 小吃 and 零食
Do authors have to be politically correct in article-writing?
Second-rate spelling
If nine coins are tossed, what is the probability that the number of heads is even?
Does music exist in Panem? And if so, what kinds of music?
Difference between 'stomach' and 'uterus'
Must a tritone substitution use a dominant seventh chord?
How can I be pwned if I'm not registered on that site?
Why is working on the same position for more than 15 years not a red flag?
Can you use a beast's innate abilities while polymorphed?
How can I handle a player who pre-plans arguments about my rulings on RAW?
chrony vs. systemd-timesyncd – What are the differences and use cases as NTP clients?
Can chords be played on the flute?
Hacker Rank: Array left rotation
Ellipses & Correct Space Factor
Ellipsis with a period/fullstopDefining xthinspace: Thin space only if not followed by certain charactersNewDocumentCommand with constructed csnamefrenchspacing not setting the space factor codes correctly?How can I get my ellipses formatted correctly in XeTeX?Automatically adding space before punctuation in old-style English textsSpace after textquotedblrightDeclare acronyms and abbreviations to automatically correct spaces after periods?@ vs. ␣ after abbreviation. (Read backslash-at vs. backslash-space)Adjusting the width of a displaymath environmentWordSpace factor does not increase againspace before and after emdashesHow to generalize dotfill with a stretch factor?
I’m trying to use the Unicode ellipsis character (U+2026 ‘…’) in my source files. To this end, I’m looking for an ellipsis macro which I can use with newunicodechar.
The trouble is, I’ve noticed, that the spacefactor is not set correctly around ellipses. This makes solutions like those suggested at Ellipsis with a period/fullstop not work too well.
To illustrate (magnify the results):
documentclass{article}
newcommand*{egap}{kernfontdimen3font} % Taken from the LaTeX definition
begin{document}
dots: \
I.egap.egap. I quad(bad) \
I.egap.egap.@ I quad(good) \
I.egap.egap.egap. I quad(good) \
I.egap.egap.egap.@ I quad(bad)
end{document}
The ellipsis package fixes some issues with uneven spacing, but does not correctly set the space factor. To illustrate:
documentclass{article}
usepackage[xspace]{ellipsis}
newcommand*{egap}{kernfontdimen3font} % For comparison
begin{document}
[ellipsis]: \
I.egap.egap.@ I quad(good, for comparison) \
Itextellipsis I quad(bad) \
Itextellipsis@ I quad(terrible) \
Itextellipsis. I quad(good) \
Itextellipsis.@ I quad(bad)
end{document}
How can I get the spacing correct?
spacing punctuation
add a comment |
I’m trying to use the Unicode ellipsis character (U+2026 ‘…’) in my source files. To this end, I’m looking for an ellipsis macro which I can use with newunicodechar.
The trouble is, I’ve noticed, that the spacefactor is not set correctly around ellipses. This makes solutions like those suggested at Ellipsis with a period/fullstop not work too well.
To illustrate (magnify the results):
documentclass{article}
newcommand*{egap}{kernfontdimen3font} % Taken from the LaTeX definition
begin{document}
dots: \
I.egap.egap. I quad(bad) \
I.egap.egap.@ I quad(good) \
I.egap.egap.egap. I quad(good) \
I.egap.egap.egap.@ I quad(bad)
end{document}
The ellipsis package fixes some issues with uneven spacing, but does not correctly set the space factor. To illustrate:
documentclass{article}
usepackage[xspace]{ellipsis}
newcommand*{egap}{kernfontdimen3font} % For comparison
begin{document}
[ellipsis]: \
I.egap.egap.@ I quad(good, for comparison) \
Itextellipsis I quad(bad) \
Itextellipsis@ I quad(terrible) \
Itextellipsis. I quad(good) \
Itextellipsis.@ I quad(bad)
end{document}
How can I get the spacing correct?
spacing punctuation
add a comment |
I’m trying to use the Unicode ellipsis character (U+2026 ‘…’) in my source files. To this end, I’m looking for an ellipsis macro which I can use with newunicodechar.
The trouble is, I’ve noticed, that the spacefactor is not set correctly around ellipses. This makes solutions like those suggested at Ellipsis with a period/fullstop not work too well.
To illustrate (magnify the results):
documentclass{article}
newcommand*{egap}{kernfontdimen3font} % Taken from the LaTeX definition
begin{document}
dots: \
I.egap.egap. I quad(bad) \
I.egap.egap.@ I quad(good) \
I.egap.egap.egap. I quad(good) \
I.egap.egap.egap.@ I quad(bad)
end{document}
The ellipsis package fixes some issues with uneven spacing, but does not correctly set the space factor. To illustrate:
documentclass{article}
usepackage[xspace]{ellipsis}
newcommand*{egap}{kernfontdimen3font} % For comparison
begin{document}
[ellipsis]: \
I.egap.egap.@ I quad(good, for comparison) \
Itextellipsis I quad(bad) \
Itextellipsis@ I quad(terrible) \
Itextellipsis. I quad(good) \
Itextellipsis.@ I quad(bad)
end{document}
How can I get the spacing correct?
spacing punctuation
I’m trying to use the Unicode ellipsis character (U+2026 ‘…’) in my source files. To this end, I’m looking for an ellipsis macro which I can use with newunicodechar.
The trouble is, I’ve noticed, that the spacefactor is not set correctly around ellipses. This makes solutions like those suggested at Ellipsis with a period/fullstop not work too well.
To illustrate (magnify the results):
documentclass{article}
newcommand*{egap}{kernfontdimen3font} % Taken from the LaTeX definition
begin{document}
dots: \
I.egap.egap. I quad(bad) \
I.egap.egap.@ I quad(good) \
I.egap.egap.egap. I quad(good) \
I.egap.egap.egap.@ I quad(bad)
end{document}
The ellipsis package fixes some issues with uneven spacing, but does not correctly set the space factor. To illustrate:
documentclass{article}
usepackage[xspace]{ellipsis}
newcommand*{egap}{kernfontdimen3font} % For comparison
begin{document}
[ellipsis]: \
I.egap.egap.@ I quad(good, for comparison) \
Itextellipsis I quad(bad) \
Itextellipsis@ I quad(terrible) \
Itextellipsis. I quad(good) \
Itextellipsis.@ I quad(bad)
end{document}
How can I get the spacing correct?
spacing punctuation
spacing punctuation
edited Jun 13 '17 at 19:33
David Carlisle
493k4111371885
493k4111371885
asked Jul 3 '12 at 19:04
J. C. SalomonJ. C. Salomon
3,2881536
3,2881536
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
For restricted cases, @ifnextchar
is sufficient:
documentclass{article}
usepackage[utf8]{inputenc}
newcommand*{egap}{kernfontdimen3font}
newcommand*{wordspace}{@space}
makeatletternewcommand*{elip}{.egap.egap.@ifnextchar.egapwordspace}makeatother
usepackage{newunicodechar}
newunicodechar{…}{elip}
begin{document}
macro: \
Ielip I quad(good) \
Ielip. I quad(good)
Unicode glyph: \
I… I quad(good) \
I…. I quad(good)
But— \
Ielip, I quad(bad) \
Ielip! I quad(bad) \
Ielip? I quad(bad)
end{document}
A fuller version requires a generalization of @ifnextchar
. Adapting egreg’s answer to a related question leads toward such a generalization:
documentclass{article}
usepackage[utf8]{inputenc}
usepackage{xparse}
ExplSyntaxOn
NewDocumentCommand{elip}{ } { elip_main: }
NewDocumentCommand{addtoelipexceptions}{m}
{
tl_gput_right:Nn g_elip_exceptions_tl { #1 }
}
cs_new_protected:Npn elip_gap
{
kernfontdimen3font
}
cs_new_protected:Npn elip_main:
{
.elip_gap.elip_gap.
bool_set_true:N l_elip_apply_bool
peek_catcode_ignore_spaces:NF c_space_token { elip_check: }
}
cs_new_protected:Npn elip_check:
{
tl_map_inline:Nn g_elip_exceptions_tl
{
token_if_eq_charcode:NNT ##1 l_peek_token
{bool_set_false:N l_elip_apply_bool prg_map_break: }
}
bool_if:NTF l_elip_apply_bool
{ @~ }
{ elip_gap }
}
tl_new:N g_elip_exceptions_tl
ExplSyntaxOff
usepackage{newunicodechar}
newunicodechar{…}{elip}
begin{document}
macro: \
Ielip I quad(good) \
Ielip. I quad(good)
Unicode glyph: \
I… I quad(good) \
I…. I quad(good)
But— \
I…, I quad(bad) \
I…! I quad(bad) \
I…? I quad(bad)
addtoelipexceptions{,.!?}
Now: \
I…, I quad(good) \
I…! I quad(good) \
I…? I quad(good)
end{document}
(Improvements to expl3 style, or an actual generalized @ifnextchar
, would be welcome.)
Yes, nesting@ifnextchar
invocations will also work, but loops are better & more configurable.
– J. C. Salomon
Jul 4 '12 at 1:50
add a comment |
Returning to this question…
The ellipses package exposes a hook:
RequirePackage{ellipsis}
renewcommand{ellipsis@after}{@}
newunicodechar{…}{textellipsis}
does the trick.
add a comment |
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "85"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2ftex.stackexchange.com%2fquestions%2f62111%2fellipses-correct-space-factor%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
For restricted cases, @ifnextchar
is sufficient:
documentclass{article}
usepackage[utf8]{inputenc}
newcommand*{egap}{kernfontdimen3font}
newcommand*{wordspace}{@space}
makeatletternewcommand*{elip}{.egap.egap.@ifnextchar.egapwordspace}makeatother
usepackage{newunicodechar}
newunicodechar{…}{elip}
begin{document}
macro: \
Ielip I quad(good) \
Ielip. I quad(good)
Unicode glyph: \
I… I quad(good) \
I…. I quad(good)
But— \
Ielip, I quad(bad) \
Ielip! I quad(bad) \
Ielip? I quad(bad)
end{document}
A fuller version requires a generalization of @ifnextchar
. Adapting egreg’s answer to a related question leads toward such a generalization:
documentclass{article}
usepackage[utf8]{inputenc}
usepackage{xparse}
ExplSyntaxOn
NewDocumentCommand{elip}{ } { elip_main: }
NewDocumentCommand{addtoelipexceptions}{m}
{
tl_gput_right:Nn g_elip_exceptions_tl { #1 }
}
cs_new_protected:Npn elip_gap
{
kernfontdimen3font
}
cs_new_protected:Npn elip_main:
{
.elip_gap.elip_gap.
bool_set_true:N l_elip_apply_bool
peek_catcode_ignore_spaces:NF c_space_token { elip_check: }
}
cs_new_protected:Npn elip_check:
{
tl_map_inline:Nn g_elip_exceptions_tl
{
token_if_eq_charcode:NNT ##1 l_peek_token
{bool_set_false:N l_elip_apply_bool prg_map_break: }
}
bool_if:NTF l_elip_apply_bool
{ @~ }
{ elip_gap }
}
tl_new:N g_elip_exceptions_tl
ExplSyntaxOff
usepackage{newunicodechar}
newunicodechar{…}{elip}
begin{document}
macro: \
Ielip I quad(good) \
Ielip. I quad(good)
Unicode glyph: \
I… I quad(good) \
I…. I quad(good)
But— \
I…, I quad(bad) \
I…! I quad(bad) \
I…? I quad(bad)
addtoelipexceptions{,.!?}
Now: \
I…, I quad(good) \
I…! I quad(good) \
I…? I quad(good)
end{document}
(Improvements to expl3 style, or an actual generalized @ifnextchar
, would be welcome.)
Yes, nesting@ifnextchar
invocations will also work, but loops are better & more configurable.
– J. C. Salomon
Jul 4 '12 at 1:50
add a comment |
For restricted cases, @ifnextchar
is sufficient:
documentclass{article}
usepackage[utf8]{inputenc}
newcommand*{egap}{kernfontdimen3font}
newcommand*{wordspace}{@space}
makeatletternewcommand*{elip}{.egap.egap.@ifnextchar.egapwordspace}makeatother
usepackage{newunicodechar}
newunicodechar{…}{elip}
begin{document}
macro: \
Ielip I quad(good) \
Ielip. I quad(good)
Unicode glyph: \
I… I quad(good) \
I…. I quad(good)
But— \
Ielip, I quad(bad) \
Ielip! I quad(bad) \
Ielip? I quad(bad)
end{document}
A fuller version requires a generalization of @ifnextchar
. Adapting egreg’s answer to a related question leads toward such a generalization:
documentclass{article}
usepackage[utf8]{inputenc}
usepackage{xparse}
ExplSyntaxOn
NewDocumentCommand{elip}{ } { elip_main: }
NewDocumentCommand{addtoelipexceptions}{m}
{
tl_gput_right:Nn g_elip_exceptions_tl { #1 }
}
cs_new_protected:Npn elip_gap
{
kernfontdimen3font
}
cs_new_protected:Npn elip_main:
{
.elip_gap.elip_gap.
bool_set_true:N l_elip_apply_bool
peek_catcode_ignore_spaces:NF c_space_token { elip_check: }
}
cs_new_protected:Npn elip_check:
{
tl_map_inline:Nn g_elip_exceptions_tl
{
token_if_eq_charcode:NNT ##1 l_peek_token
{bool_set_false:N l_elip_apply_bool prg_map_break: }
}
bool_if:NTF l_elip_apply_bool
{ @~ }
{ elip_gap }
}
tl_new:N g_elip_exceptions_tl
ExplSyntaxOff
usepackage{newunicodechar}
newunicodechar{…}{elip}
begin{document}
macro: \
Ielip I quad(good) \
Ielip. I quad(good)
Unicode glyph: \
I… I quad(good) \
I…. I quad(good)
But— \
I…, I quad(bad) \
I…! I quad(bad) \
I…? I quad(bad)
addtoelipexceptions{,.!?}
Now: \
I…, I quad(good) \
I…! I quad(good) \
I…? I quad(good)
end{document}
(Improvements to expl3 style, or an actual generalized @ifnextchar
, would be welcome.)
Yes, nesting@ifnextchar
invocations will also work, but loops are better & more configurable.
– J. C. Salomon
Jul 4 '12 at 1:50
add a comment |
For restricted cases, @ifnextchar
is sufficient:
documentclass{article}
usepackage[utf8]{inputenc}
newcommand*{egap}{kernfontdimen3font}
newcommand*{wordspace}{@space}
makeatletternewcommand*{elip}{.egap.egap.@ifnextchar.egapwordspace}makeatother
usepackage{newunicodechar}
newunicodechar{…}{elip}
begin{document}
macro: \
Ielip I quad(good) \
Ielip. I quad(good)
Unicode glyph: \
I… I quad(good) \
I…. I quad(good)
But— \
Ielip, I quad(bad) \
Ielip! I quad(bad) \
Ielip? I quad(bad)
end{document}
A fuller version requires a generalization of @ifnextchar
. Adapting egreg’s answer to a related question leads toward such a generalization:
documentclass{article}
usepackage[utf8]{inputenc}
usepackage{xparse}
ExplSyntaxOn
NewDocumentCommand{elip}{ } { elip_main: }
NewDocumentCommand{addtoelipexceptions}{m}
{
tl_gput_right:Nn g_elip_exceptions_tl { #1 }
}
cs_new_protected:Npn elip_gap
{
kernfontdimen3font
}
cs_new_protected:Npn elip_main:
{
.elip_gap.elip_gap.
bool_set_true:N l_elip_apply_bool
peek_catcode_ignore_spaces:NF c_space_token { elip_check: }
}
cs_new_protected:Npn elip_check:
{
tl_map_inline:Nn g_elip_exceptions_tl
{
token_if_eq_charcode:NNT ##1 l_peek_token
{bool_set_false:N l_elip_apply_bool prg_map_break: }
}
bool_if:NTF l_elip_apply_bool
{ @~ }
{ elip_gap }
}
tl_new:N g_elip_exceptions_tl
ExplSyntaxOff
usepackage{newunicodechar}
newunicodechar{…}{elip}
begin{document}
macro: \
Ielip I quad(good) \
Ielip. I quad(good)
Unicode glyph: \
I… I quad(good) \
I…. I quad(good)
But— \
I…, I quad(bad) \
I…! I quad(bad) \
I…? I quad(bad)
addtoelipexceptions{,.!?}
Now: \
I…, I quad(good) \
I…! I quad(good) \
I…? I quad(good)
end{document}
(Improvements to expl3 style, or an actual generalized @ifnextchar
, would be welcome.)
For restricted cases, @ifnextchar
is sufficient:
documentclass{article}
usepackage[utf8]{inputenc}
newcommand*{egap}{kernfontdimen3font}
newcommand*{wordspace}{@space}
makeatletternewcommand*{elip}{.egap.egap.@ifnextchar.egapwordspace}makeatother
usepackage{newunicodechar}
newunicodechar{…}{elip}
begin{document}
macro: \
Ielip I quad(good) \
Ielip. I quad(good)
Unicode glyph: \
I… I quad(good) \
I…. I quad(good)
But— \
Ielip, I quad(bad) \
Ielip! I quad(bad) \
Ielip? I quad(bad)
end{document}
A fuller version requires a generalization of @ifnextchar
. Adapting egreg’s answer to a related question leads toward such a generalization:
documentclass{article}
usepackage[utf8]{inputenc}
usepackage{xparse}
ExplSyntaxOn
NewDocumentCommand{elip}{ } { elip_main: }
NewDocumentCommand{addtoelipexceptions}{m}
{
tl_gput_right:Nn g_elip_exceptions_tl { #1 }
}
cs_new_protected:Npn elip_gap
{
kernfontdimen3font
}
cs_new_protected:Npn elip_main:
{
.elip_gap.elip_gap.
bool_set_true:N l_elip_apply_bool
peek_catcode_ignore_spaces:NF c_space_token { elip_check: }
}
cs_new_protected:Npn elip_check:
{
tl_map_inline:Nn g_elip_exceptions_tl
{
token_if_eq_charcode:NNT ##1 l_peek_token
{bool_set_false:N l_elip_apply_bool prg_map_break: }
}
bool_if:NTF l_elip_apply_bool
{ @~ }
{ elip_gap }
}
tl_new:N g_elip_exceptions_tl
ExplSyntaxOff
usepackage{newunicodechar}
newunicodechar{…}{elip}
begin{document}
macro: \
Ielip I quad(good) \
Ielip. I quad(good)
Unicode glyph: \
I… I quad(good) \
I…. I quad(good)
But— \
I…, I quad(bad) \
I…! I quad(bad) \
I…? I quad(bad)
addtoelipexceptions{,.!?}
Now: \
I…, I quad(good) \
I…! I quad(good) \
I…? I quad(good)
end{document}
(Improvements to expl3 style, or an actual generalized @ifnextchar
, would be welcome.)
edited Jun 11 '17 at 18:01
David Carlisle
493k4111371885
493k4111371885
answered Jul 3 '12 at 19:04
J. C. SalomonJ. C. Salomon
3,2881536
3,2881536
Yes, nesting@ifnextchar
invocations will also work, but loops are better & more configurable.
– J. C. Salomon
Jul 4 '12 at 1:50
add a comment |
Yes, nesting@ifnextchar
invocations will also work, but loops are better & more configurable.
– J. C. Salomon
Jul 4 '12 at 1:50
Yes, nesting
@ifnextchar
invocations will also work, but loops are better & more configurable.– J. C. Salomon
Jul 4 '12 at 1:50
Yes, nesting
@ifnextchar
invocations will also work, but loops are better & more configurable.– J. C. Salomon
Jul 4 '12 at 1:50
add a comment |
Returning to this question…
The ellipses package exposes a hook:
RequirePackage{ellipsis}
renewcommand{ellipsis@after}{@}
newunicodechar{…}{textellipsis}
does the trick.
add a comment |
Returning to this question…
The ellipses package exposes a hook:
RequirePackage{ellipsis}
renewcommand{ellipsis@after}{@}
newunicodechar{…}{textellipsis}
does the trick.
add a comment |
Returning to this question…
The ellipses package exposes a hook:
RequirePackage{ellipsis}
renewcommand{ellipsis@after}{@}
newunicodechar{…}{textellipsis}
does the trick.
Returning to this question…
The ellipses package exposes a hook:
RequirePackage{ellipsis}
renewcommand{ellipsis@after}{@}
newunicodechar{…}{textellipsis}
does the trick.
answered 1 min ago
J. C. SalomonJ. C. Salomon
3,2881536
3,2881536
add a comment |
add a comment |
Thanks for contributing an answer to TeX - LaTeX Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2ftex.stackexchange.com%2fquestions%2f62111%2fellipses-correct-space-factor%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown