New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[makejvf] makejvfを制御する入力ファイル #18

Closed
t-tk opened this Issue Jul 16, 2017 · 17 comments

Comments

Projects
None yet
2 participants
@t-tk
Collaborator

t-tk commented Jul 16, 2017

私が以前からやりたいと思いつつ未だに出来ていないのが、vfに書く文字集合を外部ファイルから与える、ということです。狙いは前述のように、現在uniblock.c の ENTRY_* でハードコードされている部分の自由度を広げることです。
入力ファイルとしては、
japanese-otf-uptex の中の sp_list_j.txt のような形式を考えていました。使い回し出来ると楽なので。
さらには
20000-2A6FF, 2CEB0-2EBE0
のような範囲指定も受けるようにしたい。
まあしかし、多少のフォーマットの差異は構いません。

ご提案の

MOVE <code> <right> <down>

のような指定と上記の範囲指定を同じ設定ファイルでやるとすると、
例えば

CHARSET <code>,<code>,<code>-<code>,<code>,
+ <code>,<code>-<code>

のような形式が一案。
あるいは、全く別の役割だと考えて、入力ファイルも別に分けるのでも構いません。

将来の拡張性やメンテナンス性を勘案して良い方法を選べればよいです。

@t-tk t-tk added the enhancement label Jul 16, 2017

@aminophen

This comment has been minimized.

Member

aminophen commented Jul 16, 2017

ありがとうございます。他に設定ファイルでやりたいことがあるとすれば,

  • 文字の置換(vf の内部でシングルクオートをダブルクオートに変換したりとか)

は考えていました(REPLACE <code> <new code> のような書式を想定)。

入力ファイルとしては、japanese-otf-uptex の中の sp_list_j.txt のような形式を考えていました。使い回し出来ると楽なので。

使い回しも魅力的で,上の REPLACE であれば CMap そのものですね。ただ,この場合,入力ファイルの種類ごとにオプションを新設することになり(← 他に良い方法があれば是非!),将来に耐えられるかだけが心配であります。

@t-tk

This comment has been minimized.

Collaborator

t-tk commented Jul 16, 2017

機能ごとにオプション新設は嫌ですね。そうすると、文法を作って入力ファイルを一つにした方が楽です。
こんな感じでどうでしょう。

% コメント
% コメント
MOVE <code> <right> <down>

% 空の行は無視
REPLACE <code> <new code>

CHARSET <code>,<code>,<code>-<code>,<code>,
+ <code>,<code>-<code>
@aminophen

This comment has been minimized.

Member

aminophen commented Jul 16, 2017

文法を作って入力ファイルを一つに

賛成します。-u オプションとの兼ね合いはどうしましょうか。「UCS mode に変更すること(つまり VF が UTF-16 エンコードになる)」と「文字集合を指定すること」が,現状では -u <CHARSET> でいっぺんになされています。「JIS mode のままで設定ファイルから文字コードを指定」を可能にするには,分離する必要がありそうです。

@t-tk

This comment has been minimized.

Collaborator

t-tk commented Jul 16, 2017

案1 (保守的): -u custum という指定があれば、設定ファイルからCHARSETのテーブルを読んでvfに入れる。それ以外の -u {gb,cns,ks,jis,jisq} かつCHARSETテーブルがない場合は現状の動作を維持する。設定ファイルへCHARSETテーブルがあることと -u custom 指定の組合せを必須として、両立していない場合はエラーとする。

案2 (ソースを簡潔に): 現状の -u {gb,cns,ks,jis,jisq} を廃止して、ENTRY_*のハードコードも廃止して、同等の設定ファイルをCHARSETで作って提供する。オプションは -u hoge → -u にする。入力オプションは大きく変わるが、出力として同じ物が出来るという互換性は維持する。設定ファイルにCHARSETがなくかつ-uが指定されている場合は、現状の-u jis と同等にする。

上記は文字集合を指定するのはUCS modeのときだけでよい、という認識ですが、ひょっとしてpTeXでも使いたい人はいますかね? それならば

案3: 案2かつ、UCS modeの設定にかかわらず、設定ファイルのCHARSETの設定を見つければ文字集合は設定ファイルに従う。

