LuaTeX에서 글루 노드에 `xspaceskip` 유형이 있는 경우는 언제입니까?

LuaTeX에서 글루 노드에 `xspaceskip` 유형이 있는 경우는 언제입니까?

저는 TeX Live 2017을 사용하고 있습니다.글루 노드의 현재 Luatex 문서subtype글루 노드의 필드 에는 다음과 같은 가능한 값이 있다고 말합니다 .

0 = userskip, 1 = 라인 건너뛰기, 2 = 기준선 건너뛰기, 3 = parskip, 4 = Abovedisplayskip, 5 = belowdisplayskip, 6 = Abovedisplayshortskip, 7 = belowdisplayshortskip, 8 = leftskip, 9 = rightskip, 10 = topskip, 11 = Splittopskip, 12 = tabskip, 13 = spaceskip, 14 = xspaceskip, 15 = parfillskip, 16 = mathskip, 17 = Thinmuskip, 18 = medmuskip, 19 = Thickmuskip, 98 = Conditionalmathskip, 99 = Muglue, 100 = 리더, 101 = cleaders, 102 = Xleaders, 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? 그리고 pre_linebreak 필터에서 \nonfrenchspacing최근에 본 단어 간 접착제를 추적하고 차이점을 비교하는 것 외에 구두점이나 문장 끝(with) 뒤에 오는 더 큰 접착제를 감지하는 대체 방법이 있습니까 ?

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

관련 정보