#!/usr/bin/perl # Copyleft 2007 by Andreas Krumnow, andreas@krumnow.de use POSIX; my $pages,$anz_blocks,$restSeiten, $blocksize, $min_bs, $lastBlockSize, $pg_bl, $ipb; if (("" eq $ARGV[0]) || ("" eq $ARGV[1]) || ($ARGV[0] < 1) || ($ARGV[1] < 1)){ &helpme(); } $pages = $ARGV[0]; $blocksize = $ARGV[1]; $min_bs = 0; if ($ARGV[2] ne "") { $min_bs = $ARGV[2] - 1; if ($blocksize<$min_bs){ $min_bs=$blocksize; } # if ($min_bs<0){ $min_bs=0; } } $lastBlockSize=0; my $bestDiff = $blocksize-$lastBlockSize; my @tmpVal = ($blocksize, $lastBlockSize); # print "\n------------------------------------------------------------\n"; # Optimizing Blocksize ... while($min_bs<$blocksize){ $anz_blocks = floor($pages/($blocksize *4)); $restSeiten = $pages - ($anz_blocks*$blocksize *4); if ($restSeiten > 0){ $lastBlockSize = ceil($restSeiten/4); my $curDiff = $blocksize-$lastBlockSize; if ($curDiff<$bestDiff){ $bestDiff = $curDiff; @tmpVal = ( $blocksize, $lastBlockSize); } $blocksize -= 1; }else{ $blocksize = $min_bs; @tmpVal = ( $blocksize, $lastBlockSize); } } ($blocksize, $lastBlockSize) = @tmpVal; $pg_bl = $blocksize *4; $ipb = $blocksize *2; $anz_blocks = floor($pages/$pg_bl); $restSeiten = $pages - ($anz_blocks*$pg_bl); if ($restSeiten && !$lastBlockSize){ $lastBlockSize = ceil($restSeiten/4);} print "\n------------------------------------------------------------\n"; for (my $n=0;$n<$anz_blocks;$n++){ my $a = $n*$pg_bl; my $e = $a+$pg_bl; &printBlock($n,$a,$e,$ipb,0); } if ($restSeiten > 0){ print "\nletzter Block (".$lastBlockSize." Blatt):"; my $a = $anz_blocks*$pg_bl; my $e = $a+($lastBlockSize *4); &printBlock($anz_blocks,$a,$e,($lastBlockSize*2),$pages); } # print "\npages: $pages | blocksize: $blocksize"; print "\n$anz_blocks Block a $blocksize Blatt, ".$pg_bl." Seiten/Block "; print "=> ".$anz_blocks*$pg_bl."\n"; if ($restSeiten > 0){ print "1 Block a ".$lastBlockSize." Blatt, ".$restSeiten." Seiten"; } print "\n------------------------------------------------------------\n"; exit 0; sub printBlock { my ($bnr,$beg,$end,$lpb,$last) = @_; print "\nBlock ".($bnr+1).", Dokumentseite ".($beg+1)." - ".($last?$last:$end)."\n"; print "Vorderseite: "; if ($last > 0){ for (my $i=1; $i<$lpb;$i+=2){ my $s1 = $beg+$i; my $s2 = 1+$end-$i; if ( $s1 > $last) {$s1=0;} if ( $s2 > $last) {$s2=0;} print "".$s1.",".$s2." ; "; } print "\nRueckseite : "; for (my $i=2; $i<=$lpb;$i+=2){ my $s1 = $beg+$i; my $s2 = 1+$end-$i; if ( $s1 > $last) {$s1=0;} if ( $s2 > $last) {$s2=0;} print "".$s1.",".$s2." ; "; } }else{ for (my $i=1; $i<$lpb;$i+=2){ print "".$beg+$i.",".(1+$end-$i)." ; ";} print "\nRueckseite : "; for (my $i=2; $i<=$lpb;$i+=2){ print "".$beg+$i.",".(1+$end-$i)." ; ";} } print "\n"; } sub helpme{ print <<EOT; USAGE: perl $0 <Pages> <Max> [<Min>] where Pages is the number of pages in the Original Document, Max is the maximum size of pieces of paper in one block, Min is the minimum of the above. EOT exit; }