forked from pool/transfig
1435 lines
40 KiB
Diff
1435 lines
40 KiB
Diff
---
|
|
fig2dev/dev/genpstex.c | 331 ++++++++++++++++++++++++
|
|
fig2dev/drivers.h | 4
|
|
fig2dev/fig2dev.c | 23 +
|
|
fig2mpdf/copyright.txt | 25 +
|
|
fig2mpdf/fig2mpdf | 653 +++++++++++++++++++++++++++++++++++++++++++++++++
|
|
fig2mpdf/fig2mpdf.1 | 208 +++++++++++++++
|
|
man/fig2dev.1.in | 69 +++++
|
|
7 files changed, 1311 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/fig2dev/dev/genpstex.c b/fig2dev/dev/genpstex.c
|
|
--- a/fig2dev/dev/genpstex.c
|
|
+++ b/fig2dev/dev/genpstex.c
|
|
@@ -46,9 +46,13 @@
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
+#include <sys/stat.h>
|
|
+#include <stdlib.h>
|
|
|
|
#include "fig2dev.h"
|
|
#include "object.h"
|
|
+#include "texfonts.h"
|
|
+#include "setfigfont.h"
|
|
|
|
extern double rad2deg;
|
|
|
|
@@ -74,6 +78,308 @@ extern void genps_grid(float major, floa
|
|
|
|
static char pstex_file[1000] = "";
|
|
|
|
+static int iObjectsRead = 0;
|
|
+static int iTextRead = 0;
|
|
+static int iObjectsFileNumber = 0;
|
|
+static int iStartDepth;
|
|
+static int iLastDepth;
|
|
+static FILE * ptCreateFile;
|
|
+static char szFileName[1000];
|
|
+static int iLength;
|
|
+static int iPdfOutputs = 0;
|
|
+
|
|
+#ifdef never
|
|
+static double unitlength;
|
|
+static double dash_mag = 1.0;
|
|
+
|
|
+static int (*translate_coordinates)() = NULL;
|
|
+static int (*translate_coordinates_d)() = NULL;
|
|
+#else
|
|
+extern double unitlength;
|
|
+extern double dash_mag;
|
|
+
|
|
+extern int (*translate_coordinates)();
|
|
+extern int (*translate_coordinates_d)();
|
|
+#endif
|
|
+
|
|
+#define TOP 840
|
|
+#define SWAP(x,y) {tmp=x; x=y; y=tmp;}
|
|
+#define TRANS(x,y) (*translate_coordinates)(&x,&y)
|
|
+#define TRANS2(x1,y1,x2,y2) (*translate_coordinates)(&x1,&y1); \
|
|
+ (*translate_coordinates)(&x2,&y2)
|
|
+#define TRANSD(x,y) (*translate_coordinates_d)(&x,&y)
|
|
+
|
|
+static void genpstex_p_finalize_objects(int depth);
|
|
+
|
|
+/*************************************************************************
|
|
+ *************************************************************************/
|
|
+static int
|
|
+translate2(xp, yp)
|
|
+ int *xp, *yp;
|
|
+{
|
|
+ *xp = *xp + 1;
|
|
+ *yp = (double)(TOP - *yp -1);
|
|
+ }
|
|
+
|
|
+static int
|
|
+translate1_d(xp, yp)
|
|
+ double *xp, *yp;
|
|
+{
|
|
+ *xp = *xp + 1.0;
|
|
+ *yp = *yp + 1.0;
|
|
+ }
|
|
+
|
|
+static int
|
|
+translate2_d(xp, yp)
|
|
+ double *xp, *yp;
|
|
+{
|
|
+ *xp = *xp + 1.0;
|
|
+ *yp = (double)TOP - *yp -1.0;
|
|
+ }
|
|
+
|
|
+/*************************************************************************
|
|
+ *************************************************************************/
|
|
+void
|
|
+genpstex_p_option(char opt, char *optarg)
|
|
+{
|
|
+ if (opt == 'p')
|
|
+ {
|
|
+ strcpy(pstex_file, optarg);
|
|
+ }
|
|
+ else
|
|
+ genlatex_option(opt, optarg);
|
|
+}
|
|
+
|
|
+
|
|
+/*************************************************************************
|
|
+ *************************************************************************/
|
|
+void genpstex_p_start(objects)
|
|
+ F_compound *objects;
|
|
+{
|
|
+ int tmp;
|
|
+ struct stat tStat;
|
|
+ long lUnitLength;
|
|
+
|
|
+ if (*pstex_file == '\0')
|
|
+ {
|
|
+ put_msg("Argument -p is mandatory to pstex_p.");
|
|
+ exit(1);
|
|
+ }
|
|
+
|
|
+ strncpy(szFileName, pstex_file, 900);
|
|
+ iLength = strlen(szFileName);
|
|
+
|
|
+ sprintf(szFileName + iLength, ".create");
|
|
+ ptCreateFile = fopen (szFileName, "wb");
|
|
+
|
|
+ if ( ! ptCreateFile)
|
|
+ {
|
|
+ put_msg("Couldn't open %s for writing", szFileName);
|
|
+ exit(1);
|
|
+ }
|
|
+ fstat(fileno(ptCreateFile), & tStat);
|
|
+ fchmod (fileno(ptCreateFile), tStat.st_mode | ((tStat.st_mode & (S_IRUSR | S_IRGRP | S_IROTH)) >> 2));
|
|
+ fprintf(ptCreateFile, "#!/bin/bash\n\n");
|
|
+
|
|
+ fprintf(ptCreateFile, "while getopts \"r\" Option\n");
|
|
+ fprintf(ptCreateFile, "do\n");
|
|
+ fprintf(ptCreateFile, " case $Option in\n");
|
|
+ fprintf(ptCreateFile, " r) iOptRemove=1;;\n");
|
|
+ fprintf(ptCreateFile, " *) echo \"illegal option -$Option\"\n");
|
|
+ fprintf(ptCreateFile, " esac\n");
|
|
+ fprintf(ptCreateFile, "done\n");
|
|
+ fprintf(ptCreateFile, "shift $(($OPTIND - 1))\n");
|
|
+
|
|
+ texfontsizes[0] = texfontsizes[1] =
|
|
+ TEXFONTSIZE(font_size != 0.0? font_size : DEFAULT_FONT_SIZE);
|
|
+
|
|
+ unitlength = mag/ppi;
|
|
+ dash_mag /= unitlength*80.0;
|
|
+
|
|
+ translate_coordinates = translate2;
|
|
+ translate_coordinates_d = translate2_d;
|
|
+
|
|
+ TRANS2(llx, lly, urx, ury);
|
|
+ if (llx > urx) SWAP(llx, urx)
|
|
+ if (lly > ury) SWAP(lly, ury)
|
|
+
|
|
+ /* LaTeX start */
|
|
+
|
|
+ /* print any whole-figure comments prefixed with "%" */
|
|
+ if (objects->comments) {
|
|
+ fprintf(tfp,"%%\n");
|
|
+ print_comments("% ",objects->comments, "");
|
|
+ fprintf(tfp,"%%\n");
|
|
+ }
|
|
+
|
|
+ lUnitLength = (long) (round(4736286.72*unitlength));
|
|
+ fprintf(tfp, "\\setlength{\\unitlength}{%lisp}%%\n",
|
|
+ lUnitLength);
|
|
+ /* define the SetFigFont macro */
|
|
+ define_setfigfont(tfp);
|
|
+
|
|
+ sprintf(szFileName + iLength, ".size");
|
|
+ fprintf(ptCreateFile, "if [ \"$iOptRemove\" == \"\" ]; then\n");
|
|
+ if (iPdfOutputs)
|
|
+ fprintf(ptCreateFile, " echo \"\\setlength\\pdfpagewidth{%3.2fpt}\\setlength\\pdfpageheight{%3.2fpt}\" > %s\n",
|
|
+ (float) lUnitLength / 65536 * (urx - llx), (float) lUnitLength / 65536 * (ury - lly), szFileName);
|
|
+ else
|
|
+ fprintf(ptCreateFile, "echo -n\"\" > %s\n", szFileName);
|
|
+ fprintf(ptCreateFile, "else\n rm -f %s\nfi\n", szFileName);
|
|
+}
|
|
+
|
|
+/*************************************************************************
|
|
+ *************************************************************************/
|
|
+void genpdftex_p_start(objects)
|
|
+ F_compound *objects;
|
|
+{
|
|
+ iPdfOutputs = 1;
|
|
+ genpstex_p_start(objects);
|
|
+}
|
|
+
|
|
+
|
|
+/*************************************************************************
|
|
+ *************************************************************************/
|
|
+int genpstex_p_end()
|
|
+{
|
|
+ if (iTextRead)
|
|
+ {
|
|
+ fprintf(tfp, "\\end{picture}%%\n");
|
|
+ iTextRead = 0;
|
|
+ }
|
|
+ if (iObjectsRead)
|
|
+ {
|
|
+ genpstex_p_finalize_objects(iLastDepth);
|
|
+ iObjectsRead = 0;
|
|
+ }
|
|
+
|
|
+ /* LaTeX ending */
|
|
+ fprintf(tfp, "\\begin{picture}(%d,%d)\n", urx-llx, ury-lly);
|
|
+ fprintf(tfp, "\\end{picture}%%\n");
|
|
+
|
|
+ fclose(ptCreateFile);
|
|
+
|
|
+ /* all ok */
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+
|
|
+/*************************************************************************
|
|
+ *************************************************************************/
|
|
+void genpstex_p_finalize_objects(depth)
|
|
+int depth;
|
|
+{
|
|
+ char szFileName[1000];
|
|
+ int iLength;
|
|
+
|
|
+ strncpy(szFileName, pstex_file, 900);
|
|
+ iLength = strlen(szFileName);
|
|
+
|
|
+
|
|
+ sprintf(szFileName + iLength, "%03d", iObjectsFileNumber++);
|
|
+ fprintf(ptCreateFile, "if [ \"$iOptRemove\" == \"\" ]; then\n");
|
|
+ if (iPdfOutputs)
|
|
+ {
|
|
+ fprintf(ptCreateFile, " %s -L pstex -D +%d:%d %s", prog, depth, iStartDepth, from);
|
|
+ fprintf(ptCreateFile, " | epstopdf -f > %s.pdf\n", szFileName);
|
|
+ }
|
|
+ else
|
|
+ fprintf(ptCreateFile, "%s -L pstex -D +%d:%d %s %s.eps\n", prog, depth, iStartDepth, from, szFileName);
|
|
+ fprintf(ptCreateFile, "else\n rm -f %s.", szFileName);
|
|
+ if (iPdfOutputs)
|
|
+ fprintf(ptCreateFile, "pdf");
|
|
+ else
|
|
+ fprintf(ptCreateFile, "eps");
|
|
+ fprintf(ptCreateFile, "\nfi\n");
|
|
+
|
|
+ fprintf(tfp, "\\begin{picture}(0,0)%%\n");
|
|
+/* newer includegraphics directive suggested by Stephen Harker 1/13/99 */
|
|
+#if defined(LATEX2E_GRAPHICS)
|
|
+# if defined(EPSFIG)
|
|
+ fprintf(tfp, "\\epsfig{file=%s.eps}%%\n",szFileName);
|
|
+# else
|
|
+ fprintf(tfp, "\\includegraphics{%s}%%\n",szFileName);
|
|
+# endif
|
|
+#else
|
|
+ fprintf(tfp, "\\special{psfile=%s.eps}%%\n",szFileName);
|
|
+#endif
|
|
+ fprintf(tfp, "\\end{picture}%%\n");
|
|
+}
|
|
+
|
|
+/*************************************************************************
|
|
+ *************************************************************************/
|
|
+void genpstex_p_object(depth)
|
|
+int depth;
|
|
+{
|
|
+ if (iTextRead)
|
|
+ {
|
|
+ fprintf(tfp, "\\end{picture}%%\n");
|
|
+ iTextRead = 0;
|
|
+ }
|
|
+ if (iObjectsRead == 0)
|
|
+ {
|
|
+ iStartDepth = depth;
|
|
+ iObjectsRead = 1;
|
|
+ }
|
|
+ iLastDepth = depth;
|
|
+
|
|
+}
|
|
+
|
|
+void genpstex_p_arc(obj)
|
|
+F_arc *obj;
|
|
+{
|
|
+ genpstex_p_object(obj->depth);
|
|
+}
|
|
+
|
|
+
|
|
+void genpstex_p_ellipse(obj)
|
|
+F_ellipse *obj;
|
|
+{
|
|
+ genpstex_p_object(obj->depth);
|
|
+}
|
|
+
|
|
+void genpstex_p_line(obj)
|
|
+F_line *obj;
|
|
+{
|
|
+ genpstex_p_object(obj->depth);
|
|
+}
|
|
+
|
|
+void genpstex_p_spline(obj)
|
|
+F_spline *obj;
|
|
+{
|
|
+ genpstex_p_object(obj->depth);
|
|
+}
|
|
+
|
|
+
|
|
+
|
|
+/*************************************************************************
|
|
+ *************************************************************************/
|
|
+void genpstex_p_text(t)
|
|
+F_text *t;
|
|
+{
|
|
+
|
|
+ if (!special_text(t))
|
|
+ genpstex_p_object(t->depth);
|
|
+ else
|
|
+ {
|
|
+ if (iObjectsRead)
|
|
+ {
|
|
+ genpstex_p_finalize_objects(iLastDepth);
|
|
+ iObjectsRead = 0;
|
|
+ }
|
|
+ if (iTextRead == 0)
|
|
+ {
|
|
+ fprintf(tfp, "\\begin{picture}(0,0)(%d,%d)\n", llx, lly);
|
|
+ iTextRead = 1;
|
|
+ }
|
|
+ genlatex_text(t);
|
|
+ }
|
|
+
|
|
+}
|
|
+
|
|
+/*************************************************************************
|
|
+ *************************************************************************/
|
|
+
|
|
void
|
|
genpstex_t_option(char opt, char *optarg)
|
|
{
|
|
@@ -123,6 +429,32 @@ genpstex_option(char opt, char *optarg)
|
|
genlatex_option(opt, optarg);
|
|
}
|
|
|
|
+struct driver dev_pstex_p = {
|
|
+ genpstex_p_option,
|
|
+ genpstex_p_start,
|
|
+ (void(*)(float,float))gendev_null,
|
|
+ genpstex_p_arc,
|
|
+ genpstex_p_ellipse,
|
|
+ genpstex_p_line,
|
|
+ genpstex_p_spline,
|
|
+ genpstex_p_text,
|
|
+ genpstex_p_end,
|
|
+ INCLUDE_TEXT
|
|
+};
|
|
+
|
|
+struct driver dev_pdftex_p = {
|
|
+ genpstex_p_option,
|
|
+ genpdftex_p_start,
|
|
+ (void(*)(float,float))gendev_null,
|
|
+ genpstex_p_arc,
|
|
+ genpstex_p_ellipse,
|
|
+ genpstex_p_line,
|
|
+ genpstex_p_spline,
|
|
+ genpstex_p_text,
|
|
+ genpstex_p_end,
|
|
+ INCLUDE_TEXT
|
|
+};
|
|
+
|
|
struct driver dev_pstex_t = {
|
|
genpstex_t_option,
|
|
genpstex_t_start,
|
|
diff --git a/fig2dev/drivers.h b/fig2dev/drivers.h
|
|
--- a/fig2dev/drivers.h
|
|
+++ b/fig2dev/drivers.h
|
|
@@ -36,8 +36,10 @@ extern struct driver dev_eps;
|
|
extern struct driver dev_pdf;
|
|
extern struct driver dev_pdftex;
|
|
extern struct driver dev_pdftex_t;
|
|
+extern struct driver dev_pdftex_p;
|
|
extern struct driver dev_pstex;
|
|
extern struct driver dev_pstex_t;
|
|
+extern struct driver dev_pstex_p;
|
|
extern struct driver dev_pstricks;
|
|
extern struct driver dev_textyl;
|
|
extern struct driver dev_tk;
|
|
@@ -84,6 +86,7 @@ struct {
|
|
{"pdf", NULL, &dev_pdf},
|
|
{"pdftex", NULL, &dev_pdftex},
|
|
{"pdftex_t", NULL, &dev_pdftex_t},
|
|
+ {"pdftex_p", NULL, &dev_pdftex_p},
|
|
{"pic", NULL, &dev_pic},
|
|
{"pict2e", NULL, &dev_pict2e},
|
|
{"pictex", NULL, &dev_pictex},
|
|
@@ -92,6 +95,7 @@ struct {
|
|
{"ps", NULL, &dev_ps},
|
|
{"pstex", NULL, &dev_pstex},
|
|
{"pstex_t", NULL, &dev_pstex_t},
|
|
+ {"pstex_p", NULL, &dev_pstex_p},
|
|
{"pstricks", NULL, &dev_pstricks},
|
|
{"ptk", NULL, &dev_ptk},
|
|
{"shape", NULL, &dev_shape},
|
|
diff --git a/fig2dev/fig2dev.c b/fig2dev/fig2dev.c
|
|
--- a/fig2dev/fig2dev.c
|
|
+++ b/fig2dev/fig2dev.c
|
|
@@ -829,6 +829,23 @@ help_msg(void)
|
|
);
|
|
}
|
|
|
|
+ if (dev == NULL || !strcmp(lang, "pstex_p") ||
|
|
+ !strcmp(lang, "pdftex_p")) {
|
|
+ puts(
|
|
+"PSTEX_P and PDFTEX_P Options:\n"
|
|
+" -p name basename of the files to be created\n"
|
|
+#ifdef NFSS
|
|
+" -F don't set font family/series/shape, so you can\n"
|
|
+" set it from latex\n"
|
|
+#endif /* NFSS */
|
|
+" -d dmag set separate magnification for length of line dashes to dmag\n"
|
|
+" -E num set encoding for text translation (0 no translation,\n"
|
|
+" 1 ISO-8859-1, 2 ISO-8859-2)\n"
|
|
+" -l lwidth set threshold between thin and thick lines to lwidth\n"
|
|
+" -v verbose mode\n"
|
|
+ );
|
|
+ }
|
|
+
|
|
if (dev == NULL || !strcmp(lang, "shape")) {
|
|
puts(
|
|
"SHAPE (ShapePar driver) Options:\n"
|
|
@@ -974,6 +991,12 @@ static int compound_dump(F_compound *com
|
|
static int
|
|
rec_comp(struct obj_rec *r1, struct obj_rec *r2)
|
|
{
|
|
+ if (r2->depth == r1->depth)
|
|
+ {
|
|
+ if ((r1->gendev == dev->text) ^ (r2->gendev == dev->text))
|
|
+ return ((r1->gendev == dev->text) * 2 - 1);
|
|
+ return (0);
|
|
+ }
|
|
return (r2->depth - r1->depth);
|
|
}
|
|
|
|
diff --git a/fig2mpdf/copyright.txt b/fig2mpdf/copyright.txt
|
|
--- a/fig2mpdf/copyright.txt
|
|
+++ b/fig2mpdf/copyright.txt
|
|
@@ -0,0 +1,25 @@
|
|
+The following files contain copyright and license info for
|
|
+the code they contain:
|
|
+fig2mpdf, fig2mpdf.1, transfig.3.2.4.patch, transfig-3.2.5-alpha7.patch
|
|
+
|
|
+-- fig2mpdf copyright begins here --
|
|
+
|
|
+ fig2mpdf/pdftex_p and pstex_p driver of fig2dev
|
|
+ Copyright (C) 2006 Michael Pfeiffer -- p3fff@web.de
|
|
+
|
|
+ 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 2 of the License, 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, write to the Free Software
|
|
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
+
|
|
+ (Author's note: the license is in the file gpl.txt, which is included
|
|
+ in the archive.)
|
|
diff --git a/fig2mpdf/fig2mpdf.1 b/fig2mpdf/fig2mpdf.1
|
|
--- a/fig2mpdf/fig2mpdf.1
|
|
+++ b/fig2mpdf/fig2mpdf.1
|
|
@@ -0,0 +1,208 @@
|
|
+.TH fig2mpdf 1 "Jun 2006" "" "Including xfig figures into LaTeX documents"
|
|
+.SH NAME
|
|
+fig2mpdf \- creation of multilayer pdf or eps figures from fig files using latex for typesetting
|
|
+.SH SYNOPSIS
|
|
+.B fig2mpdf
|
|
+[\fIOPTION\fR]... \fIFILE\fR
|
|
+.SH DESCRIPTION
|
|
+.PP
|
|
+This tool can create pdf or eps figures using fig files as source. For beamer
|
|
+presentations, for example, you can use the multilayer mode to create
|
|
+multiple figures that can be overlayed to get a dynamic figure. For
|
|
+proper appearance you can use latex to typeset some or all texts,
|
|
+possibly containing formulas.
|
|
+
|
|
+The default interpretation of the given fig \fIFILE\fR depends on its suffix.
|
|
+.TP
|
|
+\fIfig\fR
|
|
+Normal conversion of a fig file. All texts are interpreted as postscript
|
|
+texts and all elements of the figure are included in the resulting figure.
|
|
+.TP
|
|
+\fIlfig\fR
|
|
+LaTeX interpretation of the file. All texts of the input file that have the
|
|
+special bit set are typeset by pdflatex resp. latex (see: Option \fB\-|+l\fR).
|
|
+.TP
|
|
+\fImfig\fR
|
|
+Multilayer file interpretation. Depending on the used depths of the
|
|
+figure it is split into multiple parts. For each part an output file is
|
|
+created (see: section \fBMultiLayerOutput\fR).
|
|
+.TP
|
|
+\fImlfig\fR or \fIlmfig\fR
|
|
+Combination of multilayer and LaTeX interpretation of the input (see: Suffix
|
|
+\fIlfig\fR and \fImfig\fR).
|
|
+.PP
|
|
+The default interpretation of the input can be changed by using the options below.
|
|
+.SH OPTIONS
|
|
+.PP
|
|
+.TP
|
|
+\fB\-e\fR
|
|
+produce an eps output file. Instead of creating a pdf file (the default)
|
|
+an eps figure is produced.
|
|
+.TP
|
|
+\fB\-|+l\fR
|
|
+force calling (pdf)latex (-) or do not use (pdf)latex (+) for
|
|
+typesetting the text marked with the special flag. With this option you
|
|
+can change the default behavior given by the input file suffix.
|
|
+.TP
|
|
+\fB\-|+m\fR
|
|
+force set (-) or unset (+) the multilayer interpretation (see:
|
|
+\fBMultiLayerOutput\fR below) which was previously set by the input
|
|
+file suffix.
|
|
+.TP
|
|
+\fB\-p\fR \fIranges\fR
|
|
+explicitly set the ranges of depths for splitting the input figure in
|
|
+multilayer mode. \fIranges\fR is a colon separated list of ranges of
|
|
+the form \fIupper-lower\fR or \fIdepth\fR where \fIupper\fR is the
|
|
+top and \fIlower\fR the bottom depth in the range. If you use the
|
|
+\fIdepth\fR form the range consist of just that depth.
|
|
+.TP
|
|
+\fB\-i\fR
|
|
+include the the bottommost range (that is, the one with the highest depth) into
|
|
+all output figures. This is for compatibility to older versions of this
|
|
+tool.
|
|
+.TP
|
|
+\fB\-I\fR
|
|
+turn on pyramid mode. The figure of a corresponding range in multilayer
|
|
+mode includes all lower ranges too.
|
|
+.TP
|
|
+\fB\-g\fR \fIgapwidth\fR
|
|
+set the allowed gapwidth between two used depths to decide if these
|
|
+depths should be grouped together in one range. With this option you get
|
|
+more flexibility to insert objects with new depths. The default width is
|
|
+zero (no gap = consecutively numbered depths are grouped together).
|
|
+.TP
|
|
+\fB\-s\fR \fIstyle\fR
|
|
+replace the default style for selecting a font family in LaTeX mode.
|
|
+If this option is omitted the style `times' is set by default.
|
|
+.TP
|
|
+\fB\-H\fR \fIheader\fR
|
|
+replace the default header sequence for creating temporary
|
|
+LaTeX documents in LaTeX mode. To get maximum flexibility you can
|
|
+set the entire document header in the file \fIheader\fR (see:
|
|
+\fBCustomized Headers\fR below).
|
|
+.TP
|
|
+\fB\-G\fR
|
|
+in multilayer mode change the default output file pattern to the PDF
|
|
+format which is <name>.page<no>.<ext>
|
|
+.TP
|
|
+\fB\-v\fR
|
|
+be verbose and print out all executed commands
|
|
+.TP
|
|
+\fB\-V\fR
|
|
+print out the version of \fBfig2mpdf\fR
|
|
+.PP
|
|
+.SH "MultiLayerOutput"
|
|
+In xfig you can assign an individual depth to all objects of the
|
|
+figure. These depths are normally used to determine the order of
|
|
+printing the objects. \fBfig2mpdf\fR uses these depths to group the
|
|
+objects into ranges in automatic mode (if the ranges option is
|
|
+omitted). In the list of used depths, consecutively numbered depths are
|
|
+grouped into one range. That is, all gaps between used depths are used
|
|
+to logically split the figure. With \fB\-g\fR you can set the
|
|
+gapwidth which doesn't split the figure (default: zero).
|
|
+.PP
|
|
+The resulting list of ranges determines the number of output files. In
|
|
+default mode all objects with depths assigned to one range are
|
|
+collected and put into the corresponding output file. The contents of
|
|
+the output files can be changed with the two Options \fB\-i\fR and
|
|
+\fB\-I\fR.
|
|
+.PP
|
|
+The \fB\-i\fR option reduces the number of output files by one. The
|
|
+bottommost range, that is the range which consist of the highest depths
|
|
+of the figure, is included into all output files.
|
|
+.PP
|
|
+In pyramid mode, activated by the option \fB\-I\fR, the output files
|
|
+contain additionally all lower ranges. With this mode you can
|
|
+get stand alone figures that don't have to be overlayed to have
|
|
+meaningful content.
|
|
+.PP
|
|
+\fBExample 1\fR
|
|
+.PD 0
|
|
+.PP
|
|
+Assume that you have a fig file \fIfoo.fig\fR which contains the three ranges
|
|
+.IR "230-233",
|
|
+.IR "455-460"
|
|
+and
|
|
+.IR "499-500".
|
|
+.PD
|
|
+.PP
|
|
+With no options set you get three output files, one per range. But if you
|
|
+set the \fB\-i\fR option you get the following two files where the
|
|
+bottommost range is included in both of the files:
|
|
+.PD 0
|
|
+.PP
|
|
+ \fIfoo-0.pdf\fR with ranges \fI455-460\fR and \fI499-500\fR
|
|
+.PP
|
|
+ \fIfoo-1.pdf\fR with ranges \fI230-233\fR and \fI499-500\fR.
|
|
+.PD
|
|
+.PP
|
|
+\fBExample 2\fR
|
|
+.PD 0
|
|
+.PP
|
|
+The pyramid mode, activated by the option \fB\-I\fR, will produce the
|
|
+following files from the source file of \fBExample 1\fR:
|
|
+.PP
|
|
+ \fIfoo-0.pdf\fR with ranges \fI499-500\fR
|
|
+.PP
|
|
+ \fIfoo-1.pdf\fR with ranges \fI455-460\fR and \fI499-500\fR
|
|
+.PP
|
|
+ \fIfoo-2.pdf\fR with ranges \fI230-233\fR, \fI455-460\fR and \fI499-500\fR.
|
|
+.PD
|
|
+.PP
|
|
+\fBExample 3\fR
|
|
+.PD 0
|
|
+.PP
|
|
+If both options are set you will get just two files with the following
|
|
+contents:
|
|
+.PP
|
|
+ \fIfoo-0.pdf\fR with ranges \fI455-460\fR and \fI499-500\fR
|
|
+.PP
|
|
+ \fIfoo-1.pdf\fR with ranges \fI230-233\fR, \fI455-460\fR and \fI499-500\fR.
|
|
+.PD
|
|
+.PP
|
|
+.SH "Customized Headers"
|
|
+For various reasons you might want to change the standard latex generation,
|
|
+e.g., if you want to change the default font family. The following
|
|
+example represents a valid header file.
|
|
+
|
|
+The usage of this example file changes the font family to sans serif
|
|
+and adds an additional search path for includegraphics to the `figures'
|
|
+subdirectory.
|
|
+
|
|
+.PD 0
|
|
+ \\documentclass{article}
|
|
+.PP
|
|
+ \\usepackage{german,amssymb,amsmath}
|
|
+.PP
|
|
+ \\renewcommand{\\familydefault}{\\sfdefault}
|
|
+.PP
|
|
+ \\AtBeginDocument{\\graphicspath{{figures/}}}
|
|
+.PD
|
|
+
|
|
+The following packages are generally used: \fBcolor\fR, \fBgraphicx\fR and \fBepsfig\fR.
|
|
+.SH "Tex errors"
|
|
+Sometimes it might happen that latex generates an error while processing
|
|
+your special texts. To keep you informed about the occurrence of that
|
|
+error and about what has happened, in this case the log file is shown
|
|
+by invoking a less command.
|
|
+.SH "Files"
|
|
+In single layer mode for the resulting files the suffix fig is replaced
|
|
+by pdf (resp. eps) (i.e. foo.fig -> foo.pdf).
|
|
+.PP
|
|
+.PD 0
|
|
+In multilayer mode the base name of the source fig files is extended
|
|
+by '-<range>' and the suffix is set to pdf (resp. eps).
|
|
+.PP
|
|
+(i.e., foo.fig -> foo-0.pdf, foo-1.pdf, foo-2.pdf, ...
|
|
+.PP
|
|
+ or foo.fig -> foo.page0.pdf, foo.page1.pdf, foo.page2.pdf, ...
|
|
+.PP
|
|
+ if the option \fB\-G\fR is set).
|
|
+.PD
|
|
+.SH "SEE ALSO"
|
|
+.IR xfig(1)
|
|
+.IR fig2dev(1)
|
|
+.IR gawk(1)
|
|
+.IR pdflatex(1)
|
|
+.IR latex(1)
|
|
+.IR dvips(1)
|
|
diff --git a/fig2mpdf/fig2mpdf b/fig2mpdf/fig2mpdf
|
|
--- a/fig2mpdf/fig2mpdf
|
|
+++ b/fig2mpdf/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;
|
|
+}
|
|
+' -- $*
|
|
+
|
|
diff --git a/man/fig2dev.1.in b/man/fig2dev.1.in
|
|
--- a/man/fig2dev.1.in
|
|
+++ b/man/fig2dev.1.in
|
|
@@ -75,8 +75,8 @@ Set the output graphics language.
|
|
Valid languages are
|
|
\fBbox, cgm, dxf, epic, eepic, eepicemu, emf, eps, gbx (Gerber beta
|
|
driver), gif, ibmgl, jpeg, latex, map (HTML image map), mf (MetaFont),
|
|
-mp (MetaPost), pcx, pdf, pdftex, pdftex_t, pic,
|
|
-pict2e, pictex, png, ppm, ps, pstex, pstex_t, pstricks, ptk (Perl/tk),
|
|
+mp (MetaPost), pcx, pdf, pdftex, pdftex_t, pdftex_p, pic,
|
|
+pict2e, pictex, png, ppm, ps, pstex, pstex_t, pstex_p, pstricks, ptk (Perl/tk),
|
|
shape (LaTeX shaped paragraphs), sld (AutoCad slide format), svg,
|
|
textyl, tiff, tikz, tk (tcl/tk), tpic, xbm and xpm\fR.
|
|
|
|
@@ -1145,6 +1145,61 @@ text flagged as "TeX Text".
|
|
The pstex and pdftex drivers accept the same options that the EPS driver
|
|
accepts.
|
|
|
|
+.SH PSTEX_P and PDFTEX_P OPTIONS
|
|
+The \fBpstex_p\fR language has the same intention as
|
|
+the combination of \fBpstex\fR and \fBpstex_t\fR.
|
|
+The only reason to use \fBpstex_p\fR is that you have partially overlayed texts.
|
|
+\fBpstex_p\fR splits the Fig file concerning the depths of existing texts. Because
|
|
+of it's necessary to get the resulting size of the figure for the pdf document
|
|
+you have to specify the target document format
|
|
+(i.e. using \fBpstex_p\fR rsp. \fBpdftex_p\fR).
|
|
+.br
|
|
+Two files results by using this language:
|
|
+.br
|
|
+.HP +.3i
|
|
+1) A bash script for creating and removing the necessary graphics files.
|
|
+Extension: \fB.create\fR
|
|
+.HP +.3i
|
|
+.HP +.3i
|
|
+2) The latex code which includes all graphics files and special texts. Content is
|
|
+put to stdout.
|
|
+
|
|
+.TP
|
|
+The \fBpstex_p\fR driver has the following special options:
|
|
+
|
|
+.TP
|
|
+.B \-p basename
|
|
+specifies the basename of the files to be created (see (1) above). This option
|
|
+is mandatory.
|
|
+.TP
|
|
+.B "\-d dmag"
|
|
+Set a separate magnification for the length of line dashes to
|
|
+.I dmag.
|
|
+.TP
|
|
+.B \-E num
|
|
+Set encoding for latex text translation (0 no translation, 1 ISO-8859-1, 2 ISO-8859-2)
|
|
+.TP
|
|
+.B "\-l lwidth"
|
|
+Sets the threshold between LaTeX thin and thick lines to
|
|
+.I lwidth
|
|
+pixels.
|
|
+LaTeX supports only two different line width: \\thinlines and \\thicklines.
|
|
+Lines of width greater than
|
|
+.I lwidth
|
|
+pixels are drawn as \\thicklines.
|
|
+Also affects the size of dots in dotted line style.
|
|
+The default is 1.
|
|
+.TP
|
|
+.B \-v
|
|
+Verbose mode.
|
|
+.TP
|
|
+.B \-F
|
|
+Don't set the font face, series, and style; only set it's size and the
|
|
+baselineskip. By default, fig2dev sets all 5 font parameters when it
|
|
+puts some text. The disadvantage is that you can't set the font from your
|
|
+LaTeX document. With this option on, you can set the font from your LaTeX
|
|
+document (like "\fB\\sfshape \\input picture.eepic\fR").
|
|
+
|
|
.TP
|
|
.B \-n name
|
|
Set the Title part of the PostScript output to
|
|
@@ -1551,6 +1606,12 @@ The string \fIfont\fR can be one of
|
|
|
|
|
|
.SH BUGS and RESTRICTIONS
|
|
+In \fBpdftex_p\fR language \fIfig2dev\fR can not determine the exact sizes of
|
|
+the special texts set by pdflatex afterwards. If these texts are bigger than
|
|
+expected the calculated bounding box might be too small so that some texts passes
|
|
+over the figure boundaries. If this happen you have to put an invisible
|
|
+rectangle (line width 0) around the text or the entire figure.
|
|
+.PP
|
|
Please send bug reports, fixes, new features etc. to:
|
|
.br
|
|
\&@PACKAGE_BUGREPORT@
|
|
@@ -1640,3 +1701,7 @@ Michael Schrick (m_schrick@hotmail.com)
|
|
The GBX (Gerber) driver was written by
|
|
.br
|
|
Edward Grace (ej.grace@imperial.ac.uk).
|
|
+.sp
|
|
+The PSTEX_P and PDFTEX_P drivers (overlayed LaTeX texts) was written by
|
|
+.br
|
|
+Michael Pfeiffer (p3f@gmx.de)
|