makejvf-1.1a/ 40775 7266 1750 0 7423167275 12221 5ustar sada-tewbusermakejvf-1.1a/Makefile100644 7266 1750 772 7246652676 13751 0ustar sada-tewbuserCC = gcc CCLD =$(CC) PROGRAM = makejvf # インストール先を DISTDIR に指定する DISTDIR = /usr/local/bin CFLAGS = -O PROGLINK = $(CC) $(OBJS) -o $(PROGRAM) OBJS = main.o tfmread.o tool.o write.o link_command = $(CCLD) -o $(PROGRAM) $(LDFLAGS) $(PROGRAM): $(OBJS) $(kpathsea) $(PROGLINK) main.o:main.c tfmread.o:tfmread.c tool.o:tool.c write.o:write.c install: $(PROGRAM) install -C -m 755 $? $(DISTDIR) clean: rm -f *.o makejvf distclean: rm -f *.o *.core *.tfm *.vf *.tex *.dvi *.ps $(PROGRAM) makejvf-1.1a/README.txt100664 7266 1750 11702 7422732035 14024 0ustar sada-tewbuser日本語VF生成ツール makejvf ver.1.1a 株式会社アスキー 出版技術グループ www-ptex@ascii.co.jp makejvf は(株)アスキーで日本語化された dvips を使用する際に必要なVFファイルを 生成するためのツールです。 makejvf の使用および配布に関しては、付属の COPYRIGHT ファイルを参照してくださ い。 dvips で日本語を扱う場合、DVIを作る際に使用する和文TFMに記述してある文字幅と、 和文PSフォントの文字幅が異なるため、文字位置を調整するVF(Virtual Font)というファ イルが必要になります。makejvf はこのVFを生成するためのツールです。 また、縦書き時にはシングルクォート(‘’)、ダブルクォート(“”)をそれぞれシング ルミニュート(′とこれを180度回転させたもの)とダブルミニュート(″とこれを180度回 転させたもの)に変換して出力します。 ---------------------------------------- VFについて VF(Virtual Font)とは、フォントを合成して仮想的なフォントとして扱うためのファイ ルです。 欧文フォントではアクセント記号を持たないフォントに他のフォントのアクセント記号 を追加して1つのフォントとして扱ったり、任意のフォントの小文字部分を縮小した大文 字に置き換えて SmallCaps フォントのように扱うのに使用します。 VFファイルの中身はDVIファイルと似ており、各文字についての出力方法がDVI命令に よって記述されています。文字の位置を変えることも可能です。 dvips でのVFとTFMの関係は次のようになっています。 TeX がTFMを参照して組版 ↓ dvips がDVI中のTFMと同じ名前のVFを参照(なければ文字合成なし) ↓ VF中に記述されている各文字の定義(文字毎にフォントを設定できる)を参照 ↓ 文字定義に従って dvips が各文字を置換 dvipsで日本語を扱う場合、min10 や goth10 の文字位置と和文PSフォントの文字位置 の違いが問題になります。 例えば "(" のような、左に空きがある括弧類の場合、和文PSフォントでは左の空きも 含んだ文字として扱いますが、min10 や goth10 では左の空きは文字として扱わず、「空 き+"("」のような扱いになります。そのため min10 の "(" をそのままPSの "(" に置 き換えてしまうと、想定した位置より右に出力されてしまいます。 そこでVF中に「"(" は左にずらして置き換える」という記述をしておき、dvips がVF を参照して位置調整を行うようになっています。 ---------------------------------------- コンパイルおよびインストール: makejvf のインストール先を Makefile の DISTDIR に指定しておいて下さい。 make を実行すると makejvf が作られ、さらに make install を実行すると DISTDIR で指定したディレクトリにインストールされます。 必要なファイル: min10.tfm や goth10.tfm 等、pTeXで使用する和文TFMファイル。縦書き用(tmin10.tfm 等)も扱えます。 使用方法: % makejvf <和文TFMファイル名> <和文PSフォントTFM名> <和文TFMファイル名>: pTeX で使用する和文TFMの名前。カレントディレクトリ に用意しておく。この名前の拡張子を`.vf'にしたものが VFファイルとして生成される。 <和文PSフォントTFM名>: 実際に出力される和文PSフォントの文字幅情報を記述した TFMの名前。makejvf により生成される。また、この名前 がVF中に記述される。 オプション: -C 長体(左右の幅を縮めた書体)のTFMを元にVFを作成する場合に使用します。 長体VF作成時に-Cを付けないと、単に小さいフォントのTFMとして扱われて しまいます。 -K <和文PSフォントTFM名> 非漢字部のPSフォントTFMを指定します。これにより、1書体で漢字部と非 漢字部で異なるフォントが使用できます。 -b <数値> ベースライン補正の数値を指定します。文字の高さを1000として整数で指定、 プラスで文字が下がり、マイナスで文字が上がります。 -m 縦書き時にクオート類(’”)をミニュート(′″)へ変換します。 ---以下2つは正式にサポートされているオプションではありません--- -a PSフォントのAFMファイル名を指定します。 かな詰めフォント作成時に使用します。 -k <数値> かな詰めマージンを指定します。文字幅を1000として整数で指定。 -aオプションと共に使用します。 例1: min10 をリュウミン-Lとして使用する場合: % makejvf min10.tfm rml (min10.vf と rml.tfm が生成される) こうして生成されたVFおよびTFMを $TEXMF 以下の検索パスが通る場所に置きます。 さらに、rml が出力機のリュウミン-Lであることを宣言するために、$TEXMF/dvips 以下 にある psfonts.map に次のような記述を追加します。 rml Ryumin-Light-H これで min10 を使用した箇所が dvips によりリュウミン-Lに置きかえられます。 Ryumin-Light-H を ShinGo-Bold-H にすれば新ゴ-Bに、FutoMinA101-Bold-H にすれば 太ミンに置きかえられます。 このようなVFおよびTFMを多数作成することで多書体の使用が可能になります。なお、 元になるTFMは min10.tfm を別の名前にコピーして使用します。 例2: 非漢字部に見出しミン、漢字部に太ゴを使用する場合: % makejvf -K midashimin-ma31 jcomic.tfm futogo-b 漫画の台詞のような、かなを明朝書体、漢字をゴシック書体で使用する例です。 jcomic.tfm にはあらかじめ min10.tfm をコピーしておきます。psfonts.map には次の ような記述を追加します。 midashimin-ma31 MidashiMin-MA31-H futogo-b FutoGoB101-Bold-H これで jcomic.tfm を使用すると、生成された jcomic.vf によって非漢字部は見出しミ ン、漢字部は太ゴで出力されます。 makejvf-1.1a/main.c100664 7266 1750 5370 7231247623 13404 0ustar sada-tewbuser#include #include #include FILE *vfp,*afp=NULL; char *atfmname,*vtfmname,*afmname,*vfname,*kanatfm; int kanatume=-1,chotai=0,baseshift=0,minute=0; FILE *vfopen(); main(argc,argv) int argc; char **argv; { int i,j; if (argc < 3) { usage(); exit(0); } argv++; for (;**argv=='-';argv++) { switch ((*argv)[1]) { case 'k': if ((*argv)[2]!='\0') { kanatume = atoi(&(*argv)[2]); } else { kanatume = atoi(*(++argv)); } break; case 'K': if ((*argv)[2]!='\0') { kanatfm = strdup(&(*argv)[2]); } else { kanatfm = strdup(*(++argv)); } break; case 'C': chotai=1; break; case 'a': if ((*argv)[2]!='\0') { afmname = strdup(&(*argv)[2]); } else { afmname = strdup(*(++argv)); } if ((afp = fopen(afmname,"r"))==NULL) { fprintf(stderr,"no AFM file, %s.\n",afmname); exit(-1); } break; case 'b': if ((*argv)[2]!='\0') { baseshift = atoi(&(*argv)[2]); } else { baseshift = atoi(*(++argv)); } break; case 'm': minute=1; break; default: usage(); exit(0); } } if (kanatume>=0 && !afp) { fprintf(stderr,"No AFM file for kanatume.\n"); exit(-1); } atfmname = malloc(strlen(*argv)+4); strcpy(atfmname,*argv); vfname = malloc(strlen(*argv)+4); strcpy(vfname,*argv); for (i = strlen(vfname)-1 ; i >= 0 ; i--) { if (vfname[i] == '/') { vfname = &vfname[i+1]; break; } } if (!strcmp(&vfname[strlen(vfname)-4],".tfm")) { vfname[strlen(vfname)-4] = '\0'; } strcat(vfname,".vf"); argv++; vtfmname = strdup(*argv); if (!strcmp(&vtfmname[strlen(vtfmname)-4],".tfm")) { vtfmname[strlen(vtfmname)-4] = '\0'; } tfmget(atfmname); maketfm(vtfmname); if (kanatfm) { if (!strcmp(&kanatfm[strlen(kanatfm)-4],".tfm")) { kanatfm[strlen(kanatfm)-4] = '\0'; } maketfm(kanatfm); } vfp = vfopen(vfname); for (i=0;i<94;i++) for (j=0;j<94;j++) writevf((0x21+i)*256+(0x21+j),vfp); vfclose(vfp); exit(0); } usage() { fprintf(stderr,"MAKEJVF ver.1.1a -- make Japanese VF file.\n"); fprintf(stderr,"%% makejvf [] \n"); fprintf(stderr,"options:\n"); fprintf(stderr,"-C 長体モード\n"); fprintf(stderr,"-K 非漢字部用に作成するPSフォントTFM名\n"); fprintf(stderr,"-b <数値> ベースライン補正\n"); fprintf(stderr," 文字の高さを1000として整数で指定\n"); fprintf(stderr," プラスで文字が下がり、マイナスで文字が上がる\n"); fprintf(stderr,"-m 縦書き時にクオート(’”)の代わりにミニュート(′″)を使用\n"); fprintf(stderr,"-a AFMファイル名(かな詰め時に使用)\n"); fprintf(stderr,"-k <数値> かな詰めマージン指定\n"); fprintf(stderr," 文字幅を1000として整数で指定。-aオプションと共に使用\n"); } makejvf-1.1a/tfmread.c100664 7266 1750 4045 7226524055 14101 0ustar sada-tewbuser#include #include #include int nt,unit,zh,zw,jfm_id; int *width,*height,*depth,*italic,*glue_kern,*kern,*glue,*param; char *header,*char_type,*char_info; extern int baseshift; int jfmread(kcode) int kcode; { int i,ctype = 0,w_ind,w; for (i = 0 ; i < nt ; i++) { if (upair(&char_type[i*4]) == kcode) { ctype = upair(&char_type[i*4+2]); break; } } w_ind = char_info[ctype*4]; w = width[w_ind]; return(w); } int tfmget(name) char *name; { int i,j,cc,tsize; char nbuff[1024]; FILE *fp; strcpy(nbuff,name); fp = fopen(nbuff,"r"); if (fp == NULL) { strcat(nbuff,".tfm"); fp = fopen(nbuff,"r"); if (fp == NULL) { fprintf(stderr,"%s is not found.\n",name); exit(0); } } tfmidx(fp); fclose(fp); return 0; } int tfmidx(fp) FILE *fp; { int i,cc; int lh,ec,nw,nh,nd,ni,nl,nk,ng,np; jfm_id = fpair(fp); if ((jfm_id == 9) || (jfm_id == 11)) { nt = ufpair(fp); cc = fpair(fp); lh = ufpair(fp); cc = fpair(fp); ec = ufpair(fp); nw = ufpair(fp); nh = ufpair(fp); nd = ufpair(fp); ni = ufpair(fp); nl = ufpair(fp); nk = ufpair(fp); ng = ufpair(fp); np = ufpair(fp); header = malloc(lh*4); for (i = 0 ; i < lh*4 ; i++) { header[i] = fgetc(fp); } char_type = malloc(nt*4); for (i = 0 ; i < nt*4 ; i++) { char_type[i] = fgetc(fp); } char_info = malloc((ec+1)*4); for (i = 0 ; i < (ec+1)*4 ; i++) { char_info[i] = fgetc(fp); } width = malloc(nw*sizeof(int)); for (i = 0 ; i < nw ; i++) { width[i] = fquad(fp); } height = malloc(nh*sizeof(int)); for (i = 0 ; i < nh ; i++) { height[i] = fquad(fp); } depth = malloc(nd*sizeof(int)); for (i = 0 ; i < nd ; i++) { depth[i] = fquad(fp); } fseek(fp,(ni+nl+nk+ng)*4,SEEK_CUR); param = malloc(np*sizeof(int)); for (i = 0 ; i < np ; i++) { param[i] = fquad(fp); } unit = mquad(&header[4]); zh = param[4]; zw = param[5]; if (baseshift) baseshift = (int)(zh*baseshift/1000.0+0.5); } else { fprintf(stderr,"This TFM is not for Japanese.\n"); exit(-1); } return 0; } makejvf-1.1a/tool.c100664 7266 1750 10164 7226524055 13453 0ustar sada-tewbuser#include #include #include int mquad(p) unsigned char *p; { unsigned int cc; cc = (((unsigned int)p[0]*256 +(unsigned int)p[1])*256 +(unsigned int)p[2])*256 +(unsigned int)p[3]; return(cc); } unsigned int utri(p) unsigned char *p; { unsigned int i,cc; unsigned char fchar[4]; fchar[0] = 0; for (i = 1 ; i < 4 ; i++) fchar[i] = p[i-1]; cc = mquad(fchar); return cc; } int tri(p) unsigned char *p; { int i,cc; unsigned char fchar[4]; fchar[0] = 0; for (i = 1 ; i < 4 ; i++) fchar[i] = p[i-1]; cc = mquad(fchar); if (cc > 8388607) cc -= 16777216; return cc; } unsigned int upair(p) unsigned char *p; { unsigned int i,cc; unsigned char fchar[4]; fchar[0] = fchar[1] = 0; for (i = 2 ; i < 4 ; i++) fchar[i] = p[i-2]; cc = mquad(fchar); return cc; } int pair(p) unsigned char *p; { int i,cc; unsigned char fchar[4]; fchar[0] = fchar[1] = 0; for (i = 2 ; i < 4 ; i++) fchar[i] = p[i-2]; cc = mquad(fchar); if (cc > 32767) cc -= 65536; return cc; } int mget(p,num) char *p; int num; { switch (num) { case 1: return *p; break; case 2: return pair(p); break; case 3: return tri(p); break; case 4: return mquad(p); break; } } int fquad(fp) FILE *fp; { int i,cc; unsigned char fchar[4]; for (i = 0 ; i < 4 ; i++) fchar[i] = fgetc(fp); cc = mquad(fchar); return cc; } unsigned int uftri(fp) FILE *fp; { unsigned int i,cc; unsigned char fchar[4]; fchar[0] = 0; for (i = 1 ; i < 4 ; i++) fchar[i] = fgetc(fp); cc = mquad(fchar); return cc; } int ftri(fp) FILE *fp; { int i,cc; unsigned char fchar[4]; fchar[0]=0; for (i=1;i<4;i++) fchar[i]=fgetc(fp); cc = mquad(fchar); if (cc > 8388607) cc -= 16777216; return cc; } unsigned int ufpair(fp) FILE *fp; { unsigned int i,cc; unsigned char fchar[4]; fchar[0] = fchar[1] = 0; for (i = 2 ; i < 4 ; i++) fchar[i] = fgetc(fp); cc = mquad(fchar); return cc; } int fpair(fp) FILE *fp; { int i,cc; unsigned char fchar[4]; fchar[0] = fchar[1] = 0; for (i = 2 ; i < 4 ; i++) fchar[i] = fgetc(fp); cc = mquad(fchar); if (cc > 32767) cc -= 65536; return cc; } int fskip(fp,num) FILE *fp; int num; { fseek(fp,num,1); } int fputnum(num,byte,fp) int num,byte; FILE *fp; { int i,cc; unsigned char buf[16]; if (num<0) { if (byte==3) { num=16777216+num; } else if (byte==2) { num=65536+num; } else if (byte==1) { num=256+num; } } for (i = byte-1 ; i >= 0 ; i--) { buf[i] = (num%256); num >>= 8; } for (i = 0 ; i < byte ; i++) { fputc(buf[i],fp); } return 0; } int numcount(num) int num; { if (num >= 0) { if (num <= 127) { return 1; } else if (num <= 32767) { return 2; } else if (num <= 838607) { return 3; } else { return 4; } } else { if (num >= -128) { return 1; } else if (num >= -32768) { return 2; } else if (num >= -838608) { return 3; } else { return 4; } } } int fputnum2(num,fp) int num; FILE *fp; { fputnum(num,numcount(num),fp); return 0; } int fputstr(str,byte,fp) char *str; int byte; FILE *fp; { int i; for (i = 0 ; i < byte ; i++) { fputc(str[i],fp); } return 0; } int cutspace(fp) FILE *fp; { int cc; cc = fgetc(fp); if (cc == ';') { ungetc(cc,fp); return 0; } if (cc != ' ' && cc != '\t' && cc != '\n' && cc != '\0') return -1; while (1) { cc = fgetc(fp); if (cc == EOF) return -1; if (cc != ' ' && cc != '\t' && cc != '\n' && cc != '\0') { ungetc(cc,fp); return 0; } } } int gethex(fp) FILE *fp; { int cc,i; char buf[256]; if (fgetc(fp) != '<') { return -1; } for (i = 0 ; ; i++) { cc = fgetc(fp); if ((cc >= '0' && cc <= '9') || (cc >= 'a' && cc <= 'f') || (cc >= 'A' && cc <= 'F')) { buf[i] = cc; } else if (cc == '>') { buf[i] = '\0'; return strtol(buf,NULL,16); } else { return -1; } } } int getdec(fp) FILE *fp; { int cc,i; char buf[256]; for (i = 0 ; ; i++) { cc = fgetc(fp); if ((cc >= '0' && cc <= '9') || cc == '-') { buf[i] = cc; } else if (cc == ' ' || cc == '\t' || cc == '\n' || cc == '\0' || cc == EOF) { ungetc(cc,fp); buf[i] = '\0'; return atoi(buf); } else return -1; } } makejvf-1.1a/write.c100664 7266 1750 22571 7231243454 13632 0ustar sada-tewbuser#include #include extern char *vtfmname,*kanatfm; extern int unit,zh,zw,jfm_id; extern int kanatume,chotai,baseshift,minute; extern FILE *afp; FILE *vfopen(name) char *name; { FILE *fp; fp = fopen(name,"w"); if (fp == NULL) { fprintf(stderr,"I cannot create VF file, %s.",name); exit(-1); } fputc(247,fp); /* PRE */ fputc(202,fp); /* ID */ fputc(0,fp); /* comment size */ fputnum(0,4,fp); /* TFM check sum */ fputnum(10*(1<<20),4,fp); /* TFM design size */ fputc(243,fp); /* fnt_def1 */ fputc(1,fp); /* Font ID */ fputnum(0,4,fp); /* TFM check sum */ if (chotai) fputnum(zh,4,fp); /* font design size (scaled) */ else fputnum(zw,4,fp); /* font design size (scaled) */ fputnum(10*(1<<20),4,fp); /* font design size */ fputc(0,fp); /* directory length */ fputc(strlen(vtfmname),fp); /* fontname length */ fputstr(vtfmname,strlen(vtfmname),fp); /* directory + fontname */ if (kanatfm) { fputc(243,fp); /* fnt_def1 */ fputc(2,fp); /* Font ID */ fputnum(0,4,fp); /* TFM check sum */ if (chotai) fputnum(zh,4,fp); /* font design size (scaled) */ else fputnum(zw,4,fp); /* font design size (scaled) */ fputnum(10*(1<<20),4,fp); /* font design size */ fputc(0,fp); /* directory length */ fputc(strlen(kanatfm),fp); /* fontname length */ fputstr(kanatfm,strlen(kanatfm),fp); /* directory + fontname */ } return fp; } writevf(code,fp) int code; FILE *fp; { int cc,cc2,cc3,cc4,w,skip=0,skip2=0,height; char buf[256],buf2[256]; w = jfmread(code); fputc(242,fp); /* long_char */ skip2=baseshift; switch (code) { case 0x2146: /* ‘ */ case 0x2148: /* “ */ if (jfm_id == 9 && minute) { /* 縦書き時はミニュートへ変換 */ if (afp) { if (code == 0x2146) sprintf(buf2,"CH <216C>"); else sprintf(buf2,"CH <216D>"); rewind(afp); while (fgets(buf,255,afp)!=NULL) { if (jfm_id==9 && !strncmp(buf,"FontBBox ",9)) { sscanf(&buf[9],"%d %d %d %d",&cc,&cc2,&cc3,&cc4); height=cc4; } if (!strncmp(buf,buf2,strlen(buf2))) { sscanf(&buf[14],"%d %d %d %d",&cc,&cc2,&cc3,&cc4); skip=(int)(w+((double)(cc2-height)/1000.0-0.05)*zw); break; } } } else skip=(int)((0.1)*zw); if (code == 0x2146) { skip2+=-(int)((0.65)*zh); } else { skip2+=-(int)((0.6)*zh); } if (kanatfm) cc=4; else cc=3; if (skip) cc+=numcount(skip)+1; if (skip2) cc+=numcount(skip2)+1; fputnum(cc,4,fp); fputnum(code,4,fp); /* char code */ fputnum(w,4,fp); /* char width */ if (skip) { fputc(143+numcount(skip)-1,fp); /* RIGHT */ fputnum2(skip,fp); } if (skip2) { fputc(157+numcount(skip2)-1,fp); /* DOWN */ fputnum2(skip2,fp); } if (kanatfm) fputc(173,fp); /* FONT_NUM_2 */ fputc(129,fp); /* SET2 */ if (code == 0x2146) fputnum(0x216c,2,fp); /* char code */ else fputnum(0x216d,2,fp); /* char code */ return; } case 0x214a: /* ( */ case 0x214c: /* 〔 */ case 0x214e: /* [ */ case 0x2150: /* { */ case 0x2152: /* 〈 */ case 0x2154: /* 《 */ case 0x2156: /* 「 */ case 0x2158: /* 『 */ case 0x215a: /* 【 */ skip = -(zw-w); if (kanatfm) cc=4; else cc=3; if (skip) cc+=numcount(skip)+1; if (skip2) cc+=numcount(skip2)+1; fputnum(cc,4,fp); break; case 0x2147: /* ’ */ case 0x2149: /* ” */ if (jfm_id == 9 && minute) { /* 縦書き時はミニュートへ変換 */ if (afp) { if (code == 0x2147) sprintf(buf2,"CH <216C>"); else sprintf(buf2,"CH <216D>"); rewind(afp); while (fgets(buf,255,afp)!=NULL) { if (jfm_id==9 && !strncmp(buf,"FontBBox ",9)) { sscanf(&buf[9],"%d %d %d %d",&cc,&cc2,&cc3,&cc4); height=cc4; } if (!strncmp(buf,buf2,strlen(buf2))) { sscanf(&buf[14],"%d %d %d %d",&cc,&cc2,&cc3,&cc4); skip=(int)(((double)(height-cc2)/1000.0+0.05)*zw); break; } } } else skip=(int)((0.4)*zw); if (code == 0x2147) { skip2+=(int)((0.65)*zh); } else { skip2+=(int)((0.6)*zh); } if (kanatfm) cc=4; else cc=3; if (skip) cc+=numcount(skip)+1; if (skip2) cc+=numcount(skip2)+1; fputnum(cc+2+88+2+32,4,fp); fputnum(code,4,fp); /* char code */ fputnum(w,4,fp); /* char width */ if (skip) { fputc(143+numcount(skip)-1,fp); /* RIGHT */ fputnum2(skip,fp); } if (skip2) { fputc(157+numcount(skip2)-1,fp); /* DOWN */ fputnum2(skip2,fp); } fputc(239,fp); /* XXX1 */ fputc(88,fp); fputs("ps: gsave currentpoint currentpoint translate 180 neg rotate neg exch neg exch translate",fp); if (kanatfm) fputc(173,fp); /* FONT_NUM_2 */ fputc(129,fp); /* SET2 */ if (code == 0x2147) fputnum(0x216c,2,fp); /* char code */ else fputnum(0x216d,2,fp); /* char code */ fputc(239,fp); /* XXX1 */ fputc(32,fp); fputs("ps: currentpoint grestore moveto",fp); return; } case 0x2121: /* spc */ case 0x2122: /* 、 */ case 0x2123: /* 。 */ case 0x2124: /* , */ case 0x2125: /* . */ case 0x212b: /* ゛ */ case 0x212c: /* ゜ */ case 0x214b: /* ) */ case 0x214d: /* 〕 */ case 0x214f: /* ] */ case 0x2151: /* } */ case 0x2153: /* 〉 */ case 0x2155: /* 》 */ case 0x2157: /* 」 */ case 0x2159: /* 』 */ case 0x215b: /* 】 */ case 0x216b: /* ° */ case 0x216c: /* ′ */ case 0x216d: /* ″ */ if (kanatfm) cc=4; else cc=3; if (skip2) cc+=numcount(skip2)+1; fputnum(cc,4,fp); break; default: if (w != zw) { if (((code >= 0x2421 && code <= 0x2576) || code == 0x213c ) && kanatume>=0) { sprintf(buf2,"CH <%X>",code); rewind(afp); while (fgets(buf,255,afp)!=NULL) { if (jfm_id==9 && !strncmp(buf,"FontBBox ",9)) { sscanf(&buf[9],"%d %d %d %d",&cc,&cc2,&cc3,&cc4); height=cc4; } if (!strncmp(buf,buf2,strlen(buf2))) { sscanf(&buf[14],"%d %d %d %d",&cc,&cc2,&cc3,&cc4); if (jfm_id==9) { switch (code) { case 0x2421: case 0x2423: case 0x2425: case 0x2427: case 0x2429: case 0x2443: case 0x2463: case 0x2465: case 0x2467: case 0x246e: case 0x2521: case 0x2523: case 0x2525: case 0x2527: case 0x2529: case 0x2543: case 0x2563: case 0x2565: case 0x2567: case 0x256e: case 0x2575: case 0x2576: skip=-(int)(((double)(1000-(cc4-cc2)-kanatume*2)/2/1000.0)*zw); break; case 0x213c: skip=-(int)((double)(cc-kanatume)/1000.0*zw); break; default: skip=-(int)(((double)(height-cc4-kanatume)/1000.0)*zw); break; } } else { skip=-(int)(((double)(cc-kanatume)/1000.0)*zw); } if (kanatfm) cc=4; else cc=3; if (skip) cc+=numcount(skip)+1; if (skip2) cc+=numcount(skip2)+1; fputnum(cc,4,fp); break; } } } else { skip = -(zw-w)/2; if (kanatfm) cc=4; else cc=3; if (skip) cc+=numcount(skip)+1; if (skip2) cc+=numcount(skip2)+1; fputnum(cc,4,fp); } } else { if (kanatfm) cc=4; else cc=3; if (skip) cc+=numcount(skip)+1; if (skip2) cc+=numcount(skip2)+1; fputnum(cc,4,fp); } break; } fputnum(code,4,fp); /* char code */ fputnum(w,4,fp); /* char width */ if (skip) { fputc(143+numcount(skip)-1,fp); /* RIGHT */ fputnum2(skip,fp); } if (skip2) { fputc(157+numcount(skip2)-1,fp); /* DOWN */ fputnum2(skip2,fp); } if (kanatfm) { if (code <= 0x2576) fputc(173,fp); /* FONT_NUM_2 */ else fputc(172,fp); /* FONT_NUM_1 */ } fputc(129,fp); /* SET2 */ fputnum(code,2,fp); /* char code */ } int vfclose(fp) FILE *fp; { int i,cc; cc = ftell(fp); for (i = 0 ; i < 4-(cc%4) ; i++) { fputc(248,fp); /* POST */ } fclose(fp); } int maketfm(name) char *name; { char nbuf[256]; FILE *fp; strcpy(nbuf,name); strcat(nbuf,".tfm"); fp = fopen(nbuf,"w"); if (fp == NULL) { fprintf(stderr,"I cannot create TFM file, %s.",name); exit(-1); } fputnum(jfm_id,2,fp); /* JFM ID */ fputnum(1,2,fp); /* number of char type */ fputnum(27,2,fp); /* file words */ fputnum(2,2,fp); /* header words */ fputnum(0,2,fp); /* min of char type */ fputnum(0,2,fp); /* max of char type */ fputnum(2,2,fp); /* width words */ fputnum(2,2,fp); /* height words */ fputnum(2,2,fp); /* depth words */ fputnum(1,2,fp); /* italic words */ fputnum(0,2,fp); /* glue/kern words */ fputnum(0,2,fp); /* kern words */ fputnum(0,2,fp); /* glue words */ fputnum(9,2,fp); /* param words */ fputnum(0,4,fp); /* check sum */ fputnum(10*(1<<20),4,fp); /* design size */ fputnum(0,2,fp); /* char code */ fputnum(0,2,fp); /* char type */ fputnum((1<<24)+(1<<20)+(1<<16),4,fp); /* char info */ fputnum(0,4,fp); /* width */ fputnum(1<<20,4,fp); /* width */ if (jfm_id == 11) { fputnum(0,4,fp); /* height */ fputnum((int)((1<<20)*0.9),4,fp); /* height */ fputnum(0,4,fp); /* depth */ fputnum((1<<20)-(int)((1<<20)*0.9),4,fp); /* depth */ } else { fputnum(0,4,fp); /* height */ fputnum(1<<19,4,fp); /* height */ fputnum(0,4,fp); /* depth */ fputnum(1<<19,4,fp); /* depth */ } fputnum(0,4,fp); /* italic */ fputnum(0,4,fp); /* tan */ fputnum(0,4,fp); /* kanjiskip */ fputnum(0,4,fp); /* +kanjiskip */ fputnum(0,4,fp); /* -kanjiskip */ fputnum(1<<20,4,fp); /* zh */ fputnum(1<<20,4,fp); /* zw */ fputnum(0,4,fp); /* xkanjiskip */ fputnum(0,4,fp); /* +xkanjiskip */ fputnum(0,4,fp); /* -xkanjiskip */ fclose(fp); } makejvf-1.1a/Changes.txt100664 7266 1750 703 7423167274 14406 0ustar sada-tewbuser変更履歴 1.0 -> 1.1 ・ベースラインを変更するための -b オプションを追加。 ・非漢字部/漢字部を別フォントにするための -K オプションを追加。 ・長体JFMのための -C オプションを追加。 ・JFMによっては正しくVFが作成されない場合があったので、松阪大学の奥村晴彦さんの ご協力により修正。 ・数値処理に不具合があったので、東京書籍印刷株式会社の小林肇さんのご協力により 修正。 1.1 -> 1.1a ・縦書き時にクオート類をミニュートへ変更するためのオプション -m を追加 makejvf-1.1a/COPYRIGHT.jis100664 7266 1750 2764 7422730032 14370 0ustar sada-tewbuser($BCm(B) $B0J2<$OF|K\8l$NJ}$,J,$+$j$d$9$$?M$N$?$a$K!"1Q8l$NCx:n8"I=<($rLu$7(B $B$?J8>O$G$"$k!#@5<0$JCx:n8"$O!"1Q8l$N86K\$K=>$&!#(B Copyright (C) 1999 ASCII Corporation. All rights reserved. $BJQ99$NM-L5$K$+$+$o$i$:!"%=!<%9$*$h$S%P%$%J%j7A<0$N:FG[I[$*$h$SMxMQ$O!"(B $B0J2<$N>r7o$rK~$?$7$F$$$l$P!"$3$l$r5v2D$9$k!#(B 1. $B%=!<%9!&%3!<%I$N:FG[I[$O!">e5-$NCx:n8"I=<(!"$3$N>r7o9`L\!"$*$h$S!"(B $B0J2<$NLH@U;v9`$rJ]B8$7$J$1$l$P$J$i$J$$!#(B 2. $B%P%$%J%j7A<0$N:FG[I[$O!">e5-$NCx:n8"I=<(!"$3$N>r7o9`L\!"$*$h$S!"0J(B $B2<$NLH@U;v9`$r!"$=$NG[I[$KIU?o$9$k@bL@=q!"$"$k$$$O$=$NB>$N;qNA$N$$$:$l(B $B$+$KL@5-$7$J$1$l$P$J$i$J$$!#(B 3. $BA0$b$C$FFCJL$K5vBz$rF@$J$$8B$j!"$3$N%=%U%H%&%'%"$+$iGI@8$7$?@=IJ$N(B $B?d>)$dHNGdB%?J$N$?$a$K!"$3$NCx:n8"$rMxMQ$7$F$O$J$i$J$$!#(B $B$3$N%=%U%H%&%'%"$O!V$3$N$^$^$N7A$G!WDs6!$5$l!"L@<(E*$"$k$$$O8@30$NJ]>Z(B $B$O!">&MQMxMQ$*$h$SFCDjL\E*$X$NE,9g$KBP$9$k8@30$NJ]>Z$b4^$_!"$^$?$3$l$i(B $B$@$1$K8B$i$:!"B8:_$7$J$$!#$?$H$(0J2<$N$h$&$JB;32$N2DG=@-$r<(:6$5$l$F$$(B $B$?$H$7$F$b!"$I$N$h$&$J7A$K$7$m$3$N%=%U%H%&%'%"$NMxMQ$+$iH/@8$7$?LdBj$K(B $B$*$$$F!"$3$NCx:n8"(B $B@\E*$K!"4V@\E*$K!"6vA3$K!"FCJL$K!"D(H3>e!"$"$k$$$O!"I,A3E*$K@8$8$F$7$^$C(B $B$?B;32$KBP$7@UG$$O$J$/!"$$$+$J$k@UG$M}O@>e$G$b7@Ls$NM-L5$K78$o$i$:87L)(B $B$J@UG$$O$J$/!"$^$?(B($B2a<:$"$k$$$O$=$NB>$r4^$`(B)$BITK!9T0Y$KBP$7$F$b@UG$$O$J(B $B$$!#(B makejvf-1.1a/COPYRIGHT100664 7266 1750 2572 7422730016 13603 0ustar sada-tewbuserCopyright (C) 1999 ASCII Corporation. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the author may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.