#!/usr/local/bin/bash ## ############################################################# ## Convertion of postscript ## script for converting ps files to other format. ## ## Modification of Paul Pettersson's eps2bmp script ## ## NB: frozen versions are ## ps2bmp-2.0 ## ps2bmp-2.3 ## ps2bmp-2.4 ## ## Synopsis: ## Getting around nasty ps bugs. ## ############################################################# ## @FILE: ps2bmp ## @PLACE: BRICS AArhus; host:harald ## @FORMAT: bash script ## @AUTHOR: M. Oliver M'o'ller ## @BEGUN: Fri Sep 15 11:45:42 2000 ## @VERSION: V2.5 Thu Jan 10 17:15:12 2002 ## ############################################################# ## SHELL=/usr/local/bin/bash ## -- elementaries -------------------------------------------------------- ## ## Shell settings INFILE="" OUTFILE="" FORMAT="bmp256" SCALE="1"; QUIET=false; VERBOSE=false; LANDSCAPE_PAPER=false; TO_STDOUT=false; CLIPPING_IMAGE=false; FATTEN_FACTOR=""; FATTEN_GRANULARITY="0.9"; ONLY_VERTICAL=false; WORKING_DIR="/tmp"; TMP_NAME="tmp.bs2bmp.37876.x.$$"; PRESERVE_TMPFILES=false; BACKSLASH="\\" VERSION_NUMBER="V2.5 "; VERSION_DATE="Thu Jan 10 17:15:12 2002" ; VERSION="${VERSION_NUMBER}${VERSION_DATE}"; ## -- WORKAROUNDS ---------------------------------------------------------- if [ "${LOCATION}" == "uu" ]; then BACKSLASH="\\\\"; fi; ## -------------------- function clip_ps_file { ## -- compute bounding box ------------------------- if [ "${LOCATION}" == "acer" ]; then ps2epsi $1 $2; else epstool -c -b -o$2 $1; fi; } ## -- other functions ------------------------------------------------------ function print_usage() { echo "ps2bmp ($VERSION)"; echo ""; echo "usage: ps2bmp [hvclp] [-f FORMAT] [-s SCALE] [-F FACTOR] [-G GRANULARITY] [-w DIR] INFILE [OUTFILE]" echo " -h : print help" echo " -v : verbose on" echo " -c : channel output to stdout" echo " -l : assume landscape paper" echo " -p : preserve temporary files" echo " -f FORMAT : set format; default: ${FORMAT}" echo " -s SCALE : set scale to factor"; echo " -C : clip image (i.e. reduce to bounding box)"; echo " -F FATTEN : fatten up the picture FATTEN=1,2,3,4,5"; echo " -G GRANULARITY : pixel granularity for fattening (default: $FATTEN_GRANULARITY)"; echo " -V : only vertical fattening"; echo " -q : process quietly"; echo " -W DIR : working DIR for temporary files (default: $WORKING_DIR)"; echo " --version : print version" } function print_help() { print_usage echo ""; echo "description:"; echo " Translates postscript files into other formats."; echo " (see gs --help to find out more about possible formats)"; echo " If -f ps is set, the input is untouched (except fattening)."; echo " If scaling is used, points are taken from the lower right edge,"; echo " ignoring the bounding box (since gs cannot handle this)."; echo " If -l is set, the width and height of the output are swapped."; echo " Fattening is useful, if a picture should be translated to bitmap formats"; echo " later, where the lines should be bigger in order not to vanish when"; echo " the bitmap is scaled down. However, this is slow and creates very big"; echo " postscript files as intermediate results. Try to keep -F small and play"; echo " with -G instead."; echo " If fattening is used and format is not ps, then the image is clipped"; echo " automatically."; echo " If -V is set, fattening works only vertically."; echo " (thanks to Donald Arseneau for a tex hint here.)"; echo ""; echo "relies on: pstops psnup gs bc grep sed " echo " latex [geometry epsfig fancybox]" echo " ps2epsi OR epstool (for clipping)" echo ""; echo "author: M. Oliver M\"oller "; exit 1; } ## -- function set_in_out_files() { if [ -z "$INFILE" ]; then INFILE="$switch"; else if [ -z "$OUTFILE" ]; then OUTFILE=$switch; else print_help; fi; fi; } function abort { ## -- clear the temp files -- echo "ps2bmp: ERROR: $1" 1>&2; echo "** ps2bmp aborted." 1>&2; echo "** consider: rm ${WORKING_DIR}/${TMP_NAME}.*" 1>&2; exit 1; } function gettheending { ## $1: name $2: desired ending LENGTH=${#1} POS=$(($LENGTH-${#2})); if [ $POS -lt 0 ]; then POS=0 fi; RESULT="*error*"; NOTDONE=true; while($NOTDONE)do RESULT="${1:0:$POS}$2"; if [ "${RESULT:0:$LENGTH}" == "$1" ]; then NOTDONE=false; fi; POS=$(($POS+1)); done; echo $RESULT } function local_stripoffsuffix() { ## remove last suffix (if present) if [ -z "$(echo ${1} |grep "\\.")" ]; then echo $1; else POS=${#1}; while [ "${1:${POS}:1}" != "." ]; do POS=$((${POS}-1)); done; echo ${1:0:${POS}}; fi; } function compute { ## scales echo "0.0+($1)*${SCALE}" | bc -l | cut -d'.' -f 1; } function create_latex_file { echo -n "" > ${WORKING_DIR}/${TEX_FILE} echo "\\documentclass{article}" >> ${WORKING_DIR}/${TEX_FILE} ; echo "%\\usepackage{fullpage}" >> ${WORKING_DIR}/${TEX_FILE} ; echo "\\usepackage[a4paper,hmargin=2cm,vmargin=2cm]{geometry} % -- fixed margins" >> ${WORKING_DIR}/${TEX_FILE} ; echo "%\\usepackage{graphicx}" >> ${WORKING_DIR}/${TEX_FILE} ; echo "\\usepackage{epsfig}" >> ${WORKING_DIR}/${TEX_FILE} ; echo "\\usepackage{fancybox}" >> ${WORKING_DIR}/${TEX_FILE}; echo "%%\\usepackage{pstricks}" >> ${WORKING_DIR}/${TEX_FILE}; echo "\\pagestyle{empty}" >> ${WORKING_DIR}/${TEX_FILE} ; echo "\\setlength{\\parindent}{0mm}" >> ${WORKING_DIR}/${TEX_FILE}; echo "\\listfiles" >> ${WORKING_DIR}/${TEX_FILE} ; echo "${BACKSLASH}begin{document}" >> ${WORKING_DIR}/${TEX_FILE} ; echo "\\def${BACKSLASH}fatten#1{%" >> ${WORKING_DIR}/${TEX_FILE} ; echo "\\setbox0\\hbox{#1}% ELSE" >> ${WORKING_DIR}/${TEX_FILE} ; echo "\\leavevmode ${BACKSLASH}copy0\\kern-\\wd0 " >> ${WORKING_DIR}/${TEX_FILE} ; if $ONLY_VERTICAL; then ## -- only up/down movements --------------------- echo "%% only vertical shifts " >> ${WORKING_DIR}/${TEX_FILE} ; echo "${BACKSLASH}raise${FATTEN_GRANULARITY}\\pix ${BACKSLASH}copy0\\kern-${BACKSLASH}wd0 " >> ${WORKING_DIR}/${TEX_FILE} ; echo "${BACKSLASH}lower${FATTEN_GRANULARITY}\\pix ${BACKSLASH}copy0\\kern-${BACKSLASH}wd0 " >> ${WORKING_DIR}/${TEX_FILE} ; ## echo "\\kern.3\\pix ${BACKSLASH}box0 }" >> ${WORKING_DIR}/${TEX_FILE} ; echo " ${BACKSLASH}box0 }" >> ${WORKING_DIR}/${TEX_FILE} ; else ## -- move to the corners ------------------------------------------- echo "%% horizontal and vertical shifts " >> ${WORKING_DIR}/${TEX_FILE} ; echo "\\kern.3\\pix ${BACKSLASH}raise${FATTEN_GRANULARITY}\\pix ${BACKSLASH}copy0\\kern-${BACKSLASH}wd0 " >> ${WORKING_DIR}/${TEX_FILE} ; echo "\\lower${FATTEN_GRANULARITY}\\pix ${BACKSLASH}copy0\\kern-${BACKSLASH}wd0 " >> ${WORKING_DIR}/${TEX_FILE} ; echo "\\kern.4\\pix ${BACKSLASH}raise${FATTEN_GRANULARITY}\\pix ${BACKSLASH}copy0\\kern-${BACKSLASH}wd0" >> ${WORKING_DIR}/${TEX_FILE} ; echo "\\lower${FATTEN_GRANULARITY}\\pix ${BACKSLASH}copy0\\kern-${BACKSLASH}wd0" >> ${WORKING_DIR}/${TEX_FILE} ; echo "\\kern.3\\pix ${BACKSLASH}box0 }" >> ${WORKING_DIR}/${TEX_FILE} ; fi; ## ------------------------------------------------------------------- echo "${BACKSLASH}newdimen\\pix \\pix=.01in" >> ${WORKING_DIR}/${TEX_FILE} ; echo "%%" >> ${WORKING_DIR}/${TEX_FILE} ; echo "${BACKSLASH}begin{center}" >> ${WORKING_DIR}/${TEX_FILE} ; echo "${BACKSLASH}vspace*{110mm}%" >> ${WORKING_DIR}/${TEX_FILE} ; echo "${BACKSLASH}boxput{%" >> ${WORKING_DIR}/${TEX_FILE} ; echo "\\hbox{%" >> ${WORKING_DIR}/${TEX_FILE} ; I=1; while [ $I -le ${FATTEN_FACTOR} ]; do echo -n "${BACKSLASH}fatten{" >> ${WORKING_DIR}/${TEX_FILE} ; I=$((${I}+1)); done; echo -n "${BACKSLASH}epsfig{file=${FATTEN_INPUT}" >> ${WORKING_DIR}/${TEX_FILE} ; I=1; while [ $I -le ${FATTEN_FACTOR} ]; do echo -n "}" >> ${WORKING_DIR}/${TEX_FILE} ; I=$((${I}+1)); done; echo "}}{}}{}%" >> ${WORKING_DIR}/${TEX_FILE} ; echo "${BACKSLASH}end{center}%" >> ${WORKING_DIR}/${TEX_FILE} ; echo "${BACKSLASH}end{document}" >> ${WORKING_DIR}/${TEX_FILE} ; } ## -- reading options -------------------- AWAIT=""; for switch in $@; do case $AWAIT in -f ) AWAIT=""; FORMAT=$switch;; -s ) AWAIT=""; SCALE=$switch;; -F ) AWAIT=""; FATTEN_FACTOR=$switch;; -G ) AWAIT=""; FATTEN_GRANULARITY=$switch;; * ) case $switch in --help ) print_help;; -help ) print_help;; -h ) print_help;; -f ) AWAIT="-f";; -s ) AWAIT="-s";; -F ) AWAIT="-F";; -G ) AWAIT="-G";; -v ) VERBOSE=true;; -l ) LANDSCAPE_PAPER=true;; -p ) PRESERVE_TMPFILES=true;; -c ) TO_STDOUT=true;; -C ) CLIPPING_IMAGE=true;; -V ) ONLY_VERTICAL=true;; -q ) QUIET=true;; --version ) echo "Version: $VERSION";exit 1;; -* ) echo "Unknown switch: $switch";print_usage;exit 1;; * ) set_in_out_files;; esac esac done; ## -- propagate ------------------------- if ${TO_STDOUT}; then VERBOSE=false; QUIET=true; fi; if [ -z "$INFILE" ]; then echo "missing INFILE."; print_usage; exit 1; fi ORIG_INFILE=$INFILE; ## try to find .ps or .eps endings: ----- if [ ! -e $INFILE ]; then INFILE=$(gettheending $ORIG_INFILE ".ps"); fi if [ ! -e $INFILE ]; then INFILE=$(gettheending $ORIG_INFILE ".eps"); fi if [ ! -e $INFILE ]; then abort "Cannot find input file $ORIG_INFILE[.ps,.eps]"; fi ## -------------------------------------- if $TO_STDOUT; then if ${VERBOSE}; then echo "** channeling to stdout"; fi; else if [ -z "$OUTFILE" ]; then OUTFILE=$(local_stripoffsuffix "${INFILE}"); OUTFILE=${OUTFILE}.bmp; if ${VERBOSE}; then echo "** using outfile ${OUTFILE}"; fi; fi fi TMP_FILE=${TMP_NAME}.tmp-file-for-ps2bmp.$$.ps; TMP_FILE_2=${TMP_NAME}.tmp-file-for-ps2bmp.$$.to_clip.ps; if [ -e ${WORKING_DIR}/${TMP_FILE} ]; then abort "Sorry, temp file ${WORKING_DIR}/${TMP_FILE} exists."; fi; if [ -e ${WORKING_DIR}/${TMP_FILE_2} ]; then abort "temporary file ${WORKING_DIR}/${TMP_FILE_2} already exits. Sorry."; else echo "" > ${WORKING_DIR}/${TMP_FILE_2}; fi; ## -- GET BOUNDING BOX ----------------------------------------------------- ## -- START PROCESSING ----------------------------------------------------- if [ -z "${FATTEN_FACTOR}" ]; then ## -- NO FATTENING ---------------------- if ${CLIPPING_IMAGE}; then clip_ps_file ${INFILE} ${WORKING_DIR}/${TMP_FILE_2}; else cp ${INFILE} ${WORKING_DIR}/${TMP_FILE_2}; fi; SIZE_X=$(grep "^%%BoundingBox: " ${WORKING_DIR}/${TMP_FILE_2} | cut -d' ' -f 2 | sed -e "s/[^0123456789]//g"); for onlyfirst in $SIZE_X; do SIZE_X=$onlyfirst;break; done; SIZE_Y=$(grep "^%%BoundingBox: " ${WORKING_DIR}/${TMP_FILE_2} | cut -d' ' -f 3 | sed -e "s/[^0123456789]//g"); for onlyfirst in $SIZE_Y; do SIZE_Y=$onlyfirst;break; done; SIZE_XX=$(grep "^%%BoundingBox: " ${WORKING_DIR}/${TMP_FILE_2} | cut -d' ' -f 4 | sed -e "s/[^0123456789]//g"); for onlyfirst in $SIZE_XX; do SIZE_XX=$onlyfirst;break; done; SIZE_YY=$(grep "^%%BoundingBox: " ${WORKING_DIR}/${TMP_FILE_2} | cut -d' ' -f 5 | sed -e "s/[^0123456789]//g" ); for onlyfirst in $SIZE_YY; do SIZE_YY=$onlyfirst;break; done; HEIGHT=$((${SIZE_YY}-${SIZE_Y})); WIDTH=$((${SIZE_XX}-${SIZE_X})); cat ${WORKING_DIR}/${TMP_FILE_2} |grep -v "^%%BoundingBox: " | pstops "0(-${SIZE_X},-${SIZE_Y})" > ${WORKING_DIR}/${TMP_FILE} else ## -- APPLY FATTENING: OTHER TMP_FILE --------------------------------- if ! ${QUIET}; then echo "** using fattening."; fi; FATTEN_INPUT="$TMP_NAME.input.ps"; if cat ${INFILE} | sed "s/^%%BoundingBox:.*$/%%BoundingBox: 0 0 596 842/g" > ${WORKING_DIR}/${FATTEN_INPUT}; then : else abort "copy failed"; fi; TEX_FILE="$TMP_NAME.tex"; create_latex_file; ## -- compile and modify ---------------------------- pushd ${WORKING_DIR} >/dev/null; if ${QUIET}; then if ! latex $TEX_FILE >/dev/null; then abort "latex failed; missing package?"; fi; if ! dvips -o${TMP_NAME}.ps ${TMP_NAME}.dvi >/dev/null 2>/dev/null; then abort "dvips failed."; fi; else if ! latex $TEX_FILE; then abort "latex failed; missing package?"; fi; if ! dvips -o${TMP_NAME}.ps ${TMP_NAME}.dvi; then abort "dvips failed."; fi; fi; ## -- exception: for ps, don't clip --------------------------- if [ "$FORMAT" == "ps" ]; then cp ${TMP_NAME}.ps ${TMP_NAME}.2.ps; else clip_ps_file ${TMP_NAME}.ps ${TMP_NAME}.2.ps; fi; ## ------------------------------------------------------------ SIZE_X=$(grep "^%%BoundingBox: " ${TMP_NAME}.2.ps | cut -d' ' -f 2 | sed -e "s/[^0123456789]//g"); for onlyfirst in $SIZE_X; do SIZE_X=$onlyfirst;break; done; SIZE_Y=$(grep "^%%BoundingBox: " ${TMP_NAME}.2.ps | cut -d' ' -f 3 | sed -e "s/[^0123456789]//g"); for onlyfirst in $SIZE_Y; do SIZE_Y=$onlyfirst;break; done; SIZE_XX=$(grep "^%%BoundingBox: " ${TMP_NAME}.2.ps | cut -d' ' -f 4 | sed -e "s/[^0123456789]//g"); for onlyfirst in $SIZE_XX; do SIZE_XX=$onlyfirst;break; done; SIZE_YY=$(grep "^%%BoundingBox: " ${TMP_NAME}.2.ps | cut -d' ' -f 5 | sed -e "s/[^0123456789]//g" ); for onlyfirst in $SIZE_YY; do SIZE_YY=$onlyfirst;break; done; ## -- allow some slight aberration: unneccessary --- # SIZE_X=$((${SIZE_X}-2)); # SIZE_Y=$((${SIZE_Y}-2)); # SIZE_XX=$((${SIZE_XX}+2)); # SIZE_YY=$((${SIZE_YY}+2)); ## -- HEIGHT=$((${SIZE_YY}-${SIZE_Y})); WIDTH=$((${SIZE_XX}-${SIZE_X})); ##--- cat ${TMP_NAME}.2.ps| grep -v "^%%BoundingBox: " | pstops "0(-${SIZE_X},-${SIZE_Y})" > ${WORKING_DIR}/${TMP_FILE} ## -- remove temp files ---------------------------- popd >/dev/null; fi; ## ---------------------------------------------------- ## --spam ------------------------------------------------------------------ if $VERBOSE; then echo "INFILE: $INFILE" echo "OUTFILE: $OUTFILE" echo "FORMAT: $FORMAT"; echo "TO_STDOUT: $TO_STDOUT" echo "LANDSCAPE_PAPER: $LANDSCAPE_PAPER"; echo "TMP_FILE: $TMP_FILE" echo "SIZE_X: $SIZE_X" echo "SIZE_Y: $SIZE_Y" echo "SIZE_XX: $SIZE_XX" echo "SIZE_YY: $SIZE_YY" echo "HEIGHT: $HEIGHT" echo "WIDTH: $WIDTH"; echo "SCALE: $SCALE"; echo "FATTEN_FACTOR: $FATTEN_FACTOR"; echo "FATTEN_GRANULARITY: $FATTEN_GRANULARITY"; echo "ONLY_VERTICAL: $ONLY_VERTICAL"; echo "WORKING_DIR: $WORKING_DIR"; echo "VERSION: $VERSION" fi; ## -- Sanity Checks -------------------------------------------------------- if [ "$SIZE_Y" == "" ]; then abort "No bounding box found in ${INFILE}."; fi ## ------------------------------------------------------------------------- ## -- special case: format ps ---------------------------------------------- ## ------------------------------------------------------------------------- if [ "$FORMAT" == "ps" ]; then if $VERBOSE; then echo "** SPECIAL CASE: ps output"; fi; if [ -z "$SCALE" ]; then SCALE="1"; fi; LANDSCAPE_SWITCH=""; if $LANDSCAPE_PAPER; then LANDSCAPE_SWITCH="-l"; fi; if ${TO_STDOUT}; then COMMAND_ARGS="-s${SCALE} ${LANDSCAPE_SWITCH} ${WORKING_DIR}/${TMP_FILE} "; else COMMAND_ARGS="-s${SCALE} ${LANDSCAPE_SWITCH} ${WORKING_DIR}/${TMP_FILE} ${OUTFILE}" ; fi; if $VERBOSE; then echo "** psnup ARGS : ${COMMAND_ARGS}"; fi; if psnup ${COMMAND_ARGS}; then : else abort "psnup failed"; fi; ## ----------------------------------------------------------------------- else ## -- ORDINARY FORMAT ---------------------------------------------------- ## -- compute scale ------------------------------------------------------ DPI=72; RESOLUTION_ARG=""; if ! [ -z "$SCALE" ]; then BASE_DPI=72; WIDTH=$(compute ${WIDTH}); HEIGHT=$(compute ${HEIGHT}); DPI=$(compute 72); RESOLUTION_ARG="-r${DPI}x${DPI}"; fi; if ${VERBOSE}; then echo "** using output size ${WIDTH}x${HEIGHT}, dpi: ${DPI}" fi if [ -z ${WIDTH} ] || [ -z ${HEIGHT} ] || [ -z ${DPI} ] || \ [ ${WIDTH} -le 0 ] || [ ${HEIGHT} -le 0 ] || [ ${DPI} -le 0 ]; then abort "illegal dimensions: ${WIDTH}x${HEIGHT}, dpi: ${DPI}"; fi; ## -- landscape-flip ---------------------------------- if $LANDSCAPE_PAPER; then TMP=$HEIGHT; HEIGHT=$WIDTH; WIDTH=$TMP; fi; ## ---------------------------------------------------- if ${TO_STDOUT}; then if echo "quit" | gs -q -sDEVICE=${FORMAT} -sOutputFile=- \ -g${WIDTH}x${HEIGHT} ${RESOLUTION_ARG} ${WORKING_DIR}/${TMP_FILE} 2>/dev/null; then : else abort "gs failed."; fi; else if echo "quit" | gs -q -sDEVICE=${FORMAT} -sOutputFile=${OUTFILE} \ -g${WIDTH}x${HEIGHT} ${RESOLUTION_ARG} ${WORKING_DIR}/${TMP_FILE} 2>/dev/null; then : else abort "gs failed."; fi; fi; fi; ## -- end of special case/ordinary case -------------------------------- ## ------------------------------------------------------------------------- if ${VERBOSE}; then echo "** constructed:"; ls -l ${OUTFILE}; fi if ${PRESERVE_TMPFILES}; then echo "** consider: rm ${WORKING_DIR}/${TMP_NAME}.*" 1>&2; else rm ${WORKING_DIR}/${TMP_NAME}.* fi; echo "** ps2bmp done." exit 0; ## --- OK ------------------------------ ### Local Variables: *** ### mode: lisp *** ### eval: (defun update-global-date () (let ((pos (point-marker))) (goto-char (point-min)) (if (search-forward-regexp "^VERSION_DATE=" (point-max) t) (progn (kill-line) (insert (format "\"%s\" ;" (current-time-string))) (basic-save-buffer) (message "** Version Date Updated."))) (goto-char pos))) *** ### eval: (defun new-global-hh-insert-disclaimer () (interactive) (insert-disclaimer) (update-global-date) (ksh-mode)(font-lock-mode) (local-set-key [f4] #'new-global-hh-insert-disclaimer)) *** ### eval: (progn (ksh-mode)(font-lock-mode) (local-set-key [f4] #'new-global-hh-insert-disclaimer)) *** ### comment-column:0 *** ### comment-start: "### " *** ### comment-end: "***" *** ### End: ***