[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[mgp-users-jp 00217] patch for mgp2ps



かとぺ です。

先週の金曜日に初めて mgp を使わせていただきました。

そのとき、念の為にと思って OHP も作成しようとしたのですが、
mgp2ps がちょっとホゲホゲしていたので、手を入れてみました。
# 手を入れたのは発表後ですが :-)

主にやってることは、

・paper size をオプションで指定できるようにした / それに伴なう変更
  本当は「DocumentPaperSizes が A4 で、BoundingBox が Letter
  Size」という奇ッ怪な状態をどうにかしたかっただけなのですが...

・%%Title: の変更
  元のファイル名が分からないのが悲しかったので。
  (%%Creater: もあることだし、「mgp2ps output file」ってほと
   んど情報量ないと思います)

・「%BeginDocument」, 「%EndDocument」の修正
  これだと EPS を取りこんだときに GV でまともに見れないです。
  (この comment って Version 3.0 から?)

です。
これで A4 用紙にちゃんとプリントアウトされると思います。
# が、私のところではデフォルトではマージンが足りなくて、周り
# がちょっと切れますけど...
# GV では問題無く見えてます。

コードの一部は psutils から拝借してます。

なお mgp2ps.man は変更していません (_o_)

----------

それ以外で気付いている mgp2ps の問題点として、

| 任意の整数
| %image "Eq/i.gif", cont
| %cont
| において、...

などが上手くいかないようです (イメージが左端に行ってしまう)。
mgp では期待通りに表示されています。
# 単に私の書きかたが変なだけ?


あと、%mark, %again の処理。
# は、まだ手を付けてないだけですか?

-- 
かとぺ / 加藤 貴司


--- kit-980727/print.c	Tue Jul 21 02:50:26 1998
+++ kit-hack/print.c	Tue Jul 28 20:51:22 1998
@@ -43,10 +43,7 @@
 
 static int tmpopen = 0;
 
-#define A4_WIDTH	760
-#define A4_HEIGHT	590
-#define A4_XMARGIN	10
-#define A4_YMARGIN	5
+#define DEFAULT_PAPER_SIZE	"a4"
 #define PRINT_ASCIIFONT		"Times-Roman"
 #define PRINT_ASCIITHICKFONT	"Helvetica"
 #define PRINT_KANJIFONT		"Ryumin-Light-H"
@@ -131,6 +128,40 @@
 	0x2242, 0x2244, 0
 };
 
+/* `papersize' and `papersizes[]' were based on psutil.[ch]
+   by Angus J. C. Duggan in psutils */
+typedef struct papersize {
+   char *name;          /* name of paper size */
+   int height, width;   /* height, width in points for LANDSCAPE */
+} Paper;
+
+static Paper papersizes[] = {
+  { "a3", 842, 1191 },         /* 29.7cm * 42cm */
+  { "a4", 595, 842 },          /* 21cm * 29.7cm */
+  { "a5", 421, 595 },          /* 14.85cm * 21cm */
+  { "b5", 516, 729 },          /* 18.2cm * 25.72cm */
+  { "A3", 842, 1191 },         /* 29.7cm * 42cm */
+  { "A4", 595, 842 },          /* 21cm * 29.7cm */
+  { "A5", 421, 595 },          /* 14.85cm * 21cm */
+  { "B5", 516, 729 },          /* 18.2cm * 25.72cm */
+  { "letter", 612, 792 },      /* 8.5in * 11in */
+  { "legal", 612, 1008 },      /* 8.5in * 14in */
+  { "ledger", 1224, 792 },     /* 17in * 11in */
+  { "tabloid", 792, 1224 },    /* 11in * 17in */
+  { "statement", 396, 612 },   /* 5.5in * 8.5in */
+  { "executive", 540, 720 },   /* 7.6in * 10in */
+  { "folio", 612, 936 },       /* 8.5in * 13in */
+  { "quarto", 610, 780 },      /* 8.5in * 10.83in */
+  { "10x14", 720, 1008 },      /* 10in * 14in */
+  { NULL, 0, 0 }
+};
+
+static Paper *paper;
+static int w_width, w_height;
+static int paper_xmargin = 10;
+static int paper_ymargin = 5;
+
+static Paper* findpaper __P((char *));
 static void print_out __P((void));
 static void print_page __P((u_int));
 static void print_init __P((void));
@@ -166,6 +197,21 @@
 
 extern int findImage __P((char *, char *));
 
+/* This code is based on psutil.c
+   by Angus J. C. Duggan in psutils */
+static Paper*
+findpaper(name)
+     char *name;
+{
+  Paper *pp;
+  for (pp = papersizes; pp->name; pp++) {
+    if (strcmp(pp->name, name) == 0) {
+      return pp;
+    }
+  }
+  return (Paper *)NULL;
+}
+
 static void
 print_out()
 {
@@ -174,8 +220,8 @@
 
 	width  = window_width;
 	height = window_height;
-	window_width  = A4_WIDTH;
-	window_height = A4_HEIGHT;
+	window_width  = w_width;
+	window_height = w_height;
 
 	char_size = window_height * DEFAULT_CHARSIZE / 100;
 
@@ -228,17 +274,17 @@
 
 	fprintf(fp, "%%!PS-Adobe-2.0 EPSF-2.0\n");
 	fprintf(fp, "%%%%Creater: mgp2ps\n");
-	fprintf(fp, "%%%%Title: mgp2ps output file\n");
+	fprintf(fp, "%%%%Title: %s\n", mgp_fname);
 	fprintf(fp, "%%%%Pages: %d\n", maxpage);
-	fprintf(fp, "%%%%BoundingBox: 0 0 612 792\n");
-	fprintf(fp, "%%%%DocumentPaperSizes: A4\n");
+	fprintf(fp, "%%%%BoundingBox: 0 0 %d %d\n", paper->height, paper->width);
+	fprintf(fp, "%%%%DocumentPaperSizes: %s\n", paper->name);
 	fprintf(fp, "%%%%Orientation: Landscape\n");
 	fprintf(fp, "%%%%EndComments\n");
 
 	/* define constants */
 	fprintf(fp, "/XMARGIN %d def /YMARGIN %d def "
 		"/WIDTH %d def /HEIGHT %d def\n",
-		A4_XMARGIN, A4_YMARGIN, window_width, window_height);
+		paper_xmargin, paper_ymargin, window_width, window_height);
 	fprintf(fp, "/XBODY WIDTH XMARGIN 2 mul sub def\n");
 	fprintf(fp, "/vertgap %d def /horizgap %d def\n", vert_gap, horiz_gap);
 
