diff --git a/ptex-manual.tex b/ptex-manual.tex index d426187..0999d96 100644 --- a/ptex-manual.tex +++ b/ptex-manual.tex @@ -616,7 +616,7 @@ \subsection{有効な文字コードの範囲【\upTeX の場合】}\label{sec:u \upTeX では和文文字トークンおよび和文文字ノードにおいて 文字コードをUTF-32の下位24bitで格納する仕様となっている. Unicode文字入力で0x110000以上0xFFFFFF以下の文字コードはありえないが, - 文字コードを数値で指定する場合の扱いは以下としている: + 0x110000以上0x21FFFF以下の文字コードを数値で指定する場合の扱いは以下としている: \begin{itemize} \item \.{char}, \.{chardef}及び\.{kchar}, \.{kchardef}: 文字コードが0x110000以上でもそのままの値で和文文字ノードを生成する. @@ -636,6 +636,7 @@ \subsection{有効な文字コードの範囲【\upTeX の場合】}\label{sec:u Unicodeでない文字コードを扱う内部処理において Unicodeの正規の文字コード(0x10FFFF以下)の カテゴリーコードや禁則ペナルティのしがらみの影響を受けない目的である. + 0x220000以上の文字コードは上記の数値変換を行わない(\ref{sec:uptex_ivs}節を参照). % 0x110000 以上の扱い:現状では otf で意図的に利用. % 将来的に異体字対応の内部コードに使う可能性を留保. % https://okumuralab.org/~okumura/texfaq/qa/50036.html @@ -658,43 +659,46 @@ \subsubsection{Unicode合成文字と異体字セレクタ(IVS) (\upTeX~u1.35)}\ 仕様は以下の通りである. \begin{itemize} - \item 想定した範囲のシーケンスの集合を定め\upTeX 独自の内部用の文字コード(複合文字用拡張文字コード)を定義する(後述). - 複合文字用拡張文字コードにはコード値0x22,0000以降を用いる. - \item ptexenc, \upTeX エンジンを拡張する. - ptexenc libraryで文字コードの合成・分解の関数を用意する. - \upTeX とdviwareの間の文字データ渡しには複合文字用拡張文字コードを用いる. - \item \upTeX エンジン内部では合成文字を複合文字用拡張文字コードで1文字として扱い, + \item 想定した範囲のシーケンスの集合% + \footnote{言い換えれば網羅的ではなく想定外のシーケンスには対応していない.}% + を定め\upTeX 独自の内部用の文字コード(合成文字用拡張文字コード)を定義する(後述). + 合成文字用拡張文字コードにはコード値0x22,0000以降を用い和文文字として扱う. + \item \code{ptexenc}, \upTeX エンジンを拡張する. + \code{ptexenc}ライブラリで文字コードの合成・分解のAPIを用意する. + \upTeX とdviwareの間の文字データ渡しには合成文字用拡張文字コードを用いる. + \item \upTeX エンジン内部では合成文字を合成文字用拡張文字コードで1文字として扱い, DVIファイルにはそのコード値でDVI命令|set3|で書き込む. - \item \upTeX に\.{kcatcode} 20 (modifier) を新設する. - UTF-8の入力バッファの文字列で基底文字の直後に異体字セレクタや合成用濁点のようなmodifierが現れた場合には - 基底文字の文字コードを複合文字用拡張文字コードに置き換えてトークン化する. - 合成に失敗したmodifierは普通の文字(\.{kcatcode} 18 CJK記号)としてふるまう. - \item \upTeX の処理中に文字バッファに書き戻す際には常にUTF-8のコードポイントのシーケンスに戻す. + \item \upTeX に\.{kcatcode} 20 ($\mathit{modifier}$) を新設する. + UTF-8の入力バッファの文字列で基底文字の直後に異体字セレクタや合成用濁点のような$\mathit{modifier}$が現れた場合には + 基底文字の文字コードを合成文字用拡張文字コードに置き換えてトークン化する. + 合成に失敗した$\mathit{modifier}$は普通の文字(\.{kcatcode} 18 $\mathit{other\_kchar}$, CJK記号)としてふるまう. + \item \upTeX の処理中に合成文字のデータを文字バッファに書き戻す際には常にUTF-8の複数コードポイントのシーケンスに戻す. それゆえ,テキスト形式の入出力では特殊な内部コードが現れることはなく必ず正規のUnicodeになる. - \item dvips, dvipdfmxなどAdobe-Japan1 (AJ1)のCIDが扱えるdviwareでは, - AJ1の文字に対してdvi命令|set3|からAJ1のCIDコードへ変換するvirtual fontを経由して出力することが可能である. - \item dviware側の実装として,複合文字用拡張文字コードを直接扱いDVI命令|set3|に対し適切なグリフを選択するようにしてもよい. + \item \code{dvips}, \code{dvipdfmx}などAdobe-Japan1 (AJ1)のCIDが扱えるdviwareでは, + AJ1の文字に対してDVI命令|set3|からAJ1のCIDコードへ変換するvirtual fontを経由して出力することが可能である. + \item dviware側の実装として,合成文字用拡張文字コードを直接扱いDVI命令|set3|に対し適切なグリフを選択するようにしてもよい. \end{itemize} -\upTeX~u1.35で対応した複合文字用拡張文字コードの概略を表\ref{table:compound_charcode}にまとめた. -各文字コードの具体的な変換式はptexencの実装を参照されたい. -異体字セレクタは前述のIVSの他,SVS (Standardized Variation Sequence)にも対応している. -IVSの最大VS256まで拡張可能になるよう複合文字用拡張文字コードでは考慮してあるが, +\upTeX~u1.35で対応した合成文字用拡張文字コードの概略を表\ref{table:compound_charcode}にまとめた. +各文字コードの具体的な変換式は\href{https://github.com/texjporg/uptex-base}{\file{uptex-base}}で配布している +\file{01uptex_doc_utf8.txt}を参照されたい. +異体字セレクタ(VS, Variation Selector)は前述のIVSの他,SVS (Standardized Variation Sequence)にも対応している. +IVSの最大VS256まで拡張可能になるよう合成文字用拡張文字コードでは考慮してあるが, おおもとのUnicode Ideographic Variation Database\cite{ivd220913}では今のところVS49〜VS256が未定義である. 仮名の濁点・半濁点は基底文字が平仮名や片仮名の場合に加え変体仮名にも対応している. 絵文字はかつての日本の携帯電話由来の絵文字の大部分に対応しているが,最近よく追加で規定される長くて複雑なシーケンスには対応していない. -絵文字の国旗(RGI Emoji Flag Sequence)は,modifierとmodifierの連続が規定通りに組み合わさると合成文字の扱いになる. -絵文字の肌色(Emoji Modifier Fitzpatrick Type-1..6)は,文字コード上対応しているがそれをどう出力するかはdviwareにお任せする. +絵文字の国旗(RGI Emoji Flag Sequence)は,$\mathit{modifier}$と$\mathit{modifier}$の連続が規定通りに組み合わさると合成文字の扱いになる. +国旗および肌色(Emoji Modifier Fitzpatrick Type-1..6)など絵文字全般について,DVIに書かれたデータをどう出力するかはdviwareにお任せする. 今後,さらに合成文字を追加対応するかどうかは未検討であり計画もない. \begin{table}[bp] -\caption{複合文字用拡張文字コード.\upTeX~u1.35での対応状況.} +\caption{合成文字用拡張文字コード.\upTeX~u1.35での対応状況.} \label{table:compound_charcode} \centering\small \begin{tabular}{ccccc} \toprule 種類 & 基底文字 & modifier - & 複合文字用拡張文字コード & パラメータ \\ + & 合成文字用拡張文字コード & パラメータ \\ \midrule 仮名+濁点 & 仮名 & \code{U+3099} & 0x22,0000〜0x23,FFFF & \\ @@ -712,14 +716,14 @@ \subsubsection{Unicode合成文字と異体字セレクタ(IVS) (\upTeX~u1.35)}\ \end{tabular} \end{table} -modifierに相当する文字コードは\upTeX~u1.35では既定で\.{kcatcode}=20 (modifier)に設定してある. -複合文字用拡張文字コードのメトリックとしては通常JFMの既定値の全角幅を想定しているが, +modifierに相当する文字コードは\upTeX~u1.35では既定で\.{kcatcode}=20 ($\mathit{modifier}$)に設定してある. +合成文字用拡張文字コードのメトリックとしては通常JFMの既定値の全角幅を想定しているが, 文字コード 0xFFFFFF 以内なので個別に設定することもできる. virtual fontの仕様としてフォーマットの面では今回新規な部分はないものの, 最大で文字コード 0xFFFFFF となる点は従来の\TeX ファミリーで例がない. このため周辺ソフトウェアではこれに準拠した拡張が必要になる場合が多い. -omfonts (ovp2ovf, ovf2ovp), dvips, dvipdfmxは対応を済ませてあり +\code{omfonts} (\code{ovp2ovf}, \code{ovf2ovp}), \code{dvips}, \code{dvipdfmx}は対応を済ませてあり \TeX~Live 2025では利用可能である. @@ -729,27 +733,31 @@ \subsubsection{欧文8bit超 (\upTeX~u2.00, 実験的)}\label{sec:uptex_ofm} 動作実績がまだ少なく関連フォントの整備等にも時間を要するため,今のところ実験的機能と位置づけている. 仕様は以下の通りである. \begin{itemize} - \item \upTeX エンジンが扱える欧文文字の範囲は 0--0x2E7F である. + \item \upTeX エンジンが扱える欧文文字の範囲は 0~0x2E7F である. 文字コード256以上を含む文字フォントは Unicode U+0000..2E7F であることを想定する. - \item \.{kcatcode} 14 (latin\_ucs) を新設する. - UTF-8の入力バッファで8bit 文字コード列が正規のUTF-8として U+2E7F 以下と読み取れるとき, + \item \.{kcatcode} 14 ($\mathit{latin\_ucs}$) を新設する. + UTF-8の入力バッファで8bit 文字コード列が正規のUTF-8として U+2E7F 以下と読み取れてかつ + そのコード値を含むブロックの\.{kcatcode}が14となっているとき, Unicodeの欧文であると解釈して符号位置 0~0x2E7F の欧文文字ノードを生成する. + 同時にその文字コードに相当する欧文文字の\.{catcode}が付与される. このとき「欧文 Unicode 1 文字に対し 1 トークン」となる. \item 欧文用8bit TFMに加えて欧文用16bit OFM Level-0が読み込める. 符号位置 0~0x2E7F の欧文文字ノードはこれで扱う. - 和文は従来同様 JFM で扱う. - \item 256~0x2E7Fの欧文文字コードは DVIファイルにはそのままの文字コードでDVI命令|set2|で書き込む. - \item 0x2E80以上のUnicode文字は\upTeX では欧文扱いしない. - 必要な場合はvirtual fontとdviwareで処置をする. + 和文文字は従来同様 JFM で扱う. + \item 256~0x2E7Fの欧文文字コードは DVIファイルにはそのままの文字コード(UCS-2相当)でDVI命令|set2|で書き込む. + \item U+2E80以上のUnicode文字は\upTeX では欧文文字として扱わない. + 必要な場合はvirtual fontとdviwareで処置% + \footnote{頻出する例にU+FB00..FB06のリガチャ(ff, fi, fl等)が挙げられる.\TeX90では8bit (0--255)の内部コードを使用しているが,それと同様の取り扱いを維持する必要がある.}% + をする. \item \.{catcode}, \.{lccode}, \.{uccode}, \.{sfcode} の扱う欧文文字コードの最大値は 0x2E7F とする.(\.{kcatcode}=14,15両方) \item \.{kcatcode}=14のとき \.{char}, \.{chardef} は0~0x2E7F の欧文文字が扱える. \item \eupTeX では \.{kcatcode}=14のとき \.{Uchar}, \.{Ucharcat}, \.{iffontchar} は0~0x2E7F の欧文文字が扱える. - \item |^^^^xyzw| の書式はその16bitコードの欧文ノードを生成する.(\.{kcatcode}=14,15両方, |^^xy|書式と同様) + \item |^^^^xyzw| の書式はその16bitコードの欧文ノードを生成する.(\.{kcatcode}の設定に依らない.|^^xy|書式と同様) \end{itemize} -関連ソフトウェアでは,updvitype も欧文用16bit OFM Level-0への対応を済ませた. -\pTeX 系列に対応したdviwareではすでに欧文用OFMへの対応が施されていることが多く, -dvipdfmx, dvipsのような主要なdviwareでも\upTeX の欧文文字コードの範囲拡張もすでにカバーされている. +関連ソフトウェアでは,\code{updvitype} も欧文用16bit OFM Level-0への対応を済ませた. +\pTeX 系列に対応したdviwareではすでにOFMへの対応が施されていることが多く, +\code{dvipdfmx}, \code{dvips}のような主要なdviwareでも\upTeX の欧文文字コードの範囲拡張はすでにカバーされている. 現時点で\upTeX は欧文用OFM Level-1には未対応である. @@ -930,7 +938,7 @@ \subsection{和文カテゴリーコード,和文文字と欧文文字の区 \item \emph{和文文字トークンについてもカテゴリーコード}(\.{kcatcode})\emph{の情報を含む}. 欧文トークンをcatcode 4bit + charcode 8bitで, 和文トークンをkcatcode 5bit + charcode 24bitで表す. - \item \.{kcatcode}に14 (latin\_ucs)と20 (modifier)が\TeX~Live 2025で新設された. + \item \.{kcatcode}に14 ($\mathit{latin\_ucs}$)と20 ($\mathit{modifier}$)が\TeX~Live 2025で新設された. 内容は\ref{sec:uptex_extension}節で詳説した. \end{itemize} @@ -983,13 +991,13 @@ \subsection{和文カテゴリーコード,和文文字と欧文文字の区 代わりに |\kcatcode\ucs"3042=17| と実行する必要がある. \end{dangerous} -既定ではこのように和文と欧文が\.{kcatcode}の値(16--19か,15か)に従って +既定ではこのように和文と欧文が\.{kcatcode}の値(16--20か,14--15か)に従って 区別されるが,以下のプリミティブによって変更可能である. \begin{cslist} \csitem[\.{enablecjktoken}] 和文文字と欧文文字の区別について\.{kcatcode}の設定に従い, - 15なら欧文扱い,16以上なら和文扱いにする. + 15以下なら欧文扱い,16以上なら和文扱いにする. \upTeX の既定はこの状態である. \csitem[\.{disablecjktoken}] @@ -1639,6 +1647,12 @@ \subsection{和文フォント} ! Missing control sequence inserted. \end{verbatim} というエラーが発生する(\TeX82と同じ挙動). + \upTeX~u2.00では, + 欧文文字をUnicode 1文字に対し1トークンとして扱う機能が追加された(\ref{sec:uptex_ofm}節)が, + それに伴いの書式も拡張された. + 指定可能なは|t1|, |ts1|, |ly1|, |t5|, |l7x|, |t2a|, |t2b|, |t2c|, |lgr|である. + レガシーエンコーディングの欧文TFMに対してこの指定をすると, + 内部コードがUnicodeである欧文文字トークンとレガシーエンコーディングのTFMの情報との相互変換が機能する. \end{dangerous} \begin{cslist} @@ -2798,6 +2812,7 @@ \part{\pTeX の出力するDVIフォーマット} コード番号が$c$ ($\mathtt{0x10000} \le c < \mathtt{0x1000000}$)の 文字を印字し,参照点を移動する. \upTeX ではUCS-4の下位3バイトが用いられる(\pTeX では現れない). + \upTeX~u1.35以降では,合成文字用拡張文字コードも用いられる(\ref{sec:uptex_ivs}節). \item |dir| (255)\quad $\mathit{d}[1]$\\ 組方向を変更する.$\mathit{d}[1]=0$が横組, $\mathit{d}[1]=1$が縦組,$\mathit{d}[1]=3$がDtoU組を示す.