-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathptex-manual.tex
2765 lines (2540 loc) · 142 KB
/
ptex-manual.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
%#!make ptex-manual.pdf
\documentclass[a4paper,11pt,nomag,dvipdfmx]{jsarticle}
\usepackage[textwidth=42zw,lines=40,truedimen,centering]{geometry}
%%%%%%%%%%%%%%%%
% additional packages
\usepackage{amsmath}
\usepackage{array}\usepackage[all]{xy}
\SelectTips{cm}{}
%\usepackage[dvipdfmx]{graphicx}
\usepackage[T1]{fontenc}
\usepackage{booktabs,enumitem,multicol}
\usepackage[defaultsups]{newpxtext}
\usepackage[zerostyle=c,straightquotes]{newtxtt}
\usepackage{newpxmath}
\usepackage[hyperfootnotes=false]{hyperref}
\usepackage{pxjahyper}
\usepackage{makeidx}\makeindex
% common
\usepackage{ptex-manual}
%%%%%%%%%%%%%%%%
\makeatletter
\setlist{leftmargin=2zw}
\setlist[description]{labelwidth=2zw,labelindent=1zw,topsep=\medskipamount}
\def\tsp{_{\mbox{\fontsize\sf@size\z@\ttfamily \char32}}}
\def\tpar{_{\mbox{\fontsize\sf@size\z@\ttfamily \string\par}}}
\def\tign{_{\mbox{\fontsize\sf@size\z@\selectfont --}}}
\def\tableautorefname{表}
\def\figureautorefname{図}
\def\HyRef@autoref#1#2{%
\begingroup
\Hy@safe@activestrue
\expandafter\HyRef@autosetref\csname r@#2\endcsname{#2}{#1}%
\endgroup\textcompwordmark %欧文ゴースト
}
\makeatother
\usepackage{shortvrb}
\MakeShortVerb*{|}
%%%%%%%%%%%%%%%%
\def\_{\leavevmode\vrule width .45em height -.2ex depth .3ex\relax}
\def\Pver{p\the\ptexversion.\the\ptexminorversion\ptexrevision}
\def\UPver{\Pver-u\the\uptexversion\uptexrevision}
\frenchspacing
\begin{document}
\title{\emph{\pTeX マニュアル}}
\author{日本語\TeX 開発コミュニティ\null
\thanks{\url{https://texjp.org},\ e-mail: \texttt{issue(at)texjp.org}}}
\date{\pTeX: version \Pver \\ \upTeX: vesrion \UPver \\[1ex] \today}
\maketitle
本ドキュメントは,日本語\TeX 開発コミュニティ版の
\pTeX~\Pver(以下,「コミュニティ版\pTeX 」)および
\upTeX~\UPver についてまとめたものである.
\pTeX はもともとアスキー株式会社によって開発された\footnote{最新版は
p3.1.11 (2009/08/17).\url{https://asciidwango.github.io/ptex/}}ので,
しばしば「アスキー\pTeX 」または「ASCII \pTeX 」と呼ばれる.
コミュニティ版\pTeX は,日本語\TeX 開発コミュニティがアスキー\pTeX を
国際的なディストリビューション(かつてのte\TeX や現在の\TeX~Live)へ
導入するにあたって幾つかの改良を加えたものであり,オリジナルとは
動作が異なる点もあるので注意されたい.
\upTeX は田中琢爾氏による\pTeX の拡張版であり,
\epTeX および\eupTeX は北川弘典氏によりそれぞれ\pTeX と\upTeX に
\eTeX がマージされた拡張版である.
これらはいずれもコミュニティ版\pTeX をベースに開発されており,
総称して「\pTeX 系列」と呼ばれる.
本ドキュメント(\jobname.pdf)では,\pTeX 系列における共通機能と
\upTeX による拡張を説明する.% 和文文字トークンの扱いが異なる
\epTeX/\eupTeX による拡張についてはeptexdoc.pdfを参照されたい.
\begin{itemize}
\item コミュニティ版\pTeX の開発元:\\
\url{https://github.com/texjporg/tex-jp-build/}
\item 本ドキュメントの開発元:\\
\url{https://github.com/texjporg/ptex-manual/}
\end{itemize}
\newpage
\tableofcontents
\newpage
%%%%%
\section*{表記について}
\pTeX 系列については,以下のようにまとめた表記もしばしば用いられる.
\begin{itemize}
\item \pTeX, \upTeX → (u)\pTeX
\item \pTeX, \epTeX → (\eTeXpre)\pTeX
\item \upTeX, \eupTeX → (\eTeXpre)\upTeX
\item \epTeX, \eupTeX → \eTeXpre(u)\pTeX
\item \pTeX, \upTeX, \epTeX, \eupTeX → (\eTeXpre)(u)\pTeX
\end{itemize}
本ドキュメントでは,特に断らない限り単に\pTeX と表記すれば
(\eTeXpre)(u)\pTeX の4種類全てを指すこととする.
また\upTeX と表記すれば(\eTeXpre)\upTeX の2種類を指すこととする.
ただし,節タイトルで\emph{【\pTeX の場合】【\upTeX の場合】}の
ように分割した箇所については,
それぞれ(\eTeXpre)\pTeX と(\eTeXpre)\upTeX を指すこととする.
また,(すぐ下のように)列挙する形で記す場合は
それぞれ単独のエンジンを指す.
\section*{\TeX~Liveにおける配布}
\def\MODEext{{\tiny 拡張モード}}
現在,\TeX~Liveで配布されている主要なエンジンと
\pTeX 系列の関係性は以下の図で表される.
独立したプログラム(バイナリ)として配布されているものを
\fbox{枠}で囲んである.\par\vskip-35pt
\[
\xymatrix@ur{
\text{\fbox{\TeX}} \ar[r]\ar[d] & \text{\eTeX} \ar[r]\ar[d]\ar[rd]
& \text{\fbox{\pdfTeX}} \ar[rd] & \\
\text{\pTeX} \ar[r]\ar[d] & \text{\epTeX} \ar[d]
& \text{\fbox{\hologo{XeTeX}}} & \text{\fbox{Lua\TeX}} \\
\text{\upTeX} \ar[r] & \text{\fbox{\eupTeX}} & & %\\ &&&
}
\]
\TeX~Live 2022までは
\pTeX, \upTeX, \epTeX, \eupTeX の4種類のエンジンが
独立したプログラムとして配布されていたが,
\TeX~Live 2023では素の\pTeX と\upTeX の配布が停止され,
それぞれ\epTeX と\eupTeX の互換モードに置き換えられた.
さらに\TeX~Live 2024ではオリジナルの\epTeX の配布も停止され,
4種類のエンジンは全て\eupTeX という単一のプログラムによる
エミュレートへと整理された.表にまとめると次のようになる.
\begin{description}\small
\item[互換モード]
\eTeX の拡張モード(extended mode)でない状態,
すなわち\code{-etex}スイッチ無効状態.\\
例えば,2022年まではコマンド\code{ptex}で
\code{This is pTeX, Version ...}が起動していたが,2023年は
\code{This is e-pTeX, Version ...}が起動する.
ここだけ見るとコマンド\code{eptex}と似ているが,\code{eptex}では
直後に\code{entering extended mode}と拡張モードに入るのと異なり,
\code{ptex}では拡張モードに入らないので,\eTeX 特有の
機能およびプリミティブは無効化された状態となる.
\item[内部レガシー]
(\eTeXpre)\upTeX が文字コードに関する内部処理を
Unicodeではなく(\eTeXpre)\pTeX 同様の
レガシーエンコーディング(EUC-JPやShift-JIS)で行うことを指す.
内部コードの差異だけであり,その他の(\eTeXpre)\upTeX 特有の
機能およびプリミティブは利用可能な状態である.
本文中\code{-kanji-internal}の説明も参照.\\
例えば,2023年のコマンド\code{eptex}が
\code{This is e-pTeX, Version ... (utf8.euc)}であったならば,
2024年には
\code{This is e-upTeX, Version ... (utf8.euc)}に変わっている.
一方\code{euptex}は
\code{This is e-upTeX, Version ... (utf8.uptex)}であるから
内部コードが異なる.
\end{description}
\begin{table}[ht]
\centering
\begin{tabular}{cccc}\hline
\code{コマンド名} & \TeX~Live 2022まで & \TeX~Live 2023 & \TeX~Live 2024以降 \\ \hline
\code{ptex} & \pTeX & \epTeX の互換モード & \eupTeX の内部レガシーの互換モード \\
\code{uptex} & \upTeX & \eupTeX の互換モード & →変更なし \\
\code{eptex} & \epTeX\MODEext & →変更なし & \eupTeX の内部レガシー \\
\code{euptex} & \eupTeX\MODEext & →変更なし & →変更なし \\ \hline
\end{tabular}
\end{table}
\section*{\pTeX 系列における\LaTeX}
(\eTeXpre)\pTeX で動くように調整された\LaTeX を\pLaTeX,
(\eTeXpre)\upTeX で動くように調整された\LaTeX を\upLaTeX と呼ぶ.
\pLaTeX はもともとアスキー株式会社によって\pTeX と一体で
開発されていた\footnote{最新版は2006/11/10.これを
「アスキー版\pLaTeX」と呼ぶことにする.}.
2010年にコミュニティ版\pTeX が\TeX~Liveに収録されて以降,
そこで独自の改良や仕様変更が加えられるようになり,
またベースである\LaTeX も更新が進んでいる.
特に2020年以降は,\LaTeX は素の\TeX では動作せず,
拡張モードの\eTeX~``$+\alpha$''が動作条件となっており,
したがって素の(u)\pTeX では動作しない.
そうした流れに合わせてアスキー版\pLaTeX からforkしたのが
「コミュニティ版\pLaTeX」である.
\upLaTeX はもともとアスキー版\pLaTeX を元に\upTeX と一体で
開発されていたが,現在はコミュニティ版\pLaTeX をベースにしている.
\begin{itemize}
\item コミュニティ版\pLaTeX の開発元:\\
\url{https://github.com/texjporg/platex/}
\item コミュニティ版\upLaTeX の開発元:\\
\url{https://github.com/texjporg/uplatex/}
\end{itemize}
\TeX~Liveでのエンジン利用状況は以下の通りである.
ここで,2023-06-01以降は\code{platex}で\epTeX ではなく
\eupTeX の内部レガシーが起動することに注意
(\code{eptex}より一足早く変更された).
\begin{table}[ht]
\centering
\begin{tabular}{ccc}\hline
\code{コマンド名} & \TeX~Live 2012から2023初期まで & \TeX~Live 2023の2023-06-01以降 \\ \hline
\code{platex} & \epTeX\MODEext & \eupTeX\MODEext の内部レガシー \\
\code{uplatex} & \eupTeX\MODEext & →変更なし \\ \hline
\end{tabular}
\end{table}
\clearpage
%%%%%
\part{\pTeX の日本語組版と追加プリミティブ}
ここでは,\pTeX 系列の日本語組版の概略と,それを実現するために導入された
プリミティブを説明する.
\section{\pTeX 系列で利用可能な文字}
\label{sec:ptexchar}
% このマニュアルを英語化する際は以下も参照.
% http://tutimura.ath.cx/ptexlive/?ptexenc%2FDetails
% http://ajt.ktug.org/assets/2008/5/1/0201tsuchimura_kuroki.pdf
% https://okumuralab.org/tex/mod/forum/discuss.php?d=460
オリジナルの\TeX で扱える文字コードの範囲は0--255であった
\footnote{当初の\TeX82では7-bitだった:\TeX90で8-bitになった.}.
\pTeX 系列では,日本語の文字を(\LaTeX の\code{inpuenc}のようなアクティブ化
によらず)直接扱えるように,文字コードとして有効な範囲を拡張している.
以降では,従来の枠組みで扱える文字を\emph{欧文文字},
それ以外を\emph{和文文字}と呼ぶ.
なお,本節(\ref{sec:ptexchar}節)全体を通して
\epTeX は\pTeX と同じ,\eupTeX は\upTeX と同じである.
\subsection{ファイルのエンコードと内部コード}
\pTeX 系列は,\emph{入出力ファイルのエンコード}として
ISO-2022-JP (jis),EUC-JP (euc),Shift-JIS (sjis)またはUTF-8 (utf8)に対応している.
ただし,入力はそのままのエンコードで扱われるとは限らず,
各行は\emph{内部コード}に変換されてから内部処理に回され,
ファイル出力時にもやはり内部コードからの変換が行われる.
ファイルのエンコードと内部コードが異なる場合は
\code{ptexenc}ライブラリに従ってエンコード変換が発生することとなる.
\TeX の入力プロセッサに実際に渡るのは入力各行の変換結果である.
\pTeX の内部コードはWindowsではShift-JIS,それ以外ではEUC-JPが既定であり,
\upTeX の内部コードは既定でUnicodeであるが,
起動時のオプション|-kanji-internal|(INIモード時のみ有効:後述)に
よって制御できる.
\pTeX/\upTeX の入出力ファイルのエンコードは,
\TeX~Live 2018以降は全てのプラットフォームでUTF-8が既定である
\footnote{\TeX~Live 2017以前では\pTeX に限り,
WindowsではShift-JIS,それ以外ではUTF-8であった.
\upTeX は当初から全てのプラットフォームでUTF-8であった.}が,
個別の入力ファイルのエンコードは次の順番で決まる(\code{ptexenc}による).
この決定手続きはファイルの先頭行を読むときに行われる.
% 注:|PTEX_IN_FILTER| が定義されている場合は別.
\begin{enumerate}
\item ファイル先頭にUTF-8のBOM\footnote{正確には,最初の4byteが
\code{0xEF 0xBB 0xBF 0x7E}以下.}を見つけたらUTF-8(BOM付き)とみなす.
\item エンコード推測機能が有効ならば推測を行い,成功すれば
それを採用する\footnote{\TeX~Live 2022以前はWindows専用の機能であったが,
\TeX~Live 2023で全てのプラットフォームで利用可能となった\cite{tjb142}.
kpathsearchライブラリ変数|guess_input_kanji_encoding|によって制御でき,
値が1ならば有効,0ならば無効である.}.
\item 起動時のオプション|-kanji|(後述)による指定があればそれを使う.
\item 環境変数|PTEX_KANJI_ENC|が定義されていればそれを使う.
\item 以上で決まらない場合は既定のエンコードを使う.
\end{enumerate}
% 以上の記述は阿部さんのブログを基に作成.
% http://abenori.blogspot.com/2016/02/e-ptexeptexinputencoding.html
% なお LaTeX2e 2018-04-01 での inputenc UTF-8 既定化に合わせて
% Windows (W32TeX) でも Shift-JIS から UTF-8 に変更されている.
% https://okumuralab.org/tex/mod/forum/discuss.php?d=2396
なお,ISO-2022-JPでエンコードされた文字は現在のエンコードによらず正しく読まれる.
% ISO-2022-JP (JIS) でエンコードされたバイト列は 7 ビットであって,
% 他の 3 つのエンコードと明らかに区別ができるため.
% 実際には,他のエンコードのファイルの途中に JIS の文字列が混ざっていても
% 全て正常に読み込まれる.
% https://qiita.com/zr_tex8r/items/beda5a7702b84409436e
また,\eTeXpre(u)\pTeX の\.{epTeXinputencoding}を使用すればその次の行から
新しいエンコードで読まれる(\texttt{./eptexdoc.pdf}を参照).
\begin{dangerous}
ここでは,歴史に興味のある読者への情報として,アスキー\pTeX から
現在のコミュニティ版\pTeX に至るエンコードの扱いの変遷を述べる.
初期のアスキー\pTeX は「EUC版\pTeX 」「SJIS版\pTeX 」「JIS版\pTeX 」の
3つのプログラムを別々に用意しており,一つの\pTeX バイナリではエンコードが
EUC-JP,Shift-JIS,ISO-2022-JPのどれか一つのファイルしか処理できなかった.
% JIS のファイルなら EUC/SJIS どちらの ptex でも読み込めますが,
% これも最初からではなく p2.1.5 (1997年) 以降のようで,
% それまではスタイルファイルも EUC や SJIS にしておく必要があったようです.
|-kanji|オプションが追加され,一つの\pTeX バイナリで複数のエンコードを
選択処理できるようになったのは\pTeX~3.0.1と3.0.4の間(2002年10月頃)である.
% http://tutimura.ath.cx/ptexlive/?ptexenc%2FDetails
% の土村さんのコメント (2008-02-23) より
コミュニティ版\pTeX は,UNIX向け日本語\TeX ディストリビューション
pte\TeX\footnote{Thomas Esserさんによるte\TeX をベースとして,
土村展之さんによって2004年から2009年まで開発.
その後継のptexliveは,2010年に\pTeX が\TeX~Liveに取り込まれる際のベースに
なった.}の開発過程で誕生した.
% コミュニティ版という呼称は2004年当初からのものではなく
% 2016年頃に生じたものであるが,系譜上ptetexと一体で
% 開発されてきたものをコミュニティ版と後から呼ぶことにする.
2006年頃からエンコードがUTF-8のファイル入力への対応が進められ,2007年には
エンコード変換を担う関数群が\code{ptexenc}というライブラリに切り出された.
現在の\TeX~Liveでも\code{ptexenc}は種々のプログラムで利用されている.
\end{dangerous}
\paragraph{\pTeX 系列の起動時のオプション}
\begin{itemize}
\item |-kanji=|<encoding>
\begin{quotation}
入出力テキストファイルのエンコードを指定する.\\
利用可能な<encoding>の値:\code{euc}, \code{sjis}, \code{jis}, \code{utf8}
\end{quotation}
\item |-kanji-internal=|<encoding>
\begin{quotation}
内部コードを指定する(INIモード専用\footnote{フォーマットファイルは
内部コードに依存するので,実際の処理と整合性をとるため
virtual modeでは読み込んだフォーマットファイルと同じ内部コードで
動作するように固定している.\pTeX\ p3.8.2以降の仕様.}).\\
利用可能な<encoding>の値:\code{euc}, \code{sjis}
\quad (\upTeX のみ:\code{uptex}も利用可能)
\end{quotation}
\end{itemize}
\pTeX で利用可能な内部コードは\code{euc} (EUC-JP)か
\code{sjis} (Shift-JIS)のいずれかであるため,
入力を仮にUTF-8としても必ず内部コードへの変換が起こる.
\upTeX では既定状態の内部コードが\code{uptex} (Unicode)なので,
入力をUTF-8とすれば変換は“ほとんど”起こらない\footnote{例外は
\code{ptexenc}による基底文字と濁点に分解された形(結合文字列)の
合成など:後述.}.
\paragraph{\pTeX 系列の起動時のバナー}
入出力ファイルのエンコードと内部コードは起動時のバナーから分かる.
例えば
\begin{verbatim}
This is pTeX, Version 3.14159265-p3.8.0 (utf8.euc) (TeX Live 2018)
(preloaded format=ptex)
\end{verbatim}
というバナーの場合は,|(utf8.euc)| から
\begin{itemize}
\item 入出力ファイルの(既定)エンコードはUTF-8(但し,JIS~X~0208の範囲内)
\item \pTeX の内部コードはEUC-JP
\end{itemize}
という情報が見て取れる.入出力ファイルのエンコードと内部コードが同じ場合は,
\begin{verbatim}
This is pTeX, Version 3.14159265-p3.8.0 (sjis) (TeX Live 2018)
(preloaded format=ptex)
\end{verbatim}
のように表示される(入出力ファイルのエンコードと内部コードがともにShift-JISである例).
\begin{dangerous}
上にはこのように書いたが,
極めて細かい話をすれば,起動時のバナーは時にウソをつくので注意.
ログファイルには記録されるバナーは常に正しい.これは以下の事情による.
virtual modeでは,起動直後にバナーを表示してから,フォーマットファイル
読込が行われる.この時点で初めて,起動時の内部コードとフォーマットの
内部コードの整合性が確認される.ここでもし合致しなかった場合は,\pTeX は
警告を表示してフォーマットに合った内部コードを選択し,以降の処理を行う.
ログファイルはこの後にオープンされるため,そこには正しい内部コード
(フォーマットと同じ内部コード)が書き込まれる\cite{tjb55}.
このようなウソは,\pTeX に限らず\code{(preloaded format=***)}でも見られる.
\end{dangerous}
\subsection{有効な文字コードの範囲【\pTeX の場合】}\label{sec:ptex_code}
\pTeX では,JIS~X~0208すなわちJIS第1, 2水準の文字を利用可能である.
入力は\emph{「7ビットASCII文字集合」に「あるファイルのエンコードで
表現されたJIS~X~0208の文字集合」を加えたもの}として解釈される.
そして,以下の規則により和文文字と欧文文字に区別して取り扱われる.
\begin{itemize}
\item 7ビットASCII文字集合は\emph{欧文文字}として扱われる.
また,\TeX90互換の「|^^|記法」という間接的な入力法
\footnote{|^^ab|のようにカテゴリーコード7の文字2つに続いて
|0|--|9|, |a|--|f|のいずれかが2つ続くと,
それを16進文字コードとする文字入力がなされたのと同じ処理に回る.}も
\emph{常に欧文扱い}される\footnote{|^^|記法の欧文扱いは
アスキー\pTeX~3.1.4以降.
\pTeX~3.1.8で制御綴内での扱いが改善された.また,
コミュニティ版\pTeX~4.0.0で文字列化においても常に欧文扱いするように改修した.
これについては\ref{sec:printkanji16bit}節を参照.}.
% |^^|記法は,|^^@|のようにASCII一文字(0--9,~a-f以外)が続くものと
% |^^ab|のように16進数2桁が続くものがある.
% 前者は\TeX82からあったもので,後者が\TeX90で追加された.
% 参考:Knuth, TUGboat, Volume 10 (1989), No.~3, p.325
\item 最上位ビットが1の場合,そのバイトで始まる列について
ファイルのエンコードから内部コード(EUC-JPまたはShift-JIS)への
変換を試みる(同一コードなら恒等変換).
和文文字の内部コードとして許される整数は
$256c_1+c_2$,但し$c_i\in C_i$であり,ここで
\begin{description}
\item[内部コードがEUC-JPのとき]
$C_1=C_2=\{\hex{a1},\dots,\hex{fe}\}$.
\item[内部コードがShift-JISのとき]
$C_1=\{\hex{81},\dots,\hex{9f}\}\cup\{\hex{e0},\dots,\hex{fc}\}$,\\
$C_2=\{\hex{40},\dots,\hex{7e}\}\cup\{\hex{80},\dots,\hex{fc}\}$.
\end{description}
である.この内部コードのパターンに合えば
「変換後の文字コードを持つ一つの\emph{和文文字}」
として扱われ,合わなければ一旦|^^ab|形式への変換(後出の★)を経て
「\emph{8ビット欧文文字}のバイト列」として扱われる.
\end{itemize}
% TeX の行入力処理
% https://www.ma.ns.tcu.ac.jp/Pages/TeX/line.input.html
% アスキー pTeX 3.1.4 における ^^ 記法の改修
% https://www.ma.ns.tcu.ac.jp/Pages/TeX/hat.hat.a.b.html
\begin{dangerous}
一遍に書いているが,
入力ファイルを一行読み込んで必要なエンコード変換を行った結果を
バッファに格納するところまでが\code{ptexenc}による前処理である.
そのバッファを\TeX の入力プロセッサが読み,
文字のカテゴリーコードに従って(和文と欧文の区別を付けながら)
トークン列を生成する,という流れである.
\code{ptexenc}による前処理には
「内部コードに変換できない入力のバイト列を|^^ab|形式に変換」も
含まれるが,この時点ではカテゴリーコードについて知らないため,
文字|^|の\.{catcode}が7かどうかは関係なく|^^|が用いられる.
\end{dangerous}
\pTeX における有効な文字コードの範囲は
「欧文文字として有効な文字コード(0--255)」と
「和文文字として有効な文字コード(内部コードとして許される整数値)」の和集合であり,
前者は1バイト・後者は2バイトなので互いに重ならない.
% 内部コードの範囲:kanji.c の |is_char_kanji| の実装
最近(2010年代以降)では,\pTeX でもファイルのエンコードをUTF-8とする
利用が増えてきた.
コミュニティ版\pTeX はUTF-8ファイル入力に対応しているが,
先述の通り内部コードはEUC-JPまたはShift-JISのいずれかであるため,
\emph{\pTeX はJIS~X~0208外の文字をサポートしない}.
なお,\code{ptexenc}による前処理に以下の特殊な加工を含めてある.
% http://tutimura.ath.cx/ptetex/?UTF-8%C2%D0%B1%FE%282%29
\begin{itemize}
\item Unicodeでのバラツキを同一視する多対一変換(表\ref{table:jis_uni_var})
\footnote{例えば,ソースファイル中の全角ダーシ(\code{U+2015})と
EMダーシ(\code{U+2014})は同一視され,内部的にはJISコード\hex{213D}と
して扱われ,ファイルに書き出される時は\code{U+2015}になる.}
\item BOMの無視(ファイル先頭に限らず)
\item 結合濁点(\code{U+3099})・半濁点(\code{U+309A})の合字処理
\item JIS外のため変換できない文字を|^^ab|形式に変換
\footnote{例えば,ソースファイル中にçのようなJIS~X~0208外の文字を直接書くと,
これは和文文字の内部コードに変換できないため|ç|に変換されて欧文扱いされる.}…★
%%%
% [動作チェック!]
% 上の行の説明文では |ç| が『ptexenc による |^^| 形式への変換』を経て
% 欧文 8 文字 |^^c3^^a7| としてリテラル印字されることを期待している!
% 本ソースを pLaTeX で処理すれば真.
% 内部 Unicode の upLaTeX では『ptexenc による |^^| 形式への変換』が起こらず
% 内部コード 0xE7 としてバッファに格納される.
% そして \kcatcode"E7=15 なのでインプットプロセッサの段階で欧文扱いされる.
% 既定の inputenc UTF-8 ならばこれは "E7 の欧文 1 文字になる.
% もし \UseRawInputEncoding ならば "C3 "A7 の欧文 2 文字になる.
\setbox0=\hbox{|ç|}\unless\ifdim\wd0>2em\ptErr{Check above: pLaTeX assumed}\fi
%%%
\end{itemize}
なお,UTF-8ファイル出力時にはこのような加工の逆変換は行わない(入力時に
加工されたままで出力される).
このように\emph{\pTeX は入力を内部コードに変換する処理を含むため,
オリジナルの\TeX や\pdfTeX などの欧文\TeX とは入力に関して必ずしも
互換でない}ことに注意が必要である.
\begin{dangerous}
以上で述べた「内部コードの範囲」はJIS~X~0213の漢字集合1面(Shift-JISの場合は2面も)を
まるまる含んでいるが,\emph{\pTeX はJIS~X~0213には対応していない.}
JIS~X~0213で規定された「85区1点」の位置の文字を入力ファイル中に書いた場合,
\begin{description}
\item[エンコードがEUC,~Shift-JISの場合] DVIには29985~(\hex{7521})%"
番の文字として出力される.
\item[エンコードがJISの場合] ``\verb|! Missing $ inserted.|''というエラーが発生する.
これは,\pTeX がJIS~X~0213の1面を指示するエスケープシーケンス
\texttt{1B 24 28 4F} (JIS2000), \texttt{1B 24 28 51} (JIS2004)を認識せず,
\texttt{24}~(\texttt{\$})を数式モード区切りと解釈してしまうためである.
\item[エンコードがUTF-8の場合] UTF-8のバイト列\texttt{E6 93 84}として読み込まれる.
\end{description}
なお,\.{char}により「\verb|\char\kuten"5521|」%"
のようにして区点コードを指定した場合は,DVIには29985~(\hex{7521})%"
番の文字として出力される.
また,DVIに文字として出力されたからといって,それをPostScriptやPDFに変換したときに
意図通りに出力されるかは全くの別問題である.
\end{dangerous}
\subsection{有効な文字コードの範囲【\upTeX の場合】}\label{sec:uptex_code}
\upTeX は\pTeX と事情が異なるので,ここで説明する.
\pTeX との違いを\emph{強調}してある.
\begin{itemize}
\item 文字集合は内部コードにより範囲が異なる.
\begin{itemize}
\item 内部レガシー(EUC-JPまたはShift-JIS)の場合:
「7ビットASCII文字集合」に「あるファイルのエンコードで
表現されたJIS~X~0208の文字集合」を加えたもの.
つまり\pTeX となんら変わらない.
\item \emph{内部Unicodeの場合:Unicode全体.}
\end{itemize}
\item 和文文字と欧文文字の区別は以下の規則による:
%
\begin{itemize}
\item 7ビットASCII文字集合は欧文文字として扱われる.
また,\TeX90互換の「|^^|記法」という間接的な入力法も
常に欧文扱いされる.(\pTeX と同様)
\item 最上位ビットが1の場合,そのバイトで始まる列について
ファイルのエンコードから内部コードへの変換を試みる(同一コードなら恒等変換).
内部コードのパターンに合えば
「変換後の文字コードを持つ一つの\emph{一文字}」
として扱われ,\emph{それが和文扱いか欧文扱いかは
\.{kcatcode}に依存する(詳細は\ref{sec:uptex_kcat}節).}
合わなければ一旦|^^ab|形式への変換(後出の★)を経て
「8ビット欧文文字のバイト列」として扱われる.
%
% pTeX で和文固定の文字(例えば "あ")も
% upTeX -kanji-internal=euc/sjis なら \kcatcode=15 で欧文扱いできる.
% ただし入力ファイルのエンコードによらず内部コードにより
% 結果は ^^a4^^a2 (euc) / ^^82^^a0 (sjis) になる.
%
\end{itemize}
%
\item \code{ptexenc}ライブラリによる前処理も\pTeX と類似だが,
変換方向によって少々異なる.
%
\begin{itemize}
\item Unicode多対一変換:内部レガシーの場合は\pTeX と同様.
\emph{内部Unicodeの場合は,入出力UTF-8に対しては変換を行わず,
入力EUC-JP/Shift-JISからの変換について一対多対応があれば
Unicodeへの変換は表\ref{table:jis_uni_var}に従う.}
\item BOMの無視は行う.(\pTeX と同様)
\item 結合濁点・半濁点の合字処理は行う(\TeX~Live 2016以降
\footnote{結合濁点・半濁点は\TeX~Live 2015までは\pTeX でのみ
合字処理され,\upTeX では行っていなかった.}).(\pTeX と同様).
\item 範囲外の文字の|^^ab|形式への変換:内部レガシーでは\pTeX と同様.
\emph{内部Unicodeでは,文字集合がUnicode全体なので範囲外の文字は
存在せず,従って}|^^ab|\emph{形式への変換は基本的に起こらない}
\footnote{不正なUTF-8入力などに限り|^^ab|形式に変換される.}.…★
\end{itemize}
% 結合文字列(基底文字+合成用濁点・半濁点)→合成文字
% https://zrbabbler.hatenablog.com/entry/20151006/1444134044
% https://okumuralab.org/tex/mod/forum/discuss.php?d=1701
%
\end{itemize}
\begin{table}[bp]
\caption{JIS⇔Unicode一対多変換.Unicode→JIS変換では複数の文字が同一視
される.JIS→Unicode変換では複数候補のうち\emph{太字}が選択される.}
\label{table:jis_uni_var}
% ptexenc/unicode-jp.c の variation[] にて定義.
% http://www.t-lab.opal.ne.jp/tex/jis_uni_variation_uptex.html
% 下記ZRは https://github.com/texjporg/jsclasses/issues/49 で言及あり
\centering\small
\begin{tabular}{ccccc}
\toprule
区点 & Character Name & 文字 & JIS~X~0208 & Unicode \\
\midrule
1-17 & \code{OVERLINE} & \kchar\jis"2131
& \code{0x2131} & \code{U+203E}, \emph{\code{U+FFE3}} \\
1-29 & \code{EM DASH} & \kchar\jis"213D
& \code{0x213D} & \code{U+2014}, \emph{\code{U+2015}} \\ %ZR
1-33 & \code{WAVE DASH} & \kchar\jis"2141
& \code{0x2141} & \emph{\code{U+301C}}, \code{U+FF5E} \\ %ZR
1-34 & \code{DOUBLE VERTICAL LINE} & \kchar\jis"2142
& \code{0x2142} & \emph{\code{U+2016}}, \code{U+2225} \\ %ZR
1-36 & \code{HORIZONTAL ELLIPSIS} & \kchar\jis"2144
& \code{0x2144} & \emph{\code{U+2026}}, \code{U+22EF} \\
1-61 & \code{MINUS SIGN} & \kchar\jis"215D
& \code{0x215D} & \emph{\code{U+2212}}, \code{U+FF0D} \\ %ZR
1-79 & \code{YEN SIGN} & \kchar\jis"216F
& \code{0x216F} & \code{U+00A5}, \emph{\code{U+FFE5}} \\
1-81 & \code{CENT SIGN} & \kchar\jis"2171
& \code{0x2171} & \code{U+00A2}, \emph{\code{U+FFE0}} \\ %ZR
1-82 & \code{POUND SIGN} & \kchar\jis"2172
& \code{0x2172} & \code{U+00A3}, \emph{\code{U+FFE1}} \\ %ZR
2-44 & \code{NOT SIGN} & \kchar\jis"224C
& \code{0x224C} & \code{U+00AC}, \emph{\code{U+FFE2}} \\ %ZR
\bottomrule
\end{tabular}
\end{table}
\upTeX における有効な文字コードの範囲は
「欧文文字として有効な文字コード(0--255)」と
「和文文字として有効な文字コード」の和集合である.
内部レガシーの場合は\pTeX と全く同じであり,
前者は1バイト・後者は2バイトなので互いに重ならない.
内部Unicodeの場合は後者がUnicode全体(0以上0x10FFFF以下の
整数値)となるので,\emph{0--255の範囲は重なっており
和文・欧文どちらの文字コードとしても有効である}ことに注意.
% 内部コードの範囲:kanji.c の |is_char_kanji| の実装
いずれの場合も,\upTeX は
オリジナルの\TeX や\pdfTeX などの欧文\TeX とは入力に関して必ずしも
互換でない(内部UnicodeへのUTF-8入力に限っても「BOMの無視」と
「結合濁点・半濁点の合字処理」だけは起こる)が,
\pTeX と比較すれば幾分差異が軽減されている.
\begin{dangerous}
内部コードUnicode (\code{uptex})の場合の上限が0x10FFFFというのは
実は嘘である.24bit整数値が有効であり,うち0x110000以上0xFFFFFF以下は
特殊な用途で利用できるよう留保されている.
\begin{itemize}
\item \verb|Bad character code|エラーが出ない範囲:0以上0xFFFFFF以下
\footnote{\verb|Invalid KANSUJI char|エラーが出ない範囲も同じ.}
\item 和文文字トークンの文字コードとして可能な範囲:0以上0x10FFFF以下
\item 和文文字ノードの文字コードとして可能な範囲:0以上0xFFFFFF以下
\end{itemize}
%
\upTeX では和文文字トークンおよび和文文字ノードにおいて
文字コードをUTF-32の下位24bitで格納する仕様となっている.
Unicode文字入力で0x110000以上0xFFFFFF以下の文字コードはありえないが,
文字コードを数値で指定する場合の扱いは以下としている:
\begin{itemize}
\item \.{char}, \.{chardef}及び\.{kchar}, \.{kchardef}:
文字コードが0x110000以上でもそのままの値で和文文字ノードを生成する.
DVI出力時には「文字コード mod 0x110000」で書き込まれる.
% Output node |p| ... の処理で toDVI()
\item \.{kansujichar}への文字コード代入:
値の格納時に「文字コード mod 0x110000」を行うので,
以降の\.{kansuji}により生成する文字トークンは0以上0x10FFFF以下.
% eqtb テーブル格納時に toDVI()
\item \eTeXpre(u)\pTeX の\.{Uchar}, \.{Ucharcat}:
文字トークン生成時に「文字コード mod 0x110000」を行うので,
やはり0以上0x10FFFF以下になる.
% print_kanji() の処理で toUCS()
\end{itemize}
特に\.{kchar}の上記仕様はOTFパッケージで使われている.
これは,|\CID| (Adobe-Japan1)のような
Unicodeでない文字コードを扱う内部処理において
Unicodeの正規の文字コード(0x10FFFF以下)の
カテゴリーコードや禁則ペナルティのしがらみの影響を受けない目的である.
% 0x110000 以上の扱い:現状では otf で意図的に利用.
% 将来的に異体字対応の内部コードに使う可能性を留保.
% https://okumuralab.org/~okumura/texfaq/qa/50036.html
% https://github.com/texjporg/tex-jp-build/issues/160
% https://github.com/texjporg/tex-jp-build/issues/46
\end{dangerous}
\subsection{文字コードの取得と指定}\label{sec:getcode}
(u)\pTeX では「文字コードを引数にとるプリミティブ」といっても,状況によって
\begin{itemize}
\item 欧文文字の文字コード0--255をとる(例:\.{catcode})
\item 和文文字の内部コードをとる(例:\.{inhibitxspcode})
\item 上記2つのどちらでもとれる(例:\.{prebreakpenalty})
\end{itemize}
のいずれの場合もありうる.
\medskip
本ドキュメントでは上のどれかを明示するために,以下のような記法を採用する.
\begin{description}
\item[<8-bit number>] 0--255の範囲内の整数
\item[<kanji code>] 和文文字の内部コード
\item[<character code>] 0--255の範囲内の整数,および和文文字の内部コード
\item[<16-bit number>] 0--65535の範囲内の整数
\end{description}
和文文字の文字コードを数値で指定するには,内部コードで表現する必要がある.
この方法として,(u)\pTeX では以下が利用できる.
\begin{itemize}
\item \TeX82と同様に,
バッククオート(|`|)を使って「|`あ|」のようにして和文文字の内部コードを
内部整数として得ることができる.欧文文字については,1文字の制御綴を
代わりに指定することができた(例えば,「|`b|」と「|`\b|」は同じ意味だった)が,
同じことを和文文字に対して「|`\あ|」などと行うことはできない.
\item 数値で直接表現するために,異なるエンコードから内部コードへの
文字コード変換を行うプリミティブが用意されている.
\ref{sec:convert}節を参照.
\end{itemize}
\section{和文カテゴリーコードと\TeX の入力プロセッサ}
\TeX の処理は以下のような段階を踏み,\pTeX 系列でもこれは共通である.
% https://blog.wtsnjp.com/2016/11/24/tex-by-topic1/
% https://blog.wtsnjp.com/2017/03/31/tex-by-topic2/
\begin{itemize}
\item 入力を一行単位で読み込む(改行文字はCR,~LFいずれも可).
\item (\code{ptexenc}によるエンコード変換)
\item \emph{入力プロセッサ}がカテゴリーコードに従って「順に」トークン化
しつつ,その過程で
\begin{itemize}
\item \emph{展開プロセッサ}:マクロやアクティブ文字など
展開可能トークンの展開
\item \emph{実行プロセッサ}:代入やマクロ定義,出力リスト構築など
展開不能トークンの実行
\end{itemize}
も介入する\footnote{例えば,実行プロセッサの結果により
カテゴリーコードが変更されれば,
行内でも入力プロセッサの動作に影響を及ぼし,以降の展開・実行結果も変化する.
ただし,順に一度トークン化されたもののカテゴリーコードは固定である.}.
% e-TeX の \scantokens を除く.
\item \emph{ビジュアルプロセッサ}が受け取った出力リストを元に
行分割・ページ分割などを行い,ページをDVIに出力する.
\end{itemize}
\TeX82では各文字に0--15のカテゴリーコード(\.{catcode})を割り当てており,
入力プロセッサは「どのカテゴリーコードの文字が来たか」で状態が遷移する
有限オートマトンとして記述できる\cite{topic}.
\pTeX 系列においても同様であり,和文文字には欧文文字とは異なる
専用のカテゴリーコード(\.{kcatcode})を割り当てることで拡張している.
\.{kcatcode}の仕様は\pTeX と\upTeX で異なるので,別々に説明する.
% [TODO] 和文トークンの話は以下も参照しながら ptex-guide-en を整備
% https://gist.github.com/zr-tex8r/629b5334d19cbcfc3fe58728b81b1c80
\subsection{和文カテゴリーコード【\pTeX の場合】}
\label{sec:ptex_kcat}
\pTeX が欧文\TeX と大きく異なるのは以下の点である.
\begin{itemize}
\item 文字コードによって和文文字(2バイト)と欧文文字(1バイト)を区別する.
\item 和文文字直後の改行は(欧文文字直後の改行と異なり)空白とみなさない.
\item 和文文字には役割に応じて16~($\mathit{kanji}$), 17~($\mathit{kana}$),
18~($\mathit{other\_kchar}$)の和文カテゴリーコードのいずれかを割り当てる.
初期状態では,JISの1,~2, 7--15, 85--94区の文字は18,3--6区の文字は17,
16--84区の文字は16に設定されている.
\item 和文文字トークンは文字コードのみで表現され,そのカテゴリーコードは
随時算出されるようになっている.
欧文文字トークンが\TeX82と同様にカテゴリーコード$c$と文字コード$s$の
組み合わせ($256c+s$)で表現されているのとは対照的である.
\end{itemize}
和文カテゴリーコードの値は一応,
16が「漢字」,17が「かな」,18が「その他の和文記号」を意図している.
ただし区の中身を見れば分かる通り,\pTeX では特に
全角数字・アルファベット(3区)とギリシャ文字(6区)も17であり,
キリル文字(7区)は18となっている.
和文カテゴリーコードの値による動作の違いは次のようになる
(16と17は\pTeX の内部処理においては全く等価で,18だけが異なる).
\begin{itemize}
\item \TeX82では,「複数文字からなる命令」(コントロールワード)には
カテゴリーコードが11~($\mathit{letter}$)の文字しか使用できないことになっていたが,
\pTeX ではカテゴリーコードが16,~17の和文文字も合わせて使用することができる.
\item 一方,カテゴリーコードが18の和文文字はコントロールワード中には使用できない.
「|\】|」のように一文字命令(コントロールシンボル)に使用することはできる
\footnote{「|\】|」のような和文のコントロールシンボルで行が終わった場合,
「|\!|」のような欧文コントロールシンボルと同様に改行由来の空白が追加されてしまい,
和文文字直後の改行は何も発生しないという原則に反していたが,
これは\TeX~Live 2019の\pTeX~3.8.2で修正された\cite{tjb37}.}.
\item 後で説明する\.{jcharwidowpenalty}は,カテゴリーコードの値が16,~17の
和文文字の前にのみ挿入されうるもので,値が18の和文文字の前には挿入されない.
\item いずれにせよ,和文文字は決して“アクティブ”(欧文文字における
カテゴリーコード13のような状態)にはならない.
\end{itemize}
従って,\emph{\pTeX の既定では
コントロールワードに全角数字・アルファベット・ギリシャ文字を含めることができるが,
キリル文字は不可(コントロールシンボルのみ)である}ことがわかる
(\upTeX の既定では全て不可).
% upTeX の既定では,全角数字とアルファベット(Halfwidth and Fullwidth Forms)・
% ギリシャ文字・キリル文字の全てが18である.
\medskip
和文カテゴリーコードを取得・設定するプリミティブが\.{kcatcode}である.
\begin{cslist}
\csitem[\.{kcatcode} <character code>=<16--18>]
コミュニティ版\pTeX では,和文カテゴリーコード(\.{kcatcode})は
DVI中の上位バイトごと(すなわち,JISコードでいう区ごと)に値が設定可能である
\footnote{%
オリジナルのアスキー\pTeX では,内部コードの上位バイトごとに値が設定可能であった.
すなわち,内部コードがEUC-JPのときは区ごとに設定可能であったが,
内部コードがShift-JISのときは
$2n-1$区・$2n$区($1\leq n\leq 47$)は同一のカテゴリーコードを持つことになる.
}.\end{cslist}
\begin{dangerous}
\.{kcatcode}では欧文文字の文字コード(0--255)も指定することができるが,
その場合「0区扱い」として扱われる.
\pTeX の処理でこの「0区」の\.{kcatcode}が使われることはないので,
事実上は「16--18のどれかを格納可能な追加レジスタ」程度の使い方しかない.
\end{dangerous}
しかし,
\pTeX においては,\.{kcatcode}を文書の処理途中で変更することは想定されていない.
というのも,\pTeX では(\upTeX と異なり)和文文字トークンに
カテゴリーコードの情報は保存されず,
和文文字が処理対象となるたびにカテゴリーコードの値が随時算出されるためである.
ただし,\pTeX でも |\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)
\begin{dangerous}
例えば,\pTeX では以下のコードで定義される|\X|,~|\Y|で引数終端を示す「あ」には
カテゴリーコードの情報は格納されないため,|\X|と|\Y|は全く同じ動作となる.
一方,同じコードを\upTeX で実行すると,|\X|と|\Y|は異なる動作となる.
\begin{verbatim}
\kcatcode`あ=16
\def\X#1あ{\message{X: #1}}
\kcatcode`あ=17
\def\Y#1あ{\message{X: #1}}
\end{verbatim}
\end{dangerous}
\subsection{和文カテゴリーコード,和文文字と欧文文字の区別【\upTeX の場合】}
\label{sec:uptex_kcat}
\upTeX においては\.{kcatcode}が\pTeX から大きく仕様変更されている
\footnote{\upTeX の正式用語としては,和文文字トークン(和文トークン)は
CJK文字トークン(CJKトークン)と呼ぶべきだが,本文書では単純化のため
\pTeX と同じ用語を用いる.}:
\begin{itemize}
\item \.{kcatcode}プリミティブに和文文字の役割の分類だけでなく,
トークン列生成における和文文字と欧文文字の区別という機能も付与する.
具体的には,\emph{\.{kcatcode}に特別な値として15~}($\mathit{not\_cjk})$\emph{を
設定すると,それは8ビット欧文文字のバイト列として扱われ,和文扱いされなくなる}.
\item 和文文字に可能なカテゴリーコードとして19~($\mathit{hangul}$)を追加する.
\emph{カテゴリーコード19の和文文字は,直後の改行を欧文同様に空白とみなす}
という点が特別であり,それ以外の点ではカテゴリーコード16,~17の和文文字と同様である
(例えば,コントロールワード中にも使用できる).
\item \emph{和文文字トークンについてもカテゴリーコード}(\.{kcatcode})\emph{の情報を含む}.
欧文トークンをcatcode 4bit + charcode 8bitで,
和文トークンをkcatcode 5bit + charcode 24bitで表す.
\end{itemize}
\begin{cslist}
\csitem[\.{kcatcode} <character code>=<15--19>]
内部レガシーの\upTeX では,\pTeX と同様に
JISコードでいう区ごとに値が設定可能.
内部Unicodeの\upTeX では,和文カテゴリーコード(\.{kcatcode})は
概ねUnicodeのブロックごと(※一部のブロックは分割してある)に値が設定可能である.
% 分割状況: https://github.com/texjporg/tex-jp-build/issues/43
\end{cslist}
このように内部Unicodeの\upTeX では\.{kcatcode}の設定が
Unicodeのブロックごとであるので,
\pTeX のJISコードの区ごとに設定したものとは分類が必ずしも一致しない.
各ブロックの初期値については
\href{https://github.com/texjporg/uptex-base}{\file{uptex-base}}で配布している
\file{01uptex_doc_utf8.txt}を参照のこと.
\begin{dangerous}
例えば長音記号「ー」はJISコードで\codeHEX{\tojis`ー}% JIS 0x213C
であり,記号として1区に含まれるから\pTeX での\.{kcatcode}は18である
(内部レガシーの\upTeX でも同様).一方Unicodeでは\codeHEX{\toucs`ー}% U+30FC
であり,カタカナと同じブロックに含まれるから内部Unicodeの\upTeX での
\.{kcatcode}は17である.すなわち,\pTeX では「ー」をコントロールワード中に
含められないが,\upTeX では許される.
\begin{verbatim}
\def\黄マーカー{...}
% => pTeX では「\黄マ」という命令と「ーカー」という終端
% => upTeX では「\黄マーカー」という命令が定義される
\newcommand{\黄マーカー}[1]{...}% => pTeX ではエラー,upTeX では通る
\end{verbatim}
% https://okumuralab.org/tex/mod/forum/discuss.php?d=2703
もちろんこの逆の例もあり,
\pTeX では全角数字とアルファベット(Halfwidth and Fullwidth Forms),
ギリシャ文字が17であったが,\upTeX では(キリル文字と同じく)18としている.
\end{dangerous}
なお\ref{sec:uptex_code}節で述べた通り,\upTeX では内部コードによらず
0--127の7ビットASCII文字集合は常に欧文文字トークンとして扱うこととしている.
裏を返せば\emph{和文文字トークンで文字コードが0--127という状況は
起こりえない}\footnote{和文文字ノードとしては文字コード0--127も可能:
\ref{sec:kchar}節で出てくる\.{kchar}で生成される.}し,
このブロックの\.{kcatcode}を15以外に設定しても和文扱いはされない.
\begin{dangerous}
例えば\upTeX の既定(内部Unicode)から |\kcatcode`あ=15| を実行すると,
以降の「|あ|\relax」は |^^e3^^81^^82| を入力したとみなされる
\footnote{内部EUC-JPでは |^^a4^^a2|,内部Shift-JISでは |^^82^^a0|になる.}.
この状況で続けて |\kcatcode`あ=17| を実行しても,
それは |\kcatcode`^^e3^^81^^82| の入力とみなされるので元には戻らない:
代わりに |\kcatcode\ucs"3042=17| と実行する必要がある.
\end{dangerous}
既定ではこのように和文と欧文が\.{kcatcode}の値(16--19か,15か)に従って
区別されるが,以下のプリミティブによって変更可能である.
\begin{cslist}
\csitem[\.{enablecjktoken}]
和文文字と欧文文字の区別について\.{kcatcode}の設定に従い,
15なら欧文扱い,16以上なら和文扱いにする.
\upTeX の既定はこの状態である.
\csitem[\.{disablecjktoken}]
全てのUnicode文字を(\.{kcatcode}にかかわらず)欧文扱いにする(単なるバイト列として扱う).
入力に関して(\code{ptexenc}ライブラリによる前処理を除き)8-bit欧文\TeX と互換になる.
\csitem[\.{forcecjktoken}]
ASCII文字以外のUnicode文字を(\.{kcatcode}にかかわらず)
強制的に和文扱いにする.
このとき,\.{kcatcode}が15の文字は「その他和文」(18)扱いになる.
\begin{verbatim}
\forcecjktoken\kcatcode`西=15
\message{\the\kcatcode`@ % ==> 18
\ifcat 西@ T\else F\fi}% ==> T
\end{verbatim}
\end{cslist}
\subsection{\pTeX の入力プロセッサ}% \pTeX~4.0.0での改修を含む
\label{sec:ptex_input}
\begin{figure}[b]
\small
\[
\entrymodifiers={++[o][F-]}
\xymatrix{%
*\txt{}&*\txt{}&*\txt{}&*\txt{}\\
*\txt{}\ar[r]&
\textit{N} \ar@(ur,ul)[rr]^{1,2,7,13,E}
\ar[u]^{5\tpar, 14}
\ar@(d,l)[]^{9\tign,10\tign}
\ar@/_3em/[ddrr]^(0.55){J}
\ar[dr]^(0.4){0}&*\txt{}
&\textit{M}
\ar[u]^-{5\tsp,14}\ar@/_.5em/[dd]_(0.7){J}
\ar@/_3em/[lldd]_(0.85){10}
\ar@(u,r)[]^{1,2,7,9\tign,13,E}
\ar@/_1ex/[dl]_0&*\txt{}\\
*\txt{}&*\txt{}&*+[F-]\txt{\mbox{制御綴読み取り}}
\ar@{-->}@/^1ex/[dl]\ar@{-->}@/_1ex/[ur]
\ar@{-->}@/^1ex/[rrr]
&*\txt{}&*\txt{}&\textit{T}
\ar@/^1ex/[lll]^(0.25){0}
\ar[llu]_{7,13,E}\ar[d]^-{5,14}\ar@/^1ex/[lld]^{1,2,J}
\ar@(u,r)[]^{9\tign,10\tign}
\\
*\txt{}&
\textit{S}\ar@/^.5em/[ur]^-(0.4){0}
\ar[d]^-{5,14}
\ar@(d,l)^{9\tign,10\tign}
\ar@(d,d)@/_3em/[rr]_{J}
\ar@/_3em/[uurr]_(0.3){1,2,7,13,E}&*\txt{}&
\textit{K}\ar[ul]^(0.3){0}\ar@/_.5em/[uu]_(0.3){7,13,E}
\ar@/^1.5em/[ll]^{10}
\ar@(d,r)[]_{1,2,9\tign,J}
\ar[d]_-{5,14}
&*\txt{}&*\txt{}\\
*\txt{}&*\txt{}&*\txt{}&*\txt{}
%
}
\]
\centering
\parbox{35zw}{%
``E''はカテゴリーコード3, 4, 6, 8, 11, 12の文字達を,``J''は和文文字を表す.\\
``$5\tpar$''のような下付き添字は「挿入するトークン」を表す.\\
但し,``$9\tign$'', ``$10\tign$''はその文字を無視することを示している.
}
\caption{\pTeX~4.0.0(既定)の入力プロセッサの状態遷移図}
\label{fig:ptex_input}
\end{figure}
% [TODO] カテゴリーコード 19 を図に入れていない
先に述べた通りであるが,\pTeX の入力プロセッサは\TeX82のそれを拡張したものになっている.
\autoref{fig:ptex_input}は\emph{\pTeX~4.0.0既定時}における入力プロセッサの状態遷移図である.
\TeX82から拡張された点,および説明が必要な点を以下に述べる.
\begin{description}
\item[内部状態の追加] \TeX82では状態\textit{N} (new line),状態\textit{M} (middle of line),
状態\textit{S} (skipping spaces)という3状態であったが,\pTeX では
次の2状態が追加された:
\begin{description}
\item[状態\textit{K}] 和文文字の直後.状態\textit{M}との差異は改行でスペースを出力しないこと.
\item[状態\textit{T}] 和文文字で終わるコントロールワードの直後.
状態\textit{S}との差異はグループ開始・終了(|{|, |}|)での遷移先が
状態\textit{M}でなく状態\textit{K}であること.
\end{description}
\item[「制御綴読み取り」後の状態] 以下のように決まっている:
\begin{itemize}
\item 制御綴が「|\ |」のようなカテゴリーコード10の文字
からなるコントロールシンボルのときは状態$S$に遷移する.
\item 制御綴が「|\#|」「|\】|」のようなその他のコントロールシンボルのときは状態$M$に遷移する.
\item 制御綴がコントロールワードのときは,
その名称の末尾の文字が欧文文字のときは状態$S$に,和文文字のときは状態$T$に遷移する.
\end{itemize}
\end{description}
図を見れば分かる通り,(欧文文字直後の改行は空白文字扱いされるのと対照的に)
\emph{和文文字直後の改行は何も発生しない}.
これは,日本語の原稿内では自由な箇所で改行が行えたほうが便利なためである.
% jtexdoc.tex に記載あり
実際には以下に説明する\.{ptexlineendmode}プリミティブによって,\pTeX の入力プロセッサの挙動は
ある程度ユーザが制御できる.
\begin{cslist}
\csitem[\.{ptexlineendmode}=<0--7>]
\pTeX の入力プロセッサの挙動を制御する.この値を2進法で$zyx$と表したとき
\footnote{%
つまり$x$は「一の位」,$y$は「二の位」,$z$は「四の位」である.
8以上の値を指定した場合は,下位3~bitの値が使われる.
負数を指定してもエラーは発生しないが,その場合の動作は未定義である.
},$x$,~$y$,~$z$の値は,それぞれ以下のような状態で行が終わった場合,
改行が空白文字を発生させるかを制御する.
いずれも0では「空白文字を発生させない」,1では「空白文字を発生させる」.
\begin{description}
\item[$x$] 和文文字で終わるコントロールワードの直後にグループ開始・終了が1つ以上
\footnote{%
\pTeX では,このとき「改行が何も発生させない」挙動を伝統的にとってきた
(\TeX82からの改造量を減らしたかったのであろう).
この挙動の是非が\.{ptexlineendmode}実装の一要因となった.
}
\item[$y$] 和文文字からなるコントロールシンボルの直後
\item[$z$] (コントロールワード・コントロールシンボルの名称の一部でない)
和文文字の直後にグループ開始・終了が1つ以上