#!/usr/bin/perl # -*- perl -*- my $version_banner = < sub { $signature = $_[1]; usage(1) if $signature > 1 && $signature % 4 != 0; }, "quiet|q" => sub { push @pstops_args, "-q"; }, "help" => \$help_flag, "version" => \$version_flag, ) or usage(1); if ($version_flag) { print STDERR $version_banner; exit 0; } usage(0) if $help_flag; Die("signature must be a multiple of 4") if $signature > 1 && $signature % 4 != 0; my ($infile, $outfile) = setup_input_and_output(1); usage(1) if $#ARGV != -1; # Check no more arguments were given # Get number of pages my $psinfo = parse_file($infile); my $input_pages = $psinfo->{pages}; sub page_index_to_real_page { my ($maxpage, $signature, $page_number) = @_; my $real_page = $page_number - $page_number % $signature; my $page_on_sheet = $page_number % 4; my $recto_verso = int(($page_number % $signature) / 2); if ($page_on_sheet == 0 || $page_on_sheet == 3) { $real_page += $signature - 1 - $recto_verso; } else { $real_page += $recto_verso; } return $real_page + 1; } # Adjust for signature size my $maxpage; if ($signature == 0) { $signature = $maxpage = $input_pages + (4 - $input_pages % 4) % 4; } else { $maxpage = $input_pages + ($signature - $input_pages % $signature) % $signature; } # Compute page list my @page_list = (); for (my $page = 0; $page < $maxpage; $page++) { my $real_page = page_index_to_real_page($maxpage, $signature, $page); push @page_list, $real_page <= $input_pages ? $real_page : "_"; } # Rearrange pages exec("pstops", "-R" . join(',', @page_list), @pstops_args, @ARGV) or Die("error running pstops");