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

ルア

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パラメータは、Plain TeX マクロで設定されたもの (8.9 インチ) でした。 のサイズを より少し小さく\vsize変更すると、問題なく動作します。\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

関連情報