XeTeX 中特定字符的字体选择

XeTeX 中特定字符的字体选择

我刚刚遇到了另一个问题,我非常喜欢使用 gill sans,但数字 1、小写 L 和大写 I 几乎无法区分。另一方面,我喜欢 Helvetica 数字。有没有办法将 Gill Sans 用于所有非数字字符,而将 Helvetica 仅用于数字 [0 9]?

答案1

是的,你可以。但我只知道一个棘手的方法——使用\XeTeXinterchartoks和相关命令。有一些软件包,例如xeCJKucharclasses,使用这种机制来支持多语言。(我为写了一些代码xeCJK。)有关更多信息,您可以阅读XeTeX 的参考

设置\XeTeXinterchartokenstate=1为启用该机制。

已经有一些预定义的字符类。0 表示普通西方字母和符号,1 表示 CJK 表意文字,4095 表示边界(旧版本的 XeTeX 中为 255),等等。您可以使用它\newXeTeXintercharclass来分配一个新类。

使用将\XeTeXcharclass数字设置为新的字符类,并用它\XeTeXinterchartoks来完成这个技巧。

完整示例:

结果

\documentclass{article}
\usepackage{fontspec}
\XeTeXinterchartokenstate=1
\chardef\CharNormal=0
\makeatletter
% Test for old and new versions of the latex kernel
\ifx\e@alloc@intercharclass@top\@undefined
    \chardef\CharBound=255
\else
    \chardef\CharBound=\e@alloc@intercharclass@top
\fi
\makeatother
\newXeTeXintercharclass\CharNumbers
\XeTeXcharclass`0=\CharNumbers
\XeTeXcharclass`1=\CharNumbers
\XeTeXcharclass`2=\CharNumbers
\XeTeXcharclass`3=\CharNumbers
\XeTeXcharclass`4=\CharNumbers
\XeTeXcharclass`5=\CharNumbers
\XeTeXcharclass`6=\CharNumbers
\XeTeXcharclass`7=\CharNumbers
\XeTeXcharclass`8=\CharNumbers
\XeTeXcharclass`9=\CharNumbers
\newtoks\TokSetfont
\TokSetfont={\begingroup\fontspec{Latin Modern Mono}}
\XeTeXinterchartoks\CharNormal\CharNumbers=\TokSetfont
\XeTeXinterchartoks\CharBound\CharNumbers=\TokSetfont
\XeTeXinterchartoks\CharNumbers\CharNormal={\endgroup}
\XeTeXinterchartoks\CharNumbers\CharBound={\endgroup}
\begin{document}
0123

abc123

123abc

abc123def

123abc456
\end{document}

顺便说一句,这不会影响数学字体。

笔记代码已更新以反映 XeTeX 中的变化(但实际上并未反映在文档中。)如果此代码失败,请删除 XeTeX 版本的测试并直接使用\chardef\CharBound=4095。(有一个版本的内核没有定义\e@alloc@intercharclass@top,但类仍然是 4095。)

答案2

我不知道这在 LaTeX 中是否有效,但至少在 Plain 中有效:

\font\mydigitsfont="Helvetica"
\font\mydigitssfont="Helvetica/S=7" at 7pt
\font\mydigitsssfont="Helvetica/S=5" at 5pt
\newfam\mydigitsfam
\textfont\mydigitsfam=\mydigitsfont
\scriptfont\mydigitsfam=\mydigitssfont
\scriptscriptfont\mydigitsfam=\mydigitsssfont
\XeTeXmathcode`0="0\mydigitsfam`0
\XeTeXmathcode`1="0\mydigitsfam`1
\XeTeXmathcode`2="0\mydigitsfam`2
\XeTeXmathcode`3="0\mydigitsfam`3
\XeTeXmathcode`4="0\mydigitsfam`4
\XeTeXmathcode`5="0\mydigitsfam`5
\XeTeXmathcode`6="0\mydigitsfam`6
\XeTeXmathcode`7="0\mydigitsfam`7
\XeTeXmathcode`8="0\mydigitsfam`8
\XeTeXmathcode`9="0\mydigitsfam`9
\def\mydigits{\fam\mydigitsfam\mydigitsfont}
$ 1^22^{23^3}3^1 $ 123 {\mydigits 123}
\bye

因此,仅适用于数学模式,且自动。

相关内容