-
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] ofm読み込みと符号位置 256 以上の欧文文字トークン・ノード #170
Comments
現状のパッチは OFM level=0 は読めますが、OFM level=1 は読めません。
|
個人的に気になるのはやはり文字コード 128--255 の扱いでしょうか。 |
コメントありがとうございます。
使い方としては、kcatcode=14 に設定したら |
このissueのやり方を思いついたときのcommentを貼っておきます。 |
これについては,従来の upTeX 仕様から非互換な変更になるので注意です。0x100〜0x2E7F で従来は和文フォントで出ていたところ,欧文フォントで出るようになることによる影響(→欧文フォントが未対応で文字が出なくなる等)? |
コメントありがとうございます。
その文字ブロックが kcatcode=14 になっていない限り latin_ucs と判定されないよう tex-jp-build/source/texk/web2c/uptexdir/uptex-m.ch Lines 2225 to 2231 in 0f4063e
|
e2e161c \jfont\jpy=umin10
\jpy
\font\uctt=uctt10
\uctt
\kcatcode"152=16
\char"152 % -> 和文
\kcatcode"152=14
\catcode"152=11
\char"152 % -> 欧文
\kcatcode"152=15
\catcode"152=11
\char"152 % -> 和文
\bye |
\jfont\jpy=umin10
\jpy
\font\uctt=uctt10
\uctt
\kcatcode"152=16
\char"152 % → 和文
^^^^0152 % catcode未設定なので出力されない
\catcode"152=11
\char"152 % → 和文
^^^^0152 % → 欧文
\kcatcode"152=14
\catcode"152=11
\char"152 % → 欧文
^^^^0152 % → 欧文
\kcatcode"152=15
\catcode"152=11
\char"152 % → 和文
^^^^0152 % → 欧文
\bye |
0fa0c33 |
ありがとうございます。他,従来成り立っていた仕様について
新設された欧文トークン kcatcode 14 の扱いについても,上の仕様範囲内に収まると理解しました。 ほかに気付いた点は
|
|
以下、多分こういう風になっているはず、の仕様案です。
|
ec9887c 以降で LaTeX のフォーマット作成が通らなくなっています。
とりあえず以下のパッチで通るようになったきがしますが、 diff --git a/source/texk/web2c/uptexdir/uptex-m.ch b/source/texk/web2c/uptexdir/uptex-m.ch
index 634c0fb4e..3970207c5 100644
--- a/source/texk/web2c/uptexdir/uptex-m.ch
+++ b/source/texk/web2c/uptexdir/uptex-m.ch
@@ -212,6 +212,14 @@ else if (kcode_pos=1)or((kcode_pos>=@'11)and(kcode_pos<=@'12))
@d partoken_name=set_enable_cjk_token+1 {set |par_token| name}
@z
+@x
+@d single_base=active_base+256 {equivalents of one-character control sequences}
+@d null_cs=single_base+256 {equivalent of \.{\\csname\\endcsname}}
+@y
+@d single_base=active_base+max_latin_val {equivalents of one-character control sequences}
+@d null_cs=single_base+max_latin_val {equivalent of \.{\\csname\\endcsname}}
+@z
+
@x
@d cat_code_base=auto_xspacing_code+1
{table of 256 command codes (the ``catcodes'')}
@@ -333,6 +341,12 @@ primitive("kchar",kchar_num,0);@/
@!@:kchar_}{\.{\\kchar} primitive@>
@z
+@x
+primitive("relax",relax,256); {cf.\ |scan_file_name|}
+@y
+primitive("relax",relax,max_latin_val); {cf.\ |scan_file_name|}
+@z
+
@x
char_num: print_esc("char");
@y
@@ -641,6 +655,12 @@ if cat=other_kchar then k:=k-multilenbuffchar(cur_chr)+1; {now |k| points to fir
begin cur_cmd:=t div max_char_val; cur_chr:=t mod max_char_val;
@z
+@x
+@d no_expand_flag=257 {this characterizes a special variant of |relax|}
+@y
+@d no_expand_flag=max_latin_val+1 {this characterizes a special variant of |relax|}
+@z
+
@x get_token
if (cur_cmd=kanji)or(cur_cmd=kana)or(cur_cmd=other_kchar) then {|wchar_token|}
cur_tok:=cur_chr
@@ -656,6 +676,12 @@ if cat=other_kchar then k:=k-multilenbuffchar(cur_chr)+1; {now |k| points to fir
else cur_tok:=(cur_cmd*max_char_val)+cur_chr
@z
+@x
+ begin eq_define(cur_cs,relax,256); {N.B.: The |save_stack| might change}
+@y
+ begin eq_define(cur_cs,relax,max_latin_val); {N.B.: The |save_stack| might change}
+@z
+
@x
if check_kanji(info(p)) then {|wchar_token|}
begin buffer[j]:=Hi(info(p)); buffer2[j]:=1; incr(j); buffer2[j]:=1;
@@ -1526,6 +1552,14 @@ adjust(char_base); adjust(width_base); adjust(lig_kern_base);
dvi_out(BYTE3(jc)); dvi_out(BYTE4(jc));
@z
+@x
+@d span_code=256 {distinct from any character}
+@d cr_code=257 {distinct from |span_code| and from any character}
+@y
+@d span_code=max_latin_val {distinct from any character}
+@d cr_code=max_latin_val+1 {distinct from |span_code| and from any character}
+@z
+
@x
hmode+kanji,hmode+kana,hmode+other_kchar: goto main_loop_j;
hmode+char_given: |
Ref. [upTeX] ofm読み込みと符号位置 256 以上の欧文文字トークン・ノード texjporg/tex-jp-build#170
もうregressionの問題は発見できないレベルになり、CIのテストは充分に入れたと思うので とはいえ、upTeX ver0.0x の頃以来の大改造になるので、根拠のない不安は残っています。 今後の構想。
|
master は eupTeX u2.00-241020 にしましたが、 |
master (2863401) の euptex で以下のソースをタイプセットすると
以下のような不穏な出力になります。
|
ご指摘ありがとうございます。 \kcatcode"C1=14
\catcode"C1=1
\catcode"FF=1
\immediate\write16{\meaning Á.}
\immediate\write16{\meaning ÿ.}
\kcatcode"100=14
\catcode"100=1
\catcode"101=1
\catcode"102=1
\catcode"103=1
\catcode"104=1
\immediate\write16{\meaning Ā.}
\immediate\write16{\meaning ā.}
\immediate\write16{\meaning Ă.}
\immediate\write16{\meaning ă.}
\immediate\write16{\meaning Ą.}
\kcatcode"3B1=14
\catcode"3B1=1
%\catcode"3B2=2
%\catcode"3B3=3
%\catcode"3B4=4
%\catcode"3B5=6
%\catcode"3B6=7
%\catcode"3B7=8
%\catcode"3B8=11
%\catcode"3B9=12
\immediate\write16{\meaning α.}
%\immediate\write16{\meaning β.}
%\immediate\write16{\meaning γ.}
%\immediate\write16{\meaning δ.}
%\immediate\write16{\meaning ε.}
%\immediate\write16{\meaning ζ.}
%\immediate\write16{\meaning η.}
%\immediate\write16{\meaning θ.}
%\immediate\write16{\meaning ι.}
\end logの一部 ::
|
euptex-pool.c の #define EXTERN extern
#include "euptexd.h"
#include <stdio.h>
#include <string.h>
static const char *poolfilearr[] = {
".6",
".2",
".00",
"buffer size",
"pool size",
"number of strings",
"" "?" "?" "?",
"m2d5c2l5x2v5i",
"End of file on the terminal!", |
(string pool の先頭は一文字の文字列が入っていて "string number" と文字コードがイコールになっていて、その後に 多分xetexのBMP越えの文字への対策と同じようなことをeuptexでは文字コード256以上の文字にする必要があるんだと思います。 ちなみにxetex.webの
|
ありがとうございます。ご指摘の
|
カテゴリコード6のときがまだおかしいようです。
ただし、そもそも ところで #170 (comment) の例にある
の部分は
と同じはずなのでエラーになるはずですよね? U+100 以上の文字のカテゴリコードの扱いがいろいろ怪しい気がしています。 |
とりあえず、 下記のテストで euptex では %% (e)uptex or aleph
\ifx\kcatcode\undefined\else
% for (e)upTeX
\kcatcode"C0=14 % Latin-1 Supplement
\kcatcode"100=14 % Latin Extended-A
\fi
\ifx\ocp\undefined\else
% for aleph
\ocp\ORGin=inutf8
\InputTranslation currentfile \ORGin
\fi
\font\x=eu3-lmr10 \x
% Latin Extended-A
\catcode"100=4
\catcode"101=1
\catcode"102=2
\catcode"103=3
\catcode"104=4
\catcode"105=6
\catcode"106=7
\catcode"107=8
\catcode"108=11
\catcode"109=12
\immediate\write16{\meaning Ā.}% alignment tab character
%\immediate\write16{\meaning ā.}% begin-group character
%\immediate\write16{\meaning Ă.}% end-group character
\immediate\write16{\meaning ă.}% math shift character
\immediate\write16{\meaning Ą.}% alignment tab character
\immediate\write16{\meaning ą.}% macro parameter character
\immediate\write16{\meaning Ć.}% superscript character
\immediate\write16{\meaning ć.}% subscript character
\immediate\write16{\meaning Ĉ.}% the letter
\immediate\write16{\meaning ĉ.}% the characer
% catcode 1,2 : begin-group, end-group character
\catcode"F2=1
\catcode"F3=2
\catcode"102=1
\catcode"103=2
òabcó Ădefă {ghió òjkl} {mnoă Ăpqr}
% catcode 11,12 : the letter, the characer
\catcode"F2=11
\catcode"F3=12
\catcode"102=11
\catcode"103=12
òabcó Ădefă {ghió òjkl} {mnoă Ăpqr}
% catcode 3 : math shift character
\catcode"F4=3
\catcode"104=3
$E=mc^2$ $E=mc^2ô ĄE=mc^2$ ôE=mc^2Ą
% catcode 7,8 : superscript, subscript character
\catcode"FC=7
\catcode"FD=8
\catcode"10C=7
\catcode"10D=8
$a_nx^m$ $aýnxüm$ $ačnxČm$
% catcode 4 : alignment tab character
\catcode"F6=4
\catcode"106=4
\halign{# & # & # \cr
aaa & bbb & ccc \cr
ddd ö eee ö fff \cr
ggg Ć hhh Ć iii \cr}
% catcode 6 : macro parameter character
\catcode"F5=6
\catcode"105=6
\def\oXzõ1{o{õ1}z}\relax
\oXz{r}
\def\oYzą1{o{ą1}z}\relax
\oYz{r}
\end |
\kcatcode"100=14
\catcode"100=3
\show $
% > math shift character $.
\show Ā
% > math shift character Ā.
% #1:math #2:shift #3:character
\def\tmp#1 #2 #3 {\show}
\expandafter\tmp\meaning $
% > the character $.
\expandafter\tmp\meaning Ā
% > the character Ā.
% #1:math #2:shift #3:character #4
\def\tmp#1 #2 #3 #4{\show#4}
\expandafter\tmp\meaning $
% > the character $.
\expandafter\tmp\meaning Ā
% > math shift character Ā.
\def\tmp{\show}
\expandafter\tmp\string $
% > the character $.
\expandafter\tmp\string Ā
% > the character
% .
\def\tmp#1{\show#1}
\expandafter\tmp\string $
% > the character $.
\expandafter\tmp\string Ā
% > the character
% .
diff --git a/source/texk/web2c/uptexdir/uptex-m.ch b/source/texk/web2c/uptexdir/uptex-m.ch
index c43c96909..9852840a7 100644
--- a/source/texk/web2c/uptexdir/uptex-m.ch
+++ b/source/texk/web2c/uptexdir/uptex-m.ch
@@ -833,7 +833,7 @@ if cat=other_kchar then k:=k-multilenbuffchar(cur_chr)+1; {now |k| points to fir
cur_tok:=(kanji_ivs*max_cjk_val)+cur_chr
else
cur_tok:=(cur_cmd*max_cjk_val)+cur_chr
- else if (cur_cmd=latin_ucs)or(check_echar_range(cur_chr)=1) then
+ else if cur_cmd=latin_ucs then
cur_tok:=(cat_code(cur_chr)*max_cjk_val)+cur_chr
else cur_tok:=(cur_cmd*max_char_val)+cur_chr
@z
@@ -874,7 +874,7 @@ if cat=other_kchar then k:=k-multilenbuffchar(cur_chr)+1; {now |k| points to fir
cur_tok:=(kanji_ivs*max_cjk_val)+cur_chr
else
cur_tok:=(cur_cmd*max_cjk_val)+cur_chr
- else if (cur_cmd=latin_ucs)or(check_echar_range(cur_chr)=1) then
+ else if cur_cmd=latin_ucs then
cur_tok:=(cat_code(cur_chr)*max_cjk_val)+cur_chr
else cur_tok:=(cur_cmd*max_char_val)+cur_chr
@z
@@ -889,7 +889,7 @@ if cat=other_kchar then k:=k-multilenbuffchar(cur_chr)+1; {now |k| points to fir
cur_tok:=(kanji_ivs*max_cjk_val)+cur_chr
else
cur_tok:=(cur_cmd*max_cjk_val)+cur_chr
- else if (cur_cmd=latin_ucs)or(check_echar_range(cur_chr)=1) then
+ else if cur_cmd=latin_ucs then
cur_tok:=(cat_code(cur_chr)*max_cjk_val)+cur_chr
else cur_tok:=(cur_cmd*max_char_val)+cur_chr
@z ただし、この部分を戻すと
|
以下ならよさそう? diff --git a/source/texk/web2c/uptexdir/uptex-m.ch b/source/texk/web2c/uptexdir/uptex-m.ch
index c43c96909..a0bd9d227 100644
--- a/source/texk/web2c/uptexdir/uptex-m.ch
+++ b/source/texk/web2c/uptexdir/uptex-m.ch
@@ -833,8 +833,10 @@ if cat=other_kchar then k:=k-multilenbuffchar(cur_chr)+1; {now |k| points to fir
cur_tok:=(kanji_ivs*max_cjk_val)+cur_chr
else
cur_tok:=(cur_cmd*max_cjk_val)+cur_chr
- else if (cur_cmd=latin_ucs)or(check_echar_range(cur_chr)=1) then
+ else if cur_cmd=latin_ucs then
cur_tok:=(cat_code(cur_chr)*max_cjk_val)+cur_chr
+ else if check_echar_range(cur_chr)=1 then
+ cur_tok:=(cur_cmd*max_cjk_val)+cur_chr
else cur_tok:=(cur_cmd*max_char_val)+cur_chr
@z
@@ -874,8 +876,10 @@ if cat=other_kchar then k:=k-multilenbuffchar(cur_chr)+1; {now |k| points to fir
cur_tok:=(kanji_ivs*max_cjk_val)+cur_chr
else
cur_tok:=(cur_cmd*max_cjk_val)+cur_chr
- else if (cur_cmd=latin_ucs)or(check_echar_range(cur_chr)=1) then
+ else if cur_cmd=latin_ucs then
cur_tok:=(cat_code(cur_chr)*max_cjk_val)+cur_chr
+ else if check_echar_range(cur_chr)=1 then
+ cur_tok:=(cur_cmd*max_cjk_val)+cur_chr
else cur_tok:=(cur_cmd*max_char_val)+cur_chr
@z
@@ -889,8 +893,10 @@ if cat=other_kchar then k:=k-multilenbuffchar(cur_chr)+1; {now |k| points to fir
cur_tok:=(kanji_ivs*max_cjk_val)+cur_chr
else
cur_tok:=(cur_cmd*max_cjk_val)+cur_chr
- else if (cur_cmd=latin_ucs)or(check_echar_range(cur_chr)=1) then
+ else if cur_cmd=latin_ucs then
cur_tok:=(cat_code(cur_chr)*max_cjk_val)+cur_chr
+ else if check_echar_range(cur_chr)=1 then
+ cur_tok:=(cur_cmd*max_cjk_val)+cur_chr
else cur_tok:=(cur_cmd*max_char_val)+cur_chr
@z
|
【メモ】マクロの match トークンは
|
fbae6ab はご提案のものと同等。
|
あまりよく分かっていませんが、 |
upTeX で欧文用に ofm を読めるようにして符号位置 256 以上の欧文文字トークンと符号位置 256 以上の欧文文字ノードを扱えるようにする、という構想です。
少し前↓で述べたことの続きです。
#153 (comment)
まだ実験レベルですがとりあえず手元でそれなりに動いているので紹介します。
スジは結構いいように感じていますが、完成度はまだまだです。
UTF-8の入力バッファで8 bit 文字コード列が正規のUTF-8として U+2E7F 以下と読み取れるとき、Unicodeの欧文であると解釈して符号位置 0x80~0x2E7F の欧文文字ノードを生成する。
和文は従来と変わらず JFM で扱う。
dviware側で必要な場合はvirtual fontで何とかする。
\catcode
,\lccode
,\uccode
,\sfcode
の扱う欧文文字コードの最大値は 0x2E7F とする。(kcatcode=14,15両方)\char
,\chardef
は0~0x2E7F の欧文文字が扱える。\Uchar
,\Ucharcat
,\iffontchar
,\fontcharwd
\fontcharht
\fontchardp
\fontcharic
は0~0x2E7F の欧文文字が扱える。^^^^xyzw
の書式は欧文ノードを生成する。(kcatcode=14,15両方) 8d3be7e内部ノードの文字コードは以下。
The text was updated successfully, but these errors were encountered: