ほんとですね.とりあえずこちらの環境でも再現したので報告.
# こちらの環境は,LuaTeX 0.70.1(rev 4277,TeX Live 2011 収録のもの),Gentoo amd64 です.
LuaTeX 本体のバグのような気がしてきました.
以下のソースをタイプセットすると↓
%#!luatex b.tex
\directlua{
callback.register('hyphenate',
function (head,tail)
for p in node.traverse_id(node.id('glyph'), head) do
p.font=51 %★
end
print('>>> H1'); lang.hyphenate(head); print('>>> H2')
return head
end)}
a
\bye
Segmentation fault が発生しました(r4341 に更新しました)
This is LuaTeX, Version beta-0.71.0-2011080720 (rev 4341) restricted \write18 enabled. (./b.tex>>> H1 typeset segmentation fault at Sun Aug 7 20:25:03
しかし,★の行で示した数値を [0,50] の範囲内に収めると,文字がでるか否かはともかくとして pdf が作成されます.
上↑のコメントは変なことをいっていました(ロードしていないフォントを指定したから落ちたんですね).失礼しました.
その代わりといってはなんですが,次のソースはどうでしょう? (「あ」が366個なら Segmentation fault, 365個なら OK)
%#!luatex b.tex
\directlua{callback.register('hyphenate',
function (head,tail)
print('>>> H1'); lang.hyphenate(head); print('>>> H2')
return head
end)}
ああああ(略)あああ
\bye
その代わりといってはなんですが,次のソースはどうでしょう?(「あ」が366個なら Segmentation fault, 365個なら OK)
確かに再現しますね.ということは,ハイファネーション絡み? ひらがな・カタカナで起こるのもこれと関係があるのでしょうか?
ハイフネーション絡みということで調べてみました. luatexdir/lang/texlang.h にある
# define MAX_WORD_LEN 256 /* in chars */を 512 にしたら,症状はおきなくなったようです.「あ」の連続が1単語として判定されて,MAX_WORD_LEN を超えてしまったのが原因の気がします.
和文文字の連続のところで組み込み関数 lang.hyphenate が実行されない(or 適当に「単語区切りを入れる」)ようにすればいいんでしょうかね.
とりあえず, 関数 suppress_hyphenate_ja()(in: luatexja-core.lua (master) or pretreat.lua (kitagawa_test))に, 次の変更を施したら良さそうな気がします:
+ if p.subtype%2==1 then p.subtype = p.subtype - 1 end p.lang=lang_jaLuaTeX Reference の説明によると,ハイフネーションは subtype の最下位ビットが 1 のノードに対して行われるようなので, これを逆手にとって,和文文字のノードの subtype の最下位を 0 にした,というわけです.
# 今まで使っていた p.lang=lang_ja はもういらないかもしれません.
とりあえず,関数 suppress_hyphenate_ja()(in: luatexja-core.lua (master) or pretreat.lua (kitagawa_test))に,次の変更を施したら良さそうな気がします
変更すると,確かに起きなくなりました.なるほど. 他の単語間にスペースを入れない言語でも同様の問題があるのか,というのが少し気になりますが,LuaTeX-ja での対応としてはとりあえずこれで良さそうに思います.
↑上の修正をコミットしました (commit b52131f, 9842262).
のように,ひらがな・カタカナを366文字以上続けて入力すると Segmentation fault が出ます. 間に漢字や記号などが挟まっていると(?)起こらないみたいなので,実用上は問題なさそうですが. 他の環境でも再現しますでしょうか?