我正在尝试在源文件中使用 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}
成功了。