Wann hat ein Klebeknoten in LuaTeX den Typ „xspaceskip“?

Wann hat ein Klebeknoten in LuaTeX den Typ „xspaceskip“?

Ich verwende TeX Live 2017 und dieaktuelle Luatex-Dokumentation von Glue Nodesbesagt, dass das subtypeFeld eines Klebeknotens die folgenden möglichen Werte hat:

0 = Benutzer überspringen, 1 = Linie überspringen, 2 = Grundlinie überspringen, 3 = Teil überspringen, 4 = Anzeige überspringen, 5 = Anzeige unterspringen, 6 = Anzeige überspringen kurz, 7 = Anzeige unterspringen kurz, 8 = Links überspringen, 9 = Rechts überspringen, 10 = Oben überspringen, 11 = Oben teilen, 12 = Tabulator überspringen, 13 = Leerzeichen überspringen, 14 = xLeerzeichen überspringen, 15 = Teilfüllung überspringen, 16 = Mathematik überspringen, 17 = Dünne Linie überspringen, 18 = Mittlere Linie überspringen, 19 = Dicke Linie überspringen, 98 = Bedingte Mathematik überspringen, 99 = Muglue, 100 = Leader, 101 = Cleader, 102 = XLeader, 103 = GLeader

Ich wollte etwas über LuaTeX lernen und habe den folgenden einfachen Code geschrieben, um zu jedem Absatz eine informative Ausgabe auszugeben:

\documentclass{article}
\directlua{dofile("parinfo.lua")}
\begin{document}

Word1, word2 office. Word3. End.
\end{document}

wo parinfo.luaist:

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

Wenn die .texDatei also mit kompiliert wird lualatex, erhalten wir eine Ausgabe wie:

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)

Beachten Sie, dass der Kleber nach dem Komma (der eine größere Dehnung hat) und der nach dem .(der eine größere Breite und größere Dehnung hat) immer noch beide mit dem Untertyp angezeigt werden spaceskip, statt mit xspaceskip. (Der Kleber am Ende des Absatzes hat, wie erwartet, den Untertyp parfillskip.)

Ist das zu erwarten? Wann würden wir einen Kleber vom Typ sehen xspaceskip? Und gibt es im pre_linebreak-Filter eine alternative Möglichkeit, den größeren Kleber zu erkennen, der auf die Interpunktion oder das Satzende (mit \nonfrenchspacing) folgt, außer beispielsweise den kürzlich gesehenen Kleber zwischen Wörtern zu verfolgen und auf Unterschiede zu vergleichen?

Ich verstehe die Funktionsweise dieser Funktionen nicht einmal für Nicht-LuaTeX, daher bin ich möglicherweise nur verwirrt :-) Falls es wichtig ist, luatex --versionsagt

Dies ist LuaTeX, Version 1.0.4 (TeX Live 2017)

Antwort1

wenn Sie\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

verwandte Informationen