Sebastian Fischmeister
2009-Jan-19 05:54 UTC
[Rd] patch for textspecial and defaultfont in xfig
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{
Prof Brian Ripley
2009-Jan-19 07:54 UTC
[Rd] patch for textspecial and defaultfont in xfig
Thank you for the suggested patch, but you have not provided any tests. With reasonably comprehensive tests we wil consider it, but not otherwise (no one in R-core is likely to use this, so we need to automate tests that it keeps on working in future releases). On Mon, 19 Jan 2009, Sebastian Fischmeister wrote:> 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{ > > ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel-- Brian D. Ripley, ripley at stats.ox.ac.uk Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272866 (PA) Oxford OX1 3TG, UK Fax: +44 1865 272595