diff --git a/bin/fig2mpdf b/bin/fig2mpdf new file mode 100755 index 0000000000000000000000000000000000000000..1ba6384451da3e6067d2f62b15b8d2ce8498a567 --- /dev/null +++ b/bin/fig2mpdf @@ -0,0 +1,653 @@ +#!/bin/sh + +unset POSIXLY_CORRECT + +gawk ' +######################################################################### +######################################################################### +BEGIN { + + cmdGawk = "gawk"; + cmdCat = "cat"; + cmdLess = "less"; + cmdRm = "rm" + cmdMv = "mv" + cmdLatex = "latex"; + cmdPdftex = "pdflatex"; + cmdEpsToPdf = "epstopdf"; + cmdDvips = "dvips"; + cmdFig2dev = "fig2dev"; + cmdTouch = "touch"; + + szVersion = "1.1.2"; + iError = 0; + iGapWidth = 1; + + + # get the options + szOptString = "&l%e&m$p%i%I$s$H$g%G%v%V%d"; + getopt(szOptString); + + if (aOptions["d"]) + { + aOptions["v"] = "-"; + for (iI = 0; iI < ARGC; iI++) + printf("ARGV[%d]=%s\n", iI, ARGV[iI]); + + iDim = split(szOptString, aOpts, "[$%&]"); + for (iI = 2; iI <= iDim; iI++) + debug("aOptions[%s] = >%s<\n", aOpts[iI], aOptions[aOpts[iI]]); + } + + + + if (aOptions["V"] != "") + { + printf("fig2mpdf: version %s\n", szVersion); + iError = 1; + exit(0); + } + + szTmpPrefix = "_fig2mpdf" + + iLine = -1; + iInString = 0; + iDepths = 1; + + iInvalidDepth = -2 + iAdminDepth = 2000 + + szBase = ARGV[1]; + szOrigFile = ARGV[1]; + szOrigPath = ARGV[1]; + + # set default switch state + iDoMultiLayer = 0; + iDoLatex = 0; + iDoPdftex = 1; + iIncludeLowestRange = 1; + + # set iDoLatex and iDoMultiLayer concerning the given suffix + match(szBase, /\.[^\.\/]+$/); + if (RLENGTH != -1) + { + szSuffix = substr(szBase, RSTART); + if (szSuffix == ".lfig") + iDoLatex = 1; + else if (szSuffix == ".mfig") + iDoMultiLayer = 1; + else if ((szSuffix == ".mlfig") || (szSuffix == ".lmfig")) + { + iDoLatex = 1; + iDoMultiLayer = 1; + } + } + + ################################ + # evalutate options + + # set toggle latex + if (aOptions["l"] == "-") + iDoLatex = 1; + if (aOptions["l"] == "+") + iDoLatex = 0; + + # set multilayer flag + if (aOptions["m"] == "-") + iDoMultiLayer = 1; + if (aOptions["m"] == "+") + iDoMultiLayer = 0; + + # set toggle pdftex + if (aOptions["e"] == "-") + iDoPdftex = 0; + + # evaluate do not include lowest layer in all figs + iIncludeLowestRange = (aOptions["i"] == "-"); + + # evaluate include all lower ranges in the sub figs + iIncludeAllLowerRanges = (aOptions["I"] != "-"); + + # check consistencies + # if there are ranges given -> do multilayer + if (aOptions["p"] != "") + iDoMultiLayer = 1; + + + if (aOptions["g"] != "") + { + if ( ! match (aOptions["g"], /^[0-9]+$/)) + usage(); + + iGapWidth = aOptions["g"] + 1; + } + + # get the basename of the source + gsub(/\.[^\/]+$/, "", szBase); + gsub(/^.*\//, "", szBase); + + # get the path to the original + gsub(/[^\/]+$/, "", szOrigPath); +} +######################################################################### +######################################################################### + +( iInString != 0) { + aszLine[iLine] = sprintf("%s\n%s", aszLine[iLine], $0); + iInString = (match($0, "\\\\001$") == 0); + iSubLine++; + next; +} + +/^[135][ ]/ { + iCmd = $1; + iSubCmd = -1; + iSubLine = 0; + aiDepth[++iLine] = fnGetDepth($1); + aszLine[iLine] = $0; + next; +} + +/^[2][ ]/ { + iCmd = $1; + iSubCmd = $2; + iSubLine = 0; + aiDepth[++iLine] = fnGetDepth($1); + aszLine[iLine] = $0; + next; +} + + +/^[4][ ]/ { + iCmd = $1; + iSubCmd = $2; + iSubLine = 0; + aiDepth[++iLine] = fnGetDepth($1); + aszLine[iLine] = $0; + iInString = (match($0, "\\\\001$") == 0); + next; +} + +/^(6[ ])|(-6)/ { + iCmd = $1; + iSubCmd = -1; + iSubLine = 0; + next; +} + +/^[^ ]/ { + iCmd = -1; + aiDepth[++iLine] = fnGetDepth("A"); + iSubLine = 0; + aszLine[iLine] = $0; + next; +} + +/^[ ]/ { + iSubLine++; + if ((iCmd == 2) && (iSubCmd == 5) && (iSubLine == 1)) + { + if (match($0, "^\t[01] ")) + { + szFileName = substr($0, RSTART + RLENGTH); + if ( ! match(szFileName, /^\//)) + szFileName = sprintf("%s%s", szOrigPath, szFileName); + aszLine[iLine] = sprintf("%s\n\t%s %s", aszLine[iLine], $1, szFileName); + } + else + aszLine[iLine] = sprintf("%s\n%s", aszLine[iLine], $0); + } + else + aszLine[iLine] = sprintf("%s\n%s", aszLine[iLine], $0); +} + + +END { + iLine++; + iLowestLayer = 0; + iFirstRange = 0; + + if (iError == 0) + { + + + if (iDoMultiLayer) + { + asort(aiDepths, aiSortedDepth); + + # check for ranges as options + if (aOptions["p"] != "") + { + # we have explicit ranges + gsub(/-/, ":", aOptions["p"]); + iRanges = split(aOptions["p"], aszRanges, ","); + } + else + { + if (iDepths < 4) + { + iRanges = 1; + aszRanges[1] = "1:999"; + } + else + { + iRanges = 0; + iLastRange = aiSortedDepth[iDepths - 2] + 0; + iRangeStart = iLastRange; + for (iI = iDepths - 3; iI > 0; iI--) + { + aiSortedDepth[iI] += 0; + if ((aiSortedDepth[iI] < iLastRange - iGapWidth) || (iI == 1)) + { + if (aiSortedDepth[iI] >= iLastRange - iGapWidth) + iLastRange = aiSortedDepth[iI]; + + if (iLastRange != iRangeStart) + aszRanges[++iRanges] = sprintf("%d:%d", iLastRange, iRangeStart); + else + aszRanges[++iRanges] = sprintf("%d", iRangeStart); + iRangeStart = aiSortedDepth[iI]; + + if ((iI == 1) && (aiSortedDepth[iI] < iLastRange - iGapWidth)) + aszRanges[++iRanges] = sprintf("%d", aiSortedDepth[iI]); + } + iLastRange = aiSortedDepth[iI]; + } + } + } + + + # check for a multilayer file with only one range + if ((iRanges == 1) && iIncludeLowestRange) + { + iIncludeLowestRange = 0; + } + + szInitRangeList = " -D "; + szSep = ""; + + if (iIncludeLowestRange) + { + szInitRangeList = sprintf("%s+%s", szInitRangeList, aszRanges[1]); + szSep = ","; + } + szRangeList = szInitRangeList; + + # step through the ranges + for (iI = iIncludeLowestRange; iI < iRanges; iI++) + { + szFileBase = sprintf("%s-%d", szBase, iI - iIncludeLowestRange); + + if (aOptions["I"]) + { + szRangeList = sprintf("%s%s+%s", szRangeList, szSep, aszRanges[iI + 1]); + szSep = ","; + } + else + szRangeList = sprintf("%s%s+%s", szInitRangeList, szSep, aszRanges[iI + 1]); + + + if (iDoLatex) + szTargetFile = fnDoTexFig(szFileBase, szOrigFile, szRangeList, (iDoPdftex != 0)); + else + szTargetFile = fnDoNormalFig(szFileBase, szOrigFile, szRangeList, (iDoPdftex != 0)); + + + if (aOptions["G"]) + { + match(szTargetFile, /\.[^.]*$/); + szCommand = sprintf("%s %s %s.page%d%s", cmdMv, szTargetFile, szBase, iI - iIncludeLowestRange, substr(szTargetFile, RSTART, RLENGTH)); + debug("%s\n", szCommand); + system(szCommand); + } + } + } + else + { + szRangeList = ""; + + if (iDoLatex) + szTargetFile = fnDoTexFig(szBase, szOrigFile, szRangeList, (iDoPdftex != 0)); + else + szTargetFile = fnDoNormalFig(szBase, szOrigFile, szRangeList, (iDoPdftex != 0)); + } + } +} + + + +######################################################################### +######################################################################### +function debug(str, arg0, arg1, arg2, arg3, arg4) +{ + if (aOptions["v"]) + printf (str, arg0, arg1, arg2, arg3, arg4); +} + +######################################################################### +######################################################################### +function fnGetDepth (iControl) +{ + + if (iControl == 1) + { + iReturn = sprintf("%04d", $7); + } + else if (iControl == 2) + { + iReturn = sprintf("%04d", $7); + } + else if (iControl == 3) + { + iReturn = sprintf("%04d", $7); + } + else if (iControl == 4) + { + iReturn = sprintf("%04d", $4); + } + else if (iControl == 5) + { + iReturn = sprintf("%04d", $7); + } + else if ((iControl == 6) || (iControl == -6)) + { + iReturn = sprintf("%04d", iInvalidDepth); + } + else + { + iReturn = sprintf("%04d", iAdminDepth); + } + + if (iReturn >= 0) + { + if (ahDepths[iReturn] == 0) + { + ahDepths[iReturn] = 1; + aiDepths[iDepths++] = iReturn; + } + } + + return (iReturn); + +} + +######################################################################### +######################################################################### +function fnDoNormalFig(szFileNameBase, szFigFile, szRangeList, iPdf, + szEpsFile, szPdfFile, szTargetFile, szCommand) +{ + + debug("FileNameBase >%s< FigFile >%s< Pdf:%d\n", szFileNameBase, szFigFile, iPdf); + + if (iPdf) + szEpsFile = sprintf("%s%s.eps", szTmpPrefix, szFileNameBase); + else + { + szEpsFile = sprintf("%s.eps", szFileNameBase); + szTargetFile = szEpsFile; + } + + szCommand = sprintf("%s -L eps %s %s %s 2> /dev/null", cmdFig2dev, szRangeList, szFigFile, szEpsFile); + debug("%s\n", szCommand); + system(szCommand); + + if (iPdf) + { + szPdfFile = sprintf("%s.pdf", szFileNameBase); + szTargetFile = szPdfFile; + szCommand = sprintf("%s --outfile=%s %s", cmdEpsToPdf, szPdfFile, szEpsFile); + debug("%s\n", szCommand); + system(szCommand); + + + if ( ! aOptions["d"]) + { + szCommand = sprintf("%s -f %s", cmdRm, szEpsFile); + debug("%s\n", szCommand); + system(szCommand); + } + } + + + return (szTargetFile); +} + + +######################################################################### +######################################################################### +function fnDoTexFig(szFileNameBase, szFigFile, szRangeList, iPdf, + szEpsFile, szPdfFile, szTexDoc, szTexPdf, szTexLog, szTexAux, szTexInp, szTmpPs, szTmpPdf, szTexSiz, szTmpEps, szCommand, szHeader) +{ + + debug("FileNameBase >%s< FigFile >%s< Pdf:%d\n", szFileNameBase, szFigFile, iPdf); + + szEpsFile = sprintf("%s.eps", szFileNameBase); + szPdfFile = sprintf("%s.pdf", szFileNameBase); + szTexDoc = sprintf("%s%s_doc.tex", szTmpPrefix, szFileNameBase); + szTexPdf = sprintf("%s%s_doc.pdf", szTmpPrefix, szFileNameBase); + szTexDvi = sprintf("%s%s_doc.dvi", szTmpPrefix, szFileNameBase); + szTexLog = sprintf("%s%s_doc.log", szTmpPrefix, szFileNameBase); + szTexAux = sprintf("%s%s_doc.aux", szTmpPrefix, szFileNameBase); + szTexInpPref = sprintf("%s%s_inp", szTmpPrefix, szFileNameBase); + szTexInp = sprintf("%s.tex", szTexInpPref); + szTexCreator = sprintf("%s.create", szTexInpPref); + szTexSiz = sprintf("%s.size", szTexInpPref); + + if (iPdf) + szCommand = sprintf("%s -L pdftex_p %s -p %s %s %s", cmdFig2dev, szRangeList, szTexInpPref, szFigFile, szTexInp); + else + szCommand = sprintf("%s -L pstex_p %s -p %s %s %s", cmdFig2dev, szRangeList, szTexInpPref, szFigFile, szTexInp); + debug("%s\n", szCommand); + system(szCommand); + + szCommand = sprintf("./%s", szTexCreator); + debug("%s\n", szCommand); + system(szCommand); + + # check if there is an own hederfile to include + if (aOptions["s"] == "") + aOptions["s"] = "times"; + + if (aOptions["H"] == "") + { + szHeader = sprintf("\\documentclass{article}\n\ +\\usepackage{german,amssymb,amsmath}\n\ +\\usepackage{%s}", aOptions["s"]); + } + else + szHeader = sprintf("\\input{%s}\n", aOptions["H"]); + + szHeader = sprintf("%s\n\ +\\usepackage{color}\n\ +\\usepackage{ifpdf}\n\ +\\setlength{\\textwidth}{100cm}\n\ +\\setlength{\\textheight}{100cm}\n\ +\\setlength{\\topmargin}{-1in}\n\ +\\setlength{\\headsep}{0pt}\n\ +\\setlength{\\headheight}{0pt}\n\ +\\setlength{\\oddsidemargin}{-1in}\n\ +\\parindent=0cm\n\ +\\ifpdf\n\ +\\usepackage[pdftex]{graphicx}\n\ +\\DeclareGraphicsExtensions{.pdf,.png,.jpg}\n\ +\\usepackage{epsfig}\n\ +\\input{%s}\n\ +\\else\n\ +\\usepackage{graphicx}\n\ +\\usepackage{epsfig}\n\ +\\fi\n\ +", szHeader, szTexSiz); + + szCommand = sprintf("%s > %s << EOF\n\ +%s\\begin{document}\n\ +\\pagestyle{empty}\n\ +\\input{%s}\n\ +\\end{document}\n\ +EOF", cmdCat, szTexDoc, szHeader, szTexInp); + if (aOptions["d"] != "") + debug("%s\n", szCommand); + system(szCommand); + + if (iPdf) + { + + szCommand = sprintf("%s -interaction batchmode %s", cmdPdftex, szTexDoc); + debug("%s\n", szCommand); + iReturn = system(szCommand); + + if (iReturn) + { + szCommand = sprintf("%s %s | %s +G", cmdCat, szTexLog, cmdLess); + system (szCommand); + } + else + { + szCommand = sprintf("%s %s %s", cmdMv, szTexPdf, szPdfFile); + debug("%s\n", szCommand); + system(szCommand); + } + + } + else + { + szCommand = sprintf("%s -interaction batchmode %s", cmdLatex, szTexDoc); + debug("%s\n", szCommand); + iReturn = system(szCommand); + if (iReturn) + { + szCommand = sprintf("%s %s | %s +G", cmdCat, szTexLog, cmdLess); + system (szCommand); + } + else + { + szCommand = sprintf("%s -q -E %s -o %s 2>&1 > /dev/null", cmdDvips, szTexDvi, szEpsFile); + debug("%s\n", szCommand); + system(szCommand); + } + } + + if ( ! aOptions["d"]) + { + szCommand = sprintf("./%s -r", szTexCreator); + debug("%s\n", szCommand); + system(szCommand); + } + + if ( ! aOptions["d"]) + { + szCommand = sprintf("%s -f %s %s %s %s %s %s %s", cmdRm, szTexDoc, szTexLog, szTexAux, szTexDvi, szTexInp, szTexCreator, szTexPdf); + debug("%s\n", szCommand); + system(szCommand); + } + + if (iPdf) + return (szPdfFile); + else + return (szEpsFile); +} + + +######################################################################### +######################################################################### +function getopt(sOptions, n, m, fHuntParam, iSearchMinus, iSPos, iCLen, iHuntSwitches, szSwChar, szOptChar) { +# Options: Flagoptions: %f +# Parameter: $p + + n = 1; # index in argv + m = 1; # processed entries in argv finally it points to the firs$ + iSearchMinus = 1; # indicate that a switch leading sign minus is expected + + # check for initial -- to separate the gawk switches from the script switches + if (ARGV[n] == "--") + n++; + + + while (n < ARGC) + { + iHuntSwitches = 0; + iCLen = length(ARGV[n]); + + szSwChar = substr(ARGV[n], 1, 1); + if ((szSwChar == "-") || (szSwChar == "+")) + { + if ((iSearchMinus == 0) || fHuntParam) + usage(); + iHuntSwitches = 1; + iSPos = 2; + fHuntParam = 0; + } + else + { + iSPos = 1; + + if (fHuntParam == 0) + iSearchMinus = 0; + } + + while (iSPos <= iCLen) + { + if (iHuntSwitches) + { + szOptChar = substr(ARGV[n], iSPos, 1); + iOPos = index(sOptions, szOptChar); + if (iOPos == 0) + { + printf("unknown option \"%s\"\n", szOptChar); + usage(); + } + if ((substr(sOptions, iOPos - 1, 1) == "&") || ((substr(sOptions, iOPos - 1, 1) == "%") && (szSwChar == "-"))) + { + aOptions[szOptChar] = szSwChar; + iSPos = iSPos + 1; + } + else if ((substr(sOptions, iOPos - 1, 1) == "$") && (szSwChar == "-")) + { + fHuntParam = 1; + iHuntSwitches = 0; + iSPos = iSPos + 1; + } + else + usage(); + + } + else if (fHuntParam) + { + fHuntParam = 0; + aOptions[szOptChar] = substr(ARGV[n], iSPos, iCLen + 1 - iSPos); + iSPos = iCLen + 1; + } + else + { + ARGV[m++] = ARGV[n]; + iSPos = iCLen + 1; + } + } + n = n + 1; + } + ARGC = m; +} + + +######################################################################### +######################################################################### +function usage() { + print "usage: fig2mpdf [-|+lm] [-eiIGvV] [-p <ranges>] [-g <gapwidth>] [-s <style>] [-H <headerfile>] file\n\ +\n\ + -|+l set|reset latex call\n\ + -e create an eps file instead of a pdf\n\ + -|+m set|reset multilayer creation\n\ + -p <ranges> colon separated list of layer ranges a-b,c,d-e,...\n\ + -i do include the deepest range in all figures\n\ + (the one with the higest level number)\n\ + -I include all lower ranges (pyramide mode)\n\ + -g <gap> set layer gapwidth for automatically detecting ranges (default:0)\n\ + -s <style> replace \\usepackage{times} by \\usepackage{<style>} in the latex commands\n\ + -H <header> use file <header> for creating tex documents (only\n\ + \\begin{document}...\\end{document} is set by fig2mpdf)\n\ + -G name multilayer files in PGF file name format <name>.page<no>.<ext>\n\ + -v be verbose\n\ + -V print out the version of fig2mpdf\n"; + exit 1; +} +' -- $* +