Take the 2-minute tour ×
TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

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}{\kern\fontdimen3\font}  % 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}{\kern\fontdimen3\font}  % For comparison
\begin{document}
[ellipsis]:   \\
I.\egap.\egap.\@        I   \quad(good, for comparison) \\
I\textellipsis          I   \quad(bad)      \\
I\textellipsis\@        I   \quad(terrible) \\
I\textellipsis.         I   \quad(good)     \\
I\textellipsis.\@       I   \quad(bad)
\end{document}

How can I get the spacing correct?

share|improve this question
add comment

1 Answer

up vote 3 down vote accepted

For restricted cases, \@ifnextchar is sufficient:

\documentclass{article}
\usepackage[utf8]{inputenc}

\newcommand*{\egap}{\kern\fontdimen3\font}
\newcommand*{\wordspace}{\@\space}
\makeatletter\newcommand*{\elip}{.\egap.\egap.\@ifnextchar.\egap\wordspace}\makeatother
\usepackage{newunicodechar}
\newunicodechar{…}{\elip}

\begin{document}
macro:                  \\
I\elip  I   \quad(good) \\
I\elip. I   \quad(good)

Unicode glyph:          \\
I…      I   \quad(good) \\
I….     I   \quad(good)

But—                    \\
I\elip, I   \quad(bad)  \\
I\elip! I   \quad(bad)  \\
I\elip? 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
{
    \kern\fontdimen3\font
}
\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:                  \\
I\elip  I   \quad(good) \\
I\elip. 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.)

share|improve this answer
    
Yes, nesting \@ifnextchar invocations will also work, but loops are better & more configurable. –  J. C. Salomon Jul 4 '12 at 1:50
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.