Probleme mit mehrseitiger Ausgabe beim direkten Erstellen von Knoten mit node.write()

Probleme mit mehrseitiger Ausgabe beim direkten Erstellen von Knoten mit 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

Ausgabe

Beachten Sie, dass es abgeschnitten wird. Ich hatte erwartet, dass ein Seitenumbruch erfolgt und der restliche Inhalt auf die nächste Seite verschoben wird.

schlechte Ausgabe

Anmerkungen/Fragen

Die Idee besteht darin, Absatzknoten vollständig in Lua zu erstellen und sie mithilfe von LuaTeX zuzuführen node.write().

  • Ich überschreibe die Plain-TeX-Ausgaberoutine durch die Standardausgaberoutine, indem ich Folgendes mache:\output={\shipout\box255}

  • Der tex.pagetotalParameter scheint sich nicht automatisch zu erhöhen. Ich bin nicht sicher, ob das Teil des Problems ist

  • Ich schätze, eine andere Möglichkeit besteht darin, die gesamte Box selbst zu füllen und sie mithilfe von zu versenden tex.shipout, aber ich hatte gehofft, die Seitenerstellungsroutinen in TeX anwenden zu können, um die Seite an der richtigen Stelle umzubrechen, anstatt dies selbst zu tun.

Wie kann ich das beheben?

Antwort1

Es stellte sich heraus, dass es sich um ein ziemlich dummes Versehen meinerseits handelte. Ich habe nur die angepasst \pageheight. Der \vsizeverwendete Parameter war der im Plain TeX-Makro festgelegte (8,9 Zoll). Wenn ich die Größe von \vsizeauf etwas weniger als ändere \pageheight, funktioniert alles einwandfrei.

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

verwandte Informationen