From b7e54219e4294fa527035f0bd2819ca11c3c6964 Mon Sep 17 00:00:00 2001
From: Norbert Preining <norbert@preining.info>
Date: Thu, 5 Aug 2021 03:02:12 +0000
Subject: CTAN sync 202108050302

---
 info/ptex-manual/ptex-manual.tex | 87 +++++++++++++++++++++++++++++++++++-----
 1 file changed, 77 insertions(+), 10 deletions(-)

(limited to 'info/ptex-manual/ptex-manual.tex')

diff --git a/info/ptex-manual/ptex-manual.tex b/info/ptex-manual/ptex-manual.tex
index d76fbf3f6f..a2e2dc6247 100644
--- a/info/ptex-manual/ptex-manual.tex
+++ b/info/ptex-manual/ptex-manual.tex
@@ -334,7 +334,18 @@ virtual modeでは，起動直後にバナーを表示してから，フォー
 
   \pTeX においては，|\kcatcode|を上記の初期状態から変更することは想定されていない．
   また，変更したとしても，（先に述べた通り）和文文字トークンにカテゴリーコードの情報は
-  保存されず，和文文字が処理対象となるたびにその度に値が取得される．
+  保存されず，和文文字が処理対象となるたびにカテゴリーコードの値が再取得される．
+  ただし，|\let\CS=あ| などとして和文文字トークンを|\let|すると，|\CS|には
+  その時のカテゴリーコード(|\kcatcode|)が保存される\footnote{コミュニティ版\pTeX では，
+  一時的に「和文文字トークンを|\let|した|\CS|においても，それが処理対象となるたびに
+  カテゴリーコードの値を再取得する」という挙動に変更しようとした(r51021)．
+  しかし，この変更が不完全で「|\ifcat|では再取得するが，|\ifx|では再取得しない」という
+  不統一な状態となってしまったため，r59699で従来の挙動に戻した（アスキー版と同じ）．
+  結果的に，\TeX~Live 2019--2021では「ただし，…」が当てはまらない(\cite{man4})．}．
+  % 不統一な挙動になっているのは以下のバージョン．
+  %   * TeX Live 2019 rebuild 2019-05-30 (p3.8.2)
+  %   * TeX Live 2020 (p3.8.3)
+  %   * TeX Live 2021 (p3.9.0)
 
   なお，\upTeX においては，|\kcatcode|は大きく仕様変更されている．
 \end{cslist}
@@ -439,7 +450,7 @@ virtual modeでは，起動直後にバナーを表示してから，フォー
   \item 当該の欧文文字の直前が和文文字（後方に禁則ペナルティを伴っても構わない）の
     場合に限り，その欧文文字に設定された|\prebreakpenalty|を挿入する．
 \end{itemize}
-\iffalse %%%%% TL2019-hack
+\iffalse %%%%% [TODO]
 \begin{dangerous}
 上記の「欧文文字に設定された禁則ペナルティが挿入される状況」は
 欧文文字と和文文字の境界であり，
@@ -452,7 +463,7 @@ virtual modeでは，起動直後にバナーを表示してから，フォー
   \item 和文→欧文文字間： |penalty_node| (\.{prebreakpenalty}) → |disp_node| の順
 \end{itemize}
 \end{dangerous}
-\fi %%%%% TL2019-hack
+\fi %%%%%
 
 \begin{dangerous}
 禁則ペナルティはリスト構築中に自動的に挿入されるので，\.{showlists}で
@@ -542,7 +553,7 @@ virtual modeでは，起動直後にバナーを表示してから，フォー
  \item 禁則ペナルティ（\.{prebreakpenalty}や\.{postbreakpenalty}）と
   が同じ箇所に発行される場合は
   「禁則ペナルティ→JFM由来空白」の順に発行される．
-\iffalse %%%%% TL2019-hack
+\iffalse %%%%% [TODO]
  \item より一般に，禁則ペナルティ，JFM由来空白，ベースライン補正，
   欧文TFM由来カーンが同じ箇所に発行される場合は
   次の順になる（\ref{sec:kinsoku}節の注意の一般化）．% tex-jp-build/f6f500d or 9e7e21aa
@@ -553,7 +564,7 @@ virtual modeでは，起動直後にバナーを表示してから，フォー
    \footnote{[TODO] \TeX~Live~2019の\pTeX~3.8.2では，欧文TFM由来カーンは欧文→和文の
    切替時には挿入されない．}% tex-jp-build/78c8605 で解決
   \end{itemize}
-\fi %%%%% TL2019-hack
+\fi %%%%%
  \item もし水平ボックス(\.{hbox})や\.{noindent}で開始された段落がJFM由来グルーで始まった
    場合は，そのグルーは取り除かれる（カーンは除かれない）．
    また水平ボックスがJFM由来グルーで終了した場合は，そのグルーは自然長・伸び量・縮み量の
@@ -1139,13 +1150,65 @@ p3.1.2で復活したという経緯がある．}．
   それぞれJISコード，EUCコード，Shift-JISコードから内部コードへの変換を行う．
   たとえば，|\char\jis"346E|，|\char\euc"B0A5|，|\char\sjis"8A79|は，
   それぞれ「\char\jis"346E」，「\char\euc"B0A5」，「\char\sjis"8A79」である．
