Skip to content
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

ppltotf, makejvf, ptex: (GLUEKERN) support SKIP property and rearrangement #47

Merged
merged 14 commits into from
Feb 2, 2018

Conversation

aminophen
Copy link
Member

@aminophen aminophen commented Jan 28, 2018

ZR さんの https://twitter.com/zr_tex8r/status/886575907283980292 が発端の話題です。

欧文の PL (TFM の元) にある LIGTABLE テーブル (ligature/kern) では,SKIP という命令を使うことができます。ところが,和文の JPL (JFM の元) の GLUEKERN テーブルで SKIP を使うと

This property name doesn't belong in a GLUEKERN list (line 1).
...   (SKIP 
            D 19)...

なるエラーが出ます。私は unsupported なのだろうと思っていたのですが,jfm.pdf ではなくウェブサイトの方の JFM 仕様書には

glue_kernには、特定のchar_typeの組合せのときに、 挿入するglueまたはkernが簡単なプログラム構造として含まれています。
skip_byteは、 この値が128以上のときはプログラムの終了を示します。 それ以外のときは、次のステップまでスキップする値を示します。

とあります。まさにこの「次のステップまでスキップする値を示します。」が SKIP 命令なので,ドキュメントされているのに使えないことになります。これは変なので,(u)pTeX / (u)pPLtoTF / makejvf で GLUEKERN の SKIP 命令をサポートするような修正を書いてみました。テストケースは

にあります。

補足:SKIP 命令については本家の pltotf.web を読むのがわかりやすいですが,(STOP) の代わりに使うものです。例えば (SKIP D <number>) のように書くと,続く LIGTABLE のテーブル要素を <number> 個読み飛ばします。これを上手に利用すると,複数の文字に似たようなリガチャやカーンを設定する場合に,テーブル要素をまとめることで LIGTABLE の上限に達しづらくなります。

GLUEKERN で SKIP を使うメリットとして思いつくのは,例えば「いろいろな仮名に対して字幅を異なる設定にしたいが,約物と仮名の間の JFM グルーが一部同じ設定」という場合です。(たくさんの TYPE に対して何度も (GLUE …) を書く必要がなくなる。全部同じなら LABEL を重ねればよいですが,一部の場合はたぶん SKIP を使って圧縮できると思います。)

@aminophen
Copy link
Member Author

さらに補足:

  • (u)pTFtoPL はもともと SKIP を読み出せる状態でしたのでパッチ不要です。
  • GLUEKERN テーブルは (u)pTeX の組版時だけに必要なものなので,各種 DVIware の改修は不要と思います。(DVIware が JFM を読む場合,それは CHARSINTYPE と TYPE から「字幅情報」を取得しているだけのはず。)

@aminophen
Copy link
Member Author

aminophen commented Jan 28, 2018

さらに今気づきましたが, #8

今まで(u)ppltotfで
glue/kernテーブルの大きさ(nl)が最大255個,
kernテーブルの大きさ(nk)が最大255個に制限されていました。
それらをmax_lig_steps (32510個), max_kerns (5000個) に拡張しました。(r43142, r43143)

もまだ不完全なのではという気がしてきました。この上限アップはあくまで「(u)pPLtoTF がバイナリの JFM に巨大な gluekern を格納できるようになった」だけであって,それを読み出す側である (u)pTeX はそのような対処がされていないからです。実際,256 を超えるエントリは JFM への格納時に再配置されているため,glue_kern_start だけでは足りず,glue_kern_restart しないと読み出せないと思います。(tex.web における lig_kern_start と lig_kern_restart の関係を真似る必要あり)。

https://twitter.com/aminophen/status/957426630187626497

こちらについても明日以降パッチを書きます。

@aminophen
Copy link
Member Author

256 を超えるエントリは JFM への格納時に再配置されているため,glue_kern_start だけでは足りず,glue_kern_restart しないと読み出せない

c761318 で「巨大な GLUEKERN テーブル」を (u)pTeX が読み出せるようにしました。テストケースとその説明は,また別の Gist に書いてあります。

