高棉语:如果启用 XeTeXlinebreaklocale,连字符会断开

高棉语:如果启用 XeTeXlinebreaklocale,连字符会断开

在用高棉语生成文档时,我们注意到某些连字符不起作用。我们发现关闭 XeTeXlinebreaklocale 可以修复所有连字符,但这会导致换行问题,并且如果单词之间没有零宽度空格,行会超出右边距。(在高棉语中,同一个句子或短语中的单词通常连在一起,中间没有空格。)

我们的目标是使所有连字都能正常工作,并同时使用 XeTeXlinebreaklocale。

请注意,我们并不是在寻找针对此特定示例的手动解决方法。我们正在寻找一种能够解决根本原因的方法,然后可以在我们无法修复此问题的个别实例的自动化系统中使用。

MWE 1:XeTeXlinebreaklocale 关闭,连字可以使用(文本为红色),但是文本会超出右边距。

MWE 1:连字符有效

\documentclass[12pt]{article}

%\XeTeXlinebreaklocale "km"
\usepackage{color}
\usepackage{fontspec}
\setmainfont[Ligatures=Required]{Khmer OS Content}

\begin{document}
មានមនុស្សម្នាក់ដែលបានធ្វើការមួយដែលអាចដឹងបាន នោះគឺជាកា{\color{red}ស្រ្តូ}នៅទីនេះ។ បាទ អ្នកទាំងអស់គ្នា។ គាត់បានចុះទៅទីនោះ។ ហើយពួកនាយទុនមានអស់ទាំងព្រនង់ ហើយនឹងអ្វីៗដែល… វាគឺឋិតនៅក្នុងស្តង់ដាមាស ដូចជាសហរដ្ឋអាមេរិកដែរ។ តើគាត់បានធ្វើអ្វី? គាត់បានទិញអស់ទាំងបណ្ណ័ភាគហ៊ុន។ គឺរកលុយតាមគ្រប់ទាំងវិធីដែលគាត់អាចធ្វើទៅបាន។ បន្ទាប់មកតើគាត់ធ្វើអ្វីទៀត? គាត់ក៏បានក្លែងបន្លំក្រដាស់ប្រាក់ ហើយបានប្ដូរវា។ ហើយក៏ដាក់ទៅវិញ។ នេះហើយគឺជាអ្វីតែមួយដែលជាតិសាសន៍នេះអាចធ្វើបាន។
\end{document}

MWE 2:XeTeXlinebreaklocale 设置为“km”,换行符可以工作,但是一些连字符被破坏(文本为红色)。

在此处输入图片描述

\documentclass[12pt]{article}

\XeTeXlinebreaklocale "km"
\usepackage{color}
\usepackage{fontspec}
\setmainfont[Ligatures=Required]{Khmer OS Content}

\begin{document}
មានមនុស្សម្នាក់ដែលបានធ្វើការមួយដែលអាចដឹងបាន នោះគឺជាកា{\color{red}ស្រ្តូ}នៅទីនេះ។ បាទ អ្នកទាំងអស់គ្នា។ គាត់បានចុះទៅទីនោះ។ ហើយពួកនាយទុនមានអស់ទាំងព្រនង់ ហើយនឹងអ្វីៗដែល… វាគឺឋិតនៅក្នុងស្តង់ដាមាស ដូចជាសហរដ្ឋអាមេរិកដែរ។ តើគាត់បានធ្វើអ្វី? គាត់បានទិញអស់ទាំងបណ្ណ័ភាគហ៊ុន។ គឺរកលុយតាមគ្រប់ទាំងវិធីដែលគាត់អាចធ្វើទៅបាន។ បន្ទាប់មកតើគាត់ធ្វើអ្វីទៀត? គាត់ក៏បានក្លែងបន្លំក្រដាស់ប្រាក់ ហើយបានប្ដូរវា។ ហើយក៏ដាក់ទៅវិញ។ នេះហើយគឺជាអ្វីតែមួយដែលជាតិសាសន៍នេះអាចធ្វើបាន។
\end{document}

我在 Mac 上使用 TexShop 3.62,用 XeTeX 将其排版为 XeLatex,版本 3.14159265-2.6-0.99996(TeX Live 2016)。

有没有办法改变我们的模板,以便 XeTeXlinebreaklocale 和连字都能正常工作?

答案1

我从 Jonathan Kew 那里得到了一个解决方案[电子邮件保护]邮件列表。他建议将其添加\XeTeXinterwordspaceshaping=2到我们的文档中,这确实解决了我们的问题。

我引用他的话:

问题出现的原因是,激活 XeTeXlinebreaklocale 实际上使得 xetex 在每个潜在的换行位置插入类似 \penalty0 或 \hskip0pt 或类似的内容(取决于 \XeTeXlinebreakpenalty 和 ...skip 的设置),以便正常的 TeX 换行算法能够找到并使用这些换行符。

但是插入的惩罚和/或跳过会中断传递给 OpenType 整形引擎的字符序列,因此连字等功能将无法跨越边界发挥作用。

一种可能的解决方法是将 \XeTeXinterwordspaceshaping=2 设置在文档中。这将导致 xetex 在换行后重新调整文本行,此时您的连字符应该可以正常工作。

有一些注意事项:特别是,如果您尝试这样做,您会注意到示例文本片段的红色会丢失。这是因为 \color 插入的 \special{} 将被移出现在作为一个单元成形的文本行。但根据您的文档需求,这可能是一个可以接受的权衡。

哦,顺便说一句:如果您愿意,您可以在文档中更改 \XeTeXinterwordspaceshaping 设置,但其效果不遵守通常的 TeX 作用域规则;如果我没记错的话,\XeTeXinterwordspaceshaping=2 基本上是以整页为基础进行操作的,所以重要的是页面完成时的值。

相关内容