重新定义撇号以防止错误的字距调整

重新定义撇号以防止错误的字距调整

Adobe Minion Pro 字体中的撇号的字距对于法语排版来说太紧了,因为法语中的字母序列如下或者或者是常见的。

我发现的一个解决方案是将撇号包裹在一个盒子中,这可以防止与周围元素的字距调整并产生更好的效果:

在此处输入图片描述

(常规字距调整在顶部,下面是我的解决方法)。我可以通过以下命令重新定义“优美的撇号”,又名 U+2019,又名右单引号:

\DeclareUnicodeCharacter{2019}{\mbox{'}}

但是,这不适用于常规 ASCII 撇号 U+0027。那么,您建议我如何更改它(以不影响'数学模式下素数的工作方式)?如果解决方案可以避免破坏连字符,那将是一个额外的好处……

答案1

包裹迷你版有一个可选参数loosequotes可能对你有帮助。请参阅手册第 4 页,其中描述了该选项:

MinionPro 的引号设置得相当紧。这会导致撇号的间距不理想。loosequotes 选项会稍微增加引号的侧边距。此选项需要 pdfTEX 1.40 和 microtype 2.0。请注意,此选项会阻止对包含撇号的单词进行连字。此类单词需要显式连字命令\-

另一个可能的解决方案是使用包微型以及为 -command 定义参数的可能性\SetExtraKerning。请查看手册中的第 5.4 节,作者在其中定义了用于法语文本的额外字距调整的配置。

\SetExtraKerning
   [ name     = frenchdefault,
     context  = french,
     unit     = space   ]
   { encoding = {OT1,T1,LY1} }
   {
     :  = {1000,}, % = \fontdimen2
     ;  = {500, }, % ~ \thinspace
     !  = {500, },
     ?  = {500, }
   }

请参阅第 22 页(第 6 节)了解它的使用方法,尤其是第 23 页,其中\DeclareMicrotypeBabelHook描述了该命令的使用方法。

答案2

我认为最好的方法是在文本中使用“真正的撇号” ,这样 as 的定义就可以与数学中\mbox{'}的用法和平共处。'

\DeclareUnicodeCharacter{2019}{\mbox{'}\hskip 0pt \nobreak}

将允许在撇号后使用连字符连接单词。但是,您将错过''用于结束双引号的连字符。

这是我为类似问题编写的代码(请参阅GuIT 论坛上的此讨论):

\makeatletter
\edef\qu@te{\string'} % save a copy of the ordinary apostrophe
\catcode`'=\active    % make ' active

%%% Update \@resetactivechars (that shouldn't act on ' any more)
\begingroup
\obeylines\obeyspaces% 
\gdef\@resetactivechars{% 
\def^^M{\@activechar@info{EOL}\space}% 
\def {\@activechar@info{space}\space}% 
}% 
\endgroup

%%% In case hyperref is not used
\providecommand\texorpdfstring[2]{#1}

%%% Define the active '
\protected\def'{\texorpdfstring{\texqu@te}{\string'}}

\@ifpackagewith{inputenc}{utf8}
  {\DeclareUnicodeCharacter{2019}{\texqu@te}}{}

\def\texqu@te{\relax
  \ifmmode
    \expandafter^\expandafter\bgroup\expandafter\prim@s
  \else
    \expandafter\futurelet\expandafter\@let@token\expandafter\qu@t@
  \fi}
\def\qu@t@{% 
  \ifx'\@let@token
    \qu@te\qu@te\expandafter\@gobble
  \else
    {}\qu@te{}\penalty\@M\hskip\expandafter\z@skip
  \fi}
\scantokens\expandafter{% 
  \expandafter\def\expandafter\pr@m@s\expandafter{\pr@m@s}}
\makeatother

在数学模式下'应具有与数学活动相同的含义,即\active@math@prime^\bgroup\prim@s在文本模式下,我们必须检查后面是否还有另一个撇号。我\futurelet直接使用 ,以免用 吞掉空格\@ifnextchar

如果必须设置撇号,我会用它{}'{}来取消字距调整。

最后\scantokens只是\pr@m@s在当前 catcode 设置下重新定义,而不是从 LaTeX 内核复制其定义。

答案3

使用 XeTeX 与 Minion Pro 和 Kepler Std,我发现将上述代码中的一行替换为以下一行所获得的空间更令人满意(具有不同的字距调整,请注意两个 \kern 语句):

\def\qu@t@{% 
  \ifx'\@let@token
    \qu@te\qu@te\expandafter\@gobble
  \else
    {\kern0.08em}\qu@te{\kern0.01em}\penalty\@M\hskip\expandafter\z@skip
  \fi}

(当然,您的里程可能会有所不同)。

答案4

使用新版本的 XeTeX,\DeclareUnicodeCharacter(来自\usepackage[utf8]{inputenc})可能根本无法工作,因为inputenc基于 utf8 的引擎会忽略包。

为了解决这个问题,您可以使用以下代码:

\usepackage{newunicodechar}
\newunicodechar{’}{\mbox{'}}

相关内容