better page breaks
This commit is contained in:
parent
44e6909a6d
commit
7678a19ecf
1 changed files with 89 additions and 8 deletions
97
runoff
97
runoff
|
@ -16,13 +16,94 @@ files=`grep -v '^#' runoff.list | awk '{print $1}'`
|
|||
n=99
|
||||
for i in $files
|
||||
do
|
||||
awk -v 'n='$n '
|
||||
BEGIN{n=int((n+49)/50)*50-1; nb=0; nr=0}
|
||||
NF==0 { nb++; next }
|
||||
{for(i=0; i<nb; i++) printf("%04d\n", n+ ++nr); nb=0; printf("%04d %s\n", n+ ++nr, $0)}
|
||||
END{for(nr++; nr%50 != 1; nr++) printf("%04d\n", n+nr);}
|
||||
' $i >fmt/$i
|
||||
n=`tail -1 fmt/$i | awk '{print $1}'`
|
||||
perl -e '$n='$n';' -e '
|
||||
$n = int(($n+49)/50)*50 - 1;
|
||||
|
||||
@lines = <>;
|
||||
foreach (@lines) {
|
||||
chomp;
|
||||
s/\s+$//;
|
||||
if(length() >= 75){
|
||||
print "$ARGV[0]:$.: line too long";
|
||||
}
|
||||
}
|
||||
@outlines = ();
|
||||
$nextout = 0;
|
||||
for($i=0; $i<@lines; ){
|
||||
# Skip leading blank lines.
|
||||
$i++ while $i<@lines && $lines[$i] =~ /^$/;
|
||||
last if $i>=@lines;
|
||||
|
||||
# If the rest of the file fits, use the whole thing.
|
||||
if(@lines <= $i+50){
|
||||
$breakbefore = @lines;
|
||||
}else{
|
||||
# Find a good next page break;
|
||||
# Hope for end of function.
|
||||
# but settle for a blank line (but not first blank line
|
||||
# in function, which comes after variable declarations).
|
||||
$breakbefore = $i;
|
||||
$lastblank = $i;
|
||||
$sawbrace = 0;
|
||||
$breaksize = 15; # 15 lines to get to function
|
||||
for($j=$i; $j<$i+50 && $j < @lines; $j++){
|
||||
if($lines[$j] =~ /PAGEBREAK:\s*([0-9]+)/){
|
||||
$breaksize = int($2);
|
||||
$breakbefore = $j;
|
||||
$lines[$j] = "";
|
||||
}
|
||||
if($lines[$j] =~ /^}$/){
|
||||
$breakbefore = $j+1;
|
||||
}
|
||||
if($lines[$j] =~ /^{$/){
|
||||
$sawbrace = 1;
|
||||
}
|
||||
if($lines[$j] =~ /^$/){
|
||||
if($sawbrace){
|
||||
$sawbrace = 0;
|
||||
}else{
|
||||
$lastblank = $j;
|
||||
}
|
||||
}
|
||||
}
|
||||
if($j<@lines && $lines[$j] =~ /^$/){
|
||||
$lastblank = $j;
|
||||
}
|
||||
|
||||
# If we are not putting enough on a page, try a blank line.
|
||||
if($breakbefore - $i < 50 - $breaksize && $lastblank > $breakbefore && $lastblank >= $i+50 - 5){
|
||||
$breakbefore = $lastblank;
|
||||
$breaksize = 5; # only 5 lines to get to blank line
|
||||
}
|
||||
|
||||
# If we are not putting enough on a page, force a full page.
|
||||
if($breakbefore - $i < 50 - $breaksize && $breakbefore != @lines){
|
||||
$breakbefore = $i + 50;
|
||||
$breakbefore = @lines if @lines < $breakbefore;
|
||||
}
|
||||
|
||||
if($breakbefore < $i+2){
|
||||
$breakbefore = $i+2;
|
||||
}
|
||||
}
|
||||
|
||||
# Emit the page.
|
||||
$i50 = $i + 50;
|
||||
for(; $i<$breakbefore; $i++){
|
||||
printf "%04d %s\n", ++$n, $lines[$i];
|
||||
}
|
||||
|
||||
# Finish page
|
||||
for($j=$i; $j<$i50; $j++){
|
||||
printf "%04d \n", ++$n;
|
||||
}
|
||||
}
|
||||
' $i >fmt/$i
|
||||
|
||||
nn=`tail -1 fmt/$i | sed 's/ .*//; s/^0*//'`
|
||||
if [ "x$nn" != x ]; then
|
||||
n=$nn
|
||||
fi
|
||||
done
|
||||
|
||||
# create table of contents
|
||||
|
@ -117,7 +198,7 @@ awk '
|
|||
# format the whole thing
|
||||
(
|
||||
pr -l60 -e8 README
|
||||
pr -l60 -e8 -2 toc
|
||||
pr -l60 -h "table of contents" -e8 -2 toc
|
||||
pr -l60 -h "definitions" -2 t.defs | pad
|
||||
pr -l60 -h "cross-references" -2 refs | pad
|
||||
for i in $files
|
||||
|
|
Loading…
Reference in a new issue