如何在 XeLaTeX 中将特定字形设置为特定字体

如何在 XeLaTeX 中将特定字形设置为特定字体

假设我有以下 XeLaTeX 文档:

\documentclass{article}
\usepackage{fontspec}
\setmainfont{Arial}
\begin{document}
Proin quis (tortor) orci. Etiam at risus et $(a + b)x$.
\end{document}

有没有办法进行全局设置,例如仅为括号设置 Georgia 字体?

在数学模式中也可以使用 进行类似操作unicode-math。例如,

\documentclass{article}
\usepackage{fontspec}
\usepackage{unicode-math}
\setmathfont[range="0028]{Georgia}
\setmainfont{Arial}
\begin{document}
Proin quis (tortor) orci. Etiam at risus et $(a + b)x$.
\end{document}

左括号在佐治亚州

可能相关:XeTeX 中特定字符的字体选择

答案1

您可以使用 XeTeXinterchartoks在已定义类别的字符之间插入字体更改来执行此操作。我改编了此处的代码,replace-numbers.sty它是 的一部分xelatex

不幸的是,XeTeX 文档对此有点过时,边界的字符类已更改为 4095。这是\e@alloc@intercharclass@top在 LaTeX 内核中设置的,所以我用这个来代替硬编码数字。感谢聊天中的专家解释这一变化。

在下面的示例中,我\color{red}在代码中添加了 以清楚地显示更改。显然,对于您的实际使用情况,应该将其删除。

% !TEX TS-program = xelatex
\documentclass{article}
\usepackage{xcolor}
\usepackage{fontspec}
\setmainfont{Linux Libertine O}
\newfontfamily\parenfont{Linux Biolinum O}
\makeatletter
\XeTeXinterchartokenstate=1
\chardef\CharNormal=0
\ifx\e@alloc@intercharclass@top\@undefined
\chardef\CharBound=255
\else
\chardef\CharBound=\e@alloc@intercharclass@top
\fi
\newXeTeXintercharclass\CharParens
\XeTeXcharclass`(=\CharParens
\XeTeXcharclass`)=\CharParens
\newtoks\TokSetfont
\TokSetfont={\begingroup\parenfont\color{red}} % remove \color{red} for actual use
\XeTeXinterchartoks\CharNormal\CharParens=\TokSetfont
\XeTeXinterchartoks\CharBound\CharParens=\TokSetfont
\XeTeXinterchartoks\CharParens\CharNormal={\endgroup}
\XeTeXinterchartoks\CharParens\CharBound={\endgroup}
\makeatother
\begin{document}
Proin quis (tortor) orci. Etiam at risus et $(a + b)x$.
\end{document}

代码输出

此代码存在问题 此代码检查旧版本的 latex 内核,并为此适当设置边界字符类。但是,有一个版本的内核发布,虽然\e@alloc@intercharclass@top字符类已更改,但未定义。如果上述代码无法运行,请尝试替换以下代码:

\ifx\e@alloc@intercharclass@top\@undefined
\chardef\CharBound=255
\else
\chardef\CharBound=\e@alloc@intercharclass@top
\fi

有了这个:

\chardef\CharBound=4095

相关内容