Skip to content

Instantly share code, notes, and snippets.

@aminophen
Last active July 19, 2017 11:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aminophen/a1e367829363980c108bda29266eed0c to your computer and use it in GitHub Desktop.
Save aminophen/a1e367829363980c108bda29266eed0c to your computer and use it in GitHub Desktop.
makejvf で「句読点類が仮想ボディの中央にあるフォント対応(-c)」を追加するパッチ(取り下げ)
Index: Build/source/texk/makejvf/main.c
===================================================================
--- Build/source/texk/makejvf/main.c (revision 44811)
+++ Build/source/texk/makejvf/main.c (working copy)
@@ -9,7 +9,7 @@
FILE *vfp,*afp=NULL;
char *atfmname,*vtfmname,*afmname,*vfname,*kanatfm,*jistfm,*ucsqtfm;
-int kanatume=-1,chotai=0,baseshift=0,minute=0,useset3=0,hankana=0,fidzero=0;
+int kanatume=-1,chotai=0,baseshift=0,minute=0,center=0,useset3=0,hankana=0,fidzero=0;
int pstfm_nt;
long ucs=0;
@@ -22,7 +22,7 @@
kpse_set_program_name(argv[0], "makejvf");
set_enc_string("sjis", "euc");
- while ((c = getopt (argc, argv, "k:K:Ca:b:mu:3J:U:Hi")) != -1)
+ while ((c = getopt (argc, argv, "k:K:Ca:b:mcu:3J:U:Hi")) != -1)
switch (c) {
@@ -55,6 +55,9 @@
case 'm':
minute=1;
break;
+ case 'c':
+ center=1;
+ break;
case 'u':
if (!strcmp(optarg, "gb"))
ucs = ENTRY_G;
@@ -179,6 +182,7 @@
fputs2(" 文字の高さを1000として整数で指定\n", stderr);
fputs2(" プラスで文字が下がり、マイナスで文字が上がる\n", stderr);
fputs2("-m 縦書き時にクオート(’”)の代わりにミニュート(′″)を使用\n", stderr);
+ fputs2("-c 句読点類が仮想ボディの中央にあるフォントを仮定(繁体字を想定)\n", stderr);
fputs2("-a <AFMfile> AFMファイル名(かな詰め時に使用)\n", stderr);
fputs2("-k <数値> かな詰めマージン指定\n", stderr);
fputs2(" 文字幅を1000として整数で指定。-aオプションと共に使用\n", stderr);
Index: Build/source/texk/makejvf/makejvf.h
===================================================================
--- Build/source/texk/makejvf/makejvf.h (revision 44811)
+++ Build/source/texk/makejvf/makejvf.h (working copy)
@@ -2,7 +2,7 @@
extern char *vtfmname,*kanatfm,*jistfm,*ucsqtfm;
extern int unit,zh,zw,jfm_id;
-extern int kanatume,chotai,baseshift,minute,hankana,fidzero;
+extern int kanatume,chotai,baseshift,minute,center,hankana,fidzero;
extern int pstfm_nt;
extern FILE *afp;
extern long ucs;
Index: Build/source/texk/makejvf/write.c
===================================================================
--- Build/source/texk/makejvf/write.c (revision 44811)
+++ Build/source/texk/makejvf/write.c (working copy)
@@ -226,11 +226,14 @@
fputs("ps: currentpoint grestore moveto",fp);
return;
}
- case 0x2121: /* spc */
+ break;
case 0x2122: /* 、 */
case 0x2123: /* 。 */
case 0x2124: /* , */
case 0x2125: /* . */
+ if (center)
+ goto defj;
+ case 0x2121: /* spc */
case 0x212b: /* ゛ */
case 0x212c: /* ゜ */
case 0x214b: /* ) */
@@ -246,6 +249,7 @@
case 0x216c: /* ′ */
case 0x216d: /* ″ */
break;
+defj:
default:
if (w != zw) {
if (((code >= 0x2421 && code <= 0x2576) || code == 0x213c ) && kanatume>=0) {
@@ -571,11 +575,14 @@
fputnum(0x2149,2,fp); /* char code */
return;
}
- case 0x3000: /* spc */
+ break;
case 0x3001: /* 、 */
case 0x3002: /* 。 */
case 0xFF0C: /* , */
case 0xFF0E: /* . */
+ if (center)
+ goto defu;
+ case 0x3000: /* spc */
case 0x309B: /* ゛ */
case 0x309C: /* ゜ */
case 0xFF09: /* ) */
@@ -608,6 +615,7 @@
pstfm_nt+=1;
break;
}
+defu:
default:
if (w != zw) {
if (!uniblock_iskanji && kanatume>=0) {
@aminophen
Copy link
Author

texjporg/uptex-fonts#2 に関連したもの。

にある JPL ソースを uppltotf でコンパイルして得られる JFM は、句読点類が(日本語のような仮想ボディの左下に寄った位置でなく)仮想ボディの中央にあるケースを想定している。この JFM に対して、例えば

$ makejvf -i -u cns -3 -c uptchc1rm-h.tfm upmsl-h

のように「-c」オプションを付けて実行すると、それに見合った VF を作ることができる、はず。

@aminophen
Copy link
Author

aminophen commented Jul 7, 2017

さらに,文字コード表ごとに水平シフト量(MOVERIGHT)および垂直シフト量(MOVEDOWN)を指定できるようにするパッチを加えた。

たとえば

00B7 -0.25 0.5

という内容の file.txt を用意して(実際には区切りはスペースでなくタブ)

$ makejvf -i -u jis -t file.txt upjisr-h.tfm uprml-h

のように「-t」オプションを付けて実行すると、U+00B7 の文字を右に -0.25zw だけ、下に 0.5zh だけシフトする。

@zr-tex8r
Copy link

zr-tex8r commented Jul 8, 2017

ヘッダファイル(makejvf.h)中で変数の実体を定義してしまってるゾ……。

@aminophen
Copy link
Author

ほんとだ,あとで直しておきます。

@zr-tex8r
Copy link

zr-tex8r commented Jul 8, 2017

  • get_usertable() でファイルはfclose()した方がよい。
  • usertableのファイルの行が多すぎる場合はエラーを出すべき。

@aminophen
Copy link
Author

aminophen commented Jul 9, 2017

  • ヘッダファイル(makejvf.h)中で変数の実体を定義してしまってる
  • get_usertable() でファイルはfclose()した方がよい。
  • usertableのファイルの行が多すぎる場合はエラーを出すべき。

なおしてみました。

設定ファイルの文法が決まっていないので,現状では数値3つが並ぶだけのよくわからないものになっていますが,設定ファイルをより安全にするには,例えば MOVE <codepoint> <moveright> <movedown> のように,行の最初の要素を識別子にした方が良いかもと考え始めています。

あと,-t オプションが複数回使われた場合の挙動も未定義ですね。

#メモ:仮に MOVE … という仕様にする場合の get_usertable() 関数の実装例(値が足りない場合・タブの連続が含まれる場合などのエラーハンドルは弱いが):

void get_usertable(char *name)
{
	FILE *fp;
	char *tok, *endptr;

	fp = fopen(name,"r");
	if (fp == NULL) {
		fprintf(stderr,"Cannot find %s!\n",name);
		exit(1);
	}
	for (int l = 0; l < MAX_TABLE;) {
		if (fgets(buf, BUF_SIZE, fp) == NULL) {
			usertable_maxline = l;
			return;
		}
		char *tok = strtok(buf, "\t");
		if (!strcmp(tok, "MOVE")) {
			usertable_content[l].codepoint = strtol(strtok(NULL, "\t\n"), &endptr, 16);
			if (*endptr != '\0') goto taberr;
			usertable_content[l].moveright = strtod(strtok(NULL, "\t\n"), &endptr);
			if (*endptr != '\0') goto taberr;
			usertable_content[l].movedown = strtod(strtok(NULL, "\t\n"), &endptr);
			if (*endptr != '\0') goto taberr;
			if (strtok(NULL, "\t\n") != NULL) {
taberr:
				fprintf(stderr, "Error in user-defined table file %s (line %d)!\n", name, l+1);
				exit(1);
			}
			goto rep;
		}
		fprintf(stderr, "Unknown setting %s found in %s (line %d)!\n", tok, name, l+1);
		exit(1);
rep:
		l++;
	}
	if (fgets(buf, BUF_SIZE, fp) != NULL) {
		fprintf(stderr, "User-defined table in %s is too large!\n", name);
		exit(1);
	}
	fclose(fp);
}

@aminophen
Copy link
Author

aminophen commented Jul 12, 2017

20170712-makejvf-center-usertable.patch で,設定ファイルの一般化を想定し,

MOVE <codepoint> <moveright> <movedown>

という書式で受け付ける仕様に変更しました(r44777ベース)。以下は TODO:

  • -t オプションが複数回使われた場合の挙動
  • 値が足りない場合,タブの連続が含まれる場合などのエラーハンドル

20170715-makejvf-center-usertable.patch で r44805 ベースに更新。

さらに r44811 ベースに更新。

  • 20170716-makejvf-center-usertable.patch … -c オプションと -t オプションを追加する。
  • 20170716-makejvf-center.patch … -c オプションだけを追加する。

@aminophen
Copy link
Author

-c オプションは -e オプションの追加により重要性が薄れたので取りやめようと思います。 -t だけ新しい Gist に移行します。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment