名前: ZR 日時: 2007-02-14 22:25:47 IPアドレス: 59.140.98.*
>>46970 IL2 エンコーディングによるルーマニア語の組版について、さらに気づいたこと を書いておきます。長文ですが、現行の(8 ビットの) TeX での多言語処理に 関心のある方にとって重要な情報になるかも知れないので。 il2enc.def (かそれと同等のファイル――ここでは myil2enc.sty)を用意すれば IL2 エンコーディングが利用可能になり、ルーマニア語の文字の正しいグリフが 出力できますが、さらにハイフネーション(分綴)を完全に行うにはさらなる作業 が必要です。色々と調べているうちに、IL2 の大/小文字の配置が「T1 互換」で ないことが大きな問題であることが判りました。 # 同じ問題が OT2 等の他の T1 互換性を欠くエンコーディングにもいえます。 T1 用のパターンファイル TEXMF/tex/generic/hyphen/rohyph.tex から IL2 用のファイル rohyphil2.tex を作り、それを language.dat に登録 します。これはこの記事の末尾に示した手順を使うと「TeX だけで」行うこと かできます。 # もちろん、Perl 等でファイルを変換してもいいですが。 このパターンを \language で指定すると rohyph.tex と同じ分綴ができるはず ですが、実際には上手くいきません。 次のファイルで実験をします。 %<hyphtest.tex> \documentclass{article} \usepackage{myil2enc} \def\encodingdefault{IL2} \fontencoding{IL2}\selectfont \usepackage[T1]{fontenc} \usepackage{lmodern} \makeatletter%------ % 簡易版の言語/エンコーディング設定 \def\romanianTone{\language\l@romanian \fontencoding{T1}\selectfont} \def\romanianILtwo{\language\l@romanianiltwo \fontencoding{IL2}\selectfont} % \showhyphens を用いたテスト \def\Test{\def\encodingdefault{\f@encoding}% \showhyphens{\^in\c{s}tiin\c{t}are}} % IL2 用の \lccode の設定 \def\bx@CSprocess{% \bx@CSpair{"A1}{"B1}\bx@CSpair{"A3}{"B3}\bx@CSpair{"A5}{"B5}% \bx@CSpair{"A6}{"B6}\bx@CSpair{"A9}{"B9}\bx@CSpair{"AA}{"BA}% \bx@CSpair{"AB}{"BB}\bx@CSpair{"AC}{"BC}\bx@CSpair{"DE}{"BD}% \bx@CSpair{"AE}{"BE}\bx@CSpair{"AF}{"BF}% \bx@CSsymb{"8E}\bx@CSsymb{"8F}\bx@CSsymb{"FE}\bx@CSsymb{"FF}} \def\setlccodes{% \def\bx@CSpair##1##2{\lccode##1=##2\lccode##2=##2}% \def\bx@CSsymb##1{\lccode##1=\z@}% \bx@CSprocess\relax} % \makeatother%------ \begin{document} \romanianTone \Test %(1) \romanianILtwo \Test %(2) \setlccodes \romanianILtwo \Test %(3) \end{document} %<EOF> ここでは \^in\c{s}tiin\c{t}are という単語の分綴結果を \showhyphens を 用いて表示させています。 - (1) では T1 用の rohyph.tex に従って分綴させる。 結果は \^in-\c{s}ti-in-\c{t}are となる。これを「正しい結果」とみな して IL2 で再現できるかを調べる。 (この結果が本当に正しいかは私には判りません。) - (2) では rohyph.tex のコードを IL2 のものに変換した rohyphil2.tex を用いて IL2 での出力を分綴させる。 結果は \^in-\c{s}tiin\c{t}are となる。\^i や \^{s} を含む規則はいい が、\c{t} を含む規則が反映されていない。 - (3) では \lccode を正しく設定した後もう一度 IL2 で分綴させる。 今度の結果は \^in-\c{s}ti-in-\c{t}are となり (1) に一致する。 (2) が失敗する原因は TeX の分綴処理にあります。これは粗くいえば次のよう になっています。 出力対象の文字を \lccode に従って小文字に変換してからパターンと照合 する。この際に \lccode が非ゼロの文字の並びを「単語」とみなす。 だから、\lccode の設定が当該のエンコーディングの「大/小文字の対応」と 一致していなければ、分綴パターンは正しく働きません。 # \lccode`A=`a, \lccode`a=`a となっているのが「正しい設定」です。 ところが LaTeX の既定での \lccode の設定は T1 を前提としたもの(一部 OT1 の為に追加)になっているので、IL2 のルーマニア語の文字については \c{S}("AA), \c{T}("DE), \c{t}("BD) の \lccode が正しくないことが判ります(T1 のコード表から判断して \lccode"AA="AA, \lccode"DE="FE, \lccode"BD=0 であることが判ります)。 上の実験用ソースでは、\setlccodes で正しい \lccode を設定しています。 これでようやく分綴パターンが完全に機能するようになります。 LaTeX の方では「エンコーディングは T1 (または OT1) と互換(既定の設定で 矛盾が起きない)のものしか用いない」ことが前提になっているようで、エン コーディングお切替と連動して \lccode の設定を変えるという機構は用意され ていません。 # LaTeX の「標準の」エンコーディング(T2A 等)は T1 互換です。さらに、 # QX も T1 互換になるように設計されています。 ただ、\lccode の影響は、分綴のごく一部が失敗するだけであり、その他の要素 (グリフ、カーニング、PDF 化の際のテキスト情報)は全て正常であるので、この 問題はあまり重大でないとも思えます。少なくとも OT1, T1, QX (及び latin10 を用いた方法)に比べて改善されたといえるでしょう。 # \sfcode についても全く同じ状況なので、スペーシングにも影響が出る。 # Babel では \extras..., \noextras..., \babel@savevariable 等を用いて # \lccode の設定切替が可能のようだ。実際、latin.ldf 中の「中世ラテン語 # (medieval Latin)」関係の設定で \lccode を設定している。 ------------------------------------------------------------ ■ IL2 用ハイフネーションの準備 1. language.dat に次の記述を追加。 %<language.dat - add> romanianiltwo rohyphil2.tex %<EOF> 2. 以下の 3 ファイルを用意する。 %<rohyphil2.tex> \input{hyphil2.tex} \input{rohyph.tex} %<EOF> %<hyphil2.tex> \let\bxOrgPatterns\patterns \def\patterns{% \input hct1il2.tex \let\patterns\bxOrgPatterns \patterns} %<EOF> %<hct1il2.tex> \catcode"A0=12 \lccode"A0="E3 % \u{a} \catcode"A1=12 \lccode"A1="B1 % \k{a} \catcode"A2=12 \lccode"A2="E6 % \'{c} \catcode"A3=12 \lccode"A3="E8 % \v{c} \catcode"A4=12 \lccode"A4="EF % \v{d} \catcode"A5=12 \lccode"A5="EC % \v{e} \catcode"A6=12 \lccode"A6="EA % \k{e} \catcode"A7=12 \lccode"A7="2B % \u{g} \catcode"A8=12 \lccode"A8="E5 % \'{l} \catcode"A9=12 \lccode"A9="B5 % \v{l} \catcode"AA=12 \lccode"AA="B3 % \l \catcode"AB=12 \lccode"AB="F1 % \'{n} \catcode"AC=12 \lccode"AC="F2 % \v{n} \catcode"AD=12 \lccode"AD="2B % \ng \catcode"AE=12 \lccode"AE="F5 % \H{o} \catcode"AF=12 \lccode"AF="E0 % \'{r} \catcode"B0=12 \lccode"B0="F8 % \v{r} \catcode"B1=12 \lccode"B1="B6 % \'{s} \catcode"B2=12 \lccode"B2="B9 % \v{s} \catcode"B3=12 \lccode"B3="BA % \c{s} \catcode"B4=12 \lccode"B4="BB % \v{t} \catcode"B5=12 \lccode"B5="BD % \c{t} \catcode"B6=12 \lccode"B6="FB % \H{u} \catcode"B7=12 \lccode"B7="F8 % \r{u} \catcode"B8=12 \lccode"B8="2B % \"{y} \catcode"B9=12 \lccode"B9="BC % \'{z} \catcode"BA=12 \lccode"BA="BE % \v{z} \catcode"BB=12 \lccode"BB="BF % \.{z} \catcode"BC=12 \lccode"BC="2B % \ij \catcode"9E=12 \lccode"9E="2B % \dj \catcode"E0=12 \lccode"E0="B8 % \`{a} \catcode"E1=12 \lccode"E1="E1 % \'{a} \catcode"E2=12 \lccode"E2="E2 % \^{a} \catcode"E3=12 \lccode"E3="2B % \~{a} \catcode"E4=12 \lccode"E4="E4 % \"{a} \catcode"E5=12 \lccode"E5="2B % \r{a} \catcode"E6=12 \lccode"E6="1A % \ae \catcode"E7=12 \lccode"E7="E7 % \c{c} \catcode"E8=12 \lccode"E8="2B % \`{e} \catcode"E9=12 \lccode"E9="E9 % \'{e} \catcode"EA=12 \lccode"EA="2B % \^{e} \catcode"EB=12 \lccode"EB="EB % \"{e} \catcode"EC=12 \lccode"EC="2B % \`{i} \catcode"ED=12 \lccode"ED="ED % \'{i} \catcode"EE=12 \lccode"EE="EE % \^{i} \catcode"EF=12 \lccode"EF="2B % \"{i} \catcode"F0=12 \lccode"F0="F0 % \dh \catcode"F1=12 \lccode"F1="2B % \~{n} \catcode"F2=12 \lccode"F2="2B % \`{o} \catcode"F3=12 \lccode"F3="F3 % \'{o} \catcode"F4=12 \lccode"F4="F4 % \^{o} \catcode"F5=12 \lccode"F5="2B % \~{o} \catcode"F6=12 \lccode"F6="F6 % \"{o} \catcode"F7=12 \lccode"F7="1B % \oe \catcode"F8=12 \lccode"F8="1C % \o \catcode"F9=12 \lccode"F9="2B % \`{u} \catcode"FA=12 \lccode"FA="FA % \'{u} \catcode"FB=12 \lccode"FB="2B % \^{u} \catcode"FC=12 \lccode"FC="FC % \"{u} \catcode"FD=12 \lccode"FD="FD % \'{y} \catcode"FE=12 \lccode"FE="2B % \th \catcode"FF=12 \lccode"FF="19 % \ss \endinput %<EOF> 3. フォーマット(.fmt)ファイルの更新。 # TeX は \patterns を読み込む時にも中のテキストを \lccode に基づいて # 小文字に変換します。それを利用して T1→IL2 のコード変換を行っている # わけです。T1 にあり IL2 にない文字はとりあえず "2B(`+) にしています # が、実際の組版中は \lccode が "2B の文字はないのでこれによる悪影響は # 起こりません。
この書き込みへの返事: