1 ----------------------------------------------------------------------
3 ----------------------------------------------------------------------
6 about = [[ An Ipelet for printing customizable pagenumbers to the pages. ]]
8 local prefix = "pagenumbers"
9 local format_layer = prefix .. "_format"
10 local pagenr_layer = prefix .. "_page"
11 local dont_count_layer = prefix .. "_dont_count"
13 local page_wildcard = "%[page%]" -- ignore the %
15 ----------------------------------------------------------------------
16 -- adding page numbers before every run of latex ---------------------
18 -- saving the old function
19 function _G.MODEL:pagenumbers_backup_runLatex() end
20 _G.MODEL.pagenumbers_backup_runLatex = _G.MODEL.runLatex
22 function _G.MODEL:runLatex()
23 refresh_pagenumbers(self)
24 return self:pagenumbers_backup_runLatex()
28 ----------------------------------------------------------------------
29 -- refresh the page numbers ------------------------------------------
31 function refresh_pagenumbers(model)
32 -- first find the pagenumber objects that should be printed on
34 local pagenr_objects = find_pagenr_objects(model)
36 -- if something was found, print the page numbers on every page
37 if #pagenr_objects > 0 then
38 -- using the undo-redo construct although there is nothing to
39 -- undo (otherwise, the view does not refresh correctly)
40 local t = { label = "refresh pagenumbers (not undoable)",
42 t.redo = function (t, doc)
43 print_on_every_page(t.model, pagenr_objects)
45 t.undo = function (t, doc)
49 print_on_every_page(model, pagenr_objects)
53 ----------------------------------------------------------------------
54 -- find pagenumber objects -------------------------------------------
56 function find_pagenr_objects(model)
59 for i, obj, sel, layer in p1:objects() do
60 -- find layer called format_layer
61 if layer == format_layer then
62 if obj:type() == "text" then
71 ----------------------------------------------------------------------
72 -- print given pagenumber objects on every page ----------------------
74 function print_on_every_page(model, pagenr_objects)
77 -- first create the clones
78 -- print "create clones"
82 for j, obj in ipairs(pagenr_objects) do
83 clone_objs[j] = obj:clone()
84 -- print (i, j, clone_objs[j])
86 clones[i] = clone_objs
89 -- then add the clones
92 -- print("get page", i)
95 -- increase the pagenr, if the current page does not contain the
97 if not page_has_layer(p, dont_count_layer) then
101 -- if the layer does not exists, create it
102 -- print "create layer"
103 if not page_has_layer(p, pagenr_layer) then
104 p:addLayer(pagenr_layer)
105 make_layer_visible(p, pagenr_layer)
109 p:setLocked(pagenr_layer, true)
111 -- remove all objects from the layer
112 clear_layer(p, pagenr_layer)
114 -- add the pagenumbers to the layer
115 -- print "add pagenumbers"
116 for j = 1, #pagenr_objects do
117 -- print (i, j, clones[i][j])
118 -- print(string.gsub(clones[i][j]:text(), page_wildcard, pagenr))
119 local repl_text = clones[i][j]:text():gsub(page_wildcard, pagenr)
120 clones[i][j]:setText(repl_text)
121 p:insert(nil, clones[i][j], nil, pagenr_layer)
126 ----------------------------------------------------------------------
127 -- some helper function ----------------------------------------------
129 -- make a layer visible on all vies of a page
130 function make_layer_visible(p, layer)
131 for i = 1, p:countViews() do
132 p:setVisible(i, layer, true)
136 -- remove all objects in a given layer
137 function clear_layer(p, layer)
140 if p:layerOf(i) == layer then
148 -- returns true if and only if the page p contains the given layer
149 function page_has_layer(p, layer)
150 for _, layer_ in ipairs(p:layers()) do
151 if layer == layer_ then
158 ----------------------------------------------------------------------
159 -- show some message if someone clicks in the iplet menu -------------
161 ipeui.messageBox(nil,
163 "Nothing to do here.",
164 [[Information on how to use this ipelet can be found in the Ipe Wiki.
165 (https://github.com/otfried/ipelets/tree/master/pagenumbers)
170 ----------------------------------------------------------------------