下列的来自 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}
生成的文档如下所示: