ntg-context - mailing list for ConTeXt users
 help / color / mirror / Atom feed
From: Hans Hagen <j.hagen@xs4all.nl>
To: mailing list for ConTeXt users <ntg-context@ntg.nl>
Subject: Re: page ranges in \markpage
Date: Fri, 20 Jul 2018 00:19:03 +0200	[thread overview]
Message-ID: <57f6d55e-a471-9c37-3eb4-2368868e8d29@xs4all.nl> (raw)
In-Reply-To: <1ee0ec6d-9f38-fc47-eb89-8ce73b806047@gmx.es>

On 7/19/2018 9:56 PM, Pablo Rodriguez wrote:
> On 07/18/2018 09:08 PM, Wolfgang Schuster wrote:
>>
>> [...]
>> Afterwards you can use a loop where you add the markpage commands at
>> the begin and end of the range, below is a simple example but it’s easy
>> to write a better loop with Lua.
>>
>> \setuplayout[page]
>> \setupinteraction[state=start]
>> \setupinteractionscreen[option={portrait, paper}, print=pages]
>> \starttext
>> \getfiguredimensions[i-context.pdf]
>> \dostepwiserecurse{1}{99}{1}{\externalfigure[i-context.pdf][height=\textheight,page=\recurselevel]}
>> \startmarkpages[page]
>> \dostepwiserecurse{100}{300}{1}{\externalfigure[i-context.pdf][height=\textheight,page=\recurselevel]}
>> \stopmarkpages
>> \dostepwiserecurse{301}{\noffigurepages}{1}{\externalfigure[i-context.pdf][height=\textheight,page=\recurselevel]}
>> \stoptext
> 
> Wolfgang
> 
> a different approach would be (code was mainly provided by anoter person):
> 
>      \startluacode
>      function document.splitarray(inputstr, sep)
>        local t={}
>        for str in inputstr:gmatch("([^"..sep.."]+)") do
>          table.insert(t, str)
>        end
>        return t
>      end
> 
>      function document.getpagearray(page_ranges)
>        local page_array={}
>        local ranges = document.splitarray(page_ranges, ",")
>        for _, pp in ipairs(ranges) do
>          if string.find(pp, "-") then
>            aux = document.splitarray(pp, "-")
>            for i=tonumber(aux[1]), tonumber(aux[2]), 1 do
>              table.insert(page_array, i)
>            end
>          else
>             table.insert(page_array, tonumber(pp))
>          end
>        end
>        return page_array
>      end
> 
>      function document.printmarkedpageranges(tag, page_ranges)
>        page_array = document.getpagearray(page_ranges)
>        context("\\markpage[" .. tag .. "][" ..
>            table.concat(page_array, ", ") .. "]")
>      end
>      \stopluacode
> 
>      \def\getmarkedpageranges#1#2{%
>          \ctxlua{document.printmarkedpageranges("#1","#2")}}
>      \setuplayout[page]
>      \setupinteraction[state=start]
>      \setupinteractionscreen[option={portrait, paper}, print=pages]
>      \getmarkedpageranges{pages}{5, 25-30, 100-200, 235, 298, 304}
>      \starttext
>      \insertpages[i-context.pdf][width=0pt]
>      \stoptext
> 
> This makes easier to add more complex page intervals (such as the one
> above).
> 
> Before adding this to the wiki, my question would be whether it might
> not be easier to add page ranges to \markpage.

nicer code

local function getpagearray(page_ranges)
     local list   = { }
     local ranges = string.split(page_ranges, ",")
     for i=1,#ranges do
         local f = string.split(ranges[i], "-")
         for i=tonumber(f[1]), tonumber(f[2] or f[1]) do
             list[i] = true
         end
     end
     return table.sortedkeys(list)
end

inspect(getpagearray("1-5,8,12-19"))

or even better

local function getpagearray(str,max)
     local list = { }
     local function add(i)
         list[i] = true
     end
     if max then
         utilities.parsers.stepper(str,max,add)
     else
         utilities.parsers.stepper(str,add)
     end
     return table.sortedkeys(list)
end

inspect(getpagearray("1-5,8,12-19,88-",100))

and then

function document.printmarkedpageranges(tag,str)
     context.markpage({ tag }, getpagearray(str))
end

> I mean, as a standard user I think there is too much code (which may be
> improved and made part of ConTeXt) for such a simple need.
> 
> Of course, I may be missing the whole point in this issue.
> 
> I would really appreciate, if someone could explain me what is wrong in
> my assumption that \markpages need also page intervals.


-- 

-----------------------------------------------------------------
                                           Hans Hagen | PRAGMA ADE
               Ridderstraat 27 | 8061 GH Hasselt | The Netherlands
        tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl
-----------------------------------------------------------------
___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the Wiki!

maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
webpage  : http://www.pragma-ade.nl / http://context.aanhet.net
archive  : https://bitbucket.org/phg/context-mirror/commits/
wiki     : http://contextgarden.net
___________________________________________________________________________________

  reply	other threads:[~2018-07-19 22:19 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-07-18 16:19 Pablo Rodriguez
2018-07-18 17:40 ` Wolfgang Schuster
2018-07-18 18:44   ` Pablo Rodriguez
2018-07-18 19:08     ` Wolfgang Schuster
2018-07-18 19:38       ` Pablo Rodriguez
2018-07-19 19:56       ` Pablo Rodriguez
2018-07-19 22:19         ` Hans Hagen [this message]
2018-07-22 11:28           ` Pablo Rodriguez

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=57f6d55e-a471-9c37-3eb4-2368868e8d29@xs4all.nl \
    --to=j.hagen@xs4all.nl \
    --cc=ntg-context@ntg.nl \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).