Проблемы с многостраничным выводом при построении узлов напрямую с помощью node.write()

Проблемы с многостраничным выводом при построении узлов напрямую с помощью node.write()

МВЭ

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 и передавать их в LuaTeX с помощью node.write().

  • Я переопределяю процедуру вывода Plain TeX на процедуру вывода по умолчанию, выполнив следующее:\output={\shipout\box255}

  • Параметр tex.pagetotal, похоже, не увеличивается автоматически. Не уверен, что это часть проблемы

  • Думаю, другой способ сделать это — заполнить всю коробку самостоятельно и отправить ее с помощью tex.shipout, но я надеялся применить процедуры построения страницы внутри TeX, чтобы разбить страницу в нужном месте, вместо того, чтобы делать это самостоятельно.

Как я могу это исправить?

решение1

Оказывается, это довольно глупая оплошность с моей стороны. Я только настраивал \pageheight. \vsizeИспользуемый параметр был установлен в макросе Plain TeX (который равен 8.9 дюйма). Если я изменю размер на \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

Связанный контент