如何在 XeLaTeX 和 Polyglossia 中为数字(0-9)设置特定字体,同时保留阿拉伯/波斯字符的主要字体?

如何在 XeLaTeX 和 Polyglossia 中为数字(0-9)设置特定字体,同时保留阿拉伯/波斯字符的主要字体?

我正在处理一份使用 XeLaTeX 和 Polyglossia 排版阿拉伯语/波斯语文本的文档。我试图为数字 (0-9) 设置特定字体,同时Vazirmatn为阿拉伯语/波斯语字符保留主字体 ()。

此外,我对字体的定义如下:

\documentclass{article}
\usepackage{polyglossia}
\usepackage{fontspec}

\setmainlanguage{farsi}

\newfontfamily\persianfont[Script=Arabic]{Vazirmatn}
\newfontfamily\persiandigitsfont[Scale=MatchUppercase]{TeX Gyre Pagella}

\setmainfont{Vazirmatn}

但是,这似乎不会影响我文本中的数字。我该如何告诉 Polyglossia\persiandigitsfont在我的文档中渲染数字,同时保留\persianfont阿拉伯语/波斯语字符?

最小工作示例:

\documentclass{article}
\usepackage{polyglossia}
\usepackage{fontspec}

\setmainlanguage{english}
\setotherlanguage{persian}

\newfontfamily\persianfont[Script=Arabic]{Vazirmatn}
\newfontfamily\persiandigitsfont[Scale=MatchUppercase]{TeX Gyre Pagella}

\begin{document}
    \begin{enumerate}
        \item testing
        \item still testing
    \end{enumerate}
    \begin{enumerate}
        \begin{persian}
            \item این نمونه فارسی است.
            \item این نمونه فارسی است.
        \end{persian}
    \end{enumerate}
\end{document}

根据语言环境,使用两种类型的数字

我很感激任何关于如何实现这一目标的帮助或指导。谢谢!

PS:这是对我之前的问题,因为xepersian它解决了这个问题,即使对于混合语言的文档也是如此。不幸的是,它引入了其他问题,并且通常不适合混合语言的文档。

此外,搜索还发现了两个看似大致相同的问题。尚未得到答复另一方超出范围,如果我没记错的话,替换所有字体中的数字。

答案1

以下类似于回答你链接到的。它将字体变化限制在使用波斯语时(通过\inlineextras@persian\blockextras@persian来自polyglossia),并且还考虑字符类bidi定义。

请注意,bidi已经设置\XeTeXinterchartokenstate为 1,因此无需这样做。此外,此解决方案可能会破坏 XeTeX 在短文本上应用的 unicode bidi 算法,但您首先不应该真正依赖它。

我的系统上没有安装 Vazirmatn,所以我使用了 Amiri。颜色仅供测试。

\documentclass{article}
\usepackage{polyglossia}
\usepackage{fontspec}
\usepackage{xcolor}

\setmainlanguage{english}
\setotherlanguage{persian}


\newfontfamily\persianfont[Script=Arabic,Color=red]{Amiri}
\newfontfamily\persiandigitsfont[Scale=MatchUppercase,Color=blue]{TeX Gyre Pagella}

\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

\newcommand*\BegDigits{}
\newcommand*\EndDigits{}
\makeatletter
\XeTeXinterchartoks 0 \CharNumbers = {\BegDigits}
\XeTeXinterchartoks 4095 \CharNumbers = {\BegDigits}
\XeTeXinterchartoks \bidi@sepmark@charclass \CharNumbers = {\DigitsDotDashInterCharToks\BegDigits}
\XeTeXinterchartoks \bidi@digits@charclass \CharNumbers = {\BegDigits}
\XeTeXinterchartoks \CharNumbers 0 = {\EndDigits}
\XeTeXinterchartoks \CharNumbers 4095 = {\EndDigits}
\XeTeXinterchartoks \CharNumbers \bidi@sepmark@charclass = {\EndDigits}
\XeTeXinterchartoks \CharNumbers \bidi@digits@charclass = {\EndDigits}
\addto\blockextras@persian{\def\BegDigits{\begingroup\persiandigitsfont}\def\EndDigits{\endgroup}}
\addto\inlineextras@persian{\def\BegDigits{\begingroup\persiandigitsfont}\def\EndDigits{\endgroup}}
\makeatother

\begin{document}
    \begin{enumerate}
        \item testing
        \item still testing
    \end{enumerate}
    \begin{enumerate}
        \begin{persian}
            \item این نمونه فارسی است.
            \item این نمونه فارسی است.
        \end{persian}
    \end{enumerate}

\begin{enumerate}
    \item testing
    \item still testing
\end{enumerate}
\begin{enumerate}
    \begin{persian}
        \item این نمونه فارسی است.
        \item این نمونه فارسی است.
    \end{persian}
\end{enumerate}

Short persian text: \textpersian{Test 123 Test}

\end{document}\end{document}

在此处输入图片描述

相关内容