我正在尝试了解更多关于 XeTeX 如何使用 实现不同语言的换行符的信息\XeTeXlinebreaklocale
。从XeTeX 参考指南:
\XeTeXlinebreaklocale
⟨区域设置 ID⟩:定义如何为多语言文本换行。
这就是我能找到的所有信息,但我还有几个问题:
- ⟨ 可接受的值是什么区域设置 ID⟩? 在这个问题OP 得出的结论是使用了 ISO 639-1 语言代码,但我在哪里可以找出其中哪一个实际被实现并导致 XeTeX 行为发生变化?
- 在我的 TeX Live 系统中,我可以在哪里找到包含特定于每个语言环境的换行信息的文件?似乎它必须直接嵌入到 XeTeX 引擎中,因为即使我只加载加载的内容
xetex.ini
,它也能正常工作,据我所知,它不包含或\input
任何包含此类信息的文件。 \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 树. 实际更改发生在文件包含以下行的所有语言环境中:处理类似以下行的行中文
也可以看看