![使用 ucharclasses 切换语言时出现连字问题](https://linux22.com/image/358647/%E4%BD%BF%E7%94%A8%20ucharclasses%20%E5%88%87%E6%8D%A2%E8%AF%AD%E8%A8%80%E6%97%B6%E5%87%BA%E7%8E%B0%E8%BF%9E%E5%AD%97%E9%97%AE%E9%A2%98.png)
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}
输出结果如下:
我正在寻找避免不断重复 的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}
这种方法有两个问题。首先,自动连字似乎要差很多:
其次,没有简单的方法可以通过插入任意连字符来缓解第一个问题。例如,如果我用 替换行Bundespräsidentenstichwahlwiederholungsverschiebung
,Bundesprä\-sidentenstichwahlwiederholungsverschiebung
希望实现与上例相同的连字符,那么我会得到以下编译错误:
! Improper discretionary list.
<to be read again>
\xpg@pop@language
l.20 Bundesprä\-
sidentenstichwahlwiederholungsverschiebung
是我处理的方式不对,还是 XeLaTeX 根本就无法根据脚本自动设置语言(并且连字符和其他所有功能都按预期工作)?如果不可能,那为什么不能呢?