这是 Taco Hoekwater 最近发表的一篇后续文章很好的答案这是我几个月前提出的一个问题。它涉及对包含以下单词(主要是但不限于德语单词)使用连字符抑制算法变音符(分音符)。
以 Taco 的 MWE 为起点(由于很长,下面没有重现),添加说明
\suppressligature{lffach}{lf|fach} %% no f-ligature in words containing the string "lffach"
\suppressligature{rflich}{rf|lich} %% ditto for words containing the string "rflich"
\suppressligature{mpfflug}{mpf|flug}
以及以下六个单词(均包含潜在的 f 连字字形):
elffach zwölffach %% ff ligature to be suppressed
verwerflich dörflich %% fl ligature to be suppressed
Kampfflugzeug Düsenkampfflugzeug %% ffl ligature to be replaced with f-fl
之后\begin{document}
。这将产生以下输出:
请注意这三个词不是在连字抑制点之前包含变音符号的字符|
会被正确处理,即ff
,fl
、 和ffl
连字会按照适用命令指示的方式分解\suppressligature
。相反,连字抑制失败对于第二组三个单词——显然是因为它们包含变音符号。ä
顺便说一句,包含变音符号的单词也会发生这种情况。
此外,我已经确定这个问题仅有的似乎发生在含有变音符号的单词中前连字抑制点。含有变音符号的单词后相应指令指示的连字抑制点\suppressligature
被正确处理。例如,当提供指令时\suppressligature{uflös}{uf|lös}
,单词auflösen
和Auflösung
都呈现为无fl
连字。
关于我的 TeX 设置:我主要运行 TeXLive2011 并使用 TeXWorks 作为我的编辑器程序。但是,在安装了所有最新更新并使用 WinEdt7.0 作为编辑器的 MiKTeX2.9 下也会出现此问题。这两个编辑器都完全支持 unicode。
问题:需要如何编辑/修改 Taco 的代码才能规避本文中描述的问题?
答案1
问题是string.find
返回一个字节位置,在这种情况下,当比较节点和字符串时,你需要一个字符索引。解决方案是替换
table.insert(throwliga,{match,n,k})
和
table.insert(throwliga,{prefix_length(f,match),n,k})
prefix_length
定义如下:
local prefix_length = function(word,byte)
return unicode.utf8.len(string.sub(word,0,byte))
end
word
它仅返回以结尾的前缀的字符长度byte
。
笔记:此更改仅修复了当前问题,它无法解决表中字符串中有 unicode 字符的情况noliga
。请不要让我也写这个,应该还有一些挑战 ;)