他にもいろいろ可能性はあると思います。
私の趣味は案1ですが、
makejvfはある意味「エキスパートがたまにしか使わないソフト」だと思うので、今後メンテナンスしやすい方という案2,3の選択はあり得るかと思います。

@aminophen

This comment has been minimized.

Member

aminophen commented Jul 16, 2017

私は案 1 が良いのでは,と思います。もう少し具体化してみました。

  • 「設定ファイル <file> を読ませる」というオプション -t <file> を新設。
  • JIS mode の場合
    • 設定ファイルで MOVEREPLACE を与えられる。
    • もし設定ファイルに CHARSET があったら警告して無視。
  • UCS mode の場合(-u {gb,cns,ks,jis,jisq,custom} でこのモードに入る)
    • 設定ファイルで MOVEREPLACECHARSET を与えられる。
    • -u custom の場合,設定ファイルから CHARSET を読み込む。
      • -t <file> が併用されない場合はエラー。
      • -t <file> のとき,もし設定ファイルに CHARSET がなかったらエラー。
    • -u {gb,cns,ks,jis,jisq} の場合,もし設定ファイルに CHARSET があったら警告して無視。

ENTRY_* のハードコードは十分機能しているので,案 2 のように敢えて全部設定ファイルに分離するのは勿体無いと思いました。JIS mode は pTeX 用ですから,実質日本語でしか使わないはずですし,「pTeX の文字範囲と不一致にする」というのを許容してしまう案 3 は需要が少ないと思われます。

@t-tk

This comment has been minimized.

Collaborator

t-tk commented Jul 16, 2017

賛成です。
付け加えるとすると、
CHARSETのテーブルは昇順ソート済み前提にして、makejvf内部の実装は頑張らないで、
読んだ順にublock_data[] と同様のテーブルに保持してsearch_cjk_entry()のルーチンを少々拡張するだけで済ませようかな、と考えていました。
CHARSETの読み込み時に昇順になっていなければエラー終了。

@aminophen

This comment has been minimized.

Member

aminophen commented Jul 16, 2017

昇順ソート済み前提だとたしかに実装しやすそうですね。賛成します。

もう一つ設定ファイルに欲しい機能を思いつきました(他に比べて優先度は低いです)。

  • KANJI :漢字と非漢字の TFM を分ける場合の,漢字の方の文字集合を指定。
    • CHARSET と同様に昇順ソート済み前提
    • ただし JIS mode でも UCS mode でも利用可能
    • 有効な CHARSET の部分集合になっていなければ警告またはエラー ← これは難しければ実装しなくても良いかも知れない。

3つ以上に分けるようなケースは,従来どおりサポート不要と思います。

@t-tk

This comment has been minimized.

Collaborator

t-tk commented Aug 26, 2017

tex-jp-build に makejvf-usertable ブランチを作り、
以前 @aminophen さんからご提案いただいた

を元に、CHARSET を読めるようにしてみました。
コメント行、空行の無視も入れました。
ループ処理の若干の変更やファイル名や構成の変更なども入れておりまして、私としては分かりやすくした方向の修正のつもりですが、議論の分かれるところかもしれません。
revert合戦にするのは本意ではありませんので、やり過ぎでしたらrevertして頂いても構いません。
手元の簡単なテストでは意図通りに動いているように見えていますが、テストはもう少しした方がよいと思っています。

現状、読み込めるファイルの仕様はこんな感じになっているつもりです。

% コメント
% コメント
MOVE\t<code>\t<right>\t<down>

% 空の行は無視
REPLACE\t<code>\t<new code>

CHARSET\t<code>,<code>,<code>..<code>,<code>
+\t<code>,<code>..<code>

ご意見など伺えたら幸いです。

@t-tk

This comment has been minimized.

Collaborator

t-tk commented Aug 26, 2017

現状↓は実装されていないと思います。(警告はなく、無視される)

  • JIS mode の場合
    • もし設定ファイルに CHARSET があったら警告して無視。
  • UCS mode の場合(-u {gb,cns,ks,jis,jisq,custom} でこのモードに入る)
    • -u {gb,cns,ks,jis,jisq} の場合,もし設定ファイルに CHARSET があったら警告して無視。
@aminophen

This comment has been minimized.

Member

