小型大写字母搭配 Gill Sans MT

小型大写字母搭配 Gill Sans MT

我不明白。WordGill Sans MT和 Powerpoint 中支持小型大写字母,没有任何问题。字体识别应用程序甚至可以识别它。然而,我却无法获得它们。

\documentclass{article}

\usepackage{fontspec}

\setmainfont{Gill Sans MT}[
SmallCapsFeatures={Letters=SmallCaps},
SmallCapsFont={*},
]

\begin{document}
    \textsc{Small Caps.}
\end{document}

答案1

为了比较,我们可以在 OpTeX 中执行以下操作:

\fontfam[dejavu]

\def\fakecaps#1{\def\tmp{#1}\replstring\tmp{ }{{ }}%
   {\ea\let \ea\fupper \the\font  \uccode`'=`'
    \setfontsize{mag.8}\setff{+upper;embolden=1.1}\setwordspace{1.25}\fontsel
    \ea\foreach\tmp\do{\ifnum\uccode`##1=`##1{\fupper##1}\else ##1\fi}}}

Normal text. 
\fakecaps{Aren't it. Šmudla, že.}

\bye

也可以看看OpTeX 技巧 0107

答案2

文字处理器通常具有伪造系统中不存在的字体的功能;而使用 TeX 则不可能做到这一点,因为我们进行的的是精细的排版,而不仅仅是打印之类的。

一些限制(只有文本,没有命令),您可以伪造小写字母。对于您的简单应用程序来说,它应该可以做到。

这里我使用 Gillius ADF,因为我没有 Gill Sans MT。

\documentclass{article}

\usepackage{fontspec}

\setmainfont{Gillius ADF}[% replacement for Gill Sans
  NFSSFamily=gilliusadf,
]
\newfontfamily{\scaledgillius}{Gillius ADF}[Scale=0.8,FakeBold=1.5,WordSpace=1.25]

\ExplSyntaxOn
\NewDocumentCommand{\fakesc}{m}
 {
  \krebs_fakesc:n { #1 }
 }

\seq_new:N \l__krebs_fakesc_words_in_seq
\seq_new:N \l__krebs_fakesc_words_out_seq

\cs_new_protected:Nn \krebs_fakesc:n
 {
  \group_begin:
  \scaledgillius
  \seq_set_split:Nnn \l__krebs_fakesc_words_in_seq { ~ } { #1 }
  \seq_set_map:NNn \l__krebs_fakesc_words_out_seq \l__krebs_fakesc_words_in_seq
   {
    \__krebs_fakesc:n { ##1 }
   }
  \seq_use:Nn \l__krebs_fakesc_words_out_seq { ~ }
  \group_end:
 }

\cs_new_protected:Nn \__krebs_fakesc:n
 {
  \text_map_inline:nn { #1 } { \__krebs_fakesc_letter:n { ##1 } }
 }

\cs_new_protected:Nn \__krebs_fakesc_letter:n
 {
  \int_compare:nTF { \char_value_uccode:n { `#1 } = `#1 }
   {
    {\fontfamily{gilliusadf}\selectfont #1 }
   }
   {
    \char_uppercase:N #1
   }
 }

\ExplSyntaxOff

\begin{document}

\fakesc{Smáll Câps. Ii}

\textit{\fakesc{Smáll Câps. Ii}}

\end{document}

在此处输入图片描述

答案3

这是基于egreg答案的代码,它在将值传递给命令之前自动检测当前字体。

编辑:

WordSpace我通过使用\newfontfamily而不是过时的包选项来纠正这个问题。

user94293由于的回答,撇号和逗号无法正确呈现的问题已经得到修复。

\documentclass{article}
\usepackage{fontspec}

\setmainfont{Times New Roman}

\newfontfamily\gill{gill Sans MT}
\newfontfamily\hadriano[UprightFont={* Light},BoldFont={* Bold}]{AT Hadriano Std}
\newfontfamily\minion{Minion Pro Capt}
\newfontfamily\stix{STIX Two Math}[AutoFakeBold=2]
\newfontfamily\djvs[BoldFont={* Bold}]{DejaVu Sans}
\newfontfamily\arial{Arial Unicode MS}
\newfontfamily\free{Free Serif}
\newfontfamily\symbola{Symbola}[FakeBold=0.5]



\ExplSyntaxOn
\NewDocumentCommand{\smartsc}{m}
{
    \krebs_smartsc:n { #1 }
}

\seq_new:N \l__krebs_smartsc_words_in_seq
\seq_new:N \l__krebs_smartsc_words_out_seq

\cs_new_protected:Nn \krebs_smartsc:n
{
    \group_begin:
    \newfontfamily{\currentfont}{\csname f@family\endcsname}
    \newfontfamily{\currentfontSC}{\csname f@family\endcsname}[Scale=0.72,WordSpace=1.75,FakeBold=1.1]
    \currentfontSC
    \seq_set_split:Nnn \l__krebs_smartsc_words_in_seq { ~ } { #1 }
    \seq_set_map:NNn \l__krebs_smartsc_words_out_seq \l__krebs_smartsc_words_in_seq
    {
        \__krebs_smartsc:n { ##1 }
    }
    \seq_use:Nn \l__krebs_smartsc_words_out_seq { ~ }
    \group_end:
}

\cs_new_protected:Nn \__krebs_smartsc:n
{
    \text_map_inline:nn { #1 } { \__krebs_smartsc_letter:n { ##1 } }
}

\cs_new_protected:Nn \__krebs_smartsc_letter:n
{
    \int_compare:nTF { \char_value_lccode:n { `#1 } = `#1 }
    {
        \char_uppercase:N #1
    }
    {
        {\currentfont #1}
    }
}
\ExplSyntaxOff


\begin{document}
    
    \noindent
    
    \smartsc{Small Caps are Nice, Aren't They?} (Times fake)
    
    \textsc{Small Caps are Nice, Aren't They?} (Times real)
    
    \gill\smartsc{Small Caps are Nice, Aren't They?} (Gill fake)
    
    \textsc{Small Caps are Nice, Aren't They?} (Gill real - No support)
    
    \hadriano\smartsc{Small Caps are Nice, Aren't They?} (Hadriano fake)
    
    \textsc{Small Caps are Nice, Aren't They?} (Hadriano real - No support)
    
    \minion\smartsc{Small Caps are Nice, Aren't They?} (Minion Pro Capt fake)
    
    \textsc{Small Caps are Nice, Aren't They?} (Minion Pro Capt real)
    
    \stix\smartsc{Small Caps are Nice, Aren't They?} (Stix Two Math fake)
    
    \textsc{Small Caps are Nice, Aren't They?} (Stix Two Math real - No support)
    
    \djvs\smartsc{Small Caps are Nice, Aren't They?} (DejaVu Sans fake)
    
    \textsc{Small Caps are Nice, Aren't They?} (DejaVu Sans real - No support)
    
    \arial\smartsc{Small Caps are Nice, Aren't They?} (Arial fake)
    
    \textsc{Small Caps are Nice, Aren't They?} (Arial real - No support)
    
    \free\smartsc{Small Caps are Nice, Aren't They?} (Free Serif fake)
    
    \textsc{Small Caps are Nice, Aren't They?} (Free Serif real)
    
    \symbola\smartsc{Small Caps are Nice, Aren't They?} (Symbola fake)
    
    \textsc{Small Caps are Nice, Aren't They?} (Symbola real - No support)
    
\end{document}

在此处输入图片描述

答案4

由于您正在使用fontspec:如果您需要伪造小写字母,您可能希望使用FakeStretch可选参数。请参阅fontspec手册。您可能还希望增加字母间距,但我相信 FakeStretch 已经可以为您提供帮助。

如果缩小大写字母的尺寸,以制作假小写字母,则字符的粗细也会相应减小。您可以使用 FakeStretch 在水平方向上进行补偿。补偿不应与收缩完全相反,因为小写字母通常比大写字母略轻。

Fontspec 也有,FakeBold但我不太愿意用。我不知道它的算法。至少在某些字体编辑器中,使用 FakeBold 的等效项可能会产生自交叉或模糊的字形轮廓。但 FakeStretch 只是一个一维比例,所以这不会造成任何问题。

FakeStretch 不会影响水平线条(和衬线),因此它们会太细。但这可能会被忽略。取决于字体。

与此相关的是,有些人喜欢将首字母缩略词放在小写字母和大写字母之间的“中号大写字母”中。如果这样做,通常最好将真正的小写字母放大(如果有)并缩小宽度,而不是缩小大写字母并扩大宽度。

相关内容