LuaTeX でグルーノードのタイプが `xspaceskip` になるのはいつですか?

LuaTeX でグルーノードのタイプが `xspaceskip` になるのはいつですか?

私は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

関連情報