aminophen commented Aug 26, 2017

ありがとうございます。 texjporg/uptex-fonts#3 で仰っていた

Extension-Bの普及、set3の普及の現状を踏まえ、今後のupTeXの標準フォント upjis{r,g}-{h,v} は、Extension-B の約200字を含むものにする

が CHARSET を使う良い例となりそうなので,後ほどテストしてみようと思います。

@aminophen

This comment has been minimized.

Member

aminophen commented Aug 27, 2017

CHARSET の動作確認完了しました。大丈夫そうなので、TeX Live の方にも入れてもよいのではないかと考えています。バージョン番号も新しい日付としたいです。

@t-tk

This comment has been minimized.

Collaborator

t-tk commented Aug 28, 2017

先ほど TeX Live svn にコミットしました(r45152)。
昨日まで実装されていなかった警告も入れました。その他、若干の修整をしました。

upjis{r,g}-{h,v} に追加したい文字などは、 texjporg/uptex-fonts#3 で続きをやりましょう。

あと、ここの話題では KANJI など、さらなる機能追加の話題が残っていると思いますが、直近に触る予定が無いようであればここは一旦綴じましょうか?

@aminophen

This comment has been minimized.

Member

aminophen commented Aug 28, 2017

はい,一旦閉じていただいて大丈夫です。コミットありがとうございました。

@aminophen

This comment has been minimized.

Member

aminophen commented Aug 29, 2017

makejvf のビルドで usrtable.c から警告が出ているようです。あとで調べます。

../../../texk/makejvf/usrtable.c:32:13: warning: using the result of an assignment as a condition without parentheses [-Wparentheses]
                if (endptr=strchr(buf, '%')) strcpy(endptr,"\n");  /* ignore after '%'  */
                    ~~~~~~^~~~~~~~~~~~~~~~~
../../../texk/makejvf/usrtable.c:32:13: note: place parentheses around the assignment to silence this warning
                if (endptr=strchr(buf, '%')) strcpy(endptr,"\n");  /* ignore after '%'  */
                          ^
                    (                      )
../../../texk/makejvf/usrtable.c:32:13: note: use '==' to turn this assignment into an equality comparison
                if (endptr=strchr(buf, '%')) strcpy(endptr,"\n");  /* ignore after '%'  */
                          ^
                          ==
../../../texk/makejvf/usrtable.c:59:14: warning: using the result of an assignment as a condition without parentheses [-Wparentheses]
                        while (tok=strtok(NULL, ",\t\n")) {
                               ~~~^~~~~~~~~~~~~~~~~~~~~~
../../../texk/makejvf/usrtable.c:59:14: note: place parentheses around the assignment to silence this warning
                        while (tok=strtok(NULL, ",\t\n")) {
                                  ^
                               (                        )
../../../texk/makejvf/usrtable.c:59:14: note: use '==' to turn this assignment into an equality comparison
                        while (tok=strtok(NULL, ",\t\n")) {
                                  ^
                                  ==
../../../texk/makejvf/usrtable.c:60:15: warning: using the result of an assignment as a condition without parentheses [-Wparentheses]
                                if (endptr=strstr(tok,"..")) {
                                    ~~~~~~^~~~~~~~~~~~~~~~~
../../../texk/makejvf/usrtable.c:60:15: note: place parentheses around the assignment to silence this warning
                                if (endptr=strstr(tok,"..")) {
                                          ^
                                    (                      )
../../../texk/makejvf/usrtable.c:60:15: note: use '==' to turn this assignment into an equality comparison
                                if (endptr=strstr(tok,"..")) {
                                          ^
                                          ==
3 warnings generated.
@aminophen

This comment has been minimized.

Member

aminophen commented Aug 29, 2017

r45160 でマニュアル makejvf.1 を更新しました。上記の警告はまだ修正していません。

@t-tk

This comment has been minimized.

Collaborator

t-tk commented Aug 29, 2017

ご指摘ありがとうございます。
r45161で警告を抑制しました。

@t-tk

This comment has been minimized.

Collaborator

t-tk commented Sep 2, 2017

tex-jp-build の makejvf-usertable ブランチを master にマージして閉じました。

@t-tk t-tk closed this Sep 2, 2017

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