私はTeX Live 2017を使用していますが、グルーノードの現在の luatex ドキュメントsubtype
グルーノードのフィールドには次の値がある可能性があることを示しています。
0 = ユーザースキップ、1 = ラインスキップ、2 = ベースラインスキップ、3 = パースキップ、4 = アバブディスプレイスキップ、5 = ブローズディスプレイスキップ、6 = アバブディスプレイショートスキップ、7 = ブローズディスプレイショートスキップ、8 = 左スキップ、9 = 右スキップ、10 = トップスキップ、11 = スプリットトップスキップ、12 = タブスキップ、13 = スペーススキップ、14 = x スペーススキップ、15 = パーフィルスキップ、16 = 数学スキップ、17 = シンマススキップ、18 = メッドマススキップ、19 = シックマススキップ、98 = 条件付き数学スキップ、99 = muglue、100 = リーダー、101 = リーダー、102 = x リーダー、103 = リーダー
私は LuaTeX について学ぼうとしていて、各段落に関する情報を出力するために次の簡単なコードを書きました。
\documentclass{article}
\directlua{dofile("parinfo.lua")}
\begin{document}
Word1, word2 office. Word3. End.
\end{document}
どこparinfo.lua
ですか:
function traverse_paragraph(head)
while head do
print(string.format('In paragraph: %s %s', node.type(head.id), debugstr_node(head)))
head = head.next
end
return true
end
luatexbase.add_to_callback('pre_linebreak_filter', traverse_paragraph, 'Info for debugging')
function debugstr_node(n)
if node.type(n.id) == "glue" then
return debugstr_glue(n)
elseif node.type(n.id) == "glyph" then
return n.char < 128 and string.char(n.char) or string.format('[char %s]', n.char)
elseif node.type(n.id) == "kern" then
return string.format('%s', n.kern)
elseif node.type(n.id) == "penalty" then
return string.format('%s', n.penalty)
else
return ''
end
end
function debugstr_glue(n)
if n.subtype == 13 then
subtype = 'spaceskip'
elseif n.subtype == 14 then
subtype = 'xspaceskip'
elseif n.subtype == 15 then
subtype = 'parfillskip'
else
subtype = '' .. n.subtype
end
return string.format('<%s: %s plus %s(%s) minus %s(%s)', subtype, n.width, n.stretch, n.stretch_order, n.shrink, n.shrink_order)
end
したがって、.tex
ファイルを でコンパイルするとlualatex
、次のような出力が得られます。
In paragraph: local_par
In paragraph: hlist
In paragraph: glyph W
In paragraph: kern -54395
In paragraph: glyph o
In paragraph: glyph r
In paragraph: glyph d
In paragraph: glyph 1
In paragraph: glyph ,
In paragraph: glue <spaceskip: 218235 plus 136396(0) minus 58196(0)
In paragraph: glyph w
In paragraph: kern -18350
In paragraph: glyph o
In paragraph: glyph r
In paragraph: glyph d
In paragraph: glyph 2
In paragraph: glue <spaceskip: 218235 plus 109117(0) minus 72745(0)
In paragraph: glyph o
In paragraph: glyph [char 64259]
In paragraph: glyph c
In paragraph: glyph e
In paragraph: glyph .
In paragraph: glue <spaceskip: 290980 plus 327351(0) minus 24248(0)
In paragraph: glyph W
In paragraph: kern -54395
In paragraph: glyph o
In paragraph: glyph r
In paragraph: glyph d
In paragraph: glyph 3
In paragraph: glyph .
In paragraph: glue <spaceskip: 290980 plus 327351(0) minus 24248(0)
In paragraph: glyph E
In paragraph: glyph n
In paragraph: glyph d
In paragraph: glyph .
In paragraph: penalty 10000
In paragraph: glue <parfillskip: 0 plus 65536(2) minus 0(0)
カンマの後のグルー (伸縮が大きい) と の後のグルー.
(幅が広く伸縮が大きい) は、どちらも ではspaceskip
なくサブタイプ として表示されていることに注意してくださいxspaceskip
。(段落の末尾のグルーのサブタイプはparfillskip
、予想どおり です。)
これは想定内ですか? タイプ を持つグルーはいつ見られるのでしょうxspaceskip
か? また、たとえば最近見た単語間グルーを追跡して相違点を比較する以外に、句読点または文末 ( を使用\nonfrenchspacing
) に続く大きなグルーを検出する、pre_linebreak フィルターの別の方法はありますか?
私はLuaTeX以外でもこれらの動作を完全に理解していないので、混乱しているだけかもしれません:-) 問題になる場合はluatex --version
、
これは LuaTeX バージョン 1.0.4 (TeX Live 2017) です。
答え1
設定すると\xspaceskip
\documentclass{article}
\directlua{dofile("parinfo.lua")}
\setlength\xspaceskip{10pt}
\begin{document}
Word1, word2 office. Word3. End.
\end{document}
In paragraph: glyph 3
In paragraph: glyph .
In paragraph: glue <xspaceskip: 655360 plus 0(0) minus 0(0)
In paragraph: glyph E