省略号和正确的空间因子

省略号和正确的空间因子

我正在尝试在源文件中使用 Unicode 省略号 (U+2026 '…')。为此,我正在寻找一个可以与以下代码一起使用的省略号宏:新unicode字符

问题是,我注意到,椭圆周围的空间因子设置不正确。这使得解决方案类似于带句号的省略号效果不太好。

为了说明(放大结果):

\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}

省略该软件包修复了一些间距不均匀的问题,但未正确设置空间因子。举例来说:

\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}

我怎样才能获得正确的间距?

答案1

对于受限的情况,\@ifnextchar就足够了:

\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}

更完整的版本需要对 进行概括\@ifnextchar。调整埃格尔相关问题的答案可以得出这样的概括:

\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}    

\@ifnextchar(欢迎对 expl3 风格或实际的通用风格进行改进。)

答案2

回到这个问题……

椭圆形包暴露了一个钩子:

\RequirePackage{ellipsis}
\renewcommand{\ellipsis@after}{\@}
\newunicodechar{…}{\textellipsis}

成功了。

相关内容