-
Notifications
You must be signed in to change notification settings - Fork 6
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
[upTeX] JIS-encoded TFM #149
Comments
うーーん 現状、upTeXの実装では、内部コードが upTeX のとき、 ただ、kcatcodeとかglueとかの文字コードの対応関係は内部UCS(UTF32もどき)と内部JISでは別物なのは確かです。 |
はい,例えば % 内部コード uptex で処理
\ifnum\jis"2121="3000 \else \expandafter\end \fi
\font\x=jis \x あい)\inhibitglue お
\font\y=upjisr-h \y あい)\inhibitglue お
\end のようなものが jis.tfm は JIS で,upjisr-h は Unicode であるという混在に対応できるようにということです。 背景としては,いずれ「内部コード EUC/SJIS な (u)pTeX」は LaTeX3 の激しい変更に耐えきれなくなり,内部 Unicode 一択になることが近い将来起こりうることを懸念しています。万が一そのようなことが起こっても,従来の pTeX 用の TFM を使い回すことができるようにという保険を作っておくのはどうか,と思い立ったので issue を立てました。 関連: texjporg/platex#98 (l3str-convert), #147 (l3regex), https://github.com/h20y6m/plexpl3/issues など。 |
なるほど。LaTeX3が内部Unicode一択になった場合にも pTeX の TFM が動くエミュレーションという点が狙いということですね。 今のpTeXや「upTeXの内部EUC動作」の実装では、 私の理解では、 ということでしょうか。 |
TeX users slack (texuser.slack.com) で今日から話をしているだけなので私もまだ考えがまとまっていませんが,概ねそのように考えています。以下のような「非互換な仕様変更」も想定しつつ,まずは「非互換な仕様変更には該当しない改良」に手をつけようというのが本件「pTeX の JIS-encoded TFM が動くエミュレーション」です。 〜 Slack を読んでいない方へ & アーカイブが 90 日で消えるので補足 〜 現状の LaTeX3 では regression test(大量に用意されたテストファイル入力 .lvt に対するログ .tlg を比較)の仕組みが (u)pTeX に対しては機能していません。
その理由は恐らく
が理解されないためだと思われます。和文(CJK)文字トークンの catcode が 16〜18(19) であることも考慮されておらず「カテゴリーコードは 16 進 1 桁」を前提にしたインタフェースが構築されています(参考)。 このような状況から (u)pTeX の後方互換性を放棄してでも 和文文字トークンの扱いならびに ptexenc の仕様 (#147) などを見直していく必要があるのではないか,ということを考えています。この大規模な話については別の場としましょう。 |
ここまでは 'emulate_jfm' ブランチで出来た気がします。
これについてはまだです。 次は
に取り組みます。(まだ考えられていませんが,文字ノードを作る時に文字コード変換するので,恐らく「禁則ペナルティがどうなるか」「\jcharwidowpenalty」「\lastnodechar」についてはきちんとテストする必要があると思います) |
このissueの冒頭のご提案もかなり大規模な話と感じます。 上記[γ]で文字コードはUnicodeだがアクセス先のTFMはJISで見る、ということは仕様として可能とは思いますがかなり直感に反します。
は、
思いつきですが、その対策として例えばupTeXの仕様の追加で |
現に pTeX は「エンジンの内部コード EUC/SJIS だけど TFM 読取や DVI 書出の文字コードは JIS」な訳ですから,ここでコード変換が起こるのは直感的であると思います。また,トークンの話についてはこれとは無関係なので issue を分けるつもりです。 ご提示の
のままです。もう少しわかりやすく [A1][A2] を例示すると,例えば 手動で「現min10.tfm(JIS) →(ptftopl)→ 仮temp.pl →(uppltotf)→ 新min10.tfm(Unicode)」として得られる「新 min10.tfm」を読んだような状態 を作りたいということです。 |
これも 4baff60 にて完了。ということで次は
に取り組みます。
これらは時間かかりそうです。 |
こちらは影響を受けないようです(ノードリストを作るタイミングでは未変換・それよりはるか後のDVI に書き出すタイミングで変換しているため)。
この特定の値については #135 からだと思いますが,あちらは「OFM に定義された最大の文字コード」だから良かったものの,今回のようなものには使えないように思います。(例えば 0xB7 (U+00B7) は uptex-fonts でも和文扱いを想定した中黒です) |
017aeab で試してみました.例えば
のように文字コード JIS の TFM 下で JIS 範囲外の文字を使うと DVI には set2 0 が書かれますが,これで良いのかは検討の余地ありです. |
確かにそのとおりで,これは
とは違いますが,むしろ「範囲外の文字は出力できない」で良いと思っています。出力できないときにどうするのが良いかですが,思いつくのは以下でしょうか。
従来は JFM では「存在しない文字はない (\nullfont できない)」という仕様でしたので,前者のまま(豆腐を出力する)方が無難? |
catcode の話は、こちらの主題の JIS-encoded TFMのエミュレートの話とは別にissue を立てました。 |
どちらでも適切といえると思いますが、私の好みでは後者です。(実装の手間は考えずに言っています) |
DVI→PDF の過程で「実フォントに該当グリフはなかった」ではなく,TeX→DVI という実フォントに依存しない状況での変換漏れなので,「黙って豆腐」には違和感を覚えます.
みたいな警告を出すのに +1 です(ノード破棄もあまりしたくないなあ,という印象). |
e1068d4 で入れました. |
お二方ともコメントありがとうございます。確かに「黙って豆腐」は良くないですね。ノード破棄すると dvipdfmx で字が詰まってしまうのも気になりますので,破棄せずに警告 e1068d4 で良いと思います。ありがとうございます。 |
迷っていますが |
ee0a8c1 で
としてみました。 テストケース: https://gist.github.com/aminophen/6715ae7fce5e03ddecccf06e7569682a ※ LuaTeX にも ※ XeTeX の |
c93a8f7 で \ptexfontname というのも実装してみました。\ptextracingfonts と共通のコードを利用して
としました。これで,プログラミング的に「そのフォントが JIS コードと Unicode のどちらで DVI 出力されるか」を知ることができます。 なお "in jis" 及び "in ucs" による TFM 読込においては,新しい font identifier は発行されません。従って,同じ TFM を同じサイズで複数回読み込んだ場合は「最初のエンコード」が常に使われ,2回目以降でエンコード指定を変えても無視されます。 %#!ptex
\font\x=min10
\font in jis\y=min10 % => min10 は無指定時のエンコードのまま
\font in ucs\z=min10 % => min10 は無指定時のエンコードのまま %#!ptex
\font in ucs\x=umin10
\font\y=umin10 % => umin10 は Unicode のまま
\font in jis\z=umin10 % => umin10 は Unicode のまま 参考:tex.web の |
ptex-manual の方も 'emulate_jfm_tracingfonts' ブランチで文書化してみました。 期待通りに動いているようです。 |
大丈夫そうなので,後ほどコミットします。結局追加したのは
の 4 点です。 |
r64800 問題があったら reopen しましょう。 |
upTeX で内部コードに依らず min10 や jis のような「文字コード JIS なレガシーな TFM」を使える状態にしておくと,pTeX から upTeX への乗り換えを進める上で良いのではないかと思ったのでメモしておきます。
単純に [1] だけを実装しても [2] で DVI に書き込むコードと実在の TFM の文字コードが不一致だと破綻するので,順番としては以下の方が良いのかもしれません。
\font [in <encoding>] <control sequence><equals><file name><at clause>
という書式を導入する。set2
やset3
での出力時に元のエンコードに戻して書き込む。実装案は作れそうなので,やってみます。
なお,これを実現すれば upLaTeX に JY1 / JT1 をエミュレートする機能を乗せることもできるかもしれません。これは upTeX 本体実装を作った後に考えます。
The text was updated successfully, but these errors were encountered: