如何将微类型的字母间距命令 \textls 的范围限制到非数学环境?

如何将微类型的字母间距命令 \textls 的范围限制到非数学环境?

包裹microtype有命令\textls来操纵字母间距特别指定方式。虽然印刷师通常不赞成使用这种方式,但根据microtype用户手册(第 23 页脚注),它一些适当使用以突出局部重点。

\textls以天真的方式应用会导致与数学内容混合时产生不良后果。这是这个问题的目的获得一个可以\myTextls工作的修改后的命令句法和语义上就像\textls 数学模式保持不变。通常情况下,类似情况会发生\textsl(注意“l”和“s”的交换)。见下文。

以下是 MWE 的输出:

MWE 的输出。\textls (及其他)

第 2 行内的间距与第 1 行和第 3 行内的间距{1, 2}类似。{ 1, 2 }{1, 2}

笔记当然,当我说“应该”时,我的意思只是说,这就是欲望,仅此而已。倾斜textsl只是为了输出类比,我无意谈论实施类比这可能会(非常)不同。我说的“分裂……不可取”仅仅是指手动的分裂。

MWE 代码:2021/03/14 v2.8c//使用Overleaf 版本运行microtype。与我本地的发行版和版本重复2022/06/23 v3.0f//

\documentclass{book}
\usepackage{microtype}
\usepackage[a4paper]{geometry}
\newgeometry{margin=2.5cm}

%definition of \myTextls

\begin{document}

\textsl{1. [textsl] This should only affect text, not \( \{ 1, 2 \} \) mathematics. And \textit{does}!}

\textls{2. [textls] This should only affect text, not \( \{ 1, 2 \} \) mathematics. But \textit{doesn't}!}

\textls{3. [textls twice] Splitting up works} \( \{ 1, 2 \} \)  \textls{but is not desirable.}

%\myTextls{4. [myTextls] This should only affect text, not \( \{ 1, 2 \} \) mathematics. It \textit{does(n't)} work!}

\end{document}

类似问题

据我所知,该网站上有两个类似的问题,且并非重复。

答案1

问题在于,microtype 并非设计用于区分数学模式和文本模式(或者更一般地说,它不知道字体选择发生的上下文)。对于当前的情况,如果您愿意将默认文本编码更改为 T1,则可以轻松解决这个问题,因为这将使 OT1 仅用于数学:

\usepackage[T1]{fontenc}
\SetTracking
  [ name = nomath, load = default ]
  { encoding = {OT1,OMS,OML,OMX} }
  { 0 }

如果您不想更改文档的编码,您可以另外修补 microtype 以使其在数学模式下忽略字体:

\makeatletter
\pretocmd\MT@set@tr@codes{\ifmmode\MT@set@tr@zero\else}{}{}
\apptocmd\MT@set@tr@codes{\fi}{}{}
\makeatother

\pretocmd并且\apptocmd来自无论如何都会加载的etoolboxmicrotype

在这两种解决方案中,您只需使用\textls


至于忽略内部某些命令的内容的更一般情况\textls,您可以使用该\lslig命令(最初是为了保留字母间距文本中的连字符,但也适用于较长的文本,包括字体更改):

\DeclareRobustCommand\myemph[1]{\emph{\lslig{#1}}}

相关内容