使用 XeTeX 和fontspec
,我在文档中使用 Liberation 字体系列。遗憾的是,这些字体(尤其是 Liberation Serif)本身不支持小写字母。
有没有办法启用假小型大写字母fontspec
?
答案1
在这里,我比较了 Yan 的方法的另一种选择。我像他一样将他的方法标记为“假的”,并将这种方法标记为“伪造的”。我发现(见适合与 arev 一起使用的小型大写字体吗?(例如)水平和垂直尺寸的不平等缩放能够更好地捕捉小型大写字母的比例。对于本例中显示的 Minion Pro,我使用 83% 的水平缩放和 72% 的垂直缩放来创建仿小型大写字母,对 sc Caps 进行 100% 的水平缩放(无变化)。相比之下,我在 Computer Modern 上使用 91% 的水平缩放和 75% 的垂直缩放,对 sc Caps 进行 111% 的水平缩放,在 Palatino 上使用 76% 的水平缩放和 68% 的垂直缩放,对 sc Caps 进行无变化。
此外,我的\fauxsc
宏能够自动区分小写和大写参数,并适当地呈现它们,从而简化了输入语法。
在这篇 MWE 中,我分别将“假”和“仿”小写字母与 Computer Modern、Minion Pro 和 Palatino 的真品 McCoy 进行了比较。
已编辑以处理 Xelatex 中的 UNICODE 输入。以前,我通过查看是否ˋ#1
在 ASCII 小写字母范围内来检测小写字母。这显然不适用于 UNICODE。因此,我调整了宏\fauxschelphelp
以使用 来测试小写字母\lccode
。
现在可以在最后一行看到结果。
\documentclass{article}
\usepackage{fontspec,graphicx}
\usepackage{graphicx}
\makeatletter
\newlength\fake@f
\newlength\fake@c
\def\fakesc#1{%
\begingroup%
\xdef\fake@name{\csname\curr@fontshape/\f@size\endcsname}%
\fontsize{\fontdimen8\fake@name}{\baselineskip}\selectfont%
\uppercase{#1}%
\endgroup%
}
\makeatother
\newcommand\fauxsc[1]{\fauxschelper#1 \relax\relax}
\def\fauxschelper#1 #2\relax{%
\fauxschelphelp#1\relax\relax%
\if\relax#2\relax\else\ \fauxschelper#2\relax\fi%
}
\def\Hscale{.83}\def\Vscale{.72}\def\Cscale{1.00}
\def\fauxschelphelp#1#2\relax{%
\ifnum`#1=\lccode`#1\relax\scalebox{\Hscale}[\Vscale]{\char\uccode`#1}\else%
\scalebox{\Cscale}[1]{#1}\fi%
\ifx\relax#2\relax\else\fauxschelphelp#2\relax\fi}
\begin{document}
\LARGE
{\def\Hscale{.91}\def\Vscale{.75}\def\Cscale{1.11}
\makebox[1.2in][l]{This is fake} S\fakesc{mall} C\fakesc{aps} $\leftarrow$ other answer\par
\makebox[1.2in][l]{This is real} \textsc{Small Caps}\par
\makebox[1.2in][l]{This is faux} \fauxsc{Small Caps} $\leftarrow$ this answer
\par}\smallskip
\fontspec{Minion Pro}
\makebox[1.2in][l]{This is fake} S\fakesc{mall} C\fakesc{aps} $\leftarrow$ other answer\par
\makebox[1.2in][l]{This is real} \textsc{Small Caps}\par
\makebox[1.2in][l]{This is faux} \fauxsc{Small Caps} $\leftarrow$ this answer
\par\smallskip
{\fontspec{Palatino Linotype}
\def\Hscale{.76}\def\Vscale{.68}\def\Cscale{1.0}
\makebox[1.2in][l]{This is fake} S\fakesc{mall} C\fakesc{aps} $\leftarrow$ other answer\par
\makebox[1.2in][l]{This is real} \textsc{Small Caps}\par
\makebox[1.2in][l]{This is faux} \fauxsc{Small Caps Œœ} $\leftarrow$ this answer
\par}
\end{document}
答案2
这是一个简单的解决方案
\documentclass{article}
\usepackage{fontspec}
\makeatletter
\newlength\fake@f
\newlength\fake@c
\def\fakesc#1{%
\begingroup%
\xdef\fake@name{\csname\curr@fontshape/\f@size\endcsname}%
\fontsize{\fontdimen8\fake@name}{\baselineskip}\selectfont%
\uppercase{#1}%
\endgroup%
}
\makeatother
\begin{document}
\Huge
\fontspec{Minion Pro}
This is real \textsc{small caps} \par
This is fake \fakesc{small caps} \par
\medskip
\fontspec{Didot Lt Std}
This is real \textsc{small caps} \par
This is fake \fakesc{small caps} \par
\end{document}
效果如下,
显然,这种方法并不普遍适用。\fakesc
将在不改变 的情况下将字体大小调整为 Cap 大小baselineskip
。但是,这将取决于字体的设计。使用 Minion Pro,设置为\Huge
,因此 Minion Pro Disp 正在使用中,设置假小写字母将使用 Minion Pro Subh,因此看起来还不错,因为 Subh 比 Disp 略重。但设置为非光学尺寸字体(例如 Didot)时,重量的对比更加明显。此外,由于 x 高度不同,假小写字母看起来会有点太大。因此您需要\fontsize
相应地调整 。
答案3
最好的——恕我直言仅有的可以接受——获取小型大写字母的方法是使用包含它们的字体,但每个假冒的字体看起来都很糟糕,因为假冒的小型大写字母的笔画宽度与真正的大写字母不匹配。
看看这些展示 Linux Libertine 的图像,然后做出自己的决定……
真正的小型大写字母
伪造小写字母
答案4
是的,如果您的字体不提供原生小写字母,您可以尝试以下代码来制作假大写字母。在我这边运行良好...
\documentclass[]{article}
%\usepackage{fontspec}
\begin{document}
\makeatletter
\def\mycommand{\bgroup\obeyspaces\mycommandaux}
\def\mycommandaux#1{\mycommandauxii #1\relax\relax\egroup}
\def\mycommandauxii#1{%
\ifx\relax#1\else \ifcat#1\@sptoken{} \expandafter\expandafter\expandafter\mycommandauxii\else
\ifnum`#1=\uccode`#1 {\normalsize #1}\else {\footnotesize \uppercase{#1}}\fi \expandafter\expandafter\expandafter\mycommandauxii\expandafter\fi\fi}
\mycommand{All inside this are fake caps}
\end{document}
希望有帮助++