![如何使用 fontspec 倾斜字体来校正间距?](https://linux22.com/image/457647/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20fontspec%20%E5%80%BE%E6%96%9C%E5%AD%97%E4%BD%93%E6%9D%A5%E6%A0%A1%E6%AD%A3%E9%97%B4%E8%B7%9D%EF%BC%9F.png)
我发现,即使我在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}