#!/bin/sh
#    well sh must be bash (or remove "function")
#
# writing dvi files to a A5 booklet
# using ljet3 ghostscript driver:
# uses resolution  300x300 
# (C) 1995-2003 Frank Damgaard / frank(a)sslug.dk / frda(a)post3.tele.dk
# in public domain (use artistic license)

# Requires  gawk, pstops from psutils and ghostscript

PDEV=ljet3
OUT="|lpr -v"
# tempdir for temporary files (They may not be removed after use!)
tmp=/tmp

if [ "$PRINTER" = "lpm" ] ; then
  export PRINTER=lp
fi

function errmsg ()
{
   for v in  "$@"
   do
	echo $v	
   done
   echo "usage:   $progname {options} file"
   echo "         -nb|-a5 singlesided, no booklet, only A4->A5 reduce"
   echo "         -n |-np add page numbers"
   echo "         -tvg4   tv-guide format:  4 pages to booklet"
   echo "         -tvj3   jtv format:  3 pages to booklet"
   echo "         -r+|+r  temporary files are removed"
   echo "         -r-|-r  temporary files are not removed"
   echo "         -t path use 'path' to place temporary files"
   echo "         -ps|-p  input is postscript file"
   echo "         -dvi    input is dvi file"
   echo "         (-ps/-dvi only nescesary if file doesn't end on .ps/.dvi)"
   echo "         -nopr   don't print files"
   exit 1  
}
function remove ()
{
 if [ $dorm = 1 ] ; then
   for v in  "$@"
   do
      if [ -e $v ] ; then
       rm $v
      fi
   done
 fi
}

function getext ()
{
   ext=`echo $1 | /bin/sed 's/^.\+\.//g'`
   name=`echo $1 | /bin/sed 's/\.[^\.]\+$//'`
   case $ext in   
	ps|PS)   dodvi=0;;
	dvi|DVI) dodvi=1;;
   esac
   #echo $1 "->" $name $ext "($dodvi)"
}

function addpage() 
{
# use awk og Gnuawk:
 gawk  '
BEGIN { 
page=0;
if ( skip == "") skip=1;
skipcnt=skip;
printf ("skip %d\n",skipcnt) >> "/dev/stderr"
}

/^showpage/  {
#   printf ("file %s\n",FILENAME) >> "/dev/stderr"
#   print "/Times-Bold findfont 12 scalefont setfont"
#   print "150 780 moveto"
#   print "( >> ",FILENAME," << ) show"
 if (--skipcnt == 0) {
   print "/Times-BoldItalic findfont 10 scalefont setfont"
   if ( page % 2 == 1 ) print "500 20 moveto"
   else print "50 20 moveto"
   print "(page ",++page,")  show"
   skipcnt=skip;
 }
 print ;
 next ;
}

{  print ; }

END {
}
' "$1"
}

function do_ps2pg ()
{
  if [ $pgno -ge 0 ] ; then
    infl="$pstmpfl"
    # awk -f "$pathname"addpage.awk
    addpage  "$inpfl" > "$infl"
  else
    infl="$inpfl"
  fi
  if [ "$1" = "0" ] ; then
    pstops -pa4 "2:0L@.7(21cm,1cm)+1L@.7(21cm,15.2cm)" $infl $ps1fl
  else
    if [ 1 = 0 ] ; then
      pstops -pa4 "4:-3L@.7(21cm,0.3cm)+0L@.7(21cm,15.6cm)" $infl $ps1fl
      pstops -pa4  "4:1L@.7(21cm,0.3cm)+-2L@.7(21cm,15.6cm)" $infl $ps2fl
    else
      pstops -pa4 "4:-3L@.7(21cm,-0.1cm)+0L@.7(21cm,14.8cm)" $infl $ps1fl
      pstops -pa4  "4:1L@.7(21cm,-0.1cm)+-2L@.7(21cm,14.8cm)" $infl $ps2fl
    fi
  fi
}

