node.write()를 사용하여 직접 노드를 빌드할 때 다중 페이지 출력 문제

node.write()를 사용하여 직접 노드를 빌드할 때 다중 페이지 출력 문제

MWE

mwe.tex

\directlua{tex.enableprimitives('',tex.extraprimitives())}
\output={\shipout\box255}
\pagewidth=210mm
\pageheight=2in
\hoffset=1in
\voffset=1in
\directlua{dofile("mwe.lua")}
\end

mwe.lua

tex.outputmode = 1

-- Build a simple paragraph node from given text. This code does not do any complex shaping etc.
--
-- adapted from: http://tex.stackexchange.com/questions/114568/can-i-create-a-node-list-from-some-text-entirely-within-lua
local function text_to_paragraph(text)
  local current_font = font.current()
  local font_params = font.getfont(current_font).parameters

  local para_head = node.new("local_par")

  local last = para_head

  local indent = node.new("hlist",3)
  indent.width = tex.parindent
  indent.dir = "TRT"
  last.next = indent
  last = indent

  for c in text:gmatch"." do  -- FIXME use utf8 lib
    local v = string.byte(c)
    local n
    if v < 32 then
      goto skipchar
    elseif v == 32 then
      n = node.new("glue",13)
      node.setglue(n, font_params.space, font_params.space_shrink, font_params.space_stretch)
    else
      n = node.new("glyph", 1)
      n.font = current_font
      n.char = v
      n.lang = tex.language
      n.uchyph = 1
      n.left = tex.lefthyphenmin
      n.right = tex.righthyphenmin
    end
    last.next = n
    last = n
    ::skipchar::
  end

  -- now add the final parts: a penalty and the parfillskip glue
  local penalty = node.new("penalty", 0)
  penalty.penalty = 10000

  local parfillskip = node.new("glue", 14)
  parfillskip.stretch = 2^16
  parfillskip.stretch_order = 2

  last.next = penalty
  penalty.next = parfillskip

  node.slide(para_head)
  return para_head
end

local content = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."

for i = 1,3 do
  local head = text_to_paragraph(content)
  -- Break the paragraph into vertically stacked boxes
  local vbox = tex.linebreak(head, { hsize = tex.hsize })
  node.write(vbox)
  node.write(node.copy(tex.parskip))
  node.write(node.copy(tex.baselineskip))
  print("PAGE TOTAL " .. tex.pagetotal)
end

산출

잘리니까 참고하세요. 페이지 나누기가 발생하고 나머지 콘텐츠는 다음 페이지로 이동될 것으로 예상했습니다.

나쁜 출력

메모/질문

아이디어는 완전히 Lua에서 단락 노드를 생성하고 node.write().

  • 다음을 수행하여 Plain TeX 출력 루틴을 기본 출력 루틴으로 재정의합니다.\output={\shipout\box255}

  • 매개 tex.pagetotal변수가 자동으로 증가하지 않는 것 같습니다. 그것이 문제의 일부인지 확실하지 않습니다

  • 이를 수행하는 또 다른 방법은 전체 상자를 자체적으로 채우고 를 사용하여 배송하는 것입니다 tex.shipout. 그러나 저는 TeX 내부에서 페이지 작성 루틴을 실행하여 페이지를 올바른 위치에서 나누는 대신에 페이지를 나누기를 바랐습니다. 소유하다.

이 문제를 어떻게 해결할 수 있나요?

답변1

알고 보니 그것은 내 입장에서는 꽤 어리석은 실수였습니다. 를 조정하고 있었을 뿐입니다 \pageheight. 사용된 매개 \vsize변수는 Plain TeX 매크로(8.9in)에 설정된 매개변수였습니다. 의 크기를 \vsize보다 약간 작게 변경하면 \pageheight문제가 잘 작동합니다.

\directlua{tex.enableprimitives('',tex.extraprimitives())}
\output={\shipout\box255}
\pagewidth=210mm
\pageheight=2in
\vsize=1in
\hoffset=1in
\voffset=1in
\directlua{dofile("mwe.lua")}
\end

관련 정보