我正在处理一份使用 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}