如何使用 fontspec 倾斜字体来校正间距?

如何使用 fontspec 倾斜字体来校正间距?

我发现,即使我在fontspec倾斜文本后添加,该包也不会自动更正倾斜文本(\textsl{}或)后的单词间距。(TeXbook 第 14 页建议在使用倾斜或斜体测试后添加倾斜或斜体更正。)我提供了 MWE。\slshape\/

\documentclass{article}
\parindent=0pt
\usepackage{fontspec}
\setmainfont{Source Serif 4}[%Available for free on Google Fonts.
    Kerning=On%
    ,SlantedFont={Source Serif 4}%\textsl{},\slscape
        ,SlantedFeatures={%
            Kerning=On%
            ,FakeSlant=0.33%I use an exaggerated value to more clearly explain the issue.
        }%
]
\begin{document}
Fontspec does \textsl{not} add the slant correction automatically.\\
\textsl{text} text\quad\textsl{hello world} hello world\\
\textsl{text\/} text\quad\textsl{hello world\/} hello world\\
Fontspec adds the italic correction automatically.\\
\textit{text} text\quad\textit{hello world} hello world\\
\textit{text\/} text\quad\textit{hello world\/} hello world\\
\end{document}

编辑:我已经研究了这个问题并创建了以下宏,包含在以下 MWE 中。该宏根据最后一个倾斜字母的高度添加并计算额外的间距。

\documentclass{article}
\raggedright
\usepackage{xstring}
\usepackage{fontspec}
\setmainfont{Source Serif 4}[%Available for free on Google Fonts.
    Kerning=On%
    ,SlantedFont={Source Serif 4}%\textsl,\slshsape
        ,SlantedFeatures={%
            Kerning=On%
            ,FakeSlant=0.18
            }
]
\newcommand\slantfactor{0.18}
\parindent=0pt
\newcommand{\textslant}[1]{%
    \textsl{#1}%
    \begingroup%
    \sbox0{\StrRight{#1}{1}}%Requires package xstring.
    \hspace{\fpeval{sin(atan(\slantfactor))}\ht0}%
    \endgroup%
}
\begin{document}
\textsl{shell} helms\quad No Slant Correction\\
\textslant{shell} helms\quad With Slant Correction\\
shell helms\quad Regular Text\\
\textsl{bulk} helms\quad No Slant Correction\\
\textslant{bulk} helms\quad With Slant Correction\\
bulk helms\quad Regular Text\\
\textsl{quad} helms\quad No Slant Correction\\
\textslant{quad} helms\quad With Slant Correction\\
quad helms\quad Regular Text\\
\end{document}

编辑:我使用另一个问题中的结果来回答这个问题(希望我是正确的)。请参阅:Fontspec 倾斜单位

答案1

我认为使用最后一个字形的高度不是正确的解决方案:“k”的校正应该与“x”相同,只有“dfl”应该得到更大的校正,因为它们的形状。可能,“f”应该得到更大的校正,这取决于实际的字体。

\nocorr如果不需要更正,您可以使用标准 LaTeX。

这是一个可以轻松扩展的解决方案。

\documentclass{article}
\usepackage{fontspec}

\newcommand\slantfactor{0.18}

\setmainfont{Libertinus Serif}[
  Kerning=On,
  SlantedFont=*,
  SlantedFeatures={
    Kerning=On,
    FakeSlant=\slantfactor,
  },
]

\NewCommandCopy\otextsl\textsl % for comparisons

\ExplSyntaxOn
\RenewDocumentCommand{\textsl}{m}
 {
  { \slshape #1 \slanted_corr:e {\tl_item:nn { #1 } { -1 }} }
 }

\fp_const:Nn \c_slanted_corr_factor_fp { sin(atan(\slantfactor)) }

\cs_new_protected:Nn \slanted_corr:n
 {
  \str_if_eq:nnF { #1 } { \nocorr }
   {
    \str_if_in:nnTF { dfl } { #1 }
     {
      \slanted_corr_big:n { #1 }
     }
     {
      \slanted_corr_small:n { #1 }
     }
   }
 }
\cs_generate_variant:Nn \slanted_corr:n { e }

\cs_new_protected:Nn \slanted_corr_big:n
 {
  \str_case:nn { #1 }
   {
    {f}{\slanted_corr_big_do:nn  { f } { 1.1 }}
   }
   {
    \slanted_corr_big_do:nn { #1 } { 1 }
   }
 }
\cs_new_protected:Nn \slanted_corr_big_do:nn
 {
  \kern \fp_eval:n { (#2) * \c_slanted_corr_factor_fp } \fontcharht\font`#1 \scan_stop:
 }
\cs_new_protected:Nn \slanted_corr_small:n
 {
  \str_if_in:nnF { ., } { #1 }
   {
    \kern \fp_eval:n { \c_slanted_corr_factor_fp } ex
   }
 }

\ExplSyntaxOff

\setlength{\parindent}{0pt}
\raggedright

\begin{document}

\otextsl{shelf} helms\quad No Slant Correction

\textsl{shelf} helms\quad With Slant Correction

shelf helms\quad Regular Text

\otextsl{shell} helms\quad No Slant Correction

\textsl{shell} helms\quad With Slant Correction

shell helms\quad Regular Text

\otextsl{bulk} helms\quad No Slant Correction

\textsl{bulk} helms\quad With Slant Correction

bulk helms\quad Regular Text

\otextsl{quad} helms\quad No Slant Correction

\textsl{quad} helms\quad With Slant Correction

quad helms\quad Regular Text

\otextsl{quad.} helms\quad No Slant Correction

\textsl{quad.} helms\quad With Slant Correction

quad. helms\quad Regular Text

\otextsl{quad}. helms\quad No Slant Correction

\textsl{quad\nocorr}. helms\quad With Slant Correction

quad. helms\quad Regular Text

\end{document}

在此处输入图片描述

相关内容