chiark / gitweb /
numbered-alias-sheet: tiles
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 3 Nov 2013 23:27:07 +0000 (23:27 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 3 Nov 2013 23:27:07 +0000 (23:27 +0000)
numbered-alias-sheet

index 2305a136ca2a0955d6ee702687a79c596fc4dca1..16db545838c7cd255fd19014847d71cb064ab856 100755 (executable)
@@ -13,6 +13,7 @@ our $gapratio = 1.5;
 our $lineratio = 1;
 our $blankratio = 1;
 our @borders = (4,4);
+our @tiles = (1,2);
 
 our @lp_options = ( [ 'blank-below', 'blank-to-right', ],
                    [ 'landscape', 'portrait' ],
@@ -26,6 +27,7 @@ options:
   -f<bothfont>            set both to same font name
   -f[<numfont>[*<scale>]],[<addrfont>]  default is $fontname_num*$fontscale_num,$fontname
   -b<border>|-b<bx>x<by>  all in mm
+  -T[<xtiles>x]<ytiles>   default is $tiles[0]x$tiles[1]
   -g<gapratio>            number-to-addr gap adjustment
   -l<lineratio>           inter-line space ("leading") adjustment factor
   -b<blankratio>          (blank space size) / (text size)
@@ -96,6 +98,9 @@ for (;;) {
            $gapratio = $1;
        } elsif (s/^-b($dbl_re)$//o) {
            $blankratio = $1;
+       } elsif (s/^-T(?:(\d+)x)(\d+)?$//o) {
+           $tiles[0] = $1 || 1;
+           $tiles[1] = $2;
        } elsif (s/^-D/-/) {
            open DEBUG, ">&STDERR" or die $!;
        } else {
@@ -132,6 +137,7 @@ if (!@paperpts) {
 
 our @strings;
 our $domain_suffix;
+our $pertile;
 
 sub readstrings () {
     my $nlen = 0;
@@ -154,6 +160,8 @@ sub readstrings () {
            $_->[1] =~ s/$dom_re//o foreach @strings;
        }
     }
+
+    $pertile = ceil(@strings / ($tiles[0] * $tiles[1]));
 }
 
 our @lp_values;
@@ -300,7 +308,7 @@ sub do_layout_recursive_search ($) {
 
     my $laycountshow = "$lp_y{0} $lp_y{1}";
 
-    $lp_y{0} * $lp_y{1} >= @strings
+    $lp_y{0} * $lp_y{1} >= $pertile
        or return wontfit "layout fits too few $laycountshow";
 
     print DEBUG " OK $laycountshow\n";
@@ -363,8 +371,8 @@ sub determine_size_layout () {
 
 sub prf { printf @_ or die $!; }
 
-sub write_output () {
-    prf "%%!\n";
+sub write_output_tile ($) {
+    my ($tile_string_off) = @_;
     my @cnr;
     my $c;
     prf "gsave\n";
@@ -387,7 +395,7 @@ sub write_output () {
        prf "90 rotate\n";
        prf "0 %s translate\n", -$eff_paper_size[1];
     }
-    my $rows = ceil(@strings / $lp_y->{0});
+    my $rows = ceil($pertile / $lp_y->{0});
     my @cell_size;
 
     $cell_size[0] = ($eff_paper_size[0] + $colgap_width) / $lp_y->{0};
@@ -412,7 +420,7 @@ sub write_output () {
                prf "stroke\n";
            }
            foreach my $row (0..$rows-1) {
-               my $se = $strings[$col*$rows + $row];
+               my $se = $strings[$col*$rows + $row + $tile_string_off];
                next unless $se;
                prf "newpath ";
                prf "%s ", $col_lhs 
@@ -439,6 +447,22 @@ sub write_output () {
     prf "grestore\n";
 }
 
+sub write_output () {
+    prf "%%!\n";
+    my @tile;
+    for ($tile[0]=0; $tile[0]<$tiles[0]; $tile[0]++) {
+       for ($tile[1]=0; $tile[1]<$tiles[1]; $tile[1]++) {
+           prf "%% tile @tile\n";
+           prf "gsave\n";
+           prf "%s ", $tile[$_] * $paperpts[$_] foreach qw(0 1);
+           prf "translate\n";
+           write_output_tile($tile[0] * $pertile + 
+                             $tile[1] * $pertile * $tiles[0]);
+           prf "grestore\n";
+       }
+    }
+}
+
 readstrings();
 prepare_metrics();
 determine_size_layout();