(巨大な GLUEKERN テーブルを定義しているため,テスト用に作成した gkhugeok.pl は 969 KB あります。ダウンロードの際はご注意ください)

@aminophen aminophen changed the title ppltotf, makejvf, ptex: support SKIP property in GLUEKERN ppltotf, makejvf, ptex: support "SKIP property in GLUEKERN" and "huge GLUEKERN table" Jan 29, 2018
@aminophen aminophen changed the title ppltotf, makejvf, ptex: support "SKIP property in GLUEKERN" and "huge GLUEKERN table" ppltotf, makejvf, ptex: (GLUEKERN) support SKIP property and rearrangement Jan 29, 2018
@zr-tex8r
Copy link

細かい話ですが、tftopl.web(350行目付近)によると、
「lig_kernプログラムの実行中(つまり再配置があったとしても既に済ませている)にskip_byte>128の命令に出会った場合は、何もせずに停止」
(※skip_byte=128はその命令を実行して停止)
となっていて、tex.webは実際にそのように実装されているようです。

まあ、普通には起こりえないバターンですが。

あと、glue_kern_restartであるべきところが1箇所lig_kern_restartになっています。

@aminophen
Copy link
Member Author

glue_kern_restartであるべきところが1箇所lig_kern_restartになっています。

e8a3546 で直しました。また,makejvf -e を「254 固定」にしていたところを,一応 ptex-base.ch や tex.web に即して skip_byte > 128 にしてみました。(多分 better なはず)

「lig_kernプログラムの実行中(つまり再配置があったとしても既に済ませている)にskip_byte>128の命令に出会った場合は、何もせずに停止」
(※skip_byte=128はその命令を実行して停止)

この件は調べてみます。

@aminophen
Copy link
Member Author

aminophen commented Jan 29, 2018

「lig_kernプログラムの実行中(つまり再配置があったとしても既に済ませている)にskip_byte>128の命令に出会った場合は、何もせずに停止」
(※skip_byte=128はその命令を実行して停止)

tex.web の l.14541, l.14786, l.17846 の if skip_byte(cur_i)<=stop_flag then のことのようですね。lig_kern プログラムを実行しているのはこの 3 か所だけなので,仰る通りそういう実装になっているということのようです。できるかどうかやってみます。

# メモ:このうち最初の一つは skew なので,GLUEKERN には関係ない。後の二つ(それぞれ,数式ファミリでの lig_kern,地の文での lig_kern)は今回の改修で参考にした部分。

@aminophen
Copy link
Member Author

aminophen commented Jan 29, 2018

glue_kern プログラムの実行中に skip_byte > 128 に出会った場合は何もせずに停止,してみたつもりのものが 12077c0 です。これだといかがでしょうか?

メモ:makejvf も「glue_kern プログラムの実行中に skip_byte > 128 に出会った場合は何もせずに停止」したほうがいいかもしれないので,それはまた明日。 → 9ee9a84

@aminophen
Copy link
Member Author

Issue #48 の修正も,本 pull request と同じブランチに入れてあります。

@aminophen
Copy link
Member Author

aminophen commented Feb 2, 2018

#48 の regression の修正と,この #47 の修正・改良を,今夜マージしてコミットしようと思います。

@aminophen
Copy link
Member Author

r46518 で ptexdir / uptexdir の変更を,r46519 で makejvf の変更をコミットしました。

@zr-tex8r
Copy link

zr-tex8r commented Feb 2, 2018

(今さらなんですが…)

コレって、+iは要らないんだっけ?

aminophen added a commit to texjporg/ptex-base that referenced this pull request Feb 2, 2018
aminophen added a commit that referenced this pull request Feb 2, 2018
@aminophen
Copy link
Member Author

aminophen commented Feb 2, 2018

コレって、+iは要らないんだっけ?

要りますね… ミスです。ありがとうございます。(この状況を引き起こせるソースが作れてないですが…)

3b6ad6b と TeX Live svn r46521 で直しました。

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

Successfully merging this pull request may close these issues.

2 participants