[Rd] patch for textspecial and defaultfont in xfig

Sebastian Fischmeister sfischme at uwaterloo.ca
Mon Jan 19 06:54:40 CET 2009


Hello,

   The current xfig device lacks the functionality to set the  
textspecial flag and use the defaultfont in xfig. This is necessary  
when you want to export to xfig and use interpreted text (e.g., $ 
\frac{1}{e}$ gets interpreted by latex). The attached patch adds this  
functionality.

Why would you like to do this?

- Use math in labels (e.g., name your variables $r_{xy}$, do a  
barplot, run figtex2pdf.sh [fetch if off the web], and look at the  
nice result]).

- Uses native document font -> uses same font as all the other text in  
your latex document.

- Does not cause troubles with color allocation limit (see pictex  
loading problem).

- Can edit R output figure with a vector drawing program (xfig).

... and of course it now perfectly fits my workflow.

I hope it's useful.

   Sebastian

Index: src/library/grDevices/R/postscript.R
===================================================================
--- src/library/grDevices/R/postscript.R	(revision 47637)
+++ src/library/grDevices/R/postscript.R	(working copy)
@@ -273,7 +273,7 @@
                    paper = "default", horizontal = TRUE,
                    width = 0, height = 0, family = "Helvetica",
                    pointsize = 12, bg = "transparent", fg = "black",
-                  pagecentre = TRUE)
+                  pagecentre = TRUE, defaultfont = FALSE, textspecial  
= FALSE)
  {
      ## do initialization if needed
      initPSandPDFfonts()
@@ -281,7 +281,7 @@
      if(!checkIntFormat(file)) stop("invalid 'file'")
      .External(XFig, file, paper, family, bg, fg,
                width, height, horizontal, pointsize,
-              onefile, pagecentre, encoding)
+              onefile, pagecentre, defaultfont, textspecial, encoding)
      invisible()
  }

Index: src/library/grDevices/src/devPS.c
===================================================================
--- src/library/grDevices/src/devPS.c	(revision 47637)
+++ src/library/grDevices/src/devPS.c	(working copy)
@@ -4354,6 +4354,9 @@
      int ymax;            /* used to invert coord system */
      char encoding[50];   /* for writing text */

+    Rboolean textspecial; /* use textspecial flag in xfig for latex  
integration */
+    Rboolean defaultfont; /* use the default font in xfig */
+
      /*
       * Fonts and encodings used on the device
       *
@@ -4553,6 +4556,7 @@
  		 double width, double height,
  		 Rboolean horizontal, double ps,
  		 Rboolean onefile, Rboolean pagecentre,
+		 Rboolean defaultfont, Rboolean textspecial,
  		 const char *encoding)
  {
      /* If we need to bail out with some sort of "error" */
@@ -4591,6 +4595,8 @@
      pd->width = width;
      pd->height = height;
      pd->landscape = horizontal;
+    pd->textspecial = textspecial;
+    pd->defaultfont = defaultfont;
      pointsize = floor(ps);
      if(R_TRANSPARENT(pd->bg) && R_TRANSPARENT(pd->col)) {
  	free(dd);
@@ -5108,7 +5114,7 @@
  	fprintf(fp, "4 %d ", (int)floor(2*hadj)); /* Text, how justified */
  	fprintf(fp, "%d 100 0 ", XF_SetColor(gc->col, pd));
  	/* color, depth, pen_style */
-	fprintf(fp, "%d %d %.4f 4 ", fontnum, (int)size, rot * DEG2RAD);
+	fprintf(fp, "%d %d %.4f %d ", pd->defaultfont?-1:fontnum, (int)size,  
rot * DEG2RAD,pd->textspecial?6:4);
  	/* font pointsize angle flags (Postscript font) */
  	fprintf(fp, "%d %d ", (int)(size*12),
  		(int)(16.667*XFig_StrWidth(str, gc, dd) +0.5));
@@ -7441,6 +7447,9 @@
   *  ps		= pointsize
   *  onefile     = {TRUE: normal; FALSE: single EPSF page}
   *  pagecentre  = centre plot region on paper?
+ *  defaultfont = {TRUE: use xfig default font; FALSE: use R font}
+ *  textspecial = {TRUE: use textspecial; FALSE: use standard font}
+ *
   *  encoding
   */

@@ -7449,7 +7458,7 @@
      pGEDevDesc gdd;
      char *vmax;
      const char *file, *paper, *family, *bg, *fg, *encoding;
-    int horizontal, onefile, pagecentre;
+    int horizontal, onefile, pagecentre, defaultfont, textspecial;
      double height, width, ps;

      vmax = vmaxget();
@@ -7467,6 +7476,8 @@
      ps = asReal(CAR(args));	      args = CDR(args);
      onefile = asLogical(CAR(args));   args = CDR(args);
      pagecentre = asLogical(CAR(args));args = CDR(args);
+    defaultfont = asLogical(CAR(args)); args = CDR(args);
+    textspecial = asLogical(CAR(args)); args = CDR(args);
      encoding = CHAR(asChar(CAR(args)));

      R_GE_checkVersionOrDie(R_GE_version);
@@ -7476,7 +7487,7 @@
  	if (!(dev = (pDevDesc) calloc(1, sizeof(DevDesc))))
  	    return 0;
  	if(!XFigDeviceDriver(dev, file, paper, family, bg, fg, width, height,
-			     (double) horizontal, ps, onefile, pagecentre,
+			     (double) horizontal, ps, onefile, pagecentre, defaultfont,  
textspecial,
  			     encoding)) {
  	    /* free(dev); No, freed inside XFigDeviceDriver */
  	    error(_("unable to start device xfig"));
Index: src/library/grDevices/man/xfig.Rd
===================================================================
--- src/library/grDevices/man/xfig.Rd	(revision 47637)
+++ src/library/grDevices/man/xfig.Rd	(working copy)
@@ -20,7 +20,7 @@
       paper = "default", horizontal = TRUE,
       width = 0, height = 0, family = "Helvetica",
       pointsize = 12, bg = "transparent", fg = "black",
-     pagecentre = TRUE)
+     pagecentre = TRUE, defaultfont = FALSE, textspecial = FALSE)
  }
  \arguments{
    \item{file}{a character string giving the name of the file.   For  
use
@@ -60,6 +60,10 @@
    \item{fg}{the initial foreground color to be used.}
    \item{pagecentre}{logical: should the device region be centred on  
the
      page?}
+  \item{defaultfont}{logical: should the device use xfig's default
+    font?}
+  \item{textspecial}{logical: should the device set the textspecial  
flag
+  for all text elements. This is useful when generating pstex from  
xfig figures.}
  }
  %%>>> REAL DOC in SOURCE:    ../../../main/devices.c  &   ../../../ 
unix/devPS.c
  \details{



More information about the R-devel mailing list