在波兰语和捷克语排版中,短单词永远不应该排在行尾,而应该使用连字符连接较长的单词。遗憾的是,在每个短单词后输入一个 NB 空格会增加很多工作量(这种情况很常见)。一个简单的通用规则是将长度不超过 3 个字母的单词后的每个空格自动转换为 NB 空格。(更不用说这种解决方案在任何拉丁文字语言中看起来都更优雅)。
事实上,对于生物或化学文本,该规则也应该扩展到连字符 - 3 个或更少字母的单词后紧接着的连字符应该是不间断的,因此例如化合物名称之前的元素符号或蛋白质名称前面的希腊字母不会与后面的内容分开。
现有的所有解决方案要么涉及一个单词词典,在其后插入一个 NB 空格,要么只涵盖单个字母的单词。然而,这对许多技术文本不起作用,因为规则还应考虑数字(例如,在正确排版的文本中,单位符号永远不会与其所属的数字分开)。到目前为止,我还没有找到扩展代码以涵盖任何三个字符组的方法。
(没有 MWE,因为在我看来,这个问题太笼统,不值得用 MWE)
编辑:经过一番考虑,我认为这个问题可以分为两部分。首先是设置一个不间断字符串列表,其中应包括显式连字符 (-)、破折号 (–)、停顿 (—)、冒号 (:) 和空格包围的冒号 (:),因为所有这些字符都可以在化学语境中作为单词的一部分出现。其次是检测由少于 4 个字母组成的单词(必须包括基本拉丁字母之外的字母,例如希腊文和数字)并将其后面的空格转换为不间断空格,我认为可以使用 RegEx 作为最后的手段来完成。
答案1
所以我最终将项目转移到 LuaLaTeX 并编写了预换行过滤器。文件有点长,因为它需要创建一个 Unicode/UTF-8 转换数据库(默认 Lua 没有库来获取 Unicode 字形类别,而这对于提供跨语言支持是必需的)。 https://gitlab.com/PawelMalecki/pawelualatex/-/blob/master/linebreak_lib.lua