[luatex] FYI: my experiments on tex.shipout() and links
Paul Isambert
zappathustra at free.fr
Thu Jun 30 13:06:45 CEST 2011
Le 30/06/2011 12:57, Patrick Gundlach a écrit :
> Just in case someone is interested in my experiments with tex.shipout and the pdf_dest, pdf_start_link nodes, here is a simple example. Not clever, but you get the point.
Patrick, LuaTeX is supposed to put an end to dirty tricks :)
It's nice anyway. Some comment in your code.
> test.tex:
> -------------------
> \directlua{dofile("mknodes.lua")}
> \end
> -------------------
>
> mknodes.lua:
> -------------------
> local tenpt = 10 * 2^16
>
> function add_to_page( list )
> local tail = node.tail(global_pagebox)
> tail.next = list
> list.prev = tail
> end
>
> function new_page()
> global_pagebox = node.new("vlist")
> end
You could make global_pagebox local. Actually you could make do without
new_page(), with add_to_page() initializing global_pagebox if nil.
> function shipout()
> local x = node.vpack(global_pagebox)
> tex.box[666] = x
> tex.shipout(666)
> end
>
> function mkrule( size )
> local r = node.new("rule")
> r.width = size * 2
> r.height = size
> r.depth = size
> return r
> end
> function mkdest()
> local d = node.new("whatsit","pdf_dest")
> d.named_id = 0
> d.dest_id = 1
> d.dest_type = 3
> return d
> end
You have to give a different id to all dest, otherwise TeX will complain.
> new_page()
>
> add_to_page(mkdest())
> add_to_page(mkrule(tenpt))
> add_to_page(mkrule(2 * tenpt))
> add_to_page(mkrule(tenpt))
>
> shipout()
> new_page()
>
> local start_link = node.new("whatsit","pdf_start_link")
> local end_link = node.new("whatsit","pdf_end_link")
> local action = node.new("action")
>
> action.action_type = 1
> action.action_id = 1
>
> start_link.width = 2 * tenpt
> start_link.height = tenpt
> start_link.depth = tenpt
> start_link.action = action
> start_link.link_attr = "/C [0.9 1 0] /Border [0 0 2]"
Oh no, no border on links, please!
Best,
Paul
More information about the luatex
mailing list