CJK 字符结点判定

LiYanrui posted @ Jun 15, 2009 06:24:15 AM in Dream of TeX with tags luatex , 6449 阅读

在上一篇“断行”的末尾处,我提到了应该仅在中文字符之后插入 glue。查阅 luatex 手册,发现 glyph 结点含有 char 成员——体现为 glyph 的十进制编码。因此只需要将 CJK 的 Unicode 区域范围由 unicode 编码换算为十进制(直接用 16 进制也可以),就可以判断 glyph 结点是表示 CJK 字符。

我在 f4zhcn.lua 模块中添加了一个用于判断当前结点是否为 CJK glyph 结点的函数,如下:

local function is_cjk_ideo (current_node)
   if current_node.id == glyph then
      -- CJK Ext A
      if current_node.char >= 13312 and current_node.char <= 19893 then
         return true
      -- CJK
      elseif current_node.char >= 19968 and current_node.char <= 40891 then
         return true
      -- CJK Ext B
      elseif current_node.char >= 131072 and current_node.char <= 173782 then
         return true
      else
         return false
      end
   end
end

这里我只判断了 CJK、CJK Ext A 与 CJK Ext B 区的情况。对于中文标点,这里未进行判断。因为中文标点需要插入 kern 结点进行间距压缩处理,这是以后专门考虑的问题,在此不多说什么。

这样,就可以使用 is_cjk_ideo () 函数对当前结点类型进行判断并进行相应的 glue 插入操作,具体如下:

function f4zhcn.pre_linebreak_filter (head, groupcode)
   for t in node.traverse(head) do
      if is_cjk_ideo (t) then
         texio.write_nl ('*** CJK Ideo ***')
         local font = t.font
         set_inter_glue (font, inter_glue)
         insert_node_after(head, t,
                  make_glue_node (inter_glue_width, inter_glue_stretch, inter_glue_shrink))
      end
   end
   return true
end

同理,也可以判断 Latin 区的 glyph 结点,这在今后实现中英文自动间距调整时可以用得上。

Avatar_small
llpk00 说:
2009年6月15日 16:39

我也遇到过这个问题,当时也是这么解决的。http://gosman.blogbus.com/logs/7932840.html


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter