![如何使用 ucharclasses 更改特殊脚本的字体,然后恢复到之前的状态?](https://linux22.com/image/241776/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20ucharclasses%20%E6%9B%B4%E6%94%B9%E7%89%B9%E6%AE%8A%E8%84%9A%E6%9C%AC%E7%9A%84%E5%AD%97%E4%BD%93%EF%BC%8C%E7%84%B6%E5%90%8E%E6%81%A2%E5%A4%8D%E5%88%B0%E4%B9%8B%E5%89%8D%E7%9A%84%E7%8A%B6%E6%80%81%EF%BC%9F.png)
当我输入带有特定脚本(例如印地语的梵文)的新 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
实施得不太好的地方。
嗯,脚本之间需要有空格。如果有很多脚本,那么为文档中的所有脚本定义所有转换会非常无聊。