function do_ps4pg ()
{
  Pa=".68"
  if [ 1 = 0 ] ; then
	Pa1="20cm,-0.6cm"
	Pa2="20cm,6.2cm"
	Pa3="20cm,14.2cm"
	Pa4="20cm,21.2cm"
  else
	Pa1="20cm,-0.6cm"
	Pa2="20cm,6.2cm"
  	Pa3="20cm,14.2cm"
  	Pa4="20cm,21.2cm"
  fi

  Pb=$Pa
  Pb1=$Pa1
  Pb2=$Pa2
  Pb3=$Pa3
  Pb4=$Pa4

  if [ $pgno -ge 0 ] ; then
    infl=$pstmpfl
    awk -f "$pathname"addpage.awk $inpfl > $infl
  else
    infl=$inpfl
  fi

  if [ "$1" = "0" ] ; then
    pstops -pa4 "4:0L@$Pa($Pa1)+1L@$Pa($Pa2)+2L@$Pa($Pa3)+3L@$Pa($Pa4)" $infl $ps1fl
  else
    pstops -pa4 "8:-6L@$Pa($Pa1)+-7L@$Pa($Pa2)+0L@$Pa($Pa3)+1L@$Pa($Pa4)" $infl $ps1fl
    pstops -pa4 "8:2L@$Pb($Pb1)+3L@$Pb($Pb2)+-4L@$Pb($Pb3)+-5L@$Pb($Pb4)" $infl $ps2fl
  fi
}

dbg=0
dodvi=1
bk=1
dorm=1
nopr=0
tvg4=0
pgno=-1;
unset inpfl
if [ "$GS" = "" ] ; then
  GS=/usr/bin/gs
fi
progname=`echo $0 | sed 's#^.*/##'`
pathname=`echo $0 | sed 's#[^/]*$##'`

while [ "$1" != "" ] ; do
  case $1 in
   -p|-ps|--ps  ) dodvi=0;;
   -d|-dvi|--dvi  ) dodvi=1;;
   -r+|+r) dorm=1;;
   -r-|-r) dorm=0;; 
   -nb|-a5) bk=0;;
   -n|-np) pgno=1;;
   -tvg4) tvg4=1;;
   -d|--debug) dbg=1 ;;
   -t)  shift
	tmp=$1
	if [ ! -d $tmp ] ; then
	  errmsg "$progname:  $tmp is not at directory"
	fi
	;;
   -nopr)
	nopr=1; dorm=0;
	;;
   -*|+*)  errmsg "$progname: error in args" 
	;;

   *)   inpfl=$1
	getext $inpfl
	dogz=0
	case $ext in
	  gz|GZ)   dogz=1
 		   #echo $inpfl $nogz
		   ;;
	esac
  esac
  shift
done

if [ "$inpfl" = "" ] ; then
  errmsg "$progname:  no inputfile"
fi
if [ ! -r $inpfl ] ; then
  errmsg "$progname:  cannot read file: $inpfl"
fi
if [ $dogz = 1 ] ; then
   gunzip $inpfl
   inpfl=$name
   getext $name
fi

psfl=$tmp/$inpfl.ps
pstmpfl=$psfl.tmp.ps
ps1fl=$tmp/$inpfl.1.ps
ps2fl=$tmp/$inpfl.2.ps
if [ $dodvi = 1 ] ; then
#use dvips to scale output (-x800) :
  dvips -x800 -o$psfl $inpfl
  if [ $bk = 1 ] ; then
    pstops "4:-3L(27.8cm,-1.5cm)+0L(27.8cm,13.3cm)" $psfl $ps1fl
    pstops "4:1L(27.8cm,-1.5cm)+-2L(27.8cm,13.3cm)" $psfl $ps2fl
  else
    pstops "2:0L(27.8cm,-1.5cm)+-1L(27.8cm,13.3cm)" $psfl $ps1fl
  fi
  remove $psfl
else
   if [ $tvg4 = 1 ] ; then
    do_ps4pg $bk
   else
    do_ps2pg $bk
   fi
fi


if [ $dogz = 1 ] ; then
  gzip -9 $inpfl &
fi

echo Printing front pages
GSOPT="-dNOPAUSE -sPAPERSIZE=a4 -sDEVICE=$PDEV -q"

if [ $nopr = 1 ] ; then
  echo $GS $GSOPT -sOutputFile="$OUT" ' - < ' $ps1fl
else
  $GS $GSOPT -sOutputFile="$OUT" - < $ps1fl
fi
remove $ps1fl $pstmpfl

if [ ! $bk = 0 ] ; then
  if [ $nopr = 0 ] ; then
    echo Pausing. When front pages are finished, reinsert paper, 
    echo to print the back pages.
    echo -n "Press [Enter] to continue "
    read
    echo Printing back pages
  fi

  if [ $nopr = 1 ] ; then
    echo $GS $GSOPT -sOutputFile="$OUT" '- <' $ps2fl
  else 
    $GS $GSOPT -sOutputFile="$OUT" - < $ps2fl
  fi
  remove $ps2fl  $pstmpfl
fi
