我想用该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 参考。