定义 \xthinspace:仅当后面没有特定字符时才使用细空格

定义 \xthinspace:仅当后面没有特定字符时才使用细空格

下列的来自 XeTeX 列表的 2005 年主题,我定义了一个\spaceddash命令并将其分配给 Unicode 长划线字符 U+2014“—”:

\documentclass{minimal}
\usepackage[utf8]{inputenc}
\DeclareRobustCommand{\spaceddash}%
    {\unskip\nobreak\thinspace\textemdash\thinspace\ignorespaces}
\DeclareUnicodeCharacter{2014}{\spaceddash}

\begin{document}
meow — meow

meow—meow

— meow

meow —.
\end{document}

生成的文档看起来如下所示:

喵呜——喵
呜——喵呜
——喵
呜——。

请注意最后一行的破折号和其后的句号之间的细空格 - 我想将其删除。

空间&标点符号,我试图定义一种\xthinspace命令,它将插入\thinspace 除了如果破折号后面跟着某些标点符号(例如、句号、逗号、右括号、右引号)。

我该怎么办?

答案1

这是使用 的可能性expl3。测试吞噬空格,然后检查以下标记是否出现在例外列表中。如果没有,则应用\thinspace

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

\usepackage{newunicodechar,xparse}

% The following is equivalent to \DeclareUnicodeCharacter{2014}{...}
\newunicodechar{—}{\spaceddash} % write only `\spaceddash` in aux files
\NewDocumentCommand{\spaceddash}{%
  \ifvmode\leavevmode\else\unskip\nobreak\thinspace\fi
  \textemdash\xthinspace}

\ExplSyntaxOn
\NewDocumentCommand{\xthinspace}{ } { \xths_main: }
\NewDocumentCommand{\addtoxthinspaceexceptions}{m}
 {
  \tl_gput_right:Nn \g_xths_exceptions_tl { #1 }
 }
\cs_new_protected:Npn \xths_main:
 {
  \bool_set_true:N \l_xths_apply_bool
  \peek_catcode_ignore_spaces:NF \c_space_token { \xths_check: }
 }
\cs_new_protected:Npn \xths_check:
 {
  \tl_map_inline:Nn \g_xths_exceptions_tl
    {
     \token_if_eq_charcode:NNT ##1 \l_peek_token
      {\bool_set_false:N \l_xths_apply_bool \prg_map_break: }
    }
  \bool_if:NT \l_xths_apply_bool { \thinspace }
 }
\tl_new:N \g_xths_exceptions_tl
\ExplSyntaxOff

\addtoxthinspaceexceptions{,.)}

\begin{document}
meow—meow

meow—.

meow— .
\end{document}

如果您想验证它是否有效,请尝试使用\hspace{1cm}而不是\thinspace。限制:如果 — 后面跟着一个宏,扩展变成逗号、句号或闭括号,则测试将失败。

答案2

\@ifnextchar(感谢@egreg)这是你的朋友吗:

\DeclareRobustCommand{\spaceddash}%
    {\unskip\nobreak\thinspace\textemdash\gobblespaces}
\makeatletter\def\gobblespaces{\@ifnextchar.\relax\thinspace}\makeatother

\@ifnextchar 会吞噬任何中间的空格标记。它会将找到的第一个非空格标记与其第一个参数(.此处为“ ”)进行比较,如果它们相同(“ \relax'"); otherwise, it executes the second macro ("\thinspace'”),则执行第一个宏。

显然,这可以推广到寻找任意数量的标记。我确信xspace会做类似的事情。

完整的 MWE 是:

\documentclass{minimal}
\usepackage[utf8]{inputenc}
\DeclareRobustCommand{\spaceddash}%
    {\unskip\nobreak\thinspace\textemdash\gobblespaces}
\makeatletter\def\gobblespaces{\@ifnextchar.\relax\thinspace}\makeatother
\DeclareUnicodeCharacter{2014}{\spaceddash}

\begin{document}
meow — meow

meow—meow

— meow

meow —.
\end{document}

生成的文档如下所示:

在此处输入图片描述

相关内容