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
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
|
%#!make eptexdoc.pdf
\documentclass[a4paper,11pt,nomag]{jsarticle}
\usepackage[bold,deluxe]{otf}
\input fam256p.tex
\usepackage[textwidth=42zw,lines=40,truedimen,centering]{geometry}
%%%%%%%%%%%%%%%%
% additional packages
\usepackage{amsmath}
\usepackage{mathtools,amssymb,comment}
\usepackage[dvipdfmx]{graphicx}
\usepackage[T1]{fontenc}
\usepackage{booktabs,enumitem,multicol}
\usepackage{lmodern}
\usepackage[dvipdfmx,hyperfootnotes=false]{hyperref}
\usepackage{pxjahyper}
\usepackage{hologo}
\usepackage{makeidx}\makeindex
% common
\usepackage{ptex-manual}
%%%%%%%%%%%%%%%%
\def\delbit#1#2{\underbracket[0.4pt]{#1}_{\text{#2}}}
\usepackage{shortvrb}
\MakeShortVerb*{|}
%%%%%%%%%%%%%%%%
% logos
\newcommand{\OMEGA}{\texorpdfstring{$\Omega$}{Ω}}
\protected\def\epTeX{$\varepsilon$\nobreakdash-\pTeX}
\protected\def\eupTeX{$\varepsilon$\nobreakdash-\upTeX}
\protected\def\eTeX{$\varepsilon$\nobreakdash-\TeX}
\def\upTeX{u\pTeX}\def\pTeX{p\kern-.15em\TeX}
\def\NTS{\leavevmode\hbox{$\cal N\kern-0.35em\lower0.5ex\hbox{$\cal T$}%
\kern-0.2emS$}\,}
\def\TeXXeT{\TeX-\reflectbox{\bfseries\TeX-}}
\makeatletter
{\lccode`\!=`\_
\lowercase{%
\protected\gdef\_{\ifdefstrequal{\f@family}{\ttdefault}{!}%
{\leavevmode\vrule width .45em height -.2ex depth .3ex\relax}%
}}
}
\makeatother
\clubpenalty=8000 \widowpenalty=8000
\frenchspacing
\begin{document}
\title{\emph{\epTeX について}}
\author{北川 弘典\null
\thanks{\url{http://osdn.jp/projects/eptex/wiki/},\
e-mail: \texttt{h\_kitagawa2001(at)yahoo.co.jp}}}
\date{version \the\epTeXversion,\today}
\maketitle
\tableofcontents
\newpage
\section{はじめに}
\epTeX は,東京大学理学部数学科3年生対象の2007年度の授業「計算数学II」
\footnote{\url{http://ks.ms.u-tokyo.ac.jp/}.}において北川が作成したプログ
ラムである.もともとは\pTeX~3.1.10を基盤として,\eTeX~2.2相当の機能や
10進21桁の浮動小数点演算を追加したものであったが,今では次の点が変わっている.
\begin{itemize}
\item \TeX~Live~2011に取り込まれるにあたり,
\eTeX をベースにして,その上に\pTeX 拡張やその他追加機能を載せる方針へと
変更された.
\item 浮動小数点演算の機能は\epTeX~090927から削除されている
\footnote{%
\TeX ソース中で浮動小数点演算を行う手段としては,例えば\LaTeX3の
機能(\Pkg{l3fp})や,\Pkg{xint}パッケージバンドルがあるので,
そちらを利用して欲しい.}.
\end{itemize}
製作の動機や作業過程などについては,詳しくは\cite{h7k}を参照して欲しいけ
れども,大雑把に言うと,動機は以下のように要約できる.
\begin{itemize}
\item \pTeX は,\TeX が持っている「レジスタ1種類につき256個まで」という
制限をひきずっており,現状でも非常に多数のパッケージを読み込ませた
りすると制限にぶち当たってしまう.
\item 一方,\eTeX 拡張ではこれが「レジスタ1種類につき32768個まで」と緩和
されており,欧文で標準となっている\hologo{pdfTeX}やその後継の\hologo{LuaTeX},
及び\hologo{XeTeX}でも
\eTeX の機能が取り込まれている.
\item そうすると,\pTeX だけが制限をレジスタ制限を引きずっているのは世界
から取り残されることになるのではないか.
\end{itemize}
\section{\eTeX 拡張について}
前に述べたように,\eTeX は\TeX の拡張の一つである.\eTeX のマニュアル
\cite{etexman}には,開発目的が以下のように述べられている.
\begin{quotation}
The \NTS\ project intends to develop an `New Typesetting System' (\NTS)
that will eventually replace today's \TeX3. The \NTS\ program will
include many features missing in \TeX, but there will also exist a mode
of operation that is 100\% compatible with \TeX3. It will, necessarily,
require quite some time to develop \NTS\ to maturity and make it widely
available.
Meanwhile \eTeX\ intends to fill the gap between \TeX3 and the future
\NTS. It consists of a series of features extending the capabilities of
\TeX3.
\end{quotation}
\NTS がどうなったのか僕は知らない.しかし,少なくとも\eTeX 拡張自体は実用
的な物であり,そのせいか$\aleph$~(Aleph), \hologo{pdfTeX}, \hologo{XeTeX}などの他の拡張
にもマージされており,ほとんどの人が\eTeX 拡張を使うことができるようになっ
ている\footnote{\LaTeXe~2017-01-01からは,\LaTeXe のフォーマット作成段階から
\eTeX 拡張が必須となった(\cite{l2e26}).}.
\eTeX 拡張で追加される機能について,詳しくは\cite{etexman}を参照して欲し
いが,\cite{h7k}中の4.2節「\eTeX の機能」から一部改変して引用する.
\begin{quotation}
\eTeX にはCompatibility modeとExtended modeの2つが存在し,前者では\eTeX
特有の拡張は無効になるのでつまらない.後者がおもしろい.
拡張機能を使うにはファイル名を渡すときに\texttt{*}をつけるか
コマンドラインオプションとして\texttt{-etex}スイッチをつければいい
が,\eTeX 拡張に関わる追加マクロは当然ながらそれだけで
は駄目である.「plainマクロ for \eTeX」(\texttt{etex.fmt}というのが一番マシ
かな)では自動的に追加マクロである\texttt{etex.src}が呼ばれる.\LaTeX 下では
ちょうど\texttt{etex.src}に対応した\Pkg{etex}パッケージを読み込む必要がある.
\paragraph{レジスタの増加}
最初に述べたように,\TeX では6種類のレジスタが各256個ずつ利用できる.それ
ぞれのレジスタには\.{dimen75}などのように0--255の番号で指定できる
他,予め別名の定義をしておけばそれによって指定することもできる.これらの
いくつかは特殊な用途に用いられる(例えば\.{count0}はページ番号などの
ように)ことになっているので,さらにuser が使えるレジスタは減少する.
\eTeX では,追加のレジスタとして番号で言うと256--32767が使用できるよ
うになった.上のpdfによると最初の0--255と違って若干の制限はあるようだ
が,それは些細な話である.追加された(各種類あたり)$32768-256=32512$個の
レジスタは,メモリの効率を重視するためsparse registerとして,つまり,必要
な時に始めてツリー構造の中で確保されるようになっている.
\paragraph{式が使用可能に}
\TeX における数量の計算は充実しているとは言い難い.例えば,
\[
\hbox{|\dimen123|}\leftarrow\frac12(\hbox{|\dimen42|}+\hbox{|\@tempdima|})
\]
という計算を元々の\TeX で書こうとすると,
\begin{verbatim}
\dimen123=\dimen42
\advance\dimen123by\@tempdima
\dimen123=0.5\@tempdima
\end{verbatim}
のように書かないといけない.代入,加算代入,乗算代入,除算代入ぐらいしか
演算が用意されていない状態になっている(上のコードのように,$d_2\mathrel{+\!\!=}
0.8 d_1$というような定数倍を冠することは平気).
\eTeX では,そのレジスタの演算に,他のプログラミング言語で使われているよ
うな数式の表現が使えるようになった.上のPDFでは実例として
\begin{verbatim}
\ifdim \dimexpr (2pt-5pt)*\numexpr 3-3*13/5\relax + 34pt/2<\wd20
\end{verbatim}
が書かれている.これは,\def\mpt{\,\mathrm{pt}}
{\catcode`\<12\[
32\mpt=(2\mpt-5\mpt)\left(3-\mathop{\mathrm{div}}(3\cdot 13,5)\right)
+\frac{34\mpt}{2}<\text{{\tt \char'134 box20}の幅}
\]}
が真か偽かを判定していることになる.
\paragraph{\.{middle} primitive}
\TeX に\.{left}, \.{right}というprimitiveがあり,それを使えば括
弧の大きさが自動調整されるのはよく知られている.\eTeX では,
さらに\.{middle}\indcs{middle}\ primitiveが追加された.
具体例を述べる.
{\catcode`\|12
\def\set#1#2{\setbox0=\hbox{$\displaystyle #1,#2$}%
\left\{\, \vphantom{\copy0}#1 \,\right|\!\left.\, \vphantom{\copy0}#2 \,\right\}}
\def\eset#1#2{\left\{\, #1 \,\middle|\, #2 \,\right\}}
\[ \set{n+\frac12}{n\in \omega} \eset{n+\frac12}{n\in \omega} \]}
これは以下のsourceで出力したものである:
{\narrowbaselines
\begin{verbatim}
\def\set#1#2{\setbox0=\hbox{$\displaystyle #1,#2$}%
\left\{\, \vphantom{\copy0}#1 \,\right|\!\left.\, %
\vphantom{\copy0}#2 \,\right\}}
\def\eset#1#2{\left\{\, #1 \,\middle|\, #2 \,\right\}}
\[ \set{n+\frac12}{n\in \omega} \eset{n+\frac12}{n\in \omega} \]
\end{verbatim}}
両方とも集合の表記を行うコマンドである.\TeX 流の\.{set}では2つの
\.{left}, \.{right}の組で実現させなければならず,そのために{\catcode`\|=12$|$}の
左側と右側に入る式の最大寸法を測定するという面倒な方法を使っている.その
上,この定義では\.{textstyle}以下の数式(文中数式とか)ではそのま
ま使えず,それにも対応させようとすると面倒になる.一方,\eTeX 流の
\.{eset}では,何も考えずに
\.{left}, \.{middle}, \.{right}だけで実現できる.
\paragraph{\TeXXeT\ \textmd{(\texttt{TeX-{}-XeT})}}
left-to-rightとright-to-leftを混植できるという機能であるらしい.
ヘブライ語あたりの組版に使えるらしいが,よく知らない.
ここでのRtoLはLtoRに組んだものを逆順にしているだけのような
気がする.
\medskip
とりあえず一目につきそうな拡張機能といったらこれぐらいだろうか.他にも
tracing機能や条件判断文の強化などあるが,そこら辺はパッとしないのでここ
で紹介するのは省略することにしよう.
\end{quotation}
\epTeX ではここに述べた代表的な機能を含め,ほとんどすべての機能を実装して
いるつもりである
\footnote{%
さらに,レジスタの個数については,各種類65536個まで使えるようになっている(次節参照).
}.ただ,\TeXXeT を和文で使うと約物
の位置がずれたり空白がおかしかったりするけれども,そこの修正は大変に思え
るし,苦労して実装する意味があるのか疑問なので放置している.
以下,\eTeX 拡張を\pTeX 拡張とマージするにあたって調整した箇所を述べる.
\begin{cslist}
\csitem[\.{lastnodetype} (read-only integer)]
\pTeX 拡張では,\TeX と比較して\node{dir\_node}と\node{disp\_node}という2種類のノードが
追加された.前者は,現在のリストの中に違う組方向のboxを挿入する際に寸法を補正するために作られ,
\.{hbox}や\.{vbox}のコンテナとなっている.
また後者は,欧文文字のベースライン補正のために使われる.
\epTeX~110102まではこれらのノードも\.{lastnodetype}の値として出力させるようにした.
しかし,両者ともに\epTeX が自動的に挿入する(ユーザーが意識する必要はない)ノードであることから,
\epTeX~110227以降では\node{dir\_node}と\node{disp\_node}は
\.{lastnodetype}の対象とする「最後のノード」とはならないようにしている
\footnote{%
最後のノードが\node{dir\_node}であった場合,\.{lastnodetype}はそのノードが格納している
\node{hlist\_node}か\node{vlist\_node}の種類を返す.
}.\\
\parbox{.9\linewidth}{%
\begin{multilist}{3}{\hfil\hskip1.5zw#:&\quad#\qquad\hfil}
\item $-1$&none (empty list)\cr\item 0&char node\cr\item 1&hlist node\cr
\item 2&vlist node\cr\item 3&rule node\cr\item 4&ins node\cr
\item 5&mark node\cr\item 6&adjust node\cr\item 7&ligature node\cr
\item 8&disc node\cr\item 9&whatsit node\cr\item 10&math node\cr
\item 11&glue node\cr\item 12&kern node\cr\item 13&penalty node\cr
\item 14&unset node\cr\item 15&math mode nodes\cr
\end{multilist}}
\csitem[\.{currentiftype} (read-only integer)]
\ifnum\epTeXversion>190131 %%%%% TL2019-hack
条件判断文とそれを表す数字との対応は以下のようになっている
(\epTeX~190709以降).
21,~22は\hologo{pdfTeX}由来の条件判断文(後述),
23--30が,\pTeX 拡張で追加された条件判断文に対応する.\\
\parbox{.9\linewidth}{%
\begin{multilist}{3}{\hfil\hskip1.5zw#:&\quad#\qquad\hfil}
\item 1&\.{if}\cr\item 2&\.{ifcat}\cr\item 3&\.{ifnum}\cr\item 4&\.{ifdim}\cr
\item 5&\.{ifodd}\cr\item 6&\.{ifvmode}\cr\item 7&\.{ifhmode}\cr
\item 8&\.{ifmmode}\cr\item 9&\.{ifinner}\cr\item 10&\.{ifvoid}\cr
\item 11&\.{ifhbox}\cr\item 12&\.{ifvbox}\cr\item 13&\.{ifx}\cr
\item 14&\.{ifeof}\cr\item 15&\.{iftrue}\cr\item 16&\.{iffalse}\cr
\item 17&\.{ifcase}\cr\item 18&\.{ifdefined}\cr\item 19&\.{ifcsname}\cr
\item 20&\.{iffontchar}\cr\item \bf 21&\.{ifincsname}\cr\item \bf 22&\.{ifpdfprimtive}\cr
\item \bf 23&\.{iftdir}\cr\item \bf 24&\.{ifydir}\cr
\item \bf 25&\.{ifddir}\cr\item \bf 26&\.{ifmdir}\cr\item \bf 27&\.{iftbox}\cr
\item \bf 28&\.{ifybox}\cr\item \bf 29&\.{ifdbox}\cr\item \bf 30&\.{ifmbox}\cr
\end{multilist}}
\else %%%%% TL2019-hack
条件判断文とそれを表す数字との対応は以下のようになっている
(\epTeX~190131まで;\epTeX~190709以降は\.{ifincsname}プリミティブ追加により変化するので注意).
21--28が,\pTeX 拡張で追加された条件判断文に対応する.
29の\.{ifpdfprimitive}は\hologo{pdfTeX}由来のプリミティブ(後述)である.\\
\parbox{.9\linewidth}{%
\begin{multilist}{3}{\hfil\hskip1.5zw#:&\quad#\qquad\hfil}
\item 1&\.{if}\cr\item 2&\.{ifcat}\cr\item 3&\.{ifnum}\cr\item 4&\.{ifdim}\cr
\item 5&\.{ifodd}\cr\item 6&\.{ifvmode}\cr\item 7&\.{ifhmode}\cr
\item 8&\.{ifmmode}\cr\item 9&\.{ifinner}\cr\item 10&\.{ifvoid}\cr
\item 11&\.{ifhbox}\cr\item 12&\.{ifvbox}\cr\item 13&\.{ifx}\cr
\item 14&\.{ifeof}\cr\item 15&\.{iftrue}\cr\item 16&\.{iffalse}\cr
\item 17&\.{ifcase}\cr\item 18&\.{ifdefined}\cr\item 19&\.{ifcsname}\cr
\item 20&\.{iffontchar}\cr\item \bf 21&\.{iftdir}\cr\item \bf 22&\.{ifydir}\cr
\item \bf 23&\.{ifddir}\cr\item \bf 24&\.{ifmdir}\cr\item \bf 25&\.{iftbox}\cr
\item \bf 26&\.{ifybox}\cr\item \bf 27&\.{ifdbox}\cr\item \bf 28&\.{ifmbox}\cr
\item \bf 29&\.{ifpdfprimtive}\cr
\end{multilist}}
\fi %%%%% TL2019-hack
\ifnum\epTeXversion>190131 %%%%% TL2019-hack
\csitem[\.{fontcharwd}, \.{fontcharht}, \.{fontchardp}, \.{fontcharic}]
欧文フォントと和文フォントを判別し,それに応じて処理が分かれる.
それに伴い,許容される引数範囲と意味が異なることに注意
(\epTeX~190709以降).
以下,|??|は|wd|, |ht|, |dp|, |ic|のいずれかを表す.
\begin{itemize}
\item 和文フォントの場合: \.{fontchar??} <Japanese font> <number>\\
<Japanese font>を$f$,<number>を$c$とおくと,
\begin{itemize}
\item $c \geq 0$の場合は,$c$を\emph{文字コード}とみなす.
$c$が和文文字コードとして有効であれば,
和文フォント$f$における文字コード$c$の和文文字の寸法値を返す.
和文文字コードとして無効であれば|0pt|を返す.
\item $c < 0$の場合は,$-(c+1)$を\emph{文字タイプ}とみなす.
和文フォント$f$に文字タイプ$-(c+1)$が定義されていればその寸法値を返し,
未定義であれば|0pt|を返す.
\end{itemize}
\item 欧文フォントの場合: \.{fontchar??} <font> <8-bit number>\\
オリジナルの\eTeX と同じ挙動である.すなわち,
引数に$c \geq 256$や$c < 0$を与えると
\verb+! Bad character code (256).+
のようにエラーが出る.
\end{itemize}
\csitem[\.{iffontchar} <font> <number>]
\begin{itemize}
\item 和文フォントの場合: \.{iffontchar} <Japanese font> <number>\\
<Japanese font>を$f$,<number>を$c$とおくと,
\begin{itemize}
\item $c \geq 0$の場合は$c$を\emph{文字コード}とみなし,
$c$が和文文字コードとして有効かどうかを判定する
\footnote{\pTeX では「任意の和文フォントには,和文文字コードとして有効な
全ての文字が存在する」という扱いであるため,和文フォント$f$によらない.}.
\item $c < 0$の場合は$-(c+1)$を\emph{文字タイプ}とみなし,
和文フォント$f$に文字タイプ$-(c+1)$が定義されているかどうかを判定する.
\end{itemize}
\item 欧文フォントの場合: \.{iffontchar} <font> <8-bit number>\\
オリジナルの\eTeX と同じ挙動である.すなわち,
引数に$c \geq 256$や$c < 0$を与えると
\verb+! Bad character code (256).+
のようにエラーが出る.
\end{itemize}
\fi %%%%% TL2019-hack
\end{cslist}
\ifnum\epTeXversion>190131 %%%%% TL2019-hack
\begin{dangerous}
上記で「和文文字コードとして有効かどうか」は,関数|is_char_kanji|を参照.
この関数は内部コードによって異なるため,マクロで実装するのは面倒であるが,
\epTeX~190709以降では\.{iffontchar}で容易に実現できる.
なお,\upTeX では任意の非負の値が和文文字コードとして有効なため,
|is_char_kanji|は非負かどうかの判定になっている.
\end{dangerous}
\fi %%%%% TL2019-hack
\section{\OMEGA 由来の機能(旧名称:\texttt{FAM256}パッチ)}
\epTeX には,掲示板\TeX\ Q\ \&\ Aの山本氏の書き込み
\cite{yamamoto}に刺激されて作った,本節でに説明する\OMEGA の一部
機能を使えるようにするパッチが存在する.
これは\texttt{FAM256}パッチと呼ばれ,今までは
「\epTeX 本体とは一応別扱いで,\epTeX の配布,及び
W32\TeX, \TeX~Liveのバイナリでは標準で有効になっていただけ」という扱いであったが,
それでは利用者が混乱するので
\emph{「\texttt{FAM256}パッチは\epTeX~160201以降からは切り離さない」}
とここで宣言する.
本ドキュメントの最後のページ\footnote{ただし,ソースファイルで言えば{\tt
fam256d.tex}(本文)と\texttt{fam256p.tex}(preamble部)に対応する.}にちょっ
としたサンプルを載せてある.
本節で述べる追加機能は extendend modeでなくても有効になっている.
ただし,後に説明する「レジスタが各種類65536個まで」は,
extended modeの時に限り有効になる.
\paragraph{数式フォント制限の緩和}
\OMEGA の大きな特徴としては,\TeX 内部のデータ構造を改変し
\footnote{詳しくは\texttt{texk/web2c/texmfmem.h}中の共用体%
\texttt{memoryword}の定義を参照.大雑把に言うと,
1つの「メモリ要素」に2つの32\,bit整数を同時に格納できるようになっている.
なお,少なくともtetex3以降では\texttt{memoryword}は8バイトであるが,
\TeX 82では1つの「メモリ要素」を2つの32\,bit整数として使うことはしていない.
% [TODO] 正確には "big TeX" からだが,
% ・big TeX はいつからあるのか? ・それが標準になったのはいつから?
},
\TeX に従来から存在していたいくつかの「256個制限」を$2^{16}$個にまで緩和したことが挙げられる.
同様に,\OMEGA では(\cite{yamamoto}にもあるように)数式フォントを
同時に256個まで用いることができ,各フォントも65536文字まで許されるようになっている.
\medskip
\epTeX では,中途半端だが,数式フォント1つあたり
の使用可能文字数は256個のままで,同時に数式フォントを256個まで使えるよう
にしている.基本的には\OMEGA と同様の方法を用いているが,
内部でのデータ構造に違いがある(数字はすべてbit幅):
\begin{center}
\small\baselineskip=1.5zw
\begin{tabular}{crrrrr}%
\toprule
&category&family&char&\multicolumn{1}{c}{math code}
&\multicolumn{1}{c}{delimiter code}\\\midrule
\TeX82&3&4&8 &$3+4+8=15$ &$3+\delbit{4+8}{small}+\delbit{4+8}{large}=27$\\
\OMEGA&3&8&16&$3+8+16=27$&$(3+\delbit{8+16}{small},\delbit{8+16}{large})=(27,24)$\\
\epTeX&3&8&8 &$3+8+8=21$&$(3+\delbit{8+8}{small},\delbit{8+8}{large})=(19,16)$\\\bottomrule
\end{tabular}
\end{center}
\def\bits#1{<\textup{#1}-bit\ number>}
\TeX に本来あったプリミティブは互換性維持のために同じ動作とする必要があるので,
16番から255番のフォントを利用する際には別のプリミティブが必要となる.(実装自
体に\OMEGA の流儀を使っているから)
ここでは,\OMEGA のプリミティブ名を流用することにした.
すなわち,以下のプリミティブが追加されている\footnote{\OMEGA では\bits{8}のところが\bits{16}に
なっている.}.
\begin{cslist}[itemsep=\dimexpr-\baselineskip+\medskipamount]
\csitem[\.{omathcode} \bits{8}\texttt{=}\bits{27}]\
\csitem[\.{omathcode} \bits{8}]\
\csitem[\.{omathchar} \bits{27}]\
\csitem[\.{omathaccent} \bits{27}]\
\csitem[\.{omathchardef} <control sequence>\texttt{=}\bits{27}]\
\csitem[\.{odelcode} \bits{8}\texttt{=}\bits{27}\ \bits{24}]\
\csitem[\.{odelimiter} \bits{27}\ \bits{24}]\
\csitem[\.{oradical} \bits{27}\ \bits{24}]\
\end{cslist}
\vspace{-\baselineskip}
ここで,27\,bitとか24\,bitの自然数の意味については,上の表の
\OMEGA の行を参照して欲しい.上に書いた内部のデータ構造から推測できる通り,
\.{omathchar}等のcharacter codeの指定に使われる16\,bitの数値のうち
実際に使われるのは下位8\,bitであり,上位8\,bitは無視される.
例えば,|\omathchar"4012345|と|\omathchar"4010045|は同義である.
なお,|\mathcode|~\bits 8としてmath code値を取得できる文字はファミリ番号が16未満のもの
(すなわち,\TeX82における|\mathcode|格納値の形式に当てはまるもの)に限られる.
delimiter codeについても同様である.
さらに,|\odelcode|~\bits 8として51\,bitの形式のdelimiter codeを取得することはできない
($-1$が返る).
\medskip
\LaTeX において数式フォントを同時に16個以上使うには,|\omathchar|%
などのプリミティブに対応したマクロを使う必要がある.
最近の\pLaTeX(2016/11/29以降)はこれを部分的にサポートしていて,
\emph{\.{DeclareMathAlphabet}で使うことのできる数式用アルファベットの
上限だけは}256個に拡張されている.
% もちろんこれには最近の\LaTeX(2015/01/01以降)が必要である.
% また,少し前(2016/09/08以前)の\pLaTeX であれば
% \begin{verbatim}
% \makeatletter
% \mathchardef\e@mathgroup@top=256
% \makeatother
% \end{verbatim}
% をプリアンブルに記述する必要があった.
だが,これだけでは記号類の定義に用いられる
|\DeclareMathSymbol|や|\DeclareMathDelimiter|が|\omathchar|や
|\odelcode|を使用しないので不十分である.
実験的と書かれてはいるが,
山本氏による「最低限のパッケージ」\cite{yamamoto3},またはこれを
最新の\LaTeX に追随してまとめ直された\Pkg{mathfam256}パッケージ
\footnote{\url{https://ctan.org/pkg/mathfam256}.}を
使うのが手っ取り早いような気がする.
\paragraph{無限のレベル}
\TeX では,glueの伸縮量に\texttt{fil}, \texttt{fill}, \texttt{filll}
という3つの無限大のレベルが存在し,\texttt{l}が多いほど無限大のオーダーが高くなっていた.
\OMEGA では,「inter-letter spacingのために」\texttt{fi}\index{fi=\texttt{fi}}という,
有限と\texttt{fil}の中間にあたる無限大のレベルが付け加えられた.そこで,この無限大レベル
\texttt{fi}も採用することにした.
\medskip
実装方法は,大まかには\OMEGA で\texttt{fi}の実装を行っているchange file\
\texttt{omfi.ch}の通りであるのだが,これに\pTeX や\eTeX に伴う少々の修正を行っている.
\begin{itemize}
\item プリミティブ|\pagefistretch|\indcs{pagefistretch},
|\hfi|\indcs{hfi}, |\vfi|\indcs{vfi}を新たに定義している
\footnote{%
|\hfi|, |\vfi|については\cite{omegaman}に記述があるが,
\TeX~Liveに収録されている$\aleph$(\OMEGA は\TeX~Liveに収録されていない)では
実装されていない.|\pagefistretch|を実装したのは北川の完全な勘違いである.
}.
\item |\gluestretchorder|\indcs{gluestretchorder},
|\glueshrinkorder|\indcs{glueshrinkorder}の動作を\eTeX のそれと合わせた.
具体的には,あるglue~|\someglue|の伸び量を<stretch>とおくとき,
\[
\hbox{|\gluestretchorder\someglue|}=
\begin{cases}
0&<stretch>\text{が高々\texttt{fi}レベルの量}\\
1&<stretch>\text{がちょうど\texttt{fil}レベルの無限量}\\
2&<stretch>\text{がちょうど\texttt{fill}レベルの無限量}\\
3&<stretch>\text{がちょうど\texttt{filll}レベルの無限量}
\end{cases}
\]
となっている.内部では\texttt{fi}レベルが1,\texttt{fil}レベルが2,……として
処理している.
\end{itemize}
\paragraph{レジスタについて}
\OMEGA では(前にも書いたが)データ構造の変更が行われ,それによってレジスタが
各種類あたり0番から65535番までの65536個を使えるようになっている.
一方,\eTeX では,256番以降のレジスタを専用のsparse treeに格納することにより,
32767番までのレジスタの使用を可能にしていた.このツリー構造を分析してみる
と,65536個までレジスタを拡張するのはさほど難しくないことが分かった.
そこで,\epTeX では\eTeX 流の方法を用いながらも,
ツリーの階層を1つ増やして,レジスタ(count, dimen, skip, muskip, box, token)を
\OMEGA と同じように0番から65535番までの65536個を使えるようにした.
同様に,マーク(mark)のクラス数も32768個から65536個まで増やしている.
\section{\hologo{pdfTeX}由来の機能}
開発中の\LaTeX 3では,\eTeX 拡張の他に,\hologo{pdfTeX}で導入された
プリミティブ\.{pdfstrcmp}(またはその同等品%
\footnote{\hologo{XeTeX}では\.{strcmp}という名称で,
\hologo{LuaTeX}ではLuaを用いて実装されている.})%
が必要となっており,もはや純粋な\eTeX ですら
\LaTeX 3を利用することはできない状況である (\cite{expl31,expl32,expl33}).
その他にも,\hologo{pdfTeX}由来のいくつかのプリミティブ(\cite{pdftexman})の実装が
日本の\TeX ユーザからあり,
ほとんど\hologo{pdfTeX}における実装をそのまま真似する形で実装している.
現在の\epTeX で利用できる\hologo{pdfTeX}由来のプリミティブの一覧を以下に示す.
これらはextended modeでないと利用できない.
\begin{cslist}
\csitem [\.{pdfstrcmp} <general text> <general text>]
2つの引数を文字列化したものを先頭バイトから比較し,
結果を$-1$(第1引数の方が先),0(等しい),1(第2引数の方が先)として文字列で返す.
比較する文字列中に和文文字がある場合には,(\epTeX の内部漢字コードにかかわらず)
UTF-8で符号化して比較する.
そのため,例えば
\begin{verbatim}
\pdfstrcmp{あ}{^^e3^^81^^83} % 「あ」はUTF-8でE38182
\end{verbatim}
の実行結果は
{\ifdefined\UseRawInputEncoding\UseRawInputEncoding\fi
$\pdfstrcmp{あ}{^^e3^^81^^83}$}%
である\footnote{%
\LaTeX~2018-04-01以降では標準でUTF-8入力となった(|\usepackage[utf8]{inputenc}|が自動
で行われていることに相当する)関係上,本文に述べた入力例を実行する際には
|\UseRawInputEncoding|の実行が必要になる.
}.
\csitem[\.{pdfpagewidth}, \.{pdfpageheight} (dimension)]
ページの「幅」「高さ」を表す内部長さであるが,
\emph{ここで言う「幅」は「字送り方向」のことではなく,物理的な意味である}.
この2つの内部長さを設定するだけではdviに何の影響も与えない.
後で述べる\.{pdflastxpos}, \.{pdflastypos}による出力位置の取得
の際の原点位置を設定するためだけに使われ,初期値は0である.
\csitem[\.{readpapersizespecial} (integer)]
\pTeX 系列では,
用紙サイズの指定には伝統的にpapersize specialが利用されてきた.それを考慮して,
本内部整数\.{readpapersizespecial}(既定値は1)が正の場合は
papersize specialがdvi中に書き出される時,\epTeX にはその内容を解釈して
自動的に\.{pdfpagewidth}, \.{pdfpageheight}の値を設定する
\footnote{%
papersize specialで指定した長さは常に\texttt{true}付きで解釈するのが慣習と
なっているが,\epTeX~180901より前では\texttt{true}なしの寸法として解釈するという
バグが存在した.}%
\footnote{%
dviwareによって正確な書式は異なるようだが,\epTeX~180901が解釈するpapersize specialは
以下の文法に沿ったものになっている:
\def\<#1>{\langle\mbox{#1}\rangle}
\begin{align*}
\<special> &\longrightarrow \texttt{papersize=}\<length>\texttt{,}\<length>\\
\<length> &\longrightarrow \<decimal>
\<optional~\texttt{true}>\<physical unit>\\
\<decimal> &\longrightarrow \texttt{.} \mid \<digit>\<decimal> \mid
\<decimal>\<digit>
\end{align*}
負の符号や小数点としての「\texttt{,}」,そして一切の空白を許容しないところに
注目してほしい.また,\texttt{zw},~\texttt{zh},~\texttt{em},~\texttt{ex}という
現在のフォントに依存する単位も使用不可能である.
}.
このプリミティブは\epTeX~180901で追加された.それより前のバージョンでは
前段落で述べた機能は常に有効であった.
\csitem[\.{pdflastxpos}, \.{pdflastypos} (read-only integer)]
\.{pdfsavepos}\indcs{pdfsavepos}が置かれた場所の,dviにおける出力位置を返す内部整数.
原点はページの(物理的な意味の)左下隅であり,$y$軸は(物理的な)上方向に向かって増加する.
\begin{itemize}
\item ページの物理的な幅と高さはすぐ上の\.{pdfpagewidth}, \.{pdfpageheight}で設定する.
これらの内部長さが0であった場合は,\.{shipout}されたボックスの寸法と
\.{hoffset}(または\.{voffset})の値から自動的に計算される.
\item \pTeX では横組・縦組と組方向が複数あるので,\.{pdflastxpos}, \.{pdflastypos}の値の座標系を
「物理的な」向きとすべきか,それとも「組方向に応じた」向きとすべきかは悩みどころである.
\epTeX~110227以降,現在までのバージョンでは上記のように物理的な向きとしている.
\item \.{mag}を用いてページの拡大縮小を行い,かつ
dvipsやdvipdfmxを用いてPostScript,~pdfを生成した場合,\.{pdflast\{x,y\}pos}の原点は
ページの左下隅から左・上方向にそれぞれ$1\,\mathrm{in}-1\,\mathrm{truein}$%
移動したところになる
\footnote{これは\hologo{pdfTeX}のdviモードや\hologo{XeTeX}と同じ挙動である.}.
\end{itemize}
\csitem[\.{pdfcreationdate}]
エンジン起動時の時刻を,\texttt{\pdfcreationdate}の形式で表した文字列に展開する.
末尾に|+09'00'|などと表示されるのはローカルのタイムゾーンであるが,
例えば|SOURCE_DATE_EPOCH=1000000000|のように環境変数を設定すると
|D:20010909014640Z|のようにタイムゾーンは|Z|と表示される.
% [TODO] |FORCE_SOURCE_DATE|が0か1かは関係する?
% https://tug.org/pipermail/tex-live/2018-November/042575.html
\epTeX においてプリミティブを実装した当初は「最初にこのプリミティブが実行された時刻を…」と
していたが,\epTeX~161030から\hologo{pdfTeX}と同じ挙動に修正した.
これは\Pkg{standalone}パッケージを\epTeX で扱うために2013/06/05に実装されたプリミティブであるが,
現在時刻の「秒」まで得るためにも使用できる(\TeX 82では分単位でしか取得できない).
\csitem[\.{pdffilemoddate} <filename>, \.{pdffilesize} <filename>]
それぞれ<filename>の更新時刻(\.{pdfcreationdate}と同じ形式)と
ファイルサイズを表す文字列に展開する.
これらも\Pkg{standalone}パッケージのために\epTeX に実装されたプリミティブである.
\csitem[\.{pdffiledump} \textrm{[}\texttt{offset} <offset>\textrm{]}%
\ \texttt{length} <length> <filename>]
<filename>で与えられたファイル名の<offset>バイト目(先頭は0)から<length>バイトを読み込み,
16進表記(大文字)したものに展開される.
本プリミティブはHeiko Oberdiek氏による\Pkg{bmpsize}パッケージを\epTeX でも使うために
角藤さんが実装したものである(2014/05/06).
\csitem[\.{pdfshellescape} (read-only integer)]
\.{write18}によるshell-escapeが利用可能になっているかを示す内部整数.
0ならば不許可,1ならば許可,2ならばrestricted shell-escape%
\footnote{あらかじめ「安全」と認められたプログラム(\texttt{texmf.cnf}中で指定する)
のみ実行を許可する仕組み.}%
である.
本プリミティブは\TeX ユーザの集い2014でリクエストを受けて実装された(\cite{pdfse}).
\csitem[\.{pdfmdfivesum} {[\texttt{file}]} <general text>]
引数<general text>のMD5ハッシュ値か,あるいは\texttt{file}が指定された場合は
ファイル名が<general text>のファイルのMD5ハッシュ値を計算する.
前者の「引数のMD5ハッシュ値を計算する」場合には,\.{pdfstrcmp}と同じように
和文文字をUTF-8で符号化してから計算する.
このプリミティブは\cite{xe5}以降の議論を元に,角藤さんがリクエストしたもので,
2015/07/04に\epTeX に実装されている.
\csitem[\.{pdfpritimive} <control sequence>, \.{ifpdfprimitive} <control sequence>]
\.{pdfprimitive}は次に続く制御綴がプリミティブと同じ名称であった場合に,
プリミティブ本来の意味で実行させるものである.例えば
\begin{verbatim}
\pdfprimitive\par
\end{verbatim}
は,\.{par}が再定義されていようが,本来の\.{par}の意味(段落終了)となる.
また,\.{ifpdfprimitive}は,次に続く制御綴が同名のプリミティブの意味を持っていれば
真,そうでなければ偽となる条件判断文である.
これらのプリミティブは2015/07/15版の\Pkg{expl3}パッケージで使われた
(\cite{15715})ことを受けて実装されたものだが,
現在では\Pkg{expl3}パッケージではこれらのプリミティブは要求していない.
\csitem[\.{pdfuniformdeviate} <number>, \.{pdfnormaldeviate}]
\.{pdfuniformdeviate}は,0以上<number>未満の一様分布に従う乱数(整数値)を生成する.
\.{pdfnormaldeviate}は,平均値0,標準偏差65536の正規分布に従う乱数(整数値)を生成する.
\csitem[\.{pdfrandomseed} (read-only integer), \.{pdfsetrandomseed} <number>]
乱数生成の種の値は,\.{pdfrandomseed}で取得できる.
種の初期化にはシステムのマイクロ秒単位での現在時刻情報が使われる.また,種の値を
設定するには\.{pdfsetrandomseed}に引数として渡せば良い.
\LaTeX3の\Pkg{l3fp}において,2016/11/12あたりから実装された乱数生成機能(\cite{random})を
サポートするために\epTeX~161114から実装された.
\csitem[\.{pdfelapsedtime} (read-only integer), \.{pdfresettimer}]
\.{pdfelapsedtime}は,エンジン起動からの経過時間を``scaled seconds''すなわち
$1/65536$秒単位で返す.この値は\.{pdfresettimer}によって再び0にリセットできる.
すぐ上の乱数生成プリミティブと同時に実装された.
\csitem[\.{expanded} <general text>]
(\.{message}が行うのと同様に)<general text>を完全展開した結果のトークン列を返す.
この命令は元々は\hologo{pdfTeX}に実装計画があったそうである(\cite{expanded})が,
しばらくの間\hologo{LuaTeX}にのみ実装されていた命令であった.
しかし\cite{expanded1}をきっかけに,
\hologo{pdfTeX}, \epTeX, \hologo{XeTeX}で一斉に実装された.
\epTeX~180518以降で利用可能である.
\ifnum\epTeXversion>190131 %%%%% TL2019-hack
\csitem[\.{ifincsname}]
\texttt{\.{csname}~...~\.{endcsname}}内で評価されたちょうどその時に真となる.
\LaTeX~2019-10-01で行われる変更(\cite{latex95,tjb83})で必要になったために
\epTeX~190709で導入された.
\fi %%%%% TL2019
\end{cslist}
\section{バージョン番号}
\pTeX~p3.8.0に\.{ptexversion}が実装されたのと同時に,\epTeX でもバージョン番号を
取得する\.{epTeXversion}プリミティブが\epTeX~180121から追加された.
\begin{cslist}
\csitem[\.{epTeXversion} (read-only integer)]
\epTeX のバージョン番号(例えば\the\epTeXversion)を内部整数で返す.\epTeX 起動時のバナーでは
\eTeX, \pTeX のバージョン番号も表示されるので,それを再現しようとすると以下のようになる.
\begin{verbatim}
This is e-pTeX, Version 3.14159265-%
p\number\ptexversion.\number\ptexminorversion\ptexrevision-%
\number\epTeXversion-\number\eTeXversion\eTeXrevision ...
\end{verbatim}
\end{cslist}
\section{\.{lastnodechar}プリミティブ}
本プリミティブは
\TeX ユーザの集い2014でリクエストを受けて
実装された(\cite{pdfse})プリミティブで,\epTeX~141119以降のextended modeで利用可能である.
詳細な背景説明・仕様は\cite{lnc}に譲る.
\pTeX では
\begin{verbatim}
これは,\textmc{『ほげ党宣言』}の……
\end{verbatim}
という入力からは
\begin{quote}
これは,\textmc{『ほげ党宣言』}の……
\end{quote}
という出力が得られ,コンマと二重鍵括弧の間が全角空きになってしまうことが以前から知られている.
この現象は,(展開し続けた結果)「,」の直後のトークンが「『」ではないことによって,
「,」の後の半角空きと,「『」の前の半角空きが両方
入ってしまうという\pTeX の和文処理の仕様
\footnote{%
\TeX82 の欧文のカーニングや合字処理も同じような仕様になっている.
例えば\texttt{W\.{relax}\ oWo}からはW\relax oWoという出力になり,
Wとoの間のカーニングが\.{relax}によって挿入されなくなったことがわかる.
}による.
min10フォントメトリックで「ちょっと」を組むと「ょっ」の間が詰まるという不具合は有名であるが,
「|ちょ{}っと|」と空グループを挟むことで回避されるのも,同じ理由である.
\medskip
\.{lastnodechar}プリミティブは,
上で述べた「書体変更命令を間に挟むと和文間グルーが『まともに』ならない」という状況を
改善する助けになることを目指して実装された.
\begin{cslist}
\csitem[\.{lastnodechar} (read-only integer)]
現在構築中のリストの「最後のノード」が文字由来であれば,
そのコード番号(内部コード)を内部整数として返す.
上記「最後のノード」では,\pTeX によって自動挿入される
\begin{itemize}
\item JFMによって入るグルー
\item 行末禁則処理のために挿入されるペナルティ
\item 欧文文字のベースライン補正用のノード
\end{itemize}
は無視される.また,「最後のノード」が欧文文字のリガチャであった場合は,
リガチャそれ自身のコード番号ではなく,
最後の構成要素の文字のコード番号を返す.
「最後のノード」が文字を表すものでなかった場合は,$-1$が返る.
\end{cslist}
例えば,\.{lastnodechar}を使って
\begin{verbatim}
これは,\the\lastnodechar\textmc{『ほげ党宣言』}……
\end{verbatim}
と入力すると,
\begin{quote}
これは,\the\lastnodechar\textmc{『ほげ党宣言』}……
\end{quote}
のようになり,\.{lastnodechar}実行時の「最後のノード」(文字「,」を表す)の内部コード
\footnote{%
内部コードがEUCの場合は$\texttt{"A1A4} = 41380$,SJISの場合は
$\texttt{"8143} = 33091$となる.
}が得られる.これによって,\.{textmc}等の命令の直前の文字を知ることができるので,
あとは\TeX マクロ側でなんとかできるだろう,という目論見である.
また,上記の説明にあるとおり,
\begin{verbatim}
abcfi\the\lastnodechar, abc\char"1C \the\lastnodechar
\end{verbatim}
は
\begin{quote}
abcfi\the\lastnodechar, abc\char"1C \the\lastnodechar
\end{quote}
となり,見た目では同じ「fi」が\.{lastnodechar}実行時の「最後のノード」であるかのように見えても,
それが合字の場合(左側)では\.{lastnodechar}の実行結果は最後の構成要素「i」のコード番号105となる.
\begin{dangerous}
「|これは,|」とソース中に入力したときの
ノードの状態を\.{showlists}で調べてみると次のようになっており,
本当に一番最後のノードはJFMによって挿入される二分空きの空白
(「,」と通常の和文文字の間に入るはずのもの)であることがわかる.
\begin{verbatim}
### yoko direction, horizontal mode entered at line 465
\hbox(0.0+0.0)x9.24683
\JY1/hmc/m/it/10 こ
\JY1/hmc/m/it/10 れ
\JY1/hmc/m/it/10 は
\penalty 10000(for kinsoku)
\JY1/hmc/m/it/10 ,
\glue(refer from jfm) 4.62341 minus 4.62341
\end{verbatim}
しかし,数段落上の説明の通り,\.{lastnodechar}は\pTeX の和文処理によって自動的に挿入された
これらJFM由来の空白を無視する.
\end{dangerous}
「最後のノード」を見ているので,
\begin{verbatim}
これは,\relax\sffamily{}\the\lastnodechar\textmc{『ほげ党宣言』}……
\end{verbatim}
のようにノードを作らない\.{relax}, |{}|, \.{sffamily}などが途中にあっても,
それらは単純に無視されて
\begin{quote}
これは,\relax\sffamily{}\the\lastnodechar\textmc{『ほげ党宣言』}……
\end{quote}
と「,」の内部コードが取得される.
\section{\.{lastnodesubtype}プリミティブ}
\cite{tjb28,plt63}などの議論で,「最後のグルーがJFMグルーだけ\.{unskip}する」処理の必要性が
唱えられてきた.\epTeX にはもともと最後のノードの種別を返す\.{lastnodetype}プリミティブが
あったが,これでは最後のノードがグルーであるかしかわからない.
そのため,\epTeX~180226で\.{lastnodesubtype}プリミティブを追加した.
\begin{cslist}
\csitem[\.{lastnodesubtype} (read-only integer)]
現在構築中のリストの「最後のノード」(\.{lastnodechar}プリミティブと同様)の
subtype値を内部整数として返す.
\begin{itemize}
\item 「最後のノード」が文字ノードのときは0が返る.
\item 現在構築中のリストが空のときは$-1$が返る.
\end{itemize}
\end{cslist}
実際に有用なのは,以下の場合であろう:
\begin{description}
\item[最後のノードがグルー($\.{lastnodetype}=11$)のとき]
\begin{multilist}{3}{\hfil\hskip1.5em#:&\quad#\hfil}
\item 0&明示的な\.{hskip}, \.{vskip}\cr
\item 1&\.{lineskip}\cr
\item 2&\.{baselineskip}\cr
\item 3&\.{parskip}\cr
\item 4&\.{abovedisplayskip}\cr
\item 5&\.{belowdisplayskip}\cr
\item 6&\.{abovedisplayshortskip}\cr
\item 7&\.{belowdisplayshortskip}\cr
\item 8&\.{leftskip}\cr
\item 9&\.{rightskip}\cr
\item 10&\.{topskip}\cr
\item 11&\.{splittopskip}\cr
\item 12&\.{tabskip}\cr
\item 13&\.{spaceskip}\cr
\item 14&\.{xspaceskip}\cr
\item 15&\.{parfillskip}\cr
\item 16&\.{kanjiskip}\cr
\item 17&\.{xkanjiskip}\cr
\item 18&\.{thinmuskip}\cr
\item 19&\.{medmuskip}\cr
\item 20&\.{thickmuskip}\cr
\item 21&JFM由来グルー\cr
\item 98&\.{nonscript}\cr
\item 99&\.{mskip}\cr
\item 100&\.{leaders}\cr
\item 101&\.{cleaders}\cr
\item 102&\.{xleaders}\cr
\end{multilist}
\item[最後のノードがカーン($\.{lastnodetype}=12$)のとき]
\leavevmode
\begin{multilist}{3}{\hfil\hskip1.5zw#:&\quad#\qquad\hfil}
\item 0&カーニング\cr
\item 1&明示的な\.{kern}\cr
\item 2&アクセント由来\cr
\item 3&イタリック補正\.{/}\cr
\item 99&\.{mkern}\cr
\end{multilist}
\item[最後のノードがペナルティ($\.{lastnodetype}=13$)のとき]
\leavevmode
\begin{multilist}{2}{\hfil\hskip1.5zw#:&\quad#\qquad\hfil}
\item 0&明示的な\.{penalty}\cr
\item 1&\.{jcharwidowpenalty}\cr
\item 2&禁則処理由来\cr
\end{multilist}
\end{description}
しかし,本プリミティブは
\epTeX 内部で使用しているsubtypeの値をそのまま返すだけであるので,
具体的な数値は将来変わる恐れがある.そのため,
\begin{verbatim}
\ifdefined\ucs\jfont\tenmin=upjisr-h at 9.62216pt
\else\jfont\tenmin=min10\fi
\tenmin\char\jis"214B\null\setbox0\lastbox%"
\global\chardef\pltx@gluetype\lastnodetype
\global\chardef\pltx@jfmgluesubtype\lastnodesubtype
\end{verbatim}
のように\TeX ソース内から取得・保存しておくことが望ましい.
\medskip
なお\pLaTeX~2018-04-01以降では,上記のコードを利用して
「最後のグルーがJFMグルーのときだけ消す」命令|\removejfmglue|を
\begin{verbatim}
\protected\def\removejfmglue{%
\ifnum\lastnodetype=\pltx@gluetype\relax
\ifnum\lastnodesubtype=\pltx@jfmgluesubtype\relax
\unskip
\fi\fi}
\end{verbatim}
として定義している.
\section{\.{epTeXinputencoding}プリミティブ}
現在読み込んでいるファイルの文字コードを切り替えるプリミティブであり,
2016/02/01に阿部紀行さんによって実装された.詳細は実装者の解説記事
\cite{eptexinputenc}を参照してほしいが,おおまかに述べると以下のようになるだろう.
\begin{cslist}
\csitem[\.{epTeXinputencoding} <encoding>]
現在読み込んでいるファイルの文字コードを<encoding>に変更する.
実際に変更されるのは「次の行」であり,また現在のファイルからさらに\.{input}等で
読まれたファイルには効力を及ぼさない.
引数<encoding>の読み取りは,
(\LaTeX で定義が上書きされていない,プリミティブの)\.{input}の引数(ファイル名)を
取得するのと同じルーチンが用いられる.
そのため,
\begin{verbatim}
\epTeXinputencoding sjis
\end{verbatim}
のように,<encoding>は|{}|で囲まないこと.
<encoding>の末尾は,空白トークンや展開不能トークンによって区切られる.
% scan_file_name で<encoding> を取得しているので,
% \epTeXinputencoding "euc" \epTeXinputencoding ""e""u""c"" も OK.
<encoding>の値は,基本的には\pTeX の\texttt{-kanji}オプションで指定できる値
(\texttt{euc}, \texttt{sjis}, \texttt{jis}, \texttt{utf8})である.
大文字小文字は考慮しない(\TeX の\.{uccode}, \.{lccode}は参照しない).
% BINARY, ISO-2022-JP, EUC-JP, Shift_JIS, UTF-8 (, uptex) も OK
% ptexenc 側で strcasecmp で比較しているので,大文字・小文字の区別はしない
% (\uccode, \lccode は参照しない)
\end{cslist}
\ifnum\epTeXversion>190131 %%%%% TL2019-hack
\section{\.{current[x]spacingmode}プリミティブ}
もともと\pTeX 系列では,\.{kanjiskip},~\.{xkanjiskip}の挿入が有効になっているか
直接的に知る方法が\.{showmode}プリミティブしかなかった.
これでは使い勝手が悪いので,
\.{currentspacingmode}, \.{currentxspacingmode}プリミティブが2019/10/28に
山下さんによって実装された(\cite{tjb94}).
\begin{cslist}
\csitem[\.{currentspacingmode} (read-only integer)]
\pTeX の「標準で\.{kanjiskip}を挿入する」機能が有効(\.{autospacing})ならば1,
無効(\.{noautospacing})ならば0を返す.
\csitem[\.{currentxspacingmode} (read-only integer)]
\pTeX の「標準で\.{xkanjiskip}を挿入する」機能が有効(\.{autoxspacing})ならば1,
無効(\.{noautoxspacing})ならば0を返す.
\end{cslist}
同様に,\eupTeX でも\.{currentcjktoken}プリミティブが2019/10/28に実装された.
% e-pTeX の追加プリミティブではないが,ドキュメント化の都合上ここに書いた.
\begin{cslist}
\csitem[\.{currentcjktoken}(read-only integer,\emph{\eupTeX のみ})]
\upTeX の「和文(CJK)文字と欧文文字を区別する」機能について,
\.{enablecjktoken}の状態ならば0,
\.{disablecjktoken}の状態ならば1,
\.{forcecjktoken}の状態ならば2を返す.
\end{cslist}
\fi %%%%% TL2019
\ifnum\epTeXversion>190131 %%%%% TL2019-hack
\section{\.{Uchar}, \.{Ucharcat}プリミティブ}
\hologo{XeTeX}, \hologo{LuaTeX}には,引数<character code>を文字コードとする
\emph{文字トークン}に展開される「\.{Uchar} <character code>」というプリミティブが存在する
\footnote{\.{char}は展開不能プリミティブであることに注意.}.
また,\hologo{XeTeX}には「\.{Ucharcat}~<character code>~<category code>」という,
文字コード・カテゴリーコードがそれぞれ<character code>, <category code>である
文字トークンを作るプリミティブが存在する\footnote{\hologo{LuaTeX}ではLuaによる代替物がある.}.
% pTeX の「抜け道」の具体的なコード?
\pTeX で「和文版\.{Uchar}」に相当することは\TeX~Live 2019以前の\pTeX ではマクロで実現することが可能だが,
将来の\pTeX の改修で不可能になる恐れ(\cite{tjb81,tjb95})があるので,
\epTeX~191112で前段落で述べた\.{Uchar}, \.{Ucharcat}プリミティブを追加することにした.
\begin{cslist}
\csitem[\.{Uchar} <character code>]
文字コードが<character code>の文字トークンに展開される.
指定した値と得られる文字トークンの対応表は次の通り.
\begin{center}
\small\medskip
\begin{tabular}{lccc}
\toprule
<character code>&和文・欧文&\multicolumn{2}{c}{category code}\\\cmidrule(lr){3-4}
&&\epTeX&\eupTeX\\
\midrule
0--31, 33--255&欧文文字トークン&12&12\\
32 &欧文文字トークン&10&10\\
256以上の<kanji code>&和文文字トークン&---(都度取得)&その時の\.{kcatcode}\footnotemark\\
\bottomrule
\end{tabular}
\end{center}
\footnotetext{もし\.{kcatcode}の値が15だったときは,得られる和文文字トークンの
\.{kcatcode}は18となる.}
\csitem[\.{Ucharcat} <character code> <category code>]
文字コード・カテゴリーコードがそれぞれ<character code>, <category code>の文字トークンに展開される.
\epTeX では和文文字トークンにはカテゴリーコードの情報は保存されないため,
\epTeX の\.{Ucharcat}は欧文文字トークンの生成しかサポートしない.
具体的には,
指定可能な値は<character code>が0--255,<category code>が1--4, 6--8, 10--13のみである.
\end{cslist}
\begin{dangerous}
\eupTeX では,\.{Ucharcat}で和文文字トークンの生成もサポートしている.
\medskip
\begin{itemize}
\item <character code>が0--127のときは,欧文文字トークンのみ生成可能である.従って
<category code>の指定可能値は1--4, 6--8, 10--13.
\item <character code>が128--255のときは,欧文文字トークン・和文文字トークンの
どちらも生成可能である.
<category code>の指定可能値は1--4, 6--8, 10--13(以上欧文文字トークンを生成),
および16--19(和文文字トークンを生成).
\item <character code>が256以上のときは,和文文字トークンのみ生成可能である.従って
<category code>の指定可能値は16--19.
\end{itemize}
\end{dangerous}
\begin{dangerous}
\.{Uchar}で和文文字トークンを生成するには,その和文文字コードを
与える必要があるが,その値は内部漢字コードに依るので,
|\jis|や|\euc|等の文字コード変換プリミティブを使うのが便利である
(例えば|\Uchar\jis"3441|で「\Uchar\jis"3441」を得る).
ただし,\eupTeX の\.{Ucharcat}では<character code>と<category code>を
空白トークンで区切る必要があり,注意を要する.
例えば,カテゴリーコード17の「漢」を得ようとして,
単に
\begin{quote}
\verb+\Ucharcat\jis"3441 17 % エラー+
\end{quote}
と書くとエラー\footnote{%
\.{jis}の展開時に後ろの空白トークンが食われてしまい,\.{Uchar}には
文字コード2845017($\text{漢}=\text{U+6F22}\rightarrow 28450$と17が
繋がった結果)が渡ってしまう.
}が発生する.次のように書けばエラーが回避できるようである.
\begin{quote}
\verb+\Ucharcat\jis"3441\noexpand\space17 % エラー回避+
\end{quote}
あるいは:
\begin{quote}
\verb+\Ucharcat\numexpr\jis"3441\relax 17 % エラー回避+
\end{quote}
\end{dangerous}
\fi %%%%% TL2019
\begin{comment}
\section{互換性}
\eTeX, \pTeX との互換性をはかるのに有効な手段としては,まず\texttt{TRIP}
testがある.\cite{h7k}にも書いたが,これは\TeX のソースの全行を実行する
ようなテストソースであり,\texttt{TRIP} testの実行結果が違えば,どこかの
動作が違っていることが分かるという仕掛けである.
幸いにも,\epTeX の(compatibility modeにおける)\texttt{TRIP} testの実行結果は,\pTeX のそれとほとん
ど同じであり,違う点は以下のみであった:
\begin{itemize}
\item \texttt{Memory usage}の違い:
\begin{alltt}
Memory usage before: \(x\,\)&\(\,y\); after: \(z\,\)\&\(\,w\); still untouched: \(u\)
\end{alltt}
のところで,$x$, $z$が4多く,$u$が4少ない.
\item (\texttt{FAM256}パッチのおかげで)数式フォントが256個同時に
扱えるようになったことによる,エラーの未発生やエラーメッセージの違い.
\item ログの最後に出てくる,メモリ総使用量.
\end{itemize}
また,extended modeと
compatibility modeによる出力の違いを検証すると,Memory usageの違いやメモリ総使用量の他に
は,\texttt{e-TRIP}の説明書p.\ 4の項目4.にある違いしか見受けられなかった,
\par\vskip0.5\baselineskip\par
次に,\eTeX には,\eTeX によって拡張された部分を調べる,同様の
\texttt{e-TRIP} testが存在する.\pTeX 系列では,|\showbox|などでい
ちいち組方向を表示するので,それを
\begin{verbatim}
$ alias sep='sed "s/, yoko direction//;s/yoko direction, //;\
s/yoko(math) direction, //"'
\end{verbatim}
というaliasを利用することでlog fileから除去し,それと\eTeX での
\texttt{e-TRIP} testの出力と比べた結果,
\begin{itemize}
\item Memory Usageの違い(略)
\item レジスタの使用可能個数を65536個/種類としたことによるエラーの未発生
\item (和文文字のため)character codeに256以上も許すことによる
エラーの未発生.
\end{itemize}
という違いを得た.
\par\vskip0.5\baselineskip\par
すると,最後に,\pTeX 特有の拡張部分のテストをしたくなるわけだが,北川の
知る限りにおいては,そのようなテストソースは公式には存在しないようである.
しかし,やはり気になる問題であり{\tiny (さる方面から圧力もきたので)},
個人的に作ってみたものが\texttt{ptex-qtrip}である.詳細な説明はそちらの
ドキュメントに譲る.ともかく,これを動作させてlog fileを比べてみると,メ
モリ関連や\texttt{FAM256}関連以外は
\begin{verbatim}
-% split2 to -0.01802,6.94444 p=-10000
+% split2 to -0.01806,6.94444 p=-10000
\end{verbatim}
以外の違いしかなかった.わずか$0.00004$の違い(単位がもしpointだとしたら
$3$\,sp)だが,どこか気になるところである.
上の箇所もあるし,また\texttt{ptex-qtrip}自体がまだ完全なものではなのだ
が,\pTeX と\epTeX は実用上においては互換と言えそうな気もしなくもない.
\end{comment}
\begin{thebibliography}{99}
\bibitem{h7k} 北川 弘典,「計算数学II 作業記録」,2008.\\
\url{https://osdn.jp/projects/eptex/document/resume/ja/1/resume.pdf}ほか,
本pdfと同じディレクトリにある\texttt{eptex\_resume.pdf}がそれにあたる.
\bibitem{yamamoto} 山本 和義,「数式famの制限とluatex」,
掲示板「\TeX\ Q\ \&\ A」,2009/02/12.\\
\url{http://oku.edu.mie-u.ac.jp/~okumura/texfaq/qa/52744.html}
\bibitem{yamamoto2} 山本 和義,「Re: 数式famの制限とluatex」,
掲示板「\TeX\ Q\ \&\ A」,2009/02/16.
\url{http://oku.edu.mie-u.ac.jp/~okumura/texfaq/qa/52767.html}
\bibitem{yamamoto3} 山本 和義,「数式fam拡張マクロ for e-pTeX等」,
掲示板「\TeX\ Q\ \&\ A」,2009/02/21.
\url{http://oku.edu.mie-u.ac.jp/~okumura/texfaq/qa/52799.html}
\bibitem{expl31} 河原,「パッケージとディストリビューションについて」,
掲示板「\TeX\ Q\ \&\ A」,2010/12/16.
\url{http://oku.edu.mie-u.ac.jp/~okumura/texfaq/qa/55464.html}
\bibitem{expl32} 角藤 亮,「Re: パッケージとディストリビューションについて」,
掲示板「\TeX\ Q\ \&\ A」,2010/12/19.
\url{http://oku.edu.mie-u.ac.jp/~okumura/texfaq/qa/55478.html}
\bibitem{expl33} zrbabbler,「LaTeX3 と expl3 パッケージ」,
ブログ「マクロツイーター」内,2010/12/22.
\url{http://d.hatena.ne.jp/zrbabbler/20101222/1293050561}
\bibitem{strcmp} 角藤 亮,「Re: e-pTeX 101231」,
掲示板「\TeX\ Q\ \&\ A」,2011/01/01.\\
\url{http://oku.edu.mie-u.ac.jp/~okumura/texfaq/qa/55528.html}
\bibitem{pdfse} Dora TeX,「Re: |\pdfshellescape|,
|\lastnodechar| の実装」,\TeX~Forum,2014/11/19.
\url{http://oku.edu.mie-u.ac.jp/tex/mod/forum/discuss.php?d=1435#p8053}
\bibitem{lnc} 北川 弘典,「|\lastnodechar| プリミティブについて」,2014/12/15.\\
\url{https://ja.osdn.net/projects/eptex/wiki/lastnodechar}
\bibitem{xe5} Joseph Wright, ``[XeTeX] |\(pdf)mdfivesum|'',
2015/07/01,\\
\url{http://tug.org/pipermail/xetex/2015-July/026044.html}
\bibitem{15715} tat tsan,
「[expl3 / e(u)ptex] 2015/07/15 版 expl3 パッケージが、(u)platex で通らない」,
\TeX~Forum,2015/07/26.\\
\url{http://oku.edu.mie-u.ac.jp/tex/mod/forum/discuss.php?d=1632}
\bibitem{random} Joseph Wright, ``[tex-live] Random number primitives'',
2016/11/12,\\
\url{http://tug.org/pipermail/tex-live/2016-November/039436.html}
\bibitem{eptexinputenc} 阿部 紀行,「2016年2月2日」,2016/02/02.\\
\url{http://abenori.blogspot.jp/2016/02/e-ptexeptexinputencoding.html}.
\bibitem{etexman} The \NTS\!\ Team. \textit{The \eTeX\ manual} (v2.0). \\
|$TEXMFDIST/doc/etex/base/etex_man.pdf|
\bibitem{omegaman} J.\ Plaice, Y.\ Haralambous.
\textit{Draft documentation for the $\it\Omega$ system}, 1999.\\
|$TEXMFDIST/doc/omega/base/doc-1.8.tex|
\bibitem{pdftexman} H\`an Th\'{\^e} Th\`anh et al.
\textit{The \hologo{pdfTeX}\ user manual}, 2015.\\
|$TEXMFDIST/doc/pdftex/manual/pdftex-a.pdf|
\bibitem{l2e26}
The \LaTeX3 Project Team, \textit{\LaTeX\ News Issue 26}, 2017.\\
|$TEXMFDIST/source/latex/base/ltnews26.tex|, \\
\url{https://www.latex-project.org/news/latex2e-news/ltnews26.pdf}.
\bibitem{tjb28} 北川 弘典,
「[ptex] |\inhibitglue|の効力」,2017/09/20.\\
\url{https://github.com/texjporg/tex-jp-build/issues/28}.
\bibitem{plt63} Dora TeX,
「p 指定の tabular でのセル冒頭の |\relax\par|」,2018/02/19.\\
\url{https://github.com/texjporg/platex/issues/63}.
\bibitem{expanded1} Joseph Wright,
``[tex-live] Primitive parity, |\expanded| and |\Ucharcat|'',
2018/05/04,\\
\url{http://tug.org/pipermail/tex-live/2018-May/041599.html}
\bibitem{expanded}
Joseph Wright, ``A `new' primitive: |\expanded|'', 2018/12/06.\\
\url{https://www.texdev.net/2018/12/06/a-new-primitive-expanded}
\bibitem{latex95}
Volker-Weissmann, ``Feature Request: Better error messages for
non-ASCII symbols in labels.'',
2018/12/03.\\
\url{https://github.com/latex3/latex2e/issues/95}
\ifnum\epTeXversion>190131 %%%%% TL2019-hack
\bibitem{tjb81} 北川 弘典,「バイト列と和文文字トークンの区別」,2019/06/08.\\
\url{https://github.com/texjporg/tex-jp-build/issues/81}.
\bibitem{tjb83} aminophen,「[e-pTeX] |\ifincsname|」,2019/07/09.\\
\url{https://github.com/texjporg/tex-jp-build/issues/83}.
\bibitem{tjb94} aminophen,「e(u)ptex: add |\current(x)spacingmode|, |\currentcjktoken|」,%
2019/10/28.\\
\url{https://github.com/texjporg/tex-jp-build/pull/94}.
\bibitem{tjb95} 北川 弘典,「[eptex] |\Uchar| and |\Ucharcat|」,2019/10/30.\\
\url{https://github.com/texjporg/tex-jp-build/issues/95}.
\fi %%%%% TL2019
\end{thebibliography}
\newpage
\printindex
\newpage\scrollmode
\input fam256d.tex
\newpage
\end{document}
|