ムウェ
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