我不明白。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 不会影响水平线条(和衬线),因此它们会太细。但这可能会被忽略。取决于字体。
与此相关的是,有些人喜欢将首字母缩略词放在小写字母和大写字母之间的“中号大写字母”中。如果这样做,通常最好将真正的小写字母放大(如果有)并缩小宽度,而不是缩小大写字母并扩大宽度。