Last active
July 19, 2017 11:49
-
-
Save aminophen/a1e367829363980c108bda29266eed0c to your computer and use it in GitHub Desktop.
makejvf で「句読点類が仮想ボディの中央にあるフォント対応(-c)」を追加するパッチ(取り下げ)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) { |
さらに,文字コード表ごとに水平シフト量(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 だけシフトする。
ヘッダファイル(makejvf.h)中で変数の実体を定義してしまってるゾ……。
ほんとだ,あとで直しておきます。
get_usertable()
でファイルはfclose()
した方がよい。- usertableのファイルの行が多すぎる場合はエラーを出すべき。
- ヘッダファイル(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);
}
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
オプションだけを追加する。
-c
オプションは -e
オプションの追加により重要性が薄れたので取りやめようと思います。 -t
だけ新しい Gist に移行します。
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
texjporg/uptex-fonts#2 に関連したもの。
にある JPL ソースを uppltotf でコンパイルして得られる JFM は、句読点類が(日本語のような仮想ボディの左下に寄った位置でなく)仮想ボディの中央にあるケースを想定している。この JFM に対して、例えば
のように「-c」オプションを付けて実行すると、それに見合った VF を作ることができる、はず。