如何使用 ucharclasses 更改特殊脚本的字体,然后恢复到之前的状态?

如何使用 ucharclasses 更改特殊脚本的字体,然后恢复到之前的状态?

当我输入带有特定脚本(例如印地语的梵文)的新 Unicode 块时,我想更改 XeLaTeX 中的字体。该ucharclasses软件包似乎正是这样做的。

但是,当我离开使用不同脚本的地方并返回到之前的脚本(例如拉丁脚本)时,我会丢失格式(例如粗体)和字体大小。

为了说明这一点,请尝试以下操作:

\documentclass[10pt,a5paper,DIV12,BCOR8.25mm,twoside,parskip=half]{scrreprt}

\usepackage[Devanagari]{ucharclasses}
\usepackage{xltxtra}
\usepackage{fontspec}
\setmainfont[Mapping=tex-text]{Liberation Serif}
\setsansfont[Mapping=tex-text]{Liberation Sans}
\setmonofont[Mapping=tex-text]{Liberation Mono}
\newfontfamily\hindifont{Siddhanta}
\setTransitionsFor{Devanagari}{\hindifont}{\rm}


\begin{document}
\tableofcontents
\section{A latin script section}
Some latin script
\section{Devanagari: ताजा धनिया के साथ अनायास and so on}
A mixture \textbf{ of normal text and ताजा धनिया के साथ अनायास Devanagari script} in bold
\section{Some more latin script}
Some latin script
\end{document}

输出如下所示:

脚本更改

正确\setTransitionTo选择了梵文脚本并将字体更改为 Siddhanta。但是,当我返回拉丁脚本时,粗体消失了,字体大小增加了。目录行显示了同样的问题。

NB\setTransitionsFor{...}{...}{...}是文档中描述的\setTransitions。文档似乎是错误的。

答案1

您可以尝试这样的操作(我使用了 ^^ 符号,因为我这里没有 utf8 编辑器):

\documentclass[10pt,a5paper,DIV12,BCOR8.25mm,twoside,parskip=half]{scrreprt}
\usepackage[Devanagari]{ucharclasses}
\usepackage{fontspec}

\newfontfamily\hindifont{Arial Unicode MS}
\makeatletter
\setTransitionsFor{Devanagari}%
 {\let\curfamily\f@family\let\curshape\f@shape\let\curseries\f@series\hindifont}
 {\fontfamily{\curfamily}\fontshape{\curshape}\fontseries{\curseries}\selectfont}
\makeatother

\begin{document} \tableofcontents \section{A latin script section} Some latin script

\section{Devanagari: ^^^^0908 ^^^^0909 and so on} A mixture \textbf{ of normal text and ^^^^0908 ^^^^0909 Devanagari script} in bold
\section{Some more latin script} Some latin script

\end{document}

答案2

我认为这很简单:

\def\ResetTransitionTo#1{%
  \XeTeXinterchartoks 255 \csname#1Class\endcsname{\relax}}
\setTransitionsFor{Devanagari}
  {\begingroup\ResetTransitionTo{Devanagari}\sethindifont}
  {\endgroup}

这就是我们在 中所做的xeCJK。注意,我们必须重置\XeTeXinterchartoks才能使组保持平衡。这是一个ucharclasses实施得不太好的地方。

嗯,脚本之间需要有空格。如果有很多脚本,那么为文档中的所有脚本定义所有转换会非常无聊。

相关内容