@@ -352,7 +398,7 @@
 	u_int page;
 {
 	fprintf(fp, "%%%%Page: %d %d\n", page, page);
-	fprintf(fp, "/ypos %d def\n", - A4_YMARGIN);
+	fprintf(fp, "/ypos %d def\n", - paper_ymargin);
 	fprintf(fp, "initcharsize\n");
 }
 
@@ -750,9 +796,9 @@
 {
 	struct ctrl_bar pbar;
 
-	pbar.ct_width = cp->ctb_width * A4_HEIGHT / 1000;
-	pbar.ct_start = cp->ctb_start * A4_WIDTH / 100;
-	pbar.ct_length = cp->ctb_length * A4_WIDTH / 100;
+	pbar.ct_width = cp->ctb_width * w_height / 1000;
+	pbar.ct_start = cp->ctb_start * w_width / 100;
+	pbar.ct_length = cp->ctb_length * w_width / 100;
 
 	fprintf(fp, "%%bar color %d %d %d\n",
 		cp->ctb_width, cp->ctb_start, cp->ctb_length);
@@ -1132,7 +1178,7 @@
 
 	fprintf(fp, "gsave\n");
 	fprintf(fp, "%d ypos %d sub translate\n",
-		xpos + A4_XMARGIN, print_height);
+		xpos + paper_xmargin, print_height);
 	fprintf(fp, "%d %d scale\n", print_width, print_height);
 	fprintf(fp, "%d %d 8\n", print_width, print_height);
 	fprintf(fp, "[%d 0 0 %d 0 %d]\n", print_width,
@@ -1171,7 +1217,7 @@
 print_usage(name)
 	char	*name;
 {
-	fprintf(stderr, "Usage: %s [-cirV] [-f psfile] mgpfile\n", name);
+	fprintf(stderr, "Usage: %s [-cirV] [-x xmargin] [-y ymargin] [-p paper] [-f psfile] mgpfile\n", name);
 	exit(0);
 }
 
@@ -1405,11 +1451,11 @@
 	fprintf(fp, "BeginEPSF\n");
 	fprintf(fp, "%f %f scale\n", PSSCALEF, PSSCALEF);
 	fprintf(fp, "%d %d translate\n",
-		(x1 - (int)(A4_XMARGIN * PSBASE)) * -1,
-		(y2 + (int)(A4_YMARGIN * PSBASE)) * -1);
+		(x1 - (int)(paper_xmargin * PSBASE)) * -1,
+		(y2 + (int)(paper_ymargin * PSBASE)) * -1);
 	fprintf(fp, "%d ypos XMARGIN add %f mul translate\n",
 		(int)(xpos * PSBASE), (double)PSBASE);
-	fprintf(fp, "%%BeginDocument: %s\n", filename);
+	fprintf(fp, "%%%%BeginDocument: %s\n", filename);
 	fputs(line1, fp);
 	fputs(line2, fp);
 	while (fgets(line, sizeof(line), epsfp)) {
@@ -1418,7 +1464,7 @@
 			line[1] = '#';
 		fputs(line, fp);
 	}
-	fprintf(fp, "%%EndDocument\n");
+	fprintf(fp, "%%%%EndDocument\n");
 	fprintf(fp, "EndEPSF\n");
 }
 
@@ -1437,7 +1483,10 @@
 
 	progname = argv[0];
 
-	while ((opt = getopt(argc, argv, "ciVrf:")) != -1) {
+	/* set default paper size */
+	paper = findpaper(DEFAULT_PAPER_SIZE);
+
+	while ((opt = getopt(argc, argv, "ciVrf:x:y:p:")) != -1) {
 		switch (opt) {
 		case 'c':
 			colorps++;
@@ -1459,11 +1508,29 @@
 			mgp_flag |= FL_VERBOSE;
 			break;
 
+		case 'x' :
+		  paper_xmargin = atoi(optarg);
+		  break;
+
+		case 'y' :
+		  paper_ymargin = atoi(optarg);
+		  break;
+
+		case 'p' :
+		  if ((paper = findpaper(optarg)) == (Paper *)0) {
+		    fprintf(stderr, "Paper size '%s' not recognised. Use %s instead.\n", optarg, DEFAULT_PAPER_SIZE);
+		    paper = findpaper(DEFAULT_PAPER_SIZE);
+		  }
+		  break;
+
 		default:
 			print_usage(progname);
 			/*NOTREACHED*/
 		}
 	}
+
+	w_width  = paper->width - paper_xmargin * 2;
+	w_height = paper->height - paper_ymargin * 2;
 
 	argc -= optind;
 	argv += optind;