summaryrefslogtreecommitdiff
path: root/contrib/psmandup.in
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/psmandup.in')
-rw-r--r--contrib/psmandup.in269
1 files changed, 269 insertions, 0 deletions
diff --git a/contrib/psmandup.in b/contrib/psmandup.in
new file mode 100644
index 0000000..b0e8f32
--- /dev/null
+++ b/contrib/psmandup.in
@@ -0,0 +1,269 @@
+#! /bin/sh -e
+# -*- ksh -*-
+
+# psmandup --- produce a version of a PS file to print in manual Duplex.
+
+# Copyright (c) 1998, 1999 Akim Demaille, Miguel Santana
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, you can either send email to this
+# program's maintainer or write to: The Free Software Foundation,
+# Inc.; 59 Temple Place, Suite 330; Boston, MA 02111-1307, USA.
+
+# Author: Akim Demaille <Akim.Demaille@freefriends.org>
+
+# Get the name of the program
+program=`echo $0 | sed 's#.*/##g'`
+
+# Local vars
+address=0 # Where to put the manual feed feature
+back=: # Print the back side pages.
+debug=
+file=
+front=: # Print the front side pages.
+output=- # Default is stdout
+fixps=${FIXPS:-fixps}
+message=
+psselect=${PSSELECT:-psselect}
+psset=${PSSET:-psset}
+tmpdir=`mktemp -d -t psmandup.XXXXXX` || { echo "$program: Cannot create temporary dir!" >&2 ; exit 1; }
+
+# These two must be kept in synch. They are opposed.
+verbose=echo
+quiet=:
+
+# The version/usage strings
+version="psmandup 2.1 (@GNU_PACKAGE@ @VERSION@)
+Written by Akim Demaille.
+
+Copyright (c) 1998-1999 Akim Demaille, Miguel Santana
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+usage="\
+Usage: $program FILE
+Tries to produce a version of the PostScript FILE to print in manual
+Duplex.
+
+Options:
+ -h, --help display this help and exit
+ -v, --version display version information and exit
+ -q, --quiet don't print informational messages
+ -o, --output=FILE save result in FILE. If FILE is \`-', send to stdout
+ -n, --no-fix don't call fixps to fix PS problems in FILE
+ -f, --front output only the front pages (recto) on the regular
+ tray
+ -b, --back output only the back pages (verso) on the manual
+ feed tray
+
+Produced output is meant for PS level 2 printers which don't support
+Duplex printing, but support Manual Feed. Once the first set of pages
+is printed (odd pages), manual feed is asked: introduce the odd pages
+to print the even pages on the other side.
+
+Because there is usually a short time out for manually fed jobs, you
+should really be next to the printer. If ever the time out expired,
+use the option -b to send only the missing part.
+
+Environment variables FIXPS, PSSELECT and PSSET, if defined, are used
+to find the tools.
+
+News, updates and documentation: http://www.inf.enst.fr/~demaille/a2ps/
+Report bugs to <bug-a2ps@gnu.org>"
+
+help="Try \`$program --help' for more information."
+
+# Parse command line arguments.
+option_without_arguments='vhsqnDbf'
+
+# Push a token among the arguments that will be used to notice when
+# we ended options/arguments parsing.
+arg_sep="$$--$$"
+set dummy ${1+"$@"} "$arg_sep"
+shift
+while test "x$1" != "x$arg_sep"; do
+
+ # Handle --option=value by splitting apart and putting back on argv.
+ case "$1" in
+ --*=*)
+ opt=`echo "$1" | sed -e 's/=.*//'`
+ val=`echo "$1" | sed -e 's/[^=]*=//'`
+ shift
+ set dummy "$opt" "$val" ${1+"$@"}
+ shift
+ ;;
+
+ -[$option_without_arguments]?*)
+ # Prefix $1 with x to avoid running `echo -na' for instance.
+ opt=`echo "x$1" | sed -e 's/x-\(.\).*/-\1/'`
+ rest=`echo "x$1" | sed -e 's/x-.\(.*\)/-\1/'`
+ shift
+ set dummy "$opt" "$rest" ${1+"$@"}
+ shift
+ ;;
+
+ # This case needs to be protected so that the case `-??*' does
+ # not split long options without arguments
+ --*)
+ ;;
+
+ # This is an option with argument. Split apart and put back on argv.
+ -??*)
+ opt=`echo "x$1" | sed -e 's/x-\(.\).*/-\1/'`
+ arg=`echo "x$1" | sed -e 's/x-.\(.*\)/\1/'`
+ shift
+ set dummy "$opt" "$arg" ${1+"$@"}
+ shift
+ ;;
+ esac
+
+ # Now, handle the options. $1 is the option *only*. If it has an
+ # argument, it is now necessarily in $2 etc. Remember to shift
+ # when fetching an argument.
+ case "$1" in
+ -v | --v*) echo "$version"; exit 0;;
+ -h | --h*) echo "$usage"; exit 0;;
+ -q | -s | --s* | --q*) verbose=:; quiet=echo;;
+ # Delay debugging so that options parsing does not appear
+ -D | --deb*) debug=-D ;;
+ -o | --out*) shift ; output=$1 ;;
+ -b | --bac*) front= ; back=: ;;
+ -f | --fro*) front=: ; back= ;;
+ -) # We are working with stdin ;;
+ set dummy "$@" "$1"
+ shift
+ ;;
+ -n | --no*) fixps= ;;
+
+ --) # What remains are not options.
+ shift
+ while test "x$1" != "x$arg_sep"; do
+ set dummy ${1+"$@"} "$1"
+ shift
+ shift
+ done
+ break;;
+
+ -*)
+ echo "$program: Unknown or ambiguous option \`$1'." >&2
+ echo "$program: Try \`--help' for more information." >&2
+ exit 1;;
+ *) set dummy ${1+"$@"} "$1"
+ shift
+ ;;
+ esac
+ shift
+done
+# Pop the token
+shift
+
+
+# Check the number of arguments.
+case $# in
+ 0) file=-;;
+ 1) file=$1;;
+ *) echo "$program: too many arguments" 1>&2
+ echo "$help" 1>&2
+ exit 1;;
+esac
+
+if test -n "$debug"; then
+ # Set -x now if debugging
+ set -x
+else
+ # Temp dir. Get ready not to leave junk (if not debugging)
+ trap "/bin/rm -rf $tmpdir" 0 1 2 3 13 15
+fi
+
+# If printing from stdin, save into a tmp file
+if test $file = '-'; then
+ file=$tmpdir/stdin.ps
+ cat > $file
+fi
+
+# Fix the file beforehand, so that we can really expect to find the
+# page numbers.
+if test -n "$fixps"; then
+ $fixps $file -o $tmpdir/fixed.ps `$quiet -q`
+ file=$tmpdir/fixed.ps
+fi
+
+# Get the number of pages of the document
+pagenum=`sed -ne '/^%%Pages:/{
+s/%%Pages: \\([0-9]*\\).*$/\\1/p
+q
+}' $file`
+
+# Make the string to get the front pages (even, increasing) if needed
+if test -n "$front"; then
+ evens="1"
+ i=3
+ # Build the string to give to psselect
+ while test $i -le $pagenum;
+ do
+ evens="$evens,$i"
+ i=`expr $i + 2`
+ done
+fi
+
+# Make the string to get the back pages (odd, decreasing) if needed
+if test -n "$back"; then
+ # If the number of pages is odd, we need to insert a blank sheet
+ case "$pagenum" in
+ *[13579])
+ odds="_"
+ i=`expr $pagenum - 1 || exit 0`
+ ;;
+ *) # Odd, and not 0, so at least >= 2
+ odds=$pagenum
+ i=`expr $pagenum - 2 || exit 0`
+ ;;
+ esac
+
+ # Make the string to get the second half (odd, decreasing)
+ while test $i != 0;
+ do
+ odds="$odds,$i"
+ i=`expr $i - 2 || exit 0`
+ done
+fi
+
+# If there are both odds and evens to print, the separator is `,'
+test -n "$odds" && test -n "$evens" && separator=,
+
+# Reorder the pages
+$psselect -q $evens$separator$odds $file > $tmpdir/ordered.ps
+
+# If needed, insert the manual feed request
+if test -n "$back"; then
+ # The option of psset to ask the manual feed. If not set,
+ # psset just does nothing.
+ pssetmanfeed=-m
+ # Compute the address, depending on front pages are printed or not.
+ if test -n "$front"; then
+ address=`expr '(' $pagenum + 1 ')' / 2 + 1`
+ message="\
+Once the first half of the file printed, insert the sheets stack into
+the manual feed tray to print the second half. Be aware the time out
+if usually short. If it expired, use option -b to proceed."
+ else
+ address=0
+ message="Insert the front pages stack into the manual feed tray."
+ fi
+fi
+
+# Insert the manual feed request if needed
+$psset -n $pssetmanfeed -a $address -o$output $tmpdir/ordered.ps $debug
+
+test -n "$message" && $verbose "$message" 1>&2
+exit 0