diff options
Diffstat (limited to 'Master/texmf-dist/scripts/pgfplots/pgf2pdf.sh')
-rwxr-xr-x | Master/texmf-dist/scripts/pgfplots/pgf2pdf.sh | 282 |
1 files changed, 282 insertions, 0 deletions
diff --git a/Master/texmf-dist/scripts/pgfplots/pgf2pdf.sh b/Master/texmf-dist/scripts/pgfplots/pgf2pdf.sh new file mode 100755 index 00000000000..027a6157b77 --- /dev/null +++ b/Master/texmf-dist/scripts/pgfplots/pgf2pdf.sh @@ -0,0 +1,282 @@ +#!/bin/sh + +TEX_FILE="" +TEX_LOG_FILE="" + +TEX_DEFINES="" + +OLD_DIR=`pwd` + +DRIVER="pdftex" + +ALSO_EPS_OUTPUT=0 +WARN_ONLY_IF_TEXFILE_DOESNOT_INCLUDE_TARGET=0 +VERBOSE_LEVEL=0 + +function dumpHelp() { + echo -e \ + "`basename $0` [OPTIONS] [--texdefs <defsfile> | --mainfile <latexmainfile>.tex ] [plot1.pgf plot2.pgf .... plotn.pgf]\n"\ + "converts each plot*.pgf to plot*.pdf.\n"\ + "This is done by running \n"\ + " latex --jobname plot1 latexmainfile\n"\ + "for each single plot. See the pgfmanual section \"Externalizing graphics\".\n"\ + "Options:\n"\ + "--eps\n"\ + " will also produce eps output files.\n"\ + "--driver D\n"\ + " will use either \"dvipdfm\", \"dvips\" or \"pdflatex\"\n"\ + " please note that only pdflatex works without additional\n"\ + " work.\n"\ + "--mainfile FILE\n"\ + " A tex-file which has been configured for externalized graphics.\n"\ + " Two conditions must be met to perform the conversion of\n"\ + " \"plot.pgf\" -> \"plot.pdf\":\n"\ + " 1. FILE needs the command\n"\ + " \pgfrealjobname{FILE}\n"\ + " (see the pgf manual for details)\n"\ + " 2. It needs to include \"plot.pgf\" somewhere (using \input{plot.pgf})\n"\ + "\n"\ + "--warnonly\n"\ + " Use this flag if the argument of --mainfile does not contain\n"\ + " \input{TARGET.pgf},\n"\ + " i.e. if (2.) is not fulfilled. In this case, the conversion for this\n"\ + " input file will be skipped.\n"\ + "\n"\ + "--texdefs FILE\n"\ + " Generates a temporary tex-file\n"\ + " \documentclass{article}\n"\ + " \input{FILE}\n"\ + " \begin{document}\n"\ + " \input{plot1.pgf}\n"\ + " \end{document}\n"\ + " and converts this one to pdf.\n"\ + " If FILE is '-', the input step is omitted.\n" + "-v\n"\ + " each -v option increases the verbosity.\n"\ + "" + exit 0; +} + + +LONGOPTS="mainfile:,eps,driver:,texdefs:,warnonly" +SHORTOPTS="f:t:v" +ARGS=`getopt -l "$LONGOPTS" "$SHORTOPTS" "$@"` +if [ $? -ne 0 ]; then + echo "`basename $0`: Could not process command line arguments. Use the '--help' option for documentation." + exit 1 +fi + +eval set -- "$ARGS" +while [ $# -gt 0 ]; do + ARG=$1 + # echo "PROCESSING OPTION '$ARG' (next = $@)" + case "$ARG" in + --texdefs|-t) shift; TEX_DEFINES="$1"; shift;; + --driver) shift; DRIVER="$1"; shift;; + --mainfile|-f) shift; TEX_FILE="$1"; TEX_LOG_FILE="${1%%.tex}.log"; shift;; + --eps) shift; ALSO_EPS_OUTPUT=1;; + --warnonly) shift; WARN_ONLY_IF_TEXFILE_DOESNOT_INCLUDE_TARGET=1;; + -v) shift; VERBOSE_LEVEL=$((VERBOSE_LEVEL+1));; + --) shift; break;; + *) break; + esac +done +if [ -n "${TEX_DEFINES}" ]; then + if [ "${TEX_DEFINES:0:1}" != "/" ]; then + TEX_DEFINES=`pwd`/${TEX_DEFINES} + fi +fi + + +if [ $# -ne 0 ]; then + PGF_FILES=("$@") +elif [ -n "${TEX_LOG_FILE}" ]; then + # search for lines with + # (XXXX.pgf + PGF_FILES=(`sed -n '{s/.*(\([a-zA-Z0-9._-+^~]\+\.pgf\).*/\1/g;T ende;p};: ende' < $TEX_LOG_FILE`) + #PGF_FILES=(./errplot_L2.pgf) +else + echo "No input files." 1>&2 + exit 1 +fi + +for A in "${PGF_FILES[@]}"; do + if [ ! -f "$A" ]; then + echo "$A not found: no such file" 1>&2 + exit 1 + fi + + CONTINUE_ON_ERROR=0 + + TARGET_FILE=$(sed -n '{s/.*\\beginpgfgraphicnamed{\(.*\)}.*/\1/g;T ende;p};: ende' < "$A") + if [ $? -ne 0 -o -z "$TARGET_FILE" ]; then + echo "There is no valid \\beginpgfgraphicnamed{TARGET}...\\endpgfgraphicnamed command in $A. Can't be exported to pdf. Please see the PGF manual for details." 1>&2 + exit 1 + fi + echo "processing \"$A\"" 1>&2 + + CMD="latex" + case $DRIVER in + pdftex|pdflatex) + CMD="pdflatex" + ;; + esac + + if [ -z "${TEX_DEFINES}" ]; then + # LaTeX cannot write into a \jobname in another directory. + # But the TEX_FILE and $A may not necessarily be in the same directory! + # + # So, we have to build a work-around which simulates a \jobname in the directory of TEX_FILE + # which does not fool \beginpgfgraphicnamed + + # modify the input file A: + ORIGINAL_FILE="$A.orig" + mv "$A" "$ORIGINAL_FILE" || exit 1 + cat - "$ORIGINAL_FILE" >"$A" <<-EOF + \let\tmpXXXXXZEUGoldjobname=\jobname + \def\jobname{${TARGET_FILE}}% + \message{PGF2PDF: TEX HAS ENTERED THE TARGET FILE...}% + EOF + cat >> "$A" <<-EOF + \let\jobname=\tmpXXXXXZEUGoldjobname + EOF + + cd `dirname "${TEX_FILE}"` + + # generate a temp \jobname in the current directory: + TMP_JOB_FILE=`mktemp ./tmppgf2pdfXXXXXX` + if [ $? -ne 0 ]; then exit 1; fi + rm -f "$TMP_JOB_FILE" + + $CMD --interaction nonstopmode --jobname "$TMP_JOB_FILE" "${TEX_FILE}" 1>/dev/null + CODE=$? + + INTERM_EXTENSION="dvi" + case $DRIVER in + pdftex|pdflatex) + INTERM_EXTENSION="pdf" + ;; + dvipdfm) + INTERM_EXTENSION="dvi" + ;; + dvips) + INTERM_EXTENSION="dvi" + ;; + esac + if [ ! -s "$TMP_JOB_FILE.$INTERM_EXTENSION" ]; then + if [ $VERBOSE_LEVEL -ge 1 ]; then + if [ $WARN_ONLY_IF_TEXFILE_DOESNOT_INCLUDE_TARGET -eq 1 ]; then + echo -n "WARNING: "; + else + echo -n "ERROR: "; + fi + echo -e "running\n"\ + " '$CMD --jobname $TMP_JOB_FILE $TEX_FILE'\n"\ + "resulted in a zero-size file \"$TMP_JOB_FILE.$INTERM_EXTENSION\"!\n"\ + "Please check\n"\ + "- if $TEX_FILE contains\n"\ + " \pgfrealjobname{`basename ${TEX_FILE%%.tex}`}\n"\ + "- if $TEX_FILE contains\n"\ + " \input{$A}\n"\ + "\n"\ + "You may take a look at\n\t$TARGET_FILE.log\n for more information.\n"\ + "Maybe `basename $0` --texdefs is more appropriate for this application?\n"\ + "It doesn't need \input{}...\n"\ + 1>&2 + fi + + CODE=1 + if [ $WARN_ONLY_IF_TEXFILE_DOESNOT_INCLUDE_TARGET -eq 1 ]; then + CONTINUE_ON_ERROR=1 + fi + rm -f $TMP_JOB_FILE.{$INTERM_EXTENSION,pdf} + fi + + + # FIXME: this here may clash if A and TARGET_FILE have inconsistent paths! + mv "$ORIGINAL_FILE" "$A" || exit 1 + for QQ in $TMP_JOB_FILE.*; do + if [ "$TARGET_FILE.${QQ##*.}" != "$A" ]; then + mv "$QQ" "$TARGET_FILE.${QQ##*.}" || exit 1 + fi + done + + cd "$OLD_DIR" + else + # Die Idee hier ist wie folgt: + # - Erstelle ein fast leeres Tex-File + # - darin steht NUR + # \input $TEX_DEFINES + # und + # \input $A + # - das TeX-file wird mit pgflatex uebersetzt + # - die ausgabe wird nach $TARGET_FILE geschrieben + # - fertig. + # + # BUGS: + # - TARGET_FILE != A wird nicht funktionieren (nur die endungen natuerlich) + DRIVER="pdftex" + cd `dirname "$A"` + BASE=`basename $TARGET_FILE` + TMP_TEX_FILE=`mktemp tmp_${BASE}_XXXXXX` + mv "$TMP_TEX_FILE" "${TMP_TEX_FILE}.tex" + TMP_TEX_FILE="$TMP_TEX_FILE.tex" + rm -f "${BASE}.pdf" + + cat >"$TMP_TEX_FILE" <<-EOF + \documentclass{report} + + \input{${TEX_DEFINES}} + + %\def\pgfsysdriver{pgfsys-dvipdfm.def} + %\def\pgfsysdriver{pgfsys-pdftex.def} + \usepackage{tikz} + \pgfrealjobname{${TMP_TEX_FILE%%.tex}} + \begin{document} + \let\oldjobname=\jobname% + % make sure that PGF recognises that jobname==target file name + % even if --jobname has a different path. + \def\jobname{${TARGET_FILE}}% + \input{`basename $A`}% + \let\jobname=\oldjobname + \end{document} + EOF + $CMD --interaction nonstopmode --jobname "$BASE" "${TMP_TEX_FILE}" 1>/dev/null + CODE=$? + if [ $CODE -eq 0 ]; then + rm -f "$TMP_TEX_FILE" + fi + cd $OLD_DIR + fi + + if [ $CODE -ne 0 ]; then + rm -f "${TARGET_FILE}.pdf" + if [ $CONTINUE_ON_ERROR -eq 1 ]; then + echo "WARNING: $A SKIPPED [use -v for messages]." 1>&2 + CODE=0 + continue + else + echo -e "FAILED: could not convert\n\t$A\n->\t$TARGET_FILE.pdf" 1>&2; + exit 1; + fi + fi + CMD="" + case $DRIVER in + dvipdfm) + dvipdfm -o ${TARGET_FILE}.pdf "${TARGET_FILE}.dvi" || exit 1 + pdfcrop "${TARGET_FILE}.pdf" "${TARGET_FILE}.pdf" || exit 1 + ;; + dvips) + dvipdfm -o ${TARGET_FILE}.ps "${TARGET_FILE}.dvi" || exit 1 + ;; + esac + + if [ $ALSO_EPS_OUTPUT -eq 1 ]; then + pdftops -f 1 -l 1 -eps "${TARGET_FILE}.pdf" "${TARGET_FILE}.eps" + if [ $? -ne 0 ]; then + echo "Conversion pdf -> eps FAILED!" 1>&2 + exit 1 + fi + fi +done +cd $OLD_DIR |