可以在 xelatex 中设置仅适用于大写字母的特定字体变体吗?

可以在 xelatex 中设置仅适用于大写字母的特定字体变体吗?

我想用该Zapfino字体排版一个简短的、类似字母的文档,但需要进行以下调整:我可以使用 Zapfino 的“标准”(即变体 0)字形来表示小写字母,但我想使用变体 1 字形来表示大写字母。(如果您好奇的话,它们看起来比变体 0 大写字形更“花哨”……)举一个具体的例子,我想得到

在此处输入图片描述

代替

在此处输入图片描述

请注意大写字母的不同外观。到目前为止,我只能使用蛮力方法实现此外观,即定义命令\newcommand{\varone}[1]{{\fontspec[Variant=1]{Zapfino}#1}},然后将每个大写字母包裹X在内\varone{X}

我仔细阅读了fontspec手册,在第 55 页找到了\newfontfeature命令,但我似乎无法弄清楚如何将此方法应用于我的目标,即分别为大写字母和小写字母设置字体变体。有人有想法吗?

以防万一,我在 MacOSX 10.6.8 下运行 MacTeX2011。我拥有的 Zapfino 字体是随操作系统安装的字体。

回答,基于以下@AndreyVihrov 解决方案的最小更改版本:

    % !TEX TS-program = xelatex
% !TEX encoding = UTF-8
\documentclass[letterpaper]{article}

\usepackage{fontspec}
\setmainfont{Zapfino}

% Prepare a separate "font" for Latin uppercase letters
\newfontfamily\upfont[Ligatures=TeX,Variant=1]{Zapfino}

\XeTeXinterchartokenstate=1
\newXeTeXintercharclass \uppercaseclass

% Assign the new XeTeX character class to all Latin uppercase letters
\makeatletter
\@tempcnta=`\A
\loop\unless\ifnum\@tempcnta>`\Z
  \XeTeXcharclass \@tempcnta \uppercaseclass
  \advance \@tempcnta by 1
\repeat
\makeatother

% Implement the font change
\XeTeXinterchartoks 0 \uppercaseclass   = {\begingroup\upfont}
\XeTeXinterchartoks \uppercaseclass 0   = {\endgroup}
\XeTeXinterchartoks 255 \uppercaseclass = {\begingroup\upfont}
\XeTeXinterchartoks \uppercaseclass 255 = {\endgroup}

\begin{document}
Once Upon a Time, Prince Charming saw \ldots
\end{document}

在此处输入图片描述

答案1

您可以使用 XeTeX 字符类机制,该机制允许根据用户定义的字符类将标记插入输入流。在本例中,我们为大写字母定义一个新类,并准备在这些字母之前和之后插入的代码:

\documentclass{article}

\usepackage{fontspec}

% Our font for uppercase letters
\newfontfamily\upfont[Ligatures=TeX,Color=FF0000]{Latin Modern Roman}

\XeTeXinterchartokenstate=1
\newXeTeXintercharclass \uppercaseclass

% Assign the new class to all Latin capital letters
\makeatletter
\@tempcnta=`\A
\loop\unless\ifnum\@tempcnta>`\Z
  \XeTeXcharclass \@tempcnta \uppercaseclass
  \advance \@tempcnta by 1
\repeat
\makeatother

% Setup font change
\XeTeXinterchartoks 0 \uppercaseclass   = {\begingroup\upfont}
\XeTeXinterchartoks \uppercaseclass 0   = {\endgroup}
\XeTeXinterchartoks 255 \uppercaseclass = {\begingroup\upfont}
\XeTeXinterchartoks \uppercaseclass 255 = {\endgroup}

\begin{document}

Once Upon a Time, there was a Beautiful Princess\ldots

\end{document}

在此处输入图片描述

该机制描述于XeTeX 参考

相关内容