使用 XeTeX/fontspec 伪造小型大写字母?

使用 XeTeX/fontspec 伪造小型大写字母?

使用 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}

希望有帮助++

相关内容