在哪里可以找到有关 XeTeX 换行行为的文档?

在哪里可以找到有关 XeTeX 换行行为的文档?

我正在尝试了解更多关于 XeTeX 如何使用 实现不同语言的换行符的信息\XeTeXlinebreaklocale。从XeTeX 参考指南

\XeTeXlinebreaklocale区域设置 ID⟩:定义如何为多语言文本换行。

这就是我能找到的所有信息,但我还有几个问题:

  1. ⟨ 可接受的值是什么区域设置 ID⟩? 在这个问题OP 得出的​​结论是使用了 ISO 639-1 语言代码,但我在哪里可以找出其中哪一个实际被实现并导致 XeTeX 行为发生变化?
  2. 在我的 TeX Live 系统中,我可以在哪里找到包含特定于每个语言环境的换行信息的文件?似乎它必须直接嵌入到 XeTeX 引擎中,因为即使我只加载加载的内容xetex.ini,它也能正常工作,据我所知,它不包含或\input任何包含此类信息的文件。
  3. \XeTeXlinebreaklocale有没有办法找到关于发出命令时换行算法具体如何变化的文档?

现在让我补充一点,我确实知道某些 XeLaTeX 包可以为我处理多语言换行,但这不是我想要的;我感兴趣的是了解 XeTeX 到底做了什么。

答案1

那么xetex.web你最终会来到这里

procedure do_locale_linebreaks(s: integer; len: integer);
var
  offs, prevOffs, i: integer;
  use_penalty, use_skip: boolean;
begin
  if (XeTeX_linebreak_locale = 0) or (len = 1) then begin
    link(tail):=new_native_word_node(main_f, len);
    tail:=link(tail);
    for i:=0 to len - 1 do
      set_native_char(tail, i, native_text[s + i]);
    set_native_metrics(tail, XeTeX_use_glyph_metrics);
  end else begin
    use_skip:=XeTeX_linebreak_skip <> zero_glue;
    use_penalty:=XeTeX_linebreak_penalty <> 0 or not use_skip;
    linebreak_start(main_f, XeTeX_linebreak_locale, native_text + s, len);
    offs:=0;
    repeat
      prevOffs:=offs;
      offs:=linebreak_next;
      if offs > 0 then begin
        if prevOffs <> 0 then begin
          if use_penalty then
            tail_append(new_penalty(XeTeX_linebreak_penalty));
          if use_skip then
            tail_append(new_param_glue(XeTeX_linebreak_skip_code));
        end;
        link(tail):=new_native_word_node(main_f, offs - prevOffs);
        tail:=link(tail);
        for i:=prevOffs to offs - 1 do
          set_native_char(tail, i - prevOffs, native_text[s + i]);
        set_native_metrics(tail, XeTeX_use_glyph_metrics);
      end;
    until offs < 0;
  end
end;

因此语言环境最终被传递给

linebreak_start(main_f, XeTeX_linebreak_locale, native_text + s, len);

正如 Marcel 在下面的评论中指出的那样,此函数在xetex_ext.c 调用它的地方定义linebreakstart(一般 C-web 名称映射规则)

linebreakstart(int f, integer localeStrNum, uint16_t* text, integer textLength)
...

这反过来又调用了 ICU 库ubrk_open函数,该函数实现了特定于语言环境的换行 联合航空 #14使用可用的语言环境数据ICU 树. 实际更改发生在文件包含以下行的所有语言环境中:处理类似以下行的行中文

也可以看看

http://userguide.icu-project.org/boundaryanalysis

相关内容