#!/bin/bash function usage () { cat < ] (ohne Extension) Dies ist booklet. Es erzeugt ein A5-Heftchen oder die Ausgabe von je zwei A5-Seiten auf einer A4-Seite. Eingabedatei kann ein .dvi oder ein .ps File sein. Es wird (außer bei Option -2) ein mit "twoside" erstelltes Dokument angenommen. OPTIONEN: -h diese Hilfe. -2 zwei Seiten auf eine A4-Seite. Keine Vorder- und Rückseiten. -p Seiten sind schon im Postscript-Format, kein dvips-Lauf nötig. -s Seiten werden von postscript verkleinert (Schlechtere Ausgabe). -m Verwende Maße für mit der dvi-Anweisung "\mag" von A4 auf A5 verkleinerten 12pt-Schrift. (Nicht zusammen mit -s verwenden.) -C# drucke '#' Kopien des Booklets. Dies ist die Version für Duplex-Drucker. 'booklet-man' ist für Simplex. HELP exit 1 } function meldung { echo "------------------------------------------------------------------------" echo "$1" echo "------------------------------------------------------------------------" } # Flags sind 1, wenn entsprechende Optionen gesetzt sind: # sflag: -s, hflag: -h, zflag: -2, pflag: -p, mflag: -m, cflag: -C # zuerst alle auf ungesetzt schalten: sflag=0 hflag=0 zflag=0 pflag=0 mflag=0 cflag=0 kopanz="" # gar keine Argumente gegeben, dann Hilfe ausgeben: if [ $# = 0 ]; then usage fi # nun Schalter und Dateiname 'file' einlesen: ARGS=`getopt 2hspmC: "$@"` if [ $? != 0 ]; then usage fi eval set -- "$ARGS" while : do case $1 in -h) hflag=1 ;; -s) sflag=1 ;; -2) zflag=1 ;; -p) pflag=1 ;; -m) mflag=1 ;; -C) cflag=1; shift; kopanz="$1" ;; --) break ;; esac shift done shift file=$1 if [ $hflag = 1 ] ; then usage fi if [ -z $file ] ; then meldung "**** Es wurde kein Dateiname uebergeben!" exit 1 fi if [ ! -f $file.dvi -a ! -f $file.ps ] ; then meldung "**** Eingabedatei wurde nicht gefunden (Angabe ohne Extension)" exit 1 fi if [ $pflag = 0 ] ; then dvips -Pps "$file" fi echo "------------------------------------------------------------------------" if [ $pflag = 0 ] ; then echo "-p aus: Postscript-Datei wurde mit dvips erzeugt." else echo "-p ein: Vorhandene Postscript-Datei wurde verwendet." fi if [ $mflag = 1 ]; then echo "-m ein: Verwende Masze fuer auf A5 mit \\mag verkleinerter 12pt-Schrift." else echo "-m aus: Keine Masze fuer auf A5 mit \\mag verkleinerte Schrift verwenden." fi if [ $cflag = 1 ]; then echo "-C ein: Drucke $kopanz Kopien" kopanz="-# $kopanz" else echo "-C aus: Drucke ein Exemplar" fi # Ab hier beginnt die Arrangierung der Seiten. # InFormat gibt die Seitengröße der Eingabedatei an. if [ $sflag = 1 ]; then echo "-s ein: Verkleinere mittels ps." InFormat=a4 else echo "-s aus: Keine Verkleinerung mittels ps." InFormat=a5 fi if [ $zflag = 1 ]; then meldung "-2 ein: Drucke einseitig zwei Seiten auf ein Blatt." # zwei Seiten auf ein Blatt setzen (A4 hat 596x842bp Größe) psnup -2 -pa4 -P$InFormat "$file.ps" $file.BOOKLET.ps if [ $mflag = 1 ]; then pstops -q '0(-21,-22)' $file.BOOKLET.ps $file.BOOKLET-H.ps mv $file.BOOKLET-H.ps $file.BOOKLET.ps fi else meldung "-2 aus: Drucke Booklet mit Vorder- und Rueckseiten." # Signatur bestimmen durch Auslesen der Seitenzahl ZZ aus ps-File und # erhöhen von ZZ bis ZZ durch 4 teilbar: # Den folgenden Schalter (-m1=nach erstem Treffer stoppen) scheint OS X # grep nicht zu kennen, deshalb nun mittels cut: # FF="`grep -m1 '%%Pages: ' $file.ps`" FF="`grep '%%Pages: ' $file.ps`" # Alle Zeilen, die mit %%Pages beginnen, stehen nun in einer Wurst # ZZ=${FF#*Pages: } # Extrahieren der ersten Pages-Zahl aus dieser Wurst: ZZ=`echo $FF | cut -d' ' -f2` # erhöhen von ZZ bis durch 4 teilbar: while [ $((ZZ%4)) -ne 0 ]; do let ZZ++ ; done # Seiten arrangieren zu Buch: psbook -q -s$ZZ $file.ps $file.BOOKLET.ps # Zwei Seiten auf ein Blatt setzen: psnup -q -2 -pa4 -P$InFormat $file.BOOKLET.ps $file.BOOKLET-H.ps # Drehe jede zweite Seite für Duplex-Drucker: if [ $mflag = 1 ]; then pstops '2:0@1.0(-20,-22),1U@1.0(616,864)' \ $file.BOOKLET-H.ps $file.BOOKLET.ps else pstops '2:0@1.0(0,0),1U@1.0(596,842)' \ $file.BOOKLET-H.ps $file.BOOKLET.ps fi fi echo echo " *************************************************" echo " * *" echo " * Das BOOKLET kann nun gedruckt werden *" echo " * *" echo " *************************************************" echo -n "willst Du gleich drucken (j/n)[j]: " # die folgenden drei Befehle werden von Emacs (leider) nicht verstanden: # stty cbreak # antwort=`dd if=/dev/tty bs=1 count=1 2>/dev/null` # stty -cbreak read antwort if [ "$antwort" = "j" -o -z "$antwort" ] ; then if [ $zflag = 0 ]; then psopts -duplex $file.BOOKLET.ps | lpr -l $kopanz else # nur durch psopts jagen, wenn Drucker default auf duplex # psopts -simplex $file.BOOKLET.ps | lpr -l lpr -l $kopanz $file.BOOKLET.ps fi fi rm -f $file.BOOKLET-H.ps exit 0