使用 ucharclasses 切换语言时出现连字问题

使用 ucharclasses 切换语言时出现连字问题

TL;DR 版本:我该如何编写一份双语文档,其中两种语言使用不同的脚本,以便 (1) 每次文档切换语言时,我不需要在手动设置字体和语言,并且 (2) 自由和自动连字仍然有效?

带有示例代码的完整问题:我正在使用 XeLaTeX 编写一份德语和俄语多语言文档。我使用ucharclasses自动在我使用的拉丁和西里尔字体之间切换,以及polyglossia的语言切换命令和环境(\begin{otherlanguage}{russian}…\end{otherlanguage}\foreignlanguage{russian}{…}和/或\selectlanguage{russian}…\selectlanguage{german},取决于我需要包含的俄语文本数量)。这是一个略微虚构的 MWE,它仅使用\selectlanguage和两种常用且对比度高的字体:

\documentclass[12pt]{article}
\usepackage{fontspec}
\defaultfontfeatures{Ligatures=TeX}
\usepackage{polyglossia}
\setmainlanguage{german}
\setotherlanguage{russian}
\usepackage[Latin, Cyrillic]{ucharclasses}
\newfontfamily\defaultfont{Arial}
\newfontfamily\cyrillicfont[Script=Cyrillic]{Linux Libertine O}
\setDefaultTransitions{\defaultfont}{}
\setTransitionsForLatin{\defaultfont}{}
\setTransitionsForCyrillics{\cyrillicfont}{}

\begin{document}
\selectlanguage{russian}
превысокомногорассмотрительствующий
превысокомногорассмотрительствующему
Тысячевосьмисотвосьмидесятидевятимикрометровый
\selectlanguage{german}
siebenhundertsiebenundsiebzigtausendsiebenhundertfünfundsiebzig
Rindfleischetikettierungsüberwachungsaufgabenübertragungsgesetz
Bundespräsidentenstichwahlwiederholungsverschiebung 
\selectlanguage{russian}
превысокомногорассмотрительствующий
превысокомногорассмотрительствующему
Тысячевосьмисотвосьмидесятидевятимикрометровый
\end{document}

输出结果如下:

第一个 MWE 的输出

我正在寻找避免不断重复 的polyglossia语言切换命令和环境的方法。到目前为止,我想到的最不坏的解决方案是使用较短的版本(例如\newcommand{\R}[1]{\foreignlanguage{russian}{#1}})为命令设置别名,但当我需要在单个句子中多次切换语言时,即使使用这些命令也会变得有点麻烦。

我认为可以通过使用该ucharclasses包自动切换语言和字体来避免所有这些烦人的标记。例如:

\documentclass[12pt]{article}
\usepackage{fontspec}
\defaultfontfeatures{Ligatures=TeX}
\usepackage{polyglossia}
\setmainlanguage{german}
\setotherlanguage{russian}
\usepackage[Latin, Cyrillic]{ucharclasses}
\newfontfamily\defaultfont{Arial}
\newfontfamily\cyrillicfont[Script=Cyrillic]{Linux Libertine O}
\setDefaultTransitions{\selectlanguage{german}\defaultfont}{}
\setTransitionsForLatin{\selectlanguage{german}\defaultfont}{}
\setTransitionsForCyrillics{\selectlanguage{russian}\cyrillicfont}{}

\begin{document}
превысокомногорассмотрительствующий
превысокомногорассмотрительствующему
Тысячевосьмисотвосьмидесятидевятимикрометровый
siebenhundertsiebenundsiebzigtausendsiebenhundertfünfundsiebzig
Rindfleischetikettierungsüberwachungsaufgabenübertragungsgesetz
Bundespräsidentenstichwahlwiederholungsverschiebung 
превысокомногорассмотрительствующий
превысокомногорассмотрительствующему
Тысячевосьмисотвосьмидесятидевятимикрометровый
\end{document}

这种方法有两个问题。首先,自动连字似乎要差很多:

第二个 MWE 的输出

其次,没有简单的方法可以通过插入任意连字符来缓解第一个问题。例如,如果我用 替换行BundespräsidentenstichwahlwiederholungsverschiebungBundesprä\-sidentenstichwahlwiederholungsverschiebung希望实现与上例相同的连字符,那么我会得到以下编译错误:

! Improper discretionary list.
<to be read again> 
                   \xpg@pop@language 
l.20 Bundesprä\-
                 sidentenstichwahlwiederholungsverschiebung

是我处理的方式不对,还是 XeLaTeX 根本就无法根据脚本自动设置语言(并且连字符和其他所有功能都按预期工作)?如果不可能,那为什么不能呢?

相关内容