+
+%%% [TODO] \ucs, \toucs => pTeX version p3.10.0
+\ifx\toucs\undefined\else
+%
+\csitem[\.{ucs} <number>]
+  Unicodeから内部コードへの変換を行う．
+  もともと\upTeX で実装されていたが，\pTeX~3.10.0で取り入れた．
+
+\csitem[\.{toucs} <number>]
+  内部コードからUnicodeへの変換を行う．\pTeX~3.10.0で追加した．
+%
+\fi
+%%%
 \end{cslist}
 
 \begin{dangerous}
- \ref{sec:ptexchar}節でも述べたように，
- \emph{\pTeX はJIS~X~0213には対応せず，JIS~X~0208の範囲のみ扱える}．
-
- [TODO] \.{kuten}, \.{jis}, \.{sjis}, \.{euc}が$-1$とならない範囲はどこ？
+  \ref{sec:ptexchar}節でも述べたように，
+  \emph{\pTeX はJIS~X~0213には対応せず，JIS~X~0208の範囲のみ扱える}．
+  なお，\pTeX~3.9.1以前では，不正な文字コードを与えたときの挙動が
+  不統一で，特に以下の値を返すケースもあった：
+  \begin{itemize}
+    \item 区点コード表のJIS~X~0208における最初の未定義位置
+          (JIS 0x222F, EUC 0xA2AF, SJIS 0x81AD)…
+          和文文字コードとして有効で，JIS~X~0213では定義されている．
+          % 発生状況：従来のUCS2toJIS(0)
+    \item 区点コード表の1区0点
+          (JIS 0x2120, EUC 0xA1A0, SJIS 0x813F)…
+          文字コードとして無効．
+          % 発生状況: JIStoSJIS(不正)
+    \item $-1$…文字コードとして無効．
+          % 発生状況：KUTENtoJIS(不正)→JIStoEUC(-1)
+  \end{itemize}
+  \pTeX~3.10.0では\.{ucs}と\.{toucs}を追加し，さらに不正な文字コードを
+  容易に判別できるように以下の仕様にした：
+  \begin{itemize}
+    \item 文字コード変換が\emph{不要}なケース\footnote{内部eucにおける\.{euc}，
+        内部sjisにおける\.{sjis}，および\upTeX で内部uptexにおける\.{ucs}と
+        \.{toucs}がこれに該当する．}…恒等変換となる．
+        不正な文字コードを与えてもそのまま通る．（これは従来どおりの挙動）
+    \item 文字コード変換が\emph{必要}なケース…
+        不正な文字コードを与えると$-1$を返す．（返り値を統一）
+  \end{itemize}
+%%%
+%
+% pTeX-3.10.0 での実装メモ (2021-06-29 @aminophen)
+% https://github.com/texjporg/tex-jp-build/pull/121
+%
+%  * ptexenc (ptexenc.c, kanjicnv.c, unicode.c) の関数
+%    => 文字コード変換が不要な場合は恒等変換．
+%                       必要な場合で不正な文字コードなら 0 を返す．
+%  * ptex-base.ch の実装
+%    => ptexenc に従う．ただし \jis, \sjis, \euc, \kuten, \ucs, \toucs の
+%       返り値が 0 の場合は -1 を表示．
+%  * uptex-m.ch の実装
+%    => ptexenc 及び ptex-base.ch に従う．ただし，内部コード uptex の時の
+%       \ucs0 と \toucs0 は（ptex-base.ch が無条件に -1 を表示しようとするが，
+%       ここは無変換とすべきなので）0 を表示．
+%
+%%%
 \end{dangerous}
 
 \begin{cslist}
@@ -1233,7 +1296,8 @@ p3.1.2で復活したという経緯がある．}．
   「整数値をその符号値をもつ和文文字トークンに変換する」という目的に
   用いることもでき\footnote{ただし，\upTeX で
   0--127の文字コードを|\kansujichar|で指定した場合のみ，
-  |\kansuji|で生成されるトークンは欧文文字トークンになる\cite{build36}．}，
+  |\kansuji|で生成されるトークンはカテゴリーコード12の
+  欧文文字トークンになる\cite{build36}．}，
   これは時に“|\kansuji|トリック”と呼ばれる．例えば
 \begin{verbatim}
   \kansujichar1=\jis"2422 \edef\X{\kansuji1}
@@ -1493,6 +1557,9 @@ has been |\let| equal to a non-active character token.
  \bibitem{build68} aminophen, 「upTeX の |\if| と |\ifcat|」，
   2019/01/17,\\
   \url{https://github.com/texjporg/tex-jp-build/issues/68}
+ \bibitem{man4} aminophen, 「pTeX の和文文字トークンのカテゴリーコード」，
+  2019/04/22,\\
+  \url{https://github.com/texjporg/ptex-manual/issues/4}
  \bibitem{dvistd0} TUG DVI Standards Working Group,
   \textit{The DVI Driver Standard, Level 0}.\\
   \url{https://ctan.org/pkg/dvistd}
-- 
cgit v1.2.3

